[PATCH] x86_64 genapic update
[linux-2.6/verdex.git] / drivers / net / tg3.c
blob12de80884b1aa6e4240e5a40360369b9dd9b270b
1 /*
2 * tg3.c: Broadcom Tigon3 ethernet driver.
4 * Copyright (C) 2001, 2002, 2003, 2004 David S. Miller (davem@redhat.com)
5 * Copyright (C) 2001, 2002, 2003 Jeff Garzik (jgarzik@pobox.com)
6 * Copyright (C) 2004 Sun Microsystems Inc.
7 * Copyright (C) 2005 Broadcom Corporation.
9 * Firmware is:
10 * Copyright (C) 2000-2003 Broadcom Corporation.
13 #include <linux/config.h>
15 #include <linux/module.h>
16 #include <linux/moduleparam.h>
17 #include <linux/kernel.h>
18 #include <linux/types.h>
19 #include <linux/compiler.h>
20 #include <linux/slab.h>
21 #include <linux/delay.h>
22 #include <linux/init.h>
23 #include <linux/ioport.h>
24 #include <linux/pci.h>
25 #include <linux/netdevice.h>
26 #include <linux/etherdevice.h>
27 #include <linux/skbuff.h>
28 #include <linux/ethtool.h>
29 #include <linux/mii.h>
30 #include <linux/if_vlan.h>
31 #include <linux/ip.h>
32 #include <linux/tcp.h>
33 #include <linux/workqueue.h>
35 #include <net/checksum.h>
37 #include <asm/system.h>
38 #include <asm/io.h>
39 #include <asm/byteorder.h>
40 #include <asm/uaccess.h>
42 #ifdef CONFIG_SPARC64
43 #include <asm/idprom.h>
44 #include <asm/oplib.h>
45 #include <asm/pbm.h>
46 #endif
48 #if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE)
49 #define TG3_VLAN_TAG_USED 1
50 #else
51 #define TG3_VLAN_TAG_USED 0
52 #endif
54 #ifdef NETIF_F_TSO
55 #define TG3_TSO_SUPPORT 1
56 #else
57 #define TG3_TSO_SUPPORT 0
58 #endif
60 #include "tg3.h"
62 #define DRV_MODULE_NAME "tg3"
63 #define PFX DRV_MODULE_NAME ": "
64 #define DRV_MODULE_VERSION "3.25"
65 #define DRV_MODULE_RELDATE "March 24, 2005"
67 #define TG3_DEF_MAC_MODE 0
68 #define TG3_DEF_RX_MODE 0
69 #define TG3_DEF_TX_MODE 0
70 #define TG3_DEF_MSG_ENABLE \
71 (NETIF_MSG_DRV | \
72 NETIF_MSG_PROBE | \
73 NETIF_MSG_LINK | \
74 NETIF_MSG_TIMER | \
75 NETIF_MSG_IFDOWN | \
76 NETIF_MSG_IFUP | \
77 NETIF_MSG_RX_ERR | \
78 NETIF_MSG_TX_ERR)
80 /* length of time before we decide the hardware is borked,
81 * and dev->tx_timeout() should be called to fix the problem
83 #define TG3_TX_TIMEOUT (5 * HZ)
85 /* hardware minimum and maximum for a single frame's data payload */
86 #define TG3_MIN_MTU 60
87 #define TG3_MAX_MTU(tp) \
88 ((GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5705 && \
89 GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5750) ? 9000 : 1500)
91 /* These numbers seem to be hard coded in the NIC firmware somehow.
92 * You can't change the ring sizes, but you can change where you place
93 * them in the NIC onboard memory.
95 #define TG3_RX_RING_SIZE 512
96 #define TG3_DEF_RX_RING_PENDING 200
97 #define TG3_RX_JUMBO_RING_SIZE 256
98 #define TG3_DEF_RX_JUMBO_RING_PENDING 100
100 /* Do not place this n-ring entries value into the tp struct itself,
101 * we really want to expose these constants to GCC so that modulo et
102 * al. operations are done with shifts and masks instead of with
103 * hw multiply/modulo instructions. Another solution would be to
104 * replace things like '% foo' with '& (foo - 1)'.
106 #define TG3_RX_RCB_RING_SIZE(tp) \
107 ((tp->tg3_flags2 & TG3_FLG2_5705_PLUS) ? 512 : 1024)
109 #define TG3_TX_RING_SIZE 512
110 #define TG3_DEF_TX_RING_PENDING (TG3_TX_RING_SIZE - 1)
112 #define TG3_RX_RING_BYTES (sizeof(struct tg3_rx_buffer_desc) * \
113 TG3_RX_RING_SIZE)
114 #define TG3_RX_JUMBO_RING_BYTES (sizeof(struct tg3_rx_buffer_desc) * \
115 TG3_RX_JUMBO_RING_SIZE)
116 #define TG3_RX_RCB_RING_BYTES(tp) (sizeof(struct tg3_rx_buffer_desc) * \
117 TG3_RX_RCB_RING_SIZE(tp))
118 #define TG3_TX_RING_BYTES (sizeof(struct tg3_tx_buffer_desc) * \
119 TG3_TX_RING_SIZE)
120 #define TX_RING_GAP(TP) \
121 (TG3_TX_RING_SIZE - (TP)->tx_pending)
122 #define TX_BUFFS_AVAIL(TP) \
123 (((TP)->tx_cons <= (TP)->tx_prod) ? \
124 (TP)->tx_cons + (TP)->tx_pending - (TP)->tx_prod : \
125 (TP)->tx_cons - (TP)->tx_prod - TX_RING_GAP(TP))
126 #define NEXT_TX(N) (((N) + 1) & (TG3_TX_RING_SIZE - 1))
128 #define RX_PKT_BUF_SZ (1536 + tp->rx_offset + 64)
129 #define RX_JUMBO_PKT_BUF_SZ (9046 + tp->rx_offset + 64)
131 /* minimum number of free TX descriptors required to wake up TX process */
132 #define TG3_TX_WAKEUP_THRESH (TG3_TX_RING_SIZE / 4)
134 /* number of ETHTOOL_GSTATS u64's */
135 #define TG3_NUM_STATS (sizeof(struct tg3_ethtool_stats)/sizeof(u64))
137 static char version[] __devinitdata =
138 DRV_MODULE_NAME ".c:v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n";
140 MODULE_AUTHOR("David S. Miller (davem@redhat.com) and Jeff Garzik (jgarzik@pobox.com)");
141 MODULE_DESCRIPTION("Broadcom Tigon3 ethernet driver");
142 MODULE_LICENSE("GPL");
143 MODULE_VERSION(DRV_MODULE_VERSION);
145 static int tg3_debug = -1; /* -1 == use TG3_DEF_MSG_ENABLE as value */
146 module_param(tg3_debug, int, 0);
147 MODULE_PARM_DESC(tg3_debug, "Tigon3 bitmapped debugging message enable value");
149 static struct pci_device_id tg3_pci_tbl[] = {
150 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5700,
151 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
152 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5701,
153 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
154 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5702,
155 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
156 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5703,
157 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
158 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5704,
159 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
160 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5702FE,
161 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
162 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5705,
163 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
164 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5705_2,
165 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
166 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5705M,
167 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
168 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5705M_2,
169 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
170 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5702X,
171 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
172 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5703X,
173 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
174 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5704S,
175 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
176 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5702A3,
177 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
178 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5703A3,
179 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
180 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5782,
181 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
182 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5788,
183 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
184 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5789,
185 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
186 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5901,
187 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
188 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5901_2,
189 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
190 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5704S_2,
191 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
192 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5705F,
193 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
194 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5720,
195 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
196 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5721,
197 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
198 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5750,
199 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
200 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5751,
201 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
202 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5750M,
203 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
204 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5751M,
205 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
206 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5751F,
207 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
208 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5753,
209 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
210 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5753M,
211 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
212 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5753F,
213 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
214 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5781,
215 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
216 { PCI_VENDOR_ID_SYSKONNECT, PCI_DEVICE_ID_SYSKONNECT_9DXX,
217 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
218 { PCI_VENDOR_ID_SYSKONNECT, PCI_DEVICE_ID_SYSKONNECT_9MXX,
219 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
220 { PCI_VENDOR_ID_ALTIMA, PCI_DEVICE_ID_ALTIMA_AC1000,
221 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
222 { PCI_VENDOR_ID_ALTIMA, PCI_DEVICE_ID_ALTIMA_AC1001,
223 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
224 { PCI_VENDOR_ID_ALTIMA, PCI_DEVICE_ID_ALTIMA_AC1003,
225 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
226 { PCI_VENDOR_ID_ALTIMA, PCI_DEVICE_ID_ALTIMA_AC9100,
227 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
228 { PCI_VENDOR_ID_APPLE, PCI_DEVICE_ID_APPLE_TIGON3,
229 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
230 { 0, }
233 MODULE_DEVICE_TABLE(pci, tg3_pci_tbl);
235 static struct {
236 const char string[ETH_GSTRING_LEN];
237 } ethtool_stats_keys[TG3_NUM_STATS] = {
238 { "rx_octets" },
239 { "rx_fragments" },
240 { "rx_ucast_packets" },
241 { "rx_mcast_packets" },
242 { "rx_bcast_packets" },
243 { "rx_fcs_errors" },
244 { "rx_align_errors" },
245 { "rx_xon_pause_rcvd" },
246 { "rx_xoff_pause_rcvd" },
247 { "rx_mac_ctrl_rcvd" },
248 { "rx_xoff_entered" },
249 { "rx_frame_too_long_errors" },
250 { "rx_jabbers" },
251 { "rx_undersize_packets" },
252 { "rx_in_length_errors" },
253 { "rx_out_length_errors" },
254 { "rx_64_or_less_octet_packets" },
255 { "rx_65_to_127_octet_packets" },
256 { "rx_128_to_255_octet_packets" },
257 { "rx_256_to_511_octet_packets" },
258 { "rx_512_to_1023_octet_packets" },
259 { "rx_1024_to_1522_octet_packets" },
260 { "rx_1523_to_2047_octet_packets" },
261 { "rx_2048_to_4095_octet_packets" },
262 { "rx_4096_to_8191_octet_packets" },
263 { "rx_8192_to_9022_octet_packets" },
265 { "tx_octets" },
266 { "tx_collisions" },
268 { "tx_xon_sent" },
269 { "tx_xoff_sent" },
270 { "tx_flow_control" },
271 { "tx_mac_errors" },
272 { "tx_single_collisions" },
273 { "tx_mult_collisions" },
274 { "tx_deferred" },
275 { "tx_excessive_collisions" },
276 { "tx_late_collisions" },
277 { "tx_collide_2times" },
278 { "tx_collide_3times" },
279 { "tx_collide_4times" },
280 { "tx_collide_5times" },
281 { "tx_collide_6times" },
282 { "tx_collide_7times" },
283 { "tx_collide_8times" },
284 { "tx_collide_9times" },
285 { "tx_collide_10times" },
286 { "tx_collide_11times" },
287 { "tx_collide_12times" },
288 { "tx_collide_13times" },
289 { "tx_collide_14times" },
290 { "tx_collide_15times" },
291 { "tx_ucast_packets" },
292 { "tx_mcast_packets" },
293 { "tx_bcast_packets" },
294 { "tx_carrier_sense_errors" },
295 { "tx_discards" },
296 { "tx_errors" },
298 { "dma_writeq_full" },
299 { "dma_write_prioq_full" },
300 { "rxbds_empty" },
301 { "rx_discards" },
302 { "rx_errors" },
303 { "rx_threshold_hit" },
305 { "dma_readq_full" },
306 { "dma_read_prioq_full" },
307 { "tx_comp_queue_full" },
309 { "ring_set_send_prod_index" },
310 { "ring_status_update" },
311 { "nic_irqs" },
312 { "nic_avoided_irqs" },
313 { "nic_tx_threshold_hit" }
316 static void tg3_write_indirect_reg32(struct tg3 *tp, u32 off, u32 val)
318 if ((tp->tg3_flags & TG3_FLAG_PCIX_TARGET_HWBUG) != 0) {
319 unsigned long flags;
321 spin_lock_irqsave(&tp->indirect_lock, flags);
322 pci_write_config_dword(tp->pdev, TG3PCI_REG_BASE_ADDR, off);
323 pci_write_config_dword(tp->pdev, TG3PCI_REG_DATA, val);
324 spin_unlock_irqrestore(&tp->indirect_lock, flags);
325 } else {
326 writel(val, tp->regs + off);
327 if ((tp->tg3_flags & TG3_FLAG_5701_REG_WRITE_BUG) != 0)
328 readl(tp->regs + off);
332 static void _tw32_flush(struct tg3 *tp, u32 off, u32 val)
334 if ((tp->tg3_flags & TG3_FLAG_PCIX_TARGET_HWBUG) != 0) {
335 unsigned long flags;
337 spin_lock_irqsave(&tp->indirect_lock, flags);
338 pci_write_config_dword(tp->pdev, TG3PCI_REG_BASE_ADDR, off);
339 pci_write_config_dword(tp->pdev, TG3PCI_REG_DATA, val);
340 spin_unlock_irqrestore(&tp->indirect_lock, flags);
341 } else {
342 void __iomem *dest = tp->regs + off;
343 writel(val, dest);
344 readl(dest); /* always flush PCI write */
348 static inline void _tw32_rx_mbox(struct tg3 *tp, u32 off, u32 val)
350 void __iomem *mbox = tp->regs + off;
351 writel(val, mbox);
352 if (tp->tg3_flags & TG3_FLAG_MBOX_WRITE_REORDER)
353 readl(mbox);
356 static inline void _tw32_tx_mbox(struct tg3 *tp, u32 off, u32 val)
358 void __iomem *mbox = tp->regs + off;
359 writel(val, mbox);
360 if (tp->tg3_flags & TG3_FLAG_TXD_MBOX_HWBUG)
361 writel(val, mbox);
362 if (tp->tg3_flags & TG3_FLAG_MBOX_WRITE_REORDER)
363 readl(mbox);
366 #define tw32_mailbox(reg, val) writel(((val) & 0xffffffff), tp->regs + (reg))
367 #define tw32_rx_mbox(reg, val) _tw32_rx_mbox(tp, reg, val)
368 #define tw32_tx_mbox(reg, val) _tw32_tx_mbox(tp, reg, val)
370 #define tw32(reg,val) tg3_write_indirect_reg32(tp,(reg),(val))
371 #define tw32_f(reg,val) _tw32_flush(tp,(reg),(val))
372 #define tw16(reg,val) writew(((val) & 0xffff), tp->regs + (reg))
373 #define tw8(reg,val) writeb(((val) & 0xff), tp->regs + (reg))
374 #define tr32(reg) readl(tp->regs + (reg))
375 #define tr16(reg) readw(tp->regs + (reg))
376 #define tr8(reg) readb(tp->regs + (reg))
378 static void tg3_write_mem(struct tg3 *tp, u32 off, u32 val)
380 unsigned long flags;
382 spin_lock_irqsave(&tp->indirect_lock, flags);
383 pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_BASE_ADDR, off);
384 pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_DATA, val);
386 /* Always leave this as zero. */
387 pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_BASE_ADDR, 0);
388 spin_unlock_irqrestore(&tp->indirect_lock, flags);
391 static void tg3_read_mem(struct tg3 *tp, u32 off, u32 *val)
393 unsigned long flags;
395 spin_lock_irqsave(&tp->indirect_lock, flags);
396 pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_BASE_ADDR, off);
397 pci_read_config_dword(tp->pdev, TG3PCI_MEM_WIN_DATA, val);
399 /* Always leave this as zero. */
400 pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_BASE_ADDR, 0);
401 spin_unlock_irqrestore(&tp->indirect_lock, flags);
404 static void tg3_disable_ints(struct tg3 *tp)
406 tw32(TG3PCI_MISC_HOST_CTRL,
407 (tp->misc_host_ctrl | MISC_HOST_CTRL_MASK_PCI_INT));
408 tw32_mailbox(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW, 0x00000001);
409 tr32(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW);
412 static inline void tg3_cond_int(struct tg3 *tp)
414 if (tp->hw_status->status & SD_STATUS_UPDATED)
415 tw32(GRC_LOCAL_CTRL, tp->grc_local_ctrl | GRC_LCLCTRL_SETINT);
418 static void tg3_enable_ints(struct tg3 *tp)
420 tw32(TG3PCI_MISC_HOST_CTRL,
421 (tp->misc_host_ctrl & ~MISC_HOST_CTRL_MASK_PCI_INT));
422 tw32_mailbox(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW, 0x00000000);
423 tr32(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW);
425 tg3_cond_int(tp);
428 /* tg3_restart_ints
429 * similar to tg3_enable_ints, but it can return without flushing the
430 * PIO write which reenables interrupts
432 static void tg3_restart_ints(struct tg3 *tp)
434 tw32(TG3PCI_MISC_HOST_CTRL,
435 (tp->misc_host_ctrl & ~MISC_HOST_CTRL_MASK_PCI_INT));
436 tw32_mailbox(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW, 0x00000000);
437 mmiowb();
439 tg3_cond_int(tp);
442 static inline void tg3_netif_stop(struct tg3 *tp)
444 netif_poll_disable(tp->dev);
445 netif_tx_disable(tp->dev);
448 static inline void tg3_netif_start(struct tg3 *tp)
450 netif_wake_queue(tp->dev);
451 /* NOTE: unconditional netif_wake_queue is only appropriate
452 * so long as all callers are assured to have free tx slots
453 * (such as after tg3_init_hw)
455 netif_poll_enable(tp->dev);
456 tg3_cond_int(tp);
459 static void tg3_switch_clocks(struct tg3 *tp)
461 u32 clock_ctrl = tr32(TG3PCI_CLOCK_CTRL);
462 u32 orig_clock_ctrl;
464 orig_clock_ctrl = clock_ctrl;
465 clock_ctrl &= (CLOCK_CTRL_FORCE_CLKRUN |
466 CLOCK_CTRL_CLKRUN_OENABLE |
467 0x1f);
468 tp->pci_clock_ctrl = clock_ctrl;
470 if (tp->tg3_flags2 & TG3_FLG2_5705_PLUS) {
471 if (orig_clock_ctrl & CLOCK_CTRL_625_CORE) {
472 tw32_f(TG3PCI_CLOCK_CTRL,
473 clock_ctrl | CLOCK_CTRL_625_CORE);
474 udelay(40);
476 } else if ((orig_clock_ctrl & CLOCK_CTRL_44MHZ_CORE) != 0) {
477 tw32_f(TG3PCI_CLOCK_CTRL,
478 clock_ctrl |
479 (CLOCK_CTRL_44MHZ_CORE | CLOCK_CTRL_ALTCLK));
480 udelay(40);
481 tw32_f(TG3PCI_CLOCK_CTRL,
482 clock_ctrl | (CLOCK_CTRL_ALTCLK));
483 udelay(40);
485 tw32_f(TG3PCI_CLOCK_CTRL, clock_ctrl);
486 udelay(40);
489 #define PHY_BUSY_LOOPS 5000
491 static int tg3_readphy(struct tg3 *tp, int reg, u32 *val)
493 u32 frame_val;
494 unsigned int loops;
495 int ret;
497 if ((tp->mi_mode & MAC_MI_MODE_AUTO_POLL) != 0) {
498 tw32_f(MAC_MI_MODE,
499 (tp->mi_mode & ~MAC_MI_MODE_AUTO_POLL));
500 udelay(80);
503 *val = 0x0;
505 frame_val = ((PHY_ADDR << MI_COM_PHY_ADDR_SHIFT) &
506 MI_COM_PHY_ADDR_MASK);
507 frame_val |= ((reg << MI_COM_REG_ADDR_SHIFT) &
508 MI_COM_REG_ADDR_MASK);
509 frame_val |= (MI_COM_CMD_READ | MI_COM_START);
511 tw32_f(MAC_MI_COM, frame_val);
513 loops = PHY_BUSY_LOOPS;
514 while (loops != 0) {
515 udelay(10);
516 frame_val = tr32(MAC_MI_COM);
518 if ((frame_val & MI_COM_BUSY) == 0) {
519 udelay(5);
520 frame_val = tr32(MAC_MI_COM);
521 break;
523 loops -= 1;
526 ret = -EBUSY;
527 if (loops != 0) {
528 *val = frame_val & MI_COM_DATA_MASK;
529 ret = 0;
532 if ((tp->mi_mode & MAC_MI_MODE_AUTO_POLL) != 0) {
533 tw32_f(MAC_MI_MODE, tp->mi_mode);
534 udelay(80);
537 return ret;
540 static int tg3_writephy(struct tg3 *tp, int reg, u32 val)
542 u32 frame_val;
543 unsigned int loops;
544 int ret;
546 if ((tp->mi_mode & MAC_MI_MODE_AUTO_POLL) != 0) {
547 tw32_f(MAC_MI_MODE,
548 (tp->mi_mode & ~MAC_MI_MODE_AUTO_POLL));
549 udelay(80);
552 frame_val = ((PHY_ADDR << MI_COM_PHY_ADDR_SHIFT) &
553 MI_COM_PHY_ADDR_MASK);
554 frame_val |= ((reg << MI_COM_REG_ADDR_SHIFT) &
555 MI_COM_REG_ADDR_MASK);
556 frame_val |= (val & MI_COM_DATA_MASK);
557 frame_val |= (MI_COM_CMD_WRITE | MI_COM_START);
559 tw32_f(MAC_MI_COM, frame_val);
561 loops = PHY_BUSY_LOOPS;
562 while (loops != 0) {
563 udelay(10);
564 frame_val = tr32(MAC_MI_COM);
565 if ((frame_val & MI_COM_BUSY) == 0) {
566 udelay(5);
567 frame_val = tr32(MAC_MI_COM);
568 break;
570 loops -= 1;
573 ret = -EBUSY;
574 if (loops != 0)
575 ret = 0;
577 if ((tp->mi_mode & MAC_MI_MODE_AUTO_POLL) != 0) {
578 tw32_f(MAC_MI_MODE, tp->mi_mode);
579 udelay(80);
582 return ret;
585 static void tg3_phy_set_wirespeed(struct tg3 *tp)
587 u32 val;
589 if (tp->tg3_flags2 & TG3_FLG2_NO_ETH_WIRE_SPEED)
590 return;
592 if (!tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x7007) &&
593 !tg3_readphy(tp, MII_TG3_AUX_CTRL, &val))
594 tg3_writephy(tp, MII_TG3_AUX_CTRL,
595 (val | (1 << 15) | (1 << 4)));
598 static int tg3_bmcr_reset(struct tg3 *tp)
600 u32 phy_control;
601 int limit, err;
603 /* OK, reset it, and poll the BMCR_RESET bit until it
604 * clears or we time out.
606 phy_control = BMCR_RESET;
607 err = tg3_writephy(tp, MII_BMCR, phy_control);
608 if (err != 0)
609 return -EBUSY;
611 limit = 5000;
612 while (limit--) {
613 err = tg3_readphy(tp, MII_BMCR, &phy_control);
614 if (err != 0)
615 return -EBUSY;
617 if ((phy_control & BMCR_RESET) == 0) {
618 udelay(40);
619 break;
621 udelay(10);
623 if (limit <= 0)
624 return -EBUSY;
626 return 0;
629 static int tg3_wait_macro_done(struct tg3 *tp)
631 int limit = 100;
633 while (limit--) {
634 u32 tmp32;
636 if (!tg3_readphy(tp, 0x16, &tmp32)) {
637 if ((tmp32 & 0x1000) == 0)
638 break;
641 if (limit <= 0)
642 return -EBUSY;
644 return 0;
647 static int tg3_phy_write_and_check_testpat(struct tg3 *tp, int *resetp)
649 static const u32 test_pat[4][6] = {
650 { 0x00005555, 0x00000005, 0x00002aaa, 0x0000000a, 0x00003456, 0x00000003 },
651 { 0x00002aaa, 0x0000000a, 0x00003333, 0x00000003, 0x0000789a, 0x00000005 },
652 { 0x00005a5a, 0x00000005, 0x00002a6a, 0x0000000a, 0x00001bcd, 0x00000003 },
653 { 0x00002a5a, 0x0000000a, 0x000033c3, 0x00000003, 0x00002ef1, 0x00000005 }
655 int chan;
657 for (chan = 0; chan < 4; chan++) {
658 int i;
660 tg3_writephy(tp, MII_TG3_DSP_ADDRESS,
661 (chan * 0x2000) | 0x0200);
662 tg3_writephy(tp, 0x16, 0x0002);
664 for (i = 0; i < 6; i++)
665 tg3_writephy(tp, MII_TG3_DSP_RW_PORT,
666 test_pat[chan][i]);
668 tg3_writephy(tp, 0x16, 0x0202);
669 if (tg3_wait_macro_done(tp)) {
670 *resetp = 1;
671 return -EBUSY;
674 tg3_writephy(tp, MII_TG3_DSP_ADDRESS,
675 (chan * 0x2000) | 0x0200);
676 tg3_writephy(tp, 0x16, 0x0082);
677 if (tg3_wait_macro_done(tp)) {
678 *resetp = 1;
679 return -EBUSY;
682 tg3_writephy(tp, 0x16, 0x0802);
683 if (tg3_wait_macro_done(tp)) {
684 *resetp = 1;
685 return -EBUSY;
688 for (i = 0; i < 6; i += 2) {
689 u32 low, high;
691 if (tg3_readphy(tp, MII_TG3_DSP_RW_PORT, &low) ||
692 tg3_readphy(tp, MII_TG3_DSP_RW_PORT, &high) ||
693 tg3_wait_macro_done(tp)) {
694 *resetp = 1;
695 return -EBUSY;
697 low &= 0x7fff;
698 high &= 0x000f;
699 if (low != test_pat[chan][i] ||
700 high != test_pat[chan][i+1]) {
701 tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x000b);
702 tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x4001);
703 tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x4005);
705 return -EBUSY;
710 return 0;
713 static int tg3_phy_reset_chanpat(struct tg3 *tp)
715 int chan;
717 for (chan = 0; chan < 4; chan++) {
718 int i;
720 tg3_writephy(tp, MII_TG3_DSP_ADDRESS,
721 (chan * 0x2000) | 0x0200);
722 tg3_writephy(tp, 0x16, 0x0002);
723 for (i = 0; i < 6; i++)
724 tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x000);
725 tg3_writephy(tp, 0x16, 0x0202);
726 if (tg3_wait_macro_done(tp))
727 return -EBUSY;
730 return 0;
733 static int tg3_phy_reset_5703_4_5(struct tg3 *tp)
735 u32 reg32, phy9_orig;
736 int retries, do_phy_reset, err;
738 retries = 10;
739 do_phy_reset = 1;
740 do {
741 if (do_phy_reset) {
742 err = tg3_bmcr_reset(tp);
743 if (err)
744 return err;
745 do_phy_reset = 0;
748 /* Disable transmitter and interrupt. */
749 if (tg3_readphy(tp, MII_TG3_EXT_CTRL, &reg32))
750 continue;
752 reg32 |= 0x3000;
753 tg3_writephy(tp, MII_TG3_EXT_CTRL, reg32);
755 /* Set full-duplex, 1000 mbps. */
756 tg3_writephy(tp, MII_BMCR,
757 BMCR_FULLDPLX | TG3_BMCR_SPEED1000);
759 /* Set to master mode. */
760 if (tg3_readphy(tp, MII_TG3_CTRL, &phy9_orig))
761 continue;
763 tg3_writephy(tp, MII_TG3_CTRL,
764 (MII_TG3_CTRL_AS_MASTER |
765 MII_TG3_CTRL_ENABLE_AS_MASTER));
767 /* Enable SM_DSP_CLOCK and 6dB. */
768 tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x0c00);
770 /* Block the PHY control access. */
771 tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x8005);
772 tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x0800);
774 err = tg3_phy_write_and_check_testpat(tp, &do_phy_reset);
775 if (!err)
776 break;
777 } while (--retries);
779 err = tg3_phy_reset_chanpat(tp);
780 if (err)
781 return err;
783 tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x8005);
784 tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x0000);
786 tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x8200);
787 tg3_writephy(tp, 0x16, 0x0000);
789 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703 ||
790 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704) {
791 /* Set Extended packet length bit for jumbo frames */
792 tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x4400);
794 else {
795 tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x0400);
798 tg3_writephy(tp, MII_TG3_CTRL, phy9_orig);
800 if (!tg3_readphy(tp, MII_TG3_EXT_CTRL, &reg32)) {
801 reg32 &= ~0x3000;
802 tg3_writephy(tp, MII_TG3_EXT_CTRL, reg32);
803 } else if (!err)
804 err = -EBUSY;
806 return err;
809 /* This will reset the tigon3 PHY if there is no valid
810 * link unless the FORCE argument is non-zero.
812 static int tg3_phy_reset(struct tg3 *tp)
814 u32 phy_status;
815 int err;
817 err = tg3_readphy(tp, MII_BMSR, &phy_status);
818 err |= tg3_readphy(tp, MII_BMSR, &phy_status);
819 if (err != 0)
820 return -EBUSY;
822 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703 ||
823 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704 ||
824 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) {
825 err = tg3_phy_reset_5703_4_5(tp);
826 if (err)
827 return err;
828 goto out;
831 err = tg3_bmcr_reset(tp);
832 if (err)
833 return err;
835 out:
836 if (tp->tg3_flags2 & TG3_FLG2_PHY_ADC_BUG) {
837 tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x0c00);
838 tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x201f);
839 tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x2aaa);
840 tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x000a);
841 tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x0323);
842 tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x0400);
844 if (tp->tg3_flags2 & TG3_FLG2_PHY_5704_A0_BUG) {
845 tg3_writephy(tp, 0x1c, 0x8d68);
846 tg3_writephy(tp, 0x1c, 0x8d68);
848 if (tp->tg3_flags2 & TG3_FLG2_PHY_BER_BUG) {
849 tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x0c00);
850 tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x000a);
851 tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x310b);
852 tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x201f);
853 tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x9506);
854 tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x401f);
855 tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x14e2);
856 tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x0400);
858 /* Set Extended packet length bit (bit 14) on all chips that */
859 /* support jumbo frames */
860 if ((tp->phy_id & PHY_ID_MASK) == PHY_ID_BCM5401) {
861 /* Cannot do read-modify-write on 5401 */
862 tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x4c20);
863 } else if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5705 &&
864 GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5750) {
865 u32 phy_reg;
867 /* Set bit 14 with read-modify-write to preserve other bits */
868 if (!tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x0007) &&
869 !tg3_readphy(tp, MII_TG3_AUX_CTRL, &phy_reg))
870 tg3_writephy(tp, MII_TG3_AUX_CTRL, phy_reg | 0x4000);
873 /* Set phy register 0x10 bit 0 to high fifo elasticity to support
874 * jumbo frames transmission.
876 if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5705 &&
877 GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5750) {
878 u32 phy_reg;
880 if (!tg3_readphy(tp, MII_TG3_EXT_CTRL, &phy_reg))
881 tg3_writephy(tp, MII_TG3_EXT_CTRL,
882 phy_reg | MII_TG3_EXT_CTRL_FIFO_ELASTIC);
885 tg3_phy_set_wirespeed(tp);
886 return 0;
889 static void tg3_frob_aux_power(struct tg3 *tp)
891 struct tg3 *tp_peer = tp;
893 if ((tp->tg3_flags & TG3_FLAG_EEPROM_WRITE_PROT) != 0)
894 return;
896 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704) {
897 tp_peer = pci_get_drvdata(tp->pdev_peer);
898 if (!tp_peer)
899 BUG();
903 if ((tp->tg3_flags & TG3_FLAG_WOL_ENABLE) != 0 ||
904 (tp_peer->tg3_flags & TG3_FLAG_WOL_ENABLE) != 0) {
905 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 ||
906 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701) {
907 tw32_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl |
908 (GRC_LCLCTRL_GPIO_OE0 |
909 GRC_LCLCTRL_GPIO_OE1 |
910 GRC_LCLCTRL_GPIO_OE2 |
911 GRC_LCLCTRL_GPIO_OUTPUT0 |
912 GRC_LCLCTRL_GPIO_OUTPUT1));
913 udelay(100);
914 } else {
915 u32 no_gpio2;
916 u32 grc_local_ctrl;
918 if (tp_peer != tp &&
919 (tp_peer->tg3_flags & TG3_FLAG_INIT_COMPLETE) != 0)
920 return;
922 /* On 5753 and variants, GPIO2 cannot be used. */
923 no_gpio2 = tp->nic_sram_data_cfg &
924 NIC_SRAM_DATA_CFG_NO_GPIO2;
926 grc_local_ctrl = GRC_LCLCTRL_GPIO_OE0 |
927 GRC_LCLCTRL_GPIO_OE1 |
928 GRC_LCLCTRL_GPIO_OE2 |
929 GRC_LCLCTRL_GPIO_OUTPUT1 |
930 GRC_LCLCTRL_GPIO_OUTPUT2;
931 if (no_gpio2) {
932 grc_local_ctrl &= ~(GRC_LCLCTRL_GPIO_OE2 |
933 GRC_LCLCTRL_GPIO_OUTPUT2);
935 tw32_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl |
936 grc_local_ctrl);
937 udelay(100);
939 grc_local_ctrl |= GRC_LCLCTRL_GPIO_OUTPUT0;
941 tw32_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl |
942 grc_local_ctrl);
943 udelay(100);
945 if (!no_gpio2) {
946 grc_local_ctrl &= ~GRC_LCLCTRL_GPIO_OUTPUT2;
947 tw32_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl |
948 grc_local_ctrl);
949 udelay(100);
952 } else {
953 if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5700 &&
954 GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5701) {
955 if (tp_peer != tp &&
956 (tp_peer->tg3_flags & TG3_FLAG_INIT_COMPLETE) != 0)
957 return;
959 tw32_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl |
960 (GRC_LCLCTRL_GPIO_OE1 |
961 GRC_LCLCTRL_GPIO_OUTPUT1));
962 udelay(100);
964 tw32_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl |
965 (GRC_LCLCTRL_GPIO_OE1));
966 udelay(100);
968 tw32_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl |
969 (GRC_LCLCTRL_GPIO_OE1 |
970 GRC_LCLCTRL_GPIO_OUTPUT1));
971 udelay(100);
976 static int tg3_setup_phy(struct tg3 *, int);
978 #define RESET_KIND_SHUTDOWN 0
979 #define RESET_KIND_INIT 1
980 #define RESET_KIND_SUSPEND 2
982 static void tg3_write_sig_post_reset(struct tg3 *, int);
983 static int tg3_halt_cpu(struct tg3 *, u32);
985 static int tg3_set_power_state(struct tg3 *tp, int state)
987 u32 misc_host_ctrl;
988 u16 power_control, power_caps;
989 int pm = tp->pm_cap;
991 /* Make sure register accesses (indirect or otherwise)
992 * will function correctly.
994 pci_write_config_dword(tp->pdev,
995 TG3PCI_MISC_HOST_CTRL,
996 tp->misc_host_ctrl);
998 pci_read_config_word(tp->pdev,
999 pm + PCI_PM_CTRL,
1000 &power_control);
1001 power_control |= PCI_PM_CTRL_PME_STATUS;
1002 power_control &= ~(PCI_PM_CTRL_STATE_MASK);
1003 switch (state) {
1004 case 0:
1005 power_control |= 0;
1006 pci_write_config_word(tp->pdev,
1007 pm + PCI_PM_CTRL,
1008 power_control);
1009 tw32_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl);
1010 udelay(100);
1012 return 0;
1014 case 1:
1015 power_control |= 1;
1016 break;
1018 case 2:
1019 power_control |= 2;
1020 break;
1022 case 3:
1023 power_control |= 3;
1024 break;
1026 default:
1027 printk(KERN_WARNING PFX "%s: Invalid power state (%d) "
1028 "requested.\n",
1029 tp->dev->name, state);
1030 return -EINVAL;
1033 power_control |= PCI_PM_CTRL_PME_ENABLE;
1035 misc_host_ctrl = tr32(TG3PCI_MISC_HOST_CTRL);
1036 tw32(TG3PCI_MISC_HOST_CTRL,
1037 misc_host_ctrl | MISC_HOST_CTRL_MASK_PCI_INT);
1039 if (tp->link_config.phy_is_low_power == 0) {
1040 tp->link_config.phy_is_low_power = 1;
1041 tp->link_config.orig_speed = tp->link_config.speed;
1042 tp->link_config.orig_duplex = tp->link_config.duplex;
1043 tp->link_config.orig_autoneg = tp->link_config.autoneg;
1046 if (!(tp->tg3_flags2 & TG3_FLG2_PHY_SERDES)) {
1047 tp->link_config.speed = SPEED_10;
1048 tp->link_config.duplex = DUPLEX_HALF;
1049 tp->link_config.autoneg = AUTONEG_ENABLE;
1050 tg3_setup_phy(tp, 0);
1053 pci_read_config_word(tp->pdev, pm + PCI_PM_PMC, &power_caps);
1055 if (tp->tg3_flags & TG3_FLAG_WOL_ENABLE) {
1056 u32 mac_mode;
1058 if (!(tp->tg3_flags2 & TG3_FLG2_PHY_SERDES)) {
1059 tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x5a);
1060 udelay(40);
1062 mac_mode = MAC_MODE_PORT_MODE_MII;
1064 if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5700 ||
1065 !(tp->tg3_flags & TG3_FLAG_WOL_SPEED_100MB))
1066 mac_mode |= MAC_MODE_LINK_POLARITY;
1067 } else {
1068 mac_mode = MAC_MODE_PORT_MODE_TBI;
1071 if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5750)
1072 tw32(MAC_LED_CTRL, tp->led_ctrl);
1074 if (((power_caps & PCI_PM_CAP_PME_D3cold) &&
1075 (tp->tg3_flags & TG3_FLAG_WOL_ENABLE)))
1076 mac_mode |= MAC_MODE_MAGIC_PKT_ENABLE;
1078 tw32_f(MAC_MODE, mac_mode);
1079 udelay(100);
1081 tw32_f(MAC_RX_MODE, RX_MODE_ENABLE);
1082 udelay(10);
1085 if (!(tp->tg3_flags & TG3_FLAG_WOL_SPEED_100MB) &&
1086 (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 ||
1087 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701)) {
1088 u32 base_val;
1090 base_val = tp->pci_clock_ctrl;
1091 base_val |= (CLOCK_CTRL_RXCLK_DISABLE |
1092 CLOCK_CTRL_TXCLK_DISABLE);
1094 tw32_f(TG3PCI_CLOCK_CTRL, base_val |
1095 CLOCK_CTRL_ALTCLK |
1096 CLOCK_CTRL_PWRDOWN_PLL133);
1097 udelay(40);
1098 } else if (!((GET_ASIC_REV(tp->pci_chip_rev_id) == 5750) &&
1099 (tp->tg3_flags & TG3_FLAG_ENABLE_ASF))) {
1100 u32 newbits1, newbits2;
1102 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 ||
1103 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701) {
1104 newbits1 = (CLOCK_CTRL_RXCLK_DISABLE |
1105 CLOCK_CTRL_TXCLK_DISABLE |
1106 CLOCK_CTRL_ALTCLK);
1107 newbits2 = newbits1 | CLOCK_CTRL_44MHZ_CORE;
1108 } else if (tp->tg3_flags2 & TG3_FLG2_5705_PLUS) {
1109 newbits1 = CLOCK_CTRL_625_CORE;
1110 newbits2 = newbits1 | CLOCK_CTRL_ALTCLK;
1111 } else {
1112 newbits1 = CLOCK_CTRL_ALTCLK;
1113 newbits2 = newbits1 | CLOCK_CTRL_44MHZ_CORE;
1116 tw32_f(TG3PCI_CLOCK_CTRL, tp->pci_clock_ctrl | newbits1);
1117 udelay(40);
1119 tw32_f(TG3PCI_CLOCK_CTRL, tp->pci_clock_ctrl | newbits2);
1120 udelay(40);
1122 if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS)) {
1123 u32 newbits3;
1125 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 ||
1126 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701) {
1127 newbits3 = (CLOCK_CTRL_RXCLK_DISABLE |
1128 CLOCK_CTRL_TXCLK_DISABLE |
1129 CLOCK_CTRL_44MHZ_CORE);
1130 } else {
1131 newbits3 = CLOCK_CTRL_44MHZ_CORE;
1134 tw32_f(TG3PCI_CLOCK_CTRL,
1135 tp->pci_clock_ctrl | newbits3);
1136 udelay(40);
1140 tg3_frob_aux_power(tp);
1142 /* Workaround for unstable PLL clock */
1143 if ((GET_CHIP_REV(tp->pci_chip_rev_id) == CHIPREV_5750_AX) ||
1144 (GET_CHIP_REV(tp->pci_chip_rev_id) == CHIPREV_5750_BX)) {
1145 u32 val = tr32(0x7d00);
1147 val &= ~((1 << 16) | (1 << 4) | (1 << 2) | (1 << 1) | 1);
1148 tw32(0x7d00, val);
1149 if (!(tp->tg3_flags & TG3_FLAG_ENABLE_ASF))
1150 tg3_halt_cpu(tp, RX_CPU_BASE);
1153 /* Finally, set the new power state. */
1154 pci_write_config_word(tp->pdev, pm + PCI_PM_CTRL, power_control);
1156 tg3_write_sig_post_reset(tp, RESET_KIND_SHUTDOWN);
1158 return 0;
1161 static void tg3_link_report(struct tg3 *tp)
1163 if (!netif_carrier_ok(tp->dev)) {
1164 printk(KERN_INFO PFX "%s: Link is down.\n", tp->dev->name);
1165 } else {
1166 printk(KERN_INFO PFX "%s: Link is up at %d Mbps, %s duplex.\n",
1167 tp->dev->name,
1168 (tp->link_config.active_speed == SPEED_1000 ?
1169 1000 :
1170 (tp->link_config.active_speed == SPEED_100 ?
1171 100 : 10)),
1172 (tp->link_config.active_duplex == DUPLEX_FULL ?
1173 "full" : "half"));
1175 printk(KERN_INFO PFX "%s: Flow control is %s for TX and "
1176 "%s for RX.\n",
1177 tp->dev->name,
1178 (tp->tg3_flags & TG3_FLAG_TX_PAUSE) ? "on" : "off",
1179 (tp->tg3_flags & TG3_FLAG_RX_PAUSE) ? "on" : "off");
1183 static void tg3_setup_flow_control(struct tg3 *tp, u32 local_adv, u32 remote_adv)
1185 u32 new_tg3_flags = 0;
1186 u32 old_rx_mode = tp->rx_mode;
1187 u32 old_tx_mode = tp->tx_mode;
1189 if (tp->tg3_flags & TG3_FLAG_PAUSE_AUTONEG) {
1190 if (local_adv & ADVERTISE_PAUSE_CAP) {
1191 if (local_adv & ADVERTISE_PAUSE_ASYM) {
1192 if (remote_adv & LPA_PAUSE_CAP)
1193 new_tg3_flags |=
1194 (TG3_FLAG_RX_PAUSE |
1195 TG3_FLAG_TX_PAUSE);
1196 else if (remote_adv & LPA_PAUSE_ASYM)
1197 new_tg3_flags |=
1198 (TG3_FLAG_RX_PAUSE);
1199 } else {
1200 if (remote_adv & LPA_PAUSE_CAP)
1201 new_tg3_flags |=
1202 (TG3_FLAG_RX_PAUSE |
1203 TG3_FLAG_TX_PAUSE);
1205 } else if (local_adv & ADVERTISE_PAUSE_ASYM) {
1206 if ((remote_adv & LPA_PAUSE_CAP) &&
1207 (remote_adv & LPA_PAUSE_ASYM))
1208 new_tg3_flags |= TG3_FLAG_TX_PAUSE;
1211 tp->tg3_flags &= ~(TG3_FLAG_RX_PAUSE | TG3_FLAG_TX_PAUSE);
1212 tp->tg3_flags |= new_tg3_flags;
1213 } else {
1214 new_tg3_flags = tp->tg3_flags;
1217 if (new_tg3_flags & TG3_FLAG_RX_PAUSE)
1218 tp->rx_mode |= RX_MODE_FLOW_CTRL_ENABLE;
1219 else
1220 tp->rx_mode &= ~RX_MODE_FLOW_CTRL_ENABLE;
1222 if (old_rx_mode != tp->rx_mode) {
1223 tw32_f(MAC_RX_MODE, tp->rx_mode);
1226 if (new_tg3_flags & TG3_FLAG_TX_PAUSE)
1227 tp->tx_mode |= TX_MODE_FLOW_CTRL_ENABLE;
1228 else
1229 tp->tx_mode &= ~TX_MODE_FLOW_CTRL_ENABLE;
1231 if (old_tx_mode != tp->tx_mode) {
1232 tw32_f(MAC_TX_MODE, tp->tx_mode);
1236 static void tg3_aux_stat_to_speed_duplex(struct tg3 *tp, u32 val, u16 *speed, u8 *duplex)
1238 switch (val & MII_TG3_AUX_STAT_SPDMASK) {
1239 case MII_TG3_AUX_STAT_10HALF:
1240 *speed = SPEED_10;
1241 *duplex = DUPLEX_HALF;
1242 break;
1244 case MII_TG3_AUX_STAT_10FULL:
1245 *speed = SPEED_10;
1246 *duplex = DUPLEX_FULL;
1247 break;
1249 case MII_TG3_AUX_STAT_100HALF:
1250 *speed = SPEED_100;
1251 *duplex = DUPLEX_HALF;
1252 break;
1254 case MII_TG3_AUX_STAT_100FULL:
1255 *speed = SPEED_100;
1256 *duplex = DUPLEX_FULL;
1257 break;
1259 case MII_TG3_AUX_STAT_1000HALF:
1260 *speed = SPEED_1000;
1261 *duplex = DUPLEX_HALF;
1262 break;
1264 case MII_TG3_AUX_STAT_1000FULL:
1265 *speed = SPEED_1000;
1266 *duplex = DUPLEX_FULL;
1267 break;
1269 default:
1270 *speed = SPEED_INVALID;
1271 *duplex = DUPLEX_INVALID;
1272 break;
1276 static void tg3_phy_copper_begin(struct tg3 *tp)
1278 u32 new_adv;
1279 int i;
1281 if (tp->link_config.phy_is_low_power) {
1282 /* Entering low power mode. Disable gigabit and
1283 * 100baseT advertisements.
1285 tg3_writephy(tp, MII_TG3_CTRL, 0);
1287 new_adv = (ADVERTISE_10HALF | ADVERTISE_10FULL |
1288 ADVERTISE_CSMA | ADVERTISE_PAUSE_CAP);
1289 if (tp->tg3_flags & TG3_FLAG_WOL_SPEED_100MB)
1290 new_adv |= (ADVERTISE_100HALF | ADVERTISE_100FULL);
1292 tg3_writephy(tp, MII_ADVERTISE, new_adv);
1293 } else if (tp->link_config.speed == SPEED_INVALID) {
1294 tp->link_config.advertising =
1295 (ADVERTISED_10baseT_Half | ADVERTISED_10baseT_Full |
1296 ADVERTISED_100baseT_Half | ADVERTISED_100baseT_Full |
1297 ADVERTISED_1000baseT_Half | ADVERTISED_1000baseT_Full |
1298 ADVERTISED_Autoneg | ADVERTISED_MII);
1300 if (tp->tg3_flags & TG3_FLAG_10_100_ONLY)
1301 tp->link_config.advertising &=
1302 ~(ADVERTISED_1000baseT_Half |
1303 ADVERTISED_1000baseT_Full);
1305 new_adv = (ADVERTISE_CSMA | ADVERTISE_PAUSE_CAP);
1306 if (tp->link_config.advertising & ADVERTISED_10baseT_Half)
1307 new_adv |= ADVERTISE_10HALF;
1308 if (tp->link_config.advertising & ADVERTISED_10baseT_Full)
1309 new_adv |= ADVERTISE_10FULL;
1310 if (tp->link_config.advertising & ADVERTISED_100baseT_Half)
1311 new_adv |= ADVERTISE_100HALF;
1312 if (tp->link_config.advertising & ADVERTISED_100baseT_Full)
1313 new_adv |= ADVERTISE_100FULL;
1314 tg3_writephy(tp, MII_ADVERTISE, new_adv);
1316 if (tp->link_config.advertising &
1317 (ADVERTISED_1000baseT_Half | ADVERTISED_1000baseT_Full)) {
1318 new_adv = 0;
1319 if (tp->link_config.advertising & ADVERTISED_1000baseT_Half)
1320 new_adv |= MII_TG3_CTRL_ADV_1000_HALF;
1321 if (tp->link_config.advertising & ADVERTISED_1000baseT_Full)
1322 new_adv |= MII_TG3_CTRL_ADV_1000_FULL;
1323 if (!(tp->tg3_flags & TG3_FLAG_10_100_ONLY) &&
1324 (tp->pci_chip_rev_id == CHIPREV_ID_5701_A0 ||
1325 tp->pci_chip_rev_id == CHIPREV_ID_5701_B0))
1326 new_adv |= (MII_TG3_CTRL_AS_MASTER |
1327 MII_TG3_CTRL_ENABLE_AS_MASTER);
1328 tg3_writephy(tp, MII_TG3_CTRL, new_adv);
1329 } else {
1330 tg3_writephy(tp, MII_TG3_CTRL, 0);
1332 } else {
1333 /* Asking for a specific link mode. */
1334 if (tp->link_config.speed == SPEED_1000) {
1335 new_adv = ADVERTISE_CSMA | ADVERTISE_PAUSE_CAP;
1336 tg3_writephy(tp, MII_ADVERTISE, new_adv);
1338 if (tp->link_config.duplex == DUPLEX_FULL)
1339 new_adv = MII_TG3_CTRL_ADV_1000_FULL;
1340 else
1341 new_adv = MII_TG3_CTRL_ADV_1000_HALF;
1342 if (tp->pci_chip_rev_id == CHIPREV_ID_5701_A0 ||
1343 tp->pci_chip_rev_id == CHIPREV_ID_5701_B0)
1344 new_adv |= (MII_TG3_CTRL_AS_MASTER |
1345 MII_TG3_CTRL_ENABLE_AS_MASTER);
1346 tg3_writephy(tp, MII_TG3_CTRL, new_adv);
1347 } else {
1348 tg3_writephy(tp, MII_TG3_CTRL, 0);
1350 new_adv = ADVERTISE_CSMA | ADVERTISE_PAUSE_CAP;
1351 if (tp->link_config.speed == SPEED_100) {
1352 if (tp->link_config.duplex == DUPLEX_FULL)
1353 new_adv |= ADVERTISE_100FULL;
1354 else
1355 new_adv |= ADVERTISE_100HALF;
1356 } else {
1357 if (tp->link_config.duplex == DUPLEX_FULL)
1358 new_adv |= ADVERTISE_10FULL;
1359 else
1360 new_adv |= ADVERTISE_10HALF;
1362 tg3_writephy(tp, MII_ADVERTISE, new_adv);
1366 if (tp->link_config.autoneg == AUTONEG_DISABLE &&
1367 tp->link_config.speed != SPEED_INVALID) {
1368 u32 bmcr, orig_bmcr;
1370 tp->link_config.active_speed = tp->link_config.speed;
1371 tp->link_config.active_duplex = tp->link_config.duplex;
1373 bmcr = 0;
1374 switch (tp->link_config.speed) {
1375 default:
1376 case SPEED_10:
1377 break;
1379 case SPEED_100:
1380 bmcr |= BMCR_SPEED100;
1381 break;
1383 case SPEED_1000:
1384 bmcr |= TG3_BMCR_SPEED1000;
1385 break;
1388 if (tp->link_config.duplex == DUPLEX_FULL)
1389 bmcr |= BMCR_FULLDPLX;
1391 if (!tg3_readphy(tp, MII_BMCR, &orig_bmcr) &&
1392 (bmcr != orig_bmcr)) {
1393 tg3_writephy(tp, MII_BMCR, BMCR_LOOPBACK);
1394 for (i = 0; i < 1500; i++) {
1395 u32 tmp;
1397 udelay(10);
1398 if (tg3_readphy(tp, MII_BMSR, &tmp) ||
1399 tg3_readphy(tp, MII_BMSR, &tmp))
1400 continue;
1401 if (!(tmp & BMSR_LSTATUS)) {
1402 udelay(40);
1403 break;
1406 tg3_writephy(tp, MII_BMCR, bmcr);
1407 udelay(40);
1409 } else {
1410 tg3_writephy(tp, MII_BMCR,
1411 BMCR_ANENABLE | BMCR_ANRESTART);
1415 static int tg3_init_5401phy_dsp(struct tg3 *tp)
1417 int err;
1419 /* Turn off tap power management. */
1420 /* Set Extended packet length bit */
1421 err = tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x4c20);
1423 err |= tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x0012);
1424 err |= tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x1804);
1426 err |= tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x0013);
1427 err |= tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x1204);
1429 err |= tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x8006);
1430 err |= tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x0132);
1432 err |= tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x8006);
1433 err |= tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x0232);
1435 err |= tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x201f);
1436 err |= tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x0a20);
1438 udelay(40);
1440 return err;
1443 static int tg3_copper_is_advertising_all(struct tg3 *tp)
1445 u32 adv_reg, all_mask;
1447 if (tg3_readphy(tp, MII_ADVERTISE, &adv_reg))
1448 return 0;
1450 all_mask = (ADVERTISE_10HALF | ADVERTISE_10FULL |
1451 ADVERTISE_100HALF | ADVERTISE_100FULL);
1452 if ((adv_reg & all_mask) != all_mask)
1453 return 0;
1454 if (!(tp->tg3_flags & TG3_FLAG_10_100_ONLY)) {
1455 u32 tg3_ctrl;
1457 if (tg3_readphy(tp, MII_TG3_CTRL, &tg3_ctrl))
1458 return 0;
1460 all_mask = (MII_TG3_CTRL_ADV_1000_HALF |
1461 MII_TG3_CTRL_ADV_1000_FULL);
1462 if ((tg3_ctrl & all_mask) != all_mask)
1463 return 0;
1465 return 1;
1468 static int tg3_setup_copper_phy(struct tg3 *tp, int force_reset)
1470 int current_link_up;
1471 u32 bmsr, dummy;
1472 u16 current_speed;
1473 u8 current_duplex;
1474 int i, err;
1476 tw32(MAC_EVENT, 0);
1478 tw32_f(MAC_STATUS,
1479 (MAC_STATUS_SYNC_CHANGED |
1480 MAC_STATUS_CFG_CHANGED |
1481 MAC_STATUS_MI_COMPLETION |
1482 MAC_STATUS_LNKSTATE_CHANGED));
1483 udelay(40);
1485 tp->mi_mode = MAC_MI_MODE_BASE;
1486 tw32_f(MAC_MI_MODE, tp->mi_mode);
1487 udelay(80);
1489 tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x02);
1491 /* Some third-party PHYs need to be reset on link going
1492 * down.
1494 if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703 ||
1495 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704 ||
1496 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) &&
1497 netif_carrier_ok(tp->dev)) {
1498 tg3_readphy(tp, MII_BMSR, &bmsr);
1499 if (!tg3_readphy(tp, MII_BMSR, &bmsr) &&
1500 !(bmsr & BMSR_LSTATUS))
1501 force_reset = 1;
1503 if (force_reset)
1504 tg3_phy_reset(tp);
1506 if ((tp->phy_id & PHY_ID_MASK) == PHY_ID_BCM5401) {
1507 tg3_readphy(tp, MII_BMSR, &bmsr);
1508 if (tg3_readphy(tp, MII_BMSR, &bmsr) ||
1509 !(tp->tg3_flags & TG3_FLAG_INIT_COMPLETE))
1510 bmsr = 0;
1512 if (!(bmsr & BMSR_LSTATUS)) {
1513 err = tg3_init_5401phy_dsp(tp);
1514 if (err)
1515 return err;
1517 tg3_readphy(tp, MII_BMSR, &bmsr);
1518 for (i = 0; i < 1000; i++) {
1519 udelay(10);
1520 if (!tg3_readphy(tp, MII_BMSR, &bmsr) &&
1521 (bmsr & BMSR_LSTATUS)) {
1522 udelay(40);
1523 break;
1527 if ((tp->phy_id & PHY_ID_REV_MASK) == PHY_REV_BCM5401_B0 &&
1528 !(bmsr & BMSR_LSTATUS) &&
1529 tp->link_config.active_speed == SPEED_1000) {
1530 err = tg3_phy_reset(tp);
1531 if (!err)
1532 err = tg3_init_5401phy_dsp(tp);
1533 if (err)
1534 return err;
1537 } else if (tp->pci_chip_rev_id == CHIPREV_ID_5701_A0 ||
1538 tp->pci_chip_rev_id == CHIPREV_ID_5701_B0) {
1539 /* 5701 {A0,B0} CRC bug workaround */
1540 tg3_writephy(tp, 0x15, 0x0a75);
1541 tg3_writephy(tp, 0x1c, 0x8c68);
1542 tg3_writephy(tp, 0x1c, 0x8d68);
1543 tg3_writephy(tp, 0x1c, 0x8c68);
1546 /* Clear pending interrupts... */
1547 tg3_readphy(tp, MII_TG3_ISTAT, &dummy);
1548 tg3_readphy(tp, MII_TG3_ISTAT, &dummy);
1550 if (tp->tg3_flags & TG3_FLAG_USE_MI_INTERRUPT)
1551 tg3_writephy(tp, MII_TG3_IMASK, ~MII_TG3_INT_LINKCHG);
1552 else
1553 tg3_writephy(tp, MII_TG3_IMASK, ~0);
1555 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 ||
1556 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701) {
1557 if (tp->led_ctrl == LED_CTRL_MODE_PHY_1)
1558 tg3_writephy(tp, MII_TG3_EXT_CTRL,
1559 MII_TG3_EXT_CTRL_LNK3_LED_MODE);
1560 else
1561 tg3_writephy(tp, MII_TG3_EXT_CTRL, 0);
1564 current_link_up = 0;
1565 current_speed = SPEED_INVALID;
1566 current_duplex = DUPLEX_INVALID;
1568 if (tp->tg3_flags2 & TG3_FLG2_CAPACITIVE_COUPLING) {
1569 u32 val;
1571 tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x4007);
1572 tg3_readphy(tp, MII_TG3_AUX_CTRL, &val);
1573 if (!(val & (1 << 10))) {
1574 val |= (1 << 10);
1575 tg3_writephy(tp, MII_TG3_AUX_CTRL, val);
1576 goto relink;
1580 bmsr = 0;
1581 for (i = 0; i < 100; i++) {
1582 tg3_readphy(tp, MII_BMSR, &bmsr);
1583 if (!tg3_readphy(tp, MII_BMSR, &bmsr) &&
1584 (bmsr & BMSR_LSTATUS))
1585 break;
1586 udelay(40);
1589 if (bmsr & BMSR_LSTATUS) {
1590 u32 aux_stat, bmcr;
1592 tg3_readphy(tp, MII_TG3_AUX_STAT, &aux_stat);
1593 for (i = 0; i < 2000; i++) {
1594 udelay(10);
1595 if (!tg3_readphy(tp, MII_TG3_AUX_STAT, &aux_stat) &&
1596 aux_stat)
1597 break;
1600 tg3_aux_stat_to_speed_duplex(tp, aux_stat,
1601 &current_speed,
1602 &current_duplex);
1604 bmcr = 0;
1605 for (i = 0; i < 200; i++) {
1606 tg3_readphy(tp, MII_BMCR, &bmcr);
1607 if (tg3_readphy(tp, MII_BMCR, &bmcr))
1608 continue;
1609 if (bmcr && bmcr != 0x7fff)
1610 break;
1611 udelay(10);
1614 if (tp->link_config.autoneg == AUTONEG_ENABLE) {
1615 if (bmcr & BMCR_ANENABLE) {
1616 current_link_up = 1;
1618 /* Force autoneg restart if we are exiting
1619 * low power mode.
1621 if (!tg3_copper_is_advertising_all(tp))
1622 current_link_up = 0;
1623 } else {
1624 current_link_up = 0;
1626 } else {
1627 if (!(bmcr & BMCR_ANENABLE) &&
1628 tp->link_config.speed == current_speed &&
1629 tp->link_config.duplex == current_duplex) {
1630 current_link_up = 1;
1631 } else {
1632 current_link_up = 0;
1636 tp->link_config.active_speed = current_speed;
1637 tp->link_config.active_duplex = current_duplex;
1640 if (current_link_up == 1 &&
1641 (tp->link_config.active_duplex == DUPLEX_FULL) &&
1642 (tp->link_config.autoneg == AUTONEG_ENABLE)) {
1643 u32 local_adv, remote_adv;
1645 if (tg3_readphy(tp, MII_ADVERTISE, &local_adv))
1646 local_adv = 0;
1647 local_adv &= (ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM);
1649 if (tg3_readphy(tp, MII_LPA, &remote_adv))
1650 remote_adv = 0;
1652 remote_adv &= (LPA_PAUSE_CAP | LPA_PAUSE_ASYM);
1654 /* If we are not advertising full pause capability,
1655 * something is wrong. Bring the link down and reconfigure.
1657 if (local_adv != ADVERTISE_PAUSE_CAP) {
1658 current_link_up = 0;
1659 } else {
1660 tg3_setup_flow_control(tp, local_adv, remote_adv);
1663 relink:
1664 if (current_link_up == 0) {
1665 u32 tmp;
1667 tg3_phy_copper_begin(tp);
1669 tg3_readphy(tp, MII_BMSR, &tmp);
1670 if (!tg3_readphy(tp, MII_BMSR, &tmp) &&
1671 (tmp & BMSR_LSTATUS))
1672 current_link_up = 1;
1675 tp->mac_mode &= ~MAC_MODE_PORT_MODE_MASK;
1676 if (current_link_up == 1) {
1677 if (tp->link_config.active_speed == SPEED_100 ||
1678 tp->link_config.active_speed == SPEED_10)
1679 tp->mac_mode |= MAC_MODE_PORT_MODE_MII;
1680 else
1681 tp->mac_mode |= MAC_MODE_PORT_MODE_GMII;
1682 } else
1683 tp->mac_mode |= MAC_MODE_PORT_MODE_GMII;
1685 tp->mac_mode &= ~MAC_MODE_HALF_DUPLEX;
1686 if (tp->link_config.active_duplex == DUPLEX_HALF)
1687 tp->mac_mode |= MAC_MODE_HALF_DUPLEX;
1689 tp->mac_mode &= ~MAC_MODE_LINK_POLARITY;
1690 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700) {
1691 if ((tp->led_ctrl == LED_CTRL_MODE_PHY_2) ||
1692 (current_link_up == 1 &&
1693 tp->link_config.active_speed == SPEED_10))
1694 tp->mac_mode |= MAC_MODE_LINK_POLARITY;
1695 } else {
1696 if (current_link_up == 1)
1697 tp->mac_mode |= MAC_MODE_LINK_POLARITY;
1700 /* ??? Without this setting Netgear GA302T PHY does not
1701 * ??? send/receive packets...
1703 if ((tp->phy_id & PHY_ID_MASK) == PHY_ID_BCM5411 &&
1704 tp->pci_chip_rev_id == CHIPREV_ID_5700_ALTIMA) {
1705 tp->mi_mode |= MAC_MI_MODE_AUTO_POLL;
1706 tw32_f(MAC_MI_MODE, tp->mi_mode);
1707 udelay(80);
1710 tw32_f(MAC_MODE, tp->mac_mode);
1711 udelay(40);
1713 if (tp->tg3_flags & TG3_FLAG_USE_LINKCHG_REG) {
1714 /* Polled via timer. */
1715 tw32_f(MAC_EVENT, 0);
1716 } else {
1717 tw32_f(MAC_EVENT, MAC_EVENT_LNKSTATE_CHANGED);
1719 udelay(40);
1721 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 &&
1722 current_link_up == 1 &&
1723 tp->link_config.active_speed == SPEED_1000 &&
1724 ((tp->tg3_flags & TG3_FLAG_PCIX_MODE) ||
1725 (tp->tg3_flags & TG3_FLAG_PCI_HIGH_SPEED))) {
1726 udelay(120);
1727 tw32_f(MAC_STATUS,
1728 (MAC_STATUS_SYNC_CHANGED |
1729 MAC_STATUS_CFG_CHANGED));
1730 udelay(40);
1731 tg3_write_mem(tp,
1732 NIC_SRAM_FIRMWARE_MBOX,
1733 NIC_SRAM_FIRMWARE_MBOX_MAGIC2);
1736 if (current_link_up != netif_carrier_ok(tp->dev)) {
1737 if (current_link_up)
1738 netif_carrier_on(tp->dev);
1739 else
1740 netif_carrier_off(tp->dev);
1741 tg3_link_report(tp);
1744 return 0;
1747 struct tg3_fiber_aneginfo {
1748 int state;
1749 #define ANEG_STATE_UNKNOWN 0
1750 #define ANEG_STATE_AN_ENABLE 1
1751 #define ANEG_STATE_RESTART_INIT 2
1752 #define ANEG_STATE_RESTART 3
1753 #define ANEG_STATE_DISABLE_LINK_OK 4
1754 #define ANEG_STATE_ABILITY_DETECT_INIT 5
1755 #define ANEG_STATE_ABILITY_DETECT 6
1756 #define ANEG_STATE_ACK_DETECT_INIT 7
1757 #define ANEG_STATE_ACK_DETECT 8
1758 #define ANEG_STATE_COMPLETE_ACK_INIT 9
1759 #define ANEG_STATE_COMPLETE_ACK 10
1760 #define ANEG_STATE_IDLE_DETECT_INIT 11
1761 #define ANEG_STATE_IDLE_DETECT 12
1762 #define ANEG_STATE_LINK_OK 13
1763 #define ANEG_STATE_NEXT_PAGE_WAIT_INIT 14
1764 #define ANEG_STATE_NEXT_PAGE_WAIT 15
1766 u32 flags;
1767 #define MR_AN_ENABLE 0x00000001
1768 #define MR_RESTART_AN 0x00000002
1769 #define MR_AN_COMPLETE 0x00000004
1770 #define MR_PAGE_RX 0x00000008
1771 #define MR_NP_LOADED 0x00000010
1772 #define MR_TOGGLE_TX 0x00000020
1773 #define MR_LP_ADV_FULL_DUPLEX 0x00000040
1774 #define MR_LP_ADV_HALF_DUPLEX 0x00000080
1775 #define MR_LP_ADV_SYM_PAUSE 0x00000100
1776 #define MR_LP_ADV_ASYM_PAUSE 0x00000200
1777 #define MR_LP_ADV_REMOTE_FAULT1 0x00000400
1778 #define MR_LP_ADV_REMOTE_FAULT2 0x00000800
1779 #define MR_LP_ADV_NEXT_PAGE 0x00001000
1780 #define MR_TOGGLE_RX 0x00002000
1781 #define MR_NP_RX 0x00004000
1783 #define MR_LINK_OK 0x80000000
1785 unsigned long link_time, cur_time;
1787 u32 ability_match_cfg;
1788 int ability_match_count;
1790 char ability_match, idle_match, ack_match;
1792 u32 txconfig, rxconfig;
1793 #define ANEG_CFG_NP 0x00000080
1794 #define ANEG_CFG_ACK 0x00000040
1795 #define ANEG_CFG_RF2 0x00000020
1796 #define ANEG_CFG_RF1 0x00000010
1797 #define ANEG_CFG_PS2 0x00000001
1798 #define ANEG_CFG_PS1 0x00008000
1799 #define ANEG_CFG_HD 0x00004000
1800 #define ANEG_CFG_FD 0x00002000
1801 #define ANEG_CFG_INVAL 0x00001f06
1804 #define ANEG_OK 0
1805 #define ANEG_DONE 1
1806 #define ANEG_TIMER_ENAB 2
1807 #define ANEG_FAILED -1
1809 #define ANEG_STATE_SETTLE_TIME 10000
1811 static int tg3_fiber_aneg_smachine(struct tg3 *tp,
1812 struct tg3_fiber_aneginfo *ap)
1814 unsigned long delta;
1815 u32 rx_cfg_reg;
1816 int ret;
1818 if (ap->state == ANEG_STATE_UNKNOWN) {
1819 ap->rxconfig = 0;
1820 ap->link_time = 0;
1821 ap->cur_time = 0;
1822 ap->ability_match_cfg = 0;
1823 ap->ability_match_count = 0;
1824 ap->ability_match = 0;
1825 ap->idle_match = 0;
1826 ap->ack_match = 0;
1828 ap->cur_time++;
1830 if (tr32(MAC_STATUS) & MAC_STATUS_RCVD_CFG) {
1831 rx_cfg_reg = tr32(MAC_RX_AUTO_NEG);
1833 if (rx_cfg_reg != ap->ability_match_cfg) {
1834 ap->ability_match_cfg = rx_cfg_reg;
1835 ap->ability_match = 0;
1836 ap->ability_match_count = 0;
1837 } else {
1838 if (++ap->ability_match_count > 1) {
1839 ap->ability_match = 1;
1840 ap->ability_match_cfg = rx_cfg_reg;
1843 if (rx_cfg_reg & ANEG_CFG_ACK)
1844 ap->ack_match = 1;
1845 else
1846 ap->ack_match = 0;
1848 ap->idle_match = 0;
1849 } else {
1850 ap->idle_match = 1;
1851 ap->ability_match_cfg = 0;
1852 ap->ability_match_count = 0;
1853 ap->ability_match = 0;
1854 ap->ack_match = 0;
1856 rx_cfg_reg = 0;
1859 ap->rxconfig = rx_cfg_reg;
1860 ret = ANEG_OK;
1862 switch(ap->state) {
1863 case ANEG_STATE_UNKNOWN:
1864 if (ap->flags & (MR_AN_ENABLE | MR_RESTART_AN))
1865 ap->state = ANEG_STATE_AN_ENABLE;
1867 /* fallthru */
1868 case ANEG_STATE_AN_ENABLE:
1869 ap->flags &= ~(MR_AN_COMPLETE | MR_PAGE_RX);
1870 if (ap->flags & MR_AN_ENABLE) {
1871 ap->link_time = 0;
1872 ap->cur_time = 0;
1873 ap->ability_match_cfg = 0;
1874 ap->ability_match_count = 0;
1875 ap->ability_match = 0;
1876 ap->idle_match = 0;
1877 ap->ack_match = 0;
1879 ap->state = ANEG_STATE_RESTART_INIT;
1880 } else {
1881 ap->state = ANEG_STATE_DISABLE_LINK_OK;
1883 break;
1885 case ANEG_STATE_RESTART_INIT:
1886 ap->link_time = ap->cur_time;
1887 ap->flags &= ~(MR_NP_LOADED);
1888 ap->txconfig = 0;
1889 tw32(MAC_TX_AUTO_NEG, 0);
1890 tp->mac_mode |= MAC_MODE_SEND_CONFIGS;
1891 tw32_f(MAC_MODE, tp->mac_mode);
1892 udelay(40);
1894 ret = ANEG_TIMER_ENAB;
1895 ap->state = ANEG_STATE_RESTART;
1897 /* fallthru */
1898 case ANEG_STATE_RESTART:
1899 delta = ap->cur_time - ap->link_time;
1900 if (delta > ANEG_STATE_SETTLE_TIME) {
1901 ap->state = ANEG_STATE_ABILITY_DETECT_INIT;
1902 } else {
1903 ret = ANEG_TIMER_ENAB;
1905 break;
1907 case ANEG_STATE_DISABLE_LINK_OK:
1908 ret = ANEG_DONE;
1909 break;
1911 case ANEG_STATE_ABILITY_DETECT_INIT:
1912 ap->flags &= ~(MR_TOGGLE_TX);
1913 ap->txconfig = (ANEG_CFG_FD | ANEG_CFG_PS1);
1914 tw32(MAC_TX_AUTO_NEG, ap->txconfig);
1915 tp->mac_mode |= MAC_MODE_SEND_CONFIGS;
1916 tw32_f(MAC_MODE, tp->mac_mode);
1917 udelay(40);
1919 ap->state = ANEG_STATE_ABILITY_DETECT;
1920 break;
1922 case ANEG_STATE_ABILITY_DETECT:
1923 if (ap->ability_match != 0 && ap->rxconfig != 0) {
1924 ap->state = ANEG_STATE_ACK_DETECT_INIT;
1926 break;
1928 case ANEG_STATE_ACK_DETECT_INIT:
1929 ap->txconfig |= ANEG_CFG_ACK;
1930 tw32(MAC_TX_AUTO_NEG, ap->txconfig);
1931 tp->mac_mode |= MAC_MODE_SEND_CONFIGS;
1932 tw32_f(MAC_MODE, tp->mac_mode);
1933 udelay(40);
1935 ap->state = ANEG_STATE_ACK_DETECT;
1937 /* fallthru */
1938 case ANEG_STATE_ACK_DETECT:
1939 if (ap->ack_match != 0) {
1940 if ((ap->rxconfig & ~ANEG_CFG_ACK) ==
1941 (ap->ability_match_cfg & ~ANEG_CFG_ACK)) {
1942 ap->state = ANEG_STATE_COMPLETE_ACK_INIT;
1943 } else {
1944 ap->state = ANEG_STATE_AN_ENABLE;
1946 } else if (ap->ability_match != 0 &&
1947 ap->rxconfig == 0) {
1948 ap->state = ANEG_STATE_AN_ENABLE;
1950 break;
1952 case ANEG_STATE_COMPLETE_ACK_INIT:
1953 if (ap->rxconfig & ANEG_CFG_INVAL) {
1954 ret = ANEG_FAILED;
1955 break;
1957 ap->flags &= ~(MR_LP_ADV_FULL_DUPLEX |
1958 MR_LP_ADV_HALF_DUPLEX |
1959 MR_LP_ADV_SYM_PAUSE |
1960 MR_LP_ADV_ASYM_PAUSE |
1961 MR_LP_ADV_REMOTE_FAULT1 |
1962 MR_LP_ADV_REMOTE_FAULT2 |
1963 MR_LP_ADV_NEXT_PAGE |
1964 MR_TOGGLE_RX |
1965 MR_NP_RX);
1966 if (ap->rxconfig & ANEG_CFG_FD)
1967 ap->flags |= MR_LP_ADV_FULL_DUPLEX;
1968 if (ap->rxconfig & ANEG_CFG_HD)
1969 ap->flags |= MR_LP_ADV_HALF_DUPLEX;
1970 if (ap->rxconfig & ANEG_CFG_PS1)
1971 ap->flags |= MR_LP_ADV_SYM_PAUSE;
1972 if (ap->rxconfig & ANEG_CFG_PS2)
1973 ap->flags |= MR_LP_ADV_ASYM_PAUSE;
1974 if (ap->rxconfig & ANEG_CFG_RF1)
1975 ap->flags |= MR_LP_ADV_REMOTE_FAULT1;
1976 if (ap->rxconfig & ANEG_CFG_RF2)
1977 ap->flags |= MR_LP_ADV_REMOTE_FAULT2;
1978 if (ap->rxconfig & ANEG_CFG_NP)
1979 ap->flags |= MR_LP_ADV_NEXT_PAGE;
1981 ap->link_time = ap->cur_time;
1983 ap->flags ^= (MR_TOGGLE_TX);
1984 if (ap->rxconfig & 0x0008)
1985 ap->flags |= MR_TOGGLE_RX;
1986 if (ap->rxconfig & ANEG_CFG_NP)
1987 ap->flags |= MR_NP_RX;
1988 ap->flags |= MR_PAGE_RX;
1990 ap->state = ANEG_STATE_COMPLETE_ACK;
1991 ret = ANEG_TIMER_ENAB;
1992 break;
1994 case ANEG_STATE_COMPLETE_ACK:
1995 if (ap->ability_match != 0 &&
1996 ap->rxconfig == 0) {
1997 ap->state = ANEG_STATE_AN_ENABLE;
1998 break;
2000 delta = ap->cur_time - ap->link_time;
2001 if (delta > ANEG_STATE_SETTLE_TIME) {
2002 if (!(ap->flags & (MR_LP_ADV_NEXT_PAGE))) {
2003 ap->state = ANEG_STATE_IDLE_DETECT_INIT;
2004 } else {
2005 if ((ap->txconfig & ANEG_CFG_NP) == 0 &&
2006 !(ap->flags & MR_NP_RX)) {
2007 ap->state = ANEG_STATE_IDLE_DETECT_INIT;
2008 } else {
2009 ret = ANEG_FAILED;
2013 break;
2015 case ANEG_STATE_IDLE_DETECT_INIT:
2016 ap->link_time = ap->cur_time;
2017 tp->mac_mode &= ~MAC_MODE_SEND_CONFIGS;
2018 tw32_f(MAC_MODE, tp->mac_mode);
2019 udelay(40);
2021 ap->state = ANEG_STATE_IDLE_DETECT;
2022 ret = ANEG_TIMER_ENAB;
2023 break;
2025 case ANEG_STATE_IDLE_DETECT:
2026 if (ap->ability_match != 0 &&
2027 ap->rxconfig == 0) {
2028 ap->state = ANEG_STATE_AN_ENABLE;
2029 break;
2031 delta = ap->cur_time - ap->link_time;
2032 if (delta > ANEG_STATE_SETTLE_TIME) {
2033 /* XXX another gem from the Broadcom driver :( */
2034 ap->state = ANEG_STATE_LINK_OK;
2036 break;
2038 case ANEG_STATE_LINK_OK:
2039 ap->flags |= (MR_AN_COMPLETE | MR_LINK_OK);
2040 ret = ANEG_DONE;
2041 break;
2043 case ANEG_STATE_NEXT_PAGE_WAIT_INIT:
2044 /* ??? unimplemented */
2045 break;
2047 case ANEG_STATE_NEXT_PAGE_WAIT:
2048 /* ??? unimplemented */
2049 break;
2051 default:
2052 ret = ANEG_FAILED;
2053 break;
2056 return ret;
2059 static int fiber_autoneg(struct tg3 *tp, u32 *flags)
2061 int res = 0;
2062 struct tg3_fiber_aneginfo aninfo;
2063 int status = ANEG_FAILED;
2064 unsigned int tick;
2065 u32 tmp;
2067 tw32_f(MAC_TX_AUTO_NEG, 0);
2069 tmp = tp->mac_mode & ~MAC_MODE_PORT_MODE_MASK;
2070 tw32_f(MAC_MODE, tmp | MAC_MODE_PORT_MODE_GMII);
2071 udelay(40);
2073 tw32_f(MAC_MODE, tp->mac_mode | MAC_MODE_SEND_CONFIGS);
2074 udelay(40);
2076 memset(&aninfo, 0, sizeof(aninfo));
2077 aninfo.flags |= MR_AN_ENABLE;
2078 aninfo.state = ANEG_STATE_UNKNOWN;
2079 aninfo.cur_time = 0;
2080 tick = 0;
2081 while (++tick < 195000) {
2082 status = tg3_fiber_aneg_smachine(tp, &aninfo);
2083 if (status == ANEG_DONE || status == ANEG_FAILED)
2084 break;
2086 udelay(1);
2089 tp->mac_mode &= ~MAC_MODE_SEND_CONFIGS;
2090 tw32_f(MAC_MODE, tp->mac_mode);
2091 udelay(40);
2093 *flags = aninfo.flags;
2095 if (status == ANEG_DONE &&
2096 (aninfo.flags & (MR_AN_COMPLETE | MR_LINK_OK |
2097 MR_LP_ADV_FULL_DUPLEX)))
2098 res = 1;
2100 return res;
2103 static void tg3_init_bcm8002(struct tg3 *tp)
2105 u32 mac_status = tr32(MAC_STATUS);
2106 int i;
2108 /* Reset when initting first time or we have a link. */
2109 if ((tp->tg3_flags & TG3_FLAG_INIT_COMPLETE) &&
2110 !(mac_status & MAC_STATUS_PCS_SYNCED))
2111 return;
2113 /* Set PLL lock range. */
2114 tg3_writephy(tp, 0x16, 0x8007);
2116 /* SW reset */
2117 tg3_writephy(tp, MII_BMCR, BMCR_RESET);
2119 /* Wait for reset to complete. */
2120 /* XXX schedule_timeout() ... */
2121 for (i = 0; i < 500; i++)
2122 udelay(10);
2124 /* Config mode; select PMA/Ch 1 regs. */
2125 tg3_writephy(tp, 0x10, 0x8411);
2127 /* Enable auto-lock and comdet, select txclk for tx. */
2128 tg3_writephy(tp, 0x11, 0x0a10);
2130 tg3_writephy(tp, 0x18, 0x00a0);
2131 tg3_writephy(tp, 0x16, 0x41ff);
2133 /* Assert and deassert POR. */
2134 tg3_writephy(tp, 0x13, 0x0400);
2135 udelay(40);
2136 tg3_writephy(tp, 0x13, 0x0000);
2138 tg3_writephy(tp, 0x11, 0x0a50);
2139 udelay(40);
2140 tg3_writephy(tp, 0x11, 0x0a10);
2142 /* Wait for signal to stabilize */
2143 /* XXX schedule_timeout() ... */
2144 for (i = 0; i < 15000; i++)
2145 udelay(10);
2147 /* Deselect the channel register so we can read the PHYID
2148 * later.
2150 tg3_writephy(tp, 0x10, 0x8011);
2153 static int tg3_setup_fiber_hw_autoneg(struct tg3 *tp, u32 mac_status)
2155 u32 sg_dig_ctrl, sg_dig_status;
2156 u32 serdes_cfg, expected_sg_dig_ctrl;
2157 int workaround, port_a;
2158 int current_link_up;
2160 serdes_cfg = 0;
2161 expected_sg_dig_ctrl = 0;
2162 workaround = 0;
2163 port_a = 1;
2164 current_link_up = 0;
2166 if (tp->pci_chip_rev_id != CHIPREV_ID_5704_A0 &&
2167 tp->pci_chip_rev_id != CHIPREV_ID_5704_A1) {
2168 workaround = 1;
2169 if (tr32(TG3PCI_DUAL_MAC_CTRL) & DUAL_MAC_CTRL_ID)
2170 port_a = 0;
2172 /* preserve bits 0-11,13,14 for signal pre-emphasis */
2173 /* preserve bits 20-23 for voltage regulator */
2174 serdes_cfg = tr32(MAC_SERDES_CFG) & 0x00f06fff;
2177 sg_dig_ctrl = tr32(SG_DIG_CTRL);
2179 if (tp->link_config.autoneg != AUTONEG_ENABLE) {
2180 if (sg_dig_ctrl & (1 << 31)) {
2181 if (workaround) {
2182 u32 val = serdes_cfg;
2184 if (port_a)
2185 val |= 0xc010000;
2186 else
2187 val |= 0x4010000;
2188 tw32_f(MAC_SERDES_CFG, val);
2190 tw32_f(SG_DIG_CTRL, 0x01388400);
2192 if (mac_status & MAC_STATUS_PCS_SYNCED) {
2193 tg3_setup_flow_control(tp, 0, 0);
2194 current_link_up = 1;
2196 goto out;
2199 /* Want auto-negotiation. */
2200 expected_sg_dig_ctrl = 0x81388400;
2202 /* Pause capability */
2203 expected_sg_dig_ctrl |= (1 << 11);
2205 /* Asymettric pause */
2206 expected_sg_dig_ctrl |= (1 << 12);
2208 if (sg_dig_ctrl != expected_sg_dig_ctrl) {
2209 if (workaround)
2210 tw32_f(MAC_SERDES_CFG, serdes_cfg | 0xc011000);
2211 tw32_f(SG_DIG_CTRL, expected_sg_dig_ctrl | (1 << 30));
2212 udelay(5);
2213 tw32_f(SG_DIG_CTRL, expected_sg_dig_ctrl);
2215 tp->tg3_flags2 |= TG3_FLG2_PHY_JUST_INITTED;
2216 } else if (mac_status & (MAC_STATUS_PCS_SYNCED |
2217 MAC_STATUS_SIGNAL_DET)) {
2218 int i;
2220 /* Giver time to negotiate (~200ms) */
2221 for (i = 0; i < 40000; i++) {
2222 sg_dig_status = tr32(SG_DIG_STATUS);
2223 if (sg_dig_status & (0x3))
2224 break;
2225 udelay(5);
2227 mac_status = tr32(MAC_STATUS);
2229 if ((sg_dig_status & (1 << 1)) &&
2230 (mac_status & MAC_STATUS_PCS_SYNCED)) {
2231 u32 local_adv, remote_adv;
2233 local_adv = ADVERTISE_PAUSE_CAP;
2234 remote_adv = 0;
2235 if (sg_dig_status & (1 << 19))
2236 remote_adv |= LPA_PAUSE_CAP;
2237 if (sg_dig_status & (1 << 20))
2238 remote_adv |= LPA_PAUSE_ASYM;
2240 tg3_setup_flow_control(tp, local_adv, remote_adv);
2241 current_link_up = 1;
2242 tp->tg3_flags2 &= ~TG3_FLG2_PHY_JUST_INITTED;
2243 } else if (!(sg_dig_status & (1 << 1))) {
2244 if (tp->tg3_flags2 & TG3_FLG2_PHY_JUST_INITTED)
2245 tp->tg3_flags2 &= ~TG3_FLG2_PHY_JUST_INITTED;
2246 else {
2247 if (workaround) {
2248 u32 val = serdes_cfg;
2250 if (port_a)
2251 val |= 0xc010000;
2252 else
2253 val |= 0x4010000;
2255 tw32_f(MAC_SERDES_CFG, val);
2258 tw32_f(SG_DIG_CTRL, 0x01388400);
2259 udelay(40);
2261 /* Link parallel detection - link is up */
2262 /* only if we have PCS_SYNC and not */
2263 /* receiving config code words */
2264 mac_status = tr32(MAC_STATUS);
2265 if ((mac_status & MAC_STATUS_PCS_SYNCED) &&
2266 !(mac_status & MAC_STATUS_RCVD_CFG)) {
2267 tg3_setup_flow_control(tp, 0, 0);
2268 current_link_up = 1;
2274 out:
2275 return current_link_up;
2278 static int tg3_setup_fiber_by_hand(struct tg3 *tp, u32 mac_status)
2280 int current_link_up = 0;
2282 if (!(mac_status & MAC_STATUS_PCS_SYNCED)) {
2283 tp->tg3_flags &= ~TG3_FLAG_GOT_SERDES_FLOWCTL;
2284 goto out;
2287 if (tp->link_config.autoneg == AUTONEG_ENABLE) {
2288 u32 flags;
2289 int i;
2291 if (fiber_autoneg(tp, &flags)) {
2292 u32 local_adv, remote_adv;
2294 local_adv = ADVERTISE_PAUSE_CAP;
2295 remote_adv = 0;
2296 if (flags & MR_LP_ADV_SYM_PAUSE)
2297 remote_adv |= LPA_PAUSE_CAP;
2298 if (flags & MR_LP_ADV_ASYM_PAUSE)
2299 remote_adv |= LPA_PAUSE_ASYM;
2301 tg3_setup_flow_control(tp, local_adv, remote_adv);
2303 tp->tg3_flags |= TG3_FLAG_GOT_SERDES_FLOWCTL;
2304 current_link_up = 1;
2306 for (i = 0; i < 30; i++) {
2307 udelay(20);
2308 tw32_f(MAC_STATUS,
2309 (MAC_STATUS_SYNC_CHANGED |
2310 MAC_STATUS_CFG_CHANGED));
2311 udelay(40);
2312 if ((tr32(MAC_STATUS) &
2313 (MAC_STATUS_SYNC_CHANGED |
2314 MAC_STATUS_CFG_CHANGED)) == 0)
2315 break;
2318 mac_status = tr32(MAC_STATUS);
2319 if (current_link_up == 0 &&
2320 (mac_status & MAC_STATUS_PCS_SYNCED) &&
2321 !(mac_status & MAC_STATUS_RCVD_CFG))
2322 current_link_up = 1;
2323 } else {
2324 /* Forcing 1000FD link up. */
2325 current_link_up = 1;
2326 tp->tg3_flags |= TG3_FLAG_GOT_SERDES_FLOWCTL;
2328 tw32_f(MAC_MODE, (tp->mac_mode | MAC_MODE_SEND_CONFIGS));
2329 udelay(40);
2332 out:
2333 return current_link_up;
2336 static int tg3_setup_fiber_phy(struct tg3 *tp, int force_reset)
2338 u32 orig_pause_cfg;
2339 u16 orig_active_speed;
2340 u8 orig_active_duplex;
2341 u32 mac_status;
2342 int current_link_up;
2343 int i;
2345 orig_pause_cfg =
2346 (tp->tg3_flags & (TG3_FLAG_RX_PAUSE |
2347 TG3_FLAG_TX_PAUSE));
2348 orig_active_speed = tp->link_config.active_speed;
2349 orig_active_duplex = tp->link_config.active_duplex;
2351 if (!(tp->tg3_flags2 & TG3_FLG2_HW_AUTONEG) &&
2352 netif_carrier_ok(tp->dev) &&
2353 (tp->tg3_flags & TG3_FLAG_INIT_COMPLETE)) {
2354 mac_status = tr32(MAC_STATUS);
2355 mac_status &= (MAC_STATUS_PCS_SYNCED |
2356 MAC_STATUS_SIGNAL_DET |
2357 MAC_STATUS_CFG_CHANGED |
2358 MAC_STATUS_RCVD_CFG);
2359 if (mac_status == (MAC_STATUS_PCS_SYNCED |
2360 MAC_STATUS_SIGNAL_DET)) {
2361 tw32_f(MAC_STATUS, (MAC_STATUS_SYNC_CHANGED |
2362 MAC_STATUS_CFG_CHANGED));
2363 return 0;
2367 tw32_f(MAC_TX_AUTO_NEG, 0);
2369 tp->mac_mode &= ~(MAC_MODE_PORT_MODE_MASK | MAC_MODE_HALF_DUPLEX);
2370 tp->mac_mode |= MAC_MODE_PORT_MODE_TBI;
2371 tw32_f(MAC_MODE, tp->mac_mode);
2372 udelay(40);
2374 if (tp->phy_id == PHY_ID_BCM8002)
2375 tg3_init_bcm8002(tp);
2377 /* Enable link change event even when serdes polling. */
2378 tw32_f(MAC_EVENT, MAC_EVENT_LNKSTATE_CHANGED);
2379 udelay(40);
2381 current_link_up = 0;
2382 mac_status = tr32(MAC_STATUS);
2384 if (tp->tg3_flags2 & TG3_FLG2_HW_AUTONEG)
2385 current_link_up = tg3_setup_fiber_hw_autoneg(tp, mac_status);
2386 else
2387 current_link_up = tg3_setup_fiber_by_hand(tp, mac_status);
2389 tp->mac_mode &= ~MAC_MODE_LINK_POLARITY;
2390 tw32_f(MAC_MODE, tp->mac_mode);
2391 udelay(40);
2393 tp->hw_status->status =
2394 (SD_STATUS_UPDATED |
2395 (tp->hw_status->status & ~SD_STATUS_LINK_CHG));
2397 for (i = 0; i < 100; i++) {
2398 tw32_f(MAC_STATUS, (MAC_STATUS_SYNC_CHANGED |
2399 MAC_STATUS_CFG_CHANGED));
2400 udelay(5);
2401 if ((tr32(MAC_STATUS) & (MAC_STATUS_SYNC_CHANGED |
2402 MAC_STATUS_CFG_CHANGED)) == 0)
2403 break;
2406 mac_status = tr32(MAC_STATUS);
2407 if ((mac_status & MAC_STATUS_PCS_SYNCED) == 0) {
2408 current_link_up = 0;
2409 if (tp->link_config.autoneg == AUTONEG_ENABLE) {
2410 tw32_f(MAC_MODE, (tp->mac_mode |
2411 MAC_MODE_SEND_CONFIGS));
2412 udelay(1);
2413 tw32_f(MAC_MODE, tp->mac_mode);
2417 if (current_link_up == 1) {
2418 tp->link_config.active_speed = SPEED_1000;
2419 tp->link_config.active_duplex = DUPLEX_FULL;
2420 tw32(MAC_LED_CTRL, (tp->led_ctrl |
2421 LED_CTRL_LNKLED_OVERRIDE |
2422 LED_CTRL_1000MBPS_ON));
2423 } else {
2424 tp->link_config.active_speed = SPEED_INVALID;
2425 tp->link_config.active_duplex = DUPLEX_INVALID;
2426 tw32(MAC_LED_CTRL, (tp->led_ctrl |
2427 LED_CTRL_LNKLED_OVERRIDE |
2428 LED_CTRL_TRAFFIC_OVERRIDE));
2431 if (current_link_up != netif_carrier_ok(tp->dev)) {
2432 if (current_link_up)
2433 netif_carrier_on(tp->dev);
2434 else
2435 netif_carrier_off(tp->dev);
2436 tg3_link_report(tp);
2437 } else {
2438 u32 now_pause_cfg =
2439 tp->tg3_flags & (TG3_FLAG_RX_PAUSE |
2440 TG3_FLAG_TX_PAUSE);
2441 if (orig_pause_cfg != now_pause_cfg ||
2442 orig_active_speed != tp->link_config.active_speed ||
2443 orig_active_duplex != tp->link_config.active_duplex)
2444 tg3_link_report(tp);
2447 return 0;
2450 static int tg3_setup_phy(struct tg3 *tp, int force_reset)
2452 int err;
2454 if (tp->tg3_flags2 & TG3_FLG2_PHY_SERDES) {
2455 err = tg3_setup_fiber_phy(tp, force_reset);
2456 } else {
2457 err = tg3_setup_copper_phy(tp, force_reset);
2460 if (tp->link_config.active_speed == SPEED_1000 &&
2461 tp->link_config.active_duplex == DUPLEX_HALF)
2462 tw32(MAC_TX_LENGTHS,
2463 ((2 << TX_LENGTHS_IPG_CRS_SHIFT) |
2464 (6 << TX_LENGTHS_IPG_SHIFT) |
2465 (0xff << TX_LENGTHS_SLOT_TIME_SHIFT)));
2466 else
2467 tw32(MAC_TX_LENGTHS,
2468 ((2 << TX_LENGTHS_IPG_CRS_SHIFT) |
2469 (6 << TX_LENGTHS_IPG_SHIFT) |
2470 (32 << TX_LENGTHS_SLOT_TIME_SHIFT)));
2472 if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS)) {
2473 if (netif_carrier_ok(tp->dev)) {
2474 tw32(HOSTCC_STAT_COAL_TICKS,
2475 DEFAULT_STAT_COAL_TICKS);
2476 } else {
2477 tw32(HOSTCC_STAT_COAL_TICKS, 0);
2481 return err;
2484 /* Tigon3 never reports partial packet sends. So we do not
2485 * need special logic to handle SKBs that have not had all
2486 * of their frags sent yet, like SunGEM does.
2488 static void tg3_tx(struct tg3 *tp)
2490 u32 hw_idx = tp->hw_status->idx[0].tx_consumer;
2491 u32 sw_idx = tp->tx_cons;
2493 while (sw_idx != hw_idx) {
2494 struct tx_ring_info *ri = &tp->tx_buffers[sw_idx];
2495 struct sk_buff *skb = ri->skb;
2496 int i;
2498 if (unlikely(skb == NULL))
2499 BUG();
2501 pci_unmap_single(tp->pdev,
2502 pci_unmap_addr(ri, mapping),
2503 skb_headlen(skb),
2504 PCI_DMA_TODEVICE);
2506 ri->skb = NULL;
2508 sw_idx = NEXT_TX(sw_idx);
2510 for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
2511 if (unlikely(sw_idx == hw_idx))
2512 BUG();
2514 ri = &tp->tx_buffers[sw_idx];
2515 if (unlikely(ri->skb != NULL))
2516 BUG();
2518 pci_unmap_page(tp->pdev,
2519 pci_unmap_addr(ri, mapping),
2520 skb_shinfo(skb)->frags[i].size,
2521 PCI_DMA_TODEVICE);
2523 sw_idx = NEXT_TX(sw_idx);
2526 dev_kfree_skb_irq(skb);
2529 tp->tx_cons = sw_idx;
2531 if (netif_queue_stopped(tp->dev) &&
2532 (TX_BUFFS_AVAIL(tp) > TG3_TX_WAKEUP_THRESH))
2533 netif_wake_queue(tp->dev);
2536 /* Returns size of skb allocated or < 0 on error.
2538 * We only need to fill in the address because the other members
2539 * of the RX descriptor are invariant, see tg3_init_rings.
2541 * Note the purposeful assymetry of cpu vs. chip accesses. For
2542 * posting buffers we only dirty the first cache line of the RX
2543 * descriptor (containing the address). Whereas for the RX status
2544 * buffers the cpu only reads the last cacheline of the RX descriptor
2545 * (to fetch the error flags, vlan tag, checksum, and opaque cookie).
2547 static int tg3_alloc_rx_skb(struct tg3 *tp, u32 opaque_key,
2548 int src_idx, u32 dest_idx_unmasked)
2550 struct tg3_rx_buffer_desc *desc;
2551 struct ring_info *map, *src_map;
2552 struct sk_buff *skb;
2553 dma_addr_t mapping;
2554 int skb_size, dest_idx;
2556 src_map = NULL;
2557 switch (opaque_key) {
2558 case RXD_OPAQUE_RING_STD:
2559 dest_idx = dest_idx_unmasked % TG3_RX_RING_SIZE;
2560 desc = &tp->rx_std[dest_idx];
2561 map = &tp->rx_std_buffers[dest_idx];
2562 if (src_idx >= 0)
2563 src_map = &tp->rx_std_buffers[src_idx];
2564 skb_size = RX_PKT_BUF_SZ;
2565 break;
2567 case RXD_OPAQUE_RING_JUMBO:
2568 dest_idx = dest_idx_unmasked % TG3_RX_JUMBO_RING_SIZE;
2569 desc = &tp->rx_jumbo[dest_idx];
2570 map = &tp->rx_jumbo_buffers[dest_idx];
2571 if (src_idx >= 0)
2572 src_map = &tp->rx_jumbo_buffers[src_idx];
2573 skb_size = RX_JUMBO_PKT_BUF_SZ;
2574 break;
2576 default:
2577 return -EINVAL;
2580 /* Do not overwrite any of the map or rp information
2581 * until we are sure we can commit to a new buffer.
2583 * Callers depend upon this behavior and assume that
2584 * we leave everything unchanged if we fail.
2586 skb = dev_alloc_skb(skb_size);
2587 if (skb == NULL)
2588 return -ENOMEM;
2590 skb->dev = tp->dev;
2591 skb_reserve(skb, tp->rx_offset);
2593 mapping = pci_map_single(tp->pdev, skb->data,
2594 skb_size - tp->rx_offset,
2595 PCI_DMA_FROMDEVICE);
2597 map->skb = skb;
2598 pci_unmap_addr_set(map, mapping, mapping);
2600 if (src_map != NULL)
2601 src_map->skb = NULL;
2603 desc->addr_hi = ((u64)mapping >> 32);
2604 desc->addr_lo = ((u64)mapping & 0xffffffff);
2606 return skb_size;
2609 /* We only need to move over in the address because the other
2610 * members of the RX descriptor are invariant. See notes above
2611 * tg3_alloc_rx_skb for full details.
2613 static void tg3_recycle_rx(struct tg3 *tp, u32 opaque_key,
2614 int src_idx, u32 dest_idx_unmasked)
2616 struct tg3_rx_buffer_desc *src_desc, *dest_desc;
2617 struct ring_info *src_map, *dest_map;
2618 int dest_idx;
2620 switch (opaque_key) {
2621 case RXD_OPAQUE_RING_STD:
2622 dest_idx = dest_idx_unmasked % TG3_RX_RING_SIZE;
2623 dest_desc = &tp->rx_std[dest_idx];
2624 dest_map = &tp->rx_std_buffers[dest_idx];
2625 src_desc = &tp->rx_std[src_idx];
2626 src_map = &tp->rx_std_buffers[src_idx];
2627 break;
2629 case RXD_OPAQUE_RING_JUMBO:
2630 dest_idx = dest_idx_unmasked % TG3_RX_JUMBO_RING_SIZE;
2631 dest_desc = &tp->rx_jumbo[dest_idx];
2632 dest_map = &tp->rx_jumbo_buffers[dest_idx];
2633 src_desc = &tp->rx_jumbo[src_idx];
2634 src_map = &tp->rx_jumbo_buffers[src_idx];
2635 break;
2637 default:
2638 return;
2641 dest_map->skb = src_map->skb;
2642 pci_unmap_addr_set(dest_map, mapping,
2643 pci_unmap_addr(src_map, mapping));
2644 dest_desc->addr_hi = src_desc->addr_hi;
2645 dest_desc->addr_lo = src_desc->addr_lo;
2647 src_map->skb = NULL;
2650 #if TG3_VLAN_TAG_USED
2651 static int tg3_vlan_rx(struct tg3 *tp, struct sk_buff *skb, u16 vlan_tag)
2653 return vlan_hwaccel_receive_skb(skb, tp->vlgrp, vlan_tag);
2655 #endif
2657 /* The RX ring scheme is composed of multiple rings which post fresh
2658 * buffers to the chip, and one special ring the chip uses to report
2659 * status back to the host.
2661 * The special ring reports the status of received packets to the
2662 * host. The chip does not write into the original descriptor the
2663 * RX buffer was obtained from. The chip simply takes the original
2664 * descriptor as provided by the host, updates the status and length
2665 * field, then writes this into the next status ring entry.
2667 * Each ring the host uses to post buffers to the chip is described
2668 * by a TG3_BDINFO entry in the chips SRAM area. When a packet arrives,
2669 * it is first placed into the on-chip ram. When the packet's length
2670 * is known, it walks down the TG3_BDINFO entries to select the ring.
2671 * Each TG3_BDINFO specifies a MAXLEN field and the first TG3_BDINFO
2672 * which is within the range of the new packet's length is chosen.
2674 * The "separate ring for rx status" scheme may sound queer, but it makes
2675 * sense from a cache coherency perspective. If only the host writes
2676 * to the buffer post rings, and only the chip writes to the rx status
2677 * rings, then cache lines never move beyond shared-modified state.
2678 * If both the host and chip were to write into the same ring, cache line
2679 * eviction could occur since both entities want it in an exclusive state.
2681 static int tg3_rx(struct tg3 *tp, int budget)
2683 u32 work_mask;
2684 u32 rx_rcb_ptr = tp->rx_rcb_ptr;
2685 u16 hw_idx, sw_idx;
2686 int received;
2688 hw_idx = tp->hw_status->idx[0].rx_producer;
2690 * We need to order the read of hw_idx and the read of
2691 * the opaque cookie.
2693 rmb();
2694 sw_idx = rx_rcb_ptr % TG3_RX_RCB_RING_SIZE(tp);
2695 work_mask = 0;
2696 received = 0;
2697 while (sw_idx != hw_idx && budget > 0) {
2698 struct tg3_rx_buffer_desc *desc = &tp->rx_rcb[sw_idx];
2699 unsigned int len;
2700 struct sk_buff *skb;
2701 dma_addr_t dma_addr;
2702 u32 opaque_key, desc_idx, *post_ptr;
2704 desc_idx = desc->opaque & RXD_OPAQUE_INDEX_MASK;
2705 opaque_key = desc->opaque & RXD_OPAQUE_RING_MASK;
2706 if (opaque_key == RXD_OPAQUE_RING_STD) {
2707 dma_addr = pci_unmap_addr(&tp->rx_std_buffers[desc_idx],
2708 mapping);
2709 skb = tp->rx_std_buffers[desc_idx].skb;
2710 post_ptr = &tp->rx_std_ptr;
2711 } else if (opaque_key == RXD_OPAQUE_RING_JUMBO) {
2712 dma_addr = pci_unmap_addr(&tp->rx_jumbo_buffers[desc_idx],
2713 mapping);
2714 skb = tp->rx_jumbo_buffers[desc_idx].skb;
2715 post_ptr = &tp->rx_jumbo_ptr;
2717 else {
2718 goto next_pkt_nopost;
2721 work_mask |= opaque_key;
2723 if ((desc->err_vlan & RXD_ERR_MASK) != 0 &&
2724 (desc->err_vlan != RXD_ERR_ODD_NIBBLE_RCVD_MII)) {
2725 drop_it:
2726 tg3_recycle_rx(tp, opaque_key,
2727 desc_idx, *post_ptr);
2728 drop_it_no_recycle:
2729 /* Other statistics kept track of by card. */
2730 tp->net_stats.rx_dropped++;
2731 goto next_pkt;
2734 len = ((desc->idx_len & RXD_LEN_MASK) >> RXD_LEN_SHIFT) - 4; /* omit crc */
2736 if (len > RX_COPY_THRESHOLD
2737 && tp->rx_offset == 2
2738 /* rx_offset != 2 iff this is a 5701 card running
2739 * in PCI-X mode [see tg3_get_invariants()] */
2741 int skb_size;
2743 skb_size = tg3_alloc_rx_skb(tp, opaque_key,
2744 desc_idx, *post_ptr);
2745 if (skb_size < 0)
2746 goto drop_it;
2748 pci_unmap_single(tp->pdev, dma_addr,
2749 skb_size - tp->rx_offset,
2750 PCI_DMA_FROMDEVICE);
2752 skb_put(skb, len);
2753 } else {
2754 struct sk_buff *copy_skb;
2756 tg3_recycle_rx(tp, opaque_key,
2757 desc_idx, *post_ptr);
2759 copy_skb = dev_alloc_skb(len + 2);
2760 if (copy_skb == NULL)
2761 goto drop_it_no_recycle;
2763 copy_skb->dev = tp->dev;
2764 skb_reserve(copy_skb, 2);
2765 skb_put(copy_skb, len);
2766 pci_dma_sync_single_for_cpu(tp->pdev, dma_addr, len, PCI_DMA_FROMDEVICE);
2767 memcpy(copy_skb->data, skb->data, len);
2768 pci_dma_sync_single_for_device(tp->pdev, dma_addr, len, PCI_DMA_FROMDEVICE);
2770 /* We'll reuse the original ring buffer. */
2771 skb = copy_skb;
2774 if ((tp->tg3_flags & TG3_FLAG_RX_CHECKSUMS) &&
2775 (desc->type_flags & RXD_FLAG_TCPUDP_CSUM) &&
2776 (((desc->ip_tcp_csum & RXD_TCPCSUM_MASK)
2777 >> RXD_TCPCSUM_SHIFT) == 0xffff))
2778 skb->ip_summed = CHECKSUM_UNNECESSARY;
2779 else
2780 skb->ip_summed = CHECKSUM_NONE;
2782 skb->protocol = eth_type_trans(skb, tp->dev);
2783 #if TG3_VLAN_TAG_USED
2784 if (tp->vlgrp != NULL &&
2785 desc->type_flags & RXD_FLAG_VLAN) {
2786 tg3_vlan_rx(tp, skb,
2787 desc->err_vlan & RXD_VLAN_MASK);
2788 } else
2789 #endif
2790 netif_receive_skb(skb);
2792 tp->dev->last_rx = jiffies;
2793 received++;
2794 budget--;
2796 next_pkt:
2797 (*post_ptr)++;
2798 next_pkt_nopost:
2799 rx_rcb_ptr++;
2800 sw_idx = rx_rcb_ptr % TG3_RX_RCB_RING_SIZE(tp);
2803 /* ACK the status ring. */
2804 tp->rx_rcb_ptr = rx_rcb_ptr;
2805 tw32_rx_mbox(MAILBOX_RCVRET_CON_IDX_0 + TG3_64BIT_REG_LOW,
2806 (rx_rcb_ptr % TG3_RX_RCB_RING_SIZE(tp)));
2808 /* Refill RX ring(s). */
2809 if (work_mask & RXD_OPAQUE_RING_STD) {
2810 sw_idx = tp->rx_std_ptr % TG3_RX_RING_SIZE;
2811 tw32_rx_mbox(MAILBOX_RCV_STD_PROD_IDX + TG3_64BIT_REG_LOW,
2812 sw_idx);
2814 if (work_mask & RXD_OPAQUE_RING_JUMBO) {
2815 sw_idx = tp->rx_jumbo_ptr % TG3_RX_JUMBO_RING_SIZE;
2816 tw32_rx_mbox(MAILBOX_RCV_JUMBO_PROD_IDX + TG3_64BIT_REG_LOW,
2817 sw_idx);
2819 mmiowb();
2821 return received;
2824 static int tg3_poll(struct net_device *netdev, int *budget)
2826 struct tg3 *tp = netdev_priv(netdev);
2827 struct tg3_hw_status *sblk = tp->hw_status;
2828 unsigned long flags;
2829 int done;
2831 spin_lock_irqsave(&tp->lock, flags);
2833 /* handle link change and other phy events */
2834 if (!(tp->tg3_flags &
2835 (TG3_FLAG_USE_LINKCHG_REG |
2836 TG3_FLAG_POLL_SERDES))) {
2837 if (sblk->status & SD_STATUS_LINK_CHG) {
2838 sblk->status = SD_STATUS_UPDATED |
2839 (sblk->status & ~SD_STATUS_LINK_CHG);
2840 tg3_setup_phy(tp, 0);
2844 /* run TX completion thread */
2845 if (sblk->idx[0].tx_consumer != tp->tx_cons) {
2846 spin_lock(&tp->tx_lock);
2847 tg3_tx(tp);
2848 spin_unlock(&tp->tx_lock);
2851 spin_unlock_irqrestore(&tp->lock, flags);
2853 /* run RX thread, within the bounds set by NAPI.
2854 * All RX "locking" is done by ensuring outside
2855 * code synchronizes with dev->poll()
2857 done = 1;
2858 if (sblk->idx[0].rx_producer != tp->rx_rcb_ptr) {
2859 int orig_budget = *budget;
2860 int work_done;
2862 if (orig_budget > netdev->quota)
2863 orig_budget = netdev->quota;
2865 work_done = tg3_rx(tp, orig_budget);
2867 *budget -= work_done;
2868 netdev->quota -= work_done;
2870 if (work_done >= orig_budget)
2871 done = 0;
2874 /* if no more work, tell net stack and NIC we're done */
2875 if (done) {
2876 spin_lock_irqsave(&tp->lock, flags);
2877 __netif_rx_complete(netdev);
2878 tg3_restart_ints(tp);
2879 spin_unlock_irqrestore(&tp->lock, flags);
2882 return (done ? 0 : 1);
2885 static inline unsigned int tg3_has_work(struct net_device *dev, struct tg3 *tp)
2887 struct tg3_hw_status *sblk = tp->hw_status;
2888 unsigned int work_exists = 0;
2890 /* check for phy events */
2891 if (!(tp->tg3_flags &
2892 (TG3_FLAG_USE_LINKCHG_REG |
2893 TG3_FLAG_POLL_SERDES))) {
2894 if (sblk->status & SD_STATUS_LINK_CHG)
2895 work_exists = 1;
2897 /* check for RX/TX work to do */
2898 if (sblk->idx[0].tx_consumer != tp->tx_cons ||
2899 sblk->idx[0].rx_producer != tp->rx_rcb_ptr)
2900 work_exists = 1;
2902 return work_exists;
2905 static irqreturn_t tg3_interrupt(int irq, void *dev_id, struct pt_regs *regs)
2907 struct net_device *dev = dev_id;
2908 struct tg3 *tp = netdev_priv(dev);
2909 struct tg3_hw_status *sblk = tp->hw_status;
2910 unsigned long flags;
2911 unsigned int handled = 1;
2913 spin_lock_irqsave(&tp->lock, flags);
2915 /* In INTx mode, it is possible for the interrupt to arrive at
2916 * the CPU before the status block posted prior to the interrupt.
2917 * Reading the PCI State register will confirm whether the
2918 * interrupt is ours and will flush the status block.
2920 if ((sblk->status & SD_STATUS_UPDATED) ||
2921 !(tr32(TG3PCI_PCISTATE) & PCISTATE_INT_NOT_ACTIVE)) {
2923 * writing any value to intr-mbox-0 clears PCI INTA# and
2924 * chip-internal interrupt pending events.
2925 * writing non-zero to intr-mbox-0 additional tells the
2926 * NIC to stop sending us irqs, engaging "in-intr-handler"
2927 * event coalescing.
2929 tw32_mailbox(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW,
2930 0x00000001);
2932 * Flush PCI write. This also guarantees that our
2933 * status block has been flushed to host memory.
2935 tr32(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW);
2936 sblk->status &= ~SD_STATUS_UPDATED;
2938 if (likely(tg3_has_work(dev, tp)))
2939 netif_rx_schedule(dev); /* schedule NAPI poll */
2940 else {
2941 /* no work, shared interrupt perhaps? re-enable
2942 * interrupts, and flush that PCI write
2944 tw32_mailbox(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW,
2945 0x00000000);
2946 tr32(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW);
2948 } else { /* shared interrupt */
2949 handled = 0;
2952 spin_unlock_irqrestore(&tp->lock, flags);
2954 return IRQ_RETVAL(handled);
2957 static int tg3_init_hw(struct tg3 *);
2958 static int tg3_halt(struct tg3 *);
2960 #ifdef CONFIG_NET_POLL_CONTROLLER
2961 static void tg3_poll_controller(struct net_device *dev)
2963 tg3_interrupt(dev->irq, dev, NULL);
2965 #endif
2967 static void tg3_reset_task(void *_data)
2969 struct tg3 *tp = _data;
2970 unsigned int restart_timer;
2972 tg3_netif_stop(tp);
2974 spin_lock_irq(&tp->lock);
2975 spin_lock(&tp->tx_lock);
2977 restart_timer = tp->tg3_flags2 & TG3_FLG2_RESTART_TIMER;
2978 tp->tg3_flags2 &= ~TG3_FLG2_RESTART_TIMER;
2980 tg3_halt(tp);
2981 tg3_init_hw(tp);
2983 tg3_netif_start(tp);
2985 spin_unlock(&tp->tx_lock);
2986 spin_unlock_irq(&tp->lock);
2988 if (restart_timer)
2989 mod_timer(&tp->timer, jiffies + 1);
2992 static void tg3_tx_timeout(struct net_device *dev)
2994 struct tg3 *tp = netdev_priv(dev);
2996 printk(KERN_ERR PFX "%s: transmit timed out, resetting\n",
2997 dev->name);
2999 schedule_work(&tp->reset_task);
3002 static void tg3_set_txd(struct tg3 *, int, dma_addr_t, int, u32, u32);
3004 static int tigon3_4gb_hwbug_workaround(struct tg3 *tp, struct sk_buff *skb,
3005 u32 guilty_entry, int guilty_len,
3006 u32 last_plus_one, u32 *start, u32 mss)
3008 struct sk_buff *new_skb = skb_copy(skb, GFP_ATOMIC);
3009 dma_addr_t new_addr;
3010 u32 entry = *start;
3011 int i;
3013 if (!new_skb) {
3014 dev_kfree_skb(skb);
3015 return -1;
3018 /* New SKB is guaranteed to be linear. */
3019 entry = *start;
3020 new_addr = pci_map_single(tp->pdev, new_skb->data, new_skb->len,
3021 PCI_DMA_TODEVICE);
3022 tg3_set_txd(tp, entry, new_addr, new_skb->len,
3023 (skb->ip_summed == CHECKSUM_HW) ?
3024 TXD_FLAG_TCPUDP_CSUM : 0, 1 | (mss << 1));
3025 *start = NEXT_TX(entry);
3027 /* Now clean up the sw ring entries. */
3028 i = 0;
3029 while (entry != last_plus_one) {
3030 int len;
3032 if (i == 0)
3033 len = skb_headlen(skb);
3034 else
3035 len = skb_shinfo(skb)->frags[i-1].size;
3036 pci_unmap_single(tp->pdev,
3037 pci_unmap_addr(&tp->tx_buffers[entry], mapping),
3038 len, PCI_DMA_TODEVICE);
3039 if (i == 0) {
3040 tp->tx_buffers[entry].skb = new_skb;
3041 pci_unmap_addr_set(&tp->tx_buffers[entry], mapping, new_addr);
3042 } else {
3043 tp->tx_buffers[entry].skb = NULL;
3045 entry = NEXT_TX(entry);
3046 i++;
3049 dev_kfree_skb(skb);
3051 return 0;
3054 static void tg3_set_txd(struct tg3 *tp, int entry,
3055 dma_addr_t mapping, int len, u32 flags,
3056 u32 mss_and_is_end)
3058 struct tg3_tx_buffer_desc *txd = &tp->tx_ring[entry];
3059 int is_end = (mss_and_is_end & 0x1);
3060 u32 mss = (mss_and_is_end >> 1);
3061 u32 vlan_tag = 0;
3063 if (is_end)
3064 flags |= TXD_FLAG_END;
3065 if (flags & TXD_FLAG_VLAN) {
3066 vlan_tag = flags >> 16;
3067 flags &= 0xffff;
3069 vlan_tag |= (mss << TXD_MSS_SHIFT);
3071 txd->addr_hi = ((u64) mapping >> 32);
3072 txd->addr_lo = ((u64) mapping & 0xffffffff);
3073 txd->len_flags = (len << TXD_LEN_SHIFT) | flags;
3074 txd->vlan_tag = vlan_tag << TXD_VLAN_TAG_SHIFT;
3077 static inline int tg3_4g_overflow_test(dma_addr_t mapping, int len)
3079 u32 base = (u32) mapping & 0xffffffff;
3081 return ((base > 0xffffdcc0) &&
3082 (base + len + 8 < base));
3085 static int tg3_start_xmit(struct sk_buff *skb, struct net_device *dev)
3087 struct tg3 *tp = netdev_priv(dev);
3088 dma_addr_t mapping;
3089 unsigned int i;
3090 u32 len, entry, base_flags, mss;
3091 int would_hit_hwbug;
3092 unsigned long flags;
3094 len = skb_headlen(skb);
3096 /* No BH disabling for tx_lock here. We are running in BH disabled
3097 * context and TX reclaim runs via tp->poll inside of a software
3098 * interrupt. Rejoice!
3100 * Actually, things are not so simple. If we are to take a hw
3101 * IRQ here, we can deadlock, consider:
3103 * CPU1 CPU2
3104 * tg3_start_xmit
3105 * take tp->tx_lock
3106 * tg3_timer
3107 * take tp->lock
3108 * tg3_interrupt
3109 * spin on tp->lock
3110 * spin on tp->tx_lock
3112 * So we really do need to disable interrupts when taking
3113 * tx_lock here.
3115 local_irq_save(flags);
3116 if (!spin_trylock(&tp->tx_lock)) {
3117 local_irq_restore(flags);
3118 return NETDEV_TX_LOCKED;
3121 /* This is a hard error, log it. */
3122 if (unlikely(TX_BUFFS_AVAIL(tp) <= (skb_shinfo(skb)->nr_frags + 1))) {
3123 netif_stop_queue(dev);
3124 spin_unlock_irqrestore(&tp->tx_lock, flags);
3125 printk(KERN_ERR PFX "%s: BUG! Tx Ring full when queue awake!\n",
3126 dev->name);
3127 return NETDEV_TX_BUSY;
3130 entry = tp->tx_prod;
3131 base_flags = 0;
3132 if (skb->ip_summed == CHECKSUM_HW)
3133 base_flags |= TXD_FLAG_TCPUDP_CSUM;
3134 #if TG3_TSO_SUPPORT != 0
3135 mss = 0;
3136 if (skb->len > (tp->dev->mtu + ETH_HLEN) &&
3137 (mss = skb_shinfo(skb)->tso_size) != 0) {
3138 int tcp_opt_len, ip_tcp_len;
3140 if (skb_header_cloned(skb) &&
3141 pskb_expand_head(skb, 0, 0, GFP_ATOMIC)) {
3142 dev_kfree_skb(skb);
3143 goto out_unlock;
3146 tcp_opt_len = ((skb->h.th->doff - 5) * 4);
3147 ip_tcp_len = (skb->nh.iph->ihl * 4) + sizeof(struct tcphdr);
3149 base_flags |= (TXD_FLAG_CPU_PRE_DMA |
3150 TXD_FLAG_CPU_POST_DMA);
3152 skb->nh.iph->check = 0;
3153 skb->nh.iph->tot_len = ntohs(mss + ip_tcp_len + tcp_opt_len);
3154 if (tp->tg3_flags2 & TG3_FLG2_HW_TSO) {
3155 skb->h.th->check = 0;
3156 base_flags &= ~TXD_FLAG_TCPUDP_CSUM;
3158 else {
3159 skb->h.th->check =
3160 ~csum_tcpudp_magic(skb->nh.iph->saddr,
3161 skb->nh.iph->daddr,
3162 0, IPPROTO_TCP, 0);
3165 if ((tp->tg3_flags2 & TG3_FLG2_HW_TSO) ||
3166 (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705)) {
3167 if (tcp_opt_len || skb->nh.iph->ihl > 5) {
3168 int tsflags;
3170 tsflags = ((skb->nh.iph->ihl - 5) +
3171 (tcp_opt_len >> 2));
3172 mss |= (tsflags << 11);
3174 } else {
3175 if (tcp_opt_len || skb->nh.iph->ihl > 5) {
3176 int tsflags;
3178 tsflags = ((skb->nh.iph->ihl - 5) +
3179 (tcp_opt_len >> 2));
3180 base_flags |= tsflags << 12;
3184 #else
3185 mss = 0;
3186 #endif
3187 #if TG3_VLAN_TAG_USED
3188 if (tp->vlgrp != NULL && vlan_tx_tag_present(skb))
3189 base_flags |= (TXD_FLAG_VLAN |
3190 (vlan_tx_tag_get(skb) << 16));
3191 #endif
3193 /* Queue skb data, a.k.a. the main skb fragment. */
3194 mapping = pci_map_single(tp->pdev, skb->data, len, PCI_DMA_TODEVICE);
3196 tp->tx_buffers[entry].skb = skb;
3197 pci_unmap_addr_set(&tp->tx_buffers[entry], mapping, mapping);
3199 would_hit_hwbug = 0;
3201 if (tg3_4g_overflow_test(mapping, len))
3202 would_hit_hwbug = entry + 1;
3204 tg3_set_txd(tp, entry, mapping, len, base_flags,
3205 (skb_shinfo(skb)->nr_frags == 0) | (mss << 1));
3207 entry = NEXT_TX(entry);
3209 /* Now loop through additional data fragments, and queue them. */
3210 if (skb_shinfo(skb)->nr_frags > 0) {
3211 unsigned int i, last;
3213 last = skb_shinfo(skb)->nr_frags - 1;
3214 for (i = 0; i <= last; i++) {
3215 skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
3217 len = frag->size;
3218 mapping = pci_map_page(tp->pdev,
3219 frag->page,
3220 frag->page_offset,
3221 len, PCI_DMA_TODEVICE);
3223 tp->tx_buffers[entry].skb = NULL;
3224 pci_unmap_addr_set(&tp->tx_buffers[entry], mapping, mapping);
3226 if (tg3_4g_overflow_test(mapping, len)) {
3227 /* Only one should match. */
3228 if (would_hit_hwbug)
3229 BUG();
3230 would_hit_hwbug = entry + 1;
3233 if (tp->tg3_flags2 & TG3_FLG2_HW_TSO)
3234 tg3_set_txd(tp, entry, mapping, len,
3235 base_flags, (i == last)|(mss << 1));
3236 else
3237 tg3_set_txd(tp, entry, mapping, len,
3238 base_flags, (i == last));
3240 entry = NEXT_TX(entry);
3244 if (would_hit_hwbug) {
3245 u32 last_plus_one = entry;
3246 u32 start;
3247 unsigned int len = 0;
3249 would_hit_hwbug -= 1;
3250 entry = entry - 1 - skb_shinfo(skb)->nr_frags;
3251 entry &= (TG3_TX_RING_SIZE - 1);
3252 start = entry;
3253 i = 0;
3254 while (entry != last_plus_one) {
3255 if (i == 0)
3256 len = skb_headlen(skb);
3257 else
3258 len = skb_shinfo(skb)->frags[i-1].size;
3260 if (entry == would_hit_hwbug)
3261 break;
3263 i++;
3264 entry = NEXT_TX(entry);
3268 /* If the workaround fails due to memory/mapping
3269 * failure, silently drop this packet.
3271 if (tigon3_4gb_hwbug_workaround(tp, skb,
3272 entry, len,
3273 last_plus_one,
3274 &start, mss))
3275 goto out_unlock;
3277 entry = start;
3280 /* Packets are ready, update Tx producer idx local and on card. */
3281 tw32_tx_mbox((MAILBOX_SNDHOST_PROD_IDX_0 + TG3_64BIT_REG_LOW), entry);
3283 tp->tx_prod = entry;
3284 if (TX_BUFFS_AVAIL(tp) <= (MAX_SKB_FRAGS + 1))
3285 netif_stop_queue(dev);
3287 out_unlock:
3288 mmiowb();
3289 spin_unlock_irqrestore(&tp->tx_lock, flags);
3291 dev->trans_start = jiffies;
3293 return NETDEV_TX_OK;
3296 static inline void tg3_set_mtu(struct net_device *dev, struct tg3 *tp,
3297 int new_mtu)
3299 dev->mtu = new_mtu;
3301 if (new_mtu > ETH_DATA_LEN)
3302 tp->tg3_flags |= TG3_FLAG_JUMBO_ENABLE;
3303 else
3304 tp->tg3_flags &= ~TG3_FLAG_JUMBO_ENABLE;
3307 static int tg3_change_mtu(struct net_device *dev, int new_mtu)
3309 struct tg3 *tp = netdev_priv(dev);
3311 if (new_mtu < TG3_MIN_MTU || new_mtu > TG3_MAX_MTU(tp))
3312 return -EINVAL;
3314 if (!netif_running(dev)) {
3315 /* We'll just catch it later when the
3316 * device is up'd.
3318 tg3_set_mtu(dev, tp, new_mtu);
3319 return 0;
3322 tg3_netif_stop(tp);
3323 spin_lock_irq(&tp->lock);
3324 spin_lock(&tp->tx_lock);
3326 tg3_halt(tp);
3328 tg3_set_mtu(dev, tp, new_mtu);
3330 tg3_init_hw(tp);
3332 tg3_netif_start(tp);
3334 spin_unlock(&tp->tx_lock);
3335 spin_unlock_irq(&tp->lock);
3337 return 0;
3340 /* Free up pending packets in all rx/tx rings.
3342 * The chip has been shut down and the driver detached from
3343 * the networking, so no interrupts or new tx packets will
3344 * end up in the driver. tp->{tx,}lock is not held and we are not
3345 * in an interrupt context and thus may sleep.
3347 static void tg3_free_rings(struct tg3 *tp)
3349 struct ring_info *rxp;
3350 int i;
3352 for (i = 0; i < TG3_RX_RING_SIZE; i++) {
3353 rxp = &tp->rx_std_buffers[i];
3355 if (rxp->skb == NULL)
3356 continue;
3357 pci_unmap_single(tp->pdev,
3358 pci_unmap_addr(rxp, mapping),
3359 RX_PKT_BUF_SZ - tp->rx_offset,
3360 PCI_DMA_FROMDEVICE);
3361 dev_kfree_skb_any(rxp->skb);
3362 rxp->skb = NULL;
3365 for (i = 0; i < TG3_RX_JUMBO_RING_SIZE; i++) {
3366 rxp = &tp->rx_jumbo_buffers[i];
3368 if (rxp->skb == NULL)
3369 continue;
3370 pci_unmap_single(tp->pdev,
3371 pci_unmap_addr(rxp, mapping),
3372 RX_JUMBO_PKT_BUF_SZ - tp->rx_offset,
3373 PCI_DMA_FROMDEVICE);
3374 dev_kfree_skb_any(rxp->skb);
3375 rxp->skb = NULL;
3378 for (i = 0; i < TG3_TX_RING_SIZE; ) {
3379 struct tx_ring_info *txp;
3380 struct sk_buff *skb;
3381 int j;
3383 txp = &tp->tx_buffers[i];
3384 skb = txp->skb;
3386 if (skb == NULL) {
3387 i++;
3388 continue;
3391 pci_unmap_single(tp->pdev,
3392 pci_unmap_addr(txp, mapping),
3393 skb_headlen(skb),
3394 PCI_DMA_TODEVICE);
3395 txp->skb = NULL;
3397 i++;
3399 for (j = 0; j < skb_shinfo(skb)->nr_frags; j++) {
3400 txp = &tp->tx_buffers[i & (TG3_TX_RING_SIZE - 1)];
3401 pci_unmap_page(tp->pdev,
3402 pci_unmap_addr(txp, mapping),
3403 skb_shinfo(skb)->frags[j].size,
3404 PCI_DMA_TODEVICE);
3405 i++;
3408 dev_kfree_skb_any(skb);
3412 /* Initialize tx/rx rings for packet processing.
3414 * The chip has been shut down and the driver detached from
3415 * the networking, so no interrupts or new tx packets will
3416 * end up in the driver. tp->{tx,}lock are held and thus
3417 * we may not sleep.
3419 static void tg3_init_rings(struct tg3 *tp)
3421 u32 i;
3423 /* Free up all the SKBs. */
3424 tg3_free_rings(tp);
3426 /* Zero out all descriptors. */
3427 memset(tp->rx_std, 0, TG3_RX_RING_BYTES);
3428 memset(tp->rx_jumbo, 0, TG3_RX_JUMBO_RING_BYTES);
3429 memset(tp->rx_rcb, 0, TG3_RX_RCB_RING_BYTES(tp));
3430 memset(tp->tx_ring, 0, TG3_TX_RING_BYTES);
3432 /* Initialize invariants of the rings, we only set this
3433 * stuff once. This works because the card does not
3434 * write into the rx buffer posting rings.
3436 for (i = 0; i < TG3_RX_RING_SIZE; i++) {
3437 struct tg3_rx_buffer_desc *rxd;
3439 rxd = &tp->rx_std[i];
3440 rxd->idx_len = (RX_PKT_BUF_SZ - tp->rx_offset - 64)
3441 << RXD_LEN_SHIFT;
3442 rxd->type_flags = (RXD_FLAG_END << RXD_FLAGS_SHIFT);
3443 rxd->opaque = (RXD_OPAQUE_RING_STD |
3444 (i << RXD_OPAQUE_INDEX_SHIFT));
3447 if (tp->tg3_flags & TG3_FLAG_JUMBO_ENABLE) {
3448 for (i = 0; i < TG3_RX_JUMBO_RING_SIZE; i++) {
3449 struct tg3_rx_buffer_desc *rxd;
3451 rxd = &tp->rx_jumbo[i];
3452 rxd->idx_len = (RX_JUMBO_PKT_BUF_SZ - tp->rx_offset - 64)
3453 << RXD_LEN_SHIFT;
3454 rxd->type_flags = (RXD_FLAG_END << RXD_FLAGS_SHIFT) |
3455 RXD_FLAG_JUMBO;
3456 rxd->opaque = (RXD_OPAQUE_RING_JUMBO |
3457 (i << RXD_OPAQUE_INDEX_SHIFT));
3461 /* Now allocate fresh SKBs for each rx ring. */
3462 for (i = 0; i < tp->rx_pending; i++) {
3463 if (tg3_alloc_rx_skb(tp, RXD_OPAQUE_RING_STD,
3464 -1, i) < 0)
3465 break;
3468 if (tp->tg3_flags & TG3_FLAG_JUMBO_ENABLE) {
3469 for (i = 0; i < tp->rx_jumbo_pending; i++) {
3470 if (tg3_alloc_rx_skb(tp, RXD_OPAQUE_RING_JUMBO,
3471 -1, i) < 0)
3472 break;
3478 * Must not be invoked with interrupt sources disabled and
3479 * the hardware shutdown down.
3481 static void tg3_free_consistent(struct tg3 *tp)
3483 if (tp->rx_std_buffers) {
3484 kfree(tp->rx_std_buffers);
3485 tp->rx_std_buffers = NULL;
3487 if (tp->rx_std) {
3488 pci_free_consistent(tp->pdev, TG3_RX_RING_BYTES,
3489 tp->rx_std, tp->rx_std_mapping);
3490 tp->rx_std = NULL;
3492 if (tp->rx_jumbo) {
3493 pci_free_consistent(tp->pdev, TG3_RX_JUMBO_RING_BYTES,
3494 tp->rx_jumbo, tp->rx_jumbo_mapping);
3495 tp->rx_jumbo = NULL;
3497 if (tp->rx_rcb) {
3498 pci_free_consistent(tp->pdev, TG3_RX_RCB_RING_BYTES(tp),
3499 tp->rx_rcb, tp->rx_rcb_mapping);
3500 tp->rx_rcb = NULL;
3502 if (tp->tx_ring) {
3503 pci_free_consistent(tp->pdev, TG3_TX_RING_BYTES,
3504 tp->tx_ring, tp->tx_desc_mapping);
3505 tp->tx_ring = NULL;
3507 if (tp->hw_status) {
3508 pci_free_consistent(tp->pdev, TG3_HW_STATUS_SIZE,
3509 tp->hw_status, tp->status_mapping);
3510 tp->hw_status = NULL;
3512 if (tp->hw_stats) {
3513 pci_free_consistent(tp->pdev, sizeof(struct tg3_hw_stats),
3514 tp->hw_stats, tp->stats_mapping);
3515 tp->hw_stats = NULL;
3520 * Must not be invoked with interrupt sources disabled and
3521 * the hardware shutdown down. Can sleep.
3523 static int tg3_alloc_consistent(struct tg3 *tp)
3525 tp->rx_std_buffers = kmalloc((sizeof(struct ring_info) *
3526 (TG3_RX_RING_SIZE +
3527 TG3_RX_JUMBO_RING_SIZE)) +
3528 (sizeof(struct tx_ring_info) *
3529 TG3_TX_RING_SIZE),
3530 GFP_KERNEL);
3531 if (!tp->rx_std_buffers)
3532 return -ENOMEM;
3534 memset(tp->rx_std_buffers, 0,
3535 (sizeof(struct ring_info) *
3536 (TG3_RX_RING_SIZE +
3537 TG3_RX_JUMBO_RING_SIZE)) +
3538 (sizeof(struct tx_ring_info) *
3539 TG3_TX_RING_SIZE));
3541 tp->rx_jumbo_buffers = &tp->rx_std_buffers[TG3_RX_RING_SIZE];
3542 tp->tx_buffers = (struct tx_ring_info *)
3543 &tp->rx_jumbo_buffers[TG3_RX_JUMBO_RING_SIZE];
3545 tp->rx_std = pci_alloc_consistent(tp->pdev, TG3_RX_RING_BYTES,
3546 &tp->rx_std_mapping);
3547 if (!tp->rx_std)
3548 goto err_out;
3550 tp->rx_jumbo = pci_alloc_consistent(tp->pdev, TG3_RX_JUMBO_RING_BYTES,
3551 &tp->rx_jumbo_mapping);
3553 if (!tp->rx_jumbo)
3554 goto err_out;
3556 tp->rx_rcb = pci_alloc_consistent(tp->pdev, TG3_RX_RCB_RING_BYTES(tp),
3557 &tp->rx_rcb_mapping);
3558 if (!tp->rx_rcb)
3559 goto err_out;
3561 tp->tx_ring = pci_alloc_consistent(tp->pdev, TG3_TX_RING_BYTES,
3562 &tp->tx_desc_mapping);
3563 if (!tp->tx_ring)
3564 goto err_out;
3566 tp->hw_status = pci_alloc_consistent(tp->pdev,
3567 TG3_HW_STATUS_SIZE,
3568 &tp->status_mapping);
3569 if (!tp->hw_status)
3570 goto err_out;
3572 tp->hw_stats = pci_alloc_consistent(tp->pdev,
3573 sizeof(struct tg3_hw_stats),
3574 &tp->stats_mapping);
3575 if (!tp->hw_stats)
3576 goto err_out;
3578 memset(tp->hw_status, 0, TG3_HW_STATUS_SIZE);
3579 memset(tp->hw_stats, 0, sizeof(struct tg3_hw_stats));
3581 return 0;
3583 err_out:
3584 tg3_free_consistent(tp);
3585 return -ENOMEM;
3588 #define MAX_WAIT_CNT 1000
3590 /* To stop a block, clear the enable bit and poll till it
3591 * clears. tp->lock is held.
3593 static int tg3_stop_block(struct tg3 *tp, unsigned long ofs, u32 enable_bit)
3595 unsigned int i;
3596 u32 val;
3598 if (tp->tg3_flags2 & TG3_FLG2_5705_PLUS) {
3599 switch (ofs) {
3600 case RCVLSC_MODE:
3601 case DMAC_MODE:
3602 case MBFREE_MODE:
3603 case BUFMGR_MODE:
3604 case MEMARB_MODE:
3605 /* We can't enable/disable these bits of the
3606 * 5705/5750, just say success.
3608 return 0;
3610 default:
3611 break;
3615 val = tr32(ofs);
3616 val &= ~enable_bit;
3617 tw32_f(ofs, val);
3619 for (i = 0; i < MAX_WAIT_CNT; i++) {
3620 udelay(100);
3621 val = tr32(ofs);
3622 if ((val & enable_bit) == 0)
3623 break;
3626 if (i == MAX_WAIT_CNT) {
3627 printk(KERN_ERR PFX "tg3_stop_block timed out, "
3628 "ofs=%lx enable_bit=%x\n",
3629 ofs, enable_bit);
3630 return -ENODEV;
3633 return 0;
3636 /* tp->lock is held. */
3637 static int tg3_abort_hw(struct tg3 *tp)
3639 int i, err;
3641 tg3_disable_ints(tp);
3643 tp->rx_mode &= ~RX_MODE_ENABLE;
3644 tw32_f(MAC_RX_MODE, tp->rx_mode);
3645 udelay(10);
3647 err = tg3_stop_block(tp, RCVBDI_MODE, RCVBDI_MODE_ENABLE);
3648 err |= tg3_stop_block(tp, RCVLPC_MODE, RCVLPC_MODE_ENABLE);
3649 err |= tg3_stop_block(tp, RCVLSC_MODE, RCVLSC_MODE_ENABLE);
3650 err |= tg3_stop_block(tp, RCVDBDI_MODE, RCVDBDI_MODE_ENABLE);
3651 err |= tg3_stop_block(tp, RCVDCC_MODE, RCVDCC_MODE_ENABLE);
3652 err |= tg3_stop_block(tp, RCVCC_MODE, RCVCC_MODE_ENABLE);
3654 err |= tg3_stop_block(tp, SNDBDS_MODE, SNDBDS_MODE_ENABLE);
3655 err |= tg3_stop_block(tp, SNDBDI_MODE, SNDBDI_MODE_ENABLE);
3656 err |= tg3_stop_block(tp, SNDDATAI_MODE, SNDDATAI_MODE_ENABLE);
3657 err |= tg3_stop_block(tp, RDMAC_MODE, RDMAC_MODE_ENABLE);
3658 err |= tg3_stop_block(tp, SNDDATAC_MODE, SNDDATAC_MODE_ENABLE);
3659 err |= tg3_stop_block(tp, DMAC_MODE, DMAC_MODE_ENABLE);
3660 err |= tg3_stop_block(tp, SNDBDC_MODE, SNDBDC_MODE_ENABLE);
3661 if (err)
3662 goto out;
3664 tp->mac_mode &= ~MAC_MODE_TDE_ENABLE;
3665 tw32_f(MAC_MODE, tp->mac_mode);
3666 udelay(40);
3668 tp->tx_mode &= ~TX_MODE_ENABLE;
3669 tw32_f(MAC_TX_MODE, tp->tx_mode);
3671 for (i = 0; i < MAX_WAIT_CNT; i++) {
3672 udelay(100);
3673 if (!(tr32(MAC_TX_MODE) & TX_MODE_ENABLE))
3674 break;
3676 if (i >= MAX_WAIT_CNT) {
3677 printk(KERN_ERR PFX "tg3_abort_hw timed out for %s, "
3678 "TX_MODE_ENABLE will not clear MAC_TX_MODE=%08x\n",
3679 tp->dev->name, tr32(MAC_TX_MODE));
3680 return -ENODEV;
3683 err = tg3_stop_block(tp, HOSTCC_MODE, HOSTCC_MODE_ENABLE);
3684 err |= tg3_stop_block(tp, WDMAC_MODE, WDMAC_MODE_ENABLE);
3685 err |= tg3_stop_block(tp, MBFREE_MODE, MBFREE_MODE_ENABLE);
3687 tw32(FTQ_RESET, 0xffffffff);
3688 tw32(FTQ_RESET, 0x00000000);
3690 err |= tg3_stop_block(tp, BUFMGR_MODE, BUFMGR_MODE_ENABLE);
3691 err |= tg3_stop_block(tp, MEMARB_MODE, MEMARB_MODE_ENABLE);
3692 if (err)
3693 goto out;
3695 if (tp->hw_status)
3696 memset(tp->hw_status, 0, TG3_HW_STATUS_SIZE);
3697 if (tp->hw_stats)
3698 memset(tp->hw_stats, 0, sizeof(struct tg3_hw_stats));
3700 out:
3701 return err;
3704 /* tp->lock is held. */
3705 static int tg3_nvram_lock(struct tg3 *tp)
3707 if (tp->tg3_flags & TG3_FLAG_NVRAM) {
3708 int i;
3710 tw32(NVRAM_SWARB, SWARB_REQ_SET1);
3711 for (i = 0; i < 8000; i++) {
3712 if (tr32(NVRAM_SWARB) & SWARB_GNT1)
3713 break;
3714 udelay(20);
3716 if (i == 8000)
3717 return -ENODEV;
3719 return 0;
3722 /* tp->lock is held. */
3723 static void tg3_nvram_unlock(struct tg3 *tp)
3725 if (tp->tg3_flags & TG3_FLAG_NVRAM)
3726 tw32_f(NVRAM_SWARB, SWARB_REQ_CLR1);
3729 /* tp->lock is held. */
3730 static void tg3_write_sig_pre_reset(struct tg3 *tp, int kind)
3732 if (!(tp->tg3_flags2 & TG3_FLG2_SUN_570X))
3733 tg3_write_mem(tp, NIC_SRAM_FIRMWARE_MBOX,
3734 NIC_SRAM_FIRMWARE_MBOX_MAGIC1);
3736 if (tp->tg3_flags2 & TG3_FLG2_ASF_NEW_HANDSHAKE) {
3737 switch (kind) {
3738 case RESET_KIND_INIT:
3739 tg3_write_mem(tp, NIC_SRAM_FW_DRV_STATE_MBOX,
3740 DRV_STATE_START);
3741 break;
3743 case RESET_KIND_SHUTDOWN:
3744 tg3_write_mem(tp, NIC_SRAM_FW_DRV_STATE_MBOX,
3745 DRV_STATE_UNLOAD);
3746 break;
3748 case RESET_KIND_SUSPEND:
3749 tg3_write_mem(tp, NIC_SRAM_FW_DRV_STATE_MBOX,
3750 DRV_STATE_SUSPEND);
3751 break;
3753 default:
3754 break;
3759 /* tp->lock is held. */
3760 static void tg3_write_sig_post_reset(struct tg3 *tp, int kind)
3762 if (tp->tg3_flags2 & TG3_FLG2_ASF_NEW_HANDSHAKE) {
3763 switch (kind) {
3764 case RESET_KIND_INIT:
3765 tg3_write_mem(tp, NIC_SRAM_FW_DRV_STATE_MBOX,
3766 DRV_STATE_START_DONE);
3767 break;
3769 case RESET_KIND_SHUTDOWN:
3770 tg3_write_mem(tp, NIC_SRAM_FW_DRV_STATE_MBOX,
3771 DRV_STATE_UNLOAD_DONE);
3772 break;
3774 default:
3775 break;
3780 /* tp->lock is held. */
3781 static void tg3_write_sig_legacy(struct tg3 *tp, int kind)
3783 if (tp->tg3_flags & TG3_FLAG_ENABLE_ASF) {
3784 switch (kind) {
3785 case RESET_KIND_INIT:
3786 tg3_write_mem(tp, NIC_SRAM_FW_DRV_STATE_MBOX,
3787 DRV_STATE_START);
3788 break;
3790 case RESET_KIND_SHUTDOWN:
3791 tg3_write_mem(tp, NIC_SRAM_FW_DRV_STATE_MBOX,
3792 DRV_STATE_UNLOAD);
3793 break;
3795 case RESET_KIND_SUSPEND:
3796 tg3_write_mem(tp, NIC_SRAM_FW_DRV_STATE_MBOX,
3797 DRV_STATE_SUSPEND);
3798 break;
3800 default:
3801 break;
3806 static void tg3_stop_fw(struct tg3 *);
3808 /* tp->lock is held. */
3809 static int tg3_chip_reset(struct tg3 *tp)
3811 u32 val;
3812 u32 flags_save;
3813 int i;
3815 if (!(tp->tg3_flags2 & TG3_FLG2_SUN_570X))
3816 tg3_nvram_lock(tp);
3819 * We must avoid the readl() that normally takes place.
3820 * It locks machines, causes machine checks, and other
3821 * fun things. So, temporarily disable the 5701
3822 * hardware workaround, while we do the reset.
3824 flags_save = tp->tg3_flags;
3825 tp->tg3_flags &= ~TG3_FLAG_5701_REG_WRITE_BUG;
3827 /* do the reset */
3828 val = GRC_MISC_CFG_CORECLK_RESET;
3830 if (tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS) {
3831 if (tr32(0x7e2c) == 0x60) {
3832 tw32(0x7e2c, 0x20);
3834 if (tp->pci_chip_rev_id != CHIPREV_ID_5750_A0) {
3835 tw32(GRC_MISC_CFG, (1 << 29));
3836 val |= (1 << 29);
3840 if (tp->tg3_flags2 & TG3_FLG2_5705_PLUS)
3841 val |= GRC_MISC_CFG_KEEP_GPHY_POWER;
3842 tw32(GRC_MISC_CFG, val);
3844 /* restore 5701 hardware bug workaround flag */
3845 tp->tg3_flags = flags_save;
3847 /* Unfortunately, we have to delay before the PCI read back.
3848 * Some 575X chips even will not respond to a PCI cfg access
3849 * when the reset command is given to the chip.
3851 * How do these hardware designers expect things to work
3852 * properly if the PCI write is posted for a long period
3853 * of time? It is always necessary to have some method by
3854 * which a register read back can occur to push the write
3855 * out which does the reset.
3857 * For most tg3 variants the trick below was working.
3858 * Ho hum...
3860 udelay(120);
3862 /* Flush PCI posted writes. The normal MMIO registers
3863 * are inaccessible at this time so this is the only
3864 * way to make this reliably (actually, this is no longer
3865 * the case, see above). I tried to use indirect
3866 * register read/write but this upset some 5701 variants.
3868 pci_read_config_dword(tp->pdev, PCI_COMMAND, &val);
3870 udelay(120);
3872 if (tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS) {
3873 if (tp->pci_chip_rev_id == CHIPREV_ID_5750_A0) {
3874 int i;
3875 u32 cfg_val;
3877 /* Wait for link training to complete. */
3878 for (i = 0; i < 5000; i++)
3879 udelay(100);
3881 pci_read_config_dword(tp->pdev, 0xc4, &cfg_val);
3882 pci_write_config_dword(tp->pdev, 0xc4,
3883 cfg_val | (1 << 15));
3885 /* Set PCIE max payload size and clear error status. */
3886 pci_write_config_dword(tp->pdev, 0xd8, 0xf5000);
3889 /* Re-enable indirect register accesses. */
3890 pci_write_config_dword(tp->pdev, TG3PCI_MISC_HOST_CTRL,
3891 tp->misc_host_ctrl);
3893 /* Set MAX PCI retry to zero. */
3894 val = (PCISTATE_ROM_ENABLE | PCISTATE_ROM_RETRY_ENABLE);
3895 if (tp->pci_chip_rev_id == CHIPREV_ID_5704_A0 &&
3896 (tp->tg3_flags & TG3_FLAG_PCIX_MODE))
3897 val |= PCISTATE_RETRY_SAME_DMA;
3898 pci_write_config_dword(tp->pdev, TG3PCI_PCISTATE, val);
3900 pci_restore_state(tp->pdev);
3902 /* Make sure PCI-X relaxed ordering bit is clear. */
3903 pci_read_config_dword(tp->pdev, TG3PCI_X_CAPS, &val);
3904 val &= ~PCIX_CAPS_RELAXED_ORDERING;
3905 pci_write_config_dword(tp->pdev, TG3PCI_X_CAPS, val);
3907 tw32(MEMARB_MODE, MEMARB_MODE_ENABLE);
3909 if (tp->pci_chip_rev_id == CHIPREV_ID_5750_A3) {
3910 tg3_stop_fw(tp);
3911 tw32(0x5000, 0x400);
3914 tw32(GRC_MODE, tp->grc_mode);
3916 if (tp->pci_chip_rev_id == CHIPREV_ID_5705_A0) {
3917 u32 val = tr32(0xc4);
3919 tw32(0xc4, val | (1 << 15));
3922 if ((tp->nic_sram_data_cfg & NIC_SRAM_DATA_CFG_MINI_PCI) != 0 &&
3923 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) {
3924 tp->pci_clock_ctrl |= CLOCK_CTRL_CLKRUN_OENABLE;
3925 if (tp->pci_chip_rev_id == CHIPREV_ID_5705_A0)
3926 tp->pci_clock_ctrl |= CLOCK_CTRL_FORCE_CLKRUN;
3927 tw32(TG3PCI_CLOCK_CTRL, tp->pci_clock_ctrl);
3930 if (tp->tg3_flags2 & TG3_FLG2_PHY_SERDES) {
3931 tp->mac_mode = MAC_MODE_PORT_MODE_TBI;
3932 tw32_f(MAC_MODE, tp->mac_mode);
3933 } else
3934 tw32_f(MAC_MODE, 0);
3935 udelay(40);
3937 if (!(tp->tg3_flags2 & TG3_FLG2_SUN_570X)) {
3938 /* Wait for firmware initialization to complete. */
3939 for (i = 0; i < 100000; i++) {
3940 tg3_read_mem(tp, NIC_SRAM_FIRMWARE_MBOX, &val);
3941 if (val == ~NIC_SRAM_FIRMWARE_MBOX_MAGIC1)
3942 break;
3943 udelay(10);
3945 if (i >= 100000) {
3946 printk(KERN_ERR PFX "tg3_reset_hw timed out for %s, "
3947 "firmware will not restart magic=%08x\n",
3948 tp->dev->name, val);
3949 return -ENODEV;
3953 if ((tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS) &&
3954 tp->pci_chip_rev_id != CHIPREV_ID_5750_A0) {
3955 u32 val = tr32(0x7c00);
3957 tw32(0x7c00, val | (1 << 25));
3960 /* Reprobe ASF enable state. */
3961 tp->tg3_flags &= ~TG3_FLAG_ENABLE_ASF;
3962 tp->tg3_flags2 &= ~TG3_FLG2_ASF_NEW_HANDSHAKE;
3963 tg3_read_mem(tp, NIC_SRAM_DATA_SIG, &val);
3964 if (val == NIC_SRAM_DATA_SIG_MAGIC) {
3965 u32 nic_cfg;
3967 tg3_read_mem(tp, NIC_SRAM_DATA_CFG, &nic_cfg);
3968 if (nic_cfg & NIC_SRAM_DATA_CFG_ASF_ENABLE) {
3969 tp->tg3_flags |= TG3_FLAG_ENABLE_ASF;
3970 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750)
3971 tp->tg3_flags2 |= TG3_FLG2_ASF_NEW_HANDSHAKE;
3975 return 0;
3978 /* tp->lock is held. */
3979 static void tg3_stop_fw(struct tg3 *tp)
3981 if (tp->tg3_flags & TG3_FLAG_ENABLE_ASF) {
3982 u32 val;
3983 int i;
3985 tg3_write_mem(tp, NIC_SRAM_FW_CMD_MBOX, FWCMD_NICDRV_PAUSE_FW);
3986 val = tr32(GRC_RX_CPU_EVENT);
3987 val |= (1 << 14);
3988 tw32(GRC_RX_CPU_EVENT, val);
3990 /* Wait for RX cpu to ACK the event. */
3991 for (i = 0; i < 100; i++) {
3992 if (!(tr32(GRC_RX_CPU_EVENT) & (1 << 14)))
3993 break;
3994 udelay(1);
3999 /* tp->lock is held. */
4000 static int tg3_halt(struct tg3 *tp)
4002 int err;
4004 tg3_stop_fw(tp);
4006 tg3_write_sig_pre_reset(tp, RESET_KIND_SHUTDOWN);
4008 tg3_abort_hw(tp);
4009 err = tg3_chip_reset(tp);
4011 tg3_write_sig_legacy(tp, RESET_KIND_SHUTDOWN);
4012 tg3_write_sig_post_reset(tp, RESET_KIND_SHUTDOWN);
4014 if (err)
4015 return err;
4017 return 0;
4020 #define TG3_FW_RELEASE_MAJOR 0x0
4021 #define TG3_FW_RELASE_MINOR 0x0
4022 #define TG3_FW_RELEASE_FIX 0x0
4023 #define TG3_FW_START_ADDR 0x08000000
4024 #define TG3_FW_TEXT_ADDR 0x08000000
4025 #define TG3_FW_TEXT_LEN 0x9c0
4026 #define TG3_FW_RODATA_ADDR 0x080009c0
4027 #define TG3_FW_RODATA_LEN 0x60
4028 #define TG3_FW_DATA_ADDR 0x08000a40
4029 #define TG3_FW_DATA_LEN 0x20
4030 #define TG3_FW_SBSS_ADDR 0x08000a60
4031 #define TG3_FW_SBSS_LEN 0xc
4032 #define TG3_FW_BSS_ADDR 0x08000a70
4033 #define TG3_FW_BSS_LEN 0x10
4035 static u32 tg3FwText[(TG3_FW_TEXT_LEN / sizeof(u32)) + 1] = {
4036 0x00000000, 0x10000003, 0x00000000, 0x0000000d, 0x0000000d, 0x3c1d0800,
4037 0x37bd3ffc, 0x03a0f021, 0x3c100800, 0x26100000, 0x0e000018, 0x00000000,
4038 0x0000000d, 0x3c1d0800, 0x37bd3ffc, 0x03a0f021, 0x3c100800, 0x26100034,
4039 0x0e00021c, 0x00000000, 0x0000000d, 0x00000000, 0x00000000, 0x00000000,
4040 0x27bdffe0, 0x3c1cc000, 0xafbf0018, 0xaf80680c, 0x0e00004c, 0x241b2105,
4041 0x97850000, 0x97870002, 0x9782002c, 0x9783002e, 0x3c040800, 0x248409c0,
4042 0xafa00014, 0x00021400, 0x00621825, 0x00052c00, 0xafa30010, 0x8f860010,
4043 0x00e52825, 0x0e000060, 0x24070102, 0x3c02ac00, 0x34420100, 0x3c03ac01,
4044 0x34630100, 0xaf820490, 0x3c02ffff, 0xaf820494, 0xaf830498, 0xaf82049c,
4045 0x24020001, 0xaf825ce0, 0x0e00003f, 0xaf825d00, 0x0e000140, 0x00000000,
4046 0x8fbf0018, 0x03e00008, 0x27bd0020, 0x2402ffff, 0xaf825404, 0x8f835400,
4047 0x34630400, 0xaf835400, 0xaf825404, 0x3c020800, 0x24420034, 0xaf82541c,
4048 0x03e00008, 0xaf805400, 0x00000000, 0x00000000, 0x3c020800, 0x34423000,
4049 0x3c030800, 0x34633000, 0x3c040800, 0x348437ff, 0x3c010800, 0xac220a64,
4050 0x24020040, 0x3c010800, 0xac220a68, 0x3c010800, 0xac200a60, 0xac600000,
4051 0x24630004, 0x0083102b, 0x5040fffd, 0xac600000, 0x03e00008, 0x00000000,
4052 0x00804821, 0x8faa0010, 0x3c020800, 0x8c420a60, 0x3c040800, 0x8c840a68,
4053 0x8fab0014, 0x24430001, 0x0044102b, 0x3c010800, 0xac230a60, 0x14400003,
4054 0x00004021, 0x3c010800, 0xac200a60, 0x3c020800, 0x8c420a60, 0x3c030800,
4055 0x8c630a64, 0x91240000, 0x00021140, 0x00431021, 0x00481021, 0x25080001,
4056 0xa0440000, 0x29020008, 0x1440fff4, 0x25290001, 0x3c020800, 0x8c420a60,
4057 0x3c030800, 0x8c630a64, 0x8f84680c, 0x00021140, 0x00431021, 0xac440008,
4058 0xac45000c, 0xac460010, 0xac470014, 0xac4a0018, 0x03e00008, 0xac4b001c,
4059 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
4060 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
4061 0, 0, 0, 0, 0, 0,
4062 0x02000008, 0x00000000, 0x0a0001e3, 0x3c0a0001, 0x0a0001e3, 0x3c0a0002,
4063 0x0a0001e3, 0x00000000, 0x0a0001e3, 0x00000000, 0x0a0001e3, 0x00000000,
4064 0x0a0001e3, 0x00000000, 0x0a0001e3, 0x00000000, 0x0a0001e3, 0x00000000,
4065 0x0a0001e3, 0x00000000, 0x0a0001e3, 0x00000000, 0x0a0001e3, 0x00000000,
4066 0x0a0001e3, 0x3c0a0007, 0x0a0001e3, 0x3c0a0008, 0x0a0001e3, 0x3c0a0009,
4067 0x0a0001e3, 0x00000000, 0x0a0001e3, 0x00000000, 0x0a0001e3, 0x3c0a000b,
4068 0x0a0001e3, 0x3c0a000c, 0x0a0001e3, 0x3c0a000d, 0x0a0001e3, 0x00000000,
4069 0x0a0001e3, 0x00000000, 0x0a0001e3, 0x3c0a000e, 0x0a0001e3, 0x00000000,
4070 0x0a0001e3, 0x00000000, 0x0a0001e3, 0x00000000, 0x0a0001e3, 0x00000000,
4071 0x0a0001e3, 0x00000000, 0x0a0001e3, 0x00000000, 0x0a0001e3, 0x00000000,
4072 0x0a0001e3, 0x00000000, 0x0a0001e3, 0x3c0a0013, 0x0a0001e3, 0x3c0a0014,
4073 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
4074 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
4075 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
4076 0x27bdffe0, 0x00001821, 0x00001021, 0xafbf0018, 0xafb10014, 0xafb00010,
4077 0x3c010800, 0x00220821, 0xac200a70, 0x3c010800, 0x00220821, 0xac200a74,
4078 0x3c010800, 0x00220821, 0xac200a78, 0x24630001, 0x1860fff5, 0x2442000c,
4079 0x24110001, 0x8f906810, 0x32020004, 0x14400005, 0x24040001, 0x3c020800,
4080 0x8c420a78, 0x18400003, 0x00002021, 0x0e000182, 0x00000000, 0x32020001,
4081 0x10400003, 0x00000000, 0x0e000169, 0x00000000, 0x0a000153, 0xaf915028,
4082 0x8fbf0018, 0x8fb10014, 0x8fb00010, 0x03e00008, 0x27bd0020, 0x3c050800,
4083 0x8ca50a70, 0x3c060800, 0x8cc60a80, 0x3c070800, 0x8ce70a78, 0x27bdffe0,
4084 0x3c040800, 0x248409d0, 0xafbf0018, 0xafa00010, 0x0e000060, 0xafa00014,
4085 0x0e00017b, 0x00002021, 0x8fbf0018, 0x03e00008, 0x27bd0020, 0x24020001,
4086 0x8f836810, 0x00821004, 0x00021027, 0x00621824, 0x03e00008, 0xaf836810,
4087 0x27bdffd8, 0xafbf0024, 0x1080002e, 0xafb00020, 0x8f825cec, 0xafa20018,
4088 0x8f825cec, 0x3c100800, 0x26100a78, 0xafa2001c, 0x34028000, 0xaf825cec,
4089 0x8e020000, 0x18400016, 0x00000000, 0x3c020800, 0x94420a74, 0x8fa3001c,
4090 0x000221c0, 0xac830004, 0x8fa2001c, 0x3c010800, 0x0e000201, 0xac220a74,
4091 0x10400005, 0x00000000, 0x8e020000, 0x24420001, 0x0a0001df, 0xae020000,
4092 0x3c020800, 0x8c420a70, 0x00021c02, 0x000321c0, 0x0a0001c5, 0xafa2001c,
4093 0x0e000201, 0x00000000, 0x1040001f, 0x00000000, 0x8e020000, 0x8fa3001c,
4094 0x24420001, 0x3c010800, 0xac230a70, 0x3c010800, 0xac230a74, 0x0a0001df,
4095 0xae020000, 0x3c100800, 0x26100a78, 0x8e020000, 0x18400028, 0x00000000,
4096 0x0e000201, 0x00000000, 0x14400024, 0x00000000, 0x8e020000, 0x3c030800,
4097 0x8c630a70, 0x2442ffff, 0xafa3001c, 0x18400006, 0xae020000, 0x00031402,
4098 0x000221c0, 0x8c820004, 0x3c010800, 0xac220a70, 0x97a2001e, 0x2442ff00,
4099 0x2c420300, 0x1440000b, 0x24024000, 0x3c040800, 0x248409dc, 0xafa00010,
4100 0xafa00014, 0x8fa6001c, 0x24050008, 0x0e000060, 0x00003821, 0x0a0001df,
4101 0x00000000, 0xaf825cf8, 0x3c020800, 0x8c420a40, 0x8fa3001c, 0x24420001,
4102 0xaf835cf8, 0x3c010800, 0xac220a40, 0x8fbf0024, 0x8fb00020, 0x03e00008,
4103 0x27bd0028, 0x27bdffe0, 0x3c040800, 0x248409e8, 0x00002821, 0x00003021,
4104 0x00003821, 0xafbf0018, 0xafa00010, 0x0e000060, 0xafa00014, 0x8fbf0018,
4105 0x03e00008, 0x27bd0020, 0x8f82680c, 0x8f85680c, 0x00021827, 0x0003182b,
4106 0x00031823, 0x00431024, 0x00441021, 0x00a2282b, 0x10a00006, 0x00000000,
4107 0x00401821, 0x8f82680c, 0x0043102b, 0x1440fffd, 0x00000000, 0x03e00008,
4108 0x00000000, 0x3c040800, 0x8c840000, 0x3c030800, 0x8c630a40, 0x0064102b,
4109 0x54400002, 0x00831023, 0x00641023, 0x2c420008, 0x03e00008, 0x38420001,
4110 0x27bdffe0, 0x00802821, 0x3c040800, 0x24840a00, 0x00003021, 0x00003821,
4111 0xafbf0018, 0xafa00010, 0x0e000060, 0xafa00014, 0x0a000216, 0x00000000,
4112 0x8fbf0018, 0x03e00008, 0x27bd0020, 0x00000000, 0x27bdffe0, 0x3c1cc000,
4113 0xafbf0018, 0x0e00004c, 0xaf80680c, 0x3c040800, 0x24840a10, 0x03802821,
4114 0x00003021, 0x00003821, 0xafa00010, 0x0e000060, 0xafa00014, 0x2402ffff,
4115 0xaf825404, 0x3c0200aa, 0x0e000234, 0xaf825434, 0x8fbf0018, 0x03e00008,
4116 0x27bd0020, 0x00000000, 0x00000000, 0x00000000, 0x27bdffe8, 0xafb00010,
4117 0x24100001, 0xafbf0014, 0x3c01c003, 0xac200000, 0x8f826810, 0x30422000,
4118 0x10400003, 0x00000000, 0x0e000246, 0x00000000, 0x0a00023a, 0xaf905428,
4119 0x8fbf0014, 0x8fb00010, 0x03e00008, 0x27bd0018, 0x27bdfff8, 0x8f845d0c,
4120 0x3c0200ff, 0x3c030800, 0x8c630a50, 0x3442fff8, 0x00821024, 0x1043001e,
4121 0x3c0500ff, 0x34a5fff8, 0x3c06c003, 0x3c074000, 0x00851824, 0x8c620010,
4122 0x3c010800, 0xac230a50, 0x30420008, 0x10400005, 0x00871025, 0x8cc20000,
4123 0x24420001, 0xacc20000, 0x00871025, 0xaf825d0c, 0x8fa20000, 0x24420001,
4124 0xafa20000, 0x8fa20000, 0x8fa20000, 0x24420001, 0xafa20000, 0x8fa20000,
4125 0x8f845d0c, 0x3c030800, 0x8c630a50, 0x00851024, 0x1443ffe8, 0x00851824,
4126 0x27bd0008, 0x03e00008, 0x00000000, 0x00000000, 0x00000000
4129 static u32 tg3FwRodata[(TG3_FW_RODATA_LEN / sizeof(u32)) + 1] = {
4130 0x35373031, 0x726c7341, 0x00000000, 0x00000000, 0x53774576, 0x656e7430,
4131 0x00000000, 0x726c7045, 0x76656e74, 0x31000000, 0x556e6b6e, 0x45766e74,
4132 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x66617461, 0x6c457272,
4133 0x00000000, 0x00000000, 0x4d61696e, 0x43707542, 0x00000000, 0x00000000,
4134 0x00000000
4137 #if 0 /* All zeros, don't eat up space with it. */
4138 u32 tg3FwData[(TG3_FW_DATA_LEN / sizeof(u32)) + 1] = {
4139 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
4140 0x00000000, 0x00000000, 0x00000000, 0x00000000
4142 #endif
4144 #define RX_CPU_SCRATCH_BASE 0x30000
4145 #define RX_CPU_SCRATCH_SIZE 0x04000
4146 #define TX_CPU_SCRATCH_BASE 0x34000
4147 #define TX_CPU_SCRATCH_SIZE 0x04000
4149 /* tp->lock is held. */
4150 static int tg3_halt_cpu(struct tg3 *tp, u32 offset)
4152 int i;
4154 if (offset == TX_CPU_BASE &&
4155 (tp->tg3_flags2 & TG3_FLG2_5705_PLUS))
4156 BUG();
4158 if (offset == RX_CPU_BASE) {
4159 for (i = 0; i < 10000; i++) {
4160 tw32(offset + CPU_STATE, 0xffffffff);
4161 tw32(offset + CPU_MODE, CPU_MODE_HALT);
4162 if (tr32(offset + CPU_MODE) & CPU_MODE_HALT)
4163 break;
4166 tw32(offset + CPU_STATE, 0xffffffff);
4167 tw32_f(offset + CPU_MODE, CPU_MODE_HALT);
4168 udelay(10);
4169 } else {
4170 for (i = 0; i < 10000; i++) {
4171 tw32(offset + CPU_STATE, 0xffffffff);
4172 tw32(offset + CPU_MODE, CPU_MODE_HALT);
4173 if (tr32(offset + CPU_MODE) & CPU_MODE_HALT)
4174 break;
4178 if (i >= 10000) {
4179 printk(KERN_ERR PFX "tg3_reset_cpu timed out for %s, "
4180 "and %s CPU\n",
4181 tp->dev->name,
4182 (offset == RX_CPU_BASE ? "RX" : "TX"));
4183 return -ENODEV;
4185 return 0;
4188 struct fw_info {
4189 unsigned int text_base;
4190 unsigned int text_len;
4191 u32 *text_data;
4192 unsigned int rodata_base;
4193 unsigned int rodata_len;
4194 u32 *rodata_data;
4195 unsigned int data_base;
4196 unsigned int data_len;
4197 u32 *data_data;
4200 /* tp->lock is held. */
4201 static int tg3_load_firmware_cpu(struct tg3 *tp, u32 cpu_base, u32 cpu_scratch_base,
4202 int cpu_scratch_size, struct fw_info *info)
4204 int err, i;
4205 u32 orig_tg3_flags = tp->tg3_flags;
4206 void (*write_op)(struct tg3 *, u32, u32);
4208 if (cpu_base == TX_CPU_BASE &&
4209 (tp->tg3_flags2 & TG3_FLG2_5705_PLUS)) {
4210 printk(KERN_ERR PFX "tg3_load_firmware_cpu: Trying to load "
4211 "TX cpu firmware on %s which is 5705.\n",
4212 tp->dev->name);
4213 return -EINVAL;
4216 if (tp->tg3_flags2 & TG3_FLG2_5705_PLUS)
4217 write_op = tg3_write_mem;
4218 else
4219 write_op = tg3_write_indirect_reg32;
4221 /* Force use of PCI config space for indirect register
4222 * write calls.
4224 tp->tg3_flags |= TG3_FLAG_PCIX_TARGET_HWBUG;
4226 err = tg3_halt_cpu(tp, cpu_base);
4227 if (err)
4228 goto out;
4230 for (i = 0; i < cpu_scratch_size; i += sizeof(u32))
4231 write_op(tp, cpu_scratch_base + i, 0);
4232 tw32(cpu_base + CPU_STATE, 0xffffffff);
4233 tw32(cpu_base + CPU_MODE, tr32(cpu_base+CPU_MODE)|CPU_MODE_HALT);
4234 for (i = 0; i < (info->text_len / sizeof(u32)); i++)
4235 write_op(tp, (cpu_scratch_base +
4236 (info->text_base & 0xffff) +
4237 (i * sizeof(u32))),
4238 (info->text_data ?
4239 info->text_data[i] : 0));
4240 for (i = 0; i < (info->rodata_len / sizeof(u32)); i++)
4241 write_op(tp, (cpu_scratch_base +
4242 (info->rodata_base & 0xffff) +
4243 (i * sizeof(u32))),
4244 (info->rodata_data ?
4245 info->rodata_data[i] : 0));
4246 for (i = 0; i < (info->data_len / sizeof(u32)); i++)
4247 write_op(tp, (cpu_scratch_base +
4248 (info->data_base & 0xffff) +
4249 (i * sizeof(u32))),
4250 (info->data_data ?
4251 info->data_data[i] : 0));
4253 err = 0;
4255 out:
4256 tp->tg3_flags = orig_tg3_flags;
4257 return err;
4260 /* tp->lock is held. */
4261 static int tg3_load_5701_a0_firmware_fix(struct tg3 *tp)
4263 struct fw_info info;
4264 int err, i;
4266 info.text_base = TG3_FW_TEXT_ADDR;
4267 info.text_len = TG3_FW_TEXT_LEN;
4268 info.text_data = &tg3FwText[0];
4269 info.rodata_base = TG3_FW_RODATA_ADDR;
4270 info.rodata_len = TG3_FW_RODATA_LEN;
4271 info.rodata_data = &tg3FwRodata[0];
4272 info.data_base = TG3_FW_DATA_ADDR;
4273 info.data_len = TG3_FW_DATA_LEN;
4274 info.data_data = NULL;
4276 err = tg3_load_firmware_cpu(tp, RX_CPU_BASE,
4277 RX_CPU_SCRATCH_BASE, RX_CPU_SCRATCH_SIZE,
4278 &info);
4279 if (err)
4280 return err;
4282 err = tg3_load_firmware_cpu(tp, TX_CPU_BASE,
4283 TX_CPU_SCRATCH_BASE, TX_CPU_SCRATCH_SIZE,
4284 &info);
4285 if (err)
4286 return err;
4288 /* Now startup only the RX cpu. */
4289 tw32(RX_CPU_BASE + CPU_STATE, 0xffffffff);
4290 tw32_f(RX_CPU_BASE + CPU_PC, TG3_FW_TEXT_ADDR);
4292 for (i = 0; i < 5; i++) {
4293 if (tr32(RX_CPU_BASE + CPU_PC) == TG3_FW_TEXT_ADDR)
4294 break;
4295 tw32(RX_CPU_BASE + CPU_STATE, 0xffffffff);
4296 tw32(RX_CPU_BASE + CPU_MODE, CPU_MODE_HALT);
4297 tw32_f(RX_CPU_BASE + CPU_PC, TG3_FW_TEXT_ADDR);
4298 udelay(1000);
4300 if (i >= 5) {
4301 printk(KERN_ERR PFX "tg3_load_firmware fails for %s "
4302 "to set RX CPU PC, is %08x should be %08x\n",
4303 tp->dev->name, tr32(RX_CPU_BASE + CPU_PC),
4304 TG3_FW_TEXT_ADDR);
4305 return -ENODEV;
4307 tw32(RX_CPU_BASE + CPU_STATE, 0xffffffff);
4308 tw32_f(RX_CPU_BASE + CPU_MODE, 0x00000000);
4310 return 0;
4313 #if TG3_TSO_SUPPORT != 0
4315 #define TG3_TSO_FW_RELEASE_MAJOR 0x1
4316 #define TG3_TSO_FW_RELASE_MINOR 0x6
4317 #define TG3_TSO_FW_RELEASE_FIX 0x0
4318 #define TG3_TSO_FW_START_ADDR 0x08000000
4319 #define TG3_TSO_FW_TEXT_ADDR 0x08000000
4320 #define TG3_TSO_FW_TEXT_LEN 0x1aa0
4321 #define TG3_TSO_FW_RODATA_ADDR 0x08001aa0
4322 #define TG3_TSO_FW_RODATA_LEN 0x60
4323 #define TG3_TSO_FW_DATA_ADDR 0x08001b20
4324 #define TG3_TSO_FW_DATA_LEN 0x30
4325 #define TG3_TSO_FW_SBSS_ADDR 0x08001b50
4326 #define TG3_TSO_FW_SBSS_LEN 0x2c
4327 #define TG3_TSO_FW_BSS_ADDR 0x08001b80
4328 #define TG3_TSO_FW_BSS_LEN 0x894
4330 static u32 tg3TsoFwText[(TG3_TSO_FW_TEXT_LEN / 4) + 1] = {
4331 0x0e000003, 0x00000000, 0x08001b24, 0x00000000, 0x10000003, 0x00000000,
4332 0x0000000d, 0x0000000d, 0x3c1d0800, 0x37bd4000, 0x03a0f021, 0x3c100800,
4333 0x26100000, 0x0e000010, 0x00000000, 0x0000000d, 0x27bdffe0, 0x3c04fefe,
4334 0xafbf0018, 0x0e0005d8, 0x34840002, 0x0e000668, 0x00000000, 0x3c030800,
4335 0x90631b68, 0x24020002, 0x3c040800, 0x24841aac, 0x14620003, 0x24050001,
4336 0x3c040800, 0x24841aa0, 0x24060006, 0x00003821, 0xafa00010, 0x0e00067c,
4337 0xafa00014, 0x8f625c50, 0x34420001, 0xaf625c50, 0x8f625c90, 0x34420001,
4338 0xaf625c90, 0x2402ffff, 0x0e000034, 0xaf625404, 0x8fbf0018, 0x03e00008,
4339 0x27bd0020, 0x00000000, 0x00000000, 0x00000000, 0x27bdffe0, 0xafbf001c,
4340 0xafb20018, 0xafb10014, 0x0e00005b, 0xafb00010, 0x24120002, 0x24110001,
4341 0x8f706820, 0x32020100, 0x10400003, 0x00000000, 0x0e0000bb, 0x00000000,
4342 0x8f706820, 0x32022000, 0x10400004, 0x32020001, 0x0e0001f0, 0x24040001,
4343 0x32020001, 0x10400003, 0x00000000, 0x0e0000a3, 0x00000000, 0x3c020800,
4344 0x90421b98, 0x14520003, 0x00000000, 0x0e0004c0, 0x00000000, 0x0a00003c,
4345 0xaf715028, 0x8fbf001c, 0x8fb20018, 0x8fb10014, 0x8fb00010, 0x03e00008,
4346 0x27bd0020, 0x27bdffe0, 0x3c040800, 0x24841ac0, 0x00002821, 0x00003021,
4347 0x00003821, 0xafbf0018, 0xafa00010, 0x0e00067c, 0xafa00014, 0x3c040800,
4348 0x248423d8, 0xa4800000, 0x3c010800, 0xa0201b98, 0x3c010800, 0xac201b9c,
4349 0x3c010800, 0xac201ba0, 0x3c010800, 0xac201ba4, 0x3c010800, 0xac201bac,
4350 0x3c010800, 0xac201bb8, 0x3c010800, 0xac201bbc, 0x8f624434, 0x3c010800,
4351 0xac221b88, 0x8f624438, 0x3c010800, 0xac221b8c, 0x8f624410, 0xac80f7a8,
4352 0x3c010800, 0xac201b84, 0x3c010800, 0xac2023e0, 0x3c010800, 0xac2023c8,
4353 0x3c010800, 0xac2023cc, 0x3c010800, 0xac202400, 0x3c010800, 0xac221b90,
4354 0x8f620068, 0x24030007, 0x00021702, 0x10430005, 0x00000000, 0x8f620068,
4355 0x00021702, 0x14400004, 0x24020001, 0x3c010800, 0x0a000097, 0xac20240c,
4356 0xac820034, 0x3c040800, 0x24841acc, 0x3c050800, 0x8ca5240c, 0x00003021,
4357 0x00003821, 0xafa00010, 0x0e00067c, 0xafa00014, 0x8fbf0018, 0x03e00008,
4358 0x27bd0020, 0x27bdffe0, 0x3c040800, 0x24841ad8, 0x00002821, 0x00003021,
4359 0x00003821, 0xafbf0018, 0xafa00010, 0x0e00067c, 0xafa00014, 0x0e00005b,
4360 0x00000000, 0x0e0000b4, 0x00002021, 0x8fbf0018, 0x03e00008, 0x27bd0020,
4361 0x24020001, 0x8f636820, 0x00821004, 0x00021027, 0x00621824, 0x03e00008,
4362 0xaf636820, 0x27bdffd0, 0xafbf002c, 0xafb60028, 0xafb50024, 0xafb40020,
4363 0xafb3001c, 0xafb20018, 0xafb10014, 0xafb00010, 0x8f675c5c, 0x3c030800,
4364 0x24631bbc, 0x8c620000, 0x14470005, 0x3c0200ff, 0x3c020800, 0x90421b98,
4365 0x14400119, 0x3c0200ff, 0x3442fff8, 0x00e28824, 0xac670000, 0x00111902,
4366 0x306300ff, 0x30e20003, 0x000211c0, 0x00622825, 0x00a04021, 0x00071602,
4367 0x3c030800, 0x90631b98, 0x3044000f, 0x14600036, 0x00804821, 0x24020001,
4368 0x3c010800, 0xa0221b98, 0x00051100, 0x00821025, 0x3c010800, 0xac201b9c,
4369 0x3c010800, 0xac201ba0, 0x3c010800, 0xac201ba4, 0x3c010800, 0xac201bac,
4370 0x3c010800, 0xac201bb8, 0x3c010800, 0xac201bb0, 0x3c010800, 0xac201bb4,
4371 0x3c010800, 0xa42223d8, 0x9622000c, 0x30437fff, 0x3c010800, 0xa4222410,
4372 0x30428000, 0x3c010800, 0xa4231bc6, 0x10400005, 0x24020001, 0x3c010800,
4373 0xac2223f4, 0x0a000102, 0x2406003e, 0x24060036, 0x3c010800, 0xac2023f4,
4374 0x9622000a, 0x3c030800, 0x94631bc6, 0x3c010800, 0xac2023f0, 0x3c010800,
4375 0xac2023f8, 0x00021302, 0x00021080, 0x00c21021, 0x00621821, 0x3c010800,
4376 0xa42223d0, 0x3c010800, 0x0a000115, 0xa4231b96, 0x9622000c, 0x3c010800,
4377 0xa42223ec, 0x3c040800, 0x24841b9c, 0x8c820000, 0x00021100, 0x3c010800,
4378 0x00220821, 0xac311bc8, 0x8c820000, 0x00021100, 0x3c010800, 0x00220821,
4379 0xac271bcc, 0x8c820000, 0x25030001, 0x306601ff, 0x00021100, 0x3c010800,
4380 0x00220821, 0xac261bd0, 0x8c820000, 0x00021100, 0x3c010800, 0x00220821,
4381 0xac291bd4, 0x96230008, 0x3c020800, 0x8c421bac, 0x00432821, 0x3c010800,
4382 0xac251bac, 0x9622000a, 0x30420004, 0x14400018, 0x00061100, 0x8f630c14,
4383 0x3063000f, 0x2c620002, 0x1440000b, 0x3c02c000, 0x8f630c14, 0x3c020800,
4384 0x8c421b40, 0x3063000f, 0x24420001, 0x3c010800, 0xac221b40, 0x2c620002,
4385 0x1040fff7, 0x3c02c000, 0x00e21825, 0xaf635c5c, 0x8f625c50, 0x30420002,
4386 0x10400014, 0x00000000, 0x0a000147, 0x00000000, 0x3c030800, 0x8c631b80,
4387 0x3c040800, 0x94841b94, 0x01221025, 0x3c010800, 0xa42223da, 0x24020001,
4388 0x3c010800, 0xac221bb8, 0x24630001, 0x0085202a, 0x3c010800, 0x10800003,
4389 0xac231b80, 0x3c010800, 0xa4251b94, 0x3c060800, 0x24c61b9c, 0x8cc20000,
4390 0x24420001, 0xacc20000, 0x28420080, 0x14400005, 0x00000000, 0x0e000656,
4391 0x24040002, 0x0a0001e6, 0x00000000, 0x3c020800, 0x8c421bb8, 0x10400078,
4392 0x24020001, 0x3c050800, 0x90a51b98, 0x14a20072, 0x00000000, 0x3c150800,
4393 0x96b51b96, 0x3c040800, 0x8c841bac, 0x32a3ffff, 0x0083102a, 0x1440006c,
4394 0x00000000, 0x14830003, 0x00000000, 0x3c010800, 0xac2523f0, 0x1060005c,
4395 0x00009021, 0x24d60004, 0x0060a021, 0x24d30014, 0x8ec20000, 0x00028100,
4396 0x3c110800, 0x02308821, 0x0e000625, 0x8e311bc8, 0x00402821, 0x10a00054,
4397 0x00000000, 0x9628000a, 0x31020040, 0x10400005, 0x2407180c, 0x8e22000c,
4398 0x2407188c, 0x00021400, 0xaca20018, 0x3c030800, 0x00701821, 0x8c631bd0,
4399 0x3c020800, 0x00501021, 0x8c421bd4, 0x00031d00, 0x00021400, 0x00621825,
4400 0xaca30014, 0x8ec30004, 0x96220008, 0x00432023, 0x3242ffff, 0x3083ffff,
4401 0x00431021, 0x0282102a, 0x14400002, 0x02b23023, 0x00803021, 0x8e620000,
4402 0x30c4ffff, 0x00441021, 0xae620000, 0x8e220000, 0xaca20000, 0x8e220004,
4403 0x8e63fff4, 0x00431021, 0xaca20004, 0xa4a6000e, 0x8e62fff4, 0x00441021,
4404 0xae62fff4, 0x96230008, 0x0043102a, 0x14400005, 0x02469021, 0x8e62fff0,
4405 0xae60fff4, 0x24420001, 0xae62fff0, 0xaca00008, 0x3242ffff, 0x14540008,
4406 0x24020305, 0x31020080, 0x54400001, 0x34e70010, 0x24020905, 0xa4a2000c,
4407 0x0a0001cb, 0x34e70020, 0xa4a2000c, 0x3c020800, 0x8c4223f0, 0x10400003,
4408 0x3c024b65, 0x0a0001d3, 0x34427654, 0x3c02b49a, 0x344289ab, 0xaca2001c,
4409 0x30e2ffff, 0xaca20010, 0x0e0005a2, 0x00a02021, 0x3242ffff, 0x0054102b,
4410 0x1440ffa9, 0x00000000, 0x24020002, 0x3c010800, 0x0a0001e6, 0xa0221b98,
4411 0x8ec2083c, 0x24420001, 0x0a0001e6, 0xaec2083c, 0x0e0004c0, 0x00000000,
4412 0x8fbf002c, 0x8fb60028, 0x8fb50024, 0x8fb40020, 0x8fb3001c, 0x8fb20018,
4413 0x8fb10014, 0x8fb00010, 0x03e00008, 0x27bd0030, 0x27bdffd0, 0xafbf0028,
4414 0xafb30024, 0xafb20020, 0xafb1001c, 0xafb00018, 0x8f725c9c, 0x3c0200ff,
4415 0x3442fff8, 0x3c070800, 0x24e71bb4, 0x02428824, 0x9623000e, 0x8ce20000,
4416 0x00431021, 0xace20000, 0x8e220010, 0x30420020, 0x14400011, 0x00809821,
4417 0x0e00063b, 0x02202021, 0x3c02c000, 0x02421825, 0xaf635c9c, 0x8f625c90,
4418 0x30420002, 0x1040011e, 0x00000000, 0xaf635c9c, 0x8f625c90, 0x30420002,
4419 0x10400119, 0x00000000, 0x0a00020d, 0x00000000, 0x8e240008, 0x8e230014,
4420 0x00041402, 0x000231c0, 0x00031502, 0x304201ff, 0x2442ffff, 0x3042007f,
4421 0x00031942, 0x30637800, 0x00021100, 0x24424000, 0x00624821, 0x9522000a,
4422 0x3084ffff, 0x30420008, 0x104000b0, 0x000429c0, 0x3c020800, 0x8c422400,
4423 0x14400024, 0x24c50008, 0x94c20014, 0x3c010800, 0xa42223d0, 0x8cc40010,
4424 0x00041402, 0x3c010800, 0xa42223d2, 0x3c010800, 0xa42423d4, 0x94c2000e,
4425 0x3083ffff, 0x00431023, 0x3c010800, 0xac222408, 0x94c2001a, 0x3c010800,
4426 0xac262400, 0x3c010800, 0xac322404, 0x3c010800, 0xac2223fc, 0x3c02c000,
4427 0x02421825, 0xaf635c9c, 0x8f625c90, 0x30420002, 0x104000e5, 0x00000000,
4428 0xaf635c9c, 0x8f625c90, 0x30420002, 0x104000e0, 0x00000000, 0x0a000246,
4429 0x00000000, 0x94c2000e, 0x3c030800, 0x946323d4, 0x00434023, 0x3103ffff,
4430 0x2c620008, 0x1040001c, 0x00000000, 0x94c20014, 0x24420028, 0x00a22821,
4431 0x00031042, 0x1840000b, 0x00002021, 0x24e60848, 0x00403821, 0x94a30000,
4432 0x8cc20000, 0x24840001, 0x00431021, 0xacc20000, 0x0087102a, 0x1440fff9,
4433 0x24a50002, 0x31020001, 0x1040001f, 0x3c024000, 0x3c040800, 0x248423fc,
4434 0xa0a00001, 0x94a30000, 0x8c820000, 0x00431021, 0x0a000285, 0xac820000,
4435 0x8f626800, 0x3c030010, 0x00431024, 0x10400009, 0x00000000, 0x94c2001a,
4436 0x3c030800, 0x8c6323fc, 0x00431021, 0x3c010800, 0xac2223fc, 0x0a000286,
4437 0x3c024000, 0x94c2001a, 0x94c4001c, 0x3c030800, 0x8c6323fc, 0x00441023,
4438 0x00621821, 0x3c010800, 0xac2323fc, 0x3c024000, 0x02421825, 0xaf635c9c,
4439 0x8f625c90, 0x30420002, 0x1440fffc, 0x00000000, 0x9522000a, 0x30420010,
4440 0x1040009b, 0x00000000, 0x3c030800, 0x946323d4, 0x3c070800, 0x24e72400,
4441 0x8ce40000, 0x8f626800, 0x24630030, 0x00832821, 0x3c030010, 0x00431024,
4442 0x1440000a, 0x00000000, 0x94a20004, 0x3c040800, 0x8c842408, 0x3c030800,
4443 0x8c6323fc, 0x00441023, 0x00621821, 0x3c010800, 0xac2323fc, 0x3c040800,
4444 0x8c8423fc, 0x00041c02, 0x3082ffff, 0x00622021, 0x00041402, 0x00822021,
4445 0x00041027, 0xa4a20006, 0x3c030800, 0x8c632404, 0x3c0200ff, 0x3442fff8,
4446 0x00628824, 0x96220008, 0x24050001, 0x24034000, 0x000231c0, 0x00801021,
4447 0xa4c2001a, 0xa4c0001c, 0xace00000, 0x3c010800, 0xac251b60, 0xaf635cb8,
4448 0x8f625cb0, 0x30420002, 0x10400003, 0x00000000, 0x3c010800, 0xac201b60,
4449 0x8e220008, 0xaf625cb8, 0x8f625cb0, 0x30420002, 0x10400003, 0x00000000,
4450 0x3c010800, 0xac201b60, 0x3c020800, 0x8c421b60, 0x1040ffec, 0x00000000,
4451 0x3c040800, 0x0e00063b, 0x8c842404, 0x0a00032a, 0x00000000, 0x3c030800,
4452 0x90631b98, 0x24020002, 0x14620003, 0x3c034b65, 0x0a0002e1, 0x00008021,
4453 0x8e22001c, 0x34637654, 0x10430002, 0x24100002, 0x24100001, 0x00c02021,
4454 0x0e000350, 0x02003021, 0x24020003, 0x3c010800, 0xa0221b98, 0x24020002,
4455 0x1202000a, 0x24020001, 0x3c030800, 0x8c6323f0, 0x10620006, 0x00000000,
4456 0x3c020800, 0x944223d8, 0x00021400, 0x0a00031f, 0xae220014, 0x3c040800,
4457 0x248423da, 0x94820000, 0x00021400, 0xae220014, 0x3c020800, 0x8c421bbc,
4458 0x3c03c000, 0x3c010800, 0xa0201b98, 0x00431025, 0xaf625c5c, 0x8f625c50,
4459 0x30420002, 0x10400009, 0x00000000, 0x2484f7e2, 0x8c820000, 0x00431025,
4460 0xaf625c5c, 0x8f625c50, 0x30420002, 0x1440fffa, 0x00000000, 0x3c020800,
4461 0x24421b84, 0x8c430000, 0x24630001, 0xac430000, 0x8f630c14, 0x3063000f,
4462 0x2c620002, 0x1440000c, 0x3c024000, 0x8f630c14, 0x3c020800, 0x8c421b40,
4463 0x3063000f, 0x24420001, 0x3c010800, 0xac221b40, 0x2c620002, 0x1040fff7,
4464 0x00000000, 0x3c024000, 0x02421825, 0xaf635c9c, 0x8f625c90, 0x30420002,
4465 0x1440fffc, 0x00000000, 0x12600003, 0x00000000, 0x0e0004c0, 0x00000000,
4466 0x8fbf0028, 0x8fb30024, 0x8fb20020, 0x8fb1001c, 0x8fb00018, 0x03e00008,
4467 0x27bd0030, 0x8f634450, 0x3c040800, 0x24841b88, 0x8c820000, 0x00031c02,
4468 0x0043102b, 0x14400007, 0x3c038000, 0x8c840004, 0x8f624450, 0x00021c02,
4469 0x0083102b, 0x1040fffc, 0x3c038000, 0xaf634444, 0x8f624444, 0x00431024,
4470 0x1440fffd, 0x00000000, 0x8f624448, 0x03e00008, 0x3042ffff, 0x3c024000,
4471 0x00822025, 0xaf645c38, 0x8f625c30, 0x30420002, 0x1440fffc, 0x00000000,
4472 0x03e00008, 0x00000000, 0x27bdffe0, 0x00805821, 0x14c00011, 0x256e0008,
4473 0x3c020800, 0x8c4223f4, 0x10400007, 0x24020016, 0x3c010800, 0xa42223d2,
4474 0x2402002a, 0x3c010800, 0x0a000364, 0xa42223d4, 0x8d670010, 0x00071402,
4475 0x3c010800, 0xa42223d2, 0x3c010800, 0xa42723d4, 0x3c040800, 0x948423d4,
4476 0x3c030800, 0x946323d2, 0x95cf0006, 0x3c020800, 0x944223d0, 0x00832023,
4477 0x01e2c023, 0x3065ffff, 0x24a20028, 0x01c24821, 0x3082ffff, 0x14c0001a,
4478 0x01226021, 0x9582000c, 0x3042003f, 0x3c010800, 0xa42223d6, 0x95820004,
4479 0x95830006, 0x3c010800, 0xac2023e4, 0x3c010800, 0xac2023e8, 0x00021400,
4480 0x00431025, 0x3c010800, 0xac221bc0, 0x95220004, 0x3c010800, 0xa4221bc4,
4481 0x95230002, 0x01e51023, 0x0043102a, 0x10400010, 0x24020001, 0x3c010800,
4482 0x0a000398, 0xac2223f8, 0x3c030800, 0x8c6323e8, 0x3c020800, 0x94421bc4,
4483 0x00431021, 0xa5220004, 0x3c020800, 0x94421bc0, 0xa5820004, 0x3c020800,
4484 0x8c421bc0, 0xa5820006, 0x3c020800, 0x8c4223f0, 0x3c0d0800, 0x8dad23e4,
4485 0x3c0a0800, 0x144000e5, 0x8d4a23e8, 0x3c020800, 0x94421bc4, 0x004a1821,
4486 0x3063ffff, 0x0062182b, 0x24020002, 0x10c2000d, 0x01435023, 0x3c020800,
4487 0x944223d6, 0x30420009, 0x10400008, 0x00000000, 0x9582000c, 0x3042fff6,
4488 0xa582000c, 0x3c020800, 0x944223d6, 0x30420009, 0x01a26823, 0x3c020800,
4489 0x8c4223f8, 0x1040004a, 0x01203821, 0x3c020800, 0x944223d2, 0x00004021,
4490 0xa520000a, 0x01e21023, 0xa5220002, 0x3082ffff, 0x00021042, 0x18400008,
4491 0x00003021, 0x00401821, 0x94e20000, 0x25080001, 0x00c23021, 0x0103102a,
4492 0x1440fffb, 0x24e70002, 0x00061c02, 0x30c2ffff, 0x00623021, 0x00061402,
4493 0x00c23021, 0x00c02821, 0x00061027, 0xa522000a, 0x00003021, 0x2527000c,
4494 0x00004021, 0x94e20000, 0x25080001, 0x00c23021, 0x2d020004, 0x1440fffb,
4495 0x24e70002, 0x95220002, 0x00004021, 0x91230009, 0x00442023, 0x01803821,
4496 0x3082ffff, 0xa4e00010, 0x00621821, 0x00021042, 0x18400010, 0x00c33021,
4497 0x00404821, 0x94e20000, 0x24e70002, 0x00c23021, 0x30e2007f, 0x14400006,
4498 0x25080001, 0x8d630000, 0x3c02007f, 0x3442ff80, 0x00625824, 0x25670008,
4499 0x0109102a, 0x1440fff3, 0x00000000, 0x30820001, 0x10400005, 0x00061c02,
4500 0xa0e00001, 0x94e20000, 0x00c23021, 0x00061c02, 0x30c2ffff, 0x00623021,
4501 0x00061402, 0x00c23021, 0x0a00047d, 0x30c6ffff, 0x24020002, 0x14c20081,
4502 0x00000000, 0x3c020800, 0x8c42240c, 0x14400007, 0x00000000, 0x3c020800,
4503 0x944223d2, 0x95230002, 0x01e21023, 0x10620077, 0x00000000, 0x3c020800,
4504 0x944223d2, 0x01e21023, 0xa5220002, 0x3c020800, 0x8c42240c, 0x1040001a,
4505 0x31e3ffff, 0x8dc70010, 0x3c020800, 0x94421b96, 0x00e04021, 0x00072c02,
4506 0x00aa2021, 0x00431023, 0x00823823, 0x00072402, 0x30e2ffff, 0x00823821,
4507 0x00071027, 0xa522000a, 0x3102ffff, 0x3c040800, 0x948423d4, 0x00453023,
4508 0x00e02821, 0x00641823, 0x006d1821, 0x00c33021, 0x00061c02, 0x30c2ffff,
4509 0x0a00047d, 0x00623021, 0x01203821, 0x00004021, 0x3082ffff, 0x00021042,
4510 0x18400008, 0x00003021, 0x00401821, 0x94e20000, 0x25080001, 0x00c23021,
4511 0x0103102a, 0x1440fffb, 0x24e70002, 0x00061c02, 0x30c2ffff, 0x00623021,
4512 0x00061402, 0x00c23021, 0x00c02821, 0x00061027, 0xa522000a, 0x00003021,
4513 0x2527000c, 0x00004021, 0x94e20000, 0x25080001, 0x00c23021, 0x2d020004,
4514 0x1440fffb, 0x24e70002, 0x95220002, 0x00004021, 0x91230009, 0x00442023,
4515 0x01803821, 0x3082ffff, 0xa4e00010, 0x3c040800, 0x948423d4, 0x00621821,
4516 0x00c33021, 0x00061c02, 0x30c2ffff, 0x00623021, 0x00061c02, 0x3c020800,
4517 0x944223d0, 0x00c34821, 0x00441023, 0x00021fc2, 0x00431021, 0x00021043,
4518 0x18400010, 0x00003021, 0x00402021, 0x94e20000, 0x24e70002, 0x00c23021,
4519 0x30e2007f, 0x14400006, 0x25080001, 0x8d630000, 0x3c02007f, 0x3442ff80,
4520 0x00625824, 0x25670008, 0x0104102a, 0x1440fff3, 0x00000000, 0x3c020800,
4521 0x944223ec, 0x00c23021, 0x3122ffff, 0x00c23021, 0x00061c02, 0x30c2ffff,
4522 0x00623021, 0x00061402, 0x00c23021, 0x00c04021, 0x00061027, 0xa5820010,
4523 0xadc00014, 0x0a00049d, 0xadc00000, 0x8dc70010, 0x00e04021, 0x11400007,
4524 0x00072c02, 0x00aa3021, 0x00061402, 0x30c3ffff, 0x00433021, 0x00061402,
4525 0x00c22821, 0x00051027, 0xa522000a, 0x3c030800, 0x946323d4, 0x3102ffff,
4526 0x01e21021, 0x00433023, 0x00cd3021, 0x00061c02, 0x30c2ffff, 0x00623021,
4527 0x00061402, 0x00c23021, 0x00c04021, 0x00061027, 0xa5820010, 0x3102ffff,
4528 0x00051c00, 0x00431025, 0xadc20010, 0x3c020800, 0x8c4223f4, 0x10400005,
4529 0x2de205eb, 0x14400002, 0x25e2fff2, 0x34028870, 0xa5c20034, 0x3c030800,
4530 0x246323e8, 0x8c620000, 0x24420001, 0xac620000, 0x3c040800, 0x8c8423e4,
4531 0x3c020800, 0x8c421bc0, 0x3303ffff, 0x00832021, 0x00431821, 0x0062102b,
4532 0x3c010800, 0xac2423e4, 0x10400003, 0x2482ffff, 0x3c010800, 0xac2223e4,
4533 0x3c010800, 0xac231bc0, 0x03e00008, 0x27bd0020, 0x27bdffb8, 0x3c050800,
4534 0x24a51b96, 0xafbf0044, 0xafbe0040, 0xafb7003c, 0xafb60038, 0xafb50034,
4535 0xafb40030, 0xafb3002c, 0xafb20028, 0xafb10024, 0xafb00020, 0x94a90000,
4536 0x3c020800, 0x944223d0, 0x3c030800, 0x8c631bb0, 0x3c040800, 0x8c841bac,
4537 0x01221023, 0x0064182a, 0xa7a9001e, 0x106000be, 0xa7a20016, 0x24be0022,
4538 0x97b6001e, 0x24b3001a, 0x24b70016, 0x8fc20000, 0x14400008, 0x00000000,
4539 0x8fc2fff8, 0x97a30016, 0x8fc4fff4, 0x00431021, 0x0082202a, 0x148000b0,
4540 0x00000000, 0x97d50818, 0x32a2ffff, 0x104000a3, 0x00009021, 0x0040a021,
4541 0x00008821, 0x0e000625, 0x00000000, 0x00403021, 0x14c00007, 0x00000000,
4542 0x3c020800, 0x8c4223dc, 0x24420001, 0x3c010800, 0x0a000596, 0xac2223dc,
4543 0x3c100800, 0x02118021, 0x8e101bc8, 0x9608000a, 0x31020040, 0x10400005,
4544 0x2407180c, 0x8e02000c, 0x2407188c, 0x00021400, 0xacc20018, 0x31020080,
4545 0x54400001, 0x34e70010, 0x3c020800, 0x00511021, 0x8c421bd0, 0x3c030800,
4546 0x00711821, 0x8c631bd4, 0x00021500, 0x00031c00, 0x00431025, 0xacc20014,
4547 0x96040008, 0x3242ffff, 0x00821021, 0x0282102a, 0x14400002, 0x02b22823,
4548 0x00802821, 0x8e020000, 0x02459021, 0xacc20000, 0x8e020004, 0x00c02021,
4549 0x26310010, 0xac820004, 0x30e2ffff, 0xac800008, 0xa485000e, 0xac820010,
4550 0x24020305, 0x0e0005a2, 0xa482000c, 0x3242ffff, 0x0054102b, 0x1440ffc5,
4551 0x3242ffff, 0x0a00058e, 0x00000000, 0x8e620000, 0x8e63fffc, 0x0043102a,
4552 0x10400067, 0x00000000, 0x8e62fff0, 0x00028900, 0x3c100800, 0x02118021,
4553 0x0e000625, 0x8e101bc8, 0x00403021, 0x14c00005, 0x00000000, 0x8e62082c,
4554 0x24420001, 0x0a000596, 0xae62082c, 0x9608000a, 0x31020040, 0x10400005,
4555 0x2407180c, 0x8e02000c, 0x2407188c, 0x00021400, 0xacc20018, 0x3c020800,
4556 0x00511021, 0x8c421bd0, 0x3c030800, 0x00711821, 0x8c631bd4, 0x00021500,
4557 0x00031c00, 0x00431025, 0xacc20014, 0x8e63fff4, 0x96020008, 0x00432023,
4558 0x3242ffff, 0x3083ffff, 0x00431021, 0x02c2102a, 0x10400003, 0x00802821,
4559 0x97a9001e, 0x01322823, 0x8e620000, 0x30a4ffff, 0x00441021, 0xae620000,
4560 0xa4c5000e, 0x8e020000, 0xacc20000, 0x8e020004, 0x8e63fff4, 0x00431021,
4561 0xacc20004, 0x8e63fff4, 0x96020008, 0x00641821, 0x0062102a, 0x14400006,
4562 0x02459021, 0x8e62fff0, 0xae60fff4, 0x24420001, 0x0a000571, 0xae62fff0,
4563 0xae63fff4, 0xacc00008, 0x3242ffff, 0x10560003, 0x31020004, 0x10400006,
4564 0x24020305, 0x31020080, 0x54400001, 0x34e70010, 0x34e70020, 0x24020905,
4565 0xa4c2000c, 0x8ee30000, 0x8ee20004, 0x14620007, 0x3c02b49a, 0x8ee20860,
4566 0x54400001, 0x34e70400, 0x3c024b65, 0x0a000588, 0x34427654, 0x344289ab,
4567 0xacc2001c, 0x30e2ffff, 0xacc20010, 0x0e0005a2, 0x00c02021, 0x3242ffff,
4568 0x0056102b, 0x1440ff9b, 0x00000000, 0x8e620000, 0x8e63fffc, 0x0043102a,
4569 0x1440ff48, 0x00000000, 0x8fbf0044, 0x8fbe0040, 0x8fb7003c, 0x8fb60038,
4570 0x8fb50034, 0x8fb40030, 0x8fb3002c, 0x8fb20028, 0x8fb10024, 0x8fb00020,
4571 0x03e00008, 0x27bd0048, 0x27bdffe8, 0xafbf0014, 0xafb00010, 0x8f624450,
4572 0x8f634410, 0x0a0005b1, 0x00808021, 0x8f626820, 0x30422000, 0x10400003,
4573 0x00000000, 0x0e0001f0, 0x00002021, 0x8f624450, 0x8f634410, 0x3042ffff,
4574 0x0043102b, 0x1440fff5, 0x00000000, 0x8f630c14, 0x3063000f, 0x2c620002,
4575 0x1440000b, 0x00000000, 0x8f630c14, 0x3c020800, 0x8c421b40, 0x3063000f,
4576 0x24420001, 0x3c010800, 0xac221b40, 0x2c620002, 0x1040fff7, 0x00000000,
4577 0xaf705c18, 0x8f625c10, 0x30420002, 0x10400009, 0x00000000, 0x8f626820,
4578 0x30422000, 0x1040fff8, 0x00000000, 0x0e0001f0, 0x00002021, 0x0a0005c4,
4579 0x00000000, 0x8fbf0014, 0x8fb00010, 0x03e00008, 0x27bd0018, 0x00000000,
4580 0x00000000, 0x00000000, 0x27bdffe8, 0x3c1bc000, 0xafbf0014, 0xafb00010,
4581 0xaf60680c, 0x8f626804, 0x34420082, 0xaf626804, 0x8f634000, 0x24020b50,
4582 0x3c010800, 0xac221b54, 0x24020b78, 0x3c010800, 0xac221b64, 0x34630002,
4583 0xaf634000, 0x0e000605, 0x00808021, 0x3c010800, 0xa0221b68, 0x304200ff,
4584 0x24030002, 0x14430005, 0x00000000, 0x3c020800, 0x8c421b54, 0x0a0005f8,
4585 0xac5000c0, 0x3c020800, 0x8c421b54, 0xac5000bc, 0x8f624434, 0x8f634438,
4586 0x8f644410, 0x3c010800, 0xac221b5c, 0x3c010800, 0xac231b6c, 0x3c010800,
4587 0xac241b58, 0x8fbf0014, 0x8fb00010, 0x03e00008, 0x27bd0018, 0x3c040800,
4588 0x8c870000, 0x3c03aa55, 0x3463aa55, 0x3c06c003, 0xac830000, 0x8cc20000,
4589 0x14430007, 0x24050002, 0x3c0355aa, 0x346355aa, 0xac830000, 0x8cc20000,
4590 0x50430001, 0x24050001, 0x3c020800, 0xac470000, 0x03e00008, 0x00a01021,
4591 0x27bdfff8, 0x18800009, 0x00002821, 0x8f63680c, 0x8f62680c, 0x1043fffe,
4592 0x00000000, 0x24a50001, 0x00a4102a, 0x1440fff9, 0x00000000, 0x03e00008,
4593 0x27bd0008, 0x8f634450, 0x3c020800, 0x8c421b5c, 0x00031c02, 0x0043102b,
4594 0x14400008, 0x3c038000, 0x3c040800, 0x8c841b6c, 0x8f624450, 0x00021c02,
4595 0x0083102b, 0x1040fffc, 0x3c038000, 0xaf634444, 0x8f624444, 0x00431024,
4596 0x1440fffd, 0x00000000, 0x8f624448, 0x03e00008, 0x3042ffff, 0x3082ffff,
4597 0x2442e000, 0x2c422001, 0x14400003, 0x3c024000, 0x0a000648, 0x2402ffff,
4598 0x00822025, 0xaf645c38, 0x8f625c30, 0x30420002, 0x1440fffc, 0x00001021,
4599 0x03e00008, 0x00000000, 0x8f624450, 0x3c030800, 0x8c631b58, 0x0a000651,
4600 0x3042ffff, 0x8f624450, 0x3042ffff, 0x0043102b, 0x1440fffc, 0x00000000,
4601 0x03e00008, 0x00000000, 0x27bdffe0, 0x00802821, 0x3c040800, 0x24841af0,
4602 0x00003021, 0x00003821, 0xafbf0018, 0xafa00010, 0x0e00067c, 0xafa00014,
4603 0x0a000660, 0x00000000, 0x8fbf0018, 0x03e00008, 0x27bd0020, 0x00000000,
4604 0x00000000, 0x00000000, 0x3c020800, 0x34423000, 0x3c030800, 0x34633000,
4605 0x3c040800, 0x348437ff, 0x3c010800, 0xac221b74, 0x24020040, 0x3c010800,
4606 0xac221b78, 0x3c010800, 0xac201b70, 0xac600000, 0x24630004, 0x0083102b,
4607 0x5040fffd, 0xac600000, 0x03e00008, 0x00000000, 0x00804821, 0x8faa0010,
4608 0x3c020800, 0x8c421b70, 0x3c040800, 0x8c841b78, 0x8fab0014, 0x24430001,
4609 0x0044102b, 0x3c010800, 0xac231b70, 0x14400003, 0x00004021, 0x3c010800,
4610 0xac201b70, 0x3c020800, 0x8c421b70, 0x3c030800, 0x8c631b74, 0x91240000,
4611 0x00021140, 0x00431021, 0x00481021, 0x25080001, 0xa0440000, 0x29020008,
4612 0x1440fff4, 0x25290001, 0x3c020800, 0x8c421b70, 0x3c030800, 0x8c631b74,
4613 0x8f64680c, 0x00021140, 0x00431021, 0xac440008, 0xac45000c, 0xac460010,
4614 0xac470014, 0xac4a0018, 0x03e00008, 0xac4b001c, 0x00000000, 0x00000000,
4617 static u32 tg3TsoFwRodata[] = {
4618 0x4d61696e, 0x43707542, 0x00000000, 0x4d61696e, 0x43707541, 0x00000000,
4619 0x00000000, 0x00000000, 0x73746b6f, 0x66666c64, 0x496e0000, 0x73746b6f,
4620 0x66662a2a, 0x00000000, 0x53774576, 0x656e7430, 0x00000000, 0x00000000,
4621 0x00000000, 0x00000000, 0x66617461, 0x6c457272, 0x00000000, 0x00000000,
4622 0x00000000,
4625 static u32 tg3TsoFwData[] = {
4626 0x00000000, 0x73746b6f, 0x66666c64, 0x5f76312e, 0x362e3000, 0x00000000,
4627 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
4628 0x00000000,
4631 /* 5705 needs a special version of the TSO firmware. */
4632 #define TG3_TSO5_FW_RELEASE_MAJOR 0x1
4633 #define TG3_TSO5_FW_RELASE_MINOR 0x2
4634 #define TG3_TSO5_FW_RELEASE_FIX 0x0
4635 #define TG3_TSO5_FW_START_ADDR 0x00010000
4636 #define TG3_TSO5_FW_TEXT_ADDR 0x00010000
4637 #define TG3_TSO5_FW_TEXT_LEN 0xe90
4638 #define TG3_TSO5_FW_RODATA_ADDR 0x00010e90
4639 #define TG3_TSO5_FW_RODATA_LEN 0x50
4640 #define TG3_TSO5_FW_DATA_ADDR 0x00010f00
4641 #define TG3_TSO5_FW_DATA_LEN 0x20
4642 #define TG3_TSO5_FW_SBSS_ADDR 0x00010f20
4643 #define TG3_TSO5_FW_SBSS_LEN 0x28
4644 #define TG3_TSO5_FW_BSS_ADDR 0x00010f50
4645 #define TG3_TSO5_FW_BSS_LEN 0x88
4647 static u32 tg3Tso5FwText[(TG3_TSO5_FW_TEXT_LEN / 4) + 1] = {
4648 0x0c004003, 0x00000000, 0x00010f04, 0x00000000, 0x10000003, 0x00000000,
4649 0x0000000d, 0x0000000d, 0x3c1d0001, 0x37bde000, 0x03a0f021, 0x3c100001,
4650 0x26100000, 0x0c004010, 0x00000000, 0x0000000d, 0x27bdffe0, 0x3c04fefe,
4651 0xafbf0018, 0x0c0042e8, 0x34840002, 0x0c004364, 0x00000000, 0x3c030001,
4652 0x90630f34, 0x24020002, 0x3c040001, 0x24840e9c, 0x14620003, 0x24050001,
4653 0x3c040001, 0x24840e90, 0x24060002, 0x00003821, 0xafa00010, 0x0c004378,
4654 0xafa00014, 0x0c00402c, 0x00000000, 0x8fbf0018, 0x03e00008, 0x27bd0020,
4655 0x00000000, 0x00000000, 0x27bdffe0, 0xafbf001c, 0xafb20018, 0xafb10014,
4656 0x0c0042d4, 0xafb00010, 0x3c128000, 0x24110001, 0x8f706810, 0x32020400,
4657 0x10400007, 0x00000000, 0x8f641008, 0x00921024, 0x14400003, 0x00000000,
4658 0x0c004064, 0x00000000, 0x3c020001, 0x90420f56, 0x10510003, 0x32020200,
4659 0x1040fff1, 0x00000000, 0x0c0041b4, 0x00000000, 0x08004034, 0x00000000,
4660 0x8fbf001c, 0x8fb20018, 0x8fb10014, 0x8fb00010, 0x03e00008, 0x27bd0020,
4661 0x27bdffe0, 0x3c040001, 0x24840eb0, 0x00002821, 0x00003021, 0x00003821,
4662 0xafbf0018, 0xafa00010, 0x0c004378, 0xafa00014, 0x0000d021, 0x24020130,
4663 0xaf625000, 0x3c010001, 0xa4200f50, 0x3c010001, 0xa0200f57, 0x8fbf0018,
4664 0x03e00008, 0x27bd0020, 0x00000000, 0x00000000, 0x3c030001, 0x24630f60,
4665 0x90620000, 0x27bdfff0, 0x14400003, 0x0080c021, 0x08004073, 0x00004821,
4666 0x3c022000, 0x03021024, 0x10400003, 0x24090002, 0x08004073, 0xa0600000,
4667 0x24090001, 0x00181040, 0x30431f80, 0x346f8008, 0x1520004b, 0x25eb0028,
4668 0x3c040001, 0x00832021, 0x8c848010, 0x3c050001, 0x24a50f7a, 0x00041402,
4669 0xa0a20000, 0x3c010001, 0xa0240f7b, 0x3c020001, 0x00431021, 0x94428014,
4670 0x3c010001, 0xa0220f7c, 0x3c0c0001, 0x01836021, 0x8d8c8018, 0x304200ff,
4671 0x24420008, 0x000220c3, 0x24020001, 0x3c010001, 0xa0220f60, 0x0124102b,
4672 0x1040000c, 0x00003821, 0x24a6000e, 0x01602821, 0x8ca20000, 0x8ca30004,
4673 0x24a50008, 0x24e70001, 0xacc20000, 0xacc30004, 0x00e4102b, 0x1440fff8,
4674 0x24c60008, 0x00003821, 0x3c080001, 0x25080f7b, 0x91060000, 0x3c020001,
4675 0x90420f7c, 0x2503000d, 0x00c32821, 0x00461023, 0x00021fc2, 0x00431021,
4676 0x00021043, 0x1840000c, 0x00002021, 0x91020001, 0x00461023, 0x00021fc2,
4677 0x00431021, 0x00021843, 0x94a20000, 0x24e70001, 0x00822021, 0x00e3102a,
4678 0x1440fffb, 0x24a50002, 0x00041c02, 0x3082ffff, 0x00622021, 0x00041402,
4679 0x00822021, 0x3c02ffff, 0x01821024, 0x3083ffff, 0x00431025, 0x3c010001,
4680 0x080040fa, 0xac220f80, 0x3c050001, 0x24a50f7c, 0x90a20000, 0x3c0c0001,
4681 0x01836021, 0x8d8c8018, 0x000220c2, 0x1080000e, 0x00003821, 0x01603021,
4682 0x24a5000c, 0x8ca20000, 0x8ca30004, 0x24a50008, 0x24e70001, 0xacc20000,
4683 0xacc30004, 0x00e4102b, 0x1440fff8, 0x24c60008, 0x3c050001, 0x24a50f7c,
4684 0x90a20000, 0x30430007, 0x24020004, 0x10620011, 0x28620005, 0x10400005,
4685 0x24020002, 0x10620008, 0x000710c0, 0x080040fa, 0x00000000, 0x24020006,
4686 0x1062000e, 0x000710c0, 0x080040fa, 0x00000000, 0x00a21821, 0x9463000c,
4687 0x004b1021, 0x080040fa, 0xa4430000, 0x000710c0, 0x00a21821, 0x8c63000c,
4688 0x004b1021, 0x080040fa, 0xac430000, 0x00a21821, 0x8c63000c, 0x004b2021,
4689 0x00a21021, 0xac830000, 0x94420010, 0xa4820004, 0x95e70006, 0x3c020001,
4690 0x90420f7c, 0x3c030001, 0x90630f7a, 0x00e2c823, 0x3c020001, 0x90420f7b,
4691 0x24630028, 0x01e34021, 0x24420028, 0x15200012, 0x01e23021, 0x94c2000c,
4692 0x3c010001, 0xa4220f78, 0x94c20004, 0x94c30006, 0x3c010001, 0xa4200f76,
4693 0x3c010001, 0xa4200f72, 0x00021400, 0x00431025, 0x3c010001, 0xac220f6c,
4694 0x95020004, 0x3c010001, 0x08004124, 0xa4220f70, 0x3c020001, 0x94420f70,
4695 0x3c030001, 0x94630f72, 0x00431021, 0xa5020004, 0x3c020001, 0x94420f6c,
4696 0xa4c20004, 0x3c020001, 0x8c420f6c, 0xa4c20006, 0x3c040001, 0x94840f72,
4697 0x3c020001, 0x94420f70, 0x3c0a0001, 0x954a0f76, 0x00441821, 0x3063ffff,
4698 0x0062182a, 0x24020002, 0x1122000b, 0x00832023, 0x3c030001, 0x94630f78,
4699 0x30620009, 0x10400006, 0x3062fff6, 0xa4c2000c, 0x3c020001, 0x94420f78,
4700 0x30420009, 0x01425023, 0x24020001, 0x1122001b, 0x29220002, 0x50400005,
4701 0x24020002, 0x11200007, 0x31a2ffff, 0x08004197, 0x00000000, 0x1122001d,
4702 0x24020016, 0x08004197, 0x31a2ffff, 0x3c0e0001, 0x95ce0f80, 0x10800005,
4703 0x01806821, 0x01c42021, 0x00041c02, 0x3082ffff, 0x00627021, 0x000e1027,
4704 0xa502000a, 0x3c030001, 0x90630f7b, 0x31a2ffff, 0x00e21021, 0x0800418d,
4705 0x00432023, 0x3c020001, 0x94420f80, 0x00442021, 0x00041c02, 0x3082ffff,
4706 0x00622021, 0x00807021, 0x00041027, 0x08004185, 0xa502000a, 0x3c050001,
4707 0x24a50f7a, 0x90a30000, 0x14620002, 0x24e2fff2, 0xa5e20034, 0x90a20000,
4708 0x00e21023, 0xa5020002, 0x3c030001, 0x94630f80, 0x3c020001, 0x94420f5a,
4709 0x30e5ffff, 0x00641821, 0x00451023, 0x00622023, 0x00041c02, 0x3082ffff,
4710 0x00622021, 0x00041027, 0xa502000a, 0x3c030001, 0x90630f7c, 0x24620001,
4711 0x14a20005, 0x00807021, 0x01631021, 0x90420000, 0x08004185, 0x00026200,
4712 0x24620002, 0x14a20003, 0x306200fe, 0x004b1021, 0x944c0000, 0x3c020001,
4713 0x94420f82, 0x3183ffff, 0x3c040001, 0x90840f7b, 0x00431021, 0x00e21021,
4714 0x00442023, 0x008a2021, 0x00041c02, 0x3082ffff, 0x00622021, 0x00041402,
4715 0x00822021, 0x00806821, 0x00041027, 0xa4c20010, 0x31a2ffff, 0x000e1c00,
4716 0x00431025, 0x3c040001, 0x24840f72, 0xade20010, 0x94820000, 0x3c050001,
4717 0x94a50f76, 0x3c030001, 0x8c630f6c, 0x24420001, 0x00b92821, 0xa4820000,
4718 0x3322ffff, 0x00622021, 0x0083182b, 0x3c010001, 0xa4250f76, 0x10600003,
4719 0x24a2ffff, 0x3c010001, 0xa4220f76, 0x3c024000, 0x03021025, 0x3c010001,
4720 0xac240f6c, 0xaf621008, 0x03e00008, 0x27bd0010, 0x3c030001, 0x90630f56,
4721 0x27bdffe8, 0x24020001, 0xafbf0014, 0x10620026, 0xafb00010, 0x8f620cf4,
4722 0x2442ffff, 0x3042007f, 0x00021100, 0x8c434000, 0x3c010001, 0xac230f64,
4723 0x8c434008, 0x24444000, 0x8c5c4004, 0x30620040, 0x14400002, 0x24020088,
4724 0x24020008, 0x3c010001, 0xa4220f68, 0x30620004, 0x10400005, 0x24020001,
4725 0x3c010001, 0xa0220f57, 0x080041d5, 0x00031402, 0x3c010001, 0xa0200f57,
4726 0x00031402, 0x3c010001, 0xa4220f54, 0x9483000c, 0x24020001, 0x3c010001,
4727 0xa4200f50, 0x3c010001, 0xa0220f56, 0x3c010001, 0xa4230f62, 0x24020001,
4728 0x1342001e, 0x00000000, 0x13400005, 0x24020003, 0x13420067, 0x00000000,
4729 0x080042cf, 0x00000000, 0x3c020001, 0x94420f62, 0x241a0001, 0x3c010001,
4730 0xa4200f5e, 0x3c010001, 0xa4200f52, 0x304407ff, 0x00021bc2, 0x00031823,
4731 0x3063003e, 0x34630036, 0x00021242, 0x3042003c, 0x00621821, 0x3c010001,
4732 0xa4240f58, 0x00832021, 0x24630030, 0x3c010001, 0xa4240f5a, 0x3c010001,
4733 0xa4230f5c, 0x3c060001, 0x24c60f52, 0x94c50000, 0x94c30002, 0x3c040001,
4734 0x94840f5a, 0x00651021, 0x0044102a, 0x10400013, 0x3c108000, 0x00a31021,
4735 0xa4c20000, 0x3c02a000, 0xaf620cf4, 0x3c010001, 0xa0200f56, 0x8f641008,
4736 0x00901024, 0x14400003, 0x00000000, 0x0c004064, 0x00000000, 0x8f620cf4,
4737 0x00501024, 0x104000b7, 0x00000000, 0x0800420f, 0x00000000, 0x3c030001,
4738 0x94630f50, 0x00851023, 0xa4c40000, 0x00621821, 0x3042ffff, 0x3c010001,
4739 0xa4230f50, 0xaf620ce8, 0x3c020001, 0x94420f68, 0x34420024, 0xaf620cec,
4740 0x94c30002, 0x3c020001, 0x94420f50, 0x14620012, 0x3c028000, 0x3c108000,
4741 0x3c02a000, 0xaf620cf4, 0x3c010001, 0xa0200f56, 0x8f641008, 0x00901024,
4742 0x14400003, 0x00000000, 0x0c004064, 0x00000000, 0x8f620cf4, 0x00501024,
4743 0x1440fff7, 0x00000000, 0x080042cf, 0x241a0003, 0xaf620cf4, 0x3c108000,
4744 0x8f641008, 0x00901024, 0x14400003, 0x00000000, 0x0c004064, 0x00000000,
4745 0x8f620cf4, 0x00501024, 0x1440fff7, 0x00000000, 0x080042cf, 0x241a0003,
4746 0x3c070001, 0x24e70f50, 0x94e20000, 0x03821021, 0xaf620ce0, 0x3c020001,
4747 0x8c420f64, 0xaf620ce4, 0x3c050001, 0x94a50f54, 0x94e30000, 0x3c040001,
4748 0x94840f58, 0x3c020001, 0x94420f5e, 0x00a32823, 0x00822023, 0x30a6ffff,
4749 0x3083ffff, 0x00c3102b, 0x14400043, 0x00000000, 0x3c020001, 0x94420f5c,
4750 0x00021400, 0x00621025, 0xaf620ce8, 0x94e20000, 0x3c030001, 0x94630f54,
4751 0x00441021, 0xa4e20000, 0x3042ffff, 0x14430021, 0x3c020008, 0x3c020001,
4752 0x90420f57, 0x10400006, 0x3c03000c, 0x3c020001, 0x94420f68, 0x34630624,
4753 0x0800427c, 0x0000d021, 0x3c020001, 0x94420f68, 0x3c030008, 0x34630624,
4754 0x00431025, 0xaf620cec, 0x3c108000, 0x3c02a000, 0xaf620cf4, 0x3c010001,
4755 0xa0200f56, 0x8f641008, 0x00901024, 0x14400003, 0x00000000, 0x0c004064,
4756 0x00000000, 0x8f620cf4, 0x00501024, 0x10400015, 0x00000000, 0x08004283,
4757 0x00000000, 0x3c030001, 0x94630f68, 0x34420624, 0x3c108000, 0x00621825,
4758 0x3c028000, 0xaf630cec, 0xaf620cf4, 0x8f641008, 0x00901024, 0x14400003,
4759 0x00000000, 0x0c004064, 0x00000000, 0x8f620cf4, 0x00501024, 0x1440fff7,
4760 0x00000000, 0x3c010001, 0x080042cf, 0xa4200f5e, 0x3c020001, 0x94420f5c,
4761 0x00021400, 0x00c21025, 0xaf620ce8, 0x3c020001, 0x90420f57, 0x10400009,
4762 0x3c03000c, 0x3c020001, 0x94420f68, 0x34630624, 0x0000d021, 0x00431025,
4763 0xaf620cec, 0x080042c1, 0x3c108000, 0x3c020001, 0x94420f68, 0x3c030008,
4764 0x34630604, 0x00431025, 0xaf620cec, 0x3c020001, 0x94420f5e, 0x00451021,
4765 0x3c010001, 0xa4220f5e, 0x3c108000, 0x3c02a000, 0xaf620cf4, 0x3c010001,
4766 0xa0200f56, 0x8f641008, 0x00901024, 0x14400003, 0x00000000, 0x0c004064,
4767 0x00000000, 0x8f620cf4, 0x00501024, 0x1440fff7, 0x00000000, 0x8fbf0014,
4768 0x8fb00010, 0x03e00008, 0x27bd0018, 0x00000000, 0x27bdffe0, 0x3c040001,
4769 0x24840ec0, 0x00002821, 0x00003021, 0x00003821, 0xafbf0018, 0xafa00010,
4770 0x0c004378, 0xafa00014, 0x0000d021, 0x24020130, 0xaf625000, 0x3c010001,
4771 0xa4200f50, 0x3c010001, 0xa0200f57, 0x8fbf0018, 0x03e00008, 0x27bd0020,
4772 0x27bdffe8, 0x3c1bc000, 0xafbf0014, 0xafb00010, 0xaf60680c, 0x8f626804,
4773 0x34420082, 0xaf626804, 0x8f634000, 0x24020b50, 0x3c010001, 0xac220f20,
4774 0x24020b78, 0x3c010001, 0xac220f30, 0x34630002, 0xaf634000, 0x0c004315,
4775 0x00808021, 0x3c010001, 0xa0220f34, 0x304200ff, 0x24030002, 0x14430005,
4776 0x00000000, 0x3c020001, 0x8c420f20, 0x08004308, 0xac5000c0, 0x3c020001,
4777 0x8c420f20, 0xac5000bc, 0x8f624434, 0x8f634438, 0x8f644410, 0x3c010001,
4778 0xac220f28, 0x3c010001, 0xac230f38, 0x3c010001, 0xac240f24, 0x8fbf0014,
4779 0x8fb00010, 0x03e00008, 0x27bd0018, 0x03e00008, 0x24020001, 0x27bdfff8,
4780 0x18800009, 0x00002821, 0x8f63680c, 0x8f62680c, 0x1043fffe, 0x00000000,
4781 0x24a50001, 0x00a4102a, 0x1440fff9, 0x00000000, 0x03e00008, 0x27bd0008,
4782 0x8f634450, 0x3c020001, 0x8c420f28, 0x00031c02, 0x0043102b, 0x14400008,
4783 0x3c038000, 0x3c040001, 0x8c840f38, 0x8f624450, 0x00021c02, 0x0083102b,
4784 0x1040fffc, 0x3c038000, 0xaf634444, 0x8f624444, 0x00431024, 0x1440fffd,
4785 0x00000000, 0x8f624448, 0x03e00008, 0x3042ffff, 0x3082ffff, 0x2442e000,
4786 0x2c422001, 0x14400003, 0x3c024000, 0x08004347, 0x2402ffff, 0x00822025,
4787 0xaf645c38, 0x8f625c30, 0x30420002, 0x1440fffc, 0x00001021, 0x03e00008,
4788 0x00000000, 0x8f624450, 0x3c030001, 0x8c630f24, 0x08004350, 0x3042ffff,
4789 0x8f624450, 0x3042ffff, 0x0043102b, 0x1440fffc, 0x00000000, 0x03e00008,
4790 0x00000000, 0x27bdffe0, 0x00802821, 0x3c040001, 0x24840ed0, 0x00003021,
4791 0x00003821, 0xafbf0018, 0xafa00010, 0x0c004378, 0xafa00014, 0x0800435f,
4792 0x00000000, 0x8fbf0018, 0x03e00008, 0x27bd0020, 0x3c020001, 0x3442d600,
4793 0x3c030001, 0x3463d600, 0x3c040001, 0x3484ddff, 0x3c010001, 0xac220f40,
4794 0x24020040, 0x3c010001, 0xac220f44, 0x3c010001, 0xac200f3c, 0xac600000,
4795 0x24630004, 0x0083102b, 0x5040fffd, 0xac600000, 0x03e00008, 0x00000000,
4796 0x00804821, 0x8faa0010, 0x3c020001, 0x8c420f3c, 0x3c040001, 0x8c840f44,
4797 0x8fab0014, 0x24430001, 0x0044102b, 0x3c010001, 0xac230f3c, 0x14400003,
4798 0x00004021, 0x3c010001, 0xac200f3c, 0x3c020001, 0x8c420f3c, 0x3c030001,
4799 0x8c630f40, 0x91240000, 0x00021140, 0x00431021, 0x00481021, 0x25080001,
4800 0xa0440000, 0x29020008, 0x1440fff4, 0x25290001, 0x3c020001, 0x8c420f3c,
4801 0x3c030001, 0x8c630f40, 0x8f64680c, 0x00021140, 0x00431021, 0xac440008,
4802 0xac45000c, 0xac460010, 0xac470014, 0xac4a0018, 0x03e00008, 0xac4b001c,
4803 0x00000000, 0x00000000, 0x00000000,
4806 static u32 tg3Tso5FwRodata[(TG3_TSO5_FW_RODATA_LEN / 4) + 1] = {
4807 0x4d61696e, 0x43707542, 0x00000000, 0x4d61696e, 0x43707541, 0x00000000,
4808 0x00000000, 0x00000000, 0x73746b6f, 0x66666c64, 0x00000000, 0x00000000,
4809 0x73746b6f, 0x66666c64, 0x00000000, 0x00000000, 0x66617461, 0x6c457272,
4810 0x00000000, 0x00000000, 0x00000000,
4813 static u32 tg3Tso5FwData[(TG3_TSO5_FW_DATA_LEN / 4) + 1] = {
4814 0x00000000, 0x73746b6f, 0x66666c64, 0x5f76312e, 0x322e3000, 0x00000000,
4815 0x00000000, 0x00000000, 0x00000000,
4818 /* tp->lock is held. */
4819 static int tg3_load_tso_firmware(struct tg3 *tp)
4821 struct fw_info info;
4822 unsigned long cpu_base, cpu_scratch_base, cpu_scratch_size;
4823 int err, i;
4825 if (tp->tg3_flags2 & TG3_FLG2_HW_TSO)
4826 return 0;
4828 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) {
4829 info.text_base = TG3_TSO5_FW_TEXT_ADDR;
4830 info.text_len = TG3_TSO5_FW_TEXT_LEN;
4831 info.text_data = &tg3Tso5FwText[0];
4832 info.rodata_base = TG3_TSO5_FW_RODATA_ADDR;
4833 info.rodata_len = TG3_TSO5_FW_RODATA_LEN;
4834 info.rodata_data = &tg3Tso5FwRodata[0];
4835 info.data_base = TG3_TSO5_FW_DATA_ADDR;
4836 info.data_len = TG3_TSO5_FW_DATA_LEN;
4837 info.data_data = &tg3Tso5FwData[0];
4838 cpu_base = RX_CPU_BASE;
4839 cpu_scratch_base = NIC_SRAM_MBUF_POOL_BASE5705;
4840 cpu_scratch_size = (info.text_len +
4841 info.rodata_len +
4842 info.data_len +
4843 TG3_TSO5_FW_SBSS_LEN +
4844 TG3_TSO5_FW_BSS_LEN);
4845 } else {
4846 info.text_base = TG3_TSO_FW_TEXT_ADDR;
4847 info.text_len = TG3_TSO_FW_TEXT_LEN;
4848 info.text_data = &tg3TsoFwText[0];
4849 info.rodata_base = TG3_TSO_FW_RODATA_ADDR;
4850 info.rodata_len = TG3_TSO_FW_RODATA_LEN;
4851 info.rodata_data = &tg3TsoFwRodata[0];
4852 info.data_base = TG3_TSO_FW_DATA_ADDR;
4853 info.data_len = TG3_TSO_FW_DATA_LEN;
4854 info.data_data = &tg3TsoFwData[0];
4855 cpu_base = TX_CPU_BASE;
4856 cpu_scratch_base = TX_CPU_SCRATCH_BASE;
4857 cpu_scratch_size = TX_CPU_SCRATCH_SIZE;
4860 err = tg3_load_firmware_cpu(tp, cpu_base,
4861 cpu_scratch_base, cpu_scratch_size,
4862 &info);
4863 if (err)
4864 return err;
4866 /* Now startup the cpu. */
4867 tw32(cpu_base + CPU_STATE, 0xffffffff);
4868 tw32_f(cpu_base + CPU_PC, info.text_base);
4870 for (i = 0; i < 5; i++) {
4871 if (tr32(cpu_base + CPU_PC) == info.text_base)
4872 break;
4873 tw32(cpu_base + CPU_STATE, 0xffffffff);
4874 tw32(cpu_base + CPU_MODE, CPU_MODE_HALT);
4875 tw32_f(cpu_base + CPU_PC, info.text_base);
4876 udelay(1000);
4878 if (i >= 5) {
4879 printk(KERN_ERR PFX "tg3_load_tso_firmware fails for %s "
4880 "to set CPU PC, is %08x should be %08x\n",
4881 tp->dev->name, tr32(cpu_base + CPU_PC),
4882 info.text_base);
4883 return -ENODEV;
4885 tw32(cpu_base + CPU_STATE, 0xffffffff);
4886 tw32_f(cpu_base + CPU_MODE, 0x00000000);
4887 return 0;
4890 #endif /* TG3_TSO_SUPPORT != 0 */
4892 /* tp->lock is held. */
4893 static void __tg3_set_mac_addr(struct tg3 *tp)
4895 u32 addr_high, addr_low;
4896 int i;
4898 addr_high = ((tp->dev->dev_addr[0] << 8) |
4899 tp->dev->dev_addr[1]);
4900 addr_low = ((tp->dev->dev_addr[2] << 24) |
4901 (tp->dev->dev_addr[3] << 16) |
4902 (tp->dev->dev_addr[4] << 8) |
4903 (tp->dev->dev_addr[5] << 0));
4904 for (i = 0; i < 4; i++) {
4905 tw32(MAC_ADDR_0_HIGH + (i * 8), addr_high);
4906 tw32(MAC_ADDR_0_LOW + (i * 8), addr_low);
4909 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703 ||
4910 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704) {
4911 for (i = 0; i < 12; i++) {
4912 tw32(MAC_EXTADDR_0_HIGH + (i * 8), addr_high);
4913 tw32(MAC_EXTADDR_0_LOW + (i * 8), addr_low);
4917 addr_high = (tp->dev->dev_addr[0] +
4918 tp->dev->dev_addr[1] +
4919 tp->dev->dev_addr[2] +
4920 tp->dev->dev_addr[3] +
4921 tp->dev->dev_addr[4] +
4922 tp->dev->dev_addr[5]) &
4923 TX_BACKOFF_SEED_MASK;
4924 tw32(MAC_TX_BACKOFF_SEED, addr_high);
4927 static int tg3_set_mac_addr(struct net_device *dev, void *p)
4929 struct tg3 *tp = netdev_priv(dev);
4930 struct sockaddr *addr = p;
4932 memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
4934 spin_lock_irq(&tp->lock);
4935 __tg3_set_mac_addr(tp);
4936 spin_unlock_irq(&tp->lock);
4938 return 0;
4941 /* tp->lock is held. */
4942 static void tg3_set_bdinfo(struct tg3 *tp, u32 bdinfo_addr,
4943 dma_addr_t mapping, u32 maxlen_flags,
4944 u32 nic_addr)
4946 tg3_write_mem(tp,
4947 (bdinfo_addr + TG3_BDINFO_HOST_ADDR + TG3_64BIT_REG_HIGH),
4948 ((u64) mapping >> 32));
4949 tg3_write_mem(tp,
4950 (bdinfo_addr + TG3_BDINFO_HOST_ADDR + TG3_64BIT_REG_LOW),
4951 ((u64) mapping & 0xffffffff));
4952 tg3_write_mem(tp,
4953 (bdinfo_addr + TG3_BDINFO_MAXLEN_FLAGS),
4954 maxlen_flags);
4956 if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS))
4957 tg3_write_mem(tp,
4958 (bdinfo_addr + TG3_BDINFO_NIC_ADDR),
4959 nic_addr);
4962 static void __tg3_set_rx_mode(struct net_device *);
4964 /* tp->lock is held. */
4965 static int tg3_reset_hw(struct tg3 *tp)
4967 u32 val, rdmac_mode;
4968 int i, err, limit;
4970 tg3_disable_ints(tp);
4972 tg3_stop_fw(tp);
4974 tg3_write_sig_pre_reset(tp, RESET_KIND_INIT);
4976 if (tp->tg3_flags & TG3_FLAG_INIT_COMPLETE) {
4977 err = tg3_abort_hw(tp);
4978 if (err)
4979 return err;
4982 err = tg3_chip_reset(tp);
4983 if (err)
4984 return err;
4986 tg3_write_sig_legacy(tp, RESET_KIND_INIT);
4988 /* This works around an issue with Athlon chipsets on
4989 * B3 tigon3 silicon. This bit has no effect on any
4990 * other revision. But do not set this on PCI Express
4991 * chips.
4993 if (!(tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS))
4994 tp->pci_clock_ctrl |= CLOCK_CTRL_DELAY_PCI_GRANT;
4995 tw32_f(TG3PCI_CLOCK_CTRL, tp->pci_clock_ctrl);
4997 if (tp->pci_chip_rev_id == CHIPREV_ID_5704_A0 &&
4998 (tp->tg3_flags & TG3_FLAG_PCIX_MODE)) {
4999 val = tr32(TG3PCI_PCISTATE);
5000 val |= PCISTATE_RETRY_SAME_DMA;
5001 tw32(TG3PCI_PCISTATE, val);
5004 if (GET_CHIP_REV(tp->pci_chip_rev_id) == CHIPREV_5704_BX) {
5005 /* Enable some hw fixes. */
5006 val = tr32(TG3PCI_MSI_DATA);
5007 val |= (1 << 26) | (1 << 28) | (1 << 29);
5008 tw32(TG3PCI_MSI_DATA, val);
5011 /* Descriptor ring init may make accesses to the
5012 * NIC SRAM area to setup the TX descriptors, so we
5013 * can only do this after the hardware has been
5014 * successfully reset.
5016 tg3_init_rings(tp);
5018 /* This value is determined during the probe time DMA
5019 * engine test, tg3_test_dma.
5021 tw32(TG3PCI_DMA_RW_CTRL, tp->dma_rwctrl);
5023 tp->grc_mode &= ~(GRC_MODE_HOST_SENDBDS |
5024 GRC_MODE_4X_NIC_SEND_RINGS |
5025 GRC_MODE_NO_TX_PHDR_CSUM |
5026 GRC_MODE_NO_RX_PHDR_CSUM);
5027 tp->grc_mode |= GRC_MODE_HOST_SENDBDS;
5028 if (tp->tg3_flags & TG3_FLAG_NO_TX_PSEUDO_CSUM)
5029 tp->grc_mode |= GRC_MODE_NO_TX_PHDR_CSUM;
5030 if (tp->tg3_flags & TG3_FLAG_NO_RX_PSEUDO_CSUM)
5031 tp->grc_mode |= GRC_MODE_NO_RX_PHDR_CSUM;
5033 tw32(GRC_MODE,
5034 tp->grc_mode |
5035 (GRC_MODE_IRQ_ON_MAC_ATTN | GRC_MODE_HOST_STACKUP));
5037 /* Setup the timer prescalar register. Clock is always 66Mhz. */
5038 val = tr32(GRC_MISC_CFG);
5039 val &= ~0xff;
5040 val |= (65 << GRC_MISC_CFG_PRESCALAR_SHIFT);
5041 tw32(GRC_MISC_CFG, val);
5043 /* Initialize MBUF/DESC pool. */
5044 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750) {
5045 /* Do nothing. */
5046 } else if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5705) {
5047 tw32(BUFMGR_MB_POOL_ADDR, NIC_SRAM_MBUF_POOL_BASE);
5048 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704)
5049 tw32(BUFMGR_MB_POOL_SIZE, NIC_SRAM_MBUF_POOL_SIZE64);
5050 else
5051 tw32(BUFMGR_MB_POOL_SIZE, NIC_SRAM_MBUF_POOL_SIZE96);
5052 tw32(BUFMGR_DMA_DESC_POOL_ADDR, NIC_SRAM_DMA_DESC_POOL_BASE);
5053 tw32(BUFMGR_DMA_DESC_POOL_SIZE, NIC_SRAM_DMA_DESC_POOL_SIZE);
5055 #if TG3_TSO_SUPPORT != 0
5056 else if (tp->tg3_flags2 & TG3_FLG2_TSO_CAPABLE) {
5057 int fw_len;
5059 fw_len = (TG3_TSO5_FW_TEXT_LEN +
5060 TG3_TSO5_FW_RODATA_LEN +
5061 TG3_TSO5_FW_DATA_LEN +
5062 TG3_TSO5_FW_SBSS_LEN +
5063 TG3_TSO5_FW_BSS_LEN);
5064 fw_len = (fw_len + (0x80 - 1)) & ~(0x80 - 1);
5065 tw32(BUFMGR_MB_POOL_ADDR,
5066 NIC_SRAM_MBUF_POOL_BASE5705 + fw_len);
5067 tw32(BUFMGR_MB_POOL_SIZE,
5068 NIC_SRAM_MBUF_POOL_SIZE5705 - fw_len - 0xa00);
5070 #endif
5072 if (!(tp->tg3_flags & TG3_FLAG_JUMBO_ENABLE)) {
5073 tw32(BUFMGR_MB_RDMA_LOW_WATER,
5074 tp->bufmgr_config.mbuf_read_dma_low_water);
5075 tw32(BUFMGR_MB_MACRX_LOW_WATER,
5076 tp->bufmgr_config.mbuf_mac_rx_low_water);
5077 tw32(BUFMGR_MB_HIGH_WATER,
5078 tp->bufmgr_config.mbuf_high_water);
5079 } else {
5080 tw32(BUFMGR_MB_RDMA_LOW_WATER,
5081 tp->bufmgr_config.mbuf_read_dma_low_water_jumbo);
5082 tw32(BUFMGR_MB_MACRX_LOW_WATER,
5083 tp->bufmgr_config.mbuf_mac_rx_low_water_jumbo);
5084 tw32(BUFMGR_MB_HIGH_WATER,
5085 tp->bufmgr_config.mbuf_high_water_jumbo);
5087 tw32(BUFMGR_DMA_LOW_WATER,
5088 tp->bufmgr_config.dma_low_water);
5089 tw32(BUFMGR_DMA_HIGH_WATER,
5090 tp->bufmgr_config.dma_high_water);
5092 tw32(BUFMGR_MODE, BUFMGR_MODE_ENABLE | BUFMGR_MODE_ATTN_ENABLE);
5093 for (i = 0; i < 2000; i++) {
5094 if (tr32(BUFMGR_MODE) & BUFMGR_MODE_ENABLE)
5095 break;
5096 udelay(10);
5098 if (i >= 2000) {
5099 printk(KERN_ERR PFX "tg3_reset_hw cannot enable BUFMGR for %s.\n",
5100 tp->dev->name);
5101 return -ENODEV;
5104 /* Setup replenish threshold. */
5105 tw32(RCVBDI_STD_THRESH, tp->rx_pending / 8);
5107 /* Initialize TG3_BDINFO's at:
5108 * RCVDBDI_STD_BD: standard eth size rx ring
5109 * RCVDBDI_JUMBO_BD: jumbo frame rx ring
5110 * RCVDBDI_MINI_BD: small frame rx ring (??? does not work)
5112 * like so:
5113 * TG3_BDINFO_HOST_ADDR: high/low parts of DMA address of ring
5114 * TG3_BDINFO_MAXLEN_FLAGS: (rx max buffer size << 16) |
5115 * ring attribute flags
5116 * TG3_BDINFO_NIC_ADDR: location of descriptors in nic SRAM
5118 * Standard receive ring @ NIC_SRAM_RX_BUFFER_DESC, 512 entries.
5119 * Jumbo receive ring @ NIC_SRAM_RX_JUMBO_BUFFER_DESC, 256 entries.
5121 * The size of each ring is fixed in the firmware, but the location is
5122 * configurable.
5124 tw32(RCVDBDI_STD_BD + TG3_BDINFO_HOST_ADDR + TG3_64BIT_REG_HIGH,
5125 ((u64) tp->rx_std_mapping >> 32));
5126 tw32(RCVDBDI_STD_BD + TG3_BDINFO_HOST_ADDR + TG3_64BIT_REG_LOW,
5127 ((u64) tp->rx_std_mapping & 0xffffffff));
5128 tw32(RCVDBDI_STD_BD + TG3_BDINFO_NIC_ADDR,
5129 NIC_SRAM_RX_BUFFER_DESC);
5131 /* Don't even try to program the JUMBO/MINI buffer descriptor
5132 * configs on 5705.
5134 if (tp->tg3_flags2 & TG3_FLG2_5705_PLUS) {
5135 tw32(RCVDBDI_STD_BD + TG3_BDINFO_MAXLEN_FLAGS,
5136 RX_STD_MAX_SIZE_5705 << BDINFO_FLAGS_MAXLEN_SHIFT);
5137 } else {
5138 tw32(RCVDBDI_STD_BD + TG3_BDINFO_MAXLEN_FLAGS,
5139 RX_STD_MAX_SIZE << BDINFO_FLAGS_MAXLEN_SHIFT);
5141 tw32(RCVDBDI_MINI_BD + TG3_BDINFO_MAXLEN_FLAGS,
5142 BDINFO_FLAGS_DISABLED);
5144 /* Setup replenish threshold. */
5145 tw32(RCVBDI_JUMBO_THRESH, tp->rx_jumbo_pending / 8);
5147 if (tp->tg3_flags & TG3_FLAG_JUMBO_ENABLE) {
5148 tw32(RCVDBDI_JUMBO_BD + TG3_BDINFO_HOST_ADDR + TG3_64BIT_REG_HIGH,
5149 ((u64) tp->rx_jumbo_mapping >> 32));
5150 tw32(RCVDBDI_JUMBO_BD + TG3_BDINFO_HOST_ADDR + TG3_64BIT_REG_LOW,
5151 ((u64) tp->rx_jumbo_mapping & 0xffffffff));
5152 tw32(RCVDBDI_JUMBO_BD + TG3_BDINFO_MAXLEN_FLAGS,
5153 RX_JUMBO_MAX_SIZE << BDINFO_FLAGS_MAXLEN_SHIFT);
5154 tw32(RCVDBDI_JUMBO_BD + TG3_BDINFO_NIC_ADDR,
5155 NIC_SRAM_RX_JUMBO_BUFFER_DESC);
5156 } else {
5157 tw32(RCVDBDI_JUMBO_BD + TG3_BDINFO_MAXLEN_FLAGS,
5158 BDINFO_FLAGS_DISABLED);
5163 /* There is only one send ring on 5705/5750, no need to explicitly
5164 * disable the others.
5166 if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS)) {
5167 /* Clear out send RCB ring in SRAM. */
5168 for (i = NIC_SRAM_SEND_RCB; i < NIC_SRAM_RCV_RET_RCB; i += TG3_BDINFO_SIZE)
5169 tg3_write_mem(tp, i + TG3_BDINFO_MAXLEN_FLAGS,
5170 BDINFO_FLAGS_DISABLED);
5173 tp->tx_prod = 0;
5174 tp->tx_cons = 0;
5175 tw32_mailbox(MAILBOX_SNDHOST_PROD_IDX_0 + TG3_64BIT_REG_LOW, 0);
5176 tw32_tx_mbox(MAILBOX_SNDNIC_PROD_IDX_0 + TG3_64BIT_REG_LOW, 0);
5178 tg3_set_bdinfo(tp, NIC_SRAM_SEND_RCB,
5179 tp->tx_desc_mapping,
5180 (TG3_TX_RING_SIZE <<
5181 BDINFO_FLAGS_MAXLEN_SHIFT),
5182 NIC_SRAM_TX_BUFFER_DESC);
5184 /* There is only one receive return ring on 5705/5750, no need
5185 * to explicitly disable the others.
5187 if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS)) {
5188 for (i = NIC_SRAM_RCV_RET_RCB; i < NIC_SRAM_STATS_BLK;
5189 i += TG3_BDINFO_SIZE) {
5190 tg3_write_mem(tp, i + TG3_BDINFO_MAXLEN_FLAGS,
5191 BDINFO_FLAGS_DISABLED);
5195 tp->rx_rcb_ptr = 0;
5196 tw32_rx_mbox(MAILBOX_RCVRET_CON_IDX_0 + TG3_64BIT_REG_LOW, 0);
5198 tg3_set_bdinfo(tp, NIC_SRAM_RCV_RET_RCB,
5199 tp->rx_rcb_mapping,
5200 (TG3_RX_RCB_RING_SIZE(tp) <<
5201 BDINFO_FLAGS_MAXLEN_SHIFT),
5204 tp->rx_std_ptr = tp->rx_pending;
5205 tw32_rx_mbox(MAILBOX_RCV_STD_PROD_IDX + TG3_64BIT_REG_LOW,
5206 tp->rx_std_ptr);
5208 tp->rx_jumbo_ptr = (tp->tg3_flags & TG3_FLAG_JUMBO_ENABLE) ?
5209 tp->rx_jumbo_pending : 0;
5210 tw32_rx_mbox(MAILBOX_RCV_JUMBO_PROD_IDX + TG3_64BIT_REG_LOW,
5211 tp->rx_jumbo_ptr);
5213 /* Initialize MAC address and backoff seed. */
5214 __tg3_set_mac_addr(tp);
5216 /* MTU + ethernet header + FCS + optional VLAN tag */
5217 tw32(MAC_RX_MTU_SIZE, tp->dev->mtu + ETH_HLEN + 8);
5219 /* The slot time is changed by tg3_setup_phy if we
5220 * run at gigabit with half duplex.
5222 tw32(MAC_TX_LENGTHS,
5223 (2 << TX_LENGTHS_IPG_CRS_SHIFT) |
5224 (6 << TX_LENGTHS_IPG_SHIFT) |
5225 (32 << TX_LENGTHS_SLOT_TIME_SHIFT));
5227 /* Receive rules. */
5228 tw32(MAC_RCV_RULE_CFG, RCV_RULE_CFG_DEFAULT_CLASS);
5229 tw32(RCVLPC_CONFIG, 0x0181);
5231 /* Calculate RDMAC_MODE setting early, we need it to determine
5232 * the RCVLPC_STATE_ENABLE mask.
5234 rdmac_mode = (RDMAC_MODE_ENABLE | RDMAC_MODE_TGTABORT_ENAB |
5235 RDMAC_MODE_MSTABORT_ENAB | RDMAC_MODE_PARITYERR_ENAB |
5236 RDMAC_MODE_ADDROFLOW_ENAB | RDMAC_MODE_FIFOOFLOW_ENAB |
5237 RDMAC_MODE_FIFOURUN_ENAB | RDMAC_MODE_FIFOOREAD_ENAB |
5238 RDMAC_MODE_LNGREAD_ENAB);
5239 if (tp->tg3_flags & TG3_FLAG_SPLIT_MODE)
5240 rdmac_mode |= RDMAC_MODE_SPLIT_ENABLE;
5241 if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705 &&
5242 tp->pci_chip_rev_id != CHIPREV_ID_5705_A0) ||
5243 (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750)) {
5244 if (tp->tg3_flags2 & TG3_FLG2_TSO_CAPABLE &&
5245 (tp->pci_chip_rev_id == CHIPREV_ID_5705_A1 ||
5246 tp->pci_chip_rev_id == CHIPREV_ID_5705_A2)) {
5247 rdmac_mode |= RDMAC_MODE_FIFO_SIZE_128;
5248 } else if (!(tr32(TG3PCI_PCISTATE) & PCISTATE_BUS_SPEED_HIGH) &&
5249 !(tp->tg3_flags2 & TG3_FLG2_IS_5788)) {
5250 rdmac_mode |= RDMAC_MODE_FIFO_LONG_BURST;
5254 #if TG3_TSO_SUPPORT != 0
5255 if (tp->tg3_flags2 & TG3_FLG2_HW_TSO)
5256 rdmac_mode |= (1 << 27);
5257 #endif
5259 /* Receive/send statistics. */
5260 if ((rdmac_mode & RDMAC_MODE_FIFO_SIZE_128) &&
5261 (tp->tg3_flags2 & TG3_FLG2_TSO_CAPABLE)) {
5262 val = tr32(RCVLPC_STATS_ENABLE);
5263 val &= ~RCVLPC_STATSENAB_LNGBRST_RFIX;
5264 tw32(RCVLPC_STATS_ENABLE, val);
5265 } else {
5266 tw32(RCVLPC_STATS_ENABLE, 0xffffff);
5268 tw32(RCVLPC_STATSCTRL, RCVLPC_STATSCTRL_ENABLE);
5269 tw32(SNDDATAI_STATSENAB, 0xffffff);
5270 tw32(SNDDATAI_STATSCTRL,
5271 (SNDDATAI_SCTRL_ENABLE |
5272 SNDDATAI_SCTRL_FASTUPD));
5274 /* Setup host coalescing engine. */
5275 tw32(HOSTCC_MODE, 0);
5276 for (i = 0; i < 2000; i++) {
5277 if (!(tr32(HOSTCC_MODE) & HOSTCC_MODE_ENABLE))
5278 break;
5279 udelay(10);
5282 tw32(HOSTCC_RXCOL_TICKS, 0);
5283 tw32(HOSTCC_TXCOL_TICKS, LOW_TXCOL_TICKS);
5284 tw32(HOSTCC_RXMAX_FRAMES, 1);
5285 tw32(HOSTCC_TXMAX_FRAMES, LOW_RXMAX_FRAMES);
5286 if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS)) {
5287 tw32(HOSTCC_RXCOAL_TICK_INT, 0);
5288 tw32(HOSTCC_TXCOAL_TICK_INT, 0);
5290 tw32(HOSTCC_RXCOAL_MAXF_INT, 1);
5291 tw32(HOSTCC_TXCOAL_MAXF_INT, 0);
5293 /* set status block DMA address */
5294 tw32(HOSTCC_STATUS_BLK_HOST_ADDR + TG3_64BIT_REG_HIGH,
5295 ((u64) tp->status_mapping >> 32));
5296 tw32(HOSTCC_STATUS_BLK_HOST_ADDR + TG3_64BIT_REG_LOW,
5297 ((u64) tp->status_mapping & 0xffffffff));
5299 if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS)) {
5300 /* Status/statistics block address. See tg3_timer,
5301 * the tg3_periodic_fetch_stats call there, and
5302 * tg3_get_stats to see how this works for 5705/5750 chips.
5304 tw32(HOSTCC_STAT_COAL_TICKS,
5305 DEFAULT_STAT_COAL_TICKS);
5306 tw32(HOSTCC_STATS_BLK_HOST_ADDR + TG3_64BIT_REG_HIGH,
5307 ((u64) tp->stats_mapping >> 32));
5308 tw32(HOSTCC_STATS_BLK_HOST_ADDR + TG3_64BIT_REG_LOW,
5309 ((u64) tp->stats_mapping & 0xffffffff));
5310 tw32(HOSTCC_STATS_BLK_NIC_ADDR, NIC_SRAM_STATS_BLK);
5311 tw32(HOSTCC_STATUS_BLK_NIC_ADDR, NIC_SRAM_STATUS_BLK);
5314 tw32(HOSTCC_MODE, HOSTCC_MODE_ENABLE | tp->coalesce_mode);
5316 tw32(RCVCC_MODE, RCVCC_MODE_ENABLE | RCVCC_MODE_ATTN_ENABLE);
5317 tw32(RCVLPC_MODE, RCVLPC_MODE_ENABLE);
5318 if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS))
5319 tw32(RCVLSC_MODE, RCVLSC_MODE_ENABLE | RCVLSC_MODE_ATTN_ENABLE);
5321 /* Clear statistics/status block in chip, and status block in ram. */
5322 for (i = NIC_SRAM_STATS_BLK;
5323 i < NIC_SRAM_STATUS_BLK + TG3_HW_STATUS_SIZE;
5324 i += sizeof(u32)) {
5325 tg3_write_mem(tp, i, 0);
5326 udelay(40);
5328 memset(tp->hw_status, 0, TG3_HW_STATUS_SIZE);
5330 tp->mac_mode = MAC_MODE_TXSTAT_ENABLE | MAC_MODE_RXSTAT_ENABLE |
5331 MAC_MODE_TDE_ENABLE | MAC_MODE_RDE_ENABLE | MAC_MODE_FHDE_ENABLE;
5332 tw32_f(MAC_MODE, tp->mac_mode | MAC_MODE_RXSTAT_CLEAR | MAC_MODE_TXSTAT_CLEAR);
5333 udelay(40);
5335 tp->grc_local_ctrl = GRC_LCLCTRL_INT_ON_ATTN | GRC_LCLCTRL_AUTO_SEEPROM;
5336 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700)
5337 tp->grc_local_ctrl |= (GRC_LCLCTRL_GPIO_OE1 |
5338 GRC_LCLCTRL_GPIO_OUTPUT1);
5339 tw32_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl);
5340 udelay(100);
5342 tw32_mailbox(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW, 0);
5343 tr32(MAILBOX_INTERRUPT_0);
5345 if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS)) {
5346 tw32_f(DMAC_MODE, DMAC_MODE_ENABLE);
5347 udelay(40);
5350 val = (WDMAC_MODE_ENABLE | WDMAC_MODE_TGTABORT_ENAB |
5351 WDMAC_MODE_MSTABORT_ENAB | WDMAC_MODE_PARITYERR_ENAB |
5352 WDMAC_MODE_ADDROFLOW_ENAB | WDMAC_MODE_FIFOOFLOW_ENAB |
5353 WDMAC_MODE_FIFOURUN_ENAB | WDMAC_MODE_FIFOOREAD_ENAB |
5354 WDMAC_MODE_LNGREAD_ENAB);
5356 if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705 &&
5357 tp->pci_chip_rev_id != CHIPREV_ID_5705_A0) ||
5358 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750) {
5359 if ((tp->tg3_flags & TG3_FLG2_TSO_CAPABLE) &&
5360 (tp->pci_chip_rev_id == CHIPREV_ID_5705_A1 ||
5361 tp->pci_chip_rev_id == CHIPREV_ID_5705_A2)) {
5362 /* nothing */
5363 } else if (!(tr32(TG3PCI_PCISTATE) & PCISTATE_BUS_SPEED_HIGH) &&
5364 !(tp->tg3_flags2 & TG3_FLG2_IS_5788) &&
5365 !(tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS)) {
5366 val |= WDMAC_MODE_RX_ACCEL;
5370 tw32_f(WDMAC_MODE, val);
5371 udelay(40);
5373 if ((tp->tg3_flags & TG3_FLAG_PCIX_MODE) != 0) {
5374 val = tr32(TG3PCI_X_CAPS);
5375 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703) {
5376 val &= ~PCIX_CAPS_BURST_MASK;
5377 val |= (PCIX_CAPS_MAX_BURST_CPIOB << PCIX_CAPS_BURST_SHIFT);
5378 } else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704) {
5379 val &= ~(PCIX_CAPS_SPLIT_MASK | PCIX_CAPS_BURST_MASK);
5380 val |= (PCIX_CAPS_MAX_BURST_CPIOB << PCIX_CAPS_BURST_SHIFT);
5381 if (tp->tg3_flags & TG3_FLAG_SPLIT_MODE)
5382 val |= (tp->split_mode_max_reqs <<
5383 PCIX_CAPS_SPLIT_SHIFT);
5385 tw32(TG3PCI_X_CAPS, val);
5388 tw32_f(RDMAC_MODE, rdmac_mode);
5389 udelay(40);
5391 tw32(RCVDCC_MODE, RCVDCC_MODE_ENABLE | RCVDCC_MODE_ATTN_ENABLE);
5392 if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS))
5393 tw32(MBFREE_MODE, MBFREE_MODE_ENABLE);
5394 tw32(SNDDATAC_MODE, SNDDATAC_MODE_ENABLE);
5395 tw32(SNDBDC_MODE, SNDBDC_MODE_ENABLE | SNDBDC_MODE_ATTN_ENABLE);
5396 tw32(RCVBDI_MODE, RCVBDI_MODE_ENABLE | RCVBDI_MODE_RCB_ATTN_ENAB);
5397 tw32(RCVDBDI_MODE, RCVDBDI_MODE_ENABLE | RCVDBDI_MODE_INV_RING_SZ);
5398 tw32(SNDDATAI_MODE, SNDDATAI_MODE_ENABLE);
5399 #if TG3_TSO_SUPPORT != 0
5400 if (tp->tg3_flags2 & TG3_FLG2_HW_TSO)
5401 tw32(SNDDATAI_MODE, SNDDATAI_MODE_ENABLE | 0x8);
5402 #endif
5403 tw32(SNDBDI_MODE, SNDBDI_MODE_ENABLE | SNDBDI_MODE_ATTN_ENABLE);
5404 tw32(SNDBDS_MODE, SNDBDS_MODE_ENABLE | SNDBDS_MODE_ATTN_ENABLE);
5406 if (tp->pci_chip_rev_id == CHIPREV_ID_5701_A0) {
5407 err = tg3_load_5701_a0_firmware_fix(tp);
5408 if (err)
5409 return err;
5412 #if TG3_TSO_SUPPORT != 0
5413 if (tp->tg3_flags2 & TG3_FLG2_TSO_CAPABLE) {
5414 err = tg3_load_tso_firmware(tp);
5415 if (err)
5416 return err;
5418 #endif
5420 tp->tx_mode = TX_MODE_ENABLE;
5421 tw32_f(MAC_TX_MODE, tp->tx_mode);
5422 udelay(100);
5424 tp->rx_mode = RX_MODE_ENABLE;
5425 tw32_f(MAC_RX_MODE, tp->rx_mode);
5426 udelay(10);
5428 if (tp->link_config.phy_is_low_power) {
5429 tp->link_config.phy_is_low_power = 0;
5430 tp->link_config.speed = tp->link_config.orig_speed;
5431 tp->link_config.duplex = tp->link_config.orig_duplex;
5432 tp->link_config.autoneg = tp->link_config.orig_autoneg;
5435 tp->mi_mode = MAC_MI_MODE_BASE;
5436 tw32_f(MAC_MI_MODE, tp->mi_mode);
5437 udelay(80);
5439 tw32(MAC_LED_CTRL, tp->led_ctrl);
5441 tw32(MAC_MI_STAT, MAC_MI_STAT_LNKSTAT_ATTN_ENAB);
5442 if (tp->tg3_flags2 & TG3_FLG2_PHY_SERDES) {
5443 tw32_f(MAC_RX_MODE, RX_MODE_RESET);
5444 udelay(10);
5446 tw32_f(MAC_RX_MODE, tp->rx_mode);
5447 udelay(10);
5449 if (tp->tg3_flags2 & TG3_FLG2_PHY_SERDES) {
5450 if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704) &&
5451 !(tp->tg3_flags2 & TG3_FLG2_SERDES_PREEMPHASIS)) {
5452 /* Set drive transmission level to 1.2V */
5453 /* only if the signal pre-emphasis bit is not set */
5454 val = tr32(MAC_SERDES_CFG);
5455 val &= 0xfffff000;
5456 val |= 0x880;
5457 tw32(MAC_SERDES_CFG, val);
5459 if (tp->pci_chip_rev_id == CHIPREV_ID_5703_A1)
5460 tw32(MAC_SERDES_CFG, 0x616000);
5463 /* Prevent chip from dropping frames when flow control
5464 * is enabled.
5466 tw32_f(MAC_LOW_WMARK_MAX_RX_FRAME, 2);
5468 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704 &&
5469 (tp->tg3_flags2 & TG3_FLG2_PHY_SERDES)) {
5470 /* Use hardware link auto-negotiation */
5471 tp->tg3_flags2 |= TG3_FLG2_HW_AUTONEG;
5474 err = tg3_setup_phy(tp, 1);
5475 if (err)
5476 return err;
5478 if (!(tp->tg3_flags2 & TG3_FLG2_PHY_SERDES)) {
5479 u32 tmp;
5481 /* Clear CRC stats. */
5482 if (!tg3_readphy(tp, 0x1e, &tmp)) {
5483 tg3_writephy(tp, 0x1e, tmp | 0x8000);
5484 tg3_readphy(tp, 0x14, &tmp);
5488 __tg3_set_rx_mode(tp->dev);
5490 /* Initialize receive rules. */
5491 tw32(MAC_RCV_RULE_0, 0xc2000000 & RCV_RULE_DISABLE_MASK);
5492 tw32(MAC_RCV_VALUE_0, 0xffffffff & RCV_RULE_DISABLE_MASK);
5493 tw32(MAC_RCV_RULE_1, 0x86000004 & RCV_RULE_DISABLE_MASK);
5494 tw32(MAC_RCV_VALUE_1, 0xffffffff & RCV_RULE_DISABLE_MASK);
5496 if (tp->tg3_flags2 & TG3_FLG2_5705_PLUS)
5497 limit = 8;
5498 else
5499 limit = 16;
5500 if (tp->tg3_flags & TG3_FLAG_ENABLE_ASF)
5501 limit -= 4;
5502 switch (limit) {
5503 case 16:
5504 tw32(MAC_RCV_RULE_15, 0); tw32(MAC_RCV_VALUE_15, 0);
5505 case 15:
5506 tw32(MAC_RCV_RULE_14, 0); tw32(MAC_RCV_VALUE_14, 0);
5507 case 14:
5508 tw32(MAC_RCV_RULE_13, 0); tw32(MAC_RCV_VALUE_13, 0);
5509 case 13:
5510 tw32(MAC_RCV_RULE_12, 0); tw32(MAC_RCV_VALUE_12, 0);
5511 case 12:
5512 tw32(MAC_RCV_RULE_11, 0); tw32(MAC_RCV_VALUE_11, 0);
5513 case 11:
5514 tw32(MAC_RCV_RULE_10, 0); tw32(MAC_RCV_VALUE_10, 0);
5515 case 10:
5516 tw32(MAC_RCV_RULE_9, 0); tw32(MAC_RCV_VALUE_9, 0);
5517 case 9:
5518 tw32(MAC_RCV_RULE_8, 0); tw32(MAC_RCV_VALUE_8, 0);
5519 case 8:
5520 tw32(MAC_RCV_RULE_7, 0); tw32(MAC_RCV_VALUE_7, 0);
5521 case 7:
5522 tw32(MAC_RCV_RULE_6, 0); tw32(MAC_RCV_VALUE_6, 0);
5523 case 6:
5524 tw32(MAC_RCV_RULE_5, 0); tw32(MAC_RCV_VALUE_5, 0);
5525 case 5:
5526 tw32(MAC_RCV_RULE_4, 0); tw32(MAC_RCV_VALUE_4, 0);
5527 case 4:
5528 /* tw32(MAC_RCV_RULE_3, 0); tw32(MAC_RCV_VALUE_3, 0); */
5529 case 3:
5530 /* tw32(MAC_RCV_RULE_2, 0); tw32(MAC_RCV_VALUE_2, 0); */
5531 case 2:
5532 case 1:
5534 default:
5535 break;
5538 tg3_write_sig_post_reset(tp, RESET_KIND_INIT);
5540 if (tp->tg3_flags & TG3_FLAG_INIT_COMPLETE)
5541 tg3_enable_ints(tp);
5543 return 0;
5546 /* Called at device open time to get the chip ready for
5547 * packet processing. Invoked with tp->lock held.
5549 static int tg3_init_hw(struct tg3 *tp)
5551 int err;
5553 /* Force the chip into D0. */
5554 err = tg3_set_power_state(tp, 0);
5555 if (err)
5556 goto out;
5558 tg3_switch_clocks(tp);
5560 tw32(TG3PCI_MEM_WIN_BASE_ADDR, 0);
5562 err = tg3_reset_hw(tp);
5564 out:
5565 return err;
5568 #define TG3_STAT_ADD32(PSTAT, REG) \
5569 do { u32 __val = tr32(REG); \
5570 (PSTAT)->low += __val; \
5571 if ((PSTAT)->low < __val) \
5572 (PSTAT)->high += 1; \
5573 } while (0)
5575 static void tg3_periodic_fetch_stats(struct tg3 *tp)
5577 struct tg3_hw_stats *sp = tp->hw_stats;
5579 if (!netif_carrier_ok(tp->dev))
5580 return;
5582 TG3_STAT_ADD32(&sp->tx_octets, MAC_TX_STATS_OCTETS);
5583 TG3_STAT_ADD32(&sp->tx_collisions, MAC_TX_STATS_COLLISIONS);
5584 TG3_STAT_ADD32(&sp->tx_xon_sent, MAC_TX_STATS_XON_SENT);
5585 TG3_STAT_ADD32(&sp->tx_xoff_sent, MAC_TX_STATS_XOFF_SENT);
5586 TG3_STAT_ADD32(&sp->tx_mac_errors, MAC_TX_STATS_MAC_ERRORS);
5587 TG3_STAT_ADD32(&sp->tx_single_collisions, MAC_TX_STATS_SINGLE_COLLISIONS);
5588 TG3_STAT_ADD32(&sp->tx_mult_collisions, MAC_TX_STATS_MULT_COLLISIONS);
5589 TG3_STAT_ADD32(&sp->tx_deferred, MAC_TX_STATS_DEFERRED);
5590 TG3_STAT_ADD32(&sp->tx_excessive_collisions, MAC_TX_STATS_EXCESSIVE_COL);
5591 TG3_STAT_ADD32(&sp->tx_late_collisions, MAC_TX_STATS_LATE_COL);
5592 TG3_STAT_ADD32(&sp->tx_ucast_packets, MAC_TX_STATS_UCAST);
5593 TG3_STAT_ADD32(&sp->tx_mcast_packets, MAC_TX_STATS_MCAST);
5594 TG3_STAT_ADD32(&sp->tx_bcast_packets, MAC_TX_STATS_BCAST);
5596 TG3_STAT_ADD32(&sp->rx_octets, MAC_RX_STATS_OCTETS);
5597 TG3_STAT_ADD32(&sp->rx_fragments, MAC_RX_STATS_FRAGMENTS);
5598 TG3_STAT_ADD32(&sp->rx_ucast_packets, MAC_RX_STATS_UCAST);
5599 TG3_STAT_ADD32(&sp->rx_mcast_packets, MAC_RX_STATS_MCAST);
5600 TG3_STAT_ADD32(&sp->rx_bcast_packets, MAC_RX_STATS_BCAST);
5601 TG3_STAT_ADD32(&sp->rx_fcs_errors, MAC_RX_STATS_FCS_ERRORS);
5602 TG3_STAT_ADD32(&sp->rx_align_errors, MAC_RX_STATS_ALIGN_ERRORS);
5603 TG3_STAT_ADD32(&sp->rx_xon_pause_rcvd, MAC_RX_STATS_XON_PAUSE_RECVD);
5604 TG3_STAT_ADD32(&sp->rx_xoff_pause_rcvd, MAC_RX_STATS_XOFF_PAUSE_RECVD);
5605 TG3_STAT_ADD32(&sp->rx_mac_ctrl_rcvd, MAC_RX_STATS_MAC_CTRL_RECVD);
5606 TG3_STAT_ADD32(&sp->rx_xoff_entered, MAC_RX_STATS_XOFF_ENTERED);
5607 TG3_STAT_ADD32(&sp->rx_frame_too_long_errors, MAC_RX_STATS_FRAME_TOO_LONG);
5608 TG3_STAT_ADD32(&sp->rx_jabbers, MAC_RX_STATS_JABBERS);
5609 TG3_STAT_ADD32(&sp->rx_undersize_packets, MAC_RX_STATS_UNDERSIZE);
5612 static void tg3_timer(unsigned long __opaque)
5614 struct tg3 *tp = (struct tg3 *) __opaque;
5615 unsigned long flags;
5617 spin_lock_irqsave(&tp->lock, flags);
5618 spin_lock(&tp->tx_lock);
5620 /* All of this garbage is because when using non-tagged
5621 * IRQ status the mailbox/status_block protocol the chip
5622 * uses with the cpu is race prone.
5624 if (tp->hw_status->status & SD_STATUS_UPDATED) {
5625 tw32(GRC_LOCAL_CTRL,
5626 tp->grc_local_ctrl | GRC_LCLCTRL_SETINT);
5627 } else {
5628 tw32(HOSTCC_MODE, tp->coalesce_mode |
5629 (HOSTCC_MODE_ENABLE | HOSTCC_MODE_NOW));
5632 if (!(tr32(WDMAC_MODE) & WDMAC_MODE_ENABLE)) {
5633 tp->tg3_flags2 |= TG3_FLG2_RESTART_TIMER;
5634 spin_unlock(&tp->tx_lock);
5635 spin_unlock_irqrestore(&tp->lock, flags);
5636 schedule_work(&tp->reset_task);
5637 return;
5640 if (tp->tg3_flags2 & TG3_FLG2_5705_PLUS)
5641 tg3_periodic_fetch_stats(tp);
5643 /* This part only runs once per second. */
5644 if (!--tp->timer_counter) {
5645 if (tp->tg3_flags & TG3_FLAG_USE_LINKCHG_REG) {
5646 u32 mac_stat;
5647 int phy_event;
5649 mac_stat = tr32(MAC_STATUS);
5651 phy_event = 0;
5652 if (tp->tg3_flags & TG3_FLAG_USE_MI_INTERRUPT) {
5653 if (mac_stat & MAC_STATUS_MI_INTERRUPT)
5654 phy_event = 1;
5655 } else if (mac_stat & MAC_STATUS_LNKSTATE_CHANGED)
5656 phy_event = 1;
5658 if (phy_event)
5659 tg3_setup_phy(tp, 0);
5660 } else if (tp->tg3_flags & TG3_FLAG_POLL_SERDES) {
5661 u32 mac_stat = tr32(MAC_STATUS);
5662 int need_setup = 0;
5664 if (netif_carrier_ok(tp->dev) &&
5665 (mac_stat & MAC_STATUS_LNKSTATE_CHANGED)) {
5666 need_setup = 1;
5668 if (! netif_carrier_ok(tp->dev) &&
5669 (mac_stat & (MAC_STATUS_PCS_SYNCED |
5670 MAC_STATUS_SIGNAL_DET))) {
5671 need_setup = 1;
5673 if (need_setup) {
5674 tw32_f(MAC_MODE,
5675 (tp->mac_mode &
5676 ~MAC_MODE_PORT_MODE_MASK));
5677 udelay(40);
5678 tw32_f(MAC_MODE, tp->mac_mode);
5679 udelay(40);
5680 tg3_setup_phy(tp, 0);
5684 tp->timer_counter = tp->timer_multiplier;
5687 /* Heartbeat is only sent once every 120 seconds. */
5688 if (!--tp->asf_counter) {
5689 if (tp->tg3_flags & TG3_FLAG_ENABLE_ASF) {
5690 u32 val;
5692 tg3_write_mem(tp, NIC_SRAM_FW_CMD_MBOX, FWCMD_NICDRV_ALIVE);
5693 tg3_write_mem(tp, NIC_SRAM_FW_CMD_LEN_MBOX, 4);
5694 tg3_write_mem(tp, NIC_SRAM_FW_CMD_DATA_MBOX, 3);
5695 val = tr32(GRC_RX_CPU_EVENT);
5696 val |= (1 << 14);
5697 tw32(GRC_RX_CPU_EVENT, val);
5699 tp->asf_counter = tp->asf_multiplier;
5702 spin_unlock(&tp->tx_lock);
5703 spin_unlock_irqrestore(&tp->lock, flags);
5705 tp->timer.expires = jiffies + tp->timer_offset;
5706 add_timer(&tp->timer);
5709 static int tg3_open(struct net_device *dev)
5711 struct tg3 *tp = netdev_priv(dev);
5712 int err;
5714 spin_lock_irq(&tp->lock);
5715 spin_lock(&tp->tx_lock);
5717 tg3_disable_ints(tp);
5718 tp->tg3_flags &= ~TG3_FLAG_INIT_COMPLETE;
5720 spin_unlock(&tp->tx_lock);
5721 spin_unlock_irq(&tp->lock);
5723 /* The placement of this call is tied
5724 * to the setup and use of Host TX descriptors.
5726 err = tg3_alloc_consistent(tp);
5727 if (err)
5728 return err;
5730 err = request_irq(dev->irq, tg3_interrupt,
5731 SA_SHIRQ, dev->name, dev);
5733 if (err) {
5734 tg3_free_consistent(tp);
5735 return err;
5738 spin_lock_irq(&tp->lock);
5739 spin_lock(&tp->tx_lock);
5741 err = tg3_init_hw(tp);
5742 if (err) {
5743 tg3_halt(tp);
5744 tg3_free_rings(tp);
5745 } else {
5746 tp->timer_offset = HZ / 10;
5747 tp->timer_counter = tp->timer_multiplier = 10;
5748 tp->asf_counter = tp->asf_multiplier = (10 * 120);
5750 init_timer(&tp->timer);
5751 tp->timer.expires = jiffies + tp->timer_offset;
5752 tp->timer.data = (unsigned long) tp;
5753 tp->timer.function = tg3_timer;
5754 add_timer(&tp->timer);
5756 tp->tg3_flags |= TG3_FLAG_INIT_COMPLETE;
5759 spin_unlock(&tp->tx_lock);
5760 spin_unlock_irq(&tp->lock);
5762 if (err) {
5763 free_irq(dev->irq, dev);
5764 tg3_free_consistent(tp);
5765 return err;
5768 spin_lock_irq(&tp->lock);
5769 spin_lock(&tp->tx_lock);
5771 tg3_enable_ints(tp);
5773 spin_unlock(&tp->tx_lock);
5774 spin_unlock_irq(&tp->lock);
5776 netif_start_queue(dev);
5778 return 0;
5781 #if 0
5782 /*static*/ void tg3_dump_state(struct tg3 *tp)
5784 u32 val32, val32_2, val32_3, val32_4, val32_5;
5785 u16 val16;
5786 int i;
5788 pci_read_config_word(tp->pdev, PCI_STATUS, &val16);
5789 pci_read_config_dword(tp->pdev, TG3PCI_PCISTATE, &val32);
5790 printk("DEBUG: PCI status [%04x] TG3PCI state[%08x]\n",
5791 val16, val32);
5793 /* MAC block */
5794 printk("DEBUG: MAC_MODE[%08x] MAC_STATUS[%08x]\n",
5795 tr32(MAC_MODE), tr32(MAC_STATUS));
5796 printk(" MAC_EVENT[%08x] MAC_LED_CTRL[%08x]\n",
5797 tr32(MAC_EVENT), tr32(MAC_LED_CTRL));
5798 printk("DEBUG: MAC_TX_MODE[%08x] MAC_TX_STATUS[%08x]\n",
5799 tr32(MAC_TX_MODE), tr32(MAC_TX_STATUS));
5800 printk(" MAC_RX_MODE[%08x] MAC_RX_STATUS[%08x]\n",
5801 tr32(MAC_RX_MODE), tr32(MAC_RX_STATUS));
5803 /* Send data initiator control block */
5804 printk("DEBUG: SNDDATAI_MODE[%08x] SNDDATAI_STATUS[%08x]\n",
5805 tr32(SNDDATAI_MODE), tr32(SNDDATAI_STATUS));
5806 printk(" SNDDATAI_STATSCTRL[%08x]\n",
5807 tr32(SNDDATAI_STATSCTRL));
5809 /* Send data completion control block */
5810 printk("DEBUG: SNDDATAC_MODE[%08x]\n", tr32(SNDDATAC_MODE));
5812 /* Send BD ring selector block */
5813 printk("DEBUG: SNDBDS_MODE[%08x] SNDBDS_STATUS[%08x]\n",
5814 tr32(SNDBDS_MODE), tr32(SNDBDS_STATUS));
5816 /* Send BD initiator control block */
5817 printk("DEBUG: SNDBDI_MODE[%08x] SNDBDI_STATUS[%08x]\n",
5818 tr32(SNDBDI_MODE), tr32(SNDBDI_STATUS));
5820 /* Send BD completion control block */
5821 printk("DEBUG: SNDBDC_MODE[%08x]\n", tr32(SNDBDC_MODE));
5823 /* Receive list placement control block */
5824 printk("DEBUG: RCVLPC_MODE[%08x] RCVLPC_STATUS[%08x]\n",
5825 tr32(RCVLPC_MODE), tr32(RCVLPC_STATUS));
5826 printk(" RCVLPC_STATSCTRL[%08x]\n",
5827 tr32(RCVLPC_STATSCTRL));
5829 /* Receive data and receive BD initiator control block */
5830 printk("DEBUG: RCVDBDI_MODE[%08x] RCVDBDI_STATUS[%08x]\n",
5831 tr32(RCVDBDI_MODE), tr32(RCVDBDI_STATUS));
5833 /* Receive data completion control block */
5834 printk("DEBUG: RCVDCC_MODE[%08x]\n",
5835 tr32(RCVDCC_MODE));
5837 /* Receive BD initiator control block */
5838 printk("DEBUG: RCVBDI_MODE[%08x] RCVBDI_STATUS[%08x]\n",
5839 tr32(RCVBDI_MODE), tr32(RCVBDI_STATUS));
5841 /* Receive BD completion control block */
5842 printk("DEBUG: RCVCC_MODE[%08x] RCVCC_STATUS[%08x]\n",
5843 tr32(RCVCC_MODE), tr32(RCVCC_STATUS));
5845 /* Receive list selector control block */
5846 printk("DEBUG: RCVLSC_MODE[%08x] RCVLSC_STATUS[%08x]\n",
5847 tr32(RCVLSC_MODE), tr32(RCVLSC_STATUS));
5849 /* Mbuf cluster free block */
5850 printk("DEBUG: MBFREE_MODE[%08x] MBFREE_STATUS[%08x]\n",
5851 tr32(MBFREE_MODE), tr32(MBFREE_STATUS));
5853 /* Host coalescing control block */
5854 printk("DEBUG: HOSTCC_MODE[%08x] HOSTCC_STATUS[%08x]\n",
5855 tr32(HOSTCC_MODE), tr32(HOSTCC_STATUS));
5856 printk("DEBUG: HOSTCC_STATS_BLK_HOST_ADDR[%08x%08x]\n",
5857 tr32(HOSTCC_STATS_BLK_HOST_ADDR + TG3_64BIT_REG_HIGH),
5858 tr32(HOSTCC_STATS_BLK_HOST_ADDR + TG3_64BIT_REG_LOW));
5859 printk("DEBUG: HOSTCC_STATUS_BLK_HOST_ADDR[%08x%08x]\n",
5860 tr32(HOSTCC_STATUS_BLK_HOST_ADDR + TG3_64BIT_REG_HIGH),
5861 tr32(HOSTCC_STATUS_BLK_HOST_ADDR + TG3_64BIT_REG_LOW));
5862 printk("DEBUG: HOSTCC_STATS_BLK_NIC_ADDR[%08x]\n",
5863 tr32(HOSTCC_STATS_BLK_NIC_ADDR));
5864 printk("DEBUG: HOSTCC_STATUS_BLK_NIC_ADDR[%08x]\n",
5865 tr32(HOSTCC_STATUS_BLK_NIC_ADDR));
5867 /* Memory arbiter control block */
5868 printk("DEBUG: MEMARB_MODE[%08x] MEMARB_STATUS[%08x]\n",
5869 tr32(MEMARB_MODE), tr32(MEMARB_STATUS));
5871 /* Buffer manager control block */
5872 printk("DEBUG: BUFMGR_MODE[%08x] BUFMGR_STATUS[%08x]\n",
5873 tr32(BUFMGR_MODE), tr32(BUFMGR_STATUS));
5874 printk("DEBUG: BUFMGR_MB_POOL_ADDR[%08x] BUFMGR_MB_POOL_SIZE[%08x]\n",
5875 tr32(BUFMGR_MB_POOL_ADDR), tr32(BUFMGR_MB_POOL_SIZE));
5876 printk("DEBUG: BUFMGR_DMA_DESC_POOL_ADDR[%08x] "
5877 "BUFMGR_DMA_DESC_POOL_SIZE[%08x]\n",
5878 tr32(BUFMGR_DMA_DESC_POOL_ADDR),
5879 tr32(BUFMGR_DMA_DESC_POOL_SIZE));
5881 /* Read DMA control block */
5882 printk("DEBUG: RDMAC_MODE[%08x] RDMAC_STATUS[%08x]\n",
5883 tr32(RDMAC_MODE), tr32(RDMAC_STATUS));
5885 /* Write DMA control block */
5886 printk("DEBUG: WDMAC_MODE[%08x] WDMAC_STATUS[%08x]\n",
5887 tr32(WDMAC_MODE), tr32(WDMAC_STATUS));
5889 /* DMA completion block */
5890 printk("DEBUG: DMAC_MODE[%08x]\n",
5891 tr32(DMAC_MODE));
5893 /* GRC block */
5894 printk("DEBUG: GRC_MODE[%08x] GRC_MISC_CFG[%08x]\n",
5895 tr32(GRC_MODE), tr32(GRC_MISC_CFG));
5896 printk("DEBUG: GRC_LOCAL_CTRL[%08x]\n",
5897 tr32(GRC_LOCAL_CTRL));
5899 /* TG3_BDINFOs */
5900 printk("DEBUG: RCVDBDI_JUMBO_BD[%08x%08x:%08x:%08x]\n",
5901 tr32(RCVDBDI_JUMBO_BD + 0x0),
5902 tr32(RCVDBDI_JUMBO_BD + 0x4),
5903 tr32(RCVDBDI_JUMBO_BD + 0x8),
5904 tr32(RCVDBDI_JUMBO_BD + 0xc));
5905 printk("DEBUG: RCVDBDI_STD_BD[%08x%08x:%08x:%08x]\n",
5906 tr32(RCVDBDI_STD_BD + 0x0),
5907 tr32(RCVDBDI_STD_BD + 0x4),
5908 tr32(RCVDBDI_STD_BD + 0x8),
5909 tr32(RCVDBDI_STD_BD + 0xc));
5910 printk("DEBUG: RCVDBDI_MINI_BD[%08x%08x:%08x:%08x]\n",
5911 tr32(RCVDBDI_MINI_BD + 0x0),
5912 tr32(RCVDBDI_MINI_BD + 0x4),
5913 tr32(RCVDBDI_MINI_BD + 0x8),
5914 tr32(RCVDBDI_MINI_BD + 0xc));
5916 tg3_read_mem(tp, NIC_SRAM_SEND_RCB + 0x0, &val32);
5917 tg3_read_mem(tp, NIC_SRAM_SEND_RCB + 0x4, &val32_2);
5918 tg3_read_mem(tp, NIC_SRAM_SEND_RCB + 0x8, &val32_3);
5919 tg3_read_mem(tp, NIC_SRAM_SEND_RCB + 0xc, &val32_4);
5920 printk("DEBUG: SRAM_SEND_RCB_0[%08x%08x:%08x:%08x]\n",
5921 val32, val32_2, val32_3, val32_4);
5923 tg3_read_mem(tp, NIC_SRAM_RCV_RET_RCB + 0x0, &val32);
5924 tg3_read_mem(tp, NIC_SRAM_RCV_RET_RCB + 0x4, &val32_2);
5925 tg3_read_mem(tp, NIC_SRAM_RCV_RET_RCB + 0x8, &val32_3);
5926 tg3_read_mem(tp, NIC_SRAM_RCV_RET_RCB + 0xc, &val32_4);
5927 printk("DEBUG: SRAM_RCV_RET_RCB_0[%08x%08x:%08x:%08x]\n",
5928 val32, val32_2, val32_3, val32_4);
5930 tg3_read_mem(tp, NIC_SRAM_STATUS_BLK + 0x0, &val32);
5931 tg3_read_mem(tp, NIC_SRAM_STATUS_BLK + 0x4, &val32_2);
5932 tg3_read_mem(tp, NIC_SRAM_STATUS_BLK + 0x8, &val32_3);
5933 tg3_read_mem(tp, NIC_SRAM_STATUS_BLK + 0xc, &val32_4);
5934 tg3_read_mem(tp, NIC_SRAM_STATUS_BLK + 0x10, &val32_5);
5935 printk("DEBUG: SRAM_STATUS_BLK[%08x:%08x:%08x:%08x:%08x]\n",
5936 val32, val32_2, val32_3, val32_4, val32_5);
5938 /* SW status block */
5939 printk("DEBUG: Host status block [%08x:%08x:(%04x:%04x:%04x):(%04x:%04x)]\n",
5940 tp->hw_status->status,
5941 tp->hw_status->status_tag,
5942 tp->hw_status->rx_jumbo_consumer,
5943 tp->hw_status->rx_consumer,
5944 tp->hw_status->rx_mini_consumer,
5945 tp->hw_status->idx[0].rx_producer,
5946 tp->hw_status->idx[0].tx_consumer);
5948 /* SW statistics block */
5949 printk("DEBUG: Host statistics block [%08x:%08x:%08x:%08x]\n",
5950 ((u32 *)tp->hw_stats)[0],
5951 ((u32 *)tp->hw_stats)[1],
5952 ((u32 *)tp->hw_stats)[2],
5953 ((u32 *)tp->hw_stats)[3]);
5955 /* Mailboxes */
5956 printk("DEBUG: SNDHOST_PROD[%08x%08x] SNDNIC_PROD[%08x%08x]\n",
5957 tr32(MAILBOX_SNDHOST_PROD_IDX_0 + 0x0),
5958 tr32(MAILBOX_SNDHOST_PROD_IDX_0 + 0x4),
5959 tr32(MAILBOX_SNDNIC_PROD_IDX_0 + 0x0),
5960 tr32(MAILBOX_SNDNIC_PROD_IDX_0 + 0x4));
5962 /* NIC side send descriptors. */
5963 for (i = 0; i < 6; i++) {
5964 unsigned long txd;
5966 txd = tp->regs + NIC_SRAM_WIN_BASE + NIC_SRAM_TX_BUFFER_DESC
5967 + (i * sizeof(struct tg3_tx_buffer_desc));
5968 printk("DEBUG: NIC TXD(%d)[%08x:%08x:%08x:%08x]\n",
5970 readl(txd + 0x0), readl(txd + 0x4),
5971 readl(txd + 0x8), readl(txd + 0xc));
5974 /* NIC side RX descriptors. */
5975 for (i = 0; i < 6; i++) {
5976 unsigned long rxd;
5978 rxd = tp->regs + NIC_SRAM_WIN_BASE + NIC_SRAM_RX_BUFFER_DESC
5979 + (i * sizeof(struct tg3_rx_buffer_desc));
5980 printk("DEBUG: NIC RXD_STD(%d)[0][%08x:%08x:%08x:%08x]\n",
5982 readl(rxd + 0x0), readl(rxd + 0x4),
5983 readl(rxd + 0x8), readl(rxd + 0xc));
5984 rxd += (4 * sizeof(u32));
5985 printk("DEBUG: NIC RXD_STD(%d)[1][%08x:%08x:%08x:%08x]\n",
5987 readl(rxd + 0x0), readl(rxd + 0x4),
5988 readl(rxd + 0x8), readl(rxd + 0xc));
5991 for (i = 0; i < 6; i++) {
5992 unsigned long rxd;
5994 rxd = tp->regs + NIC_SRAM_WIN_BASE + NIC_SRAM_RX_JUMBO_BUFFER_DESC
5995 + (i * sizeof(struct tg3_rx_buffer_desc));
5996 printk("DEBUG: NIC RXD_JUMBO(%d)[0][%08x:%08x:%08x:%08x]\n",
5998 readl(rxd + 0x0), readl(rxd + 0x4),
5999 readl(rxd + 0x8), readl(rxd + 0xc));
6000 rxd += (4 * sizeof(u32));
6001 printk("DEBUG: NIC RXD_JUMBO(%d)[1][%08x:%08x:%08x:%08x]\n",
6003 readl(rxd + 0x0), readl(rxd + 0x4),
6004 readl(rxd + 0x8), readl(rxd + 0xc));
6007 #endif
6009 static struct net_device_stats *tg3_get_stats(struct net_device *);
6010 static struct tg3_ethtool_stats *tg3_get_estats(struct tg3 *);
6012 static int tg3_close(struct net_device *dev)
6014 struct tg3 *tp = netdev_priv(dev);
6016 netif_stop_queue(dev);
6018 del_timer_sync(&tp->timer);
6020 spin_lock_irq(&tp->lock);
6021 spin_lock(&tp->tx_lock);
6022 #if 0
6023 tg3_dump_state(tp);
6024 #endif
6026 tg3_disable_ints(tp);
6028 tg3_halt(tp);
6029 tg3_free_rings(tp);
6030 tp->tg3_flags &=
6031 ~(TG3_FLAG_INIT_COMPLETE |
6032 TG3_FLAG_GOT_SERDES_FLOWCTL);
6033 netif_carrier_off(tp->dev);
6035 spin_unlock(&tp->tx_lock);
6036 spin_unlock_irq(&tp->lock);
6038 free_irq(dev->irq, dev);
6040 memcpy(&tp->net_stats_prev, tg3_get_stats(tp->dev),
6041 sizeof(tp->net_stats_prev));
6042 memcpy(&tp->estats_prev, tg3_get_estats(tp),
6043 sizeof(tp->estats_prev));
6045 tg3_free_consistent(tp);
6047 return 0;
6050 static inline unsigned long get_stat64(tg3_stat64_t *val)
6052 unsigned long ret;
6054 #if (BITS_PER_LONG == 32)
6055 ret = val->low;
6056 #else
6057 ret = ((u64)val->high << 32) | ((u64)val->low);
6058 #endif
6059 return ret;
6062 static unsigned long calc_crc_errors(struct tg3 *tp)
6064 struct tg3_hw_stats *hw_stats = tp->hw_stats;
6066 if (!(tp->tg3_flags2 & TG3_FLG2_PHY_SERDES) &&
6067 (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 ||
6068 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701)) {
6069 unsigned long flags;
6070 u32 val;
6072 spin_lock_irqsave(&tp->lock, flags);
6073 if (!tg3_readphy(tp, 0x1e, &val)) {
6074 tg3_writephy(tp, 0x1e, val | 0x8000);
6075 tg3_readphy(tp, 0x14, &val);
6076 } else
6077 val = 0;
6078 spin_unlock_irqrestore(&tp->lock, flags);
6080 tp->phy_crc_errors += val;
6082 return tp->phy_crc_errors;
6085 return get_stat64(&hw_stats->rx_fcs_errors);
6088 #define ESTAT_ADD(member) \
6089 estats->member = old_estats->member + \
6090 get_stat64(&hw_stats->member)
6092 static struct tg3_ethtool_stats *tg3_get_estats(struct tg3 *tp)
6094 struct tg3_ethtool_stats *estats = &tp->estats;
6095 struct tg3_ethtool_stats *old_estats = &tp->estats_prev;
6096 struct tg3_hw_stats *hw_stats = tp->hw_stats;
6098 if (!hw_stats)
6099 return old_estats;
6101 ESTAT_ADD(rx_octets);
6102 ESTAT_ADD(rx_fragments);
6103 ESTAT_ADD(rx_ucast_packets);
6104 ESTAT_ADD(rx_mcast_packets);
6105 ESTAT_ADD(rx_bcast_packets);
6106 ESTAT_ADD(rx_fcs_errors);
6107 ESTAT_ADD(rx_align_errors);
6108 ESTAT_ADD(rx_xon_pause_rcvd);
6109 ESTAT_ADD(rx_xoff_pause_rcvd);
6110 ESTAT_ADD(rx_mac_ctrl_rcvd);
6111 ESTAT_ADD(rx_xoff_entered);
6112 ESTAT_ADD(rx_frame_too_long_errors);
6113 ESTAT_ADD(rx_jabbers);
6114 ESTAT_ADD(rx_undersize_packets);
6115 ESTAT_ADD(rx_in_length_errors);
6116 ESTAT_ADD(rx_out_length_errors);
6117 ESTAT_ADD(rx_64_or_less_octet_packets);
6118 ESTAT_ADD(rx_65_to_127_octet_packets);
6119 ESTAT_ADD(rx_128_to_255_octet_packets);
6120 ESTAT_ADD(rx_256_to_511_octet_packets);
6121 ESTAT_ADD(rx_512_to_1023_octet_packets);
6122 ESTAT_ADD(rx_1024_to_1522_octet_packets);
6123 ESTAT_ADD(rx_1523_to_2047_octet_packets);
6124 ESTAT_ADD(rx_2048_to_4095_octet_packets);
6125 ESTAT_ADD(rx_4096_to_8191_octet_packets);
6126 ESTAT_ADD(rx_8192_to_9022_octet_packets);
6128 ESTAT_ADD(tx_octets);
6129 ESTAT_ADD(tx_collisions);
6130 ESTAT_ADD(tx_xon_sent);
6131 ESTAT_ADD(tx_xoff_sent);
6132 ESTAT_ADD(tx_flow_control);
6133 ESTAT_ADD(tx_mac_errors);
6134 ESTAT_ADD(tx_single_collisions);
6135 ESTAT_ADD(tx_mult_collisions);
6136 ESTAT_ADD(tx_deferred);
6137 ESTAT_ADD(tx_excessive_collisions);
6138 ESTAT_ADD(tx_late_collisions);
6139 ESTAT_ADD(tx_collide_2times);
6140 ESTAT_ADD(tx_collide_3times);
6141 ESTAT_ADD(tx_collide_4times);
6142 ESTAT_ADD(tx_collide_5times);
6143 ESTAT_ADD(tx_collide_6times);
6144 ESTAT_ADD(tx_collide_7times);
6145 ESTAT_ADD(tx_collide_8times);
6146 ESTAT_ADD(tx_collide_9times);
6147 ESTAT_ADD(tx_collide_10times);
6148 ESTAT_ADD(tx_collide_11times);
6149 ESTAT_ADD(tx_collide_12times);
6150 ESTAT_ADD(tx_collide_13times);
6151 ESTAT_ADD(tx_collide_14times);
6152 ESTAT_ADD(tx_collide_15times);
6153 ESTAT_ADD(tx_ucast_packets);
6154 ESTAT_ADD(tx_mcast_packets);
6155 ESTAT_ADD(tx_bcast_packets);
6156 ESTAT_ADD(tx_carrier_sense_errors);
6157 ESTAT_ADD(tx_discards);
6158 ESTAT_ADD(tx_errors);
6160 ESTAT_ADD(dma_writeq_full);
6161 ESTAT_ADD(dma_write_prioq_full);
6162 ESTAT_ADD(rxbds_empty);
6163 ESTAT_ADD(rx_discards);
6164 ESTAT_ADD(rx_errors);
6165 ESTAT_ADD(rx_threshold_hit);
6167 ESTAT_ADD(dma_readq_full);
6168 ESTAT_ADD(dma_read_prioq_full);
6169 ESTAT_ADD(tx_comp_queue_full);
6171 ESTAT_ADD(ring_set_send_prod_index);
6172 ESTAT_ADD(ring_status_update);
6173 ESTAT_ADD(nic_irqs);
6174 ESTAT_ADD(nic_avoided_irqs);
6175 ESTAT_ADD(nic_tx_threshold_hit);
6177 return estats;
6180 static struct net_device_stats *tg3_get_stats(struct net_device *dev)
6182 struct tg3 *tp = netdev_priv(dev);
6183 struct net_device_stats *stats = &tp->net_stats;
6184 struct net_device_stats *old_stats = &tp->net_stats_prev;
6185 struct tg3_hw_stats *hw_stats = tp->hw_stats;
6187 if (!hw_stats)
6188 return old_stats;
6190 stats->rx_packets = old_stats->rx_packets +
6191 get_stat64(&hw_stats->rx_ucast_packets) +
6192 get_stat64(&hw_stats->rx_mcast_packets) +
6193 get_stat64(&hw_stats->rx_bcast_packets);
6195 stats->tx_packets = old_stats->tx_packets +
6196 get_stat64(&hw_stats->tx_ucast_packets) +
6197 get_stat64(&hw_stats->tx_mcast_packets) +
6198 get_stat64(&hw_stats->tx_bcast_packets);
6200 stats->rx_bytes = old_stats->rx_bytes +
6201 get_stat64(&hw_stats->rx_octets);
6202 stats->tx_bytes = old_stats->tx_bytes +
6203 get_stat64(&hw_stats->tx_octets);
6205 stats->rx_errors = old_stats->rx_errors +
6206 get_stat64(&hw_stats->rx_errors) +
6207 get_stat64(&hw_stats->rx_discards);
6208 stats->tx_errors = old_stats->tx_errors +
6209 get_stat64(&hw_stats->tx_errors) +
6210 get_stat64(&hw_stats->tx_mac_errors) +
6211 get_stat64(&hw_stats->tx_carrier_sense_errors) +
6212 get_stat64(&hw_stats->tx_discards);
6214 stats->multicast = old_stats->multicast +
6215 get_stat64(&hw_stats->rx_mcast_packets);
6216 stats->collisions = old_stats->collisions +
6217 get_stat64(&hw_stats->tx_collisions);
6219 stats->rx_length_errors = old_stats->rx_length_errors +
6220 get_stat64(&hw_stats->rx_frame_too_long_errors) +
6221 get_stat64(&hw_stats->rx_undersize_packets);
6223 stats->rx_over_errors = old_stats->rx_over_errors +
6224 get_stat64(&hw_stats->rxbds_empty);
6225 stats->rx_frame_errors = old_stats->rx_frame_errors +
6226 get_stat64(&hw_stats->rx_align_errors);
6227 stats->tx_aborted_errors = old_stats->tx_aborted_errors +
6228 get_stat64(&hw_stats->tx_discards);
6229 stats->tx_carrier_errors = old_stats->tx_carrier_errors +
6230 get_stat64(&hw_stats->tx_carrier_sense_errors);
6232 stats->rx_crc_errors = old_stats->rx_crc_errors +
6233 calc_crc_errors(tp);
6235 return stats;
6238 static inline u32 calc_crc(unsigned char *buf, int len)
6240 u32 reg;
6241 u32 tmp;
6242 int j, k;
6244 reg = 0xffffffff;
6246 for (j = 0; j < len; j++) {
6247 reg ^= buf[j];
6249 for (k = 0; k < 8; k++) {
6250 tmp = reg & 0x01;
6252 reg >>= 1;
6254 if (tmp) {
6255 reg ^= 0xedb88320;
6260 return ~reg;
6263 static void tg3_set_multi(struct tg3 *tp, unsigned int accept_all)
6265 /* accept or reject all multicast frames */
6266 tw32(MAC_HASH_REG_0, accept_all ? 0xffffffff : 0);
6267 tw32(MAC_HASH_REG_1, accept_all ? 0xffffffff : 0);
6268 tw32(MAC_HASH_REG_2, accept_all ? 0xffffffff : 0);
6269 tw32(MAC_HASH_REG_3, accept_all ? 0xffffffff : 0);
6272 static void __tg3_set_rx_mode(struct net_device *dev)
6274 struct tg3 *tp = netdev_priv(dev);
6275 u32 rx_mode;
6277 rx_mode = tp->rx_mode & ~(RX_MODE_PROMISC |
6278 RX_MODE_KEEP_VLAN_TAG);
6280 /* When ASF is in use, we always keep the RX_MODE_KEEP_VLAN_TAG
6281 * flag clear.
6283 #if TG3_VLAN_TAG_USED
6284 if (!tp->vlgrp &&
6285 !(tp->tg3_flags & TG3_FLAG_ENABLE_ASF))
6286 rx_mode |= RX_MODE_KEEP_VLAN_TAG;
6287 #else
6288 /* By definition, VLAN is disabled always in this
6289 * case.
6291 if (!(tp->tg3_flags & TG3_FLAG_ENABLE_ASF))
6292 rx_mode |= RX_MODE_KEEP_VLAN_TAG;
6293 #endif
6295 if (dev->flags & IFF_PROMISC) {
6296 /* Promiscuous mode. */
6297 rx_mode |= RX_MODE_PROMISC;
6298 } else if (dev->flags & IFF_ALLMULTI) {
6299 /* Accept all multicast. */
6300 tg3_set_multi (tp, 1);
6301 } else if (dev->mc_count < 1) {
6302 /* Reject all multicast. */
6303 tg3_set_multi (tp, 0);
6304 } else {
6305 /* Accept one or more multicast(s). */
6306 struct dev_mc_list *mclist;
6307 unsigned int i;
6308 u32 mc_filter[4] = { 0, };
6309 u32 regidx;
6310 u32 bit;
6311 u32 crc;
6313 for (i = 0, mclist = dev->mc_list; mclist && i < dev->mc_count;
6314 i++, mclist = mclist->next) {
6316 crc = calc_crc (mclist->dmi_addr, ETH_ALEN);
6317 bit = ~crc & 0x7f;
6318 regidx = (bit & 0x60) >> 5;
6319 bit &= 0x1f;
6320 mc_filter[regidx] |= (1 << bit);
6323 tw32(MAC_HASH_REG_0, mc_filter[0]);
6324 tw32(MAC_HASH_REG_1, mc_filter[1]);
6325 tw32(MAC_HASH_REG_2, mc_filter[2]);
6326 tw32(MAC_HASH_REG_3, mc_filter[3]);
6329 if (rx_mode != tp->rx_mode) {
6330 tp->rx_mode = rx_mode;
6331 tw32_f(MAC_RX_MODE, rx_mode);
6332 udelay(10);
6336 static void tg3_set_rx_mode(struct net_device *dev)
6338 struct tg3 *tp = netdev_priv(dev);
6340 spin_lock_irq(&tp->lock);
6341 spin_lock(&tp->tx_lock);
6342 __tg3_set_rx_mode(dev);
6343 spin_unlock(&tp->tx_lock);
6344 spin_unlock_irq(&tp->lock);
6347 #define TG3_REGDUMP_LEN (32 * 1024)
6349 static int tg3_get_regs_len(struct net_device *dev)
6351 return TG3_REGDUMP_LEN;
6354 static void tg3_get_regs(struct net_device *dev,
6355 struct ethtool_regs *regs, void *_p)
6357 u32 *p = _p;
6358 struct tg3 *tp = netdev_priv(dev);
6359 u8 *orig_p = _p;
6360 int i;
6362 regs->version = 0;
6364 memset(p, 0, TG3_REGDUMP_LEN);
6366 spin_lock_irq(&tp->lock);
6367 spin_lock(&tp->tx_lock);
6369 #define __GET_REG32(reg) (*(p)++ = tr32(reg))
6370 #define GET_REG32_LOOP(base,len) \
6371 do { p = (u32 *)(orig_p + (base)); \
6372 for (i = 0; i < len; i += 4) \
6373 __GET_REG32((base) + i); \
6374 } while (0)
6375 #define GET_REG32_1(reg) \
6376 do { p = (u32 *)(orig_p + (reg)); \
6377 __GET_REG32((reg)); \
6378 } while (0)
6380 GET_REG32_LOOP(TG3PCI_VENDOR, 0xb0);
6381 GET_REG32_LOOP(MAILBOX_INTERRUPT_0, 0x200);
6382 GET_REG32_LOOP(MAC_MODE, 0x4f0);
6383 GET_REG32_LOOP(SNDDATAI_MODE, 0xe0);
6384 GET_REG32_1(SNDDATAC_MODE);
6385 GET_REG32_LOOP(SNDBDS_MODE, 0x80);
6386 GET_REG32_LOOP(SNDBDI_MODE, 0x48);
6387 GET_REG32_1(SNDBDC_MODE);
6388 GET_REG32_LOOP(RCVLPC_MODE, 0x20);
6389 GET_REG32_LOOP(RCVLPC_SELLST_BASE, 0x15c);
6390 GET_REG32_LOOP(RCVDBDI_MODE, 0x0c);
6391 GET_REG32_LOOP(RCVDBDI_JUMBO_BD, 0x3c);
6392 GET_REG32_LOOP(RCVDBDI_BD_PROD_IDX_0, 0x44);
6393 GET_REG32_1(RCVDCC_MODE);
6394 GET_REG32_LOOP(RCVBDI_MODE, 0x20);
6395 GET_REG32_LOOP(RCVCC_MODE, 0x14);
6396 GET_REG32_LOOP(RCVLSC_MODE, 0x08);
6397 GET_REG32_1(MBFREE_MODE);
6398 GET_REG32_LOOP(HOSTCC_MODE, 0x100);
6399 GET_REG32_LOOP(MEMARB_MODE, 0x10);
6400 GET_REG32_LOOP(BUFMGR_MODE, 0x58);
6401 GET_REG32_LOOP(RDMAC_MODE, 0x08);
6402 GET_REG32_LOOP(WDMAC_MODE, 0x08);
6403 GET_REG32_LOOP(RX_CPU_BASE, 0x280);
6404 GET_REG32_LOOP(TX_CPU_BASE, 0x280);
6405 GET_REG32_LOOP(GRCMBOX_INTERRUPT_0, 0x110);
6406 GET_REG32_LOOP(FTQ_RESET, 0x120);
6407 GET_REG32_LOOP(MSGINT_MODE, 0x0c);
6408 GET_REG32_1(DMAC_MODE);
6409 GET_REG32_LOOP(GRC_MODE, 0x4c);
6410 if (tp->tg3_flags & TG3_FLAG_NVRAM)
6411 GET_REG32_LOOP(NVRAM_CMD, 0x24);
6413 #undef __GET_REG32
6414 #undef GET_REG32_LOOP
6415 #undef GET_REG32_1
6417 spin_unlock(&tp->tx_lock);
6418 spin_unlock_irq(&tp->lock);
6421 static int tg3_get_eeprom_len(struct net_device *dev)
6423 struct tg3 *tp = netdev_priv(dev);
6425 return tp->nvram_size;
6428 static int tg3_nvram_read(struct tg3 *tp, u32 offset, u32 *val);
6430 static int tg3_get_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom, u8 *data)
6432 struct tg3 *tp = netdev_priv(dev);
6433 int ret;
6434 u8 *pd;
6435 u32 i, offset, len, val, b_offset, b_count;
6437 offset = eeprom->offset;
6438 len = eeprom->len;
6439 eeprom->len = 0;
6441 eeprom->magic = TG3_EEPROM_MAGIC;
6443 if (offset & 3) {
6444 /* adjustments to start on required 4 byte boundary */
6445 b_offset = offset & 3;
6446 b_count = 4 - b_offset;
6447 if (b_count > len) {
6448 /* i.e. offset=1 len=2 */
6449 b_count = len;
6451 ret = tg3_nvram_read(tp, offset-b_offset, &val);
6452 if (ret)
6453 return ret;
6454 val = cpu_to_le32(val);
6455 memcpy(data, ((char*)&val) + b_offset, b_count);
6456 len -= b_count;
6457 offset += b_count;
6458 eeprom->len += b_count;
6461 /* read bytes upto the last 4 byte boundary */
6462 pd = &data[eeprom->len];
6463 for (i = 0; i < (len - (len & 3)); i += 4) {
6464 ret = tg3_nvram_read(tp, offset + i, &val);
6465 if (ret) {
6466 eeprom->len += i;
6467 return ret;
6469 val = cpu_to_le32(val);
6470 memcpy(pd + i, &val, 4);
6472 eeprom->len += i;
6474 if (len & 3) {
6475 /* read last bytes not ending on 4 byte boundary */
6476 pd = &data[eeprom->len];
6477 b_count = len & 3;
6478 b_offset = offset + len - b_count;
6479 ret = tg3_nvram_read(tp, b_offset, &val);
6480 if (ret)
6481 return ret;
6482 val = cpu_to_le32(val);
6483 memcpy(pd, ((char*)&val), b_count);
6484 eeprom->len += b_count;
6486 return 0;
6489 static int tg3_nvram_write_block(struct tg3 *tp, u32 offset, u32 len, u8 *buf);
6491 static int tg3_set_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom, u8 *data)
6493 struct tg3 *tp = netdev_priv(dev);
6494 int ret;
6495 u32 offset, len, b_offset, odd_len, start, end;
6496 u8 *buf;
6498 if (eeprom->magic != TG3_EEPROM_MAGIC)
6499 return -EINVAL;
6501 offset = eeprom->offset;
6502 len = eeprom->len;
6504 if ((b_offset = (offset & 3))) {
6505 /* adjustments to start on required 4 byte boundary */
6506 ret = tg3_nvram_read(tp, offset-b_offset, &start);
6507 if (ret)
6508 return ret;
6509 start = cpu_to_le32(start);
6510 len += b_offset;
6511 offset &= ~3;
6514 odd_len = 0;
6515 if ((len & 3) && ((len > 4) || (b_offset == 0))) {
6516 /* adjustments to end on required 4 byte boundary */
6517 odd_len = 1;
6518 len = (len + 3) & ~3;
6519 ret = tg3_nvram_read(tp, offset+len-4, &end);
6520 if (ret)
6521 return ret;
6522 end = cpu_to_le32(end);
6525 buf = data;
6526 if (b_offset || odd_len) {
6527 buf = kmalloc(len, GFP_KERNEL);
6528 if (buf == 0)
6529 return -ENOMEM;
6530 if (b_offset)
6531 memcpy(buf, &start, 4);
6532 if (odd_len)
6533 memcpy(buf+len-4, &end, 4);
6534 memcpy(buf + b_offset, data, eeprom->len);
6537 ret = tg3_nvram_write_block(tp, offset, len, buf);
6539 if (buf != data)
6540 kfree(buf);
6542 return ret;
6545 static int tg3_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
6547 struct tg3 *tp = netdev_priv(dev);
6549 cmd->supported = (SUPPORTED_Autoneg);
6551 if (!(tp->tg3_flags & TG3_FLAG_10_100_ONLY))
6552 cmd->supported |= (SUPPORTED_1000baseT_Half |
6553 SUPPORTED_1000baseT_Full);
6555 if (!(tp->tg3_flags2 & TG3_FLG2_PHY_SERDES))
6556 cmd->supported |= (SUPPORTED_100baseT_Half |
6557 SUPPORTED_100baseT_Full |
6558 SUPPORTED_10baseT_Half |
6559 SUPPORTED_10baseT_Full |
6560 SUPPORTED_MII);
6561 else
6562 cmd->supported |= SUPPORTED_FIBRE;
6564 cmd->advertising = tp->link_config.advertising;
6565 if (netif_running(dev)) {
6566 cmd->speed = tp->link_config.active_speed;
6567 cmd->duplex = tp->link_config.active_duplex;
6569 cmd->port = 0;
6570 cmd->phy_address = PHY_ADDR;
6571 cmd->transceiver = 0;
6572 cmd->autoneg = tp->link_config.autoneg;
6573 cmd->maxtxpkt = 0;
6574 cmd->maxrxpkt = 0;
6575 return 0;
6578 static int tg3_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
6580 struct tg3 *tp = netdev_priv(dev);
6582 if (tp->tg3_flags2 & TG3_FLG2_PHY_SERDES) {
6583 /* These are the only valid advertisement bits allowed. */
6584 if (cmd->autoneg == AUTONEG_ENABLE &&
6585 (cmd->advertising & ~(ADVERTISED_1000baseT_Half |
6586 ADVERTISED_1000baseT_Full |
6587 ADVERTISED_Autoneg |
6588 ADVERTISED_FIBRE)))
6589 return -EINVAL;
6592 spin_lock_irq(&tp->lock);
6593 spin_lock(&tp->tx_lock);
6595 tp->link_config.autoneg = cmd->autoneg;
6596 if (cmd->autoneg == AUTONEG_ENABLE) {
6597 tp->link_config.advertising = cmd->advertising;
6598 tp->link_config.speed = SPEED_INVALID;
6599 tp->link_config.duplex = DUPLEX_INVALID;
6600 } else {
6601 tp->link_config.advertising = 0;
6602 tp->link_config.speed = cmd->speed;
6603 tp->link_config.duplex = cmd->duplex;
6606 if (netif_running(dev))
6607 tg3_setup_phy(tp, 1);
6609 spin_unlock(&tp->tx_lock);
6610 spin_unlock_irq(&tp->lock);
6612 return 0;
6615 static void tg3_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)
6617 struct tg3 *tp = netdev_priv(dev);
6619 strcpy(info->driver, DRV_MODULE_NAME);
6620 strcpy(info->version, DRV_MODULE_VERSION);
6621 strcpy(info->bus_info, pci_name(tp->pdev));
6624 static void tg3_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
6626 struct tg3 *tp = netdev_priv(dev);
6628 wol->supported = WAKE_MAGIC;
6629 wol->wolopts = 0;
6630 if (tp->tg3_flags & TG3_FLAG_WOL_ENABLE)
6631 wol->wolopts = WAKE_MAGIC;
6632 memset(&wol->sopass, 0, sizeof(wol->sopass));
6635 static int tg3_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
6637 struct tg3 *tp = netdev_priv(dev);
6639 if (wol->wolopts & ~WAKE_MAGIC)
6640 return -EINVAL;
6641 if ((wol->wolopts & WAKE_MAGIC) &&
6642 tp->tg3_flags2 & TG3_FLG2_PHY_SERDES &&
6643 !(tp->tg3_flags & TG3_FLAG_SERDES_WOL_CAP))
6644 return -EINVAL;
6646 spin_lock_irq(&tp->lock);
6647 if (wol->wolopts & WAKE_MAGIC)
6648 tp->tg3_flags |= TG3_FLAG_WOL_ENABLE;
6649 else
6650 tp->tg3_flags &= ~TG3_FLAG_WOL_ENABLE;
6651 spin_unlock_irq(&tp->lock);
6653 return 0;
6656 static u32 tg3_get_msglevel(struct net_device *dev)
6658 struct tg3 *tp = netdev_priv(dev);
6659 return tp->msg_enable;
6662 static void tg3_set_msglevel(struct net_device *dev, u32 value)
6664 struct tg3 *tp = netdev_priv(dev);
6665 tp->msg_enable = value;
6668 #if TG3_TSO_SUPPORT != 0
6669 static int tg3_set_tso(struct net_device *dev, u32 value)
6671 struct tg3 *tp = netdev_priv(dev);
6673 if (!(tp->tg3_flags2 & TG3_FLG2_TSO_CAPABLE)) {
6674 if (value)
6675 return -EINVAL;
6676 return 0;
6678 return ethtool_op_set_tso(dev, value);
6680 #endif
6682 static int tg3_nway_reset(struct net_device *dev)
6684 struct tg3 *tp = netdev_priv(dev);
6685 u32 bmcr;
6686 int r;
6688 if (!netif_running(dev))
6689 return -EAGAIN;
6691 spin_lock_irq(&tp->lock);
6692 r = -EINVAL;
6693 tg3_readphy(tp, MII_BMCR, &bmcr);
6694 if (!tg3_readphy(tp, MII_BMCR, &bmcr) &&
6695 (bmcr & BMCR_ANENABLE)) {
6696 tg3_writephy(tp, MII_BMCR, bmcr | BMCR_ANRESTART);
6697 r = 0;
6699 spin_unlock_irq(&tp->lock);
6701 return r;
6704 static void tg3_get_ringparam(struct net_device *dev, struct ethtool_ringparam *ering)
6706 struct tg3 *tp = netdev_priv(dev);
6708 ering->rx_max_pending = TG3_RX_RING_SIZE - 1;
6709 ering->rx_mini_max_pending = 0;
6710 ering->rx_jumbo_max_pending = TG3_RX_JUMBO_RING_SIZE - 1;
6712 ering->rx_pending = tp->rx_pending;
6713 ering->rx_mini_pending = 0;
6714 ering->rx_jumbo_pending = tp->rx_jumbo_pending;
6715 ering->tx_pending = tp->tx_pending;
6718 static int tg3_set_ringparam(struct net_device *dev, struct ethtool_ringparam *ering)
6720 struct tg3 *tp = netdev_priv(dev);
6722 if ((ering->rx_pending > TG3_RX_RING_SIZE - 1) ||
6723 (ering->rx_jumbo_pending > TG3_RX_JUMBO_RING_SIZE - 1) ||
6724 (ering->tx_pending > TG3_TX_RING_SIZE - 1))
6725 return -EINVAL;
6727 if (netif_running(dev))
6728 tg3_netif_stop(tp);
6730 spin_lock_irq(&tp->lock);
6731 spin_lock(&tp->tx_lock);
6733 tp->rx_pending = ering->rx_pending;
6735 if ((tp->tg3_flags2 & TG3_FLG2_MAX_RXPEND_64) &&
6736 tp->rx_pending > 63)
6737 tp->rx_pending = 63;
6738 tp->rx_jumbo_pending = ering->rx_jumbo_pending;
6739 tp->tx_pending = ering->tx_pending;
6741 if (netif_running(dev)) {
6742 tg3_halt(tp);
6743 tg3_init_hw(tp);
6744 tg3_netif_start(tp);
6747 spin_unlock(&tp->tx_lock);
6748 spin_unlock_irq(&tp->lock);
6750 return 0;
6753 static void tg3_get_pauseparam(struct net_device *dev, struct ethtool_pauseparam *epause)
6755 struct tg3 *tp = netdev_priv(dev);
6757 epause->autoneg = (tp->tg3_flags & TG3_FLAG_PAUSE_AUTONEG) != 0;
6758 epause->rx_pause = (tp->tg3_flags & TG3_FLAG_RX_PAUSE) != 0;
6759 epause->tx_pause = (tp->tg3_flags & TG3_FLAG_TX_PAUSE) != 0;
6762 static int tg3_set_pauseparam(struct net_device *dev, struct ethtool_pauseparam *epause)
6764 struct tg3 *tp = netdev_priv(dev);
6766 if (netif_running(dev))
6767 tg3_netif_stop(tp);
6769 spin_lock_irq(&tp->lock);
6770 spin_lock(&tp->tx_lock);
6771 if (epause->autoneg)
6772 tp->tg3_flags |= TG3_FLAG_PAUSE_AUTONEG;
6773 else
6774 tp->tg3_flags &= ~TG3_FLAG_PAUSE_AUTONEG;
6775 if (epause->rx_pause)
6776 tp->tg3_flags |= TG3_FLAG_RX_PAUSE;
6777 else
6778 tp->tg3_flags &= ~TG3_FLAG_RX_PAUSE;
6779 if (epause->tx_pause)
6780 tp->tg3_flags |= TG3_FLAG_TX_PAUSE;
6781 else
6782 tp->tg3_flags &= ~TG3_FLAG_TX_PAUSE;
6784 if (netif_running(dev)) {
6785 tg3_halt(tp);
6786 tg3_init_hw(tp);
6787 tg3_netif_start(tp);
6789 spin_unlock(&tp->tx_lock);
6790 spin_unlock_irq(&tp->lock);
6792 return 0;
6795 static u32 tg3_get_rx_csum(struct net_device *dev)
6797 struct tg3 *tp = netdev_priv(dev);
6798 return (tp->tg3_flags & TG3_FLAG_RX_CHECKSUMS) != 0;
6801 static int tg3_set_rx_csum(struct net_device *dev, u32 data)
6803 struct tg3 *tp = netdev_priv(dev);
6805 if (tp->tg3_flags & TG3_FLAG_BROKEN_CHECKSUMS) {
6806 if (data != 0)
6807 return -EINVAL;
6808 return 0;
6811 spin_lock_irq(&tp->lock);
6812 if (data)
6813 tp->tg3_flags |= TG3_FLAG_RX_CHECKSUMS;
6814 else
6815 tp->tg3_flags &= ~TG3_FLAG_RX_CHECKSUMS;
6816 spin_unlock_irq(&tp->lock);
6818 return 0;
6821 static int tg3_set_tx_csum(struct net_device *dev, u32 data)
6823 struct tg3 *tp = netdev_priv(dev);
6825 if (tp->tg3_flags & TG3_FLAG_BROKEN_CHECKSUMS) {
6826 if (data != 0)
6827 return -EINVAL;
6828 return 0;
6831 if (data)
6832 dev->features |= NETIF_F_IP_CSUM;
6833 else
6834 dev->features &= ~NETIF_F_IP_CSUM;
6836 return 0;
6839 static int tg3_get_stats_count (struct net_device *dev)
6841 return TG3_NUM_STATS;
6844 static void tg3_get_strings (struct net_device *dev, u32 stringset, u8 *buf)
6846 switch (stringset) {
6847 case ETH_SS_STATS:
6848 memcpy(buf, &ethtool_stats_keys, sizeof(ethtool_stats_keys));
6849 break;
6850 default:
6851 WARN_ON(1); /* we need a WARN() */
6852 break;
6856 static void tg3_get_ethtool_stats (struct net_device *dev,
6857 struct ethtool_stats *estats, u64 *tmp_stats)
6859 struct tg3 *tp = netdev_priv(dev);
6860 memcpy(tmp_stats, tg3_get_estats(tp), sizeof(tp->estats));
6863 static int tg3_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
6865 struct mii_ioctl_data *data = if_mii(ifr);
6866 struct tg3 *tp = netdev_priv(dev);
6867 int err;
6869 switch(cmd) {
6870 case SIOCGMIIPHY:
6871 data->phy_id = PHY_ADDR;
6873 /* fallthru */
6874 case SIOCGMIIREG: {
6875 u32 mii_regval;
6877 if (tp->tg3_flags2 & TG3_FLG2_PHY_SERDES)
6878 break; /* We have no PHY */
6880 spin_lock_irq(&tp->lock);
6881 err = tg3_readphy(tp, data->reg_num & 0x1f, &mii_regval);
6882 spin_unlock_irq(&tp->lock);
6884 data->val_out = mii_regval;
6886 return err;
6889 case SIOCSMIIREG:
6890 if (tp->tg3_flags2 & TG3_FLG2_PHY_SERDES)
6891 break; /* We have no PHY */
6893 if (!capable(CAP_NET_ADMIN))
6894 return -EPERM;
6896 spin_lock_irq(&tp->lock);
6897 err = tg3_writephy(tp, data->reg_num & 0x1f, data->val_in);
6898 spin_unlock_irq(&tp->lock);
6900 return err;
6902 default:
6903 /* do nothing */
6904 break;
6906 return -EOPNOTSUPP;
6909 #if TG3_VLAN_TAG_USED
6910 static void tg3_vlan_rx_register(struct net_device *dev, struct vlan_group *grp)
6912 struct tg3 *tp = netdev_priv(dev);
6914 spin_lock_irq(&tp->lock);
6915 spin_lock(&tp->tx_lock);
6917 tp->vlgrp = grp;
6919 /* Update RX_MODE_KEEP_VLAN_TAG bit in RX_MODE register. */
6920 __tg3_set_rx_mode(dev);
6922 spin_unlock(&tp->tx_lock);
6923 spin_unlock_irq(&tp->lock);
6926 static void tg3_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
6928 struct tg3 *tp = netdev_priv(dev);
6930 spin_lock_irq(&tp->lock);
6931 spin_lock(&tp->tx_lock);
6932 if (tp->vlgrp)
6933 tp->vlgrp->vlan_devices[vid] = NULL;
6934 spin_unlock(&tp->tx_lock);
6935 spin_unlock_irq(&tp->lock);
6937 #endif
6939 static struct ethtool_ops tg3_ethtool_ops = {
6940 .get_settings = tg3_get_settings,
6941 .set_settings = tg3_set_settings,
6942 .get_drvinfo = tg3_get_drvinfo,
6943 .get_regs_len = tg3_get_regs_len,
6944 .get_regs = tg3_get_regs,
6945 .get_wol = tg3_get_wol,
6946 .set_wol = tg3_set_wol,
6947 .get_msglevel = tg3_get_msglevel,
6948 .set_msglevel = tg3_set_msglevel,
6949 .nway_reset = tg3_nway_reset,
6950 .get_link = ethtool_op_get_link,
6951 .get_eeprom_len = tg3_get_eeprom_len,
6952 .get_eeprom = tg3_get_eeprom,
6953 .set_eeprom = tg3_set_eeprom,
6954 .get_ringparam = tg3_get_ringparam,
6955 .set_ringparam = tg3_set_ringparam,
6956 .get_pauseparam = tg3_get_pauseparam,
6957 .set_pauseparam = tg3_set_pauseparam,
6958 .get_rx_csum = tg3_get_rx_csum,
6959 .set_rx_csum = tg3_set_rx_csum,
6960 .get_tx_csum = ethtool_op_get_tx_csum,
6961 .set_tx_csum = tg3_set_tx_csum,
6962 .get_sg = ethtool_op_get_sg,
6963 .set_sg = ethtool_op_set_sg,
6964 #if TG3_TSO_SUPPORT != 0
6965 .get_tso = ethtool_op_get_tso,
6966 .set_tso = tg3_set_tso,
6967 #endif
6968 .get_strings = tg3_get_strings,
6969 .get_stats_count = tg3_get_stats_count,
6970 .get_ethtool_stats = tg3_get_ethtool_stats,
6973 static void __devinit tg3_get_eeprom_size(struct tg3 *tp)
6975 u32 cursize, val;
6977 tp->nvram_size = EEPROM_CHIP_SIZE;
6979 if (tg3_nvram_read(tp, 0, &val) != 0)
6980 return;
6982 if (swab32(val) != TG3_EEPROM_MAGIC)
6983 return;
6986 * Size the chip by reading offsets at increasing powers of two.
6987 * When we encounter our validation signature, we know the addressing
6988 * has wrapped around, and thus have our chip size.
6990 cursize = 0x800;
6992 while (cursize < tp->nvram_size) {
6993 if (tg3_nvram_read(tp, cursize, &val) != 0)
6994 return;
6996 if (swab32(val) == TG3_EEPROM_MAGIC)
6997 break;
6999 cursize <<= 1;
7002 tp->nvram_size = cursize;
7005 static void __devinit tg3_get_nvram_size(struct tg3 *tp)
7007 u32 val;
7009 if (tg3_nvram_read(tp, 0xf0, &val) == 0) {
7010 if (val != 0) {
7011 tp->nvram_size = (val >> 16) * 1024;
7012 return;
7015 tp->nvram_size = 0x20000;
7018 static void __devinit tg3_get_nvram_info(struct tg3 *tp)
7020 u32 nvcfg1;
7022 nvcfg1 = tr32(NVRAM_CFG1);
7023 if (nvcfg1 & NVRAM_CFG1_FLASHIF_ENAB) {
7024 tp->tg3_flags2 |= TG3_FLG2_FLASH;
7026 else {
7027 nvcfg1 &= ~NVRAM_CFG1_COMPAT_BYPASS;
7028 tw32(NVRAM_CFG1, nvcfg1);
7031 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750) {
7032 switch (nvcfg1 & NVRAM_CFG1_VENDOR_MASK) {
7033 case FLASH_VENDOR_ATMEL_FLASH_BUFFERED:
7034 tp->nvram_jedecnum = JEDEC_ATMEL;
7035 tp->nvram_pagesize = ATMEL_AT45DB0X1B_PAGE_SIZE;
7036 tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED;
7037 break;
7038 case FLASH_VENDOR_ATMEL_FLASH_UNBUFFERED:
7039 tp->nvram_jedecnum = JEDEC_ATMEL;
7040 tp->nvram_pagesize = ATMEL_AT25F512_PAGE_SIZE;
7041 break;
7042 case FLASH_VENDOR_ATMEL_EEPROM:
7043 tp->nvram_jedecnum = JEDEC_ATMEL;
7044 tp->nvram_pagesize = ATMEL_AT24C512_CHIP_SIZE;
7045 tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED;
7046 break;
7047 case FLASH_VENDOR_ST:
7048 tp->nvram_jedecnum = JEDEC_ST;
7049 tp->nvram_pagesize = ST_M45PEX0_PAGE_SIZE;
7050 tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED;
7051 break;
7052 case FLASH_VENDOR_SAIFUN:
7053 tp->nvram_jedecnum = JEDEC_SAIFUN;
7054 tp->nvram_pagesize = SAIFUN_SA25F0XX_PAGE_SIZE;
7055 break;
7056 case FLASH_VENDOR_SST_SMALL:
7057 case FLASH_VENDOR_SST_LARGE:
7058 tp->nvram_jedecnum = JEDEC_SST;
7059 tp->nvram_pagesize = SST_25VF0X0_PAGE_SIZE;
7060 break;
7063 else {
7064 tp->nvram_jedecnum = JEDEC_ATMEL;
7065 tp->nvram_pagesize = ATMEL_AT45DB0X1B_PAGE_SIZE;
7066 tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED;
7070 /* Chips other than 5700/5701 use the NVRAM for fetching info. */
7071 static void __devinit tg3_nvram_init(struct tg3 *tp)
7073 int j;
7075 if (tp->tg3_flags2 & TG3_FLG2_SUN_570X)
7076 return;
7078 tw32_f(GRC_EEPROM_ADDR,
7079 (EEPROM_ADDR_FSM_RESET |
7080 (EEPROM_DEFAULT_CLOCK_PERIOD <<
7081 EEPROM_ADDR_CLKPERD_SHIFT)));
7083 /* XXX schedule_timeout() ... */
7084 for (j = 0; j < 100; j++)
7085 udelay(10);
7087 /* Enable seeprom accesses. */
7088 tw32_f(GRC_LOCAL_CTRL,
7089 tr32(GRC_LOCAL_CTRL) | GRC_LCLCTRL_AUTO_SEEPROM);
7090 udelay(100);
7092 if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5700 &&
7093 GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5701) {
7094 tp->tg3_flags |= TG3_FLAG_NVRAM;
7096 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750) {
7097 u32 nvaccess = tr32(NVRAM_ACCESS);
7099 tw32(NVRAM_ACCESS, nvaccess | ACCESS_ENABLE);
7102 tg3_get_nvram_info(tp);
7103 tg3_get_nvram_size(tp);
7105 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750) {
7106 u32 nvaccess = tr32(NVRAM_ACCESS);
7108 tw32(NVRAM_ACCESS, nvaccess & ~ACCESS_ENABLE);
7111 } else {
7112 tp->tg3_flags &= ~(TG3_FLAG_NVRAM | TG3_FLAG_NVRAM_BUFFERED);
7114 tg3_get_eeprom_size(tp);
7118 static int tg3_nvram_read_using_eeprom(struct tg3 *tp,
7119 u32 offset, u32 *val)
7121 u32 tmp;
7122 int i;
7124 if (offset > EEPROM_ADDR_ADDR_MASK ||
7125 (offset % 4) != 0)
7126 return -EINVAL;
7128 tmp = tr32(GRC_EEPROM_ADDR) & ~(EEPROM_ADDR_ADDR_MASK |
7129 EEPROM_ADDR_DEVID_MASK |
7130 EEPROM_ADDR_READ);
7131 tw32(GRC_EEPROM_ADDR,
7132 tmp |
7133 (0 << EEPROM_ADDR_DEVID_SHIFT) |
7134 ((offset << EEPROM_ADDR_ADDR_SHIFT) &
7135 EEPROM_ADDR_ADDR_MASK) |
7136 EEPROM_ADDR_READ | EEPROM_ADDR_START);
7138 for (i = 0; i < 10000; i++) {
7139 tmp = tr32(GRC_EEPROM_ADDR);
7141 if (tmp & EEPROM_ADDR_COMPLETE)
7142 break;
7143 udelay(100);
7145 if (!(tmp & EEPROM_ADDR_COMPLETE))
7146 return -EBUSY;
7148 *val = tr32(GRC_EEPROM_DATA);
7149 return 0;
7152 #define NVRAM_CMD_TIMEOUT 10000
7154 static int tg3_nvram_exec_cmd(struct tg3 *tp, u32 nvram_cmd)
7156 int i;
7158 tw32(NVRAM_CMD, nvram_cmd);
7159 for (i = 0; i < NVRAM_CMD_TIMEOUT; i++) {
7160 udelay(10);
7161 if (tr32(NVRAM_CMD) & NVRAM_CMD_DONE) {
7162 udelay(10);
7163 break;
7166 if (i == NVRAM_CMD_TIMEOUT) {
7167 return -EBUSY;
7169 return 0;
7172 static int tg3_nvram_read(struct tg3 *tp, u32 offset, u32 *val)
7174 int ret;
7176 if (tp->tg3_flags2 & TG3_FLG2_SUN_570X) {
7177 printk(KERN_ERR PFX "Attempt to do nvram_read on Sun 570X\n");
7178 return -EINVAL;
7181 if (!(tp->tg3_flags & TG3_FLAG_NVRAM))
7182 return tg3_nvram_read_using_eeprom(tp, offset, val);
7184 if ((tp->tg3_flags & TG3_FLAG_NVRAM_BUFFERED) &&
7185 (tp->tg3_flags2 & TG3_FLG2_FLASH) &&
7186 (tp->nvram_jedecnum == JEDEC_ATMEL)) {
7188 offset = ((offset / tp->nvram_pagesize) <<
7189 ATMEL_AT45DB0X1B_PAGE_POS) +
7190 (offset % tp->nvram_pagesize);
7193 if (offset > NVRAM_ADDR_MSK)
7194 return -EINVAL;
7196 tg3_nvram_lock(tp);
7198 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750) {
7199 u32 nvaccess = tr32(NVRAM_ACCESS);
7201 tw32_f(NVRAM_ACCESS, nvaccess | ACCESS_ENABLE);
7204 tw32(NVRAM_ADDR, offset);
7205 ret = tg3_nvram_exec_cmd(tp, NVRAM_CMD_RD | NVRAM_CMD_GO |
7206 NVRAM_CMD_FIRST | NVRAM_CMD_LAST | NVRAM_CMD_DONE);
7208 if (ret == 0)
7209 *val = swab32(tr32(NVRAM_RDDATA));
7211 tg3_nvram_unlock(tp);
7213 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750) {
7214 u32 nvaccess = tr32(NVRAM_ACCESS);
7216 tw32_f(NVRAM_ACCESS, nvaccess & ~ACCESS_ENABLE);
7219 return ret;
7222 static int tg3_nvram_write_block_using_eeprom(struct tg3 *tp,
7223 u32 offset, u32 len, u8 *buf)
7225 int i, j, rc = 0;
7226 u32 val;
7228 for (i = 0; i < len; i += 4) {
7229 u32 addr, data;
7231 addr = offset + i;
7233 memcpy(&data, buf + i, 4);
7235 tw32(GRC_EEPROM_DATA, cpu_to_le32(data));
7237 val = tr32(GRC_EEPROM_ADDR);
7238 tw32(GRC_EEPROM_ADDR, val | EEPROM_ADDR_COMPLETE);
7240 val &= ~(EEPROM_ADDR_ADDR_MASK | EEPROM_ADDR_DEVID_MASK |
7241 EEPROM_ADDR_READ);
7242 tw32(GRC_EEPROM_ADDR, val |
7243 (0 << EEPROM_ADDR_DEVID_SHIFT) |
7244 (addr & EEPROM_ADDR_ADDR_MASK) |
7245 EEPROM_ADDR_START |
7246 EEPROM_ADDR_WRITE);
7248 for (j = 0; j < 10000; j++) {
7249 val = tr32(GRC_EEPROM_ADDR);
7251 if (val & EEPROM_ADDR_COMPLETE)
7252 break;
7253 udelay(100);
7255 if (!(val & EEPROM_ADDR_COMPLETE)) {
7256 rc = -EBUSY;
7257 break;
7261 return rc;
7264 /* offset and length are dword aligned */
7265 static int tg3_nvram_write_block_unbuffered(struct tg3 *tp, u32 offset, u32 len,
7266 u8 *buf)
7268 int ret = 0;
7269 u32 pagesize = tp->nvram_pagesize;
7270 u32 pagemask = pagesize - 1;
7271 u32 nvram_cmd;
7272 u8 *tmp;
7274 tmp = kmalloc(pagesize, GFP_KERNEL);
7275 if (tmp == NULL)
7276 return -ENOMEM;
7278 while (len) {
7279 int j;
7280 u32 phy_addr, page_off, size, nvaccess;
7282 phy_addr = offset & ~pagemask;
7284 for (j = 0; j < pagesize; j += 4) {
7285 if ((ret = tg3_nvram_read(tp, phy_addr + j,
7286 (u32 *) (tmp + j))))
7287 break;
7289 if (ret)
7290 break;
7292 page_off = offset & pagemask;
7293 size = pagesize;
7294 if (len < size)
7295 size = len;
7297 len -= size;
7299 memcpy(tmp + page_off, buf, size);
7301 offset = offset + (pagesize - page_off);
7303 nvaccess = tr32(NVRAM_ACCESS);
7304 tw32_f(NVRAM_ACCESS, nvaccess | ACCESS_ENABLE);
7307 * Before we can erase the flash page, we need
7308 * to issue a special "write enable" command.
7310 nvram_cmd = NVRAM_CMD_WREN | NVRAM_CMD_GO | NVRAM_CMD_DONE;
7312 if (tg3_nvram_exec_cmd(tp, nvram_cmd))
7313 break;
7315 /* Erase the target page */
7316 tw32(NVRAM_ADDR, phy_addr);
7318 nvram_cmd = NVRAM_CMD_GO | NVRAM_CMD_DONE | NVRAM_CMD_WR |
7319 NVRAM_CMD_FIRST | NVRAM_CMD_LAST | NVRAM_CMD_ERASE;
7321 if (tg3_nvram_exec_cmd(tp, nvram_cmd))
7322 break;
7324 /* Issue another write enable to start the write. */
7325 nvram_cmd = NVRAM_CMD_WREN | NVRAM_CMD_GO | NVRAM_CMD_DONE;
7327 if (tg3_nvram_exec_cmd(tp, nvram_cmd))
7328 break;
7330 for (j = 0; j < pagesize; j += 4) {
7331 u32 data;
7333 data = *((u32 *) (tmp + j));
7334 tw32(NVRAM_WRDATA, cpu_to_be32(data));
7336 tw32(NVRAM_ADDR, phy_addr + j);
7338 nvram_cmd = NVRAM_CMD_GO | NVRAM_CMD_DONE |
7339 NVRAM_CMD_WR;
7341 if (j == 0)
7342 nvram_cmd |= NVRAM_CMD_FIRST;
7343 else if (j == (pagesize - 4))
7344 nvram_cmd |= NVRAM_CMD_LAST;
7346 if ((ret = tg3_nvram_exec_cmd(tp, nvram_cmd)))
7347 break;
7349 if (ret)
7350 break;
7353 nvram_cmd = NVRAM_CMD_WRDI | NVRAM_CMD_GO | NVRAM_CMD_DONE;
7354 tg3_nvram_exec_cmd(tp, nvram_cmd);
7356 kfree(tmp);
7358 return ret;
7361 /* offset and length are dword aligned */
7362 static int tg3_nvram_write_block_buffered(struct tg3 *tp, u32 offset, u32 len,
7363 u8 *buf)
7365 int i, ret = 0;
7367 for (i = 0; i < len; i += 4, offset += 4) {
7368 u32 data, page_off, phy_addr, nvram_cmd;
7370 memcpy(&data, buf + i, 4);
7371 tw32(NVRAM_WRDATA, cpu_to_be32(data));
7373 page_off = offset % tp->nvram_pagesize;
7375 if ((tp->tg3_flags2 & TG3_FLG2_FLASH) &&
7376 (tp->nvram_jedecnum == JEDEC_ATMEL)) {
7378 phy_addr = ((offset / tp->nvram_pagesize) <<
7379 ATMEL_AT45DB0X1B_PAGE_POS) + page_off;
7381 else {
7382 phy_addr = offset;
7385 tw32(NVRAM_ADDR, phy_addr);
7387 nvram_cmd = NVRAM_CMD_GO | NVRAM_CMD_DONE | NVRAM_CMD_WR;
7389 if ((page_off == 0) || (i == 0))
7390 nvram_cmd |= NVRAM_CMD_FIRST;
7391 else if (page_off == (tp->nvram_pagesize - 4))
7392 nvram_cmd |= NVRAM_CMD_LAST;
7394 if (i == (len - 4))
7395 nvram_cmd |= NVRAM_CMD_LAST;
7397 if ((tp->nvram_jedecnum == JEDEC_ST) &&
7398 (nvram_cmd & NVRAM_CMD_FIRST)) {
7400 if ((ret = tg3_nvram_exec_cmd(tp,
7401 NVRAM_CMD_WREN | NVRAM_CMD_GO |
7402 NVRAM_CMD_DONE)))
7404 break;
7406 if (!(tp->tg3_flags2 & TG3_FLG2_FLASH)) {
7407 /* We always do complete word writes to eeprom. */
7408 nvram_cmd |= (NVRAM_CMD_FIRST | NVRAM_CMD_LAST);
7411 if ((ret = tg3_nvram_exec_cmd(tp, nvram_cmd)))
7412 break;
7414 return ret;
7417 /* offset and length are dword aligned */
7418 static int tg3_nvram_write_block(struct tg3 *tp, u32 offset, u32 len, u8 *buf)
7420 int ret;
7422 if (tp->tg3_flags2 & TG3_FLG2_SUN_570X) {
7423 printk(KERN_ERR PFX "Attempt to do nvram_write on Sun 570X\n");
7424 return -EINVAL;
7427 if (tp->tg3_flags & TG3_FLAG_EEPROM_WRITE_PROT) {
7428 tw32_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl |
7429 GRC_LCLCTRL_GPIO_OE1);
7430 udelay(40);
7433 if (!(tp->tg3_flags & TG3_FLAG_NVRAM)) {
7434 ret = tg3_nvram_write_block_using_eeprom(tp, offset, len, buf);
7436 else {
7437 u32 grc_mode;
7439 tg3_nvram_lock(tp);
7441 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750) {
7442 u32 nvaccess = tr32(NVRAM_ACCESS);
7444 tw32(NVRAM_ACCESS, nvaccess | ACCESS_ENABLE);
7446 tw32(NVRAM_WRITE1, 0x406);
7449 grc_mode = tr32(GRC_MODE);
7450 tw32(GRC_MODE, grc_mode | GRC_MODE_NVRAM_WR_ENABLE);
7452 if ((tp->tg3_flags & TG3_FLAG_NVRAM_BUFFERED) ||
7453 !(tp->tg3_flags2 & TG3_FLG2_FLASH)) {
7455 ret = tg3_nvram_write_block_buffered(tp, offset, len,
7456 buf);
7458 else {
7459 ret = tg3_nvram_write_block_unbuffered(tp, offset, len,
7460 buf);
7463 grc_mode = tr32(GRC_MODE);
7464 tw32(GRC_MODE, grc_mode & ~GRC_MODE_NVRAM_WR_ENABLE);
7466 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750) {
7467 u32 nvaccess = tr32(NVRAM_ACCESS);
7469 tw32(NVRAM_ACCESS, nvaccess & ~ACCESS_ENABLE);
7471 tg3_nvram_unlock(tp);
7474 if (tp->tg3_flags & TG3_FLAG_EEPROM_WRITE_PROT) {
7475 tw32_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl |
7476 GRC_LCLCTRL_GPIO_OE1 | GRC_LCLCTRL_GPIO_OUTPUT1);
7477 udelay(40);
7480 return ret;
7483 struct subsys_tbl_ent {
7484 u16 subsys_vendor, subsys_devid;
7485 u32 phy_id;
7488 static struct subsys_tbl_ent subsys_id_to_phy_id[] = {
7489 /* Broadcom boards. */
7490 { PCI_VENDOR_ID_BROADCOM, 0x1644, PHY_ID_BCM5401 }, /* BCM95700A6 */
7491 { PCI_VENDOR_ID_BROADCOM, 0x0001, PHY_ID_BCM5701 }, /* BCM95701A5 */
7492 { PCI_VENDOR_ID_BROADCOM, 0x0002, PHY_ID_BCM8002 }, /* BCM95700T6 */
7493 { PCI_VENDOR_ID_BROADCOM, 0x0003, 0 }, /* BCM95700A9 */
7494 { PCI_VENDOR_ID_BROADCOM, 0x0005, PHY_ID_BCM5701 }, /* BCM95701T1 */
7495 { PCI_VENDOR_ID_BROADCOM, 0x0006, PHY_ID_BCM5701 }, /* BCM95701T8 */
7496 { PCI_VENDOR_ID_BROADCOM, 0x0007, 0 }, /* BCM95701A7 */
7497 { PCI_VENDOR_ID_BROADCOM, 0x0008, PHY_ID_BCM5701 }, /* BCM95701A10 */
7498 { PCI_VENDOR_ID_BROADCOM, 0x8008, PHY_ID_BCM5701 }, /* BCM95701A12 */
7499 { PCI_VENDOR_ID_BROADCOM, 0x0009, PHY_ID_BCM5703 }, /* BCM95703Ax1 */
7500 { PCI_VENDOR_ID_BROADCOM, 0x8009, PHY_ID_BCM5703 }, /* BCM95703Ax2 */
7502 /* 3com boards. */
7503 { PCI_VENDOR_ID_3COM, 0x1000, PHY_ID_BCM5401 }, /* 3C996T */
7504 { PCI_VENDOR_ID_3COM, 0x1006, PHY_ID_BCM5701 }, /* 3C996BT */
7505 { PCI_VENDOR_ID_3COM, 0x1004, 0 }, /* 3C996SX */
7506 { PCI_VENDOR_ID_3COM, 0x1007, PHY_ID_BCM5701 }, /* 3C1000T */
7507 { PCI_VENDOR_ID_3COM, 0x1008, PHY_ID_BCM5701 }, /* 3C940BR01 */
7509 /* DELL boards. */
7510 { PCI_VENDOR_ID_DELL, 0x00d1, PHY_ID_BCM5401 }, /* VIPER */
7511 { PCI_VENDOR_ID_DELL, 0x0106, PHY_ID_BCM5401 }, /* JAGUAR */
7512 { PCI_VENDOR_ID_DELL, 0x0109, PHY_ID_BCM5411 }, /* MERLOT */
7513 { PCI_VENDOR_ID_DELL, 0x010a, PHY_ID_BCM5411 }, /* SLIM_MERLOT */
7515 /* Compaq boards. */
7516 { PCI_VENDOR_ID_COMPAQ, 0x007c, PHY_ID_BCM5701 }, /* BANSHEE */
7517 { PCI_VENDOR_ID_COMPAQ, 0x009a, PHY_ID_BCM5701 }, /* BANSHEE_2 */
7518 { PCI_VENDOR_ID_COMPAQ, 0x007d, 0 }, /* CHANGELING */
7519 { PCI_VENDOR_ID_COMPAQ, 0x0085, PHY_ID_BCM5701 }, /* NC7780 */
7520 { PCI_VENDOR_ID_COMPAQ, 0x0099, PHY_ID_BCM5701 }, /* NC7780_2 */
7522 /* IBM boards. */
7523 { PCI_VENDOR_ID_IBM, 0x0281, 0 } /* IBM??? */
7526 static inline struct subsys_tbl_ent *lookup_by_subsys(struct tg3 *tp)
7528 int i;
7530 for (i = 0; i < ARRAY_SIZE(subsys_id_to_phy_id); i++) {
7531 if ((subsys_id_to_phy_id[i].subsys_vendor ==
7532 tp->pdev->subsystem_vendor) &&
7533 (subsys_id_to_phy_id[i].subsys_devid ==
7534 tp->pdev->subsystem_device))
7535 return &subsys_id_to_phy_id[i];
7537 return NULL;
7540 static int __devinit tg3_phy_probe(struct tg3 *tp)
7542 u32 eeprom_phy_id, hw_phy_id_1, hw_phy_id_2;
7543 u32 hw_phy_id, hw_phy_id_masked;
7544 u32 val;
7545 int eeprom_signature_found, eeprom_phy_serdes, err;
7547 tp->phy_id = PHY_ID_INVALID;
7548 eeprom_phy_id = PHY_ID_INVALID;
7549 eeprom_phy_serdes = 0;
7550 eeprom_signature_found = 0;
7551 tg3_read_mem(tp, NIC_SRAM_DATA_SIG, &val);
7552 if (val == NIC_SRAM_DATA_SIG_MAGIC) {
7553 u32 nic_cfg, led_cfg;
7554 u32 nic_phy_id, ver, cfg2 = 0;
7556 tg3_read_mem(tp, NIC_SRAM_DATA_CFG, &nic_cfg);
7557 tp->nic_sram_data_cfg = nic_cfg;
7559 tg3_read_mem(tp, NIC_SRAM_DATA_VER, &ver);
7560 ver >>= NIC_SRAM_DATA_VER_SHIFT;
7561 if ((GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5700) &&
7562 (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5701) &&
7563 (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5703) &&
7564 (ver > 0) && (ver < 0x100))
7565 tg3_read_mem(tp, NIC_SRAM_DATA_CFG_2, &cfg2);
7567 eeprom_signature_found = 1;
7569 if ((nic_cfg & NIC_SRAM_DATA_CFG_PHY_TYPE_MASK) ==
7570 NIC_SRAM_DATA_CFG_PHY_TYPE_FIBER)
7571 eeprom_phy_serdes = 1;
7573 tg3_read_mem(tp, NIC_SRAM_DATA_PHY_ID, &nic_phy_id);
7574 if (nic_phy_id != 0) {
7575 u32 id1 = nic_phy_id & NIC_SRAM_DATA_PHY_ID1_MASK;
7576 u32 id2 = nic_phy_id & NIC_SRAM_DATA_PHY_ID2_MASK;
7578 eeprom_phy_id = (id1 >> 16) << 10;
7579 eeprom_phy_id |= (id2 & 0xfc00) << 16;
7580 eeprom_phy_id |= (id2 & 0x03ff) << 0;
7581 } else
7582 eeprom_phy_id = 0;
7584 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750) {
7585 led_cfg = cfg2 & (NIC_SRAM_DATA_CFG_LED_MODE_MASK |
7586 SHASTA_EXT_LED_MODE_MASK);
7587 } else
7588 led_cfg = nic_cfg & NIC_SRAM_DATA_CFG_LED_MODE_MASK;
7590 switch (led_cfg) {
7591 default:
7592 case NIC_SRAM_DATA_CFG_LED_MODE_PHY_1:
7593 tp->led_ctrl = LED_CTRL_MODE_PHY_1;
7594 break;
7596 case NIC_SRAM_DATA_CFG_LED_MODE_PHY_2:
7597 tp->led_ctrl = LED_CTRL_MODE_PHY_2;
7598 break;
7600 case NIC_SRAM_DATA_CFG_LED_MODE_MAC:
7601 tp->led_ctrl = LED_CTRL_MODE_MAC;
7602 break;
7604 case SHASTA_EXT_LED_SHARED:
7605 tp->led_ctrl = LED_CTRL_MODE_SHARED;
7606 if (tp->pci_chip_rev_id != CHIPREV_ID_5750_A0 &&
7607 tp->pci_chip_rev_id != CHIPREV_ID_5750_A1)
7608 tp->led_ctrl |= (LED_CTRL_MODE_PHY_1 |
7609 LED_CTRL_MODE_PHY_2);
7610 break;
7612 case SHASTA_EXT_LED_MAC:
7613 tp->led_ctrl = LED_CTRL_MODE_SHASTA_MAC;
7614 break;
7616 case SHASTA_EXT_LED_COMBO:
7617 tp->led_ctrl = LED_CTRL_MODE_COMBO;
7618 if (tp->pci_chip_rev_id != CHIPREV_ID_5750_A0)
7619 tp->led_ctrl |= (LED_CTRL_MODE_PHY_1 |
7620 LED_CTRL_MODE_PHY_2);
7621 break;
7625 if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 ||
7626 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701) &&
7627 tp->pdev->subsystem_vendor == PCI_VENDOR_ID_DELL)
7628 tp->led_ctrl = LED_CTRL_MODE_PHY_2;
7630 if ((GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5700) &&
7631 (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5701) &&
7632 (nic_cfg & NIC_SRAM_DATA_CFG_EEPROM_WP))
7633 tp->tg3_flags |= TG3_FLAG_EEPROM_WRITE_PROT;
7635 if (nic_cfg & NIC_SRAM_DATA_CFG_ASF_ENABLE) {
7636 tp->tg3_flags |= TG3_FLAG_ENABLE_ASF;
7637 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750)
7638 tp->tg3_flags2 |= TG3_FLG2_ASF_NEW_HANDSHAKE;
7640 if (nic_cfg & NIC_SRAM_DATA_CFG_FIBER_WOL)
7641 tp->tg3_flags |= TG3_FLAG_SERDES_WOL_CAP;
7643 if (cfg2 & (1 << 17))
7644 tp->tg3_flags2 |= TG3_FLG2_CAPACITIVE_COUPLING;
7646 /* serdes signal pre-emphasis in register 0x590 set by */
7647 /* bootcode if bit 18 is set */
7648 if (cfg2 & (1 << 18))
7649 tp->tg3_flags2 |= TG3_FLG2_SERDES_PREEMPHASIS;
7652 /* Reading the PHY ID register can conflict with ASF
7653 * firwmare access to the PHY hardware.
7655 err = 0;
7656 if (tp->tg3_flags & TG3_FLAG_ENABLE_ASF) {
7657 hw_phy_id = hw_phy_id_masked = PHY_ID_INVALID;
7658 } else {
7659 /* Now read the physical PHY_ID from the chip and verify
7660 * that it is sane. If it doesn't look good, we fall back
7661 * to either the hard-coded table based PHY_ID and failing
7662 * that the value found in the eeprom area.
7664 err |= tg3_readphy(tp, MII_PHYSID1, &hw_phy_id_1);
7665 err |= tg3_readphy(tp, MII_PHYSID2, &hw_phy_id_2);
7667 hw_phy_id = (hw_phy_id_1 & 0xffff) << 10;
7668 hw_phy_id |= (hw_phy_id_2 & 0xfc00) << 16;
7669 hw_phy_id |= (hw_phy_id_2 & 0x03ff) << 0;
7671 hw_phy_id_masked = hw_phy_id & PHY_ID_MASK;
7674 if (!err && KNOWN_PHY_ID(hw_phy_id_masked)) {
7675 tp->phy_id = hw_phy_id;
7676 if (hw_phy_id_masked == PHY_ID_BCM8002)
7677 tp->tg3_flags2 |= TG3_FLG2_PHY_SERDES;
7678 } else {
7679 if (eeprom_signature_found) {
7680 tp->phy_id = eeprom_phy_id;
7681 if (eeprom_phy_serdes)
7682 tp->tg3_flags2 |= TG3_FLG2_PHY_SERDES;
7683 } else {
7684 struct subsys_tbl_ent *p;
7686 /* No eeprom signature? Try the hardcoded
7687 * subsys device table.
7689 p = lookup_by_subsys(tp);
7690 if (!p)
7691 return -ENODEV;
7693 tp->phy_id = p->phy_id;
7694 if (!tp->phy_id ||
7695 tp->phy_id == PHY_ID_BCM8002)
7696 tp->tg3_flags2 |= TG3_FLG2_PHY_SERDES;
7700 if (!(tp->tg3_flags2 & TG3_FLG2_PHY_SERDES) &&
7701 !(tp->tg3_flags & TG3_FLAG_ENABLE_ASF)) {
7702 u32 bmsr, adv_reg, tg3_ctrl;
7704 tg3_readphy(tp, MII_BMSR, &bmsr);
7705 if (!tg3_readphy(tp, MII_BMSR, &bmsr) &&
7706 (bmsr & BMSR_LSTATUS))
7707 goto skip_phy_reset;
7709 err = tg3_phy_reset(tp);
7710 if (err)
7711 return err;
7713 adv_reg = (ADVERTISE_10HALF | ADVERTISE_10FULL |
7714 ADVERTISE_100HALF | ADVERTISE_100FULL |
7715 ADVERTISE_CSMA | ADVERTISE_PAUSE_CAP);
7716 tg3_ctrl = 0;
7717 if (!(tp->tg3_flags & TG3_FLAG_10_100_ONLY)) {
7718 tg3_ctrl = (MII_TG3_CTRL_ADV_1000_HALF |
7719 MII_TG3_CTRL_ADV_1000_FULL);
7720 if (tp->pci_chip_rev_id == CHIPREV_ID_5701_A0 ||
7721 tp->pci_chip_rev_id == CHIPREV_ID_5701_B0)
7722 tg3_ctrl |= (MII_TG3_CTRL_AS_MASTER |
7723 MII_TG3_CTRL_ENABLE_AS_MASTER);
7726 if (!tg3_copper_is_advertising_all(tp)) {
7727 tg3_writephy(tp, MII_ADVERTISE, adv_reg);
7729 if (!(tp->tg3_flags & TG3_FLAG_10_100_ONLY))
7730 tg3_writephy(tp, MII_TG3_CTRL, tg3_ctrl);
7732 tg3_writephy(tp, MII_BMCR,
7733 BMCR_ANENABLE | BMCR_ANRESTART);
7735 tg3_phy_set_wirespeed(tp);
7737 tg3_writephy(tp, MII_ADVERTISE, adv_reg);
7738 if (!(tp->tg3_flags & TG3_FLAG_10_100_ONLY))
7739 tg3_writephy(tp, MII_TG3_CTRL, tg3_ctrl);
7742 skip_phy_reset:
7743 if ((tp->phy_id & PHY_ID_MASK) == PHY_ID_BCM5401) {
7744 err = tg3_init_5401phy_dsp(tp);
7745 if (err)
7746 return err;
7749 if (!err && ((tp->phy_id & PHY_ID_MASK) == PHY_ID_BCM5401)) {
7750 err = tg3_init_5401phy_dsp(tp);
7753 if (!eeprom_signature_found)
7754 tp->led_ctrl = LED_CTRL_MODE_PHY_1;
7756 if (tp->tg3_flags2 & TG3_FLG2_PHY_SERDES)
7757 tp->link_config.advertising =
7758 (ADVERTISED_1000baseT_Half |
7759 ADVERTISED_1000baseT_Full |
7760 ADVERTISED_Autoneg |
7761 ADVERTISED_FIBRE);
7762 if (tp->tg3_flags & TG3_FLAG_10_100_ONLY)
7763 tp->link_config.advertising &=
7764 ~(ADVERTISED_1000baseT_Half |
7765 ADVERTISED_1000baseT_Full);
7767 return err;
7770 static void __devinit tg3_read_partno(struct tg3 *tp)
7772 unsigned char vpd_data[256];
7773 int i;
7775 if (tp->tg3_flags2 & TG3_FLG2_SUN_570X) {
7776 /* Sun decided not to put the necessary bits in the
7777 * NVRAM of their onboard tg3 parts :(
7779 strcpy(tp->board_part_number, "Sun 570X");
7780 return;
7783 for (i = 0; i < 256; i += 4) {
7784 u32 tmp;
7786 if (tg3_nvram_read(tp, 0x100 + i, &tmp))
7787 goto out_not_found;
7789 vpd_data[i + 0] = ((tmp >> 0) & 0xff);
7790 vpd_data[i + 1] = ((tmp >> 8) & 0xff);
7791 vpd_data[i + 2] = ((tmp >> 16) & 0xff);
7792 vpd_data[i + 3] = ((tmp >> 24) & 0xff);
7795 /* Now parse and find the part number. */
7796 for (i = 0; i < 256; ) {
7797 unsigned char val = vpd_data[i];
7798 int block_end;
7800 if (val == 0x82 || val == 0x91) {
7801 i = (i + 3 +
7802 (vpd_data[i + 1] +
7803 (vpd_data[i + 2] << 8)));
7804 continue;
7807 if (val != 0x90)
7808 goto out_not_found;
7810 block_end = (i + 3 +
7811 (vpd_data[i + 1] +
7812 (vpd_data[i + 2] << 8)));
7813 i += 3;
7814 while (i < block_end) {
7815 if (vpd_data[i + 0] == 'P' &&
7816 vpd_data[i + 1] == 'N') {
7817 int partno_len = vpd_data[i + 2];
7819 if (partno_len > 24)
7820 goto out_not_found;
7822 memcpy(tp->board_part_number,
7823 &vpd_data[i + 3],
7824 partno_len);
7826 /* Success. */
7827 return;
7831 /* Part number not found. */
7832 goto out_not_found;
7835 out_not_found:
7836 strcpy(tp->board_part_number, "none");
7839 #ifdef CONFIG_SPARC64
7840 static int __devinit tg3_is_sun_570X(struct tg3 *tp)
7842 struct pci_dev *pdev = tp->pdev;
7843 struct pcidev_cookie *pcp = pdev->sysdata;
7845 if (pcp != NULL) {
7846 int node = pcp->prom_node;
7847 u32 venid;
7848 int err;
7850 err = prom_getproperty(node, "subsystem-vendor-id",
7851 (char *) &venid, sizeof(venid));
7852 if (err == 0 || err == -1)
7853 return 0;
7854 if (venid == PCI_VENDOR_ID_SUN)
7855 return 1;
7857 return 0;
7859 #endif
7861 static int __devinit tg3_get_invariants(struct tg3 *tp)
7863 static struct pci_device_id write_reorder_chipsets[] = {
7864 { PCI_DEVICE(PCI_VENDOR_ID_INTEL,
7865 PCI_DEVICE_ID_INTEL_82801AA_8) },
7866 { PCI_DEVICE(PCI_VENDOR_ID_INTEL,
7867 PCI_DEVICE_ID_INTEL_82801AB_8) },
7868 { PCI_DEVICE(PCI_VENDOR_ID_INTEL,
7869 PCI_DEVICE_ID_INTEL_82801BA_11) },
7870 { PCI_DEVICE(PCI_VENDOR_ID_INTEL,
7871 PCI_DEVICE_ID_INTEL_82801BA_6) },
7872 { PCI_DEVICE(PCI_VENDOR_ID_AMD,
7873 PCI_DEVICE_ID_AMD_FE_GATE_700C) },
7874 { },
7876 u32 misc_ctrl_reg;
7877 u32 cacheline_sz_reg;
7878 u32 pci_state_reg, grc_misc_cfg;
7879 u32 val;
7880 u16 pci_cmd;
7881 int err;
7883 #ifdef CONFIG_SPARC64
7884 if (tg3_is_sun_570X(tp))
7885 tp->tg3_flags2 |= TG3_FLG2_SUN_570X;
7886 #endif
7888 /* If we have an AMD 762 or Intel ICH/ICH0/ICH2 chipset, write
7889 * reordering to the mailbox registers done by the host
7890 * controller can cause major troubles. We read back from
7891 * every mailbox register write to force the writes to be
7892 * posted to the chip in order.
7894 if (pci_dev_present(write_reorder_chipsets))
7895 tp->tg3_flags |= TG3_FLAG_MBOX_WRITE_REORDER;
7897 /* Force memory write invalidate off. If we leave it on,
7898 * then on 5700_BX chips we have to enable a workaround.
7899 * The workaround is to set the TG3PCI_DMA_RW_CTRL boundary
7900 * to match the cacheline size. The Broadcom driver have this
7901 * workaround but turns MWI off all the times so never uses
7902 * it. This seems to suggest that the workaround is insufficient.
7904 pci_read_config_word(tp->pdev, PCI_COMMAND, &pci_cmd);
7905 pci_cmd &= ~PCI_COMMAND_INVALIDATE;
7906 pci_write_config_word(tp->pdev, PCI_COMMAND, pci_cmd);
7908 /* It is absolutely critical that TG3PCI_MISC_HOST_CTRL
7909 * has the register indirect write enable bit set before
7910 * we try to access any of the MMIO registers. It is also
7911 * critical that the PCI-X hw workaround situation is decided
7912 * before that as well.
7914 pci_read_config_dword(tp->pdev, TG3PCI_MISC_HOST_CTRL,
7915 &misc_ctrl_reg);
7917 tp->pci_chip_rev_id = (misc_ctrl_reg >>
7918 MISC_HOST_CTRL_CHIPREV_SHIFT);
7920 /* Initialize misc host control in PCI block. */
7921 tp->misc_host_ctrl |= (misc_ctrl_reg &
7922 MISC_HOST_CTRL_CHIPREV);
7923 pci_write_config_dword(tp->pdev, TG3PCI_MISC_HOST_CTRL,
7924 tp->misc_host_ctrl);
7926 pci_read_config_dword(tp->pdev, TG3PCI_CACHELINESZ,
7927 &cacheline_sz_reg);
7929 tp->pci_cacheline_sz = (cacheline_sz_reg >> 0) & 0xff;
7930 tp->pci_lat_timer = (cacheline_sz_reg >> 8) & 0xff;
7931 tp->pci_hdr_type = (cacheline_sz_reg >> 16) & 0xff;
7932 tp->pci_bist = (cacheline_sz_reg >> 24) & 0xff;
7934 if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) ||
7935 (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750))
7936 tp->tg3_flags2 |= TG3_FLG2_5705_PLUS;
7938 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750)
7939 tp->tg3_flags2 |= TG3_FLG2_HW_TSO;
7941 if (pci_find_capability(tp->pdev, PCI_CAP_ID_EXP) != 0)
7942 tp->tg3_flags2 |= TG3_FLG2_PCI_EXPRESS;
7944 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703 &&
7945 tp->pci_lat_timer < 64) {
7946 tp->pci_lat_timer = 64;
7948 cacheline_sz_reg = ((tp->pci_cacheline_sz & 0xff) << 0);
7949 cacheline_sz_reg |= ((tp->pci_lat_timer & 0xff) << 8);
7950 cacheline_sz_reg |= ((tp->pci_hdr_type & 0xff) << 16);
7951 cacheline_sz_reg |= ((tp->pci_bist & 0xff) << 24);
7953 pci_write_config_dword(tp->pdev, TG3PCI_CACHELINESZ,
7954 cacheline_sz_reg);
7957 pci_read_config_dword(tp->pdev, TG3PCI_PCISTATE,
7958 &pci_state_reg);
7960 if ((pci_state_reg & PCISTATE_CONV_PCI_MODE) == 0) {
7961 tp->tg3_flags |= TG3_FLAG_PCIX_MODE;
7963 /* If this is a 5700 BX chipset, and we are in PCI-X
7964 * mode, enable register write workaround.
7966 * The workaround is to use indirect register accesses
7967 * for all chip writes not to mailbox registers.
7969 if (GET_CHIP_REV(tp->pci_chip_rev_id) == CHIPREV_5700_BX) {
7970 u32 pm_reg;
7971 u16 pci_cmd;
7973 tp->tg3_flags |= TG3_FLAG_PCIX_TARGET_HWBUG;
7975 /* The chip can have it's power management PCI config
7976 * space registers clobbered due to this bug.
7977 * So explicitly force the chip into D0 here.
7979 pci_read_config_dword(tp->pdev, TG3PCI_PM_CTRL_STAT,
7980 &pm_reg);
7981 pm_reg &= ~PCI_PM_CTRL_STATE_MASK;
7982 pm_reg |= PCI_PM_CTRL_PME_ENABLE | 0 /* D0 */;
7983 pci_write_config_dword(tp->pdev, TG3PCI_PM_CTRL_STAT,
7984 pm_reg);
7986 /* Also, force SERR#/PERR# in PCI command. */
7987 pci_read_config_word(tp->pdev, PCI_COMMAND, &pci_cmd);
7988 pci_cmd |= PCI_COMMAND_PARITY | PCI_COMMAND_SERR;
7989 pci_write_config_word(tp->pdev, PCI_COMMAND, pci_cmd);
7993 /* Back to back register writes can cause problems on this chip,
7994 * the workaround is to read back all reg writes except those to
7995 * mailbox regs. See tg3_write_indirect_reg32().
7997 * PCI Express 5750_A0 rev chips need this workaround too.
7999 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701 ||
8000 ((tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS) &&
8001 tp->pci_chip_rev_id == CHIPREV_ID_5750_A0))
8002 tp->tg3_flags |= TG3_FLAG_5701_REG_WRITE_BUG;
8004 if ((pci_state_reg & PCISTATE_BUS_SPEED_HIGH) != 0)
8005 tp->tg3_flags |= TG3_FLAG_PCI_HIGH_SPEED;
8006 if ((pci_state_reg & PCISTATE_BUS_32BIT) != 0)
8007 tp->tg3_flags |= TG3_FLAG_PCI_32BIT;
8009 /* Chip-specific fixup from Broadcom driver */
8010 if ((tp->pci_chip_rev_id == CHIPREV_ID_5704_A0) &&
8011 (!(pci_state_reg & PCISTATE_RETRY_SAME_DMA))) {
8012 pci_state_reg |= PCISTATE_RETRY_SAME_DMA;
8013 pci_write_config_dword(tp->pdev, TG3PCI_PCISTATE, pci_state_reg);
8016 /* Force the chip into D0. */
8017 err = tg3_set_power_state(tp, 0);
8018 if (err) {
8019 printk(KERN_ERR PFX "(%s) transition to D0 failed\n",
8020 pci_name(tp->pdev));
8021 return err;
8024 /* 5700 B0 chips do not support checksumming correctly due
8025 * to hardware bugs.
8027 if (tp->pci_chip_rev_id == CHIPREV_ID_5700_B0)
8028 tp->tg3_flags |= TG3_FLAG_BROKEN_CHECKSUMS;
8030 /* Pseudo-header checksum is done by hardware logic and not
8031 * the offload processers, so make the chip do the pseudo-
8032 * header checksums on receive. For transmit it is more
8033 * convenient to do the pseudo-header checksum in software
8034 * as Linux does that on transmit for us in all cases.
8036 tp->tg3_flags |= TG3_FLAG_NO_TX_PSEUDO_CSUM;
8037 tp->tg3_flags &= ~TG3_FLAG_NO_RX_PSEUDO_CSUM;
8039 /* Derive initial jumbo mode from MTU assigned in
8040 * ether_setup() via the alloc_etherdev() call
8042 if (tp->dev->mtu > ETH_DATA_LEN)
8043 tp->tg3_flags |= TG3_FLAG_JUMBO_ENABLE;
8045 /* Determine WakeOnLan speed to use. */
8046 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 ||
8047 tp->pci_chip_rev_id == CHIPREV_ID_5701_A0 ||
8048 tp->pci_chip_rev_id == CHIPREV_ID_5701_B0 ||
8049 tp->pci_chip_rev_id == CHIPREV_ID_5701_B2) {
8050 tp->tg3_flags &= ~(TG3_FLAG_WOL_SPEED_100MB);
8051 } else {
8052 tp->tg3_flags |= TG3_FLAG_WOL_SPEED_100MB;
8055 /* A few boards don't want Ethernet@WireSpeed phy feature */
8056 if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700) ||
8057 ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) &&
8058 (tp->pci_chip_rev_id != CHIPREV_ID_5705_A0) &&
8059 (tp->pci_chip_rev_id != CHIPREV_ID_5705_A1)))
8060 tp->tg3_flags2 |= TG3_FLG2_NO_ETH_WIRE_SPEED;
8062 if (GET_CHIP_REV(tp->pci_chip_rev_id) == CHIPREV_5703_AX ||
8063 GET_CHIP_REV(tp->pci_chip_rev_id) == CHIPREV_5704_AX)
8064 tp->tg3_flags2 |= TG3_FLG2_PHY_ADC_BUG;
8065 if (tp->pci_chip_rev_id == CHIPREV_ID_5704_A0)
8066 tp->tg3_flags2 |= TG3_FLG2_PHY_5704_A0_BUG;
8068 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705 ||
8069 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750)
8070 tp->tg3_flags2 |= TG3_FLG2_PHY_BER_BUG;
8072 /* Only 5701 and later support tagged irq status mode.
8073 * Also, 5788 chips cannot use tagged irq status.
8075 * However, since we are using NAPI avoid tagged irq status
8076 * because the interrupt condition is more difficult to
8077 * fully clear in that mode.
8079 tp->coalesce_mode = 0;
8081 if (GET_CHIP_REV(tp->pci_chip_rev_id) != CHIPREV_5700_AX &&
8082 GET_CHIP_REV(tp->pci_chip_rev_id) != CHIPREV_5700_BX)
8083 tp->coalesce_mode |= HOSTCC_MODE_32BYTE;
8085 /* Initialize MAC MI mode, polling disabled. */
8086 tw32_f(MAC_MI_MODE, tp->mi_mode);
8087 udelay(80);
8089 /* Initialize data/descriptor byte/word swapping. */
8090 val = tr32(GRC_MODE);
8091 val &= GRC_MODE_HOST_STACKUP;
8092 tw32(GRC_MODE, val | tp->grc_mode);
8094 tg3_switch_clocks(tp);
8096 /* Clear this out for sanity. */
8097 tw32(TG3PCI_MEM_WIN_BASE_ADDR, 0);
8099 pci_read_config_dword(tp->pdev, TG3PCI_PCISTATE,
8100 &pci_state_reg);
8101 if ((pci_state_reg & PCISTATE_CONV_PCI_MODE) == 0 &&
8102 (tp->tg3_flags & TG3_FLAG_PCIX_TARGET_HWBUG) == 0) {
8103 u32 chiprevid = GET_CHIP_REV_ID(tp->misc_host_ctrl);
8105 if (chiprevid == CHIPREV_ID_5701_A0 ||
8106 chiprevid == CHIPREV_ID_5701_B0 ||
8107 chiprevid == CHIPREV_ID_5701_B2 ||
8108 chiprevid == CHIPREV_ID_5701_B5) {
8109 void __iomem *sram_base;
8111 /* Write some dummy words into the SRAM status block
8112 * area, see if it reads back correctly. If the return
8113 * value is bad, force enable the PCIX workaround.
8115 sram_base = tp->regs + NIC_SRAM_WIN_BASE + NIC_SRAM_STATS_BLK;
8117 writel(0x00000000, sram_base);
8118 writel(0x00000000, sram_base + 4);
8119 writel(0xffffffff, sram_base + 4);
8120 if (readl(sram_base) != 0x00000000)
8121 tp->tg3_flags |= TG3_FLAG_PCIX_TARGET_HWBUG;
8125 udelay(50);
8126 tg3_nvram_init(tp);
8128 grc_misc_cfg = tr32(GRC_MISC_CFG);
8129 grc_misc_cfg &= GRC_MISC_CFG_BOARD_ID_MASK;
8131 /* Broadcom's driver says that CIOBE multisplit has a bug */
8132 #if 0
8133 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704 &&
8134 grc_misc_cfg == GRC_MISC_CFG_BOARD_ID_5704CIOBE) {
8135 tp->tg3_flags |= TG3_FLAG_SPLIT_MODE;
8136 tp->split_mode_max_reqs = SPLIT_MODE_5704_MAX_REQ;
8138 #endif
8139 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705 &&
8140 (grc_misc_cfg == GRC_MISC_CFG_BOARD_ID_5788 ||
8141 grc_misc_cfg == GRC_MISC_CFG_BOARD_ID_5788M))
8142 tp->tg3_flags2 |= TG3_FLG2_IS_5788;
8144 /* these are limited to 10/100 only */
8145 if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703 &&
8146 (grc_misc_cfg == 0x8000 || grc_misc_cfg == 0x4000)) ||
8147 (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705 &&
8148 tp->pdev->vendor == PCI_VENDOR_ID_BROADCOM &&
8149 (tp->pdev->device == PCI_DEVICE_ID_TIGON3_5901 ||
8150 tp->pdev->device == PCI_DEVICE_ID_TIGON3_5901_2 ||
8151 tp->pdev->device == PCI_DEVICE_ID_TIGON3_5705F)) ||
8152 (tp->pdev->vendor == PCI_VENDOR_ID_BROADCOM &&
8153 (tp->pdev->device == PCI_DEVICE_ID_TIGON3_5751F ||
8154 tp->pdev->device == PCI_DEVICE_ID_TIGON3_5753F)))
8155 tp->tg3_flags |= TG3_FLAG_10_100_ONLY;
8157 err = tg3_phy_probe(tp);
8158 if (err) {
8159 printk(KERN_ERR PFX "(%s) phy probe failed, err %d\n",
8160 pci_name(tp->pdev), err);
8161 /* ... but do not return immediately ... */
8164 tg3_read_partno(tp);
8166 if (tp->tg3_flags2 & TG3_FLG2_PHY_SERDES) {
8167 tp->tg3_flags &= ~TG3_FLAG_USE_MI_INTERRUPT;
8168 } else {
8169 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700)
8170 tp->tg3_flags |= TG3_FLAG_USE_MI_INTERRUPT;
8171 else
8172 tp->tg3_flags &= ~TG3_FLAG_USE_MI_INTERRUPT;
8175 /* 5700 {AX,BX} chips have a broken status block link
8176 * change bit implementation, so we must use the
8177 * status register in those cases.
8179 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700)
8180 tp->tg3_flags |= TG3_FLAG_USE_LINKCHG_REG;
8181 else
8182 tp->tg3_flags &= ~TG3_FLAG_USE_LINKCHG_REG;
8184 /* The led_ctrl is set during tg3_phy_probe, here we might
8185 * have to force the link status polling mechanism based
8186 * upon subsystem IDs.
8188 if (tp->pdev->subsystem_vendor == PCI_VENDOR_ID_DELL &&
8189 !(tp->tg3_flags2 & TG3_FLG2_PHY_SERDES)) {
8190 tp->tg3_flags |= (TG3_FLAG_USE_MI_INTERRUPT |
8191 TG3_FLAG_USE_LINKCHG_REG);
8194 /* For all SERDES we poll the MAC status register. */
8195 if (tp->tg3_flags2 & TG3_FLG2_PHY_SERDES)
8196 tp->tg3_flags |= TG3_FLAG_POLL_SERDES;
8197 else
8198 tp->tg3_flags &= ~TG3_FLAG_POLL_SERDES;
8200 /* 5700 BX chips need to have their TX producer index mailboxes
8201 * written twice to workaround a bug.
8203 if (GET_CHIP_REV(tp->pci_chip_rev_id) == CHIPREV_5700_BX)
8204 tp->tg3_flags |= TG3_FLAG_TXD_MBOX_HWBUG;
8205 else
8206 tp->tg3_flags &= ~TG3_FLAG_TXD_MBOX_HWBUG;
8208 /* It seems all chips can get confused if TX buffers
8209 * straddle the 4GB address boundary in some cases.
8211 tp->dev->hard_start_xmit = tg3_start_xmit;
8213 tp->rx_offset = 2;
8214 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701 &&
8215 (tp->tg3_flags & TG3_FLAG_PCIX_MODE) != 0)
8216 tp->rx_offset = 0;
8218 /* By default, disable wake-on-lan. User can change this
8219 * using ETHTOOL_SWOL.
8221 tp->tg3_flags &= ~TG3_FLAG_WOL_ENABLE;
8223 return err;
8226 #ifdef CONFIG_SPARC64
8227 static int __devinit tg3_get_macaddr_sparc(struct tg3 *tp)
8229 struct net_device *dev = tp->dev;
8230 struct pci_dev *pdev = tp->pdev;
8231 struct pcidev_cookie *pcp = pdev->sysdata;
8233 if (pcp != NULL) {
8234 int node = pcp->prom_node;
8236 if (prom_getproplen(node, "local-mac-address") == 6) {
8237 prom_getproperty(node, "local-mac-address",
8238 dev->dev_addr, 6);
8239 return 0;
8242 return -ENODEV;
8245 static int __devinit tg3_get_default_macaddr_sparc(struct tg3 *tp)
8247 struct net_device *dev = tp->dev;
8249 memcpy(dev->dev_addr, idprom->id_ethaddr, 6);
8250 return 0;
8252 #endif
8254 static int __devinit tg3_get_device_address(struct tg3 *tp)
8256 struct net_device *dev = tp->dev;
8257 u32 hi, lo, mac_offset;
8259 #ifdef CONFIG_SPARC64
8260 if (!tg3_get_macaddr_sparc(tp))
8261 return 0;
8262 #endif
8264 mac_offset = 0x7c;
8265 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704 &&
8266 !(tp->tg3_flags & TG3_FLG2_SUN_570X)) {
8267 if (tr32(TG3PCI_DUAL_MAC_CTRL) & DUAL_MAC_CTRL_ID)
8268 mac_offset = 0xcc;
8269 if (tg3_nvram_lock(tp))
8270 tw32_f(NVRAM_CMD, NVRAM_CMD_RESET);
8271 else
8272 tg3_nvram_unlock(tp);
8275 /* First try to get it from MAC address mailbox. */
8276 tg3_read_mem(tp, NIC_SRAM_MAC_ADDR_HIGH_MBOX, &hi);
8277 if ((hi >> 16) == 0x484b) {
8278 dev->dev_addr[0] = (hi >> 8) & 0xff;
8279 dev->dev_addr[1] = (hi >> 0) & 0xff;
8281 tg3_read_mem(tp, NIC_SRAM_MAC_ADDR_LOW_MBOX, &lo);
8282 dev->dev_addr[2] = (lo >> 24) & 0xff;
8283 dev->dev_addr[3] = (lo >> 16) & 0xff;
8284 dev->dev_addr[4] = (lo >> 8) & 0xff;
8285 dev->dev_addr[5] = (lo >> 0) & 0xff;
8287 /* Next, try NVRAM. */
8288 else if (!(tp->tg3_flags & TG3_FLG2_SUN_570X) &&
8289 !tg3_nvram_read(tp, mac_offset + 0, &hi) &&
8290 !tg3_nvram_read(tp, mac_offset + 4, &lo)) {
8291 dev->dev_addr[0] = ((hi >> 16) & 0xff);
8292 dev->dev_addr[1] = ((hi >> 24) & 0xff);
8293 dev->dev_addr[2] = ((lo >> 0) & 0xff);
8294 dev->dev_addr[3] = ((lo >> 8) & 0xff);
8295 dev->dev_addr[4] = ((lo >> 16) & 0xff);
8296 dev->dev_addr[5] = ((lo >> 24) & 0xff);
8298 /* Finally just fetch it out of the MAC control regs. */
8299 else {
8300 hi = tr32(MAC_ADDR_0_HIGH);
8301 lo = tr32(MAC_ADDR_0_LOW);
8303 dev->dev_addr[5] = lo & 0xff;
8304 dev->dev_addr[4] = (lo >> 8) & 0xff;
8305 dev->dev_addr[3] = (lo >> 16) & 0xff;
8306 dev->dev_addr[2] = (lo >> 24) & 0xff;
8307 dev->dev_addr[1] = hi & 0xff;
8308 dev->dev_addr[0] = (hi >> 8) & 0xff;
8311 if (!is_valid_ether_addr(&dev->dev_addr[0])) {
8312 #ifdef CONFIG_SPARC64
8313 if (!tg3_get_default_macaddr_sparc(tp))
8314 return 0;
8315 #endif
8316 return -EINVAL;
8318 return 0;
8321 static int __devinit tg3_do_test_dma(struct tg3 *tp, u32 *buf, dma_addr_t buf_dma, int size, int to_device)
8323 struct tg3_internal_buffer_desc test_desc;
8324 u32 sram_dma_descs;
8325 int i, ret;
8327 sram_dma_descs = NIC_SRAM_DMA_DESC_POOL_BASE;
8329 tw32(FTQ_RCVBD_COMP_FIFO_ENQDEQ, 0);
8330 tw32(FTQ_RCVDATA_COMP_FIFO_ENQDEQ, 0);
8331 tw32(RDMAC_STATUS, 0);
8332 tw32(WDMAC_STATUS, 0);
8334 tw32(BUFMGR_MODE, 0);
8335 tw32(FTQ_RESET, 0);
8337 test_desc.addr_hi = ((u64) buf_dma) >> 32;
8338 test_desc.addr_lo = buf_dma & 0xffffffff;
8339 test_desc.nic_mbuf = 0x00002100;
8340 test_desc.len = size;
8343 * HP ZX1 was seeing test failures for 5701 cards running at 33Mhz
8344 * the *second* time the tg3 driver was getting loaded after an
8345 * initial scan.
8347 * Broadcom tells me:
8348 * ...the DMA engine is connected to the GRC block and a DMA
8349 * reset may affect the GRC block in some unpredictable way...
8350 * The behavior of resets to individual blocks has not been tested.
8352 * Broadcom noted the GRC reset will also reset all sub-components.
8354 if (to_device) {
8355 test_desc.cqid_sqid = (13 << 8) | 2;
8357 tw32_f(RDMAC_MODE, RDMAC_MODE_ENABLE);
8358 udelay(40);
8359 } else {
8360 test_desc.cqid_sqid = (16 << 8) | 7;
8362 tw32_f(WDMAC_MODE, WDMAC_MODE_ENABLE);
8363 udelay(40);
8365 test_desc.flags = 0x00000005;
8367 for (i = 0; i < (sizeof(test_desc) / sizeof(u32)); i++) {
8368 u32 val;
8370 val = *(((u32 *)&test_desc) + i);
8371 pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_BASE_ADDR,
8372 sram_dma_descs + (i * sizeof(u32)));
8373 pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_DATA, val);
8375 pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_BASE_ADDR, 0);
8377 if (to_device) {
8378 tw32(FTQ_DMA_HIGH_READ_FIFO_ENQDEQ, sram_dma_descs);
8379 } else {
8380 tw32(FTQ_DMA_HIGH_WRITE_FIFO_ENQDEQ, sram_dma_descs);
8383 ret = -ENODEV;
8384 for (i = 0; i < 40; i++) {
8385 u32 val;
8387 if (to_device)
8388 val = tr32(FTQ_RCVBD_COMP_FIFO_ENQDEQ);
8389 else
8390 val = tr32(FTQ_RCVDATA_COMP_FIFO_ENQDEQ);
8391 if ((val & 0xffff) == sram_dma_descs) {
8392 ret = 0;
8393 break;
8396 udelay(100);
8399 return ret;
8402 #define TEST_BUFFER_SIZE 0x400
8404 static int __devinit tg3_test_dma(struct tg3 *tp)
8406 dma_addr_t buf_dma;
8407 u32 *buf;
8408 int ret;
8410 buf = pci_alloc_consistent(tp->pdev, TEST_BUFFER_SIZE, &buf_dma);
8411 if (!buf) {
8412 ret = -ENOMEM;
8413 goto out_nofree;
8416 tp->dma_rwctrl = ((0x7 << DMA_RWCTRL_PCI_WRITE_CMD_SHIFT) |
8417 (0x6 << DMA_RWCTRL_PCI_READ_CMD_SHIFT));
8419 #ifndef CONFIG_X86
8421 u8 byte;
8422 int cacheline_size;
8423 pci_read_config_byte(tp->pdev, PCI_CACHE_LINE_SIZE, &byte);
8425 if (byte == 0)
8426 cacheline_size = 1024;
8427 else
8428 cacheline_size = (int) byte * 4;
8430 switch (cacheline_size) {
8431 case 16:
8432 case 32:
8433 case 64:
8434 case 128:
8435 if ((tp->tg3_flags & TG3_FLAG_PCIX_MODE) &&
8436 !(tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS)) {
8437 tp->dma_rwctrl |=
8438 DMA_RWCTRL_WRITE_BNDRY_384_PCIX;
8439 break;
8440 } else if (tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS) {
8441 tp->dma_rwctrl &=
8442 ~(DMA_RWCTRL_PCI_WRITE_CMD);
8443 tp->dma_rwctrl |=
8444 DMA_RWCTRL_WRITE_BNDRY_128_PCIE;
8445 break;
8447 /* fallthrough */
8448 case 256:
8449 if (!(tp->tg3_flags & TG3_FLAG_PCIX_MODE) &&
8450 !(tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS))
8451 tp->dma_rwctrl |=
8452 DMA_RWCTRL_WRITE_BNDRY_256;
8453 else if (!(tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS))
8454 tp->dma_rwctrl |=
8455 DMA_RWCTRL_WRITE_BNDRY_256_PCIX;
8458 #endif
8460 if (tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS) {
8461 /* DMA read watermark not used on PCIE */
8462 tp->dma_rwctrl |= 0x00180000;
8463 } else if (!(tp->tg3_flags & TG3_FLAG_PCIX_MODE)) {
8464 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705 ||
8465 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750)
8466 tp->dma_rwctrl |= 0x003f0000;
8467 else
8468 tp->dma_rwctrl |= 0x003f000f;
8469 } else {
8470 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703 ||
8471 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704) {
8472 u32 ccval = (tr32(TG3PCI_CLOCK_CTRL) & 0x1f);
8474 if (ccval == 0x6 || ccval == 0x7)
8475 tp->dma_rwctrl |= DMA_RWCTRL_ONE_DMA;
8477 /* Set bit 23 to renable PCIX hw bug fix */
8478 tp->dma_rwctrl |= 0x009f0000;
8479 } else {
8480 tp->dma_rwctrl |= 0x001b000f;
8484 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703 ||
8485 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704)
8486 tp->dma_rwctrl &= 0xfffffff0;
8488 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 ||
8489 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701) {
8490 /* Remove this if it causes problems for some boards. */
8491 tp->dma_rwctrl |= DMA_RWCTRL_USE_MEM_READ_MULT;
8493 /* On 5700/5701 chips, we need to set this bit.
8494 * Otherwise the chip will issue cacheline transactions
8495 * to streamable DMA memory with not all the byte
8496 * enables turned on. This is an error on several
8497 * RISC PCI controllers, in particular sparc64.
8499 * On 5703/5704 chips, this bit has been reassigned
8500 * a different meaning. In particular, it is used
8501 * on those chips to enable a PCI-X workaround.
8503 tp->dma_rwctrl |= DMA_RWCTRL_ASSERT_ALL_BE;
8506 tw32(TG3PCI_DMA_RW_CTRL, tp->dma_rwctrl);
8508 #if 0
8509 /* Unneeded, already done by tg3_get_invariants. */
8510 tg3_switch_clocks(tp);
8511 #endif
8513 ret = 0;
8514 if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5700 &&
8515 GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5701)
8516 goto out;
8518 while (1) {
8519 u32 *p = buf, i;
8521 for (i = 0; i < TEST_BUFFER_SIZE / sizeof(u32); i++)
8522 p[i] = i;
8524 /* Send the buffer to the chip. */
8525 ret = tg3_do_test_dma(tp, buf, buf_dma, TEST_BUFFER_SIZE, 1);
8526 if (ret) {
8527 printk(KERN_ERR "tg3_test_dma() Write the buffer failed %d\n", ret);
8528 break;
8531 #if 0
8532 /* validate data reached card RAM correctly. */
8533 for (i = 0; i < TEST_BUFFER_SIZE / sizeof(u32); i++) {
8534 u32 val;
8535 tg3_read_mem(tp, 0x2100 + (i*4), &val);
8536 if (le32_to_cpu(val) != p[i]) {
8537 printk(KERN_ERR " tg3_test_dma() Card buffer corrupted on write! (%d != %d)\n", val, i);
8538 /* ret = -ENODEV here? */
8540 p[i] = 0;
8542 #endif
8543 /* Now read it back. */
8544 ret = tg3_do_test_dma(tp, buf, buf_dma, TEST_BUFFER_SIZE, 0);
8545 if (ret) {
8546 printk(KERN_ERR "tg3_test_dma() Read the buffer failed %d\n", ret);
8548 break;
8551 /* Verify it. */
8552 for (i = 0; i < TEST_BUFFER_SIZE / sizeof(u32); i++) {
8553 if (p[i] == i)
8554 continue;
8556 if ((tp->dma_rwctrl & DMA_RWCTRL_WRITE_BNDRY_MASK) ==
8557 DMA_RWCTRL_WRITE_BNDRY_DISAB) {
8558 tp->dma_rwctrl |= DMA_RWCTRL_WRITE_BNDRY_16;
8559 tw32(TG3PCI_DMA_RW_CTRL, tp->dma_rwctrl);
8560 break;
8561 } else {
8562 printk(KERN_ERR "tg3_test_dma() buffer corrupted on read back! (%d != %d)\n", p[i], i);
8563 ret = -ENODEV;
8564 goto out;
8568 if (i == (TEST_BUFFER_SIZE / sizeof(u32))) {
8569 /* Success. */
8570 ret = 0;
8571 break;
8575 out:
8576 pci_free_consistent(tp->pdev, TEST_BUFFER_SIZE, buf, buf_dma);
8577 out_nofree:
8578 return ret;
8581 static void __devinit tg3_init_link_config(struct tg3 *tp)
8583 tp->link_config.advertising =
8584 (ADVERTISED_10baseT_Half | ADVERTISED_10baseT_Full |
8585 ADVERTISED_100baseT_Half | ADVERTISED_100baseT_Full |
8586 ADVERTISED_1000baseT_Half | ADVERTISED_1000baseT_Full |
8587 ADVERTISED_Autoneg | ADVERTISED_MII);
8588 tp->link_config.speed = SPEED_INVALID;
8589 tp->link_config.duplex = DUPLEX_INVALID;
8590 tp->link_config.autoneg = AUTONEG_ENABLE;
8591 netif_carrier_off(tp->dev);
8592 tp->link_config.active_speed = SPEED_INVALID;
8593 tp->link_config.active_duplex = DUPLEX_INVALID;
8594 tp->link_config.phy_is_low_power = 0;
8595 tp->link_config.orig_speed = SPEED_INVALID;
8596 tp->link_config.orig_duplex = DUPLEX_INVALID;
8597 tp->link_config.orig_autoneg = AUTONEG_INVALID;
8600 static void __devinit tg3_init_bufmgr_config(struct tg3 *tp)
8602 tp->bufmgr_config.mbuf_read_dma_low_water =
8603 DEFAULT_MB_RDMA_LOW_WATER;
8604 tp->bufmgr_config.mbuf_mac_rx_low_water =
8605 DEFAULT_MB_MACRX_LOW_WATER;
8606 tp->bufmgr_config.mbuf_high_water =
8607 DEFAULT_MB_HIGH_WATER;
8609 tp->bufmgr_config.mbuf_read_dma_low_water_jumbo =
8610 DEFAULT_MB_RDMA_LOW_WATER_JUMBO;
8611 tp->bufmgr_config.mbuf_mac_rx_low_water_jumbo =
8612 DEFAULT_MB_MACRX_LOW_WATER_JUMBO;
8613 tp->bufmgr_config.mbuf_high_water_jumbo =
8614 DEFAULT_MB_HIGH_WATER_JUMBO;
8616 tp->bufmgr_config.dma_low_water = DEFAULT_DMA_LOW_WATER;
8617 tp->bufmgr_config.dma_high_water = DEFAULT_DMA_HIGH_WATER;
8620 static char * __devinit tg3_phy_string(struct tg3 *tp)
8622 switch (tp->phy_id & PHY_ID_MASK) {
8623 case PHY_ID_BCM5400: return "5400";
8624 case PHY_ID_BCM5401: return "5401";
8625 case PHY_ID_BCM5411: return "5411";
8626 case PHY_ID_BCM5701: return "5701";
8627 case PHY_ID_BCM5703: return "5703";
8628 case PHY_ID_BCM5704: return "5704";
8629 case PHY_ID_BCM5705: return "5705";
8630 case PHY_ID_BCM5750: return "5750";
8631 case PHY_ID_BCM8002: return "8002/serdes";
8632 case 0: return "serdes";
8633 default: return "unknown";
8637 static struct pci_dev * __devinit tg3_find_5704_peer(struct tg3 *tp)
8639 struct pci_dev *peer;
8640 unsigned int func, devnr = tp->pdev->devfn & ~7;
8642 for (func = 0; func < 8; func++) {
8643 peer = pci_get_slot(tp->pdev->bus, devnr | func);
8644 if (peer && peer != tp->pdev)
8645 break;
8646 pci_dev_put(peer);
8648 if (!peer || peer == tp->pdev)
8649 BUG();
8652 * We don't need to keep the refcount elevated; there's no way
8653 * to remove one half of this device without removing the other
8655 pci_dev_put(peer);
8657 return peer;
8660 static int __devinit tg3_init_one(struct pci_dev *pdev,
8661 const struct pci_device_id *ent)
8663 static int tg3_version_printed = 0;
8664 unsigned long tg3reg_base, tg3reg_len;
8665 struct net_device *dev;
8666 struct tg3 *tp;
8667 int i, err, pci_using_dac, pm_cap;
8669 if (tg3_version_printed++ == 0)
8670 printk(KERN_INFO "%s", version);
8672 err = pci_enable_device(pdev);
8673 if (err) {
8674 printk(KERN_ERR PFX "Cannot enable PCI device, "
8675 "aborting.\n");
8676 return err;
8679 if (!(pci_resource_flags(pdev, 0) & IORESOURCE_MEM)) {
8680 printk(KERN_ERR PFX "Cannot find proper PCI device "
8681 "base address, aborting.\n");
8682 err = -ENODEV;
8683 goto err_out_disable_pdev;
8686 err = pci_request_regions(pdev, DRV_MODULE_NAME);
8687 if (err) {
8688 printk(KERN_ERR PFX "Cannot obtain PCI resources, "
8689 "aborting.\n");
8690 goto err_out_disable_pdev;
8693 pci_set_master(pdev);
8695 /* Find power-management capability. */
8696 pm_cap = pci_find_capability(pdev, PCI_CAP_ID_PM);
8697 if (pm_cap == 0) {
8698 printk(KERN_ERR PFX "Cannot find PowerManagement capability, "
8699 "aborting.\n");
8700 err = -EIO;
8701 goto err_out_free_res;
8704 /* Configure DMA attributes. */
8705 err = pci_set_dma_mask(pdev, 0xffffffffffffffffULL);
8706 if (!err) {
8707 pci_using_dac = 1;
8708 err = pci_set_consistent_dma_mask(pdev, 0xffffffffffffffffULL);
8709 if (err < 0) {
8710 printk(KERN_ERR PFX "Unable to obtain 64 bit DMA "
8711 "for consistent allocations\n");
8712 goto err_out_free_res;
8714 } else {
8715 err = pci_set_dma_mask(pdev, 0xffffffffULL);
8716 if (err) {
8717 printk(KERN_ERR PFX "No usable DMA configuration, "
8718 "aborting.\n");
8719 goto err_out_free_res;
8721 pci_using_dac = 0;
8724 tg3reg_base = pci_resource_start(pdev, 0);
8725 tg3reg_len = pci_resource_len(pdev, 0);
8727 dev = alloc_etherdev(sizeof(*tp));
8728 if (!dev) {
8729 printk(KERN_ERR PFX "Etherdev alloc failed, aborting.\n");
8730 err = -ENOMEM;
8731 goto err_out_free_res;
8734 SET_MODULE_OWNER(dev);
8735 SET_NETDEV_DEV(dev, &pdev->dev);
8737 if (pci_using_dac)
8738 dev->features |= NETIF_F_HIGHDMA;
8739 dev->features |= NETIF_F_LLTX;
8740 #if TG3_VLAN_TAG_USED
8741 dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
8742 dev->vlan_rx_register = tg3_vlan_rx_register;
8743 dev->vlan_rx_kill_vid = tg3_vlan_rx_kill_vid;
8744 #endif
8746 tp = netdev_priv(dev);
8747 tp->pdev = pdev;
8748 tp->dev = dev;
8749 tp->pm_cap = pm_cap;
8750 tp->mac_mode = TG3_DEF_MAC_MODE;
8751 tp->rx_mode = TG3_DEF_RX_MODE;
8752 tp->tx_mode = TG3_DEF_TX_MODE;
8753 tp->mi_mode = MAC_MI_MODE_BASE;
8754 if (tg3_debug > 0)
8755 tp->msg_enable = tg3_debug;
8756 else
8757 tp->msg_enable = TG3_DEF_MSG_ENABLE;
8759 /* The word/byte swap controls here control register access byte
8760 * swapping. DMA data byte swapping is controlled in the GRC_MODE
8761 * setting below.
8763 tp->misc_host_ctrl =
8764 MISC_HOST_CTRL_MASK_PCI_INT |
8765 MISC_HOST_CTRL_WORD_SWAP |
8766 MISC_HOST_CTRL_INDIR_ACCESS |
8767 MISC_HOST_CTRL_PCISTATE_RW;
8769 /* The NONFRM (non-frame) byte/word swap controls take effect
8770 * on descriptor entries, anything which isn't packet data.
8772 * The StrongARM chips on the board (one for tx, one for rx)
8773 * are running in big-endian mode.
8775 tp->grc_mode = (GRC_MODE_WSWAP_DATA | GRC_MODE_BSWAP_DATA |
8776 GRC_MODE_WSWAP_NONFRM_DATA);
8777 #ifdef __BIG_ENDIAN
8778 tp->grc_mode |= GRC_MODE_BSWAP_NONFRM_DATA;
8779 #endif
8780 spin_lock_init(&tp->lock);
8781 spin_lock_init(&tp->tx_lock);
8782 spin_lock_init(&tp->indirect_lock);
8783 INIT_WORK(&tp->reset_task, tg3_reset_task, tp);
8785 tp->regs = ioremap_nocache(tg3reg_base, tg3reg_len);
8786 if (tp->regs == 0UL) {
8787 printk(KERN_ERR PFX "Cannot map device registers, "
8788 "aborting.\n");
8789 err = -ENOMEM;
8790 goto err_out_free_dev;
8793 tg3_init_link_config(tp);
8795 tg3_init_bufmgr_config(tp);
8797 tp->rx_pending = TG3_DEF_RX_RING_PENDING;
8798 tp->rx_jumbo_pending = TG3_DEF_RX_JUMBO_RING_PENDING;
8799 tp->tx_pending = TG3_DEF_TX_RING_PENDING;
8801 dev->open = tg3_open;
8802 dev->stop = tg3_close;
8803 dev->get_stats = tg3_get_stats;
8804 dev->set_multicast_list = tg3_set_rx_mode;
8805 dev->set_mac_address = tg3_set_mac_addr;
8806 dev->do_ioctl = tg3_ioctl;
8807 dev->tx_timeout = tg3_tx_timeout;
8808 dev->poll = tg3_poll;
8809 dev->ethtool_ops = &tg3_ethtool_ops;
8810 dev->weight = 64;
8811 dev->watchdog_timeo = TG3_TX_TIMEOUT;
8812 dev->change_mtu = tg3_change_mtu;
8813 dev->irq = pdev->irq;
8814 #ifdef CONFIG_NET_POLL_CONTROLLER
8815 dev->poll_controller = tg3_poll_controller;
8816 #endif
8818 err = tg3_get_invariants(tp);
8819 if (err) {
8820 printk(KERN_ERR PFX "Problem fetching invariants of chip, "
8821 "aborting.\n");
8822 goto err_out_iounmap;
8825 if (tp->tg3_flags2 & TG3_FLG2_5705_PLUS) {
8826 tp->bufmgr_config.mbuf_read_dma_low_water =
8827 DEFAULT_MB_RDMA_LOW_WATER_5705;
8828 tp->bufmgr_config.mbuf_mac_rx_low_water =
8829 DEFAULT_MB_MACRX_LOW_WATER_5705;
8830 tp->bufmgr_config.mbuf_high_water =
8831 DEFAULT_MB_HIGH_WATER_5705;
8834 #if TG3_TSO_SUPPORT != 0
8835 if (tp->tg3_flags2 & TG3_FLG2_HW_TSO) {
8836 tp->tg3_flags2 |= TG3_FLG2_TSO_CAPABLE;
8838 else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 ||
8839 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701 ||
8840 tp->pci_chip_rev_id == CHIPREV_ID_5705_A0 ||
8841 (tp->tg3_flags & TG3_FLAG_ENABLE_ASF) != 0) {
8842 tp->tg3_flags2 &= ~TG3_FLG2_TSO_CAPABLE;
8843 } else {
8844 tp->tg3_flags2 |= TG3_FLG2_TSO_CAPABLE;
8847 /* TSO is off by default, user can enable using ethtool. */
8848 #if 0
8849 if (tp->tg3_flags2 & TG3_FLG2_TSO_CAPABLE)
8850 dev->features |= NETIF_F_TSO;
8851 #endif
8853 #endif
8855 if (tp->pci_chip_rev_id == CHIPREV_ID_5705_A1 &&
8856 !(tp->tg3_flags2 & TG3_FLG2_TSO_CAPABLE) &&
8857 !(tr32(TG3PCI_PCISTATE) & PCISTATE_BUS_SPEED_HIGH)) {
8858 tp->tg3_flags2 |= TG3_FLG2_MAX_RXPEND_64;
8859 tp->rx_pending = 63;
8862 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704)
8863 tp->pdev_peer = tg3_find_5704_peer(tp);
8865 err = tg3_get_device_address(tp);
8866 if (err) {
8867 printk(KERN_ERR PFX "Could not obtain valid ethernet address, "
8868 "aborting.\n");
8869 goto err_out_iounmap;
8873 * Reset chip in case UNDI or EFI driver did not shutdown
8874 * DMA self test will enable WDMAC and we'll see (spurious)
8875 * pending DMA on the PCI bus at that point.
8877 if ((tr32(HOSTCC_MODE) & HOSTCC_MODE_ENABLE) ||
8878 (tr32(WDMAC_MODE) & WDMAC_MODE_ENABLE)) {
8879 pci_save_state(tp->pdev);
8880 tw32(MEMARB_MODE, MEMARB_MODE_ENABLE);
8881 tg3_halt(tp);
8884 err = tg3_test_dma(tp);
8885 if (err) {
8886 printk(KERN_ERR PFX "DMA engine test failed, aborting.\n");
8887 goto err_out_iounmap;
8890 /* Tigon3 can do ipv4 only... and some chips have buggy
8891 * checksumming.
8893 if ((tp->tg3_flags & TG3_FLAG_BROKEN_CHECKSUMS) == 0) {
8894 dev->features |= NETIF_F_SG | NETIF_F_IP_CSUM;
8895 tp->tg3_flags |= TG3_FLAG_RX_CHECKSUMS;
8896 } else
8897 tp->tg3_flags &= ~TG3_FLAG_RX_CHECKSUMS;
8899 if (tp->tg3_flags2 & TG3_FLG2_IS_5788)
8900 dev->features &= ~NETIF_F_HIGHDMA;
8902 /* flow control autonegotiation is default behavior */
8903 tp->tg3_flags |= TG3_FLAG_PAUSE_AUTONEG;
8905 err = register_netdev(dev);
8906 if (err) {
8907 printk(KERN_ERR PFX "Cannot register net device, "
8908 "aborting.\n");
8909 goto err_out_iounmap;
8912 pci_set_drvdata(pdev, dev);
8914 /* Now that we have fully setup the chip, save away a snapshot
8915 * of the PCI config space. We need to restore this after
8916 * GRC_MISC_CFG core clock resets and some resume events.
8918 pci_save_state(tp->pdev);
8920 printk(KERN_INFO "%s: Tigon3 [partno(%s) rev %04x PHY(%s)] (PCI%s:%s:%s) %sBaseT Ethernet ",
8921 dev->name,
8922 tp->board_part_number,
8923 tp->pci_chip_rev_id,
8924 tg3_phy_string(tp),
8925 ((tp->tg3_flags & TG3_FLAG_PCIX_MODE) ? "X" : ""),
8926 ((tp->tg3_flags & TG3_FLAG_PCI_HIGH_SPEED) ?
8927 ((tp->tg3_flags & TG3_FLAG_PCIX_MODE) ? "133MHz" : "66MHz") :
8928 ((tp->tg3_flags & TG3_FLAG_PCIX_MODE) ? "100MHz" : "33MHz")),
8929 ((tp->tg3_flags & TG3_FLAG_PCI_32BIT) ? "32-bit" : "64-bit"),
8930 (tp->tg3_flags & TG3_FLAG_10_100_ONLY) ? "10/100" : "10/100/1000");
8932 for (i = 0; i < 6; i++)
8933 printk("%2.2x%c", dev->dev_addr[i],
8934 i == 5 ? '\n' : ':');
8936 printk(KERN_INFO "%s: RXcsums[%d] LinkChgREG[%d] "
8937 "MIirq[%d] ASF[%d] Split[%d] WireSpeed[%d] "
8938 "TSOcap[%d] \n",
8939 dev->name,
8940 (tp->tg3_flags & TG3_FLAG_RX_CHECKSUMS) != 0,
8941 (tp->tg3_flags & TG3_FLAG_USE_LINKCHG_REG) != 0,
8942 (tp->tg3_flags & TG3_FLAG_USE_MI_INTERRUPT) != 0,
8943 (tp->tg3_flags & TG3_FLAG_ENABLE_ASF) != 0,
8944 (tp->tg3_flags & TG3_FLAG_SPLIT_MODE) != 0,
8945 (tp->tg3_flags2 & TG3_FLG2_NO_ETH_WIRE_SPEED) == 0,
8946 (tp->tg3_flags2 & TG3_FLG2_TSO_CAPABLE) != 0);
8948 return 0;
8950 err_out_iounmap:
8951 iounmap(tp->regs);
8953 err_out_free_dev:
8954 free_netdev(dev);
8956 err_out_free_res:
8957 pci_release_regions(pdev);
8959 err_out_disable_pdev:
8960 pci_disable_device(pdev);
8961 pci_set_drvdata(pdev, NULL);
8962 return err;
8965 static void __devexit tg3_remove_one(struct pci_dev *pdev)
8967 struct net_device *dev = pci_get_drvdata(pdev);
8969 if (dev) {
8970 struct tg3 *tp = netdev_priv(dev);
8972 unregister_netdev(dev);
8973 iounmap(tp->regs);
8974 free_netdev(dev);
8975 pci_release_regions(pdev);
8976 pci_disable_device(pdev);
8977 pci_set_drvdata(pdev, NULL);
8981 static int tg3_suspend(struct pci_dev *pdev, pm_message_t state)
8983 struct net_device *dev = pci_get_drvdata(pdev);
8984 struct tg3 *tp = netdev_priv(dev);
8985 int err;
8987 if (!netif_running(dev))
8988 return 0;
8990 tg3_netif_stop(tp);
8992 del_timer_sync(&tp->timer);
8994 spin_lock_irq(&tp->lock);
8995 spin_lock(&tp->tx_lock);
8996 tg3_disable_ints(tp);
8997 spin_unlock(&tp->tx_lock);
8998 spin_unlock_irq(&tp->lock);
9000 netif_device_detach(dev);
9002 spin_lock_irq(&tp->lock);
9003 spin_lock(&tp->tx_lock);
9004 tg3_halt(tp);
9005 spin_unlock(&tp->tx_lock);
9006 spin_unlock_irq(&tp->lock);
9008 err = tg3_set_power_state(tp, pci_choose_state(pdev, state));
9009 if (err) {
9010 spin_lock_irq(&tp->lock);
9011 spin_lock(&tp->tx_lock);
9013 tg3_init_hw(tp);
9015 tp->timer.expires = jiffies + tp->timer_offset;
9016 add_timer(&tp->timer);
9018 netif_device_attach(dev);
9019 tg3_netif_start(tp);
9021 spin_unlock(&tp->tx_lock);
9022 spin_unlock_irq(&tp->lock);
9025 return err;
9028 static int tg3_resume(struct pci_dev *pdev)
9030 struct net_device *dev = pci_get_drvdata(pdev);
9031 struct tg3 *tp = netdev_priv(dev);
9032 int err;
9034 if (!netif_running(dev))
9035 return 0;
9037 pci_restore_state(tp->pdev);
9039 err = tg3_set_power_state(tp, 0);
9040 if (err)
9041 return err;
9043 netif_device_attach(dev);
9045 spin_lock_irq(&tp->lock);
9046 spin_lock(&tp->tx_lock);
9048 tg3_init_hw(tp);
9050 tp->timer.expires = jiffies + tp->timer_offset;
9051 add_timer(&tp->timer);
9053 tg3_enable_ints(tp);
9055 tg3_netif_start(tp);
9057 spin_unlock(&tp->tx_lock);
9058 spin_unlock_irq(&tp->lock);
9060 return 0;
9063 static struct pci_driver tg3_driver = {
9064 .name = DRV_MODULE_NAME,
9065 .id_table = tg3_pci_tbl,
9066 .probe = tg3_init_one,
9067 .remove = __devexit_p(tg3_remove_one),
9068 .suspend = tg3_suspend,
9069 .resume = tg3_resume
9072 static int __init tg3_init(void)
9074 return pci_module_init(&tg3_driver);
9077 static void __exit tg3_cleanup(void)
9079 pci_unregister_driver(&tg3_driver);
9082 module_init(tg3_init);
9083 module_exit(tg3_cleanup);