]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blame - src/patches/suse-2.6.27.25/patches.drivers/ixgbe-copper_pond.patch
Revert "Move xen patchset to new version's subdir."
[people/pmueller/ipfire-2.x.git] / src / patches / suse-2.6.27.25 / patches.drivers / ixgbe-copper_pond.patch
CommitLineData
00e5a55c
BS
1From: Jesse Brandeburg <jesse.brandeburg@intel.com>
2Date: Fri, 31 Oct 2008 07:46:40 +0000 (-0700)
3Subject: ixgbe: add device support for 82598AT (copper 10GbE) adapters
4X-Git-Url: http://gitlad.jf.intel.com/git/?p=davem%2Fnet-next-2.6%2F.git;a=commitdiff_plain;h=0befdb3e0a26a8949063915274e1bec8873c526b
5Acked-by: Karsten Keil <kkeil@novell.com>
6Reference: bnc#441471
7
8ixgbe: add device support for 82598AT (copper 10GbE) adapters
9
10Intel is currently shipping support for adapters with a phy
11that does 10GBase-T (copper), which is 10 Gigabit ethernet
12over standard Category 6 cabling.
13
14Signed-off-by: Jesse Brandeburg <jesse.brandeburg@intel.com>
15Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
16Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
17---
18
19Index: linux-2.6.27/drivers/net/ixgbe/ixgbe.h
20===================================================================
21--- linux-2.6.27.orig/drivers/net/ixgbe/ixgbe.h
22+++ linux-2.6.27/drivers/net/ixgbe/ixgbe.h
23@@ -282,6 +282,7 @@ struct ixgbe_adapter {
24 #define IXGBE_FLAG_RSS_CAPABLE (u32)(1 << 17)
25 #define IXGBE_FLAG_VMDQ_CAPABLE (u32)(1 << 18)
26 #define IXGBE_FLAG_VMDQ_ENABLED (u32)(1 << 19)
27+#define IXGBE_FLAG_FAN_FAIL_CAPABLE (u32)(1 << 20)
28 #define IXGBE_FLAG_NEED_LINK_UPDATE (u32)(1 << 22)
29 #define IXGBE_FLAG_IN_WATCHDOG_TASK (u32)(1 << 23)
30 #define IXGBE_FLAG_DCB_ENABLED (u32)(1 << 24)
31Index: linux-2.6.27/drivers/net/ixgbe/ixgbe_82598.c
32===================================================================
33--- linux-2.6.27.orig/drivers/net/ixgbe/ixgbe_82598.c
34+++ linux-2.6.27/drivers/net/ixgbe/ixgbe_82598.c
35@@ -59,6 +59,11 @@ static s32 ixgbe_get_invariants_82598(st
36
37 /* PHY Init */
38 switch (phy->type) {
39+ case ixgbe_phy_tn:
40+ phy->ops.check_link = &ixgbe_check_phy_link_tnx;
41+ phy->ops.get_firmware_version =
42+ &ixgbe_get_phy_firmware_version_tnx;
43+ break;
44 default:
45 break;
46 }
47@@ -189,6 +194,9 @@ static enum ixgbe_media_type ixgbe_get_m
48 case IXGBE_DEV_ID_82598EB_XF_LR:
49 media_type = ixgbe_media_type_fiber;
50 break;
51+ case IXGBE_DEV_ID_82598AT:
52+ media_type = ixgbe_media_type_copper;
53+ break;
54 default:
55 media_type = ixgbe_media_type_unknown;
56 break;
57@@ -872,6 +880,10 @@ s32 ixgbe_get_supported_physical_layer_8
58 case IXGBE_DEV_ID_82598EB_XF_LR:
59 physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_LR;
60 break;
61+ case IXGBE_DEV_ID_82598AT:
62+ physical_layer = (IXGBE_PHYSICAL_LAYER_10GBASE_T |
63+ IXGBE_PHYSICAL_LAYER_1000BASE_T);
64+ break;
65
66 default:
67 physical_layer = IXGBE_PHYSICAL_LAYER_UNKNOWN;
68Index: linux-2.6.27/drivers/net/ixgbe/ixgbe_ethtool.c
69===================================================================
70--- linux-2.6.27.orig/drivers/net/ixgbe/ixgbe_ethtool.c
71+++ linux-2.6.27/drivers/net/ixgbe/ixgbe_ethtool.c
72@@ -160,6 +160,8 @@ static int ixgbe_set_settings(struct net
73 {
74 struct ixgbe_adapter *adapter = netdev_priv(netdev);
75 struct ixgbe_hw *hw = &adapter->hw;
76+ u32 advertised, old;
77+ s32 err;
78
79 switch (hw->phy.media_type) {
80 case ixgbe_media_type_fiber:
81@@ -168,6 +170,31 @@ static int ixgbe_set_settings(struct net
82 return -EINVAL;
83 /* in this case we currently only support 10Gb/FULL */
84 break;
85+ case ixgbe_media_type_copper:
86+ /* 10000/copper and 1000/copper must autoneg
87+ * this function does not support any duplex forcing, but can
88+ * limit the advertising of the adapter to only 10000 or 1000 */
89+ if (ecmd->autoneg == AUTONEG_DISABLE)
90+ return -EINVAL;
91+
92+ old = hw->phy.autoneg_advertised;
93+ advertised = 0;
94+ if (ecmd->advertising & ADVERTISED_10000baseT_Full)
95+ advertised |= IXGBE_LINK_SPEED_10GB_FULL;
96+
97+ if (ecmd->advertising & ADVERTISED_1000baseT_Full)
98+ advertised |= IXGBE_LINK_SPEED_1GB_FULL;
99+
100+ if (old == advertised)
101+ break;
102+ /* this sets the link speed and restarts auto-neg */
103+ err = hw->mac.ops.setup_link_speed(hw, advertised, true, true);
104+ if (err) {
105+ DPRINTK(PROBE, INFO,
106+ "setup link failed with code %d\n", err);
107+ hw->mac.ops.setup_link_speed(hw, old, true, true);
108+ }
109+ break;
110 default:
111 break;
112 }
113Index: linux-2.6.27/drivers/net/ixgbe/ixgbe_main.c
114===================================================================
115--- linux-2.6.27.orig/drivers/net/ixgbe/ixgbe_main.c
116+++ linux-2.6.27/drivers/net/ixgbe/ixgbe_main.c
117@@ -68,6 +68,8 @@ static struct pci_device_id ixgbe_pci_tb
118 board_82598 },
119 {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82598AF_SINGLE_PORT),
120 board_82598 },
121+ {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82598AT),
122+ board_82598 },
123 {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82598EB_CX4),
124 board_82598 },
125 {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82598_CX4_DUAL_PORT),
126@@ -910,6 +912,17 @@ static void ixgbe_set_itr_msix(struct ix
127 return;
128 }
129
130+static void ixgbe_check_fan_failure(struct ixgbe_adapter *adapter, u32 eicr)
131+{
132+ struct ixgbe_hw *hw = &adapter->hw;
133+
134+ if ((adapter->flags & IXGBE_FLAG_FAN_FAIL_CAPABLE) &&
135+ (eicr & IXGBE_EICR_GPI_SDP1)) {
136+ DPRINTK(PROBE, CRIT, "Fan has stopped, replace the adapter\n");
137+ /* write to clear the interrupt */
138+ IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_GPI_SDP1);
139+ }
140+}
141
142 static void ixgbe_check_lsc(struct ixgbe_adapter *adapter)
143 {
144@@ -934,6 +947,8 @@ static irqreturn_t ixgbe_msix_lsc(int ir
145 if (eicr & IXGBE_EICR_LSC)
146 ixgbe_check_lsc(adapter);
147
148+ ixgbe_check_fan_failure(adapter, eicr);
149+
150 if (!test_bit(__IXGBE_DOWN, &adapter->state))
151 IXGBE_WRITE_REG(hw, IXGBE_EIMS, IXGBE_EIMS_OTHER);
152
153@@ -1322,6 +1337,8 @@ static irqreturn_t ixgbe_intr(int irq, v
154 if (eicr & IXGBE_EICR_LSC)
155 ixgbe_check_lsc(adapter);
156
157+ ixgbe_check_fan_failure(adapter, eicr);
158+
159 if (netif_rx_schedule_prep(netdev, &adapter->q_vector[0].napi)) {
160 adapter->tx_ring[0].total_packets = 0;
161 adapter->tx_ring[0].total_bytes = 0;
162@@ -1424,6 +1441,8 @@ static inline void ixgbe_irq_enable(stru
163 {
164 u32 mask;
165 mask = IXGBE_EIMS_ENABLE_MASK;
166+ if (adapter->flags & IXGBE_FLAG_FAN_FAIL_CAPABLE)
167+ mask |= IXGBE_EIMS_GPI_SDP1;
168 IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMS, mask);
169 IXGBE_WRITE_FLUSH(&adapter->hw);
170 }
171@@ -1983,6 +2002,13 @@ static int ixgbe_up_complete(struct ixgb
172 IXGBE_WRITE_REG(hw, IXGBE_EIAM, IXGBE_EICS_RTX_QUEUE);
173 }
174
175+ /* Enable fan failure interrupt if media type is copper */
176+ if (adapter->flags & IXGBE_FLAG_FAN_FAIL_CAPABLE) {
177+ gpie = IXGBE_READ_REG(hw, IXGBE_GPIE);
178+ gpie |= IXGBE_SDP1_GPIEN;
179+ IXGBE_WRITE_REG(hw, IXGBE_GPIE, gpie);
180+ }
181+
182 mhadd = IXGBE_READ_REG(hw, IXGBE_MHADD);
183 if (max_frame != (mhadd >> IXGBE_MHADD_MFS_SHIFT)) {
184 mhadd &= ~IXGBE_MHADD_MFS_MASK;
185@@ -2679,6 +2705,9 @@ static int __devinit ixgbe_sw_init(struc
186 rss = min(IXGBE_MAX_RSS_INDICES, (int)num_online_cpus());
187 adapter->ring_feature[RING_F_RSS].indices = rss;
188 adapter->flags |= IXGBE_FLAG_RSS_ENABLED;
189+ if (hw->mac.ops.get_media_type &&
190+ (hw->mac.ops.get_media_type(hw) == ixgbe_media_type_copper))
191+ adapter->flags |= IXGBE_FLAG_FAN_FAIL_CAPABLE;
192 adapter->ring_feature[RING_F_DCB].indices = IXGBE_MAX_DCB_INDICES;
193
194 /* Configure DCB traffic classes */
195@@ -3851,6 +3880,10 @@ static int ixgbe_link_config(struct ixgb
196 /* must always autoneg for both 1G and 10G link */
197 hw->mac.autoneg = true;
198
199+ if ((hw->mac.type == ixgbe_mac_82598EB) &&
200+ (hw->phy.media_type == ixgbe_media_type_copper))
201+ autoneg = IXGBE_LINK_SPEED_82598_AUTONEG;
202+
203 return hw->mac.ops.setup_link_speed(hw, autoneg, true, true);
204 }
205
206Index: linux-2.6.27/drivers/net/ixgbe/ixgbe_phy.c
207===================================================================
208--- linux-2.6.27.orig/drivers/net/ixgbe/ixgbe_phy.c
209+++ linux-2.6.27/drivers/net/ixgbe/ixgbe_phy.c
210@@ -121,6 +121,9 @@ static enum ixgbe_phy_type ixgbe_get_phy
211 enum ixgbe_phy_type phy_type;
212
213 switch (phy_id) {
214+ case TN1010_PHY_ID:
215+ phy_type = ixgbe_phy_tn;
216+ break;
217 case QT2022_PHY_ID:
218 phy_type = ixgbe_phy_qt;
219 break;
220@@ -426,3 +429,68 @@ s32 ixgbe_setup_phy_link_speed_generic(s
221 return 0;
222 }
223
224+/**
225+ * ixgbe_check_phy_link_tnx - Determine link and speed status
226+ * @hw: pointer to hardware structure
227+ *
228+ * Reads the VS1 register to determine if link is up and the current speed for
229+ * the PHY.
230+ **/
231+s32 ixgbe_check_phy_link_tnx(struct ixgbe_hw *hw, ixgbe_link_speed *speed,
232+ bool *link_up)
233+{
234+ s32 status = 0;
235+ u32 time_out;
236+ u32 max_time_out = 10;
237+ u16 phy_link = 0;
238+ u16 phy_speed = 0;
239+ u16 phy_data = 0;
240+
241+ /* Initialize speed and link to default case */
242+ *link_up = false;
243+ *speed = IXGBE_LINK_SPEED_10GB_FULL;
244+
245+ /*
246+ * Check current speed and link status of the PHY register.
247+ * This is a vendor specific register and may have to
248+ * be changed for other copper PHYs.
249+ */
250+ for (time_out = 0; time_out < max_time_out; time_out++) {
251+ udelay(10);
252+ status = hw->phy.ops.read_reg(hw,
253+ IXGBE_MDIO_VENDOR_SPECIFIC_1_STATUS,
254+ IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
255+ &phy_data);
256+ phy_link = phy_data &
257+ IXGBE_MDIO_VENDOR_SPECIFIC_1_LINK_STATUS;
258+ phy_speed = phy_data &
259+ IXGBE_MDIO_VENDOR_SPECIFIC_1_SPEED_STATUS;
260+ if (phy_link == IXGBE_MDIO_VENDOR_SPECIFIC_1_LINK_STATUS) {
261+ *link_up = true;
262+ if (phy_speed ==
263+ IXGBE_MDIO_VENDOR_SPECIFIC_1_SPEED_STATUS)
264+ *speed = IXGBE_LINK_SPEED_1GB_FULL;
265+ break;
266+ }
267+ }
268+
269+ return status;
270+}
271+
272+/**
273+ * ixgbe_get_phy_firmware_version_tnx - Gets the PHY Firmware Version
274+ * @hw: pointer to hardware structure
275+ * @firmware_version: pointer to the PHY Firmware Version
276+ **/
277+s32 ixgbe_get_phy_firmware_version_tnx(struct ixgbe_hw *hw,
278+ u16 *firmware_version)
279+{
280+ s32 status = 0;
281+
282+ status = hw->phy.ops.read_reg(hw, TNX_FW_REV,
283+ IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
284+ firmware_version);
285+
286+ return status;
287+}
288+
289Index: linux-2.6.27/drivers/net/ixgbe/ixgbe_phy.h
290===================================================================
291--- linux-2.6.27.orig/drivers/net/ixgbe/ixgbe_phy.h
292+++ linux-2.6.27/drivers/net/ixgbe/ixgbe_phy.h
293@@ -77,4 +77,11 @@ s32 ixgbe_setup_phy_link_speed_generic(s
294 bool autoneg,
295 bool autoneg_wait_to_complete);
296
297+/* PHY specific */
298+s32 ixgbe_check_phy_link_tnx(struct ixgbe_hw *hw,
299+ ixgbe_link_speed *speed,
300+ bool *link_up);
301+s32 ixgbe_get_phy_firmware_version_tnx(struct ixgbe_hw *hw,
302+ u16 *firmware_version);
303+
304 #endif /* _IXGBE_PHY_H_ */
305Index: linux-2.6.27/drivers/net/ixgbe/ixgbe_type.h
306===================================================================
307--- linux-2.6.27.orig/drivers/net/ixgbe/ixgbe_type.h
308+++ linux-2.6.27/drivers/net/ixgbe/ixgbe_type.h
309@@ -36,6 +36,7 @@
310 /* Device IDs */
311 #define IXGBE_DEV_ID_82598AF_DUAL_PORT 0x10C6
312 #define IXGBE_DEV_ID_82598AF_SINGLE_PORT 0x10C7
313+#define IXGBE_DEV_ID_82598AT 0x10C8
314 #define IXGBE_DEV_ID_82598EB_CX4 0x10DD
315 #define IXGBE_DEV_ID_82598_CX4_DUAL_PORT 0x10EC
316 #define IXGBE_DEV_ID_82598EB_XF_LR 0x10F4
317@@ -488,6 +489,8 @@
318 #define IXGBE_MAX_PHY_ADDR 32
319
320 /* PHY IDs*/
321+#define TN1010_PHY_ID 0x00A19410
322+#define TNX_FW_REV 0xB
323 #define QT2022_PHY_ID 0x0043A400
324
325 /* PHY Types */
326@@ -1202,6 +1205,7 @@ enum ixgbe_mac_type {
327
328 enum ixgbe_phy_type {
329 ixgbe_phy_unknown = 0,
330+ ixgbe_phy_tn,
331 ixgbe_phy_qt,
332 ixgbe_phy_xaui,
333 ixgbe_phy_tw_tyco,
334@@ -1396,6 +1400,8 @@ struct ixgbe_phy_operations {
335 s32 (*setup_link)(struct ixgbe_hw *);
336 s32 (*setup_link_speed)(struct ixgbe_hw *, ixgbe_link_speed, bool,
337 bool);
338+ s32 (*check_link)(struct ixgbe_hw *, ixgbe_link_speed *, bool *);
339+ s32 (*get_firmware_version)(struct ixgbe_hw *, u16 *);
340 s32 (*read_i2c_byte)(struct ixgbe_hw *, u8, u8, u8 *);
341 s32 (*write_i2c_byte)(struct ixgbe_hw *, u8, u8, u8);
342 s32 (*read_i2c_eeprom)(struct ixgbe_hw *, u8 , u8 *);