]> bbs.cooldavid.org Git - net-next-2.6.git/blame - drivers/net/tg3.c
random: add async notification support to /dev/random
[net-next-2.6.git] / drivers / net / tg3.c
CommitLineData
1da177e4
LT
1/*
2 * tg3.c: Broadcom Tigon3 ethernet driver.
3 *
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.
65610fba 7 * Copyright (C) 2005-2007 Broadcom Corporation.
1da177e4
LT
8 *
9 * Firmware is:
49cabf49
MC
10 * Derived from proprietary unpublished source code,
11 * Copyright (C) 2000-2003 Broadcom Corporation.
12 *
13 * Permission is hereby granted for the distribution of this firmware
14 * data in hexadecimal or equivalent format, provided this copyright
15 * notice is accompanying it.
1da177e4
LT
16 */
17
1da177e4
LT
18
19#include <linux/module.h>
20#include <linux/moduleparam.h>
21#include <linux/kernel.h>
22#include <linux/types.h>
23#include <linux/compiler.h>
24#include <linux/slab.h>
25#include <linux/delay.h>
14c85021 26#include <linux/in.h>
1da177e4
LT
27#include <linux/init.h>
28#include <linux/ioport.h>
29#include <linux/pci.h>
30#include <linux/netdevice.h>
31#include <linux/etherdevice.h>
32#include <linux/skbuff.h>
33#include <linux/ethtool.h>
34#include <linux/mii.h>
35#include <linux/if_vlan.h>
36#include <linux/ip.h>
37#include <linux/tcp.h>
38#include <linux/workqueue.h>
61487480 39#include <linux/prefetch.h>
f9a5f7d3 40#include <linux/dma-mapping.h>
1da177e4
LT
41
42#include <net/checksum.h>
c9bdd4b5 43#include <net/ip.h>
1da177e4
LT
44
45#include <asm/system.h>
46#include <asm/io.h>
47#include <asm/byteorder.h>
48#include <asm/uaccess.h>
49
49b6e95f 50#ifdef CONFIG_SPARC
1da177e4 51#include <asm/idprom.h>
49b6e95f 52#include <asm/prom.h>
1da177e4
LT
53#endif
54
55#if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE)
56#define TG3_VLAN_TAG_USED 1
57#else
58#define TG3_VLAN_TAG_USED 0
59#endif
60
1da177e4 61#define TG3_TSO_SUPPORT 1
1da177e4
LT
62
63#include "tg3.h"
64
65#define DRV_MODULE_NAME "tg3"
66#define PFX DRV_MODULE_NAME ": "
41588ba1
MC
67#define DRV_MODULE_VERSION "3.91"
68#define DRV_MODULE_RELDATE "April 18, 2008"
1da177e4
LT
69
70#define TG3_DEF_MAC_MODE 0
71#define TG3_DEF_RX_MODE 0
72#define TG3_DEF_TX_MODE 0
73#define TG3_DEF_MSG_ENABLE \
74 (NETIF_MSG_DRV | \
75 NETIF_MSG_PROBE | \
76 NETIF_MSG_LINK | \
77 NETIF_MSG_TIMER | \
78 NETIF_MSG_IFDOWN | \
79 NETIF_MSG_IFUP | \
80 NETIF_MSG_RX_ERR | \
81 NETIF_MSG_TX_ERR)
82
83/* length of time before we decide the hardware is borked,
84 * and dev->tx_timeout() should be called to fix the problem
85 */
86#define TG3_TX_TIMEOUT (5 * HZ)
87
88/* hardware minimum and maximum for a single frame's data payload */
89#define TG3_MIN_MTU 60
90#define TG3_MAX_MTU(tp) \
0f893dc6 91 ((tp->tg3_flags2 & TG3_FLG2_JUMBO_CAPABLE) ? 9000 : 1500)
1da177e4
LT
92
93/* These numbers seem to be hard coded in the NIC firmware somehow.
94 * You can't change the ring sizes, but you can change where you place
95 * them in the NIC onboard memory.
96 */
97#define TG3_RX_RING_SIZE 512
98#define TG3_DEF_RX_RING_PENDING 200
99#define TG3_RX_JUMBO_RING_SIZE 256
100#define TG3_DEF_RX_JUMBO_RING_PENDING 100
101
102/* Do not place this n-ring entries value into the tp struct itself,
103 * we really want to expose these constants to GCC so that modulo et
104 * al. operations are done with shifts and masks instead of with
105 * hw multiply/modulo instructions. Another solution would be to
106 * replace things like '% foo' with '& (foo - 1)'.
107 */
108#define TG3_RX_RCB_RING_SIZE(tp) \
109 ((tp->tg3_flags2 & TG3_FLG2_5705_PLUS) ? 512 : 1024)
110
111#define TG3_TX_RING_SIZE 512
112#define TG3_DEF_TX_RING_PENDING (TG3_TX_RING_SIZE - 1)
113
114#define TG3_RX_RING_BYTES (sizeof(struct tg3_rx_buffer_desc) * \
115 TG3_RX_RING_SIZE)
116#define TG3_RX_JUMBO_RING_BYTES (sizeof(struct tg3_rx_buffer_desc) * \
117 TG3_RX_JUMBO_RING_SIZE)
118#define TG3_RX_RCB_RING_BYTES(tp) (sizeof(struct tg3_rx_buffer_desc) * \
119 TG3_RX_RCB_RING_SIZE(tp))
120#define TG3_TX_RING_BYTES (sizeof(struct tg3_tx_buffer_desc) * \
121 TG3_TX_RING_SIZE)
1da177e4
LT
122#define NEXT_TX(N) (((N) + 1) & (TG3_TX_RING_SIZE - 1))
123
124#define RX_PKT_BUF_SZ (1536 + tp->rx_offset + 64)
125#define RX_JUMBO_PKT_BUF_SZ (9046 + tp->rx_offset + 64)
126
127/* minimum number of free TX descriptors required to wake up TX process */
42952231 128#define TG3_TX_WAKEUP_THRESH(tp) ((tp)->tx_pending / 4)
1da177e4
LT
129
130/* number of ETHTOOL_GSTATS u64's */
131#define TG3_NUM_STATS (sizeof(struct tg3_ethtool_stats)/sizeof(u64))
132
4cafd3f5
MC
133#define TG3_NUM_TEST 6
134
1da177e4
LT
135static char version[] __devinitdata =
136 DRV_MODULE_NAME ".c:v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n";
137
138MODULE_AUTHOR("David S. Miller (davem@redhat.com) and Jeff Garzik (jgarzik@pobox.com)");
139MODULE_DESCRIPTION("Broadcom Tigon3 ethernet driver");
140MODULE_LICENSE("GPL");
141MODULE_VERSION(DRV_MODULE_VERSION);
142
143static int tg3_debug = -1; /* -1 == use TG3_DEF_MSG_ENABLE as value */
144module_param(tg3_debug, int, 0);
145MODULE_PARM_DESC(tg3_debug, "Tigon3 bitmapped debugging message enable value");
146
147static struct pci_device_id tg3_pci_tbl[] = {
13185217
HK
148 {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5700)},
149 {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5701)},
150 {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5702)},
151 {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5703)},
152 {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5704)},
153 {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5702FE)},
154 {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5705)},
155 {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5705_2)},
156 {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5705M)},
157 {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5705M_2)},
158 {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5702X)},
159 {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5703X)},
160 {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5704S)},
161 {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5702A3)},
162 {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5703A3)},
163 {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5782)},
164 {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5788)},
165 {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5789)},
166 {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5901)},
167 {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5901_2)},
168 {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5704S_2)},
169 {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5705F)},
170 {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5720)},
171 {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5721)},
126a3368 172 {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5722)},
13185217
HK
173 {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5750)},
174 {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5751)},
175 {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5750M)},
176 {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5751M)},
177 {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5751F)},
178 {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5752)},
179 {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5752M)},
180 {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5753)},
181 {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5753M)},
182 {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5753F)},
183 {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5754)},
184 {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5754M)},
185 {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5755)},
186 {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5755M)},
126a3368 187 {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5756)},
13185217
HK
188 {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5786)},
189 {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5787)},
190 {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5787M)},
676917d4 191 {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5787F)},
13185217
HK
192 {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5714)},
193 {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5714S)},
194 {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5715)},
195 {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5715S)},
196 {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5780)},
197 {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5780S)},
198 {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5781)},
b5d3772c
MC
199 {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5906)},
200 {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5906M)},
d30cdd28
MC
201 {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5784)},
202 {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5764)},
6c7af27c 203 {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5723)},
9936bcf6
MC
204 {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5761)},
205 {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5761E)},
13185217
HK
206 {PCI_DEVICE(PCI_VENDOR_ID_SYSKONNECT, PCI_DEVICE_ID_SYSKONNECT_9DXX)},
207 {PCI_DEVICE(PCI_VENDOR_ID_SYSKONNECT, PCI_DEVICE_ID_SYSKONNECT_9MXX)},
208 {PCI_DEVICE(PCI_VENDOR_ID_ALTIMA, PCI_DEVICE_ID_ALTIMA_AC1000)},
209 {PCI_DEVICE(PCI_VENDOR_ID_ALTIMA, PCI_DEVICE_ID_ALTIMA_AC1001)},
210 {PCI_DEVICE(PCI_VENDOR_ID_ALTIMA, PCI_DEVICE_ID_ALTIMA_AC1003)},
211 {PCI_DEVICE(PCI_VENDOR_ID_ALTIMA, PCI_DEVICE_ID_ALTIMA_AC9100)},
212 {PCI_DEVICE(PCI_VENDOR_ID_APPLE, PCI_DEVICE_ID_APPLE_TIGON3)},
213 {}
1da177e4
LT
214};
215
216MODULE_DEVICE_TABLE(pci, tg3_pci_tbl);
217
50da859d 218static const struct {
1da177e4
LT
219 const char string[ETH_GSTRING_LEN];
220} ethtool_stats_keys[TG3_NUM_STATS] = {
221 { "rx_octets" },
222 { "rx_fragments" },
223 { "rx_ucast_packets" },
224 { "rx_mcast_packets" },
225 { "rx_bcast_packets" },
226 { "rx_fcs_errors" },
227 { "rx_align_errors" },
228 { "rx_xon_pause_rcvd" },
229 { "rx_xoff_pause_rcvd" },
230 { "rx_mac_ctrl_rcvd" },
231 { "rx_xoff_entered" },
232 { "rx_frame_too_long_errors" },
233 { "rx_jabbers" },
234 { "rx_undersize_packets" },
235 { "rx_in_length_errors" },
236 { "rx_out_length_errors" },
237 { "rx_64_or_less_octet_packets" },
238 { "rx_65_to_127_octet_packets" },
239 { "rx_128_to_255_octet_packets" },
240 { "rx_256_to_511_octet_packets" },
241 { "rx_512_to_1023_octet_packets" },
242 { "rx_1024_to_1522_octet_packets" },
243 { "rx_1523_to_2047_octet_packets" },
244 { "rx_2048_to_4095_octet_packets" },
245 { "rx_4096_to_8191_octet_packets" },
246 { "rx_8192_to_9022_octet_packets" },
247
248 { "tx_octets" },
249 { "tx_collisions" },
250
251 { "tx_xon_sent" },
252 { "tx_xoff_sent" },
253 { "tx_flow_control" },
254 { "tx_mac_errors" },
255 { "tx_single_collisions" },
256 { "tx_mult_collisions" },
257 { "tx_deferred" },
258 { "tx_excessive_collisions" },
259 { "tx_late_collisions" },
260 { "tx_collide_2times" },
261 { "tx_collide_3times" },
262 { "tx_collide_4times" },
263 { "tx_collide_5times" },
264 { "tx_collide_6times" },
265 { "tx_collide_7times" },
266 { "tx_collide_8times" },
267 { "tx_collide_9times" },
268 { "tx_collide_10times" },
269 { "tx_collide_11times" },
270 { "tx_collide_12times" },
271 { "tx_collide_13times" },
272 { "tx_collide_14times" },
273 { "tx_collide_15times" },
274 { "tx_ucast_packets" },
275 { "tx_mcast_packets" },
276 { "tx_bcast_packets" },
277 { "tx_carrier_sense_errors" },
278 { "tx_discards" },
279 { "tx_errors" },
280
281 { "dma_writeq_full" },
282 { "dma_write_prioq_full" },
283 { "rxbds_empty" },
284 { "rx_discards" },
285 { "rx_errors" },
286 { "rx_threshold_hit" },
287
288 { "dma_readq_full" },
289 { "dma_read_prioq_full" },
290 { "tx_comp_queue_full" },
291
292 { "ring_set_send_prod_index" },
293 { "ring_status_update" },
294 { "nic_irqs" },
295 { "nic_avoided_irqs" },
296 { "nic_tx_threshold_hit" }
297};
298
50da859d 299static const struct {
4cafd3f5
MC
300 const char string[ETH_GSTRING_LEN];
301} ethtool_test_keys[TG3_NUM_TEST] = {
302 { "nvram test (online) " },
303 { "link test (online) " },
304 { "register test (offline)" },
305 { "memory test (offline)" },
306 { "loopback test (offline)" },
307 { "interrupt test (offline)" },
308};
309
b401e9e2
MC
310static void tg3_write32(struct tg3 *tp, u32 off, u32 val)
311{
312 writel(val, tp->regs + off);
313}
314
315static u32 tg3_read32(struct tg3 *tp, u32 off)
316{
6aa20a22 317 return (readl(tp->regs + off));
b401e9e2
MC
318}
319
0d3031d9
MC
320static void tg3_ape_write32(struct tg3 *tp, u32 off, u32 val)
321{
322 writel(val, tp->aperegs + off);
323}
324
325static u32 tg3_ape_read32(struct tg3 *tp, u32 off)
326{
327 return (readl(tp->aperegs + off));
328}
329
1da177e4
LT
330static void tg3_write_indirect_reg32(struct tg3 *tp, u32 off, u32 val)
331{
6892914f
MC
332 unsigned long flags;
333
334 spin_lock_irqsave(&tp->indirect_lock, flags);
1ee582d8
MC
335 pci_write_config_dword(tp->pdev, TG3PCI_REG_BASE_ADDR, off);
336 pci_write_config_dword(tp->pdev, TG3PCI_REG_DATA, val);
6892914f 337 spin_unlock_irqrestore(&tp->indirect_lock, flags);
1ee582d8
MC
338}
339
340static void tg3_write_flush_reg32(struct tg3 *tp, u32 off, u32 val)
341{
342 writel(val, tp->regs + off);
343 readl(tp->regs + off);
1da177e4
LT
344}
345
6892914f 346static u32 tg3_read_indirect_reg32(struct tg3 *tp, u32 off)
1da177e4 347{
6892914f
MC
348 unsigned long flags;
349 u32 val;
350
351 spin_lock_irqsave(&tp->indirect_lock, flags);
352 pci_write_config_dword(tp->pdev, TG3PCI_REG_BASE_ADDR, off);
353 pci_read_config_dword(tp->pdev, TG3PCI_REG_DATA, &val);
354 spin_unlock_irqrestore(&tp->indirect_lock, flags);
355 return val;
356}
357
358static void tg3_write_indirect_mbox(struct tg3 *tp, u32 off, u32 val)
359{
360 unsigned long flags;
361
362 if (off == (MAILBOX_RCVRET_CON_IDX_0 + TG3_64BIT_REG_LOW)) {
363 pci_write_config_dword(tp->pdev, TG3PCI_RCV_RET_RING_CON_IDX +
364 TG3_64BIT_REG_LOW, val);
365 return;
366 }
367 if (off == (MAILBOX_RCV_STD_PROD_IDX + TG3_64BIT_REG_LOW)) {
368 pci_write_config_dword(tp->pdev, TG3PCI_STD_RING_PROD_IDX +
369 TG3_64BIT_REG_LOW, val);
370 return;
1da177e4 371 }
6892914f
MC
372
373 spin_lock_irqsave(&tp->indirect_lock, flags);
374 pci_write_config_dword(tp->pdev, TG3PCI_REG_BASE_ADDR, off + 0x5600);
375 pci_write_config_dword(tp->pdev, TG3PCI_REG_DATA, val);
376 spin_unlock_irqrestore(&tp->indirect_lock, flags);
377
378 /* In indirect mode when disabling interrupts, we also need
379 * to clear the interrupt bit in the GRC local ctrl register.
380 */
381 if ((off == (MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW)) &&
382 (val == 0x1)) {
383 pci_write_config_dword(tp->pdev, TG3PCI_MISC_LOCAL_CTRL,
384 tp->grc_local_ctrl|GRC_LCLCTRL_CLEARINT);
385 }
386}
387
388static u32 tg3_read_indirect_mbox(struct tg3 *tp, u32 off)
389{
390 unsigned long flags;
391 u32 val;
392
393 spin_lock_irqsave(&tp->indirect_lock, flags);
394 pci_write_config_dword(tp->pdev, TG3PCI_REG_BASE_ADDR, off + 0x5600);
395 pci_read_config_dword(tp->pdev, TG3PCI_REG_DATA, &val);
396 spin_unlock_irqrestore(&tp->indirect_lock, flags);
397 return val;
398}
399
b401e9e2
MC
400/* usec_wait specifies the wait time in usec when writing to certain registers
401 * where it is unsafe to read back the register without some delay.
402 * GRC_LOCAL_CTRL is one example if the GPIOs are toggled to switch power.
403 * TG3PCI_CLOCK_CTRL is another example if the clock frequencies are changed.
404 */
405static void _tw32_flush(struct tg3 *tp, u32 off, u32 val, u32 usec_wait)
6892914f 406{
b401e9e2
MC
407 if ((tp->tg3_flags & TG3_FLAG_PCIX_TARGET_HWBUG) ||
408 (tp->tg3_flags2 & TG3_FLG2_ICH_WORKAROUND))
409 /* Non-posted methods */
410 tp->write32(tp, off, val);
411 else {
412 /* Posted method */
413 tg3_write32(tp, off, val);
414 if (usec_wait)
415 udelay(usec_wait);
416 tp->read32(tp, off);
417 }
418 /* Wait again after the read for the posted method to guarantee that
419 * the wait time is met.
420 */
421 if (usec_wait)
422 udelay(usec_wait);
1da177e4
LT
423}
424
09ee929c
MC
425static inline void tw32_mailbox_flush(struct tg3 *tp, u32 off, u32 val)
426{
427 tp->write32_mbox(tp, off, val);
6892914f
MC
428 if (!(tp->tg3_flags & TG3_FLAG_MBOX_WRITE_REORDER) &&
429 !(tp->tg3_flags2 & TG3_FLG2_ICH_WORKAROUND))
430 tp->read32_mbox(tp, off);
09ee929c
MC
431}
432
20094930 433static void tg3_write32_tx_mbox(struct tg3 *tp, u32 off, u32 val)
1da177e4
LT
434{
435 void __iomem *mbox = tp->regs + off;
436 writel(val, mbox);
437 if (tp->tg3_flags & TG3_FLAG_TXD_MBOX_HWBUG)
438 writel(val, mbox);
439 if (tp->tg3_flags & TG3_FLAG_MBOX_WRITE_REORDER)
440 readl(mbox);
441}
442
b5d3772c
MC
443static u32 tg3_read32_mbox_5906(struct tg3 *tp, u32 off)
444{
445 return (readl(tp->regs + off + GRCMBOX_BASE));
446}
447
448static void tg3_write32_mbox_5906(struct tg3 *tp, u32 off, u32 val)
449{
450 writel(val, tp->regs + off + GRCMBOX_BASE);
451}
452
20094930 453#define tw32_mailbox(reg, val) tp->write32_mbox(tp, reg, val)
09ee929c 454#define tw32_mailbox_f(reg, val) tw32_mailbox_flush(tp, (reg), (val))
20094930
MC
455#define tw32_rx_mbox(reg, val) tp->write32_rx_mbox(tp, reg, val)
456#define tw32_tx_mbox(reg, val) tp->write32_tx_mbox(tp, reg, val)
09ee929c 457#define tr32_mailbox(reg) tp->read32_mbox(tp, reg)
20094930
MC
458
459#define tw32(reg,val) tp->write32(tp, reg, val)
b401e9e2
MC
460#define tw32_f(reg,val) _tw32_flush(tp,(reg),(val), 0)
461#define tw32_wait_f(reg,val,us) _tw32_flush(tp,(reg),(val), (us))
20094930 462#define tr32(reg) tp->read32(tp, reg)
1da177e4
LT
463
464static void tg3_write_mem(struct tg3 *tp, u32 off, u32 val)
465{
6892914f
MC
466 unsigned long flags;
467
b5d3772c
MC
468 if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) &&
469 (off >= NIC_SRAM_STATS_BLK) && (off < NIC_SRAM_TX_BUFFER_DESC))
470 return;
471
6892914f 472 spin_lock_irqsave(&tp->indirect_lock, flags);
bbadf503
MC
473 if (tp->tg3_flags & TG3_FLAG_SRAM_USE_CONFIG) {
474 pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_BASE_ADDR, off);
475 pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_DATA, val);
1da177e4 476
bbadf503
MC
477 /* Always leave this as zero. */
478 pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_BASE_ADDR, 0);
479 } else {
480 tw32_f(TG3PCI_MEM_WIN_BASE_ADDR, off);
481 tw32_f(TG3PCI_MEM_WIN_DATA, val);
28fbef78 482
bbadf503
MC
483 /* Always leave this as zero. */
484 tw32_f(TG3PCI_MEM_WIN_BASE_ADDR, 0);
485 }
486 spin_unlock_irqrestore(&tp->indirect_lock, flags);
758a6139
DM
487}
488
1da177e4
LT
489static void tg3_read_mem(struct tg3 *tp, u32 off, u32 *val)
490{
6892914f
MC
491 unsigned long flags;
492
b5d3772c
MC
493 if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) &&
494 (off >= NIC_SRAM_STATS_BLK) && (off < NIC_SRAM_TX_BUFFER_DESC)) {
495 *val = 0;
496 return;
497 }
498
6892914f 499 spin_lock_irqsave(&tp->indirect_lock, flags);
bbadf503
MC
500 if (tp->tg3_flags & TG3_FLAG_SRAM_USE_CONFIG) {
501 pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_BASE_ADDR, off);
502 pci_read_config_dword(tp->pdev, TG3PCI_MEM_WIN_DATA, val);
1da177e4 503
bbadf503
MC
504 /* Always leave this as zero. */
505 pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_BASE_ADDR, 0);
506 } else {
507 tw32_f(TG3PCI_MEM_WIN_BASE_ADDR, off);
508 *val = tr32(TG3PCI_MEM_WIN_DATA);
509
510 /* Always leave this as zero. */
511 tw32_f(TG3PCI_MEM_WIN_BASE_ADDR, 0);
512 }
6892914f 513 spin_unlock_irqrestore(&tp->indirect_lock, flags);
1da177e4
LT
514}
515
0d3031d9
MC
516static void tg3_ape_lock_init(struct tg3 *tp)
517{
518 int i;
519
520 /* Make sure the driver hasn't any stale locks. */
521 for (i = 0; i < 8; i++)
522 tg3_ape_write32(tp, TG3_APE_LOCK_GRANT + 4 * i,
523 APE_LOCK_GRANT_DRIVER);
524}
525
526static int tg3_ape_lock(struct tg3 *tp, int locknum)
527{
528 int i, off;
529 int ret = 0;
530 u32 status;
531
532 if (!(tp->tg3_flags3 & TG3_FLG3_ENABLE_APE))
533 return 0;
534
535 switch (locknum) {
536 case TG3_APE_LOCK_MEM:
537 break;
538 default:
539 return -EINVAL;
540 }
541
542 off = 4 * locknum;
543
544 tg3_ape_write32(tp, TG3_APE_LOCK_REQ + off, APE_LOCK_REQ_DRIVER);
545
546 /* Wait for up to 1 millisecond to acquire lock. */
547 for (i = 0; i < 100; i++) {
548 status = tg3_ape_read32(tp, TG3_APE_LOCK_GRANT + off);
549 if (status == APE_LOCK_GRANT_DRIVER)
550 break;
551 udelay(10);
552 }
553
554 if (status != APE_LOCK_GRANT_DRIVER) {
555 /* Revoke the lock request. */
556 tg3_ape_write32(tp, TG3_APE_LOCK_GRANT + off,
557 APE_LOCK_GRANT_DRIVER);
558
559 ret = -EBUSY;
560 }
561
562 return ret;
563}
564
565static void tg3_ape_unlock(struct tg3 *tp, int locknum)
566{
567 int off;
568
569 if (!(tp->tg3_flags3 & TG3_FLG3_ENABLE_APE))
570 return;
571
572 switch (locknum) {
573 case TG3_APE_LOCK_MEM:
574 break;
575 default:
576 return;
577 }
578
579 off = 4 * locknum;
580 tg3_ape_write32(tp, TG3_APE_LOCK_GRANT + off, APE_LOCK_GRANT_DRIVER);
581}
582
1da177e4
LT
583static void tg3_disable_ints(struct tg3 *tp)
584{
585 tw32(TG3PCI_MISC_HOST_CTRL,
586 (tp->misc_host_ctrl | MISC_HOST_CTRL_MASK_PCI_INT));
09ee929c 587 tw32_mailbox_f(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW, 0x00000001);
1da177e4
LT
588}
589
590static inline void tg3_cond_int(struct tg3 *tp)
591{
38f3843e
MC
592 if (!(tp->tg3_flags & TG3_FLAG_TAGGED_STATUS) &&
593 (tp->hw_status->status & SD_STATUS_UPDATED))
1da177e4 594 tw32(GRC_LOCAL_CTRL, tp->grc_local_ctrl | GRC_LCLCTRL_SETINT);
b5d3772c
MC
595 else
596 tw32(HOSTCC_MODE, tp->coalesce_mode |
597 (HOSTCC_MODE_ENABLE | HOSTCC_MODE_NOW));
1da177e4
LT
598}
599
600static void tg3_enable_ints(struct tg3 *tp)
601{
bbe832c0
MC
602 tp->irq_sync = 0;
603 wmb();
604
1da177e4
LT
605 tw32(TG3PCI_MISC_HOST_CTRL,
606 (tp->misc_host_ctrl & ~MISC_HOST_CTRL_MASK_PCI_INT));
09ee929c
MC
607 tw32_mailbox_f(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW,
608 (tp->last_tag << 24));
fcfa0a32
MC
609 if (tp->tg3_flags2 & TG3_FLG2_1SHOT_MSI)
610 tw32_mailbox_f(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW,
611 (tp->last_tag << 24));
1da177e4
LT
612 tg3_cond_int(tp);
613}
614
04237ddd
MC
615static inline unsigned int tg3_has_work(struct tg3 *tp)
616{
617 struct tg3_hw_status *sblk = tp->hw_status;
618 unsigned int work_exists = 0;
619
620 /* check for phy events */
621 if (!(tp->tg3_flags &
622 (TG3_FLAG_USE_LINKCHG_REG |
623 TG3_FLAG_POLL_SERDES))) {
624 if (sblk->status & SD_STATUS_LINK_CHG)
625 work_exists = 1;
626 }
627 /* check for RX/TX work to do */
628 if (sblk->idx[0].tx_consumer != tp->tx_cons ||
629 sblk->idx[0].rx_producer != tp->rx_rcb_ptr)
630 work_exists = 1;
631
632 return work_exists;
633}
634
1da177e4 635/* tg3_restart_ints
04237ddd
MC
636 * similar to tg3_enable_ints, but it accurately determines whether there
637 * is new work pending and can return without flushing the PIO write
6aa20a22 638 * which reenables interrupts
1da177e4
LT
639 */
640static void tg3_restart_ints(struct tg3 *tp)
641{
fac9b83e
DM
642 tw32_mailbox(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW,
643 tp->last_tag << 24);
1da177e4
LT
644 mmiowb();
645
fac9b83e
DM
646 /* When doing tagged status, this work check is unnecessary.
647 * The last_tag we write above tells the chip which piece of
648 * work we've completed.
649 */
650 if (!(tp->tg3_flags & TG3_FLAG_TAGGED_STATUS) &&
651 tg3_has_work(tp))
04237ddd
MC
652 tw32(HOSTCC_MODE, tp->coalesce_mode |
653 (HOSTCC_MODE_ENABLE | HOSTCC_MODE_NOW));
1da177e4
LT
654}
655
656static inline void tg3_netif_stop(struct tg3 *tp)
657{
bbe832c0 658 tp->dev->trans_start = jiffies; /* prevent tx timeout */
bea3348e 659 napi_disable(&tp->napi);
1da177e4
LT
660 netif_tx_disable(tp->dev);
661}
662
663static inline void tg3_netif_start(struct tg3 *tp)
664{
665 netif_wake_queue(tp->dev);
666 /* NOTE: unconditional netif_wake_queue is only appropriate
667 * so long as all callers are assured to have free tx slots
668 * (such as after tg3_init_hw)
669 */
bea3348e 670 napi_enable(&tp->napi);
f47c11ee
DM
671 tp->hw_status->status |= SD_STATUS_UPDATED;
672 tg3_enable_ints(tp);
1da177e4
LT
673}
674
675static void tg3_switch_clocks(struct tg3 *tp)
676{
677 u32 clock_ctrl = tr32(TG3PCI_CLOCK_CTRL);
678 u32 orig_clock_ctrl;
679
795d01c5
MC
680 if ((tp->tg3_flags & TG3_FLAG_CPMU_PRESENT) ||
681 (tp->tg3_flags2 & TG3_FLG2_5780_CLASS))
4cf78e4f
MC
682 return;
683
1da177e4
LT
684 orig_clock_ctrl = clock_ctrl;
685 clock_ctrl &= (CLOCK_CTRL_FORCE_CLKRUN |
686 CLOCK_CTRL_CLKRUN_OENABLE |
687 0x1f);
688 tp->pci_clock_ctrl = clock_ctrl;
689
690 if (tp->tg3_flags2 & TG3_FLG2_5705_PLUS) {
691 if (orig_clock_ctrl & CLOCK_CTRL_625_CORE) {
b401e9e2
MC
692 tw32_wait_f(TG3PCI_CLOCK_CTRL,
693 clock_ctrl | CLOCK_CTRL_625_CORE, 40);
1da177e4
LT
694 }
695 } else if ((orig_clock_ctrl & CLOCK_CTRL_44MHZ_CORE) != 0) {
b401e9e2
MC
696 tw32_wait_f(TG3PCI_CLOCK_CTRL,
697 clock_ctrl |
698 (CLOCK_CTRL_44MHZ_CORE | CLOCK_CTRL_ALTCLK),
699 40);
700 tw32_wait_f(TG3PCI_CLOCK_CTRL,
701 clock_ctrl | (CLOCK_CTRL_ALTCLK),
702 40);
1da177e4 703 }
b401e9e2 704 tw32_wait_f(TG3PCI_CLOCK_CTRL, clock_ctrl, 40);
1da177e4
LT
705}
706
707#define PHY_BUSY_LOOPS 5000
708
709static int tg3_readphy(struct tg3 *tp, int reg, u32 *val)
710{
711 u32 frame_val;
712 unsigned int loops;
713 int ret;
714
715 if ((tp->mi_mode & MAC_MI_MODE_AUTO_POLL) != 0) {
716 tw32_f(MAC_MI_MODE,
717 (tp->mi_mode & ~MAC_MI_MODE_AUTO_POLL));
718 udelay(80);
719 }
720
721 *val = 0x0;
722
723 frame_val = ((PHY_ADDR << MI_COM_PHY_ADDR_SHIFT) &
724 MI_COM_PHY_ADDR_MASK);
725 frame_val |= ((reg << MI_COM_REG_ADDR_SHIFT) &
726 MI_COM_REG_ADDR_MASK);
727 frame_val |= (MI_COM_CMD_READ | MI_COM_START);
6aa20a22 728
1da177e4
LT
729 tw32_f(MAC_MI_COM, frame_val);
730
731 loops = PHY_BUSY_LOOPS;
732 while (loops != 0) {
733 udelay(10);
734 frame_val = tr32(MAC_MI_COM);
735
736 if ((frame_val & MI_COM_BUSY) == 0) {
737 udelay(5);
738 frame_val = tr32(MAC_MI_COM);
739 break;
740 }
741 loops -= 1;
742 }
743
744 ret = -EBUSY;
745 if (loops != 0) {
746 *val = frame_val & MI_COM_DATA_MASK;
747 ret = 0;
748 }
749
750 if ((tp->mi_mode & MAC_MI_MODE_AUTO_POLL) != 0) {
751 tw32_f(MAC_MI_MODE, tp->mi_mode);
752 udelay(80);
753 }
754
755 return ret;
756}
757
758static int tg3_writephy(struct tg3 *tp, int reg, u32 val)
759{
760 u32 frame_val;
761 unsigned int loops;
762 int ret;
763
b5d3772c
MC
764 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906 &&
765 (reg == MII_TG3_CTRL || reg == MII_TG3_AUX_CTRL))
766 return 0;
767
1da177e4
LT
768 if ((tp->mi_mode & MAC_MI_MODE_AUTO_POLL) != 0) {
769 tw32_f(MAC_MI_MODE,
770 (tp->mi_mode & ~MAC_MI_MODE_AUTO_POLL));
771 udelay(80);
772 }
773
774 frame_val = ((PHY_ADDR << MI_COM_PHY_ADDR_SHIFT) &
775 MI_COM_PHY_ADDR_MASK);
776 frame_val |= ((reg << MI_COM_REG_ADDR_SHIFT) &
777 MI_COM_REG_ADDR_MASK);
778 frame_val |= (val & MI_COM_DATA_MASK);
779 frame_val |= (MI_COM_CMD_WRITE | MI_COM_START);
6aa20a22 780
1da177e4
LT
781 tw32_f(MAC_MI_COM, frame_val);
782
783 loops = PHY_BUSY_LOOPS;
784 while (loops != 0) {
785 udelay(10);
786 frame_val = tr32(MAC_MI_COM);
787 if ((frame_val & MI_COM_BUSY) == 0) {
788 udelay(5);
789 frame_val = tr32(MAC_MI_COM);
790 break;
791 }
792 loops -= 1;
793 }
794
795 ret = -EBUSY;
796 if (loops != 0)
797 ret = 0;
798
799 if ((tp->mi_mode & MAC_MI_MODE_AUTO_POLL) != 0) {
800 tw32_f(MAC_MI_MODE, tp->mi_mode);
801 udelay(80);
802 }
803
804 return ret;
805}
806
b2a5c19c
MC
807static void tg3_phydsp_write(struct tg3 *tp, u32 reg, u32 val)
808{
809 tg3_writephy(tp, MII_TG3_DSP_ADDRESS, reg);
810 tg3_writephy(tp, MII_TG3_DSP_RW_PORT, val);
811}
812
9ef8ca99
MC
813static void tg3_phy_toggle_automdix(struct tg3 *tp, int enable)
814{
815 u32 phy;
816
817 if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS) ||
818 (tp->tg3_flags2 & TG3_FLG2_ANY_SERDES))
819 return;
820
821 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) {
822 u32 ephy;
823
824 if (!tg3_readphy(tp, MII_TG3_EPHY_TEST, &ephy)) {
825 tg3_writephy(tp, MII_TG3_EPHY_TEST,
826 ephy | MII_TG3_EPHY_SHADOW_EN);
827 if (!tg3_readphy(tp, MII_TG3_EPHYTST_MISCCTRL, &phy)) {
828 if (enable)
829 phy |= MII_TG3_EPHYTST_MISCCTRL_MDIX;
830 else
831 phy &= ~MII_TG3_EPHYTST_MISCCTRL_MDIX;
832 tg3_writephy(tp, MII_TG3_EPHYTST_MISCCTRL, phy);
833 }
834 tg3_writephy(tp, MII_TG3_EPHY_TEST, ephy);
835 }
836 } else {
837 phy = MII_TG3_AUXCTL_MISC_RDSEL_MISC |
838 MII_TG3_AUXCTL_SHDWSEL_MISC;
839 if (!tg3_writephy(tp, MII_TG3_AUX_CTRL, phy) &&
840 !tg3_readphy(tp, MII_TG3_AUX_CTRL, &phy)) {
841 if (enable)
842 phy |= MII_TG3_AUXCTL_MISC_FORCE_AMDIX;
843 else
844 phy &= ~MII_TG3_AUXCTL_MISC_FORCE_AMDIX;
845 phy |= MII_TG3_AUXCTL_MISC_WREN;
846 tg3_writephy(tp, MII_TG3_AUX_CTRL, phy);
847 }
848 }
849}
850
1da177e4
LT
851static void tg3_phy_set_wirespeed(struct tg3 *tp)
852{
853 u32 val;
854
855 if (tp->tg3_flags2 & TG3_FLG2_NO_ETH_WIRE_SPEED)
856 return;
857
858 if (!tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x7007) &&
859 !tg3_readphy(tp, MII_TG3_AUX_CTRL, &val))
860 tg3_writephy(tp, MII_TG3_AUX_CTRL,
861 (val | (1 << 15) | (1 << 4)));
862}
863
864static int tg3_bmcr_reset(struct tg3 *tp)
865{
866 u32 phy_control;
867 int limit, err;
868
869 /* OK, reset it, and poll the BMCR_RESET bit until it
870 * clears or we time out.
871 */
872 phy_control = BMCR_RESET;
873 err = tg3_writephy(tp, MII_BMCR, phy_control);
874 if (err != 0)
875 return -EBUSY;
876
877 limit = 5000;
878 while (limit--) {
879 err = tg3_readphy(tp, MII_BMCR, &phy_control);
880 if (err != 0)
881 return -EBUSY;
882
883 if ((phy_control & BMCR_RESET) == 0) {
884 udelay(40);
885 break;
886 }
887 udelay(10);
888 }
889 if (limit <= 0)
890 return -EBUSY;
891
892 return 0;
893}
894
b2a5c19c
MC
895static void tg3_phy_apply_otp(struct tg3 *tp)
896{
897 u32 otp, phy;
898
899 if (!tp->phy_otp)
900 return;
901
902 otp = tp->phy_otp;
903
904 /* Enable SM_DSP clock and tx 6dB coding. */
905 phy = MII_TG3_AUXCTL_SHDWSEL_AUXCTL |
906 MII_TG3_AUXCTL_ACTL_SMDSP_ENA |
907 MII_TG3_AUXCTL_ACTL_TX_6DB;
908 tg3_writephy(tp, MII_TG3_AUX_CTRL, phy);
909
910 phy = ((otp & TG3_OTP_AGCTGT_MASK) >> TG3_OTP_AGCTGT_SHIFT);
911 phy |= MII_TG3_DSP_TAP1_AGCTGT_DFLT;
912 tg3_phydsp_write(tp, MII_TG3_DSP_TAP1, phy);
913
914 phy = ((otp & TG3_OTP_HPFFLTR_MASK) >> TG3_OTP_HPFFLTR_SHIFT) |
915 ((otp & TG3_OTP_HPFOVER_MASK) >> TG3_OTP_HPFOVER_SHIFT);
916 tg3_phydsp_write(tp, MII_TG3_DSP_AADJ1CH0, phy);
917
918 phy = ((otp & TG3_OTP_LPFDIS_MASK) >> TG3_OTP_LPFDIS_SHIFT);
919 phy |= MII_TG3_DSP_AADJ1CH3_ADCCKADJ;
920 tg3_phydsp_write(tp, MII_TG3_DSP_AADJ1CH3, phy);
921
922 phy = ((otp & TG3_OTP_VDAC_MASK) >> TG3_OTP_VDAC_SHIFT);
923 tg3_phydsp_write(tp, MII_TG3_DSP_EXP75, phy);
924
925 phy = ((otp & TG3_OTP_10BTAMP_MASK) >> TG3_OTP_10BTAMP_SHIFT);
926 tg3_phydsp_write(tp, MII_TG3_DSP_EXP96, phy);
927
928 phy = ((otp & TG3_OTP_ROFF_MASK) >> TG3_OTP_ROFF_SHIFT) |
929 ((otp & TG3_OTP_RCOFF_MASK) >> TG3_OTP_RCOFF_SHIFT);
930 tg3_phydsp_write(tp, MII_TG3_DSP_EXP97, phy);
931
932 /* Turn off SM_DSP clock. */
933 phy = MII_TG3_AUXCTL_SHDWSEL_AUXCTL |
934 MII_TG3_AUXCTL_ACTL_TX_6DB;
935 tg3_writephy(tp, MII_TG3_AUX_CTRL, phy);
936}
937
1da177e4
LT
938static int tg3_wait_macro_done(struct tg3 *tp)
939{
940 int limit = 100;
941
942 while (limit--) {
943 u32 tmp32;
944
945 if (!tg3_readphy(tp, 0x16, &tmp32)) {
946 if ((tmp32 & 0x1000) == 0)
947 break;
948 }
949 }
950 if (limit <= 0)
951 return -EBUSY;
952
953 return 0;
954}
955
956static int tg3_phy_write_and_check_testpat(struct tg3 *tp, int *resetp)
957{
958 static const u32 test_pat[4][6] = {
959 { 0x00005555, 0x00000005, 0x00002aaa, 0x0000000a, 0x00003456, 0x00000003 },
960 { 0x00002aaa, 0x0000000a, 0x00003333, 0x00000003, 0x0000789a, 0x00000005 },
961 { 0x00005a5a, 0x00000005, 0x00002a6a, 0x0000000a, 0x00001bcd, 0x00000003 },
962 { 0x00002a5a, 0x0000000a, 0x000033c3, 0x00000003, 0x00002ef1, 0x00000005 }
963 };
964 int chan;
965
966 for (chan = 0; chan < 4; chan++) {
967 int i;
968
969 tg3_writephy(tp, MII_TG3_DSP_ADDRESS,
970 (chan * 0x2000) | 0x0200);
971 tg3_writephy(tp, 0x16, 0x0002);
972
973 for (i = 0; i < 6; i++)
974 tg3_writephy(tp, MII_TG3_DSP_RW_PORT,
975 test_pat[chan][i]);
976
977 tg3_writephy(tp, 0x16, 0x0202);
978 if (tg3_wait_macro_done(tp)) {
979 *resetp = 1;
980 return -EBUSY;
981 }
982
983 tg3_writephy(tp, MII_TG3_DSP_ADDRESS,
984 (chan * 0x2000) | 0x0200);
985 tg3_writephy(tp, 0x16, 0x0082);
986 if (tg3_wait_macro_done(tp)) {
987 *resetp = 1;
988 return -EBUSY;
989 }
990
991 tg3_writephy(tp, 0x16, 0x0802);
992 if (tg3_wait_macro_done(tp)) {
993 *resetp = 1;
994 return -EBUSY;
995 }
996
997 for (i = 0; i < 6; i += 2) {
998 u32 low, high;
999
1000 if (tg3_readphy(tp, MII_TG3_DSP_RW_PORT, &low) ||
1001 tg3_readphy(tp, MII_TG3_DSP_RW_PORT, &high) ||
1002 tg3_wait_macro_done(tp)) {
1003 *resetp = 1;
1004 return -EBUSY;
1005 }
1006 low &= 0x7fff;
1007 high &= 0x000f;
1008 if (low != test_pat[chan][i] ||
1009 high != test_pat[chan][i+1]) {
1010 tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x000b);
1011 tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x4001);
1012 tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x4005);
1013
1014 return -EBUSY;
1015 }
1016 }
1017 }
1018
1019 return 0;
1020}
1021
1022static int tg3_phy_reset_chanpat(struct tg3 *tp)
1023{
1024 int chan;
1025
1026 for (chan = 0; chan < 4; chan++) {
1027 int i;
1028
1029 tg3_writephy(tp, MII_TG3_DSP_ADDRESS,
1030 (chan * 0x2000) | 0x0200);
1031 tg3_writephy(tp, 0x16, 0x0002);
1032 for (i = 0; i < 6; i++)
1033 tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x000);
1034 tg3_writephy(tp, 0x16, 0x0202);
1035 if (tg3_wait_macro_done(tp))
1036 return -EBUSY;
1037 }
1038
1039 return 0;
1040}
1041
1042static int tg3_phy_reset_5703_4_5(struct tg3 *tp)
1043{
1044 u32 reg32, phy9_orig;
1045 int retries, do_phy_reset, err;
1046
1047 retries = 10;
1048 do_phy_reset = 1;
1049 do {
1050 if (do_phy_reset) {
1051 err = tg3_bmcr_reset(tp);
1052 if (err)
1053 return err;
1054 do_phy_reset = 0;
1055 }
1056
1057 /* Disable transmitter and interrupt. */
1058 if (tg3_readphy(tp, MII_TG3_EXT_CTRL, &reg32))
1059 continue;
1060
1061 reg32 |= 0x3000;
1062 tg3_writephy(tp, MII_TG3_EXT_CTRL, reg32);
1063
1064 /* Set full-duplex, 1000 mbps. */
1065 tg3_writephy(tp, MII_BMCR,
1066 BMCR_FULLDPLX | TG3_BMCR_SPEED1000);
1067
1068 /* Set to master mode. */
1069 if (tg3_readphy(tp, MII_TG3_CTRL, &phy9_orig))
1070 continue;
1071
1072 tg3_writephy(tp, MII_TG3_CTRL,
1073 (MII_TG3_CTRL_AS_MASTER |
1074 MII_TG3_CTRL_ENABLE_AS_MASTER));
1075
1076 /* Enable SM_DSP_CLOCK and 6dB. */
1077 tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x0c00);
1078
1079 /* Block the PHY control access. */
1080 tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x8005);
1081 tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x0800);
1082
1083 err = tg3_phy_write_and_check_testpat(tp, &do_phy_reset);
1084 if (!err)
1085 break;
1086 } while (--retries);
1087
1088 err = tg3_phy_reset_chanpat(tp);
1089 if (err)
1090 return err;
1091
1092 tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x8005);
1093 tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x0000);
1094
1095 tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x8200);
1096 tg3_writephy(tp, 0x16, 0x0000);
1097
1098 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703 ||
1099 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704) {
1100 /* Set Extended packet length bit for jumbo frames */
1101 tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x4400);
1102 }
1103 else {
1104 tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x0400);
1105 }
1106
1107 tg3_writephy(tp, MII_TG3_CTRL, phy9_orig);
1108
1109 if (!tg3_readphy(tp, MII_TG3_EXT_CTRL, &reg32)) {
1110 reg32 &= ~0x3000;
1111 tg3_writephy(tp, MII_TG3_EXT_CTRL, reg32);
1112 } else if (!err)
1113 err = -EBUSY;
1114
1115 return err;
1116}
1117
c8e1e82b
MC
1118static void tg3_link_report(struct tg3 *);
1119
1da177e4
LT
1120/* This will reset the tigon3 PHY if there is no valid
1121 * link unless the FORCE argument is non-zero.
1122 */
1123static int tg3_phy_reset(struct tg3 *tp)
1124{
b2a5c19c 1125 u32 cpmuctrl;
1da177e4
LT
1126 u32 phy_status;
1127 int err;
1128
60189ddf
MC
1129 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) {
1130 u32 val;
1131
1132 val = tr32(GRC_MISC_CFG);
1133 tw32_f(GRC_MISC_CFG, val & ~GRC_MISC_CFG_EPHY_IDDQ);
1134 udelay(40);
1135 }
1da177e4
LT
1136 err = tg3_readphy(tp, MII_BMSR, &phy_status);
1137 err |= tg3_readphy(tp, MII_BMSR, &phy_status);
1138 if (err != 0)
1139 return -EBUSY;
1140
c8e1e82b
MC
1141 if (netif_running(tp->dev) && netif_carrier_ok(tp->dev)) {
1142 netif_carrier_off(tp->dev);
1143 tg3_link_report(tp);
1144 }
1145
1da177e4
LT
1146 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703 ||
1147 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704 ||
1148 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) {
1149 err = tg3_phy_reset_5703_4_5(tp);
1150 if (err)
1151 return err;
1152 goto out;
1153 }
1154
b2a5c19c
MC
1155 cpmuctrl = 0;
1156 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5784 &&
1157 GET_CHIP_REV(tp->pci_chip_rev_id) != CHIPREV_5784_AX) {
1158 cpmuctrl = tr32(TG3_CPMU_CTRL);
1159 if (cpmuctrl & CPMU_CTRL_GPHY_10MB_RXONLY)
1160 tw32(TG3_CPMU_CTRL,
1161 cpmuctrl & ~CPMU_CTRL_GPHY_10MB_RXONLY);
1162 }
1163
1da177e4
LT
1164 err = tg3_bmcr_reset(tp);
1165 if (err)
1166 return err;
1167
b2a5c19c
MC
1168 if (cpmuctrl & CPMU_CTRL_GPHY_10MB_RXONLY) {
1169 u32 phy;
1170
1171 phy = MII_TG3_DSP_EXP8_AEDW | MII_TG3_DSP_EXP8_REJ2MHz;
1172 tg3_phydsp_write(tp, MII_TG3_DSP_EXP8, phy);
1173
1174 tw32(TG3_CPMU_CTRL, cpmuctrl);
1175 }
1176
b5af7126 1177 if (tp->tg3_flags3 & TG3_FLG3_5761_5784_AX_FIXES) {
ce057f01
MC
1178 u32 val;
1179
1180 val = tr32(TG3_CPMU_LSPD_1000MB_CLK);
1181 if ((val & CPMU_LSPD_1000MB_MACCLK_MASK) ==
1182 CPMU_LSPD_1000MB_MACCLK_12_5) {
1183 val &= ~CPMU_LSPD_1000MB_MACCLK_MASK;
1184 udelay(40);
1185 tw32_f(TG3_CPMU_LSPD_1000MB_CLK, val);
1186 }
662f38d2
MC
1187
1188 /* Disable GPHY autopowerdown. */
1189 tg3_writephy(tp, MII_TG3_MISC_SHDW,
1190 MII_TG3_MISC_SHDW_WREN |
1191 MII_TG3_MISC_SHDW_APD_SEL |
1192 MII_TG3_MISC_SHDW_APD_WKTM_84MS);
ce057f01
MC
1193 }
1194
b2a5c19c
MC
1195 tg3_phy_apply_otp(tp);
1196
1da177e4
LT
1197out:
1198 if (tp->tg3_flags2 & TG3_FLG2_PHY_ADC_BUG) {
1199 tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x0c00);
1200 tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x201f);
1201 tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x2aaa);
1202 tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x000a);
1203 tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x0323);
1204 tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x0400);
1205 }
1206 if (tp->tg3_flags2 & TG3_FLG2_PHY_5704_A0_BUG) {
1207 tg3_writephy(tp, 0x1c, 0x8d68);
1208 tg3_writephy(tp, 0x1c, 0x8d68);
1209 }
1210 if (tp->tg3_flags2 & TG3_FLG2_PHY_BER_BUG) {
1211 tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x0c00);
1212 tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x000a);
1213 tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x310b);
1214 tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x201f);
1215 tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x9506);
1216 tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x401f);
1217 tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x14e2);
1218 tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x0400);
1219 }
c424cb24
MC
1220 else if (tp->tg3_flags2 & TG3_FLG2_PHY_JITTER_BUG) {
1221 tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x0c00);
1222 tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x000a);
c1d2a196
MC
1223 if (tp->tg3_flags2 & TG3_FLG2_PHY_ADJUST_TRIM) {
1224 tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x110b);
1225 tg3_writephy(tp, MII_TG3_TEST1,
1226 MII_TG3_TEST1_TRIM_EN | 0x4);
1227 } else
1228 tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x010b);
c424cb24
MC
1229 tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x0400);
1230 }
1da177e4
LT
1231 /* Set Extended packet length bit (bit 14) on all chips that */
1232 /* support jumbo frames */
1233 if ((tp->phy_id & PHY_ID_MASK) == PHY_ID_BCM5401) {
1234 /* Cannot do read-modify-write on 5401 */
1235 tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x4c20);
0f893dc6 1236 } else if (tp->tg3_flags2 & TG3_FLG2_JUMBO_CAPABLE) {
1da177e4
LT
1237 u32 phy_reg;
1238
1239 /* Set bit 14 with read-modify-write to preserve other bits */
1240 if (!tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x0007) &&
1241 !tg3_readphy(tp, MII_TG3_AUX_CTRL, &phy_reg))
1242 tg3_writephy(tp, MII_TG3_AUX_CTRL, phy_reg | 0x4000);
1243 }
1244
1245 /* Set phy register 0x10 bit 0 to high fifo elasticity to support
1246 * jumbo frames transmission.
1247 */
0f893dc6 1248 if (tp->tg3_flags2 & TG3_FLG2_JUMBO_CAPABLE) {
1da177e4
LT
1249 u32 phy_reg;
1250
1251 if (!tg3_readphy(tp, MII_TG3_EXT_CTRL, &phy_reg))
1252 tg3_writephy(tp, MII_TG3_EXT_CTRL,
1253 phy_reg | MII_TG3_EXT_CTRL_FIFO_ELASTIC);
1254 }
1255
715116a1 1256 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) {
715116a1
MC
1257 /* adjust output voltage */
1258 tg3_writephy(tp, MII_TG3_EPHY_PTEST, 0x12);
715116a1
MC
1259 }
1260
9ef8ca99 1261 tg3_phy_toggle_automdix(tp, 1);
1da177e4
LT
1262 tg3_phy_set_wirespeed(tp);
1263 return 0;
1264}
1265
1266static void tg3_frob_aux_power(struct tg3 *tp)
1267{
1268 struct tg3 *tp_peer = tp;
1269
9d26e213 1270 if ((tp->tg3_flags2 & TG3_FLG2_IS_NIC) == 0)
1da177e4
LT
1271 return;
1272
8c2dc7e1
MC
1273 if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704) ||
1274 (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5714)) {
1275 struct net_device *dev_peer;
1276
1277 dev_peer = pci_get_drvdata(tp->pdev_peer);
bc1c7567 1278 /* remove_one() may have been run on the peer. */
8c2dc7e1 1279 if (!dev_peer)
bc1c7567
MC
1280 tp_peer = tp;
1281 else
1282 tp_peer = netdev_priv(dev_peer);
1da177e4
LT
1283 }
1284
1da177e4 1285 if ((tp->tg3_flags & TG3_FLAG_WOL_ENABLE) != 0 ||
6921d201
MC
1286 (tp->tg3_flags & TG3_FLAG_ENABLE_ASF) != 0 ||
1287 (tp_peer->tg3_flags & TG3_FLAG_WOL_ENABLE) != 0 ||
1288 (tp_peer->tg3_flags & TG3_FLAG_ENABLE_ASF) != 0) {
1da177e4
LT
1289 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 ||
1290 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701) {
b401e9e2
MC
1291 tw32_wait_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl |
1292 (GRC_LCLCTRL_GPIO_OE0 |
1293 GRC_LCLCTRL_GPIO_OE1 |
1294 GRC_LCLCTRL_GPIO_OE2 |
1295 GRC_LCLCTRL_GPIO_OUTPUT0 |
1296 GRC_LCLCTRL_GPIO_OUTPUT1),
1297 100);
1da177e4
LT
1298 } else {
1299 u32 no_gpio2;
dc56b7d4 1300 u32 grc_local_ctrl = 0;
1da177e4
LT
1301
1302 if (tp_peer != tp &&
1303 (tp_peer->tg3_flags & TG3_FLAG_INIT_COMPLETE) != 0)
1304 return;
1305
dc56b7d4
MC
1306 /* Workaround to prevent overdrawing Amps. */
1307 if (GET_ASIC_REV(tp->pci_chip_rev_id) ==
1308 ASIC_REV_5714) {
1309 grc_local_ctrl |= GRC_LCLCTRL_GPIO_OE3;
b401e9e2
MC
1310 tw32_wait_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl |
1311 grc_local_ctrl, 100);
dc56b7d4
MC
1312 }
1313
1da177e4
LT
1314 /* On 5753 and variants, GPIO2 cannot be used. */
1315 no_gpio2 = tp->nic_sram_data_cfg &
1316 NIC_SRAM_DATA_CFG_NO_GPIO2;
1317
dc56b7d4 1318 grc_local_ctrl |= GRC_LCLCTRL_GPIO_OE0 |
1da177e4
LT
1319 GRC_LCLCTRL_GPIO_OE1 |
1320 GRC_LCLCTRL_GPIO_OE2 |
1321 GRC_LCLCTRL_GPIO_OUTPUT1 |
1322 GRC_LCLCTRL_GPIO_OUTPUT2;
1323 if (no_gpio2) {
1324 grc_local_ctrl &= ~(GRC_LCLCTRL_GPIO_OE2 |
1325 GRC_LCLCTRL_GPIO_OUTPUT2);
1326 }
b401e9e2
MC
1327 tw32_wait_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl |
1328 grc_local_ctrl, 100);
1da177e4
LT
1329
1330 grc_local_ctrl |= GRC_LCLCTRL_GPIO_OUTPUT0;
1331
b401e9e2
MC
1332 tw32_wait_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl |
1333 grc_local_ctrl, 100);
1da177e4
LT
1334
1335 if (!no_gpio2) {
1336 grc_local_ctrl &= ~GRC_LCLCTRL_GPIO_OUTPUT2;
b401e9e2
MC
1337 tw32_wait_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl |
1338 grc_local_ctrl, 100);
1da177e4
LT
1339 }
1340 }
1341 } else {
1342 if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5700 &&
1343 GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5701) {
1344 if (tp_peer != tp &&
1345 (tp_peer->tg3_flags & TG3_FLAG_INIT_COMPLETE) != 0)
1346 return;
1347
b401e9e2
MC
1348 tw32_wait_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl |
1349 (GRC_LCLCTRL_GPIO_OE1 |
1350 GRC_LCLCTRL_GPIO_OUTPUT1), 100);
1da177e4 1351
b401e9e2
MC
1352 tw32_wait_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl |
1353 GRC_LCLCTRL_GPIO_OE1, 100);
1da177e4 1354
b401e9e2
MC
1355 tw32_wait_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl |
1356 (GRC_LCLCTRL_GPIO_OE1 |
1357 GRC_LCLCTRL_GPIO_OUTPUT1), 100);
1da177e4
LT
1358 }
1359 }
1360}
1361
e8f3f6ca
MC
1362static int tg3_5700_link_polarity(struct tg3 *tp, u32 speed)
1363{
1364 if (tp->led_ctrl == LED_CTRL_MODE_PHY_2)
1365 return 1;
1366 else if ((tp->phy_id & PHY_ID_MASK) == PHY_ID_BCM5411) {
1367 if (speed != SPEED_10)
1368 return 1;
1369 } else if (speed == SPEED_10)
1370 return 1;
1371
1372 return 0;
1373}
1374
1da177e4
LT
1375static int tg3_setup_phy(struct tg3 *, int);
1376
1377#define RESET_KIND_SHUTDOWN 0
1378#define RESET_KIND_INIT 1
1379#define RESET_KIND_SUSPEND 2
1380
1381static void tg3_write_sig_post_reset(struct tg3 *, int);
1382static int tg3_halt_cpu(struct tg3 *, u32);
6921d201
MC
1383static int tg3_nvram_lock(struct tg3 *);
1384static void tg3_nvram_unlock(struct tg3 *);
1da177e4 1385
15c3b696
MC
1386static void tg3_power_down_phy(struct tg3 *tp)
1387{
ce057f01
MC
1388 u32 val;
1389
5129724a
MC
1390 if (tp->tg3_flags2 & TG3_FLG2_PHY_SERDES) {
1391 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704) {
1392 u32 sg_dig_ctrl = tr32(SG_DIG_CTRL);
1393 u32 serdes_cfg = tr32(MAC_SERDES_CFG);
1394
1395 sg_dig_ctrl |=
1396 SG_DIG_USING_HW_AUTONEG | SG_DIG_SOFT_RESET;
1397 tw32(SG_DIG_CTRL, sg_dig_ctrl);
1398 tw32(MAC_SERDES_CFG, serdes_cfg | (1 << 15));
1399 }
3f7045c1 1400 return;
5129724a 1401 }
3f7045c1 1402
60189ddf 1403 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) {
60189ddf
MC
1404 tg3_bmcr_reset(tp);
1405 val = tr32(GRC_MISC_CFG);
1406 tw32_f(GRC_MISC_CFG, val | GRC_MISC_CFG_EPHY_IDDQ);
1407 udelay(40);
1408 return;
1409 } else {
715116a1
MC
1410 tg3_writephy(tp, MII_TG3_EXT_CTRL,
1411 MII_TG3_EXT_CTRL_FORCE_LED_OFF);
1412 tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x01b2);
1413 }
3f7045c1 1414
15c3b696
MC
1415 /* The PHY should not be powered down on some chips because
1416 * of bugs.
1417 */
1418 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 ||
1419 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704 ||
1420 (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5780 &&
1421 (tp->tg3_flags2 & TG3_FLG2_MII_SERDES)))
1422 return;
ce057f01 1423
b5af7126 1424 if (tp->tg3_flags3 & TG3_FLG3_5761_5784_AX_FIXES) {
ce057f01
MC
1425 val = tr32(TG3_CPMU_LSPD_1000MB_CLK);
1426 val &= ~CPMU_LSPD_1000MB_MACCLK_MASK;
1427 val |= CPMU_LSPD_1000MB_MACCLK_12_5;
1428 tw32_f(TG3_CPMU_LSPD_1000MB_CLK, val);
1429 }
1430
15c3b696
MC
1431 tg3_writephy(tp, MII_BMCR, BMCR_PDOWN);
1432}
1433
bc1c7567 1434static int tg3_set_power_state(struct tg3 *tp, pci_power_t state)
1da177e4
LT
1435{
1436 u32 misc_host_ctrl;
1437 u16 power_control, power_caps;
1438 int pm = tp->pm_cap;
1439
1440 /* Make sure register accesses (indirect or otherwise)
1441 * will function correctly.
1442 */
1443 pci_write_config_dword(tp->pdev,
1444 TG3PCI_MISC_HOST_CTRL,
1445 tp->misc_host_ctrl);
1446
1447 pci_read_config_word(tp->pdev,
1448 pm + PCI_PM_CTRL,
1449 &power_control);
1450 power_control |= PCI_PM_CTRL_PME_STATUS;
1451 power_control &= ~(PCI_PM_CTRL_STATE_MASK);
1452 switch (state) {
bc1c7567 1453 case PCI_D0:
1da177e4
LT
1454 power_control |= 0;
1455 pci_write_config_word(tp->pdev,
1456 pm + PCI_PM_CTRL,
1457 power_control);
8c6bda1a
MC
1458 udelay(100); /* Delay after power state change */
1459
9d26e213
MC
1460 /* Switch out of Vaux if it is a NIC */
1461 if (tp->tg3_flags2 & TG3_FLG2_IS_NIC)
b401e9e2 1462 tw32_wait_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl, 100);
1da177e4
LT
1463
1464 return 0;
1465
bc1c7567 1466 case PCI_D1:
1da177e4
LT
1467 power_control |= 1;
1468 break;
1469
bc1c7567 1470 case PCI_D2:
1da177e4
LT
1471 power_control |= 2;
1472 break;
1473
bc1c7567 1474 case PCI_D3hot:
1da177e4
LT
1475 power_control |= 3;
1476 break;
1477
1478 default:
1479 printk(KERN_WARNING PFX "%s: Invalid power state (%d) "
1480 "requested.\n",
1481 tp->dev->name, state);
1482 return -EINVAL;
1483 };
1484
1485 power_control |= PCI_PM_CTRL_PME_ENABLE;
1486
1487 misc_host_ctrl = tr32(TG3PCI_MISC_HOST_CTRL);
1488 tw32(TG3PCI_MISC_HOST_CTRL,
1489 misc_host_ctrl | MISC_HOST_CTRL_MASK_PCI_INT);
1490
1491 if (tp->link_config.phy_is_low_power == 0) {
1492 tp->link_config.phy_is_low_power = 1;
1493 tp->link_config.orig_speed = tp->link_config.speed;
1494 tp->link_config.orig_duplex = tp->link_config.duplex;
1495 tp->link_config.orig_autoneg = tp->link_config.autoneg;
1496 }
1497
747e8f8b 1498 if (!(tp->tg3_flags2 & TG3_FLG2_ANY_SERDES)) {
1da177e4
LT
1499 tp->link_config.speed = SPEED_10;
1500 tp->link_config.duplex = DUPLEX_HALF;
1501 tp->link_config.autoneg = AUTONEG_ENABLE;
1502 tg3_setup_phy(tp, 0);
1503 }
1504
b5d3772c
MC
1505 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) {
1506 u32 val;
1507
1508 val = tr32(GRC_VCPU_EXT_CTRL);
1509 tw32(GRC_VCPU_EXT_CTRL, val | GRC_VCPU_EXT_CTRL_DISABLE_WOL);
1510 } else if (!(tp->tg3_flags & TG3_FLAG_ENABLE_ASF)) {
6921d201
MC
1511 int i;
1512 u32 val;
1513
1514 for (i = 0; i < 200; i++) {
1515 tg3_read_mem(tp, NIC_SRAM_FW_ASF_STATUS_MBOX, &val);
1516 if (val == ~NIC_SRAM_FIRMWARE_MBOX_MAGIC1)
1517 break;
1518 msleep(1);
1519 }
1520 }
a85feb8c
GZ
1521 if (tp->tg3_flags & TG3_FLAG_WOL_CAP)
1522 tg3_write_mem(tp, NIC_SRAM_WOL_MBOX, WOL_SIGNATURE |
1523 WOL_DRV_STATE_SHUTDOWN |
1524 WOL_DRV_WOL |
1525 WOL_SET_MAGIC_PKT);
6921d201 1526
1da177e4
LT
1527 pci_read_config_word(tp->pdev, pm + PCI_PM_PMC, &power_caps);
1528
1529 if (tp->tg3_flags & TG3_FLAG_WOL_ENABLE) {
1530 u32 mac_mode;
1531
1532 if (!(tp->tg3_flags2 & TG3_FLG2_PHY_SERDES)) {
1533 tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x5a);
1534 udelay(40);
1535
3f7045c1
MC
1536 if (tp->tg3_flags2 & TG3_FLG2_MII_SERDES)
1537 mac_mode = MAC_MODE_PORT_MODE_GMII;
1538 else
1539 mac_mode = MAC_MODE_PORT_MODE_MII;
1da177e4 1540
e8f3f6ca
MC
1541 mac_mode |= tp->mac_mode & MAC_MODE_LINK_POLARITY;
1542 if (GET_ASIC_REV(tp->pci_chip_rev_id) ==
1543 ASIC_REV_5700) {
1544 u32 speed = (tp->tg3_flags &
1545 TG3_FLAG_WOL_SPEED_100MB) ?
1546 SPEED_100 : SPEED_10;
1547 if (tg3_5700_link_polarity(tp, speed))
1548 mac_mode |= MAC_MODE_LINK_POLARITY;
1549 else
1550 mac_mode &= ~MAC_MODE_LINK_POLARITY;
1551 }
1da177e4
LT
1552 } else {
1553 mac_mode = MAC_MODE_PORT_MODE_TBI;
1554 }
1555
cbf46853 1556 if (!(tp->tg3_flags2 & TG3_FLG2_5750_PLUS))
1da177e4
LT
1557 tw32(MAC_LED_CTRL, tp->led_ctrl);
1558
1559 if (((power_caps & PCI_PM_CAP_PME_D3cold) &&
1560 (tp->tg3_flags & TG3_FLAG_WOL_ENABLE)))
1561 mac_mode |= MAC_MODE_MAGIC_PKT_ENABLE;
1562
1563 tw32_f(MAC_MODE, mac_mode);
1564 udelay(100);
1565
1566 tw32_f(MAC_RX_MODE, RX_MODE_ENABLE);
1567 udelay(10);
1568 }
1569
1570 if (!(tp->tg3_flags & TG3_FLAG_WOL_SPEED_100MB) &&
1571 (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 ||
1572 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701)) {
1573 u32 base_val;
1574
1575 base_val = tp->pci_clock_ctrl;
1576 base_val |= (CLOCK_CTRL_RXCLK_DISABLE |
1577 CLOCK_CTRL_TXCLK_DISABLE);
1578
b401e9e2
MC
1579 tw32_wait_f(TG3PCI_CLOCK_CTRL, base_val | CLOCK_CTRL_ALTCLK |
1580 CLOCK_CTRL_PWRDOWN_PLL133, 40);
d7b0a857 1581 } else if ((tp->tg3_flags2 & TG3_FLG2_5780_CLASS) ||
795d01c5 1582 (tp->tg3_flags & TG3_FLAG_CPMU_PRESENT) ||
d7b0a857 1583 (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906)) {
4cf78e4f 1584 /* do nothing */
85e94ced 1585 } else if (!((tp->tg3_flags2 & TG3_FLG2_5750_PLUS) &&
1da177e4
LT
1586 (tp->tg3_flags & TG3_FLAG_ENABLE_ASF))) {
1587 u32 newbits1, newbits2;
1588
1589 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 ||
1590 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701) {
1591 newbits1 = (CLOCK_CTRL_RXCLK_DISABLE |
1592 CLOCK_CTRL_TXCLK_DISABLE |
1593 CLOCK_CTRL_ALTCLK);
1594 newbits2 = newbits1 | CLOCK_CTRL_44MHZ_CORE;
1595 } else if (tp->tg3_flags2 & TG3_FLG2_5705_PLUS) {
1596 newbits1 = CLOCK_CTRL_625_CORE;
1597 newbits2 = newbits1 | CLOCK_CTRL_ALTCLK;
1598 } else {
1599 newbits1 = CLOCK_CTRL_ALTCLK;
1600 newbits2 = newbits1 | CLOCK_CTRL_44MHZ_CORE;
1601 }
1602
b401e9e2
MC
1603 tw32_wait_f(TG3PCI_CLOCK_CTRL, tp->pci_clock_ctrl | newbits1,
1604 40);
1da177e4 1605
b401e9e2
MC
1606 tw32_wait_f(TG3PCI_CLOCK_CTRL, tp->pci_clock_ctrl | newbits2,
1607 40);
1da177e4
LT
1608
1609 if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS)) {
1610 u32 newbits3;
1611
1612 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 ||
1613 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701) {
1614 newbits3 = (CLOCK_CTRL_RXCLK_DISABLE |
1615 CLOCK_CTRL_TXCLK_DISABLE |
1616 CLOCK_CTRL_44MHZ_CORE);
1617 } else {
1618 newbits3 = CLOCK_CTRL_44MHZ_CORE;
1619 }
1620
b401e9e2
MC
1621 tw32_wait_f(TG3PCI_CLOCK_CTRL,
1622 tp->pci_clock_ctrl | newbits3, 40);
1da177e4
LT
1623 }
1624 }
1625
6921d201 1626 if (!(tp->tg3_flags & TG3_FLAG_WOL_ENABLE) &&
0d3031d9
MC
1627 !(tp->tg3_flags & TG3_FLAG_ENABLE_ASF) &&
1628 !(tp->tg3_flags3 & TG3_FLG3_ENABLE_APE))
3f7045c1 1629 tg3_power_down_phy(tp);
6921d201 1630
1da177e4
LT
1631 tg3_frob_aux_power(tp);
1632
1633 /* Workaround for unstable PLL clock */
1634 if ((GET_CHIP_REV(tp->pci_chip_rev_id) == CHIPREV_5750_AX) ||
1635 (GET_CHIP_REV(tp->pci_chip_rev_id) == CHIPREV_5750_BX)) {
1636 u32 val = tr32(0x7d00);
1637
1638 val &= ~((1 << 16) | (1 << 4) | (1 << 2) | (1 << 1) | 1);
1639 tw32(0x7d00, val);
6921d201 1640 if (!(tp->tg3_flags & TG3_FLAG_ENABLE_ASF)) {
ec41c7df
MC
1641 int err;
1642
1643 err = tg3_nvram_lock(tp);
1da177e4 1644 tg3_halt_cpu(tp, RX_CPU_BASE);
ec41c7df
MC
1645 if (!err)
1646 tg3_nvram_unlock(tp);
6921d201 1647 }
1da177e4
LT
1648 }
1649
bbadf503
MC
1650 tg3_write_sig_post_reset(tp, RESET_KIND_SHUTDOWN);
1651
1da177e4
LT
1652 /* Finally, set the new power state. */
1653 pci_write_config_word(tp->pdev, pm + PCI_PM_CTRL, power_control);
8c6bda1a 1654 udelay(100); /* Delay after power state change */
1da177e4 1655
1da177e4
LT
1656 return 0;
1657}
1658
1659static void tg3_link_report(struct tg3 *tp)
1660{
1661 if (!netif_carrier_ok(tp->dev)) {
9f88f29f
MC
1662 if (netif_msg_link(tp))
1663 printk(KERN_INFO PFX "%s: Link is down.\n",
1664 tp->dev->name);
1665 } else if (netif_msg_link(tp)) {
1da177e4
LT
1666 printk(KERN_INFO PFX "%s: Link is up at %d Mbps, %s duplex.\n",
1667 tp->dev->name,
1668 (tp->link_config.active_speed == SPEED_1000 ?
1669 1000 :
1670 (tp->link_config.active_speed == SPEED_100 ?
1671 100 : 10)),
1672 (tp->link_config.active_duplex == DUPLEX_FULL ?
1673 "full" : "half"));
1674
8d018621
MC
1675 printk(KERN_INFO PFX
1676 "%s: Flow control is %s for TX and %s for RX.\n",
1da177e4 1677 tp->dev->name,
8d018621
MC
1678 (tp->link_config.active_flowctrl & TG3_FLOW_CTRL_TX) ?
1679 "on" : "off",
1680 (tp->link_config.active_flowctrl & TG3_FLOW_CTRL_RX) ?
1681 "on" : "off");
1da177e4
LT
1682 }
1683}
1684
ba4d07a8
MC
1685static u16 tg3_advert_flowctrl_1000T(u8 flow_ctrl)
1686{
1687 u16 miireg;
1688
1689 if ((flow_ctrl & TG3_FLOW_CTRL_TX) && (flow_ctrl & TG3_FLOW_CTRL_RX))
1690 miireg = ADVERTISE_PAUSE_CAP;
1691 else if (flow_ctrl & TG3_FLOW_CTRL_TX)
1692 miireg = ADVERTISE_PAUSE_ASYM;
1693 else if (flow_ctrl & TG3_FLOW_CTRL_RX)
1694 miireg = ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM;
1695 else
1696 miireg = 0;
1697
1698 return miireg;
1699}
1700
1701static u16 tg3_advert_flowctrl_1000X(u8 flow_ctrl)
1702{
1703 u16 miireg;
1704
1705 if ((flow_ctrl & TG3_FLOW_CTRL_TX) && (flow_ctrl & TG3_FLOW_CTRL_RX))
1706 miireg = ADVERTISE_1000XPAUSE;
1707 else if (flow_ctrl & TG3_FLOW_CTRL_TX)
1708 miireg = ADVERTISE_1000XPSE_ASYM;
1709 else if (flow_ctrl & TG3_FLOW_CTRL_RX)
1710 miireg = ADVERTISE_1000XPAUSE | ADVERTISE_1000XPSE_ASYM;
1711 else
1712 miireg = 0;
1713
1714 return miireg;
1715}
1716
95937268
MC
1717static u8 tg3_resolve_flowctrl_1000T(u16 lcladv, u16 rmtadv)
1718{
1719 u8 cap = 0;
1720
1721 if (lcladv & ADVERTISE_PAUSE_CAP) {
1722 if (lcladv & ADVERTISE_PAUSE_ASYM) {
1723 if (rmtadv & LPA_PAUSE_CAP)
1724 cap = TG3_FLOW_CTRL_TX | TG3_FLOW_CTRL_RX;
1725 else if (rmtadv & LPA_PAUSE_ASYM)
1726 cap = TG3_FLOW_CTRL_RX;
1727 } else {
1728 if (rmtadv & LPA_PAUSE_CAP)
1729 cap = TG3_FLOW_CTRL_TX | TG3_FLOW_CTRL_RX;
1730 }
1731 } else if (lcladv & ADVERTISE_PAUSE_ASYM) {
1732 if ((rmtadv & LPA_PAUSE_CAP) && (rmtadv & LPA_PAUSE_ASYM))
1733 cap = TG3_FLOW_CTRL_TX;
1734 }
1735
1736 return cap;
1737}
1738
1739static u8 tg3_resolve_flowctrl_1000X(u16 lcladv, u16 rmtadv)
1740{
1741 u8 cap = 0;
1742
1743 if (lcladv & ADVERTISE_1000XPAUSE) {
1744 if (lcladv & ADVERTISE_1000XPSE_ASYM) {
1745 if (rmtadv & LPA_1000XPAUSE)
1746 cap = TG3_FLOW_CTRL_TX | TG3_FLOW_CTRL_RX;
1747 else if (rmtadv & LPA_1000XPAUSE_ASYM)
1748 cap = TG3_FLOW_CTRL_RX;
1749 } else {
1750 if (rmtadv & LPA_1000XPAUSE)
1751 cap = TG3_FLOW_CTRL_TX | TG3_FLOW_CTRL_RX;
1752 }
1753 } else if (lcladv & ADVERTISE_1000XPSE_ASYM) {
1754 if ((rmtadv & LPA_1000XPAUSE) && (rmtadv & LPA_1000XPAUSE_ASYM))
1755 cap = TG3_FLOW_CTRL_TX;
1756 }
1757
1758 return cap;
1759}
1760
1da177e4
LT
1761static void tg3_setup_flow_control(struct tg3 *tp, u32 local_adv, u32 remote_adv)
1762{
8d018621 1763 u8 new_tg3_flags = 0;
1da177e4
LT
1764 u32 old_rx_mode = tp->rx_mode;
1765 u32 old_tx_mode = tp->tx_mode;
1766
ef167e27
MC
1767 if (tp->link_config.autoneg == AUTONEG_ENABLE &&
1768 (tp->tg3_flags & TG3_FLAG_PAUSE_AUTONEG)) {
5be73b47 1769 if (tp->tg3_flags2 & TG3_FLG2_ANY_SERDES)
95937268
MC
1770 new_tg3_flags = tg3_resolve_flowctrl_1000X(local_adv,
1771 remote_adv);
1772 else
1773 new_tg3_flags = tg3_resolve_flowctrl_1000T(local_adv,
1774 remote_adv);
1da177e4 1775 } else {
8d018621 1776 new_tg3_flags = tp->link_config.flowctrl;
1da177e4
LT
1777 }
1778
8d018621
MC
1779 tp->link_config.active_flowctrl = new_tg3_flags;
1780
1781 if (new_tg3_flags & TG3_FLOW_CTRL_RX)
1da177e4
LT
1782 tp->rx_mode |= RX_MODE_FLOW_CTRL_ENABLE;
1783 else
1784 tp->rx_mode &= ~RX_MODE_FLOW_CTRL_ENABLE;
1785
1786 if (old_rx_mode != tp->rx_mode) {
1787 tw32_f(MAC_RX_MODE, tp->rx_mode);
1788 }
6aa20a22 1789
8d018621 1790 if (new_tg3_flags & TG3_FLOW_CTRL_TX)
1da177e4
LT
1791 tp->tx_mode |= TX_MODE_FLOW_CTRL_ENABLE;
1792 else
1793 tp->tx_mode &= ~TX_MODE_FLOW_CTRL_ENABLE;
1794
1795 if (old_tx_mode != tp->tx_mode) {
1796 tw32_f(MAC_TX_MODE, tp->tx_mode);
1797 }
1798}
1799
1800static void tg3_aux_stat_to_speed_duplex(struct tg3 *tp, u32 val, u16 *speed, u8 *duplex)
1801{
1802 switch (val & MII_TG3_AUX_STAT_SPDMASK) {
1803 case MII_TG3_AUX_STAT_10HALF:
1804 *speed = SPEED_10;
1805 *duplex = DUPLEX_HALF;
1806 break;
1807
1808 case MII_TG3_AUX_STAT_10FULL:
1809 *speed = SPEED_10;
1810 *duplex = DUPLEX_FULL;
1811 break;
1812
1813 case MII_TG3_AUX_STAT_100HALF:
1814 *speed = SPEED_100;
1815 *duplex = DUPLEX_HALF;
1816 break;
1817
1818 case MII_TG3_AUX_STAT_100FULL:
1819 *speed = SPEED_100;
1820 *duplex = DUPLEX_FULL;
1821 break;
1822
1823 case MII_TG3_AUX_STAT_1000HALF:
1824 *speed = SPEED_1000;
1825 *duplex = DUPLEX_HALF;
1826 break;
1827
1828 case MII_TG3_AUX_STAT_1000FULL:
1829 *speed = SPEED_1000;
1830 *duplex = DUPLEX_FULL;
1831 break;
1832
1833 default:
715116a1
MC
1834 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) {
1835 *speed = (val & MII_TG3_AUX_STAT_100) ? SPEED_100 :
1836 SPEED_10;
1837 *duplex = (val & MII_TG3_AUX_STAT_FULL) ? DUPLEX_FULL :
1838 DUPLEX_HALF;
1839 break;
1840 }
1da177e4
LT
1841 *speed = SPEED_INVALID;
1842 *duplex = DUPLEX_INVALID;
1843 break;
1844 };
1845}
1846
1847static void tg3_phy_copper_begin(struct tg3 *tp)
1848{
1849 u32 new_adv;
1850 int i;
1851
1852 if (tp->link_config.phy_is_low_power) {
1853 /* Entering low power mode. Disable gigabit and
1854 * 100baseT advertisements.
1855 */
1856 tg3_writephy(tp, MII_TG3_CTRL, 0);
1857
1858 new_adv = (ADVERTISE_10HALF | ADVERTISE_10FULL |
1859 ADVERTISE_CSMA | ADVERTISE_PAUSE_CAP);
1860 if (tp->tg3_flags & TG3_FLAG_WOL_SPEED_100MB)
1861 new_adv |= (ADVERTISE_100HALF | ADVERTISE_100FULL);
1862
1863 tg3_writephy(tp, MII_ADVERTISE, new_adv);
1864 } else if (tp->link_config.speed == SPEED_INVALID) {
1da177e4
LT
1865 if (tp->tg3_flags & TG3_FLAG_10_100_ONLY)
1866 tp->link_config.advertising &=
1867 ~(ADVERTISED_1000baseT_Half |
1868 ADVERTISED_1000baseT_Full);
1869
ba4d07a8 1870 new_adv = ADVERTISE_CSMA;
1da177e4
LT
1871 if (tp->link_config.advertising & ADVERTISED_10baseT_Half)
1872 new_adv |= ADVERTISE_10HALF;
1873 if (tp->link_config.advertising & ADVERTISED_10baseT_Full)
1874 new_adv |= ADVERTISE_10FULL;
1875 if (tp->link_config.advertising & ADVERTISED_100baseT_Half)
1876 new_adv |= ADVERTISE_100HALF;
1877 if (tp->link_config.advertising & ADVERTISED_100baseT_Full)
1878 new_adv |= ADVERTISE_100FULL;
ba4d07a8
MC
1879
1880 new_adv |= tg3_advert_flowctrl_1000T(tp->link_config.flowctrl);
1881
1da177e4
LT
1882 tg3_writephy(tp, MII_ADVERTISE, new_adv);
1883
1884 if (tp->link_config.advertising &
1885 (ADVERTISED_1000baseT_Half | ADVERTISED_1000baseT_Full)) {
1886 new_adv = 0;
1887 if (tp->link_config.advertising & ADVERTISED_1000baseT_Half)
1888 new_adv |= MII_TG3_CTRL_ADV_1000_HALF;
1889 if (tp->link_config.advertising & ADVERTISED_1000baseT_Full)
1890 new_adv |= MII_TG3_CTRL_ADV_1000_FULL;
1891 if (!(tp->tg3_flags & TG3_FLAG_10_100_ONLY) &&
1892 (tp->pci_chip_rev_id == CHIPREV_ID_5701_A0 ||
1893 tp->pci_chip_rev_id == CHIPREV_ID_5701_B0))
1894 new_adv |= (MII_TG3_CTRL_AS_MASTER |
1895 MII_TG3_CTRL_ENABLE_AS_MASTER);
1896 tg3_writephy(tp, MII_TG3_CTRL, new_adv);
1897 } else {
1898 tg3_writephy(tp, MII_TG3_CTRL, 0);
1899 }
1900 } else {
ba4d07a8
MC
1901 new_adv = tg3_advert_flowctrl_1000T(tp->link_config.flowctrl);
1902 new_adv |= ADVERTISE_CSMA;
1903
1da177e4
LT
1904 /* Asking for a specific link mode. */
1905 if (tp->link_config.speed == SPEED_1000) {
1da177e4
LT
1906 tg3_writephy(tp, MII_ADVERTISE, new_adv);
1907
1908 if (tp->link_config.duplex == DUPLEX_FULL)
1909 new_adv = MII_TG3_CTRL_ADV_1000_FULL;
1910 else
1911 new_adv = MII_TG3_CTRL_ADV_1000_HALF;
1912 if (tp->pci_chip_rev_id == CHIPREV_ID_5701_A0 ||
1913 tp->pci_chip_rev_id == CHIPREV_ID_5701_B0)
1914 new_adv |= (MII_TG3_CTRL_AS_MASTER |
1915 MII_TG3_CTRL_ENABLE_AS_MASTER);
1da177e4 1916 } else {
1da177e4
LT
1917 if (tp->link_config.speed == SPEED_100) {
1918 if (tp->link_config.duplex == DUPLEX_FULL)
1919 new_adv |= ADVERTISE_100FULL;
1920 else
1921 new_adv |= ADVERTISE_100HALF;
1922 } else {
1923 if (tp->link_config.duplex == DUPLEX_FULL)
1924 new_adv |= ADVERTISE_10FULL;
1925 else
1926 new_adv |= ADVERTISE_10HALF;
1927 }
1928 tg3_writephy(tp, MII_ADVERTISE, new_adv);
ba4d07a8
MC
1929
1930 new_adv = 0;
1da177e4 1931 }
ba4d07a8
MC
1932
1933 tg3_writephy(tp, MII_TG3_CTRL, new_adv);
1da177e4
LT
1934 }
1935
1936 if (tp->link_config.autoneg == AUTONEG_DISABLE &&
1937 tp->link_config.speed != SPEED_INVALID) {
1938 u32 bmcr, orig_bmcr;
1939
1940 tp->link_config.active_speed = tp->link_config.speed;
1941 tp->link_config.active_duplex = tp->link_config.duplex;
1942
1943 bmcr = 0;
1944 switch (tp->link_config.speed) {
1945 default:
1946 case SPEED_10:
1947 break;
1948
1949 case SPEED_100:
1950 bmcr |= BMCR_SPEED100;
1951 break;
1952
1953 case SPEED_1000:
1954 bmcr |= TG3_BMCR_SPEED1000;
1955 break;
1956 };
1957
1958 if (tp->link_config.duplex == DUPLEX_FULL)
1959 bmcr |= BMCR_FULLDPLX;
1960
1961 if (!tg3_readphy(tp, MII_BMCR, &orig_bmcr) &&
1962 (bmcr != orig_bmcr)) {
1963 tg3_writephy(tp, MII_BMCR, BMCR_LOOPBACK);
1964 for (i = 0; i < 1500; i++) {
1965 u32 tmp;
1966
1967 udelay(10);
1968 if (tg3_readphy(tp, MII_BMSR, &tmp) ||
1969 tg3_readphy(tp, MII_BMSR, &tmp))
1970 continue;
1971 if (!(tmp & BMSR_LSTATUS)) {
1972 udelay(40);
1973 break;
1974 }
1975 }
1976 tg3_writephy(tp, MII_BMCR, bmcr);
1977 udelay(40);
1978 }
1979 } else {
1980 tg3_writephy(tp, MII_BMCR,
1981 BMCR_ANENABLE | BMCR_ANRESTART);
1982 }
1983}
1984
1985static int tg3_init_5401phy_dsp(struct tg3 *tp)
1986{
1987 int err;
1988
1989 /* Turn off tap power management. */
1990 /* Set Extended packet length bit */
1991 err = tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x4c20);
1992
1993 err |= tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x0012);
1994 err |= tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x1804);
1995
1996 err |= tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x0013);
1997 err |= tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x1204);
1998
1999 err |= tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x8006);
2000 err |= tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x0132);
2001
2002 err |= tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x8006);
2003 err |= tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x0232);
2004
2005 err |= tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x201f);
2006 err |= tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x0a20);
2007
2008 udelay(40);
2009
2010 return err;
2011}
2012
3600d918 2013static int tg3_copper_is_advertising_all(struct tg3 *tp, u32 mask)
1da177e4 2014{
3600d918
MC
2015 u32 adv_reg, all_mask = 0;
2016
2017 if (mask & ADVERTISED_10baseT_Half)
2018 all_mask |= ADVERTISE_10HALF;
2019 if (mask & ADVERTISED_10baseT_Full)
2020 all_mask |= ADVERTISE_10FULL;
2021 if (mask & ADVERTISED_100baseT_Half)
2022 all_mask |= ADVERTISE_100HALF;
2023 if (mask & ADVERTISED_100baseT_Full)
2024 all_mask |= ADVERTISE_100FULL;
1da177e4
LT
2025
2026 if (tg3_readphy(tp, MII_ADVERTISE, &adv_reg))
2027 return 0;
2028
1da177e4
LT
2029 if ((adv_reg & all_mask) != all_mask)
2030 return 0;
2031 if (!(tp->tg3_flags & TG3_FLAG_10_100_ONLY)) {
2032 u32 tg3_ctrl;
2033
3600d918
MC
2034 all_mask = 0;
2035 if (mask & ADVERTISED_1000baseT_Half)
2036 all_mask |= ADVERTISE_1000HALF;
2037 if (mask & ADVERTISED_1000baseT_Full)
2038 all_mask |= ADVERTISE_1000FULL;
2039
1da177e4
LT
2040 if (tg3_readphy(tp, MII_TG3_CTRL, &tg3_ctrl))
2041 return 0;
2042
1da177e4
LT
2043 if ((tg3_ctrl & all_mask) != all_mask)
2044 return 0;
2045 }
2046 return 1;
2047}
2048
ef167e27
MC
2049static int tg3_adv_1000T_flowctrl_ok(struct tg3 *tp, u32 *lcladv, u32 *rmtadv)
2050{
2051 u32 curadv, reqadv;
2052
2053 if (tg3_readphy(tp, MII_ADVERTISE, lcladv))
2054 return 1;
2055
2056 curadv = *lcladv & (ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM);
2057 reqadv = tg3_advert_flowctrl_1000T(tp->link_config.flowctrl);
2058
2059 if (tp->link_config.active_duplex == DUPLEX_FULL) {
2060 if (curadv != reqadv)
2061 return 0;
2062
2063 if (tp->tg3_flags & TG3_FLAG_PAUSE_AUTONEG)
2064 tg3_readphy(tp, MII_LPA, rmtadv);
2065 } else {
2066 /* Reprogram the advertisement register, even if it
2067 * does not affect the current link. If the link
2068 * gets renegotiated in the future, we can save an
2069 * additional renegotiation cycle by advertising
2070 * it correctly in the first place.
2071 */
2072 if (curadv != reqadv) {
2073 *lcladv &= ~(ADVERTISE_PAUSE_CAP |
2074 ADVERTISE_PAUSE_ASYM);
2075 tg3_writephy(tp, MII_ADVERTISE, *lcladv | reqadv);
2076 }
2077 }
2078
2079 return 1;
2080}
2081
1da177e4
LT
2082static int tg3_setup_copper_phy(struct tg3 *tp, int force_reset)
2083{
2084 int current_link_up;
2085 u32 bmsr, dummy;
ef167e27 2086 u32 lcl_adv, rmt_adv;
1da177e4
LT
2087 u16 current_speed;
2088 u8 current_duplex;
2089 int i, err;
2090
2091 tw32(MAC_EVENT, 0);
2092
2093 tw32_f(MAC_STATUS,
2094 (MAC_STATUS_SYNC_CHANGED |
2095 MAC_STATUS_CFG_CHANGED |
2096 MAC_STATUS_MI_COMPLETION |
2097 MAC_STATUS_LNKSTATE_CHANGED));
2098 udelay(40);
2099
2100 tp->mi_mode = MAC_MI_MODE_BASE;
2101 tw32_f(MAC_MI_MODE, tp->mi_mode);
2102 udelay(80);
2103
2104 tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x02);
2105
2106 /* Some third-party PHYs need to be reset on link going
2107 * down.
2108 */
2109 if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703 ||
2110 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704 ||
2111 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) &&
2112 netif_carrier_ok(tp->dev)) {
2113 tg3_readphy(tp, MII_BMSR, &bmsr);
2114 if (!tg3_readphy(tp, MII_BMSR, &bmsr) &&
2115 !(bmsr & BMSR_LSTATUS))
2116 force_reset = 1;
2117 }
2118 if (force_reset)
2119 tg3_phy_reset(tp);
2120
2121 if ((tp->phy_id & PHY_ID_MASK) == PHY_ID_BCM5401) {
2122 tg3_readphy(tp, MII_BMSR, &bmsr);
2123 if (tg3_readphy(tp, MII_BMSR, &bmsr) ||
2124 !(tp->tg3_flags & TG3_FLAG_INIT_COMPLETE))
2125 bmsr = 0;
2126
2127 if (!(bmsr & BMSR_LSTATUS)) {
2128 err = tg3_init_5401phy_dsp(tp);
2129 if (err)
2130 return err;
2131
2132 tg3_readphy(tp, MII_BMSR, &bmsr);
2133 for (i = 0; i < 1000; i++) {
2134 udelay(10);
2135 if (!tg3_readphy(tp, MII_BMSR, &bmsr) &&
2136 (bmsr & BMSR_LSTATUS)) {
2137 udelay(40);
2138 break;
2139 }
2140 }
2141
2142 if ((tp->phy_id & PHY_ID_REV_MASK) == PHY_REV_BCM5401_B0 &&
2143 !(bmsr & BMSR_LSTATUS) &&
2144 tp->link_config.active_speed == SPEED_1000) {
2145 err = tg3_phy_reset(tp);
2146 if (!err)
2147 err = tg3_init_5401phy_dsp(tp);
2148 if (err)
2149 return err;
2150 }
2151 }
2152 } else if (tp->pci_chip_rev_id == CHIPREV_ID_5701_A0 ||
2153 tp->pci_chip_rev_id == CHIPREV_ID_5701_B0) {
2154 /* 5701 {A0,B0} CRC bug workaround */
2155 tg3_writephy(tp, 0x15, 0x0a75);
2156 tg3_writephy(tp, 0x1c, 0x8c68);
2157 tg3_writephy(tp, 0x1c, 0x8d68);
2158 tg3_writephy(tp, 0x1c, 0x8c68);
2159 }
2160
2161 /* Clear pending interrupts... */
2162 tg3_readphy(tp, MII_TG3_ISTAT, &dummy);
2163 tg3_readphy(tp, MII_TG3_ISTAT, &dummy);
2164
2165 if (tp->tg3_flags & TG3_FLAG_USE_MI_INTERRUPT)
2166 tg3_writephy(tp, MII_TG3_IMASK, ~MII_TG3_INT_LINKCHG);
715116a1 2167 else if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5906)
1da177e4
LT
2168 tg3_writephy(tp, MII_TG3_IMASK, ~0);
2169
2170 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 ||
2171 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701) {
2172 if (tp->led_ctrl == LED_CTRL_MODE_PHY_1)
2173 tg3_writephy(tp, MII_TG3_EXT_CTRL,
2174 MII_TG3_EXT_CTRL_LNK3_LED_MODE);
2175 else
2176 tg3_writephy(tp, MII_TG3_EXT_CTRL, 0);
2177 }
2178
2179 current_link_up = 0;
2180 current_speed = SPEED_INVALID;
2181 current_duplex = DUPLEX_INVALID;
2182
2183 if (tp->tg3_flags2 & TG3_FLG2_CAPACITIVE_COUPLING) {
2184 u32 val;
2185
2186 tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x4007);
2187 tg3_readphy(tp, MII_TG3_AUX_CTRL, &val);
2188 if (!(val & (1 << 10))) {
2189 val |= (1 << 10);
2190 tg3_writephy(tp, MII_TG3_AUX_CTRL, val);
2191 goto relink;
2192 }
2193 }
2194
2195 bmsr = 0;
2196 for (i = 0; i < 100; i++) {
2197 tg3_readphy(tp, MII_BMSR, &bmsr);
2198 if (!tg3_readphy(tp, MII_BMSR, &bmsr) &&
2199 (bmsr & BMSR_LSTATUS))
2200 break;
2201 udelay(40);
2202 }
2203
2204 if (bmsr & BMSR_LSTATUS) {
2205 u32 aux_stat, bmcr;
2206
2207 tg3_readphy(tp, MII_TG3_AUX_STAT, &aux_stat);
2208 for (i = 0; i < 2000; i++) {
2209 udelay(10);
2210 if (!tg3_readphy(tp, MII_TG3_AUX_STAT, &aux_stat) &&
2211 aux_stat)
2212 break;
2213 }
2214
2215 tg3_aux_stat_to_speed_duplex(tp, aux_stat,
2216 &current_speed,
2217 &current_duplex);
2218
2219 bmcr = 0;
2220 for (i = 0; i < 200; i++) {
2221 tg3_readphy(tp, MII_BMCR, &bmcr);
2222 if (tg3_readphy(tp, MII_BMCR, &bmcr))
2223 continue;
2224 if (bmcr && bmcr != 0x7fff)
2225 break;
2226 udelay(10);
2227 }
2228
ef167e27
MC
2229 lcl_adv = 0;
2230 rmt_adv = 0;
1da177e4 2231
ef167e27
MC
2232 tp->link_config.active_speed = current_speed;
2233 tp->link_config.active_duplex = current_duplex;
2234
2235 if (tp->link_config.autoneg == AUTONEG_ENABLE) {
2236 if ((bmcr & BMCR_ANENABLE) &&
2237 tg3_copper_is_advertising_all(tp,
2238 tp->link_config.advertising)) {
2239 if (tg3_adv_1000T_flowctrl_ok(tp, &lcl_adv,
2240 &rmt_adv))
2241 current_link_up = 1;
1da177e4
LT
2242 }
2243 } else {
2244 if (!(bmcr & BMCR_ANENABLE) &&
2245 tp->link_config.speed == current_speed &&
ef167e27
MC
2246 tp->link_config.duplex == current_duplex &&
2247 tp->link_config.flowctrl ==
2248 tp->link_config.active_flowctrl) {
1da177e4 2249 current_link_up = 1;
1da177e4
LT
2250 }
2251 }
2252
ef167e27
MC
2253 if (current_link_up == 1 &&
2254 tp->link_config.active_duplex == DUPLEX_FULL)
2255 tg3_setup_flow_control(tp, lcl_adv, rmt_adv);
1da177e4
LT
2256 }
2257
1da177e4 2258relink:
6921d201 2259 if (current_link_up == 0 || tp->link_config.phy_is_low_power) {
1da177e4
LT
2260 u32 tmp;
2261
2262 tg3_phy_copper_begin(tp);
2263
2264 tg3_readphy(tp, MII_BMSR, &tmp);
2265 if (!tg3_readphy(tp, MII_BMSR, &tmp) &&
2266 (tmp & BMSR_LSTATUS))
2267 current_link_up = 1;
2268 }
2269
2270 tp->mac_mode &= ~MAC_MODE_PORT_MODE_MASK;
2271 if (current_link_up == 1) {
2272 if (tp->link_config.active_speed == SPEED_100 ||
2273 tp->link_config.active_speed == SPEED_10)
2274 tp->mac_mode |= MAC_MODE_PORT_MODE_MII;
2275 else
2276 tp->mac_mode |= MAC_MODE_PORT_MODE_GMII;
2277 } else
2278 tp->mac_mode |= MAC_MODE_PORT_MODE_GMII;
2279
2280 tp->mac_mode &= ~MAC_MODE_HALF_DUPLEX;
2281 if (tp->link_config.active_duplex == DUPLEX_HALF)
2282 tp->mac_mode |= MAC_MODE_HALF_DUPLEX;
2283
1da177e4 2284 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700) {
e8f3f6ca
MC
2285 if (current_link_up == 1 &&
2286 tg3_5700_link_polarity(tp, tp->link_config.active_speed))
1da177e4 2287 tp->mac_mode |= MAC_MODE_LINK_POLARITY;
e8f3f6ca
MC
2288 else
2289 tp->mac_mode &= ~MAC_MODE_LINK_POLARITY;
1da177e4
LT
2290 }
2291
2292 /* ??? Without this setting Netgear GA302T PHY does not
2293 * ??? send/receive packets...
2294 */
2295 if ((tp->phy_id & PHY_ID_MASK) == PHY_ID_BCM5411 &&
2296 tp->pci_chip_rev_id == CHIPREV_ID_5700_ALTIMA) {
2297 tp->mi_mode |= MAC_MI_MODE_AUTO_POLL;
2298 tw32_f(MAC_MI_MODE, tp->mi_mode);
2299 udelay(80);
2300 }
2301
2302 tw32_f(MAC_MODE, tp->mac_mode);
2303 udelay(40);
2304
2305 if (tp->tg3_flags & TG3_FLAG_USE_LINKCHG_REG) {
2306 /* Polled via timer. */
2307 tw32_f(MAC_EVENT, 0);
2308 } else {
2309 tw32_f(MAC_EVENT, MAC_EVENT_LNKSTATE_CHANGED);
2310 }
2311 udelay(40);
2312
2313 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 &&
2314 current_link_up == 1 &&
2315 tp->link_config.active_speed == SPEED_1000 &&
2316 ((tp->tg3_flags & TG3_FLAG_PCIX_MODE) ||
2317 (tp->tg3_flags & TG3_FLAG_PCI_HIGH_SPEED))) {
2318 udelay(120);
2319 tw32_f(MAC_STATUS,
2320 (MAC_STATUS_SYNC_CHANGED |
2321 MAC_STATUS_CFG_CHANGED));
2322 udelay(40);
2323 tg3_write_mem(tp,
2324 NIC_SRAM_FIRMWARE_MBOX,
2325 NIC_SRAM_FIRMWARE_MBOX_MAGIC2);
2326 }
2327
2328 if (current_link_up != netif_carrier_ok(tp->dev)) {
2329 if (current_link_up)
2330 netif_carrier_on(tp->dev);
2331 else
2332 netif_carrier_off(tp->dev);
2333 tg3_link_report(tp);
2334 }
2335
2336 return 0;
2337}
2338
2339struct tg3_fiber_aneginfo {
2340 int state;
2341#define ANEG_STATE_UNKNOWN 0
2342#define ANEG_STATE_AN_ENABLE 1
2343#define ANEG_STATE_RESTART_INIT 2
2344#define ANEG_STATE_RESTART 3
2345#define ANEG_STATE_DISABLE_LINK_OK 4
2346#define ANEG_STATE_ABILITY_DETECT_INIT 5
2347#define ANEG_STATE_ABILITY_DETECT 6
2348#define ANEG_STATE_ACK_DETECT_INIT 7
2349#define ANEG_STATE_ACK_DETECT 8
2350#define ANEG_STATE_COMPLETE_ACK_INIT 9
2351#define ANEG_STATE_COMPLETE_ACK 10
2352#define ANEG_STATE_IDLE_DETECT_INIT 11
2353#define ANEG_STATE_IDLE_DETECT 12
2354#define ANEG_STATE_LINK_OK 13
2355#define ANEG_STATE_NEXT_PAGE_WAIT_INIT 14
2356#define ANEG_STATE_NEXT_PAGE_WAIT 15
2357
2358 u32 flags;
2359#define MR_AN_ENABLE 0x00000001
2360#define MR_RESTART_AN 0x00000002
2361#define MR_AN_COMPLETE 0x00000004
2362#define MR_PAGE_RX 0x00000008
2363#define MR_NP_LOADED 0x00000010
2364#define MR_TOGGLE_TX 0x00000020
2365#define MR_LP_ADV_FULL_DUPLEX 0x00000040
2366#define MR_LP_ADV_HALF_DUPLEX 0x00000080
2367#define MR_LP_ADV_SYM_PAUSE 0x00000100
2368#define MR_LP_ADV_ASYM_PAUSE 0x00000200
2369#define MR_LP_ADV_REMOTE_FAULT1 0x00000400
2370#define MR_LP_ADV_REMOTE_FAULT2 0x00000800
2371#define MR_LP_ADV_NEXT_PAGE 0x00001000
2372#define MR_TOGGLE_RX 0x00002000
2373#define MR_NP_RX 0x00004000
2374
2375#define MR_LINK_OK 0x80000000
2376
2377 unsigned long link_time, cur_time;
2378
2379 u32 ability_match_cfg;
2380 int ability_match_count;
2381
2382 char ability_match, idle_match, ack_match;
2383
2384 u32 txconfig, rxconfig;
2385#define ANEG_CFG_NP 0x00000080
2386#define ANEG_CFG_ACK 0x00000040
2387#define ANEG_CFG_RF2 0x00000020
2388#define ANEG_CFG_RF1 0x00000010
2389#define ANEG_CFG_PS2 0x00000001
2390#define ANEG_CFG_PS1 0x00008000
2391#define ANEG_CFG_HD 0x00004000
2392#define ANEG_CFG_FD 0x00002000
2393#define ANEG_CFG_INVAL 0x00001f06
2394
2395};
2396#define ANEG_OK 0
2397#define ANEG_DONE 1
2398#define ANEG_TIMER_ENAB 2
2399#define ANEG_FAILED -1
2400
2401#define ANEG_STATE_SETTLE_TIME 10000
2402
2403static int tg3_fiber_aneg_smachine(struct tg3 *tp,
2404 struct tg3_fiber_aneginfo *ap)
2405{
5be73b47 2406 u16 flowctrl;
1da177e4
LT
2407 unsigned long delta;
2408 u32 rx_cfg_reg;
2409 int ret;
2410
2411 if (ap->state == ANEG_STATE_UNKNOWN) {
2412 ap->rxconfig = 0;
2413 ap->link_time = 0;
2414 ap->cur_time = 0;
2415 ap->ability_match_cfg = 0;
2416 ap->ability_match_count = 0;
2417 ap->ability_match = 0;
2418 ap->idle_match = 0;
2419 ap->ack_match = 0;
2420 }
2421 ap->cur_time++;
2422
2423 if (tr32(MAC_STATUS) & MAC_STATUS_RCVD_CFG) {
2424 rx_cfg_reg = tr32(MAC_RX_AUTO_NEG);
2425
2426 if (rx_cfg_reg != ap->ability_match_cfg) {
2427 ap->ability_match_cfg = rx_cfg_reg;
2428 ap->ability_match = 0;
2429 ap->ability_match_count = 0;
2430 } else {
2431 if (++ap->ability_match_count > 1) {
2432 ap->ability_match = 1;
2433 ap->ability_match_cfg = rx_cfg_reg;
2434 }
2435 }
2436 if (rx_cfg_reg & ANEG_CFG_ACK)
2437 ap->ack_match = 1;
2438 else
2439 ap->ack_match = 0;
2440
2441 ap->idle_match = 0;
2442 } else {
2443 ap->idle_match = 1;
2444 ap->ability_match_cfg = 0;
2445 ap->ability_match_count = 0;
2446 ap->ability_match = 0;
2447 ap->ack_match = 0;
2448
2449 rx_cfg_reg = 0;
2450 }
2451
2452 ap->rxconfig = rx_cfg_reg;
2453 ret = ANEG_OK;
2454
2455 switch(ap->state) {
2456 case ANEG_STATE_UNKNOWN:
2457 if (ap->flags & (MR_AN_ENABLE | MR_RESTART_AN))
2458 ap->state = ANEG_STATE_AN_ENABLE;
2459
2460 /* fallthru */
2461 case ANEG_STATE_AN_ENABLE:
2462 ap->flags &= ~(MR_AN_COMPLETE | MR_PAGE_RX);
2463 if (ap->flags & MR_AN_ENABLE) {
2464 ap->link_time = 0;
2465 ap->cur_time = 0;
2466 ap->ability_match_cfg = 0;
2467 ap->ability_match_count = 0;
2468 ap->ability_match = 0;
2469 ap->idle_match = 0;
2470 ap->ack_match = 0;
2471
2472 ap->state = ANEG_STATE_RESTART_INIT;
2473 } else {
2474 ap->state = ANEG_STATE_DISABLE_LINK_OK;
2475 }
2476 break;
2477
2478 case ANEG_STATE_RESTART_INIT:
2479 ap->link_time = ap->cur_time;
2480 ap->flags &= ~(MR_NP_LOADED);
2481 ap->txconfig = 0;
2482 tw32(MAC_TX_AUTO_NEG, 0);
2483 tp->mac_mode |= MAC_MODE_SEND_CONFIGS;
2484 tw32_f(MAC_MODE, tp->mac_mode);
2485 udelay(40);
2486
2487 ret = ANEG_TIMER_ENAB;
2488 ap->state = ANEG_STATE_RESTART;
2489
2490 /* fallthru */
2491 case ANEG_STATE_RESTART:
2492 delta = ap->cur_time - ap->link_time;
2493 if (delta > ANEG_STATE_SETTLE_TIME) {
2494 ap->state = ANEG_STATE_ABILITY_DETECT_INIT;
2495 } else {
2496 ret = ANEG_TIMER_ENAB;
2497 }
2498 break;
2499
2500 case ANEG_STATE_DISABLE_LINK_OK:
2501 ret = ANEG_DONE;
2502 break;
2503
2504 case ANEG_STATE_ABILITY_DETECT_INIT:
2505 ap->flags &= ~(MR_TOGGLE_TX);
5be73b47
MC
2506 ap->txconfig = ANEG_CFG_FD;
2507 flowctrl = tg3_advert_flowctrl_1000X(tp->link_config.flowctrl);
2508 if (flowctrl & ADVERTISE_1000XPAUSE)
2509 ap->txconfig |= ANEG_CFG_PS1;
2510 if (flowctrl & ADVERTISE_1000XPSE_ASYM)
2511 ap->txconfig |= ANEG_CFG_PS2;
1da177e4
LT
2512 tw32(MAC_TX_AUTO_NEG, ap->txconfig);
2513 tp->mac_mode |= MAC_MODE_SEND_CONFIGS;
2514 tw32_f(MAC_MODE, tp->mac_mode);
2515 udelay(40);
2516
2517 ap->state = ANEG_STATE_ABILITY_DETECT;
2518 break;
2519
2520 case ANEG_STATE_ABILITY_DETECT:
2521 if (ap->ability_match != 0 && ap->rxconfig != 0) {
2522 ap->state = ANEG_STATE_ACK_DETECT_INIT;
2523 }
2524 break;
2525
2526 case ANEG_STATE_ACK_DETECT_INIT:
2527 ap->txconfig |= ANEG_CFG_ACK;
2528 tw32(MAC_TX_AUTO_NEG, ap->txconfig);
2529 tp->mac_mode |= MAC_MODE_SEND_CONFIGS;
2530 tw32_f(MAC_MODE, tp->mac_mode);
2531 udelay(40);
2532
2533 ap->state = ANEG_STATE_ACK_DETECT;
2534
2535 /* fallthru */
2536 case ANEG_STATE_ACK_DETECT:
2537 if (ap->ack_match != 0) {
2538 if ((ap->rxconfig & ~ANEG_CFG_ACK) ==
2539 (ap->ability_match_cfg & ~ANEG_CFG_ACK)) {
2540 ap->state = ANEG_STATE_COMPLETE_ACK_INIT;
2541 } else {
2542 ap->state = ANEG_STATE_AN_ENABLE;
2543 }
2544 } else if (ap->ability_match != 0 &&
2545 ap->rxconfig == 0) {
2546 ap->state = ANEG_STATE_AN_ENABLE;
2547 }
2548 break;
2549
2550 case ANEG_STATE_COMPLETE_ACK_INIT:
2551 if (ap->rxconfig & ANEG_CFG_INVAL) {
2552 ret = ANEG_FAILED;
2553 break;
2554 }
2555 ap->flags &= ~(MR_LP_ADV_FULL_DUPLEX |
2556 MR_LP_ADV_HALF_DUPLEX |
2557 MR_LP_ADV_SYM_PAUSE |
2558 MR_LP_ADV_ASYM_PAUSE |
2559 MR_LP_ADV_REMOTE_FAULT1 |
2560 MR_LP_ADV_REMOTE_FAULT2 |
2561 MR_LP_ADV_NEXT_PAGE |
2562 MR_TOGGLE_RX |
2563 MR_NP_RX);
2564 if (ap->rxconfig & ANEG_CFG_FD)
2565 ap->flags |= MR_LP_ADV_FULL_DUPLEX;
2566 if (ap->rxconfig & ANEG_CFG_HD)
2567 ap->flags |= MR_LP_ADV_HALF_DUPLEX;
2568 if (ap->rxconfig & ANEG_CFG_PS1)
2569 ap->flags |= MR_LP_ADV_SYM_PAUSE;
2570 if (ap->rxconfig & ANEG_CFG_PS2)
2571 ap->flags |= MR_LP_ADV_ASYM_PAUSE;
2572 if (ap->rxconfig & ANEG_CFG_RF1)
2573 ap->flags |= MR_LP_ADV_REMOTE_FAULT1;
2574 if (ap->rxconfig & ANEG_CFG_RF2)
2575 ap->flags |= MR_LP_ADV_REMOTE_FAULT2;
2576 if (ap->rxconfig & ANEG_CFG_NP)
2577 ap->flags |= MR_LP_ADV_NEXT_PAGE;
2578
2579 ap->link_time = ap->cur_time;
2580
2581 ap->flags ^= (MR_TOGGLE_TX);
2582 if (ap->rxconfig & 0x0008)
2583 ap->flags |= MR_TOGGLE_RX;
2584 if (ap->rxconfig & ANEG_CFG_NP)
2585 ap->flags |= MR_NP_RX;
2586 ap->flags |= MR_PAGE_RX;
2587
2588 ap->state = ANEG_STATE_COMPLETE_ACK;
2589 ret = ANEG_TIMER_ENAB;
2590 break;
2591
2592 case ANEG_STATE_COMPLETE_ACK:
2593 if (ap->ability_match != 0 &&
2594 ap->rxconfig == 0) {
2595 ap->state = ANEG_STATE_AN_ENABLE;
2596 break;
2597 }
2598 delta = ap->cur_time - ap->link_time;
2599 if (delta > ANEG_STATE_SETTLE_TIME) {
2600 if (!(ap->flags & (MR_LP_ADV_NEXT_PAGE))) {
2601 ap->state = ANEG_STATE_IDLE_DETECT_INIT;
2602 } else {
2603 if ((ap->txconfig & ANEG_CFG_NP) == 0 &&
2604 !(ap->flags & MR_NP_RX)) {
2605 ap->state = ANEG_STATE_IDLE_DETECT_INIT;
2606 } else {
2607 ret = ANEG_FAILED;
2608 }
2609 }
2610 }
2611 break;
2612
2613 case ANEG_STATE_IDLE_DETECT_INIT:
2614 ap->link_time = ap->cur_time;
2615 tp->mac_mode &= ~MAC_MODE_SEND_CONFIGS;
2616 tw32_f(MAC_MODE, tp->mac_mode);
2617 udelay(40);
2618
2619 ap->state = ANEG_STATE_IDLE_DETECT;
2620 ret = ANEG_TIMER_ENAB;
2621 break;
2622
2623 case ANEG_STATE_IDLE_DETECT:
2624 if (ap->ability_match != 0 &&
2625 ap->rxconfig == 0) {
2626 ap->state = ANEG_STATE_AN_ENABLE;
2627 break;
2628 }
2629 delta = ap->cur_time - ap->link_time;
2630 if (delta > ANEG_STATE_SETTLE_TIME) {
2631 /* XXX another gem from the Broadcom driver :( */
2632 ap->state = ANEG_STATE_LINK_OK;
2633 }
2634 break;
2635
2636 case ANEG_STATE_LINK_OK:
2637 ap->flags |= (MR_AN_COMPLETE | MR_LINK_OK);
2638 ret = ANEG_DONE;
2639 break;
2640
2641 case ANEG_STATE_NEXT_PAGE_WAIT_INIT:
2642 /* ??? unimplemented */
2643 break;
2644
2645 case ANEG_STATE_NEXT_PAGE_WAIT:
2646 /* ??? unimplemented */
2647 break;
2648
2649 default:
2650 ret = ANEG_FAILED;
2651 break;
2652 };
2653
2654 return ret;
2655}
2656
5be73b47 2657static int fiber_autoneg(struct tg3 *tp, u32 *txflags, u32 *rxflags)
1da177e4
LT
2658{
2659 int res = 0;
2660 struct tg3_fiber_aneginfo aninfo;
2661 int status = ANEG_FAILED;
2662 unsigned int tick;
2663 u32 tmp;
2664
2665 tw32_f(MAC_TX_AUTO_NEG, 0);
2666
2667 tmp = tp->mac_mode & ~MAC_MODE_PORT_MODE_MASK;
2668 tw32_f(MAC_MODE, tmp | MAC_MODE_PORT_MODE_GMII);
2669 udelay(40);
2670
2671 tw32_f(MAC_MODE, tp->mac_mode | MAC_MODE_SEND_CONFIGS);
2672 udelay(40);
2673
2674 memset(&aninfo, 0, sizeof(aninfo));
2675 aninfo.flags |= MR_AN_ENABLE;
2676 aninfo.state = ANEG_STATE_UNKNOWN;
2677 aninfo.cur_time = 0;
2678 tick = 0;
2679 while (++tick < 195000) {
2680 status = tg3_fiber_aneg_smachine(tp, &aninfo);
2681 if (status == ANEG_DONE || status == ANEG_FAILED)
2682 break;
2683
2684 udelay(1);
2685 }
2686
2687 tp->mac_mode &= ~MAC_MODE_SEND_CONFIGS;
2688 tw32_f(MAC_MODE, tp->mac_mode);
2689 udelay(40);
2690
5be73b47
MC
2691 *txflags = aninfo.txconfig;
2692 *rxflags = aninfo.flags;
1da177e4
LT
2693
2694 if (status == ANEG_DONE &&
2695 (aninfo.flags & (MR_AN_COMPLETE | MR_LINK_OK |
2696 MR_LP_ADV_FULL_DUPLEX)))
2697 res = 1;
2698
2699 return res;
2700}
2701
2702static void tg3_init_bcm8002(struct tg3 *tp)
2703{
2704 u32 mac_status = tr32(MAC_STATUS);
2705 int i;
2706
2707 /* Reset when initting first time or we have a link. */
2708 if ((tp->tg3_flags & TG3_FLAG_INIT_COMPLETE) &&
2709 !(mac_status & MAC_STATUS_PCS_SYNCED))
2710 return;
2711
2712 /* Set PLL lock range. */
2713 tg3_writephy(tp, 0x16, 0x8007);
2714
2715 /* SW reset */
2716 tg3_writephy(tp, MII_BMCR, BMCR_RESET);
2717
2718 /* Wait for reset to complete. */
2719 /* XXX schedule_timeout() ... */
2720 for (i = 0; i < 500; i++)
2721 udelay(10);
2722
2723 /* Config mode; select PMA/Ch 1 regs. */
2724 tg3_writephy(tp, 0x10, 0x8411);
2725
2726 /* Enable auto-lock and comdet, select txclk for tx. */
2727 tg3_writephy(tp, 0x11, 0x0a10);
2728
2729 tg3_writephy(tp, 0x18, 0x00a0);
2730 tg3_writephy(tp, 0x16, 0x41ff);
2731
2732 /* Assert and deassert POR. */
2733 tg3_writephy(tp, 0x13, 0x0400);
2734 udelay(40);
2735 tg3_writephy(tp, 0x13, 0x0000);
2736
2737 tg3_writephy(tp, 0x11, 0x0a50);
2738 udelay(40);
2739 tg3_writephy(tp, 0x11, 0x0a10);
2740
2741 /* Wait for signal to stabilize */
2742 /* XXX schedule_timeout() ... */
2743 for (i = 0; i < 15000; i++)
2744 udelay(10);
2745
2746 /* Deselect the channel register so we can read the PHYID
2747 * later.
2748 */
2749 tg3_writephy(tp, 0x10, 0x8011);
2750}
2751
2752static int tg3_setup_fiber_hw_autoneg(struct tg3 *tp, u32 mac_status)
2753{
82cd3d11 2754 u16 flowctrl;
1da177e4
LT
2755 u32 sg_dig_ctrl, sg_dig_status;
2756 u32 serdes_cfg, expected_sg_dig_ctrl;
2757 int workaround, port_a;
2758 int current_link_up;
2759
2760 serdes_cfg = 0;
2761 expected_sg_dig_ctrl = 0;
2762 workaround = 0;
2763 port_a = 1;
2764 current_link_up = 0;
2765
2766 if (tp->pci_chip_rev_id != CHIPREV_ID_5704_A0 &&
2767 tp->pci_chip_rev_id != CHIPREV_ID_5704_A1) {
2768 workaround = 1;
2769 if (tr32(TG3PCI_DUAL_MAC_CTRL) & DUAL_MAC_CTRL_ID)
2770 port_a = 0;
2771
2772 /* preserve bits 0-11,13,14 for signal pre-emphasis */
2773 /* preserve bits 20-23 for voltage regulator */
2774 serdes_cfg = tr32(MAC_SERDES_CFG) & 0x00f06fff;
2775 }
2776
2777 sg_dig_ctrl = tr32(SG_DIG_CTRL);
2778
2779 if (tp->link_config.autoneg != AUTONEG_ENABLE) {
c98f6e3b 2780 if (sg_dig_ctrl & SG_DIG_USING_HW_AUTONEG) {
1da177e4
LT
2781 if (workaround) {
2782 u32 val = serdes_cfg;
2783
2784 if (port_a)
2785 val |= 0xc010000;
2786 else
2787 val |= 0x4010000;
2788 tw32_f(MAC_SERDES_CFG, val);
2789 }
c98f6e3b
MC
2790
2791 tw32_f(SG_DIG_CTRL, SG_DIG_COMMON_SETUP);
1da177e4
LT
2792 }
2793 if (mac_status & MAC_STATUS_PCS_SYNCED) {
2794 tg3_setup_flow_control(tp, 0, 0);
2795 current_link_up = 1;
2796 }
2797 goto out;
2798 }
2799
2800 /* Want auto-negotiation. */
c98f6e3b 2801 expected_sg_dig_ctrl = SG_DIG_USING_HW_AUTONEG | SG_DIG_COMMON_SETUP;
1da177e4 2802
82cd3d11
MC
2803 flowctrl = tg3_advert_flowctrl_1000X(tp->link_config.flowctrl);
2804 if (flowctrl & ADVERTISE_1000XPAUSE)
2805 expected_sg_dig_ctrl |= SG_DIG_PAUSE_CAP;
2806 if (flowctrl & ADVERTISE_1000XPSE_ASYM)
2807 expected_sg_dig_ctrl |= SG_DIG_ASYM_PAUSE;
1da177e4
LT
2808
2809 if (sg_dig_ctrl != expected_sg_dig_ctrl) {
3d3ebe74
MC
2810 if ((tp->tg3_flags2 & TG3_FLG2_PARALLEL_DETECT) &&
2811 tp->serdes_counter &&
2812 ((mac_status & (MAC_STATUS_PCS_SYNCED |
2813 MAC_STATUS_RCVD_CFG)) ==
2814 MAC_STATUS_PCS_SYNCED)) {
2815 tp->serdes_counter--;
2816 current_link_up = 1;
2817 goto out;
2818 }
2819restart_autoneg:
1da177e4
LT
2820 if (workaround)
2821 tw32_f(MAC_SERDES_CFG, serdes_cfg | 0xc011000);
c98f6e3b 2822 tw32_f(SG_DIG_CTRL, expected_sg_dig_ctrl | SG_DIG_SOFT_RESET);
1da177e4
LT
2823 udelay(5);
2824 tw32_f(SG_DIG_CTRL, expected_sg_dig_ctrl);
2825
3d3ebe74
MC
2826 tp->serdes_counter = SERDES_AN_TIMEOUT_5704S;
2827 tp->tg3_flags2 &= ~TG3_FLG2_PARALLEL_DETECT;
1da177e4
LT
2828 } else if (mac_status & (MAC_STATUS_PCS_SYNCED |
2829 MAC_STATUS_SIGNAL_DET)) {
3d3ebe74 2830 sg_dig_status = tr32(SG_DIG_STATUS);
1da177e4
LT
2831 mac_status = tr32(MAC_STATUS);
2832
c98f6e3b 2833 if ((sg_dig_status & SG_DIG_AUTONEG_COMPLETE) &&
1da177e4 2834 (mac_status & MAC_STATUS_PCS_SYNCED)) {
82cd3d11
MC
2835 u32 local_adv = 0, remote_adv = 0;
2836
2837 if (sg_dig_ctrl & SG_DIG_PAUSE_CAP)
2838 local_adv |= ADVERTISE_1000XPAUSE;
2839 if (sg_dig_ctrl & SG_DIG_ASYM_PAUSE)
2840 local_adv |= ADVERTISE_1000XPSE_ASYM;
1da177e4 2841
c98f6e3b 2842 if (sg_dig_status & SG_DIG_PARTNER_PAUSE_CAPABLE)
82cd3d11 2843 remote_adv |= LPA_1000XPAUSE;
c98f6e3b 2844 if (sg_dig_status & SG_DIG_PARTNER_ASYM_PAUSE)
82cd3d11 2845 remote_adv |= LPA_1000XPAUSE_ASYM;
1da177e4
LT
2846
2847 tg3_setup_flow_control(tp, local_adv, remote_adv);
2848 current_link_up = 1;
3d3ebe74
MC
2849 tp->serdes_counter = 0;
2850 tp->tg3_flags2 &= ~TG3_FLG2_PARALLEL_DETECT;
c98f6e3b 2851 } else if (!(sg_dig_status & SG_DIG_AUTONEG_COMPLETE)) {
3d3ebe74
MC
2852 if (tp->serdes_counter)
2853 tp->serdes_counter--;
1da177e4
LT
2854 else {
2855 if (workaround) {
2856 u32 val = serdes_cfg;
2857
2858 if (port_a)
2859 val |= 0xc010000;
2860 else
2861 val |= 0x4010000;
2862
2863 tw32_f(MAC_SERDES_CFG, val);
2864 }
2865
c98f6e3b 2866 tw32_f(SG_DIG_CTRL, SG_DIG_COMMON_SETUP);
1da177e4
LT
2867 udelay(40);
2868
2869 /* Link parallel detection - link is up */
2870 /* only if we have PCS_SYNC and not */
2871 /* receiving config code words */
2872 mac_status = tr32(MAC_STATUS);
2873 if ((mac_status & MAC_STATUS_PCS_SYNCED) &&
2874 !(mac_status & MAC_STATUS_RCVD_CFG)) {
2875 tg3_setup_flow_control(tp, 0, 0);
2876 current_link_up = 1;
3d3ebe74
MC
2877 tp->tg3_flags2 |=
2878 TG3_FLG2_PARALLEL_DETECT;
2879 tp->serdes_counter =
2880 SERDES_PARALLEL_DET_TIMEOUT;
2881 } else
2882 goto restart_autoneg;
1da177e4
LT
2883 }
2884 }
3d3ebe74
MC
2885 } else {
2886 tp->serdes_counter = SERDES_AN_TIMEOUT_5704S;
2887 tp->tg3_flags2 &= ~TG3_FLG2_PARALLEL_DETECT;
1da177e4
LT
2888 }
2889
2890out:
2891 return current_link_up;
2892}
2893
2894static int tg3_setup_fiber_by_hand(struct tg3 *tp, u32 mac_status)
2895{
2896 int current_link_up = 0;
2897
5cf64b8a 2898 if (!(mac_status & MAC_STATUS_PCS_SYNCED))
1da177e4 2899 goto out;
1da177e4
LT
2900
2901 if (tp->link_config.autoneg == AUTONEG_ENABLE) {
5be73b47 2902 u32 txflags, rxflags;
1da177e4 2903 int i;
6aa20a22 2904
5be73b47
MC
2905 if (fiber_autoneg(tp, &txflags, &rxflags)) {
2906 u32 local_adv = 0, remote_adv = 0;
1da177e4 2907
5be73b47
MC
2908 if (txflags & ANEG_CFG_PS1)
2909 local_adv |= ADVERTISE_1000XPAUSE;
2910 if (txflags & ANEG_CFG_PS2)
2911 local_adv |= ADVERTISE_1000XPSE_ASYM;
2912
2913 if (rxflags & MR_LP_ADV_SYM_PAUSE)
2914 remote_adv |= LPA_1000XPAUSE;
2915 if (rxflags & MR_LP_ADV_ASYM_PAUSE)
2916 remote_adv |= LPA_1000XPAUSE_ASYM;
1da177e4
LT
2917
2918 tg3_setup_flow_control(tp, local_adv, remote_adv);
2919
1da177e4
LT
2920 current_link_up = 1;
2921 }
2922 for (i = 0; i < 30; i++) {
2923 udelay(20);
2924 tw32_f(MAC_STATUS,
2925 (MAC_STATUS_SYNC_CHANGED |
2926 MAC_STATUS_CFG_CHANGED));
2927 udelay(40);
2928 if ((tr32(MAC_STATUS) &
2929 (MAC_STATUS_SYNC_CHANGED |
2930 MAC_STATUS_CFG_CHANGED)) == 0)
2931 break;
2932 }
2933
2934 mac_status = tr32(MAC_STATUS);
2935 if (current_link_up == 0 &&
2936 (mac_status & MAC_STATUS_PCS_SYNCED) &&
2937 !(mac_status & MAC_STATUS_RCVD_CFG))
2938 current_link_up = 1;
2939 } else {
5be73b47
MC
2940 tg3_setup_flow_control(tp, 0, 0);
2941
1da177e4
LT
2942 /* Forcing 1000FD link up. */
2943 current_link_up = 1;
1da177e4
LT
2944
2945 tw32_f(MAC_MODE, (tp->mac_mode | MAC_MODE_SEND_CONFIGS));
2946 udelay(40);
e8f3f6ca
MC
2947
2948 tw32_f(MAC_MODE, tp->mac_mode);
2949 udelay(40);
1da177e4
LT
2950 }
2951
2952out:
2953 return current_link_up;
2954}
2955
2956static int tg3_setup_fiber_phy(struct tg3 *tp, int force_reset)
2957{
2958 u32 orig_pause_cfg;
2959 u16 orig_active_speed;
2960 u8 orig_active_duplex;
2961 u32 mac_status;
2962 int current_link_up;
2963 int i;
2964
8d018621 2965 orig_pause_cfg = tp->link_config.active_flowctrl;
1da177e4
LT
2966 orig_active_speed = tp->link_config.active_speed;
2967 orig_active_duplex = tp->link_config.active_duplex;
2968
2969 if (!(tp->tg3_flags2 & TG3_FLG2_HW_AUTONEG) &&
2970 netif_carrier_ok(tp->dev) &&
2971 (tp->tg3_flags & TG3_FLAG_INIT_COMPLETE)) {
2972 mac_status = tr32(MAC_STATUS);
2973 mac_status &= (MAC_STATUS_PCS_SYNCED |
2974 MAC_STATUS_SIGNAL_DET |
2975 MAC_STATUS_CFG_CHANGED |
2976 MAC_STATUS_RCVD_CFG);
2977 if (mac_status == (MAC_STATUS_PCS_SYNCED |
2978 MAC_STATUS_SIGNAL_DET)) {
2979 tw32_f(MAC_STATUS, (MAC_STATUS_SYNC_CHANGED |
2980 MAC_STATUS_CFG_CHANGED));
2981 return 0;
2982 }
2983 }
2984
2985 tw32_f(MAC_TX_AUTO_NEG, 0);
2986
2987 tp->mac_mode &= ~(MAC_MODE_PORT_MODE_MASK | MAC_MODE_HALF_DUPLEX);
2988 tp->mac_mode |= MAC_MODE_PORT_MODE_TBI;
2989 tw32_f(MAC_MODE, tp->mac_mode);
2990 udelay(40);
2991
2992 if (tp->phy_id == PHY_ID_BCM8002)
2993 tg3_init_bcm8002(tp);
2994
2995 /* Enable link change event even when serdes polling. */
2996 tw32_f(MAC_EVENT, MAC_EVENT_LNKSTATE_CHANGED);
2997 udelay(40);
2998
2999 current_link_up = 0;
3000 mac_status = tr32(MAC_STATUS);
3001
3002 if (tp->tg3_flags2 & TG3_FLG2_HW_AUTONEG)
3003 current_link_up = tg3_setup_fiber_hw_autoneg(tp, mac_status);
3004 else
3005 current_link_up = tg3_setup_fiber_by_hand(tp, mac_status);
3006
1da177e4
LT
3007 tp->hw_status->status =
3008 (SD_STATUS_UPDATED |
3009 (tp->hw_status->status & ~SD_STATUS_LINK_CHG));
3010
3011 for (i = 0; i < 100; i++) {
3012 tw32_f(MAC_STATUS, (MAC_STATUS_SYNC_CHANGED |
3013 MAC_STATUS_CFG_CHANGED));
3014 udelay(5);
3015 if ((tr32(MAC_STATUS) & (MAC_STATUS_SYNC_CHANGED |
3d3ebe74
MC
3016 MAC_STATUS_CFG_CHANGED |
3017 MAC_STATUS_LNKSTATE_CHANGED)) == 0)
1da177e4
LT
3018 break;
3019 }
3020
3021 mac_status = tr32(MAC_STATUS);
3022 if ((mac_status & MAC_STATUS_PCS_SYNCED) == 0) {
3023 current_link_up = 0;
3d3ebe74
MC
3024 if (tp->link_config.autoneg == AUTONEG_ENABLE &&
3025 tp->serdes_counter == 0) {
1da177e4
LT
3026 tw32_f(MAC_MODE, (tp->mac_mode |
3027 MAC_MODE_SEND_CONFIGS));
3028 udelay(1);
3029 tw32_f(MAC_MODE, tp->mac_mode);
3030 }
3031 }
3032
3033 if (current_link_up == 1) {
3034 tp->link_config.active_speed = SPEED_1000;
3035 tp->link_config.active_duplex = DUPLEX_FULL;
3036 tw32(MAC_LED_CTRL, (tp->led_ctrl |
3037 LED_CTRL_LNKLED_OVERRIDE |
3038 LED_CTRL_1000MBPS_ON));
3039 } else {
3040 tp->link_config.active_speed = SPEED_INVALID;
3041 tp->link_config.active_duplex = DUPLEX_INVALID;
3042 tw32(MAC_LED_CTRL, (tp->led_ctrl |
3043 LED_CTRL_LNKLED_OVERRIDE |
3044 LED_CTRL_TRAFFIC_OVERRIDE));
3045 }
3046
3047 if (current_link_up != netif_carrier_ok(tp->dev)) {
3048 if (current_link_up)
3049 netif_carrier_on(tp->dev);
3050 else
3051 netif_carrier_off(tp->dev);
3052 tg3_link_report(tp);
3053 } else {
8d018621 3054 u32 now_pause_cfg = tp->link_config.active_flowctrl;
1da177e4
LT
3055 if (orig_pause_cfg != now_pause_cfg ||
3056 orig_active_speed != tp->link_config.active_speed ||
3057 orig_active_duplex != tp->link_config.active_duplex)
3058 tg3_link_report(tp);
3059 }
3060
3061 return 0;
3062}
3063
747e8f8b
MC
3064static int tg3_setup_fiber_mii_phy(struct tg3 *tp, int force_reset)
3065{
3066 int current_link_up, err = 0;
3067 u32 bmsr, bmcr;
3068 u16 current_speed;
3069 u8 current_duplex;
ef167e27 3070 u32 local_adv, remote_adv;
747e8f8b
MC
3071
3072 tp->mac_mode |= MAC_MODE_PORT_MODE_GMII;
3073 tw32_f(MAC_MODE, tp->mac_mode);
3074 udelay(40);
3075
3076 tw32(MAC_EVENT, 0);
3077
3078 tw32_f(MAC_STATUS,
3079 (MAC_STATUS_SYNC_CHANGED |
3080 MAC_STATUS_CFG_CHANGED |
3081 MAC_STATUS_MI_COMPLETION |
3082 MAC_STATUS_LNKSTATE_CHANGED));
3083 udelay(40);
3084
3085 if (force_reset)
3086 tg3_phy_reset(tp);
3087
3088 current_link_up = 0;
3089 current_speed = SPEED_INVALID;
3090 current_duplex = DUPLEX_INVALID;
3091
3092 err |= tg3_readphy(tp, MII_BMSR, &bmsr);
3093 err |= tg3_readphy(tp, MII_BMSR, &bmsr);
d4d2c558
MC
3094 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5714) {
3095 if (tr32(MAC_TX_STATUS) & TX_STATUS_LINK_UP)
3096 bmsr |= BMSR_LSTATUS;
3097 else
3098 bmsr &= ~BMSR_LSTATUS;
3099 }
747e8f8b
MC
3100
3101 err |= tg3_readphy(tp, MII_BMCR, &bmcr);
3102
3103 if ((tp->link_config.autoneg == AUTONEG_ENABLE) && !force_reset &&
ef167e27
MC
3104 (tp->tg3_flags2 & TG3_FLG2_PARALLEL_DETECT) &&
3105 tp->link_config.flowctrl == tp->link_config.active_flowctrl) {
747e8f8b
MC
3106 /* do nothing, just check for link up at the end */
3107 } else if (tp->link_config.autoneg == AUTONEG_ENABLE) {
3108 u32 adv, new_adv;
3109
3110 err |= tg3_readphy(tp, MII_ADVERTISE, &adv);
3111 new_adv = adv & ~(ADVERTISE_1000XFULL | ADVERTISE_1000XHALF |
3112 ADVERTISE_1000XPAUSE |
3113 ADVERTISE_1000XPSE_ASYM |
3114 ADVERTISE_SLCT);
3115
ba4d07a8 3116 new_adv |= tg3_advert_flowctrl_1000X(tp->link_config.flowctrl);
747e8f8b
MC
3117
3118 if (tp->link_config.advertising & ADVERTISED_1000baseT_Half)
3119 new_adv |= ADVERTISE_1000XHALF;
3120 if (tp->link_config.advertising & ADVERTISED_1000baseT_Full)
3121 new_adv |= ADVERTISE_1000XFULL;
3122
3123 if ((new_adv != adv) || !(bmcr & BMCR_ANENABLE)) {
3124 tg3_writephy(tp, MII_ADVERTISE, new_adv);
3125 bmcr |= BMCR_ANENABLE | BMCR_ANRESTART;
3126 tg3_writephy(tp, MII_BMCR, bmcr);
3127
3128 tw32_f(MAC_EVENT, MAC_EVENT_LNKSTATE_CHANGED);
3d3ebe74 3129 tp->serdes_counter = SERDES_AN_TIMEOUT_5714S;
747e8f8b
MC
3130 tp->tg3_flags2 &= ~TG3_FLG2_PARALLEL_DETECT;
3131
3132 return err;
3133 }
3134 } else {
3135 u32 new_bmcr;
3136
3137 bmcr &= ~BMCR_SPEED1000;
3138 new_bmcr = bmcr & ~(BMCR_ANENABLE | BMCR_FULLDPLX);
3139
3140 if (tp->link_config.duplex == DUPLEX_FULL)
3141 new_bmcr |= BMCR_FULLDPLX;
3142
3143 if (new_bmcr != bmcr) {
3144 /* BMCR_SPEED1000 is a reserved bit that needs
3145 * to be set on write.
3146 */
3147 new_bmcr |= BMCR_SPEED1000;
3148
3149 /* Force a linkdown */
3150 if (netif_carrier_ok(tp->dev)) {
3151 u32 adv;
3152
3153 err |= tg3_readphy(tp, MII_ADVERTISE, &adv);
3154 adv &= ~(ADVERTISE_1000XFULL |
3155 ADVERTISE_1000XHALF |
3156 ADVERTISE_SLCT);
3157 tg3_writephy(tp, MII_ADVERTISE, adv);
3158 tg3_writephy(tp, MII_BMCR, bmcr |
3159 BMCR_ANRESTART |
3160 BMCR_ANENABLE);
3161 udelay(10);
3162 netif_carrier_off(tp->dev);
3163 }
3164 tg3_writephy(tp, MII_BMCR, new_bmcr);
3165 bmcr = new_bmcr;
3166 err |= tg3_readphy(tp, MII_BMSR, &bmsr);
3167 err |= tg3_readphy(tp, MII_BMSR, &bmsr);
d4d2c558
MC
3168 if (GET_ASIC_REV(tp->pci_chip_rev_id) ==
3169 ASIC_REV_5714) {
3170 if (tr32(MAC_TX_STATUS) & TX_STATUS_LINK_UP)
3171 bmsr |= BMSR_LSTATUS;
3172 else
3173 bmsr &= ~BMSR_LSTATUS;
3174 }
747e8f8b
MC
3175 tp->tg3_flags2 &= ~TG3_FLG2_PARALLEL_DETECT;
3176 }
3177 }
3178
3179 if (bmsr & BMSR_LSTATUS) {
3180 current_speed = SPEED_1000;
3181 current_link_up = 1;
3182 if (bmcr & BMCR_FULLDPLX)
3183 current_duplex = DUPLEX_FULL;
3184 else
3185 current_duplex = DUPLEX_HALF;
3186
ef167e27
MC
3187 local_adv = 0;
3188 remote_adv = 0;
3189
747e8f8b 3190 if (bmcr & BMCR_ANENABLE) {
ef167e27 3191 u32 common;
747e8f8b
MC
3192
3193 err |= tg3_readphy(tp, MII_ADVERTISE, &local_adv);
3194 err |= tg3_readphy(tp, MII_LPA, &remote_adv);
3195 common = local_adv & remote_adv;
3196 if (common & (ADVERTISE_1000XHALF |
3197 ADVERTISE_1000XFULL)) {
3198 if (common & ADVERTISE_1000XFULL)
3199 current_duplex = DUPLEX_FULL;
3200 else
3201 current_duplex = DUPLEX_HALF;
747e8f8b
MC
3202 }
3203 else
3204 current_link_up = 0;
3205 }
3206 }
3207
ef167e27
MC
3208 if (current_link_up == 1 && current_duplex == DUPLEX_FULL)
3209 tg3_setup_flow_control(tp, local_adv, remote_adv);
3210
747e8f8b
MC
3211 tp->mac_mode &= ~MAC_MODE_HALF_DUPLEX;
3212 if (tp->link_config.active_duplex == DUPLEX_HALF)
3213 tp->mac_mode |= MAC_MODE_HALF_DUPLEX;
3214
3215 tw32_f(MAC_MODE, tp->mac_mode);
3216 udelay(40);
3217
3218 tw32_f(MAC_EVENT, MAC_EVENT_LNKSTATE_CHANGED);
3219
3220 tp->link_config.active_speed = current_speed;
3221 tp->link_config.active_duplex = current_duplex;
3222
3223 if (current_link_up != netif_carrier_ok(tp->dev)) {
3224 if (current_link_up)
3225 netif_carrier_on(tp->dev);
3226 else {
3227 netif_carrier_off(tp->dev);
3228 tp->tg3_flags2 &= ~TG3_FLG2_PARALLEL_DETECT;
3229 }
3230 tg3_link_report(tp);
3231 }
3232 return err;
3233}
3234
3235static void tg3_serdes_parallel_detect(struct tg3 *tp)
3236{
3d3ebe74 3237 if (tp->serdes_counter) {
747e8f8b 3238 /* Give autoneg time to complete. */
3d3ebe74 3239 tp->serdes_counter--;
747e8f8b
MC
3240 return;
3241 }
3242 if (!netif_carrier_ok(tp->dev) &&
3243 (tp->link_config.autoneg == AUTONEG_ENABLE)) {
3244 u32 bmcr;
3245
3246 tg3_readphy(tp, MII_BMCR, &bmcr);
3247 if (bmcr & BMCR_ANENABLE) {
3248 u32 phy1, phy2;
3249
3250 /* Select shadow register 0x1f */
3251 tg3_writephy(tp, 0x1c, 0x7c00);
3252 tg3_readphy(tp, 0x1c, &phy1);
3253
3254 /* Select expansion interrupt status register */
3255 tg3_writephy(tp, 0x17, 0x0f01);
3256 tg3_readphy(tp, 0x15, &phy2);
3257 tg3_readphy(tp, 0x15, &phy2);
3258
3259 if ((phy1 & 0x10) && !(phy2 & 0x20)) {
3260 /* We have signal detect and not receiving
3261 * config code words, link is up by parallel
3262 * detection.
3263 */
3264
3265 bmcr &= ~BMCR_ANENABLE;
3266 bmcr |= BMCR_SPEED1000 | BMCR_FULLDPLX;
3267 tg3_writephy(tp, MII_BMCR, bmcr);
3268 tp->tg3_flags2 |= TG3_FLG2_PARALLEL_DETECT;
3269 }
3270 }
3271 }
3272 else if (netif_carrier_ok(tp->dev) &&
3273 (tp->link_config.autoneg == AUTONEG_ENABLE) &&
3274 (tp->tg3_flags2 & TG3_FLG2_PARALLEL_DETECT)) {
3275 u32 phy2;
3276
3277 /* Select expansion interrupt status register */
3278 tg3_writephy(tp, 0x17, 0x0f01);
3279 tg3_readphy(tp, 0x15, &phy2);
3280 if (phy2 & 0x20) {
3281 u32 bmcr;
3282
3283 /* Config code words received, turn on autoneg. */
3284 tg3_readphy(tp, MII_BMCR, &bmcr);
3285 tg3_writephy(tp, MII_BMCR, bmcr | BMCR_ANENABLE);
3286
3287 tp->tg3_flags2 &= ~TG3_FLG2_PARALLEL_DETECT;
3288
3289 }
3290 }
3291}
3292
1da177e4
LT
3293static int tg3_setup_phy(struct tg3 *tp, int force_reset)
3294{
3295 int err;
3296
3297 if (tp->tg3_flags2 & TG3_FLG2_PHY_SERDES) {
3298 err = tg3_setup_fiber_phy(tp, force_reset);
747e8f8b
MC
3299 } else if (tp->tg3_flags2 & TG3_FLG2_MII_SERDES) {
3300 err = tg3_setup_fiber_mii_phy(tp, force_reset);
1da177e4
LT
3301 } else {
3302 err = tg3_setup_copper_phy(tp, force_reset);
3303 }
3304
b5af7126
MC
3305 if (tp->pci_chip_rev_id == CHIPREV_ID_5784_A0 ||
3306 tp->pci_chip_rev_id == CHIPREV_ID_5784_A1) {
aa6c91fe
MC
3307 u32 val, scale;
3308
3309 val = tr32(TG3_CPMU_CLCK_STAT) & CPMU_CLCK_STAT_MAC_CLCK_MASK;
3310 if (val == CPMU_CLCK_STAT_MAC_CLCK_62_5)
3311 scale = 65;
3312 else if (val == CPMU_CLCK_STAT_MAC_CLCK_6_25)
3313 scale = 6;
3314 else
3315 scale = 12;
3316
3317 val = tr32(GRC_MISC_CFG) & ~GRC_MISC_CFG_PRESCALAR_MASK;
3318 val |= (scale << GRC_MISC_CFG_PRESCALAR_SHIFT);
3319 tw32(GRC_MISC_CFG, val);
3320 }
3321
1da177e4
LT
3322 if (tp->link_config.active_speed == SPEED_1000 &&
3323 tp->link_config.active_duplex == DUPLEX_HALF)
3324 tw32(MAC_TX_LENGTHS,
3325 ((2 << TX_LENGTHS_IPG_CRS_SHIFT) |
3326 (6 << TX_LENGTHS_IPG_SHIFT) |
3327 (0xff << TX_LENGTHS_SLOT_TIME_SHIFT)));
3328 else
3329 tw32(MAC_TX_LENGTHS,
3330 ((2 << TX_LENGTHS_IPG_CRS_SHIFT) |
3331 (6 << TX_LENGTHS_IPG_SHIFT) |
3332 (32 << TX_LENGTHS_SLOT_TIME_SHIFT)));
3333
3334 if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS)) {
3335 if (netif_carrier_ok(tp->dev)) {
3336 tw32(HOSTCC_STAT_COAL_TICKS,
15f9850d 3337 tp->coal.stats_block_coalesce_usecs);
1da177e4
LT
3338 } else {
3339 tw32(HOSTCC_STAT_COAL_TICKS, 0);
3340 }
3341 }
3342
8ed5d97e
MC
3343 if (tp->tg3_flags & TG3_FLAG_ASPM_WORKAROUND) {
3344 u32 val = tr32(PCIE_PWR_MGMT_THRESH);
3345 if (!netif_carrier_ok(tp->dev))
3346 val = (val & ~PCIE_PWR_MGMT_L1_THRESH_MSK) |
3347 tp->pwrmgmt_thresh;
3348 else
3349 val |= PCIE_PWR_MGMT_L1_THRESH_MSK;
3350 tw32(PCIE_PWR_MGMT_THRESH, val);
3351 }
3352
1da177e4
LT
3353 return err;
3354}
3355
df3e6548
MC
3356/* This is called whenever we suspect that the system chipset is re-
3357 * ordering the sequence of MMIO to the tx send mailbox. The symptom
3358 * is bogus tx completions. We try to recover by setting the
3359 * TG3_FLAG_MBOX_WRITE_REORDER flag and resetting the chip later
3360 * in the workqueue.
3361 */
3362static void tg3_tx_recover(struct tg3 *tp)
3363{
3364 BUG_ON((tp->tg3_flags & TG3_FLAG_MBOX_WRITE_REORDER) ||
3365 tp->write32_tx_mbox == tg3_write_indirect_mbox);
3366
3367 printk(KERN_WARNING PFX "%s: The system may be re-ordering memory-"
3368 "mapped I/O cycles to the network device, attempting to "
3369 "recover. Please report the problem to the driver maintainer "
3370 "and include system chipset information.\n", tp->dev->name);
3371
3372 spin_lock(&tp->lock);
df3e6548 3373 tp->tg3_flags |= TG3_FLAG_TX_RECOVERY_PENDING;
df3e6548
MC
3374 spin_unlock(&tp->lock);
3375}
3376
1b2a7205
MC
3377static inline u32 tg3_tx_avail(struct tg3 *tp)
3378{
3379 smp_mb();
3380 return (tp->tx_pending -
3381 ((tp->tx_prod - tp->tx_cons) & (TG3_TX_RING_SIZE - 1)));
3382}
3383
1da177e4
LT
3384/* Tigon3 never reports partial packet sends. So we do not
3385 * need special logic to handle SKBs that have not had all
3386 * of their frags sent yet, like SunGEM does.
3387 */
3388static void tg3_tx(struct tg3 *tp)
3389{
3390 u32 hw_idx = tp->hw_status->idx[0].tx_consumer;
3391 u32 sw_idx = tp->tx_cons;
3392
3393 while (sw_idx != hw_idx) {
3394 struct tx_ring_info *ri = &tp->tx_buffers[sw_idx];
3395 struct sk_buff *skb = ri->skb;
df3e6548
MC
3396 int i, tx_bug = 0;
3397
3398 if (unlikely(skb == NULL)) {
3399 tg3_tx_recover(tp);
3400 return;
3401 }
1da177e4 3402
1da177e4
LT
3403 pci_unmap_single(tp->pdev,
3404 pci_unmap_addr(ri, mapping),
3405 skb_headlen(skb),
3406 PCI_DMA_TODEVICE);
3407
3408 ri->skb = NULL;
3409
3410 sw_idx = NEXT_TX(sw_idx);
3411
3412 for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
1da177e4 3413 ri = &tp->tx_buffers[sw_idx];
df3e6548
MC
3414 if (unlikely(ri->skb != NULL || sw_idx == hw_idx))
3415 tx_bug = 1;
1da177e4
LT
3416
3417 pci_unmap_page(tp->pdev,
3418 pci_unmap_addr(ri, mapping),
3419 skb_shinfo(skb)->frags[i].size,
3420 PCI_DMA_TODEVICE);
3421
3422 sw_idx = NEXT_TX(sw_idx);
3423 }
3424
f47c11ee 3425 dev_kfree_skb(skb);
df3e6548
MC
3426
3427 if (unlikely(tx_bug)) {
3428 tg3_tx_recover(tp);
3429 return;
3430 }
1da177e4
LT
3431 }
3432
3433 tp->tx_cons = sw_idx;
3434
1b2a7205
MC
3435 /* Need to make the tx_cons update visible to tg3_start_xmit()
3436 * before checking for netif_queue_stopped(). Without the
3437 * memory barrier, there is a small possibility that tg3_start_xmit()
3438 * will miss it and cause the queue to be stopped forever.
3439 */
3440 smp_mb();
3441
3442 if (unlikely(netif_queue_stopped(tp->dev) &&
42952231 3443 (tg3_tx_avail(tp) > TG3_TX_WAKEUP_THRESH(tp)))) {
1b2a7205 3444 netif_tx_lock(tp->dev);
51b91468 3445 if (netif_queue_stopped(tp->dev) &&
42952231 3446 (tg3_tx_avail(tp) > TG3_TX_WAKEUP_THRESH(tp)))
51b91468 3447 netif_wake_queue(tp->dev);
1b2a7205 3448 netif_tx_unlock(tp->dev);
51b91468 3449 }
1da177e4
LT
3450}
3451
3452/* Returns size of skb allocated or < 0 on error.
3453 *
3454 * We only need to fill in the address because the other members
3455 * of the RX descriptor are invariant, see tg3_init_rings.
3456 *
3457 * Note the purposeful assymetry of cpu vs. chip accesses. For
3458 * posting buffers we only dirty the first cache line of the RX
3459 * descriptor (containing the address). Whereas for the RX status
3460 * buffers the cpu only reads the last cacheline of the RX descriptor
3461 * (to fetch the error flags, vlan tag, checksum, and opaque cookie).
3462 */
3463static int tg3_alloc_rx_skb(struct tg3 *tp, u32 opaque_key,
3464 int src_idx, u32 dest_idx_unmasked)
3465{
3466 struct tg3_rx_buffer_desc *desc;
3467 struct ring_info *map, *src_map;
3468 struct sk_buff *skb;
3469 dma_addr_t mapping;
3470 int skb_size, dest_idx;
3471
3472 src_map = NULL;
3473 switch (opaque_key) {
3474 case RXD_OPAQUE_RING_STD:
3475 dest_idx = dest_idx_unmasked % TG3_RX_RING_SIZE;
3476 desc = &tp->rx_std[dest_idx];
3477 map = &tp->rx_std_buffers[dest_idx];
3478 if (src_idx >= 0)
3479 src_map = &tp->rx_std_buffers[src_idx];
7e72aad4 3480 skb_size = tp->rx_pkt_buf_sz;
1da177e4
LT
3481 break;
3482
3483 case RXD_OPAQUE_RING_JUMBO:
3484 dest_idx = dest_idx_unmasked % TG3_RX_JUMBO_RING_SIZE;
3485 desc = &tp->rx_jumbo[dest_idx];
3486 map = &tp->rx_jumbo_buffers[dest_idx];
3487 if (src_idx >= 0)
3488 src_map = &tp->rx_jumbo_buffers[src_idx];
3489 skb_size = RX_JUMBO_PKT_BUF_SZ;
3490 break;
3491
3492 default:
3493 return -EINVAL;
3494 };
3495
3496 /* Do not overwrite any of the map or rp information
3497 * until we are sure we can commit to a new buffer.
3498 *
3499 * Callers depend upon this behavior and assume that
3500 * we leave everything unchanged if we fail.
3501 */
a20e9c62 3502 skb = netdev_alloc_skb(tp->dev, skb_size);
1da177e4
LT
3503 if (skb == NULL)
3504 return -ENOMEM;
3505
1da177e4
LT
3506 skb_reserve(skb, tp->rx_offset);
3507
3508 mapping = pci_map_single(tp->pdev, skb->data,
3509 skb_size - tp->rx_offset,
3510 PCI_DMA_FROMDEVICE);
3511
3512 map->skb = skb;
3513 pci_unmap_addr_set(map, mapping, mapping);
3514
3515 if (src_map != NULL)
3516 src_map->skb = NULL;
3517
3518 desc->addr_hi = ((u64)mapping >> 32);
3519 desc->addr_lo = ((u64)mapping & 0xffffffff);
3520
3521 return skb_size;
3522}
3523
3524/* We only need to move over in the address because the other
3525 * members of the RX descriptor are invariant. See notes above
3526 * tg3_alloc_rx_skb for full details.
3527 */
3528static void tg3_recycle_rx(struct tg3 *tp, u32 opaque_key,
3529 int src_idx, u32 dest_idx_unmasked)
3530{
3531 struct tg3_rx_buffer_desc *src_desc, *dest_desc;
3532 struct ring_info *src_map, *dest_map;
3533 int dest_idx;
3534
3535 switch (opaque_key) {
3536 case RXD_OPAQUE_RING_STD:
3537 dest_idx = dest_idx_unmasked % TG3_RX_RING_SIZE;
3538 dest_desc = &tp->rx_std[dest_idx];
3539 dest_map = &tp->rx_std_buffers[dest_idx];
3540 src_desc = &tp->rx_std[src_idx];
3541 src_map = &tp->rx_std_buffers[src_idx];
3542 break;
3543
3544 case RXD_OPAQUE_RING_JUMBO:
3545 dest_idx = dest_idx_unmasked % TG3_RX_JUMBO_RING_SIZE;
3546 dest_desc = &tp->rx_jumbo[dest_idx];
3547 dest_map = &tp->rx_jumbo_buffers[dest_idx];
3548 src_desc = &tp->rx_jumbo[src_idx];
3549 src_map = &tp->rx_jumbo_buffers[src_idx];
3550 break;
3551
3552 default:
3553 return;
3554 };
3555
3556 dest_map->skb = src_map->skb;
3557 pci_unmap_addr_set(dest_map, mapping,
3558 pci_unmap_addr(src_map, mapping));
3559 dest_desc->addr_hi = src_desc->addr_hi;
3560 dest_desc->addr_lo = src_desc->addr_lo;
3561
3562 src_map->skb = NULL;
3563}
3564
3565#if TG3_VLAN_TAG_USED
3566static int tg3_vlan_rx(struct tg3 *tp, struct sk_buff *skb, u16 vlan_tag)
3567{
3568 return vlan_hwaccel_receive_skb(skb, tp->vlgrp, vlan_tag);
3569}
3570#endif
3571
3572/* The RX ring scheme is composed of multiple rings which post fresh
3573 * buffers to the chip, and one special ring the chip uses to report
3574 * status back to the host.
3575 *
3576 * The special ring reports the status of received packets to the
3577 * host. The chip does not write into the original descriptor the
3578 * RX buffer was obtained from. The chip simply takes the original
3579 * descriptor as provided by the host, updates the status and length
3580 * field, then writes this into the next status ring entry.
3581 *
3582 * Each ring the host uses to post buffers to the chip is described
3583 * by a TG3_BDINFO entry in the chips SRAM area. When a packet arrives,
3584 * it is first placed into the on-chip ram. When the packet's length
3585 * is known, it walks down the TG3_BDINFO entries to select the ring.
3586 * Each TG3_BDINFO specifies a MAXLEN field and the first TG3_BDINFO
3587 * which is within the range of the new packet's length is chosen.
3588 *
3589 * The "separate ring for rx status" scheme may sound queer, but it makes
3590 * sense from a cache coherency perspective. If only the host writes
3591 * to the buffer post rings, and only the chip writes to the rx status
3592 * rings, then cache lines never move beyond shared-modified state.
3593 * If both the host and chip were to write into the same ring, cache line
3594 * eviction could occur since both entities want it in an exclusive state.
3595 */
3596static int tg3_rx(struct tg3 *tp, int budget)
3597{
f92905de 3598 u32 work_mask, rx_std_posted = 0;
483ba50b
MC
3599 u32 sw_idx = tp->rx_rcb_ptr;
3600 u16 hw_idx;
1da177e4
LT
3601 int received;
3602
3603 hw_idx = tp->hw_status->idx[0].rx_producer;
3604 /*
3605 * We need to order the read of hw_idx and the read of
3606 * the opaque cookie.
3607 */
3608 rmb();
1da177e4
LT
3609 work_mask = 0;
3610 received = 0;
3611 while (sw_idx != hw_idx && budget > 0) {
3612 struct tg3_rx_buffer_desc *desc = &tp->rx_rcb[sw_idx];
3613 unsigned int len;
3614 struct sk_buff *skb;
3615 dma_addr_t dma_addr;
3616 u32 opaque_key, desc_idx, *post_ptr;
3617
3618 desc_idx = desc->opaque & RXD_OPAQUE_INDEX_MASK;
3619 opaque_key = desc->opaque & RXD_OPAQUE_RING_MASK;
3620 if (opaque_key == RXD_OPAQUE_RING_STD) {
3621 dma_addr = pci_unmap_addr(&tp->rx_std_buffers[desc_idx],
3622 mapping);
3623 skb = tp->rx_std_buffers[desc_idx].skb;
3624 post_ptr = &tp->rx_std_ptr;
f92905de 3625 rx_std_posted++;
1da177e4
LT
3626 } else if (opaque_key == RXD_OPAQUE_RING_JUMBO) {
3627 dma_addr = pci_unmap_addr(&tp->rx_jumbo_buffers[desc_idx],
3628 mapping);
3629 skb = tp->rx_jumbo_buffers[desc_idx].skb;
3630 post_ptr = &tp->rx_jumbo_ptr;
3631 }
3632 else {
3633 goto next_pkt_nopost;
3634 }
3635
3636 work_mask |= opaque_key;
3637
3638 if ((desc->err_vlan & RXD_ERR_MASK) != 0 &&
3639 (desc->err_vlan != RXD_ERR_ODD_NIBBLE_RCVD_MII)) {
3640 drop_it:
3641 tg3_recycle_rx(tp, opaque_key,
3642 desc_idx, *post_ptr);
3643 drop_it_no_recycle:
3644 /* Other statistics kept track of by card. */
3645 tp->net_stats.rx_dropped++;
3646 goto next_pkt;
3647 }
3648
3649 len = ((desc->idx_len & RXD_LEN_MASK) >> RXD_LEN_SHIFT) - 4; /* omit crc */
3650
6aa20a22 3651 if (len > RX_COPY_THRESHOLD
1da177e4
LT
3652 && tp->rx_offset == 2
3653 /* rx_offset != 2 iff this is a 5701 card running
3654 * in PCI-X mode [see tg3_get_invariants()] */
3655 ) {
3656 int skb_size;
3657
3658 skb_size = tg3_alloc_rx_skb(tp, opaque_key,
3659 desc_idx, *post_ptr);
3660 if (skb_size < 0)
3661 goto drop_it;
3662
3663 pci_unmap_single(tp->pdev, dma_addr,
3664 skb_size - tp->rx_offset,
3665 PCI_DMA_FROMDEVICE);
3666
3667 skb_put(skb, len);
3668 } else {
3669 struct sk_buff *copy_skb;
3670
3671 tg3_recycle_rx(tp, opaque_key,
3672 desc_idx, *post_ptr);
3673
a20e9c62 3674 copy_skb = netdev_alloc_skb(tp->dev, len + 2);
1da177e4
LT
3675 if (copy_skb == NULL)
3676 goto drop_it_no_recycle;
3677
1da177e4
LT
3678 skb_reserve(copy_skb, 2);
3679 skb_put(copy_skb, len);
3680 pci_dma_sync_single_for_cpu(tp->pdev, dma_addr, len, PCI_DMA_FROMDEVICE);
d626f62b 3681 skb_copy_from_linear_data(skb, copy_skb->data, len);
1da177e4
LT
3682 pci_dma_sync_single_for_device(tp->pdev, dma_addr, len, PCI_DMA_FROMDEVICE);
3683
3684 /* We'll reuse the original ring buffer. */
3685 skb = copy_skb;
3686 }
3687
3688 if ((tp->tg3_flags & TG3_FLAG_RX_CHECKSUMS) &&
3689 (desc->type_flags & RXD_FLAG_TCPUDP_CSUM) &&
3690 (((desc->ip_tcp_csum & RXD_TCPCSUM_MASK)
3691 >> RXD_TCPCSUM_SHIFT) == 0xffff))
3692 skb->ip_summed = CHECKSUM_UNNECESSARY;
3693 else
3694 skb->ip_summed = CHECKSUM_NONE;
3695
3696 skb->protocol = eth_type_trans(skb, tp->dev);
3697#if TG3_VLAN_TAG_USED
3698 if (tp->vlgrp != NULL &&
3699 desc->type_flags & RXD_FLAG_VLAN) {
3700 tg3_vlan_rx(tp, skb,
3701 desc->err_vlan & RXD_VLAN_MASK);
3702 } else
3703#endif
3704 netif_receive_skb(skb);
3705
3706 tp->dev->last_rx = jiffies;
3707 received++;
3708 budget--;
3709
3710next_pkt:
3711 (*post_ptr)++;
f92905de
MC
3712
3713 if (unlikely(rx_std_posted >= tp->rx_std_max_post)) {
3714 u32 idx = *post_ptr % TG3_RX_RING_SIZE;
3715
3716 tw32_rx_mbox(MAILBOX_RCV_STD_PROD_IDX +
3717 TG3_64BIT_REG_LOW, idx);
3718 work_mask &= ~RXD_OPAQUE_RING_STD;
3719 rx_std_posted = 0;
3720 }
1da177e4 3721next_pkt_nopost:
483ba50b 3722 sw_idx++;
6b31a515 3723 sw_idx &= (TG3_RX_RCB_RING_SIZE(tp) - 1);
52f6d697
MC
3724
3725 /* Refresh hw_idx to see if there is new work */
3726 if (sw_idx == hw_idx) {
3727 hw_idx = tp->hw_status->idx[0].rx_producer;
3728 rmb();
3729 }
1da177e4
LT
3730 }
3731
3732 /* ACK the status ring. */
483ba50b
MC
3733 tp->rx_rcb_ptr = sw_idx;
3734 tw32_rx_mbox(MAILBOX_RCVRET_CON_IDX_0 + TG3_64BIT_REG_LOW, sw_idx);
1da177e4
LT
3735
3736 /* Refill RX ring(s). */
3737 if (work_mask & RXD_OPAQUE_RING_STD) {
3738 sw_idx = tp->rx_std_ptr % TG3_RX_RING_SIZE;
3739 tw32_rx_mbox(MAILBOX_RCV_STD_PROD_IDX + TG3_64BIT_REG_LOW,
3740 sw_idx);
3741 }
3742 if (work_mask & RXD_OPAQUE_RING_JUMBO) {
3743 sw_idx = tp->rx_jumbo_ptr % TG3_RX_JUMBO_RING_SIZE;
3744 tw32_rx_mbox(MAILBOX_RCV_JUMBO_PROD_IDX + TG3_64BIT_REG_LOW,
3745 sw_idx);
3746 }
3747 mmiowb();
3748
3749 return received;
3750}
3751
6f535763 3752static int tg3_poll_work(struct tg3 *tp, int work_done, int budget)
1da177e4 3753{
1da177e4 3754 struct tg3_hw_status *sblk = tp->hw_status;
1da177e4 3755
1da177e4
LT
3756 /* handle link change and other phy events */
3757 if (!(tp->tg3_flags &
3758 (TG3_FLAG_USE_LINKCHG_REG |
3759 TG3_FLAG_POLL_SERDES))) {
3760 if (sblk->status & SD_STATUS_LINK_CHG) {
3761 sblk->status = SD_STATUS_UPDATED |
3762 (sblk->status & ~SD_STATUS_LINK_CHG);
f47c11ee 3763 spin_lock(&tp->lock);
1da177e4 3764 tg3_setup_phy(tp, 0);
f47c11ee 3765 spin_unlock(&tp->lock);
1da177e4
LT
3766 }
3767 }
3768
3769 /* run TX completion thread */
3770 if (sblk->idx[0].tx_consumer != tp->tx_cons) {
1da177e4 3771 tg3_tx(tp);
6f535763 3772 if (unlikely(tp->tg3_flags & TG3_FLAG_TX_RECOVERY_PENDING))
4fd7ab59 3773 return work_done;
1da177e4
LT
3774 }
3775
1da177e4
LT
3776 /* run RX thread, within the bounds set by NAPI.
3777 * All RX "locking" is done by ensuring outside
bea3348e 3778 * code synchronizes with tg3->napi.poll()
1da177e4 3779 */
bea3348e 3780 if (sblk->idx[0].rx_producer != tp->rx_rcb_ptr)
6f535763 3781 work_done += tg3_rx(tp, budget - work_done);
1da177e4 3782
6f535763
DM
3783 return work_done;
3784}
3785
3786static int tg3_poll(struct napi_struct *napi, int budget)
3787{
3788 struct tg3 *tp = container_of(napi, struct tg3, napi);
3789 int work_done = 0;
4fd7ab59 3790 struct tg3_hw_status *sblk = tp->hw_status;
6f535763
DM
3791
3792 while (1) {
3793 work_done = tg3_poll_work(tp, work_done, budget);
3794
3795 if (unlikely(tp->tg3_flags & TG3_FLAG_TX_RECOVERY_PENDING))
3796 goto tx_recovery;
3797
3798 if (unlikely(work_done >= budget))
3799 break;
3800
4fd7ab59
MC
3801 if (tp->tg3_flags & TG3_FLAG_TAGGED_STATUS) {
3802 /* tp->last_tag is used in tg3_restart_ints() below
3803 * to tell the hw how much work has been processed,
3804 * so we must read it before checking for more work.
3805 */
3806 tp->last_tag = sblk->status_tag;
3807 rmb();
3808 } else
3809 sblk->status &= ~SD_STATUS_UPDATED;
6f535763 3810
4fd7ab59 3811 if (likely(!tg3_has_work(tp))) {
6f535763
DM
3812 netif_rx_complete(tp->dev, napi);
3813 tg3_restart_ints(tp);
3814 break;
3815 }
1da177e4
LT
3816 }
3817
bea3348e 3818 return work_done;
6f535763
DM
3819
3820tx_recovery:
4fd7ab59 3821 /* work_done is guaranteed to be less than budget. */
6f535763
DM
3822 netif_rx_complete(tp->dev, napi);
3823 schedule_work(&tp->reset_task);
4fd7ab59 3824 return work_done;
1da177e4
LT
3825}
3826
f47c11ee
DM
3827static void tg3_irq_quiesce(struct tg3 *tp)
3828{
3829 BUG_ON(tp->irq_sync);
3830
3831 tp->irq_sync = 1;
3832 smp_mb();
3833
3834 synchronize_irq(tp->pdev->irq);
3835}
3836
3837static inline int tg3_irq_sync(struct tg3 *tp)
3838{
3839 return tp->irq_sync;
3840}
3841
3842/* Fully shutdown all tg3 driver activity elsewhere in the system.
3843 * If irq_sync is non-zero, then the IRQ handler must be synchronized
3844 * with as well. Most of the time, this is not necessary except when
3845 * shutting down the device.
3846 */
3847static inline void tg3_full_lock(struct tg3 *tp, int irq_sync)
3848{
46966545 3849 spin_lock_bh(&tp->lock);
f47c11ee
DM
3850 if (irq_sync)
3851 tg3_irq_quiesce(tp);
f47c11ee
DM
3852}
3853
3854static inline void tg3_full_unlock(struct tg3 *tp)
3855{
f47c11ee
DM
3856 spin_unlock_bh(&tp->lock);
3857}
3858
fcfa0a32
MC
3859/* One-shot MSI handler - Chip automatically disables interrupt
3860 * after sending MSI so driver doesn't have to do it.
3861 */
7d12e780 3862static irqreturn_t tg3_msi_1shot(int irq, void *dev_id)
fcfa0a32
MC
3863{
3864 struct net_device *dev = dev_id;
3865 struct tg3 *tp = netdev_priv(dev);
3866
3867 prefetch(tp->hw_status);
3868 prefetch(&tp->rx_rcb[tp->rx_rcb_ptr]);
3869
3870 if (likely(!tg3_irq_sync(tp)))
bea3348e 3871 netif_rx_schedule(dev, &tp->napi);
fcfa0a32
MC
3872
3873 return IRQ_HANDLED;
3874}
3875
88b06bc2
MC
3876/* MSI ISR - No need to check for interrupt sharing and no need to
3877 * flush status block and interrupt mailbox. PCI ordering rules
3878 * guarantee that MSI will arrive after the status block.
3879 */
7d12e780 3880static irqreturn_t tg3_msi(int irq, void *dev_id)
88b06bc2
MC
3881{
3882 struct net_device *dev = dev_id;
3883 struct tg3 *tp = netdev_priv(dev);
88b06bc2 3884
61487480
MC
3885 prefetch(tp->hw_status);
3886 prefetch(&tp->rx_rcb[tp->rx_rcb_ptr]);
88b06bc2 3887 /*
fac9b83e 3888 * Writing any value to intr-mbox-0 clears PCI INTA# and
88b06bc2 3889 * chip-internal interrupt pending events.
fac9b83e 3890 * Writing non-zero to intr-mbox-0 additional tells the
88b06bc2
MC
3891 * NIC to stop sending us irqs, engaging "in-intr-handler"
3892 * event coalescing.
3893 */
3894 tw32_mailbox(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW, 0x00000001);
61487480 3895 if (likely(!tg3_irq_sync(tp)))
bea3348e 3896 netif_rx_schedule(dev, &tp->napi);
61487480 3897
88b06bc2
MC
3898 return IRQ_RETVAL(1);
3899}
3900
7d12e780 3901static irqreturn_t tg3_interrupt(int irq, void *dev_id)
1da177e4
LT
3902{
3903 struct net_device *dev = dev_id;
3904 struct tg3 *tp = netdev_priv(dev);
3905 struct tg3_hw_status *sblk = tp->hw_status;
1da177e4
LT
3906 unsigned int handled = 1;
3907
1da177e4
LT
3908 /* In INTx mode, it is possible for the interrupt to arrive at
3909 * the CPU before the status block posted prior to the interrupt.
3910 * Reading the PCI State register will confirm whether the
3911 * interrupt is ours and will flush the status block.
3912 */
d18edcb2
MC
3913 if (unlikely(!(sblk->status & SD_STATUS_UPDATED))) {
3914 if ((tp->tg3_flags & TG3_FLAG_CHIP_RESETTING) ||
3915 (tr32(TG3PCI_PCISTATE) & PCISTATE_INT_NOT_ACTIVE)) {
3916 handled = 0;
f47c11ee 3917 goto out;
fac9b83e 3918 }
d18edcb2
MC
3919 }
3920
3921 /*
3922 * Writing any value to intr-mbox-0 clears PCI INTA# and
3923 * chip-internal interrupt pending events.
3924 * Writing non-zero to intr-mbox-0 additional tells the
3925 * NIC to stop sending us irqs, engaging "in-intr-handler"
3926 * event coalescing.
c04cb347
MC
3927 *
3928 * Flush the mailbox to de-assert the IRQ immediately to prevent
3929 * spurious interrupts. The flush impacts performance but
3930 * excessive spurious interrupts can be worse in some cases.
d18edcb2 3931 */
c04cb347 3932 tw32_mailbox_f(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW, 0x00000001);
d18edcb2
MC
3933 if (tg3_irq_sync(tp))
3934 goto out;
3935 sblk->status &= ~SD_STATUS_UPDATED;
3936 if (likely(tg3_has_work(tp))) {
3937 prefetch(&tp->rx_rcb[tp->rx_rcb_ptr]);
bea3348e 3938 netif_rx_schedule(dev, &tp->napi);
d18edcb2
MC
3939 } else {
3940 /* No work, shared interrupt perhaps? re-enable
3941 * interrupts, and flush that PCI write
3942 */
3943 tw32_mailbox_f(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW,
3944 0x00000000);
fac9b83e 3945 }
f47c11ee 3946out:
fac9b83e
DM
3947 return IRQ_RETVAL(handled);
3948}
3949
7d12e780 3950static irqreturn_t tg3_interrupt_tagged(int irq, void *dev_id)
fac9b83e
DM
3951{
3952 struct net_device *dev = dev_id;
3953 struct tg3 *tp = netdev_priv(dev);
3954 struct tg3_hw_status *sblk = tp->hw_status;
fac9b83e
DM
3955 unsigned int handled = 1;
3956
fac9b83e
DM
3957 /* In INTx mode, it is possible for the interrupt to arrive at
3958 * the CPU before the status block posted prior to the interrupt.
3959 * Reading the PCI State register will confirm whether the
3960 * interrupt is ours and will flush the status block.
3961 */
d18edcb2
MC
3962 if (unlikely(sblk->status_tag == tp->last_tag)) {
3963 if ((tp->tg3_flags & TG3_FLAG_CHIP_RESETTING) ||
3964 (tr32(TG3PCI_PCISTATE) & PCISTATE_INT_NOT_ACTIVE)) {
3965 handled = 0;
f47c11ee 3966 goto out;
1da177e4 3967 }
d18edcb2
MC
3968 }
3969
3970 /*
3971 * writing any value to intr-mbox-0 clears PCI INTA# and
3972 * chip-internal interrupt pending events.
3973 * writing non-zero to intr-mbox-0 additional tells the
3974 * NIC to stop sending us irqs, engaging "in-intr-handler"
3975 * event coalescing.
c04cb347
MC
3976 *
3977 * Flush the mailbox to de-assert the IRQ immediately to prevent
3978 * spurious interrupts. The flush impacts performance but
3979 * excessive spurious interrupts can be worse in some cases.
d18edcb2 3980 */
c04cb347 3981 tw32_mailbox_f(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW, 0x00000001);
d18edcb2
MC
3982 if (tg3_irq_sync(tp))
3983 goto out;
bea3348e 3984 if (netif_rx_schedule_prep(dev, &tp->napi)) {
d18edcb2
MC
3985 prefetch(&tp->rx_rcb[tp->rx_rcb_ptr]);
3986 /* Update last_tag to mark that this status has been
3987 * seen. Because interrupt may be shared, we may be
3988 * racing with tg3_poll(), so only update last_tag
3989 * if tg3_poll() is not scheduled.
3990 */
3991 tp->last_tag = sblk->status_tag;
bea3348e 3992 __netif_rx_schedule(dev, &tp->napi);
1da177e4 3993 }
f47c11ee 3994out:
1da177e4
LT
3995 return IRQ_RETVAL(handled);
3996}
3997
7938109f 3998/* ISR for interrupt test */
7d12e780 3999static irqreturn_t tg3_test_isr(int irq, void *dev_id)
7938109f
MC
4000{
4001 struct net_device *dev = dev_id;
4002 struct tg3 *tp = netdev_priv(dev);
4003 struct tg3_hw_status *sblk = tp->hw_status;
4004
f9804ddb
MC
4005 if ((sblk->status & SD_STATUS_UPDATED) ||
4006 !(tr32(TG3PCI_PCISTATE) & PCISTATE_INT_NOT_ACTIVE)) {
b16250e3 4007 tg3_disable_ints(tp);
7938109f
MC
4008 return IRQ_RETVAL(1);
4009 }
4010 return IRQ_RETVAL(0);
4011}
4012
8e7a22e3 4013static int tg3_init_hw(struct tg3 *, int);
944d980e 4014static int tg3_halt(struct tg3 *, int, int);
1da177e4 4015
b9ec6c1b
MC
4016/* Restart hardware after configuration changes, self-test, etc.
4017 * Invoked with tp->lock held.
4018 */
4019static int tg3_restart_hw(struct tg3 *tp, int reset_phy)
78c6146f
ED
4020 __releases(tp->lock)
4021 __acquires(tp->lock)
b9ec6c1b
MC
4022{
4023 int err;
4024
4025 err = tg3_init_hw(tp, reset_phy);
4026 if (err) {
4027 printk(KERN_ERR PFX "%s: Failed to re-initialize device, "
4028 "aborting.\n", tp->dev->name);
4029 tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
4030 tg3_full_unlock(tp);
4031 del_timer_sync(&tp->timer);
4032 tp->irq_sync = 0;
bea3348e 4033 napi_enable(&tp->napi);
b9ec6c1b
MC
4034 dev_close(tp->dev);
4035 tg3_full_lock(tp, 0);
4036 }
4037 return err;
4038}
4039
1da177e4
LT
4040#ifdef CONFIG_NET_POLL_CONTROLLER
4041static void tg3_poll_controller(struct net_device *dev)
4042{
88b06bc2
MC
4043 struct tg3 *tp = netdev_priv(dev);
4044
7d12e780 4045 tg3_interrupt(tp->pdev->irq, dev);
1da177e4
LT
4046}
4047#endif
4048
c4028958 4049static void tg3_reset_task(struct work_struct *work)
1da177e4 4050{
c4028958 4051 struct tg3 *tp = container_of(work, struct tg3, reset_task);
1da177e4
LT
4052 unsigned int restart_timer;
4053
7faa006f 4054 tg3_full_lock(tp, 0);
7faa006f
MC
4055
4056 if (!netif_running(tp->dev)) {
7faa006f
MC
4057 tg3_full_unlock(tp);
4058 return;
4059 }
4060
4061 tg3_full_unlock(tp);
4062
1da177e4
LT
4063 tg3_netif_stop(tp);
4064
f47c11ee 4065 tg3_full_lock(tp, 1);
1da177e4
LT
4066
4067 restart_timer = tp->tg3_flags2 & TG3_FLG2_RESTART_TIMER;
4068 tp->tg3_flags2 &= ~TG3_FLG2_RESTART_TIMER;
4069
df3e6548
MC
4070 if (tp->tg3_flags & TG3_FLAG_TX_RECOVERY_PENDING) {
4071 tp->write32_tx_mbox = tg3_write32_tx_mbox;
4072 tp->write32_rx_mbox = tg3_write_flush_reg32;
4073 tp->tg3_flags |= TG3_FLAG_MBOX_WRITE_REORDER;
4074 tp->tg3_flags &= ~TG3_FLAG_TX_RECOVERY_PENDING;
4075 }
4076
944d980e 4077 tg3_halt(tp, RESET_KIND_SHUTDOWN, 0);
b9ec6c1b
MC
4078 if (tg3_init_hw(tp, 1))
4079 goto out;
1da177e4
LT
4080
4081 tg3_netif_start(tp);
4082
1da177e4
LT
4083 if (restart_timer)
4084 mod_timer(&tp->timer, jiffies + 1);
7faa006f 4085
b9ec6c1b 4086out:
7faa006f 4087 tg3_full_unlock(tp);
1da177e4
LT
4088}
4089
b0408751
MC
4090static void tg3_dump_short_state(struct tg3 *tp)
4091{
4092 printk(KERN_ERR PFX "DEBUG: MAC_TX_STATUS[%08x] MAC_RX_STATUS[%08x]\n",
4093 tr32(MAC_TX_STATUS), tr32(MAC_RX_STATUS));
4094 printk(KERN_ERR PFX "DEBUG: RDMAC_STATUS[%08x] WDMAC_STATUS[%08x]\n",
4095 tr32(RDMAC_STATUS), tr32(WDMAC_STATUS));
4096}
4097
1da177e4
LT
4098static void tg3_tx_timeout(struct net_device *dev)
4099{
4100 struct tg3 *tp = netdev_priv(dev);
4101
b0408751 4102 if (netif_msg_tx_err(tp)) {
9f88f29f
MC
4103 printk(KERN_ERR PFX "%s: transmit timed out, resetting\n",
4104 dev->name);
b0408751
MC
4105 tg3_dump_short_state(tp);
4106 }
1da177e4
LT
4107
4108 schedule_work(&tp->reset_task);
4109}
4110
c58ec932
MC
4111/* Test for DMA buffers crossing any 4GB boundaries: 4G, 8G, etc */
4112static inline int tg3_4g_overflow_test(dma_addr_t mapping, int len)
4113{
4114 u32 base = (u32) mapping & 0xffffffff;
4115
4116 return ((base > 0xffffdcc0) &&
4117 (base + len + 8 < base));
4118}
4119
72f2afb8
MC
4120/* Test for DMA addresses > 40-bit */
4121static inline int tg3_40bit_overflow_test(struct tg3 *tp, dma_addr_t mapping,
4122 int len)
4123{
4124#if defined(CONFIG_HIGHMEM) && (BITS_PER_LONG == 64)
6728a8e2 4125 if (tp->tg3_flags & TG3_FLAG_40BIT_DMA_BUG)
72f2afb8
MC
4126 return (((u64) mapping + len) > DMA_40BIT_MASK);
4127 return 0;
4128#else
4129 return 0;
4130#endif
4131}
4132
1da177e4
LT
4133static void tg3_set_txd(struct tg3 *, int, dma_addr_t, int, u32, u32);
4134
72f2afb8
MC
4135/* Workaround 4GB and 40-bit hardware DMA bugs. */
4136static int tigon3_dma_hwbug_workaround(struct tg3 *tp, struct sk_buff *skb,
c58ec932
MC
4137 u32 last_plus_one, u32 *start,
4138 u32 base_flags, u32 mss)
1da177e4 4139{
41588ba1 4140 struct sk_buff *new_skb;
c58ec932 4141 dma_addr_t new_addr = 0;
1da177e4 4142 u32 entry = *start;
c58ec932 4143 int i, ret = 0;
1da177e4 4144
41588ba1
MC
4145 if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5701)
4146 new_skb = skb_copy(skb, GFP_ATOMIC);
4147 else {
4148 int more_headroom = 4 - ((unsigned long)skb->data & 3);
4149
4150 new_skb = skb_copy_expand(skb,
4151 skb_headroom(skb) + more_headroom,
4152 skb_tailroom(skb), GFP_ATOMIC);
4153 }
4154
1da177e4 4155 if (!new_skb) {
c58ec932
MC
4156 ret = -1;
4157 } else {
4158 /* New SKB is guaranteed to be linear. */
4159 entry = *start;
4160 new_addr = pci_map_single(tp->pdev, new_skb->data, new_skb->len,
4161 PCI_DMA_TODEVICE);
4162 /* Make sure new skb does not cross any 4G boundaries.
4163 * Drop the packet if it does.
4164 */
4165 if (tg3_4g_overflow_test(new_addr, new_skb->len)) {
4166 ret = -1;
4167 dev_kfree_skb(new_skb);
4168 new_skb = NULL;
4169 } else {
4170 tg3_set_txd(tp, entry, new_addr, new_skb->len,
4171 base_flags, 1 | (mss << 1));
4172 *start = NEXT_TX(entry);
4173 }
1da177e4
LT
4174 }
4175
1da177e4
LT
4176 /* Now clean up the sw ring entries. */
4177 i = 0;
4178 while (entry != last_plus_one) {
4179 int len;
4180
4181 if (i == 0)
4182 len = skb_headlen(skb);
4183 else
4184 len = skb_shinfo(skb)->frags[i-1].size;
4185 pci_unmap_single(tp->pdev,
4186 pci_unmap_addr(&tp->tx_buffers[entry], mapping),
4187 len, PCI_DMA_TODEVICE);
4188 if (i == 0) {
4189 tp->tx_buffers[entry].skb = new_skb;
4190 pci_unmap_addr_set(&tp->tx_buffers[entry], mapping, new_addr);
4191 } else {
4192 tp->tx_buffers[entry].skb = NULL;
4193 }
4194 entry = NEXT_TX(entry);
4195 i++;
4196 }
4197
4198 dev_kfree_skb(skb);
4199
c58ec932 4200 return ret;
1da177e4
LT
4201}
4202
4203static void tg3_set_txd(struct tg3 *tp, int entry,
4204 dma_addr_t mapping, int len, u32 flags,
4205 u32 mss_and_is_end)
4206{
4207 struct tg3_tx_buffer_desc *txd = &tp->tx_ring[entry];
4208 int is_end = (mss_and_is_end & 0x1);
4209 u32 mss = (mss_and_is_end >> 1);
4210 u32 vlan_tag = 0;
4211
4212 if (is_end)
4213 flags |= TXD_FLAG_END;
4214 if (flags & TXD_FLAG_VLAN) {
4215 vlan_tag = flags >> 16;
4216 flags &= 0xffff;
4217 }
4218 vlan_tag |= (mss << TXD_MSS_SHIFT);
4219
4220 txd->addr_hi = ((u64) mapping >> 32);
4221 txd->addr_lo = ((u64) mapping & 0xffffffff);
4222 txd->len_flags = (len << TXD_LEN_SHIFT) | flags;
4223 txd->vlan_tag = vlan_tag << TXD_VLAN_TAG_SHIFT;
4224}
4225
5a6f3074
MC
4226/* hard_start_xmit for devices that don't have any bugs and
4227 * support TG3_FLG2_HW_TSO_2 only.
4228 */
1da177e4 4229static int tg3_start_xmit(struct sk_buff *skb, struct net_device *dev)
5a6f3074
MC
4230{
4231 struct tg3 *tp = netdev_priv(dev);
4232 dma_addr_t mapping;
4233 u32 len, entry, base_flags, mss;
4234
4235 len = skb_headlen(skb);
4236
00b70504 4237 /* We are running in BH disabled context with netif_tx_lock
bea3348e 4238 * and TX reclaim runs via tp->napi.poll inside of a software
5a6f3074
MC
4239 * interrupt. Furthermore, IRQ processing runs lockless so we have
4240 * no IRQ context deadlocks to worry about either. Rejoice!
4241 */
1b2a7205 4242 if (unlikely(tg3_tx_avail(tp) <= (skb_shinfo(skb)->nr_frags + 1))) {
5a6f3074
MC
4243 if (!netif_queue_stopped(dev)) {
4244 netif_stop_queue(dev);
4245
4246 /* This is a hard error, log it. */
4247 printk(KERN_ERR PFX "%s: BUG! Tx Ring full when "
4248 "queue awake!\n", dev->name);
4249 }
5a6f3074
MC
4250 return NETDEV_TX_BUSY;
4251 }
4252
4253 entry = tp->tx_prod;
4254 base_flags = 0;
5a6f3074 4255 mss = 0;
c13e3713 4256 if ((mss = skb_shinfo(skb)->gso_size) != 0) {
5a6f3074
MC
4257 int tcp_opt_len, ip_tcp_len;
4258
4259 if (skb_header_cloned(skb) &&
4260 pskb_expand_head(skb, 0, 0, GFP_ATOMIC)) {
4261 dev_kfree_skb(skb);
4262 goto out_unlock;
4263 }
4264
b0026624
MC
4265 if (skb_shinfo(skb)->gso_type & SKB_GSO_TCPV6)
4266 mss |= (skb_headlen(skb) - ETH_HLEN) << 9;
4267 else {
eddc9ec5
ACM
4268 struct iphdr *iph = ip_hdr(skb);
4269
ab6a5bb6 4270 tcp_opt_len = tcp_optlen(skb);
c9bdd4b5 4271 ip_tcp_len = ip_hdrlen(skb) + sizeof(struct tcphdr);
b0026624 4272
eddc9ec5
ACM
4273 iph->check = 0;
4274 iph->tot_len = htons(mss + ip_tcp_len + tcp_opt_len);
b0026624
MC
4275 mss |= (ip_tcp_len + tcp_opt_len) << 9;
4276 }
5a6f3074
MC
4277
4278 base_flags |= (TXD_FLAG_CPU_PRE_DMA |
4279 TXD_FLAG_CPU_POST_DMA);
4280
aa8223c7 4281 tcp_hdr(skb)->check = 0;
5a6f3074 4282
5a6f3074 4283 }
84fa7933 4284 else if (skb->ip_summed == CHECKSUM_PARTIAL)
5a6f3074 4285 base_flags |= TXD_FLAG_TCPUDP_CSUM;
5a6f3074
MC
4286#if TG3_VLAN_TAG_USED
4287 if (tp->vlgrp != NULL && vlan_tx_tag_present(skb))
4288 base_flags |= (TXD_FLAG_VLAN |
4289 (vlan_tx_tag_get(skb) << 16));
4290#endif
4291
4292 /* Queue skb data, a.k.a. the main skb fragment. */
4293 mapping = pci_map_single(tp->pdev, skb->data, len, PCI_DMA_TODEVICE);
4294
4295 tp->tx_buffers[entry].skb = skb;
4296 pci_unmap_addr_set(&tp->tx_buffers[entry], mapping, mapping);
4297
4298 tg3_set_txd(tp, entry, mapping, len, base_flags,
4299 (skb_shinfo(skb)->nr_frags == 0) | (mss << 1));
4300
4301 entry = NEXT_TX(entry);
4302
4303 /* Now loop through additional data fragments, and queue them. */
4304 if (skb_shinfo(skb)->nr_frags > 0) {
4305 unsigned int i, last;
4306
4307 last = skb_shinfo(skb)->nr_frags - 1;
4308 for (i = 0; i <= last; i++) {
4309 skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
4310
4311 len = frag->size;
4312 mapping = pci_map_page(tp->pdev,
4313 frag->page,
4314 frag->page_offset,
4315 len, PCI_DMA_TODEVICE);
4316
4317 tp->tx_buffers[entry].skb = NULL;
4318 pci_unmap_addr_set(&tp->tx_buffers[entry], mapping, mapping);
4319
4320 tg3_set_txd(tp, entry, mapping, len,
4321 base_flags, (i == last) | (mss << 1));
4322
4323 entry = NEXT_TX(entry);
4324 }
4325 }
4326
4327 /* Packets are ready, update Tx producer idx local and on card. */
4328 tw32_tx_mbox((MAILBOX_SNDHOST_PROD_IDX_0 + TG3_64BIT_REG_LOW), entry);
4329
4330 tp->tx_prod = entry;
1b2a7205 4331 if (unlikely(tg3_tx_avail(tp) <= (MAX_SKB_FRAGS + 1))) {
5a6f3074 4332 netif_stop_queue(dev);
42952231 4333 if (tg3_tx_avail(tp) > TG3_TX_WAKEUP_THRESH(tp))
5a6f3074
MC
4334 netif_wake_queue(tp->dev);
4335 }
4336
4337out_unlock:
4338 mmiowb();
5a6f3074
MC
4339
4340 dev->trans_start = jiffies;
4341
4342 return NETDEV_TX_OK;
4343}
4344
52c0fd83
MC
4345static int tg3_start_xmit_dma_bug(struct sk_buff *, struct net_device *);
4346
4347/* Use GSO to workaround a rare TSO bug that may be triggered when the
4348 * TSO header is greater than 80 bytes.
4349 */
4350static int tg3_tso_bug(struct tg3 *tp, struct sk_buff *skb)
4351{
4352 struct sk_buff *segs, *nskb;
4353
4354 /* Estimate the number of fragments in the worst case */
1b2a7205 4355 if (unlikely(tg3_tx_avail(tp) <= (skb_shinfo(skb)->gso_segs * 3))) {
52c0fd83 4356 netif_stop_queue(tp->dev);
7f62ad5d
MC
4357 if (tg3_tx_avail(tp) <= (skb_shinfo(skb)->gso_segs * 3))
4358 return NETDEV_TX_BUSY;
4359
4360 netif_wake_queue(tp->dev);
52c0fd83
MC
4361 }
4362
4363 segs = skb_gso_segment(skb, tp->dev->features & ~NETIF_F_TSO);
4364 if (unlikely(IS_ERR(segs)))
4365 goto tg3_tso_bug_end;
4366
4367 do {
4368 nskb = segs;
4369 segs = segs->next;
4370 nskb->next = NULL;
4371 tg3_start_xmit_dma_bug(nskb, tp->dev);
4372 } while (segs);
4373
4374tg3_tso_bug_end:
4375 dev_kfree_skb(skb);
4376
4377 return NETDEV_TX_OK;
4378}
52c0fd83 4379
5a6f3074
MC
4380/* hard_start_xmit for devices that have the 4G bug and/or 40-bit bug and
4381 * support TG3_FLG2_HW_TSO_1 or firmware TSO only.
4382 */
4383static int tg3_start_xmit_dma_bug(struct sk_buff *skb, struct net_device *dev)
1da177e4
LT
4384{
4385 struct tg3 *tp = netdev_priv(dev);
4386 dma_addr_t mapping;
1da177e4
LT
4387 u32 len, entry, base_flags, mss;
4388 int would_hit_hwbug;
1da177e4
LT
4389
4390 len = skb_headlen(skb);
4391
00b70504 4392 /* We are running in BH disabled context with netif_tx_lock
bea3348e 4393 * and TX reclaim runs via tp->napi.poll inside of a software
f47c11ee
DM
4394 * interrupt. Furthermore, IRQ processing runs lockless so we have
4395 * no IRQ context deadlocks to worry about either. Rejoice!
1da177e4 4396 */
1b2a7205 4397 if (unlikely(tg3_tx_avail(tp) <= (skb_shinfo(skb)->nr_frags + 1))) {
1f064a87
SH
4398 if (!netif_queue_stopped(dev)) {
4399 netif_stop_queue(dev);
4400
4401 /* This is a hard error, log it. */
4402 printk(KERN_ERR PFX "%s: BUG! Tx Ring full when "
4403 "queue awake!\n", dev->name);
4404 }
1da177e4
LT
4405 return NETDEV_TX_BUSY;
4406 }
4407
4408 entry = tp->tx_prod;
4409 base_flags = 0;
84fa7933 4410 if (skb->ip_summed == CHECKSUM_PARTIAL)
1da177e4 4411 base_flags |= TXD_FLAG_TCPUDP_CSUM;
1da177e4 4412 mss = 0;
c13e3713 4413 if ((mss = skb_shinfo(skb)->gso_size) != 0) {
eddc9ec5 4414 struct iphdr *iph;
52c0fd83 4415 int tcp_opt_len, ip_tcp_len, hdr_len;
1da177e4
LT
4416
4417 if (skb_header_cloned(skb) &&
4418 pskb_expand_head(skb, 0, 0, GFP_ATOMIC)) {
4419 dev_kfree_skb(skb);
4420 goto out_unlock;
4421 }
4422
ab6a5bb6 4423 tcp_opt_len = tcp_optlen(skb);
c9bdd4b5 4424 ip_tcp_len = ip_hdrlen(skb) + sizeof(struct tcphdr);
1da177e4 4425
52c0fd83
MC
4426 hdr_len = ip_tcp_len + tcp_opt_len;
4427 if (unlikely((ETH_HLEN + hdr_len) > 80) &&
7f62ad5d 4428 (tp->tg3_flags2 & TG3_FLG2_TSO_BUG))
52c0fd83
MC
4429 return (tg3_tso_bug(tp, skb));
4430
1da177e4
LT
4431 base_flags |= (TXD_FLAG_CPU_PRE_DMA |
4432 TXD_FLAG_CPU_POST_DMA);
4433
eddc9ec5
ACM
4434 iph = ip_hdr(skb);
4435 iph->check = 0;
4436 iph->tot_len = htons(mss + hdr_len);
1da177e4 4437 if (tp->tg3_flags2 & TG3_FLG2_HW_TSO) {
aa8223c7 4438 tcp_hdr(skb)->check = 0;
1da177e4 4439 base_flags &= ~TXD_FLAG_TCPUDP_CSUM;
aa8223c7
ACM
4440 } else
4441 tcp_hdr(skb)->check = ~csum_tcpudp_magic(iph->saddr,
4442 iph->daddr, 0,
4443 IPPROTO_TCP,
4444 0);
1da177e4
LT
4445
4446 if ((tp->tg3_flags2 & TG3_FLG2_HW_TSO) ||
4447 (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705)) {
eddc9ec5 4448 if (tcp_opt_len || iph->ihl > 5) {
1da177e4
LT
4449 int tsflags;
4450
eddc9ec5 4451 tsflags = (iph->ihl - 5) + (tcp_opt_len >> 2);
1da177e4
LT
4452 mss |= (tsflags << 11);
4453 }
4454 } else {
eddc9ec5 4455 if (tcp_opt_len || iph->ihl > 5) {
1da177e4
LT
4456 int tsflags;
4457
eddc9ec5 4458 tsflags = (iph->ihl - 5) + (tcp_opt_len >> 2);
1da177e4
LT
4459 base_flags |= tsflags << 12;
4460 }
4461 }
4462 }
1da177e4
LT
4463#if TG3_VLAN_TAG_USED
4464 if (tp->vlgrp != NULL && vlan_tx_tag_present(skb))
4465 base_flags |= (TXD_FLAG_VLAN |
4466 (vlan_tx_tag_get(skb) << 16));
4467#endif
4468
4469 /* Queue skb data, a.k.a. the main skb fragment. */
4470 mapping = pci_map_single(tp->pdev, skb->data, len, PCI_DMA_TODEVICE);
4471
4472 tp->tx_buffers[entry].skb = skb;
4473 pci_unmap_addr_set(&tp->tx_buffers[entry], mapping, mapping);
4474
4475 would_hit_hwbug = 0;
4476
41588ba1
MC
4477 if (tp->tg3_flags3 & TG3_FLG3_5701_DMA_BUG)
4478 would_hit_hwbug = 1;
4479 else if (tg3_4g_overflow_test(mapping, len))
c58ec932 4480 would_hit_hwbug = 1;
1da177e4
LT
4481
4482 tg3_set_txd(tp, entry, mapping, len, base_flags,
4483 (skb_shinfo(skb)->nr_frags == 0) | (mss << 1));
4484
4485 entry = NEXT_TX(entry);
4486
4487 /* Now loop through additional data fragments, and queue them. */
4488 if (skb_shinfo(skb)->nr_frags > 0) {
4489 unsigned int i, last;
4490
4491 last = skb_shinfo(skb)->nr_frags - 1;
4492 for (i = 0; i <= last; i++) {
4493 skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
4494
4495 len = frag->size;
4496 mapping = pci_map_page(tp->pdev,
4497 frag->page,
4498 frag->page_offset,
4499 len, PCI_DMA_TODEVICE);
4500
4501 tp->tx_buffers[entry].skb = NULL;
4502 pci_unmap_addr_set(&tp->tx_buffers[entry], mapping, mapping);
4503
c58ec932
MC
4504 if (tg3_4g_overflow_test(mapping, len))
4505 would_hit_hwbug = 1;
1da177e4 4506
72f2afb8
MC
4507 if (tg3_40bit_overflow_test(tp, mapping, len))
4508 would_hit_hwbug = 1;
4509
1da177e4
LT
4510 if (tp->tg3_flags2 & TG3_FLG2_HW_TSO)
4511 tg3_set_txd(tp, entry, mapping, len,
4512 base_flags, (i == last)|(mss << 1));
4513 else
4514 tg3_set_txd(tp, entry, mapping, len,
4515 base_flags, (i == last));
4516
4517 entry = NEXT_TX(entry);
4518 }
4519 }
4520
4521 if (would_hit_hwbug) {
4522 u32 last_plus_one = entry;
4523 u32 start;
1da177e4 4524
c58ec932
MC
4525 start = entry - 1 - skb_shinfo(skb)->nr_frags;
4526 start &= (TG3_TX_RING_SIZE - 1);
1da177e4
LT
4527
4528 /* If the workaround fails due to memory/mapping
4529 * failure, silently drop this packet.
4530 */
72f2afb8 4531 if (tigon3_dma_hwbug_workaround(tp, skb, last_plus_one,
c58ec932 4532 &start, base_flags, mss))
1da177e4
LT
4533 goto out_unlock;
4534
4535 entry = start;
4536 }
4537
4538 /* Packets are ready, update Tx producer idx local and on card. */
4539 tw32_tx_mbox((MAILBOX_SNDHOST_PROD_IDX_0 + TG3_64BIT_REG_LOW), entry);
4540
4541 tp->tx_prod = entry;
1b2a7205 4542 if (unlikely(tg3_tx_avail(tp) <= (MAX_SKB_FRAGS + 1))) {
1da177e4 4543 netif_stop_queue(dev);
42952231 4544 if (tg3_tx_avail(tp) > TG3_TX_WAKEUP_THRESH(tp))
51b91468
MC
4545 netif_wake_queue(tp->dev);
4546 }
1da177e4
LT
4547
4548out_unlock:
4549 mmiowb();
1da177e4
LT
4550
4551 dev->trans_start = jiffies;
4552
4553 return NETDEV_TX_OK;
4554}
4555
4556static inline void tg3_set_mtu(struct net_device *dev, struct tg3 *tp,
4557 int new_mtu)
4558{
4559 dev->mtu = new_mtu;
4560
ef7f5ec0 4561 if (new_mtu > ETH_DATA_LEN) {
a4e2b347 4562 if (tp->tg3_flags2 & TG3_FLG2_5780_CLASS) {
ef7f5ec0
MC
4563 tp->tg3_flags2 &= ~TG3_FLG2_TSO_CAPABLE;
4564 ethtool_op_set_tso(dev, 0);
4565 }
4566 else
4567 tp->tg3_flags |= TG3_FLAG_JUMBO_RING_ENABLE;
4568 } else {
a4e2b347 4569 if (tp->tg3_flags2 & TG3_FLG2_5780_CLASS)
ef7f5ec0 4570 tp->tg3_flags2 |= TG3_FLG2_TSO_CAPABLE;
0f893dc6 4571 tp->tg3_flags &= ~TG3_FLAG_JUMBO_RING_ENABLE;
ef7f5ec0 4572 }
1da177e4
LT
4573}
4574
4575static int tg3_change_mtu(struct net_device *dev, int new_mtu)
4576{
4577 struct tg3 *tp = netdev_priv(dev);
b9ec6c1b 4578 int err;
1da177e4
LT
4579
4580 if (new_mtu < TG3_MIN_MTU || new_mtu > TG3_MAX_MTU(tp))
4581 return -EINVAL;
4582
4583 if (!netif_running(dev)) {
4584 /* We'll just catch it later when the
4585 * device is up'd.
4586 */
4587 tg3_set_mtu(dev, tp, new_mtu);
4588 return 0;
4589 }
4590
4591 tg3_netif_stop(tp);
f47c11ee
DM
4592
4593 tg3_full_lock(tp, 1);
1da177e4 4594
944d980e 4595 tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
1da177e4
LT
4596
4597 tg3_set_mtu(dev, tp, new_mtu);
4598
b9ec6c1b 4599 err = tg3_restart_hw(tp, 0);
1da177e4 4600
b9ec6c1b
MC
4601 if (!err)
4602 tg3_netif_start(tp);
1da177e4 4603
f47c11ee 4604 tg3_full_unlock(tp);
1da177e4 4605
b9ec6c1b 4606 return err;
1da177e4
LT
4607}
4608
4609/* Free up pending packets in all rx/tx rings.
4610 *
4611 * The chip has been shut down and the driver detached from
4612 * the networking, so no interrupts or new tx packets will
4613 * end up in the driver. tp->{tx,}lock is not held and we are not
4614 * in an interrupt context and thus may sleep.
4615 */
4616static void tg3_free_rings(struct tg3 *tp)
4617{
4618 struct ring_info *rxp;
4619 int i;
4620
4621 for (i = 0; i < TG3_RX_RING_SIZE; i++) {
4622 rxp = &tp->rx_std_buffers[i];
4623
4624 if (rxp->skb == NULL)
4625 continue;
4626 pci_unmap_single(tp->pdev,
4627 pci_unmap_addr(rxp, mapping),
7e72aad4 4628 tp->rx_pkt_buf_sz - tp->rx_offset,
1da177e4
LT
4629 PCI_DMA_FROMDEVICE);
4630 dev_kfree_skb_any(rxp->skb);
4631 rxp->skb = NULL;
4632 }
4633
4634 for (i = 0; i < TG3_RX_JUMBO_RING_SIZE; i++) {
4635 rxp = &tp->rx_jumbo_buffers[i];
4636
4637 if (rxp->skb == NULL)
4638 continue;
4639 pci_unmap_single(tp->pdev,
4640 pci_unmap_addr(rxp, mapping),
4641 RX_JUMBO_PKT_BUF_SZ - tp->rx_offset,
4642 PCI_DMA_FROMDEVICE);
4643 dev_kfree_skb_any(rxp->skb);
4644 rxp->skb = NULL;
4645 }
4646
4647 for (i = 0; i < TG3_TX_RING_SIZE; ) {
4648 struct tx_ring_info *txp;
4649 struct sk_buff *skb;
4650 int j;
4651
4652 txp = &tp->tx_buffers[i];
4653 skb = txp->skb;
4654
4655 if (skb == NULL) {
4656 i++;
4657 continue;
4658 }
4659
4660 pci_unmap_single(tp->pdev,
4661 pci_unmap_addr(txp, mapping),
4662 skb_headlen(skb),
4663 PCI_DMA_TODEVICE);
4664 txp->skb = NULL;
4665
4666 i++;
4667
4668 for (j = 0; j < skb_shinfo(skb)->nr_frags; j++) {
4669 txp = &tp->tx_buffers[i & (TG3_TX_RING_SIZE - 1)];
4670 pci_unmap_page(tp->pdev,
4671 pci_unmap_addr(txp, mapping),
4672 skb_shinfo(skb)->frags[j].size,
4673 PCI_DMA_TODEVICE);
4674 i++;
4675 }
4676
4677 dev_kfree_skb_any(skb);
4678 }
4679}
4680
4681/* Initialize tx/rx rings for packet processing.
4682 *
4683 * The chip has been shut down and the driver detached from
4684 * the networking, so no interrupts or new tx packets will
4685 * end up in the driver. tp->{tx,}lock are held and thus
4686 * we may not sleep.
4687 */
32d8c572 4688static int tg3_init_rings(struct tg3 *tp)
1da177e4
LT
4689{
4690 u32 i;
4691
4692 /* Free up all the SKBs. */
4693 tg3_free_rings(tp);
4694
4695 /* Zero out all descriptors. */
4696 memset(tp->rx_std, 0, TG3_RX_RING_BYTES);
4697 memset(tp->rx_jumbo, 0, TG3_RX_JUMBO_RING_BYTES);
4698 memset(tp->rx_rcb, 0, TG3_RX_RCB_RING_BYTES(tp));
4699 memset(tp->tx_ring, 0, TG3_TX_RING_BYTES);
4700
7e72aad4 4701 tp->rx_pkt_buf_sz = RX_PKT_BUF_SZ;
a4e2b347 4702 if ((tp->tg3_flags2 & TG3_FLG2_5780_CLASS) &&
7e72aad4
MC
4703 (tp->dev->mtu > ETH_DATA_LEN))
4704 tp->rx_pkt_buf_sz = RX_JUMBO_PKT_BUF_SZ;
4705
1da177e4
LT
4706 /* Initialize invariants of the rings, we only set this
4707 * stuff once. This works because the card does not
4708 * write into the rx buffer posting rings.
4709 */
4710 for (i = 0; i < TG3_RX_RING_SIZE; i++) {
4711 struct tg3_rx_buffer_desc *rxd;
4712
4713 rxd = &tp->rx_std[i];
7e72aad4 4714 rxd->idx_len = (tp->rx_pkt_buf_sz - tp->rx_offset - 64)
1da177e4
LT
4715 << RXD_LEN_SHIFT;
4716 rxd->type_flags = (RXD_FLAG_END << RXD_FLAGS_SHIFT);
4717 rxd->opaque = (RXD_OPAQUE_RING_STD |
4718 (i << RXD_OPAQUE_INDEX_SHIFT));
4719 }
4720
0f893dc6 4721 if (tp->tg3_flags & TG3_FLAG_JUMBO_RING_ENABLE) {
1da177e4
LT
4722 for (i = 0; i < TG3_RX_JUMBO_RING_SIZE; i++) {
4723 struct tg3_rx_buffer_desc *rxd;
4724
4725 rxd = &tp->rx_jumbo[i];
4726 rxd->idx_len = (RX_JUMBO_PKT_BUF_SZ - tp->rx_offset - 64)
4727 << RXD_LEN_SHIFT;
4728 rxd->type_flags = (RXD_FLAG_END << RXD_FLAGS_SHIFT) |
4729 RXD_FLAG_JUMBO;
4730 rxd->opaque = (RXD_OPAQUE_RING_JUMBO |
4731 (i << RXD_OPAQUE_INDEX_SHIFT));
4732 }
4733 }
4734
4735 /* Now allocate fresh SKBs for each rx ring. */
4736 for (i = 0; i < tp->rx_pending; i++) {
32d8c572
MC
4737 if (tg3_alloc_rx_skb(tp, RXD_OPAQUE_RING_STD, -1, i) < 0) {
4738 printk(KERN_WARNING PFX
4739 "%s: Using a smaller RX standard ring, "
4740 "only %d out of %d buffers were allocated "
4741 "successfully.\n",
4742 tp->dev->name, i, tp->rx_pending);
4743 if (i == 0)
4744 return -ENOMEM;
4745 tp->rx_pending = i;
1da177e4 4746 break;
32d8c572 4747 }
1da177e4
LT
4748 }
4749
0f893dc6 4750 if (tp->tg3_flags & TG3_FLAG_JUMBO_RING_ENABLE) {
1da177e4
LT
4751 for (i = 0; i < tp->rx_jumbo_pending; i++) {
4752 if (tg3_alloc_rx_skb(tp, RXD_OPAQUE_RING_JUMBO,
32d8c572
MC
4753 -1, i) < 0) {
4754 printk(KERN_WARNING PFX
4755 "%s: Using a smaller RX jumbo ring, "
4756 "only %d out of %d buffers were "
4757 "allocated successfully.\n",
4758 tp->dev->name, i, tp->rx_jumbo_pending);
4759 if (i == 0) {
4760 tg3_free_rings(tp);
4761 return -ENOMEM;
4762 }
4763 tp->rx_jumbo_pending = i;
1da177e4 4764 break;
32d8c572 4765 }
1da177e4
LT
4766 }
4767 }
32d8c572 4768 return 0;
1da177e4
LT
4769}
4770
4771/*
4772 * Must not be invoked with interrupt sources disabled and
4773 * the hardware shutdown down.
4774 */
4775static void tg3_free_consistent(struct tg3 *tp)
4776{
b4558ea9
JJ
4777 kfree(tp->rx_std_buffers);
4778 tp->rx_std_buffers = NULL;
1da177e4
LT
4779 if (tp->rx_std) {
4780 pci_free_consistent(tp->pdev, TG3_RX_RING_BYTES,
4781 tp->rx_std, tp->rx_std_mapping);
4782 tp->rx_std = NULL;
4783 }
4784 if (tp->rx_jumbo) {
4785 pci_free_consistent(tp->pdev, TG3_RX_JUMBO_RING_BYTES,
4786 tp->rx_jumbo, tp->rx_jumbo_mapping);
4787 tp->rx_jumbo = NULL;
4788 }
4789 if (tp->rx_rcb) {
4790 pci_free_consistent(tp->pdev, TG3_RX_RCB_RING_BYTES(tp),
4791 tp->rx_rcb, tp->rx_rcb_mapping);
4792 tp->rx_rcb = NULL;
4793 }
4794 if (tp->tx_ring) {
4795 pci_free_consistent(tp->pdev, TG3_TX_RING_BYTES,
4796 tp->tx_ring, tp->tx_desc_mapping);
4797 tp->tx_ring = NULL;
4798 }
4799 if (tp->hw_status) {
4800 pci_free_consistent(tp->pdev, TG3_HW_STATUS_SIZE,
4801 tp->hw_status, tp->status_mapping);
4802 tp->hw_status = NULL;
4803 }
4804 if (tp->hw_stats) {
4805 pci_free_consistent(tp->pdev, sizeof(struct tg3_hw_stats),
4806 tp->hw_stats, tp->stats_mapping);
4807 tp->hw_stats = NULL;
4808 }
4809}
4810
4811/*
4812 * Must not be invoked with interrupt sources disabled and
4813 * the hardware shutdown down. Can sleep.
4814 */
4815static int tg3_alloc_consistent(struct tg3 *tp)
4816{
bd2b3343 4817 tp->rx_std_buffers = kzalloc((sizeof(struct ring_info) *
1da177e4
LT
4818 (TG3_RX_RING_SIZE +
4819 TG3_RX_JUMBO_RING_SIZE)) +
4820 (sizeof(struct tx_ring_info) *
4821 TG3_TX_RING_SIZE),
4822 GFP_KERNEL);
4823 if (!tp->rx_std_buffers)
4824 return -ENOMEM;
4825
1da177e4
LT
4826 tp->rx_jumbo_buffers = &tp->rx_std_buffers[TG3_RX_RING_SIZE];
4827 tp->tx_buffers = (struct tx_ring_info *)
4828 &tp->rx_jumbo_buffers[TG3_RX_JUMBO_RING_SIZE];
4829
4830 tp->rx_std = pci_alloc_consistent(tp->pdev, TG3_RX_RING_BYTES,
4831 &tp->rx_std_mapping);
4832 if (!tp->rx_std)
4833 goto err_out;
4834
4835 tp->rx_jumbo = pci_alloc_consistent(tp->pdev, TG3_RX_JUMBO_RING_BYTES,
4836 &tp->rx_jumbo_mapping);
4837
4838 if (!tp->rx_jumbo)
4839 goto err_out;
4840
4841 tp->rx_rcb = pci_alloc_consistent(tp->pdev, TG3_RX_RCB_RING_BYTES(tp),
4842 &tp->rx_rcb_mapping);
4843 if (!tp->rx_rcb)
4844 goto err_out;
4845
4846 tp->tx_ring = pci_alloc_consistent(tp->pdev, TG3_TX_RING_BYTES,
4847 &tp->tx_desc_mapping);
4848 if (!tp->tx_ring)
4849 goto err_out;
4850
4851 tp->hw_status = pci_alloc_consistent(tp->pdev,
4852 TG3_HW_STATUS_SIZE,
4853 &tp->status_mapping);
4854 if (!tp->hw_status)
4855 goto err_out;
4856
4857 tp->hw_stats = pci_alloc_consistent(tp->pdev,
4858 sizeof(struct tg3_hw_stats),
4859 &tp->stats_mapping);
4860 if (!tp->hw_stats)
4861 goto err_out;
4862
4863 memset(tp->hw_status, 0, TG3_HW_STATUS_SIZE);
4864 memset(tp->hw_stats, 0, sizeof(struct tg3_hw_stats));
4865
4866 return 0;
4867
4868err_out:
4869 tg3_free_consistent(tp);
4870 return -ENOMEM;
4871}
4872
4873#define MAX_WAIT_CNT 1000
4874
4875/* To stop a block, clear the enable bit and poll till it
4876 * clears. tp->lock is held.
4877 */
b3b7d6be 4878static int tg3_stop_block(struct tg3 *tp, unsigned long ofs, u32 enable_bit, int silent)
1da177e4
LT
4879{
4880 unsigned int i;
4881 u32 val;
4882
4883 if (tp->tg3_flags2 & TG3_FLG2_5705_PLUS) {
4884 switch (ofs) {
4885 case RCVLSC_MODE:
4886 case DMAC_MODE:
4887 case MBFREE_MODE:
4888 case BUFMGR_MODE:
4889 case MEMARB_MODE:
4890 /* We can't enable/disable these bits of the
4891 * 5705/5750, just say success.
4892 */
4893 return 0;
4894
4895 default:
4896 break;
4897 };
4898 }
4899
4900 val = tr32(ofs);
4901 val &= ~enable_bit;
4902 tw32_f(ofs, val);
4903
4904 for (i = 0; i < MAX_WAIT_CNT; i++) {
4905 udelay(100);
4906 val = tr32(ofs);
4907 if ((val & enable_bit) == 0)
4908 break;
4909 }
4910
b3b7d6be 4911 if (i == MAX_WAIT_CNT && !silent) {
1da177e4
LT
4912 printk(KERN_ERR PFX "tg3_stop_block timed out, "
4913 "ofs=%lx enable_bit=%x\n",
4914 ofs, enable_bit);
4915 return -ENODEV;
4916 }
4917
4918 return 0;
4919}
4920
4921/* tp->lock is held. */
b3b7d6be 4922static int tg3_abort_hw(struct tg3 *tp, int silent)
1da177e4
LT
4923{
4924 int i, err;
4925
4926 tg3_disable_ints(tp);
4927
4928 tp->rx_mode &= ~RX_MODE_ENABLE;
4929 tw32_f(MAC_RX_MODE, tp->rx_mode);
4930 udelay(10);
4931
b3b7d6be
DM
4932 err = tg3_stop_block(tp, RCVBDI_MODE, RCVBDI_MODE_ENABLE, silent);
4933 err |= tg3_stop_block(tp, RCVLPC_MODE, RCVLPC_MODE_ENABLE, silent);
4934 err |= tg3_stop_block(tp, RCVLSC_MODE, RCVLSC_MODE_ENABLE, silent);
4935 err |= tg3_stop_block(tp, RCVDBDI_MODE, RCVDBDI_MODE_ENABLE, silent);
4936 err |= tg3_stop_block(tp, RCVDCC_MODE, RCVDCC_MODE_ENABLE, silent);
4937 err |= tg3_stop_block(tp, RCVCC_MODE, RCVCC_MODE_ENABLE, silent);
4938
4939 err |= tg3_stop_block(tp, SNDBDS_MODE, SNDBDS_MODE_ENABLE, silent);
4940 err |= tg3_stop_block(tp, SNDBDI_MODE, SNDBDI_MODE_ENABLE, silent);
4941 err |= tg3_stop_block(tp, SNDDATAI_MODE, SNDDATAI_MODE_ENABLE, silent);
4942 err |= tg3_stop_block(tp, RDMAC_MODE, RDMAC_MODE_ENABLE, silent);
4943 err |= tg3_stop_block(tp, SNDDATAC_MODE, SNDDATAC_MODE_ENABLE, silent);
4944 err |= tg3_stop_block(tp, DMAC_MODE, DMAC_MODE_ENABLE, silent);
4945 err |= tg3_stop_block(tp, SNDBDC_MODE, SNDBDC_MODE_ENABLE, silent);
1da177e4
LT
4946
4947 tp->mac_mode &= ~MAC_MODE_TDE_ENABLE;
4948 tw32_f(MAC_MODE, tp->mac_mode);
4949 udelay(40);
4950
4951 tp->tx_mode &= ~TX_MODE_ENABLE;
4952 tw32_f(MAC_TX_MODE, tp->tx_mode);
4953
4954 for (i = 0; i < MAX_WAIT_CNT; i++) {
4955 udelay(100);
4956 if (!(tr32(MAC_TX_MODE) & TX_MODE_ENABLE))
4957 break;
4958 }
4959 if (i >= MAX_WAIT_CNT) {
4960 printk(KERN_ERR PFX "tg3_abort_hw timed out for %s, "
4961 "TX_MODE_ENABLE will not clear MAC_TX_MODE=%08x\n",
4962 tp->dev->name, tr32(MAC_TX_MODE));
e6de8ad1 4963 err |= -ENODEV;
1da177e4
LT
4964 }
4965
e6de8ad1 4966 err |= tg3_stop_block(tp, HOSTCC_MODE, HOSTCC_MODE_ENABLE, silent);
b3b7d6be
DM
4967 err |= tg3_stop_block(tp, WDMAC_MODE, WDMAC_MODE_ENABLE, silent);
4968 err |= tg3_stop_block(tp, MBFREE_MODE, MBFREE_MODE_ENABLE, silent);
1da177e4
LT
4969
4970 tw32(FTQ_RESET, 0xffffffff);
4971 tw32(FTQ_RESET, 0x00000000);
4972
b3b7d6be
DM
4973 err |= tg3_stop_block(tp, BUFMGR_MODE, BUFMGR_MODE_ENABLE, silent);
4974 err |= tg3_stop_block(tp, MEMARB_MODE, MEMARB_MODE_ENABLE, silent);
1da177e4
LT
4975
4976 if (tp->hw_status)
4977 memset(tp->hw_status, 0, TG3_HW_STATUS_SIZE);
4978 if (tp->hw_stats)
4979 memset(tp->hw_stats, 0, sizeof(struct tg3_hw_stats));
4980
1da177e4
LT
4981 return err;
4982}
4983
4984/* tp->lock is held. */
4985static int tg3_nvram_lock(struct tg3 *tp)
4986{
4987 if (tp->tg3_flags & TG3_FLAG_NVRAM) {
4988 int i;
4989
ec41c7df
MC
4990 if (tp->nvram_lock_cnt == 0) {
4991 tw32(NVRAM_SWARB, SWARB_REQ_SET1);
4992 for (i = 0; i < 8000; i++) {
4993 if (tr32(NVRAM_SWARB) & SWARB_GNT1)
4994 break;
4995 udelay(20);
4996 }
4997 if (i == 8000) {
4998 tw32(NVRAM_SWARB, SWARB_REQ_CLR1);
4999 return -ENODEV;
5000 }
1da177e4 5001 }
ec41c7df 5002 tp->nvram_lock_cnt++;
1da177e4
LT
5003 }
5004 return 0;
5005}
5006
5007/* tp->lock is held. */
5008static void tg3_nvram_unlock(struct tg3 *tp)
5009{
ec41c7df
MC
5010 if (tp->tg3_flags & TG3_FLAG_NVRAM) {
5011 if (tp->nvram_lock_cnt > 0)
5012 tp->nvram_lock_cnt--;
5013 if (tp->nvram_lock_cnt == 0)
5014 tw32_f(NVRAM_SWARB, SWARB_REQ_CLR1);
5015 }
1da177e4
LT
5016}
5017
e6af301b
MC
5018/* tp->lock is held. */
5019static void tg3_enable_nvram_access(struct tg3 *tp)
5020{
5021 if ((tp->tg3_flags2 & TG3_FLG2_5750_PLUS) &&
5022 !(tp->tg3_flags2 & TG3_FLG2_PROTECTED_NVRAM)) {
5023 u32 nvaccess = tr32(NVRAM_ACCESS);
5024
5025 tw32(NVRAM_ACCESS, nvaccess | ACCESS_ENABLE);
5026 }
5027}
5028
5029/* tp->lock is held. */
5030static void tg3_disable_nvram_access(struct tg3 *tp)
5031{
5032 if ((tp->tg3_flags2 & TG3_FLG2_5750_PLUS) &&
5033 !(tp->tg3_flags2 & TG3_FLG2_PROTECTED_NVRAM)) {
5034 u32 nvaccess = tr32(NVRAM_ACCESS);
5035
5036 tw32(NVRAM_ACCESS, nvaccess & ~ACCESS_ENABLE);
5037 }
5038}
5039
0d3031d9
MC
5040static void tg3_ape_send_event(struct tg3 *tp, u32 event)
5041{
5042 int i;
5043 u32 apedata;
5044
5045 apedata = tg3_ape_read32(tp, TG3_APE_SEG_SIG);
5046 if (apedata != APE_SEG_SIG_MAGIC)
5047 return;
5048
5049 apedata = tg3_ape_read32(tp, TG3_APE_FW_STATUS);
5050 if (apedata != APE_FW_STATUS_READY)
5051 return;
5052
5053 /* Wait for up to 1 millisecond for APE to service previous event. */
5054 for (i = 0; i < 10; i++) {
5055 if (tg3_ape_lock(tp, TG3_APE_LOCK_MEM))
5056 return;
5057
5058 apedata = tg3_ape_read32(tp, TG3_APE_EVENT_STATUS);
5059
5060 if (!(apedata & APE_EVENT_STATUS_EVENT_PENDING))
5061 tg3_ape_write32(tp, TG3_APE_EVENT_STATUS,
5062 event | APE_EVENT_STATUS_EVENT_PENDING);
5063
5064 tg3_ape_unlock(tp, TG3_APE_LOCK_MEM);
5065
5066 if (!(apedata & APE_EVENT_STATUS_EVENT_PENDING))
5067 break;
5068
5069 udelay(100);
5070 }
5071
5072 if (!(apedata & APE_EVENT_STATUS_EVENT_PENDING))
5073 tg3_ape_write32(tp, TG3_APE_EVENT, APE_EVENT_1);
5074}
5075
5076static void tg3_ape_driver_state_change(struct tg3 *tp, int kind)
5077{
5078 u32 event;
5079 u32 apedata;
5080
5081 if (!(tp->tg3_flags3 & TG3_FLG3_ENABLE_APE))
5082 return;
5083
5084 switch (kind) {
5085 case RESET_KIND_INIT:
5086 tg3_ape_write32(tp, TG3_APE_HOST_SEG_SIG,
5087 APE_HOST_SEG_SIG_MAGIC);
5088 tg3_ape_write32(tp, TG3_APE_HOST_SEG_LEN,
5089 APE_HOST_SEG_LEN_MAGIC);
5090 apedata = tg3_ape_read32(tp, TG3_APE_HOST_INIT_COUNT);
5091 tg3_ape_write32(tp, TG3_APE_HOST_INIT_COUNT, ++apedata);
5092 tg3_ape_write32(tp, TG3_APE_HOST_DRIVER_ID,
5093 APE_HOST_DRIVER_ID_MAGIC);
5094 tg3_ape_write32(tp, TG3_APE_HOST_BEHAVIOR,
5095 APE_HOST_BEHAV_NO_PHYLOCK);
5096
5097 event = APE_EVENT_STATUS_STATE_START;
5098 break;
5099 case RESET_KIND_SHUTDOWN:
5100 event = APE_EVENT_STATUS_STATE_UNLOAD;
5101 break;
5102 case RESET_KIND_SUSPEND:
5103 event = APE_EVENT_STATUS_STATE_SUSPEND;
5104 break;
5105 default:
5106 return;
5107 }
5108
5109 event |= APE_EVENT_STATUS_DRIVER_EVNT | APE_EVENT_STATUS_STATE_CHNGE;
5110
5111 tg3_ape_send_event(tp, event);
5112}
5113
1da177e4
LT
5114/* tp->lock is held. */
5115static void tg3_write_sig_pre_reset(struct tg3 *tp, int kind)
5116{
f49639e6
DM
5117 tg3_write_mem(tp, NIC_SRAM_FIRMWARE_MBOX,
5118 NIC_SRAM_FIRMWARE_MBOX_MAGIC1);
1da177e4
LT
5119
5120 if (tp->tg3_flags2 & TG3_FLG2_ASF_NEW_HANDSHAKE) {
5121 switch (kind) {
5122 case RESET_KIND_INIT:
5123 tg3_write_mem(tp, NIC_SRAM_FW_DRV_STATE_MBOX,
5124 DRV_STATE_START);
5125 break;
5126
5127 case RESET_KIND_SHUTDOWN:
5128 tg3_write_mem(tp, NIC_SRAM_FW_DRV_STATE_MBOX,
5129 DRV_STATE_UNLOAD);
5130 break;
5131
5132 case RESET_KIND_SUSPEND:
5133 tg3_write_mem(tp, NIC_SRAM_FW_DRV_STATE_MBOX,
5134 DRV_STATE_SUSPEND);
5135 break;
5136
5137 default:
5138 break;
5139 };
5140 }
0d3031d9
MC
5141
5142 if (kind == RESET_KIND_INIT ||
5143 kind == RESET_KIND_SUSPEND)
5144 tg3_ape_driver_state_change(tp, kind);
1da177e4
LT
5145}
5146
5147/* tp->lock is held. */
5148static void tg3_write_sig_post_reset(struct tg3 *tp, int kind)
5149{
5150 if (tp->tg3_flags2 & TG3_FLG2_ASF_NEW_HANDSHAKE) {
5151 switch (kind) {
5152 case RESET_KIND_INIT:
5153 tg3_write_mem(tp, NIC_SRAM_FW_DRV_STATE_MBOX,
5154 DRV_STATE_START_DONE);
5155 break;
5156
5157 case RESET_KIND_SHUTDOWN:
5158 tg3_write_mem(tp, NIC_SRAM_FW_DRV_STATE_MBOX,
5159 DRV_STATE_UNLOAD_DONE);
5160 break;
5161
5162 default:
5163 break;
5164 };
5165 }
0d3031d9
MC
5166
5167 if (kind == RESET_KIND_SHUTDOWN)
5168 tg3_ape_driver_state_change(tp, kind);
1da177e4
LT
5169}
5170
5171/* tp->lock is held. */
5172static void tg3_write_sig_legacy(struct tg3 *tp, int kind)
5173{
5174 if (tp->tg3_flags & TG3_FLAG_ENABLE_ASF) {
5175 switch (kind) {
5176 case RESET_KIND_INIT:
5177 tg3_write_mem(tp, NIC_SRAM_FW_DRV_STATE_MBOX,
5178 DRV_STATE_START);
5179 break;
5180
5181 case RESET_KIND_SHUTDOWN:
5182 tg3_write_mem(tp, NIC_SRAM_FW_DRV_STATE_MBOX,
5183 DRV_STATE_UNLOAD);
5184 break;
5185
5186 case RESET_KIND_SUSPEND:
5187 tg3_write_mem(tp, NIC_SRAM_FW_DRV_STATE_MBOX,
5188 DRV_STATE_SUSPEND);
5189 break;
5190
5191 default:
5192 break;
5193 };
5194 }
5195}
5196
7a6f4369
MC
5197static int tg3_poll_fw(struct tg3 *tp)
5198{
5199 int i;
5200 u32 val;
5201
b5d3772c 5202 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) {
0ccead18
GZ
5203 /* Wait up to 20ms for init done. */
5204 for (i = 0; i < 200; i++) {
b5d3772c
MC
5205 if (tr32(VCPU_STATUS) & VCPU_STATUS_INIT_DONE)
5206 return 0;
0ccead18 5207 udelay(100);
b5d3772c
MC
5208 }
5209 return -ENODEV;
5210 }
5211
7a6f4369
MC
5212 /* Wait for firmware initialization to complete. */
5213 for (i = 0; i < 100000; i++) {
5214 tg3_read_mem(tp, NIC_SRAM_FIRMWARE_MBOX, &val);
5215 if (val == ~NIC_SRAM_FIRMWARE_MBOX_MAGIC1)
5216 break;
5217 udelay(10);
5218 }
5219
5220 /* Chip might not be fitted with firmware. Some Sun onboard
5221 * parts are configured like that. So don't signal the timeout
5222 * of the above loop as an error, but do report the lack of
5223 * running firmware once.
5224 */
5225 if (i >= 100000 &&
5226 !(tp->tg3_flags2 & TG3_FLG2_NO_FWARE_REPORTED)) {
5227 tp->tg3_flags2 |= TG3_FLG2_NO_FWARE_REPORTED;
5228
5229 printk(KERN_INFO PFX "%s: No firmware running.\n",
5230 tp->dev->name);
5231 }
5232
5233 return 0;
5234}
5235
ee6a99b5
MC
5236/* Save PCI command register before chip reset */
5237static void tg3_save_pci_state(struct tg3 *tp)
5238{
8a6eac90 5239 pci_read_config_word(tp->pdev, PCI_COMMAND, &tp->pci_cmd);
ee6a99b5
MC
5240}
5241
5242/* Restore PCI state after chip reset */
5243static void tg3_restore_pci_state(struct tg3 *tp)
5244{
5245 u32 val;
5246
5247 /* Re-enable indirect register accesses. */
5248 pci_write_config_dword(tp->pdev, TG3PCI_MISC_HOST_CTRL,
5249 tp->misc_host_ctrl);
5250
5251 /* Set MAX PCI retry to zero. */
5252 val = (PCISTATE_ROM_ENABLE | PCISTATE_ROM_RETRY_ENABLE);
5253 if (tp->pci_chip_rev_id == CHIPREV_ID_5704_A0 &&
5254 (tp->tg3_flags & TG3_FLAG_PCIX_MODE))
5255 val |= PCISTATE_RETRY_SAME_DMA;
0d3031d9
MC
5256 /* Allow reads and writes to the APE register and memory space. */
5257 if (tp->tg3_flags3 & TG3_FLG3_ENABLE_APE)
5258 val |= PCISTATE_ALLOW_APE_CTLSPC_WR |
5259 PCISTATE_ALLOW_APE_SHMEM_WR;
ee6a99b5
MC
5260 pci_write_config_dword(tp->pdev, TG3PCI_PCISTATE, val);
5261
8a6eac90 5262 pci_write_config_word(tp->pdev, PCI_COMMAND, tp->pci_cmd);
ee6a99b5 5263
5f5c51e3
MC
5264 if (tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS)
5265 pcie_set_readrq(tp->pdev, 4096);
5266 else {
114342f2
MC
5267 pci_write_config_byte(tp->pdev, PCI_CACHE_LINE_SIZE,
5268 tp->pci_cacheline_sz);
5269 pci_write_config_byte(tp->pdev, PCI_LATENCY_TIMER,
5270 tp->pci_lat_timer);
5271 }
5f5c51e3 5272
ee6a99b5 5273 /* Make sure PCI-X relaxed ordering bit is clear. */
9974a356
MC
5274 if (tp->pcix_cap) {
5275 u16 pcix_cmd;
5276
5277 pci_read_config_word(tp->pdev, tp->pcix_cap + PCI_X_CMD,
5278 &pcix_cmd);
5279 pcix_cmd &= ~PCI_X_CMD_ERO;
5280 pci_write_config_word(tp->pdev, tp->pcix_cap + PCI_X_CMD,
5281 pcix_cmd);
5282 }
ee6a99b5
MC
5283
5284 if (tp->tg3_flags2 & TG3_FLG2_5780_CLASS) {
ee6a99b5
MC
5285
5286 /* Chip reset on 5780 will reset MSI enable bit,
5287 * so need to restore it.
5288 */
5289 if (tp->tg3_flags2 & TG3_FLG2_USING_MSI) {
5290 u16 ctrl;
5291
5292 pci_read_config_word(tp->pdev,
5293 tp->msi_cap + PCI_MSI_FLAGS,
5294 &ctrl);
5295 pci_write_config_word(tp->pdev,
5296 tp->msi_cap + PCI_MSI_FLAGS,
5297 ctrl | PCI_MSI_FLAGS_ENABLE);
5298 val = tr32(MSGINT_MODE);
5299 tw32(MSGINT_MODE, val | MSGINT_MODE_ENABLE);
5300 }
5301 }
5302}
5303
1da177e4
LT
5304static void tg3_stop_fw(struct tg3 *);
5305
5306/* tp->lock is held. */
5307static int tg3_chip_reset(struct tg3 *tp)
5308{
5309 u32 val;
1ee582d8 5310 void (*write_op)(struct tg3 *, u32, u32);
7a6f4369 5311 int err;
1da177e4 5312
f49639e6
DM
5313 tg3_nvram_lock(tp);
5314
5315 /* No matching tg3_nvram_unlock() after this because
5316 * chip reset below will undo the nvram lock.
5317 */
5318 tp->nvram_lock_cnt = 0;
1da177e4 5319
ee6a99b5
MC
5320 /* GRC_MISC_CFG core clock reset will clear the memory
5321 * enable bit in PCI register 4 and the MSI enable bit
5322 * on some chips, so we save relevant registers here.
5323 */
5324 tg3_save_pci_state(tp);
5325
d9ab5ad1 5326 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5752 ||
af36e6b6 5327 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 ||
d30cdd28 5328 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787 ||
9936bcf6
MC
5329 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5784 ||
5330 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5761)
d9ab5ad1
MC
5331 tw32(GRC_FASTBOOT_PC, 0);
5332
1da177e4
LT
5333 /*
5334 * We must avoid the readl() that normally takes place.
5335 * It locks machines, causes machine checks, and other
5336 * fun things. So, temporarily disable the 5701
5337 * hardware workaround, while we do the reset.
5338 */
1ee582d8
MC
5339 write_op = tp->write32;
5340 if (write_op == tg3_write_flush_reg32)
5341 tp->write32 = tg3_write32;
1da177e4 5342
d18edcb2
MC
5343 /* Prevent the irq handler from reading or writing PCI registers
5344 * during chip reset when the memory enable bit in the PCI command
5345 * register may be cleared. The chip does not generate interrupt
5346 * at this time, but the irq handler may still be called due to irq
5347 * sharing or irqpoll.
5348 */
5349 tp->tg3_flags |= TG3_FLAG_CHIP_RESETTING;
b8fa2f3a
MC
5350 if (tp->hw_status) {
5351 tp->hw_status->status = 0;
5352 tp->hw_status->status_tag = 0;
5353 }
d18edcb2
MC
5354 tp->last_tag = 0;
5355 smp_mb();
5356 synchronize_irq(tp->pdev->irq);
5357
1da177e4
LT
5358 /* do the reset */
5359 val = GRC_MISC_CFG_CORECLK_RESET;
5360
5361 if (tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS) {
5362 if (tr32(0x7e2c) == 0x60) {
5363 tw32(0x7e2c, 0x20);
5364 }
5365 if (tp->pci_chip_rev_id != CHIPREV_ID_5750_A0) {
5366 tw32(GRC_MISC_CFG, (1 << 29));
5367 val |= (1 << 29);
5368 }
5369 }
5370
b5d3772c
MC
5371 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) {
5372 tw32(VCPU_STATUS, tr32(VCPU_STATUS) | VCPU_STATUS_DRV_RESET);
5373 tw32(GRC_VCPU_EXT_CTRL,
5374 tr32(GRC_VCPU_EXT_CTRL) & ~GRC_VCPU_EXT_CTRL_HALT_CPU);
5375 }
5376
1da177e4
LT
5377 if (tp->tg3_flags2 & TG3_FLG2_5705_PLUS)
5378 val |= GRC_MISC_CFG_KEEP_GPHY_POWER;
5379 tw32(GRC_MISC_CFG, val);
5380
1ee582d8
MC
5381 /* restore 5701 hardware bug workaround write method */
5382 tp->write32 = write_op;
1da177e4
LT
5383
5384 /* Unfortunately, we have to delay before the PCI read back.
5385 * Some 575X chips even will not respond to a PCI cfg access
5386 * when the reset command is given to the chip.
5387 *
5388 * How do these hardware designers expect things to work
5389 * properly if the PCI write is posted for a long period
5390 * of time? It is always necessary to have some method by
5391 * which a register read back can occur to push the write
5392 * out which does the reset.
5393 *
5394 * For most tg3 variants the trick below was working.
5395 * Ho hum...
5396 */
5397 udelay(120);
5398
5399 /* Flush PCI posted writes. The normal MMIO registers
5400 * are inaccessible at this time so this is the only
5401 * way to make this reliably (actually, this is no longer
5402 * the case, see above). I tried to use indirect
5403 * register read/write but this upset some 5701 variants.
5404 */
5405 pci_read_config_dword(tp->pdev, PCI_COMMAND, &val);
5406
5407 udelay(120);
5408
5409 if (tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS) {
5410 if (tp->pci_chip_rev_id == CHIPREV_ID_5750_A0) {
5411 int i;
5412 u32 cfg_val;
5413
5414 /* Wait for link training to complete. */
5415 for (i = 0; i < 5000; i++)
5416 udelay(100);
5417
5418 pci_read_config_dword(tp->pdev, 0xc4, &cfg_val);
5419 pci_write_config_dword(tp->pdev, 0xc4,
5420 cfg_val | (1 << 15));
5421 }
5422 /* Set PCIE max payload size and clear error status. */
5423 pci_write_config_dword(tp->pdev, 0xd8, 0xf5000);
5424 }
5425
ee6a99b5 5426 tg3_restore_pci_state(tp);
1da177e4 5427
d18edcb2
MC
5428 tp->tg3_flags &= ~TG3_FLAG_CHIP_RESETTING;
5429
ee6a99b5
MC
5430 val = 0;
5431 if (tp->tg3_flags2 & TG3_FLG2_5780_CLASS)
4cf78e4f 5432 val = tr32(MEMARB_MODE);
ee6a99b5 5433 tw32(MEMARB_MODE, val | MEMARB_MODE_ENABLE);
1da177e4
LT
5434
5435 if (tp->pci_chip_rev_id == CHIPREV_ID_5750_A3) {
5436 tg3_stop_fw(tp);
5437 tw32(0x5000, 0x400);
5438 }
5439
5440 tw32(GRC_MODE, tp->grc_mode);
5441
5442 if (tp->pci_chip_rev_id == CHIPREV_ID_5705_A0) {
ab0049b4 5443 val = tr32(0xc4);
1da177e4
LT
5444
5445 tw32(0xc4, val | (1 << 15));
5446 }
5447
5448 if ((tp->nic_sram_data_cfg & NIC_SRAM_DATA_CFG_MINI_PCI) != 0 &&
5449 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) {
5450 tp->pci_clock_ctrl |= CLOCK_CTRL_CLKRUN_OENABLE;
5451 if (tp->pci_chip_rev_id == CHIPREV_ID_5705_A0)
5452 tp->pci_clock_ctrl |= CLOCK_CTRL_FORCE_CLKRUN;
5453 tw32(TG3PCI_CLOCK_CTRL, tp->pci_clock_ctrl);
5454 }
5455
5456 if (tp->tg3_flags2 & TG3_FLG2_PHY_SERDES) {
5457 tp->mac_mode = MAC_MODE_PORT_MODE_TBI;
5458 tw32_f(MAC_MODE, tp->mac_mode);
747e8f8b
MC
5459 } else if (tp->tg3_flags2 & TG3_FLG2_MII_SERDES) {
5460 tp->mac_mode = MAC_MODE_PORT_MODE_GMII;
5461 tw32_f(MAC_MODE, tp->mac_mode);
1da177e4
LT
5462 } else
5463 tw32_f(MAC_MODE, 0);
5464 udelay(40);
5465
7a6f4369
MC
5466 err = tg3_poll_fw(tp);
5467 if (err)
5468 return err;
1da177e4
LT
5469
5470 if ((tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS) &&
5471 tp->pci_chip_rev_id != CHIPREV_ID_5750_A0) {
ab0049b4 5472 val = tr32(0x7c00);
1da177e4
LT
5473
5474 tw32(0x7c00, val | (1 << 25));
5475 }
5476
5477 /* Reprobe ASF enable state. */
5478 tp->tg3_flags &= ~TG3_FLAG_ENABLE_ASF;
5479 tp->tg3_flags2 &= ~TG3_FLG2_ASF_NEW_HANDSHAKE;
5480 tg3_read_mem(tp, NIC_SRAM_DATA_SIG, &val);
5481 if (val == NIC_SRAM_DATA_SIG_MAGIC) {
5482 u32 nic_cfg;
5483
5484 tg3_read_mem(tp, NIC_SRAM_DATA_CFG, &nic_cfg);
5485 if (nic_cfg & NIC_SRAM_DATA_CFG_ASF_ENABLE) {
5486 tp->tg3_flags |= TG3_FLAG_ENABLE_ASF;
cbf46853 5487 if (tp->tg3_flags2 & TG3_FLG2_5750_PLUS)
1da177e4
LT
5488 tp->tg3_flags2 |= TG3_FLG2_ASF_NEW_HANDSHAKE;
5489 }
5490 }
5491
5492 return 0;
5493}
5494
5495/* tp->lock is held. */
5496static void tg3_stop_fw(struct tg3 *tp)
5497{
0d3031d9
MC
5498 if ((tp->tg3_flags & TG3_FLAG_ENABLE_ASF) &&
5499 !(tp->tg3_flags3 & TG3_FLG3_ENABLE_APE)) {
1da177e4
LT
5500 u32 val;
5501 int i;
5502
5503 tg3_write_mem(tp, NIC_SRAM_FW_CMD_MBOX, FWCMD_NICDRV_PAUSE_FW);
5504 val = tr32(GRC_RX_CPU_EVENT);
5505 val |= (1 << 14);
5506 tw32(GRC_RX_CPU_EVENT, val);
5507
5508 /* Wait for RX cpu to ACK the event. */
5509 for (i = 0; i < 100; i++) {
5510 if (!(tr32(GRC_RX_CPU_EVENT) & (1 << 14)))
5511 break;
5512 udelay(1);
5513 }
5514 }
5515}
5516
5517/* tp->lock is held. */
944d980e 5518static int tg3_halt(struct tg3 *tp, int kind, int silent)
1da177e4
LT
5519{
5520 int err;
5521
5522 tg3_stop_fw(tp);
5523
944d980e 5524 tg3_write_sig_pre_reset(tp, kind);
1da177e4 5525
b3b7d6be 5526 tg3_abort_hw(tp, silent);
1da177e4
LT
5527 err = tg3_chip_reset(tp);
5528
944d980e
MC
5529 tg3_write_sig_legacy(tp, kind);
5530 tg3_write_sig_post_reset(tp, kind);
1da177e4
LT
5531
5532 if (err)
5533 return err;
5534
5535 return 0;
5536}
5537
5538#define TG3_FW_RELEASE_MAJOR 0x0
5539#define TG3_FW_RELASE_MINOR 0x0
5540#define TG3_FW_RELEASE_FIX 0x0
5541#define TG3_FW_START_ADDR 0x08000000
5542#define TG3_FW_TEXT_ADDR 0x08000000
5543#define TG3_FW_TEXT_LEN 0x9c0
5544#define TG3_FW_RODATA_ADDR 0x080009c0
5545#define TG3_FW_RODATA_LEN 0x60
5546#define TG3_FW_DATA_ADDR 0x08000a40
5547#define TG3_FW_DATA_LEN 0x20
5548#define TG3_FW_SBSS_ADDR 0x08000a60
5549#define TG3_FW_SBSS_LEN 0xc
5550#define TG3_FW_BSS_ADDR 0x08000a70
5551#define TG3_FW_BSS_LEN 0x10
5552
50da859d 5553static const u32 tg3FwText[(TG3_FW_TEXT_LEN / sizeof(u32)) + 1] = {
1da177e4
LT
5554 0x00000000, 0x10000003, 0x00000000, 0x0000000d, 0x0000000d, 0x3c1d0800,
5555 0x37bd3ffc, 0x03a0f021, 0x3c100800, 0x26100000, 0x0e000018, 0x00000000,
5556 0x0000000d, 0x3c1d0800, 0x37bd3ffc, 0x03a0f021, 0x3c100800, 0x26100034,
5557 0x0e00021c, 0x00000000, 0x0000000d, 0x00000000, 0x00000000, 0x00000000,
5558 0x27bdffe0, 0x3c1cc000, 0xafbf0018, 0xaf80680c, 0x0e00004c, 0x241b2105,
5559 0x97850000, 0x97870002, 0x9782002c, 0x9783002e, 0x3c040800, 0x248409c0,
5560 0xafa00014, 0x00021400, 0x00621825, 0x00052c00, 0xafa30010, 0x8f860010,
5561 0x00e52825, 0x0e000060, 0x24070102, 0x3c02ac00, 0x34420100, 0x3c03ac01,
5562 0x34630100, 0xaf820490, 0x3c02ffff, 0xaf820494, 0xaf830498, 0xaf82049c,
5563 0x24020001, 0xaf825ce0, 0x0e00003f, 0xaf825d00, 0x0e000140, 0x00000000,
5564 0x8fbf0018, 0x03e00008, 0x27bd0020, 0x2402ffff, 0xaf825404, 0x8f835400,
5565 0x34630400, 0xaf835400, 0xaf825404, 0x3c020800, 0x24420034, 0xaf82541c,
5566 0x03e00008, 0xaf805400, 0x00000000, 0x00000000, 0x3c020800, 0x34423000,
5567 0x3c030800, 0x34633000, 0x3c040800, 0x348437ff, 0x3c010800, 0xac220a64,
5568 0x24020040, 0x3c010800, 0xac220a68, 0x3c010800, 0xac200a60, 0xac600000,
5569 0x24630004, 0x0083102b, 0x5040fffd, 0xac600000, 0x03e00008, 0x00000000,
5570 0x00804821, 0x8faa0010, 0x3c020800, 0x8c420a60, 0x3c040800, 0x8c840a68,
5571 0x8fab0014, 0x24430001, 0x0044102b, 0x3c010800, 0xac230a60, 0x14400003,
5572 0x00004021, 0x3c010800, 0xac200a60, 0x3c020800, 0x8c420a60, 0x3c030800,
5573 0x8c630a64, 0x91240000, 0x00021140, 0x00431021, 0x00481021, 0x25080001,
5574 0xa0440000, 0x29020008, 0x1440fff4, 0x25290001, 0x3c020800, 0x8c420a60,
5575 0x3c030800, 0x8c630a64, 0x8f84680c, 0x00021140, 0x00431021, 0xac440008,
5576 0xac45000c, 0xac460010, 0xac470014, 0xac4a0018, 0x03e00008, 0xac4b001c,
5577 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
5578 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
5579 0, 0, 0, 0, 0, 0,
5580 0x02000008, 0x00000000, 0x0a0001e3, 0x3c0a0001, 0x0a0001e3, 0x3c0a0002,
5581 0x0a0001e3, 0x00000000, 0x0a0001e3, 0x00000000, 0x0a0001e3, 0x00000000,
5582 0x0a0001e3, 0x00000000, 0x0a0001e3, 0x00000000, 0x0a0001e3, 0x00000000,
5583 0x0a0001e3, 0x00000000, 0x0a0001e3, 0x00000000, 0x0a0001e3, 0x00000000,
5584 0x0a0001e3, 0x3c0a0007, 0x0a0001e3, 0x3c0a0008, 0x0a0001e3, 0x3c0a0009,
5585 0x0a0001e3, 0x00000000, 0x0a0001e3, 0x00000000, 0x0a0001e3, 0x3c0a000b,
5586 0x0a0001e3, 0x3c0a000c, 0x0a0001e3, 0x3c0a000d, 0x0a0001e3, 0x00000000,
5587 0x0a0001e3, 0x00000000, 0x0a0001e3, 0x3c0a000e, 0x0a0001e3, 0x00000000,
5588 0x0a0001e3, 0x00000000, 0x0a0001e3, 0x00000000, 0x0a0001e3, 0x00000000,
5589 0x0a0001e3, 0x00000000, 0x0a0001e3, 0x00000000, 0x0a0001e3, 0x00000000,
5590 0x0a0001e3, 0x00000000, 0x0a0001e3, 0x3c0a0013, 0x0a0001e3, 0x3c0a0014,
5591 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
5592 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
5593 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
5594 0x27bdffe0, 0x00001821, 0x00001021, 0xafbf0018, 0xafb10014, 0xafb00010,
5595 0x3c010800, 0x00220821, 0xac200a70, 0x3c010800, 0x00220821, 0xac200a74,
5596 0x3c010800, 0x00220821, 0xac200a78, 0x24630001, 0x1860fff5, 0x2442000c,
5597 0x24110001, 0x8f906810, 0x32020004, 0x14400005, 0x24040001, 0x3c020800,
5598 0x8c420a78, 0x18400003, 0x00002021, 0x0e000182, 0x00000000, 0x32020001,
5599 0x10400003, 0x00000000, 0x0e000169, 0x00000000, 0x0a000153, 0xaf915028,
5600 0x8fbf0018, 0x8fb10014, 0x8fb00010, 0x03e00008, 0x27bd0020, 0x3c050800,
5601 0x8ca50a70, 0x3c060800, 0x8cc60a80, 0x3c070800, 0x8ce70a78, 0x27bdffe0,
5602 0x3c040800, 0x248409d0, 0xafbf0018, 0xafa00010, 0x0e000060, 0xafa00014,
5603 0x0e00017b, 0x00002021, 0x8fbf0018, 0x03e00008, 0x27bd0020, 0x24020001,
5604 0x8f836810, 0x00821004, 0x00021027, 0x00621824, 0x03e00008, 0xaf836810,
5605 0x27bdffd8, 0xafbf0024, 0x1080002e, 0xafb00020, 0x8f825cec, 0xafa20018,
5606 0x8f825cec, 0x3c100800, 0x26100a78, 0xafa2001c, 0x34028000, 0xaf825cec,
5607 0x8e020000, 0x18400016, 0x00000000, 0x3c020800, 0x94420a74, 0x8fa3001c,
5608 0x000221c0, 0xac830004, 0x8fa2001c, 0x3c010800, 0x0e000201, 0xac220a74,
5609 0x10400005, 0x00000000, 0x8e020000, 0x24420001, 0x0a0001df, 0xae020000,
5610 0x3c020800, 0x8c420a70, 0x00021c02, 0x000321c0, 0x0a0001c5, 0xafa2001c,
5611 0x0e000201, 0x00000000, 0x1040001f, 0x00000000, 0x8e020000, 0x8fa3001c,
5612 0x24420001, 0x3c010800, 0xac230a70, 0x3c010800, 0xac230a74, 0x0a0001df,
5613 0xae020000, 0x3c100800, 0x26100a78, 0x8e020000, 0x18400028, 0x00000000,
5614 0x0e000201, 0x00000000, 0x14400024, 0x00000000, 0x8e020000, 0x3c030800,
5615 0x8c630a70, 0x2442ffff, 0xafa3001c, 0x18400006, 0xae020000, 0x00031402,
5616 0x000221c0, 0x8c820004, 0x3c010800, 0xac220a70, 0x97a2001e, 0x2442ff00,
5617 0x2c420300, 0x1440000b, 0x24024000, 0x3c040800, 0x248409dc, 0xafa00010,
5618 0xafa00014, 0x8fa6001c, 0x24050008, 0x0e000060, 0x00003821, 0x0a0001df,
5619 0x00000000, 0xaf825cf8, 0x3c020800, 0x8c420a40, 0x8fa3001c, 0x24420001,
5620 0xaf835cf8, 0x3c010800, 0xac220a40, 0x8fbf0024, 0x8fb00020, 0x03e00008,
5621 0x27bd0028, 0x27bdffe0, 0x3c040800, 0x248409e8, 0x00002821, 0x00003021,
5622 0x00003821, 0xafbf0018, 0xafa00010, 0x0e000060, 0xafa00014, 0x8fbf0018,
5623 0x03e00008, 0x27bd0020, 0x8f82680c, 0x8f85680c, 0x00021827, 0x0003182b,
5624 0x00031823, 0x00431024, 0x00441021, 0x00a2282b, 0x10a00006, 0x00000000,
5625 0x00401821, 0x8f82680c, 0x0043102b, 0x1440fffd, 0x00000000, 0x03e00008,
5626 0x00000000, 0x3c040800, 0x8c840000, 0x3c030800, 0x8c630a40, 0x0064102b,
5627 0x54400002, 0x00831023, 0x00641023, 0x2c420008, 0x03e00008, 0x38420001,
5628 0x27bdffe0, 0x00802821, 0x3c040800, 0x24840a00, 0x00003021, 0x00003821,
5629 0xafbf0018, 0xafa00010, 0x0e000060, 0xafa00014, 0x0a000216, 0x00000000,
5630 0x8fbf0018, 0x03e00008, 0x27bd0020, 0x00000000, 0x27bdffe0, 0x3c1cc000,
5631 0xafbf0018, 0x0e00004c, 0xaf80680c, 0x3c040800, 0x24840a10, 0x03802821,
5632 0x00003021, 0x00003821, 0xafa00010, 0x0e000060, 0xafa00014, 0x2402ffff,
5633 0xaf825404, 0x3c0200aa, 0x0e000234, 0xaf825434, 0x8fbf0018, 0x03e00008,
5634 0x27bd0020, 0x00000000, 0x00000000, 0x00000000, 0x27bdffe8, 0xafb00010,
5635 0x24100001, 0xafbf0014, 0x3c01c003, 0xac200000, 0x8f826810, 0x30422000,
5636 0x10400003, 0x00000000, 0x0e000246, 0x00000000, 0x0a00023a, 0xaf905428,
5637 0x8fbf0014, 0x8fb00010, 0x03e00008, 0x27bd0018, 0x27bdfff8, 0x8f845d0c,
5638 0x3c0200ff, 0x3c030800, 0x8c630a50, 0x3442fff8, 0x00821024, 0x1043001e,
5639 0x3c0500ff, 0x34a5fff8, 0x3c06c003, 0x3c074000, 0x00851824, 0x8c620010,
5640 0x3c010800, 0xac230a50, 0x30420008, 0x10400005, 0x00871025, 0x8cc20000,
5641 0x24420001, 0xacc20000, 0x00871025, 0xaf825d0c, 0x8fa20000, 0x24420001,
5642 0xafa20000, 0x8fa20000, 0x8fa20000, 0x24420001, 0xafa20000, 0x8fa20000,
5643 0x8f845d0c, 0x3c030800, 0x8c630a50, 0x00851024, 0x1443ffe8, 0x00851824,
5644 0x27bd0008, 0x03e00008, 0x00000000, 0x00000000, 0x00000000
5645};
5646
50da859d 5647static const u32 tg3FwRodata[(TG3_FW_RODATA_LEN / sizeof(u32)) + 1] = {
1da177e4
LT
5648 0x35373031, 0x726c7341, 0x00000000, 0x00000000, 0x53774576, 0x656e7430,
5649 0x00000000, 0x726c7045, 0x76656e74, 0x31000000, 0x556e6b6e, 0x45766e74,
5650 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x66617461, 0x6c457272,
5651 0x00000000, 0x00000000, 0x4d61696e, 0x43707542, 0x00000000, 0x00000000,
5652 0x00000000
5653};
5654
5655#if 0 /* All zeros, don't eat up space with it. */
5656u32 tg3FwData[(TG3_FW_DATA_LEN / sizeof(u32)) + 1] = {
5657 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
5658 0x00000000, 0x00000000, 0x00000000, 0x00000000
5659};
5660#endif
5661
5662#define RX_CPU_SCRATCH_BASE 0x30000
5663#define RX_CPU_SCRATCH_SIZE 0x04000
5664#define TX_CPU_SCRATCH_BASE 0x34000
5665#define TX_CPU_SCRATCH_SIZE 0x04000
5666
5667/* tp->lock is held. */
5668static int tg3_halt_cpu(struct tg3 *tp, u32 offset)
5669{
5670 int i;
5671
5d9428de
ES
5672 BUG_ON(offset == TX_CPU_BASE &&
5673 (tp->tg3_flags2 & TG3_FLG2_5705_PLUS));
1da177e4 5674
b5d3772c
MC
5675 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) {
5676 u32 val = tr32(GRC_VCPU_EXT_CTRL);
5677
5678 tw32(GRC_VCPU_EXT_CTRL, val | GRC_VCPU_EXT_CTRL_HALT_CPU);
5679 return 0;
5680 }
1da177e4
LT
5681 if (offset == RX_CPU_BASE) {
5682 for (i = 0; i < 10000; i++) {
5683 tw32(offset + CPU_STATE, 0xffffffff);
5684 tw32(offset + CPU_MODE, CPU_MODE_HALT);
5685 if (tr32(offset + CPU_MODE) & CPU_MODE_HALT)
5686 break;
5687 }
5688
5689 tw32(offset + CPU_STATE, 0xffffffff);
5690 tw32_f(offset + CPU_MODE, CPU_MODE_HALT);
5691 udelay(10);
5692 } else {
5693 for (i = 0; i < 10000; i++) {
5694 tw32(offset + CPU_STATE, 0xffffffff);
5695 tw32(offset + CPU_MODE, CPU_MODE_HALT);
5696 if (tr32(offset + CPU_MODE) & CPU_MODE_HALT)
5697 break;
5698 }
5699 }
5700
5701 if (i >= 10000) {
5702 printk(KERN_ERR PFX "tg3_reset_cpu timed out for %s, "
5703 "and %s CPU\n",
5704 tp->dev->name,
5705 (offset == RX_CPU_BASE ? "RX" : "TX"));
5706 return -ENODEV;
5707 }
ec41c7df
MC
5708
5709 /* Clear firmware's nvram arbitration. */
5710 if (tp->tg3_flags & TG3_FLAG_NVRAM)
5711 tw32(NVRAM_SWARB, SWARB_REQ_CLR0);
1da177e4
LT
5712 return 0;
5713}
5714
5715struct fw_info {
5716 unsigned int text_base;
5717 unsigned int text_len;
50da859d 5718 const u32 *text_data;
1da177e4
LT
5719 unsigned int rodata_base;
5720 unsigned int rodata_len;
50da859d 5721 const u32 *rodata_data;
1da177e4
LT
5722 unsigned int data_base;
5723 unsigned int data_len;
50da859d 5724 const u32 *data_data;
1da177e4
LT
5725};
5726
5727/* tp->lock is held. */
5728static int tg3_load_firmware_cpu(struct tg3 *tp, u32 cpu_base, u32 cpu_scratch_base,
5729 int cpu_scratch_size, struct fw_info *info)
5730{
ec41c7df 5731 int err, lock_err, i;
1da177e4
LT
5732 void (*write_op)(struct tg3 *, u32, u32);
5733
5734 if (cpu_base == TX_CPU_BASE &&
5735 (tp->tg3_flags2 & TG3_FLG2_5705_PLUS)) {
5736 printk(KERN_ERR PFX "tg3_load_firmware_cpu: Trying to load "
5737 "TX cpu firmware on %s which is 5705.\n",
5738 tp->dev->name);
5739 return -EINVAL;
5740 }
5741
5742 if (tp->tg3_flags2 & TG3_FLG2_5705_PLUS)
5743 write_op = tg3_write_mem;
5744 else
5745 write_op = tg3_write_indirect_reg32;
5746
1b628151
MC
5747 /* It is possible that bootcode is still loading at this point.
5748 * Get the nvram lock first before halting the cpu.
5749 */
ec41c7df 5750 lock_err = tg3_nvram_lock(tp);
1da177e4 5751 err = tg3_halt_cpu(tp, cpu_base);
ec41c7df
MC
5752 if (!lock_err)
5753 tg3_nvram_unlock(tp);
1da177e4
LT
5754 if (err)
5755 goto out;
5756
5757 for (i = 0; i < cpu_scratch_size; i += sizeof(u32))
5758 write_op(tp, cpu_scratch_base + i, 0);
5759 tw32(cpu_base + CPU_STATE, 0xffffffff);
5760 tw32(cpu_base + CPU_MODE, tr32(cpu_base+CPU_MODE)|CPU_MODE_HALT);
5761 for (i = 0; i < (info->text_len / sizeof(u32)); i++)
5762 write_op(tp, (cpu_scratch_base +
5763 (info->text_base & 0xffff) +
5764 (i * sizeof(u32))),
5765 (info->text_data ?
5766 info->text_data[i] : 0));
5767 for (i = 0; i < (info->rodata_len / sizeof(u32)); i++)
5768 write_op(tp, (cpu_scratch_base +
5769 (info->rodata_base & 0xffff) +
5770 (i * sizeof(u32))),
5771 (info->rodata_data ?
5772 info->rodata_data[i] : 0));
5773 for (i = 0; i < (info->data_len / sizeof(u32)); i++)
5774 write_op(tp, (cpu_scratch_base +
5775 (info->data_base & 0xffff) +
5776 (i * sizeof(u32))),
5777 (info->data_data ?
5778 info->data_data[i] : 0));
5779
5780 err = 0;
5781
5782out:
1da177e4
LT
5783 return err;
5784}
5785
5786/* tp->lock is held. */
5787static int tg3_load_5701_a0_firmware_fix(struct tg3 *tp)
5788{
5789 struct fw_info info;
5790 int err, i;
5791
5792 info.text_base = TG3_FW_TEXT_ADDR;
5793 info.text_len = TG3_FW_TEXT_LEN;
5794 info.text_data = &tg3FwText[0];
5795 info.rodata_base = TG3_FW_RODATA_ADDR;
5796 info.rodata_len = TG3_FW_RODATA_LEN;
5797 info.rodata_data = &tg3FwRodata[0];
5798 info.data_base = TG3_FW_DATA_ADDR;
5799 info.data_len = TG3_FW_DATA_LEN;
5800 info.data_data = NULL;
5801
5802 err = tg3_load_firmware_cpu(tp, RX_CPU_BASE,
5803 RX_CPU_SCRATCH_BASE, RX_CPU_SCRATCH_SIZE,
5804 &info);
5805 if (err)
5806 return err;
5807
5808 err = tg3_load_firmware_cpu(tp, TX_CPU_BASE,
5809 TX_CPU_SCRATCH_BASE, TX_CPU_SCRATCH_SIZE,
5810 &info);
5811 if (err)
5812 return err;
5813
5814 /* Now startup only the RX cpu. */
5815 tw32(RX_CPU_BASE + CPU_STATE, 0xffffffff);
5816 tw32_f(RX_CPU_BASE + CPU_PC, TG3_FW_TEXT_ADDR);
5817
5818 for (i = 0; i < 5; i++) {
5819 if (tr32(RX_CPU_BASE + CPU_PC) == TG3_FW_TEXT_ADDR)
5820 break;
5821 tw32(RX_CPU_BASE + CPU_STATE, 0xffffffff);
5822 tw32(RX_CPU_BASE + CPU_MODE, CPU_MODE_HALT);
5823 tw32_f(RX_CPU_BASE + CPU_PC, TG3_FW_TEXT_ADDR);
5824 udelay(1000);
5825 }
5826 if (i >= 5) {
5827 printk(KERN_ERR PFX "tg3_load_firmware fails for %s "
5828 "to set RX CPU PC, is %08x should be %08x\n",
5829 tp->dev->name, tr32(RX_CPU_BASE + CPU_PC),
5830 TG3_FW_TEXT_ADDR);
5831 return -ENODEV;
5832 }
5833 tw32(RX_CPU_BASE + CPU_STATE, 0xffffffff);
5834 tw32_f(RX_CPU_BASE + CPU_MODE, 0x00000000);
5835
5836 return 0;
5837}
5838
1da177e4
LT
5839
5840#define TG3_TSO_FW_RELEASE_MAJOR 0x1
5841#define TG3_TSO_FW_RELASE_MINOR 0x6
5842#define TG3_TSO_FW_RELEASE_FIX 0x0
5843#define TG3_TSO_FW_START_ADDR 0x08000000
5844#define TG3_TSO_FW_TEXT_ADDR 0x08000000
5845#define TG3_TSO_FW_TEXT_LEN 0x1aa0
5846#define TG3_TSO_FW_RODATA_ADDR 0x08001aa0
5847#define TG3_TSO_FW_RODATA_LEN 0x60
5848#define TG3_TSO_FW_DATA_ADDR 0x08001b20
5849#define TG3_TSO_FW_DATA_LEN 0x30
5850#define TG3_TSO_FW_SBSS_ADDR 0x08001b50
5851#define TG3_TSO_FW_SBSS_LEN 0x2c
5852#define TG3_TSO_FW_BSS_ADDR 0x08001b80
5853#define TG3_TSO_FW_BSS_LEN 0x894
5854
50da859d 5855static const u32 tg3TsoFwText[(TG3_TSO_FW_TEXT_LEN / 4) + 1] = {
1da177e4
LT
5856 0x0e000003, 0x00000000, 0x08001b24, 0x00000000, 0x10000003, 0x00000000,
5857 0x0000000d, 0x0000000d, 0x3c1d0800, 0x37bd4000, 0x03a0f021, 0x3c100800,
5858 0x26100000, 0x0e000010, 0x00000000, 0x0000000d, 0x27bdffe0, 0x3c04fefe,
5859 0xafbf0018, 0x0e0005d8, 0x34840002, 0x0e000668, 0x00000000, 0x3c030800,
5860 0x90631b68, 0x24020002, 0x3c040800, 0x24841aac, 0x14620003, 0x24050001,
5861 0x3c040800, 0x24841aa0, 0x24060006, 0x00003821, 0xafa00010, 0x0e00067c,
5862 0xafa00014, 0x8f625c50, 0x34420001, 0xaf625c50, 0x8f625c90, 0x34420001,
5863 0xaf625c90, 0x2402ffff, 0x0e000034, 0xaf625404, 0x8fbf0018, 0x03e00008,
5864 0x27bd0020, 0x00000000, 0x00000000, 0x00000000, 0x27bdffe0, 0xafbf001c,
5865 0xafb20018, 0xafb10014, 0x0e00005b, 0xafb00010, 0x24120002, 0x24110001,
5866 0x8f706820, 0x32020100, 0x10400003, 0x00000000, 0x0e0000bb, 0x00000000,
5867 0x8f706820, 0x32022000, 0x10400004, 0x32020001, 0x0e0001f0, 0x24040001,
5868 0x32020001, 0x10400003, 0x00000000, 0x0e0000a3, 0x00000000, 0x3c020800,
5869 0x90421b98, 0x14520003, 0x00000000, 0x0e0004c0, 0x00000000, 0x0a00003c,
5870 0xaf715028, 0x8fbf001c, 0x8fb20018, 0x8fb10014, 0x8fb00010, 0x03e00008,
5871 0x27bd0020, 0x27bdffe0, 0x3c040800, 0x24841ac0, 0x00002821, 0x00003021,
5872 0x00003821, 0xafbf0018, 0xafa00010, 0x0e00067c, 0xafa00014, 0x3c040800,
5873 0x248423d8, 0xa4800000, 0x3c010800, 0xa0201b98, 0x3c010800, 0xac201b9c,
5874 0x3c010800, 0xac201ba0, 0x3c010800, 0xac201ba4, 0x3c010800, 0xac201bac,
5875 0x3c010800, 0xac201bb8, 0x3c010800, 0xac201bbc, 0x8f624434, 0x3c010800,
5876 0xac221b88, 0x8f624438, 0x3c010800, 0xac221b8c, 0x8f624410, 0xac80f7a8,
5877 0x3c010800, 0xac201b84, 0x3c010800, 0xac2023e0, 0x3c010800, 0xac2023c8,
5878 0x3c010800, 0xac2023cc, 0x3c010800, 0xac202400, 0x3c010800, 0xac221b90,
5879 0x8f620068, 0x24030007, 0x00021702, 0x10430005, 0x00000000, 0x8f620068,
5880 0x00021702, 0x14400004, 0x24020001, 0x3c010800, 0x0a000097, 0xac20240c,
5881 0xac820034, 0x3c040800, 0x24841acc, 0x3c050800, 0x8ca5240c, 0x00003021,
5882 0x00003821, 0xafa00010, 0x0e00067c, 0xafa00014, 0x8fbf0018, 0x03e00008,
5883 0x27bd0020, 0x27bdffe0, 0x3c040800, 0x24841ad8, 0x00002821, 0x00003021,
5884 0x00003821, 0xafbf0018, 0xafa00010, 0x0e00067c, 0xafa00014, 0x0e00005b,
5885 0x00000000, 0x0e0000b4, 0x00002021, 0x8fbf0018, 0x03e00008, 0x27bd0020,
5886 0x24020001, 0x8f636820, 0x00821004, 0x00021027, 0x00621824, 0x03e00008,
5887 0xaf636820, 0x27bdffd0, 0xafbf002c, 0xafb60028, 0xafb50024, 0xafb40020,
5888 0xafb3001c, 0xafb20018, 0xafb10014, 0xafb00010, 0x8f675c5c, 0x3c030800,
5889 0x24631bbc, 0x8c620000, 0x14470005, 0x3c0200ff, 0x3c020800, 0x90421b98,
5890 0x14400119, 0x3c0200ff, 0x3442fff8, 0x00e28824, 0xac670000, 0x00111902,
5891 0x306300ff, 0x30e20003, 0x000211c0, 0x00622825, 0x00a04021, 0x00071602,
5892 0x3c030800, 0x90631b98, 0x3044000f, 0x14600036, 0x00804821, 0x24020001,
5893 0x3c010800, 0xa0221b98, 0x00051100, 0x00821025, 0x3c010800, 0xac201b9c,
5894 0x3c010800, 0xac201ba0, 0x3c010800, 0xac201ba4, 0x3c010800, 0xac201bac,
5895 0x3c010800, 0xac201bb8, 0x3c010800, 0xac201bb0, 0x3c010800, 0xac201bb4,
5896 0x3c010800, 0xa42223d8, 0x9622000c, 0x30437fff, 0x3c010800, 0xa4222410,
5897 0x30428000, 0x3c010800, 0xa4231bc6, 0x10400005, 0x24020001, 0x3c010800,
5898 0xac2223f4, 0x0a000102, 0x2406003e, 0x24060036, 0x3c010800, 0xac2023f4,
5899 0x9622000a, 0x3c030800, 0x94631bc6, 0x3c010800, 0xac2023f0, 0x3c010800,
5900 0xac2023f8, 0x00021302, 0x00021080, 0x00c21021, 0x00621821, 0x3c010800,
5901 0xa42223d0, 0x3c010800, 0x0a000115, 0xa4231b96, 0x9622000c, 0x3c010800,
5902 0xa42223ec, 0x3c040800, 0x24841b9c, 0x8c820000, 0x00021100, 0x3c010800,
5903 0x00220821, 0xac311bc8, 0x8c820000, 0x00021100, 0x3c010800, 0x00220821,
5904 0xac271bcc, 0x8c820000, 0x25030001, 0x306601ff, 0x00021100, 0x3c010800,
5905 0x00220821, 0xac261bd0, 0x8c820000, 0x00021100, 0x3c010800, 0x00220821,
5906 0xac291bd4, 0x96230008, 0x3c020800, 0x8c421bac, 0x00432821, 0x3c010800,
5907 0xac251bac, 0x9622000a, 0x30420004, 0x14400018, 0x00061100, 0x8f630c14,
5908 0x3063000f, 0x2c620002, 0x1440000b, 0x3c02c000, 0x8f630c14, 0x3c020800,
5909 0x8c421b40, 0x3063000f, 0x24420001, 0x3c010800, 0xac221b40, 0x2c620002,
5910 0x1040fff7, 0x3c02c000, 0x00e21825, 0xaf635c5c, 0x8f625c50, 0x30420002,
5911 0x10400014, 0x00000000, 0x0a000147, 0x00000000, 0x3c030800, 0x8c631b80,
5912 0x3c040800, 0x94841b94, 0x01221025, 0x3c010800, 0xa42223da, 0x24020001,
5913 0x3c010800, 0xac221bb8, 0x24630001, 0x0085202a, 0x3c010800, 0x10800003,
5914 0xac231b80, 0x3c010800, 0xa4251b94, 0x3c060800, 0x24c61b9c, 0x8cc20000,
5915 0x24420001, 0xacc20000, 0x28420080, 0x14400005, 0x00000000, 0x0e000656,
5916 0x24040002, 0x0a0001e6, 0x00000000, 0x3c020800, 0x8c421bb8, 0x10400078,
5917 0x24020001, 0x3c050800, 0x90a51b98, 0x14a20072, 0x00000000, 0x3c150800,
5918 0x96b51b96, 0x3c040800, 0x8c841bac, 0x32a3ffff, 0x0083102a, 0x1440006c,
5919 0x00000000, 0x14830003, 0x00000000, 0x3c010800, 0xac2523f0, 0x1060005c,
5920 0x00009021, 0x24d60004, 0x0060a021, 0x24d30014, 0x8ec20000, 0x00028100,
5921 0x3c110800, 0x02308821, 0x0e000625, 0x8e311bc8, 0x00402821, 0x10a00054,
5922 0x00000000, 0x9628000a, 0x31020040, 0x10400005, 0x2407180c, 0x8e22000c,
5923 0x2407188c, 0x00021400, 0xaca20018, 0x3c030800, 0x00701821, 0x8c631bd0,
5924 0x3c020800, 0x00501021, 0x8c421bd4, 0x00031d00, 0x00021400, 0x00621825,
5925 0xaca30014, 0x8ec30004, 0x96220008, 0x00432023, 0x3242ffff, 0x3083ffff,
5926 0x00431021, 0x0282102a, 0x14400002, 0x02b23023, 0x00803021, 0x8e620000,
5927 0x30c4ffff, 0x00441021, 0xae620000, 0x8e220000, 0xaca20000, 0x8e220004,
5928 0x8e63fff4, 0x00431021, 0xaca20004, 0xa4a6000e, 0x8e62fff4, 0x00441021,
5929 0xae62fff4, 0x96230008, 0x0043102a, 0x14400005, 0x02469021, 0x8e62fff0,
5930 0xae60fff4, 0x24420001, 0xae62fff0, 0xaca00008, 0x3242ffff, 0x14540008,
5931 0x24020305, 0x31020080, 0x54400001, 0x34e70010, 0x24020905, 0xa4a2000c,
5932 0x0a0001cb, 0x34e70020, 0xa4a2000c, 0x3c020800, 0x8c4223f0, 0x10400003,
5933 0x3c024b65, 0x0a0001d3, 0x34427654, 0x3c02b49a, 0x344289ab, 0xaca2001c,
5934 0x30e2ffff, 0xaca20010, 0x0e0005a2, 0x00a02021, 0x3242ffff, 0x0054102b,
5935 0x1440ffa9, 0x00000000, 0x24020002, 0x3c010800, 0x0a0001e6, 0xa0221b98,
5936 0x8ec2083c, 0x24420001, 0x0a0001e6, 0xaec2083c, 0x0e0004c0, 0x00000000,
5937 0x8fbf002c, 0x8fb60028, 0x8fb50024, 0x8fb40020, 0x8fb3001c, 0x8fb20018,
5938 0x8fb10014, 0x8fb00010, 0x03e00008, 0x27bd0030, 0x27bdffd0, 0xafbf0028,
5939 0xafb30024, 0xafb20020, 0xafb1001c, 0xafb00018, 0x8f725c9c, 0x3c0200ff,
5940 0x3442fff8, 0x3c070800, 0x24e71bb4, 0x02428824, 0x9623000e, 0x8ce20000,
5941 0x00431021, 0xace20000, 0x8e220010, 0x30420020, 0x14400011, 0x00809821,
5942 0x0e00063b, 0x02202021, 0x3c02c000, 0x02421825, 0xaf635c9c, 0x8f625c90,
5943 0x30420002, 0x1040011e, 0x00000000, 0xaf635c9c, 0x8f625c90, 0x30420002,
5944 0x10400119, 0x00000000, 0x0a00020d, 0x00000000, 0x8e240008, 0x8e230014,
5945 0x00041402, 0x000231c0, 0x00031502, 0x304201ff, 0x2442ffff, 0x3042007f,
5946 0x00031942, 0x30637800, 0x00021100, 0x24424000, 0x00624821, 0x9522000a,
5947 0x3084ffff, 0x30420008, 0x104000b0, 0x000429c0, 0x3c020800, 0x8c422400,
5948 0x14400024, 0x24c50008, 0x94c20014, 0x3c010800, 0xa42223d0, 0x8cc40010,
5949 0x00041402, 0x3c010800, 0xa42223d2, 0x3c010800, 0xa42423d4, 0x94c2000e,
5950 0x3083ffff, 0x00431023, 0x3c010800, 0xac222408, 0x94c2001a, 0x3c010800,
5951 0xac262400, 0x3c010800, 0xac322404, 0x3c010800, 0xac2223fc, 0x3c02c000,
5952 0x02421825, 0xaf635c9c, 0x8f625c90, 0x30420002, 0x104000e5, 0x00000000,
5953 0xaf635c9c, 0x8f625c90, 0x30420002, 0x104000e0, 0x00000000, 0x0a000246,
5954 0x00000000, 0x94c2000e, 0x3c030800, 0x946323d4, 0x00434023, 0x3103ffff,
5955 0x2c620008, 0x1040001c, 0x00000000, 0x94c20014, 0x24420028, 0x00a22821,
5956 0x00031042, 0x1840000b, 0x00002021, 0x24e60848, 0x00403821, 0x94a30000,
5957 0x8cc20000, 0x24840001, 0x00431021, 0xacc20000, 0x0087102a, 0x1440fff9,
5958 0x24a50002, 0x31020001, 0x1040001f, 0x3c024000, 0x3c040800, 0x248423fc,
5959 0xa0a00001, 0x94a30000, 0x8c820000, 0x00431021, 0x0a000285, 0xac820000,
5960 0x8f626800, 0x3c030010, 0x00431024, 0x10400009, 0x00000000, 0x94c2001a,
5961 0x3c030800, 0x8c6323fc, 0x00431021, 0x3c010800, 0xac2223fc, 0x0a000286,
5962 0x3c024000, 0x94c2001a, 0x94c4001c, 0x3c030800, 0x8c6323fc, 0x00441023,
5963 0x00621821, 0x3c010800, 0xac2323fc, 0x3c024000, 0x02421825, 0xaf635c9c,
5964 0x8f625c90, 0x30420002, 0x1440fffc, 0x00000000, 0x9522000a, 0x30420010,
5965 0x1040009b, 0x00000000, 0x3c030800, 0x946323d4, 0x3c070800, 0x24e72400,
5966 0x8ce40000, 0x8f626800, 0x24630030, 0x00832821, 0x3c030010, 0x00431024,
5967 0x1440000a, 0x00000000, 0x94a20004, 0x3c040800, 0x8c842408, 0x3c030800,
5968 0x8c6323fc, 0x00441023, 0x00621821, 0x3c010800, 0xac2323fc, 0x3c040800,
5969 0x8c8423fc, 0x00041c02, 0x3082ffff, 0x00622021, 0x00041402, 0x00822021,
5970 0x00041027, 0xa4a20006, 0x3c030800, 0x8c632404, 0x3c0200ff, 0x3442fff8,
5971 0x00628824, 0x96220008, 0x24050001, 0x24034000, 0x000231c0, 0x00801021,
5972 0xa4c2001a, 0xa4c0001c, 0xace00000, 0x3c010800, 0xac251b60, 0xaf635cb8,
5973 0x8f625cb0, 0x30420002, 0x10400003, 0x00000000, 0x3c010800, 0xac201b60,
5974 0x8e220008, 0xaf625cb8, 0x8f625cb0, 0x30420002, 0x10400003, 0x00000000,
5975 0x3c010800, 0xac201b60, 0x3c020800, 0x8c421b60, 0x1040ffec, 0x00000000,
5976 0x3c040800, 0x0e00063b, 0x8c842404, 0x0a00032a, 0x00000000, 0x3c030800,
5977 0x90631b98, 0x24020002, 0x14620003, 0x3c034b65, 0x0a0002e1, 0x00008021,
5978 0x8e22001c, 0x34637654, 0x10430002, 0x24100002, 0x24100001, 0x00c02021,
5979 0x0e000350, 0x02003021, 0x24020003, 0x3c010800, 0xa0221b98, 0x24020002,
5980 0x1202000a, 0x24020001, 0x3c030800, 0x8c6323f0, 0x10620006, 0x00000000,
5981 0x3c020800, 0x944223d8, 0x00021400, 0x0a00031f, 0xae220014, 0x3c040800,
5982 0x248423da, 0x94820000, 0x00021400, 0xae220014, 0x3c020800, 0x8c421bbc,
5983 0x3c03c000, 0x3c010800, 0xa0201b98, 0x00431025, 0xaf625c5c, 0x8f625c50,
5984 0x30420002, 0x10400009, 0x00000000, 0x2484f7e2, 0x8c820000, 0x00431025,
5985 0xaf625c5c, 0x8f625c50, 0x30420002, 0x1440fffa, 0x00000000, 0x3c020800,
5986 0x24421b84, 0x8c430000, 0x24630001, 0xac430000, 0x8f630c14, 0x3063000f,
5987 0x2c620002, 0x1440000c, 0x3c024000, 0x8f630c14, 0x3c020800, 0x8c421b40,
5988 0x3063000f, 0x24420001, 0x3c010800, 0xac221b40, 0x2c620002, 0x1040fff7,
5989 0x00000000, 0x3c024000, 0x02421825, 0xaf635c9c, 0x8f625c90, 0x30420002,
5990 0x1440fffc, 0x00000000, 0x12600003, 0x00000000, 0x0e0004c0, 0x00000000,
5991 0x8fbf0028, 0x8fb30024, 0x8fb20020, 0x8fb1001c, 0x8fb00018, 0x03e00008,
5992 0x27bd0030, 0x8f634450, 0x3c040800, 0x24841b88, 0x8c820000, 0x00031c02,
5993 0x0043102b, 0x14400007, 0x3c038000, 0x8c840004, 0x8f624450, 0x00021c02,
5994 0x0083102b, 0x1040fffc, 0x3c038000, 0xaf634444, 0x8f624444, 0x00431024,
5995 0x1440fffd, 0x00000000, 0x8f624448, 0x03e00008, 0x3042ffff, 0x3c024000,
5996 0x00822025, 0xaf645c38, 0x8f625c30, 0x30420002, 0x1440fffc, 0x00000000,
5997 0x03e00008, 0x00000000, 0x27bdffe0, 0x00805821, 0x14c00011, 0x256e0008,
5998 0x3c020800, 0x8c4223f4, 0x10400007, 0x24020016, 0x3c010800, 0xa42223d2,
5999 0x2402002a, 0x3c010800, 0x0a000364, 0xa42223d4, 0x8d670010, 0x00071402,
6000 0x3c010800, 0xa42223d2, 0x3c010800, 0xa42723d4, 0x3c040800, 0x948423d4,
6001 0x3c030800, 0x946323d2, 0x95cf0006, 0x3c020800, 0x944223d0, 0x00832023,
6002 0x01e2c023, 0x3065ffff, 0x24a20028, 0x01c24821, 0x3082ffff, 0x14c0001a,
6003 0x01226021, 0x9582000c, 0x3042003f, 0x3c010800, 0xa42223d6, 0x95820004,
6004 0x95830006, 0x3c010800, 0xac2023e4, 0x3c010800, 0xac2023e8, 0x00021400,
6005 0x00431025, 0x3c010800, 0xac221bc0, 0x95220004, 0x3c010800, 0xa4221bc4,
6006 0x95230002, 0x01e51023, 0x0043102a, 0x10400010, 0x24020001, 0x3c010800,
6007 0x0a000398, 0xac2223f8, 0x3c030800, 0x8c6323e8, 0x3c020800, 0x94421bc4,
6008 0x00431021, 0xa5220004, 0x3c020800, 0x94421bc0, 0xa5820004, 0x3c020800,
6009 0x8c421bc0, 0xa5820006, 0x3c020800, 0x8c4223f0, 0x3c0d0800, 0x8dad23e4,
6010 0x3c0a0800, 0x144000e5, 0x8d4a23e8, 0x3c020800, 0x94421bc4, 0x004a1821,
6011 0x3063ffff, 0x0062182b, 0x24020002, 0x10c2000d, 0x01435023, 0x3c020800,
6012 0x944223d6, 0x30420009, 0x10400008, 0x00000000, 0x9582000c, 0x3042fff6,
6013 0xa582000c, 0x3c020800, 0x944223d6, 0x30420009, 0x01a26823, 0x3c020800,
6014 0x8c4223f8, 0x1040004a, 0x01203821, 0x3c020800, 0x944223d2, 0x00004021,
6015 0xa520000a, 0x01e21023, 0xa5220002, 0x3082ffff, 0x00021042, 0x18400008,
6016 0x00003021, 0x00401821, 0x94e20000, 0x25080001, 0x00c23021, 0x0103102a,
6017 0x1440fffb, 0x24e70002, 0x00061c02, 0x30c2ffff, 0x00623021, 0x00061402,
6018 0x00c23021, 0x00c02821, 0x00061027, 0xa522000a, 0x00003021, 0x2527000c,
6019 0x00004021, 0x94e20000, 0x25080001, 0x00c23021, 0x2d020004, 0x1440fffb,
6020 0x24e70002, 0x95220002, 0x00004021, 0x91230009, 0x00442023, 0x01803821,
6021 0x3082ffff, 0xa4e00010, 0x00621821, 0x00021042, 0x18400010, 0x00c33021,
6022 0x00404821, 0x94e20000, 0x24e70002, 0x00c23021, 0x30e2007f, 0x14400006,
6023 0x25080001, 0x8d630000, 0x3c02007f, 0x3442ff80, 0x00625824, 0x25670008,
6024 0x0109102a, 0x1440fff3, 0x00000000, 0x30820001, 0x10400005, 0x00061c02,
6025 0xa0e00001, 0x94e20000, 0x00c23021, 0x00061c02, 0x30c2ffff, 0x00623021,
6026 0x00061402, 0x00c23021, 0x0a00047d, 0x30c6ffff, 0x24020002, 0x14c20081,
6027 0x00000000, 0x3c020800, 0x8c42240c, 0x14400007, 0x00000000, 0x3c020800,
6028 0x944223d2, 0x95230002, 0x01e21023, 0x10620077, 0x00000000, 0x3c020800,
6029 0x944223d2, 0x01e21023, 0xa5220002, 0x3c020800, 0x8c42240c, 0x1040001a,
6030 0x31e3ffff, 0x8dc70010, 0x3c020800, 0x94421b96, 0x00e04021, 0x00072c02,
6031 0x00aa2021, 0x00431023, 0x00823823, 0x00072402, 0x30e2ffff, 0x00823821,
6032 0x00071027, 0xa522000a, 0x3102ffff, 0x3c040800, 0x948423d4, 0x00453023,
6033 0x00e02821, 0x00641823, 0x006d1821, 0x00c33021, 0x00061c02, 0x30c2ffff,
6034 0x0a00047d, 0x00623021, 0x01203821, 0x00004021, 0x3082ffff, 0x00021042,
6035 0x18400008, 0x00003021, 0x00401821, 0x94e20000, 0x25080001, 0x00c23021,
6036 0x0103102a, 0x1440fffb, 0x24e70002, 0x00061c02, 0x30c2ffff, 0x00623021,
6037 0x00061402, 0x00c23021, 0x00c02821, 0x00061027, 0xa522000a, 0x00003021,
6038 0x2527000c, 0x00004021, 0x94e20000, 0x25080001, 0x00c23021, 0x2d020004,
6039 0x1440fffb, 0x24e70002, 0x95220002, 0x00004021, 0x91230009, 0x00442023,
6040 0x01803821, 0x3082ffff, 0xa4e00010, 0x3c040800, 0x948423d4, 0x00621821,
6041 0x00c33021, 0x00061c02, 0x30c2ffff, 0x00623021, 0x00061c02, 0x3c020800,
6042 0x944223d0, 0x00c34821, 0x00441023, 0x00021fc2, 0x00431021, 0x00021043,
6043 0x18400010, 0x00003021, 0x00402021, 0x94e20000, 0x24e70002, 0x00c23021,
6044 0x30e2007f, 0x14400006, 0x25080001, 0x8d630000, 0x3c02007f, 0x3442ff80,
6045 0x00625824, 0x25670008, 0x0104102a, 0x1440fff3, 0x00000000, 0x3c020800,
6046 0x944223ec, 0x00c23021, 0x3122ffff, 0x00c23021, 0x00061c02, 0x30c2ffff,
6047 0x00623021, 0x00061402, 0x00c23021, 0x00c04021, 0x00061027, 0xa5820010,
6048 0xadc00014, 0x0a00049d, 0xadc00000, 0x8dc70010, 0x00e04021, 0x11400007,
6049 0x00072c02, 0x00aa3021, 0x00061402, 0x30c3ffff, 0x00433021, 0x00061402,
6050 0x00c22821, 0x00051027, 0xa522000a, 0x3c030800, 0x946323d4, 0x3102ffff,
6051 0x01e21021, 0x00433023, 0x00cd3021, 0x00061c02, 0x30c2ffff, 0x00623021,
6052 0x00061402, 0x00c23021, 0x00c04021, 0x00061027, 0xa5820010, 0x3102ffff,
6053 0x00051c00, 0x00431025, 0xadc20010, 0x3c020800, 0x8c4223f4, 0x10400005,
6054 0x2de205eb, 0x14400002, 0x25e2fff2, 0x34028870, 0xa5c20034, 0x3c030800,
6055 0x246323e8, 0x8c620000, 0x24420001, 0xac620000, 0x3c040800, 0x8c8423e4,
6056 0x3c020800, 0x8c421bc0, 0x3303ffff, 0x00832021, 0x00431821, 0x0062102b,
6057 0x3c010800, 0xac2423e4, 0x10400003, 0x2482ffff, 0x3c010800, 0xac2223e4,
6058 0x3c010800, 0xac231bc0, 0x03e00008, 0x27bd0020, 0x27bdffb8, 0x3c050800,
6059 0x24a51b96, 0xafbf0044, 0xafbe0040, 0xafb7003c, 0xafb60038, 0xafb50034,
6060 0xafb40030, 0xafb3002c, 0xafb20028, 0xafb10024, 0xafb00020, 0x94a90000,
6061 0x3c020800, 0x944223d0, 0x3c030800, 0x8c631bb0, 0x3c040800, 0x8c841bac,
6062 0x01221023, 0x0064182a, 0xa7a9001e, 0x106000be, 0xa7a20016, 0x24be0022,
6063 0x97b6001e, 0x24b3001a, 0x24b70016, 0x8fc20000, 0x14400008, 0x00000000,
6064 0x8fc2fff8, 0x97a30016, 0x8fc4fff4, 0x00431021, 0x0082202a, 0x148000b0,
6065 0x00000000, 0x97d50818, 0x32a2ffff, 0x104000a3, 0x00009021, 0x0040a021,
6066 0x00008821, 0x0e000625, 0x00000000, 0x00403021, 0x14c00007, 0x00000000,
6067 0x3c020800, 0x8c4223dc, 0x24420001, 0x3c010800, 0x0a000596, 0xac2223dc,
6068 0x3c100800, 0x02118021, 0x8e101bc8, 0x9608000a, 0x31020040, 0x10400005,
6069 0x2407180c, 0x8e02000c, 0x2407188c, 0x00021400, 0xacc20018, 0x31020080,
6070 0x54400001, 0x34e70010, 0x3c020800, 0x00511021, 0x8c421bd0, 0x3c030800,
6071 0x00711821, 0x8c631bd4, 0x00021500, 0x00031c00, 0x00431025, 0xacc20014,
6072 0x96040008, 0x3242ffff, 0x00821021, 0x0282102a, 0x14400002, 0x02b22823,
6073 0x00802821, 0x8e020000, 0x02459021, 0xacc20000, 0x8e020004, 0x00c02021,
6074 0x26310010, 0xac820004, 0x30e2ffff, 0xac800008, 0xa485000e, 0xac820010,
6075 0x24020305, 0x0e0005a2, 0xa482000c, 0x3242ffff, 0x0054102b, 0x1440ffc5,
6076 0x3242ffff, 0x0a00058e, 0x00000000, 0x8e620000, 0x8e63fffc, 0x0043102a,
6077 0x10400067, 0x00000000, 0x8e62fff0, 0x00028900, 0x3c100800, 0x02118021,
6078 0x0e000625, 0x8e101bc8, 0x00403021, 0x14c00005, 0x00000000, 0x8e62082c,
6079 0x24420001, 0x0a000596, 0xae62082c, 0x9608000a, 0x31020040, 0x10400005,
6080 0x2407180c, 0x8e02000c, 0x2407188c, 0x00021400, 0xacc20018, 0x3c020800,
6081 0x00511021, 0x8c421bd0, 0x3c030800, 0x00711821, 0x8c631bd4, 0x00021500,
6082 0x00031c00, 0x00431025, 0xacc20014, 0x8e63fff4, 0x96020008, 0x00432023,
6083 0x3242ffff, 0x3083ffff, 0x00431021, 0x02c2102a, 0x10400003, 0x00802821,
6084 0x97a9001e, 0x01322823, 0x8e620000, 0x30a4ffff, 0x00441021, 0xae620000,
6085 0xa4c5000e, 0x8e020000, 0xacc20000, 0x8e020004, 0x8e63fff4, 0x00431021,
6086 0xacc20004, 0x8e63fff4, 0x96020008, 0x00641821, 0x0062102a, 0x14400006,
6087 0x02459021, 0x8e62fff0, 0xae60fff4, 0x24420001, 0x0a000571, 0xae62fff0,
6088 0xae63fff4, 0xacc00008, 0x3242ffff, 0x10560003, 0x31020004, 0x10400006,
6089 0x24020305, 0x31020080, 0x54400001, 0x34e70010, 0x34e70020, 0x24020905,
6090 0xa4c2000c, 0x8ee30000, 0x8ee20004, 0x14620007, 0x3c02b49a, 0x8ee20860,
6091 0x54400001, 0x34e70400, 0x3c024b65, 0x0a000588, 0x34427654, 0x344289ab,
6092 0xacc2001c, 0x30e2ffff, 0xacc20010, 0x0e0005a2, 0x00c02021, 0x3242ffff,
6093 0x0056102b, 0x1440ff9b, 0x00000000, 0x8e620000, 0x8e63fffc, 0x0043102a,
6094 0x1440ff48, 0x00000000, 0x8fbf0044, 0x8fbe0040, 0x8fb7003c, 0x8fb60038,
6095 0x8fb50034, 0x8fb40030, 0x8fb3002c, 0x8fb20028, 0x8fb10024, 0x8fb00020,
6096 0x03e00008, 0x27bd0048, 0x27bdffe8, 0xafbf0014, 0xafb00010, 0x8f624450,
6097 0x8f634410, 0x0a0005b1, 0x00808021, 0x8f626820, 0x30422000, 0x10400003,
6098 0x00000000, 0x0e0001f0, 0x00002021, 0x8f624450, 0x8f634410, 0x3042ffff,
6099 0x0043102b, 0x1440fff5, 0x00000000, 0x8f630c14, 0x3063000f, 0x2c620002,
6100 0x1440000b, 0x00000000, 0x8f630c14, 0x3c020800, 0x8c421b40, 0x3063000f,
6101 0x24420001, 0x3c010800, 0xac221b40, 0x2c620002, 0x1040fff7, 0x00000000,
6102 0xaf705c18, 0x8f625c10, 0x30420002, 0x10400009, 0x00000000, 0x8f626820,
6103 0x30422000, 0x1040fff8, 0x00000000, 0x0e0001f0, 0x00002021, 0x0a0005c4,
6104 0x00000000, 0x8fbf0014, 0x8fb00010, 0x03e00008, 0x27bd0018, 0x00000000,
6105 0x00000000, 0x00000000, 0x27bdffe8, 0x3c1bc000, 0xafbf0014, 0xafb00010,
6106 0xaf60680c, 0x8f626804, 0x34420082, 0xaf626804, 0x8f634000, 0x24020b50,
6107 0x3c010800, 0xac221b54, 0x24020b78, 0x3c010800, 0xac221b64, 0x34630002,
6108 0xaf634000, 0x0e000605, 0x00808021, 0x3c010800, 0xa0221b68, 0x304200ff,
6109 0x24030002, 0x14430005, 0x00000000, 0x3c020800, 0x8c421b54, 0x0a0005f8,
6110 0xac5000c0, 0x3c020800, 0x8c421b54, 0xac5000bc, 0x8f624434, 0x8f634438,
6111 0x8f644410, 0x3c010800, 0xac221b5c, 0x3c010800, 0xac231b6c, 0x3c010800,
6112 0xac241b58, 0x8fbf0014, 0x8fb00010, 0x03e00008, 0x27bd0018, 0x3c040800,
6113 0x8c870000, 0x3c03aa55, 0x3463aa55, 0x3c06c003, 0xac830000, 0x8cc20000,
6114 0x14430007, 0x24050002, 0x3c0355aa, 0x346355aa, 0xac830000, 0x8cc20000,
6115 0x50430001, 0x24050001, 0x3c020800, 0xac470000, 0x03e00008, 0x00a01021,
6116 0x27bdfff8, 0x18800009, 0x00002821, 0x8f63680c, 0x8f62680c, 0x1043fffe,
6117 0x00000000, 0x24a50001, 0x00a4102a, 0x1440fff9, 0x00000000, 0x03e00008,
6118 0x27bd0008, 0x8f634450, 0x3c020800, 0x8c421b5c, 0x00031c02, 0x0043102b,
6119 0x14400008, 0x3c038000, 0x3c040800, 0x8c841b6c, 0x8f624450, 0x00021c02,
6120 0x0083102b, 0x1040fffc, 0x3c038000, 0xaf634444, 0x8f624444, 0x00431024,
6121 0x1440fffd, 0x00000000, 0x8f624448, 0x03e00008, 0x3042ffff, 0x3082ffff,
6122 0x2442e000, 0x2c422001, 0x14400003, 0x3c024000, 0x0a000648, 0x2402ffff,
6123 0x00822025, 0xaf645c38, 0x8f625c30, 0x30420002, 0x1440fffc, 0x00001021,
6124 0x03e00008, 0x00000000, 0x8f624450, 0x3c030800, 0x8c631b58, 0x0a000651,
6125 0x3042ffff, 0x8f624450, 0x3042ffff, 0x0043102b, 0x1440fffc, 0x00000000,
6126 0x03e00008, 0x00000000, 0x27bdffe0, 0x00802821, 0x3c040800, 0x24841af0,
6127 0x00003021, 0x00003821, 0xafbf0018, 0xafa00010, 0x0e00067c, 0xafa00014,
6128 0x0a000660, 0x00000000, 0x8fbf0018, 0x03e00008, 0x27bd0020, 0x00000000,
6129 0x00000000, 0x00000000, 0x3c020800, 0x34423000, 0x3c030800, 0x34633000,
6130 0x3c040800, 0x348437ff, 0x3c010800, 0xac221b74, 0x24020040, 0x3c010800,
6131 0xac221b78, 0x3c010800, 0xac201b70, 0xac600000, 0x24630004, 0x0083102b,
6132 0x5040fffd, 0xac600000, 0x03e00008, 0x00000000, 0x00804821, 0x8faa0010,
6133 0x3c020800, 0x8c421b70, 0x3c040800, 0x8c841b78, 0x8fab0014, 0x24430001,
6134 0x0044102b, 0x3c010800, 0xac231b70, 0x14400003, 0x00004021, 0x3c010800,
6135 0xac201b70, 0x3c020800, 0x8c421b70, 0x3c030800, 0x8c631b74, 0x91240000,
6136 0x00021140, 0x00431021, 0x00481021, 0x25080001, 0xa0440000, 0x29020008,
6137 0x1440fff4, 0x25290001, 0x3c020800, 0x8c421b70, 0x3c030800, 0x8c631b74,
6138 0x8f64680c, 0x00021140, 0x00431021, 0xac440008, 0xac45000c, 0xac460010,
6139 0xac470014, 0xac4a0018, 0x03e00008, 0xac4b001c, 0x00000000, 0x00000000,
6140};
6141
50da859d 6142static const u32 tg3TsoFwRodata[] = {
1da177e4
LT
6143 0x4d61696e, 0x43707542, 0x00000000, 0x4d61696e, 0x43707541, 0x00000000,
6144 0x00000000, 0x00000000, 0x73746b6f, 0x66666c64, 0x496e0000, 0x73746b6f,
6145 0x66662a2a, 0x00000000, 0x53774576, 0x656e7430, 0x00000000, 0x00000000,
6146 0x00000000, 0x00000000, 0x66617461, 0x6c457272, 0x00000000, 0x00000000,
6147 0x00000000,
6148};
6149
50da859d 6150static const u32 tg3TsoFwData[] = {
1da177e4
LT
6151 0x00000000, 0x73746b6f, 0x66666c64, 0x5f76312e, 0x362e3000, 0x00000000,
6152 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
6153 0x00000000,
6154};
6155
6156/* 5705 needs a special version of the TSO firmware. */
6157#define TG3_TSO5_FW_RELEASE_MAJOR 0x1
6158#define TG3_TSO5_FW_RELASE_MINOR 0x2
6159#define TG3_TSO5_FW_RELEASE_FIX 0x0
6160#define TG3_TSO5_FW_START_ADDR 0x00010000
6161#define TG3_TSO5_FW_TEXT_ADDR 0x00010000
6162#define TG3_TSO5_FW_TEXT_LEN 0xe90
6163#define TG3_TSO5_FW_RODATA_ADDR 0x00010e90
6164#define TG3_TSO5_FW_RODATA_LEN 0x50
6165#define TG3_TSO5_FW_DATA_ADDR 0x00010f00
6166#define TG3_TSO5_FW_DATA_LEN 0x20
6167#define TG3_TSO5_FW_SBSS_ADDR 0x00010f20
6168#define TG3_TSO5_FW_SBSS_LEN 0x28
6169#define TG3_TSO5_FW_BSS_ADDR 0x00010f50
6170#define TG3_TSO5_FW_BSS_LEN 0x88
6171
50da859d 6172static const u32 tg3Tso5FwText[(TG3_TSO5_FW_TEXT_LEN / 4) + 1] = {
1da177e4
LT
6173 0x0c004003, 0x00000000, 0x00010f04, 0x00000000, 0x10000003, 0x00000000,
6174 0x0000000d, 0x0000000d, 0x3c1d0001, 0x37bde000, 0x03a0f021, 0x3c100001,
6175 0x26100000, 0x0c004010, 0x00000000, 0x0000000d, 0x27bdffe0, 0x3c04fefe,
6176 0xafbf0018, 0x0c0042e8, 0x34840002, 0x0c004364, 0x00000000, 0x3c030001,
6177 0x90630f34, 0x24020002, 0x3c040001, 0x24840e9c, 0x14620003, 0x24050001,
6178 0x3c040001, 0x24840e90, 0x24060002, 0x00003821, 0xafa00010, 0x0c004378,
6179 0xafa00014, 0x0c00402c, 0x00000000, 0x8fbf0018, 0x03e00008, 0x27bd0020,
6180 0x00000000, 0x00000000, 0x27bdffe0, 0xafbf001c, 0xafb20018, 0xafb10014,
6181 0x0c0042d4, 0xafb00010, 0x3c128000, 0x24110001, 0x8f706810, 0x32020400,
6182 0x10400007, 0x00000000, 0x8f641008, 0x00921024, 0x14400003, 0x00000000,
6183 0x0c004064, 0x00000000, 0x3c020001, 0x90420f56, 0x10510003, 0x32020200,
6184 0x1040fff1, 0x00000000, 0x0c0041b4, 0x00000000, 0x08004034, 0x00000000,
6185 0x8fbf001c, 0x8fb20018, 0x8fb10014, 0x8fb00010, 0x03e00008, 0x27bd0020,
6186 0x27bdffe0, 0x3c040001, 0x24840eb0, 0x00002821, 0x00003021, 0x00003821,
6187 0xafbf0018, 0xafa00010, 0x0c004378, 0xafa00014, 0x0000d021, 0x24020130,
6188 0xaf625000, 0x3c010001, 0xa4200f50, 0x3c010001, 0xa0200f57, 0x8fbf0018,
6189 0x03e00008, 0x27bd0020, 0x00000000, 0x00000000, 0x3c030001, 0x24630f60,
6190 0x90620000, 0x27bdfff0, 0x14400003, 0x0080c021, 0x08004073, 0x00004821,
6191 0x3c022000, 0x03021024, 0x10400003, 0x24090002, 0x08004073, 0xa0600000,
6192 0x24090001, 0x00181040, 0x30431f80, 0x346f8008, 0x1520004b, 0x25eb0028,
6193 0x3c040001, 0x00832021, 0x8c848010, 0x3c050001, 0x24a50f7a, 0x00041402,
6194 0xa0a20000, 0x3c010001, 0xa0240f7b, 0x3c020001, 0x00431021, 0x94428014,
6195 0x3c010001, 0xa0220f7c, 0x3c0c0001, 0x01836021, 0x8d8c8018, 0x304200ff,
6196 0x24420008, 0x000220c3, 0x24020001, 0x3c010001, 0xa0220f60, 0x0124102b,
6197 0x1040000c, 0x00003821, 0x24a6000e, 0x01602821, 0x8ca20000, 0x8ca30004,
6198 0x24a50008, 0x24e70001, 0xacc20000, 0xacc30004, 0x00e4102b, 0x1440fff8,
6199 0x24c60008, 0x00003821, 0x3c080001, 0x25080f7b, 0x91060000, 0x3c020001,
6200 0x90420f7c, 0x2503000d, 0x00c32821, 0x00461023, 0x00021fc2, 0x00431021,
6201 0x00021043, 0x1840000c, 0x00002021, 0x91020001, 0x00461023, 0x00021fc2,
6202 0x00431021, 0x00021843, 0x94a20000, 0x24e70001, 0x00822021, 0x00e3102a,
6203 0x1440fffb, 0x24a50002, 0x00041c02, 0x3082ffff, 0x00622021, 0x00041402,
6204 0x00822021, 0x3c02ffff, 0x01821024, 0x3083ffff, 0x00431025, 0x3c010001,
6205 0x080040fa, 0xac220f80, 0x3c050001, 0x24a50f7c, 0x90a20000, 0x3c0c0001,
6206 0x01836021, 0x8d8c8018, 0x000220c2, 0x1080000e, 0x00003821, 0x01603021,
6207 0x24a5000c, 0x8ca20000, 0x8ca30004, 0x24a50008, 0x24e70001, 0xacc20000,
6208 0xacc30004, 0x00e4102b, 0x1440fff8, 0x24c60008, 0x3c050001, 0x24a50f7c,
6209 0x90a20000, 0x30430007, 0x24020004, 0x10620011, 0x28620005, 0x10400005,
6210 0x24020002, 0x10620008, 0x000710c0, 0x080040fa, 0x00000000, 0x24020006,
6211 0x1062000e, 0x000710c0, 0x080040fa, 0x00000000, 0x00a21821, 0x9463000c,
6212 0x004b1021, 0x080040fa, 0xa4430000, 0x000710c0, 0x00a21821, 0x8c63000c,
6213 0x004b1021, 0x080040fa, 0xac430000, 0x00a21821, 0x8c63000c, 0x004b2021,
6214 0x00a21021, 0xac830000, 0x94420010, 0xa4820004, 0x95e70006, 0x3c020001,
6215 0x90420f7c, 0x3c030001, 0x90630f7a, 0x00e2c823, 0x3c020001, 0x90420f7b,
6216 0x24630028, 0x01e34021, 0x24420028, 0x15200012, 0x01e23021, 0x94c2000c,
6217 0x3c010001, 0xa4220f78, 0x94c20004, 0x94c30006, 0x3c010001, 0xa4200f76,
6218 0x3c010001, 0xa4200f72, 0x00021400, 0x00431025, 0x3c010001, 0xac220f6c,
6219 0x95020004, 0x3c010001, 0x08004124, 0xa4220f70, 0x3c020001, 0x94420f70,
6220 0x3c030001, 0x94630f72, 0x00431021, 0xa5020004, 0x3c020001, 0x94420f6c,
6221 0xa4c20004, 0x3c020001, 0x8c420f6c, 0xa4c20006, 0x3c040001, 0x94840f72,
6222 0x3c020001, 0x94420f70, 0x3c0a0001, 0x954a0f76, 0x00441821, 0x3063ffff,
6223 0x0062182a, 0x24020002, 0x1122000b, 0x00832023, 0x3c030001, 0x94630f78,
6224 0x30620009, 0x10400006, 0x3062fff6, 0xa4c2000c, 0x3c020001, 0x94420f78,
6225 0x30420009, 0x01425023, 0x24020001, 0x1122001b, 0x29220002, 0x50400005,
6226 0x24020002, 0x11200007, 0x31a2ffff, 0x08004197, 0x00000000, 0x1122001d,
6227 0x24020016, 0x08004197, 0x31a2ffff, 0x3c0e0001, 0x95ce0f80, 0x10800005,
6228 0x01806821, 0x01c42021, 0x00041c02, 0x3082ffff, 0x00627021, 0x000e1027,
6229 0xa502000a, 0x3c030001, 0x90630f7b, 0x31a2ffff, 0x00e21021, 0x0800418d,
6230 0x00432023, 0x3c020001, 0x94420f80, 0x00442021, 0x00041c02, 0x3082ffff,
6231 0x00622021, 0x00807021, 0x00041027, 0x08004185, 0xa502000a, 0x3c050001,
6232 0x24a50f7a, 0x90a30000, 0x14620002, 0x24e2fff2, 0xa5e20034, 0x90a20000,
6233 0x00e21023, 0xa5020002, 0x3c030001, 0x94630f80, 0x3c020001, 0x94420f5a,
6234 0x30e5ffff, 0x00641821, 0x00451023, 0x00622023, 0x00041c02, 0x3082ffff,
6235 0x00622021, 0x00041027, 0xa502000a, 0x3c030001, 0x90630f7c, 0x24620001,
6236 0x14a20005, 0x00807021, 0x01631021, 0x90420000, 0x08004185, 0x00026200,
6237 0x24620002, 0x14a20003, 0x306200fe, 0x004b1021, 0x944c0000, 0x3c020001,
6238 0x94420f82, 0x3183ffff, 0x3c040001, 0x90840f7b, 0x00431021, 0x00e21021,
6239 0x00442023, 0x008a2021, 0x00041c02, 0x3082ffff, 0x00622021, 0x00041402,
6240 0x00822021, 0x00806821, 0x00041027, 0xa4c20010, 0x31a2ffff, 0x000e1c00,
6241 0x00431025, 0x3c040001, 0x24840f72, 0xade20010, 0x94820000, 0x3c050001,
6242 0x94a50f76, 0x3c030001, 0x8c630f6c, 0x24420001, 0x00b92821, 0xa4820000,
6243 0x3322ffff, 0x00622021, 0x0083182b, 0x3c010001, 0xa4250f76, 0x10600003,
6244 0x24a2ffff, 0x3c010001, 0xa4220f76, 0x3c024000, 0x03021025, 0x3c010001,
6245 0xac240f6c, 0xaf621008, 0x03e00008, 0x27bd0010, 0x3c030001, 0x90630f56,
6246 0x27bdffe8, 0x24020001, 0xafbf0014, 0x10620026, 0xafb00010, 0x8f620cf4,
6247 0x2442ffff, 0x3042007f, 0x00021100, 0x8c434000, 0x3c010001, 0xac230f64,
6248 0x8c434008, 0x24444000, 0x8c5c4004, 0x30620040, 0x14400002, 0x24020088,
6249 0x24020008, 0x3c010001, 0xa4220f68, 0x30620004, 0x10400005, 0x24020001,
6250 0x3c010001, 0xa0220f57, 0x080041d5, 0x00031402, 0x3c010001, 0xa0200f57,
6251 0x00031402, 0x3c010001, 0xa4220f54, 0x9483000c, 0x24020001, 0x3c010001,
6252 0xa4200f50, 0x3c010001, 0xa0220f56, 0x3c010001, 0xa4230f62, 0x24020001,
6253 0x1342001e, 0x00000000, 0x13400005, 0x24020003, 0x13420067, 0x00000000,
6254 0x080042cf, 0x00000000, 0x3c020001, 0x94420f62, 0x241a0001, 0x3c010001,
6255 0xa4200f5e, 0x3c010001, 0xa4200f52, 0x304407ff, 0x00021bc2, 0x00031823,
6256 0x3063003e, 0x34630036, 0x00021242, 0x3042003c, 0x00621821, 0x3c010001,
6257 0xa4240f58, 0x00832021, 0x24630030, 0x3c010001, 0xa4240f5a, 0x3c010001,
6258 0xa4230f5c, 0x3c060001, 0x24c60f52, 0x94c50000, 0x94c30002, 0x3c040001,
6259 0x94840f5a, 0x00651021, 0x0044102a, 0x10400013, 0x3c108000, 0x00a31021,
6260 0xa4c20000, 0x3c02a000, 0xaf620cf4, 0x3c010001, 0xa0200f56, 0x8f641008,
6261 0x00901024, 0x14400003, 0x00000000, 0x0c004064, 0x00000000, 0x8f620cf4,
6262 0x00501024, 0x104000b7, 0x00000000, 0x0800420f, 0x00000000, 0x3c030001,
6263 0x94630f50, 0x00851023, 0xa4c40000, 0x00621821, 0x3042ffff, 0x3c010001,
6264 0xa4230f50, 0xaf620ce8, 0x3c020001, 0x94420f68, 0x34420024, 0xaf620cec,
6265 0x94c30002, 0x3c020001, 0x94420f50, 0x14620012, 0x3c028000, 0x3c108000,
6266 0x3c02a000, 0xaf620cf4, 0x3c010001, 0xa0200f56, 0x8f641008, 0x00901024,
6267 0x14400003, 0x00000000, 0x0c004064, 0x00000000, 0x8f620cf4, 0x00501024,
6268 0x1440fff7, 0x00000000, 0x080042cf, 0x241a0003, 0xaf620cf4, 0x3c108000,
6269 0x8f641008, 0x00901024, 0x14400003, 0x00000000, 0x0c004064, 0x00000000,
6270 0x8f620cf4, 0x00501024, 0x1440fff7, 0x00000000, 0x080042cf, 0x241a0003,
6271 0x3c070001, 0x24e70f50, 0x94e20000, 0x03821021, 0xaf620ce0, 0x3c020001,
6272 0x8c420f64, 0xaf620ce4, 0x3c050001, 0x94a50f54, 0x94e30000, 0x3c040001,
6273 0x94840f58, 0x3c020001, 0x94420f5e, 0x00a32823, 0x00822023, 0x30a6ffff,
6274 0x3083ffff, 0x00c3102b, 0x14400043, 0x00000000, 0x3c020001, 0x94420f5c,
6275 0x00021400, 0x00621025, 0xaf620ce8, 0x94e20000, 0x3c030001, 0x94630f54,
6276 0x00441021, 0xa4e20000, 0x3042ffff, 0x14430021, 0x3c020008, 0x3c020001,
6277 0x90420f57, 0x10400006, 0x3c03000c, 0x3c020001, 0x94420f68, 0x34630624,
6278 0x0800427c, 0x0000d021, 0x3c020001, 0x94420f68, 0x3c030008, 0x34630624,
6279 0x00431025, 0xaf620cec, 0x3c108000, 0x3c02a000, 0xaf620cf4, 0x3c010001,
6280 0xa0200f56, 0x8f641008, 0x00901024, 0x14400003, 0x00000000, 0x0c004064,
6281 0x00000000, 0x8f620cf4, 0x00501024, 0x10400015, 0x00000000, 0x08004283,
6282 0x00000000, 0x3c030001, 0x94630f68, 0x34420624, 0x3c108000, 0x00621825,
6283 0x3c028000, 0xaf630cec, 0xaf620cf4, 0x8f641008, 0x00901024, 0x14400003,
6284 0x00000000, 0x0c004064, 0x00000000, 0x8f620cf4, 0x00501024, 0x1440fff7,
6285 0x00000000, 0x3c010001, 0x080042cf, 0xa4200f5e, 0x3c020001, 0x94420f5c,
6286 0x00021400, 0x00c21025, 0xaf620ce8, 0x3c020001, 0x90420f57, 0x10400009,
6287 0x3c03000c, 0x3c020001, 0x94420f68, 0x34630624, 0x0000d021, 0x00431025,
6288 0xaf620cec, 0x080042c1, 0x3c108000, 0x3c020001, 0x94420f68, 0x3c030008,
6289 0x34630604, 0x00431025, 0xaf620cec, 0x3c020001, 0x94420f5e, 0x00451021,
6290 0x3c010001, 0xa4220f5e, 0x3c108000, 0x3c02a000, 0xaf620cf4, 0x3c010001,
6291 0xa0200f56, 0x8f641008, 0x00901024, 0x14400003, 0x00000000, 0x0c004064,
6292 0x00000000, 0x8f620cf4, 0x00501024, 0x1440fff7, 0x00000000, 0x8fbf0014,
6293 0x8fb00010, 0x03e00008, 0x27bd0018, 0x00000000, 0x27bdffe0, 0x3c040001,
6294 0x24840ec0, 0x00002821, 0x00003021, 0x00003821, 0xafbf0018, 0xafa00010,
6295 0x0c004378, 0xafa00014, 0x0000d021, 0x24020130, 0xaf625000, 0x3c010001,
6296 0xa4200f50, 0x3c010001, 0xa0200f57, 0x8fbf0018, 0x03e00008, 0x27bd0020,
6297 0x27bdffe8, 0x3c1bc000, 0xafbf0014, 0xafb00010, 0xaf60680c, 0x8f626804,
6298 0x34420082, 0xaf626804, 0x8f634000, 0x24020b50, 0x3c010001, 0xac220f20,
6299 0x24020b78, 0x3c010001, 0xac220f30, 0x34630002, 0xaf634000, 0x0c004315,
6300 0x00808021, 0x3c010001, 0xa0220f34, 0x304200ff, 0x24030002, 0x14430005,
6301 0x00000000, 0x3c020001, 0x8c420f20, 0x08004308, 0xac5000c0, 0x3c020001,
6302 0x8c420f20, 0xac5000bc, 0x8f624434, 0x8f634438, 0x8f644410, 0x3c010001,
6303 0xac220f28, 0x3c010001, 0xac230f38, 0x3c010001, 0xac240f24, 0x8fbf0014,
6304 0x8fb00010, 0x03e00008, 0x27bd0018, 0x03e00008, 0x24020001, 0x27bdfff8,
6305 0x18800009, 0x00002821, 0x8f63680c, 0x8f62680c, 0x1043fffe, 0x00000000,
6306 0x24a50001, 0x00a4102a, 0x1440fff9, 0x00000000, 0x03e00008, 0x27bd0008,
6307 0x8f634450, 0x3c020001, 0x8c420f28, 0x00031c02, 0x0043102b, 0x14400008,
6308 0x3c038000, 0x3c040001, 0x8c840f38, 0x8f624450, 0x00021c02, 0x0083102b,
6309 0x1040fffc, 0x3c038000, 0xaf634444, 0x8f624444, 0x00431024, 0x1440fffd,
6310 0x00000000, 0x8f624448, 0x03e00008, 0x3042ffff, 0x3082ffff, 0x2442e000,
6311 0x2c422001, 0x14400003, 0x3c024000, 0x08004347, 0x2402ffff, 0x00822025,
6312 0xaf645c38, 0x8f625c30, 0x30420002, 0x1440fffc, 0x00001021, 0x03e00008,
6313 0x00000000, 0x8f624450, 0x3c030001, 0x8c630f24, 0x08004350, 0x3042ffff,
6314 0x8f624450, 0x3042ffff, 0x0043102b, 0x1440fffc, 0x00000000, 0x03e00008,
6315 0x00000000, 0x27bdffe0, 0x00802821, 0x3c040001, 0x24840ed0, 0x00003021,
6316 0x00003821, 0xafbf0018, 0xafa00010, 0x0c004378, 0xafa00014, 0x0800435f,
6317 0x00000000, 0x8fbf0018, 0x03e00008, 0x27bd0020, 0x3c020001, 0x3442d600,
6318 0x3c030001, 0x3463d600, 0x3c040001, 0x3484ddff, 0x3c010001, 0xac220f40,
6319 0x24020040, 0x3c010001, 0xac220f44, 0x3c010001, 0xac200f3c, 0xac600000,
6320 0x24630004, 0x0083102b, 0x5040fffd, 0xac600000, 0x03e00008, 0x00000000,
6321 0x00804821, 0x8faa0010, 0x3c020001, 0x8c420f3c, 0x3c040001, 0x8c840f44,
6322 0x8fab0014, 0x24430001, 0x0044102b, 0x3c010001, 0xac230f3c, 0x14400003,
6323 0x00004021, 0x3c010001, 0xac200f3c, 0x3c020001, 0x8c420f3c, 0x3c030001,
6324 0x8c630f40, 0x91240000, 0x00021140, 0x00431021, 0x00481021, 0x25080001,
6325 0xa0440000, 0x29020008, 0x1440fff4, 0x25290001, 0x3c020001, 0x8c420f3c,
6326 0x3c030001, 0x8c630f40, 0x8f64680c, 0x00021140, 0x00431021, 0xac440008,
6327 0xac45000c, 0xac460010, 0xac470014, 0xac4a0018, 0x03e00008, 0xac4b001c,
6328 0x00000000, 0x00000000, 0x00000000,
6329};
6330
50da859d 6331static const u32 tg3Tso5FwRodata[(TG3_TSO5_FW_RODATA_LEN / 4) + 1] = {
1da177e4
LT
6332 0x4d61696e, 0x43707542, 0x00000000, 0x4d61696e, 0x43707541, 0x00000000,
6333 0x00000000, 0x00000000, 0x73746b6f, 0x66666c64, 0x00000000, 0x00000000,
6334 0x73746b6f, 0x66666c64, 0x00000000, 0x00000000, 0x66617461, 0x6c457272,
6335 0x00000000, 0x00000000, 0x00000000,
6336};
6337
50da859d 6338static const u32 tg3Tso5FwData[(TG3_TSO5_FW_DATA_LEN / 4) + 1] = {
1da177e4
LT
6339 0x00000000, 0x73746b6f, 0x66666c64, 0x5f76312e, 0x322e3000, 0x00000000,
6340 0x00000000, 0x00000000, 0x00000000,
6341};
6342
6343/* tp->lock is held. */
6344static int tg3_load_tso_firmware(struct tg3 *tp)
6345{
6346 struct fw_info info;
6347 unsigned long cpu_base, cpu_scratch_base, cpu_scratch_size;
6348 int err, i;
6349
6350 if (tp->tg3_flags2 & TG3_FLG2_HW_TSO)
6351 return 0;
6352
6353 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) {
6354 info.text_base = TG3_TSO5_FW_TEXT_ADDR;
6355 info.text_len = TG3_TSO5_FW_TEXT_LEN;
6356 info.text_data = &tg3Tso5FwText[0];
6357 info.rodata_base = TG3_TSO5_FW_RODATA_ADDR;
6358 info.rodata_len = TG3_TSO5_FW_RODATA_LEN;
6359 info.rodata_data = &tg3Tso5FwRodata[0];
6360 info.data_base = TG3_TSO5_FW_DATA_ADDR;
6361 info.data_len = TG3_TSO5_FW_DATA_LEN;
6362 info.data_data = &tg3Tso5FwData[0];
6363 cpu_base = RX_CPU_BASE;
6364 cpu_scratch_base = NIC_SRAM_MBUF_POOL_BASE5705;
6365 cpu_scratch_size = (info.text_len +
6366 info.rodata_len +
6367 info.data_len +
6368 TG3_TSO5_FW_SBSS_LEN +
6369 TG3_TSO5_FW_BSS_LEN);
6370 } else {
6371 info.text_base = TG3_TSO_FW_TEXT_ADDR;
6372 info.text_len = TG3_TSO_FW_TEXT_LEN;
6373 info.text_data = &tg3TsoFwText[0];
6374 info.rodata_base = TG3_TSO_FW_RODATA_ADDR;
6375 info.rodata_len = TG3_TSO_FW_RODATA_LEN;
6376 info.rodata_data = &tg3TsoFwRodata[0];
6377 info.data_base = TG3_TSO_FW_DATA_ADDR;
6378 info.data_len = TG3_TSO_FW_DATA_LEN;
6379 info.data_data = &tg3TsoFwData[0];
6380 cpu_base = TX_CPU_BASE;
6381 cpu_scratch_base = TX_CPU_SCRATCH_BASE;
6382 cpu_scratch_size = TX_CPU_SCRATCH_SIZE;
6383 }
6384
6385 err = tg3_load_firmware_cpu(tp, cpu_base,
6386 cpu_scratch_base, cpu_scratch_size,
6387 &info);
6388 if (err)
6389 return err;
6390
6391 /* Now startup the cpu. */
6392 tw32(cpu_base + CPU_STATE, 0xffffffff);
6393 tw32_f(cpu_base + CPU_PC, info.text_base);
6394
6395 for (i = 0; i < 5; i++) {
6396 if (tr32(cpu_base + CPU_PC) == info.text_base)
6397 break;
6398 tw32(cpu_base + CPU_STATE, 0xffffffff);
6399 tw32(cpu_base + CPU_MODE, CPU_MODE_HALT);
6400 tw32_f(cpu_base + CPU_PC, info.text_base);
6401 udelay(1000);
6402 }
6403 if (i >= 5) {
6404 printk(KERN_ERR PFX "tg3_load_tso_firmware fails for %s "
6405 "to set CPU PC, is %08x should be %08x\n",
6406 tp->dev->name, tr32(cpu_base + CPU_PC),
6407 info.text_base);
6408 return -ENODEV;
6409 }
6410 tw32(cpu_base + CPU_STATE, 0xffffffff);
6411 tw32_f(cpu_base + CPU_MODE, 0x00000000);
6412 return 0;
6413}
6414
1da177e4
LT
6415
6416/* tp->lock is held. */
986e0aeb 6417static void __tg3_set_mac_addr(struct tg3 *tp, int skip_mac_1)
1da177e4
LT
6418{
6419 u32 addr_high, addr_low;
6420 int i;
6421
6422 addr_high = ((tp->dev->dev_addr[0] << 8) |
6423 tp->dev->dev_addr[1]);
6424 addr_low = ((tp->dev->dev_addr[2] << 24) |
6425 (tp->dev->dev_addr[3] << 16) |
6426 (tp->dev->dev_addr[4] << 8) |
6427 (tp->dev->dev_addr[5] << 0));
6428 for (i = 0; i < 4; i++) {
986e0aeb
MC
6429 if (i == 1 && skip_mac_1)
6430 continue;
1da177e4
LT
6431 tw32(MAC_ADDR_0_HIGH + (i * 8), addr_high);
6432 tw32(MAC_ADDR_0_LOW + (i * 8), addr_low);
6433 }
6434
6435 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703 ||
6436 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704) {
6437 for (i = 0; i < 12; i++) {
6438 tw32(MAC_EXTADDR_0_HIGH + (i * 8), addr_high);
6439 tw32(MAC_EXTADDR_0_LOW + (i * 8), addr_low);
6440 }
6441 }
6442
6443 addr_high = (tp->dev->dev_addr[0] +
6444 tp->dev->dev_addr[1] +
6445 tp->dev->dev_addr[2] +
6446 tp->dev->dev_addr[3] +
6447 tp->dev->dev_addr[4] +
6448 tp->dev->dev_addr[5]) &
6449 TX_BACKOFF_SEED_MASK;
6450 tw32(MAC_TX_BACKOFF_SEED, addr_high);
6451}
6452
6453static int tg3_set_mac_addr(struct net_device *dev, void *p)
6454{
6455 struct tg3 *tp = netdev_priv(dev);
6456 struct sockaddr *addr = p;
986e0aeb 6457 int err = 0, skip_mac_1 = 0;
1da177e4 6458
f9804ddb
MC
6459 if (!is_valid_ether_addr(addr->sa_data))
6460 return -EINVAL;
6461
1da177e4
LT
6462 memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
6463
e75f7c90
MC
6464 if (!netif_running(dev))
6465 return 0;
6466
58712ef9 6467 if (tp->tg3_flags & TG3_FLAG_ENABLE_ASF) {
986e0aeb 6468 u32 addr0_high, addr0_low, addr1_high, addr1_low;
58712ef9 6469
986e0aeb
MC
6470 addr0_high = tr32(MAC_ADDR_0_HIGH);
6471 addr0_low = tr32(MAC_ADDR_0_LOW);
6472 addr1_high = tr32(MAC_ADDR_1_HIGH);
6473 addr1_low = tr32(MAC_ADDR_1_LOW);
6474
6475 /* Skip MAC addr 1 if ASF is using it. */
6476 if ((addr0_high != addr1_high || addr0_low != addr1_low) &&
6477 !(addr1_high == 0 && addr1_low == 0))
6478 skip_mac_1 = 1;
58712ef9 6479 }
986e0aeb
MC
6480 spin_lock_bh(&tp->lock);
6481 __tg3_set_mac_addr(tp, skip_mac_1);
6482 spin_unlock_bh(&tp->lock);
1da177e4 6483
b9ec6c1b 6484 return err;
1da177e4
LT
6485}
6486
6487/* tp->lock is held. */
6488static void tg3_set_bdinfo(struct tg3 *tp, u32 bdinfo_addr,
6489 dma_addr_t mapping, u32 maxlen_flags,
6490 u32 nic_addr)
6491{
6492 tg3_write_mem(tp,
6493 (bdinfo_addr + TG3_BDINFO_HOST_ADDR + TG3_64BIT_REG_HIGH),
6494 ((u64) mapping >> 32));
6495 tg3_write_mem(tp,
6496 (bdinfo_addr + TG3_BDINFO_HOST_ADDR + TG3_64BIT_REG_LOW),
6497 ((u64) mapping & 0xffffffff));
6498 tg3_write_mem(tp,
6499 (bdinfo_addr + TG3_BDINFO_MAXLEN_FLAGS),
6500 maxlen_flags);
6501
6502 if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS))
6503 tg3_write_mem(tp,
6504 (bdinfo_addr + TG3_BDINFO_NIC_ADDR),
6505 nic_addr);
6506}
6507
6508static void __tg3_set_rx_mode(struct net_device *);
d244c892 6509static void __tg3_set_coalesce(struct tg3 *tp, struct ethtool_coalesce *ec)
15f9850d
DM
6510{
6511 tw32(HOSTCC_RXCOL_TICKS, ec->rx_coalesce_usecs);
6512 tw32(HOSTCC_TXCOL_TICKS, ec->tx_coalesce_usecs);
6513 tw32(HOSTCC_RXMAX_FRAMES, ec->rx_max_coalesced_frames);
6514 tw32(HOSTCC_TXMAX_FRAMES, ec->tx_max_coalesced_frames);
6515 if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS)) {
6516 tw32(HOSTCC_RXCOAL_TICK_INT, ec->rx_coalesce_usecs_irq);
6517 tw32(HOSTCC_TXCOAL_TICK_INT, ec->tx_coalesce_usecs_irq);
6518 }
6519 tw32(HOSTCC_RXCOAL_MAXF_INT, ec->rx_max_coalesced_frames_irq);
6520 tw32(HOSTCC_TXCOAL_MAXF_INT, ec->tx_max_coalesced_frames_irq);
6521 if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS)) {
6522 u32 val = ec->stats_block_coalesce_usecs;
6523
6524 if (!netif_carrier_ok(tp->dev))
6525 val = 0;
6526
6527 tw32(HOSTCC_STAT_COAL_TICKS, val);
6528 }
6529}
1da177e4
LT
6530
6531/* tp->lock is held. */
8e7a22e3 6532static int tg3_reset_hw(struct tg3 *tp, int reset_phy)
1da177e4
LT
6533{
6534 u32 val, rdmac_mode;
6535 int i, err, limit;
6536
6537 tg3_disable_ints(tp);
6538
6539 tg3_stop_fw(tp);
6540
6541 tg3_write_sig_pre_reset(tp, RESET_KIND_INIT);
6542
6543 if (tp->tg3_flags & TG3_FLAG_INIT_COMPLETE) {
e6de8ad1 6544 tg3_abort_hw(tp, 1);
1da177e4
LT
6545 }
6546
36da4d86 6547 if (reset_phy)
d4d2c558
MC
6548 tg3_phy_reset(tp);
6549
1da177e4
LT
6550 err = tg3_chip_reset(tp);
6551 if (err)
6552 return err;
6553
6554 tg3_write_sig_legacy(tp, RESET_KIND_INIT);
6555
b5af7126
MC
6556 if (tp->pci_chip_rev_id == CHIPREV_ID_5784_A0 ||
6557 tp->pci_chip_rev_id == CHIPREV_ID_5784_A1) {
d30cdd28
MC
6558 val = tr32(TG3_CPMU_CTRL);
6559 val &= ~(CPMU_CTRL_LINK_AWARE_MODE | CPMU_CTRL_LINK_IDLE_MODE);
6560 tw32(TG3_CPMU_CTRL, val);
9acb961e
MC
6561
6562 val = tr32(TG3_CPMU_LSPD_10MB_CLK);
6563 val &= ~CPMU_LSPD_10MB_MACCLK_MASK;
6564 val |= CPMU_LSPD_10MB_MACCLK_6_25;
6565 tw32(TG3_CPMU_LSPD_10MB_CLK, val);
6566
6567 val = tr32(TG3_CPMU_LNK_AWARE_PWRMD);
6568 val &= ~CPMU_LNK_AWARE_MACCLK_MASK;
6569 val |= CPMU_LNK_AWARE_MACCLK_6_25;
6570 tw32(TG3_CPMU_LNK_AWARE_PWRMD, val);
6571
6572 val = tr32(TG3_CPMU_HST_ACC);
6573 val &= ~CPMU_HST_ACC_MACCLK_MASK;
6574 val |= CPMU_HST_ACC_MACCLK_6_25;
6575 tw32(TG3_CPMU_HST_ACC, val);
d30cdd28
MC
6576 }
6577
1da177e4
LT
6578 /* This works around an issue with Athlon chipsets on
6579 * B3 tigon3 silicon. This bit has no effect on any
6580 * other revision. But do not set this on PCI Express
795d01c5 6581 * chips and don't even touch the clocks if the CPMU is present.
1da177e4 6582 */
795d01c5
MC
6583 if (!(tp->tg3_flags & TG3_FLAG_CPMU_PRESENT)) {
6584 if (!(tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS))
6585 tp->pci_clock_ctrl |= CLOCK_CTRL_DELAY_PCI_GRANT;
6586 tw32_f(TG3PCI_CLOCK_CTRL, tp->pci_clock_ctrl);
6587 }
1da177e4
LT
6588
6589 if (tp->pci_chip_rev_id == CHIPREV_ID_5704_A0 &&
6590 (tp->tg3_flags & TG3_FLAG_PCIX_MODE)) {
6591 val = tr32(TG3PCI_PCISTATE);
6592 val |= PCISTATE_RETRY_SAME_DMA;
6593 tw32(TG3PCI_PCISTATE, val);
6594 }
6595
0d3031d9
MC
6596 if (tp->tg3_flags3 & TG3_FLG3_ENABLE_APE) {
6597 /* Allow reads and writes to the
6598 * APE register and memory space.
6599 */
6600 val = tr32(TG3PCI_PCISTATE);
6601 val |= PCISTATE_ALLOW_APE_CTLSPC_WR |
6602 PCISTATE_ALLOW_APE_SHMEM_WR;
6603 tw32(TG3PCI_PCISTATE, val);
6604 }
6605
1da177e4
LT
6606 if (GET_CHIP_REV(tp->pci_chip_rev_id) == CHIPREV_5704_BX) {
6607 /* Enable some hw fixes. */
6608 val = tr32(TG3PCI_MSI_DATA);
6609 val |= (1 << 26) | (1 << 28) | (1 << 29);
6610 tw32(TG3PCI_MSI_DATA, val);
6611 }
6612
6613 /* Descriptor ring init may make accesses to the
6614 * NIC SRAM area to setup the TX descriptors, so we
6615 * can only do this after the hardware has been
6616 * successfully reset.
6617 */
32d8c572
MC
6618 err = tg3_init_rings(tp);
6619 if (err)
6620 return err;
1da177e4 6621
9936bcf6
MC
6622 if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5784 &&
6623 GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5761) {
d30cdd28
MC
6624 /* This value is determined during the probe time DMA
6625 * engine test, tg3_test_dma.
6626 */
6627 tw32(TG3PCI_DMA_RW_CTRL, tp->dma_rwctrl);
6628 }
1da177e4
LT
6629
6630 tp->grc_mode &= ~(GRC_MODE_HOST_SENDBDS |
6631 GRC_MODE_4X_NIC_SEND_RINGS |
6632 GRC_MODE_NO_TX_PHDR_CSUM |
6633 GRC_MODE_NO_RX_PHDR_CSUM);
6634 tp->grc_mode |= GRC_MODE_HOST_SENDBDS;
d2d746f8
MC
6635
6636 /* Pseudo-header checksum is done by hardware logic and not
6637 * the offload processers, so make the chip do the pseudo-
6638 * header checksums on receive. For transmit it is more
6639 * convenient to do the pseudo-header checksum in software
6640 * as Linux does that on transmit for us in all cases.
6641 */
6642 tp->grc_mode |= GRC_MODE_NO_TX_PHDR_CSUM;
1da177e4
LT
6643
6644 tw32(GRC_MODE,
6645 tp->grc_mode |
6646 (GRC_MODE_IRQ_ON_MAC_ATTN | GRC_MODE_HOST_STACKUP));
6647
6648 /* Setup the timer prescalar register. Clock is always 66Mhz. */
6649 val = tr32(GRC_MISC_CFG);
6650 val &= ~0xff;
6651 val |= (65 << GRC_MISC_CFG_PRESCALAR_SHIFT);
6652 tw32(GRC_MISC_CFG, val);
6653
6654 /* Initialize MBUF/DESC pool. */
cbf46853 6655 if (tp->tg3_flags2 & TG3_FLG2_5750_PLUS) {
1da177e4
LT
6656 /* Do nothing. */
6657 } else if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5705) {
6658 tw32(BUFMGR_MB_POOL_ADDR, NIC_SRAM_MBUF_POOL_BASE);
6659 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704)
6660 tw32(BUFMGR_MB_POOL_SIZE, NIC_SRAM_MBUF_POOL_SIZE64);
6661 else
6662 tw32(BUFMGR_MB_POOL_SIZE, NIC_SRAM_MBUF_POOL_SIZE96);
6663 tw32(BUFMGR_DMA_DESC_POOL_ADDR, NIC_SRAM_DMA_DESC_POOL_BASE);
6664 tw32(BUFMGR_DMA_DESC_POOL_SIZE, NIC_SRAM_DMA_DESC_POOL_SIZE);
6665 }
1da177e4
LT
6666 else if (tp->tg3_flags2 & TG3_FLG2_TSO_CAPABLE) {
6667 int fw_len;
6668
6669 fw_len = (TG3_TSO5_FW_TEXT_LEN +
6670 TG3_TSO5_FW_RODATA_LEN +
6671 TG3_TSO5_FW_DATA_LEN +
6672 TG3_TSO5_FW_SBSS_LEN +
6673 TG3_TSO5_FW_BSS_LEN);
6674 fw_len = (fw_len + (0x80 - 1)) & ~(0x80 - 1);
6675 tw32(BUFMGR_MB_POOL_ADDR,
6676 NIC_SRAM_MBUF_POOL_BASE5705 + fw_len);
6677 tw32(BUFMGR_MB_POOL_SIZE,
6678 NIC_SRAM_MBUF_POOL_SIZE5705 - fw_len - 0xa00);
6679 }
1da177e4 6680
0f893dc6 6681 if (tp->dev->mtu <= ETH_DATA_LEN) {
1da177e4
LT
6682 tw32(BUFMGR_MB_RDMA_LOW_WATER,
6683 tp->bufmgr_config.mbuf_read_dma_low_water);
6684 tw32(BUFMGR_MB_MACRX_LOW_WATER,
6685 tp->bufmgr_config.mbuf_mac_rx_low_water);
6686 tw32(BUFMGR_MB_HIGH_WATER,
6687 tp->bufmgr_config.mbuf_high_water);
6688 } else {
6689 tw32(BUFMGR_MB_RDMA_LOW_WATER,
6690 tp->bufmgr_config.mbuf_read_dma_low_water_jumbo);
6691 tw32(BUFMGR_MB_MACRX_LOW_WATER,
6692 tp->bufmgr_config.mbuf_mac_rx_low_water_jumbo);
6693 tw32(BUFMGR_MB_HIGH_WATER,
6694 tp->bufmgr_config.mbuf_high_water_jumbo);
6695 }
6696 tw32(BUFMGR_DMA_LOW_WATER,
6697 tp->bufmgr_config.dma_low_water);
6698 tw32(BUFMGR_DMA_HIGH_WATER,
6699 tp->bufmgr_config.dma_high_water);
6700
6701 tw32(BUFMGR_MODE, BUFMGR_MODE_ENABLE | BUFMGR_MODE_ATTN_ENABLE);
6702 for (i = 0; i < 2000; i++) {
6703 if (tr32(BUFMGR_MODE) & BUFMGR_MODE_ENABLE)
6704 break;
6705 udelay(10);
6706 }
6707 if (i >= 2000) {
6708 printk(KERN_ERR PFX "tg3_reset_hw cannot enable BUFMGR for %s.\n",
6709 tp->dev->name);
6710 return -ENODEV;
6711 }
6712
6713 /* Setup replenish threshold. */
f92905de
MC
6714 val = tp->rx_pending / 8;
6715 if (val == 0)
6716 val = 1;
6717 else if (val > tp->rx_std_max_post)
6718 val = tp->rx_std_max_post;
b5d3772c
MC
6719 else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) {
6720 if (tp->pci_chip_rev_id == CHIPREV_ID_5906_A1)
6721 tw32(ISO_PKT_TX, (tr32(ISO_PKT_TX) & ~0x3) | 0x2);
6722
6723 if (val > (TG3_RX_INTERNAL_RING_SZ_5906 / 2))
6724 val = TG3_RX_INTERNAL_RING_SZ_5906 / 2;
6725 }
f92905de
MC
6726
6727 tw32(RCVBDI_STD_THRESH, val);
1da177e4
LT
6728
6729 /* Initialize TG3_BDINFO's at:
6730 * RCVDBDI_STD_BD: standard eth size rx ring
6731 * RCVDBDI_JUMBO_BD: jumbo frame rx ring
6732 * RCVDBDI_MINI_BD: small frame rx ring (??? does not work)
6733 *
6734 * like so:
6735 * TG3_BDINFO_HOST_ADDR: high/low parts of DMA address of ring
6736 * TG3_BDINFO_MAXLEN_FLAGS: (rx max buffer size << 16) |
6737 * ring attribute flags
6738 * TG3_BDINFO_NIC_ADDR: location of descriptors in nic SRAM
6739 *
6740 * Standard receive ring @ NIC_SRAM_RX_BUFFER_DESC, 512 entries.
6741 * Jumbo receive ring @ NIC_SRAM_RX_JUMBO_BUFFER_DESC, 256 entries.
6742 *
6743 * The size of each ring is fixed in the firmware, but the location is
6744 * configurable.
6745 */
6746 tw32(RCVDBDI_STD_BD + TG3_BDINFO_HOST_ADDR + TG3_64BIT_REG_HIGH,
6747 ((u64) tp->rx_std_mapping >> 32));
6748 tw32(RCVDBDI_STD_BD + TG3_BDINFO_HOST_ADDR + TG3_64BIT_REG_LOW,
6749 ((u64) tp->rx_std_mapping & 0xffffffff));
6750 tw32(RCVDBDI_STD_BD + TG3_BDINFO_NIC_ADDR,
6751 NIC_SRAM_RX_BUFFER_DESC);
6752
6753 /* Don't even try to program the JUMBO/MINI buffer descriptor
6754 * configs on 5705.
6755 */
6756 if (tp->tg3_flags2 & TG3_FLG2_5705_PLUS) {
6757 tw32(RCVDBDI_STD_BD + TG3_BDINFO_MAXLEN_FLAGS,
6758 RX_STD_MAX_SIZE_5705 << BDINFO_FLAGS_MAXLEN_SHIFT);
6759 } else {
6760 tw32(RCVDBDI_STD_BD + TG3_BDINFO_MAXLEN_FLAGS,
6761 RX_STD_MAX_SIZE << BDINFO_FLAGS_MAXLEN_SHIFT);
6762
6763 tw32(RCVDBDI_MINI_BD + TG3_BDINFO_MAXLEN_FLAGS,
6764 BDINFO_FLAGS_DISABLED);
6765
6766 /* Setup replenish threshold. */
6767 tw32(RCVBDI_JUMBO_THRESH, tp->rx_jumbo_pending / 8);
6768
0f893dc6 6769 if (tp->tg3_flags & TG3_FLAG_JUMBO_RING_ENABLE) {
1da177e4
LT
6770 tw32(RCVDBDI_JUMBO_BD + TG3_BDINFO_HOST_ADDR + TG3_64BIT_REG_HIGH,
6771 ((u64) tp->rx_jumbo_mapping >> 32));
6772 tw32(RCVDBDI_JUMBO_BD + TG3_BDINFO_HOST_ADDR + TG3_64BIT_REG_LOW,
6773 ((u64) tp->rx_jumbo_mapping & 0xffffffff));
6774 tw32(RCVDBDI_JUMBO_BD + TG3_BDINFO_MAXLEN_FLAGS,
6775 RX_JUMBO_MAX_SIZE << BDINFO_FLAGS_MAXLEN_SHIFT);
6776 tw32(RCVDBDI_JUMBO_BD + TG3_BDINFO_NIC_ADDR,
6777 NIC_SRAM_RX_JUMBO_BUFFER_DESC);
6778 } else {
6779 tw32(RCVDBDI_JUMBO_BD + TG3_BDINFO_MAXLEN_FLAGS,
6780 BDINFO_FLAGS_DISABLED);
6781 }
6782
6783 }
6784
6785 /* There is only one send ring on 5705/5750, no need to explicitly
6786 * disable the others.
6787 */
6788 if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS)) {
6789 /* Clear out send RCB ring in SRAM. */
6790 for (i = NIC_SRAM_SEND_RCB; i < NIC_SRAM_RCV_RET_RCB; i += TG3_BDINFO_SIZE)
6791 tg3_write_mem(tp, i + TG3_BDINFO_MAXLEN_FLAGS,
6792 BDINFO_FLAGS_DISABLED);
6793 }
6794
6795 tp->tx_prod = 0;
6796 tp->tx_cons = 0;
6797 tw32_mailbox(MAILBOX_SNDHOST_PROD_IDX_0 + TG3_64BIT_REG_LOW, 0);
6798 tw32_tx_mbox(MAILBOX_SNDNIC_PROD_IDX_0 + TG3_64BIT_REG_LOW, 0);
6799
6800 tg3_set_bdinfo(tp, NIC_SRAM_SEND_RCB,
6801 tp->tx_desc_mapping,
6802 (TG3_TX_RING_SIZE <<
6803 BDINFO_FLAGS_MAXLEN_SHIFT),
6804 NIC_SRAM_TX_BUFFER_DESC);
6805
6806 /* There is only one receive return ring on 5705/5750, no need
6807 * to explicitly disable the others.
6808 */
6809 if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS)) {
6810 for (i = NIC_SRAM_RCV_RET_RCB; i < NIC_SRAM_STATS_BLK;
6811 i += TG3_BDINFO_SIZE) {
6812 tg3_write_mem(tp, i + TG3_BDINFO_MAXLEN_FLAGS,
6813 BDINFO_FLAGS_DISABLED);
6814 }
6815 }
6816
6817 tp->rx_rcb_ptr = 0;
6818 tw32_rx_mbox(MAILBOX_RCVRET_CON_IDX_0 + TG3_64BIT_REG_LOW, 0);
6819
6820 tg3_set_bdinfo(tp, NIC_SRAM_RCV_RET_RCB,
6821 tp->rx_rcb_mapping,
6822 (TG3_RX_RCB_RING_SIZE(tp) <<
6823 BDINFO_FLAGS_MAXLEN_SHIFT),
6824 0);
6825
6826 tp->rx_std_ptr = tp->rx_pending;
6827 tw32_rx_mbox(MAILBOX_RCV_STD_PROD_IDX + TG3_64BIT_REG_LOW,
6828 tp->rx_std_ptr);
6829
0f893dc6 6830 tp->rx_jumbo_ptr = (tp->tg3_flags & TG3_FLAG_JUMBO_RING_ENABLE) ?
1da177e4
LT
6831 tp->rx_jumbo_pending : 0;
6832 tw32_rx_mbox(MAILBOX_RCV_JUMBO_PROD_IDX + TG3_64BIT_REG_LOW,
6833 tp->rx_jumbo_ptr);
6834
6835 /* Initialize MAC address and backoff seed. */
986e0aeb 6836 __tg3_set_mac_addr(tp, 0);
1da177e4
LT
6837
6838 /* MTU + ethernet header + FCS + optional VLAN tag */
6839 tw32(MAC_RX_MTU_SIZE, tp->dev->mtu + ETH_HLEN + 8);
6840
6841 /* The slot time is changed by tg3_setup_phy if we
6842 * run at gigabit with half duplex.
6843 */
6844 tw32(MAC_TX_LENGTHS,
6845 (2 << TX_LENGTHS_IPG_CRS_SHIFT) |
6846 (6 << TX_LENGTHS_IPG_SHIFT) |
6847 (32 << TX_LENGTHS_SLOT_TIME_SHIFT));
6848
6849 /* Receive rules. */
6850 tw32(MAC_RCV_RULE_CFG, RCV_RULE_CFG_DEFAULT_CLASS);
6851 tw32(RCVLPC_CONFIG, 0x0181);
6852
6853 /* Calculate RDMAC_MODE setting early, we need it to determine
6854 * the RCVLPC_STATE_ENABLE mask.
6855 */
6856 rdmac_mode = (RDMAC_MODE_ENABLE | RDMAC_MODE_TGTABORT_ENAB |
6857 RDMAC_MODE_MSTABORT_ENAB | RDMAC_MODE_PARITYERR_ENAB |
6858 RDMAC_MODE_ADDROFLOW_ENAB | RDMAC_MODE_FIFOOFLOW_ENAB |
6859 RDMAC_MODE_FIFOURUN_ENAB | RDMAC_MODE_FIFOOREAD_ENAB |
6860 RDMAC_MODE_LNGREAD_ENAB);
85e94ced 6861
d30cdd28
MC
6862 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5784)
6863 rdmac_mode |= RDMAC_MODE_BD_SBD_CRPT_ENAB |
6864 RDMAC_MODE_MBUF_RBD_CRPT_ENAB |
6865 RDMAC_MODE_MBUF_SBD_CRPT_ENAB;
6866
85e94ced
MC
6867 /* If statement applies to 5705 and 5750 PCI devices only */
6868 if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705 &&
6869 tp->pci_chip_rev_id != CHIPREV_ID_5705_A0) ||
6870 (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750)) {
1da177e4 6871 if (tp->tg3_flags2 & TG3_FLG2_TSO_CAPABLE &&
c13e3713 6872 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) {
1da177e4
LT
6873 rdmac_mode |= RDMAC_MODE_FIFO_SIZE_128;
6874 } else if (!(tr32(TG3PCI_PCISTATE) & PCISTATE_BUS_SPEED_HIGH) &&
6875 !(tp->tg3_flags2 & TG3_FLG2_IS_5788)) {
6876 rdmac_mode |= RDMAC_MODE_FIFO_LONG_BURST;
6877 }
6878 }
6879
85e94ced
MC
6880 if (tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS)
6881 rdmac_mode |= RDMAC_MODE_FIFO_LONG_BURST;
6882
1da177e4
LT
6883 if (tp->tg3_flags2 & TG3_FLG2_HW_TSO)
6884 rdmac_mode |= (1 << 27);
1da177e4
LT
6885
6886 /* Receive/send statistics. */
1661394e
MC
6887 if (tp->tg3_flags2 & TG3_FLG2_5750_PLUS) {
6888 val = tr32(RCVLPC_STATS_ENABLE);
6889 val &= ~RCVLPC_STATSENAB_DACK_FIX;
6890 tw32(RCVLPC_STATS_ENABLE, val);
6891 } else if ((rdmac_mode & RDMAC_MODE_FIFO_SIZE_128) &&
6892 (tp->tg3_flags2 & TG3_FLG2_TSO_CAPABLE)) {
1da177e4
LT
6893 val = tr32(RCVLPC_STATS_ENABLE);
6894 val &= ~RCVLPC_STATSENAB_LNGBRST_RFIX;
6895 tw32(RCVLPC_STATS_ENABLE, val);
6896 } else {
6897 tw32(RCVLPC_STATS_ENABLE, 0xffffff);
6898 }
6899 tw32(RCVLPC_STATSCTRL, RCVLPC_STATSCTRL_ENABLE);
6900 tw32(SNDDATAI_STATSENAB, 0xffffff);
6901 tw32(SNDDATAI_STATSCTRL,
6902 (SNDDATAI_SCTRL_ENABLE |
6903 SNDDATAI_SCTRL_FASTUPD));
6904
6905 /* Setup host coalescing engine. */
6906 tw32(HOSTCC_MODE, 0);
6907 for (i = 0; i < 2000; i++) {
6908 if (!(tr32(HOSTCC_MODE) & HOSTCC_MODE_ENABLE))
6909 break;
6910 udelay(10);
6911 }
6912
d244c892 6913 __tg3_set_coalesce(tp, &tp->coal);
1da177e4
LT
6914
6915 /* set status block DMA address */
6916 tw32(HOSTCC_STATUS_BLK_HOST_ADDR + TG3_64BIT_REG_HIGH,
6917 ((u64) tp->status_mapping >> 32));
6918 tw32(HOSTCC_STATUS_BLK_HOST_ADDR + TG3_64BIT_REG_LOW,
6919 ((u64) tp->status_mapping & 0xffffffff));
6920
6921 if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS)) {
6922 /* Status/statistics block address. See tg3_timer,
6923 * the tg3_periodic_fetch_stats call there, and
6924 * tg3_get_stats to see how this works for 5705/5750 chips.
6925 */
1da177e4
LT
6926 tw32(HOSTCC_STATS_BLK_HOST_ADDR + TG3_64BIT_REG_HIGH,
6927 ((u64) tp->stats_mapping >> 32));
6928 tw32(HOSTCC_STATS_BLK_HOST_ADDR + TG3_64BIT_REG_LOW,
6929 ((u64) tp->stats_mapping & 0xffffffff));
6930 tw32(HOSTCC_STATS_BLK_NIC_ADDR, NIC_SRAM_STATS_BLK);
6931 tw32(HOSTCC_STATUS_BLK_NIC_ADDR, NIC_SRAM_STATUS_BLK);
6932 }
6933
6934 tw32(HOSTCC_MODE, HOSTCC_MODE_ENABLE | tp->coalesce_mode);
6935
6936 tw32(RCVCC_MODE, RCVCC_MODE_ENABLE | RCVCC_MODE_ATTN_ENABLE);
6937 tw32(RCVLPC_MODE, RCVLPC_MODE_ENABLE);
6938 if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS))
6939 tw32(RCVLSC_MODE, RCVLSC_MODE_ENABLE | RCVLSC_MODE_ATTN_ENABLE);
6940
6941 /* Clear statistics/status block in chip, and status block in ram. */
6942 for (i = NIC_SRAM_STATS_BLK;
6943 i < NIC_SRAM_STATUS_BLK + TG3_HW_STATUS_SIZE;
6944 i += sizeof(u32)) {
6945 tg3_write_mem(tp, i, 0);
6946 udelay(40);
6947 }
6948 memset(tp->hw_status, 0, TG3_HW_STATUS_SIZE);
6949
c94e3941
MC
6950 if (tp->tg3_flags2 & TG3_FLG2_MII_SERDES) {
6951 tp->tg3_flags2 &= ~TG3_FLG2_PARALLEL_DETECT;
6952 /* reset to prevent losing 1st rx packet intermittently */
6953 tw32_f(MAC_RX_MODE, RX_MODE_RESET);
6954 udelay(10);
6955 }
6956
1da177e4
LT
6957 tp->mac_mode = MAC_MODE_TXSTAT_ENABLE | MAC_MODE_RXSTAT_ENABLE |
6958 MAC_MODE_TDE_ENABLE | MAC_MODE_RDE_ENABLE | MAC_MODE_FHDE_ENABLE;
e8f3f6ca
MC
6959 if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS) &&
6960 !(tp->tg3_flags2 & TG3_FLG2_PHY_SERDES) &&
6961 GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5700)
6962 tp->mac_mode |= MAC_MODE_LINK_POLARITY;
1da177e4
LT
6963 tw32_f(MAC_MODE, tp->mac_mode | MAC_MODE_RXSTAT_CLEAR | MAC_MODE_TXSTAT_CLEAR);
6964 udelay(40);
6965
314fba34 6966 /* tp->grc_local_ctrl is partially set up during tg3_get_invariants().
9d26e213 6967 * If TG3_FLG2_IS_NIC is zero, we should read the
314fba34
MC
6968 * register to preserve the GPIO settings for LOMs. The GPIOs,
6969 * whether used as inputs or outputs, are set by boot code after
6970 * reset.
6971 */
9d26e213 6972 if (!(tp->tg3_flags2 & TG3_FLG2_IS_NIC)) {
314fba34
MC
6973 u32 gpio_mask;
6974
9d26e213
MC
6975 gpio_mask = GRC_LCLCTRL_GPIO_OE0 | GRC_LCLCTRL_GPIO_OE1 |
6976 GRC_LCLCTRL_GPIO_OE2 | GRC_LCLCTRL_GPIO_OUTPUT0 |
6977 GRC_LCLCTRL_GPIO_OUTPUT1 | GRC_LCLCTRL_GPIO_OUTPUT2;
3e7d83bc
MC
6978
6979 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5752)
6980 gpio_mask |= GRC_LCLCTRL_GPIO_OE3 |
6981 GRC_LCLCTRL_GPIO_OUTPUT3;
6982
af36e6b6
MC
6983 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755)
6984 gpio_mask |= GRC_LCLCTRL_GPIO_UART_SEL;
6985
aaf84465 6986 tp->grc_local_ctrl &= ~gpio_mask;
314fba34
MC
6987 tp->grc_local_ctrl |= tr32(GRC_LOCAL_CTRL) & gpio_mask;
6988
6989 /* GPIO1 must be driven high for eeprom write protect */
9d26e213
MC
6990 if (tp->tg3_flags & TG3_FLAG_EEPROM_WRITE_PROT)
6991 tp->grc_local_ctrl |= (GRC_LCLCTRL_GPIO_OE1 |
6992 GRC_LCLCTRL_GPIO_OUTPUT1);
314fba34 6993 }
1da177e4
LT
6994 tw32_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl);
6995 udelay(100);
6996
09ee929c 6997 tw32_mailbox_f(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW, 0);
fac9b83e 6998 tp->last_tag = 0;
1da177e4
LT
6999
7000 if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS)) {
7001 tw32_f(DMAC_MODE, DMAC_MODE_ENABLE);
7002 udelay(40);
7003 }
7004
7005 val = (WDMAC_MODE_ENABLE | WDMAC_MODE_TGTABORT_ENAB |
7006 WDMAC_MODE_MSTABORT_ENAB | WDMAC_MODE_PARITYERR_ENAB |
7007 WDMAC_MODE_ADDROFLOW_ENAB | WDMAC_MODE_FIFOOFLOW_ENAB |
7008 WDMAC_MODE_FIFOURUN_ENAB | WDMAC_MODE_FIFOOREAD_ENAB |
7009 WDMAC_MODE_LNGREAD_ENAB);
7010
85e94ced
MC
7011 /* If statement applies to 5705 and 5750 PCI devices only */
7012 if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705 &&
7013 tp->pci_chip_rev_id != CHIPREV_ID_5705_A0) ||
7014 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750) {
1da177e4
LT
7015 if ((tp->tg3_flags & TG3_FLG2_TSO_CAPABLE) &&
7016 (tp->pci_chip_rev_id == CHIPREV_ID_5705_A1 ||
7017 tp->pci_chip_rev_id == CHIPREV_ID_5705_A2)) {
7018 /* nothing */
7019 } else if (!(tr32(TG3PCI_PCISTATE) & PCISTATE_BUS_SPEED_HIGH) &&
7020 !(tp->tg3_flags2 & TG3_FLG2_IS_5788) &&
7021 !(tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS)) {
7022 val |= WDMAC_MODE_RX_ACCEL;
7023 }
7024 }
7025
d9ab5ad1 7026 /* Enable host coalescing bug fix */
af36e6b6 7027 if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755) ||
d30cdd28 7028 (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787) ||
9936bcf6
MC
7029 (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5784) ||
7030 (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5761))
d9ab5ad1
MC
7031 val |= (1 << 29);
7032
1da177e4
LT
7033 tw32_f(WDMAC_MODE, val);
7034 udelay(40);
7035
9974a356
MC
7036 if (tp->tg3_flags & TG3_FLAG_PCIX_MODE) {
7037 u16 pcix_cmd;
7038
7039 pci_read_config_word(tp->pdev, tp->pcix_cap + PCI_X_CMD,
7040 &pcix_cmd);
1da177e4 7041 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703) {
9974a356
MC
7042 pcix_cmd &= ~PCI_X_CMD_MAX_READ;
7043 pcix_cmd |= PCI_X_CMD_READ_2K;
1da177e4 7044 } else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704) {
9974a356
MC
7045 pcix_cmd &= ~(PCI_X_CMD_MAX_SPLIT | PCI_X_CMD_MAX_READ);
7046 pcix_cmd |= PCI_X_CMD_READ_2K;
1da177e4 7047 }
9974a356
MC
7048 pci_write_config_word(tp->pdev, tp->pcix_cap + PCI_X_CMD,
7049 pcix_cmd);
1da177e4
LT
7050 }
7051
7052 tw32_f(RDMAC_MODE, rdmac_mode);
7053 udelay(40);
7054
7055 tw32(RCVDCC_MODE, RCVDCC_MODE_ENABLE | RCVDCC_MODE_ATTN_ENABLE);
7056 if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS))
7057 tw32(MBFREE_MODE, MBFREE_MODE_ENABLE);
9936bcf6
MC
7058
7059 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5761)
7060 tw32(SNDDATAC_MODE,
7061 SNDDATAC_MODE_ENABLE | SNDDATAC_MODE_CDELAY);
7062 else
7063 tw32(SNDDATAC_MODE, SNDDATAC_MODE_ENABLE);
7064
1da177e4
LT
7065 tw32(SNDBDC_MODE, SNDBDC_MODE_ENABLE | SNDBDC_MODE_ATTN_ENABLE);
7066 tw32(RCVBDI_MODE, RCVBDI_MODE_ENABLE | RCVBDI_MODE_RCB_ATTN_ENAB);
7067 tw32(RCVDBDI_MODE, RCVDBDI_MODE_ENABLE | RCVDBDI_MODE_INV_RING_SZ);
7068 tw32(SNDDATAI_MODE, SNDDATAI_MODE_ENABLE);
1da177e4
LT
7069 if (tp->tg3_flags2 & TG3_FLG2_HW_TSO)
7070 tw32(SNDDATAI_MODE, SNDDATAI_MODE_ENABLE | 0x8);
1da177e4
LT
7071 tw32(SNDBDI_MODE, SNDBDI_MODE_ENABLE | SNDBDI_MODE_ATTN_ENABLE);
7072 tw32(SNDBDS_MODE, SNDBDS_MODE_ENABLE | SNDBDS_MODE_ATTN_ENABLE);
7073
7074 if (tp->pci_chip_rev_id == CHIPREV_ID_5701_A0) {
7075 err = tg3_load_5701_a0_firmware_fix(tp);
7076 if (err)
7077 return err;
7078 }
7079
1da177e4
LT
7080 if (tp->tg3_flags2 & TG3_FLG2_TSO_CAPABLE) {
7081 err = tg3_load_tso_firmware(tp);
7082 if (err)
7083 return err;
7084 }
1da177e4
LT
7085
7086 tp->tx_mode = TX_MODE_ENABLE;
7087 tw32_f(MAC_TX_MODE, tp->tx_mode);
7088 udelay(100);
7089
7090 tp->rx_mode = RX_MODE_ENABLE;
9936bcf6
MC
7091 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 ||
7092 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5761)
af36e6b6
MC
7093 tp->rx_mode |= RX_MODE_IPV6_CSUM_ENABLE;
7094
1da177e4
LT
7095 tw32_f(MAC_RX_MODE, tp->rx_mode);
7096 udelay(10);
7097
7098 if (tp->link_config.phy_is_low_power) {
7099 tp->link_config.phy_is_low_power = 0;
7100 tp->link_config.speed = tp->link_config.orig_speed;
7101 tp->link_config.duplex = tp->link_config.orig_duplex;
7102 tp->link_config.autoneg = tp->link_config.orig_autoneg;
7103 }
7104
7105 tp->mi_mode = MAC_MI_MODE_BASE;
7106 tw32_f(MAC_MI_MODE, tp->mi_mode);
7107 udelay(80);
7108
7109 tw32(MAC_LED_CTRL, tp->led_ctrl);
7110
7111 tw32(MAC_MI_STAT, MAC_MI_STAT_LNKSTAT_ATTN_ENAB);
c94e3941 7112 if (tp->tg3_flags2 & TG3_FLG2_PHY_SERDES) {
1da177e4
LT
7113 tw32_f(MAC_RX_MODE, RX_MODE_RESET);
7114 udelay(10);
7115 }
7116 tw32_f(MAC_RX_MODE, tp->rx_mode);
7117 udelay(10);
7118
7119 if (tp->tg3_flags2 & TG3_FLG2_PHY_SERDES) {
7120 if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704) &&
7121 !(tp->tg3_flags2 & TG3_FLG2_SERDES_PREEMPHASIS)) {
7122 /* Set drive transmission level to 1.2V */
7123 /* only if the signal pre-emphasis bit is not set */
7124 val = tr32(MAC_SERDES_CFG);
7125 val &= 0xfffff000;
7126 val |= 0x880;
7127 tw32(MAC_SERDES_CFG, val);
7128 }
7129 if (tp->pci_chip_rev_id == CHIPREV_ID_5703_A1)
7130 tw32(MAC_SERDES_CFG, 0x616000);
7131 }
7132
7133 /* Prevent chip from dropping frames when flow control
7134 * is enabled.
7135 */
7136 tw32_f(MAC_LOW_WMARK_MAX_RX_FRAME, 2);
7137
7138 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704 &&
7139 (tp->tg3_flags2 & TG3_FLG2_PHY_SERDES)) {
7140 /* Use hardware link auto-negotiation */
7141 tp->tg3_flags2 |= TG3_FLG2_HW_AUTONEG;
7142 }
7143
d4d2c558
MC
7144 if ((tp->tg3_flags2 & TG3_FLG2_MII_SERDES) &&
7145 (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5714)) {
7146 u32 tmp;
7147
7148 tmp = tr32(SERDES_RX_CTRL);
7149 tw32(SERDES_RX_CTRL, tmp | SERDES_RX_SIG_DETECT);
7150 tp->grc_local_ctrl &= ~GRC_LCLCTRL_USE_EXT_SIG_DETECT;
7151 tp->grc_local_ctrl |= GRC_LCLCTRL_USE_SIG_DETECT;
7152 tw32(GRC_LOCAL_CTRL, tp->grc_local_ctrl);
7153 }
7154
36da4d86 7155 err = tg3_setup_phy(tp, 0);
1da177e4
LT
7156 if (err)
7157 return err;
7158
715116a1
MC
7159 if (!(tp->tg3_flags2 & TG3_FLG2_PHY_SERDES) &&
7160 GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5906) {
1da177e4
LT
7161 u32 tmp;
7162
7163 /* Clear CRC stats. */
569a5df8
MC
7164 if (!tg3_readphy(tp, MII_TG3_TEST1, &tmp)) {
7165 tg3_writephy(tp, MII_TG3_TEST1,
7166 tmp | MII_TG3_TEST1_CRC_EN);
1da177e4
LT
7167 tg3_readphy(tp, 0x14, &tmp);
7168 }
7169 }
7170
7171 __tg3_set_rx_mode(tp->dev);
7172
7173 /* Initialize receive rules. */
7174 tw32(MAC_RCV_RULE_0, 0xc2000000 & RCV_RULE_DISABLE_MASK);
7175 tw32(MAC_RCV_VALUE_0, 0xffffffff & RCV_RULE_DISABLE_MASK);
7176 tw32(MAC_RCV_RULE_1, 0x86000004 & RCV_RULE_DISABLE_MASK);
7177 tw32(MAC_RCV_VALUE_1, 0xffffffff & RCV_RULE_DISABLE_MASK);
7178
4cf78e4f 7179 if ((tp->tg3_flags2 & TG3_FLG2_5705_PLUS) &&
a4e2b347 7180 !(tp->tg3_flags2 & TG3_FLG2_5780_CLASS))
1da177e4
LT
7181 limit = 8;
7182 else
7183 limit = 16;
7184 if (tp->tg3_flags & TG3_FLAG_ENABLE_ASF)
7185 limit -= 4;
7186 switch (limit) {
7187 case 16:
7188 tw32(MAC_RCV_RULE_15, 0); tw32(MAC_RCV_VALUE_15, 0);
7189 case 15:
7190 tw32(MAC_RCV_RULE_14, 0); tw32(MAC_RCV_VALUE_14, 0);
7191 case 14:
7192 tw32(MAC_RCV_RULE_13, 0); tw32(MAC_RCV_VALUE_13, 0);
7193 case 13:
7194 tw32(MAC_RCV_RULE_12, 0); tw32(MAC_RCV_VALUE_12, 0);
7195 case 12:
7196 tw32(MAC_RCV_RULE_11, 0); tw32(MAC_RCV_VALUE_11, 0);
7197 case 11:
7198 tw32(MAC_RCV_RULE_10, 0); tw32(MAC_RCV_VALUE_10, 0);
7199 case 10:
7200 tw32(MAC_RCV_RULE_9, 0); tw32(MAC_RCV_VALUE_9, 0);
7201 case 9:
7202 tw32(MAC_RCV_RULE_8, 0); tw32(MAC_RCV_VALUE_8, 0);
7203 case 8:
7204 tw32(MAC_RCV_RULE_7, 0); tw32(MAC_RCV_VALUE_7, 0);
7205 case 7:
7206 tw32(MAC_RCV_RULE_6, 0); tw32(MAC_RCV_VALUE_6, 0);
7207 case 6:
7208 tw32(MAC_RCV_RULE_5, 0); tw32(MAC_RCV_VALUE_5, 0);
7209 case 5:
7210 tw32(MAC_RCV_RULE_4, 0); tw32(MAC_RCV_VALUE_4, 0);
7211 case 4:
7212 /* tw32(MAC_RCV_RULE_3, 0); tw32(MAC_RCV_VALUE_3, 0); */
7213 case 3:
7214 /* tw32(MAC_RCV_RULE_2, 0); tw32(MAC_RCV_VALUE_2, 0); */
7215 case 2:
7216 case 1:
7217
7218 default:
7219 break;
7220 };
7221
9ce768ea
MC
7222 if (tp->tg3_flags3 & TG3_FLG3_ENABLE_APE)
7223 /* Write our heartbeat update interval to APE. */
7224 tg3_ape_write32(tp, TG3_APE_HOST_HEARTBEAT_INT_MS,
7225 APE_HOST_HEARTBEAT_INT_DISABLE);
0d3031d9 7226
1da177e4
LT
7227 tg3_write_sig_post_reset(tp, RESET_KIND_INIT);
7228
1da177e4
LT
7229 return 0;
7230}
7231
7232/* Called at device open time to get the chip ready for
7233 * packet processing. Invoked with tp->lock held.
7234 */
8e7a22e3 7235static int tg3_init_hw(struct tg3 *tp, int reset_phy)
1da177e4
LT
7236{
7237 int err;
7238
7239 /* Force the chip into D0. */
bc1c7567 7240 err = tg3_set_power_state(tp, PCI_D0);
1da177e4
LT
7241 if (err)
7242 goto out;
7243
7244 tg3_switch_clocks(tp);
7245
7246 tw32(TG3PCI_MEM_WIN_BASE_ADDR, 0);
7247
8e7a22e3 7248 err = tg3_reset_hw(tp, reset_phy);
1da177e4
LT
7249
7250out:
7251 return err;
7252}
7253
7254#define TG3_STAT_ADD32(PSTAT, REG) \
7255do { u32 __val = tr32(REG); \
7256 (PSTAT)->low += __val; \
7257 if ((PSTAT)->low < __val) \
7258 (PSTAT)->high += 1; \
7259} while (0)
7260
7261static void tg3_periodic_fetch_stats(struct tg3 *tp)
7262{
7263 struct tg3_hw_stats *sp = tp->hw_stats;
7264
7265 if (!netif_carrier_ok(tp->dev))
7266 return;
7267
7268 TG3_STAT_ADD32(&sp->tx_octets, MAC_TX_STATS_OCTETS);
7269 TG3_STAT_ADD32(&sp->tx_collisions, MAC_TX_STATS_COLLISIONS);
7270 TG3_STAT_ADD32(&sp->tx_xon_sent, MAC_TX_STATS_XON_SENT);
7271 TG3_STAT_ADD32(&sp->tx_xoff_sent, MAC_TX_STATS_XOFF_SENT);
7272 TG3_STAT_ADD32(&sp->tx_mac_errors, MAC_TX_STATS_MAC_ERRORS);
7273 TG3_STAT_ADD32(&sp->tx_single_collisions, MAC_TX_STATS_SINGLE_COLLISIONS);
7274 TG3_STAT_ADD32(&sp->tx_mult_collisions, MAC_TX_STATS_MULT_COLLISIONS);
7275 TG3_STAT_ADD32(&sp->tx_deferred, MAC_TX_STATS_DEFERRED);
7276 TG3_STAT_ADD32(&sp->tx_excessive_collisions, MAC_TX_STATS_EXCESSIVE_COL);
7277 TG3_STAT_ADD32(&sp->tx_late_collisions, MAC_TX_STATS_LATE_COL);
7278 TG3_STAT_ADD32(&sp->tx_ucast_packets, MAC_TX_STATS_UCAST);
7279 TG3_STAT_ADD32(&sp->tx_mcast_packets, MAC_TX_STATS_MCAST);
7280 TG3_STAT_ADD32(&sp->tx_bcast_packets, MAC_TX_STATS_BCAST);
7281
7282 TG3_STAT_ADD32(&sp->rx_octets, MAC_RX_STATS_OCTETS);
7283 TG3_STAT_ADD32(&sp->rx_fragments, MAC_RX_STATS_FRAGMENTS);
7284 TG3_STAT_ADD32(&sp->rx_ucast_packets, MAC_RX_STATS_UCAST);
7285 TG3_STAT_ADD32(&sp->rx_mcast_packets, MAC_RX_STATS_MCAST);
7286 TG3_STAT_ADD32(&sp->rx_bcast_packets, MAC_RX_STATS_BCAST);
7287 TG3_STAT_ADD32(&sp->rx_fcs_errors, MAC_RX_STATS_FCS_ERRORS);
7288 TG3_STAT_ADD32(&sp->rx_align_errors, MAC_RX_STATS_ALIGN_ERRORS);
7289 TG3_STAT_ADD32(&sp->rx_xon_pause_rcvd, MAC_RX_STATS_XON_PAUSE_RECVD);
7290 TG3_STAT_ADD32(&sp->rx_xoff_pause_rcvd, MAC_RX_STATS_XOFF_PAUSE_RECVD);
7291 TG3_STAT_ADD32(&sp->rx_mac_ctrl_rcvd, MAC_RX_STATS_MAC_CTRL_RECVD);
7292 TG3_STAT_ADD32(&sp->rx_xoff_entered, MAC_RX_STATS_XOFF_ENTERED);
7293 TG3_STAT_ADD32(&sp->rx_frame_too_long_errors, MAC_RX_STATS_FRAME_TOO_LONG);
7294 TG3_STAT_ADD32(&sp->rx_jabbers, MAC_RX_STATS_JABBERS);
7295 TG3_STAT_ADD32(&sp->rx_undersize_packets, MAC_RX_STATS_UNDERSIZE);
463d305b
MC
7296
7297 TG3_STAT_ADD32(&sp->rxbds_empty, RCVLPC_NO_RCV_BD_CNT);
7298 TG3_STAT_ADD32(&sp->rx_discards, RCVLPC_IN_DISCARDS_CNT);
7299 TG3_STAT_ADD32(&sp->rx_errors, RCVLPC_IN_ERRORS_CNT);
1da177e4
LT
7300}
7301
7302static void tg3_timer(unsigned long __opaque)
7303{
7304 struct tg3 *tp = (struct tg3 *) __opaque;
1da177e4 7305
f475f163
MC
7306 if (tp->irq_sync)
7307 goto restart_timer;
7308
f47c11ee 7309 spin_lock(&tp->lock);
1da177e4 7310
fac9b83e
DM
7311 if (!(tp->tg3_flags & TG3_FLAG_TAGGED_STATUS)) {
7312 /* All of this garbage is because when using non-tagged
7313 * IRQ status the mailbox/status_block protocol the chip
7314 * uses with the cpu is race prone.
7315 */
7316 if (tp->hw_status->status & SD_STATUS_UPDATED) {
7317 tw32(GRC_LOCAL_CTRL,
7318 tp->grc_local_ctrl | GRC_LCLCTRL_SETINT);
7319 } else {
7320 tw32(HOSTCC_MODE, tp->coalesce_mode |
7321 (HOSTCC_MODE_ENABLE | HOSTCC_MODE_NOW));
7322 }
1da177e4 7323
fac9b83e
DM
7324 if (!(tr32(WDMAC_MODE) & WDMAC_MODE_ENABLE)) {
7325 tp->tg3_flags2 |= TG3_FLG2_RESTART_TIMER;
f47c11ee 7326 spin_unlock(&tp->lock);
fac9b83e
DM
7327 schedule_work(&tp->reset_task);
7328 return;
7329 }
1da177e4
LT
7330 }
7331
1da177e4
LT
7332 /* This part only runs once per second. */
7333 if (!--tp->timer_counter) {
fac9b83e
DM
7334 if (tp->tg3_flags2 & TG3_FLG2_5705_PLUS)
7335 tg3_periodic_fetch_stats(tp);
7336
1da177e4
LT
7337 if (tp->tg3_flags & TG3_FLAG_USE_LINKCHG_REG) {
7338 u32 mac_stat;
7339 int phy_event;
7340
7341 mac_stat = tr32(MAC_STATUS);
7342
7343 phy_event = 0;
7344 if (tp->tg3_flags & TG3_FLAG_USE_MI_INTERRUPT) {
7345 if (mac_stat & MAC_STATUS_MI_INTERRUPT)
7346 phy_event = 1;
7347 } else if (mac_stat & MAC_STATUS_LNKSTATE_CHANGED)
7348 phy_event = 1;
7349
7350 if (phy_event)
7351 tg3_setup_phy(tp, 0);
7352 } else if (tp->tg3_flags & TG3_FLAG_POLL_SERDES) {
7353 u32 mac_stat = tr32(MAC_STATUS);
7354 int need_setup = 0;
7355
7356 if (netif_carrier_ok(tp->dev) &&
7357 (mac_stat & MAC_STATUS_LNKSTATE_CHANGED)) {
7358 need_setup = 1;
7359 }
7360 if (! netif_carrier_ok(tp->dev) &&
7361 (mac_stat & (MAC_STATUS_PCS_SYNCED |
7362 MAC_STATUS_SIGNAL_DET))) {
7363 need_setup = 1;
7364 }
7365 if (need_setup) {
3d3ebe74
MC
7366 if (!tp->serdes_counter) {
7367 tw32_f(MAC_MODE,
7368 (tp->mac_mode &
7369 ~MAC_MODE_PORT_MODE_MASK));
7370 udelay(40);
7371 tw32_f(MAC_MODE, tp->mac_mode);
7372 udelay(40);
7373 }
1da177e4
LT
7374 tg3_setup_phy(tp, 0);
7375 }
747e8f8b
MC
7376 } else if (tp->tg3_flags2 & TG3_FLG2_MII_SERDES)
7377 tg3_serdes_parallel_detect(tp);
1da177e4
LT
7378
7379 tp->timer_counter = tp->timer_multiplier;
7380 }
7381
130b8e4d
MC
7382 /* Heartbeat is only sent once every 2 seconds.
7383 *
7384 * The heartbeat is to tell the ASF firmware that the host
7385 * driver is still alive. In the event that the OS crashes,
7386 * ASF needs to reset the hardware to free up the FIFO space
7387 * that may be filled with rx packets destined for the host.
7388 * If the FIFO is full, ASF will no longer function properly.
7389 *
7390 * Unintended resets have been reported on real time kernels
7391 * where the timer doesn't run on time. Netpoll will also have
7392 * same problem.
7393 *
7394 * The new FWCMD_NICDRV_ALIVE3 command tells the ASF firmware
7395 * to check the ring condition when the heartbeat is expiring
7396 * before doing the reset. This will prevent most unintended
7397 * resets.
7398 */
1da177e4
LT
7399 if (!--tp->asf_counter) {
7400 if (tp->tg3_flags & TG3_FLAG_ENABLE_ASF) {
7401 u32 val;
7402
bbadf503 7403 tg3_write_mem(tp, NIC_SRAM_FW_CMD_MBOX,
130b8e4d 7404 FWCMD_NICDRV_ALIVE3);
bbadf503 7405 tg3_write_mem(tp, NIC_SRAM_FW_CMD_LEN_MBOX, 4);
28fbef78 7406 /* 5 seconds timeout */
bbadf503 7407 tg3_write_mem(tp, NIC_SRAM_FW_CMD_DATA_MBOX, 5);
1da177e4
LT
7408 val = tr32(GRC_RX_CPU_EVENT);
7409 val |= (1 << 14);
7410 tw32(GRC_RX_CPU_EVENT, val);
7411 }
7412 tp->asf_counter = tp->asf_multiplier;
7413 }
7414
f47c11ee 7415 spin_unlock(&tp->lock);
1da177e4 7416
f475f163 7417restart_timer:
1da177e4
LT
7418 tp->timer.expires = jiffies + tp->timer_offset;
7419 add_timer(&tp->timer);
7420}
7421
81789ef5 7422static int tg3_request_irq(struct tg3 *tp)
fcfa0a32 7423{
7d12e780 7424 irq_handler_t fn;
fcfa0a32
MC
7425 unsigned long flags;
7426 struct net_device *dev = tp->dev;
7427
7428 if (tp->tg3_flags2 & TG3_FLG2_USING_MSI) {
7429 fn = tg3_msi;
7430 if (tp->tg3_flags2 & TG3_FLG2_1SHOT_MSI)
7431 fn = tg3_msi_1shot;
1fb9df5d 7432 flags = IRQF_SAMPLE_RANDOM;
fcfa0a32
MC
7433 } else {
7434 fn = tg3_interrupt;
7435 if (tp->tg3_flags & TG3_FLAG_TAGGED_STATUS)
7436 fn = tg3_interrupt_tagged;
1fb9df5d 7437 flags = IRQF_SHARED | IRQF_SAMPLE_RANDOM;
fcfa0a32
MC
7438 }
7439 return (request_irq(tp->pdev->irq, fn, flags, dev->name, dev));
7440}
7441
7938109f
MC
7442static int tg3_test_interrupt(struct tg3 *tp)
7443{
7444 struct net_device *dev = tp->dev;
b16250e3 7445 int err, i, intr_ok = 0;
7938109f 7446
d4bc3927
MC
7447 if (!netif_running(dev))
7448 return -ENODEV;
7449
7938109f
MC
7450 tg3_disable_ints(tp);
7451
7452 free_irq(tp->pdev->irq, dev);
7453
7454 err = request_irq(tp->pdev->irq, tg3_test_isr,
1fb9df5d 7455 IRQF_SHARED | IRQF_SAMPLE_RANDOM, dev->name, dev);
7938109f
MC
7456 if (err)
7457 return err;
7458
38f3843e 7459 tp->hw_status->status &= ~SD_STATUS_UPDATED;
7938109f
MC
7460 tg3_enable_ints(tp);
7461
7462 tw32_f(HOSTCC_MODE, tp->coalesce_mode | HOSTCC_MODE_ENABLE |
7463 HOSTCC_MODE_NOW);
7464
7465 for (i = 0; i < 5; i++) {
b16250e3
MC
7466 u32 int_mbox, misc_host_ctrl;
7467
09ee929c
MC
7468 int_mbox = tr32_mailbox(MAILBOX_INTERRUPT_0 +
7469 TG3_64BIT_REG_LOW);
b16250e3
MC
7470 misc_host_ctrl = tr32(TG3PCI_MISC_HOST_CTRL);
7471
7472 if ((int_mbox != 0) ||
7473 (misc_host_ctrl & MISC_HOST_CTRL_MASK_PCI_INT)) {
7474 intr_ok = 1;
7938109f 7475 break;
b16250e3
MC
7476 }
7477
7938109f
MC
7478 msleep(10);
7479 }
7480
7481 tg3_disable_ints(tp);
7482
7483 free_irq(tp->pdev->irq, dev);
6aa20a22 7484
fcfa0a32 7485 err = tg3_request_irq(tp);
7938109f
MC
7486
7487 if (err)
7488 return err;
7489
b16250e3 7490 if (intr_ok)
7938109f
MC
7491 return 0;
7492
7493 return -EIO;
7494}
7495
7496/* Returns 0 if MSI test succeeds or MSI test fails and INTx mode is
7497 * successfully restored
7498 */
7499static int tg3_test_msi(struct tg3 *tp)
7500{
7501 struct net_device *dev = tp->dev;
7502 int err;
7503 u16 pci_cmd;
7504
7505 if (!(tp->tg3_flags2 & TG3_FLG2_USING_MSI))
7506 return 0;
7507
7508 /* Turn off SERR reporting in case MSI terminates with Master
7509 * Abort.
7510 */
7511 pci_read_config_word(tp->pdev, PCI_COMMAND, &pci_cmd);
7512 pci_write_config_word(tp->pdev, PCI_COMMAND,
7513 pci_cmd & ~PCI_COMMAND_SERR);
7514
7515 err = tg3_test_interrupt(tp);
7516
7517 pci_write_config_word(tp->pdev, PCI_COMMAND, pci_cmd);
7518
7519 if (!err)
7520 return 0;
7521
7522 /* other failures */
7523 if (err != -EIO)
7524 return err;
7525
7526 /* MSI test failed, go back to INTx mode */
7527 printk(KERN_WARNING PFX "%s: No interrupt was generated using MSI, "
7528 "switching to INTx mode. Please report this failure to "
7529 "the PCI maintainer and include system chipset information.\n",
7530 tp->dev->name);
7531
7532 free_irq(tp->pdev->irq, dev);
7533 pci_disable_msi(tp->pdev);
7534
7535 tp->tg3_flags2 &= ~TG3_FLG2_USING_MSI;
7536
fcfa0a32 7537 err = tg3_request_irq(tp);
7938109f
MC
7538 if (err)
7539 return err;
7540
7541 /* Need to reset the chip because the MSI cycle may have terminated
7542 * with Master Abort.
7543 */
f47c11ee 7544 tg3_full_lock(tp, 1);
7938109f 7545
944d980e 7546 tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
8e7a22e3 7547 err = tg3_init_hw(tp, 1);
7938109f 7548
f47c11ee 7549 tg3_full_unlock(tp);
7938109f
MC
7550
7551 if (err)
7552 free_irq(tp->pdev->irq, dev);
7553
7554 return err;
7555}
7556
1da177e4
LT
7557static int tg3_open(struct net_device *dev)
7558{
7559 struct tg3 *tp = netdev_priv(dev);
7560 int err;
7561
c49a1561
MC
7562 netif_carrier_off(tp->dev);
7563
f47c11ee 7564 tg3_full_lock(tp, 0);
1da177e4 7565
bc1c7567 7566 err = tg3_set_power_state(tp, PCI_D0);
12862086
IS
7567 if (err) {
7568 tg3_full_unlock(tp);
bc1c7567 7569 return err;
12862086 7570 }
bc1c7567 7571
1da177e4
LT
7572 tg3_disable_ints(tp);
7573 tp->tg3_flags &= ~TG3_FLAG_INIT_COMPLETE;
7574
f47c11ee 7575 tg3_full_unlock(tp);
1da177e4
LT
7576
7577 /* The placement of this call is tied
7578 * to the setup and use of Host TX descriptors.
7579 */
7580 err = tg3_alloc_consistent(tp);
7581 if (err)
7582 return err;
7583
7544b097 7584 if (tp->tg3_flags & TG3_FLAG_SUPPORT_MSI) {
fac9b83e
DM
7585 /* All MSI supporting chips should support tagged
7586 * status. Assert that this is the case.
7587 */
7588 if (!(tp->tg3_flags & TG3_FLAG_TAGGED_STATUS)) {
7589 printk(KERN_WARNING PFX "%s: MSI without TAGGED? "
7590 "Not using MSI.\n", tp->dev->name);
7591 } else if (pci_enable_msi(tp->pdev) == 0) {
88b06bc2
MC
7592 u32 msi_mode;
7593
7594 msi_mode = tr32(MSGINT_MODE);
7595 tw32(MSGINT_MODE, msi_mode | MSGINT_MODE_ENABLE);
7596 tp->tg3_flags2 |= TG3_FLG2_USING_MSI;
7597 }
7598 }
fcfa0a32 7599 err = tg3_request_irq(tp);
1da177e4
LT
7600
7601 if (err) {
88b06bc2
MC
7602 if (tp->tg3_flags2 & TG3_FLG2_USING_MSI) {
7603 pci_disable_msi(tp->pdev);
7604 tp->tg3_flags2 &= ~TG3_FLG2_USING_MSI;
7605 }
1da177e4
LT
7606 tg3_free_consistent(tp);
7607 return err;
7608 }
7609
bea3348e
SH
7610 napi_enable(&tp->napi);
7611
f47c11ee 7612 tg3_full_lock(tp, 0);
1da177e4 7613
8e7a22e3 7614 err = tg3_init_hw(tp, 1);
1da177e4 7615 if (err) {
944d980e 7616 tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
1da177e4
LT
7617 tg3_free_rings(tp);
7618 } else {
fac9b83e
DM
7619 if (tp->tg3_flags & TG3_FLAG_TAGGED_STATUS)
7620 tp->timer_offset = HZ;
7621 else
7622 tp->timer_offset = HZ / 10;
7623
7624 BUG_ON(tp->timer_offset > HZ);
7625 tp->timer_counter = tp->timer_multiplier =
7626 (HZ / tp->timer_offset);
7627 tp->asf_counter = tp->asf_multiplier =
28fbef78 7628 ((HZ / tp->timer_offset) * 2);
1da177e4
LT
7629
7630 init_timer(&tp->timer);
7631 tp->timer.expires = jiffies + tp->timer_offset;
7632 tp->timer.data = (unsigned long) tp;
7633 tp->timer.function = tg3_timer;
1da177e4
LT
7634 }
7635
f47c11ee 7636 tg3_full_unlock(tp);
1da177e4
LT
7637
7638 if (err) {
bea3348e 7639 napi_disable(&tp->napi);
88b06bc2
MC
7640 free_irq(tp->pdev->irq, dev);
7641 if (tp->tg3_flags2 & TG3_FLG2_USING_MSI) {
7642 pci_disable_msi(tp->pdev);
7643 tp->tg3_flags2 &= ~TG3_FLG2_USING_MSI;
7644 }
1da177e4
LT
7645 tg3_free_consistent(tp);
7646 return err;
7647 }
7648
7938109f
MC
7649 if (tp->tg3_flags2 & TG3_FLG2_USING_MSI) {
7650 err = tg3_test_msi(tp);
fac9b83e 7651
7938109f 7652 if (err) {
f47c11ee 7653 tg3_full_lock(tp, 0);
7938109f
MC
7654
7655 if (tp->tg3_flags2 & TG3_FLG2_USING_MSI) {
7656 pci_disable_msi(tp->pdev);
7657 tp->tg3_flags2 &= ~TG3_FLG2_USING_MSI;
7658 }
944d980e 7659 tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
7938109f
MC
7660 tg3_free_rings(tp);
7661 tg3_free_consistent(tp);
7662
f47c11ee 7663 tg3_full_unlock(tp);
7938109f 7664
bea3348e
SH
7665 napi_disable(&tp->napi);
7666
7938109f
MC
7667 return err;
7668 }
fcfa0a32
MC
7669
7670 if (tp->tg3_flags2 & TG3_FLG2_USING_MSI) {
7671 if (tp->tg3_flags2 & TG3_FLG2_1SHOT_MSI) {
b5d3772c 7672 u32 val = tr32(PCIE_TRANSACTION_CFG);
fcfa0a32 7673
b5d3772c
MC
7674 tw32(PCIE_TRANSACTION_CFG,
7675 val | PCIE_TRANS_CFG_1SHOT_MSI);
fcfa0a32
MC
7676 }
7677 }
7938109f
MC
7678 }
7679
f47c11ee 7680 tg3_full_lock(tp, 0);
1da177e4 7681
7938109f
MC
7682 add_timer(&tp->timer);
7683 tp->tg3_flags |= TG3_FLAG_INIT_COMPLETE;
1da177e4
LT
7684 tg3_enable_ints(tp);
7685
f47c11ee 7686 tg3_full_unlock(tp);
1da177e4
LT
7687
7688 netif_start_queue(dev);
7689
7690 return 0;
7691}
7692
7693#if 0
7694/*static*/ void tg3_dump_state(struct tg3 *tp)
7695{
7696 u32 val32, val32_2, val32_3, val32_4, val32_5;
7697 u16 val16;
7698 int i;
7699
7700 pci_read_config_word(tp->pdev, PCI_STATUS, &val16);
7701 pci_read_config_dword(tp->pdev, TG3PCI_PCISTATE, &val32);
7702 printk("DEBUG: PCI status [%04x] TG3PCI state[%08x]\n",
7703 val16, val32);
7704
7705 /* MAC block */
7706 printk("DEBUG: MAC_MODE[%08x] MAC_STATUS[%08x]\n",
7707 tr32(MAC_MODE), tr32(MAC_STATUS));
7708 printk(" MAC_EVENT[%08x] MAC_LED_CTRL[%08x]\n",
7709 tr32(MAC_EVENT), tr32(MAC_LED_CTRL));
7710 printk("DEBUG: MAC_TX_MODE[%08x] MAC_TX_STATUS[%08x]\n",
7711 tr32(MAC_TX_MODE), tr32(MAC_TX_STATUS));
7712 printk(" MAC_RX_MODE[%08x] MAC_RX_STATUS[%08x]\n",
7713 tr32(MAC_RX_MODE), tr32(MAC_RX_STATUS));
7714
7715 /* Send data initiator control block */
7716 printk("DEBUG: SNDDATAI_MODE[%08x] SNDDATAI_STATUS[%08x]\n",
7717 tr32(SNDDATAI_MODE), tr32(SNDDATAI_STATUS));
7718 printk(" SNDDATAI_STATSCTRL[%08x]\n",
7719 tr32(SNDDATAI_STATSCTRL));
7720
7721 /* Send data completion control block */
7722 printk("DEBUG: SNDDATAC_MODE[%08x]\n", tr32(SNDDATAC_MODE));
7723
7724 /* Send BD ring selector block */
7725 printk("DEBUG: SNDBDS_MODE[%08x] SNDBDS_STATUS[%08x]\n",
7726 tr32(SNDBDS_MODE), tr32(SNDBDS_STATUS));
7727
7728 /* Send BD initiator control block */
7729 printk("DEBUG: SNDBDI_MODE[%08x] SNDBDI_STATUS[%08x]\n",
7730 tr32(SNDBDI_MODE), tr32(SNDBDI_STATUS));
7731
7732 /* Send BD completion control block */
7733 printk("DEBUG: SNDBDC_MODE[%08x]\n", tr32(SNDBDC_MODE));
7734
7735 /* Receive list placement control block */
7736 printk("DEBUG: RCVLPC_MODE[%08x] RCVLPC_STATUS[%08x]\n",
7737 tr32(RCVLPC_MODE), tr32(RCVLPC_STATUS));
7738 printk(" RCVLPC_STATSCTRL[%08x]\n",
7739 tr32(RCVLPC_STATSCTRL));
7740
7741 /* Receive data and receive BD initiator control block */
7742 printk("DEBUG: RCVDBDI_MODE[%08x] RCVDBDI_STATUS[%08x]\n",
7743 tr32(RCVDBDI_MODE), tr32(RCVDBDI_STATUS));
7744
7745 /* Receive data completion control block */
7746 printk("DEBUG: RCVDCC_MODE[%08x]\n",
7747 tr32(RCVDCC_MODE));
7748
7749 /* Receive BD initiator control block */
7750 printk("DEBUG: RCVBDI_MODE[%08x] RCVBDI_STATUS[%08x]\n",
7751 tr32(RCVBDI_MODE), tr32(RCVBDI_STATUS));
7752
7753 /* Receive BD completion control block */
7754 printk("DEBUG: RCVCC_MODE[%08x] RCVCC_STATUS[%08x]\n",
7755 tr32(RCVCC_MODE), tr32(RCVCC_STATUS));
7756
7757 /* Receive list selector control block */
7758 printk("DEBUG: RCVLSC_MODE[%08x] RCVLSC_STATUS[%08x]\n",
7759 tr32(RCVLSC_MODE), tr32(RCVLSC_STATUS));
7760
7761 /* Mbuf cluster free block */
7762 printk("DEBUG: MBFREE_MODE[%08x] MBFREE_STATUS[%08x]\n",
7763 tr32(MBFREE_MODE), tr32(MBFREE_STATUS));
7764
7765 /* Host coalescing control block */
7766 printk("DEBUG: HOSTCC_MODE[%08x] HOSTCC_STATUS[%08x]\n",
7767 tr32(HOSTCC_MODE), tr32(HOSTCC_STATUS));
7768 printk("DEBUG: HOSTCC_STATS_BLK_HOST_ADDR[%08x%08x]\n",
7769 tr32(HOSTCC_STATS_BLK_HOST_ADDR + TG3_64BIT_REG_HIGH),
7770 tr32(HOSTCC_STATS_BLK_HOST_ADDR + TG3_64BIT_REG_LOW));
7771 printk("DEBUG: HOSTCC_STATUS_BLK_HOST_ADDR[%08x%08x]\n",
7772 tr32(HOSTCC_STATUS_BLK_HOST_ADDR + TG3_64BIT_REG_HIGH),
7773 tr32(HOSTCC_STATUS_BLK_HOST_ADDR + TG3_64BIT_REG_LOW));
7774 printk("DEBUG: HOSTCC_STATS_BLK_NIC_ADDR[%08x]\n",
7775 tr32(HOSTCC_STATS_BLK_NIC_ADDR));
7776 printk("DEBUG: HOSTCC_STATUS_BLK_NIC_ADDR[%08x]\n",
7777 tr32(HOSTCC_STATUS_BLK_NIC_ADDR));
7778
7779 /* Memory arbiter control block */
7780 printk("DEBUG: MEMARB_MODE[%08x] MEMARB_STATUS[%08x]\n",
7781 tr32(MEMARB_MODE), tr32(MEMARB_STATUS));
7782
7783 /* Buffer manager control block */
7784 printk("DEBUG: BUFMGR_MODE[%08x] BUFMGR_STATUS[%08x]\n",
7785 tr32(BUFMGR_MODE), tr32(BUFMGR_STATUS));
7786 printk("DEBUG: BUFMGR_MB_POOL_ADDR[%08x] BUFMGR_MB_POOL_SIZE[%08x]\n",
7787 tr32(BUFMGR_MB_POOL_ADDR), tr32(BUFMGR_MB_POOL_SIZE));
7788 printk("DEBUG: BUFMGR_DMA_DESC_POOL_ADDR[%08x] "
7789 "BUFMGR_DMA_DESC_POOL_SIZE[%08x]\n",
7790 tr32(BUFMGR_DMA_DESC_POOL_ADDR),
7791 tr32(BUFMGR_DMA_DESC_POOL_SIZE));
7792
7793 /* Read DMA control block */
7794 printk("DEBUG: RDMAC_MODE[%08x] RDMAC_STATUS[%08x]\n",
7795 tr32(RDMAC_MODE), tr32(RDMAC_STATUS));
7796
7797 /* Write DMA control block */
7798 printk("DEBUG: WDMAC_MODE[%08x] WDMAC_STATUS[%08x]\n",
7799 tr32(WDMAC_MODE), tr32(WDMAC_STATUS));
7800
7801 /* DMA completion block */
7802 printk("DEBUG: DMAC_MODE[%08x]\n",
7803 tr32(DMAC_MODE));
7804
7805 /* GRC block */
7806 printk("DEBUG: GRC_MODE[%08x] GRC_MISC_CFG[%08x]\n",
7807 tr32(GRC_MODE), tr32(GRC_MISC_CFG));
7808 printk("DEBUG: GRC_LOCAL_CTRL[%08x]\n",
7809 tr32(GRC_LOCAL_CTRL));
7810
7811 /* TG3_BDINFOs */
7812 printk("DEBUG: RCVDBDI_JUMBO_BD[%08x%08x:%08x:%08x]\n",
7813 tr32(RCVDBDI_JUMBO_BD + 0x0),
7814 tr32(RCVDBDI_JUMBO_BD + 0x4),
7815 tr32(RCVDBDI_JUMBO_BD + 0x8),
7816 tr32(RCVDBDI_JUMBO_BD + 0xc));
7817 printk("DEBUG: RCVDBDI_STD_BD[%08x%08x:%08x:%08x]\n",
7818 tr32(RCVDBDI_STD_BD + 0x0),
7819 tr32(RCVDBDI_STD_BD + 0x4),
7820 tr32(RCVDBDI_STD_BD + 0x8),
7821 tr32(RCVDBDI_STD_BD + 0xc));
7822 printk("DEBUG: RCVDBDI_MINI_BD[%08x%08x:%08x:%08x]\n",
7823 tr32(RCVDBDI_MINI_BD + 0x0),
7824 tr32(RCVDBDI_MINI_BD + 0x4),
7825 tr32(RCVDBDI_MINI_BD + 0x8),
7826 tr32(RCVDBDI_MINI_BD + 0xc));
7827
7828 tg3_read_mem(tp, NIC_SRAM_SEND_RCB + 0x0, &val32);
7829 tg3_read_mem(tp, NIC_SRAM_SEND_RCB + 0x4, &val32_2);
7830 tg3_read_mem(tp, NIC_SRAM_SEND_RCB + 0x8, &val32_3);
7831 tg3_read_mem(tp, NIC_SRAM_SEND_RCB + 0xc, &val32_4);
7832 printk("DEBUG: SRAM_SEND_RCB_0[%08x%08x:%08x:%08x]\n",
7833 val32, val32_2, val32_3, val32_4);
7834
7835 tg3_read_mem(tp, NIC_SRAM_RCV_RET_RCB + 0x0, &val32);
7836 tg3_read_mem(tp, NIC_SRAM_RCV_RET_RCB + 0x4, &val32_2);
7837 tg3_read_mem(tp, NIC_SRAM_RCV_RET_RCB + 0x8, &val32_3);
7838 tg3_read_mem(tp, NIC_SRAM_RCV_RET_RCB + 0xc, &val32_4);
7839 printk("DEBUG: SRAM_RCV_RET_RCB_0[%08x%08x:%08x:%08x]\n",
7840 val32, val32_2, val32_3, val32_4);
7841
7842 tg3_read_mem(tp, NIC_SRAM_STATUS_BLK + 0x0, &val32);
7843 tg3_read_mem(tp, NIC_SRAM_STATUS_BLK + 0x4, &val32_2);
7844 tg3_read_mem(tp, NIC_SRAM_STATUS_BLK + 0x8, &val32_3);
7845 tg3_read_mem(tp, NIC_SRAM_STATUS_BLK + 0xc, &val32_4);
7846 tg3_read_mem(tp, NIC_SRAM_STATUS_BLK + 0x10, &val32_5);
7847 printk("DEBUG: SRAM_STATUS_BLK[%08x:%08x:%08x:%08x:%08x]\n",
7848 val32, val32_2, val32_3, val32_4, val32_5);
7849
7850 /* SW status block */
7851 printk("DEBUG: Host status block [%08x:%08x:(%04x:%04x:%04x):(%04x:%04x)]\n",
7852 tp->hw_status->status,
7853 tp->hw_status->status_tag,
7854 tp->hw_status->rx_jumbo_consumer,
7855 tp->hw_status->rx_consumer,
7856 tp->hw_status->rx_mini_consumer,
7857 tp->hw_status->idx[0].rx_producer,
7858 tp->hw_status->idx[0].tx_consumer);
7859
7860 /* SW statistics block */
7861 printk("DEBUG: Host statistics block [%08x:%08x:%08x:%08x]\n",
7862 ((u32 *)tp->hw_stats)[0],
7863 ((u32 *)tp->hw_stats)[1],
7864 ((u32 *)tp->hw_stats)[2],
7865 ((u32 *)tp->hw_stats)[3]);
7866
7867 /* Mailboxes */
7868 printk("DEBUG: SNDHOST_PROD[%08x%08x] SNDNIC_PROD[%08x%08x]\n",
09ee929c
MC
7869 tr32_mailbox(MAILBOX_SNDHOST_PROD_IDX_0 + 0x0),
7870 tr32_mailbox(MAILBOX_SNDHOST_PROD_IDX_0 + 0x4),
7871 tr32_mailbox(MAILBOX_SNDNIC_PROD_IDX_0 + 0x0),
7872 tr32_mailbox(MAILBOX_SNDNIC_PROD_IDX_0 + 0x4));
1da177e4
LT
7873
7874 /* NIC side send descriptors. */
7875 for (i = 0; i < 6; i++) {
7876 unsigned long txd;
7877
7878 txd = tp->regs + NIC_SRAM_WIN_BASE + NIC_SRAM_TX_BUFFER_DESC
7879 + (i * sizeof(struct tg3_tx_buffer_desc));
7880 printk("DEBUG: NIC TXD(%d)[%08x:%08x:%08x:%08x]\n",
7881 i,
7882 readl(txd + 0x0), readl(txd + 0x4),
7883 readl(txd + 0x8), readl(txd + 0xc));
7884 }
7885
7886 /* NIC side RX descriptors. */
7887 for (i = 0; i < 6; i++) {
7888 unsigned long rxd;
7889
7890 rxd = tp->regs + NIC_SRAM_WIN_BASE + NIC_SRAM_RX_BUFFER_DESC
7891 + (i * sizeof(struct tg3_rx_buffer_desc));
7892 printk("DEBUG: NIC RXD_STD(%d)[0][%08x:%08x:%08x:%08x]\n",
7893 i,
7894 readl(rxd + 0x0), readl(rxd + 0x4),
7895 readl(rxd + 0x8), readl(rxd + 0xc));
7896 rxd += (4 * sizeof(u32));
7897 printk("DEBUG: NIC RXD_STD(%d)[1][%08x:%08x:%08x:%08x]\n",
7898 i,
7899 readl(rxd + 0x0), readl(rxd + 0x4),
7900 readl(rxd + 0x8), readl(rxd + 0xc));
7901 }
7902
7903 for (i = 0; i < 6; i++) {
7904 unsigned long rxd;
7905
7906 rxd = tp->regs + NIC_SRAM_WIN_BASE + NIC_SRAM_RX_JUMBO_BUFFER_DESC
7907 + (i * sizeof(struct tg3_rx_buffer_desc));
7908 printk("DEBUG: NIC RXD_JUMBO(%d)[0][%08x:%08x:%08x:%08x]\n",
7909 i,
7910 readl(rxd + 0x0), readl(rxd + 0x4),
7911 readl(rxd + 0x8), readl(rxd + 0xc));
7912 rxd += (4 * sizeof(u32));
7913 printk("DEBUG: NIC RXD_JUMBO(%d)[1][%08x:%08x:%08x:%08x]\n",
7914 i,
7915 readl(rxd + 0x0), readl(rxd + 0x4),
7916 readl(rxd + 0x8), readl(rxd + 0xc));
7917 }
7918}
7919#endif
7920
7921static struct net_device_stats *tg3_get_stats(struct net_device *);
7922static struct tg3_ethtool_stats *tg3_get_estats(struct tg3 *);
7923
7924static int tg3_close(struct net_device *dev)
7925{
7926 struct tg3 *tp = netdev_priv(dev);
7927
bea3348e 7928 napi_disable(&tp->napi);
28e53bdd 7929 cancel_work_sync(&tp->reset_task);
7faa006f 7930
1da177e4
LT
7931 netif_stop_queue(dev);
7932
7933 del_timer_sync(&tp->timer);
7934
f47c11ee 7935 tg3_full_lock(tp, 1);
1da177e4
LT
7936#if 0
7937 tg3_dump_state(tp);
7938#endif
7939
7940 tg3_disable_ints(tp);
7941
944d980e 7942 tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
1da177e4 7943 tg3_free_rings(tp);
5cf64b8a 7944 tp->tg3_flags &= ~TG3_FLAG_INIT_COMPLETE;
1da177e4 7945
f47c11ee 7946 tg3_full_unlock(tp);
1da177e4 7947
88b06bc2
MC
7948 free_irq(tp->pdev->irq, dev);
7949 if (tp->tg3_flags2 & TG3_FLG2_USING_MSI) {
7950 pci_disable_msi(tp->pdev);
7951 tp->tg3_flags2 &= ~TG3_FLG2_USING_MSI;
7952 }
1da177e4
LT
7953
7954 memcpy(&tp->net_stats_prev, tg3_get_stats(tp->dev),
7955 sizeof(tp->net_stats_prev));
7956 memcpy(&tp->estats_prev, tg3_get_estats(tp),
7957 sizeof(tp->estats_prev));
7958
7959 tg3_free_consistent(tp);
7960
bc1c7567
MC
7961 tg3_set_power_state(tp, PCI_D3hot);
7962
7963 netif_carrier_off(tp->dev);
7964
1da177e4
LT
7965 return 0;
7966}
7967
7968static inline unsigned long get_stat64(tg3_stat64_t *val)
7969{
7970 unsigned long ret;
7971
7972#if (BITS_PER_LONG == 32)
7973 ret = val->low;
7974#else
7975 ret = ((u64)val->high << 32) | ((u64)val->low);
7976#endif
7977 return ret;
7978}
7979
7980static unsigned long calc_crc_errors(struct tg3 *tp)
7981{
7982 struct tg3_hw_stats *hw_stats = tp->hw_stats;
7983
7984 if (!(tp->tg3_flags2 & TG3_FLG2_PHY_SERDES) &&
7985 (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 ||
7986 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701)) {
1da177e4
LT
7987 u32 val;
7988
f47c11ee 7989 spin_lock_bh(&tp->lock);
569a5df8
MC
7990 if (!tg3_readphy(tp, MII_TG3_TEST1, &val)) {
7991 tg3_writephy(tp, MII_TG3_TEST1,
7992 val | MII_TG3_TEST1_CRC_EN);
1da177e4
LT
7993 tg3_readphy(tp, 0x14, &val);
7994 } else
7995 val = 0;
f47c11ee 7996 spin_unlock_bh(&tp->lock);
1da177e4
LT
7997
7998 tp->phy_crc_errors += val;
7999
8000 return tp->phy_crc_errors;
8001 }
8002
8003 return get_stat64(&hw_stats->rx_fcs_errors);
8004}
8005
8006#define ESTAT_ADD(member) \
8007 estats->member = old_estats->member + \
8008 get_stat64(&hw_stats->member)
8009
8010static struct tg3_ethtool_stats *tg3_get_estats(struct tg3 *tp)
8011{
8012 struct tg3_ethtool_stats *estats = &tp->estats;
8013 struct tg3_ethtool_stats *old_estats = &tp->estats_prev;
8014 struct tg3_hw_stats *hw_stats = tp->hw_stats;
8015
8016 if (!hw_stats)
8017 return old_estats;
8018
8019 ESTAT_ADD(rx_octets);
8020 ESTAT_ADD(rx_fragments);
8021 ESTAT_ADD(rx_ucast_packets);
8022 ESTAT_ADD(rx_mcast_packets);
8023 ESTAT_ADD(rx_bcast_packets);
8024 ESTAT_ADD(rx_fcs_errors);
8025 ESTAT_ADD(rx_align_errors);
8026 ESTAT_ADD(rx_xon_pause_rcvd);
8027 ESTAT_ADD(rx_xoff_pause_rcvd);
8028 ESTAT_ADD(rx_mac_ctrl_rcvd);
8029 ESTAT_ADD(rx_xoff_entered);
8030 ESTAT_ADD(rx_frame_too_long_errors);
8031 ESTAT_ADD(rx_jabbers);
8032 ESTAT_ADD(rx_undersize_packets);
8033 ESTAT_ADD(rx_in_length_errors);
8034 ESTAT_ADD(rx_out_length_errors);
8035 ESTAT_ADD(rx_64_or_less_octet_packets);
8036 ESTAT_ADD(rx_65_to_127_octet_packets);
8037 ESTAT_ADD(rx_128_to_255_octet_packets);
8038 ESTAT_ADD(rx_256_to_511_octet_packets);
8039 ESTAT_ADD(rx_512_to_1023_octet_packets);
8040 ESTAT_ADD(rx_1024_to_1522_octet_packets);
8041 ESTAT_ADD(rx_1523_to_2047_octet_packets);
8042 ESTAT_ADD(rx_2048_to_4095_octet_packets);
8043 ESTAT_ADD(rx_4096_to_8191_octet_packets);
8044 ESTAT_ADD(rx_8192_to_9022_octet_packets);
8045
8046 ESTAT_ADD(tx_octets);
8047 ESTAT_ADD(tx_collisions);
8048 ESTAT_ADD(tx_xon_sent);
8049 ESTAT_ADD(tx_xoff_sent);
8050 ESTAT_ADD(tx_flow_control);
8051 ESTAT_ADD(tx_mac_errors);
8052 ESTAT_ADD(tx_single_collisions);
8053 ESTAT_ADD(tx_mult_collisions);
8054 ESTAT_ADD(tx_deferred);
8055 ESTAT_ADD(tx_excessive_collisions);
8056 ESTAT_ADD(tx_late_collisions);
8057 ESTAT_ADD(tx_collide_2times);
8058 ESTAT_ADD(tx_collide_3times);
8059 ESTAT_ADD(tx_collide_4times);
8060 ESTAT_ADD(tx_collide_5times);
8061 ESTAT_ADD(tx_collide_6times);
8062 ESTAT_ADD(tx_collide_7times);
8063 ESTAT_ADD(tx_collide_8times);
8064 ESTAT_ADD(tx_collide_9times);
8065 ESTAT_ADD(tx_collide_10times);
8066 ESTAT_ADD(tx_collide_11times);
8067 ESTAT_ADD(tx_collide_12times);
8068 ESTAT_ADD(tx_collide_13times);
8069 ESTAT_ADD(tx_collide_14times);
8070 ESTAT_ADD(tx_collide_15times);
8071 ESTAT_ADD(tx_ucast_packets);
8072 ESTAT_ADD(tx_mcast_packets);
8073 ESTAT_ADD(tx_bcast_packets);
8074 ESTAT_ADD(tx_carrier_sense_errors);
8075 ESTAT_ADD(tx_discards);
8076 ESTAT_ADD(tx_errors);
8077
8078 ESTAT_ADD(dma_writeq_full);
8079 ESTAT_ADD(dma_write_prioq_full);
8080 ESTAT_ADD(rxbds_empty);
8081 ESTAT_ADD(rx_discards);
8082 ESTAT_ADD(rx_errors);
8083 ESTAT_ADD(rx_threshold_hit);
8084
8085 ESTAT_ADD(dma_readq_full);
8086 ESTAT_ADD(dma_read_prioq_full);
8087 ESTAT_ADD(tx_comp_queue_full);
8088
8089 ESTAT_ADD(ring_set_send_prod_index);
8090 ESTAT_ADD(ring_status_update);
8091 ESTAT_ADD(nic_irqs);
8092 ESTAT_ADD(nic_avoided_irqs);
8093 ESTAT_ADD(nic_tx_threshold_hit);
8094
8095 return estats;
8096}
8097
8098static struct net_device_stats *tg3_get_stats(struct net_device *dev)
8099{
8100 struct tg3 *tp = netdev_priv(dev);
8101 struct net_device_stats *stats = &tp->net_stats;
8102 struct net_device_stats *old_stats = &tp->net_stats_prev;
8103 struct tg3_hw_stats *hw_stats = tp->hw_stats;
8104
8105 if (!hw_stats)
8106 return old_stats;
8107
8108 stats->rx_packets = old_stats->rx_packets +
8109 get_stat64(&hw_stats->rx_ucast_packets) +
8110 get_stat64(&hw_stats->rx_mcast_packets) +
8111 get_stat64(&hw_stats->rx_bcast_packets);
6aa20a22 8112
1da177e4
LT
8113 stats->tx_packets = old_stats->tx_packets +
8114 get_stat64(&hw_stats->tx_ucast_packets) +
8115 get_stat64(&hw_stats->tx_mcast_packets) +
8116 get_stat64(&hw_stats->tx_bcast_packets);
8117
8118 stats->rx_bytes = old_stats->rx_bytes +
8119 get_stat64(&hw_stats->rx_octets);
8120 stats->tx_bytes = old_stats->tx_bytes +
8121 get_stat64(&hw_stats->tx_octets);
8122
8123 stats->rx_errors = old_stats->rx_errors +
4f63b877 8124 get_stat64(&hw_stats->rx_errors);
1da177e4
LT
8125 stats->tx_errors = old_stats->tx_errors +
8126 get_stat64(&hw_stats->tx_errors) +
8127 get_stat64(&hw_stats->tx_mac_errors) +
8128 get_stat64(&hw_stats->tx_carrier_sense_errors) +
8129 get_stat64(&hw_stats->tx_discards);
8130
8131 stats->multicast = old_stats->multicast +
8132 get_stat64(&hw_stats->rx_mcast_packets);
8133 stats->collisions = old_stats->collisions +
8134 get_stat64(&hw_stats->tx_collisions);
8135
8136 stats->rx_length_errors = old_stats->rx_length_errors +
8137 get_stat64(&hw_stats->rx_frame_too_long_errors) +
8138 get_stat64(&hw_stats->rx_undersize_packets);
8139
8140 stats->rx_over_errors = old_stats->rx_over_errors +
8141 get_stat64(&hw_stats->rxbds_empty);
8142 stats->rx_frame_errors = old_stats->rx_frame_errors +
8143 get_stat64(&hw_stats->rx_align_errors);
8144 stats->tx_aborted_errors = old_stats->tx_aborted_errors +
8145 get_stat64(&hw_stats->tx_discards);
8146 stats->tx_carrier_errors = old_stats->tx_carrier_errors +
8147 get_stat64(&hw_stats->tx_carrier_sense_errors);
8148
8149 stats->rx_crc_errors = old_stats->rx_crc_errors +
8150 calc_crc_errors(tp);
8151
4f63b877
JL
8152 stats->rx_missed_errors = old_stats->rx_missed_errors +
8153 get_stat64(&hw_stats->rx_discards);
8154
1da177e4
LT
8155 return stats;
8156}
8157
8158static inline u32 calc_crc(unsigned char *buf, int len)
8159{
8160 u32 reg;
8161 u32 tmp;
8162 int j, k;
8163
8164 reg = 0xffffffff;
8165
8166 for (j = 0; j < len; j++) {
8167 reg ^= buf[j];
8168
8169 for (k = 0; k < 8; k++) {
8170 tmp = reg & 0x01;
8171
8172 reg >>= 1;
8173
8174 if (tmp) {
8175 reg ^= 0xedb88320;
8176 }
8177 }
8178 }
8179
8180 return ~reg;
8181}
8182
8183static void tg3_set_multi(struct tg3 *tp, unsigned int accept_all)
8184{
8185 /* accept or reject all multicast frames */
8186 tw32(MAC_HASH_REG_0, accept_all ? 0xffffffff : 0);
8187 tw32(MAC_HASH_REG_1, accept_all ? 0xffffffff : 0);
8188 tw32(MAC_HASH_REG_2, accept_all ? 0xffffffff : 0);
8189 tw32(MAC_HASH_REG_3, accept_all ? 0xffffffff : 0);
8190}
8191
8192static void __tg3_set_rx_mode(struct net_device *dev)
8193{
8194 struct tg3 *tp = netdev_priv(dev);
8195 u32 rx_mode;
8196
8197 rx_mode = tp->rx_mode & ~(RX_MODE_PROMISC |
8198 RX_MODE_KEEP_VLAN_TAG);
8199
8200 /* When ASF is in use, we always keep the RX_MODE_KEEP_VLAN_TAG
8201 * flag clear.
8202 */
8203#if TG3_VLAN_TAG_USED
8204 if (!tp->vlgrp &&
8205 !(tp->tg3_flags & TG3_FLAG_ENABLE_ASF))
8206 rx_mode |= RX_MODE_KEEP_VLAN_TAG;
8207#else
8208 /* By definition, VLAN is disabled always in this
8209 * case.
8210 */
8211 if (!(tp->tg3_flags & TG3_FLAG_ENABLE_ASF))
8212 rx_mode |= RX_MODE_KEEP_VLAN_TAG;
8213#endif
8214
8215 if (dev->flags & IFF_PROMISC) {
8216 /* Promiscuous mode. */
8217 rx_mode |= RX_MODE_PROMISC;
8218 } else if (dev->flags & IFF_ALLMULTI) {
8219 /* Accept all multicast. */
8220 tg3_set_multi (tp, 1);
8221 } else if (dev->mc_count < 1) {
8222 /* Reject all multicast. */
8223 tg3_set_multi (tp, 0);
8224 } else {
8225 /* Accept one or more multicast(s). */
8226 struct dev_mc_list *mclist;
8227 unsigned int i;
8228 u32 mc_filter[4] = { 0, };
8229 u32 regidx;
8230 u32 bit;
8231 u32 crc;
8232
8233 for (i = 0, mclist = dev->mc_list; mclist && i < dev->mc_count;
8234 i++, mclist = mclist->next) {
8235
8236 crc = calc_crc (mclist->dmi_addr, ETH_ALEN);
8237 bit = ~crc & 0x7f;
8238 regidx = (bit & 0x60) >> 5;
8239 bit &= 0x1f;
8240 mc_filter[regidx] |= (1 << bit);
8241 }
8242
8243 tw32(MAC_HASH_REG_0, mc_filter[0]);
8244 tw32(MAC_HASH_REG_1, mc_filter[1]);
8245 tw32(MAC_HASH_REG_2, mc_filter[2]);
8246 tw32(MAC_HASH_REG_3, mc_filter[3]);
8247 }
8248
8249 if (rx_mode != tp->rx_mode) {
8250 tp->rx_mode = rx_mode;
8251 tw32_f(MAC_RX_MODE, rx_mode);
8252 udelay(10);
8253 }
8254}
8255
8256static void tg3_set_rx_mode(struct net_device *dev)
8257{
8258 struct tg3 *tp = netdev_priv(dev);
8259
e75f7c90
MC
8260 if (!netif_running(dev))
8261 return;
8262
f47c11ee 8263 tg3_full_lock(tp, 0);
1da177e4 8264 __tg3_set_rx_mode(dev);
f47c11ee 8265 tg3_full_unlock(tp);
1da177e4
LT
8266}
8267
8268#define TG3_REGDUMP_LEN (32 * 1024)
8269
8270static int tg3_get_regs_len(struct net_device *dev)
8271{
8272 return TG3_REGDUMP_LEN;
8273}
8274
8275static void tg3_get_regs(struct net_device *dev,
8276 struct ethtool_regs *regs, void *_p)
8277{
8278 u32 *p = _p;
8279 struct tg3 *tp = netdev_priv(dev);
8280 u8 *orig_p = _p;
8281 int i;
8282
8283 regs->version = 0;
8284
8285 memset(p, 0, TG3_REGDUMP_LEN);
8286
bc1c7567
MC
8287 if (tp->link_config.phy_is_low_power)
8288 return;
8289
f47c11ee 8290 tg3_full_lock(tp, 0);
1da177e4
LT
8291
8292#define __GET_REG32(reg) (*(p)++ = tr32(reg))
8293#define GET_REG32_LOOP(base,len) \
8294do { p = (u32 *)(orig_p + (base)); \
8295 for (i = 0; i < len; i += 4) \
8296 __GET_REG32((base) + i); \
8297} while (0)
8298#define GET_REG32_1(reg) \
8299do { p = (u32 *)(orig_p + (reg)); \
8300 __GET_REG32((reg)); \
8301} while (0)
8302
8303 GET_REG32_LOOP(TG3PCI_VENDOR, 0xb0);
8304 GET_REG32_LOOP(MAILBOX_INTERRUPT_0, 0x200);
8305 GET_REG32_LOOP(MAC_MODE, 0x4f0);
8306 GET_REG32_LOOP(SNDDATAI_MODE, 0xe0);
8307 GET_REG32_1(SNDDATAC_MODE);
8308 GET_REG32_LOOP(SNDBDS_MODE, 0x80);
8309 GET_REG32_LOOP(SNDBDI_MODE, 0x48);
8310 GET_REG32_1(SNDBDC_MODE);
8311 GET_REG32_LOOP(RCVLPC_MODE, 0x20);
8312 GET_REG32_LOOP(RCVLPC_SELLST_BASE, 0x15c);
8313 GET_REG32_LOOP(RCVDBDI_MODE, 0x0c);
8314 GET_REG32_LOOP(RCVDBDI_JUMBO_BD, 0x3c);
8315 GET_REG32_LOOP(RCVDBDI_BD_PROD_IDX_0, 0x44);
8316 GET_REG32_1(RCVDCC_MODE);
8317 GET_REG32_LOOP(RCVBDI_MODE, 0x20);
8318 GET_REG32_LOOP(RCVCC_MODE, 0x14);
8319 GET_REG32_LOOP(RCVLSC_MODE, 0x08);
8320 GET_REG32_1(MBFREE_MODE);
8321 GET_REG32_LOOP(HOSTCC_MODE, 0x100);
8322 GET_REG32_LOOP(MEMARB_MODE, 0x10);
8323 GET_REG32_LOOP(BUFMGR_MODE, 0x58);
8324 GET_REG32_LOOP(RDMAC_MODE, 0x08);
8325 GET_REG32_LOOP(WDMAC_MODE, 0x08);
091465d7
CE
8326 GET_REG32_1(RX_CPU_MODE);
8327 GET_REG32_1(RX_CPU_STATE);
8328 GET_REG32_1(RX_CPU_PGMCTR);
8329 GET_REG32_1(RX_CPU_HWBKPT);
8330 GET_REG32_1(TX_CPU_MODE);
8331 GET_REG32_1(TX_CPU_STATE);
8332 GET_REG32_1(TX_CPU_PGMCTR);
1da177e4
LT
8333 GET_REG32_LOOP(GRCMBOX_INTERRUPT_0, 0x110);
8334 GET_REG32_LOOP(FTQ_RESET, 0x120);
8335 GET_REG32_LOOP(MSGINT_MODE, 0x0c);
8336 GET_REG32_1(DMAC_MODE);
8337 GET_REG32_LOOP(GRC_MODE, 0x4c);
8338 if (tp->tg3_flags & TG3_FLAG_NVRAM)
8339 GET_REG32_LOOP(NVRAM_CMD, 0x24);
8340
8341#undef __GET_REG32
8342#undef GET_REG32_LOOP
8343#undef GET_REG32_1
8344
f47c11ee 8345 tg3_full_unlock(tp);
1da177e4
LT
8346}
8347
8348static int tg3_get_eeprom_len(struct net_device *dev)
8349{
8350 struct tg3 *tp = netdev_priv(dev);
8351
8352 return tp->nvram_size;
8353}
8354
8355static int tg3_nvram_read(struct tg3 *tp, u32 offset, u32 *val);
b9fc7dc5 8356static int tg3_nvram_read_le(struct tg3 *tp, u32 offset, __le32 *val);
1820180b 8357static int tg3_nvram_read_swab(struct tg3 *tp, u32 offset, u32 *val);
1da177e4
LT
8358
8359static int tg3_get_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom, u8 *data)
8360{
8361 struct tg3 *tp = netdev_priv(dev);
8362 int ret;
8363 u8 *pd;
b9fc7dc5
AV
8364 u32 i, offset, len, b_offset, b_count;
8365 __le32 val;
1da177e4 8366
bc1c7567
MC
8367 if (tp->link_config.phy_is_low_power)
8368 return -EAGAIN;
8369
1da177e4
LT
8370 offset = eeprom->offset;
8371 len = eeprom->len;
8372 eeprom->len = 0;
8373
8374 eeprom->magic = TG3_EEPROM_MAGIC;
8375
8376 if (offset & 3) {
8377 /* adjustments to start on required 4 byte boundary */
8378 b_offset = offset & 3;
8379 b_count = 4 - b_offset;
8380 if (b_count > len) {
8381 /* i.e. offset=1 len=2 */
8382 b_count = len;
8383 }
b9fc7dc5 8384 ret = tg3_nvram_read_le(tp, offset-b_offset, &val);
1da177e4
LT
8385 if (ret)
8386 return ret;
1da177e4
LT
8387 memcpy(data, ((char*)&val) + b_offset, b_count);
8388 len -= b_count;
8389 offset += b_count;
8390 eeprom->len += b_count;
8391 }
8392
8393 /* read bytes upto the last 4 byte boundary */
8394 pd = &data[eeprom->len];
8395 for (i = 0; i < (len - (len & 3)); i += 4) {
b9fc7dc5 8396 ret = tg3_nvram_read_le(tp, offset + i, &val);
1da177e4
LT
8397 if (ret) {
8398 eeprom->len += i;
8399 return ret;
8400 }
1da177e4
LT
8401 memcpy(pd + i, &val, 4);
8402 }
8403 eeprom->len += i;
8404
8405 if (len & 3) {
8406 /* read last bytes not ending on 4 byte boundary */
8407 pd = &data[eeprom->len];
8408 b_count = len & 3;
8409 b_offset = offset + len - b_count;
b9fc7dc5 8410 ret = tg3_nvram_read_le(tp, b_offset, &val);
1da177e4
LT
8411 if (ret)
8412 return ret;
b9fc7dc5 8413 memcpy(pd, &val, b_count);
1da177e4
LT
8414 eeprom->len += b_count;
8415 }
8416 return 0;
8417}
8418
6aa20a22 8419static int tg3_nvram_write_block(struct tg3 *tp, u32 offset, u32 len, u8 *buf);
1da177e4
LT
8420
8421static int tg3_set_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom, u8 *data)
8422{
8423 struct tg3 *tp = netdev_priv(dev);
8424 int ret;
b9fc7dc5 8425 u32 offset, len, b_offset, odd_len;
1da177e4 8426 u8 *buf;
b9fc7dc5 8427 __le32 start, end;
1da177e4 8428
bc1c7567
MC
8429 if (tp->link_config.phy_is_low_power)
8430 return -EAGAIN;
8431
1da177e4
LT
8432 if (eeprom->magic != TG3_EEPROM_MAGIC)
8433 return -EINVAL;
8434
8435 offset = eeprom->offset;
8436 len = eeprom->len;
8437
8438 if ((b_offset = (offset & 3))) {
8439 /* adjustments to start on required 4 byte boundary */
b9fc7dc5 8440 ret = tg3_nvram_read_le(tp, offset-b_offset, &start);
1da177e4
LT
8441 if (ret)
8442 return ret;
1da177e4
LT
8443 len += b_offset;
8444 offset &= ~3;
1c8594b4
MC
8445 if (len < 4)
8446 len = 4;
1da177e4
LT
8447 }
8448
8449 odd_len = 0;
1c8594b4 8450 if (len & 3) {
1da177e4
LT
8451 /* adjustments to end on required 4 byte boundary */
8452 odd_len = 1;
8453 len = (len + 3) & ~3;
b9fc7dc5 8454 ret = tg3_nvram_read_le(tp, offset+len-4, &end);
1da177e4
LT
8455 if (ret)
8456 return ret;
1da177e4
LT
8457 }
8458
8459 buf = data;
8460 if (b_offset || odd_len) {
8461 buf = kmalloc(len, GFP_KERNEL);
ab0049b4 8462 if (!buf)
1da177e4
LT
8463 return -ENOMEM;
8464 if (b_offset)
8465 memcpy(buf, &start, 4);
8466 if (odd_len)
8467 memcpy(buf+len-4, &end, 4);
8468 memcpy(buf + b_offset, data, eeprom->len);
8469 }
8470
8471 ret = tg3_nvram_write_block(tp, offset, len, buf);
8472
8473 if (buf != data)
8474 kfree(buf);
8475
8476 return ret;
8477}
8478
8479static int tg3_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
8480{
8481 struct tg3 *tp = netdev_priv(dev);
6aa20a22 8482
1da177e4
LT
8483 cmd->supported = (SUPPORTED_Autoneg);
8484
8485 if (!(tp->tg3_flags & TG3_FLAG_10_100_ONLY))
8486 cmd->supported |= (SUPPORTED_1000baseT_Half |
8487 SUPPORTED_1000baseT_Full);
8488
ef348144 8489 if (!(tp->tg3_flags2 & TG3_FLG2_ANY_SERDES)) {
1da177e4
LT
8490 cmd->supported |= (SUPPORTED_100baseT_Half |
8491 SUPPORTED_100baseT_Full |
8492 SUPPORTED_10baseT_Half |
8493 SUPPORTED_10baseT_Full |
3bebab59 8494 SUPPORTED_TP);
ef348144
KK
8495 cmd->port = PORT_TP;
8496 } else {
1da177e4 8497 cmd->supported |= SUPPORTED_FIBRE;
ef348144
KK
8498 cmd->port = PORT_FIBRE;
8499 }
6aa20a22 8500
1da177e4
LT
8501 cmd->advertising = tp->link_config.advertising;
8502 if (netif_running(dev)) {
8503 cmd->speed = tp->link_config.active_speed;
8504 cmd->duplex = tp->link_config.active_duplex;
8505 }
1da177e4
LT
8506 cmd->phy_address = PHY_ADDR;
8507 cmd->transceiver = 0;
8508 cmd->autoneg = tp->link_config.autoneg;
8509 cmd->maxtxpkt = 0;
8510 cmd->maxrxpkt = 0;
8511 return 0;
8512}
6aa20a22 8513
1da177e4
LT
8514static int tg3_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
8515{
8516 struct tg3 *tp = netdev_priv(dev);
6aa20a22
JG
8517
8518 if (tp->tg3_flags2 & TG3_FLG2_ANY_SERDES) {
1da177e4
LT
8519 /* These are the only valid advertisement bits allowed. */
8520 if (cmd->autoneg == AUTONEG_ENABLE &&
8521 (cmd->advertising & ~(ADVERTISED_1000baseT_Half |
8522 ADVERTISED_1000baseT_Full |
8523 ADVERTISED_Autoneg |
8524 ADVERTISED_FIBRE)))
8525 return -EINVAL;
37ff238d
MC
8526 /* Fiber can only do SPEED_1000. */
8527 else if ((cmd->autoneg != AUTONEG_ENABLE) &&
8528 (cmd->speed != SPEED_1000))
8529 return -EINVAL;
8530 /* Copper cannot force SPEED_1000. */
8531 } else if ((cmd->autoneg != AUTONEG_ENABLE) &&
8532 (cmd->speed == SPEED_1000))
8533 return -EINVAL;
8534 else if ((cmd->speed == SPEED_1000) &&
8535 (tp->tg3_flags2 & TG3_FLAG_10_100_ONLY))
8536 return -EINVAL;
1da177e4 8537
f47c11ee 8538 tg3_full_lock(tp, 0);
1da177e4
LT
8539
8540 tp->link_config.autoneg = cmd->autoneg;
8541 if (cmd->autoneg == AUTONEG_ENABLE) {
405d8e5c
AG
8542 tp->link_config.advertising = (cmd->advertising |
8543 ADVERTISED_Autoneg);
1da177e4
LT
8544 tp->link_config.speed = SPEED_INVALID;
8545 tp->link_config.duplex = DUPLEX_INVALID;
8546 } else {
8547 tp->link_config.advertising = 0;
8548 tp->link_config.speed = cmd->speed;
8549 tp->link_config.duplex = cmd->duplex;
8550 }
6aa20a22 8551
24fcad6b
MC
8552 tp->link_config.orig_speed = tp->link_config.speed;
8553 tp->link_config.orig_duplex = tp->link_config.duplex;
8554 tp->link_config.orig_autoneg = tp->link_config.autoneg;
8555
1da177e4
LT
8556 if (netif_running(dev))
8557 tg3_setup_phy(tp, 1);
8558
f47c11ee 8559 tg3_full_unlock(tp);
6aa20a22 8560
1da177e4
LT
8561 return 0;
8562}
6aa20a22 8563
1da177e4
LT
8564static void tg3_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)
8565{
8566 struct tg3 *tp = netdev_priv(dev);
6aa20a22 8567
1da177e4
LT
8568 strcpy(info->driver, DRV_MODULE_NAME);
8569 strcpy(info->version, DRV_MODULE_VERSION);
c4e6575c 8570 strcpy(info->fw_version, tp->fw_ver);
1da177e4
LT
8571 strcpy(info->bus_info, pci_name(tp->pdev));
8572}
6aa20a22 8573
1da177e4
LT
8574static void tg3_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
8575{
8576 struct tg3 *tp = netdev_priv(dev);
6aa20a22 8577
a85feb8c
GZ
8578 if (tp->tg3_flags & TG3_FLAG_WOL_CAP)
8579 wol->supported = WAKE_MAGIC;
8580 else
8581 wol->supported = 0;
1da177e4
LT
8582 wol->wolopts = 0;
8583 if (tp->tg3_flags & TG3_FLAG_WOL_ENABLE)
8584 wol->wolopts = WAKE_MAGIC;
8585 memset(&wol->sopass, 0, sizeof(wol->sopass));
8586}
6aa20a22 8587
1da177e4
LT
8588static int tg3_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
8589{
8590 struct tg3 *tp = netdev_priv(dev);
6aa20a22 8591
1da177e4
LT
8592 if (wol->wolopts & ~WAKE_MAGIC)
8593 return -EINVAL;
8594 if ((wol->wolopts & WAKE_MAGIC) &&
a85feb8c 8595 !(tp->tg3_flags & TG3_FLAG_WOL_CAP))
1da177e4 8596 return -EINVAL;
6aa20a22 8597
f47c11ee 8598 spin_lock_bh(&tp->lock);
1da177e4
LT
8599 if (wol->wolopts & WAKE_MAGIC)
8600 tp->tg3_flags |= TG3_FLAG_WOL_ENABLE;
8601 else
8602 tp->tg3_flags &= ~TG3_FLAG_WOL_ENABLE;
f47c11ee 8603 spin_unlock_bh(&tp->lock);
6aa20a22 8604
1da177e4
LT
8605 return 0;
8606}
6aa20a22 8607
1da177e4
LT
8608static u32 tg3_get_msglevel(struct net_device *dev)
8609{
8610 struct tg3 *tp = netdev_priv(dev);
8611 return tp->msg_enable;
8612}
6aa20a22 8613
1da177e4
LT
8614static void tg3_set_msglevel(struct net_device *dev, u32 value)
8615{
8616 struct tg3 *tp = netdev_priv(dev);
8617 tp->msg_enable = value;
8618}
6aa20a22 8619
1da177e4
LT
8620static int tg3_set_tso(struct net_device *dev, u32 value)
8621{
8622 struct tg3 *tp = netdev_priv(dev);
8623
8624 if (!(tp->tg3_flags2 & TG3_FLG2_TSO_CAPABLE)) {
8625 if (value)
8626 return -EINVAL;
8627 return 0;
8628 }
b5d3772c
MC
8629 if ((tp->tg3_flags2 & TG3_FLG2_HW_TSO_2) &&
8630 (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5906)) {
9936bcf6 8631 if (value) {
b0026624 8632 dev->features |= NETIF_F_TSO6;
9936bcf6
MC
8633 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5761)
8634 dev->features |= NETIF_F_TSO_ECN;
8635 } else
8636 dev->features &= ~(NETIF_F_TSO6 | NETIF_F_TSO_ECN);
b0026624 8637 }
1da177e4
LT
8638 return ethtool_op_set_tso(dev, value);
8639}
6aa20a22 8640
1da177e4
LT
8641static int tg3_nway_reset(struct net_device *dev)
8642{
8643 struct tg3 *tp = netdev_priv(dev);
8644 u32 bmcr;
8645 int r;
6aa20a22 8646
1da177e4
LT
8647 if (!netif_running(dev))
8648 return -EAGAIN;
8649
c94e3941
MC
8650 if (tp->tg3_flags2 & TG3_FLG2_PHY_SERDES)
8651 return -EINVAL;
8652
f47c11ee 8653 spin_lock_bh(&tp->lock);
1da177e4
LT
8654 r = -EINVAL;
8655 tg3_readphy(tp, MII_BMCR, &bmcr);
8656 if (!tg3_readphy(tp, MII_BMCR, &bmcr) &&
c94e3941
MC
8657 ((bmcr & BMCR_ANENABLE) ||
8658 (tp->tg3_flags2 & TG3_FLG2_PARALLEL_DETECT))) {
8659 tg3_writephy(tp, MII_BMCR, bmcr | BMCR_ANRESTART |
8660 BMCR_ANENABLE);
1da177e4
LT
8661 r = 0;
8662 }
f47c11ee 8663 spin_unlock_bh(&tp->lock);
6aa20a22 8664
1da177e4
LT
8665 return r;
8666}
6aa20a22 8667
1da177e4
LT
8668static void tg3_get_ringparam(struct net_device *dev, struct ethtool_ringparam *ering)
8669{
8670 struct tg3 *tp = netdev_priv(dev);
6aa20a22 8671
1da177e4
LT
8672 ering->rx_max_pending = TG3_RX_RING_SIZE - 1;
8673 ering->rx_mini_max_pending = 0;
4f81c32b
MC
8674 if (tp->tg3_flags & TG3_FLAG_JUMBO_RING_ENABLE)
8675 ering->rx_jumbo_max_pending = TG3_RX_JUMBO_RING_SIZE - 1;
8676 else
8677 ering->rx_jumbo_max_pending = 0;
8678
8679 ering->tx_max_pending = TG3_TX_RING_SIZE - 1;
1da177e4
LT
8680
8681 ering->rx_pending = tp->rx_pending;
8682 ering->rx_mini_pending = 0;
4f81c32b
MC
8683 if (tp->tg3_flags & TG3_FLAG_JUMBO_RING_ENABLE)
8684 ering->rx_jumbo_pending = tp->rx_jumbo_pending;
8685 else
8686 ering->rx_jumbo_pending = 0;
8687
1da177e4
LT
8688 ering->tx_pending = tp->tx_pending;
8689}
6aa20a22 8690
1da177e4
LT
8691static int tg3_set_ringparam(struct net_device *dev, struct ethtool_ringparam *ering)
8692{
8693 struct tg3 *tp = netdev_priv(dev);
b9ec6c1b 8694 int irq_sync = 0, err = 0;
6aa20a22 8695
1da177e4
LT
8696 if ((ering->rx_pending > TG3_RX_RING_SIZE - 1) ||
8697 (ering->rx_jumbo_pending > TG3_RX_JUMBO_RING_SIZE - 1) ||
bc3a9254
MC
8698 (ering->tx_pending > TG3_TX_RING_SIZE - 1) ||
8699 (ering->tx_pending <= MAX_SKB_FRAGS) ||
7f62ad5d 8700 ((tp->tg3_flags2 & TG3_FLG2_TSO_BUG) &&
bc3a9254 8701 (ering->tx_pending <= (MAX_SKB_FRAGS * 3))))
1da177e4 8702 return -EINVAL;
6aa20a22 8703
bbe832c0 8704 if (netif_running(dev)) {
1da177e4 8705 tg3_netif_stop(tp);
bbe832c0
MC
8706 irq_sync = 1;
8707 }
1da177e4 8708
bbe832c0 8709 tg3_full_lock(tp, irq_sync);
6aa20a22 8710
1da177e4
LT
8711 tp->rx_pending = ering->rx_pending;
8712
8713 if ((tp->tg3_flags2 & TG3_FLG2_MAX_RXPEND_64) &&
8714 tp->rx_pending > 63)
8715 tp->rx_pending = 63;
8716 tp->rx_jumbo_pending = ering->rx_jumbo_pending;
8717 tp->tx_pending = ering->tx_pending;
8718
8719 if (netif_running(dev)) {
944d980e 8720 tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
b9ec6c1b
MC
8721 err = tg3_restart_hw(tp, 1);
8722 if (!err)
8723 tg3_netif_start(tp);
1da177e4
LT
8724 }
8725
f47c11ee 8726 tg3_full_unlock(tp);
6aa20a22 8727
b9ec6c1b 8728 return err;
1da177e4 8729}
6aa20a22 8730
1da177e4
LT
8731static void tg3_get_pauseparam(struct net_device *dev, struct ethtool_pauseparam *epause)
8732{
8733 struct tg3 *tp = netdev_priv(dev);
6aa20a22 8734
1da177e4 8735 epause->autoneg = (tp->tg3_flags & TG3_FLAG_PAUSE_AUTONEG) != 0;
8d018621
MC
8736
8737 if (tp->link_config.active_flowctrl & TG3_FLOW_CTRL_RX)
8738 epause->rx_pause = 1;
8739 else
8740 epause->rx_pause = 0;
8741
8742 if (tp->link_config.active_flowctrl & TG3_FLOW_CTRL_TX)
8743 epause->tx_pause = 1;
8744 else
8745 epause->tx_pause = 0;
1da177e4 8746}
6aa20a22 8747
1da177e4
LT
8748static int tg3_set_pauseparam(struct net_device *dev, struct ethtool_pauseparam *epause)
8749{
8750 struct tg3 *tp = netdev_priv(dev);
b9ec6c1b 8751 int irq_sync = 0, err = 0;
6aa20a22 8752
bbe832c0 8753 if (netif_running(dev)) {
1da177e4 8754 tg3_netif_stop(tp);
bbe832c0
MC
8755 irq_sync = 1;
8756 }
1da177e4 8757
bbe832c0 8758 tg3_full_lock(tp, irq_sync);
f47c11ee 8759
1da177e4
LT
8760 if (epause->autoneg)
8761 tp->tg3_flags |= TG3_FLAG_PAUSE_AUTONEG;
8762 else
8763 tp->tg3_flags &= ~TG3_FLAG_PAUSE_AUTONEG;
8764 if (epause->rx_pause)
8d018621 8765 tp->link_config.flowctrl |= TG3_FLOW_CTRL_RX;
1da177e4 8766 else
8d018621 8767 tp->link_config.flowctrl &= ~TG3_FLOW_CTRL_RX;
1da177e4 8768 if (epause->tx_pause)
8d018621 8769 tp->link_config.flowctrl |= TG3_FLOW_CTRL_TX;
1da177e4 8770 else
8d018621 8771 tp->link_config.flowctrl &= ~TG3_FLOW_CTRL_TX;
1da177e4
LT
8772
8773 if (netif_running(dev)) {
944d980e 8774 tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
b9ec6c1b
MC
8775 err = tg3_restart_hw(tp, 1);
8776 if (!err)
8777 tg3_netif_start(tp);
1da177e4 8778 }
f47c11ee
DM
8779
8780 tg3_full_unlock(tp);
6aa20a22 8781
b9ec6c1b 8782 return err;
1da177e4 8783}
6aa20a22 8784
1da177e4
LT
8785static u32 tg3_get_rx_csum(struct net_device *dev)
8786{
8787 struct tg3 *tp = netdev_priv(dev);
8788 return (tp->tg3_flags & TG3_FLAG_RX_CHECKSUMS) != 0;
8789}
6aa20a22 8790
1da177e4
LT
8791static int tg3_set_rx_csum(struct net_device *dev, u32 data)
8792{
8793 struct tg3 *tp = netdev_priv(dev);
6aa20a22 8794
1da177e4
LT
8795 if (tp->tg3_flags & TG3_FLAG_BROKEN_CHECKSUMS) {
8796 if (data != 0)
8797 return -EINVAL;
8798 return 0;
8799 }
6aa20a22 8800
f47c11ee 8801 spin_lock_bh(&tp->lock);
1da177e4
LT
8802 if (data)
8803 tp->tg3_flags |= TG3_FLAG_RX_CHECKSUMS;
8804 else
8805 tp->tg3_flags &= ~TG3_FLAG_RX_CHECKSUMS;
f47c11ee 8806 spin_unlock_bh(&tp->lock);
6aa20a22 8807
1da177e4
LT
8808 return 0;
8809}
6aa20a22 8810
1da177e4
LT
8811static int tg3_set_tx_csum(struct net_device *dev, u32 data)
8812{
8813 struct tg3 *tp = netdev_priv(dev);
6aa20a22 8814
1da177e4
LT
8815 if (tp->tg3_flags & TG3_FLAG_BROKEN_CHECKSUMS) {
8816 if (data != 0)
8817 return -EINVAL;
8818 return 0;
8819 }
6aa20a22 8820
af36e6b6 8821 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 ||
d30cdd28 8822 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787 ||
9936bcf6
MC
8823 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5784 ||
8824 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5761)
6460d948 8825 ethtool_op_set_tx_ipv6_csum(dev, data);
1da177e4 8826 else
9c27dbdf 8827 ethtool_op_set_tx_csum(dev, data);
1da177e4
LT
8828
8829 return 0;
8830}
8831
b9f2c044 8832static int tg3_get_sset_count (struct net_device *dev, int sset)
1da177e4 8833{
b9f2c044
JG
8834 switch (sset) {
8835 case ETH_SS_TEST:
8836 return TG3_NUM_TEST;
8837 case ETH_SS_STATS:
8838 return TG3_NUM_STATS;
8839 default:
8840 return -EOPNOTSUPP;
8841 }
4cafd3f5
MC
8842}
8843
1da177e4
LT
8844static void tg3_get_strings (struct net_device *dev, u32 stringset, u8 *buf)
8845{
8846 switch (stringset) {
8847 case ETH_SS_STATS:
8848 memcpy(buf, &ethtool_stats_keys, sizeof(ethtool_stats_keys));
8849 break;
4cafd3f5
MC
8850 case ETH_SS_TEST:
8851 memcpy(buf, &ethtool_test_keys, sizeof(ethtool_test_keys));
8852 break;
1da177e4
LT
8853 default:
8854 WARN_ON(1); /* we need a WARN() */
8855 break;
8856 }
8857}
8858
4009a93d
MC
8859static int tg3_phys_id(struct net_device *dev, u32 data)
8860{
8861 struct tg3 *tp = netdev_priv(dev);
8862 int i;
8863
8864 if (!netif_running(tp->dev))
8865 return -EAGAIN;
8866
8867 if (data == 0)
759afc31 8868 data = UINT_MAX / 2;
4009a93d
MC
8869
8870 for (i = 0; i < (data * 2); i++) {
8871 if ((i % 2) == 0)
8872 tw32(MAC_LED_CTRL, LED_CTRL_LNKLED_OVERRIDE |
8873 LED_CTRL_1000MBPS_ON |
8874 LED_CTRL_100MBPS_ON |
8875 LED_CTRL_10MBPS_ON |
8876 LED_CTRL_TRAFFIC_OVERRIDE |
8877 LED_CTRL_TRAFFIC_BLINK |
8878 LED_CTRL_TRAFFIC_LED);
6aa20a22 8879
4009a93d
MC
8880 else
8881 tw32(MAC_LED_CTRL, LED_CTRL_LNKLED_OVERRIDE |
8882 LED_CTRL_TRAFFIC_OVERRIDE);
8883
8884 if (msleep_interruptible(500))
8885 break;
8886 }
8887 tw32(MAC_LED_CTRL, tp->led_ctrl);
8888 return 0;
8889}
8890
1da177e4
LT
8891static void tg3_get_ethtool_stats (struct net_device *dev,
8892 struct ethtool_stats *estats, u64 *tmp_stats)
8893{
8894 struct tg3 *tp = netdev_priv(dev);
8895 memcpy(tmp_stats, tg3_get_estats(tp), sizeof(tp->estats));
8896}
8897
566f86ad 8898#define NVRAM_TEST_SIZE 0x100
a5767dec
MC
8899#define NVRAM_SELFBOOT_FORMAT1_0_SIZE 0x14
8900#define NVRAM_SELFBOOT_FORMAT1_2_SIZE 0x18
8901#define NVRAM_SELFBOOT_FORMAT1_3_SIZE 0x1c
b16250e3
MC
8902#define NVRAM_SELFBOOT_HW_SIZE 0x20
8903#define NVRAM_SELFBOOT_DATA_SIZE 0x1c
566f86ad
MC
8904
8905static int tg3_test_nvram(struct tg3 *tp)
8906{
b9fc7dc5
AV
8907 u32 csum, magic;
8908 __le32 *buf;
ab0049b4 8909 int i, j, k, err = 0, size;
566f86ad 8910
1820180b 8911 if (tg3_nvram_read_swab(tp, 0, &magic) != 0)
1b27777a
MC
8912 return -EIO;
8913
1b27777a
MC
8914 if (magic == TG3_EEPROM_MAGIC)
8915 size = NVRAM_TEST_SIZE;
b16250e3 8916 else if ((magic & TG3_EEPROM_MAGIC_FW_MSK) == TG3_EEPROM_MAGIC_FW) {
a5767dec
MC
8917 if ((magic & TG3_EEPROM_SB_FORMAT_MASK) ==
8918 TG3_EEPROM_SB_FORMAT_1) {
8919 switch (magic & TG3_EEPROM_SB_REVISION_MASK) {
8920 case TG3_EEPROM_SB_REVISION_0:
8921 size = NVRAM_SELFBOOT_FORMAT1_0_SIZE;
8922 break;
8923 case TG3_EEPROM_SB_REVISION_2:
8924 size = NVRAM_SELFBOOT_FORMAT1_2_SIZE;
8925 break;
8926 case TG3_EEPROM_SB_REVISION_3:
8927 size = NVRAM_SELFBOOT_FORMAT1_3_SIZE;
8928 break;
8929 default:
8930 return 0;
8931 }
8932 } else
1b27777a 8933 return 0;
b16250e3
MC
8934 } else if ((magic & TG3_EEPROM_MAGIC_HW_MSK) == TG3_EEPROM_MAGIC_HW)
8935 size = NVRAM_SELFBOOT_HW_SIZE;
8936 else
1b27777a
MC
8937 return -EIO;
8938
8939 buf = kmalloc(size, GFP_KERNEL);
566f86ad
MC
8940 if (buf == NULL)
8941 return -ENOMEM;
8942
1b27777a
MC
8943 err = -EIO;
8944 for (i = 0, j = 0; i < size; i += 4, j++) {
b9fc7dc5 8945 if ((err = tg3_nvram_read_le(tp, i, &buf[j])) != 0)
566f86ad 8946 break;
566f86ad 8947 }
1b27777a 8948 if (i < size)
566f86ad
MC
8949 goto out;
8950
1b27777a 8951 /* Selfboot format */
b9fc7dc5
AV
8952 magic = swab32(le32_to_cpu(buf[0]));
8953 if ((magic & TG3_EEPROM_MAGIC_FW_MSK) ==
b16250e3 8954 TG3_EEPROM_MAGIC_FW) {
1b27777a
MC
8955 u8 *buf8 = (u8 *) buf, csum8 = 0;
8956
b9fc7dc5 8957 if ((magic & TG3_EEPROM_SB_REVISION_MASK) ==
a5767dec
MC
8958 TG3_EEPROM_SB_REVISION_2) {
8959 /* For rev 2, the csum doesn't include the MBA. */
8960 for (i = 0; i < TG3_EEPROM_SB_F1R2_MBA_OFF; i++)
8961 csum8 += buf8[i];
8962 for (i = TG3_EEPROM_SB_F1R2_MBA_OFF + 4; i < size; i++)
8963 csum8 += buf8[i];
8964 } else {
8965 for (i = 0; i < size; i++)
8966 csum8 += buf8[i];
8967 }
1b27777a 8968
ad96b485
AB
8969 if (csum8 == 0) {
8970 err = 0;
8971 goto out;
8972 }
8973
8974 err = -EIO;
8975 goto out;
1b27777a 8976 }
566f86ad 8977
b9fc7dc5 8978 if ((magic & TG3_EEPROM_MAGIC_HW_MSK) ==
b16250e3
MC
8979 TG3_EEPROM_MAGIC_HW) {
8980 u8 data[NVRAM_SELFBOOT_DATA_SIZE];
8981 u8 parity[NVRAM_SELFBOOT_DATA_SIZE];
8982 u8 *buf8 = (u8 *) buf;
b16250e3
MC
8983
8984 /* Separate the parity bits and the data bytes. */
8985 for (i = 0, j = 0, k = 0; i < NVRAM_SELFBOOT_HW_SIZE; i++) {
8986 if ((i == 0) || (i == 8)) {
8987 int l;
8988 u8 msk;
8989
8990 for (l = 0, msk = 0x80; l < 7; l++, msk >>= 1)
8991 parity[k++] = buf8[i] & msk;
8992 i++;
8993 }
8994 else if (i == 16) {
8995 int l;
8996 u8 msk;
8997
8998 for (l = 0, msk = 0x20; l < 6; l++, msk >>= 1)
8999 parity[k++] = buf8[i] & msk;
9000 i++;
9001
9002 for (l = 0, msk = 0x80; l < 8; l++, msk >>= 1)
9003 parity[k++] = buf8[i] & msk;
9004 i++;
9005 }
9006 data[j++] = buf8[i];
9007 }
9008
9009 err = -EIO;
9010 for (i = 0; i < NVRAM_SELFBOOT_DATA_SIZE; i++) {
9011 u8 hw8 = hweight8(data[i]);
9012
9013 if ((hw8 & 0x1) && parity[i])
9014 goto out;
9015 else if (!(hw8 & 0x1) && !parity[i])
9016 goto out;
9017 }
9018 err = 0;
9019 goto out;
9020 }
9021
566f86ad
MC
9022 /* Bootstrap checksum at offset 0x10 */
9023 csum = calc_crc((unsigned char *) buf, 0x10);
b9fc7dc5 9024 if(csum != le32_to_cpu(buf[0x10/4]))
566f86ad
MC
9025 goto out;
9026
9027 /* Manufacturing block starts at offset 0x74, checksum at 0xfc */
9028 csum = calc_crc((unsigned char *) &buf[0x74/4], 0x88);
b9fc7dc5 9029 if (csum != le32_to_cpu(buf[0xfc/4]))
566f86ad
MC
9030 goto out;
9031
9032 err = 0;
9033
9034out:
9035 kfree(buf);
9036 return err;
9037}
9038
ca43007a
MC
9039#define TG3_SERDES_TIMEOUT_SEC 2
9040#define TG3_COPPER_TIMEOUT_SEC 6
9041
9042static int tg3_test_link(struct tg3 *tp)
9043{
9044 int i, max;
9045
9046 if (!netif_running(tp->dev))
9047 return -ENODEV;
9048
4c987487 9049 if (tp->tg3_flags2 & TG3_FLG2_ANY_SERDES)
ca43007a
MC
9050 max = TG3_SERDES_TIMEOUT_SEC;
9051 else
9052 max = TG3_COPPER_TIMEOUT_SEC;
9053
9054 for (i = 0; i < max; i++) {
9055 if (netif_carrier_ok(tp->dev))
9056 return 0;
9057
9058 if (msleep_interruptible(1000))
9059 break;
9060 }
9061
9062 return -EIO;
9063}
9064
a71116d1 9065/* Only test the commonly used registers */
30ca3e37 9066static int tg3_test_registers(struct tg3 *tp)
a71116d1 9067{
b16250e3 9068 int i, is_5705, is_5750;
a71116d1
MC
9069 u32 offset, read_mask, write_mask, val, save_val, read_val;
9070 static struct {
9071 u16 offset;
9072 u16 flags;
9073#define TG3_FL_5705 0x1
9074#define TG3_FL_NOT_5705 0x2
9075#define TG3_FL_NOT_5788 0x4
b16250e3 9076#define TG3_FL_NOT_5750 0x8
a71116d1
MC
9077 u32 read_mask;
9078 u32 write_mask;
9079 } reg_tbl[] = {
9080 /* MAC Control Registers */
9081 { MAC_MODE, TG3_FL_NOT_5705,
9082 0x00000000, 0x00ef6f8c },
9083 { MAC_MODE, TG3_FL_5705,
9084 0x00000000, 0x01ef6b8c },
9085 { MAC_STATUS, TG3_FL_NOT_5705,
9086 0x03800107, 0x00000000 },
9087 { MAC_STATUS, TG3_FL_5705,
9088 0x03800100, 0x00000000 },
9089 { MAC_ADDR_0_HIGH, 0x0000,
9090 0x00000000, 0x0000ffff },
9091 { MAC_ADDR_0_LOW, 0x0000,
9092 0x00000000, 0xffffffff },
9093 { MAC_RX_MTU_SIZE, 0x0000,
9094 0x00000000, 0x0000ffff },
9095 { MAC_TX_MODE, 0x0000,
9096 0x00000000, 0x00000070 },
9097 { MAC_TX_LENGTHS, 0x0000,
9098 0x00000000, 0x00003fff },
9099 { MAC_RX_MODE, TG3_FL_NOT_5705,
9100 0x00000000, 0x000007fc },
9101 { MAC_RX_MODE, TG3_FL_5705,
9102 0x00000000, 0x000007dc },
9103 { MAC_HASH_REG_0, 0x0000,
9104 0x00000000, 0xffffffff },
9105 { MAC_HASH_REG_1, 0x0000,
9106 0x00000000, 0xffffffff },
9107 { MAC_HASH_REG_2, 0x0000,
9108 0x00000000, 0xffffffff },
9109 { MAC_HASH_REG_3, 0x0000,
9110 0x00000000, 0xffffffff },
9111
9112 /* Receive Data and Receive BD Initiator Control Registers. */
9113 { RCVDBDI_JUMBO_BD+0, TG3_FL_NOT_5705,
9114 0x00000000, 0xffffffff },
9115 { RCVDBDI_JUMBO_BD+4, TG3_FL_NOT_5705,
9116 0x00000000, 0xffffffff },
9117 { RCVDBDI_JUMBO_BD+8, TG3_FL_NOT_5705,
9118 0x00000000, 0x00000003 },
9119 { RCVDBDI_JUMBO_BD+0xc, TG3_FL_NOT_5705,
9120 0x00000000, 0xffffffff },
9121 { RCVDBDI_STD_BD+0, 0x0000,
9122 0x00000000, 0xffffffff },
9123 { RCVDBDI_STD_BD+4, 0x0000,
9124 0x00000000, 0xffffffff },
9125 { RCVDBDI_STD_BD+8, 0x0000,
9126 0x00000000, 0xffff0002 },
9127 { RCVDBDI_STD_BD+0xc, 0x0000,
9128 0x00000000, 0xffffffff },
6aa20a22 9129
a71116d1
MC
9130 /* Receive BD Initiator Control Registers. */
9131 { RCVBDI_STD_THRESH, TG3_FL_NOT_5705,
9132 0x00000000, 0xffffffff },
9133 { RCVBDI_STD_THRESH, TG3_FL_5705,
9134 0x00000000, 0x000003ff },
9135 { RCVBDI_JUMBO_THRESH, TG3_FL_NOT_5705,
9136 0x00000000, 0xffffffff },
6aa20a22 9137
a71116d1
MC
9138 /* Host Coalescing Control Registers. */
9139 { HOSTCC_MODE, TG3_FL_NOT_5705,
9140 0x00000000, 0x00000004 },
9141 { HOSTCC_MODE, TG3_FL_5705,
9142 0x00000000, 0x000000f6 },
9143 { HOSTCC_RXCOL_TICKS, TG3_FL_NOT_5705,
9144 0x00000000, 0xffffffff },
9145 { HOSTCC_RXCOL_TICKS, TG3_FL_5705,
9146 0x00000000, 0x000003ff },
9147 { HOSTCC_TXCOL_TICKS, TG3_FL_NOT_5705,
9148 0x00000000, 0xffffffff },
9149 { HOSTCC_TXCOL_TICKS, TG3_FL_5705,
9150 0x00000000, 0x000003ff },
9151 { HOSTCC_RXMAX_FRAMES, TG3_FL_NOT_5705,
9152 0x00000000, 0xffffffff },
9153 { HOSTCC_RXMAX_FRAMES, TG3_FL_5705 | TG3_FL_NOT_5788,
9154 0x00000000, 0x000000ff },
9155 { HOSTCC_TXMAX_FRAMES, TG3_FL_NOT_5705,
9156 0x00000000, 0xffffffff },
9157 { HOSTCC_TXMAX_FRAMES, TG3_FL_5705 | TG3_FL_NOT_5788,
9158 0x00000000, 0x000000ff },
9159 { HOSTCC_RXCOAL_TICK_INT, TG3_FL_NOT_5705,
9160 0x00000000, 0xffffffff },
9161 { HOSTCC_TXCOAL_TICK_INT, TG3_FL_NOT_5705,
9162 0x00000000, 0xffffffff },
9163 { HOSTCC_RXCOAL_MAXF_INT, TG3_FL_NOT_5705,
9164 0x00000000, 0xffffffff },
9165 { HOSTCC_RXCOAL_MAXF_INT, TG3_FL_5705 | TG3_FL_NOT_5788,
9166 0x00000000, 0x000000ff },
9167 { HOSTCC_TXCOAL_MAXF_INT, TG3_FL_NOT_5705,
9168 0x00000000, 0xffffffff },
9169 { HOSTCC_TXCOAL_MAXF_INT, TG3_FL_5705 | TG3_FL_NOT_5788,
9170 0x00000000, 0x000000ff },
9171 { HOSTCC_STAT_COAL_TICKS, TG3_FL_NOT_5705,
9172 0x00000000, 0xffffffff },
9173 { HOSTCC_STATS_BLK_HOST_ADDR, TG3_FL_NOT_5705,
9174 0x00000000, 0xffffffff },
9175 { HOSTCC_STATS_BLK_HOST_ADDR+4, TG3_FL_NOT_5705,
9176 0x00000000, 0xffffffff },
9177 { HOSTCC_STATUS_BLK_HOST_ADDR, 0x0000,
9178 0x00000000, 0xffffffff },
9179 { HOSTCC_STATUS_BLK_HOST_ADDR+4, 0x0000,
9180 0x00000000, 0xffffffff },
9181 { HOSTCC_STATS_BLK_NIC_ADDR, 0x0000,
9182 0xffffffff, 0x00000000 },
9183 { HOSTCC_STATUS_BLK_NIC_ADDR, 0x0000,
9184 0xffffffff, 0x00000000 },
9185
9186 /* Buffer Manager Control Registers. */
b16250e3 9187 { BUFMGR_MB_POOL_ADDR, TG3_FL_NOT_5750,
a71116d1 9188 0x00000000, 0x007fff80 },
b16250e3 9189 { BUFMGR_MB_POOL_SIZE, TG3_FL_NOT_5750,
a71116d1
MC
9190 0x00000000, 0x007fffff },
9191 { BUFMGR_MB_RDMA_LOW_WATER, 0x0000,
9192 0x00000000, 0x0000003f },
9193 { BUFMGR_MB_MACRX_LOW_WATER, 0x0000,
9194 0x00000000, 0x000001ff },
9195 { BUFMGR_MB_HIGH_WATER, 0x0000,
9196 0x00000000, 0x000001ff },
9197 { BUFMGR_DMA_DESC_POOL_ADDR, TG3_FL_NOT_5705,
9198 0xffffffff, 0x00000000 },
9199 { BUFMGR_DMA_DESC_POOL_SIZE, TG3_FL_NOT_5705,
9200 0xffffffff, 0x00000000 },
6aa20a22 9201
a71116d1
MC
9202 /* Mailbox Registers */
9203 { GRCMBOX_RCVSTD_PROD_IDX+4, 0x0000,
9204 0x00000000, 0x000001ff },
9205 { GRCMBOX_RCVJUMBO_PROD_IDX+4, TG3_FL_NOT_5705,
9206 0x00000000, 0x000001ff },
9207 { GRCMBOX_RCVRET_CON_IDX_0+4, 0x0000,
9208 0x00000000, 0x000007ff },
9209 { GRCMBOX_SNDHOST_PROD_IDX_0+4, 0x0000,
9210 0x00000000, 0x000001ff },
9211
9212 { 0xffff, 0x0000, 0x00000000, 0x00000000 },
9213 };
9214
b16250e3
MC
9215 is_5705 = is_5750 = 0;
9216 if (tp->tg3_flags2 & TG3_FLG2_5705_PLUS) {
a71116d1 9217 is_5705 = 1;
b16250e3
MC
9218 if (tp->tg3_flags2 & TG3_FLG2_5750_PLUS)
9219 is_5750 = 1;
9220 }
a71116d1
MC
9221
9222 for (i = 0; reg_tbl[i].offset != 0xffff; i++) {
9223 if (is_5705 && (reg_tbl[i].flags & TG3_FL_NOT_5705))
9224 continue;
9225
9226 if (!is_5705 && (reg_tbl[i].flags & TG3_FL_5705))
9227 continue;
9228
9229 if ((tp->tg3_flags2 & TG3_FLG2_IS_5788) &&
9230 (reg_tbl[i].flags & TG3_FL_NOT_5788))
9231 continue;
9232
b16250e3
MC
9233 if (is_5750 && (reg_tbl[i].flags & TG3_FL_NOT_5750))
9234 continue;
9235
a71116d1
MC
9236 offset = (u32) reg_tbl[i].offset;
9237 read_mask = reg_tbl[i].read_mask;
9238 write_mask = reg_tbl[i].write_mask;
9239
9240 /* Save the original register content */
9241 save_val = tr32(offset);
9242
9243 /* Determine the read-only value. */
9244 read_val = save_val & read_mask;
9245
9246 /* Write zero to the register, then make sure the read-only bits
9247 * are not changed and the read/write bits are all zeros.
9248 */
9249 tw32(offset, 0);
9250
9251 val = tr32(offset);
9252
9253 /* Test the read-only and read/write bits. */
9254 if (((val & read_mask) != read_val) || (val & write_mask))
9255 goto out;
9256
9257 /* Write ones to all the bits defined by RdMask and WrMask, then
9258 * make sure the read-only bits are not changed and the
9259 * read/write bits are all ones.
9260 */
9261 tw32(offset, read_mask | write_mask);
9262
9263 val = tr32(offset);
9264
9265 /* Test the read-only bits. */
9266 if ((val & read_mask) != read_val)
9267 goto out;
9268
9269 /* Test the read/write bits. */
9270 if ((val & write_mask) != write_mask)
9271 goto out;
9272
9273 tw32(offset, save_val);
9274 }
9275
9276 return 0;
9277
9278out:
9f88f29f
MC
9279 if (netif_msg_hw(tp))
9280 printk(KERN_ERR PFX "Register test failed at offset %x\n",
9281 offset);
a71116d1
MC
9282 tw32(offset, save_val);
9283 return -EIO;
9284}
9285
7942e1db
MC
9286static int tg3_do_mem_test(struct tg3 *tp, u32 offset, u32 len)
9287{
f71e1309 9288 static const u32 test_pattern[] = { 0x00000000, 0xffffffff, 0xaa55a55a };
7942e1db
MC
9289 int i;
9290 u32 j;
9291
e9edda69 9292 for (i = 0; i < ARRAY_SIZE(test_pattern); i++) {
7942e1db
MC
9293 for (j = 0; j < len; j += 4) {
9294 u32 val;
9295
9296 tg3_write_mem(tp, offset + j, test_pattern[i]);
9297 tg3_read_mem(tp, offset + j, &val);
9298 if (val != test_pattern[i])
9299 return -EIO;
9300 }
9301 }
9302 return 0;
9303}
9304
9305static int tg3_test_memory(struct tg3 *tp)
9306{
9307 static struct mem_entry {
9308 u32 offset;
9309 u32 len;
9310 } mem_tbl_570x[] = {
38690194 9311 { 0x00000000, 0x00b50},
7942e1db
MC
9312 { 0x00002000, 0x1c000},
9313 { 0xffffffff, 0x00000}
9314 }, mem_tbl_5705[] = {
9315 { 0x00000100, 0x0000c},
9316 { 0x00000200, 0x00008},
7942e1db
MC
9317 { 0x00004000, 0x00800},
9318 { 0x00006000, 0x01000},
9319 { 0x00008000, 0x02000},
9320 { 0x00010000, 0x0e000},
9321 { 0xffffffff, 0x00000}
79f4d13a
MC
9322 }, mem_tbl_5755[] = {
9323 { 0x00000200, 0x00008},
9324 { 0x00004000, 0x00800},
9325 { 0x00006000, 0x00800},
9326 { 0x00008000, 0x02000},
9327 { 0x00010000, 0x0c000},
9328 { 0xffffffff, 0x00000}
b16250e3
MC
9329 }, mem_tbl_5906[] = {
9330 { 0x00000200, 0x00008},
9331 { 0x00004000, 0x00400},
9332 { 0x00006000, 0x00400},
9333 { 0x00008000, 0x01000},
9334 { 0x00010000, 0x01000},
9335 { 0xffffffff, 0x00000}
7942e1db
MC
9336 };
9337 struct mem_entry *mem_tbl;
9338 int err = 0;
9339 int i;
9340
79f4d13a 9341 if (tp->tg3_flags2 & TG3_FLG2_5705_PLUS) {
af36e6b6 9342 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 ||
d30cdd28 9343 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787 ||
9936bcf6
MC
9344 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5784 ||
9345 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5761)
79f4d13a 9346 mem_tbl = mem_tbl_5755;
b16250e3
MC
9347 else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906)
9348 mem_tbl = mem_tbl_5906;
79f4d13a
MC
9349 else
9350 mem_tbl = mem_tbl_5705;
9351 } else
7942e1db
MC
9352 mem_tbl = mem_tbl_570x;
9353
9354 for (i = 0; mem_tbl[i].offset != 0xffffffff; i++) {
9355 if ((err = tg3_do_mem_test(tp, mem_tbl[i].offset,
9356 mem_tbl[i].len)) != 0)
9357 break;
9358 }
6aa20a22 9359
7942e1db
MC
9360 return err;
9361}
9362
9f40dead
MC
9363#define TG3_MAC_LOOPBACK 0
9364#define TG3_PHY_LOOPBACK 1
9365
9366static int tg3_run_loopback(struct tg3 *tp, int loopback_mode)
c76949a6 9367{
9f40dead 9368 u32 mac_mode, rx_start_idx, rx_idx, tx_idx, opaque_key;
c76949a6
MC
9369 u32 desc_idx;
9370 struct sk_buff *skb, *rx_skb;
9371 u8 *tx_data;
9372 dma_addr_t map;
9373 int num_pkts, tx_len, rx_len, i, err;
9374 struct tg3_rx_buffer_desc *desc;
9375
9f40dead 9376 if (loopback_mode == TG3_MAC_LOOPBACK) {
c94e3941
MC
9377 /* HW errata - mac loopback fails in some cases on 5780.
9378 * Normal traffic and PHY loopback are not affected by
9379 * errata.
9380 */
9381 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5780)
9382 return 0;
9383
9f40dead 9384 mac_mode = (tp->mac_mode & ~MAC_MODE_PORT_MODE_MASK) |
e8f3f6ca
MC
9385 MAC_MODE_PORT_INT_LPBACK;
9386 if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS))
9387 mac_mode |= MAC_MODE_LINK_POLARITY;
3f7045c1
MC
9388 if (tp->tg3_flags & TG3_FLAG_10_100_ONLY)
9389 mac_mode |= MAC_MODE_PORT_MODE_MII;
9390 else
9391 mac_mode |= MAC_MODE_PORT_MODE_GMII;
9f40dead
MC
9392 tw32(MAC_MODE, mac_mode);
9393 } else if (loopback_mode == TG3_PHY_LOOPBACK) {
3f7045c1
MC
9394 u32 val;
9395
b16250e3
MC
9396 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) {
9397 u32 phytest;
9398
9399 if (!tg3_readphy(tp, MII_TG3_EPHY_TEST, &phytest)) {
9400 u32 phy;
9401
9402 tg3_writephy(tp, MII_TG3_EPHY_TEST,
9403 phytest | MII_TG3_EPHY_SHADOW_EN);
9404 if (!tg3_readphy(tp, 0x1b, &phy))
9405 tg3_writephy(tp, 0x1b, phy & ~0x20);
b16250e3
MC
9406 tg3_writephy(tp, MII_TG3_EPHY_TEST, phytest);
9407 }
5d64ad34
MC
9408 val = BMCR_LOOPBACK | BMCR_FULLDPLX | BMCR_SPEED100;
9409 } else
9410 val = BMCR_LOOPBACK | BMCR_FULLDPLX | BMCR_SPEED1000;
3f7045c1 9411
9ef8ca99
MC
9412 tg3_phy_toggle_automdix(tp, 0);
9413
3f7045c1 9414 tg3_writephy(tp, MII_BMCR, val);
c94e3941 9415 udelay(40);
5d64ad34 9416
e8f3f6ca 9417 mac_mode = tp->mac_mode & ~MAC_MODE_PORT_MODE_MASK;
5d64ad34 9418 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) {
b16250e3 9419 tg3_writephy(tp, MII_TG3_EPHY_PTEST, 0x1800);
5d64ad34
MC
9420 mac_mode |= MAC_MODE_PORT_MODE_MII;
9421 } else
9422 mac_mode |= MAC_MODE_PORT_MODE_GMII;
b16250e3 9423
c94e3941
MC
9424 /* reset to prevent losing 1st rx packet intermittently */
9425 if (tp->tg3_flags2 & TG3_FLG2_MII_SERDES) {
9426 tw32_f(MAC_RX_MODE, RX_MODE_RESET);
9427 udelay(10);
9428 tw32_f(MAC_RX_MODE, tp->rx_mode);
9429 }
e8f3f6ca
MC
9430 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700) {
9431 if ((tp->phy_id & PHY_ID_MASK) == PHY_ID_BCM5401)
9432 mac_mode &= ~MAC_MODE_LINK_POLARITY;
9433 else if ((tp->phy_id & PHY_ID_MASK) == PHY_ID_BCM5411)
9434 mac_mode |= MAC_MODE_LINK_POLARITY;
ff18ff02
MC
9435 tg3_writephy(tp, MII_TG3_EXT_CTRL,
9436 MII_TG3_EXT_CTRL_LNK3_LED_MODE);
9437 }
9f40dead 9438 tw32(MAC_MODE, mac_mode);
9f40dead
MC
9439 }
9440 else
9441 return -EINVAL;
c76949a6
MC
9442
9443 err = -EIO;
9444
c76949a6 9445 tx_len = 1514;
a20e9c62 9446 skb = netdev_alloc_skb(tp->dev, tx_len);
a50bb7b9
JJ
9447 if (!skb)
9448 return -ENOMEM;
9449
c76949a6
MC
9450 tx_data = skb_put(skb, tx_len);
9451 memcpy(tx_data, tp->dev->dev_addr, 6);
9452 memset(tx_data + 6, 0x0, 8);
9453
9454 tw32(MAC_RX_MTU_SIZE, tx_len + 4);
9455
9456 for (i = 14; i < tx_len; i++)
9457 tx_data[i] = (u8) (i & 0xff);
9458
9459 map = pci_map_single(tp->pdev, skb->data, tx_len, PCI_DMA_TODEVICE);
9460
9461 tw32_f(HOSTCC_MODE, tp->coalesce_mode | HOSTCC_MODE_ENABLE |
9462 HOSTCC_MODE_NOW);
9463
9464 udelay(10);
9465
9466 rx_start_idx = tp->hw_status->idx[0].rx_producer;
9467
c76949a6
MC
9468 num_pkts = 0;
9469
9f40dead 9470 tg3_set_txd(tp, tp->tx_prod, map, tx_len, 0, 1);
c76949a6 9471
9f40dead 9472 tp->tx_prod++;
c76949a6
MC
9473 num_pkts++;
9474
9f40dead
MC
9475 tw32_tx_mbox(MAILBOX_SNDHOST_PROD_IDX_0 + TG3_64BIT_REG_LOW,
9476 tp->tx_prod);
09ee929c 9477 tr32_mailbox(MAILBOX_SNDHOST_PROD_IDX_0 + TG3_64BIT_REG_LOW);
c76949a6
MC
9478
9479 udelay(10);
9480
3f7045c1
MC
9481 /* 250 usec to allow enough time on some 10/100 Mbps devices. */
9482 for (i = 0; i < 25; i++) {
c76949a6
MC
9483 tw32_f(HOSTCC_MODE, tp->coalesce_mode | HOSTCC_MODE_ENABLE |
9484 HOSTCC_MODE_NOW);
9485
9486 udelay(10);
9487
9488 tx_idx = tp->hw_status->idx[0].tx_consumer;
9489 rx_idx = tp->hw_status->idx[0].rx_producer;
9f40dead 9490 if ((tx_idx == tp->tx_prod) &&
c76949a6
MC
9491 (rx_idx == (rx_start_idx + num_pkts)))
9492 break;
9493 }
9494
9495 pci_unmap_single(tp->pdev, map, tx_len, PCI_DMA_TODEVICE);
9496 dev_kfree_skb(skb);
9497
9f40dead 9498 if (tx_idx != tp->tx_prod)
c76949a6
MC
9499 goto out;
9500
9501 if (rx_idx != rx_start_idx + num_pkts)
9502 goto out;
9503
9504 desc = &tp->rx_rcb[rx_start_idx];
9505 desc_idx = desc->opaque & RXD_OPAQUE_INDEX_MASK;
9506 opaque_key = desc->opaque & RXD_OPAQUE_RING_MASK;
9507 if (opaque_key != RXD_OPAQUE_RING_STD)
9508 goto out;
9509
9510 if ((desc->err_vlan & RXD_ERR_MASK) != 0 &&
9511 (desc->err_vlan != RXD_ERR_ODD_NIBBLE_RCVD_MII))
9512 goto out;
9513
9514 rx_len = ((desc->idx_len & RXD_LEN_MASK) >> RXD_LEN_SHIFT) - 4;
9515 if (rx_len != tx_len)
9516 goto out;
9517
9518 rx_skb = tp->rx_std_buffers[desc_idx].skb;
9519
9520 map = pci_unmap_addr(&tp->rx_std_buffers[desc_idx], mapping);
9521 pci_dma_sync_single_for_cpu(tp->pdev, map, rx_len, PCI_DMA_FROMDEVICE);
9522
9523 for (i = 14; i < tx_len; i++) {
9524 if (*(rx_skb->data + i) != (u8) (i & 0xff))
9525 goto out;
9526 }
9527 err = 0;
6aa20a22 9528
c76949a6
MC
9529 /* tg3_free_rings will unmap and free the rx_skb */
9530out:
9531 return err;
9532}
9533
9f40dead
MC
9534#define TG3_MAC_LOOPBACK_FAILED 1
9535#define TG3_PHY_LOOPBACK_FAILED 2
9536#define TG3_LOOPBACK_FAILED (TG3_MAC_LOOPBACK_FAILED | \
9537 TG3_PHY_LOOPBACK_FAILED)
9538
9539static int tg3_test_loopback(struct tg3 *tp)
9540{
9541 int err = 0;
9936bcf6 9542 u32 cpmuctrl = 0;
9f40dead
MC
9543
9544 if (!netif_running(tp->dev))
9545 return TG3_LOOPBACK_FAILED;
9546
b9ec6c1b
MC
9547 err = tg3_reset_hw(tp, 1);
9548 if (err)
9549 return TG3_LOOPBACK_FAILED;
9f40dead 9550
b2a5c19c
MC
9551 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5784 ||
9552 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5761) {
9936bcf6
MC
9553 int i;
9554 u32 status;
9555
9556 tw32(TG3_CPMU_MUTEX_REQ, CPMU_MUTEX_REQ_DRIVER);
9557
9558 /* Wait for up to 40 microseconds to acquire lock. */
9559 for (i = 0; i < 4; i++) {
9560 status = tr32(TG3_CPMU_MUTEX_GNT);
9561 if (status == CPMU_MUTEX_GNT_DRIVER)
9562 break;
9563 udelay(10);
9564 }
9565
9566 if (status != CPMU_MUTEX_GNT_DRIVER)
9567 return TG3_LOOPBACK_FAILED;
9568
b2a5c19c 9569 /* Turn off link-based power management. */
e875093c 9570 cpmuctrl = tr32(TG3_CPMU_CTRL);
b2a5c19c
MC
9571 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5784 ||
9572 GET_CHIP_REV(tp->pci_chip_rev_id) == CHIPREV_5761_AX)
9573 tw32(TG3_CPMU_CTRL,
9574 cpmuctrl & ~(CPMU_CTRL_LINK_SPEED_MODE |
9575 CPMU_CTRL_LINK_AWARE_MODE));
9576 else
9577 tw32(TG3_CPMU_CTRL,
9578 cpmuctrl & ~CPMU_CTRL_LINK_AWARE_MODE);
9936bcf6
MC
9579 }
9580
9f40dead
MC
9581 if (tg3_run_loopback(tp, TG3_MAC_LOOPBACK))
9582 err |= TG3_MAC_LOOPBACK_FAILED;
9936bcf6 9583
b2a5c19c
MC
9584 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5784 ||
9585 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5761) {
9936bcf6
MC
9586 tw32(TG3_CPMU_CTRL, cpmuctrl);
9587
9588 /* Release the mutex */
9589 tw32(TG3_CPMU_MUTEX_GNT, CPMU_MUTEX_GNT_DRIVER);
9590 }
9591
9f40dead
MC
9592 if (!(tp->tg3_flags2 & TG3_FLG2_PHY_SERDES)) {
9593 if (tg3_run_loopback(tp, TG3_PHY_LOOPBACK))
9594 err |= TG3_PHY_LOOPBACK_FAILED;
9595 }
9596
9597 return err;
9598}
9599
4cafd3f5
MC
9600static void tg3_self_test(struct net_device *dev, struct ethtool_test *etest,
9601 u64 *data)
9602{
566f86ad
MC
9603 struct tg3 *tp = netdev_priv(dev);
9604
bc1c7567
MC
9605 if (tp->link_config.phy_is_low_power)
9606 tg3_set_power_state(tp, PCI_D0);
9607
566f86ad
MC
9608 memset(data, 0, sizeof(u64) * TG3_NUM_TEST);
9609
9610 if (tg3_test_nvram(tp) != 0) {
9611 etest->flags |= ETH_TEST_FL_FAILED;
9612 data[0] = 1;
9613 }
ca43007a
MC
9614 if (tg3_test_link(tp) != 0) {
9615 etest->flags |= ETH_TEST_FL_FAILED;
9616 data[1] = 1;
9617 }
a71116d1 9618 if (etest->flags & ETH_TEST_FL_OFFLINE) {
ec41c7df 9619 int err, irq_sync = 0;
bbe832c0
MC
9620
9621 if (netif_running(dev)) {
a71116d1 9622 tg3_netif_stop(tp);
bbe832c0
MC
9623 irq_sync = 1;
9624 }
a71116d1 9625
bbe832c0 9626 tg3_full_lock(tp, irq_sync);
a71116d1
MC
9627
9628 tg3_halt(tp, RESET_KIND_SUSPEND, 1);
ec41c7df 9629 err = tg3_nvram_lock(tp);
a71116d1
MC
9630 tg3_halt_cpu(tp, RX_CPU_BASE);
9631 if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS))
9632 tg3_halt_cpu(tp, TX_CPU_BASE);
ec41c7df
MC
9633 if (!err)
9634 tg3_nvram_unlock(tp);
a71116d1 9635
d9ab5ad1
MC
9636 if (tp->tg3_flags2 & TG3_FLG2_MII_SERDES)
9637 tg3_phy_reset(tp);
9638
a71116d1
MC
9639 if (tg3_test_registers(tp) != 0) {
9640 etest->flags |= ETH_TEST_FL_FAILED;
9641 data[2] = 1;
9642 }
7942e1db
MC
9643 if (tg3_test_memory(tp) != 0) {
9644 etest->flags |= ETH_TEST_FL_FAILED;
9645 data[3] = 1;
9646 }
9f40dead 9647 if ((data[4] = tg3_test_loopback(tp)) != 0)
c76949a6 9648 etest->flags |= ETH_TEST_FL_FAILED;
a71116d1 9649
f47c11ee
DM
9650 tg3_full_unlock(tp);
9651
d4bc3927
MC
9652 if (tg3_test_interrupt(tp) != 0) {
9653 etest->flags |= ETH_TEST_FL_FAILED;
9654 data[5] = 1;
9655 }
f47c11ee
DM
9656
9657 tg3_full_lock(tp, 0);
d4bc3927 9658
a71116d1
MC
9659 tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
9660 if (netif_running(dev)) {
9661 tp->tg3_flags |= TG3_FLAG_INIT_COMPLETE;
b9ec6c1b
MC
9662 if (!tg3_restart_hw(tp, 1))
9663 tg3_netif_start(tp);
a71116d1 9664 }
f47c11ee
DM
9665
9666 tg3_full_unlock(tp);
a71116d1 9667 }
bc1c7567
MC
9668 if (tp->link_config.phy_is_low_power)
9669 tg3_set_power_state(tp, PCI_D3hot);
9670
4cafd3f5
MC
9671}
9672
1da177e4
LT
9673static int tg3_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
9674{
9675 struct mii_ioctl_data *data = if_mii(ifr);
9676 struct tg3 *tp = netdev_priv(dev);
9677 int err;
9678
9679 switch(cmd) {
9680 case SIOCGMIIPHY:
9681 data->phy_id = PHY_ADDR;
9682
9683 /* fallthru */
9684 case SIOCGMIIREG: {
9685 u32 mii_regval;
9686
9687 if (tp->tg3_flags2 & TG3_FLG2_PHY_SERDES)
9688 break; /* We have no PHY */
9689
bc1c7567
MC
9690 if (tp->link_config.phy_is_low_power)
9691 return -EAGAIN;
9692
f47c11ee 9693 spin_lock_bh(&tp->lock);
1da177e4 9694 err = tg3_readphy(tp, data->reg_num & 0x1f, &mii_regval);
f47c11ee 9695 spin_unlock_bh(&tp->lock);
1da177e4
LT
9696
9697 data->val_out = mii_regval;
9698
9699 return err;
9700 }
9701
9702 case SIOCSMIIREG:
9703 if (tp->tg3_flags2 & TG3_FLG2_PHY_SERDES)
9704 break; /* We have no PHY */
9705
9706 if (!capable(CAP_NET_ADMIN))
9707 return -EPERM;
9708
bc1c7567
MC
9709 if (tp->link_config.phy_is_low_power)
9710 return -EAGAIN;
9711
f47c11ee 9712 spin_lock_bh(&tp->lock);
1da177e4 9713 err = tg3_writephy(tp, data->reg_num & 0x1f, data->val_in);
f47c11ee 9714 spin_unlock_bh(&tp->lock);
1da177e4
LT
9715
9716 return err;
9717
9718 default:
9719 /* do nothing */
9720 break;
9721 }
9722 return -EOPNOTSUPP;
9723}
9724
9725#if TG3_VLAN_TAG_USED
9726static void tg3_vlan_rx_register(struct net_device *dev, struct vlan_group *grp)
9727{
9728 struct tg3 *tp = netdev_priv(dev);
9729
29315e87
MC
9730 if (netif_running(dev))
9731 tg3_netif_stop(tp);
9732
f47c11ee 9733 tg3_full_lock(tp, 0);
1da177e4
LT
9734
9735 tp->vlgrp = grp;
9736
9737 /* Update RX_MODE_KEEP_VLAN_TAG bit in RX_MODE register. */
9738 __tg3_set_rx_mode(dev);
9739
29315e87
MC
9740 if (netif_running(dev))
9741 tg3_netif_start(tp);
46966545
MC
9742
9743 tg3_full_unlock(tp);
1da177e4 9744}
1da177e4
LT
9745#endif
9746
15f9850d
DM
9747static int tg3_get_coalesce(struct net_device *dev, struct ethtool_coalesce *ec)
9748{
9749 struct tg3 *tp = netdev_priv(dev);
9750
9751 memcpy(ec, &tp->coal, sizeof(*ec));
9752 return 0;
9753}
9754
d244c892
MC
9755static int tg3_set_coalesce(struct net_device *dev, struct ethtool_coalesce *ec)
9756{
9757 struct tg3 *tp = netdev_priv(dev);
9758 u32 max_rxcoal_tick_int = 0, max_txcoal_tick_int = 0;
9759 u32 max_stat_coal_ticks = 0, min_stat_coal_ticks = 0;
9760
9761 if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS)) {
9762 max_rxcoal_tick_int = MAX_RXCOAL_TICK_INT;
9763 max_txcoal_tick_int = MAX_TXCOAL_TICK_INT;
9764 max_stat_coal_ticks = MAX_STAT_COAL_TICKS;
9765 min_stat_coal_ticks = MIN_STAT_COAL_TICKS;
9766 }
9767
9768 if ((ec->rx_coalesce_usecs > MAX_RXCOL_TICKS) ||
9769 (ec->tx_coalesce_usecs > MAX_TXCOL_TICKS) ||
9770 (ec->rx_max_coalesced_frames > MAX_RXMAX_FRAMES) ||
9771 (ec->tx_max_coalesced_frames > MAX_TXMAX_FRAMES) ||
9772 (ec->rx_coalesce_usecs_irq > max_rxcoal_tick_int) ||
9773 (ec->tx_coalesce_usecs_irq > max_txcoal_tick_int) ||
9774 (ec->rx_max_coalesced_frames_irq > MAX_RXCOAL_MAXF_INT) ||
9775 (ec->tx_max_coalesced_frames_irq > MAX_TXCOAL_MAXF_INT) ||
9776 (ec->stats_block_coalesce_usecs > max_stat_coal_ticks) ||
9777 (ec->stats_block_coalesce_usecs < min_stat_coal_ticks))
9778 return -EINVAL;
9779
9780 /* No rx interrupts will be generated if both are zero */
9781 if ((ec->rx_coalesce_usecs == 0) &&
9782 (ec->rx_max_coalesced_frames == 0))
9783 return -EINVAL;
9784
9785 /* No tx interrupts will be generated if both are zero */
9786 if ((ec->tx_coalesce_usecs == 0) &&
9787 (ec->tx_max_coalesced_frames == 0))
9788 return -EINVAL;
9789
9790 /* Only copy relevant parameters, ignore all others. */
9791 tp->coal.rx_coalesce_usecs = ec->rx_coalesce_usecs;
9792 tp->coal.tx_coalesce_usecs = ec->tx_coalesce_usecs;
9793 tp->coal.rx_max_coalesced_frames = ec->rx_max_coalesced_frames;
9794 tp->coal.tx_max_coalesced_frames = ec->tx_max_coalesced_frames;
9795 tp->coal.rx_coalesce_usecs_irq = ec->rx_coalesce_usecs_irq;
9796 tp->coal.tx_coalesce_usecs_irq = ec->tx_coalesce_usecs_irq;
9797 tp->coal.rx_max_coalesced_frames_irq = ec->rx_max_coalesced_frames_irq;
9798 tp->coal.tx_max_coalesced_frames_irq = ec->tx_max_coalesced_frames_irq;
9799 tp->coal.stats_block_coalesce_usecs = ec->stats_block_coalesce_usecs;
9800
9801 if (netif_running(dev)) {
9802 tg3_full_lock(tp, 0);
9803 __tg3_set_coalesce(tp, &tp->coal);
9804 tg3_full_unlock(tp);
9805 }
9806 return 0;
9807}
9808
7282d491 9809static const struct ethtool_ops tg3_ethtool_ops = {
1da177e4
LT
9810 .get_settings = tg3_get_settings,
9811 .set_settings = tg3_set_settings,
9812 .get_drvinfo = tg3_get_drvinfo,
9813 .get_regs_len = tg3_get_regs_len,
9814 .get_regs = tg3_get_regs,
9815 .get_wol = tg3_get_wol,
9816 .set_wol = tg3_set_wol,
9817 .get_msglevel = tg3_get_msglevel,
9818 .set_msglevel = tg3_set_msglevel,
9819 .nway_reset = tg3_nway_reset,
9820 .get_link = ethtool_op_get_link,
9821 .get_eeprom_len = tg3_get_eeprom_len,
9822 .get_eeprom = tg3_get_eeprom,
9823 .set_eeprom = tg3_set_eeprom,
9824 .get_ringparam = tg3_get_ringparam,
9825 .set_ringparam = tg3_set_ringparam,
9826 .get_pauseparam = tg3_get_pauseparam,
9827 .set_pauseparam = tg3_set_pauseparam,
9828 .get_rx_csum = tg3_get_rx_csum,
9829 .set_rx_csum = tg3_set_rx_csum,
1da177e4 9830 .set_tx_csum = tg3_set_tx_csum,
1da177e4 9831 .set_sg = ethtool_op_set_sg,
1da177e4 9832 .set_tso = tg3_set_tso,
4cafd3f5 9833 .self_test = tg3_self_test,
1da177e4 9834 .get_strings = tg3_get_strings,
4009a93d 9835 .phys_id = tg3_phys_id,
1da177e4 9836 .get_ethtool_stats = tg3_get_ethtool_stats,
15f9850d 9837 .get_coalesce = tg3_get_coalesce,
d244c892 9838 .set_coalesce = tg3_set_coalesce,
b9f2c044 9839 .get_sset_count = tg3_get_sset_count,
1da177e4
LT
9840};
9841
9842static void __devinit tg3_get_eeprom_size(struct tg3 *tp)
9843{
1b27777a 9844 u32 cursize, val, magic;
1da177e4
LT
9845
9846 tp->nvram_size = EEPROM_CHIP_SIZE;
9847
1820180b 9848 if (tg3_nvram_read_swab(tp, 0, &magic) != 0)
1da177e4
LT
9849 return;
9850
b16250e3
MC
9851 if ((magic != TG3_EEPROM_MAGIC) &&
9852 ((magic & TG3_EEPROM_MAGIC_FW_MSK) != TG3_EEPROM_MAGIC_FW) &&
9853 ((magic & TG3_EEPROM_MAGIC_HW_MSK) != TG3_EEPROM_MAGIC_HW))
1da177e4
LT
9854 return;
9855
9856 /*
9857 * Size the chip by reading offsets at increasing powers of two.
9858 * When we encounter our validation signature, we know the addressing
9859 * has wrapped around, and thus have our chip size.
9860 */
1b27777a 9861 cursize = 0x10;
1da177e4
LT
9862
9863 while (cursize < tp->nvram_size) {
1820180b 9864 if (tg3_nvram_read_swab(tp, cursize, &val) != 0)
1da177e4
LT
9865 return;
9866
1820180b 9867 if (val == magic)
1da177e4
LT
9868 break;
9869
9870 cursize <<= 1;
9871 }
9872
9873 tp->nvram_size = cursize;
9874}
6aa20a22 9875
1da177e4
LT
9876static void __devinit tg3_get_nvram_size(struct tg3 *tp)
9877{
9878 u32 val;
9879
1820180b 9880 if (tg3_nvram_read_swab(tp, 0, &val) != 0)
1b27777a
MC
9881 return;
9882
9883 /* Selfboot format */
1820180b 9884 if (val != TG3_EEPROM_MAGIC) {
1b27777a
MC
9885 tg3_get_eeprom_size(tp);
9886 return;
9887 }
9888
1da177e4
LT
9889 if (tg3_nvram_read(tp, 0xf0, &val) == 0) {
9890 if (val != 0) {
9891 tp->nvram_size = (val >> 16) * 1024;
9892 return;
9893 }
9894 }
989a9d23 9895 tp->nvram_size = 0x80000;
1da177e4
LT
9896}
9897
9898static void __devinit tg3_get_nvram_info(struct tg3 *tp)
9899{
9900 u32 nvcfg1;
9901
9902 nvcfg1 = tr32(NVRAM_CFG1);
9903 if (nvcfg1 & NVRAM_CFG1_FLASHIF_ENAB) {
9904 tp->tg3_flags2 |= TG3_FLG2_FLASH;
9905 }
9906 else {
9907 nvcfg1 &= ~NVRAM_CFG1_COMPAT_BYPASS;
9908 tw32(NVRAM_CFG1, nvcfg1);
9909 }
9910
4c987487 9911 if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750) ||
a4e2b347 9912 (tp->tg3_flags2 & TG3_FLG2_5780_CLASS)) {
1da177e4
LT
9913 switch (nvcfg1 & NVRAM_CFG1_VENDOR_MASK) {
9914 case FLASH_VENDOR_ATMEL_FLASH_BUFFERED:
9915 tp->nvram_jedecnum = JEDEC_ATMEL;
9916 tp->nvram_pagesize = ATMEL_AT45DB0X1B_PAGE_SIZE;
9917 tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED;
9918 break;
9919 case FLASH_VENDOR_ATMEL_FLASH_UNBUFFERED:
9920 tp->nvram_jedecnum = JEDEC_ATMEL;
9921 tp->nvram_pagesize = ATMEL_AT25F512_PAGE_SIZE;
9922 break;
9923 case FLASH_VENDOR_ATMEL_EEPROM:
9924 tp->nvram_jedecnum = JEDEC_ATMEL;
9925 tp->nvram_pagesize = ATMEL_AT24C512_CHIP_SIZE;
9926 tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED;
9927 break;
9928 case FLASH_VENDOR_ST:
9929 tp->nvram_jedecnum = JEDEC_ST;
9930 tp->nvram_pagesize = ST_M45PEX0_PAGE_SIZE;
9931 tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED;
9932 break;
9933 case FLASH_VENDOR_SAIFUN:
9934 tp->nvram_jedecnum = JEDEC_SAIFUN;
9935 tp->nvram_pagesize = SAIFUN_SA25F0XX_PAGE_SIZE;
9936 break;
9937 case FLASH_VENDOR_SST_SMALL:
9938 case FLASH_VENDOR_SST_LARGE:
9939 tp->nvram_jedecnum = JEDEC_SST;
9940 tp->nvram_pagesize = SST_25VF0X0_PAGE_SIZE;
9941 break;
9942 }
9943 }
9944 else {
9945 tp->nvram_jedecnum = JEDEC_ATMEL;
9946 tp->nvram_pagesize = ATMEL_AT45DB0X1B_PAGE_SIZE;
9947 tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED;
9948 }
9949}
9950
361b4ac2
MC
9951static void __devinit tg3_get_5752_nvram_info(struct tg3 *tp)
9952{
9953 u32 nvcfg1;
9954
9955 nvcfg1 = tr32(NVRAM_CFG1);
9956
e6af301b
MC
9957 /* NVRAM protection for TPM */
9958 if (nvcfg1 & (1 << 27))
9959 tp->tg3_flags2 |= TG3_FLG2_PROTECTED_NVRAM;
9960
361b4ac2
MC
9961 switch (nvcfg1 & NVRAM_CFG1_5752VENDOR_MASK) {
9962 case FLASH_5752VENDOR_ATMEL_EEPROM_64KHZ:
9963 case FLASH_5752VENDOR_ATMEL_EEPROM_376KHZ:
9964 tp->nvram_jedecnum = JEDEC_ATMEL;
9965 tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED;
9966 break;
9967 case FLASH_5752VENDOR_ATMEL_FLASH_BUFFERED:
9968 tp->nvram_jedecnum = JEDEC_ATMEL;
9969 tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED;
9970 tp->tg3_flags2 |= TG3_FLG2_FLASH;
9971 break;
9972 case FLASH_5752VENDOR_ST_M45PE10:
9973 case FLASH_5752VENDOR_ST_M45PE20:
9974 case FLASH_5752VENDOR_ST_M45PE40:
9975 tp->nvram_jedecnum = JEDEC_ST;
9976 tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED;
9977 tp->tg3_flags2 |= TG3_FLG2_FLASH;
9978 break;
9979 }
9980
9981 if (tp->tg3_flags2 & TG3_FLG2_FLASH) {
9982 switch (nvcfg1 & NVRAM_CFG1_5752PAGE_SIZE_MASK) {
9983 case FLASH_5752PAGE_SIZE_256:
9984 tp->nvram_pagesize = 256;
9985 break;
9986 case FLASH_5752PAGE_SIZE_512:
9987 tp->nvram_pagesize = 512;
9988 break;
9989 case FLASH_5752PAGE_SIZE_1K:
9990 tp->nvram_pagesize = 1024;
9991 break;
9992 case FLASH_5752PAGE_SIZE_2K:
9993 tp->nvram_pagesize = 2048;
9994 break;
9995 case FLASH_5752PAGE_SIZE_4K:
9996 tp->nvram_pagesize = 4096;
9997 break;
9998 case FLASH_5752PAGE_SIZE_264:
9999 tp->nvram_pagesize = 264;
10000 break;
10001 }
10002 }
10003 else {
10004 /* For eeprom, set pagesize to maximum eeprom size */
10005 tp->nvram_pagesize = ATMEL_AT24C512_CHIP_SIZE;
10006
10007 nvcfg1 &= ~NVRAM_CFG1_COMPAT_BYPASS;
10008 tw32(NVRAM_CFG1, nvcfg1);
10009 }
10010}
10011
d3c7b886
MC
10012static void __devinit tg3_get_5755_nvram_info(struct tg3 *tp)
10013{
989a9d23 10014 u32 nvcfg1, protect = 0;
d3c7b886
MC
10015
10016 nvcfg1 = tr32(NVRAM_CFG1);
10017
10018 /* NVRAM protection for TPM */
989a9d23 10019 if (nvcfg1 & (1 << 27)) {
d3c7b886 10020 tp->tg3_flags2 |= TG3_FLG2_PROTECTED_NVRAM;
989a9d23
MC
10021 protect = 1;
10022 }
d3c7b886 10023
989a9d23
MC
10024 nvcfg1 &= NVRAM_CFG1_5752VENDOR_MASK;
10025 switch (nvcfg1) {
d3c7b886
MC
10026 case FLASH_5755VENDOR_ATMEL_FLASH_1:
10027 case FLASH_5755VENDOR_ATMEL_FLASH_2:
10028 case FLASH_5755VENDOR_ATMEL_FLASH_3:
70b65a2d 10029 case FLASH_5755VENDOR_ATMEL_FLASH_5:
d3c7b886
MC
10030 tp->nvram_jedecnum = JEDEC_ATMEL;
10031 tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED;
10032 tp->tg3_flags2 |= TG3_FLG2_FLASH;
10033 tp->nvram_pagesize = 264;
70b65a2d
MC
10034 if (nvcfg1 == FLASH_5755VENDOR_ATMEL_FLASH_1 ||
10035 nvcfg1 == FLASH_5755VENDOR_ATMEL_FLASH_5)
989a9d23
MC
10036 tp->nvram_size = (protect ? 0x3e200 : 0x80000);
10037 else if (nvcfg1 == FLASH_5755VENDOR_ATMEL_FLASH_2)
10038 tp->nvram_size = (protect ? 0x1f200 : 0x40000);
10039 else
10040 tp->nvram_size = (protect ? 0x1f200 : 0x20000);
d3c7b886
MC
10041 break;
10042 case FLASH_5752VENDOR_ST_M45PE10:
10043 case FLASH_5752VENDOR_ST_M45PE20:
10044 case FLASH_5752VENDOR_ST_M45PE40:
10045 tp->nvram_jedecnum = JEDEC_ST;
10046 tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED;
10047 tp->tg3_flags2 |= TG3_FLG2_FLASH;
10048 tp->nvram_pagesize = 256;
989a9d23
MC
10049 if (nvcfg1 == FLASH_5752VENDOR_ST_M45PE10)
10050 tp->nvram_size = (protect ? 0x10000 : 0x20000);
10051 else if (nvcfg1 == FLASH_5752VENDOR_ST_M45PE20)
10052 tp->nvram_size = (protect ? 0x10000 : 0x40000);
10053 else
10054 tp->nvram_size = (protect ? 0x20000 : 0x80000);
d3c7b886
MC
10055 break;
10056 }
10057}
10058
1b27777a
MC
10059static void __devinit tg3_get_5787_nvram_info(struct tg3 *tp)
10060{
10061 u32 nvcfg1;
10062
10063 nvcfg1 = tr32(NVRAM_CFG1);
10064
10065 switch (nvcfg1 & NVRAM_CFG1_5752VENDOR_MASK) {
10066 case FLASH_5787VENDOR_ATMEL_EEPROM_64KHZ:
10067 case FLASH_5787VENDOR_ATMEL_EEPROM_376KHZ:
10068 case FLASH_5787VENDOR_MICRO_EEPROM_64KHZ:
10069 case FLASH_5787VENDOR_MICRO_EEPROM_376KHZ:
10070 tp->nvram_jedecnum = JEDEC_ATMEL;
10071 tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED;
10072 tp->nvram_pagesize = ATMEL_AT24C512_CHIP_SIZE;
10073
10074 nvcfg1 &= ~NVRAM_CFG1_COMPAT_BYPASS;
10075 tw32(NVRAM_CFG1, nvcfg1);
10076 break;
10077 case FLASH_5752VENDOR_ATMEL_FLASH_BUFFERED:
10078 case FLASH_5755VENDOR_ATMEL_FLASH_1:
10079 case FLASH_5755VENDOR_ATMEL_FLASH_2:
10080 case FLASH_5755VENDOR_ATMEL_FLASH_3:
10081 tp->nvram_jedecnum = JEDEC_ATMEL;
10082 tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED;
10083 tp->tg3_flags2 |= TG3_FLG2_FLASH;
10084 tp->nvram_pagesize = 264;
10085 break;
10086 case FLASH_5752VENDOR_ST_M45PE10:
10087 case FLASH_5752VENDOR_ST_M45PE20:
10088 case FLASH_5752VENDOR_ST_M45PE40:
10089 tp->nvram_jedecnum = JEDEC_ST;
10090 tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED;
10091 tp->tg3_flags2 |= TG3_FLG2_FLASH;
10092 tp->nvram_pagesize = 256;
10093 break;
10094 }
10095}
10096
6b91fa02
MC
10097static void __devinit tg3_get_5761_nvram_info(struct tg3 *tp)
10098{
10099 u32 nvcfg1, protect = 0;
10100
10101 nvcfg1 = tr32(NVRAM_CFG1);
10102
10103 /* NVRAM protection for TPM */
10104 if (nvcfg1 & (1 << 27)) {
10105 tp->tg3_flags2 |= TG3_FLG2_PROTECTED_NVRAM;
10106 protect = 1;
10107 }
10108
10109 nvcfg1 &= NVRAM_CFG1_5752VENDOR_MASK;
10110 switch (nvcfg1) {
10111 case FLASH_5761VENDOR_ATMEL_ADB021D:
10112 case FLASH_5761VENDOR_ATMEL_ADB041D:
10113 case FLASH_5761VENDOR_ATMEL_ADB081D:
10114 case FLASH_5761VENDOR_ATMEL_ADB161D:
10115 case FLASH_5761VENDOR_ATMEL_MDB021D:
10116 case FLASH_5761VENDOR_ATMEL_MDB041D:
10117 case FLASH_5761VENDOR_ATMEL_MDB081D:
10118 case FLASH_5761VENDOR_ATMEL_MDB161D:
10119 tp->nvram_jedecnum = JEDEC_ATMEL;
10120 tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED;
10121 tp->tg3_flags2 |= TG3_FLG2_FLASH;
10122 tp->tg3_flags3 |= TG3_FLG3_NO_NVRAM_ADDR_TRANS;
10123 tp->nvram_pagesize = 256;
10124 break;
10125 case FLASH_5761VENDOR_ST_A_M45PE20:
10126 case FLASH_5761VENDOR_ST_A_M45PE40:
10127 case FLASH_5761VENDOR_ST_A_M45PE80:
10128 case FLASH_5761VENDOR_ST_A_M45PE16:
10129 case FLASH_5761VENDOR_ST_M_M45PE20:
10130 case FLASH_5761VENDOR_ST_M_M45PE40:
10131 case FLASH_5761VENDOR_ST_M_M45PE80:
10132 case FLASH_5761VENDOR_ST_M_M45PE16:
10133 tp->nvram_jedecnum = JEDEC_ST;
10134 tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED;
10135 tp->tg3_flags2 |= TG3_FLG2_FLASH;
10136 tp->nvram_pagesize = 256;
10137 break;
10138 }
10139
10140 if (protect) {
10141 tp->nvram_size = tr32(NVRAM_ADDR_LOCKOUT);
10142 } else {
10143 switch (nvcfg1) {
10144 case FLASH_5761VENDOR_ATMEL_ADB161D:
10145 case FLASH_5761VENDOR_ATMEL_MDB161D:
10146 case FLASH_5761VENDOR_ST_A_M45PE16:
10147 case FLASH_5761VENDOR_ST_M_M45PE16:
10148 tp->nvram_size = 0x100000;
10149 break;
10150 case FLASH_5761VENDOR_ATMEL_ADB081D:
10151 case FLASH_5761VENDOR_ATMEL_MDB081D:
10152 case FLASH_5761VENDOR_ST_A_M45PE80:
10153 case FLASH_5761VENDOR_ST_M_M45PE80:
10154 tp->nvram_size = 0x80000;
10155 break;
10156 case FLASH_5761VENDOR_ATMEL_ADB041D:
10157 case FLASH_5761VENDOR_ATMEL_MDB041D:
10158 case FLASH_5761VENDOR_ST_A_M45PE40:
10159 case FLASH_5761VENDOR_ST_M_M45PE40:
10160 tp->nvram_size = 0x40000;
10161 break;
10162 case FLASH_5761VENDOR_ATMEL_ADB021D:
10163 case FLASH_5761VENDOR_ATMEL_MDB021D:
10164 case FLASH_5761VENDOR_ST_A_M45PE20:
10165 case FLASH_5761VENDOR_ST_M_M45PE20:
10166 tp->nvram_size = 0x20000;
10167 break;
10168 }
10169 }
10170}
10171
b5d3772c
MC
10172static void __devinit tg3_get_5906_nvram_info(struct tg3 *tp)
10173{
10174 tp->nvram_jedecnum = JEDEC_ATMEL;
10175 tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED;
10176 tp->nvram_pagesize = ATMEL_AT24C512_CHIP_SIZE;
10177}
10178
1da177e4
LT
10179/* Chips other than 5700/5701 use the NVRAM for fetching info. */
10180static void __devinit tg3_nvram_init(struct tg3 *tp)
10181{
1da177e4
LT
10182 tw32_f(GRC_EEPROM_ADDR,
10183 (EEPROM_ADDR_FSM_RESET |
10184 (EEPROM_DEFAULT_CLOCK_PERIOD <<
10185 EEPROM_ADDR_CLKPERD_SHIFT)));
10186
9d57f01c 10187 msleep(1);
1da177e4
LT
10188
10189 /* Enable seeprom accesses. */
10190 tw32_f(GRC_LOCAL_CTRL,
10191 tr32(GRC_LOCAL_CTRL) | GRC_LCLCTRL_AUTO_SEEPROM);
10192 udelay(100);
10193
10194 if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5700 &&
10195 GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5701) {
10196 tp->tg3_flags |= TG3_FLAG_NVRAM;
10197
ec41c7df
MC
10198 if (tg3_nvram_lock(tp)) {
10199 printk(KERN_WARNING PFX "%s: Cannot get nvarm lock, "
10200 "tg3_nvram_init failed.\n", tp->dev->name);
10201 return;
10202 }
e6af301b 10203 tg3_enable_nvram_access(tp);
1da177e4 10204
989a9d23
MC
10205 tp->nvram_size = 0;
10206
361b4ac2
MC
10207 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5752)
10208 tg3_get_5752_nvram_info(tp);
d3c7b886
MC
10209 else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755)
10210 tg3_get_5755_nvram_info(tp);
d30cdd28
MC
10211 else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787 ||
10212 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5784)
1b27777a 10213 tg3_get_5787_nvram_info(tp);
6b91fa02
MC
10214 else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5761)
10215 tg3_get_5761_nvram_info(tp);
b5d3772c
MC
10216 else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906)
10217 tg3_get_5906_nvram_info(tp);
361b4ac2
MC
10218 else
10219 tg3_get_nvram_info(tp);
10220
989a9d23
MC
10221 if (tp->nvram_size == 0)
10222 tg3_get_nvram_size(tp);
1da177e4 10223
e6af301b 10224 tg3_disable_nvram_access(tp);
381291b7 10225 tg3_nvram_unlock(tp);
1da177e4
LT
10226
10227 } else {
10228 tp->tg3_flags &= ~(TG3_FLAG_NVRAM | TG3_FLAG_NVRAM_BUFFERED);
10229
10230 tg3_get_eeprom_size(tp);
10231 }
10232}
10233
10234static int tg3_nvram_read_using_eeprom(struct tg3 *tp,
10235 u32 offset, u32 *val)
10236{
10237 u32 tmp;
10238 int i;
10239
10240 if (offset > EEPROM_ADDR_ADDR_MASK ||
10241 (offset % 4) != 0)
10242 return -EINVAL;
10243
10244 tmp = tr32(GRC_EEPROM_ADDR) & ~(EEPROM_ADDR_ADDR_MASK |
10245 EEPROM_ADDR_DEVID_MASK |
10246 EEPROM_ADDR_READ);
10247 tw32(GRC_EEPROM_ADDR,
10248 tmp |
10249 (0 << EEPROM_ADDR_DEVID_SHIFT) |
10250 ((offset << EEPROM_ADDR_ADDR_SHIFT) &
10251 EEPROM_ADDR_ADDR_MASK) |
10252 EEPROM_ADDR_READ | EEPROM_ADDR_START);
10253
9d57f01c 10254 for (i = 0; i < 1000; i++) {
1da177e4
LT
10255 tmp = tr32(GRC_EEPROM_ADDR);
10256
10257 if (tmp & EEPROM_ADDR_COMPLETE)
10258 break;
9d57f01c 10259 msleep(1);
1da177e4
LT
10260 }
10261 if (!(tmp & EEPROM_ADDR_COMPLETE))
10262 return -EBUSY;
10263
10264 *val = tr32(GRC_EEPROM_DATA);
10265 return 0;
10266}
10267
10268#define NVRAM_CMD_TIMEOUT 10000
10269
10270static int tg3_nvram_exec_cmd(struct tg3 *tp, u32 nvram_cmd)
10271{
10272 int i;
10273
10274 tw32(NVRAM_CMD, nvram_cmd);
10275 for (i = 0; i < NVRAM_CMD_TIMEOUT; i++) {
10276 udelay(10);
10277 if (tr32(NVRAM_CMD) & NVRAM_CMD_DONE) {
10278 udelay(10);
10279 break;
10280 }
10281 }
10282 if (i == NVRAM_CMD_TIMEOUT) {
10283 return -EBUSY;
10284 }
10285 return 0;
10286}
10287
1820180b
MC
10288static u32 tg3_nvram_phys_addr(struct tg3 *tp, u32 addr)
10289{
10290 if ((tp->tg3_flags & TG3_FLAG_NVRAM) &&
10291 (tp->tg3_flags & TG3_FLAG_NVRAM_BUFFERED) &&
10292 (tp->tg3_flags2 & TG3_FLG2_FLASH) &&
6b91fa02 10293 !(tp->tg3_flags3 & TG3_FLG3_NO_NVRAM_ADDR_TRANS) &&
1820180b
MC
10294 (tp->nvram_jedecnum == JEDEC_ATMEL))
10295
10296 addr = ((addr / tp->nvram_pagesize) <<
10297 ATMEL_AT45DB0X1B_PAGE_POS) +
10298 (addr % tp->nvram_pagesize);
10299
10300 return addr;
10301}
10302
c4e6575c
MC
10303static u32 tg3_nvram_logical_addr(struct tg3 *tp, u32 addr)
10304{
10305 if ((tp->tg3_flags & TG3_FLAG_NVRAM) &&
10306 (tp->tg3_flags & TG3_FLAG_NVRAM_BUFFERED) &&
10307 (tp->tg3_flags2 & TG3_FLG2_FLASH) &&
6b91fa02 10308 !(tp->tg3_flags3 & TG3_FLG3_NO_NVRAM_ADDR_TRANS) &&
c4e6575c
MC
10309 (tp->nvram_jedecnum == JEDEC_ATMEL))
10310
10311 addr = ((addr >> ATMEL_AT45DB0X1B_PAGE_POS) *
10312 tp->nvram_pagesize) +
10313 (addr & ((1 << ATMEL_AT45DB0X1B_PAGE_POS) - 1));
10314
10315 return addr;
10316}
10317
1da177e4
LT
10318static int tg3_nvram_read(struct tg3 *tp, u32 offset, u32 *val)
10319{
10320 int ret;
10321
1da177e4
LT
10322 if (!(tp->tg3_flags & TG3_FLAG_NVRAM))
10323 return tg3_nvram_read_using_eeprom(tp, offset, val);
10324
1820180b 10325 offset = tg3_nvram_phys_addr(tp, offset);
1da177e4
LT
10326
10327 if (offset > NVRAM_ADDR_MSK)
10328 return -EINVAL;
10329
ec41c7df
MC
10330 ret = tg3_nvram_lock(tp);
10331 if (ret)
10332 return ret;
1da177e4 10333
e6af301b 10334 tg3_enable_nvram_access(tp);
1da177e4
LT
10335
10336 tw32(NVRAM_ADDR, offset);
10337 ret = tg3_nvram_exec_cmd(tp, NVRAM_CMD_RD | NVRAM_CMD_GO |
10338 NVRAM_CMD_FIRST | NVRAM_CMD_LAST | NVRAM_CMD_DONE);
10339
10340 if (ret == 0)
10341 *val = swab32(tr32(NVRAM_RDDATA));
10342
e6af301b 10343 tg3_disable_nvram_access(tp);
1da177e4 10344
381291b7
MC
10345 tg3_nvram_unlock(tp);
10346
1da177e4
LT
10347 return ret;
10348}
10349
b9fc7dc5
AV
10350static int tg3_nvram_read_le(struct tg3 *tp, u32 offset, __le32 *val)
10351{
10352 u32 v;
10353 int res = tg3_nvram_read(tp, offset, &v);
10354 if (!res)
10355 *val = cpu_to_le32(v);
10356 return res;
10357}
10358
1820180b
MC
10359static int tg3_nvram_read_swab(struct tg3 *tp, u32 offset, u32 *val)
10360{
10361 int err;
10362 u32 tmp;
10363
10364 err = tg3_nvram_read(tp, offset, &tmp);
10365 *val = swab32(tmp);
10366 return err;
10367}
10368
1da177e4
LT
10369static int tg3_nvram_write_block_using_eeprom(struct tg3 *tp,
10370 u32 offset, u32 len, u8 *buf)
10371{
10372 int i, j, rc = 0;
10373 u32 val;
10374
10375 for (i = 0; i < len; i += 4) {
b9fc7dc5
AV
10376 u32 addr;
10377 __le32 data;
1da177e4
LT
10378
10379 addr = offset + i;
10380
10381 memcpy(&data, buf + i, 4);
10382
b9fc7dc5 10383 tw32(GRC_EEPROM_DATA, le32_to_cpu(data));
1da177e4
LT
10384
10385 val = tr32(GRC_EEPROM_ADDR);
10386 tw32(GRC_EEPROM_ADDR, val | EEPROM_ADDR_COMPLETE);
10387
10388 val &= ~(EEPROM_ADDR_ADDR_MASK | EEPROM_ADDR_DEVID_MASK |
10389 EEPROM_ADDR_READ);
10390 tw32(GRC_EEPROM_ADDR, val |
10391 (0 << EEPROM_ADDR_DEVID_SHIFT) |
10392 (addr & EEPROM_ADDR_ADDR_MASK) |
10393 EEPROM_ADDR_START |
10394 EEPROM_ADDR_WRITE);
6aa20a22 10395
9d57f01c 10396 for (j = 0; j < 1000; j++) {
1da177e4
LT
10397 val = tr32(GRC_EEPROM_ADDR);
10398
10399 if (val & EEPROM_ADDR_COMPLETE)
10400 break;
9d57f01c 10401 msleep(1);
1da177e4
LT
10402 }
10403 if (!(val & EEPROM_ADDR_COMPLETE)) {
10404 rc = -EBUSY;
10405 break;
10406 }
10407 }
10408
10409 return rc;
10410}
10411
10412/* offset and length are dword aligned */
10413static int tg3_nvram_write_block_unbuffered(struct tg3 *tp, u32 offset, u32 len,
10414 u8 *buf)
10415{
10416 int ret = 0;
10417 u32 pagesize = tp->nvram_pagesize;
10418 u32 pagemask = pagesize - 1;
10419 u32 nvram_cmd;
10420 u8 *tmp;
10421
10422 tmp = kmalloc(pagesize, GFP_KERNEL);
10423 if (tmp == NULL)
10424 return -ENOMEM;
10425
10426 while (len) {
10427 int j;
e6af301b 10428 u32 phy_addr, page_off, size;
1da177e4
LT
10429
10430 phy_addr = offset & ~pagemask;
6aa20a22 10431
1da177e4 10432 for (j = 0; j < pagesize; j += 4) {
286e310f 10433 if ((ret = tg3_nvram_read_le(tp, phy_addr + j,
b9fc7dc5 10434 (__le32 *) (tmp + j))))
1da177e4
LT
10435 break;
10436 }
10437 if (ret)
10438 break;
10439
10440 page_off = offset & pagemask;
10441 size = pagesize;
10442 if (len < size)
10443 size = len;
10444
10445 len -= size;
10446
10447 memcpy(tmp + page_off, buf, size);
10448
10449 offset = offset + (pagesize - page_off);
10450
e6af301b 10451 tg3_enable_nvram_access(tp);
1da177e4
LT
10452
10453 /*
10454 * Before we can erase the flash page, we need
10455 * to issue a special "write enable" command.
10456 */
10457 nvram_cmd = NVRAM_CMD_WREN | NVRAM_CMD_GO | NVRAM_CMD_DONE;
10458
10459 if (tg3_nvram_exec_cmd(tp, nvram_cmd))
10460 break;
10461
10462 /* Erase the target page */
10463 tw32(NVRAM_ADDR, phy_addr);
10464
10465 nvram_cmd = NVRAM_CMD_GO | NVRAM_CMD_DONE | NVRAM_CMD_WR |
10466 NVRAM_CMD_FIRST | NVRAM_CMD_LAST | NVRAM_CMD_ERASE;
10467
10468 if (tg3_nvram_exec_cmd(tp, nvram_cmd))
10469 break;
10470
10471 /* Issue another write enable to start the write. */
10472 nvram_cmd = NVRAM_CMD_WREN | NVRAM_CMD_GO | NVRAM_CMD_DONE;
10473
10474 if (tg3_nvram_exec_cmd(tp, nvram_cmd))
10475 break;
10476
10477 for (j = 0; j < pagesize; j += 4) {
b9fc7dc5 10478 __be32 data;
1da177e4 10479
b9fc7dc5
AV
10480 data = *((__be32 *) (tmp + j));
10481 /* swab32(le32_to_cpu(data)), actually */
10482 tw32(NVRAM_WRDATA, be32_to_cpu(data));
1da177e4
LT
10483
10484 tw32(NVRAM_ADDR, phy_addr + j);
10485
10486 nvram_cmd = NVRAM_CMD_GO | NVRAM_CMD_DONE |
10487 NVRAM_CMD_WR;
10488
10489 if (j == 0)
10490 nvram_cmd |= NVRAM_CMD_FIRST;
10491 else if (j == (pagesize - 4))
10492 nvram_cmd |= NVRAM_CMD_LAST;
10493
10494 if ((ret = tg3_nvram_exec_cmd(tp, nvram_cmd)))
10495 break;
10496 }
10497 if (ret)
10498 break;
10499 }
10500
10501 nvram_cmd = NVRAM_CMD_WRDI | NVRAM_CMD_GO | NVRAM_CMD_DONE;
10502 tg3_nvram_exec_cmd(tp, nvram_cmd);
10503
10504 kfree(tmp);
10505
10506 return ret;
10507}
10508
10509/* offset and length are dword aligned */
10510static int tg3_nvram_write_block_buffered(struct tg3 *tp, u32 offset, u32 len,
10511 u8 *buf)
10512{
10513 int i, ret = 0;
10514
10515 for (i = 0; i < len; i += 4, offset += 4) {
b9fc7dc5
AV
10516 u32 page_off, phy_addr, nvram_cmd;
10517 __be32 data;
1da177e4
LT
10518
10519 memcpy(&data, buf + i, 4);
b9fc7dc5 10520 tw32(NVRAM_WRDATA, be32_to_cpu(data));
1da177e4
LT
10521
10522 page_off = offset % tp->nvram_pagesize;
10523
1820180b 10524 phy_addr = tg3_nvram_phys_addr(tp, offset);
1da177e4
LT
10525
10526 tw32(NVRAM_ADDR, phy_addr);
10527
10528 nvram_cmd = NVRAM_CMD_GO | NVRAM_CMD_DONE | NVRAM_CMD_WR;
10529
10530 if ((page_off == 0) || (i == 0))
10531 nvram_cmd |= NVRAM_CMD_FIRST;
f6d9a256 10532 if (page_off == (tp->nvram_pagesize - 4))
1da177e4
LT
10533 nvram_cmd |= NVRAM_CMD_LAST;
10534
10535 if (i == (len - 4))
10536 nvram_cmd |= NVRAM_CMD_LAST;
10537
4c987487 10538 if ((GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5752) &&
af36e6b6 10539 (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5755) &&
1b27777a 10540 (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5787) &&
d30cdd28 10541 (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5784) &&
9936bcf6 10542 (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5761) &&
4c987487
MC
10543 (tp->nvram_jedecnum == JEDEC_ST) &&
10544 (nvram_cmd & NVRAM_CMD_FIRST)) {
1da177e4
LT
10545
10546 if ((ret = tg3_nvram_exec_cmd(tp,
10547 NVRAM_CMD_WREN | NVRAM_CMD_GO |
10548 NVRAM_CMD_DONE)))
10549
10550 break;
10551 }
10552 if (!(tp->tg3_flags2 & TG3_FLG2_FLASH)) {
10553 /* We always do complete word writes to eeprom. */
10554 nvram_cmd |= (NVRAM_CMD_FIRST | NVRAM_CMD_LAST);
10555 }
10556
10557 if ((ret = tg3_nvram_exec_cmd(tp, nvram_cmd)))
10558 break;
10559 }
10560 return ret;
10561}
10562
10563/* offset and length are dword aligned */
10564static int tg3_nvram_write_block(struct tg3 *tp, u32 offset, u32 len, u8 *buf)
10565{
10566 int ret;
10567
1da177e4 10568 if (tp->tg3_flags & TG3_FLAG_EEPROM_WRITE_PROT) {
314fba34
MC
10569 tw32_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl &
10570 ~GRC_LCLCTRL_GPIO_OUTPUT1);
1da177e4
LT
10571 udelay(40);
10572 }
10573
10574 if (!(tp->tg3_flags & TG3_FLAG_NVRAM)) {
10575 ret = tg3_nvram_write_block_using_eeprom(tp, offset, len, buf);
10576 }
10577 else {
10578 u32 grc_mode;
10579
ec41c7df
MC
10580 ret = tg3_nvram_lock(tp);
10581 if (ret)
10582 return ret;
1da177e4 10583
e6af301b
MC
10584 tg3_enable_nvram_access(tp);
10585 if ((tp->tg3_flags2 & TG3_FLG2_5750_PLUS) &&
10586 !(tp->tg3_flags2 & TG3_FLG2_PROTECTED_NVRAM))
1da177e4 10587 tw32(NVRAM_WRITE1, 0x406);
1da177e4
LT
10588
10589 grc_mode = tr32(GRC_MODE);
10590 tw32(GRC_MODE, grc_mode | GRC_MODE_NVRAM_WR_ENABLE);
10591
10592 if ((tp->tg3_flags & TG3_FLAG_NVRAM_BUFFERED) ||
10593 !(tp->tg3_flags2 & TG3_FLG2_FLASH)) {
10594
10595 ret = tg3_nvram_write_block_buffered(tp, offset, len,
10596 buf);
10597 }
10598 else {
10599 ret = tg3_nvram_write_block_unbuffered(tp, offset, len,
10600 buf);
10601 }
10602
10603 grc_mode = tr32(GRC_MODE);
10604 tw32(GRC_MODE, grc_mode & ~GRC_MODE_NVRAM_WR_ENABLE);
10605
e6af301b 10606 tg3_disable_nvram_access(tp);
1da177e4
LT
10607 tg3_nvram_unlock(tp);
10608 }
10609
10610 if (tp->tg3_flags & TG3_FLAG_EEPROM_WRITE_PROT) {
314fba34 10611 tw32_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl);
1da177e4
LT
10612 udelay(40);
10613 }
10614
10615 return ret;
10616}
10617
10618struct subsys_tbl_ent {
10619 u16 subsys_vendor, subsys_devid;
10620 u32 phy_id;
10621};
10622
10623static struct subsys_tbl_ent subsys_id_to_phy_id[] = {
10624 /* Broadcom boards. */
10625 { PCI_VENDOR_ID_BROADCOM, 0x1644, PHY_ID_BCM5401 }, /* BCM95700A6 */
10626 { PCI_VENDOR_ID_BROADCOM, 0x0001, PHY_ID_BCM5701 }, /* BCM95701A5 */
10627 { PCI_VENDOR_ID_BROADCOM, 0x0002, PHY_ID_BCM8002 }, /* BCM95700T6 */
10628 { PCI_VENDOR_ID_BROADCOM, 0x0003, 0 }, /* BCM95700A9 */
10629 { PCI_VENDOR_ID_BROADCOM, 0x0005, PHY_ID_BCM5701 }, /* BCM95701T1 */
10630 { PCI_VENDOR_ID_BROADCOM, 0x0006, PHY_ID_BCM5701 }, /* BCM95701T8 */
10631 { PCI_VENDOR_ID_BROADCOM, 0x0007, 0 }, /* BCM95701A7 */
10632 { PCI_VENDOR_ID_BROADCOM, 0x0008, PHY_ID_BCM5701 }, /* BCM95701A10 */
10633 { PCI_VENDOR_ID_BROADCOM, 0x8008, PHY_ID_BCM5701 }, /* BCM95701A12 */
10634 { PCI_VENDOR_ID_BROADCOM, 0x0009, PHY_ID_BCM5703 }, /* BCM95703Ax1 */
10635 { PCI_VENDOR_ID_BROADCOM, 0x8009, PHY_ID_BCM5703 }, /* BCM95703Ax2 */
10636
10637 /* 3com boards. */
10638 { PCI_VENDOR_ID_3COM, 0x1000, PHY_ID_BCM5401 }, /* 3C996T */
10639 { PCI_VENDOR_ID_3COM, 0x1006, PHY_ID_BCM5701 }, /* 3C996BT */
10640 { PCI_VENDOR_ID_3COM, 0x1004, 0 }, /* 3C996SX */
10641 { PCI_VENDOR_ID_3COM, 0x1007, PHY_ID_BCM5701 }, /* 3C1000T */
10642 { PCI_VENDOR_ID_3COM, 0x1008, PHY_ID_BCM5701 }, /* 3C940BR01 */
10643
10644 /* DELL boards. */
10645 { PCI_VENDOR_ID_DELL, 0x00d1, PHY_ID_BCM5401 }, /* VIPER */
10646 { PCI_VENDOR_ID_DELL, 0x0106, PHY_ID_BCM5401 }, /* JAGUAR */
10647 { PCI_VENDOR_ID_DELL, 0x0109, PHY_ID_BCM5411 }, /* MERLOT */
10648 { PCI_VENDOR_ID_DELL, 0x010a, PHY_ID_BCM5411 }, /* SLIM_MERLOT */
10649
10650 /* Compaq boards. */
10651 { PCI_VENDOR_ID_COMPAQ, 0x007c, PHY_ID_BCM5701 }, /* BANSHEE */
10652 { PCI_VENDOR_ID_COMPAQ, 0x009a, PHY_ID_BCM5701 }, /* BANSHEE_2 */
10653 { PCI_VENDOR_ID_COMPAQ, 0x007d, 0 }, /* CHANGELING */
10654 { PCI_VENDOR_ID_COMPAQ, 0x0085, PHY_ID_BCM5701 }, /* NC7780 */
10655 { PCI_VENDOR_ID_COMPAQ, 0x0099, PHY_ID_BCM5701 }, /* NC7780_2 */
10656
10657 /* IBM boards. */
10658 { PCI_VENDOR_ID_IBM, 0x0281, 0 } /* IBM??? */
10659};
10660
10661static inline struct subsys_tbl_ent *lookup_by_subsys(struct tg3 *tp)
10662{
10663 int i;
10664
10665 for (i = 0; i < ARRAY_SIZE(subsys_id_to_phy_id); i++) {
10666 if ((subsys_id_to_phy_id[i].subsys_vendor ==
10667 tp->pdev->subsystem_vendor) &&
10668 (subsys_id_to_phy_id[i].subsys_devid ==
10669 tp->pdev->subsystem_device))
10670 return &subsys_id_to_phy_id[i];
10671 }
10672 return NULL;
10673}
10674
7d0c41ef 10675static void __devinit tg3_get_eeprom_hw_cfg(struct tg3 *tp)
1da177e4 10676{
1da177e4 10677 u32 val;
caf636c7
MC
10678 u16 pmcsr;
10679
10680 /* On some early chips the SRAM cannot be accessed in D3hot state,
10681 * so need make sure we're in D0.
10682 */
10683 pci_read_config_word(tp->pdev, tp->pm_cap + PCI_PM_CTRL, &pmcsr);
10684 pmcsr &= ~PCI_PM_CTRL_STATE_MASK;
10685 pci_write_config_word(tp->pdev, tp->pm_cap + PCI_PM_CTRL, pmcsr);
10686 msleep(1);
7d0c41ef
MC
10687
10688 /* Make sure register accesses (indirect or otherwise)
10689 * will function correctly.
10690 */
10691 pci_write_config_dword(tp->pdev, TG3PCI_MISC_HOST_CTRL,
10692 tp->misc_host_ctrl);
1da177e4 10693
f49639e6
DM
10694 /* The memory arbiter has to be enabled in order for SRAM accesses
10695 * to succeed. Normally on powerup the tg3 chip firmware will make
10696 * sure it is enabled, but other entities such as system netboot
10697 * code might disable it.
10698 */
10699 val = tr32(MEMARB_MODE);
10700 tw32(MEMARB_MODE, val | MEMARB_MODE_ENABLE);
10701
1da177e4 10702 tp->phy_id = PHY_ID_INVALID;
7d0c41ef
MC
10703 tp->led_ctrl = LED_CTRL_MODE_PHY_1;
10704
a85feb8c
GZ
10705 /* Assume an onboard device and WOL capable by default. */
10706 tp->tg3_flags |= TG3_FLAG_EEPROM_WRITE_PROT | TG3_FLAG_WOL_CAP;
72b845e0 10707
b5d3772c 10708 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) {
9d26e213 10709 if (!(tr32(PCIE_TRANSACTION_CFG) & PCIE_TRANS_CFG_LOM)) {
b5d3772c 10710 tp->tg3_flags &= ~TG3_FLAG_EEPROM_WRITE_PROT;
9d26e213
MC
10711 tp->tg3_flags2 |= TG3_FLG2_IS_NIC;
10712 }
0527ba35
MC
10713 val = tr32(VCPU_CFGSHDW);
10714 if (val & VCPU_CFGSHDW_ASPM_DBNC)
8ed5d97e 10715 tp->tg3_flags |= TG3_FLAG_ASPM_WORKAROUND;
0527ba35
MC
10716 if ((val & VCPU_CFGSHDW_WOL_ENABLE) &&
10717 (val & VCPU_CFGSHDW_WOL_MAGPKT))
10718 tp->tg3_flags |= TG3_FLAG_WOL_ENABLE;
b5d3772c
MC
10719 return;
10720 }
10721
1da177e4
LT
10722 tg3_read_mem(tp, NIC_SRAM_DATA_SIG, &val);
10723 if (val == NIC_SRAM_DATA_SIG_MAGIC) {
10724 u32 nic_cfg, led_cfg;
7d0c41ef
MC
10725 u32 nic_phy_id, ver, cfg2 = 0, eeprom_phy_id;
10726 int eeprom_phy_serdes = 0;
1da177e4
LT
10727
10728 tg3_read_mem(tp, NIC_SRAM_DATA_CFG, &nic_cfg);
10729 tp->nic_sram_data_cfg = nic_cfg;
10730
10731 tg3_read_mem(tp, NIC_SRAM_DATA_VER, &ver);
10732 ver >>= NIC_SRAM_DATA_VER_SHIFT;
10733 if ((GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5700) &&
10734 (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5701) &&
10735 (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5703) &&
10736 (ver > 0) && (ver < 0x100))
10737 tg3_read_mem(tp, NIC_SRAM_DATA_CFG_2, &cfg2);
10738
1da177e4
LT
10739 if ((nic_cfg & NIC_SRAM_DATA_CFG_PHY_TYPE_MASK) ==
10740 NIC_SRAM_DATA_CFG_PHY_TYPE_FIBER)
10741 eeprom_phy_serdes = 1;
10742
10743 tg3_read_mem(tp, NIC_SRAM_DATA_PHY_ID, &nic_phy_id);
10744 if (nic_phy_id != 0) {
10745 u32 id1 = nic_phy_id & NIC_SRAM_DATA_PHY_ID1_MASK;
10746 u32 id2 = nic_phy_id & NIC_SRAM_DATA_PHY_ID2_MASK;
10747
10748 eeprom_phy_id = (id1 >> 16) << 10;
10749 eeprom_phy_id |= (id2 & 0xfc00) << 16;
10750 eeprom_phy_id |= (id2 & 0x03ff) << 0;
10751 } else
10752 eeprom_phy_id = 0;
10753
7d0c41ef 10754 tp->phy_id = eeprom_phy_id;
747e8f8b 10755 if (eeprom_phy_serdes) {
a4e2b347 10756 if (tp->tg3_flags2 & TG3_FLG2_5780_CLASS)
747e8f8b
MC
10757 tp->tg3_flags2 |= TG3_FLG2_MII_SERDES;
10758 else
10759 tp->tg3_flags2 |= TG3_FLG2_PHY_SERDES;
10760 }
7d0c41ef 10761
cbf46853 10762 if (tp->tg3_flags2 & TG3_FLG2_5750_PLUS)
1da177e4
LT
10763 led_cfg = cfg2 & (NIC_SRAM_DATA_CFG_LED_MODE_MASK |
10764 SHASTA_EXT_LED_MODE_MASK);
cbf46853 10765 else
1da177e4
LT
10766 led_cfg = nic_cfg & NIC_SRAM_DATA_CFG_LED_MODE_MASK;
10767
10768 switch (led_cfg) {
10769 default:
10770 case NIC_SRAM_DATA_CFG_LED_MODE_PHY_1:
10771 tp->led_ctrl = LED_CTRL_MODE_PHY_1;
10772 break;
10773
10774 case NIC_SRAM_DATA_CFG_LED_MODE_PHY_2:
10775 tp->led_ctrl = LED_CTRL_MODE_PHY_2;
10776 break;
10777
10778 case NIC_SRAM_DATA_CFG_LED_MODE_MAC:
10779 tp->led_ctrl = LED_CTRL_MODE_MAC;
9ba27794
MC
10780
10781 /* Default to PHY_1_MODE if 0 (MAC_MODE) is
10782 * read on some older 5700/5701 bootcode.
10783 */
10784 if (GET_ASIC_REV(tp->pci_chip_rev_id) ==
10785 ASIC_REV_5700 ||
10786 GET_ASIC_REV(tp->pci_chip_rev_id) ==
10787 ASIC_REV_5701)
10788 tp->led_ctrl = LED_CTRL_MODE_PHY_1;
10789
1da177e4
LT
10790 break;
10791
10792 case SHASTA_EXT_LED_SHARED:
10793 tp->led_ctrl = LED_CTRL_MODE_SHARED;
10794 if (tp->pci_chip_rev_id != CHIPREV_ID_5750_A0 &&
10795 tp->pci_chip_rev_id != CHIPREV_ID_5750_A1)
10796 tp->led_ctrl |= (LED_CTRL_MODE_PHY_1 |
10797 LED_CTRL_MODE_PHY_2);
10798 break;
10799
10800 case SHASTA_EXT_LED_MAC:
10801 tp->led_ctrl = LED_CTRL_MODE_SHASTA_MAC;
10802 break;
10803
10804 case SHASTA_EXT_LED_COMBO:
10805 tp->led_ctrl = LED_CTRL_MODE_COMBO;
10806 if (tp->pci_chip_rev_id != CHIPREV_ID_5750_A0)
10807 tp->led_ctrl |= (LED_CTRL_MODE_PHY_1 |
10808 LED_CTRL_MODE_PHY_2);
10809 break;
10810
10811 };
10812
10813 if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 ||
10814 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701) &&
10815 tp->pdev->subsystem_vendor == PCI_VENDOR_ID_DELL)
10816 tp->led_ctrl = LED_CTRL_MODE_PHY_2;
10817
b2a5c19c
MC
10818 if (GET_CHIP_REV(tp->pci_chip_rev_id) == CHIPREV_5784_AX)
10819 tp->led_ctrl = LED_CTRL_MODE_PHY_1;
5f60891b 10820
9d26e213 10821 if (nic_cfg & NIC_SRAM_DATA_CFG_EEPROM_WP) {
1da177e4 10822 tp->tg3_flags |= TG3_FLAG_EEPROM_WRITE_PROT;
9d26e213
MC
10823 if ((tp->pdev->subsystem_vendor ==
10824 PCI_VENDOR_ID_ARIMA) &&
10825 (tp->pdev->subsystem_device == 0x205a ||
10826 tp->pdev->subsystem_device == 0x2063))
10827 tp->tg3_flags &= ~TG3_FLAG_EEPROM_WRITE_PROT;
10828 } else {
f49639e6 10829 tp->tg3_flags &= ~TG3_FLAG_EEPROM_WRITE_PROT;
9d26e213
MC
10830 tp->tg3_flags2 |= TG3_FLG2_IS_NIC;
10831 }
1da177e4
LT
10832
10833 if (nic_cfg & NIC_SRAM_DATA_CFG_ASF_ENABLE) {
10834 tp->tg3_flags |= TG3_FLAG_ENABLE_ASF;
cbf46853 10835 if (tp->tg3_flags2 & TG3_FLG2_5750_PLUS)
1da177e4
LT
10836 tp->tg3_flags2 |= TG3_FLG2_ASF_NEW_HANDSHAKE;
10837 }
0d3031d9
MC
10838 if (nic_cfg & NIC_SRAM_DATA_CFG_APE_ENABLE)
10839 tp->tg3_flags3 |= TG3_FLG3_ENABLE_APE;
a85feb8c
GZ
10840 if (tp->tg3_flags2 & TG3_FLG2_ANY_SERDES &&
10841 !(nic_cfg & NIC_SRAM_DATA_CFG_FIBER_WOL))
10842 tp->tg3_flags &= ~TG3_FLAG_WOL_CAP;
1da177e4 10843
0527ba35
MC
10844 if (tp->tg3_flags & TG3_FLAG_WOL_CAP &&
10845 nic_cfg & NIC_SRAM_DATA_CFG_WOL_ENABLE)
10846 tp->tg3_flags |= TG3_FLAG_WOL_ENABLE;
10847
1da177e4
LT
10848 if (cfg2 & (1 << 17))
10849 tp->tg3_flags2 |= TG3_FLG2_CAPACITIVE_COUPLING;
10850
10851 /* serdes signal pre-emphasis in register 0x590 set by */
10852 /* bootcode if bit 18 is set */
10853 if (cfg2 & (1 << 18))
10854 tp->tg3_flags2 |= TG3_FLG2_SERDES_PREEMPHASIS;
8ed5d97e
MC
10855
10856 if (tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS) {
10857 u32 cfg3;
10858
10859 tg3_read_mem(tp, NIC_SRAM_DATA_CFG_3, &cfg3);
10860 if (cfg3 & NIC_SRAM_ASPM_DEBOUNCE)
10861 tp->tg3_flags |= TG3_FLAG_ASPM_WORKAROUND;
10862 }
1da177e4 10863 }
7d0c41ef
MC
10864}
10865
b2a5c19c
MC
10866static int __devinit tg3_issue_otp_command(struct tg3 *tp, u32 cmd)
10867{
10868 int i;
10869 u32 val;
10870
10871 tw32(OTP_CTRL, cmd | OTP_CTRL_OTP_CMD_START);
10872 tw32(OTP_CTRL, cmd);
10873
10874 /* Wait for up to 1 ms for command to execute. */
10875 for (i = 0; i < 100; i++) {
10876 val = tr32(OTP_STATUS);
10877 if (val & OTP_STATUS_CMD_DONE)
10878 break;
10879 udelay(10);
10880 }
10881
10882 return (val & OTP_STATUS_CMD_DONE) ? 0 : -EBUSY;
10883}
10884
10885/* Read the gphy configuration from the OTP region of the chip. The gphy
10886 * configuration is a 32-bit value that straddles the alignment boundary.
10887 * We do two 32-bit reads and then shift and merge the results.
10888 */
10889static u32 __devinit tg3_read_otp_phycfg(struct tg3 *tp)
10890{
10891 u32 bhalf_otp, thalf_otp;
10892
10893 tw32(OTP_MODE, OTP_MODE_OTP_THRU_GRC);
10894
10895 if (tg3_issue_otp_command(tp, OTP_CTRL_OTP_CMD_INIT))
10896 return 0;
10897
10898 tw32(OTP_ADDRESS, OTP_ADDRESS_MAGIC1);
10899
10900 if (tg3_issue_otp_command(tp, OTP_CTRL_OTP_CMD_READ))
10901 return 0;
10902
10903 thalf_otp = tr32(OTP_READ_DATA);
10904
10905 tw32(OTP_ADDRESS, OTP_ADDRESS_MAGIC2);
10906
10907 if (tg3_issue_otp_command(tp, OTP_CTRL_OTP_CMD_READ))
10908 return 0;
10909
10910 bhalf_otp = tr32(OTP_READ_DATA);
10911
10912 return ((thalf_otp & 0x0000ffff) << 16) | (bhalf_otp >> 16);
10913}
10914
7d0c41ef
MC
10915static int __devinit tg3_phy_probe(struct tg3 *tp)
10916{
10917 u32 hw_phy_id_1, hw_phy_id_2;
10918 u32 hw_phy_id, hw_phy_id_masked;
10919 int err;
1da177e4
LT
10920
10921 /* Reading the PHY ID register can conflict with ASF
10922 * firwmare access to the PHY hardware.
10923 */
10924 err = 0;
0d3031d9
MC
10925 if ((tp->tg3_flags & TG3_FLAG_ENABLE_ASF) ||
10926 (tp->tg3_flags3 & TG3_FLG3_ENABLE_APE)) {
1da177e4
LT
10927 hw_phy_id = hw_phy_id_masked = PHY_ID_INVALID;
10928 } else {
10929 /* Now read the physical PHY_ID from the chip and verify
10930 * that it is sane. If it doesn't look good, we fall back
10931 * to either the hard-coded table based PHY_ID and failing
10932 * that the value found in the eeprom area.
10933 */
10934 err |= tg3_readphy(tp, MII_PHYSID1, &hw_phy_id_1);
10935 err |= tg3_readphy(tp, MII_PHYSID2, &hw_phy_id_2);
10936
10937 hw_phy_id = (hw_phy_id_1 & 0xffff) << 10;
10938 hw_phy_id |= (hw_phy_id_2 & 0xfc00) << 16;
10939 hw_phy_id |= (hw_phy_id_2 & 0x03ff) << 0;
10940
10941 hw_phy_id_masked = hw_phy_id & PHY_ID_MASK;
10942 }
10943
10944 if (!err && KNOWN_PHY_ID(hw_phy_id_masked)) {
10945 tp->phy_id = hw_phy_id;
10946 if (hw_phy_id_masked == PHY_ID_BCM8002)
10947 tp->tg3_flags2 |= TG3_FLG2_PHY_SERDES;
da6b2d01
MC
10948 else
10949 tp->tg3_flags2 &= ~TG3_FLG2_PHY_SERDES;
1da177e4 10950 } else {
7d0c41ef
MC
10951 if (tp->phy_id != PHY_ID_INVALID) {
10952 /* Do nothing, phy ID already set up in
10953 * tg3_get_eeprom_hw_cfg().
10954 */
1da177e4
LT
10955 } else {
10956 struct subsys_tbl_ent *p;
10957
10958 /* No eeprom signature? Try the hardcoded
10959 * subsys device table.
10960 */
10961 p = lookup_by_subsys(tp);
10962 if (!p)
10963 return -ENODEV;
10964
10965 tp->phy_id = p->phy_id;
10966 if (!tp->phy_id ||
10967 tp->phy_id == PHY_ID_BCM8002)
10968 tp->tg3_flags2 |= TG3_FLG2_PHY_SERDES;
10969 }
10970 }
10971
747e8f8b 10972 if (!(tp->tg3_flags2 & TG3_FLG2_ANY_SERDES) &&
0d3031d9 10973 !(tp->tg3_flags3 & TG3_FLG3_ENABLE_APE) &&
1da177e4 10974 !(tp->tg3_flags & TG3_FLAG_ENABLE_ASF)) {
3600d918 10975 u32 bmsr, adv_reg, tg3_ctrl, mask;
1da177e4
LT
10976
10977 tg3_readphy(tp, MII_BMSR, &bmsr);
10978 if (!tg3_readphy(tp, MII_BMSR, &bmsr) &&
10979 (bmsr & BMSR_LSTATUS))
10980 goto skip_phy_reset;
6aa20a22 10981
1da177e4
LT
10982 err = tg3_phy_reset(tp);
10983 if (err)
10984 return err;
10985
10986 adv_reg = (ADVERTISE_10HALF | ADVERTISE_10FULL |
10987 ADVERTISE_100HALF | ADVERTISE_100FULL |
10988 ADVERTISE_CSMA | ADVERTISE_PAUSE_CAP);
10989 tg3_ctrl = 0;
10990 if (!(tp->tg3_flags & TG3_FLAG_10_100_ONLY)) {
10991 tg3_ctrl = (MII_TG3_CTRL_ADV_1000_HALF |
10992 MII_TG3_CTRL_ADV_1000_FULL);
10993 if (tp->pci_chip_rev_id == CHIPREV_ID_5701_A0 ||
10994 tp->pci_chip_rev_id == CHIPREV_ID_5701_B0)
10995 tg3_ctrl |= (MII_TG3_CTRL_AS_MASTER |
10996 MII_TG3_CTRL_ENABLE_AS_MASTER);
10997 }
10998
3600d918
MC
10999 mask = (ADVERTISED_10baseT_Half | ADVERTISED_10baseT_Full |
11000 ADVERTISED_100baseT_Half | ADVERTISED_100baseT_Full |
11001 ADVERTISED_1000baseT_Half | ADVERTISED_1000baseT_Full);
11002 if (!tg3_copper_is_advertising_all(tp, mask)) {
1da177e4
LT
11003 tg3_writephy(tp, MII_ADVERTISE, adv_reg);
11004
11005 if (!(tp->tg3_flags & TG3_FLAG_10_100_ONLY))
11006 tg3_writephy(tp, MII_TG3_CTRL, tg3_ctrl);
11007
11008 tg3_writephy(tp, MII_BMCR,
11009 BMCR_ANENABLE | BMCR_ANRESTART);
11010 }
11011 tg3_phy_set_wirespeed(tp);
11012
11013 tg3_writephy(tp, MII_ADVERTISE, adv_reg);
11014 if (!(tp->tg3_flags & TG3_FLAG_10_100_ONLY))
11015 tg3_writephy(tp, MII_TG3_CTRL, tg3_ctrl);
11016 }
11017
11018skip_phy_reset:
11019 if ((tp->phy_id & PHY_ID_MASK) == PHY_ID_BCM5401) {
11020 err = tg3_init_5401phy_dsp(tp);
11021 if (err)
11022 return err;
11023 }
11024
11025 if (!err && ((tp->phy_id & PHY_ID_MASK) == PHY_ID_BCM5401)) {
11026 err = tg3_init_5401phy_dsp(tp);
11027 }
11028
747e8f8b 11029 if (tp->tg3_flags2 & TG3_FLG2_ANY_SERDES)
1da177e4
LT
11030 tp->link_config.advertising =
11031 (ADVERTISED_1000baseT_Half |
11032 ADVERTISED_1000baseT_Full |
11033 ADVERTISED_Autoneg |
11034 ADVERTISED_FIBRE);
11035 if (tp->tg3_flags & TG3_FLAG_10_100_ONLY)
11036 tp->link_config.advertising &=
11037 ~(ADVERTISED_1000baseT_Half |
11038 ADVERTISED_1000baseT_Full);
11039
11040 return err;
11041}
11042
11043static void __devinit tg3_read_partno(struct tg3 *tp)
11044{
11045 unsigned char vpd_data[256];
af2c6a4a 11046 unsigned int i;
1b27777a 11047 u32 magic;
1da177e4 11048
1820180b 11049 if (tg3_nvram_read_swab(tp, 0x0, &magic))
f49639e6 11050 goto out_not_found;
1da177e4 11051
1820180b 11052 if (magic == TG3_EEPROM_MAGIC) {
1b27777a
MC
11053 for (i = 0; i < 256; i += 4) {
11054 u32 tmp;
1da177e4 11055
1b27777a
MC
11056 if (tg3_nvram_read(tp, 0x100 + i, &tmp))
11057 goto out_not_found;
11058
11059 vpd_data[i + 0] = ((tmp >> 0) & 0xff);
11060 vpd_data[i + 1] = ((tmp >> 8) & 0xff);
11061 vpd_data[i + 2] = ((tmp >> 16) & 0xff);
11062 vpd_data[i + 3] = ((tmp >> 24) & 0xff);
11063 }
11064 } else {
11065 int vpd_cap;
11066
11067 vpd_cap = pci_find_capability(tp->pdev, PCI_CAP_ID_VPD);
11068 for (i = 0; i < 256; i += 4) {
11069 u32 tmp, j = 0;
b9fc7dc5 11070 __le32 v;
1b27777a
MC
11071 u16 tmp16;
11072
11073 pci_write_config_word(tp->pdev, vpd_cap + PCI_VPD_ADDR,
11074 i);
11075 while (j++ < 100) {
11076 pci_read_config_word(tp->pdev, vpd_cap +
11077 PCI_VPD_ADDR, &tmp16);
11078 if (tmp16 & 0x8000)
11079 break;
11080 msleep(1);
11081 }
f49639e6
DM
11082 if (!(tmp16 & 0x8000))
11083 goto out_not_found;
11084
1b27777a
MC
11085 pci_read_config_dword(tp->pdev, vpd_cap + PCI_VPD_DATA,
11086 &tmp);
b9fc7dc5
AV
11087 v = cpu_to_le32(tmp);
11088 memcpy(&vpd_data[i], &v, 4);
1b27777a 11089 }
1da177e4
LT
11090 }
11091
11092 /* Now parse and find the part number. */
af2c6a4a 11093 for (i = 0; i < 254; ) {
1da177e4 11094 unsigned char val = vpd_data[i];
af2c6a4a 11095 unsigned int block_end;
1da177e4
LT
11096
11097 if (val == 0x82 || val == 0x91) {
11098 i = (i + 3 +
11099 (vpd_data[i + 1] +
11100 (vpd_data[i + 2] << 8)));
11101 continue;
11102 }
11103
11104 if (val != 0x90)
11105 goto out_not_found;
11106
11107 block_end = (i + 3 +
11108 (vpd_data[i + 1] +
11109 (vpd_data[i + 2] << 8)));
11110 i += 3;
af2c6a4a
MC
11111
11112 if (block_end > 256)
11113 goto out_not_found;
11114
11115 while (i < (block_end - 2)) {
1da177e4
LT
11116 if (vpd_data[i + 0] == 'P' &&
11117 vpd_data[i + 1] == 'N') {
11118 int partno_len = vpd_data[i + 2];
11119
af2c6a4a
MC
11120 i += 3;
11121 if (partno_len > 24 || (partno_len + i) > 256)
1da177e4
LT
11122 goto out_not_found;
11123
11124 memcpy(tp->board_part_number,
af2c6a4a 11125 &vpd_data[i], partno_len);
1da177e4
LT
11126
11127 /* Success. */
11128 return;
11129 }
af2c6a4a 11130 i += 3 + vpd_data[i + 2];
1da177e4
LT
11131 }
11132
11133 /* Part number not found. */
11134 goto out_not_found;
11135 }
11136
11137out_not_found:
b5d3772c
MC
11138 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906)
11139 strcpy(tp->board_part_number, "BCM95906");
11140 else
11141 strcpy(tp->board_part_number, "none");
1da177e4
LT
11142}
11143
9c8a620e
MC
11144static int __devinit tg3_fw_img_is_valid(struct tg3 *tp, u32 offset)
11145{
11146 u32 val;
11147
11148 if (tg3_nvram_read_swab(tp, offset, &val) ||
11149 (val & 0xfc000000) != 0x0c000000 ||
11150 tg3_nvram_read_swab(tp, offset + 4, &val) ||
11151 val != 0)
11152 return 0;
11153
11154 return 1;
11155}
11156
c4e6575c
MC
11157static void __devinit tg3_read_fw_ver(struct tg3 *tp)
11158{
11159 u32 val, offset, start;
9c8a620e
MC
11160 u32 ver_offset;
11161 int i, bcnt;
c4e6575c
MC
11162
11163 if (tg3_nvram_read_swab(tp, 0, &val))
11164 return;
11165
11166 if (val != TG3_EEPROM_MAGIC)
11167 return;
11168
11169 if (tg3_nvram_read_swab(tp, 0xc, &offset) ||
11170 tg3_nvram_read_swab(tp, 0x4, &start))
11171 return;
11172
11173 offset = tg3_nvram_logical_addr(tp, offset);
9c8a620e
MC
11174
11175 if (!tg3_fw_img_is_valid(tp, offset) ||
11176 tg3_nvram_read_swab(tp, offset + 8, &ver_offset))
c4e6575c
MC
11177 return;
11178
9c8a620e
MC
11179 offset = offset + ver_offset - start;
11180 for (i = 0; i < 16; i += 4) {
b9fc7dc5
AV
11181 __le32 v;
11182 if (tg3_nvram_read_le(tp, offset + i, &v))
9c8a620e
MC
11183 return;
11184
b9fc7dc5 11185 memcpy(tp->fw_ver + i, &v, 4);
9c8a620e 11186 }
c4e6575c 11187
9c8a620e 11188 if (!(tp->tg3_flags & TG3_FLAG_ENABLE_ASF) ||
84af67fd 11189 (tp->tg3_flags3 & TG3_FLG3_ENABLE_APE))
9c8a620e
MC
11190 return;
11191
11192 for (offset = TG3_NVM_DIR_START;
11193 offset < TG3_NVM_DIR_END;
11194 offset += TG3_NVM_DIRENT_SIZE) {
11195 if (tg3_nvram_read_swab(tp, offset, &val))
c4e6575c
MC
11196 return;
11197
9c8a620e
MC
11198 if ((val >> TG3_NVM_DIRTYPE_SHIFT) == TG3_NVM_DIRTYPE_ASFINI)
11199 break;
11200 }
11201
11202 if (offset == TG3_NVM_DIR_END)
11203 return;
11204
11205 if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS))
11206 start = 0x08000000;
11207 else if (tg3_nvram_read_swab(tp, offset - 4, &start))
11208 return;
11209
11210 if (tg3_nvram_read_swab(tp, offset + 4, &offset) ||
11211 !tg3_fw_img_is_valid(tp, offset) ||
11212 tg3_nvram_read_swab(tp, offset + 8, &val))
11213 return;
11214
11215 offset += val - start;
11216
11217 bcnt = strlen(tp->fw_ver);
11218
11219 tp->fw_ver[bcnt++] = ',';
11220 tp->fw_ver[bcnt++] = ' ';
11221
11222 for (i = 0; i < 4; i++) {
b9fc7dc5
AV
11223 __le32 v;
11224 if (tg3_nvram_read_le(tp, offset, &v))
c4e6575c
MC
11225 return;
11226
b9fc7dc5 11227 offset += sizeof(v);
c4e6575c 11228
b9fc7dc5
AV
11229 if (bcnt > TG3_VER_SIZE - sizeof(v)) {
11230 memcpy(&tp->fw_ver[bcnt], &v, TG3_VER_SIZE - bcnt);
9c8a620e 11231 break;
c4e6575c 11232 }
9c8a620e 11233
b9fc7dc5
AV
11234 memcpy(&tp->fw_ver[bcnt], &v, sizeof(v));
11235 bcnt += sizeof(v);
c4e6575c 11236 }
9c8a620e
MC
11237
11238 tp->fw_ver[TG3_VER_SIZE - 1] = 0;
c4e6575c
MC
11239}
11240
7544b097
MC
11241static struct pci_dev * __devinit tg3_find_peer(struct tg3 *);
11242
1da177e4
LT
11243static int __devinit tg3_get_invariants(struct tg3 *tp)
11244{
11245 static struct pci_device_id write_reorder_chipsets[] = {
1da177e4
LT
11246 { PCI_DEVICE(PCI_VENDOR_ID_AMD,
11247 PCI_DEVICE_ID_AMD_FE_GATE_700C) },
c165b004
JL
11248 { PCI_DEVICE(PCI_VENDOR_ID_AMD,
11249 PCI_DEVICE_ID_AMD_8131_BRIDGE) },
399de50b
MC
11250 { PCI_DEVICE(PCI_VENDOR_ID_VIA,
11251 PCI_DEVICE_ID_VIA_8385_0) },
1da177e4
LT
11252 { },
11253 };
11254 u32 misc_ctrl_reg;
11255 u32 cacheline_sz_reg;
11256 u32 pci_state_reg, grc_misc_cfg;
11257 u32 val;
11258 u16 pci_cmd;
c7835a77 11259 int err, pcie_cap;
1da177e4 11260
1da177e4
LT
11261 /* Force memory write invalidate off. If we leave it on,
11262 * then on 5700_BX chips we have to enable a workaround.
11263 * The workaround is to set the TG3PCI_DMA_RW_CTRL boundary
11264 * to match the cacheline size. The Broadcom driver have this
11265 * workaround but turns MWI off all the times so never uses
11266 * it. This seems to suggest that the workaround is insufficient.
11267 */
11268 pci_read_config_word(tp->pdev, PCI_COMMAND, &pci_cmd);
11269 pci_cmd &= ~PCI_COMMAND_INVALIDATE;
11270 pci_write_config_word(tp->pdev, PCI_COMMAND, pci_cmd);
11271
11272 /* It is absolutely critical that TG3PCI_MISC_HOST_CTRL
11273 * has the register indirect write enable bit set before
11274 * we try to access any of the MMIO registers. It is also
11275 * critical that the PCI-X hw workaround situation is decided
11276 * before that as well.
11277 */
11278 pci_read_config_dword(tp->pdev, TG3PCI_MISC_HOST_CTRL,
11279 &misc_ctrl_reg);
11280
11281 tp->pci_chip_rev_id = (misc_ctrl_reg >>
11282 MISC_HOST_CTRL_CHIPREV_SHIFT);
795d01c5
MC
11283 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_USE_PROD_ID_REG) {
11284 u32 prod_id_asic_rev;
11285
11286 pci_read_config_dword(tp->pdev, TG3PCI_PRODID_ASICREV,
11287 &prod_id_asic_rev);
11288 tp->pci_chip_rev_id = prod_id_asic_rev & PROD_ID_ASIC_REV_MASK;
11289 }
1da177e4 11290
ff645bec
MC
11291 /* Wrong chip ID in 5752 A0. This code can be removed later
11292 * as A0 is not in production.
11293 */
11294 if (tp->pci_chip_rev_id == CHIPREV_ID_5752_A0_HW)
11295 tp->pci_chip_rev_id = CHIPREV_ID_5752_A0;
11296
6892914f
MC
11297 /* If we have 5702/03 A1 or A2 on certain ICH chipsets,
11298 * we need to disable memory and use config. cycles
11299 * only to access all registers. The 5702/03 chips
11300 * can mistakenly decode the special cycles from the
11301 * ICH chipsets as memory write cycles, causing corruption
11302 * of register and memory space. Only certain ICH bridges
11303 * will drive special cycles with non-zero data during the
11304 * address phase which can fall within the 5703's address
11305 * range. This is not an ICH bug as the PCI spec allows
11306 * non-zero address during special cycles. However, only
11307 * these ICH bridges are known to drive non-zero addresses
11308 * during special cycles.
11309 *
11310 * Since special cycles do not cross PCI bridges, we only
11311 * enable this workaround if the 5703 is on the secondary
11312 * bus of these ICH bridges.
11313 */
11314 if ((tp->pci_chip_rev_id == CHIPREV_ID_5703_A1) ||
11315 (tp->pci_chip_rev_id == CHIPREV_ID_5703_A2)) {
11316 static struct tg3_dev_id {
11317 u32 vendor;
11318 u32 device;
11319 u32 rev;
11320 } ich_chipsets[] = {
11321 { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AA_8,
11322 PCI_ANY_ID },
11323 { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AB_8,
11324 PCI_ANY_ID },
11325 { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801BA_11,
11326 0xa },
11327 { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801BA_6,
11328 PCI_ANY_ID },
11329 { },
11330 };
11331 struct tg3_dev_id *pci_id = &ich_chipsets[0];
11332 struct pci_dev *bridge = NULL;
11333
11334 while (pci_id->vendor != 0) {
11335 bridge = pci_get_device(pci_id->vendor, pci_id->device,
11336 bridge);
11337 if (!bridge) {
11338 pci_id++;
11339 continue;
11340 }
11341 if (pci_id->rev != PCI_ANY_ID) {
44c10138 11342 if (bridge->revision > pci_id->rev)
6892914f
MC
11343 continue;
11344 }
11345 if (bridge->subordinate &&
11346 (bridge->subordinate->number ==
11347 tp->pdev->bus->number)) {
11348
11349 tp->tg3_flags2 |= TG3_FLG2_ICH_WORKAROUND;
11350 pci_dev_put(bridge);
11351 break;
11352 }
11353 }
11354 }
11355
41588ba1
MC
11356 if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701)) {
11357 static struct tg3_dev_id {
11358 u32 vendor;
11359 u32 device;
11360 } bridge_chipsets[] = {
11361 { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PXH_0 },
11362 { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PXH_1 },
11363 { },
11364 };
11365 struct tg3_dev_id *pci_id = &bridge_chipsets[0];
11366 struct pci_dev *bridge = NULL;
11367
11368 while (pci_id->vendor != 0) {
11369 bridge = pci_get_device(pci_id->vendor,
11370 pci_id->device,
11371 bridge);
11372 if (!bridge) {
11373 pci_id++;
11374 continue;
11375 }
11376 if (bridge->subordinate &&
11377 (bridge->subordinate->number <=
11378 tp->pdev->bus->number) &&
11379 (bridge->subordinate->subordinate >=
11380 tp->pdev->bus->number)) {
11381 tp->tg3_flags3 |= TG3_FLG3_5701_DMA_BUG;
11382 pci_dev_put(bridge);
11383 break;
11384 }
11385 }
11386 }
11387
4a29cc2e
MC
11388 /* The EPB bridge inside 5714, 5715, and 5780 cannot support
11389 * DMA addresses > 40-bit. This bridge may have other additional
11390 * 57xx devices behind it in some 4-port NIC designs for example.
11391 * Any tg3 device found behind the bridge will also need the 40-bit
11392 * DMA workaround.
11393 */
a4e2b347
MC
11394 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5780 ||
11395 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5714) {
11396 tp->tg3_flags2 |= TG3_FLG2_5780_CLASS;
4a29cc2e 11397 tp->tg3_flags |= TG3_FLAG_40BIT_DMA_BUG;
4cf78e4f 11398 tp->msi_cap = pci_find_capability(tp->pdev, PCI_CAP_ID_MSI);
a4e2b347 11399 }
4a29cc2e
MC
11400 else {
11401 struct pci_dev *bridge = NULL;
11402
11403 do {
11404 bridge = pci_get_device(PCI_VENDOR_ID_SERVERWORKS,
11405 PCI_DEVICE_ID_SERVERWORKS_EPB,
11406 bridge);
11407 if (bridge && bridge->subordinate &&
11408 (bridge->subordinate->number <=
11409 tp->pdev->bus->number) &&
11410 (bridge->subordinate->subordinate >=
11411 tp->pdev->bus->number)) {
11412 tp->tg3_flags |= TG3_FLAG_40BIT_DMA_BUG;
11413 pci_dev_put(bridge);
11414 break;
11415 }
11416 } while (bridge);
11417 }
4cf78e4f 11418
1da177e4
LT
11419 /* Initialize misc host control in PCI block. */
11420 tp->misc_host_ctrl |= (misc_ctrl_reg &
11421 MISC_HOST_CTRL_CHIPREV);
11422 pci_write_config_dword(tp->pdev, TG3PCI_MISC_HOST_CTRL,
11423 tp->misc_host_ctrl);
11424
11425 pci_read_config_dword(tp->pdev, TG3PCI_CACHELINESZ,
11426 &cacheline_sz_reg);
11427
11428 tp->pci_cacheline_sz = (cacheline_sz_reg >> 0) & 0xff;
11429 tp->pci_lat_timer = (cacheline_sz_reg >> 8) & 0xff;
11430 tp->pci_hdr_type = (cacheline_sz_reg >> 16) & 0xff;
11431 tp->pci_bist = (cacheline_sz_reg >> 24) & 0xff;
11432
7544b097
MC
11433 if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704) ||
11434 (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5714))
11435 tp->pdev_peer = tg3_find_peer(tp);
11436
6708e5cc 11437 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750 ||
4cf78e4f 11438 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5752 ||
af36e6b6 11439 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 ||
d9ab5ad1 11440 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787 ||
d30cdd28 11441 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5784 ||
9936bcf6 11442 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5761 ||
b5d3772c 11443 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906 ||
a4e2b347 11444 (tp->tg3_flags2 & TG3_FLG2_5780_CLASS))
6708e5cc
JL
11445 tp->tg3_flags2 |= TG3_FLG2_5750_PLUS;
11446
1b440c56
JL
11447 if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) ||
11448 (tp->tg3_flags2 & TG3_FLG2_5750_PLUS))
11449 tp->tg3_flags2 |= TG3_FLG2_5705_PLUS;
11450
5a6f3074 11451 if (tp->tg3_flags2 & TG3_FLG2_5750_PLUS) {
7544b097
MC
11452 tp->tg3_flags |= TG3_FLAG_SUPPORT_MSI;
11453 if (GET_CHIP_REV(tp->pci_chip_rev_id) == CHIPREV_5750_AX ||
11454 GET_CHIP_REV(tp->pci_chip_rev_id) == CHIPREV_5750_BX ||
11455 (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5714 &&
11456 tp->pci_chip_rev_id <= CHIPREV_ID_5714_A2 &&
11457 tp->pdev_peer == tp->pdev))
11458 tp->tg3_flags &= ~TG3_FLAG_SUPPORT_MSI;
11459
af36e6b6 11460 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 ||
b5d3772c 11461 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787 ||
d30cdd28 11462 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5784 ||
9936bcf6 11463 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5761 ||
b5d3772c 11464 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) {
5a6f3074 11465 tp->tg3_flags2 |= TG3_FLG2_HW_TSO_2;
fcfa0a32 11466 tp->tg3_flags2 |= TG3_FLG2_1SHOT_MSI;
52c0fd83 11467 } else {
7f62ad5d 11468 tp->tg3_flags2 |= TG3_FLG2_HW_TSO_1 | TG3_FLG2_TSO_BUG;
52c0fd83
MC
11469 if (GET_ASIC_REV(tp->pci_chip_rev_id) ==
11470 ASIC_REV_5750 &&
11471 tp->pci_chip_rev_id >= CHIPREV_ID_5750_C2)
7f62ad5d 11472 tp->tg3_flags2 &= ~TG3_FLG2_TSO_BUG;
52c0fd83 11473 }
5a6f3074 11474 }
1da177e4 11475
0f893dc6
MC
11476 if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5705 &&
11477 GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5750 &&
d9ab5ad1 11478 GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5752 &&
af36e6b6 11479 GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5755 &&
b5d3772c 11480 GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5787 &&
d30cdd28 11481 GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5784 &&
9936bcf6 11482 GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5761 &&
b5d3772c 11483 GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5906)
0f893dc6
MC
11484 tp->tg3_flags2 |= TG3_FLG2_JUMBO_CAPABLE;
11485
c7835a77
MC
11486 pcie_cap = pci_find_capability(tp->pdev, PCI_CAP_ID_EXP);
11487 if (pcie_cap != 0) {
1da177e4 11488 tp->tg3_flags2 |= TG3_FLG2_PCI_EXPRESS;
5f5c51e3
MC
11489
11490 pcie_set_readrq(tp->pdev, 4096);
11491
c7835a77
MC
11492 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) {
11493 u16 lnkctl;
11494
11495 pci_read_config_word(tp->pdev,
11496 pcie_cap + PCI_EXP_LNKCTL,
11497 &lnkctl);
11498 if (lnkctl & PCI_EXP_LNKCTL_CLKREQ_EN)
11499 tp->tg3_flags2 &= ~TG3_FLG2_HW_TSO_2;
11500 }
11501 }
1da177e4 11502
399de50b
MC
11503 /* If we have an AMD 762 or VIA K8T800 chipset, write
11504 * reordering to the mailbox registers done by the host
11505 * controller can cause major troubles. We read back from
11506 * every mailbox register write to force the writes to be
11507 * posted to the chip in order.
11508 */
11509 if (pci_dev_present(write_reorder_chipsets) &&
11510 !(tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS))
11511 tp->tg3_flags |= TG3_FLAG_MBOX_WRITE_REORDER;
11512
1da177e4
LT
11513 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703 &&
11514 tp->pci_lat_timer < 64) {
11515 tp->pci_lat_timer = 64;
11516
11517 cacheline_sz_reg = ((tp->pci_cacheline_sz & 0xff) << 0);
11518 cacheline_sz_reg |= ((tp->pci_lat_timer & 0xff) << 8);
11519 cacheline_sz_reg |= ((tp->pci_hdr_type & 0xff) << 16);
11520 cacheline_sz_reg |= ((tp->pci_bist & 0xff) << 24);
11521
11522 pci_write_config_dword(tp->pdev, TG3PCI_CACHELINESZ,
11523 cacheline_sz_reg);
11524 }
11525
9974a356
MC
11526 if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS) ||
11527 (tp->tg3_flags2 & TG3_FLG2_5780_CLASS)) {
11528 tp->pcix_cap = pci_find_capability(tp->pdev, PCI_CAP_ID_PCIX);
11529 if (!tp->pcix_cap) {
11530 printk(KERN_ERR PFX "Cannot find PCI-X "
11531 "capability, aborting.\n");
11532 return -EIO;
11533 }
11534 }
11535
1da177e4
LT
11536 pci_read_config_dword(tp->pdev, TG3PCI_PCISTATE,
11537 &pci_state_reg);
11538
9974a356 11539 if (tp->pcix_cap && (pci_state_reg & PCISTATE_CONV_PCI_MODE) == 0) {
1da177e4
LT
11540 tp->tg3_flags |= TG3_FLAG_PCIX_MODE;
11541
11542 /* If this is a 5700 BX chipset, and we are in PCI-X
11543 * mode, enable register write workaround.
11544 *
11545 * The workaround is to use indirect register accesses
11546 * for all chip writes not to mailbox registers.
11547 */
11548 if (GET_CHIP_REV(tp->pci_chip_rev_id) == CHIPREV_5700_BX) {
11549 u32 pm_reg;
1da177e4
LT
11550
11551 tp->tg3_flags |= TG3_FLAG_PCIX_TARGET_HWBUG;
11552
11553 /* The chip can have it's power management PCI config
11554 * space registers clobbered due to this bug.
11555 * So explicitly force the chip into D0 here.
11556 */
9974a356
MC
11557 pci_read_config_dword(tp->pdev,
11558 tp->pm_cap + PCI_PM_CTRL,
1da177e4
LT
11559 &pm_reg);
11560 pm_reg &= ~PCI_PM_CTRL_STATE_MASK;
11561 pm_reg |= PCI_PM_CTRL_PME_ENABLE | 0 /* D0 */;
9974a356
MC
11562 pci_write_config_dword(tp->pdev,
11563 tp->pm_cap + PCI_PM_CTRL,
1da177e4
LT
11564 pm_reg);
11565
11566 /* Also, force SERR#/PERR# in PCI command. */
11567 pci_read_config_word(tp->pdev, PCI_COMMAND, &pci_cmd);
11568 pci_cmd |= PCI_COMMAND_PARITY | PCI_COMMAND_SERR;
11569 pci_write_config_word(tp->pdev, PCI_COMMAND, pci_cmd);
11570 }
11571 }
11572
087fe256
MC
11573 /* 5700 BX chips need to have their TX producer index mailboxes
11574 * written twice to workaround a bug.
11575 */
11576 if (GET_CHIP_REV(tp->pci_chip_rev_id) == CHIPREV_5700_BX)
11577 tp->tg3_flags |= TG3_FLAG_TXD_MBOX_HWBUG;
11578
1da177e4
LT
11579 if ((pci_state_reg & PCISTATE_BUS_SPEED_HIGH) != 0)
11580 tp->tg3_flags |= TG3_FLAG_PCI_HIGH_SPEED;
11581 if ((pci_state_reg & PCISTATE_BUS_32BIT) != 0)
11582 tp->tg3_flags |= TG3_FLAG_PCI_32BIT;
11583
11584 /* Chip-specific fixup from Broadcom driver */
11585 if ((tp->pci_chip_rev_id == CHIPREV_ID_5704_A0) &&
11586 (!(pci_state_reg & PCISTATE_RETRY_SAME_DMA))) {
11587 pci_state_reg |= PCISTATE_RETRY_SAME_DMA;
11588 pci_write_config_dword(tp->pdev, TG3PCI_PCISTATE, pci_state_reg);
11589 }
11590
1ee582d8 11591 /* Default fast path register access methods */
20094930 11592 tp->read32 = tg3_read32;
1ee582d8 11593 tp->write32 = tg3_write32;
09ee929c 11594 tp->read32_mbox = tg3_read32;
20094930 11595 tp->write32_mbox = tg3_write32;
1ee582d8
MC
11596 tp->write32_tx_mbox = tg3_write32;
11597 tp->write32_rx_mbox = tg3_write32;
11598
11599 /* Various workaround register access methods */
11600 if (tp->tg3_flags & TG3_FLAG_PCIX_TARGET_HWBUG)
11601 tp->write32 = tg3_write_indirect_reg32;
98efd8a6
MC
11602 else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701 ||
11603 ((tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS) &&
11604 tp->pci_chip_rev_id == CHIPREV_ID_5750_A0)) {
11605 /*
11606 * Back to back register writes can cause problems on these
11607 * chips, the workaround is to read back all reg writes
11608 * except those to mailbox regs.
11609 *
11610 * See tg3_write_indirect_reg32().
11611 */
1ee582d8 11612 tp->write32 = tg3_write_flush_reg32;
98efd8a6
MC
11613 }
11614
1ee582d8
MC
11615
11616 if ((tp->tg3_flags & TG3_FLAG_TXD_MBOX_HWBUG) ||
11617 (tp->tg3_flags & TG3_FLAG_MBOX_WRITE_REORDER)) {
11618 tp->write32_tx_mbox = tg3_write32_tx_mbox;
11619 if (tp->tg3_flags & TG3_FLAG_MBOX_WRITE_REORDER)
11620 tp->write32_rx_mbox = tg3_write_flush_reg32;
11621 }
20094930 11622
6892914f
MC
11623 if (tp->tg3_flags2 & TG3_FLG2_ICH_WORKAROUND) {
11624 tp->read32 = tg3_read_indirect_reg32;
11625 tp->write32 = tg3_write_indirect_reg32;
11626 tp->read32_mbox = tg3_read_indirect_mbox;
11627 tp->write32_mbox = tg3_write_indirect_mbox;
11628 tp->write32_tx_mbox = tg3_write_indirect_mbox;
11629 tp->write32_rx_mbox = tg3_write_indirect_mbox;
11630
11631 iounmap(tp->regs);
22abe310 11632 tp->regs = NULL;
6892914f
MC
11633
11634 pci_read_config_word(tp->pdev, PCI_COMMAND, &pci_cmd);
11635 pci_cmd &= ~PCI_COMMAND_MEMORY;
11636 pci_write_config_word(tp->pdev, PCI_COMMAND, pci_cmd);
11637 }
b5d3772c
MC
11638 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) {
11639 tp->read32_mbox = tg3_read32_mbox_5906;
11640 tp->write32_mbox = tg3_write32_mbox_5906;
11641 tp->write32_tx_mbox = tg3_write32_mbox_5906;
11642 tp->write32_rx_mbox = tg3_write32_mbox_5906;
11643 }
6892914f 11644
bbadf503
MC
11645 if (tp->write32 == tg3_write_indirect_reg32 ||
11646 ((tp->tg3_flags & TG3_FLAG_PCIX_MODE) &&
11647 (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 ||
f49639e6 11648 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701)))
bbadf503
MC
11649 tp->tg3_flags |= TG3_FLAG_SRAM_USE_CONFIG;
11650
7d0c41ef 11651 /* Get eeprom hw config before calling tg3_set_power_state().
9d26e213 11652 * In particular, the TG3_FLG2_IS_NIC flag must be
7d0c41ef
MC
11653 * determined before calling tg3_set_power_state() so that
11654 * we know whether or not to switch out of Vaux power.
11655 * When the flag is set, it means that GPIO1 is used for eeprom
11656 * write protect and also implies that it is a LOM where GPIOs
11657 * are not used to switch power.
6aa20a22 11658 */
7d0c41ef
MC
11659 tg3_get_eeprom_hw_cfg(tp);
11660
0d3031d9
MC
11661 if (tp->tg3_flags3 & TG3_FLG3_ENABLE_APE) {
11662 /* Allow reads and writes to the
11663 * APE register and memory space.
11664 */
11665 pci_state_reg |= PCISTATE_ALLOW_APE_CTLSPC_WR |
11666 PCISTATE_ALLOW_APE_SHMEM_WR;
11667 pci_write_config_dword(tp->pdev, TG3PCI_PCISTATE,
11668 pci_state_reg);
11669 }
11670
9936bcf6 11671 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5784 ||
b5af7126 11672 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5761) {
d30cdd28
MC
11673 tp->tg3_flags |= TG3_FLAG_CPMU_PRESENT;
11674
b5af7126
MC
11675 if (tp->pci_chip_rev_id == CHIPREV_ID_5784_A0 ||
11676 tp->pci_chip_rev_id == CHIPREV_ID_5784_A1 ||
11677 tp->pci_chip_rev_id == CHIPREV_ID_5761_A0 ||
11678 tp->pci_chip_rev_id == CHIPREV_ID_5761_A1)
11679 tp->tg3_flags3 |= TG3_FLG3_5761_5784_AX_FIXES;
11680 }
11681
314fba34
MC
11682 /* Set up tp->grc_local_ctrl before calling tg3_set_power_state().
11683 * GPIO1 driven high will bring 5700's external PHY out of reset.
11684 * It is also used as eeprom write protect on LOMs.
11685 */
11686 tp->grc_local_ctrl = GRC_LCLCTRL_INT_ON_ATTN | GRC_LCLCTRL_AUTO_SEEPROM;
11687 if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700) ||
11688 (tp->tg3_flags & TG3_FLAG_EEPROM_WRITE_PROT))
11689 tp->grc_local_ctrl |= (GRC_LCLCTRL_GPIO_OE1 |
11690 GRC_LCLCTRL_GPIO_OUTPUT1);
3e7d83bc
MC
11691 /* Unused GPIO3 must be driven as output on 5752 because there
11692 * are no pull-up resistors on unused GPIO pins.
11693 */
11694 else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5752)
11695 tp->grc_local_ctrl |= GRC_LCLCTRL_GPIO_OE3;
314fba34 11696
af36e6b6
MC
11697 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755)
11698 tp->grc_local_ctrl |= GRC_LCLCTRL_GPIO_UART_SEL;
11699
1da177e4 11700 /* Force the chip into D0. */
bc1c7567 11701 err = tg3_set_power_state(tp, PCI_D0);
1da177e4
LT
11702 if (err) {
11703 printk(KERN_ERR PFX "(%s) transition to D0 failed\n",
11704 pci_name(tp->pdev));
11705 return err;
11706 }
11707
11708 /* 5700 B0 chips do not support checksumming correctly due
11709 * to hardware bugs.
11710 */
11711 if (tp->pci_chip_rev_id == CHIPREV_ID_5700_B0)
11712 tp->tg3_flags |= TG3_FLAG_BROKEN_CHECKSUMS;
11713
1da177e4
LT
11714 /* Derive initial jumbo mode from MTU assigned in
11715 * ether_setup() via the alloc_etherdev() call
11716 */
0f893dc6 11717 if (tp->dev->mtu > ETH_DATA_LEN &&
a4e2b347 11718 !(tp->tg3_flags2 & TG3_FLG2_5780_CLASS))
0f893dc6 11719 tp->tg3_flags |= TG3_FLAG_JUMBO_RING_ENABLE;
1da177e4
LT
11720
11721 /* Determine WakeOnLan speed to use. */
11722 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 ||
11723 tp->pci_chip_rev_id == CHIPREV_ID_5701_A0 ||
11724 tp->pci_chip_rev_id == CHIPREV_ID_5701_B0 ||
11725 tp->pci_chip_rev_id == CHIPREV_ID_5701_B2) {
11726 tp->tg3_flags &= ~(TG3_FLAG_WOL_SPEED_100MB);
11727 } else {
11728 tp->tg3_flags |= TG3_FLAG_WOL_SPEED_100MB;
11729 }
11730
11731 /* A few boards don't want Ethernet@WireSpeed phy feature */
11732 if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700) ||
11733 ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) &&
11734 (tp->pci_chip_rev_id != CHIPREV_ID_5705_A0) &&
747e8f8b 11735 (tp->pci_chip_rev_id != CHIPREV_ID_5705_A1)) ||
b5d3772c 11736 (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) ||
747e8f8b 11737 (tp->tg3_flags2 & TG3_FLG2_ANY_SERDES))
1da177e4
LT
11738 tp->tg3_flags2 |= TG3_FLG2_NO_ETH_WIRE_SPEED;
11739
11740 if (GET_CHIP_REV(tp->pci_chip_rev_id) == CHIPREV_5703_AX ||
11741 GET_CHIP_REV(tp->pci_chip_rev_id) == CHIPREV_5704_AX)
11742 tp->tg3_flags2 |= TG3_FLG2_PHY_ADC_BUG;
11743 if (tp->pci_chip_rev_id == CHIPREV_ID_5704_A0)
11744 tp->tg3_flags2 |= TG3_FLG2_PHY_5704_A0_BUG;
11745
c424cb24
MC
11746 if (tp->tg3_flags2 & TG3_FLG2_5705_PLUS) {
11747 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 ||
d30cdd28 11748 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787 ||
9936bcf6
MC
11749 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5784 ||
11750 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5761) {
d4011ada
MC
11751 if (tp->pdev->device != PCI_DEVICE_ID_TIGON3_5756 &&
11752 tp->pdev->device != PCI_DEVICE_ID_TIGON3_5722)
11753 tp->tg3_flags2 |= TG3_FLG2_PHY_JITTER_BUG;
c1d2a196
MC
11754 if (tp->pdev->device == PCI_DEVICE_ID_TIGON3_5755M)
11755 tp->tg3_flags2 |= TG3_FLG2_PHY_ADJUST_TRIM;
11756 } else if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5906)
c424cb24
MC
11757 tp->tg3_flags2 |= TG3_FLG2_PHY_BER_BUG;
11758 }
1da177e4 11759
b2a5c19c
MC
11760 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5784 &&
11761 GET_CHIP_REV(tp->pci_chip_rev_id) != CHIPREV_5784_AX) {
11762 tp->phy_otp = tg3_read_otp_phycfg(tp);
11763 if (tp->phy_otp == 0)
11764 tp->phy_otp = TG3_OTP_DEFAULT;
11765 }
11766
1da177e4 11767 tp->coalesce_mode = 0;
1da177e4
LT
11768 if (GET_CHIP_REV(tp->pci_chip_rev_id) != CHIPREV_5700_AX &&
11769 GET_CHIP_REV(tp->pci_chip_rev_id) != CHIPREV_5700_BX)
11770 tp->coalesce_mode |= HOSTCC_MODE_32BYTE;
11771
11772 /* Initialize MAC MI mode, polling disabled. */
11773 tw32_f(MAC_MI_MODE, tp->mi_mode);
11774 udelay(80);
11775
11776 /* Initialize data/descriptor byte/word swapping. */
11777 val = tr32(GRC_MODE);
11778 val &= GRC_MODE_HOST_STACKUP;
11779 tw32(GRC_MODE, val | tp->grc_mode);
11780
11781 tg3_switch_clocks(tp);
11782
11783 /* Clear this out for sanity. */
11784 tw32(TG3PCI_MEM_WIN_BASE_ADDR, 0);
11785
11786 pci_read_config_dword(tp->pdev, TG3PCI_PCISTATE,
11787 &pci_state_reg);
11788 if ((pci_state_reg & PCISTATE_CONV_PCI_MODE) == 0 &&
11789 (tp->tg3_flags & TG3_FLAG_PCIX_TARGET_HWBUG) == 0) {
11790 u32 chiprevid = GET_CHIP_REV_ID(tp->misc_host_ctrl);
11791
11792 if (chiprevid == CHIPREV_ID_5701_A0 ||
11793 chiprevid == CHIPREV_ID_5701_B0 ||
11794 chiprevid == CHIPREV_ID_5701_B2 ||
11795 chiprevid == CHIPREV_ID_5701_B5) {
11796 void __iomem *sram_base;
11797
11798 /* Write some dummy words into the SRAM status block
11799 * area, see if it reads back correctly. If the return
11800 * value is bad, force enable the PCIX workaround.
11801 */
11802 sram_base = tp->regs + NIC_SRAM_WIN_BASE + NIC_SRAM_STATS_BLK;
11803
11804 writel(0x00000000, sram_base);
11805 writel(0x00000000, sram_base + 4);
11806 writel(0xffffffff, sram_base + 4);
11807 if (readl(sram_base) != 0x00000000)
11808 tp->tg3_flags |= TG3_FLAG_PCIX_TARGET_HWBUG;
11809 }
11810 }
11811
11812 udelay(50);
11813 tg3_nvram_init(tp);
11814
11815 grc_misc_cfg = tr32(GRC_MISC_CFG);
11816 grc_misc_cfg &= GRC_MISC_CFG_BOARD_ID_MASK;
11817
1da177e4
LT
11818 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705 &&
11819 (grc_misc_cfg == GRC_MISC_CFG_BOARD_ID_5788 ||
11820 grc_misc_cfg == GRC_MISC_CFG_BOARD_ID_5788M))
11821 tp->tg3_flags2 |= TG3_FLG2_IS_5788;
11822
fac9b83e
DM
11823 if (!(tp->tg3_flags2 & TG3_FLG2_IS_5788) &&
11824 (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5700))
11825 tp->tg3_flags |= TG3_FLAG_TAGGED_STATUS;
11826 if (tp->tg3_flags & TG3_FLAG_TAGGED_STATUS) {
11827 tp->coalesce_mode |= (HOSTCC_MODE_CLRTICK_RXBD |
11828 HOSTCC_MODE_CLRTICK_TXBD);
11829
11830 tp->misc_host_ctrl |= MISC_HOST_CTRL_TAGGED_STATUS;
11831 pci_write_config_dword(tp->pdev, TG3PCI_MISC_HOST_CTRL,
11832 tp->misc_host_ctrl);
11833 }
11834
1da177e4
LT
11835 /* these are limited to 10/100 only */
11836 if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703 &&
11837 (grc_misc_cfg == 0x8000 || grc_misc_cfg == 0x4000)) ||
11838 (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705 &&
11839 tp->pdev->vendor == PCI_VENDOR_ID_BROADCOM &&
11840 (tp->pdev->device == PCI_DEVICE_ID_TIGON3_5901 ||
11841 tp->pdev->device == PCI_DEVICE_ID_TIGON3_5901_2 ||
11842 tp->pdev->device == PCI_DEVICE_ID_TIGON3_5705F)) ||
11843 (tp->pdev->vendor == PCI_VENDOR_ID_BROADCOM &&
11844 (tp->pdev->device == PCI_DEVICE_ID_TIGON3_5751F ||
676917d4
MC
11845 tp->pdev->device == PCI_DEVICE_ID_TIGON3_5753F ||
11846 tp->pdev->device == PCI_DEVICE_ID_TIGON3_5787F)) ||
b5d3772c 11847 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906)
1da177e4
LT
11848 tp->tg3_flags |= TG3_FLAG_10_100_ONLY;
11849
11850 err = tg3_phy_probe(tp);
11851 if (err) {
11852 printk(KERN_ERR PFX "(%s) phy probe failed, err %d\n",
11853 pci_name(tp->pdev), err);
11854 /* ... but do not return immediately ... */
11855 }
11856
11857 tg3_read_partno(tp);
c4e6575c 11858 tg3_read_fw_ver(tp);
1da177e4
LT
11859
11860 if (tp->tg3_flags2 & TG3_FLG2_PHY_SERDES) {
11861 tp->tg3_flags &= ~TG3_FLAG_USE_MI_INTERRUPT;
11862 } else {
11863 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700)
11864 tp->tg3_flags |= TG3_FLAG_USE_MI_INTERRUPT;
11865 else
11866 tp->tg3_flags &= ~TG3_FLAG_USE_MI_INTERRUPT;
11867 }
11868
11869 /* 5700 {AX,BX} chips have a broken status block link
11870 * change bit implementation, so we must use the
11871 * status register in those cases.
11872 */
11873 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700)
11874 tp->tg3_flags |= TG3_FLAG_USE_LINKCHG_REG;
11875 else
11876 tp->tg3_flags &= ~TG3_FLAG_USE_LINKCHG_REG;
11877
11878 /* The led_ctrl is set during tg3_phy_probe, here we might
11879 * have to force the link status polling mechanism based
11880 * upon subsystem IDs.
11881 */
11882 if (tp->pdev->subsystem_vendor == PCI_VENDOR_ID_DELL &&
007a880d 11883 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701 &&
1da177e4
LT
11884 !(tp->tg3_flags2 & TG3_FLG2_PHY_SERDES)) {
11885 tp->tg3_flags |= (TG3_FLAG_USE_MI_INTERRUPT |
11886 TG3_FLAG_USE_LINKCHG_REG);
11887 }
11888
11889 /* For all SERDES we poll the MAC status register. */
11890 if (tp->tg3_flags2 & TG3_FLG2_PHY_SERDES)
11891 tp->tg3_flags |= TG3_FLAG_POLL_SERDES;
11892 else
11893 tp->tg3_flags &= ~TG3_FLAG_POLL_SERDES;
11894
5a6f3074 11895 /* All chips before 5787 can get confused if TX buffers
1da177e4
LT
11896 * straddle the 4GB address boundary in some cases.
11897 */
af36e6b6 11898 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 ||
b5d3772c 11899 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787 ||
d30cdd28 11900 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5784 ||
9936bcf6 11901 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5761 ||
b5d3772c 11902 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906)
5a6f3074
MC
11903 tp->dev->hard_start_xmit = tg3_start_xmit;
11904 else
11905 tp->dev->hard_start_xmit = tg3_start_xmit_dma_bug;
1da177e4
LT
11906
11907 tp->rx_offset = 2;
11908 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701 &&
11909 (tp->tg3_flags & TG3_FLAG_PCIX_MODE) != 0)
11910 tp->rx_offset = 0;
11911
f92905de
MC
11912 tp->rx_std_max_post = TG3_RX_RING_SIZE;
11913
11914 /* Increment the rx prod index on the rx std ring by at most
11915 * 8 for these chips to workaround hw errata.
11916 */
11917 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750 ||
11918 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5752 ||
11919 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755)
11920 tp->rx_std_max_post = 8;
11921
8ed5d97e
MC
11922 if (tp->tg3_flags & TG3_FLAG_ASPM_WORKAROUND)
11923 tp->pwrmgmt_thresh = tr32(PCIE_PWR_MGMT_THRESH) &
11924 PCIE_PWR_MGMT_L1_THRESH_MSK;
11925
1da177e4
LT
11926 return err;
11927}
11928
49b6e95f 11929#ifdef CONFIG_SPARC
1da177e4
LT
11930static int __devinit tg3_get_macaddr_sparc(struct tg3 *tp)
11931{
11932 struct net_device *dev = tp->dev;
11933 struct pci_dev *pdev = tp->pdev;
49b6e95f 11934 struct device_node *dp = pci_device_to_OF_node(pdev);
374d4cac 11935 const unsigned char *addr;
49b6e95f
DM
11936 int len;
11937
11938 addr = of_get_property(dp, "local-mac-address", &len);
11939 if (addr && len == 6) {
11940 memcpy(dev->dev_addr, addr, 6);
11941 memcpy(dev->perm_addr, dev->dev_addr, 6);
11942 return 0;
1da177e4
LT
11943 }
11944 return -ENODEV;
11945}
11946
11947static int __devinit tg3_get_default_macaddr_sparc(struct tg3 *tp)
11948{
11949 struct net_device *dev = tp->dev;
11950
11951 memcpy(dev->dev_addr, idprom->id_ethaddr, 6);
2ff43697 11952 memcpy(dev->perm_addr, idprom->id_ethaddr, 6);
1da177e4
LT
11953 return 0;
11954}
11955#endif
11956
11957static int __devinit tg3_get_device_address(struct tg3 *tp)
11958{
11959 struct net_device *dev = tp->dev;
11960 u32 hi, lo, mac_offset;
008652b3 11961 int addr_ok = 0;
1da177e4 11962
49b6e95f 11963#ifdef CONFIG_SPARC
1da177e4
LT
11964 if (!tg3_get_macaddr_sparc(tp))
11965 return 0;
11966#endif
11967
11968 mac_offset = 0x7c;
f49639e6 11969 if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704) ||
a4e2b347 11970 (tp->tg3_flags2 & TG3_FLG2_5780_CLASS)) {
1da177e4
LT
11971 if (tr32(TG3PCI_DUAL_MAC_CTRL) & DUAL_MAC_CTRL_ID)
11972 mac_offset = 0xcc;
11973 if (tg3_nvram_lock(tp))
11974 tw32_f(NVRAM_CMD, NVRAM_CMD_RESET);
11975 else
11976 tg3_nvram_unlock(tp);
11977 }
b5d3772c
MC
11978 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906)
11979 mac_offset = 0x10;
1da177e4
LT
11980
11981 /* First try to get it from MAC address mailbox. */
11982 tg3_read_mem(tp, NIC_SRAM_MAC_ADDR_HIGH_MBOX, &hi);
11983 if ((hi >> 16) == 0x484b) {
11984 dev->dev_addr[0] = (hi >> 8) & 0xff;
11985 dev->dev_addr[1] = (hi >> 0) & 0xff;
11986
11987 tg3_read_mem(tp, NIC_SRAM_MAC_ADDR_LOW_MBOX, &lo);
11988 dev->dev_addr[2] = (lo >> 24) & 0xff;
11989 dev->dev_addr[3] = (lo >> 16) & 0xff;
11990 dev->dev_addr[4] = (lo >> 8) & 0xff;
11991 dev->dev_addr[5] = (lo >> 0) & 0xff;
1da177e4 11992
008652b3
MC
11993 /* Some old bootcode may report a 0 MAC address in SRAM */
11994 addr_ok = is_valid_ether_addr(&dev->dev_addr[0]);
11995 }
11996 if (!addr_ok) {
11997 /* Next, try NVRAM. */
f49639e6 11998 if (!tg3_nvram_read(tp, mac_offset + 0, &hi) &&
008652b3
MC
11999 !tg3_nvram_read(tp, mac_offset + 4, &lo)) {
12000 dev->dev_addr[0] = ((hi >> 16) & 0xff);
12001 dev->dev_addr[1] = ((hi >> 24) & 0xff);
12002 dev->dev_addr[2] = ((lo >> 0) & 0xff);
12003 dev->dev_addr[3] = ((lo >> 8) & 0xff);
12004 dev->dev_addr[4] = ((lo >> 16) & 0xff);
12005 dev->dev_addr[5] = ((lo >> 24) & 0xff);
12006 }
12007 /* Finally just fetch it out of the MAC control regs. */
12008 else {
12009 hi = tr32(MAC_ADDR_0_HIGH);
12010 lo = tr32(MAC_ADDR_0_LOW);
12011
12012 dev->dev_addr[5] = lo & 0xff;
12013 dev->dev_addr[4] = (lo >> 8) & 0xff;
12014 dev->dev_addr[3] = (lo >> 16) & 0xff;
12015 dev->dev_addr[2] = (lo >> 24) & 0xff;
12016 dev->dev_addr[1] = hi & 0xff;
12017 dev->dev_addr[0] = (hi >> 8) & 0xff;
12018 }
1da177e4
LT
12019 }
12020
12021 if (!is_valid_ether_addr(&dev->dev_addr[0])) {
7582a335 12022#ifdef CONFIG_SPARC
1da177e4
LT
12023 if (!tg3_get_default_macaddr_sparc(tp))
12024 return 0;
12025#endif
12026 return -EINVAL;
12027 }
2ff43697 12028 memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len);
1da177e4
LT
12029 return 0;
12030}
12031
59e6b434
DM
12032#define BOUNDARY_SINGLE_CACHELINE 1
12033#define BOUNDARY_MULTI_CACHELINE 2
12034
12035static u32 __devinit tg3_calc_dma_bndry(struct tg3 *tp, u32 val)
12036{
12037 int cacheline_size;
12038 u8 byte;
12039 int goal;
12040
12041 pci_read_config_byte(tp->pdev, PCI_CACHE_LINE_SIZE, &byte);
12042 if (byte == 0)
12043 cacheline_size = 1024;
12044 else
12045 cacheline_size = (int) byte * 4;
12046
12047 /* On 5703 and later chips, the boundary bits have no
12048 * effect.
12049 */
12050 if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5700 &&
12051 GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5701 &&
12052 !(tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS))
12053 goto out;
12054
12055#if defined(CONFIG_PPC64) || defined(CONFIG_IA64) || defined(CONFIG_PARISC)
12056 goal = BOUNDARY_MULTI_CACHELINE;
12057#else
12058#if defined(CONFIG_SPARC64) || defined(CONFIG_ALPHA)
12059 goal = BOUNDARY_SINGLE_CACHELINE;
12060#else
12061 goal = 0;
12062#endif
12063#endif
12064
12065 if (!goal)
12066 goto out;
12067
12068 /* PCI controllers on most RISC systems tend to disconnect
12069 * when a device tries to burst across a cache-line boundary.
12070 * Therefore, letting tg3 do so just wastes PCI bandwidth.
12071 *
12072 * Unfortunately, for PCI-E there are only limited
12073 * write-side controls for this, and thus for reads
12074 * we will still get the disconnects. We'll also waste
12075 * these PCI cycles for both read and write for chips
12076 * other than 5700 and 5701 which do not implement the
12077 * boundary bits.
12078 */
12079 if ((tp->tg3_flags & TG3_FLAG_PCIX_MODE) &&
12080 !(tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS)) {
12081 switch (cacheline_size) {
12082 case 16:
12083 case 32:
12084 case 64:
12085 case 128:
12086 if (goal == BOUNDARY_SINGLE_CACHELINE) {
12087 val |= (DMA_RWCTRL_READ_BNDRY_128_PCIX |
12088 DMA_RWCTRL_WRITE_BNDRY_128_PCIX);
12089 } else {
12090 val |= (DMA_RWCTRL_READ_BNDRY_384_PCIX |
12091 DMA_RWCTRL_WRITE_BNDRY_384_PCIX);
12092 }
12093 break;
12094
12095 case 256:
12096 val |= (DMA_RWCTRL_READ_BNDRY_256_PCIX |
12097 DMA_RWCTRL_WRITE_BNDRY_256_PCIX);
12098 break;
12099
12100 default:
12101 val |= (DMA_RWCTRL_READ_BNDRY_384_PCIX |
12102 DMA_RWCTRL_WRITE_BNDRY_384_PCIX);
12103 break;
12104 };
12105 } else if (tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS) {
12106 switch (cacheline_size) {
12107 case 16:
12108 case 32:
12109 case 64:
12110 if (goal == BOUNDARY_SINGLE_CACHELINE) {
12111 val &= ~DMA_RWCTRL_WRITE_BNDRY_DISAB_PCIE;
12112 val |= DMA_RWCTRL_WRITE_BNDRY_64_PCIE;
12113 break;
12114 }
12115 /* fallthrough */
12116 case 128:
12117 default:
12118 val &= ~DMA_RWCTRL_WRITE_BNDRY_DISAB_PCIE;
12119 val |= DMA_RWCTRL_WRITE_BNDRY_128_PCIE;
12120 break;
12121 };
12122 } else {
12123 switch (cacheline_size) {
12124 case 16:
12125 if (goal == BOUNDARY_SINGLE_CACHELINE) {
12126 val |= (DMA_RWCTRL_READ_BNDRY_16 |
12127 DMA_RWCTRL_WRITE_BNDRY_16);
12128 break;
12129 }
12130 /* fallthrough */
12131 case 32:
12132 if (goal == BOUNDARY_SINGLE_CACHELINE) {
12133 val |= (DMA_RWCTRL_READ_BNDRY_32 |
12134 DMA_RWCTRL_WRITE_BNDRY_32);
12135 break;
12136 }
12137 /* fallthrough */
12138 case 64:
12139 if (goal == BOUNDARY_SINGLE_CACHELINE) {
12140 val |= (DMA_RWCTRL_READ_BNDRY_64 |
12141 DMA_RWCTRL_WRITE_BNDRY_64);
12142 break;
12143 }
12144 /* fallthrough */
12145 case 128:
12146 if (goal == BOUNDARY_SINGLE_CACHELINE) {
12147 val |= (DMA_RWCTRL_READ_BNDRY_128 |
12148 DMA_RWCTRL_WRITE_BNDRY_128);
12149 break;
12150 }
12151 /* fallthrough */
12152 case 256:
12153 val |= (DMA_RWCTRL_READ_BNDRY_256 |
12154 DMA_RWCTRL_WRITE_BNDRY_256);
12155 break;
12156 case 512:
12157 val |= (DMA_RWCTRL_READ_BNDRY_512 |
12158 DMA_RWCTRL_WRITE_BNDRY_512);
12159 break;
12160 case 1024:
12161 default:
12162 val |= (DMA_RWCTRL_READ_BNDRY_1024 |
12163 DMA_RWCTRL_WRITE_BNDRY_1024);
12164 break;
12165 };
12166 }
12167
12168out:
12169 return val;
12170}
12171
1da177e4
LT
12172static int __devinit tg3_do_test_dma(struct tg3 *tp, u32 *buf, dma_addr_t buf_dma, int size, int to_device)
12173{
12174 struct tg3_internal_buffer_desc test_desc;
12175 u32 sram_dma_descs;
12176 int i, ret;
12177
12178 sram_dma_descs = NIC_SRAM_DMA_DESC_POOL_BASE;
12179
12180 tw32(FTQ_RCVBD_COMP_FIFO_ENQDEQ, 0);
12181 tw32(FTQ_RCVDATA_COMP_FIFO_ENQDEQ, 0);
12182 tw32(RDMAC_STATUS, 0);
12183 tw32(WDMAC_STATUS, 0);
12184
12185 tw32(BUFMGR_MODE, 0);
12186 tw32(FTQ_RESET, 0);
12187
12188 test_desc.addr_hi = ((u64) buf_dma) >> 32;
12189 test_desc.addr_lo = buf_dma & 0xffffffff;
12190 test_desc.nic_mbuf = 0x00002100;
12191 test_desc.len = size;
12192
12193 /*
12194 * HP ZX1 was seeing test failures for 5701 cards running at 33Mhz
12195 * the *second* time the tg3 driver was getting loaded after an
12196 * initial scan.
12197 *
12198 * Broadcom tells me:
12199 * ...the DMA engine is connected to the GRC block and a DMA
12200 * reset may affect the GRC block in some unpredictable way...
12201 * The behavior of resets to individual blocks has not been tested.
12202 *
12203 * Broadcom noted the GRC reset will also reset all sub-components.
12204 */
12205 if (to_device) {
12206 test_desc.cqid_sqid = (13 << 8) | 2;
12207
12208 tw32_f(RDMAC_MODE, RDMAC_MODE_ENABLE);
12209 udelay(40);
12210 } else {
12211 test_desc.cqid_sqid = (16 << 8) | 7;
12212
12213 tw32_f(WDMAC_MODE, WDMAC_MODE_ENABLE);
12214 udelay(40);
12215 }
12216 test_desc.flags = 0x00000005;
12217
12218 for (i = 0; i < (sizeof(test_desc) / sizeof(u32)); i++) {
12219 u32 val;
12220
12221 val = *(((u32 *)&test_desc) + i);
12222 pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_BASE_ADDR,
12223 sram_dma_descs + (i * sizeof(u32)));
12224 pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_DATA, val);
12225 }
12226 pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_BASE_ADDR, 0);
12227
12228 if (to_device) {
12229 tw32(FTQ_DMA_HIGH_READ_FIFO_ENQDEQ, sram_dma_descs);
12230 } else {
12231 tw32(FTQ_DMA_HIGH_WRITE_FIFO_ENQDEQ, sram_dma_descs);
12232 }
12233
12234 ret = -ENODEV;
12235 for (i = 0; i < 40; i++) {
12236 u32 val;
12237
12238 if (to_device)
12239 val = tr32(FTQ_RCVBD_COMP_FIFO_ENQDEQ);
12240 else
12241 val = tr32(FTQ_RCVDATA_COMP_FIFO_ENQDEQ);
12242 if ((val & 0xffff) == sram_dma_descs) {
12243 ret = 0;
12244 break;
12245 }
12246
12247 udelay(100);
12248 }
12249
12250 return ret;
12251}
12252
ded7340d 12253#define TEST_BUFFER_SIZE 0x2000
1da177e4
LT
12254
12255static int __devinit tg3_test_dma(struct tg3 *tp)
12256{
12257 dma_addr_t buf_dma;
59e6b434 12258 u32 *buf, saved_dma_rwctrl;
1da177e4
LT
12259 int ret;
12260
12261 buf = pci_alloc_consistent(tp->pdev, TEST_BUFFER_SIZE, &buf_dma);
12262 if (!buf) {
12263 ret = -ENOMEM;
12264 goto out_nofree;
12265 }
12266
12267 tp->dma_rwctrl = ((0x7 << DMA_RWCTRL_PCI_WRITE_CMD_SHIFT) |
12268 (0x6 << DMA_RWCTRL_PCI_READ_CMD_SHIFT));
12269
59e6b434 12270 tp->dma_rwctrl = tg3_calc_dma_bndry(tp, tp->dma_rwctrl);
1da177e4
LT
12271
12272 if (tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS) {
12273 /* DMA read watermark not used on PCIE */
12274 tp->dma_rwctrl |= 0x00180000;
12275 } else if (!(tp->tg3_flags & TG3_FLAG_PCIX_MODE)) {
85e94ced
MC
12276 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705 ||
12277 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750)
1da177e4
LT
12278 tp->dma_rwctrl |= 0x003f0000;
12279 else
12280 tp->dma_rwctrl |= 0x003f000f;
12281 } else {
12282 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703 ||
12283 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704) {
12284 u32 ccval = (tr32(TG3PCI_CLOCK_CTRL) & 0x1f);
49afdeb6 12285 u32 read_water = 0x7;
1da177e4 12286
4a29cc2e
MC
12287 /* If the 5704 is behind the EPB bridge, we can
12288 * do the less restrictive ONE_DMA workaround for
12289 * better performance.
12290 */
12291 if ((tp->tg3_flags & TG3_FLAG_40BIT_DMA_BUG) &&
12292 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704)
12293 tp->dma_rwctrl |= 0x8000;
12294 else if (ccval == 0x6 || ccval == 0x7)
1da177e4
LT
12295 tp->dma_rwctrl |= DMA_RWCTRL_ONE_DMA;
12296
49afdeb6
MC
12297 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703)
12298 read_water = 4;
59e6b434 12299 /* Set bit 23 to enable PCIX hw bug fix */
49afdeb6
MC
12300 tp->dma_rwctrl |=
12301 (read_water << DMA_RWCTRL_READ_WATER_SHIFT) |
12302 (0x3 << DMA_RWCTRL_WRITE_WATER_SHIFT) |
12303 (1 << 23);
4cf78e4f
MC
12304 } else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5780) {
12305 /* 5780 always in PCIX mode */
12306 tp->dma_rwctrl |= 0x00144000;
a4e2b347
MC
12307 } else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5714) {
12308 /* 5714 always in PCIX mode */
12309 tp->dma_rwctrl |= 0x00148000;
1da177e4
LT
12310 } else {
12311 tp->dma_rwctrl |= 0x001b000f;
12312 }
12313 }
12314
12315 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703 ||
12316 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704)
12317 tp->dma_rwctrl &= 0xfffffff0;
12318
12319 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 ||
12320 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701) {
12321 /* Remove this if it causes problems for some boards. */
12322 tp->dma_rwctrl |= DMA_RWCTRL_USE_MEM_READ_MULT;
12323
12324 /* On 5700/5701 chips, we need to set this bit.
12325 * Otherwise the chip will issue cacheline transactions
12326 * to streamable DMA memory with not all the byte
12327 * enables turned on. This is an error on several
12328 * RISC PCI controllers, in particular sparc64.
12329 *
12330 * On 5703/5704 chips, this bit has been reassigned
12331 * a different meaning. In particular, it is used
12332 * on those chips to enable a PCI-X workaround.
12333 */
12334 tp->dma_rwctrl |= DMA_RWCTRL_ASSERT_ALL_BE;
12335 }
12336
12337 tw32(TG3PCI_DMA_RW_CTRL, tp->dma_rwctrl);
12338
12339#if 0
12340 /* Unneeded, already done by tg3_get_invariants. */
12341 tg3_switch_clocks(tp);
12342#endif
12343
12344 ret = 0;
12345 if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5700 &&
12346 GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5701)
12347 goto out;
12348
59e6b434
DM
12349 /* It is best to perform DMA test with maximum write burst size
12350 * to expose the 5700/5701 write DMA bug.
12351 */
12352 saved_dma_rwctrl = tp->dma_rwctrl;
12353 tp->dma_rwctrl &= ~DMA_RWCTRL_WRITE_BNDRY_MASK;
12354 tw32(TG3PCI_DMA_RW_CTRL, tp->dma_rwctrl);
12355
1da177e4
LT
12356 while (1) {
12357 u32 *p = buf, i;
12358
12359 for (i = 0; i < TEST_BUFFER_SIZE / sizeof(u32); i++)
12360 p[i] = i;
12361
12362 /* Send the buffer to the chip. */
12363 ret = tg3_do_test_dma(tp, buf, buf_dma, TEST_BUFFER_SIZE, 1);
12364 if (ret) {
12365 printk(KERN_ERR "tg3_test_dma() Write the buffer failed %d\n", ret);
12366 break;
12367 }
12368
12369#if 0
12370 /* validate data reached card RAM correctly. */
12371 for (i = 0; i < TEST_BUFFER_SIZE / sizeof(u32); i++) {
12372 u32 val;
12373 tg3_read_mem(tp, 0x2100 + (i*4), &val);
12374 if (le32_to_cpu(val) != p[i]) {
12375 printk(KERN_ERR " tg3_test_dma() Card buffer corrupted on write! (%d != %d)\n", val, i);
12376 /* ret = -ENODEV here? */
12377 }
12378 p[i] = 0;
12379 }
12380#endif
12381 /* Now read it back. */
12382 ret = tg3_do_test_dma(tp, buf, buf_dma, TEST_BUFFER_SIZE, 0);
12383 if (ret) {
12384 printk(KERN_ERR "tg3_test_dma() Read the buffer failed %d\n", ret);
12385
12386 break;
12387 }
12388
12389 /* Verify it. */
12390 for (i = 0; i < TEST_BUFFER_SIZE / sizeof(u32); i++) {
12391 if (p[i] == i)
12392 continue;
12393
59e6b434
DM
12394 if ((tp->dma_rwctrl & DMA_RWCTRL_WRITE_BNDRY_MASK) !=
12395 DMA_RWCTRL_WRITE_BNDRY_16) {
12396 tp->dma_rwctrl &= ~DMA_RWCTRL_WRITE_BNDRY_MASK;
1da177e4
LT
12397 tp->dma_rwctrl |= DMA_RWCTRL_WRITE_BNDRY_16;
12398 tw32(TG3PCI_DMA_RW_CTRL, tp->dma_rwctrl);
12399 break;
12400 } else {
12401 printk(KERN_ERR "tg3_test_dma() buffer corrupted on read back! (%d != %d)\n", p[i], i);
12402 ret = -ENODEV;
12403 goto out;
12404 }
12405 }
12406
12407 if (i == (TEST_BUFFER_SIZE / sizeof(u32))) {
12408 /* Success. */
12409 ret = 0;
12410 break;
12411 }
12412 }
59e6b434
DM
12413 if ((tp->dma_rwctrl & DMA_RWCTRL_WRITE_BNDRY_MASK) !=
12414 DMA_RWCTRL_WRITE_BNDRY_16) {
6d1cfbab
MC
12415 static struct pci_device_id dma_wait_state_chipsets[] = {
12416 { PCI_DEVICE(PCI_VENDOR_ID_APPLE,
12417 PCI_DEVICE_ID_APPLE_UNI_N_PCI15) },
12418 { },
12419 };
12420
59e6b434 12421 /* DMA test passed without adjusting DMA boundary,
6d1cfbab
MC
12422 * now look for chipsets that are known to expose the
12423 * DMA bug without failing the test.
59e6b434 12424 */
6d1cfbab
MC
12425 if (pci_dev_present(dma_wait_state_chipsets)) {
12426 tp->dma_rwctrl &= ~DMA_RWCTRL_WRITE_BNDRY_MASK;
12427 tp->dma_rwctrl |= DMA_RWCTRL_WRITE_BNDRY_16;
12428 }
12429 else
12430 /* Safe to use the calculated DMA boundary. */
12431 tp->dma_rwctrl = saved_dma_rwctrl;
12432
59e6b434
DM
12433 tw32(TG3PCI_DMA_RW_CTRL, tp->dma_rwctrl);
12434 }
1da177e4
LT
12435
12436out:
12437 pci_free_consistent(tp->pdev, TEST_BUFFER_SIZE, buf, buf_dma);
12438out_nofree:
12439 return ret;
12440}
12441
12442static void __devinit tg3_init_link_config(struct tg3 *tp)
12443{
12444 tp->link_config.advertising =
12445 (ADVERTISED_10baseT_Half | ADVERTISED_10baseT_Full |
12446 ADVERTISED_100baseT_Half | ADVERTISED_100baseT_Full |
12447 ADVERTISED_1000baseT_Half | ADVERTISED_1000baseT_Full |
12448 ADVERTISED_Autoneg | ADVERTISED_MII);
12449 tp->link_config.speed = SPEED_INVALID;
12450 tp->link_config.duplex = DUPLEX_INVALID;
12451 tp->link_config.autoneg = AUTONEG_ENABLE;
1da177e4
LT
12452 tp->link_config.active_speed = SPEED_INVALID;
12453 tp->link_config.active_duplex = DUPLEX_INVALID;
12454 tp->link_config.phy_is_low_power = 0;
12455 tp->link_config.orig_speed = SPEED_INVALID;
12456 tp->link_config.orig_duplex = DUPLEX_INVALID;
12457 tp->link_config.orig_autoneg = AUTONEG_INVALID;
12458}
12459
12460static void __devinit tg3_init_bufmgr_config(struct tg3 *tp)
12461{
fdfec172
MC
12462 if (tp->tg3_flags2 & TG3_FLG2_5705_PLUS) {
12463 tp->bufmgr_config.mbuf_read_dma_low_water =
12464 DEFAULT_MB_RDMA_LOW_WATER_5705;
12465 tp->bufmgr_config.mbuf_mac_rx_low_water =
12466 DEFAULT_MB_MACRX_LOW_WATER_5705;
12467 tp->bufmgr_config.mbuf_high_water =
12468 DEFAULT_MB_HIGH_WATER_5705;
b5d3772c
MC
12469 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) {
12470 tp->bufmgr_config.mbuf_mac_rx_low_water =
12471 DEFAULT_MB_MACRX_LOW_WATER_5906;
12472 tp->bufmgr_config.mbuf_high_water =
12473 DEFAULT_MB_HIGH_WATER_5906;
12474 }
fdfec172
MC
12475
12476 tp->bufmgr_config.mbuf_read_dma_low_water_jumbo =
12477 DEFAULT_MB_RDMA_LOW_WATER_JUMBO_5780;
12478 tp->bufmgr_config.mbuf_mac_rx_low_water_jumbo =
12479 DEFAULT_MB_MACRX_LOW_WATER_JUMBO_5780;
12480 tp->bufmgr_config.mbuf_high_water_jumbo =
12481 DEFAULT_MB_HIGH_WATER_JUMBO_5780;
12482 } else {
12483 tp->bufmgr_config.mbuf_read_dma_low_water =
12484 DEFAULT_MB_RDMA_LOW_WATER;
12485 tp->bufmgr_config.mbuf_mac_rx_low_water =
12486 DEFAULT_MB_MACRX_LOW_WATER;
12487 tp->bufmgr_config.mbuf_high_water =
12488 DEFAULT_MB_HIGH_WATER;
12489
12490 tp->bufmgr_config.mbuf_read_dma_low_water_jumbo =
12491 DEFAULT_MB_RDMA_LOW_WATER_JUMBO;
12492 tp->bufmgr_config.mbuf_mac_rx_low_water_jumbo =
12493 DEFAULT_MB_MACRX_LOW_WATER_JUMBO;
12494 tp->bufmgr_config.mbuf_high_water_jumbo =
12495 DEFAULT_MB_HIGH_WATER_JUMBO;
12496 }
1da177e4
LT
12497
12498 tp->bufmgr_config.dma_low_water = DEFAULT_DMA_LOW_WATER;
12499 tp->bufmgr_config.dma_high_water = DEFAULT_DMA_HIGH_WATER;
12500}
12501
12502static char * __devinit tg3_phy_string(struct tg3 *tp)
12503{
12504 switch (tp->phy_id & PHY_ID_MASK) {
12505 case PHY_ID_BCM5400: return "5400";
12506 case PHY_ID_BCM5401: return "5401";
12507 case PHY_ID_BCM5411: return "5411";
12508 case PHY_ID_BCM5701: return "5701";
12509 case PHY_ID_BCM5703: return "5703";
12510 case PHY_ID_BCM5704: return "5704";
12511 case PHY_ID_BCM5705: return "5705";
12512 case PHY_ID_BCM5750: return "5750";
85e94ced 12513 case PHY_ID_BCM5752: return "5752";
a4e2b347 12514 case PHY_ID_BCM5714: return "5714";
4cf78e4f 12515 case PHY_ID_BCM5780: return "5780";
af36e6b6 12516 case PHY_ID_BCM5755: return "5755";
d9ab5ad1 12517 case PHY_ID_BCM5787: return "5787";
d30cdd28 12518 case PHY_ID_BCM5784: return "5784";
126a3368 12519 case PHY_ID_BCM5756: return "5722/5756";
b5d3772c 12520 case PHY_ID_BCM5906: return "5906";
9936bcf6 12521 case PHY_ID_BCM5761: return "5761";
1da177e4
LT
12522 case PHY_ID_BCM8002: return "8002/serdes";
12523 case 0: return "serdes";
12524 default: return "unknown";
12525 };
12526}
12527
f9804ddb
MC
12528static char * __devinit tg3_bus_string(struct tg3 *tp, char *str)
12529{
12530 if (tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS) {
12531 strcpy(str, "PCI Express");
12532 return str;
12533 } else if (tp->tg3_flags & TG3_FLAG_PCIX_MODE) {
12534 u32 clock_ctrl = tr32(TG3PCI_CLOCK_CTRL) & 0x1f;
12535
12536 strcpy(str, "PCIX:");
12537
12538 if ((clock_ctrl == 7) ||
12539 ((tr32(GRC_MISC_CFG) & GRC_MISC_CFG_BOARD_ID_MASK) ==
12540 GRC_MISC_CFG_BOARD_ID_5704CIOBE))
12541 strcat(str, "133MHz");
12542 else if (clock_ctrl == 0)
12543 strcat(str, "33MHz");
12544 else if (clock_ctrl == 2)
12545 strcat(str, "50MHz");
12546 else if (clock_ctrl == 4)
12547 strcat(str, "66MHz");
12548 else if (clock_ctrl == 6)
12549 strcat(str, "100MHz");
f9804ddb
MC
12550 } else {
12551 strcpy(str, "PCI:");
12552 if (tp->tg3_flags & TG3_FLAG_PCI_HIGH_SPEED)
12553 strcat(str, "66MHz");
12554 else
12555 strcat(str, "33MHz");
12556 }
12557 if (tp->tg3_flags & TG3_FLAG_PCI_32BIT)
12558 strcat(str, ":32-bit");
12559 else
12560 strcat(str, ":64-bit");
12561 return str;
12562}
12563
8c2dc7e1 12564static struct pci_dev * __devinit tg3_find_peer(struct tg3 *tp)
1da177e4
LT
12565{
12566 struct pci_dev *peer;
12567 unsigned int func, devnr = tp->pdev->devfn & ~7;
12568
12569 for (func = 0; func < 8; func++) {
12570 peer = pci_get_slot(tp->pdev->bus, devnr | func);
12571 if (peer && peer != tp->pdev)
12572 break;
12573 pci_dev_put(peer);
12574 }
16fe9d74
MC
12575 /* 5704 can be configured in single-port mode, set peer to
12576 * tp->pdev in that case.
12577 */
12578 if (!peer) {
12579 peer = tp->pdev;
12580 return peer;
12581 }
1da177e4
LT
12582
12583 /*
12584 * We don't need to keep the refcount elevated; there's no way
12585 * to remove one half of this device without removing the other
12586 */
12587 pci_dev_put(peer);
12588
12589 return peer;
12590}
12591
15f9850d
DM
12592static void __devinit tg3_init_coal(struct tg3 *tp)
12593{
12594 struct ethtool_coalesce *ec = &tp->coal;
12595
12596 memset(ec, 0, sizeof(*ec));
12597 ec->cmd = ETHTOOL_GCOALESCE;
12598 ec->rx_coalesce_usecs = LOW_RXCOL_TICKS;
12599 ec->tx_coalesce_usecs = LOW_TXCOL_TICKS;
12600 ec->rx_max_coalesced_frames = LOW_RXMAX_FRAMES;
12601 ec->tx_max_coalesced_frames = LOW_TXMAX_FRAMES;
12602 ec->rx_coalesce_usecs_irq = DEFAULT_RXCOAL_TICK_INT;
12603 ec->tx_coalesce_usecs_irq = DEFAULT_TXCOAL_TICK_INT;
12604 ec->rx_max_coalesced_frames_irq = DEFAULT_RXCOAL_MAXF_INT;
12605 ec->tx_max_coalesced_frames_irq = DEFAULT_TXCOAL_MAXF_INT;
12606 ec->stats_block_coalesce_usecs = DEFAULT_STAT_COAL_TICKS;
12607
12608 if (tp->coalesce_mode & (HOSTCC_MODE_CLRTICK_RXBD |
12609 HOSTCC_MODE_CLRTICK_TXBD)) {
12610 ec->rx_coalesce_usecs = LOW_RXCOL_TICKS_CLRTCKS;
12611 ec->rx_coalesce_usecs_irq = DEFAULT_RXCOAL_TICK_INT_CLRTCKS;
12612 ec->tx_coalesce_usecs = LOW_TXCOL_TICKS_CLRTCKS;
12613 ec->tx_coalesce_usecs_irq = DEFAULT_TXCOAL_TICK_INT_CLRTCKS;
12614 }
d244c892
MC
12615
12616 if (tp->tg3_flags2 & TG3_FLG2_5705_PLUS) {
12617 ec->rx_coalesce_usecs_irq = 0;
12618 ec->tx_coalesce_usecs_irq = 0;
12619 ec->stats_block_coalesce_usecs = 0;
12620 }
15f9850d
DM
12621}
12622
1da177e4
LT
12623static int __devinit tg3_init_one(struct pci_dev *pdev,
12624 const struct pci_device_id *ent)
12625{
12626 static int tg3_version_printed = 0;
2de58e30
SS
12627 resource_size_t tg3reg_base;
12628 unsigned long tg3reg_len;
1da177e4
LT
12629 struct net_device *dev;
12630 struct tg3 *tp;
d6645372 12631 int err, pm_cap;
f9804ddb 12632 char str[40];
72f2afb8 12633 u64 dma_mask, persist_dma_mask;
d6645372 12634 DECLARE_MAC_BUF(mac);
1da177e4
LT
12635
12636 if (tg3_version_printed++ == 0)
12637 printk(KERN_INFO "%s", version);
12638
12639 err = pci_enable_device(pdev);
12640 if (err) {
12641 printk(KERN_ERR PFX "Cannot enable PCI device, "
12642 "aborting.\n");
12643 return err;
12644 }
12645
12646 if (!(pci_resource_flags(pdev, 0) & IORESOURCE_MEM)) {
12647 printk(KERN_ERR PFX "Cannot find proper PCI device "
12648 "base address, aborting.\n");
12649 err = -ENODEV;
12650 goto err_out_disable_pdev;
12651 }
12652
12653 err = pci_request_regions(pdev, DRV_MODULE_NAME);
12654 if (err) {
12655 printk(KERN_ERR PFX "Cannot obtain PCI resources, "
12656 "aborting.\n");
12657 goto err_out_disable_pdev;
12658 }
12659
12660 pci_set_master(pdev);
12661
12662 /* Find power-management capability. */
12663 pm_cap = pci_find_capability(pdev, PCI_CAP_ID_PM);
12664 if (pm_cap == 0) {
12665 printk(KERN_ERR PFX "Cannot find PowerManagement capability, "
12666 "aborting.\n");
12667 err = -EIO;
12668 goto err_out_free_res;
12669 }
12670
1da177e4
LT
12671 tg3reg_base = pci_resource_start(pdev, 0);
12672 tg3reg_len = pci_resource_len(pdev, 0);
12673
12674 dev = alloc_etherdev(sizeof(*tp));
12675 if (!dev) {
12676 printk(KERN_ERR PFX "Etherdev alloc failed, aborting.\n");
12677 err = -ENOMEM;
12678 goto err_out_free_res;
12679 }
12680
1da177e4
LT
12681 SET_NETDEV_DEV(dev, &pdev->dev);
12682
1da177e4
LT
12683#if TG3_VLAN_TAG_USED
12684 dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
12685 dev->vlan_rx_register = tg3_vlan_rx_register;
1da177e4
LT
12686#endif
12687
12688 tp = netdev_priv(dev);
12689 tp->pdev = pdev;
12690 tp->dev = dev;
12691 tp->pm_cap = pm_cap;
12692 tp->mac_mode = TG3_DEF_MAC_MODE;
12693 tp->rx_mode = TG3_DEF_RX_MODE;
12694 tp->tx_mode = TG3_DEF_TX_MODE;
12695 tp->mi_mode = MAC_MI_MODE_BASE;
12696 if (tg3_debug > 0)
12697 tp->msg_enable = tg3_debug;
12698 else
12699 tp->msg_enable = TG3_DEF_MSG_ENABLE;
12700
12701 /* The word/byte swap controls here control register access byte
12702 * swapping. DMA data byte swapping is controlled in the GRC_MODE
12703 * setting below.
12704 */
12705 tp->misc_host_ctrl =
12706 MISC_HOST_CTRL_MASK_PCI_INT |
12707 MISC_HOST_CTRL_WORD_SWAP |
12708 MISC_HOST_CTRL_INDIR_ACCESS |
12709 MISC_HOST_CTRL_PCISTATE_RW;
12710
12711 /* The NONFRM (non-frame) byte/word swap controls take effect
12712 * on descriptor entries, anything which isn't packet data.
12713 *
12714 * The StrongARM chips on the board (one for tx, one for rx)
12715 * are running in big-endian mode.
12716 */
12717 tp->grc_mode = (GRC_MODE_WSWAP_DATA | GRC_MODE_BSWAP_DATA |
12718 GRC_MODE_WSWAP_NONFRM_DATA);
12719#ifdef __BIG_ENDIAN
12720 tp->grc_mode |= GRC_MODE_BSWAP_NONFRM_DATA;
12721#endif
12722 spin_lock_init(&tp->lock);
1da177e4 12723 spin_lock_init(&tp->indirect_lock);
c4028958 12724 INIT_WORK(&tp->reset_task, tg3_reset_task);
1da177e4
LT
12725
12726 tp->regs = ioremap_nocache(tg3reg_base, tg3reg_len);
ab0049b4 12727 if (!tp->regs) {
1da177e4
LT
12728 printk(KERN_ERR PFX "Cannot map device registers, "
12729 "aborting.\n");
12730 err = -ENOMEM;
12731 goto err_out_free_dev;
12732 }
12733
12734 tg3_init_link_config(tp);
12735
1da177e4
LT
12736 tp->rx_pending = TG3_DEF_RX_RING_PENDING;
12737 tp->rx_jumbo_pending = TG3_DEF_RX_JUMBO_RING_PENDING;
12738 tp->tx_pending = TG3_DEF_TX_RING_PENDING;
12739
12740 dev->open = tg3_open;
12741 dev->stop = tg3_close;
12742 dev->get_stats = tg3_get_stats;
12743 dev->set_multicast_list = tg3_set_rx_mode;
12744 dev->set_mac_address = tg3_set_mac_addr;
12745 dev->do_ioctl = tg3_ioctl;
12746 dev->tx_timeout = tg3_tx_timeout;
bea3348e 12747 netif_napi_add(dev, &tp->napi, tg3_poll, 64);
1da177e4 12748 dev->ethtool_ops = &tg3_ethtool_ops;
1da177e4
LT
12749 dev->watchdog_timeo = TG3_TX_TIMEOUT;
12750 dev->change_mtu = tg3_change_mtu;
12751 dev->irq = pdev->irq;
12752#ifdef CONFIG_NET_POLL_CONTROLLER
12753 dev->poll_controller = tg3_poll_controller;
12754#endif
12755
12756 err = tg3_get_invariants(tp);
12757 if (err) {
12758 printk(KERN_ERR PFX "Problem fetching invariants of chip, "
12759 "aborting.\n");
12760 goto err_out_iounmap;
12761 }
12762
4a29cc2e
MC
12763 /* The EPB bridge inside 5714, 5715, and 5780 and any
12764 * device behind the EPB cannot support DMA addresses > 40-bit.
72f2afb8
MC
12765 * On 64-bit systems with IOMMU, use 40-bit dma_mask.
12766 * On 64-bit systems without IOMMU, use 64-bit dma_mask and
12767 * do DMA address check in tg3_start_xmit().
12768 */
4a29cc2e
MC
12769 if (tp->tg3_flags2 & TG3_FLG2_IS_5788)
12770 persist_dma_mask = dma_mask = DMA_32BIT_MASK;
12771 else if (tp->tg3_flags & TG3_FLAG_40BIT_DMA_BUG) {
72f2afb8
MC
12772 persist_dma_mask = dma_mask = DMA_40BIT_MASK;
12773#ifdef CONFIG_HIGHMEM
12774 dma_mask = DMA_64BIT_MASK;
12775#endif
4a29cc2e 12776 } else
72f2afb8
MC
12777 persist_dma_mask = dma_mask = DMA_64BIT_MASK;
12778
12779 /* Configure DMA attributes. */
12780 if (dma_mask > DMA_32BIT_MASK) {
12781 err = pci_set_dma_mask(pdev, dma_mask);
12782 if (!err) {
12783 dev->features |= NETIF_F_HIGHDMA;
12784 err = pci_set_consistent_dma_mask(pdev,
12785 persist_dma_mask);
12786 if (err < 0) {
12787 printk(KERN_ERR PFX "Unable to obtain 64 bit "
12788 "DMA for consistent allocations\n");
12789 goto err_out_iounmap;
12790 }
12791 }
12792 }
12793 if (err || dma_mask == DMA_32BIT_MASK) {
12794 err = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
12795 if (err) {
12796 printk(KERN_ERR PFX "No usable DMA configuration, "
12797 "aborting.\n");
12798 goto err_out_iounmap;
12799 }
12800 }
12801
fdfec172 12802 tg3_init_bufmgr_config(tp);
1da177e4 12803
1da177e4
LT
12804 if (tp->tg3_flags2 & TG3_FLG2_HW_TSO) {
12805 tp->tg3_flags2 |= TG3_FLG2_TSO_CAPABLE;
12806 }
12807 else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 ||
12808 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701 ||
12809 tp->pci_chip_rev_id == CHIPREV_ID_5705_A0 ||
c7835a77 12810 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906 ||
1da177e4
LT
12811 (tp->tg3_flags & TG3_FLAG_ENABLE_ASF) != 0) {
12812 tp->tg3_flags2 &= ~TG3_FLG2_TSO_CAPABLE;
12813 } else {
7f62ad5d 12814 tp->tg3_flags2 |= TG3_FLG2_TSO_CAPABLE | TG3_FLG2_TSO_BUG;
1da177e4
LT
12815 }
12816
4e3a7aaa
MC
12817 /* TSO is on by default on chips that support hardware TSO.
12818 * Firmware TSO on older chips gives lower performance, so it
12819 * is off by default, but can be enabled using ethtool.
12820 */
b0026624 12821 if (tp->tg3_flags2 & TG3_FLG2_HW_TSO) {
1da177e4 12822 dev->features |= NETIF_F_TSO;
b5d3772c
MC
12823 if ((tp->tg3_flags2 & TG3_FLG2_HW_TSO_2) &&
12824 (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5906))
b0026624 12825 dev->features |= NETIF_F_TSO6;
9936bcf6
MC
12826 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5761)
12827 dev->features |= NETIF_F_TSO_ECN;
b0026624 12828 }
1da177e4 12829
1da177e4
LT
12830
12831 if (tp->pci_chip_rev_id == CHIPREV_ID_5705_A1 &&
12832 !(tp->tg3_flags2 & TG3_FLG2_TSO_CAPABLE) &&
12833 !(tr32(TG3PCI_PCISTATE) & PCISTATE_BUS_SPEED_HIGH)) {
12834 tp->tg3_flags2 |= TG3_FLG2_MAX_RXPEND_64;
12835 tp->rx_pending = 63;
12836 }
12837
1da177e4
LT
12838 err = tg3_get_device_address(tp);
12839 if (err) {
12840 printk(KERN_ERR PFX "Could not obtain valid ethernet address, "
12841 "aborting.\n");
12842 goto err_out_iounmap;
12843 }
12844
c88864df
MC
12845 if (tp->tg3_flags3 & TG3_FLG3_ENABLE_APE) {
12846 if (!(pci_resource_flags(pdev, 2) & IORESOURCE_MEM)) {
12847 printk(KERN_ERR PFX "Cannot find proper PCI device "
12848 "base address for APE, aborting.\n");
12849 err = -ENODEV;
12850 goto err_out_iounmap;
12851 }
12852
12853 tg3reg_base = pci_resource_start(pdev, 2);
12854 tg3reg_len = pci_resource_len(pdev, 2);
12855
12856 tp->aperegs = ioremap_nocache(tg3reg_base, tg3reg_len);
79ea13ce 12857 if (!tp->aperegs) {
c88864df
MC
12858 printk(KERN_ERR PFX "Cannot map APE registers, "
12859 "aborting.\n");
12860 err = -ENOMEM;
12861 goto err_out_iounmap;
12862 }
12863
12864 tg3_ape_lock_init(tp);
12865 }
12866
1da177e4
LT
12867 /*
12868 * Reset chip in case UNDI or EFI driver did not shutdown
12869 * DMA self test will enable WDMAC and we'll see (spurious)
12870 * pending DMA on the PCI bus at that point.
12871 */
12872 if ((tr32(HOSTCC_MODE) & HOSTCC_MODE_ENABLE) ||
12873 (tr32(WDMAC_MODE) & WDMAC_MODE_ENABLE)) {
1da177e4 12874 tw32(MEMARB_MODE, MEMARB_MODE_ENABLE);
944d980e 12875 tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
1da177e4
LT
12876 }
12877
12878 err = tg3_test_dma(tp);
12879 if (err) {
12880 printk(KERN_ERR PFX "DMA engine test failed, aborting.\n");
c88864df 12881 goto err_out_apeunmap;
1da177e4
LT
12882 }
12883
12884 /* Tigon3 can do ipv4 only... and some chips have buggy
12885 * checksumming.
12886 */
12887 if ((tp->tg3_flags & TG3_FLAG_BROKEN_CHECKSUMS) == 0) {
d212f87b 12888 dev->features |= NETIF_F_IP_CSUM | NETIF_F_SG;
af36e6b6 12889 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 ||
d30cdd28 12890 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787 ||
9936bcf6
MC
12891 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5784 ||
12892 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5761)
d212f87b
SH
12893 dev->features |= NETIF_F_IPV6_CSUM;
12894
1da177e4
LT
12895 tp->tg3_flags |= TG3_FLAG_RX_CHECKSUMS;
12896 } else
12897 tp->tg3_flags &= ~TG3_FLAG_RX_CHECKSUMS;
12898
1da177e4
LT
12899 /* flow control autonegotiation is default behavior */
12900 tp->tg3_flags |= TG3_FLAG_PAUSE_AUTONEG;
8d018621 12901 tp->link_config.flowctrl = TG3_FLOW_CTRL_TX | TG3_FLOW_CTRL_RX;
1da177e4 12902
15f9850d
DM
12903 tg3_init_coal(tp);
12904
c49a1561
MC
12905 pci_set_drvdata(pdev, dev);
12906
1da177e4
LT
12907 err = register_netdev(dev);
12908 if (err) {
12909 printk(KERN_ERR PFX "Cannot register net device, "
12910 "aborting.\n");
0d3031d9 12911 goto err_out_apeunmap;
1da177e4
LT
12912 }
12913
d6645372
JP
12914 printk(KERN_INFO "%s: Tigon3 [partno(%s) rev %04x PHY(%s)] "
12915 "(%s) %s Ethernet %s\n",
1da177e4
LT
12916 dev->name,
12917 tp->board_part_number,
12918 tp->pci_chip_rev_id,
12919 tg3_phy_string(tp),
f9804ddb 12920 tg3_bus_string(tp, str),
cbb45d21
MC
12921 ((tp->tg3_flags & TG3_FLAG_10_100_ONLY) ? "10/100Base-TX" :
12922 ((tp->tg3_flags2 & TG3_FLG2_ANY_SERDES) ? "1000Base-SX" :
d6645372
JP
12923 "10/100/1000Base-T")),
12924 print_mac(mac, dev->dev_addr));
1da177e4
LT
12925
12926 printk(KERN_INFO "%s: RXcsums[%d] LinkChgREG[%d] "
1c46ae05 12927 "MIirq[%d] ASF[%d] WireSpeed[%d] TSOcap[%d]\n",
1da177e4
LT
12928 dev->name,
12929 (tp->tg3_flags & TG3_FLAG_RX_CHECKSUMS) != 0,
12930 (tp->tg3_flags & TG3_FLAG_USE_LINKCHG_REG) != 0,
12931 (tp->tg3_flags & TG3_FLAG_USE_MI_INTERRUPT) != 0,
12932 (tp->tg3_flags & TG3_FLAG_ENABLE_ASF) != 0,
1da177e4
LT
12933 (tp->tg3_flags2 & TG3_FLG2_NO_ETH_WIRE_SPEED) == 0,
12934 (tp->tg3_flags2 & TG3_FLG2_TSO_CAPABLE) != 0);
4a29cc2e
MC
12935 printk(KERN_INFO "%s: dma_rwctrl[%08x] dma_mask[%d-bit]\n",
12936 dev->name, tp->dma_rwctrl,
12937 (pdev->dma_mask == DMA_32BIT_MASK) ? 32 :
12938 (((u64) pdev->dma_mask == DMA_40BIT_MASK) ? 40 : 64));
1da177e4
LT
12939
12940 return 0;
12941
0d3031d9
MC
12942err_out_apeunmap:
12943 if (tp->aperegs) {
12944 iounmap(tp->aperegs);
12945 tp->aperegs = NULL;
12946 }
12947
1da177e4 12948err_out_iounmap:
6892914f
MC
12949 if (tp->regs) {
12950 iounmap(tp->regs);
22abe310 12951 tp->regs = NULL;
6892914f 12952 }
1da177e4
LT
12953
12954err_out_free_dev:
12955 free_netdev(dev);
12956
12957err_out_free_res:
12958 pci_release_regions(pdev);
12959
12960err_out_disable_pdev:
12961 pci_disable_device(pdev);
12962 pci_set_drvdata(pdev, NULL);
12963 return err;
12964}
12965
12966static void __devexit tg3_remove_one(struct pci_dev *pdev)
12967{
12968 struct net_device *dev = pci_get_drvdata(pdev);
12969
12970 if (dev) {
12971 struct tg3 *tp = netdev_priv(dev);
12972
7faa006f 12973 flush_scheduled_work();
1da177e4 12974 unregister_netdev(dev);
0d3031d9
MC
12975 if (tp->aperegs) {
12976 iounmap(tp->aperegs);
12977 tp->aperegs = NULL;
12978 }
6892914f
MC
12979 if (tp->regs) {
12980 iounmap(tp->regs);
22abe310 12981 tp->regs = NULL;
6892914f 12982 }
1da177e4
LT
12983 free_netdev(dev);
12984 pci_release_regions(pdev);
12985 pci_disable_device(pdev);
12986 pci_set_drvdata(pdev, NULL);
12987 }
12988}
12989
12990static int tg3_suspend(struct pci_dev *pdev, pm_message_t state)
12991{
12992 struct net_device *dev = pci_get_drvdata(pdev);
12993 struct tg3 *tp = netdev_priv(dev);
12994 int err;
12995
3e0c95fd
MC
12996 /* PCI register 4 needs to be saved whether netif_running() or not.
12997 * MSI address and data need to be saved if using MSI and
12998 * netif_running().
12999 */
13000 pci_save_state(pdev);
13001
1da177e4
LT
13002 if (!netif_running(dev))
13003 return 0;
13004
7faa006f 13005 flush_scheduled_work();
1da177e4
LT
13006 tg3_netif_stop(tp);
13007
13008 del_timer_sync(&tp->timer);
13009
f47c11ee 13010 tg3_full_lock(tp, 1);
1da177e4 13011 tg3_disable_ints(tp);
f47c11ee 13012 tg3_full_unlock(tp);
1da177e4
LT
13013
13014 netif_device_detach(dev);
13015
f47c11ee 13016 tg3_full_lock(tp, 0);
944d980e 13017 tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
6a9eba15 13018 tp->tg3_flags &= ~TG3_FLAG_INIT_COMPLETE;
f47c11ee 13019 tg3_full_unlock(tp);
1da177e4
LT
13020
13021 err = tg3_set_power_state(tp, pci_choose_state(pdev, state));
13022 if (err) {
f47c11ee 13023 tg3_full_lock(tp, 0);
1da177e4 13024
6a9eba15 13025 tp->tg3_flags |= TG3_FLAG_INIT_COMPLETE;
b9ec6c1b
MC
13026 if (tg3_restart_hw(tp, 1))
13027 goto out;
1da177e4
LT
13028
13029 tp->timer.expires = jiffies + tp->timer_offset;
13030 add_timer(&tp->timer);
13031
13032 netif_device_attach(dev);
13033 tg3_netif_start(tp);
13034
b9ec6c1b 13035out:
f47c11ee 13036 tg3_full_unlock(tp);
1da177e4
LT
13037 }
13038
13039 return err;
13040}
13041
13042static int tg3_resume(struct pci_dev *pdev)
13043{
13044 struct net_device *dev = pci_get_drvdata(pdev);
13045 struct tg3 *tp = netdev_priv(dev);
13046 int err;
13047
3e0c95fd
MC
13048 pci_restore_state(tp->pdev);
13049
1da177e4
LT
13050 if (!netif_running(dev))
13051 return 0;
13052
bc1c7567 13053 err = tg3_set_power_state(tp, PCI_D0);
1da177e4
LT
13054 if (err)
13055 return err;
13056
13057 netif_device_attach(dev);
13058
f47c11ee 13059 tg3_full_lock(tp, 0);
1da177e4 13060
6a9eba15 13061 tp->tg3_flags |= TG3_FLAG_INIT_COMPLETE;
b9ec6c1b
MC
13062 err = tg3_restart_hw(tp, 1);
13063 if (err)
13064 goto out;
1da177e4
LT
13065
13066 tp->timer.expires = jiffies + tp->timer_offset;
13067 add_timer(&tp->timer);
13068
1da177e4
LT
13069 tg3_netif_start(tp);
13070
b9ec6c1b 13071out:
f47c11ee 13072 tg3_full_unlock(tp);
1da177e4 13073
b9ec6c1b 13074 return err;
1da177e4
LT
13075}
13076
13077static struct pci_driver tg3_driver = {
13078 .name = DRV_MODULE_NAME,
13079 .id_table = tg3_pci_tbl,
13080 .probe = tg3_init_one,
13081 .remove = __devexit_p(tg3_remove_one),
13082 .suspend = tg3_suspend,
13083 .resume = tg3_resume
13084};
13085
13086static int __init tg3_init(void)
13087{
29917620 13088 return pci_register_driver(&tg3_driver);
1da177e4
LT
13089}
13090
13091static void __exit tg3_cleanup(void)
13092{
13093 pci_unregister_driver(&tg3_driver);
13094}
13095
13096module_init(tg3_init);
13097module_exit(tg3_cleanup);