]> bbs.cooldavid.org Git - net-next-2.6.git/blame - drivers/net/tg3.c
[PATCH] ethtool: allow const ethtool_ops
[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.
7 * Copyright (C) 2005 Broadcom Corporation.
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>
43
44#include <asm/system.h>
45#include <asm/io.h>
46#include <asm/byteorder.h>
47#include <asm/uaccess.h>
48
49#ifdef CONFIG_SPARC64
50#include <asm/idprom.h>
51#include <asm/oplib.h>
52#include <asm/pbm.h>
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
61#ifdef NETIF_F_TSO
62#define TG3_TSO_SUPPORT 1
63#else
64#define TG3_TSO_SUPPORT 0
65#endif
66
67#include "tg3.h"
68
69#define DRV_MODULE_NAME "tg3"
70#define PFX DRV_MODULE_NAME ": "
1b2a7205
MC
71#define DRV_MODULE_VERSION "3.65"
72#define DRV_MODULE_RELDATE "August 07, 2006"
1da177e4
LT
73
74#define TG3_DEF_MAC_MODE 0
75#define TG3_DEF_RX_MODE 0
76#define TG3_DEF_TX_MODE 0
77#define TG3_DEF_MSG_ENABLE \
78 (NETIF_MSG_DRV | \
79 NETIF_MSG_PROBE | \
80 NETIF_MSG_LINK | \
81 NETIF_MSG_TIMER | \
82 NETIF_MSG_IFDOWN | \
83 NETIF_MSG_IFUP | \
84 NETIF_MSG_RX_ERR | \
85 NETIF_MSG_TX_ERR)
86
87/* length of time before we decide the hardware is borked,
88 * and dev->tx_timeout() should be called to fix the problem
89 */
90#define TG3_TX_TIMEOUT (5 * HZ)
91
92/* hardware minimum and maximum for a single frame's data payload */
93#define TG3_MIN_MTU 60
94#define TG3_MAX_MTU(tp) \
0f893dc6 95 ((tp->tg3_flags2 & TG3_FLG2_JUMBO_CAPABLE) ? 9000 : 1500)
1da177e4
LT
96
97/* These numbers seem to be hard coded in the NIC firmware somehow.
98 * You can't change the ring sizes, but you can change where you place
99 * them in the NIC onboard memory.
100 */
101#define TG3_RX_RING_SIZE 512
102#define TG3_DEF_RX_RING_PENDING 200
103#define TG3_RX_JUMBO_RING_SIZE 256
104#define TG3_DEF_RX_JUMBO_RING_PENDING 100
105
106/* Do not place this n-ring entries value into the tp struct itself,
107 * we really want to expose these constants to GCC so that modulo et
108 * al. operations are done with shifts and masks instead of with
109 * hw multiply/modulo instructions. Another solution would be to
110 * replace things like '% foo' with '& (foo - 1)'.
111 */
112#define TG3_RX_RCB_RING_SIZE(tp) \
113 ((tp->tg3_flags2 & TG3_FLG2_5705_PLUS) ? 512 : 1024)
114
115#define TG3_TX_RING_SIZE 512
116#define TG3_DEF_TX_RING_PENDING (TG3_TX_RING_SIZE - 1)
117
118#define TG3_RX_RING_BYTES (sizeof(struct tg3_rx_buffer_desc) * \
119 TG3_RX_RING_SIZE)
120#define TG3_RX_JUMBO_RING_BYTES (sizeof(struct tg3_rx_buffer_desc) * \
121 TG3_RX_JUMBO_RING_SIZE)
122#define TG3_RX_RCB_RING_BYTES(tp) (sizeof(struct tg3_rx_buffer_desc) * \
123 TG3_RX_RCB_RING_SIZE(tp))
124#define TG3_TX_RING_BYTES (sizeof(struct tg3_tx_buffer_desc) * \
125 TG3_TX_RING_SIZE)
1da177e4
LT
126#define NEXT_TX(N) (((N) + 1) & (TG3_TX_RING_SIZE - 1))
127
128#define RX_PKT_BUF_SZ (1536 + tp->rx_offset + 64)
129#define RX_JUMBO_PKT_BUF_SZ (9046 + tp->rx_offset + 64)
130
131/* minimum number of free TX descriptors required to wake up TX process */
132#define TG3_TX_WAKEUP_THRESH (TG3_TX_RING_SIZE / 4)
133
134/* number of ETHTOOL_GSTATS u64's */
135#define TG3_NUM_STATS (sizeof(struct tg3_ethtool_stats)/sizeof(u64))
136
4cafd3f5
MC
137#define TG3_NUM_TEST 6
138
1da177e4
LT
139static char version[] __devinitdata =
140 DRV_MODULE_NAME ".c:v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n";
141
142MODULE_AUTHOR("David S. Miller (davem@redhat.com) and Jeff Garzik (jgarzik@pobox.com)");
143MODULE_DESCRIPTION("Broadcom Tigon3 ethernet driver");
144MODULE_LICENSE("GPL");
145MODULE_VERSION(DRV_MODULE_VERSION);
146
147static int tg3_debug = -1; /* -1 == use TG3_DEF_MSG_ENABLE as value */
148module_param(tg3_debug, int, 0);
149MODULE_PARM_DESC(tg3_debug, "Tigon3 bitmapped debugging message enable value");
150
151static struct pci_device_id tg3_pci_tbl[] = {
152 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5700,
153 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
154 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5701,
155 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
156 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5702,
157 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
158 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5703,
159 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
160 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5704,
161 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
162 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5702FE,
163 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
164 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5705,
165 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
166 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5705_2,
167 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
168 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5705M,
169 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
170 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5705M_2,
171 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
172 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5702X,
173 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
174 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5703X,
175 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
176 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5704S,
177 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
178 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5702A3,
179 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
180 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5703A3,
181 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
182 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5782,
183 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
184 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5788,
185 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
186 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5789,
187 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
188 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5901,
189 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
190 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5901_2,
191 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
192 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5704S_2,
193 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
194 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5705F,
195 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
196 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5720,
197 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
198 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5721,
199 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
200 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5750,
201 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
202 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5751,
203 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
204 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5750M,
205 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
206 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5751M,
207 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
208 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5751F,
209 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
6e9017a7 210 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5752,
af2bcd97 211 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
d8659255
XVP
212 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5752M,
213 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
1da177e4
LT
214 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5753,
215 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
216 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5753M,
217 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
218 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5753F,
219 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
d9ab5ad1
MC
220 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5754,
221 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
222 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5754M,
223 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
af36e6b6
MC
224 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5755,
225 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
226 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5755M,
227 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
30b6c28d
MC
228 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5786,
229 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
d9ab5ad1
MC
230 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5787,
231 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
232 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5787M,
233 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
a4e2b347
MC
234 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5714,
235 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
d4d2c558
MC
236 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5714S,
237 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
a4e2b347
MC
238 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5715,
239 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
d4d2c558
MC
240 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5715S,
241 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
4cf78e4f
MC
242 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5780,
243 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
244 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5780S,
245 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
1da177e4
LT
246 { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5781,
247 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
248 { PCI_VENDOR_ID_SYSKONNECT, PCI_DEVICE_ID_SYSKONNECT_9DXX,
249 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
250 { PCI_VENDOR_ID_SYSKONNECT, PCI_DEVICE_ID_SYSKONNECT_9MXX,
251 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
252 { PCI_VENDOR_ID_ALTIMA, PCI_DEVICE_ID_ALTIMA_AC1000,
253 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
254 { PCI_VENDOR_ID_ALTIMA, PCI_DEVICE_ID_ALTIMA_AC1001,
255 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
256 { PCI_VENDOR_ID_ALTIMA, PCI_DEVICE_ID_ALTIMA_AC1003,
257 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
258 { PCI_VENDOR_ID_ALTIMA, PCI_DEVICE_ID_ALTIMA_AC9100,
259 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
260 { PCI_VENDOR_ID_APPLE, PCI_DEVICE_ID_APPLE_TIGON3,
261 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
262 { 0, }
263};
264
265MODULE_DEVICE_TABLE(pci, tg3_pci_tbl);
266
267static struct {
268 const char string[ETH_GSTRING_LEN];
269} ethtool_stats_keys[TG3_NUM_STATS] = {
270 { "rx_octets" },
271 { "rx_fragments" },
272 { "rx_ucast_packets" },
273 { "rx_mcast_packets" },
274 { "rx_bcast_packets" },
275 { "rx_fcs_errors" },
276 { "rx_align_errors" },
277 { "rx_xon_pause_rcvd" },
278 { "rx_xoff_pause_rcvd" },
279 { "rx_mac_ctrl_rcvd" },
280 { "rx_xoff_entered" },
281 { "rx_frame_too_long_errors" },
282 { "rx_jabbers" },
283 { "rx_undersize_packets" },
284 { "rx_in_length_errors" },
285 { "rx_out_length_errors" },
286 { "rx_64_or_less_octet_packets" },
287 { "rx_65_to_127_octet_packets" },
288 { "rx_128_to_255_octet_packets" },
289 { "rx_256_to_511_octet_packets" },
290 { "rx_512_to_1023_octet_packets" },
291 { "rx_1024_to_1522_octet_packets" },
292 { "rx_1523_to_2047_octet_packets" },
293 { "rx_2048_to_4095_octet_packets" },
294 { "rx_4096_to_8191_octet_packets" },
295 { "rx_8192_to_9022_octet_packets" },
296
297 { "tx_octets" },
298 { "tx_collisions" },
299
300 { "tx_xon_sent" },
301 { "tx_xoff_sent" },
302 { "tx_flow_control" },
303 { "tx_mac_errors" },
304 { "tx_single_collisions" },
305 { "tx_mult_collisions" },
306 { "tx_deferred" },
307 { "tx_excessive_collisions" },
308 { "tx_late_collisions" },
309 { "tx_collide_2times" },
310 { "tx_collide_3times" },
311 { "tx_collide_4times" },
312 { "tx_collide_5times" },
313 { "tx_collide_6times" },
314 { "tx_collide_7times" },
315 { "tx_collide_8times" },
316 { "tx_collide_9times" },
317 { "tx_collide_10times" },
318 { "tx_collide_11times" },
319 { "tx_collide_12times" },
320 { "tx_collide_13times" },
321 { "tx_collide_14times" },
322 { "tx_collide_15times" },
323 { "tx_ucast_packets" },
324 { "tx_mcast_packets" },
325 { "tx_bcast_packets" },
326 { "tx_carrier_sense_errors" },
327 { "tx_discards" },
328 { "tx_errors" },
329
330 { "dma_writeq_full" },
331 { "dma_write_prioq_full" },
332 { "rxbds_empty" },
333 { "rx_discards" },
334 { "rx_errors" },
335 { "rx_threshold_hit" },
336
337 { "dma_readq_full" },
338 { "dma_read_prioq_full" },
339 { "tx_comp_queue_full" },
340
341 { "ring_set_send_prod_index" },
342 { "ring_status_update" },
343 { "nic_irqs" },
344 { "nic_avoided_irqs" },
345 { "nic_tx_threshold_hit" }
346};
347
4cafd3f5
MC
348static struct {
349 const char string[ETH_GSTRING_LEN];
350} ethtool_test_keys[TG3_NUM_TEST] = {
351 { "nvram test (online) " },
352 { "link test (online) " },
353 { "register test (offline)" },
354 { "memory test (offline)" },
355 { "loopback test (offline)" },
356 { "interrupt test (offline)" },
357};
358
b401e9e2
MC
359static void tg3_write32(struct tg3 *tp, u32 off, u32 val)
360{
361 writel(val, tp->regs + off);
362}
363
364static u32 tg3_read32(struct tg3 *tp, u32 off)
365{
6aa20a22 366 return (readl(tp->regs + off));
b401e9e2
MC
367}
368
1da177e4
LT
369static void tg3_write_indirect_reg32(struct tg3 *tp, u32 off, u32 val)
370{
6892914f
MC
371 unsigned long flags;
372
373 spin_lock_irqsave(&tp->indirect_lock, flags);
1ee582d8
MC
374 pci_write_config_dword(tp->pdev, TG3PCI_REG_BASE_ADDR, off);
375 pci_write_config_dword(tp->pdev, TG3PCI_REG_DATA, val);
6892914f 376 spin_unlock_irqrestore(&tp->indirect_lock, flags);
1ee582d8
MC
377}
378
379static void tg3_write_flush_reg32(struct tg3 *tp, u32 off, u32 val)
380{
381 writel(val, tp->regs + off);
382 readl(tp->regs + off);
1da177e4
LT
383}
384
6892914f 385static u32 tg3_read_indirect_reg32(struct tg3 *tp, u32 off)
1da177e4 386{
6892914f
MC
387 unsigned long flags;
388 u32 val;
389
390 spin_lock_irqsave(&tp->indirect_lock, flags);
391 pci_write_config_dword(tp->pdev, TG3PCI_REG_BASE_ADDR, off);
392 pci_read_config_dword(tp->pdev, TG3PCI_REG_DATA, &val);
393 spin_unlock_irqrestore(&tp->indirect_lock, flags);
394 return val;
395}
396
397static void tg3_write_indirect_mbox(struct tg3 *tp, u32 off, u32 val)
398{
399 unsigned long flags;
400
401 if (off == (MAILBOX_RCVRET_CON_IDX_0 + TG3_64BIT_REG_LOW)) {
402 pci_write_config_dword(tp->pdev, TG3PCI_RCV_RET_RING_CON_IDX +
403 TG3_64BIT_REG_LOW, val);
404 return;
405 }
406 if (off == (MAILBOX_RCV_STD_PROD_IDX + TG3_64BIT_REG_LOW)) {
407 pci_write_config_dword(tp->pdev, TG3PCI_STD_RING_PROD_IDX +
408 TG3_64BIT_REG_LOW, val);
409 return;
1da177e4 410 }
6892914f
MC
411
412 spin_lock_irqsave(&tp->indirect_lock, flags);
413 pci_write_config_dword(tp->pdev, TG3PCI_REG_BASE_ADDR, off + 0x5600);
414 pci_write_config_dword(tp->pdev, TG3PCI_REG_DATA, val);
415 spin_unlock_irqrestore(&tp->indirect_lock, flags);
416
417 /* In indirect mode when disabling interrupts, we also need
418 * to clear the interrupt bit in the GRC local ctrl register.
419 */
420 if ((off == (MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW)) &&
421 (val == 0x1)) {
422 pci_write_config_dword(tp->pdev, TG3PCI_MISC_LOCAL_CTRL,
423 tp->grc_local_ctrl|GRC_LCLCTRL_CLEARINT);
424 }
425}
426
427static u32 tg3_read_indirect_mbox(struct tg3 *tp, u32 off)
428{
429 unsigned long flags;
430 u32 val;
431
432 spin_lock_irqsave(&tp->indirect_lock, flags);
433 pci_write_config_dword(tp->pdev, TG3PCI_REG_BASE_ADDR, off + 0x5600);
434 pci_read_config_dword(tp->pdev, TG3PCI_REG_DATA, &val);
435 spin_unlock_irqrestore(&tp->indirect_lock, flags);
436 return val;
437}
438
b401e9e2
MC
439/* usec_wait specifies the wait time in usec when writing to certain registers
440 * where it is unsafe to read back the register without some delay.
441 * GRC_LOCAL_CTRL is one example if the GPIOs are toggled to switch power.
442 * TG3PCI_CLOCK_CTRL is another example if the clock frequencies are changed.
443 */
444static void _tw32_flush(struct tg3 *tp, u32 off, u32 val, u32 usec_wait)
6892914f 445{
b401e9e2
MC
446 if ((tp->tg3_flags & TG3_FLAG_PCIX_TARGET_HWBUG) ||
447 (tp->tg3_flags2 & TG3_FLG2_ICH_WORKAROUND))
448 /* Non-posted methods */
449 tp->write32(tp, off, val);
450 else {
451 /* Posted method */
452 tg3_write32(tp, off, val);
453 if (usec_wait)
454 udelay(usec_wait);
455 tp->read32(tp, off);
456 }
457 /* Wait again after the read for the posted method to guarantee that
458 * the wait time is met.
459 */
460 if (usec_wait)
461 udelay(usec_wait);
1da177e4
LT
462}
463
09ee929c
MC
464static inline void tw32_mailbox_flush(struct tg3 *tp, u32 off, u32 val)
465{
466 tp->write32_mbox(tp, off, val);
6892914f
MC
467 if (!(tp->tg3_flags & TG3_FLAG_MBOX_WRITE_REORDER) &&
468 !(tp->tg3_flags2 & TG3_FLG2_ICH_WORKAROUND))
469 tp->read32_mbox(tp, off);
09ee929c
MC
470}
471
20094930 472static void tg3_write32_tx_mbox(struct tg3 *tp, u32 off, u32 val)
1da177e4
LT
473{
474 void __iomem *mbox = tp->regs + off;
475 writel(val, mbox);
476 if (tp->tg3_flags & TG3_FLAG_TXD_MBOX_HWBUG)
477 writel(val, mbox);
478 if (tp->tg3_flags & TG3_FLAG_MBOX_WRITE_REORDER)
479 readl(mbox);
480}
481
20094930 482#define tw32_mailbox(reg, val) tp->write32_mbox(tp, reg, val)
09ee929c 483#define tw32_mailbox_f(reg, val) tw32_mailbox_flush(tp, (reg), (val))
20094930
MC
484#define tw32_rx_mbox(reg, val) tp->write32_rx_mbox(tp, reg, val)
485#define tw32_tx_mbox(reg, val) tp->write32_tx_mbox(tp, reg, val)
09ee929c 486#define tr32_mailbox(reg) tp->read32_mbox(tp, reg)
20094930
MC
487
488#define tw32(reg,val) tp->write32(tp, reg, val)
b401e9e2
MC
489#define tw32_f(reg,val) _tw32_flush(tp,(reg),(val), 0)
490#define tw32_wait_f(reg,val,us) _tw32_flush(tp,(reg),(val), (us))
20094930 491#define tr32(reg) tp->read32(tp, reg)
1da177e4
LT
492
493static void tg3_write_mem(struct tg3 *tp, u32 off, u32 val)
494{
6892914f
MC
495 unsigned long flags;
496
497 spin_lock_irqsave(&tp->indirect_lock, flags);
bbadf503
MC
498 if (tp->tg3_flags & TG3_FLAG_SRAM_USE_CONFIG) {
499 pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_BASE_ADDR, off);
500 pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_DATA, val);
1da177e4 501
bbadf503
MC
502 /* Always leave this as zero. */
503 pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_BASE_ADDR, 0);
504 } else {
505 tw32_f(TG3PCI_MEM_WIN_BASE_ADDR, off);
506 tw32_f(TG3PCI_MEM_WIN_DATA, val);
28fbef78 507
bbadf503
MC
508 /* Always leave this as zero. */
509 tw32_f(TG3PCI_MEM_WIN_BASE_ADDR, 0);
510 }
511 spin_unlock_irqrestore(&tp->indirect_lock, flags);
758a6139
DM
512}
513
1da177e4
LT
514static void tg3_read_mem(struct tg3 *tp, u32 off, u32 *val)
515{
6892914f
MC
516 unsigned long flags;
517
518 spin_lock_irqsave(&tp->indirect_lock, flags);
bbadf503
MC
519 if (tp->tg3_flags & TG3_FLAG_SRAM_USE_CONFIG) {
520 pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_BASE_ADDR, off);
521 pci_read_config_dword(tp->pdev, TG3PCI_MEM_WIN_DATA, val);
1da177e4 522
bbadf503
MC
523 /* Always leave this as zero. */
524 pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_BASE_ADDR, 0);
525 } else {
526 tw32_f(TG3PCI_MEM_WIN_BASE_ADDR, off);
527 *val = tr32(TG3PCI_MEM_WIN_DATA);
528
529 /* Always leave this as zero. */
530 tw32_f(TG3PCI_MEM_WIN_BASE_ADDR, 0);
531 }
6892914f 532 spin_unlock_irqrestore(&tp->indirect_lock, flags);
1da177e4
LT
533}
534
535static void tg3_disable_ints(struct tg3 *tp)
536{
537 tw32(TG3PCI_MISC_HOST_CTRL,
538 (tp->misc_host_ctrl | MISC_HOST_CTRL_MASK_PCI_INT));
09ee929c 539 tw32_mailbox_f(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW, 0x00000001);
1da177e4
LT
540}
541
542static inline void tg3_cond_int(struct tg3 *tp)
543{
38f3843e
MC
544 if (!(tp->tg3_flags & TG3_FLAG_TAGGED_STATUS) &&
545 (tp->hw_status->status & SD_STATUS_UPDATED))
1da177e4
LT
546 tw32(GRC_LOCAL_CTRL, tp->grc_local_ctrl | GRC_LCLCTRL_SETINT);
547}
548
549static void tg3_enable_ints(struct tg3 *tp)
550{
bbe832c0
MC
551 tp->irq_sync = 0;
552 wmb();
553
1da177e4
LT
554 tw32(TG3PCI_MISC_HOST_CTRL,
555 (tp->misc_host_ctrl & ~MISC_HOST_CTRL_MASK_PCI_INT));
09ee929c
MC
556 tw32_mailbox_f(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW,
557 (tp->last_tag << 24));
fcfa0a32
MC
558 if (tp->tg3_flags2 & TG3_FLG2_1SHOT_MSI)
559 tw32_mailbox_f(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW,
560 (tp->last_tag << 24));
1da177e4
LT
561 tg3_cond_int(tp);
562}
563
04237ddd
MC
564static inline unsigned int tg3_has_work(struct tg3 *tp)
565{
566 struct tg3_hw_status *sblk = tp->hw_status;
567 unsigned int work_exists = 0;
568
569 /* check for phy events */
570 if (!(tp->tg3_flags &
571 (TG3_FLAG_USE_LINKCHG_REG |
572 TG3_FLAG_POLL_SERDES))) {
573 if (sblk->status & SD_STATUS_LINK_CHG)
574 work_exists = 1;
575 }
576 /* check for RX/TX work to do */
577 if (sblk->idx[0].tx_consumer != tp->tx_cons ||
578 sblk->idx[0].rx_producer != tp->rx_rcb_ptr)
579 work_exists = 1;
580
581 return work_exists;
582}
583
1da177e4 584/* tg3_restart_ints
04237ddd
MC
585 * similar to tg3_enable_ints, but it accurately determines whether there
586 * is new work pending and can return without flushing the PIO write
6aa20a22 587 * which reenables interrupts
1da177e4
LT
588 */
589static void tg3_restart_ints(struct tg3 *tp)
590{
fac9b83e
DM
591 tw32_mailbox(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW,
592 tp->last_tag << 24);
1da177e4
LT
593 mmiowb();
594
fac9b83e
DM
595 /* When doing tagged status, this work check is unnecessary.
596 * The last_tag we write above tells the chip which piece of
597 * work we've completed.
598 */
599 if (!(tp->tg3_flags & TG3_FLAG_TAGGED_STATUS) &&
600 tg3_has_work(tp))
04237ddd
MC
601 tw32(HOSTCC_MODE, tp->coalesce_mode |
602 (HOSTCC_MODE_ENABLE | HOSTCC_MODE_NOW));
1da177e4
LT
603}
604
605static inline void tg3_netif_stop(struct tg3 *tp)
606{
bbe832c0 607 tp->dev->trans_start = jiffies; /* prevent tx timeout */
1da177e4
LT
608 netif_poll_disable(tp->dev);
609 netif_tx_disable(tp->dev);
610}
611
612static inline void tg3_netif_start(struct tg3 *tp)
613{
614 netif_wake_queue(tp->dev);
615 /* NOTE: unconditional netif_wake_queue is only appropriate
616 * so long as all callers are assured to have free tx slots
617 * (such as after tg3_init_hw)
618 */
619 netif_poll_enable(tp->dev);
f47c11ee
DM
620 tp->hw_status->status |= SD_STATUS_UPDATED;
621 tg3_enable_ints(tp);
1da177e4
LT
622}
623
624static void tg3_switch_clocks(struct tg3 *tp)
625{
626 u32 clock_ctrl = tr32(TG3PCI_CLOCK_CTRL);
627 u32 orig_clock_ctrl;
628
a4e2b347 629 if (tp->tg3_flags2 & TG3_FLG2_5780_CLASS)
4cf78e4f
MC
630 return;
631
1da177e4
LT
632 orig_clock_ctrl = clock_ctrl;
633 clock_ctrl &= (CLOCK_CTRL_FORCE_CLKRUN |
634 CLOCK_CTRL_CLKRUN_OENABLE |
635 0x1f);
636 tp->pci_clock_ctrl = clock_ctrl;
637
638 if (tp->tg3_flags2 & TG3_FLG2_5705_PLUS) {
639 if (orig_clock_ctrl & CLOCK_CTRL_625_CORE) {
b401e9e2
MC
640 tw32_wait_f(TG3PCI_CLOCK_CTRL,
641 clock_ctrl | CLOCK_CTRL_625_CORE, 40);
1da177e4
LT
642 }
643 } else if ((orig_clock_ctrl & CLOCK_CTRL_44MHZ_CORE) != 0) {
b401e9e2
MC
644 tw32_wait_f(TG3PCI_CLOCK_CTRL,
645 clock_ctrl |
646 (CLOCK_CTRL_44MHZ_CORE | CLOCK_CTRL_ALTCLK),
647 40);
648 tw32_wait_f(TG3PCI_CLOCK_CTRL,
649 clock_ctrl | (CLOCK_CTRL_ALTCLK),
650 40);
1da177e4 651 }
b401e9e2 652 tw32_wait_f(TG3PCI_CLOCK_CTRL, clock_ctrl, 40);
1da177e4
LT
653}
654
655#define PHY_BUSY_LOOPS 5000
656
657static int tg3_readphy(struct tg3 *tp, int reg, u32 *val)
658{
659 u32 frame_val;
660 unsigned int loops;
661 int ret;
662
663 if ((tp->mi_mode & MAC_MI_MODE_AUTO_POLL) != 0) {
664 tw32_f(MAC_MI_MODE,
665 (tp->mi_mode & ~MAC_MI_MODE_AUTO_POLL));
666 udelay(80);
667 }
668
669 *val = 0x0;
670
671 frame_val = ((PHY_ADDR << MI_COM_PHY_ADDR_SHIFT) &
672 MI_COM_PHY_ADDR_MASK);
673 frame_val |= ((reg << MI_COM_REG_ADDR_SHIFT) &
674 MI_COM_REG_ADDR_MASK);
675 frame_val |= (MI_COM_CMD_READ | MI_COM_START);
6aa20a22 676
1da177e4
LT
677 tw32_f(MAC_MI_COM, frame_val);
678
679 loops = PHY_BUSY_LOOPS;
680 while (loops != 0) {
681 udelay(10);
682 frame_val = tr32(MAC_MI_COM);
683
684 if ((frame_val & MI_COM_BUSY) == 0) {
685 udelay(5);
686 frame_val = tr32(MAC_MI_COM);
687 break;
688 }
689 loops -= 1;
690 }
691
692 ret = -EBUSY;
693 if (loops != 0) {
694 *val = frame_val & MI_COM_DATA_MASK;
695 ret = 0;
696 }
697
698 if ((tp->mi_mode & MAC_MI_MODE_AUTO_POLL) != 0) {
699 tw32_f(MAC_MI_MODE, tp->mi_mode);
700 udelay(80);
701 }
702
703 return ret;
704}
705
706static int tg3_writephy(struct tg3 *tp, int reg, u32 val)
707{
708 u32 frame_val;
709 unsigned int loops;
710 int ret;
711
712 if ((tp->mi_mode & MAC_MI_MODE_AUTO_POLL) != 0) {
713 tw32_f(MAC_MI_MODE,
714 (tp->mi_mode & ~MAC_MI_MODE_AUTO_POLL));
715 udelay(80);
716 }
717
718 frame_val = ((PHY_ADDR << MI_COM_PHY_ADDR_SHIFT) &
719 MI_COM_PHY_ADDR_MASK);
720 frame_val |= ((reg << MI_COM_REG_ADDR_SHIFT) &
721 MI_COM_REG_ADDR_MASK);
722 frame_val |= (val & MI_COM_DATA_MASK);
723 frame_val |= (MI_COM_CMD_WRITE | MI_COM_START);
6aa20a22 724
1da177e4
LT
725 tw32_f(MAC_MI_COM, frame_val);
726
727 loops = PHY_BUSY_LOOPS;
728 while (loops != 0) {
729 udelay(10);
730 frame_val = tr32(MAC_MI_COM);
731 if ((frame_val & MI_COM_BUSY) == 0) {
732 udelay(5);
733 frame_val = tr32(MAC_MI_COM);
734 break;
735 }
736 loops -= 1;
737 }
738
739 ret = -EBUSY;
740 if (loops != 0)
741 ret = 0;
742
743 if ((tp->mi_mode & MAC_MI_MODE_AUTO_POLL) != 0) {
744 tw32_f(MAC_MI_MODE, tp->mi_mode);
745 udelay(80);
746 }
747
748 return ret;
749}
750
751static void tg3_phy_set_wirespeed(struct tg3 *tp)
752{
753 u32 val;
754
755 if (tp->tg3_flags2 & TG3_FLG2_NO_ETH_WIRE_SPEED)
756 return;
757
758 if (!tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x7007) &&
759 !tg3_readphy(tp, MII_TG3_AUX_CTRL, &val))
760 tg3_writephy(tp, MII_TG3_AUX_CTRL,
761 (val | (1 << 15) | (1 << 4)));
762}
763
764static int tg3_bmcr_reset(struct tg3 *tp)
765{
766 u32 phy_control;
767 int limit, err;
768
769 /* OK, reset it, and poll the BMCR_RESET bit until it
770 * clears or we time out.
771 */
772 phy_control = BMCR_RESET;
773 err = tg3_writephy(tp, MII_BMCR, phy_control);
774 if (err != 0)
775 return -EBUSY;
776
777 limit = 5000;
778 while (limit--) {
779 err = tg3_readphy(tp, MII_BMCR, &phy_control);
780 if (err != 0)
781 return -EBUSY;
782
783 if ((phy_control & BMCR_RESET) == 0) {
784 udelay(40);
785 break;
786 }
787 udelay(10);
788 }
789 if (limit <= 0)
790 return -EBUSY;
791
792 return 0;
793}
794
795static int tg3_wait_macro_done(struct tg3 *tp)
796{
797 int limit = 100;
798
799 while (limit--) {
800 u32 tmp32;
801
802 if (!tg3_readphy(tp, 0x16, &tmp32)) {
803 if ((tmp32 & 0x1000) == 0)
804 break;
805 }
806 }
807 if (limit <= 0)
808 return -EBUSY;
809
810 return 0;
811}
812
813static int tg3_phy_write_and_check_testpat(struct tg3 *tp, int *resetp)
814{
815 static const u32 test_pat[4][6] = {
816 { 0x00005555, 0x00000005, 0x00002aaa, 0x0000000a, 0x00003456, 0x00000003 },
817 { 0x00002aaa, 0x0000000a, 0x00003333, 0x00000003, 0x0000789a, 0x00000005 },
818 { 0x00005a5a, 0x00000005, 0x00002a6a, 0x0000000a, 0x00001bcd, 0x00000003 },
819 { 0x00002a5a, 0x0000000a, 0x000033c3, 0x00000003, 0x00002ef1, 0x00000005 }
820 };
821 int chan;
822
823 for (chan = 0; chan < 4; chan++) {
824 int i;
825
826 tg3_writephy(tp, MII_TG3_DSP_ADDRESS,
827 (chan * 0x2000) | 0x0200);
828 tg3_writephy(tp, 0x16, 0x0002);
829
830 for (i = 0; i < 6; i++)
831 tg3_writephy(tp, MII_TG3_DSP_RW_PORT,
832 test_pat[chan][i]);
833
834 tg3_writephy(tp, 0x16, 0x0202);
835 if (tg3_wait_macro_done(tp)) {
836 *resetp = 1;
837 return -EBUSY;
838 }
839
840 tg3_writephy(tp, MII_TG3_DSP_ADDRESS,
841 (chan * 0x2000) | 0x0200);
842 tg3_writephy(tp, 0x16, 0x0082);
843 if (tg3_wait_macro_done(tp)) {
844 *resetp = 1;
845 return -EBUSY;
846 }
847
848 tg3_writephy(tp, 0x16, 0x0802);
849 if (tg3_wait_macro_done(tp)) {
850 *resetp = 1;
851 return -EBUSY;
852 }
853
854 for (i = 0; i < 6; i += 2) {
855 u32 low, high;
856
857 if (tg3_readphy(tp, MII_TG3_DSP_RW_PORT, &low) ||
858 tg3_readphy(tp, MII_TG3_DSP_RW_PORT, &high) ||
859 tg3_wait_macro_done(tp)) {
860 *resetp = 1;
861 return -EBUSY;
862 }
863 low &= 0x7fff;
864 high &= 0x000f;
865 if (low != test_pat[chan][i] ||
866 high != test_pat[chan][i+1]) {
867 tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x000b);
868 tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x4001);
869 tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x4005);
870
871 return -EBUSY;
872 }
873 }
874 }
875
876 return 0;
877}
878
879static int tg3_phy_reset_chanpat(struct tg3 *tp)
880{
881 int chan;
882
883 for (chan = 0; chan < 4; chan++) {
884 int i;
885
886 tg3_writephy(tp, MII_TG3_DSP_ADDRESS,
887 (chan * 0x2000) | 0x0200);
888 tg3_writephy(tp, 0x16, 0x0002);
889 for (i = 0; i < 6; i++)
890 tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x000);
891 tg3_writephy(tp, 0x16, 0x0202);
892 if (tg3_wait_macro_done(tp))
893 return -EBUSY;
894 }
895
896 return 0;
897}
898
899static int tg3_phy_reset_5703_4_5(struct tg3 *tp)
900{
901 u32 reg32, phy9_orig;
902 int retries, do_phy_reset, err;
903
904 retries = 10;
905 do_phy_reset = 1;
906 do {
907 if (do_phy_reset) {
908 err = tg3_bmcr_reset(tp);
909 if (err)
910 return err;
911 do_phy_reset = 0;
912 }
913
914 /* Disable transmitter and interrupt. */
915 if (tg3_readphy(tp, MII_TG3_EXT_CTRL, &reg32))
916 continue;
917
918 reg32 |= 0x3000;
919 tg3_writephy(tp, MII_TG3_EXT_CTRL, reg32);
920
921 /* Set full-duplex, 1000 mbps. */
922 tg3_writephy(tp, MII_BMCR,
923 BMCR_FULLDPLX | TG3_BMCR_SPEED1000);
924
925 /* Set to master mode. */
926 if (tg3_readphy(tp, MII_TG3_CTRL, &phy9_orig))
927 continue;
928
929 tg3_writephy(tp, MII_TG3_CTRL,
930 (MII_TG3_CTRL_AS_MASTER |
931 MII_TG3_CTRL_ENABLE_AS_MASTER));
932
933 /* Enable SM_DSP_CLOCK and 6dB. */
934 tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x0c00);
935
936 /* Block the PHY control access. */
937 tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x8005);
938 tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x0800);
939
940 err = tg3_phy_write_and_check_testpat(tp, &do_phy_reset);
941 if (!err)
942 break;
943 } while (--retries);
944
945 err = tg3_phy_reset_chanpat(tp);
946 if (err)
947 return err;
948
949 tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x8005);
950 tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x0000);
951
952 tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x8200);
953 tg3_writephy(tp, 0x16, 0x0000);
954
955 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703 ||
956 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704) {
957 /* Set Extended packet length bit for jumbo frames */
958 tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x4400);
959 }
960 else {
961 tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x0400);
962 }
963
964 tg3_writephy(tp, MII_TG3_CTRL, phy9_orig);
965
966 if (!tg3_readphy(tp, MII_TG3_EXT_CTRL, &reg32)) {
967 reg32 &= ~0x3000;
968 tg3_writephy(tp, MII_TG3_EXT_CTRL, reg32);
969 } else if (!err)
970 err = -EBUSY;
971
972 return err;
973}
974
c8e1e82b
MC
975static void tg3_link_report(struct tg3 *);
976
1da177e4
LT
977/* This will reset the tigon3 PHY if there is no valid
978 * link unless the FORCE argument is non-zero.
979 */
980static int tg3_phy_reset(struct tg3 *tp)
981{
982 u32 phy_status;
983 int err;
984
985 err = tg3_readphy(tp, MII_BMSR, &phy_status);
986 err |= tg3_readphy(tp, MII_BMSR, &phy_status);
987 if (err != 0)
988 return -EBUSY;
989
c8e1e82b
MC
990 if (netif_running(tp->dev) && netif_carrier_ok(tp->dev)) {
991 netif_carrier_off(tp->dev);
992 tg3_link_report(tp);
993 }
994
1da177e4
LT
995 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703 ||
996 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704 ||
997 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) {
998 err = tg3_phy_reset_5703_4_5(tp);
999 if (err)
1000 return err;
1001 goto out;
1002 }
1003
1004 err = tg3_bmcr_reset(tp);
1005 if (err)
1006 return err;
1007
1008out:
1009 if (tp->tg3_flags2 & TG3_FLG2_PHY_ADC_BUG) {
1010 tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x0c00);
1011 tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x201f);
1012 tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x2aaa);
1013 tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x000a);
1014 tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x0323);
1015 tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x0400);
1016 }
1017 if (tp->tg3_flags2 & TG3_FLG2_PHY_5704_A0_BUG) {
1018 tg3_writephy(tp, 0x1c, 0x8d68);
1019 tg3_writephy(tp, 0x1c, 0x8d68);
1020 }
1021 if (tp->tg3_flags2 & TG3_FLG2_PHY_BER_BUG) {
1022 tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x0c00);
1023 tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x000a);
1024 tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x310b);
1025 tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x201f);
1026 tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x9506);
1027 tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x401f);
1028 tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x14e2);
1029 tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x0400);
1030 }
c424cb24
MC
1031 else if (tp->tg3_flags2 & TG3_FLG2_PHY_JITTER_BUG) {
1032 tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x0c00);
1033 tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x000a);
1034 tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x010b);
1035 tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x0400);
1036 }
1da177e4
LT
1037 /* Set Extended packet length bit (bit 14) on all chips that */
1038 /* support jumbo frames */
1039 if ((tp->phy_id & PHY_ID_MASK) == PHY_ID_BCM5401) {
1040 /* Cannot do read-modify-write on 5401 */
1041 tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x4c20);
0f893dc6 1042 } else if (tp->tg3_flags2 & TG3_FLG2_JUMBO_CAPABLE) {
1da177e4
LT
1043 u32 phy_reg;
1044
1045 /* Set bit 14 with read-modify-write to preserve other bits */
1046 if (!tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x0007) &&
1047 !tg3_readphy(tp, MII_TG3_AUX_CTRL, &phy_reg))
1048 tg3_writephy(tp, MII_TG3_AUX_CTRL, phy_reg | 0x4000);
1049 }
1050
1051 /* Set phy register 0x10 bit 0 to high fifo elasticity to support
1052 * jumbo frames transmission.
1053 */
0f893dc6 1054 if (tp->tg3_flags2 & TG3_FLG2_JUMBO_CAPABLE) {
1da177e4
LT
1055 u32 phy_reg;
1056
1057 if (!tg3_readphy(tp, MII_TG3_EXT_CTRL, &phy_reg))
1058 tg3_writephy(tp, MII_TG3_EXT_CTRL,
1059 phy_reg | MII_TG3_EXT_CTRL_FIFO_ELASTIC);
1060 }
1061
1062 tg3_phy_set_wirespeed(tp);
1063 return 0;
1064}
1065
1066static void tg3_frob_aux_power(struct tg3 *tp)
1067{
1068 struct tg3 *tp_peer = tp;
1069
1070 if ((tp->tg3_flags & TG3_FLAG_EEPROM_WRITE_PROT) != 0)
1071 return;
1072
8c2dc7e1
MC
1073 if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704) ||
1074 (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5714)) {
1075 struct net_device *dev_peer;
1076
1077 dev_peer = pci_get_drvdata(tp->pdev_peer);
bc1c7567 1078 /* remove_one() may have been run on the peer. */
8c2dc7e1 1079 if (!dev_peer)
bc1c7567
MC
1080 tp_peer = tp;
1081 else
1082 tp_peer = netdev_priv(dev_peer);
1da177e4
LT
1083 }
1084
1da177e4 1085 if ((tp->tg3_flags & TG3_FLAG_WOL_ENABLE) != 0 ||
6921d201
MC
1086 (tp->tg3_flags & TG3_FLAG_ENABLE_ASF) != 0 ||
1087 (tp_peer->tg3_flags & TG3_FLAG_WOL_ENABLE) != 0 ||
1088 (tp_peer->tg3_flags & TG3_FLAG_ENABLE_ASF) != 0) {
1da177e4
LT
1089 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 ||
1090 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701) {
b401e9e2
MC
1091 tw32_wait_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl |
1092 (GRC_LCLCTRL_GPIO_OE0 |
1093 GRC_LCLCTRL_GPIO_OE1 |
1094 GRC_LCLCTRL_GPIO_OE2 |
1095 GRC_LCLCTRL_GPIO_OUTPUT0 |
1096 GRC_LCLCTRL_GPIO_OUTPUT1),
1097 100);
1da177e4
LT
1098 } else {
1099 u32 no_gpio2;
dc56b7d4 1100 u32 grc_local_ctrl = 0;
1da177e4
LT
1101
1102 if (tp_peer != tp &&
1103 (tp_peer->tg3_flags & TG3_FLAG_INIT_COMPLETE) != 0)
1104 return;
1105
dc56b7d4
MC
1106 /* Workaround to prevent overdrawing Amps. */
1107 if (GET_ASIC_REV(tp->pci_chip_rev_id) ==
1108 ASIC_REV_5714) {
1109 grc_local_ctrl |= GRC_LCLCTRL_GPIO_OE3;
b401e9e2
MC
1110 tw32_wait_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl |
1111 grc_local_ctrl, 100);
dc56b7d4
MC
1112 }
1113
1da177e4
LT
1114 /* On 5753 and variants, GPIO2 cannot be used. */
1115 no_gpio2 = tp->nic_sram_data_cfg &
1116 NIC_SRAM_DATA_CFG_NO_GPIO2;
1117
dc56b7d4 1118 grc_local_ctrl |= GRC_LCLCTRL_GPIO_OE0 |
1da177e4
LT
1119 GRC_LCLCTRL_GPIO_OE1 |
1120 GRC_LCLCTRL_GPIO_OE2 |
1121 GRC_LCLCTRL_GPIO_OUTPUT1 |
1122 GRC_LCLCTRL_GPIO_OUTPUT2;
1123 if (no_gpio2) {
1124 grc_local_ctrl &= ~(GRC_LCLCTRL_GPIO_OE2 |
1125 GRC_LCLCTRL_GPIO_OUTPUT2);
1126 }
b401e9e2
MC
1127 tw32_wait_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl |
1128 grc_local_ctrl, 100);
1da177e4
LT
1129
1130 grc_local_ctrl |= GRC_LCLCTRL_GPIO_OUTPUT0;
1131
b401e9e2
MC
1132 tw32_wait_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl |
1133 grc_local_ctrl, 100);
1da177e4
LT
1134
1135 if (!no_gpio2) {
1136 grc_local_ctrl &= ~GRC_LCLCTRL_GPIO_OUTPUT2;
b401e9e2
MC
1137 tw32_wait_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl |
1138 grc_local_ctrl, 100);
1da177e4
LT
1139 }
1140 }
1141 } else {
1142 if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5700 &&
1143 GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5701) {
1144 if (tp_peer != tp &&
1145 (tp_peer->tg3_flags & TG3_FLAG_INIT_COMPLETE) != 0)
1146 return;
1147
b401e9e2
MC
1148 tw32_wait_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl |
1149 (GRC_LCLCTRL_GPIO_OE1 |
1150 GRC_LCLCTRL_GPIO_OUTPUT1), 100);
1da177e4 1151
b401e9e2
MC
1152 tw32_wait_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl |
1153 GRC_LCLCTRL_GPIO_OE1, 100);
1da177e4 1154
b401e9e2
MC
1155 tw32_wait_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl |
1156 (GRC_LCLCTRL_GPIO_OE1 |
1157 GRC_LCLCTRL_GPIO_OUTPUT1), 100);
1da177e4
LT
1158 }
1159 }
1160}
1161
1162static int tg3_setup_phy(struct tg3 *, int);
1163
1164#define RESET_KIND_SHUTDOWN 0
1165#define RESET_KIND_INIT 1
1166#define RESET_KIND_SUSPEND 2
1167
1168static void tg3_write_sig_post_reset(struct tg3 *, int);
1169static int tg3_halt_cpu(struct tg3 *, u32);
6921d201
MC
1170static int tg3_nvram_lock(struct tg3 *);
1171static void tg3_nvram_unlock(struct tg3 *);
1da177e4 1172
15c3b696
MC
1173static void tg3_power_down_phy(struct tg3 *tp)
1174{
1175 /* The PHY should not be powered down on some chips because
1176 * of bugs.
1177 */
1178 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 ||
1179 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704 ||
1180 (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5780 &&
1181 (tp->tg3_flags2 & TG3_FLG2_MII_SERDES)))
1182 return;
1183 tg3_writephy(tp, MII_BMCR, BMCR_PDOWN);
1184}
1185
bc1c7567 1186static int tg3_set_power_state(struct tg3 *tp, pci_power_t state)
1da177e4
LT
1187{
1188 u32 misc_host_ctrl;
1189 u16 power_control, power_caps;
1190 int pm = tp->pm_cap;
1191
1192 /* Make sure register accesses (indirect or otherwise)
1193 * will function correctly.
1194 */
1195 pci_write_config_dword(tp->pdev,
1196 TG3PCI_MISC_HOST_CTRL,
1197 tp->misc_host_ctrl);
1198
1199 pci_read_config_word(tp->pdev,
1200 pm + PCI_PM_CTRL,
1201 &power_control);
1202 power_control |= PCI_PM_CTRL_PME_STATUS;
1203 power_control &= ~(PCI_PM_CTRL_STATE_MASK);
1204 switch (state) {
bc1c7567 1205 case PCI_D0:
1da177e4
LT
1206 power_control |= 0;
1207 pci_write_config_word(tp->pdev,
1208 pm + PCI_PM_CTRL,
1209 power_control);
8c6bda1a
MC
1210 udelay(100); /* Delay after power state change */
1211
1212 /* Switch out of Vaux if it is not a LOM */
b401e9e2
MC
1213 if (!(tp->tg3_flags & TG3_FLAG_EEPROM_WRITE_PROT))
1214 tw32_wait_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl, 100);
1da177e4
LT
1215
1216 return 0;
1217
bc1c7567 1218 case PCI_D1:
1da177e4
LT
1219 power_control |= 1;
1220 break;
1221
bc1c7567 1222 case PCI_D2:
1da177e4
LT
1223 power_control |= 2;
1224 break;
1225
bc1c7567 1226 case PCI_D3hot:
1da177e4
LT
1227 power_control |= 3;
1228 break;
1229
1230 default:
1231 printk(KERN_WARNING PFX "%s: Invalid power state (%d) "
1232 "requested.\n",
1233 tp->dev->name, state);
1234 return -EINVAL;
1235 };
1236
1237 power_control |= PCI_PM_CTRL_PME_ENABLE;
1238
1239 misc_host_ctrl = tr32(TG3PCI_MISC_HOST_CTRL);
1240 tw32(TG3PCI_MISC_HOST_CTRL,
1241 misc_host_ctrl | MISC_HOST_CTRL_MASK_PCI_INT);
1242
1243 if (tp->link_config.phy_is_low_power == 0) {
1244 tp->link_config.phy_is_low_power = 1;
1245 tp->link_config.orig_speed = tp->link_config.speed;
1246 tp->link_config.orig_duplex = tp->link_config.duplex;
1247 tp->link_config.orig_autoneg = tp->link_config.autoneg;
1248 }
1249
747e8f8b 1250 if (!(tp->tg3_flags2 & TG3_FLG2_ANY_SERDES)) {
1da177e4
LT
1251 tp->link_config.speed = SPEED_10;
1252 tp->link_config.duplex = DUPLEX_HALF;
1253 tp->link_config.autoneg = AUTONEG_ENABLE;
1254 tg3_setup_phy(tp, 0);
1255 }
1256
6921d201
MC
1257 if (!(tp->tg3_flags & TG3_FLAG_ENABLE_ASF)) {
1258 int i;
1259 u32 val;
1260
1261 for (i = 0; i < 200; i++) {
1262 tg3_read_mem(tp, NIC_SRAM_FW_ASF_STATUS_MBOX, &val);
1263 if (val == ~NIC_SRAM_FIRMWARE_MBOX_MAGIC1)
1264 break;
1265 msleep(1);
1266 }
1267 }
1268 tg3_write_mem(tp, NIC_SRAM_WOL_MBOX, WOL_SIGNATURE |
1269 WOL_DRV_STATE_SHUTDOWN |
1270 WOL_DRV_WOL | WOL_SET_MAGIC_PKT);
1271
1da177e4
LT
1272 pci_read_config_word(tp->pdev, pm + PCI_PM_PMC, &power_caps);
1273
1274 if (tp->tg3_flags & TG3_FLAG_WOL_ENABLE) {
1275 u32 mac_mode;
1276
1277 if (!(tp->tg3_flags2 & TG3_FLG2_PHY_SERDES)) {
1278 tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x5a);
1279 udelay(40);
1280
1281 mac_mode = MAC_MODE_PORT_MODE_MII;
1282
1283 if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5700 ||
1284 !(tp->tg3_flags & TG3_FLAG_WOL_SPEED_100MB))
1285 mac_mode |= MAC_MODE_LINK_POLARITY;
1286 } else {
1287 mac_mode = MAC_MODE_PORT_MODE_TBI;
1288 }
1289
cbf46853 1290 if (!(tp->tg3_flags2 & TG3_FLG2_5750_PLUS))
1da177e4
LT
1291 tw32(MAC_LED_CTRL, tp->led_ctrl);
1292
1293 if (((power_caps & PCI_PM_CAP_PME_D3cold) &&
1294 (tp->tg3_flags & TG3_FLAG_WOL_ENABLE)))
1295 mac_mode |= MAC_MODE_MAGIC_PKT_ENABLE;
1296
1297 tw32_f(MAC_MODE, mac_mode);
1298 udelay(100);
1299
1300 tw32_f(MAC_RX_MODE, RX_MODE_ENABLE);
1301 udelay(10);
1302 }
1303
1304 if (!(tp->tg3_flags & TG3_FLAG_WOL_SPEED_100MB) &&
1305 (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 ||
1306 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701)) {
1307 u32 base_val;
1308
1309 base_val = tp->pci_clock_ctrl;
1310 base_val |= (CLOCK_CTRL_RXCLK_DISABLE |
1311 CLOCK_CTRL_TXCLK_DISABLE);
1312
b401e9e2
MC
1313 tw32_wait_f(TG3PCI_CLOCK_CTRL, base_val | CLOCK_CTRL_ALTCLK |
1314 CLOCK_CTRL_PWRDOWN_PLL133, 40);
a4e2b347 1315 } else if (tp->tg3_flags2 & TG3_FLG2_5780_CLASS) {
4cf78e4f 1316 /* do nothing */
85e94ced 1317 } else if (!((tp->tg3_flags2 & TG3_FLG2_5750_PLUS) &&
1da177e4
LT
1318 (tp->tg3_flags & TG3_FLAG_ENABLE_ASF))) {
1319 u32 newbits1, newbits2;
1320
1321 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 ||
1322 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701) {
1323 newbits1 = (CLOCK_CTRL_RXCLK_DISABLE |
1324 CLOCK_CTRL_TXCLK_DISABLE |
1325 CLOCK_CTRL_ALTCLK);
1326 newbits2 = newbits1 | CLOCK_CTRL_44MHZ_CORE;
1327 } else if (tp->tg3_flags2 & TG3_FLG2_5705_PLUS) {
1328 newbits1 = CLOCK_CTRL_625_CORE;
1329 newbits2 = newbits1 | CLOCK_CTRL_ALTCLK;
1330 } else {
1331 newbits1 = CLOCK_CTRL_ALTCLK;
1332 newbits2 = newbits1 | CLOCK_CTRL_44MHZ_CORE;
1333 }
1334
b401e9e2
MC
1335 tw32_wait_f(TG3PCI_CLOCK_CTRL, tp->pci_clock_ctrl | newbits1,
1336 40);
1da177e4 1337
b401e9e2
MC
1338 tw32_wait_f(TG3PCI_CLOCK_CTRL, tp->pci_clock_ctrl | newbits2,
1339 40);
1da177e4
LT
1340
1341 if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS)) {
1342 u32 newbits3;
1343
1344 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 ||
1345 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701) {
1346 newbits3 = (CLOCK_CTRL_RXCLK_DISABLE |
1347 CLOCK_CTRL_TXCLK_DISABLE |
1348 CLOCK_CTRL_44MHZ_CORE);
1349 } else {
1350 newbits3 = CLOCK_CTRL_44MHZ_CORE;
1351 }
1352
b401e9e2
MC
1353 tw32_wait_f(TG3PCI_CLOCK_CTRL,
1354 tp->pci_clock_ctrl | newbits3, 40);
1da177e4
LT
1355 }
1356 }
1357
6921d201
MC
1358 if (!(tp->tg3_flags & TG3_FLAG_WOL_ENABLE) &&
1359 !(tp->tg3_flags & TG3_FLAG_ENABLE_ASF)) {
1360 /* Turn off the PHY */
1361 if (!(tp->tg3_flags2 & TG3_FLG2_PHY_SERDES)) {
1362 tg3_writephy(tp, MII_TG3_EXT_CTRL,
1363 MII_TG3_EXT_CTRL_FORCE_LED_OFF);
1364 tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x01b2);
15c3b696 1365 tg3_power_down_phy(tp);
6921d201
MC
1366 }
1367 }
1368
1da177e4
LT
1369 tg3_frob_aux_power(tp);
1370
1371 /* Workaround for unstable PLL clock */
1372 if ((GET_CHIP_REV(tp->pci_chip_rev_id) == CHIPREV_5750_AX) ||
1373 (GET_CHIP_REV(tp->pci_chip_rev_id) == CHIPREV_5750_BX)) {
1374 u32 val = tr32(0x7d00);
1375
1376 val &= ~((1 << 16) | (1 << 4) | (1 << 2) | (1 << 1) | 1);
1377 tw32(0x7d00, val);
6921d201 1378 if (!(tp->tg3_flags & TG3_FLAG_ENABLE_ASF)) {
ec41c7df
MC
1379 int err;
1380
1381 err = tg3_nvram_lock(tp);
1da177e4 1382 tg3_halt_cpu(tp, RX_CPU_BASE);
ec41c7df
MC
1383 if (!err)
1384 tg3_nvram_unlock(tp);
6921d201 1385 }
1da177e4
LT
1386 }
1387
bbadf503
MC
1388 tg3_write_sig_post_reset(tp, RESET_KIND_SHUTDOWN);
1389
1da177e4
LT
1390 /* Finally, set the new power state. */
1391 pci_write_config_word(tp->pdev, pm + PCI_PM_CTRL, power_control);
8c6bda1a 1392 udelay(100); /* Delay after power state change */
1da177e4 1393
1da177e4
LT
1394 return 0;
1395}
1396
1397static void tg3_link_report(struct tg3 *tp)
1398{
1399 if (!netif_carrier_ok(tp->dev)) {
1400 printk(KERN_INFO PFX "%s: Link is down.\n", tp->dev->name);
1401 } else {
1402 printk(KERN_INFO PFX "%s: Link is up at %d Mbps, %s duplex.\n",
1403 tp->dev->name,
1404 (tp->link_config.active_speed == SPEED_1000 ?
1405 1000 :
1406 (tp->link_config.active_speed == SPEED_100 ?
1407 100 : 10)),
1408 (tp->link_config.active_duplex == DUPLEX_FULL ?
1409 "full" : "half"));
1410
1411 printk(KERN_INFO PFX "%s: Flow control is %s for TX and "
1412 "%s for RX.\n",
1413 tp->dev->name,
1414 (tp->tg3_flags & TG3_FLAG_TX_PAUSE) ? "on" : "off",
1415 (tp->tg3_flags & TG3_FLAG_RX_PAUSE) ? "on" : "off");
1416 }
1417}
1418
1419static void tg3_setup_flow_control(struct tg3 *tp, u32 local_adv, u32 remote_adv)
1420{
1421 u32 new_tg3_flags = 0;
1422 u32 old_rx_mode = tp->rx_mode;
1423 u32 old_tx_mode = tp->tx_mode;
1424
1425 if (tp->tg3_flags & TG3_FLAG_PAUSE_AUTONEG) {
747e8f8b
MC
1426
1427 /* Convert 1000BaseX flow control bits to 1000BaseT
1428 * bits before resolving flow control.
1429 */
1430 if (tp->tg3_flags2 & TG3_FLG2_MII_SERDES) {
1431 local_adv &= ~(ADVERTISE_PAUSE_CAP |
1432 ADVERTISE_PAUSE_ASYM);
1433 remote_adv &= ~(LPA_PAUSE_CAP | LPA_PAUSE_ASYM);
1434
1435 if (local_adv & ADVERTISE_1000XPAUSE)
1436 local_adv |= ADVERTISE_PAUSE_CAP;
1437 if (local_adv & ADVERTISE_1000XPSE_ASYM)
1438 local_adv |= ADVERTISE_PAUSE_ASYM;
1439 if (remote_adv & LPA_1000XPAUSE)
1440 remote_adv |= LPA_PAUSE_CAP;
1441 if (remote_adv & LPA_1000XPAUSE_ASYM)
1442 remote_adv |= LPA_PAUSE_ASYM;
1443 }
1444
1da177e4
LT
1445 if (local_adv & ADVERTISE_PAUSE_CAP) {
1446 if (local_adv & ADVERTISE_PAUSE_ASYM) {
1447 if (remote_adv & LPA_PAUSE_CAP)
1448 new_tg3_flags |=
1449 (TG3_FLAG_RX_PAUSE |
1450 TG3_FLAG_TX_PAUSE);
1451 else if (remote_adv & LPA_PAUSE_ASYM)
1452 new_tg3_flags |=
1453 (TG3_FLAG_RX_PAUSE);
1454 } else {
1455 if (remote_adv & LPA_PAUSE_CAP)
1456 new_tg3_flags |=
1457 (TG3_FLAG_RX_PAUSE |
1458 TG3_FLAG_TX_PAUSE);
1459 }
1460 } else if (local_adv & ADVERTISE_PAUSE_ASYM) {
1461 if ((remote_adv & LPA_PAUSE_CAP) &&
1462 (remote_adv & LPA_PAUSE_ASYM))
1463 new_tg3_flags |= TG3_FLAG_TX_PAUSE;
1464 }
1465
1466 tp->tg3_flags &= ~(TG3_FLAG_RX_PAUSE | TG3_FLAG_TX_PAUSE);
1467 tp->tg3_flags |= new_tg3_flags;
1468 } else {
1469 new_tg3_flags = tp->tg3_flags;
1470 }
1471
1472 if (new_tg3_flags & TG3_FLAG_RX_PAUSE)
1473 tp->rx_mode |= RX_MODE_FLOW_CTRL_ENABLE;
1474 else
1475 tp->rx_mode &= ~RX_MODE_FLOW_CTRL_ENABLE;
1476
1477 if (old_rx_mode != tp->rx_mode) {
1478 tw32_f(MAC_RX_MODE, tp->rx_mode);
1479 }
6aa20a22 1480
1da177e4
LT
1481 if (new_tg3_flags & TG3_FLAG_TX_PAUSE)
1482 tp->tx_mode |= TX_MODE_FLOW_CTRL_ENABLE;
1483 else
1484 tp->tx_mode &= ~TX_MODE_FLOW_CTRL_ENABLE;
1485
1486 if (old_tx_mode != tp->tx_mode) {
1487 tw32_f(MAC_TX_MODE, tp->tx_mode);
1488 }
1489}
1490
1491static void tg3_aux_stat_to_speed_duplex(struct tg3 *tp, u32 val, u16 *speed, u8 *duplex)
1492{
1493 switch (val & MII_TG3_AUX_STAT_SPDMASK) {
1494 case MII_TG3_AUX_STAT_10HALF:
1495 *speed = SPEED_10;
1496 *duplex = DUPLEX_HALF;
1497 break;
1498
1499 case MII_TG3_AUX_STAT_10FULL:
1500 *speed = SPEED_10;
1501 *duplex = DUPLEX_FULL;
1502 break;
1503
1504 case MII_TG3_AUX_STAT_100HALF:
1505 *speed = SPEED_100;
1506 *duplex = DUPLEX_HALF;
1507 break;
1508
1509 case MII_TG3_AUX_STAT_100FULL:
1510 *speed = SPEED_100;
1511 *duplex = DUPLEX_FULL;
1512 break;
1513
1514 case MII_TG3_AUX_STAT_1000HALF:
1515 *speed = SPEED_1000;
1516 *duplex = DUPLEX_HALF;
1517 break;
1518
1519 case MII_TG3_AUX_STAT_1000FULL:
1520 *speed = SPEED_1000;
1521 *duplex = DUPLEX_FULL;
1522 break;
1523
1524 default:
1525 *speed = SPEED_INVALID;
1526 *duplex = DUPLEX_INVALID;
1527 break;
1528 };
1529}
1530
1531static void tg3_phy_copper_begin(struct tg3 *tp)
1532{
1533 u32 new_adv;
1534 int i;
1535
1536 if (tp->link_config.phy_is_low_power) {
1537 /* Entering low power mode. Disable gigabit and
1538 * 100baseT advertisements.
1539 */
1540 tg3_writephy(tp, MII_TG3_CTRL, 0);
1541
1542 new_adv = (ADVERTISE_10HALF | ADVERTISE_10FULL |
1543 ADVERTISE_CSMA | ADVERTISE_PAUSE_CAP);
1544 if (tp->tg3_flags & TG3_FLAG_WOL_SPEED_100MB)
1545 new_adv |= (ADVERTISE_100HALF | ADVERTISE_100FULL);
1546
1547 tg3_writephy(tp, MII_ADVERTISE, new_adv);
1548 } else if (tp->link_config.speed == SPEED_INVALID) {
1549 tp->link_config.advertising =
1550 (ADVERTISED_10baseT_Half | ADVERTISED_10baseT_Full |
1551 ADVERTISED_100baseT_Half | ADVERTISED_100baseT_Full |
1552 ADVERTISED_1000baseT_Half | ADVERTISED_1000baseT_Full |
1553 ADVERTISED_Autoneg | ADVERTISED_MII);
1554
1555 if (tp->tg3_flags & TG3_FLAG_10_100_ONLY)
1556 tp->link_config.advertising &=
1557 ~(ADVERTISED_1000baseT_Half |
1558 ADVERTISED_1000baseT_Full);
1559
1560 new_adv = (ADVERTISE_CSMA | ADVERTISE_PAUSE_CAP);
1561 if (tp->link_config.advertising & ADVERTISED_10baseT_Half)
1562 new_adv |= ADVERTISE_10HALF;
1563 if (tp->link_config.advertising & ADVERTISED_10baseT_Full)
1564 new_adv |= ADVERTISE_10FULL;
1565 if (tp->link_config.advertising & ADVERTISED_100baseT_Half)
1566 new_adv |= ADVERTISE_100HALF;
1567 if (tp->link_config.advertising & ADVERTISED_100baseT_Full)
1568 new_adv |= ADVERTISE_100FULL;
1569 tg3_writephy(tp, MII_ADVERTISE, new_adv);
1570
1571 if (tp->link_config.advertising &
1572 (ADVERTISED_1000baseT_Half | ADVERTISED_1000baseT_Full)) {
1573 new_adv = 0;
1574 if (tp->link_config.advertising & ADVERTISED_1000baseT_Half)
1575 new_adv |= MII_TG3_CTRL_ADV_1000_HALF;
1576 if (tp->link_config.advertising & ADVERTISED_1000baseT_Full)
1577 new_adv |= MII_TG3_CTRL_ADV_1000_FULL;
1578 if (!(tp->tg3_flags & TG3_FLAG_10_100_ONLY) &&
1579 (tp->pci_chip_rev_id == CHIPREV_ID_5701_A0 ||
1580 tp->pci_chip_rev_id == CHIPREV_ID_5701_B0))
1581 new_adv |= (MII_TG3_CTRL_AS_MASTER |
1582 MII_TG3_CTRL_ENABLE_AS_MASTER);
1583 tg3_writephy(tp, MII_TG3_CTRL, new_adv);
1584 } else {
1585 tg3_writephy(tp, MII_TG3_CTRL, 0);
1586 }
1587 } else {
1588 /* Asking for a specific link mode. */
1589 if (tp->link_config.speed == SPEED_1000) {
1590 new_adv = ADVERTISE_CSMA | ADVERTISE_PAUSE_CAP;
1591 tg3_writephy(tp, MII_ADVERTISE, new_adv);
1592
1593 if (tp->link_config.duplex == DUPLEX_FULL)
1594 new_adv = MII_TG3_CTRL_ADV_1000_FULL;
1595 else
1596 new_adv = MII_TG3_CTRL_ADV_1000_HALF;
1597 if (tp->pci_chip_rev_id == CHIPREV_ID_5701_A0 ||
1598 tp->pci_chip_rev_id == CHIPREV_ID_5701_B0)
1599 new_adv |= (MII_TG3_CTRL_AS_MASTER |
1600 MII_TG3_CTRL_ENABLE_AS_MASTER);
1601 tg3_writephy(tp, MII_TG3_CTRL, new_adv);
1602 } else {
1603 tg3_writephy(tp, MII_TG3_CTRL, 0);
1604
1605 new_adv = ADVERTISE_CSMA | ADVERTISE_PAUSE_CAP;
1606 if (tp->link_config.speed == SPEED_100) {
1607 if (tp->link_config.duplex == DUPLEX_FULL)
1608 new_adv |= ADVERTISE_100FULL;
1609 else
1610 new_adv |= ADVERTISE_100HALF;
1611 } else {
1612 if (tp->link_config.duplex == DUPLEX_FULL)
1613 new_adv |= ADVERTISE_10FULL;
1614 else
1615 new_adv |= ADVERTISE_10HALF;
1616 }
1617 tg3_writephy(tp, MII_ADVERTISE, new_adv);
1618 }
1619 }
1620
1621 if (tp->link_config.autoneg == AUTONEG_DISABLE &&
1622 tp->link_config.speed != SPEED_INVALID) {
1623 u32 bmcr, orig_bmcr;
1624
1625 tp->link_config.active_speed = tp->link_config.speed;
1626 tp->link_config.active_duplex = tp->link_config.duplex;
1627
1628 bmcr = 0;
1629 switch (tp->link_config.speed) {
1630 default:
1631 case SPEED_10:
1632 break;
1633
1634 case SPEED_100:
1635 bmcr |= BMCR_SPEED100;
1636 break;
1637
1638 case SPEED_1000:
1639 bmcr |= TG3_BMCR_SPEED1000;
1640 break;
1641 };
1642
1643 if (tp->link_config.duplex == DUPLEX_FULL)
1644 bmcr |= BMCR_FULLDPLX;
1645
1646 if (!tg3_readphy(tp, MII_BMCR, &orig_bmcr) &&
1647 (bmcr != orig_bmcr)) {
1648 tg3_writephy(tp, MII_BMCR, BMCR_LOOPBACK);
1649 for (i = 0; i < 1500; i++) {
1650 u32 tmp;
1651
1652 udelay(10);
1653 if (tg3_readphy(tp, MII_BMSR, &tmp) ||
1654 tg3_readphy(tp, MII_BMSR, &tmp))
1655 continue;
1656 if (!(tmp & BMSR_LSTATUS)) {
1657 udelay(40);
1658 break;
1659 }
1660 }
1661 tg3_writephy(tp, MII_BMCR, bmcr);
1662 udelay(40);
1663 }
1664 } else {
1665 tg3_writephy(tp, MII_BMCR,
1666 BMCR_ANENABLE | BMCR_ANRESTART);
1667 }
1668}
1669
1670static int tg3_init_5401phy_dsp(struct tg3 *tp)
1671{
1672 int err;
1673
1674 /* Turn off tap power management. */
1675 /* Set Extended packet length bit */
1676 err = tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x4c20);
1677
1678 err |= tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x0012);
1679 err |= tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x1804);
1680
1681 err |= tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x0013);
1682 err |= tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x1204);
1683
1684 err |= tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x8006);
1685 err |= tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x0132);
1686
1687 err |= tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x8006);
1688 err |= tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x0232);
1689
1690 err |= tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x201f);
1691 err |= tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x0a20);
1692
1693 udelay(40);
1694
1695 return err;
1696}
1697
1698static int tg3_copper_is_advertising_all(struct tg3 *tp)
1699{
1700 u32 adv_reg, all_mask;
1701
1702 if (tg3_readphy(tp, MII_ADVERTISE, &adv_reg))
1703 return 0;
1704
1705 all_mask = (ADVERTISE_10HALF | ADVERTISE_10FULL |
1706 ADVERTISE_100HALF | ADVERTISE_100FULL);
1707 if ((adv_reg & all_mask) != all_mask)
1708 return 0;
1709 if (!(tp->tg3_flags & TG3_FLAG_10_100_ONLY)) {
1710 u32 tg3_ctrl;
1711
1712 if (tg3_readphy(tp, MII_TG3_CTRL, &tg3_ctrl))
1713 return 0;
1714
1715 all_mask = (MII_TG3_CTRL_ADV_1000_HALF |
1716 MII_TG3_CTRL_ADV_1000_FULL);
1717 if ((tg3_ctrl & all_mask) != all_mask)
1718 return 0;
1719 }
1720 return 1;
1721}
1722
1723static int tg3_setup_copper_phy(struct tg3 *tp, int force_reset)
1724{
1725 int current_link_up;
1726 u32 bmsr, dummy;
1727 u16 current_speed;
1728 u8 current_duplex;
1729 int i, err;
1730
1731 tw32(MAC_EVENT, 0);
1732
1733 tw32_f(MAC_STATUS,
1734 (MAC_STATUS_SYNC_CHANGED |
1735 MAC_STATUS_CFG_CHANGED |
1736 MAC_STATUS_MI_COMPLETION |
1737 MAC_STATUS_LNKSTATE_CHANGED));
1738 udelay(40);
1739
1740 tp->mi_mode = MAC_MI_MODE_BASE;
1741 tw32_f(MAC_MI_MODE, tp->mi_mode);
1742 udelay(80);
1743
1744 tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x02);
1745
1746 /* Some third-party PHYs need to be reset on link going
1747 * down.
1748 */
1749 if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703 ||
1750 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704 ||
1751 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) &&
1752 netif_carrier_ok(tp->dev)) {
1753 tg3_readphy(tp, MII_BMSR, &bmsr);
1754 if (!tg3_readphy(tp, MII_BMSR, &bmsr) &&
1755 !(bmsr & BMSR_LSTATUS))
1756 force_reset = 1;
1757 }
1758 if (force_reset)
1759 tg3_phy_reset(tp);
1760
1761 if ((tp->phy_id & PHY_ID_MASK) == PHY_ID_BCM5401) {
1762 tg3_readphy(tp, MII_BMSR, &bmsr);
1763 if (tg3_readphy(tp, MII_BMSR, &bmsr) ||
1764 !(tp->tg3_flags & TG3_FLAG_INIT_COMPLETE))
1765 bmsr = 0;
1766
1767 if (!(bmsr & BMSR_LSTATUS)) {
1768 err = tg3_init_5401phy_dsp(tp);
1769 if (err)
1770 return err;
1771
1772 tg3_readphy(tp, MII_BMSR, &bmsr);
1773 for (i = 0; i < 1000; i++) {
1774 udelay(10);
1775 if (!tg3_readphy(tp, MII_BMSR, &bmsr) &&
1776 (bmsr & BMSR_LSTATUS)) {
1777 udelay(40);
1778 break;
1779 }
1780 }
1781
1782 if ((tp->phy_id & PHY_ID_REV_MASK) == PHY_REV_BCM5401_B0 &&
1783 !(bmsr & BMSR_LSTATUS) &&
1784 tp->link_config.active_speed == SPEED_1000) {
1785 err = tg3_phy_reset(tp);
1786 if (!err)
1787 err = tg3_init_5401phy_dsp(tp);
1788 if (err)
1789 return err;
1790 }
1791 }
1792 } else if (tp->pci_chip_rev_id == CHIPREV_ID_5701_A0 ||
1793 tp->pci_chip_rev_id == CHIPREV_ID_5701_B0) {
1794 /* 5701 {A0,B0} CRC bug workaround */
1795 tg3_writephy(tp, 0x15, 0x0a75);
1796 tg3_writephy(tp, 0x1c, 0x8c68);
1797 tg3_writephy(tp, 0x1c, 0x8d68);
1798 tg3_writephy(tp, 0x1c, 0x8c68);
1799 }
1800
1801 /* Clear pending interrupts... */
1802 tg3_readphy(tp, MII_TG3_ISTAT, &dummy);
1803 tg3_readphy(tp, MII_TG3_ISTAT, &dummy);
1804
1805 if (tp->tg3_flags & TG3_FLAG_USE_MI_INTERRUPT)
1806 tg3_writephy(tp, MII_TG3_IMASK, ~MII_TG3_INT_LINKCHG);
1807 else
1808 tg3_writephy(tp, MII_TG3_IMASK, ~0);
1809
1810 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 ||
1811 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701) {
1812 if (tp->led_ctrl == LED_CTRL_MODE_PHY_1)
1813 tg3_writephy(tp, MII_TG3_EXT_CTRL,
1814 MII_TG3_EXT_CTRL_LNK3_LED_MODE);
1815 else
1816 tg3_writephy(tp, MII_TG3_EXT_CTRL, 0);
1817 }
1818
1819 current_link_up = 0;
1820 current_speed = SPEED_INVALID;
1821 current_duplex = DUPLEX_INVALID;
1822
1823 if (tp->tg3_flags2 & TG3_FLG2_CAPACITIVE_COUPLING) {
1824 u32 val;
1825
1826 tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x4007);
1827 tg3_readphy(tp, MII_TG3_AUX_CTRL, &val);
1828 if (!(val & (1 << 10))) {
1829 val |= (1 << 10);
1830 tg3_writephy(tp, MII_TG3_AUX_CTRL, val);
1831 goto relink;
1832 }
1833 }
1834
1835 bmsr = 0;
1836 for (i = 0; i < 100; i++) {
1837 tg3_readphy(tp, MII_BMSR, &bmsr);
1838 if (!tg3_readphy(tp, MII_BMSR, &bmsr) &&
1839 (bmsr & BMSR_LSTATUS))
1840 break;
1841 udelay(40);
1842 }
1843
1844 if (bmsr & BMSR_LSTATUS) {
1845 u32 aux_stat, bmcr;
1846
1847 tg3_readphy(tp, MII_TG3_AUX_STAT, &aux_stat);
1848 for (i = 0; i < 2000; i++) {
1849 udelay(10);
1850 if (!tg3_readphy(tp, MII_TG3_AUX_STAT, &aux_stat) &&
1851 aux_stat)
1852 break;
1853 }
1854
1855 tg3_aux_stat_to_speed_duplex(tp, aux_stat,
1856 &current_speed,
1857 &current_duplex);
1858
1859 bmcr = 0;
1860 for (i = 0; i < 200; i++) {
1861 tg3_readphy(tp, MII_BMCR, &bmcr);
1862 if (tg3_readphy(tp, MII_BMCR, &bmcr))
1863 continue;
1864 if (bmcr && bmcr != 0x7fff)
1865 break;
1866 udelay(10);
1867 }
1868
1869 if (tp->link_config.autoneg == AUTONEG_ENABLE) {
1870 if (bmcr & BMCR_ANENABLE) {
1871 current_link_up = 1;
1872
1873 /* Force autoneg restart if we are exiting
1874 * low power mode.
1875 */
1876 if (!tg3_copper_is_advertising_all(tp))
1877 current_link_up = 0;
1878 } else {
1879 current_link_up = 0;
1880 }
1881 } else {
1882 if (!(bmcr & BMCR_ANENABLE) &&
1883 tp->link_config.speed == current_speed &&
1884 tp->link_config.duplex == current_duplex) {
1885 current_link_up = 1;
1886 } else {
1887 current_link_up = 0;
1888 }
1889 }
1890
1891 tp->link_config.active_speed = current_speed;
1892 tp->link_config.active_duplex = current_duplex;
1893 }
1894
1895 if (current_link_up == 1 &&
1896 (tp->link_config.active_duplex == DUPLEX_FULL) &&
1897 (tp->link_config.autoneg == AUTONEG_ENABLE)) {
1898 u32 local_adv, remote_adv;
1899
1900 if (tg3_readphy(tp, MII_ADVERTISE, &local_adv))
1901 local_adv = 0;
1902 local_adv &= (ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM);
1903
1904 if (tg3_readphy(tp, MII_LPA, &remote_adv))
1905 remote_adv = 0;
1906
1907 remote_adv &= (LPA_PAUSE_CAP | LPA_PAUSE_ASYM);
1908
1909 /* If we are not advertising full pause capability,
1910 * something is wrong. Bring the link down and reconfigure.
1911 */
1912 if (local_adv != ADVERTISE_PAUSE_CAP) {
1913 current_link_up = 0;
1914 } else {
1915 tg3_setup_flow_control(tp, local_adv, remote_adv);
1916 }
1917 }
1918relink:
6921d201 1919 if (current_link_up == 0 || tp->link_config.phy_is_low_power) {
1da177e4
LT
1920 u32 tmp;
1921
1922 tg3_phy_copper_begin(tp);
1923
1924 tg3_readphy(tp, MII_BMSR, &tmp);
1925 if (!tg3_readphy(tp, MII_BMSR, &tmp) &&
1926 (tmp & BMSR_LSTATUS))
1927 current_link_up = 1;
1928 }
1929
1930 tp->mac_mode &= ~MAC_MODE_PORT_MODE_MASK;
1931 if (current_link_up == 1) {
1932 if (tp->link_config.active_speed == SPEED_100 ||
1933 tp->link_config.active_speed == SPEED_10)
1934 tp->mac_mode |= MAC_MODE_PORT_MODE_MII;
1935 else
1936 tp->mac_mode |= MAC_MODE_PORT_MODE_GMII;
1937 } else
1938 tp->mac_mode |= MAC_MODE_PORT_MODE_GMII;
1939
1940 tp->mac_mode &= ~MAC_MODE_HALF_DUPLEX;
1941 if (tp->link_config.active_duplex == DUPLEX_HALF)
1942 tp->mac_mode |= MAC_MODE_HALF_DUPLEX;
1943
1944 tp->mac_mode &= ~MAC_MODE_LINK_POLARITY;
1945 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700) {
1946 if ((tp->led_ctrl == LED_CTRL_MODE_PHY_2) ||
1947 (current_link_up == 1 &&
1948 tp->link_config.active_speed == SPEED_10))
1949 tp->mac_mode |= MAC_MODE_LINK_POLARITY;
1950 } else {
1951 if (current_link_up == 1)
1952 tp->mac_mode |= MAC_MODE_LINK_POLARITY;
1953 }
1954
1955 /* ??? Without this setting Netgear GA302T PHY does not
1956 * ??? send/receive packets...
1957 */
1958 if ((tp->phy_id & PHY_ID_MASK) == PHY_ID_BCM5411 &&
1959 tp->pci_chip_rev_id == CHIPREV_ID_5700_ALTIMA) {
1960 tp->mi_mode |= MAC_MI_MODE_AUTO_POLL;
1961 tw32_f(MAC_MI_MODE, tp->mi_mode);
1962 udelay(80);
1963 }
1964
1965 tw32_f(MAC_MODE, tp->mac_mode);
1966 udelay(40);
1967
1968 if (tp->tg3_flags & TG3_FLAG_USE_LINKCHG_REG) {
1969 /* Polled via timer. */
1970 tw32_f(MAC_EVENT, 0);
1971 } else {
1972 tw32_f(MAC_EVENT, MAC_EVENT_LNKSTATE_CHANGED);
1973 }
1974 udelay(40);
1975
1976 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 &&
1977 current_link_up == 1 &&
1978 tp->link_config.active_speed == SPEED_1000 &&
1979 ((tp->tg3_flags & TG3_FLAG_PCIX_MODE) ||
1980 (tp->tg3_flags & TG3_FLAG_PCI_HIGH_SPEED))) {
1981 udelay(120);
1982 tw32_f(MAC_STATUS,
1983 (MAC_STATUS_SYNC_CHANGED |
1984 MAC_STATUS_CFG_CHANGED));
1985 udelay(40);
1986 tg3_write_mem(tp,
1987 NIC_SRAM_FIRMWARE_MBOX,
1988 NIC_SRAM_FIRMWARE_MBOX_MAGIC2);
1989 }
1990
1991 if (current_link_up != netif_carrier_ok(tp->dev)) {
1992 if (current_link_up)
1993 netif_carrier_on(tp->dev);
1994 else
1995 netif_carrier_off(tp->dev);
1996 tg3_link_report(tp);
1997 }
1998
1999 return 0;
2000}
2001
2002struct tg3_fiber_aneginfo {
2003 int state;
2004#define ANEG_STATE_UNKNOWN 0
2005#define ANEG_STATE_AN_ENABLE 1
2006#define ANEG_STATE_RESTART_INIT 2
2007#define ANEG_STATE_RESTART 3
2008#define ANEG_STATE_DISABLE_LINK_OK 4
2009#define ANEG_STATE_ABILITY_DETECT_INIT 5
2010#define ANEG_STATE_ABILITY_DETECT 6
2011#define ANEG_STATE_ACK_DETECT_INIT 7
2012#define ANEG_STATE_ACK_DETECT 8
2013#define ANEG_STATE_COMPLETE_ACK_INIT 9
2014#define ANEG_STATE_COMPLETE_ACK 10
2015#define ANEG_STATE_IDLE_DETECT_INIT 11
2016#define ANEG_STATE_IDLE_DETECT 12
2017#define ANEG_STATE_LINK_OK 13
2018#define ANEG_STATE_NEXT_PAGE_WAIT_INIT 14
2019#define ANEG_STATE_NEXT_PAGE_WAIT 15
2020
2021 u32 flags;
2022#define MR_AN_ENABLE 0x00000001
2023#define MR_RESTART_AN 0x00000002
2024#define MR_AN_COMPLETE 0x00000004
2025#define MR_PAGE_RX 0x00000008
2026#define MR_NP_LOADED 0x00000010
2027#define MR_TOGGLE_TX 0x00000020
2028#define MR_LP_ADV_FULL_DUPLEX 0x00000040
2029#define MR_LP_ADV_HALF_DUPLEX 0x00000080
2030#define MR_LP_ADV_SYM_PAUSE 0x00000100
2031#define MR_LP_ADV_ASYM_PAUSE 0x00000200
2032#define MR_LP_ADV_REMOTE_FAULT1 0x00000400
2033#define MR_LP_ADV_REMOTE_FAULT2 0x00000800
2034#define MR_LP_ADV_NEXT_PAGE 0x00001000
2035#define MR_TOGGLE_RX 0x00002000
2036#define MR_NP_RX 0x00004000
2037
2038#define MR_LINK_OK 0x80000000
2039
2040 unsigned long link_time, cur_time;
2041
2042 u32 ability_match_cfg;
2043 int ability_match_count;
2044
2045 char ability_match, idle_match, ack_match;
2046
2047 u32 txconfig, rxconfig;
2048#define ANEG_CFG_NP 0x00000080
2049#define ANEG_CFG_ACK 0x00000040
2050#define ANEG_CFG_RF2 0x00000020
2051#define ANEG_CFG_RF1 0x00000010
2052#define ANEG_CFG_PS2 0x00000001
2053#define ANEG_CFG_PS1 0x00008000
2054#define ANEG_CFG_HD 0x00004000
2055#define ANEG_CFG_FD 0x00002000
2056#define ANEG_CFG_INVAL 0x00001f06
2057
2058};
2059#define ANEG_OK 0
2060#define ANEG_DONE 1
2061#define ANEG_TIMER_ENAB 2
2062#define ANEG_FAILED -1
2063
2064#define ANEG_STATE_SETTLE_TIME 10000
2065
2066static int tg3_fiber_aneg_smachine(struct tg3 *tp,
2067 struct tg3_fiber_aneginfo *ap)
2068{
2069 unsigned long delta;
2070 u32 rx_cfg_reg;
2071 int ret;
2072
2073 if (ap->state == ANEG_STATE_UNKNOWN) {
2074 ap->rxconfig = 0;
2075 ap->link_time = 0;
2076 ap->cur_time = 0;
2077 ap->ability_match_cfg = 0;
2078 ap->ability_match_count = 0;
2079 ap->ability_match = 0;
2080 ap->idle_match = 0;
2081 ap->ack_match = 0;
2082 }
2083 ap->cur_time++;
2084
2085 if (tr32(MAC_STATUS) & MAC_STATUS_RCVD_CFG) {
2086 rx_cfg_reg = tr32(MAC_RX_AUTO_NEG);
2087
2088 if (rx_cfg_reg != ap->ability_match_cfg) {
2089 ap->ability_match_cfg = rx_cfg_reg;
2090 ap->ability_match = 0;
2091 ap->ability_match_count = 0;
2092 } else {
2093 if (++ap->ability_match_count > 1) {
2094 ap->ability_match = 1;
2095 ap->ability_match_cfg = rx_cfg_reg;
2096 }
2097 }
2098 if (rx_cfg_reg & ANEG_CFG_ACK)
2099 ap->ack_match = 1;
2100 else
2101 ap->ack_match = 0;
2102
2103 ap->idle_match = 0;
2104 } else {
2105 ap->idle_match = 1;
2106 ap->ability_match_cfg = 0;
2107 ap->ability_match_count = 0;
2108 ap->ability_match = 0;
2109 ap->ack_match = 0;
2110
2111 rx_cfg_reg = 0;
2112 }
2113
2114 ap->rxconfig = rx_cfg_reg;
2115 ret = ANEG_OK;
2116
2117 switch(ap->state) {
2118 case ANEG_STATE_UNKNOWN:
2119 if (ap->flags & (MR_AN_ENABLE | MR_RESTART_AN))
2120 ap->state = ANEG_STATE_AN_ENABLE;
2121
2122 /* fallthru */
2123 case ANEG_STATE_AN_ENABLE:
2124 ap->flags &= ~(MR_AN_COMPLETE | MR_PAGE_RX);
2125 if (ap->flags & MR_AN_ENABLE) {
2126 ap->link_time = 0;
2127 ap->cur_time = 0;
2128 ap->ability_match_cfg = 0;
2129 ap->ability_match_count = 0;
2130 ap->ability_match = 0;
2131 ap->idle_match = 0;
2132 ap->ack_match = 0;
2133
2134 ap->state = ANEG_STATE_RESTART_INIT;
2135 } else {
2136 ap->state = ANEG_STATE_DISABLE_LINK_OK;
2137 }
2138 break;
2139
2140 case ANEG_STATE_RESTART_INIT:
2141 ap->link_time = ap->cur_time;
2142 ap->flags &= ~(MR_NP_LOADED);
2143 ap->txconfig = 0;
2144 tw32(MAC_TX_AUTO_NEG, 0);
2145 tp->mac_mode |= MAC_MODE_SEND_CONFIGS;
2146 tw32_f(MAC_MODE, tp->mac_mode);
2147 udelay(40);
2148
2149 ret = ANEG_TIMER_ENAB;
2150 ap->state = ANEG_STATE_RESTART;
2151
2152 /* fallthru */
2153 case ANEG_STATE_RESTART:
2154 delta = ap->cur_time - ap->link_time;
2155 if (delta > ANEG_STATE_SETTLE_TIME) {
2156 ap->state = ANEG_STATE_ABILITY_DETECT_INIT;
2157 } else {
2158 ret = ANEG_TIMER_ENAB;
2159 }
2160 break;
2161
2162 case ANEG_STATE_DISABLE_LINK_OK:
2163 ret = ANEG_DONE;
2164 break;
2165
2166 case ANEG_STATE_ABILITY_DETECT_INIT:
2167 ap->flags &= ~(MR_TOGGLE_TX);
2168 ap->txconfig = (ANEG_CFG_FD | ANEG_CFG_PS1);
2169 tw32(MAC_TX_AUTO_NEG, ap->txconfig);
2170 tp->mac_mode |= MAC_MODE_SEND_CONFIGS;
2171 tw32_f(MAC_MODE, tp->mac_mode);
2172 udelay(40);
2173
2174 ap->state = ANEG_STATE_ABILITY_DETECT;
2175 break;
2176
2177 case ANEG_STATE_ABILITY_DETECT:
2178 if (ap->ability_match != 0 && ap->rxconfig != 0) {
2179 ap->state = ANEG_STATE_ACK_DETECT_INIT;
2180 }
2181 break;
2182
2183 case ANEG_STATE_ACK_DETECT_INIT:
2184 ap->txconfig |= ANEG_CFG_ACK;
2185 tw32(MAC_TX_AUTO_NEG, ap->txconfig);
2186 tp->mac_mode |= MAC_MODE_SEND_CONFIGS;
2187 tw32_f(MAC_MODE, tp->mac_mode);
2188 udelay(40);
2189
2190 ap->state = ANEG_STATE_ACK_DETECT;
2191
2192 /* fallthru */
2193 case ANEG_STATE_ACK_DETECT:
2194 if (ap->ack_match != 0) {
2195 if ((ap->rxconfig & ~ANEG_CFG_ACK) ==
2196 (ap->ability_match_cfg & ~ANEG_CFG_ACK)) {
2197 ap->state = ANEG_STATE_COMPLETE_ACK_INIT;
2198 } else {
2199 ap->state = ANEG_STATE_AN_ENABLE;
2200 }
2201 } else if (ap->ability_match != 0 &&
2202 ap->rxconfig == 0) {
2203 ap->state = ANEG_STATE_AN_ENABLE;
2204 }
2205 break;
2206
2207 case ANEG_STATE_COMPLETE_ACK_INIT:
2208 if (ap->rxconfig & ANEG_CFG_INVAL) {
2209 ret = ANEG_FAILED;
2210 break;
2211 }
2212 ap->flags &= ~(MR_LP_ADV_FULL_DUPLEX |
2213 MR_LP_ADV_HALF_DUPLEX |
2214 MR_LP_ADV_SYM_PAUSE |
2215 MR_LP_ADV_ASYM_PAUSE |
2216 MR_LP_ADV_REMOTE_FAULT1 |
2217 MR_LP_ADV_REMOTE_FAULT2 |
2218 MR_LP_ADV_NEXT_PAGE |
2219 MR_TOGGLE_RX |
2220 MR_NP_RX);
2221 if (ap->rxconfig & ANEG_CFG_FD)
2222 ap->flags |= MR_LP_ADV_FULL_DUPLEX;
2223 if (ap->rxconfig & ANEG_CFG_HD)
2224 ap->flags |= MR_LP_ADV_HALF_DUPLEX;
2225 if (ap->rxconfig & ANEG_CFG_PS1)
2226 ap->flags |= MR_LP_ADV_SYM_PAUSE;
2227 if (ap->rxconfig & ANEG_CFG_PS2)
2228 ap->flags |= MR_LP_ADV_ASYM_PAUSE;
2229 if (ap->rxconfig & ANEG_CFG_RF1)
2230 ap->flags |= MR_LP_ADV_REMOTE_FAULT1;
2231 if (ap->rxconfig & ANEG_CFG_RF2)
2232 ap->flags |= MR_LP_ADV_REMOTE_FAULT2;
2233 if (ap->rxconfig & ANEG_CFG_NP)
2234 ap->flags |= MR_LP_ADV_NEXT_PAGE;
2235
2236 ap->link_time = ap->cur_time;
2237
2238 ap->flags ^= (MR_TOGGLE_TX);
2239 if (ap->rxconfig & 0x0008)
2240 ap->flags |= MR_TOGGLE_RX;
2241 if (ap->rxconfig & ANEG_CFG_NP)
2242 ap->flags |= MR_NP_RX;
2243 ap->flags |= MR_PAGE_RX;
2244
2245 ap->state = ANEG_STATE_COMPLETE_ACK;
2246 ret = ANEG_TIMER_ENAB;
2247 break;
2248
2249 case ANEG_STATE_COMPLETE_ACK:
2250 if (ap->ability_match != 0 &&
2251 ap->rxconfig == 0) {
2252 ap->state = ANEG_STATE_AN_ENABLE;
2253 break;
2254 }
2255 delta = ap->cur_time - ap->link_time;
2256 if (delta > ANEG_STATE_SETTLE_TIME) {
2257 if (!(ap->flags & (MR_LP_ADV_NEXT_PAGE))) {
2258 ap->state = ANEG_STATE_IDLE_DETECT_INIT;
2259 } else {
2260 if ((ap->txconfig & ANEG_CFG_NP) == 0 &&
2261 !(ap->flags & MR_NP_RX)) {
2262 ap->state = ANEG_STATE_IDLE_DETECT_INIT;
2263 } else {
2264 ret = ANEG_FAILED;
2265 }
2266 }
2267 }
2268 break;
2269
2270 case ANEG_STATE_IDLE_DETECT_INIT:
2271 ap->link_time = ap->cur_time;
2272 tp->mac_mode &= ~MAC_MODE_SEND_CONFIGS;
2273 tw32_f(MAC_MODE, tp->mac_mode);
2274 udelay(40);
2275
2276 ap->state = ANEG_STATE_IDLE_DETECT;
2277 ret = ANEG_TIMER_ENAB;
2278 break;
2279
2280 case ANEG_STATE_IDLE_DETECT:
2281 if (ap->ability_match != 0 &&
2282 ap->rxconfig == 0) {
2283 ap->state = ANEG_STATE_AN_ENABLE;
2284 break;
2285 }
2286 delta = ap->cur_time - ap->link_time;
2287 if (delta > ANEG_STATE_SETTLE_TIME) {
2288 /* XXX another gem from the Broadcom driver :( */
2289 ap->state = ANEG_STATE_LINK_OK;
2290 }
2291 break;
2292
2293 case ANEG_STATE_LINK_OK:
2294 ap->flags |= (MR_AN_COMPLETE | MR_LINK_OK);
2295 ret = ANEG_DONE;
2296 break;
2297
2298 case ANEG_STATE_NEXT_PAGE_WAIT_INIT:
2299 /* ??? unimplemented */
2300 break;
2301
2302 case ANEG_STATE_NEXT_PAGE_WAIT:
2303 /* ??? unimplemented */
2304 break;
2305
2306 default:
2307 ret = ANEG_FAILED;
2308 break;
2309 };
2310
2311 return ret;
2312}
2313
2314static int fiber_autoneg(struct tg3 *tp, u32 *flags)
2315{
2316 int res = 0;
2317 struct tg3_fiber_aneginfo aninfo;
2318 int status = ANEG_FAILED;
2319 unsigned int tick;
2320 u32 tmp;
2321
2322 tw32_f(MAC_TX_AUTO_NEG, 0);
2323
2324 tmp = tp->mac_mode & ~MAC_MODE_PORT_MODE_MASK;
2325 tw32_f(MAC_MODE, tmp | MAC_MODE_PORT_MODE_GMII);
2326 udelay(40);
2327
2328 tw32_f(MAC_MODE, tp->mac_mode | MAC_MODE_SEND_CONFIGS);
2329 udelay(40);
2330
2331 memset(&aninfo, 0, sizeof(aninfo));
2332 aninfo.flags |= MR_AN_ENABLE;
2333 aninfo.state = ANEG_STATE_UNKNOWN;
2334 aninfo.cur_time = 0;
2335 tick = 0;
2336 while (++tick < 195000) {
2337 status = tg3_fiber_aneg_smachine(tp, &aninfo);
2338 if (status == ANEG_DONE || status == ANEG_FAILED)
2339 break;
2340
2341 udelay(1);
2342 }
2343
2344 tp->mac_mode &= ~MAC_MODE_SEND_CONFIGS;
2345 tw32_f(MAC_MODE, tp->mac_mode);
2346 udelay(40);
2347
2348 *flags = aninfo.flags;
2349
2350 if (status == ANEG_DONE &&
2351 (aninfo.flags & (MR_AN_COMPLETE | MR_LINK_OK |
2352 MR_LP_ADV_FULL_DUPLEX)))
2353 res = 1;
2354
2355 return res;
2356}
2357
2358static void tg3_init_bcm8002(struct tg3 *tp)
2359{
2360 u32 mac_status = tr32(MAC_STATUS);
2361 int i;
2362
2363 /* Reset when initting first time or we have a link. */
2364 if ((tp->tg3_flags & TG3_FLAG_INIT_COMPLETE) &&
2365 !(mac_status & MAC_STATUS_PCS_SYNCED))
2366 return;
2367
2368 /* Set PLL lock range. */
2369 tg3_writephy(tp, 0x16, 0x8007);
2370
2371 /* SW reset */
2372 tg3_writephy(tp, MII_BMCR, BMCR_RESET);
2373
2374 /* Wait for reset to complete. */
2375 /* XXX schedule_timeout() ... */
2376 for (i = 0; i < 500; i++)
2377 udelay(10);
2378
2379 /* Config mode; select PMA/Ch 1 regs. */
2380 tg3_writephy(tp, 0x10, 0x8411);
2381
2382 /* Enable auto-lock and comdet, select txclk for tx. */
2383 tg3_writephy(tp, 0x11, 0x0a10);
2384
2385 tg3_writephy(tp, 0x18, 0x00a0);
2386 tg3_writephy(tp, 0x16, 0x41ff);
2387
2388 /* Assert and deassert POR. */
2389 tg3_writephy(tp, 0x13, 0x0400);
2390 udelay(40);
2391 tg3_writephy(tp, 0x13, 0x0000);
2392
2393 tg3_writephy(tp, 0x11, 0x0a50);
2394 udelay(40);
2395 tg3_writephy(tp, 0x11, 0x0a10);
2396
2397 /* Wait for signal to stabilize */
2398 /* XXX schedule_timeout() ... */
2399 for (i = 0; i < 15000; i++)
2400 udelay(10);
2401
2402 /* Deselect the channel register so we can read the PHYID
2403 * later.
2404 */
2405 tg3_writephy(tp, 0x10, 0x8011);
2406}
2407
2408static int tg3_setup_fiber_hw_autoneg(struct tg3 *tp, u32 mac_status)
2409{
2410 u32 sg_dig_ctrl, sg_dig_status;
2411 u32 serdes_cfg, expected_sg_dig_ctrl;
2412 int workaround, port_a;
2413 int current_link_up;
2414
2415 serdes_cfg = 0;
2416 expected_sg_dig_ctrl = 0;
2417 workaround = 0;
2418 port_a = 1;
2419 current_link_up = 0;
2420
2421 if (tp->pci_chip_rev_id != CHIPREV_ID_5704_A0 &&
2422 tp->pci_chip_rev_id != CHIPREV_ID_5704_A1) {
2423 workaround = 1;
2424 if (tr32(TG3PCI_DUAL_MAC_CTRL) & DUAL_MAC_CTRL_ID)
2425 port_a = 0;
2426
2427 /* preserve bits 0-11,13,14 for signal pre-emphasis */
2428 /* preserve bits 20-23 for voltage regulator */
2429 serdes_cfg = tr32(MAC_SERDES_CFG) & 0x00f06fff;
2430 }
2431
2432 sg_dig_ctrl = tr32(SG_DIG_CTRL);
2433
2434 if (tp->link_config.autoneg != AUTONEG_ENABLE) {
2435 if (sg_dig_ctrl & (1 << 31)) {
2436 if (workaround) {
2437 u32 val = serdes_cfg;
2438
2439 if (port_a)
2440 val |= 0xc010000;
2441 else
2442 val |= 0x4010000;
2443 tw32_f(MAC_SERDES_CFG, val);
2444 }
2445 tw32_f(SG_DIG_CTRL, 0x01388400);
2446 }
2447 if (mac_status & MAC_STATUS_PCS_SYNCED) {
2448 tg3_setup_flow_control(tp, 0, 0);
2449 current_link_up = 1;
2450 }
2451 goto out;
2452 }
2453
2454 /* Want auto-negotiation. */
2455 expected_sg_dig_ctrl = 0x81388400;
2456
2457 /* Pause capability */
2458 expected_sg_dig_ctrl |= (1 << 11);
2459
2460 /* Asymettric pause */
2461 expected_sg_dig_ctrl |= (1 << 12);
2462
2463 if (sg_dig_ctrl != expected_sg_dig_ctrl) {
2464 if (workaround)
2465 tw32_f(MAC_SERDES_CFG, serdes_cfg | 0xc011000);
2466 tw32_f(SG_DIG_CTRL, expected_sg_dig_ctrl | (1 << 30));
2467 udelay(5);
2468 tw32_f(SG_DIG_CTRL, expected_sg_dig_ctrl);
2469
2470 tp->tg3_flags2 |= TG3_FLG2_PHY_JUST_INITTED;
2471 } else if (mac_status & (MAC_STATUS_PCS_SYNCED |
2472 MAC_STATUS_SIGNAL_DET)) {
2473 int i;
2474
2475 /* Giver time to negotiate (~200ms) */
2476 for (i = 0; i < 40000; i++) {
2477 sg_dig_status = tr32(SG_DIG_STATUS);
2478 if (sg_dig_status & (0x3))
2479 break;
2480 udelay(5);
2481 }
2482 mac_status = tr32(MAC_STATUS);
2483
2484 if ((sg_dig_status & (1 << 1)) &&
2485 (mac_status & MAC_STATUS_PCS_SYNCED)) {
2486 u32 local_adv, remote_adv;
2487
2488 local_adv = ADVERTISE_PAUSE_CAP;
2489 remote_adv = 0;
2490 if (sg_dig_status & (1 << 19))
2491 remote_adv |= LPA_PAUSE_CAP;
2492 if (sg_dig_status & (1 << 20))
2493 remote_adv |= LPA_PAUSE_ASYM;
2494
2495 tg3_setup_flow_control(tp, local_adv, remote_adv);
2496 current_link_up = 1;
2497 tp->tg3_flags2 &= ~TG3_FLG2_PHY_JUST_INITTED;
2498 } else if (!(sg_dig_status & (1 << 1))) {
2499 if (tp->tg3_flags2 & TG3_FLG2_PHY_JUST_INITTED)
2500 tp->tg3_flags2 &= ~TG3_FLG2_PHY_JUST_INITTED;
2501 else {
2502 if (workaround) {
2503 u32 val = serdes_cfg;
2504
2505 if (port_a)
2506 val |= 0xc010000;
2507 else
2508 val |= 0x4010000;
2509
2510 tw32_f(MAC_SERDES_CFG, val);
2511 }
2512
2513 tw32_f(SG_DIG_CTRL, 0x01388400);
2514 udelay(40);
2515
2516 /* Link parallel detection - link is up */
2517 /* only if we have PCS_SYNC and not */
2518 /* receiving config code words */
2519 mac_status = tr32(MAC_STATUS);
2520 if ((mac_status & MAC_STATUS_PCS_SYNCED) &&
2521 !(mac_status & MAC_STATUS_RCVD_CFG)) {
2522 tg3_setup_flow_control(tp, 0, 0);
2523 current_link_up = 1;
2524 }
2525 }
2526 }
2527 }
2528
2529out:
2530 return current_link_up;
2531}
2532
2533static int tg3_setup_fiber_by_hand(struct tg3 *tp, u32 mac_status)
2534{
2535 int current_link_up = 0;
2536
2537 if (!(mac_status & MAC_STATUS_PCS_SYNCED)) {
2538 tp->tg3_flags &= ~TG3_FLAG_GOT_SERDES_FLOWCTL;
2539 goto out;
2540 }
2541
2542 if (tp->link_config.autoneg == AUTONEG_ENABLE) {
2543 u32 flags;
2544 int i;
6aa20a22 2545
1da177e4
LT
2546 if (fiber_autoneg(tp, &flags)) {
2547 u32 local_adv, remote_adv;
2548
2549 local_adv = ADVERTISE_PAUSE_CAP;
2550 remote_adv = 0;
2551 if (flags & MR_LP_ADV_SYM_PAUSE)
2552 remote_adv |= LPA_PAUSE_CAP;
2553 if (flags & MR_LP_ADV_ASYM_PAUSE)
2554 remote_adv |= LPA_PAUSE_ASYM;
2555
2556 tg3_setup_flow_control(tp, local_adv, remote_adv);
2557
2558 tp->tg3_flags |= TG3_FLAG_GOT_SERDES_FLOWCTL;
2559 current_link_up = 1;
2560 }
2561 for (i = 0; i < 30; i++) {
2562 udelay(20);
2563 tw32_f(MAC_STATUS,
2564 (MAC_STATUS_SYNC_CHANGED |
2565 MAC_STATUS_CFG_CHANGED));
2566 udelay(40);
2567 if ((tr32(MAC_STATUS) &
2568 (MAC_STATUS_SYNC_CHANGED |
2569 MAC_STATUS_CFG_CHANGED)) == 0)
2570 break;
2571 }
2572
2573 mac_status = tr32(MAC_STATUS);
2574 if (current_link_up == 0 &&
2575 (mac_status & MAC_STATUS_PCS_SYNCED) &&
2576 !(mac_status & MAC_STATUS_RCVD_CFG))
2577 current_link_up = 1;
2578 } else {
2579 /* Forcing 1000FD link up. */
2580 current_link_up = 1;
2581 tp->tg3_flags |= TG3_FLAG_GOT_SERDES_FLOWCTL;
2582
2583 tw32_f(MAC_MODE, (tp->mac_mode | MAC_MODE_SEND_CONFIGS));
2584 udelay(40);
2585 }
2586
2587out:
2588 return current_link_up;
2589}
2590
2591static int tg3_setup_fiber_phy(struct tg3 *tp, int force_reset)
2592{
2593 u32 orig_pause_cfg;
2594 u16 orig_active_speed;
2595 u8 orig_active_duplex;
2596 u32 mac_status;
2597 int current_link_up;
2598 int i;
2599
2600 orig_pause_cfg =
2601 (tp->tg3_flags & (TG3_FLAG_RX_PAUSE |
2602 TG3_FLAG_TX_PAUSE));
2603 orig_active_speed = tp->link_config.active_speed;
2604 orig_active_duplex = tp->link_config.active_duplex;
2605
2606 if (!(tp->tg3_flags2 & TG3_FLG2_HW_AUTONEG) &&
2607 netif_carrier_ok(tp->dev) &&
2608 (tp->tg3_flags & TG3_FLAG_INIT_COMPLETE)) {
2609 mac_status = tr32(MAC_STATUS);
2610 mac_status &= (MAC_STATUS_PCS_SYNCED |
2611 MAC_STATUS_SIGNAL_DET |
2612 MAC_STATUS_CFG_CHANGED |
2613 MAC_STATUS_RCVD_CFG);
2614 if (mac_status == (MAC_STATUS_PCS_SYNCED |
2615 MAC_STATUS_SIGNAL_DET)) {
2616 tw32_f(MAC_STATUS, (MAC_STATUS_SYNC_CHANGED |
2617 MAC_STATUS_CFG_CHANGED));
2618 return 0;
2619 }
2620 }
2621
2622 tw32_f(MAC_TX_AUTO_NEG, 0);
2623
2624 tp->mac_mode &= ~(MAC_MODE_PORT_MODE_MASK | MAC_MODE_HALF_DUPLEX);
2625 tp->mac_mode |= MAC_MODE_PORT_MODE_TBI;
2626 tw32_f(MAC_MODE, tp->mac_mode);
2627 udelay(40);
2628
2629 if (tp->phy_id == PHY_ID_BCM8002)
2630 tg3_init_bcm8002(tp);
2631
2632 /* Enable link change event even when serdes polling. */
2633 tw32_f(MAC_EVENT, MAC_EVENT_LNKSTATE_CHANGED);
2634 udelay(40);
2635
2636 current_link_up = 0;
2637 mac_status = tr32(MAC_STATUS);
2638
2639 if (tp->tg3_flags2 & TG3_FLG2_HW_AUTONEG)
2640 current_link_up = tg3_setup_fiber_hw_autoneg(tp, mac_status);
2641 else
2642 current_link_up = tg3_setup_fiber_by_hand(tp, mac_status);
2643
2644 tp->mac_mode &= ~MAC_MODE_LINK_POLARITY;
2645 tw32_f(MAC_MODE, tp->mac_mode);
2646 udelay(40);
2647
2648 tp->hw_status->status =
2649 (SD_STATUS_UPDATED |
2650 (tp->hw_status->status & ~SD_STATUS_LINK_CHG));
2651
2652 for (i = 0; i < 100; i++) {
2653 tw32_f(MAC_STATUS, (MAC_STATUS_SYNC_CHANGED |
2654 MAC_STATUS_CFG_CHANGED));
2655 udelay(5);
2656 if ((tr32(MAC_STATUS) & (MAC_STATUS_SYNC_CHANGED |
2657 MAC_STATUS_CFG_CHANGED)) == 0)
2658 break;
2659 }
2660
2661 mac_status = tr32(MAC_STATUS);
2662 if ((mac_status & MAC_STATUS_PCS_SYNCED) == 0) {
2663 current_link_up = 0;
2664 if (tp->link_config.autoneg == AUTONEG_ENABLE) {
2665 tw32_f(MAC_MODE, (tp->mac_mode |
2666 MAC_MODE_SEND_CONFIGS));
2667 udelay(1);
2668 tw32_f(MAC_MODE, tp->mac_mode);
2669 }
2670 }
2671
2672 if (current_link_up == 1) {
2673 tp->link_config.active_speed = SPEED_1000;
2674 tp->link_config.active_duplex = DUPLEX_FULL;
2675 tw32(MAC_LED_CTRL, (tp->led_ctrl |
2676 LED_CTRL_LNKLED_OVERRIDE |
2677 LED_CTRL_1000MBPS_ON));
2678 } else {
2679 tp->link_config.active_speed = SPEED_INVALID;
2680 tp->link_config.active_duplex = DUPLEX_INVALID;
2681 tw32(MAC_LED_CTRL, (tp->led_ctrl |
2682 LED_CTRL_LNKLED_OVERRIDE |
2683 LED_CTRL_TRAFFIC_OVERRIDE));
2684 }
2685
2686 if (current_link_up != netif_carrier_ok(tp->dev)) {
2687 if (current_link_up)
2688 netif_carrier_on(tp->dev);
2689 else
2690 netif_carrier_off(tp->dev);
2691 tg3_link_report(tp);
2692 } else {
2693 u32 now_pause_cfg =
2694 tp->tg3_flags & (TG3_FLAG_RX_PAUSE |
2695 TG3_FLAG_TX_PAUSE);
2696 if (orig_pause_cfg != now_pause_cfg ||
2697 orig_active_speed != tp->link_config.active_speed ||
2698 orig_active_duplex != tp->link_config.active_duplex)
2699 tg3_link_report(tp);
2700 }
2701
2702 return 0;
2703}
2704
747e8f8b
MC
2705static int tg3_setup_fiber_mii_phy(struct tg3 *tp, int force_reset)
2706{
2707 int current_link_up, err = 0;
2708 u32 bmsr, bmcr;
2709 u16 current_speed;
2710 u8 current_duplex;
2711
2712 tp->mac_mode |= MAC_MODE_PORT_MODE_GMII;
2713 tw32_f(MAC_MODE, tp->mac_mode);
2714 udelay(40);
2715
2716 tw32(MAC_EVENT, 0);
2717
2718 tw32_f(MAC_STATUS,
2719 (MAC_STATUS_SYNC_CHANGED |
2720 MAC_STATUS_CFG_CHANGED |
2721 MAC_STATUS_MI_COMPLETION |
2722 MAC_STATUS_LNKSTATE_CHANGED));
2723 udelay(40);
2724
2725 if (force_reset)
2726 tg3_phy_reset(tp);
2727
2728 current_link_up = 0;
2729 current_speed = SPEED_INVALID;
2730 current_duplex = DUPLEX_INVALID;
2731
2732 err |= tg3_readphy(tp, MII_BMSR, &bmsr);
2733 err |= tg3_readphy(tp, MII_BMSR, &bmsr);
d4d2c558
MC
2734 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5714) {
2735 if (tr32(MAC_TX_STATUS) & TX_STATUS_LINK_UP)
2736 bmsr |= BMSR_LSTATUS;
2737 else
2738 bmsr &= ~BMSR_LSTATUS;
2739 }
747e8f8b
MC
2740
2741 err |= tg3_readphy(tp, MII_BMCR, &bmcr);
2742
2743 if ((tp->link_config.autoneg == AUTONEG_ENABLE) && !force_reset &&
2744 (tp->tg3_flags2 & TG3_FLG2_PARALLEL_DETECT)) {
2745 /* do nothing, just check for link up at the end */
2746 } else if (tp->link_config.autoneg == AUTONEG_ENABLE) {
2747 u32 adv, new_adv;
2748
2749 err |= tg3_readphy(tp, MII_ADVERTISE, &adv);
2750 new_adv = adv & ~(ADVERTISE_1000XFULL | ADVERTISE_1000XHALF |
2751 ADVERTISE_1000XPAUSE |
2752 ADVERTISE_1000XPSE_ASYM |
2753 ADVERTISE_SLCT);
2754
2755 /* Always advertise symmetric PAUSE just like copper */
2756 new_adv |= ADVERTISE_1000XPAUSE;
2757
2758 if (tp->link_config.advertising & ADVERTISED_1000baseT_Half)
2759 new_adv |= ADVERTISE_1000XHALF;
2760 if (tp->link_config.advertising & ADVERTISED_1000baseT_Full)
2761 new_adv |= ADVERTISE_1000XFULL;
2762
2763 if ((new_adv != adv) || !(bmcr & BMCR_ANENABLE)) {
2764 tg3_writephy(tp, MII_ADVERTISE, new_adv);
2765 bmcr |= BMCR_ANENABLE | BMCR_ANRESTART;
2766 tg3_writephy(tp, MII_BMCR, bmcr);
2767
2768 tw32_f(MAC_EVENT, MAC_EVENT_LNKSTATE_CHANGED);
2769 tp->tg3_flags2 |= TG3_FLG2_PHY_JUST_INITTED;
2770 tp->tg3_flags2 &= ~TG3_FLG2_PARALLEL_DETECT;
2771
2772 return err;
2773 }
2774 } else {
2775 u32 new_bmcr;
2776
2777 bmcr &= ~BMCR_SPEED1000;
2778 new_bmcr = bmcr & ~(BMCR_ANENABLE | BMCR_FULLDPLX);
2779
2780 if (tp->link_config.duplex == DUPLEX_FULL)
2781 new_bmcr |= BMCR_FULLDPLX;
2782
2783 if (new_bmcr != bmcr) {
2784 /* BMCR_SPEED1000 is a reserved bit that needs
2785 * to be set on write.
2786 */
2787 new_bmcr |= BMCR_SPEED1000;
2788
2789 /* Force a linkdown */
2790 if (netif_carrier_ok(tp->dev)) {
2791 u32 adv;
2792
2793 err |= tg3_readphy(tp, MII_ADVERTISE, &adv);
2794 adv &= ~(ADVERTISE_1000XFULL |
2795 ADVERTISE_1000XHALF |
2796 ADVERTISE_SLCT);
2797 tg3_writephy(tp, MII_ADVERTISE, adv);
2798 tg3_writephy(tp, MII_BMCR, bmcr |
2799 BMCR_ANRESTART |
2800 BMCR_ANENABLE);
2801 udelay(10);
2802 netif_carrier_off(tp->dev);
2803 }
2804 tg3_writephy(tp, MII_BMCR, new_bmcr);
2805 bmcr = new_bmcr;
2806 err |= tg3_readphy(tp, MII_BMSR, &bmsr);
2807 err |= tg3_readphy(tp, MII_BMSR, &bmsr);
d4d2c558
MC
2808 if (GET_ASIC_REV(tp->pci_chip_rev_id) ==
2809 ASIC_REV_5714) {
2810 if (tr32(MAC_TX_STATUS) & TX_STATUS_LINK_UP)
2811 bmsr |= BMSR_LSTATUS;
2812 else
2813 bmsr &= ~BMSR_LSTATUS;
2814 }
747e8f8b
MC
2815 tp->tg3_flags2 &= ~TG3_FLG2_PARALLEL_DETECT;
2816 }
2817 }
2818
2819 if (bmsr & BMSR_LSTATUS) {
2820 current_speed = SPEED_1000;
2821 current_link_up = 1;
2822 if (bmcr & BMCR_FULLDPLX)
2823 current_duplex = DUPLEX_FULL;
2824 else
2825 current_duplex = DUPLEX_HALF;
2826
2827 if (bmcr & BMCR_ANENABLE) {
2828 u32 local_adv, remote_adv, common;
2829
2830 err |= tg3_readphy(tp, MII_ADVERTISE, &local_adv);
2831 err |= tg3_readphy(tp, MII_LPA, &remote_adv);
2832 common = local_adv & remote_adv;
2833 if (common & (ADVERTISE_1000XHALF |
2834 ADVERTISE_1000XFULL)) {
2835 if (common & ADVERTISE_1000XFULL)
2836 current_duplex = DUPLEX_FULL;
2837 else
2838 current_duplex = DUPLEX_HALF;
2839
2840 tg3_setup_flow_control(tp, local_adv,
2841 remote_adv);
2842 }
2843 else
2844 current_link_up = 0;
2845 }
2846 }
2847
2848 tp->mac_mode &= ~MAC_MODE_HALF_DUPLEX;
2849 if (tp->link_config.active_duplex == DUPLEX_HALF)
2850 tp->mac_mode |= MAC_MODE_HALF_DUPLEX;
2851
2852 tw32_f(MAC_MODE, tp->mac_mode);
2853 udelay(40);
2854
2855 tw32_f(MAC_EVENT, MAC_EVENT_LNKSTATE_CHANGED);
2856
2857 tp->link_config.active_speed = current_speed;
2858 tp->link_config.active_duplex = current_duplex;
2859
2860 if (current_link_up != netif_carrier_ok(tp->dev)) {
2861 if (current_link_up)
2862 netif_carrier_on(tp->dev);
2863 else {
2864 netif_carrier_off(tp->dev);
2865 tp->tg3_flags2 &= ~TG3_FLG2_PARALLEL_DETECT;
2866 }
2867 tg3_link_report(tp);
2868 }
2869 return err;
2870}
2871
2872static void tg3_serdes_parallel_detect(struct tg3 *tp)
2873{
2874 if (tp->tg3_flags2 & TG3_FLG2_PHY_JUST_INITTED) {
2875 /* Give autoneg time to complete. */
2876 tp->tg3_flags2 &= ~TG3_FLG2_PHY_JUST_INITTED;
2877 return;
2878 }
2879 if (!netif_carrier_ok(tp->dev) &&
2880 (tp->link_config.autoneg == AUTONEG_ENABLE)) {
2881 u32 bmcr;
2882
2883 tg3_readphy(tp, MII_BMCR, &bmcr);
2884 if (bmcr & BMCR_ANENABLE) {
2885 u32 phy1, phy2;
2886
2887 /* Select shadow register 0x1f */
2888 tg3_writephy(tp, 0x1c, 0x7c00);
2889 tg3_readphy(tp, 0x1c, &phy1);
2890
2891 /* Select expansion interrupt status register */
2892 tg3_writephy(tp, 0x17, 0x0f01);
2893 tg3_readphy(tp, 0x15, &phy2);
2894 tg3_readphy(tp, 0x15, &phy2);
2895
2896 if ((phy1 & 0x10) && !(phy2 & 0x20)) {
2897 /* We have signal detect and not receiving
2898 * config code words, link is up by parallel
2899 * detection.
2900 */
2901
2902 bmcr &= ~BMCR_ANENABLE;
2903 bmcr |= BMCR_SPEED1000 | BMCR_FULLDPLX;
2904 tg3_writephy(tp, MII_BMCR, bmcr);
2905 tp->tg3_flags2 |= TG3_FLG2_PARALLEL_DETECT;
2906 }
2907 }
2908 }
2909 else if (netif_carrier_ok(tp->dev) &&
2910 (tp->link_config.autoneg == AUTONEG_ENABLE) &&
2911 (tp->tg3_flags2 & TG3_FLG2_PARALLEL_DETECT)) {
2912 u32 phy2;
2913
2914 /* Select expansion interrupt status register */
2915 tg3_writephy(tp, 0x17, 0x0f01);
2916 tg3_readphy(tp, 0x15, &phy2);
2917 if (phy2 & 0x20) {
2918 u32 bmcr;
2919
2920 /* Config code words received, turn on autoneg. */
2921 tg3_readphy(tp, MII_BMCR, &bmcr);
2922 tg3_writephy(tp, MII_BMCR, bmcr | BMCR_ANENABLE);
2923
2924 tp->tg3_flags2 &= ~TG3_FLG2_PARALLEL_DETECT;
2925
2926 }
2927 }
2928}
2929
1da177e4
LT
2930static int tg3_setup_phy(struct tg3 *tp, int force_reset)
2931{
2932 int err;
2933
2934 if (tp->tg3_flags2 & TG3_FLG2_PHY_SERDES) {
2935 err = tg3_setup_fiber_phy(tp, force_reset);
747e8f8b
MC
2936 } else if (tp->tg3_flags2 & TG3_FLG2_MII_SERDES) {
2937 err = tg3_setup_fiber_mii_phy(tp, force_reset);
1da177e4
LT
2938 } else {
2939 err = tg3_setup_copper_phy(tp, force_reset);
2940 }
2941
2942 if (tp->link_config.active_speed == SPEED_1000 &&
2943 tp->link_config.active_duplex == DUPLEX_HALF)
2944 tw32(MAC_TX_LENGTHS,
2945 ((2 << TX_LENGTHS_IPG_CRS_SHIFT) |
2946 (6 << TX_LENGTHS_IPG_SHIFT) |
2947 (0xff << TX_LENGTHS_SLOT_TIME_SHIFT)));
2948 else
2949 tw32(MAC_TX_LENGTHS,
2950 ((2 << TX_LENGTHS_IPG_CRS_SHIFT) |
2951 (6 << TX_LENGTHS_IPG_SHIFT) |
2952 (32 << TX_LENGTHS_SLOT_TIME_SHIFT)));
2953
2954 if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS)) {
2955 if (netif_carrier_ok(tp->dev)) {
2956 tw32(HOSTCC_STAT_COAL_TICKS,
15f9850d 2957 tp->coal.stats_block_coalesce_usecs);
1da177e4
LT
2958 } else {
2959 tw32(HOSTCC_STAT_COAL_TICKS, 0);
2960 }
2961 }
2962
2963 return err;
2964}
2965
df3e6548
MC
2966/* This is called whenever we suspect that the system chipset is re-
2967 * ordering the sequence of MMIO to the tx send mailbox. The symptom
2968 * is bogus tx completions. We try to recover by setting the
2969 * TG3_FLAG_MBOX_WRITE_REORDER flag and resetting the chip later
2970 * in the workqueue.
2971 */
2972static void tg3_tx_recover(struct tg3 *tp)
2973{
2974 BUG_ON((tp->tg3_flags & TG3_FLAG_MBOX_WRITE_REORDER) ||
2975 tp->write32_tx_mbox == tg3_write_indirect_mbox);
2976
2977 printk(KERN_WARNING PFX "%s: The system may be re-ordering memory-"
2978 "mapped I/O cycles to the network device, attempting to "
2979 "recover. Please report the problem to the driver maintainer "
2980 "and include system chipset information.\n", tp->dev->name);
2981
2982 spin_lock(&tp->lock);
df3e6548 2983 tp->tg3_flags |= TG3_FLAG_TX_RECOVERY_PENDING;
df3e6548
MC
2984 spin_unlock(&tp->lock);
2985}
2986
1b2a7205
MC
2987static inline u32 tg3_tx_avail(struct tg3 *tp)
2988{
2989 smp_mb();
2990 return (tp->tx_pending -
2991 ((tp->tx_prod - tp->tx_cons) & (TG3_TX_RING_SIZE - 1)));
2992}
2993
1da177e4
LT
2994/* Tigon3 never reports partial packet sends. So we do not
2995 * need special logic to handle SKBs that have not had all
2996 * of their frags sent yet, like SunGEM does.
2997 */
2998static void tg3_tx(struct tg3 *tp)
2999{
3000 u32 hw_idx = tp->hw_status->idx[0].tx_consumer;
3001 u32 sw_idx = tp->tx_cons;
3002
3003 while (sw_idx != hw_idx) {
3004 struct tx_ring_info *ri = &tp->tx_buffers[sw_idx];
3005 struct sk_buff *skb = ri->skb;
df3e6548
MC
3006 int i, tx_bug = 0;
3007
3008 if (unlikely(skb == NULL)) {
3009 tg3_tx_recover(tp);
3010 return;
3011 }
1da177e4 3012
1da177e4
LT
3013 pci_unmap_single(tp->pdev,
3014 pci_unmap_addr(ri, mapping),
3015 skb_headlen(skb),
3016 PCI_DMA_TODEVICE);
3017
3018 ri->skb = NULL;
3019
3020 sw_idx = NEXT_TX(sw_idx);
3021
3022 for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
1da177e4 3023 ri = &tp->tx_buffers[sw_idx];
df3e6548
MC
3024 if (unlikely(ri->skb != NULL || sw_idx == hw_idx))
3025 tx_bug = 1;
1da177e4
LT
3026
3027 pci_unmap_page(tp->pdev,
3028 pci_unmap_addr(ri, mapping),
3029 skb_shinfo(skb)->frags[i].size,
3030 PCI_DMA_TODEVICE);
3031
3032 sw_idx = NEXT_TX(sw_idx);
3033 }
3034
f47c11ee 3035 dev_kfree_skb(skb);
df3e6548
MC
3036
3037 if (unlikely(tx_bug)) {
3038 tg3_tx_recover(tp);
3039 return;
3040 }
1da177e4
LT
3041 }
3042
3043 tp->tx_cons = sw_idx;
3044
1b2a7205
MC
3045 /* Need to make the tx_cons update visible to tg3_start_xmit()
3046 * before checking for netif_queue_stopped(). Without the
3047 * memory barrier, there is a small possibility that tg3_start_xmit()
3048 * will miss it and cause the queue to be stopped forever.
3049 */
3050 smp_mb();
3051
3052 if (unlikely(netif_queue_stopped(tp->dev) &&
3053 (tg3_tx_avail(tp) > TG3_TX_WAKEUP_THRESH))) {
3054 netif_tx_lock(tp->dev);
51b91468 3055 if (netif_queue_stopped(tp->dev) &&
1b2a7205 3056 (tg3_tx_avail(tp) > TG3_TX_WAKEUP_THRESH))
51b91468 3057 netif_wake_queue(tp->dev);
1b2a7205 3058 netif_tx_unlock(tp->dev);
51b91468 3059 }
1da177e4
LT
3060}
3061
3062/* Returns size of skb allocated or < 0 on error.
3063 *
3064 * We only need to fill in the address because the other members
3065 * of the RX descriptor are invariant, see tg3_init_rings.
3066 *
3067 * Note the purposeful assymetry of cpu vs. chip accesses. For
3068 * posting buffers we only dirty the first cache line of the RX
3069 * descriptor (containing the address). Whereas for the RX status
3070 * buffers the cpu only reads the last cacheline of the RX descriptor
3071 * (to fetch the error flags, vlan tag, checksum, and opaque cookie).
3072 */
3073static int tg3_alloc_rx_skb(struct tg3 *tp, u32 opaque_key,
3074 int src_idx, u32 dest_idx_unmasked)
3075{
3076 struct tg3_rx_buffer_desc *desc;
3077 struct ring_info *map, *src_map;
3078 struct sk_buff *skb;
3079 dma_addr_t mapping;
3080 int skb_size, dest_idx;
3081
3082 src_map = NULL;
3083 switch (opaque_key) {
3084 case RXD_OPAQUE_RING_STD:
3085 dest_idx = dest_idx_unmasked % TG3_RX_RING_SIZE;
3086 desc = &tp->rx_std[dest_idx];
3087 map = &tp->rx_std_buffers[dest_idx];
3088 if (src_idx >= 0)
3089 src_map = &tp->rx_std_buffers[src_idx];
7e72aad4 3090 skb_size = tp->rx_pkt_buf_sz;
1da177e4
LT
3091 break;
3092
3093 case RXD_OPAQUE_RING_JUMBO:
3094 dest_idx = dest_idx_unmasked % TG3_RX_JUMBO_RING_SIZE;
3095 desc = &tp->rx_jumbo[dest_idx];
3096 map = &tp->rx_jumbo_buffers[dest_idx];
3097 if (src_idx >= 0)
3098 src_map = &tp->rx_jumbo_buffers[src_idx];
3099 skb_size = RX_JUMBO_PKT_BUF_SZ;
3100 break;
3101
3102 default:
3103 return -EINVAL;
3104 };
3105
3106 /* Do not overwrite any of the map or rp information
3107 * until we are sure we can commit to a new buffer.
3108 *
3109 * Callers depend upon this behavior and assume that
3110 * we leave everything unchanged if we fail.
3111 */
a20e9c62 3112 skb = netdev_alloc_skb(tp->dev, skb_size);
1da177e4
LT
3113 if (skb == NULL)
3114 return -ENOMEM;
3115
1da177e4
LT
3116 skb_reserve(skb, tp->rx_offset);
3117
3118 mapping = pci_map_single(tp->pdev, skb->data,
3119 skb_size - tp->rx_offset,
3120 PCI_DMA_FROMDEVICE);
3121
3122 map->skb = skb;
3123 pci_unmap_addr_set(map, mapping, mapping);
3124
3125 if (src_map != NULL)
3126 src_map->skb = NULL;
3127
3128 desc->addr_hi = ((u64)mapping >> 32);
3129 desc->addr_lo = ((u64)mapping & 0xffffffff);
3130
3131 return skb_size;
3132}
3133
3134/* We only need to move over in the address because the other
3135 * members of the RX descriptor are invariant. See notes above
3136 * tg3_alloc_rx_skb for full details.
3137 */
3138static void tg3_recycle_rx(struct tg3 *tp, u32 opaque_key,
3139 int src_idx, u32 dest_idx_unmasked)
3140{
3141 struct tg3_rx_buffer_desc *src_desc, *dest_desc;
3142 struct ring_info *src_map, *dest_map;
3143 int dest_idx;
3144
3145 switch (opaque_key) {
3146 case RXD_OPAQUE_RING_STD:
3147 dest_idx = dest_idx_unmasked % TG3_RX_RING_SIZE;
3148 dest_desc = &tp->rx_std[dest_idx];
3149 dest_map = &tp->rx_std_buffers[dest_idx];
3150 src_desc = &tp->rx_std[src_idx];
3151 src_map = &tp->rx_std_buffers[src_idx];
3152 break;
3153
3154 case RXD_OPAQUE_RING_JUMBO:
3155 dest_idx = dest_idx_unmasked % TG3_RX_JUMBO_RING_SIZE;
3156 dest_desc = &tp->rx_jumbo[dest_idx];
3157 dest_map = &tp->rx_jumbo_buffers[dest_idx];
3158 src_desc = &tp->rx_jumbo[src_idx];
3159 src_map = &tp->rx_jumbo_buffers[src_idx];
3160 break;
3161
3162 default:
3163 return;
3164 };
3165
3166 dest_map->skb = src_map->skb;
3167 pci_unmap_addr_set(dest_map, mapping,
3168 pci_unmap_addr(src_map, mapping));
3169 dest_desc->addr_hi = src_desc->addr_hi;
3170 dest_desc->addr_lo = src_desc->addr_lo;
3171
3172 src_map->skb = NULL;
3173}
3174
3175#if TG3_VLAN_TAG_USED
3176static int tg3_vlan_rx(struct tg3 *tp, struct sk_buff *skb, u16 vlan_tag)
3177{
3178 return vlan_hwaccel_receive_skb(skb, tp->vlgrp, vlan_tag);
3179}
3180#endif
3181
3182/* The RX ring scheme is composed of multiple rings which post fresh
3183 * buffers to the chip, and one special ring the chip uses to report
3184 * status back to the host.
3185 *
3186 * The special ring reports the status of received packets to the
3187 * host. The chip does not write into the original descriptor the
3188 * RX buffer was obtained from. The chip simply takes the original
3189 * descriptor as provided by the host, updates the status and length
3190 * field, then writes this into the next status ring entry.
3191 *
3192 * Each ring the host uses to post buffers to the chip is described
3193 * by a TG3_BDINFO entry in the chips SRAM area. When a packet arrives,
3194 * it is first placed into the on-chip ram. When the packet's length
3195 * is known, it walks down the TG3_BDINFO entries to select the ring.
3196 * Each TG3_BDINFO specifies a MAXLEN field and the first TG3_BDINFO
3197 * which is within the range of the new packet's length is chosen.
3198 *
3199 * The "separate ring for rx status" scheme may sound queer, but it makes
3200 * sense from a cache coherency perspective. If only the host writes
3201 * to the buffer post rings, and only the chip writes to the rx status
3202 * rings, then cache lines never move beyond shared-modified state.
3203 * If both the host and chip were to write into the same ring, cache line
3204 * eviction could occur since both entities want it in an exclusive state.
3205 */
3206static int tg3_rx(struct tg3 *tp, int budget)
3207{
f92905de 3208 u32 work_mask, rx_std_posted = 0;
483ba50b
MC
3209 u32 sw_idx = tp->rx_rcb_ptr;
3210 u16 hw_idx;
1da177e4
LT
3211 int received;
3212
3213 hw_idx = tp->hw_status->idx[0].rx_producer;
3214 /*
3215 * We need to order the read of hw_idx and the read of
3216 * the opaque cookie.
3217 */
3218 rmb();
1da177e4
LT
3219 work_mask = 0;
3220 received = 0;
3221 while (sw_idx != hw_idx && budget > 0) {
3222 struct tg3_rx_buffer_desc *desc = &tp->rx_rcb[sw_idx];
3223 unsigned int len;
3224 struct sk_buff *skb;
3225 dma_addr_t dma_addr;
3226 u32 opaque_key, desc_idx, *post_ptr;
3227
3228 desc_idx = desc->opaque & RXD_OPAQUE_INDEX_MASK;
3229 opaque_key = desc->opaque & RXD_OPAQUE_RING_MASK;
3230 if (opaque_key == RXD_OPAQUE_RING_STD) {
3231 dma_addr = pci_unmap_addr(&tp->rx_std_buffers[desc_idx],
3232 mapping);
3233 skb = tp->rx_std_buffers[desc_idx].skb;
3234 post_ptr = &tp->rx_std_ptr;
f92905de 3235 rx_std_posted++;
1da177e4
LT
3236 } else if (opaque_key == RXD_OPAQUE_RING_JUMBO) {
3237 dma_addr = pci_unmap_addr(&tp->rx_jumbo_buffers[desc_idx],
3238 mapping);
3239 skb = tp->rx_jumbo_buffers[desc_idx].skb;
3240 post_ptr = &tp->rx_jumbo_ptr;
3241 }
3242 else {
3243 goto next_pkt_nopost;
3244 }
3245
3246 work_mask |= opaque_key;
3247
3248 if ((desc->err_vlan & RXD_ERR_MASK) != 0 &&
3249 (desc->err_vlan != RXD_ERR_ODD_NIBBLE_RCVD_MII)) {
3250 drop_it:
3251 tg3_recycle_rx(tp, opaque_key,
3252 desc_idx, *post_ptr);
3253 drop_it_no_recycle:
3254 /* Other statistics kept track of by card. */
3255 tp->net_stats.rx_dropped++;
3256 goto next_pkt;
3257 }
3258
3259 len = ((desc->idx_len & RXD_LEN_MASK) >> RXD_LEN_SHIFT) - 4; /* omit crc */
3260
6aa20a22 3261 if (len > RX_COPY_THRESHOLD
1da177e4
LT
3262 && tp->rx_offset == 2
3263 /* rx_offset != 2 iff this is a 5701 card running
3264 * in PCI-X mode [see tg3_get_invariants()] */
3265 ) {
3266 int skb_size;
3267
3268 skb_size = tg3_alloc_rx_skb(tp, opaque_key,
3269 desc_idx, *post_ptr);
3270 if (skb_size < 0)
3271 goto drop_it;
3272
3273 pci_unmap_single(tp->pdev, dma_addr,
3274 skb_size - tp->rx_offset,
3275 PCI_DMA_FROMDEVICE);
3276
3277 skb_put(skb, len);
3278 } else {
3279 struct sk_buff *copy_skb;
3280
3281 tg3_recycle_rx(tp, opaque_key,
3282 desc_idx, *post_ptr);
3283
a20e9c62 3284 copy_skb = netdev_alloc_skb(tp->dev, len + 2);
1da177e4
LT
3285 if (copy_skb == NULL)
3286 goto drop_it_no_recycle;
3287
1da177e4
LT
3288 skb_reserve(copy_skb, 2);
3289 skb_put(copy_skb, len);
3290 pci_dma_sync_single_for_cpu(tp->pdev, dma_addr, len, PCI_DMA_FROMDEVICE);
3291 memcpy(copy_skb->data, skb->data, len);
3292 pci_dma_sync_single_for_device(tp->pdev, dma_addr, len, PCI_DMA_FROMDEVICE);
3293
3294 /* We'll reuse the original ring buffer. */
3295 skb = copy_skb;
3296 }
3297
3298 if ((tp->tg3_flags & TG3_FLAG_RX_CHECKSUMS) &&
3299 (desc->type_flags & RXD_FLAG_TCPUDP_CSUM) &&
3300 (((desc->ip_tcp_csum & RXD_TCPCSUM_MASK)
3301 >> RXD_TCPCSUM_SHIFT) == 0xffff))
3302 skb->ip_summed = CHECKSUM_UNNECESSARY;
3303 else
3304 skb->ip_summed = CHECKSUM_NONE;
3305
3306 skb->protocol = eth_type_trans(skb, tp->dev);
3307#if TG3_VLAN_TAG_USED
3308 if (tp->vlgrp != NULL &&
3309 desc->type_flags & RXD_FLAG_VLAN) {
3310 tg3_vlan_rx(tp, skb,
3311 desc->err_vlan & RXD_VLAN_MASK);
3312 } else
3313#endif
3314 netif_receive_skb(skb);
3315
3316 tp->dev->last_rx = jiffies;
3317 received++;
3318 budget--;
3319
3320next_pkt:
3321 (*post_ptr)++;
f92905de
MC
3322
3323 if (unlikely(rx_std_posted >= tp->rx_std_max_post)) {
3324 u32 idx = *post_ptr % TG3_RX_RING_SIZE;
3325
3326 tw32_rx_mbox(MAILBOX_RCV_STD_PROD_IDX +
3327 TG3_64BIT_REG_LOW, idx);
3328 work_mask &= ~RXD_OPAQUE_RING_STD;
3329 rx_std_posted = 0;
3330 }
1da177e4 3331next_pkt_nopost:
483ba50b
MC
3332 sw_idx++;
3333 sw_idx %= TG3_RX_RCB_RING_SIZE(tp);
52f6d697
MC
3334
3335 /* Refresh hw_idx to see if there is new work */
3336 if (sw_idx == hw_idx) {
3337 hw_idx = tp->hw_status->idx[0].rx_producer;
3338 rmb();
3339 }
1da177e4
LT
3340 }
3341
3342 /* ACK the status ring. */
483ba50b
MC
3343 tp->rx_rcb_ptr = sw_idx;
3344 tw32_rx_mbox(MAILBOX_RCVRET_CON_IDX_0 + TG3_64BIT_REG_LOW, sw_idx);
1da177e4
LT
3345
3346 /* Refill RX ring(s). */
3347 if (work_mask & RXD_OPAQUE_RING_STD) {
3348 sw_idx = tp->rx_std_ptr % TG3_RX_RING_SIZE;
3349 tw32_rx_mbox(MAILBOX_RCV_STD_PROD_IDX + TG3_64BIT_REG_LOW,
3350 sw_idx);
3351 }
3352 if (work_mask & RXD_OPAQUE_RING_JUMBO) {
3353 sw_idx = tp->rx_jumbo_ptr % TG3_RX_JUMBO_RING_SIZE;
3354 tw32_rx_mbox(MAILBOX_RCV_JUMBO_PROD_IDX + TG3_64BIT_REG_LOW,
3355 sw_idx);
3356 }
3357 mmiowb();
3358
3359 return received;
3360}
3361
3362static int tg3_poll(struct net_device *netdev, int *budget)
3363{
3364 struct tg3 *tp = netdev_priv(netdev);
3365 struct tg3_hw_status *sblk = tp->hw_status;
1da177e4
LT
3366 int done;
3367
1da177e4
LT
3368 /* handle link change and other phy events */
3369 if (!(tp->tg3_flags &
3370 (TG3_FLAG_USE_LINKCHG_REG |
3371 TG3_FLAG_POLL_SERDES))) {
3372 if (sblk->status & SD_STATUS_LINK_CHG) {
3373 sblk->status = SD_STATUS_UPDATED |
3374 (sblk->status & ~SD_STATUS_LINK_CHG);
f47c11ee 3375 spin_lock(&tp->lock);
1da177e4 3376 tg3_setup_phy(tp, 0);
f47c11ee 3377 spin_unlock(&tp->lock);
1da177e4
LT
3378 }
3379 }
3380
3381 /* run TX completion thread */
3382 if (sblk->idx[0].tx_consumer != tp->tx_cons) {
1da177e4 3383 tg3_tx(tp);
df3e6548
MC
3384 if (unlikely(tp->tg3_flags & TG3_FLAG_TX_RECOVERY_PENDING)) {
3385 netif_rx_complete(netdev);
3386 schedule_work(&tp->reset_task);
3387 return 0;
3388 }
1da177e4
LT
3389 }
3390
1da177e4
LT
3391 /* run RX thread, within the bounds set by NAPI.
3392 * All RX "locking" is done by ensuring outside
3393 * code synchronizes with dev->poll()
3394 */
1da177e4
LT
3395 if (sblk->idx[0].rx_producer != tp->rx_rcb_ptr) {
3396 int orig_budget = *budget;
3397 int work_done;
3398
3399 if (orig_budget > netdev->quota)
3400 orig_budget = netdev->quota;
3401
3402 work_done = tg3_rx(tp, orig_budget);
3403
3404 *budget -= work_done;
3405 netdev->quota -= work_done;
1da177e4
LT
3406 }
3407
38f3843e 3408 if (tp->tg3_flags & TG3_FLAG_TAGGED_STATUS) {
f7383c22 3409 tp->last_tag = sblk->status_tag;
38f3843e
MC
3410 rmb();
3411 } else
3412 sblk->status &= ~SD_STATUS_UPDATED;
f7383c22 3413
1da177e4 3414 /* if no more work, tell net stack and NIC we're done */
f7383c22 3415 done = !tg3_has_work(tp);
1da177e4 3416 if (done) {
f47c11ee 3417 netif_rx_complete(netdev);
1da177e4 3418 tg3_restart_ints(tp);
1da177e4
LT
3419 }
3420
3421 return (done ? 0 : 1);
3422}
3423
f47c11ee
DM
3424static void tg3_irq_quiesce(struct tg3 *tp)
3425{
3426 BUG_ON(tp->irq_sync);
3427
3428 tp->irq_sync = 1;
3429 smp_mb();
3430
3431 synchronize_irq(tp->pdev->irq);
3432}
3433
3434static inline int tg3_irq_sync(struct tg3 *tp)
3435{
3436 return tp->irq_sync;
3437}
3438
3439/* Fully shutdown all tg3 driver activity elsewhere in the system.
3440 * If irq_sync is non-zero, then the IRQ handler must be synchronized
3441 * with as well. Most of the time, this is not necessary except when
3442 * shutting down the device.
3443 */
3444static inline void tg3_full_lock(struct tg3 *tp, int irq_sync)
3445{
3446 if (irq_sync)
3447 tg3_irq_quiesce(tp);
3448 spin_lock_bh(&tp->lock);
f47c11ee
DM
3449}
3450
3451static inline void tg3_full_unlock(struct tg3 *tp)
3452{
f47c11ee
DM
3453 spin_unlock_bh(&tp->lock);
3454}
3455
fcfa0a32
MC
3456/* One-shot MSI handler - Chip automatically disables interrupt
3457 * after sending MSI so driver doesn't have to do it.
3458 */
3459static irqreturn_t tg3_msi_1shot(int irq, void *dev_id, struct pt_regs *regs)
3460{
3461 struct net_device *dev = dev_id;
3462 struct tg3 *tp = netdev_priv(dev);
3463
3464 prefetch(tp->hw_status);
3465 prefetch(&tp->rx_rcb[tp->rx_rcb_ptr]);
3466
3467 if (likely(!tg3_irq_sync(tp)))
3468 netif_rx_schedule(dev); /* schedule NAPI poll */
3469
3470 return IRQ_HANDLED;
3471}
3472
88b06bc2
MC
3473/* MSI ISR - No need to check for interrupt sharing and no need to
3474 * flush status block and interrupt mailbox. PCI ordering rules
3475 * guarantee that MSI will arrive after the status block.
3476 */
3477static irqreturn_t tg3_msi(int irq, void *dev_id, struct pt_regs *regs)
3478{
3479 struct net_device *dev = dev_id;
3480 struct tg3 *tp = netdev_priv(dev);
88b06bc2 3481
61487480
MC
3482 prefetch(tp->hw_status);
3483 prefetch(&tp->rx_rcb[tp->rx_rcb_ptr]);
88b06bc2 3484 /*
fac9b83e 3485 * Writing any value to intr-mbox-0 clears PCI INTA# and
88b06bc2 3486 * chip-internal interrupt pending events.
fac9b83e 3487 * Writing non-zero to intr-mbox-0 additional tells the
88b06bc2
MC
3488 * NIC to stop sending us irqs, engaging "in-intr-handler"
3489 * event coalescing.
3490 */
3491 tw32_mailbox(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW, 0x00000001);
61487480 3492 if (likely(!tg3_irq_sync(tp)))
88b06bc2 3493 netif_rx_schedule(dev); /* schedule NAPI poll */
61487480 3494
88b06bc2
MC
3495 return IRQ_RETVAL(1);
3496}
3497
1da177e4
LT
3498static irqreturn_t tg3_interrupt(int irq, void *dev_id, struct pt_regs *regs)
3499{
3500 struct net_device *dev = dev_id;
3501 struct tg3 *tp = netdev_priv(dev);
3502 struct tg3_hw_status *sblk = tp->hw_status;
1da177e4
LT
3503 unsigned int handled = 1;
3504
1da177e4
LT
3505 /* In INTx mode, it is possible for the interrupt to arrive at
3506 * the CPU before the status block posted prior to the interrupt.
3507 * Reading the PCI State register will confirm whether the
3508 * interrupt is ours and will flush the status block.
3509 */
3510 if ((sblk->status & SD_STATUS_UPDATED) ||
3511 !(tr32(TG3PCI_PCISTATE) & PCISTATE_INT_NOT_ACTIVE)) {
3512 /*
fac9b83e 3513 * Writing any value to intr-mbox-0 clears PCI INTA# and
1da177e4 3514 * chip-internal interrupt pending events.
fac9b83e 3515 * Writing non-zero to intr-mbox-0 additional tells the
1da177e4
LT
3516 * NIC to stop sending us irqs, engaging "in-intr-handler"
3517 * event coalescing.
3518 */
3519 tw32_mailbox(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW,
3520 0x00000001);
f47c11ee
DM
3521 if (tg3_irq_sync(tp))
3522 goto out;
fac9b83e 3523 sblk->status &= ~SD_STATUS_UPDATED;
61487480
MC
3524 if (likely(tg3_has_work(tp))) {
3525 prefetch(&tp->rx_rcb[tp->rx_rcb_ptr]);
fac9b83e 3526 netif_rx_schedule(dev); /* schedule NAPI poll */
61487480 3527 } else {
fac9b83e
DM
3528 /* No work, shared interrupt perhaps? re-enable
3529 * interrupts, and flush that PCI write
3530 */
09ee929c 3531 tw32_mailbox_f(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW,
fac9b83e 3532 0x00000000);
fac9b83e
DM
3533 }
3534 } else { /* shared interrupt */
3535 handled = 0;
3536 }
f47c11ee 3537out:
fac9b83e
DM
3538 return IRQ_RETVAL(handled);
3539}
3540
3541static irqreturn_t tg3_interrupt_tagged(int irq, void *dev_id, struct pt_regs *regs)
3542{
3543 struct net_device *dev = dev_id;
3544 struct tg3 *tp = netdev_priv(dev);
3545 struct tg3_hw_status *sblk = tp->hw_status;
fac9b83e
DM
3546 unsigned int handled = 1;
3547
fac9b83e
DM
3548 /* In INTx mode, it is possible for the interrupt to arrive at
3549 * the CPU before the status block posted prior to the interrupt.
3550 * Reading the PCI State register will confirm whether the
3551 * interrupt is ours and will flush the status block.
3552 */
38f3843e 3553 if ((sblk->status_tag != tp->last_tag) ||
fac9b83e 3554 !(tr32(TG3PCI_PCISTATE) & PCISTATE_INT_NOT_ACTIVE)) {
1da177e4 3555 /*
fac9b83e
DM
3556 * writing any value to intr-mbox-0 clears PCI INTA# and
3557 * chip-internal interrupt pending events.
3558 * writing non-zero to intr-mbox-0 additional tells the
3559 * NIC to stop sending us irqs, engaging "in-intr-handler"
3560 * event coalescing.
1da177e4 3561 */
fac9b83e
DM
3562 tw32_mailbox(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW,
3563 0x00000001);
f47c11ee
DM
3564 if (tg3_irq_sync(tp))
3565 goto out;
38f3843e 3566 if (netif_rx_schedule_prep(dev)) {
61487480 3567 prefetch(&tp->rx_rcb[tp->rx_rcb_ptr]);
38f3843e
MC
3568 /* Update last_tag to mark that this status has been
3569 * seen. Because interrupt may be shared, we may be
3570 * racing with tg3_poll(), so only update last_tag
3571 * if tg3_poll() is not scheduled.
1da177e4 3572 */
38f3843e
MC
3573 tp->last_tag = sblk->status_tag;
3574 __netif_rx_schedule(dev);
1da177e4
LT
3575 }
3576 } else { /* shared interrupt */
3577 handled = 0;
3578 }
f47c11ee 3579out:
1da177e4
LT
3580 return IRQ_RETVAL(handled);
3581}
3582
7938109f
MC
3583/* ISR for interrupt test */
3584static irqreturn_t tg3_test_isr(int irq, void *dev_id,
3585 struct pt_regs *regs)
3586{
3587 struct net_device *dev = dev_id;
3588 struct tg3 *tp = netdev_priv(dev);
3589 struct tg3_hw_status *sblk = tp->hw_status;
3590
f9804ddb
MC
3591 if ((sblk->status & SD_STATUS_UPDATED) ||
3592 !(tr32(TG3PCI_PCISTATE) & PCISTATE_INT_NOT_ACTIVE)) {
7938109f
MC
3593 tw32_mailbox(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW,
3594 0x00000001);
3595 return IRQ_RETVAL(1);
3596 }
3597 return IRQ_RETVAL(0);
3598}
3599
8e7a22e3 3600static int tg3_init_hw(struct tg3 *, int);
944d980e 3601static int tg3_halt(struct tg3 *, int, int);
1da177e4 3602
b9ec6c1b
MC
3603/* Restart hardware after configuration changes, self-test, etc.
3604 * Invoked with tp->lock held.
3605 */
3606static int tg3_restart_hw(struct tg3 *tp, int reset_phy)
3607{
3608 int err;
3609
3610 err = tg3_init_hw(tp, reset_phy);
3611 if (err) {
3612 printk(KERN_ERR PFX "%s: Failed to re-initialize device, "
3613 "aborting.\n", tp->dev->name);
3614 tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
3615 tg3_full_unlock(tp);
3616 del_timer_sync(&tp->timer);
3617 tp->irq_sync = 0;
3618 netif_poll_enable(tp->dev);
3619 dev_close(tp->dev);
3620 tg3_full_lock(tp, 0);
3621 }
3622 return err;
3623}
3624
1da177e4
LT
3625#ifdef CONFIG_NET_POLL_CONTROLLER
3626static void tg3_poll_controller(struct net_device *dev)
3627{
88b06bc2
MC
3628 struct tg3 *tp = netdev_priv(dev);
3629
3630 tg3_interrupt(tp->pdev->irq, dev, NULL);
1da177e4
LT
3631}
3632#endif
3633
3634static void tg3_reset_task(void *_data)
3635{
3636 struct tg3 *tp = _data;
3637 unsigned int restart_timer;
3638
7faa006f
MC
3639 tg3_full_lock(tp, 0);
3640 tp->tg3_flags |= TG3_FLAG_IN_RESET_TASK;
3641
3642 if (!netif_running(tp->dev)) {
3643 tp->tg3_flags &= ~TG3_FLAG_IN_RESET_TASK;
3644 tg3_full_unlock(tp);
3645 return;
3646 }
3647
3648 tg3_full_unlock(tp);
3649
1da177e4
LT
3650 tg3_netif_stop(tp);
3651
f47c11ee 3652 tg3_full_lock(tp, 1);
1da177e4
LT
3653
3654 restart_timer = tp->tg3_flags2 & TG3_FLG2_RESTART_TIMER;
3655 tp->tg3_flags2 &= ~TG3_FLG2_RESTART_TIMER;
3656
df3e6548
MC
3657 if (tp->tg3_flags & TG3_FLAG_TX_RECOVERY_PENDING) {
3658 tp->write32_tx_mbox = tg3_write32_tx_mbox;
3659 tp->write32_rx_mbox = tg3_write_flush_reg32;
3660 tp->tg3_flags |= TG3_FLAG_MBOX_WRITE_REORDER;
3661 tp->tg3_flags &= ~TG3_FLAG_TX_RECOVERY_PENDING;
3662 }
3663
944d980e 3664 tg3_halt(tp, RESET_KIND_SHUTDOWN, 0);
b9ec6c1b
MC
3665 if (tg3_init_hw(tp, 1))
3666 goto out;
1da177e4
LT
3667
3668 tg3_netif_start(tp);
3669
1da177e4
LT
3670 if (restart_timer)
3671 mod_timer(&tp->timer, jiffies + 1);
7faa006f 3672
b9ec6c1b 3673out:
7faa006f
MC
3674 tp->tg3_flags &= ~TG3_FLAG_IN_RESET_TASK;
3675
3676 tg3_full_unlock(tp);
1da177e4
LT
3677}
3678
3679static void tg3_tx_timeout(struct net_device *dev)
3680{
3681 struct tg3 *tp = netdev_priv(dev);
3682
3683 printk(KERN_ERR PFX "%s: transmit timed out, resetting\n",
3684 dev->name);
3685
3686 schedule_work(&tp->reset_task);
3687}
3688
c58ec932
MC
3689/* Test for DMA buffers crossing any 4GB boundaries: 4G, 8G, etc */
3690static inline int tg3_4g_overflow_test(dma_addr_t mapping, int len)
3691{
3692 u32 base = (u32) mapping & 0xffffffff;
3693
3694 return ((base > 0xffffdcc0) &&
3695 (base + len + 8 < base));
3696}
3697
72f2afb8
MC
3698/* Test for DMA addresses > 40-bit */
3699static inline int tg3_40bit_overflow_test(struct tg3 *tp, dma_addr_t mapping,
3700 int len)
3701{
3702#if defined(CONFIG_HIGHMEM) && (BITS_PER_LONG == 64)
6728a8e2 3703 if (tp->tg3_flags & TG3_FLAG_40BIT_DMA_BUG)
72f2afb8
MC
3704 return (((u64) mapping + len) > DMA_40BIT_MASK);
3705 return 0;
3706#else
3707 return 0;
3708#endif
3709}
3710
1da177e4
LT
3711static void tg3_set_txd(struct tg3 *, int, dma_addr_t, int, u32, u32);
3712
72f2afb8
MC
3713/* Workaround 4GB and 40-bit hardware DMA bugs. */
3714static int tigon3_dma_hwbug_workaround(struct tg3 *tp, struct sk_buff *skb,
c58ec932
MC
3715 u32 last_plus_one, u32 *start,
3716 u32 base_flags, u32 mss)
1da177e4
LT
3717{
3718 struct sk_buff *new_skb = skb_copy(skb, GFP_ATOMIC);
c58ec932 3719 dma_addr_t new_addr = 0;
1da177e4 3720 u32 entry = *start;
c58ec932 3721 int i, ret = 0;
1da177e4
LT
3722
3723 if (!new_skb) {
c58ec932
MC
3724 ret = -1;
3725 } else {
3726 /* New SKB is guaranteed to be linear. */
3727 entry = *start;
3728 new_addr = pci_map_single(tp->pdev, new_skb->data, new_skb->len,
3729 PCI_DMA_TODEVICE);
3730 /* Make sure new skb does not cross any 4G boundaries.
3731 * Drop the packet if it does.
3732 */
3733 if (tg3_4g_overflow_test(new_addr, new_skb->len)) {
3734 ret = -1;
3735 dev_kfree_skb(new_skb);
3736 new_skb = NULL;
3737 } else {
3738 tg3_set_txd(tp, entry, new_addr, new_skb->len,
3739 base_flags, 1 | (mss << 1));
3740 *start = NEXT_TX(entry);
3741 }
1da177e4
LT
3742 }
3743
1da177e4
LT
3744 /* Now clean up the sw ring entries. */
3745 i = 0;
3746 while (entry != last_plus_one) {
3747 int len;
3748
3749 if (i == 0)
3750 len = skb_headlen(skb);
3751 else
3752 len = skb_shinfo(skb)->frags[i-1].size;
3753 pci_unmap_single(tp->pdev,
3754 pci_unmap_addr(&tp->tx_buffers[entry], mapping),
3755 len, PCI_DMA_TODEVICE);
3756 if (i == 0) {
3757 tp->tx_buffers[entry].skb = new_skb;
3758 pci_unmap_addr_set(&tp->tx_buffers[entry], mapping, new_addr);
3759 } else {
3760 tp->tx_buffers[entry].skb = NULL;
3761 }
3762 entry = NEXT_TX(entry);
3763 i++;
3764 }
3765
3766 dev_kfree_skb(skb);
3767
c58ec932 3768 return ret;
1da177e4
LT
3769}
3770
3771static void tg3_set_txd(struct tg3 *tp, int entry,
3772 dma_addr_t mapping, int len, u32 flags,
3773 u32 mss_and_is_end)
3774{
3775 struct tg3_tx_buffer_desc *txd = &tp->tx_ring[entry];
3776 int is_end = (mss_and_is_end & 0x1);
3777 u32 mss = (mss_and_is_end >> 1);
3778 u32 vlan_tag = 0;
3779
3780 if (is_end)
3781 flags |= TXD_FLAG_END;
3782 if (flags & TXD_FLAG_VLAN) {
3783 vlan_tag = flags >> 16;
3784 flags &= 0xffff;
3785 }
3786 vlan_tag |= (mss << TXD_MSS_SHIFT);
3787
3788 txd->addr_hi = ((u64) mapping >> 32);
3789 txd->addr_lo = ((u64) mapping & 0xffffffff);
3790 txd->len_flags = (len << TXD_LEN_SHIFT) | flags;
3791 txd->vlan_tag = vlan_tag << TXD_VLAN_TAG_SHIFT;
3792}
3793
5a6f3074
MC
3794/* hard_start_xmit for devices that don't have any bugs and
3795 * support TG3_FLG2_HW_TSO_2 only.
3796 */
1da177e4 3797static int tg3_start_xmit(struct sk_buff *skb, struct net_device *dev)
5a6f3074
MC
3798{
3799 struct tg3 *tp = netdev_priv(dev);
3800 dma_addr_t mapping;
3801 u32 len, entry, base_flags, mss;
3802
3803 len = skb_headlen(skb);
3804
00b70504
MC
3805 /* We are running in BH disabled context with netif_tx_lock
3806 * and TX reclaim runs via tp->poll inside of a software
5a6f3074
MC
3807 * interrupt. Furthermore, IRQ processing runs lockless so we have
3808 * no IRQ context deadlocks to worry about either. Rejoice!
3809 */
1b2a7205 3810 if (unlikely(tg3_tx_avail(tp) <= (skb_shinfo(skb)->nr_frags + 1))) {
5a6f3074
MC
3811 if (!netif_queue_stopped(dev)) {
3812 netif_stop_queue(dev);
3813
3814 /* This is a hard error, log it. */
3815 printk(KERN_ERR PFX "%s: BUG! Tx Ring full when "
3816 "queue awake!\n", dev->name);
3817 }
5a6f3074
MC
3818 return NETDEV_TX_BUSY;
3819 }
3820
3821 entry = tp->tx_prod;
3822 base_flags = 0;
3823#if TG3_TSO_SUPPORT != 0
3824 mss = 0;
3825 if (skb->len > (tp->dev->mtu + ETH_HLEN) &&
7967168c 3826 (mss = skb_shinfo(skb)->gso_size) != 0) {
5a6f3074
MC
3827 int tcp_opt_len, ip_tcp_len;
3828
3829 if (skb_header_cloned(skb) &&
3830 pskb_expand_head(skb, 0, 0, GFP_ATOMIC)) {
3831 dev_kfree_skb(skb);
3832 goto out_unlock;
3833 }
3834
b0026624
MC
3835 if (skb_shinfo(skb)->gso_type & SKB_GSO_TCPV6)
3836 mss |= (skb_headlen(skb) - ETH_HLEN) << 9;
3837 else {
3838 tcp_opt_len = ((skb->h.th->doff - 5) * 4);
3839 ip_tcp_len = (skb->nh.iph->ihl * 4) +
3840 sizeof(struct tcphdr);
3841
3842 skb->nh.iph->check = 0;
3843 skb->nh.iph->tot_len = htons(mss + ip_tcp_len +
3844 tcp_opt_len);
3845 mss |= (ip_tcp_len + tcp_opt_len) << 9;
3846 }
5a6f3074
MC
3847
3848 base_flags |= (TXD_FLAG_CPU_PRE_DMA |
3849 TXD_FLAG_CPU_POST_DMA);
3850
5a6f3074
MC
3851 skb->h.th->check = 0;
3852
5a6f3074
MC
3853 }
3854 else if (skb->ip_summed == CHECKSUM_HW)
3855 base_flags |= TXD_FLAG_TCPUDP_CSUM;
3856#else
3857 mss = 0;
3858 if (skb->ip_summed == CHECKSUM_HW)
3859 base_flags |= TXD_FLAG_TCPUDP_CSUM;
3860#endif
3861#if TG3_VLAN_TAG_USED
3862 if (tp->vlgrp != NULL && vlan_tx_tag_present(skb))
3863 base_flags |= (TXD_FLAG_VLAN |
3864 (vlan_tx_tag_get(skb) << 16));
3865#endif
3866
3867 /* Queue skb data, a.k.a. the main skb fragment. */
3868 mapping = pci_map_single(tp->pdev, skb->data, len, PCI_DMA_TODEVICE);
3869
3870 tp->tx_buffers[entry].skb = skb;
3871 pci_unmap_addr_set(&tp->tx_buffers[entry], mapping, mapping);
3872
3873 tg3_set_txd(tp, entry, mapping, len, base_flags,
3874 (skb_shinfo(skb)->nr_frags == 0) | (mss << 1));
3875
3876 entry = NEXT_TX(entry);
3877
3878 /* Now loop through additional data fragments, and queue them. */
3879 if (skb_shinfo(skb)->nr_frags > 0) {
3880 unsigned int i, last;
3881
3882 last = skb_shinfo(skb)->nr_frags - 1;
3883 for (i = 0; i <= last; i++) {
3884 skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
3885
3886 len = frag->size;
3887 mapping = pci_map_page(tp->pdev,
3888 frag->page,
3889 frag->page_offset,
3890 len, PCI_DMA_TODEVICE);
3891
3892 tp->tx_buffers[entry].skb = NULL;
3893 pci_unmap_addr_set(&tp->tx_buffers[entry], mapping, mapping);
3894
3895 tg3_set_txd(tp, entry, mapping, len,
3896 base_flags, (i == last) | (mss << 1));
3897
3898 entry = NEXT_TX(entry);
3899 }
3900 }
3901
3902 /* Packets are ready, update Tx producer idx local and on card. */
3903 tw32_tx_mbox((MAILBOX_SNDHOST_PROD_IDX_0 + TG3_64BIT_REG_LOW), entry);
3904
3905 tp->tx_prod = entry;
1b2a7205 3906 if (unlikely(tg3_tx_avail(tp) <= (MAX_SKB_FRAGS + 1))) {
5a6f3074 3907 netif_stop_queue(dev);
1b2a7205 3908 if (tg3_tx_avail(tp) > TG3_TX_WAKEUP_THRESH)
5a6f3074
MC
3909 netif_wake_queue(tp->dev);
3910 }
3911
3912out_unlock:
3913 mmiowb();
5a6f3074
MC
3914
3915 dev->trans_start = jiffies;
3916
3917 return NETDEV_TX_OK;
3918}
3919
52c0fd83
MC
3920#if TG3_TSO_SUPPORT != 0
3921static int tg3_start_xmit_dma_bug(struct sk_buff *, struct net_device *);
3922
3923/* Use GSO to workaround a rare TSO bug that may be triggered when the
3924 * TSO header is greater than 80 bytes.
3925 */
3926static int tg3_tso_bug(struct tg3 *tp, struct sk_buff *skb)
3927{
3928 struct sk_buff *segs, *nskb;
3929
3930 /* Estimate the number of fragments in the worst case */
1b2a7205 3931 if (unlikely(tg3_tx_avail(tp) <= (skb_shinfo(skb)->gso_segs * 3))) {
52c0fd83
MC
3932 netif_stop_queue(tp->dev);
3933 return NETDEV_TX_BUSY;
3934 }
3935
3936 segs = skb_gso_segment(skb, tp->dev->features & ~NETIF_F_TSO);
3937 if (unlikely(IS_ERR(segs)))
3938 goto tg3_tso_bug_end;
3939
3940 do {
3941 nskb = segs;
3942 segs = segs->next;
3943 nskb->next = NULL;
3944 tg3_start_xmit_dma_bug(nskb, tp->dev);
3945 } while (segs);
3946
3947tg3_tso_bug_end:
3948 dev_kfree_skb(skb);
3949
3950 return NETDEV_TX_OK;
3951}
3952#endif
3953
5a6f3074
MC
3954/* hard_start_xmit for devices that have the 4G bug and/or 40-bit bug and
3955 * support TG3_FLG2_HW_TSO_1 or firmware TSO only.
3956 */
3957static int tg3_start_xmit_dma_bug(struct sk_buff *skb, struct net_device *dev)
1da177e4
LT
3958{
3959 struct tg3 *tp = netdev_priv(dev);
3960 dma_addr_t mapping;
1da177e4
LT
3961 u32 len, entry, base_flags, mss;
3962 int would_hit_hwbug;
1da177e4
LT
3963
3964 len = skb_headlen(skb);
3965
00b70504
MC
3966 /* We are running in BH disabled context with netif_tx_lock
3967 * and TX reclaim runs via tp->poll inside of a software
f47c11ee
DM
3968 * interrupt. Furthermore, IRQ processing runs lockless so we have
3969 * no IRQ context deadlocks to worry about either. Rejoice!
1da177e4 3970 */
1b2a7205 3971 if (unlikely(tg3_tx_avail(tp) <= (skb_shinfo(skb)->nr_frags + 1))) {
1f064a87
SH
3972 if (!netif_queue_stopped(dev)) {
3973 netif_stop_queue(dev);
3974
3975 /* This is a hard error, log it. */
3976 printk(KERN_ERR PFX "%s: BUG! Tx Ring full when "
3977 "queue awake!\n", dev->name);
3978 }
1da177e4
LT
3979 return NETDEV_TX_BUSY;
3980 }
3981
3982 entry = tp->tx_prod;
3983 base_flags = 0;
3984 if (skb->ip_summed == CHECKSUM_HW)
3985 base_flags |= TXD_FLAG_TCPUDP_CSUM;
3986#if TG3_TSO_SUPPORT != 0
3987 mss = 0;
3988 if (skb->len > (tp->dev->mtu + ETH_HLEN) &&
7967168c 3989 (mss = skb_shinfo(skb)->gso_size) != 0) {
52c0fd83 3990 int tcp_opt_len, ip_tcp_len, hdr_len;
1da177e4
LT
3991
3992 if (skb_header_cloned(skb) &&
3993 pskb_expand_head(skb, 0, 0, GFP_ATOMIC)) {
3994 dev_kfree_skb(skb);
3995 goto out_unlock;
3996 }
3997
3998 tcp_opt_len = ((skb->h.th->doff - 5) * 4);
3999 ip_tcp_len = (skb->nh.iph->ihl * 4) + sizeof(struct tcphdr);
4000
52c0fd83
MC
4001 hdr_len = ip_tcp_len + tcp_opt_len;
4002 if (unlikely((ETH_HLEN + hdr_len) > 80) &&
4003 (tp->tg3_flags2 & TG3_FLG2_HW_TSO_1_BUG))
4004 return (tg3_tso_bug(tp, skb));
4005
1da177e4
LT
4006 base_flags |= (TXD_FLAG_CPU_PRE_DMA |
4007 TXD_FLAG_CPU_POST_DMA);
4008
4009 skb->nh.iph->check = 0;
52c0fd83 4010 skb->nh.iph->tot_len = htons(mss + hdr_len);
1da177e4
LT
4011 if (tp->tg3_flags2 & TG3_FLG2_HW_TSO) {
4012 skb->h.th->check = 0;
4013 base_flags &= ~TXD_FLAG_TCPUDP_CSUM;
4014 }
4015 else {
4016 skb->h.th->check =
4017 ~csum_tcpudp_magic(skb->nh.iph->saddr,
4018 skb->nh.iph->daddr,
4019 0, IPPROTO_TCP, 0);
4020 }
4021
4022 if ((tp->tg3_flags2 & TG3_FLG2_HW_TSO) ||
4023 (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705)) {
4024 if (tcp_opt_len || skb->nh.iph->ihl > 5) {
4025 int tsflags;
4026
4027 tsflags = ((skb->nh.iph->ihl - 5) +
4028 (tcp_opt_len >> 2));
4029 mss |= (tsflags << 11);
4030 }
4031 } else {
4032 if (tcp_opt_len || skb->nh.iph->ihl > 5) {
4033 int tsflags;
4034
4035 tsflags = ((skb->nh.iph->ihl - 5) +
4036 (tcp_opt_len >> 2));
4037 base_flags |= tsflags << 12;
4038 }
4039 }
4040 }
4041#else
4042 mss = 0;
4043#endif
4044#if TG3_VLAN_TAG_USED
4045 if (tp->vlgrp != NULL && vlan_tx_tag_present(skb))
4046 base_flags |= (TXD_FLAG_VLAN |
4047 (vlan_tx_tag_get(skb) << 16));
4048#endif
4049
4050 /* Queue skb data, a.k.a. the main skb fragment. */
4051 mapping = pci_map_single(tp->pdev, skb->data, len, PCI_DMA_TODEVICE);
4052
4053 tp->tx_buffers[entry].skb = skb;
4054 pci_unmap_addr_set(&tp->tx_buffers[entry], mapping, mapping);
4055
4056 would_hit_hwbug = 0;
4057
4058 if (tg3_4g_overflow_test(mapping, len))
c58ec932 4059 would_hit_hwbug = 1;
1da177e4
LT
4060
4061 tg3_set_txd(tp, entry, mapping, len, base_flags,
4062 (skb_shinfo(skb)->nr_frags == 0) | (mss << 1));
4063
4064 entry = NEXT_TX(entry);
4065
4066 /* Now loop through additional data fragments, and queue them. */
4067 if (skb_shinfo(skb)->nr_frags > 0) {
4068 unsigned int i, last;
4069
4070 last = skb_shinfo(skb)->nr_frags - 1;
4071 for (i = 0; i <= last; i++) {
4072 skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
4073
4074 len = frag->size;
4075 mapping = pci_map_page(tp->pdev,
4076 frag->page,
4077 frag->page_offset,
4078 len, PCI_DMA_TODEVICE);
4079
4080 tp->tx_buffers[entry].skb = NULL;
4081 pci_unmap_addr_set(&tp->tx_buffers[entry], mapping, mapping);
4082
c58ec932
MC
4083 if (tg3_4g_overflow_test(mapping, len))
4084 would_hit_hwbug = 1;
1da177e4 4085
72f2afb8
MC
4086 if (tg3_40bit_overflow_test(tp, mapping, len))
4087 would_hit_hwbug = 1;
4088
1da177e4
LT
4089 if (tp->tg3_flags2 & TG3_FLG2_HW_TSO)
4090 tg3_set_txd(tp, entry, mapping, len,
4091 base_flags, (i == last)|(mss << 1));
4092 else
4093 tg3_set_txd(tp, entry, mapping, len,
4094 base_flags, (i == last));
4095
4096 entry = NEXT_TX(entry);
4097 }
4098 }
4099
4100 if (would_hit_hwbug) {
4101 u32 last_plus_one = entry;
4102 u32 start;
1da177e4 4103
c58ec932
MC
4104 start = entry - 1 - skb_shinfo(skb)->nr_frags;
4105 start &= (TG3_TX_RING_SIZE - 1);
1da177e4
LT
4106
4107 /* If the workaround fails due to memory/mapping
4108 * failure, silently drop this packet.
4109 */
72f2afb8 4110 if (tigon3_dma_hwbug_workaround(tp, skb, last_plus_one,
c58ec932 4111 &start, base_flags, mss))
1da177e4
LT
4112 goto out_unlock;
4113
4114 entry = start;
4115 }
4116
4117 /* Packets are ready, update Tx producer idx local and on card. */
4118 tw32_tx_mbox((MAILBOX_SNDHOST_PROD_IDX_0 + TG3_64BIT_REG_LOW), entry);
4119
4120 tp->tx_prod = entry;
1b2a7205 4121 if (unlikely(tg3_tx_avail(tp) <= (MAX_SKB_FRAGS + 1))) {
1da177e4 4122 netif_stop_queue(dev);
1b2a7205 4123 if (tg3_tx_avail(tp) > TG3_TX_WAKEUP_THRESH)
51b91468
MC
4124 netif_wake_queue(tp->dev);
4125 }
1da177e4
LT
4126
4127out_unlock:
4128 mmiowb();
1da177e4
LT
4129
4130 dev->trans_start = jiffies;
4131
4132 return NETDEV_TX_OK;
4133}
4134
4135static inline void tg3_set_mtu(struct net_device *dev, struct tg3 *tp,
4136 int new_mtu)
4137{
4138 dev->mtu = new_mtu;
4139
ef7f5ec0 4140 if (new_mtu > ETH_DATA_LEN) {
a4e2b347 4141 if (tp->tg3_flags2 & TG3_FLG2_5780_CLASS) {
ef7f5ec0
MC
4142 tp->tg3_flags2 &= ~TG3_FLG2_TSO_CAPABLE;
4143 ethtool_op_set_tso(dev, 0);
4144 }
4145 else
4146 tp->tg3_flags |= TG3_FLAG_JUMBO_RING_ENABLE;
4147 } else {
a4e2b347 4148 if (tp->tg3_flags2 & TG3_FLG2_5780_CLASS)
ef7f5ec0 4149 tp->tg3_flags2 |= TG3_FLG2_TSO_CAPABLE;
0f893dc6 4150 tp->tg3_flags &= ~TG3_FLAG_JUMBO_RING_ENABLE;
ef7f5ec0 4151 }
1da177e4
LT
4152}
4153
4154static int tg3_change_mtu(struct net_device *dev, int new_mtu)
4155{
4156 struct tg3 *tp = netdev_priv(dev);
b9ec6c1b 4157 int err;
1da177e4
LT
4158
4159 if (new_mtu < TG3_MIN_MTU || new_mtu > TG3_MAX_MTU(tp))
4160 return -EINVAL;
4161
4162 if (!netif_running(dev)) {
4163 /* We'll just catch it later when the
4164 * device is up'd.
4165 */
4166 tg3_set_mtu(dev, tp, new_mtu);
4167 return 0;
4168 }
4169
4170 tg3_netif_stop(tp);
f47c11ee
DM
4171
4172 tg3_full_lock(tp, 1);
1da177e4 4173
944d980e 4174 tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
1da177e4
LT
4175
4176 tg3_set_mtu(dev, tp, new_mtu);
4177
b9ec6c1b 4178 err = tg3_restart_hw(tp, 0);
1da177e4 4179
b9ec6c1b
MC
4180 if (!err)
4181 tg3_netif_start(tp);
1da177e4 4182
f47c11ee 4183 tg3_full_unlock(tp);
1da177e4 4184
b9ec6c1b 4185 return err;
1da177e4
LT
4186}
4187
4188/* Free up pending packets in all rx/tx rings.
4189 *
4190 * The chip has been shut down and the driver detached from
4191 * the networking, so no interrupts or new tx packets will
4192 * end up in the driver. tp->{tx,}lock is not held and we are not
4193 * in an interrupt context and thus may sleep.
4194 */
4195static void tg3_free_rings(struct tg3 *tp)
4196{
4197 struct ring_info *rxp;
4198 int i;
4199
4200 for (i = 0; i < TG3_RX_RING_SIZE; i++) {
4201 rxp = &tp->rx_std_buffers[i];
4202
4203 if (rxp->skb == NULL)
4204 continue;
4205 pci_unmap_single(tp->pdev,
4206 pci_unmap_addr(rxp, mapping),
7e72aad4 4207 tp->rx_pkt_buf_sz - tp->rx_offset,
1da177e4
LT
4208 PCI_DMA_FROMDEVICE);
4209 dev_kfree_skb_any(rxp->skb);
4210 rxp->skb = NULL;
4211 }
4212
4213 for (i = 0; i < TG3_RX_JUMBO_RING_SIZE; i++) {
4214 rxp = &tp->rx_jumbo_buffers[i];
4215
4216 if (rxp->skb == NULL)
4217 continue;
4218 pci_unmap_single(tp->pdev,
4219 pci_unmap_addr(rxp, mapping),
4220 RX_JUMBO_PKT_BUF_SZ - tp->rx_offset,
4221 PCI_DMA_FROMDEVICE);
4222 dev_kfree_skb_any(rxp->skb);
4223 rxp->skb = NULL;
4224 }
4225
4226 for (i = 0; i < TG3_TX_RING_SIZE; ) {
4227 struct tx_ring_info *txp;
4228 struct sk_buff *skb;
4229 int j;
4230
4231 txp = &tp->tx_buffers[i];
4232 skb = txp->skb;
4233
4234 if (skb == NULL) {
4235 i++;
4236 continue;
4237 }
4238
4239 pci_unmap_single(tp->pdev,
4240 pci_unmap_addr(txp, mapping),
4241 skb_headlen(skb),
4242 PCI_DMA_TODEVICE);
4243 txp->skb = NULL;
4244
4245 i++;
4246
4247 for (j = 0; j < skb_shinfo(skb)->nr_frags; j++) {
4248 txp = &tp->tx_buffers[i & (TG3_TX_RING_SIZE - 1)];
4249 pci_unmap_page(tp->pdev,
4250 pci_unmap_addr(txp, mapping),
4251 skb_shinfo(skb)->frags[j].size,
4252 PCI_DMA_TODEVICE);
4253 i++;
4254 }
4255
4256 dev_kfree_skb_any(skb);
4257 }
4258}
4259
4260/* Initialize tx/rx rings for packet processing.
4261 *
4262 * The chip has been shut down and the driver detached from
4263 * the networking, so no interrupts or new tx packets will
4264 * end up in the driver. tp->{tx,}lock are held and thus
4265 * we may not sleep.
4266 */
32d8c572 4267static int tg3_init_rings(struct tg3 *tp)
1da177e4
LT
4268{
4269 u32 i;
4270
4271 /* Free up all the SKBs. */
4272 tg3_free_rings(tp);
4273
4274 /* Zero out all descriptors. */
4275 memset(tp->rx_std, 0, TG3_RX_RING_BYTES);
4276 memset(tp->rx_jumbo, 0, TG3_RX_JUMBO_RING_BYTES);
4277 memset(tp->rx_rcb, 0, TG3_RX_RCB_RING_BYTES(tp));
4278 memset(tp->tx_ring, 0, TG3_TX_RING_BYTES);
4279
7e72aad4 4280 tp->rx_pkt_buf_sz = RX_PKT_BUF_SZ;
a4e2b347 4281 if ((tp->tg3_flags2 & TG3_FLG2_5780_CLASS) &&
7e72aad4
MC
4282 (tp->dev->mtu > ETH_DATA_LEN))
4283 tp->rx_pkt_buf_sz = RX_JUMBO_PKT_BUF_SZ;
4284
1da177e4
LT
4285 /* Initialize invariants of the rings, we only set this
4286 * stuff once. This works because the card does not
4287 * write into the rx buffer posting rings.
4288 */
4289 for (i = 0; i < TG3_RX_RING_SIZE; i++) {
4290 struct tg3_rx_buffer_desc *rxd;
4291
4292 rxd = &tp->rx_std[i];
7e72aad4 4293 rxd->idx_len = (tp->rx_pkt_buf_sz - tp->rx_offset - 64)
1da177e4
LT
4294 << RXD_LEN_SHIFT;
4295 rxd->type_flags = (RXD_FLAG_END << RXD_FLAGS_SHIFT);
4296 rxd->opaque = (RXD_OPAQUE_RING_STD |
4297 (i << RXD_OPAQUE_INDEX_SHIFT));
4298 }
4299
0f893dc6 4300 if (tp->tg3_flags & TG3_FLAG_JUMBO_RING_ENABLE) {
1da177e4
LT
4301 for (i = 0; i < TG3_RX_JUMBO_RING_SIZE; i++) {
4302 struct tg3_rx_buffer_desc *rxd;
4303
4304 rxd = &tp->rx_jumbo[i];
4305 rxd->idx_len = (RX_JUMBO_PKT_BUF_SZ - tp->rx_offset - 64)
4306 << RXD_LEN_SHIFT;
4307 rxd->type_flags = (RXD_FLAG_END << RXD_FLAGS_SHIFT) |
4308 RXD_FLAG_JUMBO;
4309 rxd->opaque = (RXD_OPAQUE_RING_JUMBO |
4310 (i << RXD_OPAQUE_INDEX_SHIFT));
4311 }
4312 }
4313
4314 /* Now allocate fresh SKBs for each rx ring. */
4315 for (i = 0; i < tp->rx_pending; i++) {
32d8c572
MC
4316 if (tg3_alloc_rx_skb(tp, RXD_OPAQUE_RING_STD, -1, i) < 0) {
4317 printk(KERN_WARNING PFX
4318 "%s: Using a smaller RX standard ring, "
4319 "only %d out of %d buffers were allocated "
4320 "successfully.\n",
4321 tp->dev->name, i, tp->rx_pending);
4322 if (i == 0)
4323 return -ENOMEM;
4324 tp->rx_pending = i;
1da177e4 4325 break;
32d8c572 4326 }
1da177e4
LT
4327 }
4328
0f893dc6 4329 if (tp->tg3_flags & TG3_FLAG_JUMBO_RING_ENABLE) {
1da177e4
LT
4330 for (i = 0; i < tp->rx_jumbo_pending; i++) {
4331 if (tg3_alloc_rx_skb(tp, RXD_OPAQUE_RING_JUMBO,
32d8c572
MC
4332 -1, i) < 0) {
4333 printk(KERN_WARNING PFX
4334 "%s: Using a smaller RX jumbo ring, "
4335 "only %d out of %d buffers were "
4336 "allocated successfully.\n",
4337 tp->dev->name, i, tp->rx_jumbo_pending);
4338 if (i == 0) {
4339 tg3_free_rings(tp);
4340 return -ENOMEM;
4341 }
4342 tp->rx_jumbo_pending = i;
1da177e4 4343 break;
32d8c572 4344 }
1da177e4
LT
4345 }
4346 }
32d8c572 4347 return 0;
1da177e4
LT
4348}
4349
4350/*
4351 * Must not be invoked with interrupt sources disabled and
4352 * the hardware shutdown down.
4353 */
4354static void tg3_free_consistent(struct tg3 *tp)
4355{
b4558ea9
JJ
4356 kfree(tp->rx_std_buffers);
4357 tp->rx_std_buffers = NULL;
1da177e4
LT
4358 if (tp->rx_std) {
4359 pci_free_consistent(tp->pdev, TG3_RX_RING_BYTES,
4360 tp->rx_std, tp->rx_std_mapping);
4361 tp->rx_std = NULL;
4362 }
4363 if (tp->rx_jumbo) {
4364 pci_free_consistent(tp->pdev, TG3_RX_JUMBO_RING_BYTES,
4365 tp->rx_jumbo, tp->rx_jumbo_mapping);
4366 tp->rx_jumbo = NULL;
4367 }
4368 if (tp->rx_rcb) {
4369 pci_free_consistent(tp->pdev, TG3_RX_RCB_RING_BYTES(tp),
4370 tp->rx_rcb, tp->rx_rcb_mapping);
4371 tp->rx_rcb = NULL;
4372 }
4373 if (tp->tx_ring) {
4374 pci_free_consistent(tp->pdev, TG3_TX_RING_BYTES,
4375 tp->tx_ring, tp->tx_desc_mapping);
4376 tp->tx_ring = NULL;
4377 }
4378 if (tp->hw_status) {
4379 pci_free_consistent(tp->pdev, TG3_HW_STATUS_SIZE,
4380 tp->hw_status, tp->status_mapping);
4381 tp->hw_status = NULL;
4382 }
4383 if (tp->hw_stats) {
4384 pci_free_consistent(tp->pdev, sizeof(struct tg3_hw_stats),
4385 tp->hw_stats, tp->stats_mapping);
4386 tp->hw_stats = NULL;
4387 }
4388}
4389
4390/*
4391 * Must not be invoked with interrupt sources disabled and
4392 * the hardware shutdown down. Can sleep.
4393 */
4394static int tg3_alloc_consistent(struct tg3 *tp)
4395{
4396 tp->rx_std_buffers = kmalloc((sizeof(struct ring_info) *
4397 (TG3_RX_RING_SIZE +
4398 TG3_RX_JUMBO_RING_SIZE)) +
4399 (sizeof(struct tx_ring_info) *
4400 TG3_TX_RING_SIZE),
4401 GFP_KERNEL);
4402 if (!tp->rx_std_buffers)
4403 return -ENOMEM;
4404
4405 memset(tp->rx_std_buffers, 0,
4406 (sizeof(struct ring_info) *
4407 (TG3_RX_RING_SIZE +
4408 TG3_RX_JUMBO_RING_SIZE)) +
4409 (sizeof(struct tx_ring_info) *
4410 TG3_TX_RING_SIZE));
4411
4412 tp->rx_jumbo_buffers = &tp->rx_std_buffers[TG3_RX_RING_SIZE];
4413 tp->tx_buffers = (struct tx_ring_info *)
4414 &tp->rx_jumbo_buffers[TG3_RX_JUMBO_RING_SIZE];
4415
4416 tp->rx_std = pci_alloc_consistent(tp->pdev, TG3_RX_RING_BYTES,
4417 &tp->rx_std_mapping);
4418 if (!tp->rx_std)
4419 goto err_out;
4420
4421 tp->rx_jumbo = pci_alloc_consistent(tp->pdev, TG3_RX_JUMBO_RING_BYTES,
4422 &tp->rx_jumbo_mapping);
4423
4424 if (!tp->rx_jumbo)
4425 goto err_out;
4426
4427 tp->rx_rcb = pci_alloc_consistent(tp->pdev, TG3_RX_RCB_RING_BYTES(tp),
4428 &tp->rx_rcb_mapping);
4429 if (!tp->rx_rcb)
4430 goto err_out;
4431
4432 tp->tx_ring = pci_alloc_consistent(tp->pdev, TG3_TX_RING_BYTES,
4433 &tp->tx_desc_mapping);
4434 if (!tp->tx_ring)
4435 goto err_out;
4436
4437 tp->hw_status = pci_alloc_consistent(tp->pdev,
4438 TG3_HW_STATUS_SIZE,
4439 &tp->status_mapping);
4440 if (!tp->hw_status)
4441 goto err_out;
4442
4443 tp->hw_stats = pci_alloc_consistent(tp->pdev,
4444 sizeof(struct tg3_hw_stats),
4445 &tp->stats_mapping);
4446 if (!tp->hw_stats)
4447 goto err_out;
4448
4449 memset(tp->hw_status, 0, TG3_HW_STATUS_SIZE);
4450 memset(tp->hw_stats, 0, sizeof(struct tg3_hw_stats));
4451
4452 return 0;
4453
4454err_out:
4455 tg3_free_consistent(tp);
4456 return -ENOMEM;
4457}
4458
4459#define MAX_WAIT_CNT 1000
4460
4461/* To stop a block, clear the enable bit and poll till it
4462 * clears. tp->lock is held.
4463 */
b3b7d6be 4464static int tg3_stop_block(struct tg3 *tp, unsigned long ofs, u32 enable_bit, int silent)
1da177e4
LT
4465{
4466 unsigned int i;
4467 u32 val;
4468
4469 if (tp->tg3_flags2 & TG3_FLG2_5705_PLUS) {
4470 switch (ofs) {
4471 case RCVLSC_MODE:
4472 case DMAC_MODE:
4473 case MBFREE_MODE:
4474 case BUFMGR_MODE:
4475 case MEMARB_MODE:
4476 /* We can't enable/disable these bits of the
4477 * 5705/5750, just say success.
4478 */
4479 return 0;
4480
4481 default:
4482 break;
4483 };
4484 }
4485
4486 val = tr32(ofs);
4487 val &= ~enable_bit;
4488 tw32_f(ofs, val);
4489
4490 for (i = 0; i < MAX_WAIT_CNT; i++) {
4491 udelay(100);
4492 val = tr32(ofs);
4493 if ((val & enable_bit) == 0)
4494 break;
4495 }
4496
b3b7d6be 4497 if (i == MAX_WAIT_CNT && !silent) {
1da177e4
LT
4498 printk(KERN_ERR PFX "tg3_stop_block timed out, "
4499 "ofs=%lx enable_bit=%x\n",
4500 ofs, enable_bit);
4501 return -ENODEV;
4502 }
4503
4504 return 0;
4505}
4506
4507/* tp->lock is held. */
b3b7d6be 4508static int tg3_abort_hw(struct tg3 *tp, int silent)
1da177e4
LT
4509{
4510 int i, err;
4511
4512 tg3_disable_ints(tp);
4513
4514 tp->rx_mode &= ~RX_MODE_ENABLE;
4515 tw32_f(MAC_RX_MODE, tp->rx_mode);
4516 udelay(10);
4517
b3b7d6be
DM
4518 err = tg3_stop_block(tp, RCVBDI_MODE, RCVBDI_MODE_ENABLE, silent);
4519 err |= tg3_stop_block(tp, RCVLPC_MODE, RCVLPC_MODE_ENABLE, silent);
4520 err |= tg3_stop_block(tp, RCVLSC_MODE, RCVLSC_MODE_ENABLE, silent);
4521 err |= tg3_stop_block(tp, RCVDBDI_MODE, RCVDBDI_MODE_ENABLE, silent);
4522 err |= tg3_stop_block(tp, RCVDCC_MODE, RCVDCC_MODE_ENABLE, silent);
4523 err |= tg3_stop_block(tp, RCVCC_MODE, RCVCC_MODE_ENABLE, silent);
4524
4525 err |= tg3_stop_block(tp, SNDBDS_MODE, SNDBDS_MODE_ENABLE, silent);
4526 err |= tg3_stop_block(tp, SNDBDI_MODE, SNDBDI_MODE_ENABLE, silent);
4527 err |= tg3_stop_block(tp, SNDDATAI_MODE, SNDDATAI_MODE_ENABLE, silent);
4528 err |= tg3_stop_block(tp, RDMAC_MODE, RDMAC_MODE_ENABLE, silent);
4529 err |= tg3_stop_block(tp, SNDDATAC_MODE, SNDDATAC_MODE_ENABLE, silent);
4530 err |= tg3_stop_block(tp, DMAC_MODE, DMAC_MODE_ENABLE, silent);
4531 err |= tg3_stop_block(tp, SNDBDC_MODE, SNDBDC_MODE_ENABLE, silent);
1da177e4
LT
4532
4533 tp->mac_mode &= ~MAC_MODE_TDE_ENABLE;
4534 tw32_f(MAC_MODE, tp->mac_mode);
4535 udelay(40);
4536
4537 tp->tx_mode &= ~TX_MODE_ENABLE;
4538 tw32_f(MAC_TX_MODE, tp->tx_mode);
4539
4540 for (i = 0; i < MAX_WAIT_CNT; i++) {
4541 udelay(100);
4542 if (!(tr32(MAC_TX_MODE) & TX_MODE_ENABLE))
4543 break;
4544 }
4545 if (i >= MAX_WAIT_CNT) {
4546 printk(KERN_ERR PFX "tg3_abort_hw timed out for %s, "
4547 "TX_MODE_ENABLE will not clear MAC_TX_MODE=%08x\n",
4548 tp->dev->name, tr32(MAC_TX_MODE));
e6de8ad1 4549 err |= -ENODEV;
1da177e4
LT
4550 }
4551
e6de8ad1 4552 err |= tg3_stop_block(tp, HOSTCC_MODE, HOSTCC_MODE_ENABLE, silent);
b3b7d6be
DM
4553 err |= tg3_stop_block(tp, WDMAC_MODE, WDMAC_MODE_ENABLE, silent);
4554 err |= tg3_stop_block(tp, MBFREE_MODE, MBFREE_MODE_ENABLE, silent);
1da177e4
LT
4555
4556 tw32(FTQ_RESET, 0xffffffff);
4557 tw32(FTQ_RESET, 0x00000000);
4558
b3b7d6be
DM
4559 err |= tg3_stop_block(tp, BUFMGR_MODE, BUFMGR_MODE_ENABLE, silent);
4560 err |= tg3_stop_block(tp, MEMARB_MODE, MEMARB_MODE_ENABLE, silent);
1da177e4
LT
4561
4562 if (tp->hw_status)
4563 memset(tp->hw_status, 0, TG3_HW_STATUS_SIZE);
4564 if (tp->hw_stats)
4565 memset(tp->hw_stats, 0, sizeof(struct tg3_hw_stats));
4566
1da177e4
LT
4567 return err;
4568}
4569
4570/* tp->lock is held. */
4571static int tg3_nvram_lock(struct tg3 *tp)
4572{
4573 if (tp->tg3_flags & TG3_FLAG_NVRAM) {
4574 int i;
4575
ec41c7df
MC
4576 if (tp->nvram_lock_cnt == 0) {
4577 tw32(NVRAM_SWARB, SWARB_REQ_SET1);
4578 for (i = 0; i < 8000; i++) {
4579 if (tr32(NVRAM_SWARB) & SWARB_GNT1)
4580 break;
4581 udelay(20);
4582 }
4583 if (i == 8000) {
4584 tw32(NVRAM_SWARB, SWARB_REQ_CLR1);
4585 return -ENODEV;
4586 }
1da177e4 4587 }
ec41c7df 4588 tp->nvram_lock_cnt++;
1da177e4
LT
4589 }
4590 return 0;
4591}
4592
4593/* tp->lock is held. */
4594static void tg3_nvram_unlock(struct tg3 *tp)
4595{
ec41c7df
MC
4596 if (tp->tg3_flags & TG3_FLAG_NVRAM) {
4597 if (tp->nvram_lock_cnt > 0)
4598 tp->nvram_lock_cnt--;
4599 if (tp->nvram_lock_cnt == 0)
4600 tw32_f(NVRAM_SWARB, SWARB_REQ_CLR1);
4601 }
1da177e4
LT
4602}
4603
e6af301b
MC
4604/* tp->lock is held. */
4605static void tg3_enable_nvram_access(struct tg3 *tp)
4606{
4607 if ((tp->tg3_flags2 & TG3_FLG2_5750_PLUS) &&
4608 !(tp->tg3_flags2 & TG3_FLG2_PROTECTED_NVRAM)) {
4609 u32 nvaccess = tr32(NVRAM_ACCESS);
4610
4611 tw32(NVRAM_ACCESS, nvaccess | ACCESS_ENABLE);
4612 }
4613}
4614
4615/* tp->lock is held. */
4616static void tg3_disable_nvram_access(struct tg3 *tp)
4617{
4618 if ((tp->tg3_flags2 & TG3_FLG2_5750_PLUS) &&
4619 !(tp->tg3_flags2 & TG3_FLG2_PROTECTED_NVRAM)) {
4620 u32 nvaccess = tr32(NVRAM_ACCESS);
4621
4622 tw32(NVRAM_ACCESS, nvaccess & ~ACCESS_ENABLE);
4623 }
4624}
4625
1da177e4
LT
4626/* tp->lock is held. */
4627static void tg3_write_sig_pre_reset(struct tg3 *tp, int kind)
4628{
f49639e6
DM
4629 tg3_write_mem(tp, NIC_SRAM_FIRMWARE_MBOX,
4630 NIC_SRAM_FIRMWARE_MBOX_MAGIC1);
1da177e4
LT
4631
4632 if (tp->tg3_flags2 & TG3_FLG2_ASF_NEW_HANDSHAKE) {
4633 switch (kind) {
4634 case RESET_KIND_INIT:
4635 tg3_write_mem(tp, NIC_SRAM_FW_DRV_STATE_MBOX,
4636 DRV_STATE_START);
4637 break;
4638
4639 case RESET_KIND_SHUTDOWN:
4640 tg3_write_mem(tp, NIC_SRAM_FW_DRV_STATE_MBOX,
4641 DRV_STATE_UNLOAD);
4642 break;
4643
4644 case RESET_KIND_SUSPEND:
4645 tg3_write_mem(tp, NIC_SRAM_FW_DRV_STATE_MBOX,
4646 DRV_STATE_SUSPEND);
4647 break;
4648
4649 default:
4650 break;
4651 };
4652 }
4653}
4654
4655/* tp->lock is held. */
4656static void tg3_write_sig_post_reset(struct tg3 *tp, int kind)
4657{
4658 if (tp->tg3_flags2 & TG3_FLG2_ASF_NEW_HANDSHAKE) {
4659 switch (kind) {
4660 case RESET_KIND_INIT:
4661 tg3_write_mem(tp, NIC_SRAM_FW_DRV_STATE_MBOX,
4662 DRV_STATE_START_DONE);
4663 break;
4664
4665 case RESET_KIND_SHUTDOWN:
4666 tg3_write_mem(tp, NIC_SRAM_FW_DRV_STATE_MBOX,
4667 DRV_STATE_UNLOAD_DONE);
4668 break;
4669
4670 default:
4671 break;
4672 };
4673 }
4674}
4675
4676/* tp->lock is held. */
4677static void tg3_write_sig_legacy(struct tg3 *tp, int kind)
4678{
4679 if (tp->tg3_flags & TG3_FLAG_ENABLE_ASF) {
4680 switch (kind) {
4681 case RESET_KIND_INIT:
4682 tg3_write_mem(tp, NIC_SRAM_FW_DRV_STATE_MBOX,
4683 DRV_STATE_START);
4684 break;
4685
4686 case RESET_KIND_SHUTDOWN:
4687 tg3_write_mem(tp, NIC_SRAM_FW_DRV_STATE_MBOX,
4688 DRV_STATE_UNLOAD);
4689 break;
4690
4691 case RESET_KIND_SUSPEND:
4692 tg3_write_mem(tp, NIC_SRAM_FW_DRV_STATE_MBOX,
4693 DRV_STATE_SUSPEND);
4694 break;
4695
4696 default:
4697 break;
4698 };
4699 }
4700}
4701
4702static void tg3_stop_fw(struct tg3 *);
4703
4704/* tp->lock is held. */
4705static int tg3_chip_reset(struct tg3 *tp)
4706{
4707 u32 val;
1ee582d8 4708 void (*write_op)(struct tg3 *, u32, u32);
1da177e4
LT
4709 int i;
4710
f49639e6
DM
4711 tg3_nvram_lock(tp);
4712
4713 /* No matching tg3_nvram_unlock() after this because
4714 * chip reset below will undo the nvram lock.
4715 */
4716 tp->nvram_lock_cnt = 0;
1da177e4 4717
d9ab5ad1 4718 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5752 ||
af36e6b6 4719 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 ||
d9ab5ad1
MC
4720 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787)
4721 tw32(GRC_FASTBOOT_PC, 0);
4722
1da177e4
LT
4723 /*
4724 * We must avoid the readl() that normally takes place.
4725 * It locks machines, causes machine checks, and other
4726 * fun things. So, temporarily disable the 5701
4727 * hardware workaround, while we do the reset.
4728 */
1ee582d8
MC
4729 write_op = tp->write32;
4730 if (write_op == tg3_write_flush_reg32)
4731 tp->write32 = tg3_write32;
1da177e4
LT
4732
4733 /* do the reset */
4734 val = GRC_MISC_CFG_CORECLK_RESET;
4735
4736 if (tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS) {
4737 if (tr32(0x7e2c) == 0x60) {
4738 tw32(0x7e2c, 0x20);
4739 }
4740 if (tp->pci_chip_rev_id != CHIPREV_ID_5750_A0) {
4741 tw32(GRC_MISC_CFG, (1 << 29));
4742 val |= (1 << 29);
4743 }
4744 }
4745
4746 if (tp->tg3_flags2 & TG3_FLG2_5705_PLUS)
4747 val |= GRC_MISC_CFG_KEEP_GPHY_POWER;
4748 tw32(GRC_MISC_CFG, val);
4749
1ee582d8
MC
4750 /* restore 5701 hardware bug workaround write method */
4751 tp->write32 = write_op;
1da177e4
LT
4752
4753 /* Unfortunately, we have to delay before the PCI read back.
4754 * Some 575X chips even will not respond to a PCI cfg access
4755 * when the reset command is given to the chip.
4756 *
4757 * How do these hardware designers expect things to work
4758 * properly if the PCI write is posted for a long period
4759 * of time? It is always necessary to have some method by
4760 * which a register read back can occur to push the write
4761 * out which does the reset.
4762 *
4763 * For most tg3 variants the trick below was working.
4764 * Ho hum...
4765 */
4766 udelay(120);
4767
4768 /* Flush PCI posted writes. The normal MMIO registers
4769 * are inaccessible at this time so this is the only
4770 * way to make this reliably (actually, this is no longer
4771 * the case, see above). I tried to use indirect
4772 * register read/write but this upset some 5701 variants.
4773 */
4774 pci_read_config_dword(tp->pdev, PCI_COMMAND, &val);
4775
4776 udelay(120);
4777
4778 if (tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS) {
4779 if (tp->pci_chip_rev_id == CHIPREV_ID_5750_A0) {
4780 int i;
4781 u32 cfg_val;
4782
4783 /* Wait for link training to complete. */
4784 for (i = 0; i < 5000; i++)
4785 udelay(100);
4786
4787 pci_read_config_dword(tp->pdev, 0xc4, &cfg_val);
4788 pci_write_config_dword(tp->pdev, 0xc4,
4789 cfg_val | (1 << 15));
4790 }
4791 /* Set PCIE max payload size and clear error status. */
4792 pci_write_config_dword(tp->pdev, 0xd8, 0xf5000);
4793 }
4794
4795 /* Re-enable indirect register accesses. */
4796 pci_write_config_dword(tp->pdev, TG3PCI_MISC_HOST_CTRL,
4797 tp->misc_host_ctrl);
4798
4799 /* Set MAX PCI retry to zero. */
4800 val = (PCISTATE_ROM_ENABLE | PCISTATE_ROM_RETRY_ENABLE);
4801 if (tp->pci_chip_rev_id == CHIPREV_ID_5704_A0 &&
4802 (tp->tg3_flags & TG3_FLAG_PCIX_MODE))
4803 val |= PCISTATE_RETRY_SAME_DMA;
4804 pci_write_config_dword(tp->pdev, TG3PCI_PCISTATE, val);
4805
4806 pci_restore_state(tp->pdev);
4807
4808 /* Make sure PCI-X relaxed ordering bit is clear. */
4809 pci_read_config_dword(tp->pdev, TG3PCI_X_CAPS, &val);
4810 val &= ~PCIX_CAPS_RELAXED_ORDERING;
4811 pci_write_config_dword(tp->pdev, TG3PCI_X_CAPS, val);
4812
a4e2b347 4813 if (tp->tg3_flags2 & TG3_FLG2_5780_CLASS) {
4cf78e4f
MC
4814 u32 val;
4815
4816 /* Chip reset on 5780 will reset MSI enable bit,
4817 * so need to restore it.
4818 */
4819 if (tp->tg3_flags2 & TG3_FLG2_USING_MSI) {
4820 u16 ctrl;
4821
4822 pci_read_config_word(tp->pdev,
4823 tp->msi_cap + PCI_MSI_FLAGS,
4824 &ctrl);
4825 pci_write_config_word(tp->pdev,
4826 tp->msi_cap + PCI_MSI_FLAGS,
4827 ctrl | PCI_MSI_FLAGS_ENABLE);
4828 val = tr32(MSGINT_MODE);
4829 tw32(MSGINT_MODE, val | MSGINT_MODE_ENABLE);
4830 }
4831
4832 val = tr32(MEMARB_MODE);
4833 tw32(MEMARB_MODE, val | MEMARB_MODE_ENABLE);
4834
4835 } else
4836 tw32(MEMARB_MODE, MEMARB_MODE_ENABLE);
1da177e4
LT
4837
4838 if (tp->pci_chip_rev_id == CHIPREV_ID_5750_A3) {
4839 tg3_stop_fw(tp);
4840 tw32(0x5000, 0x400);
4841 }
4842
4843 tw32(GRC_MODE, tp->grc_mode);
4844
4845 if (tp->pci_chip_rev_id == CHIPREV_ID_5705_A0) {
4846 u32 val = tr32(0xc4);
4847
4848 tw32(0xc4, val | (1 << 15));
4849 }
4850
4851 if ((tp->nic_sram_data_cfg & NIC_SRAM_DATA_CFG_MINI_PCI) != 0 &&
4852 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) {
4853 tp->pci_clock_ctrl |= CLOCK_CTRL_CLKRUN_OENABLE;
4854 if (tp->pci_chip_rev_id == CHIPREV_ID_5705_A0)
4855 tp->pci_clock_ctrl |= CLOCK_CTRL_FORCE_CLKRUN;
4856 tw32(TG3PCI_CLOCK_CTRL, tp->pci_clock_ctrl);
4857 }
4858
4859 if (tp->tg3_flags2 & TG3_FLG2_PHY_SERDES) {
4860 tp->mac_mode = MAC_MODE_PORT_MODE_TBI;
4861 tw32_f(MAC_MODE, tp->mac_mode);
747e8f8b
MC
4862 } else if (tp->tg3_flags2 & TG3_FLG2_MII_SERDES) {
4863 tp->mac_mode = MAC_MODE_PORT_MODE_GMII;
4864 tw32_f(MAC_MODE, tp->mac_mode);
1da177e4
LT
4865 } else
4866 tw32_f(MAC_MODE, 0);
4867 udelay(40);
4868
f49639e6
DM
4869 /* Wait for firmware initialization to complete. */
4870 for (i = 0; i < 100000; i++) {
4871 tg3_read_mem(tp, NIC_SRAM_FIRMWARE_MBOX, &val);
4872 if (val == ~NIC_SRAM_FIRMWARE_MBOX_MAGIC1)
4873 break;
4874 udelay(10);
4875 }
4876
4877 /* Chip might not be fitted with firmare. Some Sun onboard
4878 * parts are configured like that. So don't signal the timeout
4879 * of the above loop as an error, but do report the lack of
4880 * running firmware once.
4881 */
4882 if (i >= 100000 &&
4883 !(tp->tg3_flags2 & TG3_FLG2_NO_FWARE_REPORTED)) {
4884 tp->tg3_flags2 |= TG3_FLG2_NO_FWARE_REPORTED;
4885
4886 printk(KERN_INFO PFX "%s: No firmware running.\n",
4887 tp->dev->name);
1da177e4
LT
4888 }
4889
4890 if ((tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS) &&
4891 tp->pci_chip_rev_id != CHIPREV_ID_5750_A0) {
4892 u32 val = tr32(0x7c00);
4893
4894 tw32(0x7c00, val | (1 << 25));
4895 }
4896
4897 /* Reprobe ASF enable state. */
4898 tp->tg3_flags &= ~TG3_FLAG_ENABLE_ASF;
4899 tp->tg3_flags2 &= ~TG3_FLG2_ASF_NEW_HANDSHAKE;
4900 tg3_read_mem(tp, NIC_SRAM_DATA_SIG, &val);
4901 if (val == NIC_SRAM_DATA_SIG_MAGIC) {
4902 u32 nic_cfg;
4903
4904 tg3_read_mem(tp, NIC_SRAM_DATA_CFG, &nic_cfg);
4905 if (nic_cfg & NIC_SRAM_DATA_CFG_ASF_ENABLE) {
4906 tp->tg3_flags |= TG3_FLAG_ENABLE_ASF;
cbf46853 4907 if (tp->tg3_flags2 & TG3_FLG2_5750_PLUS)
1da177e4
LT
4908 tp->tg3_flags2 |= TG3_FLG2_ASF_NEW_HANDSHAKE;
4909 }
4910 }
4911
4912 return 0;
4913}
4914
4915/* tp->lock is held. */
4916static void tg3_stop_fw(struct tg3 *tp)
4917{
4918 if (tp->tg3_flags & TG3_FLAG_ENABLE_ASF) {
4919 u32 val;
4920 int i;
4921
4922 tg3_write_mem(tp, NIC_SRAM_FW_CMD_MBOX, FWCMD_NICDRV_PAUSE_FW);
4923 val = tr32(GRC_RX_CPU_EVENT);
4924 val |= (1 << 14);
4925 tw32(GRC_RX_CPU_EVENT, val);
4926
4927 /* Wait for RX cpu to ACK the event. */
4928 for (i = 0; i < 100; i++) {
4929 if (!(tr32(GRC_RX_CPU_EVENT) & (1 << 14)))
4930 break;
4931 udelay(1);
4932 }
4933 }
4934}
4935
4936/* tp->lock is held. */
944d980e 4937static int tg3_halt(struct tg3 *tp, int kind, int silent)
1da177e4
LT
4938{
4939 int err;
4940
4941 tg3_stop_fw(tp);
4942
944d980e 4943 tg3_write_sig_pre_reset(tp, kind);
1da177e4 4944
b3b7d6be 4945 tg3_abort_hw(tp, silent);
1da177e4
LT
4946 err = tg3_chip_reset(tp);
4947
944d980e
MC
4948 tg3_write_sig_legacy(tp, kind);
4949 tg3_write_sig_post_reset(tp, kind);
1da177e4
LT
4950
4951 if (err)
4952 return err;
4953
4954 return 0;
4955}
4956
4957#define TG3_FW_RELEASE_MAJOR 0x0
4958#define TG3_FW_RELASE_MINOR 0x0
4959#define TG3_FW_RELEASE_FIX 0x0
4960#define TG3_FW_START_ADDR 0x08000000
4961#define TG3_FW_TEXT_ADDR 0x08000000
4962#define TG3_FW_TEXT_LEN 0x9c0
4963#define TG3_FW_RODATA_ADDR 0x080009c0
4964#define TG3_FW_RODATA_LEN 0x60
4965#define TG3_FW_DATA_ADDR 0x08000a40
4966#define TG3_FW_DATA_LEN 0x20
4967#define TG3_FW_SBSS_ADDR 0x08000a60
4968#define TG3_FW_SBSS_LEN 0xc
4969#define TG3_FW_BSS_ADDR 0x08000a70
4970#define TG3_FW_BSS_LEN 0x10
4971
4972static u32 tg3FwText[(TG3_FW_TEXT_LEN / sizeof(u32)) + 1] = {
4973 0x00000000, 0x10000003, 0x00000000, 0x0000000d, 0x0000000d, 0x3c1d0800,
4974 0x37bd3ffc, 0x03a0f021, 0x3c100800, 0x26100000, 0x0e000018, 0x00000000,
4975 0x0000000d, 0x3c1d0800, 0x37bd3ffc, 0x03a0f021, 0x3c100800, 0x26100034,
4976 0x0e00021c, 0x00000000, 0x0000000d, 0x00000000, 0x00000000, 0x00000000,
4977 0x27bdffe0, 0x3c1cc000, 0xafbf0018, 0xaf80680c, 0x0e00004c, 0x241b2105,
4978 0x97850000, 0x97870002, 0x9782002c, 0x9783002e, 0x3c040800, 0x248409c0,
4979 0xafa00014, 0x00021400, 0x00621825, 0x00052c00, 0xafa30010, 0x8f860010,
4980 0x00e52825, 0x0e000060, 0x24070102, 0x3c02ac00, 0x34420100, 0x3c03ac01,
4981 0x34630100, 0xaf820490, 0x3c02ffff, 0xaf820494, 0xaf830498, 0xaf82049c,
4982 0x24020001, 0xaf825ce0, 0x0e00003f, 0xaf825d00, 0x0e000140, 0x00000000,
4983 0x8fbf0018, 0x03e00008, 0x27bd0020, 0x2402ffff, 0xaf825404, 0x8f835400,
4984 0x34630400, 0xaf835400, 0xaf825404, 0x3c020800, 0x24420034, 0xaf82541c,
4985 0x03e00008, 0xaf805400, 0x00000000, 0x00000000, 0x3c020800, 0x34423000,
4986 0x3c030800, 0x34633000, 0x3c040800, 0x348437ff, 0x3c010800, 0xac220a64,
4987 0x24020040, 0x3c010800, 0xac220a68, 0x3c010800, 0xac200a60, 0xac600000,
4988 0x24630004, 0x0083102b, 0x5040fffd, 0xac600000, 0x03e00008, 0x00000000,
4989 0x00804821, 0x8faa0010, 0x3c020800, 0x8c420a60, 0x3c040800, 0x8c840a68,
4990 0x8fab0014, 0x24430001, 0x0044102b, 0x3c010800, 0xac230a60, 0x14400003,
4991 0x00004021, 0x3c010800, 0xac200a60, 0x3c020800, 0x8c420a60, 0x3c030800,
4992 0x8c630a64, 0x91240000, 0x00021140, 0x00431021, 0x00481021, 0x25080001,
4993 0xa0440000, 0x29020008, 0x1440fff4, 0x25290001, 0x3c020800, 0x8c420a60,
4994 0x3c030800, 0x8c630a64, 0x8f84680c, 0x00021140, 0x00431021, 0xac440008,
4995 0xac45000c, 0xac460010, 0xac470014, 0xac4a0018, 0x03e00008, 0xac4b001c,
4996 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
4997 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
4998 0, 0, 0, 0, 0, 0,
4999 0x02000008, 0x00000000, 0x0a0001e3, 0x3c0a0001, 0x0a0001e3, 0x3c0a0002,
5000 0x0a0001e3, 0x00000000, 0x0a0001e3, 0x00000000, 0x0a0001e3, 0x00000000,
5001 0x0a0001e3, 0x00000000, 0x0a0001e3, 0x00000000, 0x0a0001e3, 0x00000000,
5002 0x0a0001e3, 0x00000000, 0x0a0001e3, 0x00000000, 0x0a0001e3, 0x00000000,
5003 0x0a0001e3, 0x3c0a0007, 0x0a0001e3, 0x3c0a0008, 0x0a0001e3, 0x3c0a0009,
5004 0x0a0001e3, 0x00000000, 0x0a0001e3, 0x00000000, 0x0a0001e3, 0x3c0a000b,
5005 0x0a0001e3, 0x3c0a000c, 0x0a0001e3, 0x3c0a000d, 0x0a0001e3, 0x00000000,
5006 0x0a0001e3, 0x00000000, 0x0a0001e3, 0x3c0a000e, 0x0a0001e3, 0x00000000,
5007 0x0a0001e3, 0x00000000, 0x0a0001e3, 0x00000000, 0x0a0001e3, 0x00000000,
5008 0x0a0001e3, 0x00000000, 0x0a0001e3, 0x00000000, 0x0a0001e3, 0x00000000,
5009 0x0a0001e3, 0x00000000, 0x0a0001e3, 0x3c0a0013, 0x0a0001e3, 0x3c0a0014,
5010 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
5011 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
5012 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
5013 0x27bdffe0, 0x00001821, 0x00001021, 0xafbf0018, 0xafb10014, 0xafb00010,
5014 0x3c010800, 0x00220821, 0xac200a70, 0x3c010800, 0x00220821, 0xac200a74,
5015 0x3c010800, 0x00220821, 0xac200a78, 0x24630001, 0x1860fff5, 0x2442000c,
5016 0x24110001, 0x8f906810, 0x32020004, 0x14400005, 0x24040001, 0x3c020800,
5017 0x8c420a78, 0x18400003, 0x00002021, 0x0e000182, 0x00000000, 0x32020001,
5018 0x10400003, 0x00000000, 0x0e000169, 0x00000000, 0x0a000153, 0xaf915028,
5019 0x8fbf0018, 0x8fb10014, 0x8fb00010, 0x03e00008, 0x27bd0020, 0x3c050800,
5020 0x8ca50a70, 0x3c060800, 0x8cc60a80, 0x3c070800, 0x8ce70a78, 0x27bdffe0,
5021 0x3c040800, 0x248409d0, 0xafbf0018, 0xafa00010, 0x0e000060, 0xafa00014,
5022 0x0e00017b, 0x00002021, 0x8fbf0018, 0x03e00008, 0x27bd0020, 0x24020001,
5023 0x8f836810, 0x00821004, 0x00021027, 0x00621824, 0x03e00008, 0xaf836810,
5024 0x27bdffd8, 0xafbf0024, 0x1080002e, 0xafb00020, 0x8f825cec, 0xafa20018,
5025 0x8f825cec, 0x3c100800, 0x26100a78, 0xafa2001c, 0x34028000, 0xaf825cec,
5026 0x8e020000, 0x18400016, 0x00000000, 0x3c020800, 0x94420a74, 0x8fa3001c,
5027 0x000221c0, 0xac830004, 0x8fa2001c, 0x3c010800, 0x0e000201, 0xac220a74,
5028 0x10400005, 0x00000000, 0x8e020000, 0x24420001, 0x0a0001df, 0xae020000,
5029 0x3c020800, 0x8c420a70, 0x00021c02, 0x000321c0, 0x0a0001c5, 0xafa2001c,
5030 0x0e000201, 0x00000000, 0x1040001f, 0x00000000, 0x8e020000, 0x8fa3001c,
5031 0x24420001, 0x3c010800, 0xac230a70, 0x3c010800, 0xac230a74, 0x0a0001df,
5032 0xae020000, 0x3c100800, 0x26100a78, 0x8e020000, 0x18400028, 0x00000000,
5033 0x0e000201, 0x00000000, 0x14400024, 0x00000000, 0x8e020000, 0x3c030800,
5034 0x8c630a70, 0x2442ffff, 0xafa3001c, 0x18400006, 0xae020000, 0x00031402,
5035 0x000221c0, 0x8c820004, 0x3c010800, 0xac220a70, 0x97a2001e, 0x2442ff00,
5036 0x2c420300, 0x1440000b, 0x24024000, 0x3c040800, 0x248409dc, 0xafa00010,
5037 0xafa00014, 0x8fa6001c, 0x24050008, 0x0e000060, 0x00003821, 0x0a0001df,
5038 0x00000000, 0xaf825cf8, 0x3c020800, 0x8c420a40, 0x8fa3001c, 0x24420001,
5039 0xaf835cf8, 0x3c010800, 0xac220a40, 0x8fbf0024, 0x8fb00020, 0x03e00008,
5040 0x27bd0028, 0x27bdffe0, 0x3c040800, 0x248409e8, 0x00002821, 0x00003021,
5041 0x00003821, 0xafbf0018, 0xafa00010, 0x0e000060, 0xafa00014, 0x8fbf0018,
5042 0x03e00008, 0x27bd0020, 0x8f82680c, 0x8f85680c, 0x00021827, 0x0003182b,
5043 0x00031823, 0x00431024, 0x00441021, 0x00a2282b, 0x10a00006, 0x00000000,
5044 0x00401821, 0x8f82680c, 0x0043102b, 0x1440fffd, 0x00000000, 0x03e00008,
5045 0x00000000, 0x3c040800, 0x8c840000, 0x3c030800, 0x8c630a40, 0x0064102b,
5046 0x54400002, 0x00831023, 0x00641023, 0x2c420008, 0x03e00008, 0x38420001,
5047 0x27bdffe0, 0x00802821, 0x3c040800, 0x24840a00, 0x00003021, 0x00003821,
5048 0xafbf0018, 0xafa00010, 0x0e000060, 0xafa00014, 0x0a000216, 0x00000000,
5049 0x8fbf0018, 0x03e00008, 0x27bd0020, 0x00000000, 0x27bdffe0, 0x3c1cc000,
5050 0xafbf0018, 0x0e00004c, 0xaf80680c, 0x3c040800, 0x24840a10, 0x03802821,
5051 0x00003021, 0x00003821, 0xafa00010, 0x0e000060, 0xafa00014, 0x2402ffff,
5052 0xaf825404, 0x3c0200aa, 0x0e000234, 0xaf825434, 0x8fbf0018, 0x03e00008,
5053 0x27bd0020, 0x00000000, 0x00000000, 0x00000000, 0x27bdffe8, 0xafb00010,
5054 0x24100001, 0xafbf0014, 0x3c01c003, 0xac200000, 0x8f826810, 0x30422000,
5055 0x10400003, 0x00000000, 0x0e000246, 0x00000000, 0x0a00023a, 0xaf905428,
5056 0x8fbf0014, 0x8fb00010, 0x03e00008, 0x27bd0018, 0x27bdfff8, 0x8f845d0c,
5057 0x3c0200ff, 0x3c030800, 0x8c630a50, 0x3442fff8, 0x00821024, 0x1043001e,
5058 0x3c0500ff, 0x34a5fff8, 0x3c06c003, 0x3c074000, 0x00851824, 0x8c620010,
5059 0x3c010800, 0xac230a50, 0x30420008, 0x10400005, 0x00871025, 0x8cc20000,
5060 0x24420001, 0xacc20000, 0x00871025, 0xaf825d0c, 0x8fa20000, 0x24420001,
5061 0xafa20000, 0x8fa20000, 0x8fa20000, 0x24420001, 0xafa20000, 0x8fa20000,
5062 0x8f845d0c, 0x3c030800, 0x8c630a50, 0x00851024, 0x1443ffe8, 0x00851824,
5063 0x27bd0008, 0x03e00008, 0x00000000, 0x00000000, 0x00000000
5064};
5065
5066static u32 tg3FwRodata[(TG3_FW_RODATA_LEN / sizeof(u32)) + 1] = {
5067 0x35373031, 0x726c7341, 0x00000000, 0x00000000, 0x53774576, 0x656e7430,
5068 0x00000000, 0x726c7045, 0x76656e74, 0x31000000, 0x556e6b6e, 0x45766e74,
5069 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x66617461, 0x6c457272,
5070 0x00000000, 0x00000000, 0x4d61696e, 0x43707542, 0x00000000, 0x00000000,
5071 0x00000000
5072};
5073
5074#if 0 /* All zeros, don't eat up space with it. */
5075u32 tg3FwData[(TG3_FW_DATA_LEN / sizeof(u32)) + 1] = {
5076 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
5077 0x00000000, 0x00000000, 0x00000000, 0x00000000
5078};
5079#endif
5080
5081#define RX_CPU_SCRATCH_BASE 0x30000
5082#define RX_CPU_SCRATCH_SIZE 0x04000
5083#define TX_CPU_SCRATCH_BASE 0x34000
5084#define TX_CPU_SCRATCH_SIZE 0x04000
5085
5086/* tp->lock is held. */
5087static int tg3_halt_cpu(struct tg3 *tp, u32 offset)
5088{
5089 int i;
5090
5d9428de
ES
5091 BUG_ON(offset == TX_CPU_BASE &&
5092 (tp->tg3_flags2 & TG3_FLG2_5705_PLUS));
1da177e4
LT
5093
5094 if (offset == RX_CPU_BASE) {
5095 for (i = 0; i < 10000; i++) {
5096 tw32(offset + CPU_STATE, 0xffffffff);
5097 tw32(offset + CPU_MODE, CPU_MODE_HALT);
5098 if (tr32(offset + CPU_MODE) & CPU_MODE_HALT)
5099 break;
5100 }
5101
5102 tw32(offset + CPU_STATE, 0xffffffff);
5103 tw32_f(offset + CPU_MODE, CPU_MODE_HALT);
5104 udelay(10);
5105 } else {
5106 for (i = 0; i < 10000; i++) {
5107 tw32(offset + CPU_STATE, 0xffffffff);
5108 tw32(offset + CPU_MODE, CPU_MODE_HALT);
5109 if (tr32(offset + CPU_MODE) & CPU_MODE_HALT)
5110 break;
5111 }
5112 }
5113
5114 if (i >= 10000) {
5115 printk(KERN_ERR PFX "tg3_reset_cpu timed out for %s, "
5116 "and %s CPU\n",
5117 tp->dev->name,
5118 (offset == RX_CPU_BASE ? "RX" : "TX"));
5119 return -ENODEV;
5120 }
ec41c7df
MC
5121
5122 /* Clear firmware's nvram arbitration. */
5123 if (tp->tg3_flags & TG3_FLAG_NVRAM)
5124 tw32(NVRAM_SWARB, SWARB_REQ_CLR0);
1da177e4
LT
5125 return 0;
5126}
5127
5128struct fw_info {
5129 unsigned int text_base;
5130 unsigned int text_len;
5131 u32 *text_data;
5132 unsigned int rodata_base;
5133 unsigned int rodata_len;
5134 u32 *rodata_data;
5135 unsigned int data_base;
5136 unsigned int data_len;
5137 u32 *data_data;
5138};
5139
5140/* tp->lock is held. */
5141static int tg3_load_firmware_cpu(struct tg3 *tp, u32 cpu_base, u32 cpu_scratch_base,
5142 int cpu_scratch_size, struct fw_info *info)
5143{
ec41c7df 5144 int err, lock_err, i;
1da177e4
LT
5145 void (*write_op)(struct tg3 *, u32, u32);
5146
5147 if (cpu_base == TX_CPU_BASE &&
5148 (tp->tg3_flags2 & TG3_FLG2_5705_PLUS)) {
5149 printk(KERN_ERR PFX "tg3_load_firmware_cpu: Trying to load "
5150 "TX cpu firmware on %s which is 5705.\n",
5151 tp->dev->name);
5152 return -EINVAL;
5153 }
5154
5155 if (tp->tg3_flags2 & TG3_FLG2_5705_PLUS)
5156 write_op = tg3_write_mem;
5157 else
5158 write_op = tg3_write_indirect_reg32;
5159
1b628151
MC
5160 /* It is possible that bootcode is still loading at this point.
5161 * Get the nvram lock first before halting the cpu.
5162 */
ec41c7df 5163 lock_err = tg3_nvram_lock(tp);
1da177e4 5164 err = tg3_halt_cpu(tp, cpu_base);
ec41c7df
MC
5165 if (!lock_err)
5166 tg3_nvram_unlock(tp);
1da177e4
LT
5167 if (err)
5168 goto out;
5169
5170 for (i = 0; i < cpu_scratch_size; i += sizeof(u32))
5171 write_op(tp, cpu_scratch_base + i, 0);
5172 tw32(cpu_base + CPU_STATE, 0xffffffff);
5173 tw32(cpu_base + CPU_MODE, tr32(cpu_base+CPU_MODE)|CPU_MODE_HALT);
5174 for (i = 0; i < (info->text_len / sizeof(u32)); i++)
5175 write_op(tp, (cpu_scratch_base +
5176 (info->text_base & 0xffff) +
5177 (i * sizeof(u32))),
5178 (info->text_data ?
5179 info->text_data[i] : 0));
5180 for (i = 0; i < (info->rodata_len / sizeof(u32)); i++)
5181 write_op(tp, (cpu_scratch_base +
5182 (info->rodata_base & 0xffff) +
5183 (i * sizeof(u32))),
5184 (info->rodata_data ?
5185 info->rodata_data[i] : 0));
5186 for (i = 0; i < (info->data_len / sizeof(u32)); i++)
5187 write_op(tp, (cpu_scratch_base +
5188 (info->data_base & 0xffff) +
5189 (i * sizeof(u32))),
5190 (info->data_data ?
5191 info->data_data[i] : 0));
5192
5193 err = 0;
5194
5195out:
1da177e4
LT
5196 return err;
5197}
5198
5199/* tp->lock is held. */
5200static int tg3_load_5701_a0_firmware_fix(struct tg3 *tp)
5201{
5202 struct fw_info info;
5203 int err, i;
5204
5205 info.text_base = TG3_FW_TEXT_ADDR;
5206 info.text_len = TG3_FW_TEXT_LEN;
5207 info.text_data = &tg3FwText[0];
5208 info.rodata_base = TG3_FW_RODATA_ADDR;
5209 info.rodata_len = TG3_FW_RODATA_LEN;
5210 info.rodata_data = &tg3FwRodata[0];
5211 info.data_base = TG3_FW_DATA_ADDR;
5212 info.data_len = TG3_FW_DATA_LEN;
5213 info.data_data = NULL;
5214
5215 err = tg3_load_firmware_cpu(tp, RX_CPU_BASE,
5216 RX_CPU_SCRATCH_BASE, RX_CPU_SCRATCH_SIZE,
5217 &info);
5218 if (err)
5219 return err;
5220
5221 err = tg3_load_firmware_cpu(tp, TX_CPU_BASE,
5222 TX_CPU_SCRATCH_BASE, TX_CPU_SCRATCH_SIZE,
5223 &info);
5224 if (err)
5225 return err;
5226
5227 /* Now startup only the RX cpu. */
5228 tw32(RX_CPU_BASE + CPU_STATE, 0xffffffff);
5229 tw32_f(RX_CPU_BASE + CPU_PC, TG3_FW_TEXT_ADDR);
5230
5231 for (i = 0; i < 5; i++) {
5232 if (tr32(RX_CPU_BASE + CPU_PC) == TG3_FW_TEXT_ADDR)
5233 break;
5234 tw32(RX_CPU_BASE + CPU_STATE, 0xffffffff);
5235 tw32(RX_CPU_BASE + CPU_MODE, CPU_MODE_HALT);
5236 tw32_f(RX_CPU_BASE + CPU_PC, TG3_FW_TEXT_ADDR);
5237 udelay(1000);
5238 }
5239 if (i >= 5) {
5240 printk(KERN_ERR PFX "tg3_load_firmware fails for %s "
5241 "to set RX CPU PC, is %08x should be %08x\n",
5242 tp->dev->name, tr32(RX_CPU_BASE + CPU_PC),
5243 TG3_FW_TEXT_ADDR);
5244 return -ENODEV;
5245 }
5246 tw32(RX_CPU_BASE + CPU_STATE, 0xffffffff);
5247 tw32_f(RX_CPU_BASE + CPU_MODE, 0x00000000);
5248
5249 return 0;
5250}
5251
5252#if TG3_TSO_SUPPORT != 0
5253
5254#define TG3_TSO_FW_RELEASE_MAJOR 0x1
5255#define TG3_TSO_FW_RELASE_MINOR 0x6
5256#define TG3_TSO_FW_RELEASE_FIX 0x0
5257#define TG3_TSO_FW_START_ADDR 0x08000000
5258#define TG3_TSO_FW_TEXT_ADDR 0x08000000
5259#define TG3_TSO_FW_TEXT_LEN 0x1aa0
5260#define TG3_TSO_FW_RODATA_ADDR 0x08001aa0
5261#define TG3_TSO_FW_RODATA_LEN 0x60
5262#define TG3_TSO_FW_DATA_ADDR 0x08001b20
5263#define TG3_TSO_FW_DATA_LEN 0x30
5264#define TG3_TSO_FW_SBSS_ADDR 0x08001b50
5265#define TG3_TSO_FW_SBSS_LEN 0x2c
5266#define TG3_TSO_FW_BSS_ADDR 0x08001b80
5267#define TG3_TSO_FW_BSS_LEN 0x894
5268
5269static u32 tg3TsoFwText[(TG3_TSO_FW_TEXT_LEN / 4) + 1] = {
5270 0x0e000003, 0x00000000, 0x08001b24, 0x00000000, 0x10000003, 0x00000000,
5271 0x0000000d, 0x0000000d, 0x3c1d0800, 0x37bd4000, 0x03a0f021, 0x3c100800,
5272 0x26100000, 0x0e000010, 0x00000000, 0x0000000d, 0x27bdffe0, 0x3c04fefe,
5273 0xafbf0018, 0x0e0005d8, 0x34840002, 0x0e000668, 0x00000000, 0x3c030800,
5274 0x90631b68, 0x24020002, 0x3c040800, 0x24841aac, 0x14620003, 0x24050001,
5275 0x3c040800, 0x24841aa0, 0x24060006, 0x00003821, 0xafa00010, 0x0e00067c,
5276 0xafa00014, 0x8f625c50, 0x34420001, 0xaf625c50, 0x8f625c90, 0x34420001,
5277 0xaf625c90, 0x2402ffff, 0x0e000034, 0xaf625404, 0x8fbf0018, 0x03e00008,
5278 0x27bd0020, 0x00000000, 0x00000000, 0x00000000, 0x27bdffe0, 0xafbf001c,
5279 0xafb20018, 0xafb10014, 0x0e00005b, 0xafb00010, 0x24120002, 0x24110001,
5280 0x8f706820, 0x32020100, 0x10400003, 0x00000000, 0x0e0000bb, 0x00000000,
5281 0x8f706820, 0x32022000, 0x10400004, 0x32020001, 0x0e0001f0, 0x24040001,
5282 0x32020001, 0x10400003, 0x00000000, 0x0e0000a3, 0x00000000, 0x3c020800,
5283 0x90421b98, 0x14520003, 0x00000000, 0x0e0004c0, 0x00000000, 0x0a00003c,
5284 0xaf715028, 0x8fbf001c, 0x8fb20018, 0x8fb10014, 0x8fb00010, 0x03e00008,
5285 0x27bd0020, 0x27bdffe0, 0x3c040800, 0x24841ac0, 0x00002821, 0x00003021,
5286 0x00003821, 0xafbf0018, 0xafa00010, 0x0e00067c, 0xafa00014, 0x3c040800,
5287 0x248423d8, 0xa4800000, 0x3c010800, 0xa0201b98, 0x3c010800, 0xac201b9c,
5288 0x3c010800, 0xac201ba0, 0x3c010800, 0xac201ba4, 0x3c010800, 0xac201bac,
5289 0x3c010800, 0xac201bb8, 0x3c010800, 0xac201bbc, 0x8f624434, 0x3c010800,
5290 0xac221b88, 0x8f624438, 0x3c010800, 0xac221b8c, 0x8f624410, 0xac80f7a8,
5291 0x3c010800, 0xac201b84, 0x3c010800, 0xac2023e0, 0x3c010800, 0xac2023c8,
5292 0x3c010800, 0xac2023cc, 0x3c010800, 0xac202400, 0x3c010800, 0xac221b90,
5293 0x8f620068, 0x24030007, 0x00021702, 0x10430005, 0x00000000, 0x8f620068,
5294 0x00021702, 0x14400004, 0x24020001, 0x3c010800, 0x0a000097, 0xac20240c,
5295 0xac820034, 0x3c040800, 0x24841acc, 0x3c050800, 0x8ca5240c, 0x00003021,
5296 0x00003821, 0xafa00010, 0x0e00067c, 0xafa00014, 0x8fbf0018, 0x03e00008,
5297 0x27bd0020, 0x27bdffe0, 0x3c040800, 0x24841ad8, 0x00002821, 0x00003021,
5298 0x00003821, 0xafbf0018, 0xafa00010, 0x0e00067c, 0xafa00014, 0x0e00005b,
5299 0x00000000, 0x0e0000b4, 0x00002021, 0x8fbf0018, 0x03e00008, 0x27bd0020,
5300 0x24020001, 0x8f636820, 0x00821004, 0x00021027, 0x00621824, 0x03e00008,
5301 0xaf636820, 0x27bdffd0, 0xafbf002c, 0xafb60028, 0xafb50024, 0xafb40020,
5302 0xafb3001c, 0xafb20018, 0xafb10014, 0xafb00010, 0x8f675c5c, 0x3c030800,
5303 0x24631bbc, 0x8c620000, 0x14470005, 0x3c0200ff, 0x3c020800, 0x90421b98,
5304 0x14400119, 0x3c0200ff, 0x3442fff8, 0x00e28824, 0xac670000, 0x00111902,
5305 0x306300ff, 0x30e20003, 0x000211c0, 0x00622825, 0x00a04021, 0x00071602,
5306 0x3c030800, 0x90631b98, 0x3044000f, 0x14600036, 0x00804821, 0x24020001,
5307 0x3c010800, 0xa0221b98, 0x00051100, 0x00821025, 0x3c010800, 0xac201b9c,
5308 0x3c010800, 0xac201ba0, 0x3c010800, 0xac201ba4, 0x3c010800, 0xac201bac,
5309 0x3c010800, 0xac201bb8, 0x3c010800, 0xac201bb0, 0x3c010800, 0xac201bb4,
5310 0x3c010800, 0xa42223d8, 0x9622000c, 0x30437fff, 0x3c010800, 0xa4222410,
5311 0x30428000, 0x3c010800, 0xa4231bc6, 0x10400005, 0x24020001, 0x3c010800,
5312 0xac2223f4, 0x0a000102, 0x2406003e, 0x24060036, 0x3c010800, 0xac2023f4,
5313 0x9622000a, 0x3c030800, 0x94631bc6, 0x3c010800, 0xac2023f0, 0x3c010800,
5314 0xac2023f8, 0x00021302, 0x00021080, 0x00c21021, 0x00621821, 0x3c010800,
5315 0xa42223d0, 0x3c010800, 0x0a000115, 0xa4231b96, 0x9622000c, 0x3c010800,
5316 0xa42223ec, 0x3c040800, 0x24841b9c, 0x8c820000, 0x00021100, 0x3c010800,
5317 0x00220821, 0xac311bc8, 0x8c820000, 0x00021100, 0x3c010800, 0x00220821,
5318 0xac271bcc, 0x8c820000, 0x25030001, 0x306601ff, 0x00021100, 0x3c010800,
5319 0x00220821, 0xac261bd0, 0x8c820000, 0x00021100, 0x3c010800, 0x00220821,
5320 0xac291bd4, 0x96230008, 0x3c020800, 0x8c421bac, 0x00432821, 0x3c010800,
5321 0xac251bac, 0x9622000a, 0x30420004, 0x14400018, 0x00061100, 0x8f630c14,
5322 0x3063000f, 0x2c620002, 0x1440000b, 0x3c02c000, 0x8f630c14, 0x3c020800,
5323 0x8c421b40, 0x3063000f, 0x24420001, 0x3c010800, 0xac221b40, 0x2c620002,
5324 0x1040fff7, 0x3c02c000, 0x00e21825, 0xaf635c5c, 0x8f625c50, 0x30420002,
5325 0x10400014, 0x00000000, 0x0a000147, 0x00000000, 0x3c030800, 0x8c631b80,
5326 0x3c040800, 0x94841b94, 0x01221025, 0x3c010800, 0xa42223da, 0x24020001,
5327 0x3c010800, 0xac221bb8, 0x24630001, 0x0085202a, 0x3c010800, 0x10800003,
5328 0xac231b80, 0x3c010800, 0xa4251b94, 0x3c060800, 0x24c61b9c, 0x8cc20000,
5329 0x24420001, 0xacc20000, 0x28420080, 0x14400005, 0x00000000, 0x0e000656,
5330 0x24040002, 0x0a0001e6, 0x00000000, 0x3c020800, 0x8c421bb8, 0x10400078,
5331 0x24020001, 0x3c050800, 0x90a51b98, 0x14a20072, 0x00000000, 0x3c150800,
5332 0x96b51b96, 0x3c040800, 0x8c841bac, 0x32a3ffff, 0x0083102a, 0x1440006c,
5333 0x00000000, 0x14830003, 0x00000000, 0x3c010800, 0xac2523f0, 0x1060005c,
5334 0x00009021, 0x24d60004, 0x0060a021, 0x24d30014, 0x8ec20000, 0x00028100,
5335 0x3c110800, 0x02308821, 0x0e000625, 0x8e311bc8, 0x00402821, 0x10a00054,
5336 0x00000000, 0x9628000a, 0x31020040, 0x10400005, 0x2407180c, 0x8e22000c,
5337 0x2407188c, 0x00021400, 0xaca20018, 0x3c030800, 0x00701821, 0x8c631bd0,
5338 0x3c020800, 0x00501021, 0x8c421bd4, 0x00031d00, 0x00021400, 0x00621825,
5339 0xaca30014, 0x8ec30004, 0x96220008, 0x00432023, 0x3242ffff, 0x3083ffff,
5340 0x00431021, 0x0282102a, 0x14400002, 0x02b23023, 0x00803021, 0x8e620000,
5341 0x30c4ffff, 0x00441021, 0xae620000, 0x8e220000, 0xaca20000, 0x8e220004,
5342 0x8e63fff4, 0x00431021, 0xaca20004, 0xa4a6000e, 0x8e62fff4, 0x00441021,
5343 0xae62fff4, 0x96230008, 0x0043102a, 0x14400005, 0x02469021, 0x8e62fff0,
5344 0xae60fff4, 0x24420001, 0xae62fff0, 0xaca00008, 0x3242ffff, 0x14540008,
5345 0x24020305, 0x31020080, 0x54400001, 0x34e70010, 0x24020905, 0xa4a2000c,
5346 0x0a0001cb, 0x34e70020, 0xa4a2000c, 0x3c020800, 0x8c4223f0, 0x10400003,
5347 0x3c024b65, 0x0a0001d3, 0x34427654, 0x3c02b49a, 0x344289ab, 0xaca2001c,
5348 0x30e2ffff, 0xaca20010, 0x0e0005a2, 0x00a02021, 0x3242ffff, 0x0054102b,
5349 0x1440ffa9, 0x00000000, 0x24020002, 0x3c010800, 0x0a0001e6, 0xa0221b98,
5350 0x8ec2083c, 0x24420001, 0x0a0001e6, 0xaec2083c, 0x0e0004c0, 0x00000000,
5351 0x8fbf002c, 0x8fb60028, 0x8fb50024, 0x8fb40020, 0x8fb3001c, 0x8fb20018,
5352 0x8fb10014, 0x8fb00010, 0x03e00008, 0x27bd0030, 0x27bdffd0, 0xafbf0028,
5353 0xafb30024, 0xafb20020, 0xafb1001c, 0xafb00018, 0x8f725c9c, 0x3c0200ff,
5354 0x3442fff8, 0x3c070800, 0x24e71bb4, 0x02428824, 0x9623000e, 0x8ce20000,
5355 0x00431021, 0xace20000, 0x8e220010, 0x30420020, 0x14400011, 0x00809821,
5356 0x0e00063b, 0x02202021, 0x3c02c000, 0x02421825, 0xaf635c9c, 0x8f625c90,
5357 0x30420002, 0x1040011e, 0x00000000, 0xaf635c9c, 0x8f625c90, 0x30420002,
5358 0x10400119, 0x00000000, 0x0a00020d, 0x00000000, 0x8e240008, 0x8e230014,
5359 0x00041402, 0x000231c0, 0x00031502, 0x304201ff, 0x2442ffff, 0x3042007f,
5360 0x00031942, 0x30637800, 0x00021100, 0x24424000, 0x00624821, 0x9522000a,
5361 0x3084ffff, 0x30420008, 0x104000b0, 0x000429c0, 0x3c020800, 0x8c422400,
5362 0x14400024, 0x24c50008, 0x94c20014, 0x3c010800, 0xa42223d0, 0x8cc40010,
5363 0x00041402, 0x3c010800, 0xa42223d2, 0x3c010800, 0xa42423d4, 0x94c2000e,
5364 0x3083ffff, 0x00431023, 0x3c010800, 0xac222408, 0x94c2001a, 0x3c010800,
5365 0xac262400, 0x3c010800, 0xac322404, 0x3c010800, 0xac2223fc, 0x3c02c000,
5366 0x02421825, 0xaf635c9c, 0x8f625c90, 0x30420002, 0x104000e5, 0x00000000,
5367 0xaf635c9c, 0x8f625c90, 0x30420002, 0x104000e0, 0x00000000, 0x0a000246,
5368 0x00000000, 0x94c2000e, 0x3c030800, 0x946323d4, 0x00434023, 0x3103ffff,
5369 0x2c620008, 0x1040001c, 0x00000000, 0x94c20014, 0x24420028, 0x00a22821,
5370 0x00031042, 0x1840000b, 0x00002021, 0x24e60848, 0x00403821, 0x94a30000,
5371 0x8cc20000, 0x24840001, 0x00431021, 0xacc20000, 0x0087102a, 0x1440fff9,
5372 0x24a50002, 0x31020001, 0x1040001f, 0x3c024000, 0x3c040800, 0x248423fc,
5373 0xa0a00001, 0x94a30000, 0x8c820000, 0x00431021, 0x0a000285, 0xac820000,
5374 0x8f626800, 0x3c030010, 0x00431024, 0x10400009, 0x00000000, 0x94c2001a,
5375 0x3c030800, 0x8c6323fc, 0x00431021, 0x3c010800, 0xac2223fc, 0x0a000286,
5376 0x3c024000, 0x94c2001a, 0x94c4001c, 0x3c030800, 0x8c6323fc, 0x00441023,
5377 0x00621821, 0x3c010800, 0xac2323fc, 0x3c024000, 0x02421825, 0xaf635c9c,
5378 0x8f625c90, 0x30420002, 0x1440fffc, 0x00000000, 0x9522000a, 0x30420010,
5379 0x1040009b, 0x00000000, 0x3c030800, 0x946323d4, 0x3c070800, 0x24e72400,
5380 0x8ce40000, 0x8f626800, 0x24630030, 0x00832821, 0x3c030010, 0x00431024,
5381 0x1440000a, 0x00000000, 0x94a20004, 0x3c040800, 0x8c842408, 0x3c030800,
5382 0x8c6323fc, 0x00441023, 0x00621821, 0x3c010800, 0xac2323fc, 0x3c040800,
5383 0x8c8423fc, 0x00041c02, 0x3082ffff, 0x00622021, 0x00041402, 0x00822021,
5384 0x00041027, 0xa4a20006, 0x3c030800, 0x8c632404, 0x3c0200ff, 0x3442fff8,
5385 0x00628824, 0x96220008, 0x24050001, 0x24034000, 0x000231c0, 0x00801021,
5386 0xa4c2001a, 0xa4c0001c, 0xace00000, 0x3c010800, 0xac251b60, 0xaf635cb8,
5387 0x8f625cb0, 0x30420002, 0x10400003, 0x00000000, 0x3c010800, 0xac201b60,
5388 0x8e220008, 0xaf625cb8, 0x8f625cb0, 0x30420002, 0x10400003, 0x00000000,
5389 0x3c010800, 0xac201b60, 0x3c020800, 0x8c421b60, 0x1040ffec, 0x00000000,
5390 0x3c040800, 0x0e00063b, 0x8c842404, 0x0a00032a, 0x00000000, 0x3c030800,
5391 0x90631b98, 0x24020002, 0x14620003, 0x3c034b65, 0x0a0002e1, 0x00008021,
5392 0x8e22001c, 0x34637654, 0x10430002, 0x24100002, 0x24100001, 0x00c02021,
5393 0x0e000350, 0x02003021, 0x24020003, 0x3c010800, 0xa0221b98, 0x24020002,
5394 0x1202000a, 0x24020001, 0x3c030800, 0x8c6323f0, 0x10620006, 0x00000000,
5395 0x3c020800, 0x944223d8, 0x00021400, 0x0a00031f, 0xae220014, 0x3c040800,
5396 0x248423da, 0x94820000, 0x00021400, 0xae220014, 0x3c020800, 0x8c421bbc,
5397 0x3c03c000, 0x3c010800, 0xa0201b98, 0x00431025, 0xaf625c5c, 0x8f625c50,
5398 0x30420002, 0x10400009, 0x00000000, 0x2484f7e2, 0x8c820000, 0x00431025,
5399 0xaf625c5c, 0x8f625c50, 0x30420002, 0x1440fffa, 0x00000000, 0x3c020800,
5400 0x24421b84, 0x8c430000, 0x24630001, 0xac430000, 0x8f630c14, 0x3063000f,
5401 0x2c620002, 0x1440000c, 0x3c024000, 0x8f630c14, 0x3c020800, 0x8c421b40,
5402 0x3063000f, 0x24420001, 0x3c010800, 0xac221b40, 0x2c620002, 0x1040fff7,
5403 0x00000000, 0x3c024000, 0x02421825, 0xaf635c9c, 0x8f625c90, 0x30420002,
5404 0x1440fffc, 0x00000000, 0x12600003, 0x00000000, 0x0e0004c0, 0x00000000,
5405 0x8fbf0028, 0x8fb30024, 0x8fb20020, 0x8fb1001c, 0x8fb00018, 0x03e00008,
5406 0x27bd0030, 0x8f634450, 0x3c040800, 0x24841b88, 0x8c820000, 0x00031c02,
5407 0x0043102b, 0x14400007, 0x3c038000, 0x8c840004, 0x8f624450, 0x00021c02,
5408 0x0083102b, 0x1040fffc, 0x3c038000, 0xaf634444, 0x8f624444, 0x00431024,
5409 0x1440fffd, 0x00000000, 0x8f624448, 0x03e00008, 0x3042ffff, 0x3c024000,
5410 0x00822025, 0xaf645c38, 0x8f625c30, 0x30420002, 0x1440fffc, 0x00000000,
5411 0x03e00008, 0x00000000, 0x27bdffe0, 0x00805821, 0x14c00011, 0x256e0008,
5412 0x3c020800, 0x8c4223f4, 0x10400007, 0x24020016, 0x3c010800, 0xa42223d2,
5413 0x2402002a, 0x3c010800, 0x0a000364, 0xa42223d4, 0x8d670010, 0x00071402,
5414 0x3c010800, 0xa42223d2, 0x3c010800, 0xa42723d4, 0x3c040800, 0x948423d4,
5415 0x3c030800, 0x946323d2, 0x95cf0006, 0x3c020800, 0x944223d0, 0x00832023,
5416 0x01e2c023, 0x3065ffff, 0x24a20028, 0x01c24821, 0x3082ffff, 0x14c0001a,
5417 0x01226021, 0x9582000c, 0x3042003f, 0x3c010800, 0xa42223d6, 0x95820004,
5418 0x95830006, 0x3c010800, 0xac2023e4, 0x3c010800, 0xac2023e8, 0x00021400,
5419 0x00431025, 0x3c010800, 0xac221bc0, 0x95220004, 0x3c010800, 0xa4221bc4,
5420 0x95230002, 0x01e51023, 0x0043102a, 0x10400010, 0x24020001, 0x3c010800,
5421 0x0a000398, 0xac2223f8, 0x3c030800, 0x8c6323e8, 0x3c020800, 0x94421bc4,
5422 0x00431021, 0xa5220004, 0x3c020800, 0x94421bc0, 0xa5820004, 0x3c020800,
5423 0x8c421bc0, 0xa5820006, 0x3c020800, 0x8c4223f0, 0x3c0d0800, 0x8dad23e4,
5424 0x3c0a0800, 0x144000e5, 0x8d4a23e8, 0x3c020800, 0x94421bc4, 0x004a1821,
5425 0x3063ffff, 0x0062182b, 0x24020002, 0x10c2000d, 0x01435023, 0x3c020800,
5426 0x944223d6, 0x30420009, 0x10400008, 0x00000000, 0x9582000c, 0x3042fff6,
5427 0xa582000c, 0x3c020800, 0x944223d6, 0x30420009, 0x01a26823, 0x3c020800,
5428 0x8c4223f8, 0x1040004a, 0x01203821, 0x3c020800, 0x944223d2, 0x00004021,
5429 0xa520000a, 0x01e21023, 0xa5220002, 0x3082ffff, 0x00021042, 0x18400008,
5430 0x00003021, 0x00401821, 0x94e20000, 0x25080001, 0x00c23021, 0x0103102a,
5431 0x1440fffb, 0x24e70002, 0x00061c02, 0x30c2ffff, 0x00623021, 0x00061402,
5432 0x00c23021, 0x00c02821, 0x00061027, 0xa522000a, 0x00003021, 0x2527000c,
5433 0x00004021, 0x94e20000, 0x25080001, 0x00c23021, 0x2d020004, 0x1440fffb,
5434 0x24e70002, 0x95220002, 0x00004021, 0x91230009, 0x00442023, 0x01803821,
5435 0x3082ffff, 0xa4e00010, 0x00621821, 0x00021042, 0x18400010, 0x00c33021,
5436 0x00404821, 0x94e20000, 0x24e70002, 0x00c23021, 0x30e2007f, 0x14400006,
5437 0x25080001, 0x8d630000, 0x3c02007f, 0x3442ff80, 0x00625824, 0x25670008,
5438 0x0109102a, 0x1440fff3, 0x00000000, 0x30820001, 0x10400005, 0x00061c02,
5439 0xa0e00001, 0x94e20000, 0x00c23021, 0x00061c02, 0x30c2ffff, 0x00623021,
5440 0x00061402, 0x00c23021, 0x0a00047d, 0x30c6ffff, 0x24020002, 0x14c20081,
5441 0x00000000, 0x3c020800, 0x8c42240c, 0x14400007, 0x00000000, 0x3c020800,
5442 0x944223d2, 0x95230002, 0x01e21023, 0x10620077, 0x00000000, 0x3c020800,
5443 0x944223d2, 0x01e21023, 0xa5220002, 0x3c020800, 0x8c42240c, 0x1040001a,
5444 0x31e3ffff, 0x8dc70010, 0x3c020800, 0x94421b96, 0x00e04021, 0x00072c02,
5445 0x00aa2021, 0x00431023, 0x00823823, 0x00072402, 0x30e2ffff, 0x00823821,
5446 0x00071027, 0xa522000a, 0x3102ffff, 0x3c040800, 0x948423d4, 0x00453023,
5447 0x00e02821, 0x00641823, 0x006d1821, 0x00c33021, 0x00061c02, 0x30c2ffff,
5448 0x0a00047d, 0x00623021, 0x01203821, 0x00004021, 0x3082ffff, 0x00021042,
5449 0x18400008, 0x00003021, 0x00401821, 0x94e20000, 0x25080001, 0x00c23021,
5450 0x0103102a, 0x1440fffb, 0x24e70002, 0x00061c02, 0x30c2ffff, 0x00623021,
5451 0x00061402, 0x00c23021, 0x00c02821, 0x00061027, 0xa522000a, 0x00003021,
5452 0x2527000c, 0x00004021, 0x94e20000, 0x25080001, 0x00c23021, 0x2d020004,
5453 0x1440fffb, 0x24e70002, 0x95220002, 0x00004021, 0x91230009, 0x00442023,
5454 0x01803821, 0x3082ffff, 0xa4e00010, 0x3c040800, 0x948423d4, 0x00621821,
5455 0x00c33021, 0x00061c02, 0x30c2ffff, 0x00623021, 0x00061c02, 0x3c020800,
5456 0x944223d0, 0x00c34821, 0x00441023, 0x00021fc2, 0x00431021, 0x00021043,
5457 0x18400010, 0x00003021, 0x00402021, 0x94e20000, 0x24e70002, 0x00c23021,
5458 0x30e2007f, 0x14400006, 0x25080001, 0x8d630000, 0x3c02007f, 0x3442ff80,
5459 0x00625824, 0x25670008, 0x0104102a, 0x1440fff3, 0x00000000, 0x3c020800,
5460 0x944223ec, 0x00c23021, 0x3122ffff, 0x00c23021, 0x00061c02, 0x30c2ffff,
5461 0x00623021, 0x00061402, 0x00c23021, 0x00c04021, 0x00061027, 0xa5820010,
5462 0xadc00014, 0x0a00049d, 0xadc00000, 0x8dc70010, 0x00e04021, 0x11400007,
5463 0x00072c02, 0x00aa3021, 0x00061402, 0x30c3ffff, 0x00433021, 0x00061402,
5464 0x00c22821, 0x00051027, 0xa522000a, 0x3c030800, 0x946323d4, 0x3102ffff,
5465 0x01e21021, 0x00433023, 0x00cd3021, 0x00061c02, 0x30c2ffff, 0x00623021,
5466 0x00061402, 0x00c23021, 0x00c04021, 0x00061027, 0xa5820010, 0x3102ffff,
5467 0x00051c00, 0x00431025, 0xadc20010, 0x3c020800, 0x8c4223f4, 0x10400005,
5468 0x2de205eb, 0x14400002, 0x25e2fff2, 0x34028870, 0xa5c20034, 0x3c030800,
5469 0x246323e8, 0x8c620000, 0x24420001, 0xac620000, 0x3c040800, 0x8c8423e4,
5470 0x3c020800, 0x8c421bc0, 0x3303ffff, 0x00832021, 0x00431821, 0x0062102b,
5471 0x3c010800, 0xac2423e4, 0x10400003, 0x2482ffff, 0x3c010800, 0xac2223e4,
5472 0x3c010800, 0xac231bc0, 0x03e00008, 0x27bd0020, 0x27bdffb8, 0x3c050800,
5473 0x24a51b96, 0xafbf0044, 0xafbe0040, 0xafb7003c, 0xafb60038, 0xafb50034,
5474 0xafb40030, 0xafb3002c, 0xafb20028, 0xafb10024, 0xafb00020, 0x94a90000,
5475 0x3c020800, 0x944223d0, 0x3c030800, 0x8c631bb0, 0x3c040800, 0x8c841bac,
5476 0x01221023, 0x0064182a, 0xa7a9001e, 0x106000be, 0xa7a20016, 0x24be0022,
5477 0x97b6001e, 0x24b3001a, 0x24b70016, 0x8fc20000, 0x14400008, 0x00000000,
5478 0x8fc2fff8, 0x97a30016, 0x8fc4fff4, 0x00431021, 0x0082202a, 0x148000b0,
5479 0x00000000, 0x97d50818, 0x32a2ffff, 0x104000a3, 0x00009021, 0x0040a021,
5480 0x00008821, 0x0e000625, 0x00000000, 0x00403021, 0x14c00007, 0x00000000,
5481 0x3c020800, 0x8c4223dc, 0x24420001, 0x3c010800, 0x0a000596, 0xac2223dc,
5482 0x3c100800, 0x02118021, 0x8e101bc8, 0x9608000a, 0x31020040, 0x10400005,
5483 0x2407180c, 0x8e02000c, 0x2407188c, 0x00021400, 0xacc20018, 0x31020080,
5484 0x54400001, 0x34e70010, 0x3c020800, 0x00511021, 0x8c421bd0, 0x3c030800,
5485 0x00711821, 0x8c631bd4, 0x00021500, 0x00031c00, 0x00431025, 0xacc20014,
5486 0x96040008, 0x3242ffff, 0x00821021, 0x0282102a, 0x14400002, 0x02b22823,
5487 0x00802821, 0x8e020000, 0x02459021, 0xacc20000, 0x8e020004, 0x00c02021,
5488 0x26310010, 0xac820004, 0x30e2ffff, 0xac800008, 0xa485000e, 0xac820010,
5489 0x24020305, 0x0e0005a2, 0xa482000c, 0x3242ffff, 0x0054102b, 0x1440ffc5,
5490 0x3242ffff, 0x0a00058e, 0x00000000, 0x8e620000, 0x8e63fffc, 0x0043102a,
5491 0x10400067, 0x00000000, 0x8e62fff0, 0x00028900, 0x3c100800, 0x02118021,
5492 0x0e000625, 0x8e101bc8, 0x00403021, 0x14c00005, 0x00000000, 0x8e62082c,
5493 0x24420001, 0x0a000596, 0xae62082c, 0x9608000a, 0x31020040, 0x10400005,
5494 0x2407180c, 0x8e02000c, 0x2407188c, 0x00021400, 0xacc20018, 0x3c020800,
5495 0x00511021, 0x8c421bd0, 0x3c030800, 0x00711821, 0x8c631bd4, 0x00021500,
5496 0x00031c00, 0x00431025, 0xacc20014, 0x8e63fff4, 0x96020008, 0x00432023,
5497 0x3242ffff, 0x3083ffff, 0x00431021, 0x02c2102a, 0x10400003, 0x00802821,
5498 0x97a9001e, 0x01322823, 0x8e620000, 0x30a4ffff, 0x00441021, 0xae620000,
5499 0xa4c5000e, 0x8e020000, 0xacc20000, 0x8e020004, 0x8e63fff4, 0x00431021,
5500 0xacc20004, 0x8e63fff4, 0x96020008, 0x00641821, 0x0062102a, 0x14400006,
5501 0x02459021, 0x8e62fff0, 0xae60fff4, 0x24420001, 0x0a000571, 0xae62fff0,
5502 0xae63fff4, 0xacc00008, 0x3242ffff, 0x10560003, 0x31020004, 0x10400006,
5503 0x24020305, 0x31020080, 0x54400001, 0x34e70010, 0x34e70020, 0x24020905,
5504 0xa4c2000c, 0x8ee30000, 0x8ee20004, 0x14620007, 0x3c02b49a, 0x8ee20860,
5505 0x54400001, 0x34e70400, 0x3c024b65, 0x0a000588, 0x34427654, 0x344289ab,
5506 0xacc2001c, 0x30e2ffff, 0xacc20010, 0x0e0005a2, 0x00c02021, 0x3242ffff,
5507 0x0056102b, 0x1440ff9b, 0x00000000, 0x8e620000, 0x8e63fffc, 0x0043102a,
5508 0x1440ff48, 0x00000000, 0x8fbf0044, 0x8fbe0040, 0x8fb7003c, 0x8fb60038,
5509 0x8fb50034, 0x8fb40030, 0x8fb3002c, 0x8fb20028, 0x8fb10024, 0x8fb00020,
5510 0x03e00008, 0x27bd0048, 0x27bdffe8, 0xafbf0014, 0xafb00010, 0x8f624450,
5511 0x8f634410, 0x0a0005b1, 0x00808021, 0x8f626820, 0x30422000, 0x10400003,
5512 0x00000000, 0x0e0001f0, 0x00002021, 0x8f624450, 0x8f634410, 0x3042ffff,
5513 0x0043102b, 0x1440fff5, 0x00000000, 0x8f630c14, 0x3063000f, 0x2c620002,
5514 0x1440000b, 0x00000000, 0x8f630c14, 0x3c020800, 0x8c421b40, 0x3063000f,
5515 0x24420001, 0x3c010800, 0xac221b40, 0x2c620002, 0x1040fff7, 0x00000000,
5516 0xaf705c18, 0x8f625c10, 0x30420002, 0x10400009, 0x00000000, 0x8f626820,
5517 0x30422000, 0x1040fff8, 0x00000000, 0x0e0001f0, 0x00002021, 0x0a0005c4,
5518 0x00000000, 0x8fbf0014, 0x8fb00010, 0x03e00008, 0x27bd0018, 0x00000000,
5519 0x00000000, 0x00000000, 0x27bdffe8, 0x3c1bc000, 0xafbf0014, 0xafb00010,
5520 0xaf60680c, 0x8f626804, 0x34420082, 0xaf626804, 0x8f634000, 0x24020b50,
5521 0x3c010800, 0xac221b54, 0x24020b78, 0x3c010800, 0xac221b64, 0x34630002,
5522 0xaf634000, 0x0e000605, 0x00808021, 0x3c010800, 0xa0221b68, 0x304200ff,
5523 0x24030002, 0x14430005, 0x00000000, 0x3c020800, 0x8c421b54, 0x0a0005f8,
5524 0xac5000c0, 0x3c020800, 0x8c421b54, 0xac5000bc, 0x8f624434, 0x8f634438,
5525 0x8f644410, 0x3c010800, 0xac221b5c, 0x3c010800, 0xac231b6c, 0x3c010800,
5526 0xac241b58, 0x8fbf0014, 0x8fb00010, 0x03e00008, 0x27bd0018, 0x3c040800,
5527 0x8c870000, 0x3c03aa55, 0x3463aa55, 0x3c06c003, 0xac830000, 0x8cc20000,
5528 0x14430007, 0x24050002, 0x3c0355aa, 0x346355aa, 0xac830000, 0x8cc20000,
5529 0x50430001, 0x24050001, 0x3c020800, 0xac470000, 0x03e00008, 0x00a01021,
5530 0x27bdfff8, 0x18800009, 0x00002821, 0x8f63680c, 0x8f62680c, 0x1043fffe,
5531 0x00000000, 0x24a50001, 0x00a4102a, 0x1440fff9, 0x00000000, 0x03e00008,
5532 0x27bd0008, 0x8f634450, 0x3c020800, 0x8c421b5c, 0x00031c02, 0x0043102b,
5533 0x14400008, 0x3c038000, 0x3c040800, 0x8c841b6c, 0x8f624450, 0x00021c02,
5534 0x0083102b, 0x1040fffc, 0x3c038000, 0xaf634444, 0x8f624444, 0x00431024,
5535 0x1440fffd, 0x00000000, 0x8f624448, 0x03e00008, 0x3042ffff, 0x3082ffff,
5536 0x2442e000, 0x2c422001, 0x14400003, 0x3c024000, 0x0a000648, 0x2402ffff,
5537 0x00822025, 0xaf645c38, 0x8f625c30, 0x30420002, 0x1440fffc, 0x00001021,
5538 0x03e00008, 0x00000000, 0x8f624450, 0x3c030800, 0x8c631b58, 0x0a000651,
5539 0x3042ffff, 0x8f624450, 0x3042ffff, 0x0043102b, 0x1440fffc, 0x00000000,
5540 0x03e00008, 0x00000000, 0x27bdffe0, 0x00802821, 0x3c040800, 0x24841af0,
5541 0x00003021, 0x00003821, 0xafbf0018, 0xafa00010, 0x0e00067c, 0xafa00014,
5542 0x0a000660, 0x00000000, 0x8fbf0018, 0x03e00008, 0x27bd0020, 0x00000000,
5543 0x00000000, 0x00000000, 0x3c020800, 0x34423000, 0x3c030800, 0x34633000,
5544 0x3c040800, 0x348437ff, 0x3c010800, 0xac221b74, 0x24020040, 0x3c010800,
5545 0xac221b78, 0x3c010800, 0xac201b70, 0xac600000, 0x24630004, 0x0083102b,
5546 0x5040fffd, 0xac600000, 0x03e00008, 0x00000000, 0x00804821, 0x8faa0010,
5547 0x3c020800, 0x8c421b70, 0x3c040800, 0x8c841b78, 0x8fab0014, 0x24430001,
5548 0x0044102b, 0x3c010800, 0xac231b70, 0x14400003, 0x00004021, 0x3c010800,
5549 0xac201b70, 0x3c020800, 0x8c421b70, 0x3c030800, 0x8c631b74, 0x91240000,
5550 0x00021140, 0x00431021, 0x00481021, 0x25080001, 0xa0440000, 0x29020008,
5551 0x1440fff4, 0x25290001, 0x3c020800, 0x8c421b70, 0x3c030800, 0x8c631b74,
5552 0x8f64680c, 0x00021140, 0x00431021, 0xac440008, 0xac45000c, 0xac460010,
5553 0xac470014, 0xac4a0018, 0x03e00008, 0xac4b001c, 0x00000000, 0x00000000,
5554};
5555
5556static u32 tg3TsoFwRodata[] = {
5557 0x4d61696e, 0x43707542, 0x00000000, 0x4d61696e, 0x43707541, 0x00000000,
5558 0x00000000, 0x00000000, 0x73746b6f, 0x66666c64, 0x496e0000, 0x73746b6f,
5559 0x66662a2a, 0x00000000, 0x53774576, 0x656e7430, 0x00000000, 0x00000000,
5560 0x00000000, 0x00000000, 0x66617461, 0x6c457272, 0x00000000, 0x00000000,
5561 0x00000000,
5562};
5563
5564static u32 tg3TsoFwData[] = {
5565 0x00000000, 0x73746b6f, 0x66666c64, 0x5f76312e, 0x362e3000, 0x00000000,
5566 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
5567 0x00000000,
5568};
5569
5570/* 5705 needs a special version of the TSO firmware. */
5571#define TG3_TSO5_FW_RELEASE_MAJOR 0x1
5572#define TG3_TSO5_FW_RELASE_MINOR 0x2
5573#define TG3_TSO5_FW_RELEASE_FIX 0x0
5574#define TG3_TSO5_FW_START_ADDR 0x00010000
5575#define TG3_TSO5_FW_TEXT_ADDR 0x00010000
5576#define TG3_TSO5_FW_TEXT_LEN 0xe90
5577#define TG3_TSO5_FW_RODATA_ADDR 0x00010e90
5578#define TG3_TSO5_FW_RODATA_LEN 0x50
5579#define TG3_TSO5_FW_DATA_ADDR 0x00010f00
5580#define TG3_TSO5_FW_DATA_LEN 0x20
5581#define TG3_TSO5_FW_SBSS_ADDR 0x00010f20
5582#define TG3_TSO5_FW_SBSS_LEN 0x28
5583#define TG3_TSO5_FW_BSS_ADDR 0x00010f50
5584#define TG3_TSO5_FW_BSS_LEN 0x88
5585
5586static u32 tg3Tso5FwText[(TG3_TSO5_FW_TEXT_LEN / 4) + 1] = {
5587 0x0c004003, 0x00000000, 0x00010f04, 0x00000000, 0x10000003, 0x00000000,
5588 0x0000000d, 0x0000000d, 0x3c1d0001, 0x37bde000, 0x03a0f021, 0x3c100001,
5589 0x26100000, 0x0c004010, 0x00000000, 0x0000000d, 0x27bdffe0, 0x3c04fefe,
5590 0xafbf0018, 0x0c0042e8, 0x34840002, 0x0c004364, 0x00000000, 0x3c030001,
5591 0x90630f34, 0x24020002, 0x3c040001, 0x24840e9c, 0x14620003, 0x24050001,
5592 0x3c040001, 0x24840e90, 0x24060002, 0x00003821, 0xafa00010, 0x0c004378,
5593 0xafa00014, 0x0c00402c, 0x00000000, 0x8fbf0018, 0x03e00008, 0x27bd0020,
5594 0x00000000, 0x00000000, 0x27bdffe0, 0xafbf001c, 0xafb20018, 0xafb10014,
5595 0x0c0042d4, 0xafb00010, 0x3c128000, 0x24110001, 0x8f706810, 0x32020400,
5596 0x10400007, 0x00000000, 0x8f641008, 0x00921024, 0x14400003, 0x00000000,
5597 0x0c004064, 0x00000000, 0x3c020001, 0x90420f56, 0x10510003, 0x32020200,
5598 0x1040fff1, 0x00000000, 0x0c0041b4, 0x00000000, 0x08004034, 0x00000000,
5599 0x8fbf001c, 0x8fb20018, 0x8fb10014, 0x8fb00010, 0x03e00008, 0x27bd0020,
5600 0x27bdffe0, 0x3c040001, 0x24840eb0, 0x00002821, 0x00003021, 0x00003821,
5601 0xafbf0018, 0xafa00010, 0x0c004378, 0xafa00014, 0x0000d021, 0x24020130,
5602 0xaf625000, 0x3c010001, 0xa4200f50, 0x3c010001, 0xa0200f57, 0x8fbf0018,
5603 0x03e00008, 0x27bd0020, 0x00000000, 0x00000000, 0x3c030001, 0x24630f60,
5604 0x90620000, 0x27bdfff0, 0x14400003, 0x0080c021, 0x08004073, 0x00004821,
5605 0x3c022000, 0x03021024, 0x10400003, 0x24090002, 0x08004073, 0xa0600000,
5606 0x24090001, 0x00181040, 0x30431f80, 0x346f8008, 0x1520004b, 0x25eb0028,
5607 0x3c040001, 0x00832021, 0x8c848010, 0x3c050001, 0x24a50f7a, 0x00041402,
5608 0xa0a20000, 0x3c010001, 0xa0240f7b, 0x3c020001, 0x00431021, 0x94428014,
5609 0x3c010001, 0xa0220f7c, 0x3c0c0001, 0x01836021, 0x8d8c8018, 0x304200ff,
5610 0x24420008, 0x000220c3, 0x24020001, 0x3c010001, 0xa0220f60, 0x0124102b,
5611 0x1040000c, 0x00003821, 0x24a6000e, 0x01602821, 0x8ca20000, 0x8ca30004,
5612 0x24a50008, 0x24e70001, 0xacc20000, 0xacc30004, 0x00e4102b, 0x1440fff8,
5613 0x24c60008, 0x00003821, 0x3c080001, 0x25080f7b, 0x91060000, 0x3c020001,
5614 0x90420f7c, 0x2503000d, 0x00c32821, 0x00461023, 0x00021fc2, 0x00431021,
5615 0x00021043, 0x1840000c, 0x00002021, 0x91020001, 0x00461023, 0x00021fc2,
5616 0x00431021, 0x00021843, 0x94a20000, 0x24e70001, 0x00822021, 0x00e3102a,
5617 0x1440fffb, 0x24a50002, 0x00041c02, 0x3082ffff, 0x00622021, 0x00041402,
5618 0x00822021, 0x3c02ffff, 0x01821024, 0x3083ffff, 0x00431025, 0x3c010001,
5619 0x080040fa, 0xac220f80, 0x3c050001, 0x24a50f7c, 0x90a20000, 0x3c0c0001,
5620 0x01836021, 0x8d8c8018, 0x000220c2, 0x1080000e, 0x00003821, 0x01603021,
5621 0x24a5000c, 0x8ca20000, 0x8ca30004, 0x24a50008, 0x24e70001, 0xacc20000,
5622 0xacc30004, 0x00e4102b, 0x1440fff8, 0x24c60008, 0x3c050001, 0x24a50f7c,
5623 0x90a20000, 0x30430007, 0x24020004, 0x10620011, 0x28620005, 0x10400005,
5624 0x24020002, 0x10620008, 0x000710c0, 0x080040fa, 0x00000000, 0x24020006,
5625 0x1062000e, 0x000710c0, 0x080040fa, 0x00000000, 0x00a21821, 0x9463000c,
5626 0x004b1021, 0x080040fa, 0xa4430000, 0x000710c0, 0x00a21821, 0x8c63000c,
5627 0x004b1021, 0x080040fa, 0xac430000, 0x00a21821, 0x8c63000c, 0x004b2021,
5628 0x00a21021, 0xac830000, 0x94420010, 0xa4820004, 0x95e70006, 0x3c020001,
5629 0x90420f7c, 0x3c030001, 0x90630f7a, 0x00e2c823, 0x3c020001, 0x90420f7b,
5630 0x24630028, 0x01e34021, 0x24420028, 0x15200012, 0x01e23021, 0x94c2000c,
5631 0x3c010001, 0xa4220f78, 0x94c20004, 0x94c30006, 0x3c010001, 0xa4200f76,
5632 0x3c010001, 0xa4200f72, 0x00021400, 0x00431025, 0x3c010001, 0xac220f6c,
5633 0x95020004, 0x3c010001, 0x08004124, 0xa4220f70, 0x3c020001, 0x94420f70,
5634 0x3c030001, 0x94630f72, 0x00431021, 0xa5020004, 0x3c020001, 0x94420f6c,
5635 0xa4c20004, 0x3c020001, 0x8c420f6c, 0xa4c20006, 0x3c040001, 0x94840f72,
5636 0x3c020001, 0x94420f70, 0x3c0a0001, 0x954a0f76, 0x00441821, 0x3063ffff,
5637 0x0062182a, 0x24020002, 0x1122000b, 0x00832023, 0x3c030001, 0x94630f78,
5638 0x30620009, 0x10400006, 0x3062fff6, 0xa4c2000c, 0x3c020001, 0x94420f78,
5639 0x30420009, 0x01425023, 0x24020001, 0x1122001b, 0x29220002, 0x50400005,
5640 0x24020002, 0x11200007, 0x31a2ffff, 0x08004197, 0x00000000, 0x1122001d,
5641 0x24020016, 0x08004197, 0x31a2ffff, 0x3c0e0001, 0x95ce0f80, 0x10800005,
5642 0x01806821, 0x01c42021, 0x00041c02, 0x3082ffff, 0x00627021, 0x000e1027,
5643 0xa502000a, 0x3c030001, 0x90630f7b, 0x31a2ffff, 0x00e21021, 0x0800418d,
5644 0x00432023, 0x3c020001, 0x94420f80, 0x00442021, 0x00041c02, 0x3082ffff,
5645 0x00622021, 0x00807021, 0x00041027, 0x08004185, 0xa502000a, 0x3c050001,
5646 0x24a50f7a, 0x90a30000, 0x14620002, 0x24e2fff2, 0xa5e20034, 0x90a20000,
5647 0x00e21023, 0xa5020002, 0x3c030001, 0x94630f80, 0x3c020001, 0x94420f5a,
5648 0x30e5ffff, 0x00641821, 0x00451023, 0x00622023, 0x00041c02, 0x3082ffff,
5649 0x00622021, 0x00041027, 0xa502000a, 0x3c030001, 0x90630f7c, 0x24620001,
5650 0x14a20005, 0x00807021, 0x01631021, 0x90420000, 0x08004185, 0x00026200,
5651 0x24620002, 0x14a20003, 0x306200fe, 0x004b1021, 0x944c0000, 0x3c020001,
5652 0x94420f82, 0x3183ffff, 0x3c040001, 0x90840f7b, 0x00431021, 0x00e21021,
5653 0x00442023, 0x008a2021, 0x00041c02, 0x3082ffff, 0x00622021, 0x00041402,
5654 0x00822021, 0x00806821, 0x00041027, 0xa4c20010, 0x31a2ffff, 0x000e1c00,
5655 0x00431025, 0x3c040001, 0x24840f72, 0xade20010, 0x94820000, 0x3c050001,
5656 0x94a50f76, 0x3c030001, 0x8c630f6c, 0x24420001, 0x00b92821, 0xa4820000,
5657 0x3322ffff, 0x00622021, 0x0083182b, 0x3c010001, 0xa4250f76, 0x10600003,
5658 0x24a2ffff, 0x3c010001, 0xa4220f76, 0x3c024000, 0x03021025, 0x3c010001,
5659 0xac240f6c, 0xaf621008, 0x03e00008, 0x27bd0010, 0x3c030001, 0x90630f56,
5660 0x27bdffe8, 0x24020001, 0xafbf0014, 0x10620026, 0xafb00010, 0x8f620cf4,
5661 0x2442ffff, 0x3042007f, 0x00021100, 0x8c434000, 0x3c010001, 0xac230f64,
5662 0x8c434008, 0x24444000, 0x8c5c4004, 0x30620040, 0x14400002, 0x24020088,
5663 0x24020008, 0x3c010001, 0xa4220f68, 0x30620004, 0x10400005, 0x24020001,
5664 0x3c010001, 0xa0220f57, 0x080041d5, 0x00031402, 0x3c010001, 0xa0200f57,
5665 0x00031402, 0x3c010001, 0xa4220f54, 0x9483000c, 0x24020001, 0x3c010001,
5666 0xa4200f50, 0x3c010001, 0xa0220f56, 0x3c010001, 0xa4230f62, 0x24020001,
5667 0x1342001e, 0x00000000, 0x13400005, 0x24020003, 0x13420067, 0x00000000,
5668 0x080042cf, 0x00000000, 0x3c020001, 0x94420f62, 0x241a0001, 0x3c010001,
5669 0xa4200f5e, 0x3c010001, 0xa4200f52, 0x304407ff, 0x00021bc2, 0x00031823,
5670 0x3063003e, 0x34630036, 0x00021242, 0x3042003c, 0x00621821, 0x3c010001,
5671 0xa4240f58, 0x00832021, 0x24630030, 0x3c010001, 0xa4240f5a, 0x3c010001,
5672 0xa4230f5c, 0x3c060001, 0x24c60f52, 0x94c50000, 0x94c30002, 0x3c040001,
5673 0x94840f5a, 0x00651021, 0x0044102a, 0x10400013, 0x3c108000, 0x00a31021,
5674 0xa4c20000, 0x3c02a000, 0xaf620cf4, 0x3c010001, 0xa0200f56, 0x8f641008,
5675 0x00901024, 0x14400003, 0x00000000, 0x0c004064, 0x00000000, 0x8f620cf4,
5676 0x00501024, 0x104000b7, 0x00000000, 0x0800420f, 0x00000000, 0x3c030001,
5677 0x94630f50, 0x00851023, 0xa4c40000, 0x00621821, 0x3042ffff, 0x3c010001,
5678 0xa4230f50, 0xaf620ce8, 0x3c020001, 0x94420f68, 0x34420024, 0xaf620cec,
5679 0x94c30002, 0x3c020001, 0x94420f50, 0x14620012, 0x3c028000, 0x3c108000,
5680 0x3c02a000, 0xaf620cf4, 0x3c010001, 0xa0200f56, 0x8f641008, 0x00901024,
5681 0x14400003, 0x00000000, 0x0c004064, 0x00000000, 0x8f620cf4, 0x00501024,
5682 0x1440fff7, 0x00000000, 0x080042cf, 0x241a0003, 0xaf620cf4, 0x3c108000,
5683 0x8f641008, 0x00901024, 0x14400003, 0x00000000, 0x0c004064, 0x00000000,
5684 0x8f620cf4, 0x00501024, 0x1440fff7, 0x00000000, 0x080042cf, 0x241a0003,
5685 0x3c070001, 0x24e70f50, 0x94e20000, 0x03821021, 0xaf620ce0, 0x3c020001,
5686 0x8c420f64, 0xaf620ce4, 0x3c050001, 0x94a50f54, 0x94e30000, 0x3c040001,
5687 0x94840f58, 0x3c020001, 0x94420f5e, 0x00a32823, 0x00822023, 0x30a6ffff,
5688 0x3083ffff, 0x00c3102b, 0x14400043, 0x00000000, 0x3c020001, 0x94420f5c,
5689 0x00021400, 0x00621025, 0xaf620ce8, 0x94e20000, 0x3c030001, 0x94630f54,
5690 0x00441021, 0xa4e20000, 0x3042ffff, 0x14430021, 0x3c020008, 0x3c020001,
5691 0x90420f57, 0x10400006, 0x3c03000c, 0x3c020001, 0x94420f68, 0x34630624,
5692 0x0800427c, 0x0000d021, 0x3c020001, 0x94420f68, 0x3c030008, 0x34630624,
5693 0x00431025, 0xaf620cec, 0x3c108000, 0x3c02a000, 0xaf620cf4, 0x3c010001,
5694 0xa0200f56, 0x8f641008, 0x00901024, 0x14400003, 0x00000000, 0x0c004064,
5695 0x00000000, 0x8f620cf4, 0x00501024, 0x10400015, 0x00000000, 0x08004283,
5696 0x00000000, 0x3c030001, 0x94630f68, 0x34420624, 0x3c108000, 0x00621825,
5697 0x3c028000, 0xaf630cec, 0xaf620cf4, 0x8f641008, 0x00901024, 0x14400003,
5698 0x00000000, 0x0c004064, 0x00000000, 0x8f620cf4, 0x00501024, 0x1440fff7,
5699 0x00000000, 0x3c010001, 0x080042cf, 0xa4200f5e, 0x3c020001, 0x94420f5c,
5700 0x00021400, 0x00c21025, 0xaf620ce8, 0x3c020001, 0x90420f57, 0x10400009,
5701 0x3c03000c, 0x3c020001, 0x94420f68, 0x34630624, 0x0000d021, 0x00431025,
5702 0xaf620cec, 0x080042c1, 0x3c108000, 0x3c020001, 0x94420f68, 0x3c030008,
5703 0x34630604, 0x00431025, 0xaf620cec, 0x3c020001, 0x94420f5e, 0x00451021,
5704 0x3c010001, 0xa4220f5e, 0x3c108000, 0x3c02a000, 0xaf620cf4, 0x3c010001,
5705 0xa0200f56, 0x8f641008, 0x00901024, 0x14400003, 0x00000000, 0x0c004064,
5706 0x00000000, 0x8f620cf4, 0x00501024, 0x1440fff7, 0x00000000, 0x8fbf0014,
5707 0x8fb00010, 0x03e00008, 0x27bd0018, 0x00000000, 0x27bdffe0, 0x3c040001,
5708 0x24840ec0, 0x00002821, 0x00003021, 0x00003821, 0xafbf0018, 0xafa00010,
5709 0x0c004378, 0xafa00014, 0x0000d021, 0x24020130, 0xaf625000, 0x3c010001,
5710 0xa4200f50, 0x3c010001, 0xa0200f57, 0x8fbf0018, 0x03e00008, 0x27bd0020,
5711 0x27bdffe8, 0x3c1bc000, 0xafbf0014, 0xafb00010, 0xaf60680c, 0x8f626804,
5712 0x34420082, 0xaf626804, 0x8f634000, 0x24020b50, 0x3c010001, 0xac220f20,
5713 0x24020b78, 0x3c010001, 0xac220f30, 0x34630002, 0xaf634000, 0x0c004315,
5714 0x00808021, 0x3c010001, 0xa0220f34, 0x304200ff, 0x24030002, 0x14430005,
5715 0x00000000, 0x3c020001, 0x8c420f20, 0x08004308, 0xac5000c0, 0x3c020001,
5716 0x8c420f20, 0xac5000bc, 0x8f624434, 0x8f634438, 0x8f644410, 0x3c010001,
5717 0xac220f28, 0x3c010001, 0xac230f38, 0x3c010001, 0xac240f24, 0x8fbf0014,
5718 0x8fb00010, 0x03e00008, 0x27bd0018, 0x03e00008, 0x24020001, 0x27bdfff8,
5719 0x18800009, 0x00002821, 0x8f63680c, 0x8f62680c, 0x1043fffe, 0x00000000,
5720 0x24a50001, 0x00a4102a, 0x1440fff9, 0x00000000, 0x03e00008, 0x27bd0008,
5721 0x8f634450, 0x3c020001, 0x8c420f28, 0x00031c02, 0x0043102b, 0x14400008,
5722 0x3c038000, 0x3c040001, 0x8c840f38, 0x8f624450, 0x00021c02, 0x0083102b,
5723 0x1040fffc, 0x3c038000, 0xaf634444, 0x8f624444, 0x00431024, 0x1440fffd,
5724 0x00000000, 0x8f624448, 0x03e00008, 0x3042ffff, 0x3082ffff, 0x2442e000,
5725 0x2c422001, 0x14400003, 0x3c024000, 0x08004347, 0x2402ffff, 0x00822025,
5726 0xaf645c38, 0x8f625c30, 0x30420002, 0x1440fffc, 0x00001021, 0x03e00008,
5727 0x00000000, 0x8f624450, 0x3c030001, 0x8c630f24, 0x08004350, 0x3042ffff,
5728 0x8f624450, 0x3042ffff, 0x0043102b, 0x1440fffc, 0x00000000, 0x03e00008,
5729 0x00000000, 0x27bdffe0, 0x00802821, 0x3c040001, 0x24840ed0, 0x00003021,
5730 0x00003821, 0xafbf0018, 0xafa00010, 0x0c004378, 0xafa00014, 0x0800435f,
5731 0x00000000, 0x8fbf0018, 0x03e00008, 0x27bd0020, 0x3c020001, 0x3442d600,
5732 0x3c030001, 0x3463d600, 0x3c040001, 0x3484ddff, 0x3c010001, 0xac220f40,
5733 0x24020040, 0x3c010001, 0xac220f44, 0x3c010001, 0xac200f3c, 0xac600000,
5734 0x24630004, 0x0083102b, 0x5040fffd, 0xac600000, 0x03e00008, 0x00000000,
5735 0x00804821, 0x8faa0010, 0x3c020001, 0x8c420f3c, 0x3c040001, 0x8c840f44,
5736 0x8fab0014, 0x24430001, 0x0044102b, 0x3c010001, 0xac230f3c, 0x14400003,
5737 0x00004021, 0x3c010001, 0xac200f3c, 0x3c020001, 0x8c420f3c, 0x3c030001,
5738 0x8c630f40, 0x91240000, 0x00021140, 0x00431021, 0x00481021, 0x25080001,
5739 0xa0440000, 0x29020008, 0x1440fff4, 0x25290001, 0x3c020001, 0x8c420f3c,
5740 0x3c030001, 0x8c630f40, 0x8f64680c, 0x00021140, 0x00431021, 0xac440008,
5741 0xac45000c, 0xac460010, 0xac470014, 0xac4a0018, 0x03e00008, 0xac4b001c,
5742 0x00000000, 0x00000000, 0x00000000,
5743};
5744
5745static u32 tg3Tso5FwRodata[(TG3_TSO5_FW_RODATA_LEN / 4) + 1] = {
5746 0x4d61696e, 0x43707542, 0x00000000, 0x4d61696e, 0x43707541, 0x00000000,
5747 0x00000000, 0x00000000, 0x73746b6f, 0x66666c64, 0x00000000, 0x00000000,
5748 0x73746b6f, 0x66666c64, 0x00000000, 0x00000000, 0x66617461, 0x6c457272,
5749 0x00000000, 0x00000000, 0x00000000,
5750};
5751
5752static u32 tg3Tso5FwData[(TG3_TSO5_FW_DATA_LEN / 4) + 1] = {
5753 0x00000000, 0x73746b6f, 0x66666c64, 0x5f76312e, 0x322e3000, 0x00000000,
5754 0x00000000, 0x00000000, 0x00000000,
5755};
5756
5757/* tp->lock is held. */
5758static int tg3_load_tso_firmware(struct tg3 *tp)
5759{
5760 struct fw_info info;
5761 unsigned long cpu_base, cpu_scratch_base, cpu_scratch_size;
5762 int err, i;
5763
5764 if (tp->tg3_flags2 & TG3_FLG2_HW_TSO)
5765 return 0;
5766
5767 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) {
5768 info.text_base = TG3_TSO5_FW_TEXT_ADDR;
5769 info.text_len = TG3_TSO5_FW_TEXT_LEN;
5770 info.text_data = &tg3Tso5FwText[0];
5771 info.rodata_base = TG3_TSO5_FW_RODATA_ADDR;
5772 info.rodata_len = TG3_TSO5_FW_RODATA_LEN;
5773 info.rodata_data = &tg3Tso5FwRodata[0];
5774 info.data_base = TG3_TSO5_FW_DATA_ADDR;
5775 info.data_len = TG3_TSO5_FW_DATA_LEN;
5776 info.data_data = &tg3Tso5FwData[0];
5777 cpu_base = RX_CPU_BASE;
5778 cpu_scratch_base = NIC_SRAM_MBUF_POOL_BASE5705;
5779 cpu_scratch_size = (info.text_len +
5780 info.rodata_len +
5781 info.data_len +
5782 TG3_TSO5_FW_SBSS_LEN +
5783 TG3_TSO5_FW_BSS_LEN);
5784 } else {
5785 info.text_base = TG3_TSO_FW_TEXT_ADDR;
5786 info.text_len = TG3_TSO_FW_TEXT_LEN;
5787 info.text_data = &tg3TsoFwText[0];
5788 info.rodata_base = TG3_TSO_FW_RODATA_ADDR;
5789 info.rodata_len = TG3_TSO_FW_RODATA_LEN;
5790 info.rodata_data = &tg3TsoFwRodata[0];
5791 info.data_base = TG3_TSO_FW_DATA_ADDR;
5792 info.data_len = TG3_TSO_FW_DATA_LEN;
5793 info.data_data = &tg3TsoFwData[0];
5794 cpu_base = TX_CPU_BASE;
5795 cpu_scratch_base = TX_CPU_SCRATCH_BASE;
5796 cpu_scratch_size = TX_CPU_SCRATCH_SIZE;
5797 }
5798
5799 err = tg3_load_firmware_cpu(tp, cpu_base,
5800 cpu_scratch_base, cpu_scratch_size,
5801 &info);
5802 if (err)
5803 return err;
5804
5805 /* Now startup the cpu. */
5806 tw32(cpu_base + CPU_STATE, 0xffffffff);
5807 tw32_f(cpu_base + CPU_PC, info.text_base);
5808
5809 for (i = 0; i < 5; i++) {
5810 if (tr32(cpu_base + CPU_PC) == info.text_base)
5811 break;
5812 tw32(cpu_base + CPU_STATE, 0xffffffff);
5813 tw32(cpu_base + CPU_MODE, CPU_MODE_HALT);
5814 tw32_f(cpu_base + CPU_PC, info.text_base);
5815 udelay(1000);
5816 }
5817 if (i >= 5) {
5818 printk(KERN_ERR PFX "tg3_load_tso_firmware fails for %s "
5819 "to set CPU PC, is %08x should be %08x\n",
5820 tp->dev->name, tr32(cpu_base + CPU_PC),
5821 info.text_base);
5822 return -ENODEV;
5823 }
5824 tw32(cpu_base + CPU_STATE, 0xffffffff);
5825 tw32_f(cpu_base + CPU_MODE, 0x00000000);
5826 return 0;
5827}
5828
5829#endif /* TG3_TSO_SUPPORT != 0 */
5830
5831/* tp->lock is held. */
5832static void __tg3_set_mac_addr(struct tg3 *tp)
5833{
5834 u32 addr_high, addr_low;
5835 int i;
5836
5837 addr_high = ((tp->dev->dev_addr[0] << 8) |
5838 tp->dev->dev_addr[1]);
5839 addr_low = ((tp->dev->dev_addr[2] << 24) |
5840 (tp->dev->dev_addr[3] << 16) |
5841 (tp->dev->dev_addr[4] << 8) |
5842 (tp->dev->dev_addr[5] << 0));
5843 for (i = 0; i < 4; i++) {
5844 tw32(MAC_ADDR_0_HIGH + (i * 8), addr_high);
5845 tw32(MAC_ADDR_0_LOW + (i * 8), addr_low);
5846 }
5847
5848 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703 ||
5849 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704) {
5850 for (i = 0; i < 12; i++) {
5851 tw32(MAC_EXTADDR_0_HIGH + (i * 8), addr_high);
5852 tw32(MAC_EXTADDR_0_LOW + (i * 8), addr_low);
5853 }
5854 }
5855
5856 addr_high = (tp->dev->dev_addr[0] +
5857 tp->dev->dev_addr[1] +
5858 tp->dev->dev_addr[2] +
5859 tp->dev->dev_addr[3] +
5860 tp->dev->dev_addr[4] +
5861 tp->dev->dev_addr[5]) &
5862 TX_BACKOFF_SEED_MASK;
5863 tw32(MAC_TX_BACKOFF_SEED, addr_high);
5864}
5865
5866static int tg3_set_mac_addr(struct net_device *dev, void *p)
5867{
5868 struct tg3 *tp = netdev_priv(dev);
5869 struct sockaddr *addr = p;
b9ec6c1b 5870 int err = 0;
1da177e4 5871
f9804ddb
MC
5872 if (!is_valid_ether_addr(addr->sa_data))
5873 return -EINVAL;
5874
1da177e4
LT
5875 memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
5876
e75f7c90
MC
5877 if (!netif_running(dev))
5878 return 0;
5879
58712ef9
MC
5880 if (tp->tg3_flags & TG3_FLAG_ENABLE_ASF) {
5881 /* Reset chip so that ASF can re-init any MAC addresses it
5882 * needs.
5883 */
5884 tg3_netif_stop(tp);
5885 tg3_full_lock(tp, 1);
5886
5887 tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
b9ec6c1b
MC
5888 err = tg3_restart_hw(tp, 0);
5889 if (!err)
5890 tg3_netif_start(tp);
58712ef9
MC
5891 tg3_full_unlock(tp);
5892 } else {
5893 spin_lock_bh(&tp->lock);
5894 __tg3_set_mac_addr(tp);
5895 spin_unlock_bh(&tp->lock);
5896 }
1da177e4 5897
b9ec6c1b 5898 return err;
1da177e4
LT
5899}
5900
5901/* tp->lock is held. */
5902static void tg3_set_bdinfo(struct tg3 *tp, u32 bdinfo_addr,
5903 dma_addr_t mapping, u32 maxlen_flags,
5904 u32 nic_addr)
5905{
5906 tg3_write_mem(tp,
5907 (bdinfo_addr + TG3_BDINFO_HOST_ADDR + TG3_64BIT_REG_HIGH),
5908 ((u64) mapping >> 32));
5909 tg3_write_mem(tp,
5910 (bdinfo_addr + TG3_BDINFO_HOST_ADDR + TG3_64BIT_REG_LOW),
5911 ((u64) mapping & 0xffffffff));
5912 tg3_write_mem(tp,
5913 (bdinfo_addr + TG3_BDINFO_MAXLEN_FLAGS),
5914 maxlen_flags);
5915
5916 if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS))
5917 tg3_write_mem(tp,
5918 (bdinfo_addr + TG3_BDINFO_NIC_ADDR),
5919 nic_addr);
5920}
5921
5922static void __tg3_set_rx_mode(struct net_device *);
d244c892 5923static void __tg3_set_coalesce(struct tg3 *tp, struct ethtool_coalesce *ec)
15f9850d
DM
5924{
5925 tw32(HOSTCC_RXCOL_TICKS, ec->rx_coalesce_usecs);
5926 tw32(HOSTCC_TXCOL_TICKS, ec->tx_coalesce_usecs);
5927 tw32(HOSTCC_RXMAX_FRAMES, ec->rx_max_coalesced_frames);
5928 tw32(HOSTCC_TXMAX_FRAMES, ec->tx_max_coalesced_frames);
5929 if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS)) {
5930 tw32(HOSTCC_RXCOAL_TICK_INT, ec->rx_coalesce_usecs_irq);
5931 tw32(HOSTCC_TXCOAL_TICK_INT, ec->tx_coalesce_usecs_irq);
5932 }
5933 tw32(HOSTCC_RXCOAL_MAXF_INT, ec->rx_max_coalesced_frames_irq);
5934 tw32(HOSTCC_TXCOAL_MAXF_INT, ec->tx_max_coalesced_frames_irq);
5935 if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS)) {
5936 u32 val = ec->stats_block_coalesce_usecs;
5937
5938 if (!netif_carrier_ok(tp->dev))
5939 val = 0;
5940
5941 tw32(HOSTCC_STAT_COAL_TICKS, val);
5942 }
5943}
1da177e4
LT
5944
5945/* tp->lock is held. */
8e7a22e3 5946static int tg3_reset_hw(struct tg3 *tp, int reset_phy)
1da177e4
LT
5947{
5948 u32 val, rdmac_mode;
5949 int i, err, limit;
5950
5951 tg3_disable_ints(tp);
5952
5953 tg3_stop_fw(tp);
5954
5955 tg3_write_sig_pre_reset(tp, RESET_KIND_INIT);
5956
5957 if (tp->tg3_flags & TG3_FLAG_INIT_COMPLETE) {
e6de8ad1 5958 tg3_abort_hw(tp, 1);
1da177e4
LT
5959 }
5960
8e7a22e3 5961 if ((tp->tg3_flags2 & TG3_FLG2_MII_SERDES) && reset_phy)
d4d2c558
MC
5962 tg3_phy_reset(tp);
5963
1da177e4
LT
5964 err = tg3_chip_reset(tp);
5965 if (err)
5966 return err;
5967
5968 tg3_write_sig_legacy(tp, RESET_KIND_INIT);
5969
5970 /* This works around an issue with Athlon chipsets on
5971 * B3 tigon3 silicon. This bit has no effect on any
5972 * other revision. But do not set this on PCI Express
5973 * chips.
5974 */
5975 if (!(tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS))
5976 tp->pci_clock_ctrl |= CLOCK_CTRL_DELAY_PCI_GRANT;
5977 tw32_f(TG3PCI_CLOCK_CTRL, tp->pci_clock_ctrl);
5978
5979 if (tp->pci_chip_rev_id == CHIPREV_ID_5704_A0 &&
5980 (tp->tg3_flags & TG3_FLAG_PCIX_MODE)) {
5981 val = tr32(TG3PCI_PCISTATE);
5982 val |= PCISTATE_RETRY_SAME_DMA;
5983 tw32(TG3PCI_PCISTATE, val);
5984 }
5985
5986 if (GET_CHIP_REV(tp->pci_chip_rev_id) == CHIPREV_5704_BX) {
5987 /* Enable some hw fixes. */
5988 val = tr32(TG3PCI_MSI_DATA);
5989 val |= (1 << 26) | (1 << 28) | (1 << 29);
5990 tw32(TG3PCI_MSI_DATA, val);
5991 }
5992
5993 /* Descriptor ring init may make accesses to the
5994 * NIC SRAM area to setup the TX descriptors, so we
5995 * can only do this after the hardware has been
5996 * successfully reset.
5997 */
32d8c572
MC
5998 err = tg3_init_rings(tp);
5999 if (err)
6000 return err;
1da177e4
LT
6001
6002 /* This value is determined during the probe time DMA
6003 * engine test, tg3_test_dma.
6004 */
6005 tw32(TG3PCI_DMA_RW_CTRL, tp->dma_rwctrl);
6006
6007 tp->grc_mode &= ~(GRC_MODE_HOST_SENDBDS |
6008 GRC_MODE_4X_NIC_SEND_RINGS |
6009 GRC_MODE_NO_TX_PHDR_CSUM |
6010 GRC_MODE_NO_RX_PHDR_CSUM);
6011 tp->grc_mode |= GRC_MODE_HOST_SENDBDS;
d2d746f8
MC
6012
6013 /* Pseudo-header checksum is done by hardware logic and not
6014 * the offload processers, so make the chip do the pseudo-
6015 * header checksums on receive. For transmit it is more
6016 * convenient to do the pseudo-header checksum in software
6017 * as Linux does that on transmit for us in all cases.
6018 */
6019 tp->grc_mode |= GRC_MODE_NO_TX_PHDR_CSUM;
1da177e4
LT
6020
6021 tw32(GRC_MODE,
6022 tp->grc_mode |
6023 (GRC_MODE_IRQ_ON_MAC_ATTN | GRC_MODE_HOST_STACKUP));
6024
6025 /* Setup the timer prescalar register. Clock is always 66Mhz. */
6026 val = tr32(GRC_MISC_CFG);
6027 val &= ~0xff;
6028 val |= (65 << GRC_MISC_CFG_PRESCALAR_SHIFT);
6029 tw32(GRC_MISC_CFG, val);
6030
6031 /* Initialize MBUF/DESC pool. */
cbf46853 6032 if (tp->tg3_flags2 & TG3_FLG2_5750_PLUS) {
1da177e4
LT
6033 /* Do nothing. */
6034 } else if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5705) {
6035 tw32(BUFMGR_MB_POOL_ADDR, NIC_SRAM_MBUF_POOL_BASE);
6036 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704)
6037 tw32(BUFMGR_MB_POOL_SIZE, NIC_SRAM_MBUF_POOL_SIZE64);
6038 else
6039 tw32(BUFMGR_MB_POOL_SIZE, NIC_SRAM_MBUF_POOL_SIZE96);
6040 tw32(BUFMGR_DMA_DESC_POOL_ADDR, NIC_SRAM_DMA_DESC_POOL_BASE);
6041 tw32(BUFMGR_DMA_DESC_POOL_SIZE, NIC_SRAM_DMA_DESC_POOL_SIZE);
6042 }
6043#if TG3_TSO_SUPPORT != 0
6044 else if (tp->tg3_flags2 & TG3_FLG2_TSO_CAPABLE) {
6045 int fw_len;
6046
6047 fw_len = (TG3_TSO5_FW_TEXT_LEN +
6048 TG3_TSO5_FW_RODATA_LEN +
6049 TG3_TSO5_FW_DATA_LEN +
6050 TG3_TSO5_FW_SBSS_LEN +
6051 TG3_TSO5_FW_BSS_LEN);
6052 fw_len = (fw_len + (0x80 - 1)) & ~(0x80 - 1);
6053 tw32(BUFMGR_MB_POOL_ADDR,
6054 NIC_SRAM_MBUF_POOL_BASE5705 + fw_len);
6055 tw32(BUFMGR_MB_POOL_SIZE,
6056 NIC_SRAM_MBUF_POOL_SIZE5705 - fw_len - 0xa00);
6057 }
6058#endif
6059
0f893dc6 6060 if (tp->dev->mtu <= ETH_DATA_LEN) {
1da177e4
LT
6061 tw32(BUFMGR_MB_RDMA_LOW_WATER,
6062 tp->bufmgr_config.mbuf_read_dma_low_water);
6063 tw32(BUFMGR_MB_MACRX_LOW_WATER,
6064 tp->bufmgr_config.mbuf_mac_rx_low_water);
6065 tw32(BUFMGR_MB_HIGH_WATER,
6066 tp->bufmgr_config.mbuf_high_water);
6067 } else {
6068 tw32(BUFMGR_MB_RDMA_LOW_WATER,
6069 tp->bufmgr_config.mbuf_read_dma_low_water_jumbo);
6070 tw32(BUFMGR_MB_MACRX_LOW_WATER,
6071 tp->bufmgr_config.mbuf_mac_rx_low_water_jumbo);
6072 tw32(BUFMGR_MB_HIGH_WATER,
6073 tp->bufmgr_config.mbuf_high_water_jumbo);
6074 }
6075 tw32(BUFMGR_DMA_LOW_WATER,
6076 tp->bufmgr_config.dma_low_water);
6077 tw32(BUFMGR_DMA_HIGH_WATER,
6078 tp->bufmgr_config.dma_high_water);
6079
6080 tw32(BUFMGR_MODE, BUFMGR_MODE_ENABLE | BUFMGR_MODE_ATTN_ENABLE);
6081 for (i = 0; i < 2000; i++) {
6082 if (tr32(BUFMGR_MODE) & BUFMGR_MODE_ENABLE)
6083 break;
6084 udelay(10);
6085 }
6086 if (i >= 2000) {
6087 printk(KERN_ERR PFX "tg3_reset_hw cannot enable BUFMGR for %s.\n",
6088 tp->dev->name);
6089 return -ENODEV;
6090 }
6091
6092 /* Setup replenish threshold. */
f92905de
MC
6093 val = tp->rx_pending / 8;
6094 if (val == 0)
6095 val = 1;
6096 else if (val > tp->rx_std_max_post)
6097 val = tp->rx_std_max_post;
6098
6099 tw32(RCVBDI_STD_THRESH, val);
1da177e4
LT
6100
6101 /* Initialize TG3_BDINFO's at:
6102 * RCVDBDI_STD_BD: standard eth size rx ring
6103 * RCVDBDI_JUMBO_BD: jumbo frame rx ring
6104 * RCVDBDI_MINI_BD: small frame rx ring (??? does not work)
6105 *
6106 * like so:
6107 * TG3_BDINFO_HOST_ADDR: high/low parts of DMA address of ring
6108 * TG3_BDINFO_MAXLEN_FLAGS: (rx max buffer size << 16) |
6109 * ring attribute flags
6110 * TG3_BDINFO_NIC_ADDR: location of descriptors in nic SRAM
6111 *
6112 * Standard receive ring @ NIC_SRAM_RX_BUFFER_DESC, 512 entries.
6113 * Jumbo receive ring @ NIC_SRAM_RX_JUMBO_BUFFER_DESC, 256 entries.
6114 *
6115 * The size of each ring is fixed in the firmware, but the location is
6116 * configurable.
6117 */
6118 tw32(RCVDBDI_STD_BD + TG3_BDINFO_HOST_ADDR + TG3_64BIT_REG_HIGH,
6119 ((u64) tp->rx_std_mapping >> 32));
6120 tw32(RCVDBDI_STD_BD + TG3_BDINFO_HOST_ADDR + TG3_64BIT_REG_LOW,
6121 ((u64) tp->rx_std_mapping & 0xffffffff));
6122 tw32(RCVDBDI_STD_BD + TG3_BDINFO_NIC_ADDR,
6123 NIC_SRAM_RX_BUFFER_DESC);
6124
6125 /* Don't even try to program the JUMBO/MINI buffer descriptor
6126 * configs on 5705.
6127 */
6128 if (tp->tg3_flags2 & TG3_FLG2_5705_PLUS) {
6129 tw32(RCVDBDI_STD_BD + TG3_BDINFO_MAXLEN_FLAGS,
6130 RX_STD_MAX_SIZE_5705 << BDINFO_FLAGS_MAXLEN_SHIFT);
6131 } else {
6132 tw32(RCVDBDI_STD_BD + TG3_BDINFO_MAXLEN_FLAGS,
6133 RX_STD_MAX_SIZE << BDINFO_FLAGS_MAXLEN_SHIFT);
6134
6135 tw32(RCVDBDI_MINI_BD + TG3_BDINFO_MAXLEN_FLAGS,
6136 BDINFO_FLAGS_DISABLED);
6137
6138 /* Setup replenish threshold. */
6139 tw32(RCVBDI_JUMBO_THRESH, tp->rx_jumbo_pending / 8);
6140
0f893dc6 6141 if (tp->tg3_flags & TG3_FLAG_JUMBO_RING_ENABLE) {
1da177e4
LT
6142 tw32(RCVDBDI_JUMBO_BD + TG3_BDINFO_HOST_ADDR + TG3_64BIT_REG_HIGH,
6143 ((u64) tp->rx_jumbo_mapping >> 32));
6144 tw32(RCVDBDI_JUMBO_BD + TG3_BDINFO_HOST_ADDR + TG3_64BIT_REG_LOW,
6145 ((u64) tp->rx_jumbo_mapping & 0xffffffff));
6146 tw32(RCVDBDI_JUMBO_BD + TG3_BDINFO_MAXLEN_FLAGS,
6147 RX_JUMBO_MAX_SIZE << BDINFO_FLAGS_MAXLEN_SHIFT);
6148 tw32(RCVDBDI_JUMBO_BD + TG3_BDINFO_NIC_ADDR,
6149 NIC_SRAM_RX_JUMBO_BUFFER_DESC);
6150 } else {
6151 tw32(RCVDBDI_JUMBO_BD + TG3_BDINFO_MAXLEN_FLAGS,
6152 BDINFO_FLAGS_DISABLED);
6153 }
6154
6155 }
6156
6157 /* There is only one send ring on 5705/5750, no need to explicitly
6158 * disable the others.
6159 */
6160 if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS)) {
6161 /* Clear out send RCB ring in SRAM. */
6162 for (i = NIC_SRAM_SEND_RCB; i < NIC_SRAM_RCV_RET_RCB; i += TG3_BDINFO_SIZE)
6163 tg3_write_mem(tp, i + TG3_BDINFO_MAXLEN_FLAGS,
6164 BDINFO_FLAGS_DISABLED);
6165 }
6166
6167 tp->tx_prod = 0;
6168 tp->tx_cons = 0;
6169 tw32_mailbox(MAILBOX_SNDHOST_PROD_IDX_0 + TG3_64BIT_REG_LOW, 0);
6170 tw32_tx_mbox(MAILBOX_SNDNIC_PROD_IDX_0 + TG3_64BIT_REG_LOW, 0);
6171
6172 tg3_set_bdinfo(tp, NIC_SRAM_SEND_RCB,
6173 tp->tx_desc_mapping,
6174 (TG3_TX_RING_SIZE <<
6175 BDINFO_FLAGS_MAXLEN_SHIFT),
6176 NIC_SRAM_TX_BUFFER_DESC);
6177
6178 /* There is only one receive return ring on 5705/5750, no need
6179 * to explicitly disable the others.
6180 */
6181 if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS)) {
6182 for (i = NIC_SRAM_RCV_RET_RCB; i < NIC_SRAM_STATS_BLK;
6183 i += TG3_BDINFO_SIZE) {
6184 tg3_write_mem(tp, i + TG3_BDINFO_MAXLEN_FLAGS,
6185 BDINFO_FLAGS_DISABLED);
6186 }
6187 }
6188
6189 tp->rx_rcb_ptr = 0;
6190 tw32_rx_mbox(MAILBOX_RCVRET_CON_IDX_0 + TG3_64BIT_REG_LOW, 0);
6191
6192 tg3_set_bdinfo(tp, NIC_SRAM_RCV_RET_RCB,
6193 tp->rx_rcb_mapping,
6194 (TG3_RX_RCB_RING_SIZE(tp) <<
6195 BDINFO_FLAGS_MAXLEN_SHIFT),
6196 0);
6197
6198 tp->rx_std_ptr = tp->rx_pending;
6199 tw32_rx_mbox(MAILBOX_RCV_STD_PROD_IDX + TG3_64BIT_REG_LOW,
6200 tp->rx_std_ptr);
6201
0f893dc6 6202 tp->rx_jumbo_ptr = (tp->tg3_flags & TG3_FLAG_JUMBO_RING_ENABLE) ?
1da177e4
LT
6203 tp->rx_jumbo_pending : 0;
6204 tw32_rx_mbox(MAILBOX_RCV_JUMBO_PROD_IDX + TG3_64BIT_REG_LOW,
6205 tp->rx_jumbo_ptr);
6206
6207 /* Initialize MAC address and backoff seed. */
6208 __tg3_set_mac_addr(tp);
6209
6210 /* MTU + ethernet header + FCS + optional VLAN tag */
6211 tw32(MAC_RX_MTU_SIZE, tp->dev->mtu + ETH_HLEN + 8);
6212
6213 /* The slot time is changed by tg3_setup_phy if we
6214 * run at gigabit with half duplex.
6215 */
6216 tw32(MAC_TX_LENGTHS,
6217 (2 << TX_LENGTHS_IPG_CRS_SHIFT) |
6218 (6 << TX_LENGTHS_IPG_SHIFT) |
6219 (32 << TX_LENGTHS_SLOT_TIME_SHIFT));
6220
6221 /* Receive rules. */
6222 tw32(MAC_RCV_RULE_CFG, RCV_RULE_CFG_DEFAULT_CLASS);
6223 tw32(RCVLPC_CONFIG, 0x0181);
6224
6225 /* Calculate RDMAC_MODE setting early, we need it to determine
6226 * the RCVLPC_STATE_ENABLE mask.
6227 */
6228 rdmac_mode = (RDMAC_MODE_ENABLE | RDMAC_MODE_TGTABORT_ENAB |
6229 RDMAC_MODE_MSTABORT_ENAB | RDMAC_MODE_PARITYERR_ENAB |
6230 RDMAC_MODE_ADDROFLOW_ENAB | RDMAC_MODE_FIFOOFLOW_ENAB |
6231 RDMAC_MODE_FIFOURUN_ENAB | RDMAC_MODE_FIFOOREAD_ENAB |
6232 RDMAC_MODE_LNGREAD_ENAB);
6233 if (tp->tg3_flags & TG3_FLAG_SPLIT_MODE)
6234 rdmac_mode |= RDMAC_MODE_SPLIT_ENABLE;
85e94ced
MC
6235
6236 /* If statement applies to 5705 and 5750 PCI devices only */
6237 if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705 &&
6238 tp->pci_chip_rev_id != CHIPREV_ID_5705_A0) ||
6239 (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750)) {
1da177e4
LT
6240 if (tp->tg3_flags2 & TG3_FLG2_TSO_CAPABLE &&
6241 (tp->pci_chip_rev_id == CHIPREV_ID_5705_A1 ||
6242 tp->pci_chip_rev_id == CHIPREV_ID_5705_A2)) {
6243 rdmac_mode |= RDMAC_MODE_FIFO_SIZE_128;
6244 } else if (!(tr32(TG3PCI_PCISTATE) & PCISTATE_BUS_SPEED_HIGH) &&
6245 !(tp->tg3_flags2 & TG3_FLG2_IS_5788)) {
6246 rdmac_mode |= RDMAC_MODE_FIFO_LONG_BURST;
6247 }
6248 }
6249
85e94ced
MC
6250 if (tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS)
6251 rdmac_mode |= RDMAC_MODE_FIFO_LONG_BURST;
6252
1da177e4
LT
6253#if TG3_TSO_SUPPORT != 0
6254 if (tp->tg3_flags2 & TG3_FLG2_HW_TSO)
6255 rdmac_mode |= (1 << 27);
6256#endif
6257
6258 /* Receive/send statistics. */
1661394e
MC
6259 if (tp->tg3_flags2 & TG3_FLG2_5750_PLUS) {
6260 val = tr32(RCVLPC_STATS_ENABLE);
6261 val &= ~RCVLPC_STATSENAB_DACK_FIX;
6262 tw32(RCVLPC_STATS_ENABLE, val);
6263 } else if ((rdmac_mode & RDMAC_MODE_FIFO_SIZE_128) &&
6264 (tp->tg3_flags2 & TG3_FLG2_TSO_CAPABLE)) {
1da177e4
LT
6265 val = tr32(RCVLPC_STATS_ENABLE);
6266 val &= ~RCVLPC_STATSENAB_LNGBRST_RFIX;
6267 tw32(RCVLPC_STATS_ENABLE, val);
6268 } else {
6269 tw32(RCVLPC_STATS_ENABLE, 0xffffff);
6270 }
6271 tw32(RCVLPC_STATSCTRL, RCVLPC_STATSCTRL_ENABLE);
6272 tw32(SNDDATAI_STATSENAB, 0xffffff);
6273 tw32(SNDDATAI_STATSCTRL,
6274 (SNDDATAI_SCTRL_ENABLE |
6275 SNDDATAI_SCTRL_FASTUPD));
6276
6277 /* Setup host coalescing engine. */
6278 tw32(HOSTCC_MODE, 0);
6279 for (i = 0; i < 2000; i++) {
6280 if (!(tr32(HOSTCC_MODE) & HOSTCC_MODE_ENABLE))
6281 break;
6282 udelay(10);
6283 }
6284
d244c892 6285 __tg3_set_coalesce(tp, &tp->coal);
1da177e4
LT
6286
6287 /* set status block DMA address */
6288 tw32(HOSTCC_STATUS_BLK_HOST_ADDR + TG3_64BIT_REG_HIGH,
6289 ((u64) tp->status_mapping >> 32));
6290 tw32(HOSTCC_STATUS_BLK_HOST_ADDR + TG3_64BIT_REG_LOW,
6291 ((u64) tp->status_mapping & 0xffffffff));
6292
6293 if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS)) {
6294 /* Status/statistics block address. See tg3_timer,
6295 * the tg3_periodic_fetch_stats call there, and
6296 * tg3_get_stats to see how this works for 5705/5750 chips.
6297 */
1da177e4
LT
6298 tw32(HOSTCC_STATS_BLK_HOST_ADDR + TG3_64BIT_REG_HIGH,
6299 ((u64) tp->stats_mapping >> 32));
6300 tw32(HOSTCC_STATS_BLK_HOST_ADDR + TG3_64BIT_REG_LOW,
6301 ((u64) tp->stats_mapping & 0xffffffff));
6302 tw32(HOSTCC_STATS_BLK_NIC_ADDR, NIC_SRAM_STATS_BLK);
6303 tw32(HOSTCC_STATUS_BLK_NIC_ADDR, NIC_SRAM_STATUS_BLK);
6304 }
6305
6306 tw32(HOSTCC_MODE, HOSTCC_MODE_ENABLE | tp->coalesce_mode);
6307
6308 tw32(RCVCC_MODE, RCVCC_MODE_ENABLE | RCVCC_MODE_ATTN_ENABLE);
6309 tw32(RCVLPC_MODE, RCVLPC_MODE_ENABLE);
6310 if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS))
6311 tw32(RCVLSC_MODE, RCVLSC_MODE_ENABLE | RCVLSC_MODE_ATTN_ENABLE);
6312
6313 /* Clear statistics/status block in chip, and status block in ram. */
6314 for (i = NIC_SRAM_STATS_BLK;
6315 i < NIC_SRAM_STATUS_BLK + TG3_HW_STATUS_SIZE;
6316 i += sizeof(u32)) {
6317 tg3_write_mem(tp, i, 0);
6318 udelay(40);
6319 }
6320 memset(tp->hw_status, 0, TG3_HW_STATUS_SIZE);
6321
c94e3941
MC
6322 if (tp->tg3_flags2 & TG3_FLG2_MII_SERDES) {
6323 tp->tg3_flags2 &= ~TG3_FLG2_PARALLEL_DETECT;
6324 /* reset to prevent losing 1st rx packet intermittently */
6325 tw32_f(MAC_RX_MODE, RX_MODE_RESET);
6326 udelay(10);
6327 }
6328
1da177e4
LT
6329 tp->mac_mode = MAC_MODE_TXSTAT_ENABLE | MAC_MODE_RXSTAT_ENABLE |
6330 MAC_MODE_TDE_ENABLE | MAC_MODE_RDE_ENABLE | MAC_MODE_FHDE_ENABLE;
6331 tw32_f(MAC_MODE, tp->mac_mode | MAC_MODE_RXSTAT_CLEAR | MAC_MODE_TXSTAT_CLEAR);
6332 udelay(40);
6333
314fba34
MC
6334 /* tp->grc_local_ctrl is partially set up during tg3_get_invariants().
6335 * If TG3_FLAG_EEPROM_WRITE_PROT is set, we should read the
6336 * register to preserve the GPIO settings for LOMs. The GPIOs,
6337 * whether used as inputs or outputs, are set by boot code after
6338 * reset.
6339 */
6340 if (tp->tg3_flags & TG3_FLAG_EEPROM_WRITE_PROT) {
6341 u32 gpio_mask;
6342
6343 gpio_mask = GRC_LCLCTRL_GPIO_OE0 | GRC_LCLCTRL_GPIO_OE2 |
6344 GRC_LCLCTRL_GPIO_OUTPUT0 | GRC_LCLCTRL_GPIO_OUTPUT2;
3e7d83bc
MC
6345
6346 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5752)
6347 gpio_mask |= GRC_LCLCTRL_GPIO_OE3 |
6348 GRC_LCLCTRL_GPIO_OUTPUT3;
6349
af36e6b6
MC
6350 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755)
6351 gpio_mask |= GRC_LCLCTRL_GPIO_UART_SEL;
6352
314fba34
MC
6353 tp->grc_local_ctrl |= tr32(GRC_LOCAL_CTRL) & gpio_mask;
6354
6355 /* GPIO1 must be driven high for eeprom write protect */
1da177e4
LT
6356 tp->grc_local_ctrl |= (GRC_LCLCTRL_GPIO_OE1 |
6357 GRC_LCLCTRL_GPIO_OUTPUT1);
314fba34 6358 }
1da177e4
LT
6359 tw32_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl);
6360 udelay(100);
6361
09ee929c 6362 tw32_mailbox_f(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW, 0);
fac9b83e 6363 tp->last_tag = 0;
1da177e4
LT
6364
6365 if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS)) {
6366 tw32_f(DMAC_MODE, DMAC_MODE_ENABLE);
6367 udelay(40);
6368 }
6369
6370 val = (WDMAC_MODE_ENABLE | WDMAC_MODE_TGTABORT_ENAB |
6371 WDMAC_MODE_MSTABORT_ENAB | WDMAC_MODE_PARITYERR_ENAB |
6372 WDMAC_MODE_ADDROFLOW_ENAB | WDMAC_MODE_FIFOOFLOW_ENAB |
6373 WDMAC_MODE_FIFOURUN_ENAB | WDMAC_MODE_FIFOOREAD_ENAB |
6374 WDMAC_MODE_LNGREAD_ENAB);
6375
85e94ced
MC
6376 /* If statement applies to 5705 and 5750 PCI devices only */
6377 if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705 &&
6378 tp->pci_chip_rev_id != CHIPREV_ID_5705_A0) ||
6379 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750) {
1da177e4
LT
6380 if ((tp->tg3_flags & TG3_FLG2_TSO_CAPABLE) &&
6381 (tp->pci_chip_rev_id == CHIPREV_ID_5705_A1 ||
6382 tp->pci_chip_rev_id == CHIPREV_ID_5705_A2)) {
6383 /* nothing */
6384 } else if (!(tr32(TG3PCI_PCISTATE) & PCISTATE_BUS_SPEED_HIGH) &&
6385 !(tp->tg3_flags2 & TG3_FLG2_IS_5788) &&
6386 !(tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS)) {
6387 val |= WDMAC_MODE_RX_ACCEL;
6388 }
6389 }
6390
d9ab5ad1 6391 /* Enable host coalescing bug fix */
af36e6b6
MC
6392 if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755) ||
6393 (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787))
d9ab5ad1
MC
6394 val |= (1 << 29);
6395
1da177e4
LT
6396 tw32_f(WDMAC_MODE, val);
6397 udelay(40);
6398
6399 if ((tp->tg3_flags & TG3_FLAG_PCIX_MODE) != 0) {
6400 val = tr32(TG3PCI_X_CAPS);
6401 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703) {
6402 val &= ~PCIX_CAPS_BURST_MASK;
6403 val |= (PCIX_CAPS_MAX_BURST_CPIOB << PCIX_CAPS_BURST_SHIFT);
6404 } else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704) {
6405 val &= ~(PCIX_CAPS_SPLIT_MASK | PCIX_CAPS_BURST_MASK);
6406 val |= (PCIX_CAPS_MAX_BURST_CPIOB << PCIX_CAPS_BURST_SHIFT);
6407 if (tp->tg3_flags & TG3_FLAG_SPLIT_MODE)
6408 val |= (tp->split_mode_max_reqs <<
6409 PCIX_CAPS_SPLIT_SHIFT);
6410 }
6411 tw32(TG3PCI_X_CAPS, val);
6412 }
6413
6414 tw32_f(RDMAC_MODE, rdmac_mode);
6415 udelay(40);
6416
6417 tw32(RCVDCC_MODE, RCVDCC_MODE_ENABLE | RCVDCC_MODE_ATTN_ENABLE);
6418 if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS))
6419 tw32(MBFREE_MODE, MBFREE_MODE_ENABLE);
6420 tw32(SNDDATAC_MODE, SNDDATAC_MODE_ENABLE);
6421 tw32(SNDBDC_MODE, SNDBDC_MODE_ENABLE | SNDBDC_MODE_ATTN_ENABLE);
6422 tw32(RCVBDI_MODE, RCVBDI_MODE_ENABLE | RCVBDI_MODE_RCB_ATTN_ENAB);
6423 tw32(RCVDBDI_MODE, RCVDBDI_MODE_ENABLE | RCVDBDI_MODE_INV_RING_SZ);
6424 tw32(SNDDATAI_MODE, SNDDATAI_MODE_ENABLE);
6425#if TG3_TSO_SUPPORT != 0
6426 if (tp->tg3_flags2 & TG3_FLG2_HW_TSO)
6427 tw32(SNDDATAI_MODE, SNDDATAI_MODE_ENABLE | 0x8);
6428#endif
6429 tw32(SNDBDI_MODE, SNDBDI_MODE_ENABLE | SNDBDI_MODE_ATTN_ENABLE);
6430 tw32(SNDBDS_MODE, SNDBDS_MODE_ENABLE | SNDBDS_MODE_ATTN_ENABLE);
6431
6432 if (tp->pci_chip_rev_id == CHIPREV_ID_5701_A0) {
6433 err = tg3_load_5701_a0_firmware_fix(tp);
6434 if (err)
6435 return err;
6436 }
6437
6438#if TG3_TSO_SUPPORT != 0
6439 if (tp->tg3_flags2 & TG3_FLG2_TSO_CAPABLE) {
6440 err = tg3_load_tso_firmware(tp);
6441 if (err)
6442 return err;
6443 }
6444#endif
6445
6446 tp->tx_mode = TX_MODE_ENABLE;
6447 tw32_f(MAC_TX_MODE, tp->tx_mode);
6448 udelay(100);
6449
6450 tp->rx_mode = RX_MODE_ENABLE;
af36e6b6
MC
6451 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755)
6452 tp->rx_mode |= RX_MODE_IPV6_CSUM_ENABLE;
6453
1da177e4
LT
6454 tw32_f(MAC_RX_MODE, tp->rx_mode);
6455 udelay(10);
6456
6457 if (tp->link_config.phy_is_low_power) {
6458 tp->link_config.phy_is_low_power = 0;
6459 tp->link_config.speed = tp->link_config.orig_speed;
6460 tp->link_config.duplex = tp->link_config.orig_duplex;
6461 tp->link_config.autoneg = tp->link_config.orig_autoneg;
6462 }
6463
6464 tp->mi_mode = MAC_MI_MODE_BASE;
6465 tw32_f(MAC_MI_MODE, tp->mi_mode);
6466 udelay(80);
6467
6468 tw32(MAC_LED_CTRL, tp->led_ctrl);
6469
6470 tw32(MAC_MI_STAT, MAC_MI_STAT_LNKSTAT_ATTN_ENAB);
c94e3941 6471 if (tp->tg3_flags2 & TG3_FLG2_PHY_SERDES) {
1da177e4
LT
6472 tw32_f(MAC_RX_MODE, RX_MODE_RESET);
6473 udelay(10);
6474 }
6475 tw32_f(MAC_RX_MODE, tp->rx_mode);
6476 udelay(10);
6477
6478 if (tp->tg3_flags2 & TG3_FLG2_PHY_SERDES) {
6479 if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704) &&
6480 !(tp->tg3_flags2 & TG3_FLG2_SERDES_PREEMPHASIS)) {
6481 /* Set drive transmission level to 1.2V */
6482 /* only if the signal pre-emphasis bit is not set */
6483 val = tr32(MAC_SERDES_CFG);
6484 val &= 0xfffff000;
6485 val |= 0x880;
6486 tw32(MAC_SERDES_CFG, val);
6487 }
6488 if (tp->pci_chip_rev_id == CHIPREV_ID_5703_A1)
6489 tw32(MAC_SERDES_CFG, 0x616000);
6490 }
6491
6492 /* Prevent chip from dropping frames when flow control
6493 * is enabled.
6494 */
6495 tw32_f(MAC_LOW_WMARK_MAX_RX_FRAME, 2);
6496
6497 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704 &&
6498 (tp->tg3_flags2 & TG3_FLG2_PHY_SERDES)) {
6499 /* Use hardware link auto-negotiation */
6500 tp->tg3_flags2 |= TG3_FLG2_HW_AUTONEG;
6501 }
6502
d4d2c558
MC
6503 if ((tp->tg3_flags2 & TG3_FLG2_MII_SERDES) &&
6504 (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5714)) {
6505 u32 tmp;
6506
6507 tmp = tr32(SERDES_RX_CTRL);
6508 tw32(SERDES_RX_CTRL, tmp | SERDES_RX_SIG_DETECT);
6509 tp->grc_local_ctrl &= ~GRC_LCLCTRL_USE_EXT_SIG_DETECT;
6510 tp->grc_local_ctrl |= GRC_LCLCTRL_USE_SIG_DETECT;
6511 tw32(GRC_LOCAL_CTRL, tp->grc_local_ctrl);
6512 }
6513
8e7a22e3 6514 err = tg3_setup_phy(tp, reset_phy);
1da177e4
LT
6515 if (err)
6516 return err;
6517
6518 if (!(tp->tg3_flags2 & TG3_FLG2_PHY_SERDES)) {
6519 u32 tmp;
6520
6521 /* Clear CRC stats. */
6522 if (!tg3_readphy(tp, 0x1e, &tmp)) {
6523 tg3_writephy(tp, 0x1e, tmp | 0x8000);
6524 tg3_readphy(tp, 0x14, &tmp);
6525 }
6526 }
6527
6528 __tg3_set_rx_mode(tp->dev);
6529
6530 /* Initialize receive rules. */
6531 tw32(MAC_RCV_RULE_0, 0xc2000000 & RCV_RULE_DISABLE_MASK);
6532 tw32(MAC_RCV_VALUE_0, 0xffffffff & RCV_RULE_DISABLE_MASK);
6533 tw32(MAC_RCV_RULE_1, 0x86000004 & RCV_RULE_DISABLE_MASK);
6534 tw32(MAC_RCV_VALUE_1, 0xffffffff & RCV_RULE_DISABLE_MASK);
6535
4cf78e4f 6536 if ((tp->tg3_flags2 & TG3_FLG2_5705_PLUS) &&
a4e2b347 6537 !(tp->tg3_flags2 & TG3_FLG2_5780_CLASS))
1da177e4
LT
6538 limit = 8;
6539 else
6540 limit = 16;
6541 if (tp->tg3_flags & TG3_FLAG_ENABLE_ASF)
6542 limit -= 4;
6543 switch (limit) {
6544 case 16:
6545 tw32(MAC_RCV_RULE_15, 0); tw32(MAC_RCV_VALUE_15, 0);
6546 case 15:
6547 tw32(MAC_RCV_RULE_14, 0); tw32(MAC_RCV_VALUE_14, 0);
6548 case 14:
6549 tw32(MAC_RCV_RULE_13, 0); tw32(MAC_RCV_VALUE_13, 0);
6550 case 13:
6551 tw32(MAC_RCV_RULE_12, 0); tw32(MAC_RCV_VALUE_12, 0);
6552 case 12:
6553 tw32(MAC_RCV_RULE_11, 0); tw32(MAC_RCV_VALUE_11, 0);
6554 case 11:
6555 tw32(MAC_RCV_RULE_10, 0); tw32(MAC_RCV_VALUE_10, 0);
6556 case 10:
6557 tw32(MAC_RCV_RULE_9, 0); tw32(MAC_RCV_VALUE_9, 0);
6558 case 9:
6559 tw32(MAC_RCV_RULE_8, 0); tw32(MAC_RCV_VALUE_8, 0);
6560 case 8:
6561 tw32(MAC_RCV_RULE_7, 0); tw32(MAC_RCV_VALUE_7, 0);
6562 case 7:
6563 tw32(MAC_RCV_RULE_6, 0); tw32(MAC_RCV_VALUE_6, 0);
6564 case 6:
6565 tw32(MAC_RCV_RULE_5, 0); tw32(MAC_RCV_VALUE_5, 0);
6566 case 5:
6567 tw32(MAC_RCV_RULE_4, 0); tw32(MAC_RCV_VALUE_4, 0);
6568 case 4:
6569 /* tw32(MAC_RCV_RULE_3, 0); tw32(MAC_RCV_VALUE_3, 0); */
6570 case 3:
6571 /* tw32(MAC_RCV_RULE_2, 0); tw32(MAC_RCV_VALUE_2, 0); */
6572 case 2:
6573 case 1:
6574
6575 default:
6576 break;
6577 };
6578
6579 tg3_write_sig_post_reset(tp, RESET_KIND_INIT);
6580
1da177e4
LT
6581 return 0;
6582}
6583
6584/* Called at device open time to get the chip ready for
6585 * packet processing. Invoked with tp->lock held.
6586 */
8e7a22e3 6587static int tg3_init_hw(struct tg3 *tp, int reset_phy)
1da177e4
LT
6588{
6589 int err;
6590
6591 /* Force the chip into D0. */
bc1c7567 6592 err = tg3_set_power_state(tp, PCI_D0);
1da177e4
LT
6593 if (err)
6594 goto out;
6595
6596 tg3_switch_clocks(tp);
6597
6598 tw32(TG3PCI_MEM_WIN_BASE_ADDR, 0);
6599
8e7a22e3 6600 err = tg3_reset_hw(tp, reset_phy);
1da177e4
LT
6601
6602out:
6603 return err;
6604}
6605
6606#define TG3_STAT_ADD32(PSTAT, REG) \
6607do { u32 __val = tr32(REG); \
6608 (PSTAT)->low += __val; \
6609 if ((PSTAT)->low < __val) \
6610 (PSTAT)->high += 1; \
6611} while (0)
6612
6613static void tg3_periodic_fetch_stats(struct tg3 *tp)
6614{
6615 struct tg3_hw_stats *sp = tp->hw_stats;
6616
6617 if (!netif_carrier_ok(tp->dev))
6618 return;
6619
6620 TG3_STAT_ADD32(&sp->tx_octets, MAC_TX_STATS_OCTETS);
6621 TG3_STAT_ADD32(&sp->tx_collisions, MAC_TX_STATS_COLLISIONS);
6622 TG3_STAT_ADD32(&sp->tx_xon_sent, MAC_TX_STATS_XON_SENT);
6623 TG3_STAT_ADD32(&sp->tx_xoff_sent, MAC_TX_STATS_XOFF_SENT);
6624 TG3_STAT_ADD32(&sp->tx_mac_errors, MAC_TX_STATS_MAC_ERRORS);
6625 TG3_STAT_ADD32(&sp->tx_single_collisions, MAC_TX_STATS_SINGLE_COLLISIONS);
6626 TG3_STAT_ADD32(&sp->tx_mult_collisions, MAC_TX_STATS_MULT_COLLISIONS);
6627 TG3_STAT_ADD32(&sp->tx_deferred, MAC_TX_STATS_DEFERRED);
6628 TG3_STAT_ADD32(&sp->tx_excessive_collisions, MAC_TX_STATS_EXCESSIVE_COL);
6629 TG3_STAT_ADD32(&sp->tx_late_collisions, MAC_TX_STATS_LATE_COL);
6630 TG3_STAT_ADD32(&sp->tx_ucast_packets, MAC_TX_STATS_UCAST);
6631 TG3_STAT_ADD32(&sp->tx_mcast_packets, MAC_TX_STATS_MCAST);
6632 TG3_STAT_ADD32(&sp->tx_bcast_packets, MAC_TX_STATS_BCAST);
6633
6634 TG3_STAT_ADD32(&sp->rx_octets, MAC_RX_STATS_OCTETS);
6635 TG3_STAT_ADD32(&sp->rx_fragments, MAC_RX_STATS_FRAGMENTS);
6636 TG3_STAT_ADD32(&sp->rx_ucast_packets, MAC_RX_STATS_UCAST);
6637 TG3_STAT_ADD32(&sp->rx_mcast_packets, MAC_RX_STATS_MCAST);
6638 TG3_STAT_ADD32(&sp->rx_bcast_packets, MAC_RX_STATS_BCAST);
6639 TG3_STAT_ADD32(&sp->rx_fcs_errors, MAC_RX_STATS_FCS_ERRORS);
6640 TG3_STAT_ADD32(&sp->rx_align_errors, MAC_RX_STATS_ALIGN_ERRORS);
6641 TG3_STAT_ADD32(&sp->rx_xon_pause_rcvd, MAC_RX_STATS_XON_PAUSE_RECVD);
6642 TG3_STAT_ADD32(&sp->rx_xoff_pause_rcvd, MAC_RX_STATS_XOFF_PAUSE_RECVD);
6643 TG3_STAT_ADD32(&sp->rx_mac_ctrl_rcvd, MAC_RX_STATS_MAC_CTRL_RECVD);
6644 TG3_STAT_ADD32(&sp->rx_xoff_entered, MAC_RX_STATS_XOFF_ENTERED);
6645 TG3_STAT_ADD32(&sp->rx_frame_too_long_errors, MAC_RX_STATS_FRAME_TOO_LONG);
6646 TG3_STAT_ADD32(&sp->rx_jabbers, MAC_RX_STATS_JABBERS);
6647 TG3_STAT_ADD32(&sp->rx_undersize_packets, MAC_RX_STATS_UNDERSIZE);
463d305b
MC
6648
6649 TG3_STAT_ADD32(&sp->rxbds_empty, RCVLPC_NO_RCV_BD_CNT);
6650 TG3_STAT_ADD32(&sp->rx_discards, RCVLPC_IN_DISCARDS_CNT);
6651 TG3_STAT_ADD32(&sp->rx_errors, RCVLPC_IN_ERRORS_CNT);
1da177e4
LT
6652}
6653
6654static void tg3_timer(unsigned long __opaque)
6655{
6656 struct tg3 *tp = (struct tg3 *) __opaque;
1da177e4 6657
f475f163
MC
6658 if (tp->irq_sync)
6659 goto restart_timer;
6660
f47c11ee 6661 spin_lock(&tp->lock);
1da177e4 6662
fac9b83e
DM
6663 if (!(tp->tg3_flags & TG3_FLAG_TAGGED_STATUS)) {
6664 /* All of this garbage is because when using non-tagged
6665 * IRQ status the mailbox/status_block protocol the chip
6666 * uses with the cpu is race prone.
6667 */
6668 if (tp->hw_status->status & SD_STATUS_UPDATED) {
6669 tw32(GRC_LOCAL_CTRL,
6670 tp->grc_local_ctrl | GRC_LCLCTRL_SETINT);
6671 } else {
6672 tw32(HOSTCC_MODE, tp->coalesce_mode |
6673 (HOSTCC_MODE_ENABLE | HOSTCC_MODE_NOW));
6674 }
1da177e4 6675
fac9b83e
DM
6676 if (!(tr32(WDMAC_MODE) & WDMAC_MODE_ENABLE)) {
6677 tp->tg3_flags2 |= TG3_FLG2_RESTART_TIMER;
f47c11ee 6678 spin_unlock(&tp->lock);
fac9b83e
DM
6679 schedule_work(&tp->reset_task);
6680 return;
6681 }
1da177e4
LT
6682 }
6683
1da177e4
LT
6684 /* This part only runs once per second. */
6685 if (!--tp->timer_counter) {
fac9b83e
DM
6686 if (tp->tg3_flags2 & TG3_FLG2_5705_PLUS)
6687 tg3_periodic_fetch_stats(tp);
6688
1da177e4
LT
6689 if (tp->tg3_flags & TG3_FLAG_USE_LINKCHG_REG) {
6690 u32 mac_stat;
6691 int phy_event;
6692
6693 mac_stat = tr32(MAC_STATUS);
6694
6695 phy_event = 0;
6696 if (tp->tg3_flags & TG3_FLAG_USE_MI_INTERRUPT) {
6697 if (mac_stat & MAC_STATUS_MI_INTERRUPT)
6698 phy_event = 1;
6699 } else if (mac_stat & MAC_STATUS_LNKSTATE_CHANGED)
6700 phy_event = 1;
6701
6702 if (phy_event)
6703 tg3_setup_phy(tp, 0);
6704 } else if (tp->tg3_flags & TG3_FLAG_POLL_SERDES) {
6705 u32 mac_stat = tr32(MAC_STATUS);
6706 int need_setup = 0;
6707
6708 if (netif_carrier_ok(tp->dev) &&
6709 (mac_stat & MAC_STATUS_LNKSTATE_CHANGED)) {
6710 need_setup = 1;
6711 }
6712 if (! netif_carrier_ok(tp->dev) &&
6713 (mac_stat & (MAC_STATUS_PCS_SYNCED |
6714 MAC_STATUS_SIGNAL_DET))) {
6715 need_setup = 1;
6716 }
6717 if (need_setup) {
6718 tw32_f(MAC_MODE,
6719 (tp->mac_mode &
6720 ~MAC_MODE_PORT_MODE_MASK));
6721 udelay(40);
6722 tw32_f(MAC_MODE, tp->mac_mode);
6723 udelay(40);
6724 tg3_setup_phy(tp, 0);
6725 }
747e8f8b
MC
6726 } else if (tp->tg3_flags2 & TG3_FLG2_MII_SERDES)
6727 tg3_serdes_parallel_detect(tp);
1da177e4
LT
6728
6729 tp->timer_counter = tp->timer_multiplier;
6730 }
6731
28fbef78 6732 /* Heartbeat is only sent once every 2 seconds. */
1da177e4
LT
6733 if (!--tp->asf_counter) {
6734 if (tp->tg3_flags & TG3_FLAG_ENABLE_ASF) {
6735 u32 val;
6736
bbadf503
MC
6737 tg3_write_mem(tp, NIC_SRAM_FW_CMD_MBOX,
6738 FWCMD_NICDRV_ALIVE2);
6739 tg3_write_mem(tp, NIC_SRAM_FW_CMD_LEN_MBOX, 4);
28fbef78 6740 /* 5 seconds timeout */
bbadf503 6741 tg3_write_mem(tp, NIC_SRAM_FW_CMD_DATA_MBOX, 5);
1da177e4
LT
6742 val = tr32(GRC_RX_CPU_EVENT);
6743 val |= (1 << 14);
6744 tw32(GRC_RX_CPU_EVENT, val);
6745 }
6746 tp->asf_counter = tp->asf_multiplier;
6747 }
6748
f47c11ee 6749 spin_unlock(&tp->lock);
1da177e4 6750
f475f163 6751restart_timer:
1da177e4
LT
6752 tp->timer.expires = jiffies + tp->timer_offset;
6753 add_timer(&tp->timer);
6754}
6755
81789ef5 6756static int tg3_request_irq(struct tg3 *tp)
fcfa0a32
MC
6757{
6758 irqreturn_t (*fn)(int, void *, struct pt_regs *);
6759 unsigned long flags;
6760 struct net_device *dev = tp->dev;
6761
6762 if (tp->tg3_flags2 & TG3_FLG2_USING_MSI) {
6763 fn = tg3_msi;
6764 if (tp->tg3_flags2 & TG3_FLG2_1SHOT_MSI)
6765 fn = tg3_msi_1shot;
1fb9df5d 6766 flags = IRQF_SAMPLE_RANDOM;
fcfa0a32
MC
6767 } else {
6768 fn = tg3_interrupt;
6769 if (tp->tg3_flags & TG3_FLAG_TAGGED_STATUS)
6770 fn = tg3_interrupt_tagged;
1fb9df5d 6771 flags = IRQF_SHARED | IRQF_SAMPLE_RANDOM;
fcfa0a32
MC
6772 }
6773 return (request_irq(tp->pdev->irq, fn, flags, dev->name, dev));
6774}
6775
7938109f
MC
6776static int tg3_test_interrupt(struct tg3 *tp)
6777{
6778 struct net_device *dev = tp->dev;
6779 int err, i;
6780 u32 int_mbox = 0;
6781
d4bc3927
MC
6782 if (!netif_running(dev))
6783 return -ENODEV;
6784
7938109f
MC
6785 tg3_disable_ints(tp);
6786
6787 free_irq(tp->pdev->irq, dev);
6788
6789 err = request_irq(tp->pdev->irq, tg3_test_isr,
1fb9df5d 6790 IRQF_SHARED | IRQF_SAMPLE_RANDOM, dev->name, dev);
7938109f
MC
6791 if (err)
6792 return err;
6793
38f3843e 6794 tp->hw_status->status &= ~SD_STATUS_UPDATED;
7938109f
MC
6795 tg3_enable_ints(tp);
6796
6797 tw32_f(HOSTCC_MODE, tp->coalesce_mode | HOSTCC_MODE_ENABLE |
6798 HOSTCC_MODE_NOW);
6799
6800 for (i = 0; i < 5; i++) {
09ee929c
MC
6801 int_mbox = tr32_mailbox(MAILBOX_INTERRUPT_0 +
6802 TG3_64BIT_REG_LOW);
7938109f
MC
6803 if (int_mbox != 0)
6804 break;
6805 msleep(10);
6806 }
6807
6808 tg3_disable_ints(tp);
6809
6810 free_irq(tp->pdev->irq, dev);
6aa20a22 6811
fcfa0a32 6812 err = tg3_request_irq(tp);
7938109f
MC
6813
6814 if (err)
6815 return err;
6816
6817 if (int_mbox != 0)
6818 return 0;
6819
6820 return -EIO;
6821}
6822
6823/* Returns 0 if MSI test succeeds or MSI test fails and INTx mode is
6824 * successfully restored
6825 */
6826static int tg3_test_msi(struct tg3 *tp)
6827{
6828 struct net_device *dev = tp->dev;
6829 int err;
6830 u16 pci_cmd;
6831
6832 if (!(tp->tg3_flags2 & TG3_FLG2_USING_MSI))
6833 return 0;
6834
6835 /* Turn off SERR reporting in case MSI terminates with Master
6836 * Abort.
6837 */
6838 pci_read_config_word(tp->pdev, PCI_COMMAND, &pci_cmd);
6839 pci_write_config_word(tp->pdev, PCI_COMMAND,
6840 pci_cmd & ~PCI_COMMAND_SERR);
6841
6842 err = tg3_test_interrupt(tp);
6843
6844 pci_write_config_word(tp->pdev, PCI_COMMAND, pci_cmd);
6845
6846 if (!err)
6847 return 0;
6848
6849 /* other failures */
6850 if (err != -EIO)
6851 return err;
6852
6853 /* MSI test failed, go back to INTx mode */
6854 printk(KERN_WARNING PFX "%s: No interrupt was generated using MSI, "
6855 "switching to INTx mode. Please report this failure to "
6856 "the PCI maintainer and include system chipset information.\n",
6857 tp->dev->name);
6858
6859 free_irq(tp->pdev->irq, dev);
6860 pci_disable_msi(tp->pdev);
6861
6862 tp->tg3_flags2 &= ~TG3_FLG2_USING_MSI;
6863
fcfa0a32 6864 err = tg3_request_irq(tp);
7938109f
MC
6865 if (err)
6866 return err;
6867
6868 /* Need to reset the chip because the MSI cycle may have terminated
6869 * with Master Abort.
6870 */
f47c11ee 6871 tg3_full_lock(tp, 1);
7938109f 6872
944d980e 6873 tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
8e7a22e3 6874 err = tg3_init_hw(tp, 1);
7938109f 6875
f47c11ee 6876 tg3_full_unlock(tp);
7938109f
MC
6877
6878 if (err)
6879 free_irq(tp->pdev->irq, dev);
6880
6881 return err;
6882}
6883
1da177e4
LT
6884static int tg3_open(struct net_device *dev)
6885{
6886 struct tg3 *tp = netdev_priv(dev);
6887 int err;
6888
f47c11ee 6889 tg3_full_lock(tp, 0);
1da177e4 6890
bc1c7567
MC
6891 err = tg3_set_power_state(tp, PCI_D0);
6892 if (err)
6893 return err;
6894
1da177e4
LT
6895 tg3_disable_ints(tp);
6896 tp->tg3_flags &= ~TG3_FLAG_INIT_COMPLETE;
6897
f47c11ee 6898 tg3_full_unlock(tp);
1da177e4
LT
6899
6900 /* The placement of this call is tied
6901 * to the setup and use of Host TX descriptors.
6902 */
6903 err = tg3_alloc_consistent(tp);
6904 if (err)
6905 return err;
6906
88b06bc2
MC
6907 if ((tp->tg3_flags2 & TG3_FLG2_5750_PLUS) &&
6908 (GET_CHIP_REV(tp->pci_chip_rev_id) != CHIPREV_5750_AX) &&
d4d2c558
MC
6909 (GET_CHIP_REV(tp->pci_chip_rev_id) != CHIPREV_5750_BX) &&
6910 !((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5714) &&
6911 (tp->pdev_peer == tp->pdev))) {
fac9b83e
DM
6912 /* All MSI supporting chips should support tagged
6913 * status. Assert that this is the case.
6914 */
6915 if (!(tp->tg3_flags & TG3_FLAG_TAGGED_STATUS)) {
6916 printk(KERN_WARNING PFX "%s: MSI without TAGGED? "
6917 "Not using MSI.\n", tp->dev->name);
6918 } else if (pci_enable_msi(tp->pdev) == 0) {
88b06bc2
MC
6919 u32 msi_mode;
6920
6921 msi_mode = tr32(MSGINT_MODE);
6922 tw32(MSGINT_MODE, msi_mode | MSGINT_MODE_ENABLE);
6923 tp->tg3_flags2 |= TG3_FLG2_USING_MSI;
6924 }
6925 }
fcfa0a32 6926 err = tg3_request_irq(tp);
1da177e4
LT
6927
6928 if (err) {
88b06bc2
MC
6929 if (tp->tg3_flags2 & TG3_FLG2_USING_MSI) {
6930 pci_disable_msi(tp->pdev);
6931 tp->tg3_flags2 &= ~TG3_FLG2_USING_MSI;
6932 }
1da177e4
LT
6933 tg3_free_consistent(tp);
6934 return err;
6935 }
6936
f47c11ee 6937 tg3_full_lock(tp, 0);
1da177e4 6938
8e7a22e3 6939 err = tg3_init_hw(tp, 1);
1da177e4 6940 if (err) {
944d980e 6941 tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
1da177e4
LT
6942 tg3_free_rings(tp);
6943 } else {
fac9b83e
DM
6944 if (tp->tg3_flags & TG3_FLAG_TAGGED_STATUS)
6945 tp->timer_offset = HZ;
6946 else
6947 tp->timer_offset = HZ / 10;
6948
6949 BUG_ON(tp->timer_offset > HZ);
6950 tp->timer_counter = tp->timer_multiplier =
6951 (HZ / tp->timer_offset);
6952 tp->asf_counter = tp->asf_multiplier =
28fbef78 6953 ((HZ / tp->timer_offset) * 2);
1da177e4
LT
6954
6955 init_timer(&tp->timer);
6956 tp->timer.expires = jiffies + tp->timer_offset;
6957 tp->timer.data = (unsigned long) tp;
6958 tp->timer.function = tg3_timer;
1da177e4
LT
6959 }
6960
f47c11ee 6961 tg3_full_unlock(tp);
1da177e4
LT
6962
6963 if (err) {
88b06bc2
MC
6964 free_irq(tp->pdev->irq, dev);
6965 if (tp->tg3_flags2 & TG3_FLG2_USING_MSI) {
6966 pci_disable_msi(tp->pdev);
6967 tp->tg3_flags2 &= ~TG3_FLG2_USING_MSI;
6968 }
1da177e4
LT
6969 tg3_free_consistent(tp);
6970 return err;
6971 }
6972
7938109f
MC
6973 if (tp->tg3_flags2 & TG3_FLG2_USING_MSI) {
6974 err = tg3_test_msi(tp);
fac9b83e 6975
7938109f 6976 if (err) {
f47c11ee 6977 tg3_full_lock(tp, 0);
7938109f
MC
6978
6979 if (tp->tg3_flags2 & TG3_FLG2_USING_MSI) {
6980 pci_disable_msi(tp->pdev);
6981 tp->tg3_flags2 &= ~TG3_FLG2_USING_MSI;
6982 }
944d980e 6983 tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
7938109f
MC
6984 tg3_free_rings(tp);
6985 tg3_free_consistent(tp);
6986
f47c11ee 6987 tg3_full_unlock(tp);
7938109f
MC
6988
6989 return err;
6990 }
fcfa0a32
MC
6991
6992 if (tp->tg3_flags2 & TG3_FLG2_USING_MSI) {
6993 if (tp->tg3_flags2 & TG3_FLG2_1SHOT_MSI) {
6994 u32 val = tr32(0x7c04);
6995
6996 tw32(0x7c04, val | (1 << 29));
6997 }
6998 }
7938109f
MC
6999 }
7000
f47c11ee 7001 tg3_full_lock(tp, 0);
1da177e4 7002
7938109f
MC
7003 add_timer(&tp->timer);
7004 tp->tg3_flags |= TG3_FLAG_INIT_COMPLETE;
1da177e4
LT
7005 tg3_enable_ints(tp);
7006
f47c11ee 7007 tg3_full_unlock(tp);
1da177e4
LT
7008
7009 netif_start_queue(dev);
7010
7011 return 0;
7012}
7013
7014#if 0
7015/*static*/ void tg3_dump_state(struct tg3 *tp)
7016{
7017 u32 val32, val32_2, val32_3, val32_4, val32_5;
7018 u16 val16;
7019 int i;
7020
7021 pci_read_config_word(tp->pdev, PCI_STATUS, &val16);
7022 pci_read_config_dword(tp->pdev, TG3PCI_PCISTATE, &val32);
7023 printk("DEBUG: PCI status [%04x] TG3PCI state[%08x]\n",
7024 val16, val32);
7025
7026 /* MAC block */
7027 printk("DEBUG: MAC_MODE[%08x] MAC_STATUS[%08x]\n",
7028 tr32(MAC_MODE), tr32(MAC_STATUS));
7029 printk(" MAC_EVENT[%08x] MAC_LED_CTRL[%08x]\n",
7030 tr32(MAC_EVENT), tr32(MAC_LED_CTRL));
7031 printk("DEBUG: MAC_TX_MODE[%08x] MAC_TX_STATUS[%08x]\n",
7032 tr32(MAC_TX_MODE), tr32(MAC_TX_STATUS));
7033 printk(" MAC_RX_MODE[%08x] MAC_RX_STATUS[%08x]\n",
7034 tr32(MAC_RX_MODE), tr32(MAC_RX_STATUS));
7035
7036 /* Send data initiator control block */
7037 printk("DEBUG: SNDDATAI_MODE[%08x] SNDDATAI_STATUS[%08x]\n",
7038 tr32(SNDDATAI_MODE), tr32(SNDDATAI_STATUS));
7039 printk(" SNDDATAI_STATSCTRL[%08x]\n",
7040 tr32(SNDDATAI_STATSCTRL));
7041
7042 /* Send data completion control block */
7043 printk("DEBUG: SNDDATAC_MODE[%08x]\n", tr32(SNDDATAC_MODE));
7044
7045 /* Send BD ring selector block */
7046 printk("DEBUG: SNDBDS_MODE[%08x] SNDBDS_STATUS[%08x]\n",
7047 tr32(SNDBDS_MODE), tr32(SNDBDS_STATUS));
7048
7049 /* Send BD initiator control block */
7050 printk("DEBUG: SNDBDI_MODE[%08x] SNDBDI_STATUS[%08x]\n",
7051 tr32(SNDBDI_MODE), tr32(SNDBDI_STATUS));
7052
7053 /* Send BD completion control block */
7054 printk("DEBUG: SNDBDC_MODE[%08x]\n", tr32(SNDBDC_MODE));
7055
7056 /* Receive list placement control block */
7057 printk("DEBUG: RCVLPC_MODE[%08x] RCVLPC_STATUS[%08x]\n",
7058 tr32(RCVLPC_MODE), tr32(RCVLPC_STATUS));
7059 printk(" RCVLPC_STATSCTRL[%08x]\n",
7060 tr32(RCVLPC_STATSCTRL));
7061
7062 /* Receive data and receive BD initiator control block */
7063 printk("DEBUG: RCVDBDI_MODE[%08x] RCVDBDI_STATUS[%08x]\n",
7064 tr32(RCVDBDI_MODE), tr32(RCVDBDI_STATUS));
7065
7066 /* Receive data completion control block */
7067 printk("DEBUG: RCVDCC_MODE[%08x]\n",
7068 tr32(RCVDCC_MODE));
7069
7070 /* Receive BD initiator control block */
7071 printk("DEBUG: RCVBDI_MODE[%08x] RCVBDI_STATUS[%08x]\n",
7072 tr32(RCVBDI_MODE), tr32(RCVBDI_STATUS));
7073
7074 /* Receive BD completion control block */
7075 printk("DEBUG: RCVCC_MODE[%08x] RCVCC_STATUS[%08x]\n",
7076 tr32(RCVCC_MODE), tr32(RCVCC_STATUS));
7077
7078 /* Receive list selector control block */
7079 printk("DEBUG: RCVLSC_MODE[%08x] RCVLSC_STATUS[%08x]\n",
7080 tr32(RCVLSC_MODE), tr32(RCVLSC_STATUS));
7081
7082 /* Mbuf cluster free block */
7083 printk("DEBUG: MBFREE_MODE[%08x] MBFREE_STATUS[%08x]\n",
7084 tr32(MBFREE_MODE), tr32(MBFREE_STATUS));
7085
7086 /* Host coalescing control block */
7087 printk("DEBUG: HOSTCC_MODE[%08x] HOSTCC_STATUS[%08x]\n",
7088 tr32(HOSTCC_MODE), tr32(HOSTCC_STATUS));
7089 printk("DEBUG: HOSTCC_STATS_BLK_HOST_ADDR[%08x%08x]\n",
7090 tr32(HOSTCC_STATS_BLK_HOST_ADDR + TG3_64BIT_REG_HIGH),
7091 tr32(HOSTCC_STATS_BLK_HOST_ADDR + TG3_64BIT_REG_LOW));
7092 printk("DEBUG: HOSTCC_STATUS_BLK_HOST_ADDR[%08x%08x]\n",
7093 tr32(HOSTCC_STATUS_BLK_HOST_ADDR + TG3_64BIT_REG_HIGH),
7094 tr32(HOSTCC_STATUS_BLK_HOST_ADDR + TG3_64BIT_REG_LOW));
7095 printk("DEBUG: HOSTCC_STATS_BLK_NIC_ADDR[%08x]\n",
7096 tr32(HOSTCC_STATS_BLK_NIC_ADDR));
7097 printk("DEBUG: HOSTCC_STATUS_BLK_NIC_ADDR[%08x]\n",
7098 tr32(HOSTCC_STATUS_BLK_NIC_ADDR));
7099
7100 /* Memory arbiter control block */
7101 printk("DEBUG: MEMARB_MODE[%08x] MEMARB_STATUS[%08x]\n",
7102 tr32(MEMARB_MODE), tr32(MEMARB_STATUS));
7103
7104 /* Buffer manager control block */
7105 printk("DEBUG: BUFMGR_MODE[%08x] BUFMGR_STATUS[%08x]\n",
7106 tr32(BUFMGR_MODE), tr32(BUFMGR_STATUS));
7107 printk("DEBUG: BUFMGR_MB_POOL_ADDR[%08x] BUFMGR_MB_POOL_SIZE[%08x]\n",
7108 tr32(BUFMGR_MB_POOL_ADDR), tr32(BUFMGR_MB_POOL_SIZE));
7109 printk("DEBUG: BUFMGR_DMA_DESC_POOL_ADDR[%08x] "
7110 "BUFMGR_DMA_DESC_POOL_SIZE[%08x]\n",
7111 tr32(BUFMGR_DMA_DESC_POOL_ADDR),
7112 tr32(BUFMGR_DMA_DESC_POOL_SIZE));
7113
7114 /* Read DMA control block */
7115 printk("DEBUG: RDMAC_MODE[%08x] RDMAC_STATUS[%08x]\n",
7116 tr32(RDMAC_MODE), tr32(RDMAC_STATUS));
7117
7118 /* Write DMA control block */
7119 printk("DEBUG: WDMAC_MODE[%08x] WDMAC_STATUS[%08x]\n",
7120 tr32(WDMAC_MODE), tr32(WDMAC_STATUS));
7121
7122 /* DMA completion block */
7123 printk("DEBUG: DMAC_MODE[%08x]\n",
7124 tr32(DMAC_MODE));
7125
7126 /* GRC block */
7127 printk("DEBUG: GRC_MODE[%08x] GRC_MISC_CFG[%08x]\n",
7128 tr32(GRC_MODE), tr32(GRC_MISC_CFG));
7129 printk("DEBUG: GRC_LOCAL_CTRL[%08x]\n",
7130 tr32(GRC_LOCAL_CTRL));
7131
7132 /* TG3_BDINFOs */
7133 printk("DEBUG: RCVDBDI_JUMBO_BD[%08x%08x:%08x:%08x]\n",
7134 tr32(RCVDBDI_JUMBO_BD + 0x0),
7135 tr32(RCVDBDI_JUMBO_BD + 0x4),
7136 tr32(RCVDBDI_JUMBO_BD + 0x8),
7137 tr32(RCVDBDI_JUMBO_BD + 0xc));
7138 printk("DEBUG: RCVDBDI_STD_BD[%08x%08x:%08x:%08x]\n",
7139 tr32(RCVDBDI_STD_BD + 0x0),
7140 tr32(RCVDBDI_STD_BD + 0x4),
7141 tr32(RCVDBDI_STD_BD + 0x8),
7142 tr32(RCVDBDI_STD_BD + 0xc));
7143 printk("DEBUG: RCVDBDI_MINI_BD[%08x%08x:%08x:%08x]\n",
7144 tr32(RCVDBDI_MINI_BD + 0x0),
7145 tr32(RCVDBDI_MINI_BD + 0x4),
7146 tr32(RCVDBDI_MINI_BD + 0x8),
7147 tr32(RCVDBDI_MINI_BD + 0xc));
7148
7149 tg3_read_mem(tp, NIC_SRAM_SEND_RCB + 0x0, &val32);
7150 tg3_read_mem(tp, NIC_SRAM_SEND_RCB + 0x4, &val32_2);
7151 tg3_read_mem(tp, NIC_SRAM_SEND_RCB + 0x8, &val32_3);
7152 tg3_read_mem(tp, NIC_SRAM_SEND_RCB + 0xc, &val32_4);
7153 printk("DEBUG: SRAM_SEND_RCB_0[%08x%08x:%08x:%08x]\n",
7154 val32, val32_2, val32_3, val32_4);
7155
7156 tg3_read_mem(tp, NIC_SRAM_RCV_RET_RCB + 0x0, &val32);
7157 tg3_read_mem(tp, NIC_SRAM_RCV_RET_RCB + 0x4, &val32_2);
7158 tg3_read_mem(tp, NIC_SRAM_RCV_RET_RCB + 0x8, &val32_3);
7159 tg3_read_mem(tp, NIC_SRAM_RCV_RET_RCB + 0xc, &val32_4);
7160 printk("DEBUG: SRAM_RCV_RET_RCB_0[%08x%08x:%08x:%08x]\n",
7161 val32, val32_2, val32_3, val32_4);
7162
7163 tg3_read_mem(tp, NIC_SRAM_STATUS_BLK + 0x0, &val32);
7164 tg3_read_mem(tp, NIC_SRAM_STATUS_BLK + 0x4, &val32_2);
7165 tg3_read_mem(tp, NIC_SRAM_STATUS_BLK + 0x8, &val32_3);
7166 tg3_read_mem(tp, NIC_SRAM_STATUS_BLK + 0xc, &val32_4);
7167 tg3_read_mem(tp, NIC_SRAM_STATUS_BLK + 0x10, &val32_5);
7168 printk("DEBUG: SRAM_STATUS_BLK[%08x:%08x:%08x:%08x:%08x]\n",
7169 val32, val32_2, val32_3, val32_4, val32_5);
7170
7171 /* SW status block */
7172 printk("DEBUG: Host status block [%08x:%08x:(%04x:%04x:%04x):(%04x:%04x)]\n",
7173 tp->hw_status->status,
7174 tp->hw_status->status_tag,
7175 tp->hw_status->rx_jumbo_consumer,
7176 tp->hw_status->rx_consumer,
7177 tp->hw_status->rx_mini_consumer,
7178 tp->hw_status->idx[0].rx_producer,
7179 tp->hw_status->idx[0].tx_consumer);
7180
7181 /* SW statistics block */
7182 printk("DEBUG: Host statistics block [%08x:%08x:%08x:%08x]\n",
7183 ((u32 *)tp->hw_stats)[0],
7184 ((u32 *)tp->hw_stats)[1],
7185 ((u32 *)tp->hw_stats)[2],
7186 ((u32 *)tp->hw_stats)[3]);
7187
7188 /* Mailboxes */
7189 printk("DEBUG: SNDHOST_PROD[%08x%08x] SNDNIC_PROD[%08x%08x]\n",
09ee929c
MC
7190 tr32_mailbox(MAILBOX_SNDHOST_PROD_IDX_0 + 0x0),
7191 tr32_mailbox(MAILBOX_SNDHOST_PROD_IDX_0 + 0x4),
7192 tr32_mailbox(MAILBOX_SNDNIC_PROD_IDX_0 + 0x0),
7193 tr32_mailbox(MAILBOX_SNDNIC_PROD_IDX_0 + 0x4));
1da177e4
LT
7194
7195 /* NIC side send descriptors. */
7196 for (i = 0; i < 6; i++) {
7197 unsigned long txd;
7198
7199 txd = tp->regs + NIC_SRAM_WIN_BASE + NIC_SRAM_TX_BUFFER_DESC
7200 + (i * sizeof(struct tg3_tx_buffer_desc));
7201 printk("DEBUG: NIC TXD(%d)[%08x:%08x:%08x:%08x]\n",
7202 i,
7203 readl(txd + 0x0), readl(txd + 0x4),
7204 readl(txd + 0x8), readl(txd + 0xc));
7205 }
7206
7207 /* NIC side RX descriptors. */
7208 for (i = 0; i < 6; i++) {
7209 unsigned long rxd;
7210
7211 rxd = tp->regs + NIC_SRAM_WIN_BASE + NIC_SRAM_RX_BUFFER_DESC
7212 + (i * sizeof(struct tg3_rx_buffer_desc));
7213 printk("DEBUG: NIC RXD_STD(%d)[0][%08x:%08x:%08x:%08x]\n",
7214 i,
7215 readl(rxd + 0x0), readl(rxd + 0x4),
7216 readl(rxd + 0x8), readl(rxd + 0xc));
7217 rxd += (4 * sizeof(u32));
7218 printk("DEBUG: NIC RXD_STD(%d)[1][%08x:%08x:%08x:%08x]\n",
7219 i,
7220 readl(rxd + 0x0), readl(rxd + 0x4),
7221 readl(rxd + 0x8), readl(rxd + 0xc));
7222 }
7223
7224 for (i = 0; i < 6; i++) {
7225 unsigned long rxd;
7226
7227 rxd = tp->regs + NIC_SRAM_WIN_BASE + NIC_SRAM_RX_JUMBO_BUFFER_DESC
7228 + (i * sizeof(struct tg3_rx_buffer_desc));
7229 printk("DEBUG: NIC RXD_JUMBO(%d)[0][%08x:%08x:%08x:%08x]\n",
7230 i,
7231 readl(rxd + 0x0), readl(rxd + 0x4),
7232 readl(rxd + 0x8), readl(rxd + 0xc));
7233 rxd += (4 * sizeof(u32));
7234 printk("DEBUG: NIC RXD_JUMBO(%d)[1][%08x:%08x:%08x:%08x]\n",
7235 i,
7236 readl(rxd + 0x0), readl(rxd + 0x4),
7237 readl(rxd + 0x8), readl(rxd + 0xc));
7238 }
7239}
7240#endif
7241
7242static struct net_device_stats *tg3_get_stats(struct net_device *);
7243static struct tg3_ethtool_stats *tg3_get_estats(struct tg3 *);
7244
7245static int tg3_close(struct net_device *dev)
7246{
7247 struct tg3 *tp = netdev_priv(dev);
7248
7faa006f
MC
7249 /* Calling flush_scheduled_work() may deadlock because
7250 * linkwatch_event() may be on the workqueue and it will try to get
7251 * the rtnl_lock which we are holding.
7252 */
7253 while (tp->tg3_flags & TG3_FLAG_IN_RESET_TASK)
7254 msleep(1);
7255
1da177e4
LT
7256 netif_stop_queue(dev);
7257
7258 del_timer_sync(&tp->timer);
7259
f47c11ee 7260 tg3_full_lock(tp, 1);
1da177e4
LT
7261#if 0
7262 tg3_dump_state(tp);
7263#endif
7264
7265 tg3_disable_ints(tp);
7266
944d980e 7267 tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
1da177e4
LT
7268 tg3_free_rings(tp);
7269 tp->tg3_flags &=
7270 ~(TG3_FLAG_INIT_COMPLETE |
7271 TG3_FLAG_GOT_SERDES_FLOWCTL);
1da177e4 7272
f47c11ee 7273 tg3_full_unlock(tp);
1da177e4 7274
88b06bc2
MC
7275 free_irq(tp->pdev->irq, dev);
7276 if (tp->tg3_flags2 & TG3_FLG2_USING_MSI) {
7277 pci_disable_msi(tp->pdev);
7278 tp->tg3_flags2 &= ~TG3_FLG2_USING_MSI;
7279 }
1da177e4
LT
7280
7281 memcpy(&tp->net_stats_prev, tg3_get_stats(tp->dev),
7282 sizeof(tp->net_stats_prev));
7283 memcpy(&tp->estats_prev, tg3_get_estats(tp),
7284 sizeof(tp->estats_prev));
7285
7286 tg3_free_consistent(tp);
7287
bc1c7567
MC
7288 tg3_set_power_state(tp, PCI_D3hot);
7289
7290 netif_carrier_off(tp->dev);
7291
1da177e4
LT
7292 return 0;
7293}
7294
7295static inline unsigned long get_stat64(tg3_stat64_t *val)
7296{
7297 unsigned long ret;
7298
7299#if (BITS_PER_LONG == 32)
7300 ret = val->low;
7301#else
7302 ret = ((u64)val->high << 32) | ((u64)val->low);
7303#endif
7304 return ret;
7305}
7306
7307static unsigned long calc_crc_errors(struct tg3 *tp)
7308{
7309 struct tg3_hw_stats *hw_stats = tp->hw_stats;
7310
7311 if (!(tp->tg3_flags2 & TG3_FLG2_PHY_SERDES) &&
7312 (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 ||
7313 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701)) {
1da177e4
LT
7314 u32 val;
7315
f47c11ee 7316 spin_lock_bh(&tp->lock);
1da177e4
LT
7317 if (!tg3_readphy(tp, 0x1e, &val)) {
7318 tg3_writephy(tp, 0x1e, val | 0x8000);
7319 tg3_readphy(tp, 0x14, &val);
7320 } else
7321 val = 0;
f47c11ee 7322 spin_unlock_bh(&tp->lock);
1da177e4
LT
7323
7324 tp->phy_crc_errors += val;
7325
7326 return tp->phy_crc_errors;
7327 }
7328
7329 return get_stat64(&hw_stats->rx_fcs_errors);
7330}
7331
7332#define ESTAT_ADD(member) \
7333 estats->member = old_estats->member + \
7334 get_stat64(&hw_stats->member)
7335
7336static struct tg3_ethtool_stats *tg3_get_estats(struct tg3 *tp)
7337{
7338 struct tg3_ethtool_stats *estats = &tp->estats;
7339 struct tg3_ethtool_stats *old_estats = &tp->estats_prev;
7340 struct tg3_hw_stats *hw_stats = tp->hw_stats;
7341
7342 if (!hw_stats)
7343 return old_estats;
7344
7345 ESTAT_ADD(rx_octets);
7346 ESTAT_ADD(rx_fragments);
7347 ESTAT_ADD(rx_ucast_packets);
7348 ESTAT_ADD(rx_mcast_packets);
7349 ESTAT_ADD(rx_bcast_packets);
7350 ESTAT_ADD(rx_fcs_errors);
7351 ESTAT_ADD(rx_align_errors);
7352 ESTAT_ADD(rx_xon_pause_rcvd);
7353 ESTAT_ADD(rx_xoff_pause_rcvd);
7354 ESTAT_ADD(rx_mac_ctrl_rcvd);
7355 ESTAT_ADD(rx_xoff_entered);
7356 ESTAT_ADD(rx_frame_too_long_errors);
7357 ESTAT_ADD(rx_jabbers);
7358 ESTAT_ADD(rx_undersize_packets);
7359 ESTAT_ADD(rx_in_length_errors);
7360 ESTAT_ADD(rx_out_length_errors);
7361 ESTAT_ADD(rx_64_or_less_octet_packets);
7362 ESTAT_ADD(rx_65_to_127_octet_packets);
7363 ESTAT_ADD(rx_128_to_255_octet_packets);
7364 ESTAT_ADD(rx_256_to_511_octet_packets);
7365 ESTAT_ADD(rx_512_to_1023_octet_packets);
7366 ESTAT_ADD(rx_1024_to_1522_octet_packets);
7367 ESTAT_ADD(rx_1523_to_2047_octet_packets);
7368 ESTAT_ADD(rx_2048_to_4095_octet_packets);
7369 ESTAT_ADD(rx_4096_to_8191_octet_packets);
7370 ESTAT_ADD(rx_8192_to_9022_octet_packets);
7371
7372 ESTAT_ADD(tx_octets);
7373 ESTAT_ADD(tx_collisions);
7374 ESTAT_ADD(tx_xon_sent);
7375 ESTAT_ADD(tx_xoff_sent);
7376 ESTAT_ADD(tx_flow_control);
7377 ESTAT_ADD(tx_mac_errors);
7378 ESTAT_ADD(tx_single_collisions);
7379 ESTAT_ADD(tx_mult_collisions);
7380 ESTAT_ADD(tx_deferred);
7381 ESTAT_ADD(tx_excessive_collisions);
7382 ESTAT_ADD(tx_late_collisions);
7383 ESTAT_ADD(tx_collide_2times);
7384 ESTAT_ADD(tx_collide_3times);
7385 ESTAT_ADD(tx_collide_4times);
7386 ESTAT_ADD(tx_collide_5times);
7387 ESTAT_ADD(tx_collide_6times);
7388 ESTAT_ADD(tx_collide_7times);
7389 ESTAT_ADD(tx_collide_8times);
7390 ESTAT_ADD(tx_collide_9times);
7391 ESTAT_ADD(tx_collide_10times);
7392 ESTAT_ADD(tx_collide_11times);
7393 ESTAT_ADD(tx_collide_12times);
7394 ESTAT_ADD(tx_collide_13times);
7395 ESTAT_ADD(tx_collide_14times);
7396 ESTAT_ADD(tx_collide_15times);
7397 ESTAT_ADD(tx_ucast_packets);
7398 ESTAT_ADD(tx_mcast_packets);
7399 ESTAT_ADD(tx_bcast_packets);
7400 ESTAT_ADD(tx_carrier_sense_errors);
7401 ESTAT_ADD(tx_discards);
7402 ESTAT_ADD(tx_errors);
7403
7404 ESTAT_ADD(dma_writeq_full);
7405 ESTAT_ADD(dma_write_prioq_full);
7406 ESTAT_ADD(rxbds_empty);
7407 ESTAT_ADD(rx_discards);
7408 ESTAT_ADD(rx_errors);
7409 ESTAT_ADD(rx_threshold_hit);
7410
7411 ESTAT_ADD(dma_readq_full);
7412 ESTAT_ADD(dma_read_prioq_full);
7413 ESTAT_ADD(tx_comp_queue_full);
7414
7415 ESTAT_ADD(ring_set_send_prod_index);
7416 ESTAT_ADD(ring_status_update);
7417 ESTAT_ADD(nic_irqs);
7418 ESTAT_ADD(nic_avoided_irqs);
7419 ESTAT_ADD(nic_tx_threshold_hit);
7420
7421 return estats;
7422}
7423
7424static struct net_device_stats *tg3_get_stats(struct net_device *dev)
7425{
7426 struct tg3 *tp = netdev_priv(dev);
7427 struct net_device_stats *stats = &tp->net_stats;
7428 struct net_device_stats *old_stats = &tp->net_stats_prev;
7429 struct tg3_hw_stats *hw_stats = tp->hw_stats;
7430
7431 if (!hw_stats)
7432 return old_stats;
7433
7434 stats->rx_packets = old_stats->rx_packets +
7435 get_stat64(&hw_stats->rx_ucast_packets) +
7436 get_stat64(&hw_stats->rx_mcast_packets) +
7437 get_stat64(&hw_stats->rx_bcast_packets);
6aa20a22 7438
1da177e4
LT
7439 stats->tx_packets = old_stats->tx_packets +
7440 get_stat64(&hw_stats->tx_ucast_packets) +
7441 get_stat64(&hw_stats->tx_mcast_packets) +
7442 get_stat64(&hw_stats->tx_bcast_packets);
7443
7444 stats->rx_bytes = old_stats->rx_bytes +
7445 get_stat64(&hw_stats->rx_octets);
7446 stats->tx_bytes = old_stats->tx_bytes +
7447 get_stat64(&hw_stats->tx_octets);
7448
7449 stats->rx_errors = old_stats->rx_errors +
4f63b877 7450 get_stat64(&hw_stats->rx_errors);
1da177e4
LT
7451 stats->tx_errors = old_stats->tx_errors +
7452 get_stat64(&hw_stats->tx_errors) +
7453 get_stat64(&hw_stats->tx_mac_errors) +
7454 get_stat64(&hw_stats->tx_carrier_sense_errors) +
7455 get_stat64(&hw_stats->tx_discards);
7456
7457 stats->multicast = old_stats->multicast +
7458 get_stat64(&hw_stats->rx_mcast_packets);
7459 stats->collisions = old_stats->collisions +
7460 get_stat64(&hw_stats->tx_collisions);
7461
7462 stats->rx_length_errors = old_stats->rx_length_errors +
7463 get_stat64(&hw_stats->rx_frame_too_long_errors) +
7464 get_stat64(&hw_stats->rx_undersize_packets);
7465
7466 stats->rx_over_errors = old_stats->rx_over_errors +
7467 get_stat64(&hw_stats->rxbds_empty);
7468 stats->rx_frame_errors = old_stats->rx_frame_errors +
7469 get_stat64(&hw_stats->rx_align_errors);
7470 stats->tx_aborted_errors = old_stats->tx_aborted_errors +
7471 get_stat64(&hw_stats->tx_discards);
7472 stats->tx_carrier_errors = old_stats->tx_carrier_errors +
7473 get_stat64(&hw_stats->tx_carrier_sense_errors);
7474
7475 stats->rx_crc_errors = old_stats->rx_crc_errors +
7476 calc_crc_errors(tp);
7477
4f63b877
JL
7478 stats->rx_missed_errors = old_stats->rx_missed_errors +
7479 get_stat64(&hw_stats->rx_discards);
7480
1da177e4
LT
7481 return stats;
7482}
7483
7484static inline u32 calc_crc(unsigned char *buf, int len)
7485{
7486 u32 reg;
7487 u32 tmp;
7488 int j, k;
7489
7490 reg = 0xffffffff;
7491
7492 for (j = 0; j < len; j++) {
7493 reg ^= buf[j];
7494
7495 for (k = 0; k < 8; k++) {
7496 tmp = reg & 0x01;
7497
7498 reg >>= 1;
7499
7500 if (tmp) {
7501 reg ^= 0xedb88320;
7502 }
7503 }
7504 }
7505
7506 return ~reg;
7507}
7508
7509static void tg3_set_multi(struct tg3 *tp, unsigned int accept_all)
7510{
7511 /* accept or reject all multicast frames */
7512 tw32(MAC_HASH_REG_0, accept_all ? 0xffffffff : 0);
7513 tw32(MAC_HASH_REG_1, accept_all ? 0xffffffff : 0);
7514 tw32(MAC_HASH_REG_2, accept_all ? 0xffffffff : 0);
7515 tw32(MAC_HASH_REG_3, accept_all ? 0xffffffff : 0);
7516}
7517
7518static void __tg3_set_rx_mode(struct net_device *dev)
7519{
7520 struct tg3 *tp = netdev_priv(dev);
7521 u32 rx_mode;
7522
7523 rx_mode = tp->rx_mode & ~(RX_MODE_PROMISC |
7524 RX_MODE_KEEP_VLAN_TAG);
7525
7526 /* When ASF is in use, we always keep the RX_MODE_KEEP_VLAN_TAG
7527 * flag clear.
7528 */
7529#if TG3_VLAN_TAG_USED
7530 if (!tp->vlgrp &&
7531 !(tp->tg3_flags & TG3_FLAG_ENABLE_ASF))
7532 rx_mode |= RX_MODE_KEEP_VLAN_TAG;
7533#else
7534 /* By definition, VLAN is disabled always in this
7535 * case.
7536 */
7537 if (!(tp->tg3_flags & TG3_FLAG_ENABLE_ASF))
7538 rx_mode |= RX_MODE_KEEP_VLAN_TAG;
7539#endif
7540
7541 if (dev->flags & IFF_PROMISC) {
7542 /* Promiscuous mode. */
7543 rx_mode |= RX_MODE_PROMISC;
7544 } else if (dev->flags & IFF_ALLMULTI) {
7545 /* Accept all multicast. */
7546 tg3_set_multi (tp, 1);
7547 } else if (dev->mc_count < 1) {
7548 /* Reject all multicast. */
7549 tg3_set_multi (tp, 0);
7550 } else {
7551 /* Accept one or more multicast(s). */
7552 struct dev_mc_list *mclist;
7553 unsigned int i;
7554 u32 mc_filter[4] = { 0, };
7555 u32 regidx;
7556 u32 bit;
7557 u32 crc;
7558
7559 for (i = 0, mclist = dev->mc_list; mclist && i < dev->mc_count;
7560 i++, mclist = mclist->next) {
7561
7562 crc = calc_crc (mclist->dmi_addr, ETH_ALEN);
7563 bit = ~crc & 0x7f;
7564 regidx = (bit & 0x60) >> 5;
7565 bit &= 0x1f;
7566 mc_filter[regidx] |= (1 << bit);
7567 }
7568
7569 tw32(MAC_HASH_REG_0, mc_filter[0]);
7570 tw32(MAC_HASH_REG_1, mc_filter[1]);
7571 tw32(MAC_HASH_REG_2, mc_filter[2]);
7572 tw32(MAC_HASH_REG_3, mc_filter[3]);
7573 }
7574
7575 if (rx_mode != tp->rx_mode) {
7576 tp->rx_mode = rx_mode;
7577 tw32_f(MAC_RX_MODE, rx_mode);
7578 udelay(10);
7579 }
7580}
7581
7582static void tg3_set_rx_mode(struct net_device *dev)
7583{
7584 struct tg3 *tp = netdev_priv(dev);
7585
e75f7c90
MC
7586 if (!netif_running(dev))
7587 return;
7588
f47c11ee 7589 tg3_full_lock(tp, 0);
1da177e4 7590 __tg3_set_rx_mode(dev);
f47c11ee 7591 tg3_full_unlock(tp);
1da177e4
LT
7592}
7593
7594#define TG3_REGDUMP_LEN (32 * 1024)
7595
7596static int tg3_get_regs_len(struct net_device *dev)
7597{
7598 return TG3_REGDUMP_LEN;
7599}
7600
7601static void tg3_get_regs(struct net_device *dev,
7602 struct ethtool_regs *regs, void *_p)
7603{
7604 u32 *p = _p;
7605 struct tg3 *tp = netdev_priv(dev);
7606 u8 *orig_p = _p;
7607 int i;
7608
7609 regs->version = 0;
7610
7611 memset(p, 0, TG3_REGDUMP_LEN);
7612
bc1c7567
MC
7613 if (tp->link_config.phy_is_low_power)
7614 return;
7615
f47c11ee 7616 tg3_full_lock(tp, 0);
1da177e4
LT
7617
7618#define __GET_REG32(reg) (*(p)++ = tr32(reg))
7619#define GET_REG32_LOOP(base,len) \
7620do { p = (u32 *)(orig_p + (base)); \
7621 for (i = 0; i < len; i += 4) \
7622 __GET_REG32((base) + i); \
7623} while (0)
7624#define GET_REG32_1(reg) \
7625do { p = (u32 *)(orig_p + (reg)); \
7626 __GET_REG32((reg)); \
7627} while (0)
7628
7629 GET_REG32_LOOP(TG3PCI_VENDOR, 0xb0);
7630 GET_REG32_LOOP(MAILBOX_INTERRUPT_0, 0x200);
7631 GET_REG32_LOOP(MAC_MODE, 0x4f0);
7632 GET_REG32_LOOP(SNDDATAI_MODE, 0xe0);
7633 GET_REG32_1(SNDDATAC_MODE);
7634 GET_REG32_LOOP(SNDBDS_MODE, 0x80);
7635 GET_REG32_LOOP(SNDBDI_MODE, 0x48);
7636 GET_REG32_1(SNDBDC_MODE);
7637 GET_REG32_LOOP(RCVLPC_MODE, 0x20);
7638 GET_REG32_LOOP(RCVLPC_SELLST_BASE, 0x15c);
7639 GET_REG32_LOOP(RCVDBDI_MODE, 0x0c);
7640 GET_REG32_LOOP(RCVDBDI_JUMBO_BD, 0x3c);
7641 GET_REG32_LOOP(RCVDBDI_BD_PROD_IDX_0, 0x44);
7642 GET_REG32_1(RCVDCC_MODE);
7643 GET_REG32_LOOP(RCVBDI_MODE, 0x20);
7644 GET_REG32_LOOP(RCVCC_MODE, 0x14);
7645 GET_REG32_LOOP(RCVLSC_MODE, 0x08);
7646 GET_REG32_1(MBFREE_MODE);
7647 GET_REG32_LOOP(HOSTCC_MODE, 0x100);
7648 GET_REG32_LOOP(MEMARB_MODE, 0x10);
7649 GET_REG32_LOOP(BUFMGR_MODE, 0x58);
7650 GET_REG32_LOOP(RDMAC_MODE, 0x08);
7651 GET_REG32_LOOP(WDMAC_MODE, 0x08);
091465d7
CE
7652 GET_REG32_1(RX_CPU_MODE);
7653 GET_REG32_1(RX_CPU_STATE);
7654 GET_REG32_1(RX_CPU_PGMCTR);
7655 GET_REG32_1(RX_CPU_HWBKPT);
7656 GET_REG32_1(TX_CPU_MODE);
7657 GET_REG32_1(TX_CPU_STATE);
7658 GET_REG32_1(TX_CPU_PGMCTR);
1da177e4
LT
7659 GET_REG32_LOOP(GRCMBOX_INTERRUPT_0, 0x110);
7660 GET_REG32_LOOP(FTQ_RESET, 0x120);
7661 GET_REG32_LOOP(MSGINT_MODE, 0x0c);
7662 GET_REG32_1(DMAC_MODE);
7663 GET_REG32_LOOP(GRC_MODE, 0x4c);
7664 if (tp->tg3_flags & TG3_FLAG_NVRAM)
7665 GET_REG32_LOOP(NVRAM_CMD, 0x24);
7666
7667#undef __GET_REG32
7668#undef GET_REG32_LOOP
7669#undef GET_REG32_1
7670
f47c11ee 7671 tg3_full_unlock(tp);
1da177e4
LT
7672}
7673
7674static int tg3_get_eeprom_len(struct net_device *dev)
7675{
7676 struct tg3 *tp = netdev_priv(dev);
7677
7678 return tp->nvram_size;
7679}
7680
7681static int tg3_nvram_read(struct tg3 *tp, u32 offset, u32 *val);
1820180b 7682static int tg3_nvram_read_swab(struct tg3 *tp, u32 offset, u32 *val);
1da177e4
LT
7683
7684static int tg3_get_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom, u8 *data)
7685{
7686 struct tg3 *tp = netdev_priv(dev);
7687 int ret;
7688 u8 *pd;
7689 u32 i, offset, len, val, b_offset, b_count;
7690
bc1c7567
MC
7691 if (tp->link_config.phy_is_low_power)
7692 return -EAGAIN;
7693
1da177e4
LT
7694 offset = eeprom->offset;
7695 len = eeprom->len;
7696 eeprom->len = 0;
7697
7698 eeprom->magic = TG3_EEPROM_MAGIC;
7699
7700 if (offset & 3) {
7701 /* adjustments to start on required 4 byte boundary */
7702 b_offset = offset & 3;
7703 b_count = 4 - b_offset;
7704 if (b_count > len) {
7705 /* i.e. offset=1 len=2 */
7706 b_count = len;
7707 }
7708 ret = tg3_nvram_read(tp, offset-b_offset, &val);
7709 if (ret)
7710 return ret;
7711 val = cpu_to_le32(val);
7712 memcpy(data, ((char*)&val) + b_offset, b_count);
7713 len -= b_count;
7714 offset += b_count;
7715 eeprom->len += b_count;
7716 }
7717
7718 /* read bytes upto the last 4 byte boundary */
7719 pd = &data[eeprom->len];
7720 for (i = 0; i < (len - (len & 3)); i += 4) {
7721 ret = tg3_nvram_read(tp, offset + i, &val);
7722 if (ret) {
7723 eeprom->len += i;
7724 return ret;
7725 }
7726 val = cpu_to_le32(val);
7727 memcpy(pd + i, &val, 4);
7728 }
7729 eeprom->len += i;
7730
7731 if (len & 3) {
7732 /* read last bytes not ending on 4 byte boundary */
7733 pd = &data[eeprom->len];
7734 b_count = len & 3;
7735 b_offset = offset + len - b_count;
7736 ret = tg3_nvram_read(tp, b_offset, &val);
7737 if (ret)
7738 return ret;
7739 val = cpu_to_le32(val);
7740 memcpy(pd, ((char*)&val), b_count);
7741 eeprom->len += b_count;
7742 }
7743 return 0;
7744}
7745
6aa20a22 7746static int tg3_nvram_write_block(struct tg3 *tp, u32 offset, u32 len, u8 *buf);
1da177e4
LT
7747
7748static int tg3_set_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom, u8 *data)
7749{
7750 struct tg3 *tp = netdev_priv(dev);
7751 int ret;
7752 u32 offset, len, b_offset, odd_len, start, end;
7753 u8 *buf;
7754
bc1c7567
MC
7755 if (tp->link_config.phy_is_low_power)
7756 return -EAGAIN;
7757
1da177e4
LT
7758 if (eeprom->magic != TG3_EEPROM_MAGIC)
7759 return -EINVAL;
7760
7761 offset = eeprom->offset;
7762 len = eeprom->len;
7763
7764 if ((b_offset = (offset & 3))) {
7765 /* adjustments to start on required 4 byte boundary */
7766 ret = tg3_nvram_read(tp, offset-b_offset, &start);
7767 if (ret)
7768 return ret;
7769 start = cpu_to_le32(start);
7770 len += b_offset;
7771 offset &= ~3;
1c8594b4
MC
7772 if (len < 4)
7773 len = 4;
1da177e4
LT
7774 }
7775
7776 odd_len = 0;
1c8594b4 7777 if (len & 3) {
1da177e4
LT
7778 /* adjustments to end on required 4 byte boundary */
7779 odd_len = 1;
7780 len = (len + 3) & ~3;
7781 ret = tg3_nvram_read(tp, offset+len-4, &end);
7782 if (ret)
7783 return ret;
7784 end = cpu_to_le32(end);
7785 }
7786
7787 buf = data;
7788 if (b_offset || odd_len) {
7789 buf = kmalloc(len, GFP_KERNEL);
7790 if (buf == 0)
7791 return -ENOMEM;
7792 if (b_offset)
7793 memcpy(buf, &start, 4);
7794 if (odd_len)
7795 memcpy(buf+len-4, &end, 4);
7796 memcpy(buf + b_offset, data, eeprom->len);
7797 }
7798
7799 ret = tg3_nvram_write_block(tp, offset, len, buf);
7800
7801 if (buf != data)
7802 kfree(buf);
7803
7804 return ret;
7805}
7806
7807static int tg3_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
7808{
7809 struct tg3 *tp = netdev_priv(dev);
6aa20a22 7810
1da177e4
LT
7811 cmd->supported = (SUPPORTED_Autoneg);
7812
7813 if (!(tp->tg3_flags & TG3_FLAG_10_100_ONLY))
7814 cmd->supported |= (SUPPORTED_1000baseT_Half |
7815 SUPPORTED_1000baseT_Full);
7816
ef348144 7817 if (!(tp->tg3_flags2 & TG3_FLG2_ANY_SERDES)) {
1da177e4
LT
7818 cmd->supported |= (SUPPORTED_100baseT_Half |
7819 SUPPORTED_100baseT_Full |
7820 SUPPORTED_10baseT_Half |
7821 SUPPORTED_10baseT_Full |
7822 SUPPORTED_MII);
ef348144
KK
7823 cmd->port = PORT_TP;
7824 } else {
1da177e4 7825 cmd->supported |= SUPPORTED_FIBRE;
ef348144
KK
7826 cmd->port = PORT_FIBRE;
7827 }
6aa20a22 7828
1da177e4
LT
7829 cmd->advertising = tp->link_config.advertising;
7830 if (netif_running(dev)) {
7831 cmd->speed = tp->link_config.active_speed;
7832 cmd->duplex = tp->link_config.active_duplex;
7833 }
1da177e4
LT
7834 cmd->phy_address = PHY_ADDR;
7835 cmd->transceiver = 0;
7836 cmd->autoneg = tp->link_config.autoneg;
7837 cmd->maxtxpkt = 0;
7838 cmd->maxrxpkt = 0;
7839 return 0;
7840}
6aa20a22 7841
1da177e4
LT
7842static int tg3_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
7843{
7844 struct tg3 *tp = netdev_priv(dev);
6aa20a22
JG
7845
7846 if (tp->tg3_flags2 & TG3_FLG2_ANY_SERDES) {
1da177e4
LT
7847 /* These are the only valid advertisement bits allowed. */
7848 if (cmd->autoneg == AUTONEG_ENABLE &&
7849 (cmd->advertising & ~(ADVERTISED_1000baseT_Half |
7850 ADVERTISED_1000baseT_Full |
7851 ADVERTISED_Autoneg |
7852 ADVERTISED_FIBRE)))
7853 return -EINVAL;
37ff238d
MC
7854 /* Fiber can only do SPEED_1000. */
7855 else if ((cmd->autoneg != AUTONEG_ENABLE) &&
7856 (cmd->speed != SPEED_1000))
7857 return -EINVAL;
7858 /* Copper cannot force SPEED_1000. */
7859 } else if ((cmd->autoneg != AUTONEG_ENABLE) &&
7860 (cmd->speed == SPEED_1000))
7861 return -EINVAL;
7862 else if ((cmd->speed == SPEED_1000) &&
7863 (tp->tg3_flags2 & TG3_FLAG_10_100_ONLY))
7864 return -EINVAL;
1da177e4 7865
f47c11ee 7866 tg3_full_lock(tp, 0);
1da177e4
LT
7867
7868 tp->link_config.autoneg = cmd->autoneg;
7869 if (cmd->autoneg == AUTONEG_ENABLE) {
7870 tp->link_config.advertising = cmd->advertising;
7871 tp->link_config.speed = SPEED_INVALID;
7872 tp->link_config.duplex = DUPLEX_INVALID;
7873 } else {
7874 tp->link_config.advertising = 0;
7875 tp->link_config.speed = cmd->speed;
7876 tp->link_config.duplex = cmd->duplex;
7877 }
6aa20a22 7878
1da177e4
LT
7879 if (netif_running(dev))
7880 tg3_setup_phy(tp, 1);
7881
f47c11ee 7882 tg3_full_unlock(tp);
6aa20a22 7883
1da177e4
LT
7884 return 0;
7885}
6aa20a22 7886
1da177e4
LT
7887static void tg3_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)
7888{
7889 struct tg3 *tp = netdev_priv(dev);
6aa20a22 7890
1da177e4
LT
7891 strcpy(info->driver, DRV_MODULE_NAME);
7892 strcpy(info->version, DRV_MODULE_VERSION);
c4e6575c 7893 strcpy(info->fw_version, tp->fw_ver);
1da177e4
LT
7894 strcpy(info->bus_info, pci_name(tp->pdev));
7895}
6aa20a22 7896
1da177e4
LT
7897static void tg3_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
7898{
7899 struct tg3 *tp = netdev_priv(dev);
6aa20a22 7900
1da177e4
LT
7901 wol->supported = WAKE_MAGIC;
7902 wol->wolopts = 0;
7903 if (tp->tg3_flags & TG3_FLAG_WOL_ENABLE)
7904 wol->wolopts = WAKE_MAGIC;
7905 memset(&wol->sopass, 0, sizeof(wol->sopass));
7906}
6aa20a22 7907
1da177e4
LT
7908static int tg3_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
7909{
7910 struct tg3 *tp = netdev_priv(dev);
6aa20a22 7911
1da177e4
LT
7912 if (wol->wolopts & ~WAKE_MAGIC)
7913 return -EINVAL;
7914 if ((wol->wolopts & WAKE_MAGIC) &&
7915 tp->tg3_flags2 & TG3_FLG2_PHY_SERDES &&
7916 !(tp->tg3_flags & TG3_FLAG_SERDES_WOL_CAP))
7917 return -EINVAL;
6aa20a22 7918
f47c11ee 7919 spin_lock_bh(&tp->lock);
1da177e4
LT
7920 if (wol->wolopts & WAKE_MAGIC)
7921 tp->tg3_flags |= TG3_FLAG_WOL_ENABLE;
7922 else
7923 tp->tg3_flags &= ~TG3_FLAG_WOL_ENABLE;
f47c11ee 7924 spin_unlock_bh(&tp->lock);
6aa20a22 7925
1da177e4
LT
7926 return 0;
7927}
6aa20a22 7928
1da177e4
LT
7929static u32 tg3_get_msglevel(struct net_device *dev)
7930{
7931 struct tg3 *tp = netdev_priv(dev);
7932 return tp->msg_enable;
7933}
6aa20a22 7934
1da177e4
LT
7935static void tg3_set_msglevel(struct net_device *dev, u32 value)
7936{
7937 struct tg3 *tp = netdev_priv(dev);
7938 tp->msg_enable = value;
7939}
6aa20a22 7940
1da177e4
LT
7941#if TG3_TSO_SUPPORT != 0
7942static int tg3_set_tso(struct net_device *dev, u32 value)
7943{
7944 struct tg3 *tp = netdev_priv(dev);
7945
7946 if (!(tp->tg3_flags2 & TG3_FLG2_TSO_CAPABLE)) {
7947 if (value)
7948 return -EINVAL;
7949 return 0;
7950 }
b0026624
MC
7951 if (tp->tg3_flags2 & TG3_FLG2_HW_TSO_2) {
7952 if (value)
7953 dev->features |= NETIF_F_TSO6;
7954 else
7955 dev->features &= ~NETIF_F_TSO6;
7956 }
1da177e4
LT
7957 return ethtool_op_set_tso(dev, value);
7958}
7959#endif
6aa20a22 7960
1da177e4
LT
7961static int tg3_nway_reset(struct net_device *dev)
7962{
7963 struct tg3 *tp = netdev_priv(dev);
7964 u32 bmcr;
7965 int r;
6aa20a22 7966
1da177e4
LT
7967 if (!netif_running(dev))
7968 return -EAGAIN;
7969
c94e3941
MC
7970 if (tp->tg3_flags2 & TG3_FLG2_PHY_SERDES)
7971 return -EINVAL;
7972
f47c11ee 7973 spin_lock_bh(&tp->lock);
1da177e4
LT
7974 r = -EINVAL;
7975 tg3_readphy(tp, MII_BMCR, &bmcr);
7976 if (!tg3_readphy(tp, MII_BMCR, &bmcr) &&
c94e3941
MC
7977 ((bmcr & BMCR_ANENABLE) ||
7978 (tp->tg3_flags2 & TG3_FLG2_PARALLEL_DETECT))) {
7979 tg3_writephy(tp, MII_BMCR, bmcr | BMCR_ANRESTART |
7980 BMCR_ANENABLE);
1da177e4
LT
7981 r = 0;
7982 }
f47c11ee 7983 spin_unlock_bh(&tp->lock);
6aa20a22 7984
1da177e4
LT
7985 return r;
7986}
6aa20a22 7987
1da177e4
LT
7988static void tg3_get_ringparam(struct net_device *dev, struct ethtool_ringparam *ering)
7989{
7990 struct tg3 *tp = netdev_priv(dev);
6aa20a22 7991
1da177e4
LT
7992 ering->rx_max_pending = TG3_RX_RING_SIZE - 1;
7993 ering->rx_mini_max_pending = 0;
4f81c32b
MC
7994 if (tp->tg3_flags & TG3_FLAG_JUMBO_RING_ENABLE)
7995 ering->rx_jumbo_max_pending = TG3_RX_JUMBO_RING_SIZE - 1;
7996 else
7997 ering->rx_jumbo_max_pending = 0;
7998
7999 ering->tx_max_pending = TG3_TX_RING_SIZE - 1;
1da177e4
LT
8000
8001 ering->rx_pending = tp->rx_pending;
8002 ering->rx_mini_pending = 0;
4f81c32b
MC
8003 if (tp->tg3_flags & TG3_FLAG_JUMBO_RING_ENABLE)
8004 ering->rx_jumbo_pending = tp->rx_jumbo_pending;
8005 else
8006 ering->rx_jumbo_pending = 0;
8007
1da177e4
LT
8008 ering->tx_pending = tp->tx_pending;
8009}
6aa20a22 8010
1da177e4
LT
8011static int tg3_set_ringparam(struct net_device *dev, struct ethtool_ringparam *ering)
8012{
8013 struct tg3 *tp = netdev_priv(dev);
b9ec6c1b 8014 int irq_sync = 0, err = 0;
6aa20a22 8015
1da177e4
LT
8016 if ((ering->rx_pending > TG3_RX_RING_SIZE - 1) ||
8017 (ering->rx_jumbo_pending > TG3_RX_JUMBO_RING_SIZE - 1) ||
8018 (ering->tx_pending > TG3_TX_RING_SIZE - 1))
8019 return -EINVAL;
6aa20a22 8020
bbe832c0 8021 if (netif_running(dev)) {
1da177e4 8022 tg3_netif_stop(tp);
bbe832c0
MC
8023 irq_sync = 1;
8024 }
1da177e4 8025
bbe832c0 8026 tg3_full_lock(tp, irq_sync);
6aa20a22 8027
1da177e4
LT
8028 tp->rx_pending = ering->rx_pending;
8029
8030 if ((tp->tg3_flags2 & TG3_FLG2_MAX_RXPEND_64) &&
8031 tp->rx_pending > 63)
8032 tp->rx_pending = 63;
8033 tp->rx_jumbo_pending = ering->rx_jumbo_pending;
8034 tp->tx_pending = ering->tx_pending;
8035
8036 if (netif_running(dev)) {
944d980e 8037 tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
b9ec6c1b
MC
8038 err = tg3_restart_hw(tp, 1);
8039 if (!err)
8040 tg3_netif_start(tp);
1da177e4
LT
8041 }
8042
f47c11ee 8043 tg3_full_unlock(tp);
6aa20a22 8044
b9ec6c1b 8045 return err;
1da177e4 8046}
6aa20a22 8047
1da177e4
LT
8048static void tg3_get_pauseparam(struct net_device *dev, struct ethtool_pauseparam *epause)
8049{
8050 struct tg3 *tp = netdev_priv(dev);
6aa20a22 8051
1da177e4
LT
8052 epause->autoneg = (tp->tg3_flags & TG3_FLAG_PAUSE_AUTONEG) != 0;
8053 epause->rx_pause = (tp->tg3_flags & TG3_FLAG_RX_PAUSE) != 0;
8054 epause->tx_pause = (tp->tg3_flags & TG3_FLAG_TX_PAUSE) != 0;
8055}
6aa20a22 8056
1da177e4
LT
8057static int tg3_set_pauseparam(struct net_device *dev, struct ethtool_pauseparam *epause)
8058{
8059 struct tg3 *tp = netdev_priv(dev);
b9ec6c1b 8060 int irq_sync = 0, err = 0;
6aa20a22 8061
bbe832c0 8062 if (netif_running(dev)) {
1da177e4 8063 tg3_netif_stop(tp);
bbe832c0
MC
8064 irq_sync = 1;
8065 }
1da177e4 8066
bbe832c0 8067 tg3_full_lock(tp, irq_sync);
f47c11ee 8068
1da177e4
LT
8069 if (epause->autoneg)
8070 tp->tg3_flags |= TG3_FLAG_PAUSE_AUTONEG;
8071 else
8072 tp->tg3_flags &= ~TG3_FLAG_PAUSE_AUTONEG;
8073 if (epause->rx_pause)
8074 tp->tg3_flags |= TG3_FLAG_RX_PAUSE;
8075 else
8076 tp->tg3_flags &= ~TG3_FLAG_RX_PAUSE;
8077 if (epause->tx_pause)
8078 tp->tg3_flags |= TG3_FLAG_TX_PAUSE;
8079 else
8080 tp->tg3_flags &= ~TG3_FLAG_TX_PAUSE;
8081
8082 if (netif_running(dev)) {
944d980e 8083 tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
b9ec6c1b
MC
8084 err = tg3_restart_hw(tp, 1);
8085 if (!err)
8086 tg3_netif_start(tp);
1da177e4 8087 }
f47c11ee
DM
8088
8089 tg3_full_unlock(tp);
6aa20a22 8090
b9ec6c1b 8091 return err;
1da177e4 8092}
6aa20a22 8093
1da177e4
LT
8094static u32 tg3_get_rx_csum(struct net_device *dev)
8095{
8096 struct tg3 *tp = netdev_priv(dev);
8097 return (tp->tg3_flags & TG3_FLAG_RX_CHECKSUMS) != 0;
8098}
6aa20a22 8099
1da177e4
LT
8100static int tg3_set_rx_csum(struct net_device *dev, u32 data)
8101{
8102 struct tg3 *tp = netdev_priv(dev);
6aa20a22 8103
1da177e4
LT
8104 if (tp->tg3_flags & TG3_FLAG_BROKEN_CHECKSUMS) {
8105 if (data != 0)
8106 return -EINVAL;
8107 return 0;
8108 }
6aa20a22 8109
f47c11ee 8110 spin_lock_bh(&tp->lock);
1da177e4
LT
8111 if (data)
8112 tp->tg3_flags |= TG3_FLAG_RX_CHECKSUMS;
8113 else
8114 tp->tg3_flags &= ~TG3_FLAG_RX_CHECKSUMS;
f47c11ee 8115 spin_unlock_bh(&tp->lock);
6aa20a22 8116
1da177e4
LT
8117 return 0;
8118}
6aa20a22 8119
1da177e4
LT
8120static int tg3_set_tx_csum(struct net_device *dev, u32 data)
8121{
8122 struct tg3 *tp = netdev_priv(dev);
6aa20a22 8123
1da177e4
LT
8124 if (tp->tg3_flags & TG3_FLAG_BROKEN_CHECKSUMS) {
8125 if (data != 0)
8126 return -EINVAL;
8127 return 0;
8128 }
6aa20a22 8129
af36e6b6
MC
8130 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 ||
8131 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787)
9c27dbdf 8132 ethtool_op_set_tx_hw_csum(dev, data);
1da177e4 8133 else
9c27dbdf 8134 ethtool_op_set_tx_csum(dev, data);
1da177e4
LT
8135
8136 return 0;
8137}
8138
8139static int tg3_get_stats_count (struct net_device *dev)
8140{
8141 return TG3_NUM_STATS;
8142}
8143
4cafd3f5
MC
8144static int tg3_get_test_count (struct net_device *dev)
8145{
8146 return TG3_NUM_TEST;
8147}
8148
1da177e4
LT
8149static void tg3_get_strings (struct net_device *dev, u32 stringset, u8 *buf)
8150{
8151 switch (stringset) {
8152 case ETH_SS_STATS:
8153 memcpy(buf, &ethtool_stats_keys, sizeof(ethtool_stats_keys));
8154 break;
4cafd3f5
MC
8155 case ETH_SS_TEST:
8156 memcpy(buf, &ethtool_test_keys, sizeof(ethtool_test_keys));
8157 break;
1da177e4
LT
8158 default:
8159 WARN_ON(1); /* we need a WARN() */
8160 break;
8161 }
8162}
8163
4009a93d
MC
8164static int tg3_phys_id(struct net_device *dev, u32 data)
8165{
8166 struct tg3 *tp = netdev_priv(dev);
8167 int i;
8168
8169 if (!netif_running(tp->dev))
8170 return -EAGAIN;
8171
8172 if (data == 0)
8173 data = 2;
8174
8175 for (i = 0; i < (data * 2); i++) {
8176 if ((i % 2) == 0)
8177 tw32(MAC_LED_CTRL, LED_CTRL_LNKLED_OVERRIDE |
8178 LED_CTRL_1000MBPS_ON |
8179 LED_CTRL_100MBPS_ON |
8180 LED_CTRL_10MBPS_ON |
8181 LED_CTRL_TRAFFIC_OVERRIDE |
8182 LED_CTRL_TRAFFIC_BLINK |
8183 LED_CTRL_TRAFFIC_LED);
6aa20a22 8184
4009a93d
MC
8185 else
8186 tw32(MAC_LED_CTRL, LED_CTRL_LNKLED_OVERRIDE |
8187 LED_CTRL_TRAFFIC_OVERRIDE);
8188
8189 if (msleep_interruptible(500))
8190 break;
8191 }
8192 tw32(MAC_LED_CTRL, tp->led_ctrl);
8193 return 0;
8194}
8195
1da177e4
LT
8196static void tg3_get_ethtool_stats (struct net_device *dev,
8197 struct ethtool_stats *estats, u64 *tmp_stats)
8198{
8199 struct tg3 *tp = netdev_priv(dev);
8200 memcpy(tmp_stats, tg3_get_estats(tp), sizeof(tp->estats));
8201}
8202
566f86ad 8203#define NVRAM_TEST_SIZE 0x100
1b27777a 8204#define NVRAM_SELFBOOT_FORMAT1_SIZE 0x14
566f86ad
MC
8205
8206static int tg3_test_nvram(struct tg3 *tp)
8207{
1b27777a
MC
8208 u32 *buf, csum, magic;
8209 int i, j, err = 0, size;
566f86ad 8210
1820180b 8211 if (tg3_nvram_read_swab(tp, 0, &magic) != 0)
1b27777a
MC
8212 return -EIO;
8213
1b27777a
MC
8214 if (magic == TG3_EEPROM_MAGIC)
8215 size = NVRAM_TEST_SIZE;
8216 else if ((magic & 0xff000000) == 0xa5000000) {
8217 if ((magic & 0xe00000) == 0x200000)
8218 size = NVRAM_SELFBOOT_FORMAT1_SIZE;
8219 else
8220 return 0;
8221 } else
8222 return -EIO;
8223
8224 buf = kmalloc(size, GFP_KERNEL);
566f86ad
MC
8225 if (buf == NULL)
8226 return -ENOMEM;
8227
1b27777a
MC
8228 err = -EIO;
8229 for (i = 0, j = 0; i < size; i += 4, j++) {
566f86ad
MC
8230 u32 val;
8231
8232 if ((err = tg3_nvram_read(tp, i, &val)) != 0)
8233 break;
8234 buf[j] = cpu_to_le32(val);
8235 }
1b27777a 8236 if (i < size)
566f86ad
MC
8237 goto out;
8238
1b27777a
MC
8239 /* Selfboot format */
8240 if (cpu_to_be32(buf[0]) != TG3_EEPROM_MAGIC) {
8241 u8 *buf8 = (u8 *) buf, csum8 = 0;
8242
8243 for (i = 0; i < size; i++)
8244 csum8 += buf8[i];
8245
ad96b485
AB
8246 if (csum8 == 0) {
8247 err = 0;
8248 goto out;
8249 }
8250
8251 err = -EIO;
8252 goto out;
1b27777a 8253 }
566f86ad
MC
8254
8255 /* Bootstrap checksum at offset 0x10 */
8256 csum = calc_crc((unsigned char *) buf, 0x10);
8257 if(csum != cpu_to_le32(buf[0x10/4]))
8258 goto out;
8259
8260 /* Manufacturing block starts at offset 0x74, checksum at 0xfc */
8261 csum = calc_crc((unsigned char *) &buf[0x74/4], 0x88);
8262 if (csum != cpu_to_le32(buf[0xfc/4]))
8263 goto out;
8264
8265 err = 0;
8266
8267out:
8268 kfree(buf);
8269 return err;
8270}
8271
ca43007a
MC
8272#define TG3_SERDES_TIMEOUT_SEC 2
8273#define TG3_COPPER_TIMEOUT_SEC 6
8274
8275static int tg3_test_link(struct tg3 *tp)
8276{
8277 int i, max;
8278
8279 if (!netif_running(tp->dev))
8280 return -ENODEV;
8281
4c987487 8282 if (tp->tg3_flags2 & TG3_FLG2_ANY_SERDES)
ca43007a
MC
8283 max = TG3_SERDES_TIMEOUT_SEC;
8284 else
8285 max = TG3_COPPER_TIMEOUT_SEC;
8286
8287 for (i = 0; i < max; i++) {
8288 if (netif_carrier_ok(tp->dev))
8289 return 0;
8290
8291 if (msleep_interruptible(1000))
8292 break;
8293 }
8294
8295 return -EIO;
8296}
8297
a71116d1 8298/* Only test the commonly used registers */
30ca3e37 8299static int tg3_test_registers(struct tg3 *tp)
a71116d1
MC
8300{
8301 int i, is_5705;
8302 u32 offset, read_mask, write_mask, val, save_val, read_val;
8303 static struct {
8304 u16 offset;
8305 u16 flags;
8306#define TG3_FL_5705 0x1
8307#define TG3_FL_NOT_5705 0x2
8308#define TG3_FL_NOT_5788 0x4
8309 u32 read_mask;
8310 u32 write_mask;
8311 } reg_tbl[] = {
8312 /* MAC Control Registers */
8313 { MAC_MODE, TG3_FL_NOT_5705,
8314 0x00000000, 0x00ef6f8c },
8315 { MAC_MODE, TG3_FL_5705,
8316 0x00000000, 0x01ef6b8c },
8317 { MAC_STATUS, TG3_FL_NOT_5705,
8318 0x03800107, 0x00000000 },
8319 { MAC_STATUS, TG3_FL_5705,
8320 0x03800100, 0x00000000 },
8321 { MAC_ADDR_0_HIGH, 0x0000,
8322 0x00000000, 0x0000ffff },
8323 { MAC_ADDR_0_LOW, 0x0000,
8324 0x00000000, 0xffffffff },
8325 { MAC_RX_MTU_SIZE, 0x0000,
8326 0x00000000, 0x0000ffff },
8327 { MAC_TX_MODE, 0x0000,
8328 0x00000000, 0x00000070 },
8329 { MAC_TX_LENGTHS, 0x0000,
8330 0x00000000, 0x00003fff },
8331 { MAC_RX_MODE, TG3_FL_NOT_5705,
8332 0x00000000, 0x000007fc },
8333 { MAC_RX_MODE, TG3_FL_5705,
8334 0x00000000, 0x000007dc },
8335 { MAC_HASH_REG_0, 0x0000,
8336 0x00000000, 0xffffffff },
8337 { MAC_HASH_REG_1, 0x0000,
8338 0x00000000, 0xffffffff },
8339 { MAC_HASH_REG_2, 0x0000,
8340 0x00000000, 0xffffffff },
8341 { MAC_HASH_REG_3, 0x0000,
8342 0x00000000, 0xffffffff },
8343
8344 /* Receive Data and Receive BD Initiator Control Registers. */
8345 { RCVDBDI_JUMBO_BD+0, TG3_FL_NOT_5705,
8346 0x00000000, 0xffffffff },
8347 { RCVDBDI_JUMBO_BD+4, TG3_FL_NOT_5705,
8348 0x00000000, 0xffffffff },
8349 { RCVDBDI_JUMBO_BD+8, TG3_FL_NOT_5705,
8350 0x00000000, 0x00000003 },
8351 { RCVDBDI_JUMBO_BD+0xc, TG3_FL_NOT_5705,
8352 0x00000000, 0xffffffff },
8353 { RCVDBDI_STD_BD+0, 0x0000,
8354 0x00000000, 0xffffffff },
8355 { RCVDBDI_STD_BD+4, 0x0000,
8356 0x00000000, 0xffffffff },
8357 { RCVDBDI_STD_BD+8, 0x0000,
8358 0x00000000, 0xffff0002 },
8359 { RCVDBDI_STD_BD+0xc, 0x0000,
8360 0x00000000, 0xffffffff },
6aa20a22 8361
a71116d1
MC
8362 /* Receive BD Initiator Control Registers. */
8363 { RCVBDI_STD_THRESH, TG3_FL_NOT_5705,
8364 0x00000000, 0xffffffff },
8365 { RCVBDI_STD_THRESH, TG3_FL_5705,
8366 0x00000000, 0x000003ff },
8367 { RCVBDI_JUMBO_THRESH, TG3_FL_NOT_5705,
8368 0x00000000, 0xffffffff },
6aa20a22 8369
a71116d1
MC
8370 /* Host Coalescing Control Registers. */
8371 { HOSTCC_MODE, TG3_FL_NOT_5705,
8372 0x00000000, 0x00000004 },
8373 { HOSTCC_MODE, TG3_FL_5705,
8374 0x00000000, 0x000000f6 },
8375 { HOSTCC_RXCOL_TICKS, TG3_FL_NOT_5705,
8376 0x00000000, 0xffffffff },
8377 { HOSTCC_RXCOL_TICKS, TG3_FL_5705,
8378 0x00000000, 0x000003ff },
8379 { HOSTCC_TXCOL_TICKS, TG3_FL_NOT_5705,
8380 0x00000000, 0xffffffff },
8381 { HOSTCC_TXCOL_TICKS, TG3_FL_5705,
8382 0x00000000, 0x000003ff },
8383 { HOSTCC_RXMAX_FRAMES, TG3_FL_NOT_5705,
8384 0x00000000, 0xffffffff },
8385 { HOSTCC_RXMAX_FRAMES, TG3_FL_5705 | TG3_FL_NOT_5788,
8386 0x00000000, 0x000000ff },
8387 { HOSTCC_TXMAX_FRAMES, TG3_FL_NOT_5705,
8388 0x00000000, 0xffffffff },
8389 { HOSTCC_TXMAX_FRAMES, TG3_FL_5705 | TG3_FL_NOT_5788,
8390 0x00000000, 0x000000ff },
8391 { HOSTCC_RXCOAL_TICK_INT, TG3_FL_NOT_5705,
8392 0x00000000, 0xffffffff },
8393 { HOSTCC_TXCOAL_TICK_INT, TG3_FL_NOT_5705,
8394 0x00000000, 0xffffffff },
8395 { HOSTCC_RXCOAL_MAXF_INT, TG3_FL_NOT_5705,
8396 0x00000000, 0xffffffff },
8397 { HOSTCC_RXCOAL_MAXF_INT, TG3_FL_5705 | TG3_FL_NOT_5788,
8398 0x00000000, 0x000000ff },
8399 { HOSTCC_TXCOAL_MAXF_INT, TG3_FL_NOT_5705,
8400 0x00000000, 0xffffffff },
8401 { HOSTCC_TXCOAL_MAXF_INT, TG3_FL_5705 | TG3_FL_NOT_5788,
8402 0x00000000, 0x000000ff },
8403 { HOSTCC_STAT_COAL_TICKS, TG3_FL_NOT_5705,
8404 0x00000000, 0xffffffff },
8405 { HOSTCC_STATS_BLK_HOST_ADDR, TG3_FL_NOT_5705,
8406 0x00000000, 0xffffffff },
8407 { HOSTCC_STATS_BLK_HOST_ADDR+4, TG3_FL_NOT_5705,
8408 0x00000000, 0xffffffff },
8409 { HOSTCC_STATUS_BLK_HOST_ADDR, 0x0000,
8410 0x00000000, 0xffffffff },
8411 { HOSTCC_STATUS_BLK_HOST_ADDR+4, 0x0000,
8412 0x00000000, 0xffffffff },
8413 { HOSTCC_STATS_BLK_NIC_ADDR, 0x0000,
8414 0xffffffff, 0x00000000 },
8415 { HOSTCC_STATUS_BLK_NIC_ADDR, 0x0000,
8416 0xffffffff, 0x00000000 },
8417
8418 /* Buffer Manager Control Registers. */
8419 { BUFMGR_MB_POOL_ADDR, 0x0000,
8420 0x00000000, 0x007fff80 },
8421 { BUFMGR_MB_POOL_SIZE, 0x0000,
8422 0x00000000, 0x007fffff },
8423 { BUFMGR_MB_RDMA_LOW_WATER, 0x0000,
8424 0x00000000, 0x0000003f },
8425 { BUFMGR_MB_MACRX_LOW_WATER, 0x0000,
8426 0x00000000, 0x000001ff },
8427 { BUFMGR_MB_HIGH_WATER, 0x0000,
8428 0x00000000, 0x000001ff },
8429 { BUFMGR_DMA_DESC_POOL_ADDR, TG3_FL_NOT_5705,
8430 0xffffffff, 0x00000000 },
8431 { BUFMGR_DMA_DESC_POOL_SIZE, TG3_FL_NOT_5705,
8432 0xffffffff, 0x00000000 },
6aa20a22 8433
a71116d1
MC
8434 /* Mailbox Registers */
8435 { GRCMBOX_RCVSTD_PROD_IDX+4, 0x0000,
8436 0x00000000, 0x000001ff },
8437 { GRCMBOX_RCVJUMBO_PROD_IDX+4, TG3_FL_NOT_5705,
8438 0x00000000, 0x000001ff },
8439 { GRCMBOX_RCVRET_CON_IDX_0+4, 0x0000,
8440 0x00000000, 0x000007ff },
8441 { GRCMBOX_SNDHOST_PROD_IDX_0+4, 0x0000,
8442 0x00000000, 0x000001ff },
8443
8444 { 0xffff, 0x0000, 0x00000000, 0x00000000 },
8445 };
8446
8447 if (tp->tg3_flags2 & TG3_FLG2_5705_PLUS)
8448 is_5705 = 1;
8449 else
8450 is_5705 = 0;
8451
8452 for (i = 0; reg_tbl[i].offset != 0xffff; i++) {
8453 if (is_5705 && (reg_tbl[i].flags & TG3_FL_NOT_5705))
8454 continue;
8455
8456 if (!is_5705 && (reg_tbl[i].flags & TG3_FL_5705))
8457 continue;
8458
8459 if ((tp->tg3_flags2 & TG3_FLG2_IS_5788) &&
8460 (reg_tbl[i].flags & TG3_FL_NOT_5788))
8461 continue;
8462
8463 offset = (u32) reg_tbl[i].offset;
8464 read_mask = reg_tbl[i].read_mask;
8465 write_mask = reg_tbl[i].write_mask;
8466
8467 /* Save the original register content */
8468 save_val = tr32(offset);
8469
8470 /* Determine the read-only value. */
8471 read_val = save_val & read_mask;
8472
8473 /* Write zero to the register, then make sure the read-only bits
8474 * are not changed and the read/write bits are all zeros.
8475 */
8476 tw32(offset, 0);
8477
8478 val = tr32(offset);
8479
8480 /* Test the read-only and read/write bits. */
8481 if (((val & read_mask) != read_val) || (val & write_mask))
8482 goto out;
8483
8484 /* Write ones to all the bits defined by RdMask and WrMask, then
8485 * make sure the read-only bits are not changed and the
8486 * read/write bits are all ones.
8487 */
8488 tw32(offset, read_mask | write_mask);
8489
8490 val = tr32(offset);
8491
8492 /* Test the read-only bits. */
8493 if ((val & read_mask) != read_val)
8494 goto out;
8495
8496 /* Test the read/write bits. */
8497 if ((val & write_mask) != write_mask)
8498 goto out;
8499
8500 tw32(offset, save_val);
8501 }
8502
8503 return 0;
8504
8505out:
8506 printk(KERN_ERR PFX "Register test failed at offset %x\n", offset);
8507 tw32(offset, save_val);
8508 return -EIO;
8509}
8510
7942e1db
MC
8511static int tg3_do_mem_test(struct tg3 *tp, u32 offset, u32 len)
8512{
f71e1309 8513 static const u32 test_pattern[] = { 0x00000000, 0xffffffff, 0xaa55a55a };
7942e1db
MC
8514 int i;
8515 u32 j;
8516
8517 for (i = 0; i < sizeof(test_pattern)/sizeof(u32); i++) {
8518 for (j = 0; j < len; j += 4) {
8519 u32 val;
8520
8521 tg3_write_mem(tp, offset + j, test_pattern[i]);
8522 tg3_read_mem(tp, offset + j, &val);
8523 if (val != test_pattern[i])
8524 return -EIO;
8525 }
8526 }
8527 return 0;
8528}
8529
8530static int tg3_test_memory(struct tg3 *tp)
8531{
8532 static struct mem_entry {
8533 u32 offset;
8534 u32 len;
8535 } mem_tbl_570x[] = {
38690194 8536 { 0x00000000, 0x00b50},
7942e1db
MC
8537 { 0x00002000, 0x1c000},
8538 { 0xffffffff, 0x00000}
8539 }, mem_tbl_5705[] = {
8540 { 0x00000100, 0x0000c},
8541 { 0x00000200, 0x00008},
7942e1db
MC
8542 { 0x00004000, 0x00800},
8543 { 0x00006000, 0x01000},
8544 { 0x00008000, 0x02000},
8545 { 0x00010000, 0x0e000},
8546 { 0xffffffff, 0x00000}
79f4d13a
MC
8547 }, mem_tbl_5755[] = {
8548 { 0x00000200, 0x00008},
8549 { 0x00004000, 0x00800},
8550 { 0x00006000, 0x00800},
8551 { 0x00008000, 0x02000},
8552 { 0x00010000, 0x0c000},
8553 { 0xffffffff, 0x00000}
7942e1db
MC
8554 };
8555 struct mem_entry *mem_tbl;
8556 int err = 0;
8557 int i;
8558
79f4d13a 8559 if (tp->tg3_flags2 & TG3_FLG2_5705_PLUS) {
af36e6b6
MC
8560 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 ||
8561 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787)
79f4d13a
MC
8562 mem_tbl = mem_tbl_5755;
8563 else
8564 mem_tbl = mem_tbl_5705;
8565 } else
7942e1db
MC
8566 mem_tbl = mem_tbl_570x;
8567
8568 for (i = 0; mem_tbl[i].offset != 0xffffffff; i++) {
8569 if ((err = tg3_do_mem_test(tp, mem_tbl[i].offset,
8570 mem_tbl[i].len)) != 0)
8571 break;
8572 }
6aa20a22 8573
7942e1db
MC
8574 return err;
8575}
8576
9f40dead
MC
8577#define TG3_MAC_LOOPBACK 0
8578#define TG3_PHY_LOOPBACK 1
8579
8580static int tg3_run_loopback(struct tg3 *tp, int loopback_mode)
c76949a6 8581{
9f40dead 8582 u32 mac_mode, rx_start_idx, rx_idx, tx_idx, opaque_key;
c76949a6
MC
8583 u32 desc_idx;
8584 struct sk_buff *skb, *rx_skb;
8585 u8 *tx_data;
8586 dma_addr_t map;
8587 int num_pkts, tx_len, rx_len, i, err;
8588 struct tg3_rx_buffer_desc *desc;
8589
9f40dead 8590 if (loopback_mode == TG3_MAC_LOOPBACK) {
c94e3941
MC
8591 /* HW errata - mac loopback fails in some cases on 5780.
8592 * Normal traffic and PHY loopback are not affected by
8593 * errata.
8594 */
8595 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5780)
8596 return 0;
8597
9f40dead
MC
8598 mac_mode = (tp->mac_mode & ~MAC_MODE_PORT_MODE_MASK) |
8599 MAC_MODE_PORT_INT_LPBACK | MAC_MODE_LINK_POLARITY |
8600 MAC_MODE_PORT_MODE_GMII;
8601 tw32(MAC_MODE, mac_mode);
8602 } else if (loopback_mode == TG3_PHY_LOOPBACK) {
c94e3941
MC
8603 tg3_writephy(tp, MII_BMCR, BMCR_LOOPBACK | BMCR_FULLDPLX |
8604 BMCR_SPEED1000);
8605 udelay(40);
8606 /* reset to prevent losing 1st rx packet intermittently */
8607 if (tp->tg3_flags2 & TG3_FLG2_MII_SERDES) {
8608 tw32_f(MAC_RX_MODE, RX_MODE_RESET);
8609 udelay(10);
8610 tw32_f(MAC_RX_MODE, tp->rx_mode);
8611 }
9f40dead
MC
8612 mac_mode = (tp->mac_mode & ~MAC_MODE_PORT_MODE_MASK) |
8613 MAC_MODE_LINK_POLARITY | MAC_MODE_PORT_MODE_GMII;
ff18ff02 8614 if ((tp->phy_id & PHY_ID_MASK) == PHY_ID_BCM5401) {
9f40dead 8615 mac_mode &= ~MAC_MODE_LINK_POLARITY;
ff18ff02
MC
8616 tg3_writephy(tp, MII_TG3_EXT_CTRL,
8617 MII_TG3_EXT_CTRL_LNK3_LED_MODE);
8618 }
9f40dead 8619 tw32(MAC_MODE, mac_mode);
9f40dead
MC
8620 }
8621 else
8622 return -EINVAL;
c76949a6
MC
8623
8624 err = -EIO;
8625
c76949a6 8626 tx_len = 1514;
a20e9c62 8627 skb = netdev_alloc_skb(tp->dev, tx_len);
a50bb7b9
JJ
8628 if (!skb)
8629 return -ENOMEM;
8630
c76949a6
MC
8631 tx_data = skb_put(skb, tx_len);
8632 memcpy(tx_data, tp->dev->dev_addr, 6);
8633 memset(tx_data + 6, 0x0, 8);
8634
8635 tw32(MAC_RX_MTU_SIZE, tx_len + 4);
8636
8637 for (i = 14; i < tx_len; i++)
8638 tx_data[i] = (u8) (i & 0xff);
8639
8640 map = pci_map_single(tp->pdev, skb->data, tx_len, PCI_DMA_TODEVICE);
8641
8642 tw32_f(HOSTCC_MODE, tp->coalesce_mode | HOSTCC_MODE_ENABLE |
8643 HOSTCC_MODE_NOW);
8644
8645 udelay(10);
8646
8647 rx_start_idx = tp->hw_status->idx[0].rx_producer;
8648
c76949a6
MC
8649 num_pkts = 0;
8650
9f40dead 8651 tg3_set_txd(tp, tp->tx_prod, map, tx_len, 0, 1);
c76949a6 8652
9f40dead 8653 tp->tx_prod++;
c76949a6
MC
8654 num_pkts++;
8655
9f40dead
MC
8656 tw32_tx_mbox(MAILBOX_SNDHOST_PROD_IDX_0 + TG3_64BIT_REG_LOW,
8657 tp->tx_prod);
09ee929c 8658 tr32_mailbox(MAILBOX_SNDHOST_PROD_IDX_0 + TG3_64BIT_REG_LOW);
c76949a6
MC
8659
8660 udelay(10);
8661
8662 for (i = 0; i < 10; i++) {
8663 tw32_f(HOSTCC_MODE, tp->coalesce_mode | HOSTCC_MODE_ENABLE |
8664 HOSTCC_MODE_NOW);
8665
8666 udelay(10);
8667
8668 tx_idx = tp->hw_status->idx[0].tx_consumer;
8669 rx_idx = tp->hw_status->idx[0].rx_producer;
9f40dead 8670 if ((tx_idx == tp->tx_prod) &&
c76949a6
MC
8671 (rx_idx == (rx_start_idx + num_pkts)))
8672 break;
8673 }
8674
8675 pci_unmap_single(tp->pdev, map, tx_len, PCI_DMA_TODEVICE);
8676 dev_kfree_skb(skb);
8677
9f40dead 8678 if (tx_idx != tp->tx_prod)
c76949a6
MC
8679 goto out;
8680
8681 if (rx_idx != rx_start_idx + num_pkts)
8682 goto out;
8683
8684 desc = &tp->rx_rcb[rx_start_idx];
8685 desc_idx = desc->opaque & RXD_OPAQUE_INDEX_MASK;
8686 opaque_key = desc->opaque & RXD_OPAQUE_RING_MASK;
8687 if (opaque_key != RXD_OPAQUE_RING_STD)
8688 goto out;
8689
8690 if ((desc->err_vlan & RXD_ERR_MASK) != 0 &&
8691 (desc->err_vlan != RXD_ERR_ODD_NIBBLE_RCVD_MII))
8692 goto out;
8693
8694 rx_len = ((desc->idx_len & RXD_LEN_MASK) >> RXD_LEN_SHIFT) - 4;
8695 if (rx_len != tx_len)
8696 goto out;
8697
8698 rx_skb = tp->rx_std_buffers[desc_idx].skb;
8699
8700 map = pci_unmap_addr(&tp->rx_std_buffers[desc_idx], mapping);
8701 pci_dma_sync_single_for_cpu(tp->pdev, map, rx_len, PCI_DMA_FROMDEVICE);
8702
8703 for (i = 14; i < tx_len; i++) {
8704 if (*(rx_skb->data + i) != (u8) (i & 0xff))
8705 goto out;
8706 }
8707 err = 0;
6aa20a22 8708
c76949a6
MC
8709 /* tg3_free_rings will unmap and free the rx_skb */
8710out:
8711 return err;
8712}
8713
9f40dead
MC
8714#define TG3_MAC_LOOPBACK_FAILED 1
8715#define TG3_PHY_LOOPBACK_FAILED 2
8716#define TG3_LOOPBACK_FAILED (TG3_MAC_LOOPBACK_FAILED | \
8717 TG3_PHY_LOOPBACK_FAILED)
8718
8719static int tg3_test_loopback(struct tg3 *tp)
8720{
8721 int err = 0;
8722
8723 if (!netif_running(tp->dev))
8724 return TG3_LOOPBACK_FAILED;
8725
b9ec6c1b
MC
8726 err = tg3_reset_hw(tp, 1);
8727 if (err)
8728 return TG3_LOOPBACK_FAILED;
9f40dead
MC
8729
8730 if (tg3_run_loopback(tp, TG3_MAC_LOOPBACK))
8731 err |= TG3_MAC_LOOPBACK_FAILED;
8732 if (!(tp->tg3_flags2 & TG3_FLG2_PHY_SERDES)) {
8733 if (tg3_run_loopback(tp, TG3_PHY_LOOPBACK))
8734 err |= TG3_PHY_LOOPBACK_FAILED;
8735 }
8736
8737 return err;
8738}
8739
4cafd3f5
MC
8740static void tg3_self_test(struct net_device *dev, struct ethtool_test *etest,
8741 u64 *data)
8742{
566f86ad
MC
8743 struct tg3 *tp = netdev_priv(dev);
8744
bc1c7567
MC
8745 if (tp->link_config.phy_is_low_power)
8746 tg3_set_power_state(tp, PCI_D0);
8747
566f86ad
MC
8748 memset(data, 0, sizeof(u64) * TG3_NUM_TEST);
8749
8750 if (tg3_test_nvram(tp) != 0) {
8751 etest->flags |= ETH_TEST_FL_FAILED;
8752 data[0] = 1;
8753 }
ca43007a
MC
8754 if (tg3_test_link(tp) != 0) {
8755 etest->flags |= ETH_TEST_FL_FAILED;
8756 data[1] = 1;
8757 }
a71116d1 8758 if (etest->flags & ETH_TEST_FL_OFFLINE) {
ec41c7df 8759 int err, irq_sync = 0;
bbe832c0
MC
8760
8761 if (netif_running(dev)) {
a71116d1 8762 tg3_netif_stop(tp);
bbe832c0
MC
8763 irq_sync = 1;
8764 }
a71116d1 8765
bbe832c0 8766 tg3_full_lock(tp, irq_sync);
a71116d1
MC
8767
8768 tg3_halt(tp, RESET_KIND_SUSPEND, 1);
ec41c7df 8769 err = tg3_nvram_lock(tp);
a71116d1
MC
8770 tg3_halt_cpu(tp, RX_CPU_BASE);
8771 if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS))
8772 tg3_halt_cpu(tp, TX_CPU_BASE);
ec41c7df
MC
8773 if (!err)
8774 tg3_nvram_unlock(tp);
a71116d1 8775
d9ab5ad1
MC
8776 if (tp->tg3_flags2 & TG3_FLG2_MII_SERDES)
8777 tg3_phy_reset(tp);
8778
a71116d1
MC
8779 if (tg3_test_registers(tp) != 0) {
8780 etest->flags |= ETH_TEST_FL_FAILED;
8781 data[2] = 1;
8782 }
7942e1db
MC
8783 if (tg3_test_memory(tp) != 0) {
8784 etest->flags |= ETH_TEST_FL_FAILED;
8785 data[3] = 1;
8786 }
9f40dead 8787 if ((data[4] = tg3_test_loopback(tp)) != 0)
c76949a6 8788 etest->flags |= ETH_TEST_FL_FAILED;
a71116d1 8789
f47c11ee
DM
8790 tg3_full_unlock(tp);
8791
d4bc3927
MC
8792 if (tg3_test_interrupt(tp) != 0) {
8793 etest->flags |= ETH_TEST_FL_FAILED;
8794 data[5] = 1;
8795 }
f47c11ee
DM
8796
8797 tg3_full_lock(tp, 0);
d4bc3927 8798
a71116d1
MC
8799 tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
8800 if (netif_running(dev)) {
8801 tp->tg3_flags |= TG3_FLAG_INIT_COMPLETE;
b9ec6c1b
MC
8802 if (!tg3_restart_hw(tp, 1))
8803 tg3_netif_start(tp);
a71116d1 8804 }
f47c11ee
DM
8805
8806 tg3_full_unlock(tp);
a71116d1 8807 }
bc1c7567
MC
8808 if (tp->link_config.phy_is_low_power)
8809 tg3_set_power_state(tp, PCI_D3hot);
8810
4cafd3f5
MC
8811}
8812
1da177e4
LT
8813static int tg3_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
8814{
8815 struct mii_ioctl_data *data = if_mii(ifr);
8816 struct tg3 *tp = netdev_priv(dev);
8817 int err;
8818
8819 switch(cmd) {
8820 case SIOCGMIIPHY:
8821 data->phy_id = PHY_ADDR;
8822
8823 /* fallthru */
8824 case SIOCGMIIREG: {
8825 u32 mii_regval;
8826
8827 if (tp->tg3_flags2 & TG3_FLG2_PHY_SERDES)
8828 break; /* We have no PHY */
8829
bc1c7567
MC
8830 if (tp->link_config.phy_is_low_power)
8831 return -EAGAIN;
8832
f47c11ee 8833 spin_lock_bh(&tp->lock);
1da177e4 8834 err = tg3_readphy(tp, data->reg_num & 0x1f, &mii_regval);
f47c11ee 8835 spin_unlock_bh(&tp->lock);
1da177e4
LT
8836
8837 data->val_out = mii_regval;
8838
8839 return err;
8840 }
8841
8842 case SIOCSMIIREG:
8843 if (tp->tg3_flags2 & TG3_FLG2_PHY_SERDES)
8844 break; /* We have no PHY */
8845
8846 if (!capable(CAP_NET_ADMIN))
8847 return -EPERM;
8848
bc1c7567
MC
8849 if (tp->link_config.phy_is_low_power)
8850 return -EAGAIN;
8851
f47c11ee 8852 spin_lock_bh(&tp->lock);
1da177e4 8853 err = tg3_writephy(tp, data->reg_num & 0x1f, data->val_in);
f47c11ee 8854 spin_unlock_bh(&tp->lock);
1da177e4
LT
8855
8856 return err;
8857
8858 default:
8859 /* do nothing */
8860 break;
8861 }
8862 return -EOPNOTSUPP;
8863}
8864
8865#if TG3_VLAN_TAG_USED
8866static void tg3_vlan_rx_register(struct net_device *dev, struct vlan_group *grp)
8867{
8868 struct tg3 *tp = netdev_priv(dev);
8869
29315e87
MC
8870 if (netif_running(dev))
8871 tg3_netif_stop(tp);
8872
f47c11ee 8873 tg3_full_lock(tp, 0);
1da177e4
LT
8874
8875 tp->vlgrp = grp;
8876
8877 /* Update RX_MODE_KEEP_VLAN_TAG bit in RX_MODE register. */
8878 __tg3_set_rx_mode(dev);
8879
f47c11ee 8880 tg3_full_unlock(tp);
29315e87
MC
8881
8882 if (netif_running(dev))
8883 tg3_netif_start(tp);
1da177e4
LT
8884}
8885
8886static void tg3_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
8887{
8888 struct tg3 *tp = netdev_priv(dev);
8889
29315e87
MC
8890 if (netif_running(dev))
8891 tg3_netif_stop(tp);
8892
f47c11ee 8893 tg3_full_lock(tp, 0);
1da177e4
LT
8894 if (tp->vlgrp)
8895 tp->vlgrp->vlan_devices[vid] = NULL;
f47c11ee 8896 tg3_full_unlock(tp);
29315e87
MC
8897
8898 if (netif_running(dev))
8899 tg3_netif_start(tp);
1da177e4
LT
8900}
8901#endif
8902
15f9850d
DM
8903static int tg3_get_coalesce(struct net_device *dev, struct ethtool_coalesce *ec)
8904{
8905 struct tg3 *tp = netdev_priv(dev);
8906
8907 memcpy(ec, &tp->coal, sizeof(*ec));
8908 return 0;
8909}
8910
d244c892
MC
8911static int tg3_set_coalesce(struct net_device *dev, struct ethtool_coalesce *ec)
8912{
8913 struct tg3 *tp = netdev_priv(dev);
8914 u32 max_rxcoal_tick_int = 0, max_txcoal_tick_int = 0;
8915 u32 max_stat_coal_ticks = 0, min_stat_coal_ticks = 0;
8916
8917 if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS)) {
8918 max_rxcoal_tick_int = MAX_RXCOAL_TICK_INT;
8919 max_txcoal_tick_int = MAX_TXCOAL_TICK_INT;
8920 max_stat_coal_ticks = MAX_STAT_COAL_TICKS;
8921 min_stat_coal_ticks = MIN_STAT_COAL_TICKS;
8922 }
8923
8924 if ((ec->rx_coalesce_usecs > MAX_RXCOL_TICKS) ||
8925 (ec->tx_coalesce_usecs > MAX_TXCOL_TICKS) ||
8926 (ec->rx_max_coalesced_frames > MAX_RXMAX_FRAMES) ||
8927 (ec->tx_max_coalesced_frames > MAX_TXMAX_FRAMES) ||
8928 (ec->rx_coalesce_usecs_irq > max_rxcoal_tick_int) ||
8929 (ec->tx_coalesce_usecs_irq > max_txcoal_tick_int) ||
8930 (ec->rx_max_coalesced_frames_irq > MAX_RXCOAL_MAXF_INT) ||
8931 (ec->tx_max_coalesced_frames_irq > MAX_TXCOAL_MAXF_INT) ||
8932 (ec->stats_block_coalesce_usecs > max_stat_coal_ticks) ||
8933 (ec->stats_block_coalesce_usecs < min_stat_coal_ticks))
8934 return -EINVAL;
8935
8936 /* No rx interrupts will be generated if both are zero */
8937 if ((ec->rx_coalesce_usecs == 0) &&
8938 (ec->rx_max_coalesced_frames == 0))
8939 return -EINVAL;
8940
8941 /* No tx interrupts will be generated if both are zero */
8942 if ((ec->tx_coalesce_usecs == 0) &&
8943 (ec->tx_max_coalesced_frames == 0))
8944 return -EINVAL;
8945
8946 /* Only copy relevant parameters, ignore all others. */
8947 tp->coal.rx_coalesce_usecs = ec->rx_coalesce_usecs;
8948 tp->coal.tx_coalesce_usecs = ec->tx_coalesce_usecs;
8949 tp->coal.rx_max_coalesced_frames = ec->rx_max_coalesced_frames;
8950 tp->coal.tx_max_coalesced_frames = ec->tx_max_coalesced_frames;
8951 tp->coal.rx_coalesce_usecs_irq = ec->rx_coalesce_usecs_irq;
8952 tp->coal.tx_coalesce_usecs_irq = ec->tx_coalesce_usecs_irq;
8953 tp->coal.rx_max_coalesced_frames_irq = ec->rx_max_coalesced_frames_irq;
8954 tp->coal.tx_max_coalesced_frames_irq = ec->tx_max_coalesced_frames_irq;
8955 tp->coal.stats_block_coalesce_usecs = ec->stats_block_coalesce_usecs;
8956
8957 if (netif_running(dev)) {
8958 tg3_full_lock(tp, 0);
8959 __tg3_set_coalesce(tp, &tp->coal);
8960 tg3_full_unlock(tp);
8961 }
8962 return 0;
8963}
8964
1da177e4
LT
8965static struct ethtool_ops tg3_ethtool_ops = {
8966 .get_settings = tg3_get_settings,
8967 .set_settings = tg3_set_settings,
8968 .get_drvinfo = tg3_get_drvinfo,
8969 .get_regs_len = tg3_get_regs_len,
8970 .get_regs = tg3_get_regs,
8971 .get_wol = tg3_get_wol,
8972 .set_wol = tg3_set_wol,
8973 .get_msglevel = tg3_get_msglevel,
8974 .set_msglevel = tg3_set_msglevel,
8975 .nway_reset = tg3_nway_reset,
8976 .get_link = ethtool_op_get_link,
8977 .get_eeprom_len = tg3_get_eeprom_len,
8978 .get_eeprom = tg3_get_eeprom,
8979 .set_eeprom = tg3_set_eeprom,
8980 .get_ringparam = tg3_get_ringparam,
8981 .set_ringparam = tg3_set_ringparam,
8982 .get_pauseparam = tg3_get_pauseparam,
8983 .set_pauseparam = tg3_set_pauseparam,
8984 .get_rx_csum = tg3_get_rx_csum,
8985 .set_rx_csum = tg3_set_rx_csum,
8986 .get_tx_csum = ethtool_op_get_tx_csum,
8987 .set_tx_csum = tg3_set_tx_csum,
8988 .get_sg = ethtool_op_get_sg,
8989 .set_sg = ethtool_op_set_sg,
8990#if TG3_TSO_SUPPORT != 0
8991 .get_tso = ethtool_op_get_tso,
8992 .set_tso = tg3_set_tso,
8993#endif
4cafd3f5
MC
8994 .self_test_count = tg3_get_test_count,
8995 .self_test = tg3_self_test,
1da177e4 8996 .get_strings = tg3_get_strings,
4009a93d 8997 .phys_id = tg3_phys_id,
1da177e4
LT
8998 .get_stats_count = tg3_get_stats_count,
8999 .get_ethtool_stats = tg3_get_ethtool_stats,
15f9850d 9000 .get_coalesce = tg3_get_coalesce,
d244c892 9001 .set_coalesce = tg3_set_coalesce,
2ff43697 9002 .get_perm_addr = ethtool_op_get_perm_addr,
1da177e4
LT
9003};
9004
9005static void __devinit tg3_get_eeprom_size(struct tg3 *tp)
9006{
1b27777a 9007 u32 cursize, val, magic;
1da177e4
LT
9008
9009 tp->nvram_size = EEPROM_CHIP_SIZE;
9010
1820180b 9011 if (tg3_nvram_read_swab(tp, 0, &magic) != 0)
1da177e4
LT
9012 return;
9013
1b27777a 9014 if ((magic != TG3_EEPROM_MAGIC) && ((magic & 0xff000000) != 0xa5000000))
1da177e4
LT
9015 return;
9016
9017 /*
9018 * Size the chip by reading offsets at increasing powers of two.
9019 * When we encounter our validation signature, we know the addressing
9020 * has wrapped around, and thus have our chip size.
9021 */
1b27777a 9022 cursize = 0x10;
1da177e4
LT
9023
9024 while (cursize < tp->nvram_size) {
1820180b 9025 if (tg3_nvram_read_swab(tp, cursize, &val) != 0)
1da177e4
LT
9026 return;
9027
1820180b 9028 if (val == magic)
1da177e4
LT
9029 break;
9030
9031 cursize <<= 1;
9032 }
9033
9034 tp->nvram_size = cursize;
9035}
6aa20a22 9036
1da177e4
LT
9037static void __devinit tg3_get_nvram_size(struct tg3 *tp)
9038{
9039 u32 val;
9040
1820180b 9041 if (tg3_nvram_read_swab(tp, 0, &val) != 0)
1b27777a
MC
9042 return;
9043
9044 /* Selfboot format */
1820180b 9045 if (val != TG3_EEPROM_MAGIC) {
1b27777a
MC
9046 tg3_get_eeprom_size(tp);
9047 return;
9048 }
9049
1da177e4
LT
9050 if (tg3_nvram_read(tp, 0xf0, &val) == 0) {
9051 if (val != 0) {
9052 tp->nvram_size = (val >> 16) * 1024;
9053 return;
9054 }
9055 }
9056 tp->nvram_size = 0x20000;
9057}
9058
9059static void __devinit tg3_get_nvram_info(struct tg3 *tp)
9060{
9061 u32 nvcfg1;
9062
9063 nvcfg1 = tr32(NVRAM_CFG1);
9064 if (nvcfg1 & NVRAM_CFG1_FLASHIF_ENAB) {
9065 tp->tg3_flags2 |= TG3_FLG2_FLASH;
9066 }
9067 else {
9068 nvcfg1 &= ~NVRAM_CFG1_COMPAT_BYPASS;
9069 tw32(NVRAM_CFG1, nvcfg1);
9070 }
9071
4c987487 9072 if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750) ||
a4e2b347 9073 (tp->tg3_flags2 & TG3_FLG2_5780_CLASS)) {
1da177e4
LT
9074 switch (nvcfg1 & NVRAM_CFG1_VENDOR_MASK) {
9075 case FLASH_VENDOR_ATMEL_FLASH_BUFFERED:
9076 tp->nvram_jedecnum = JEDEC_ATMEL;
9077 tp->nvram_pagesize = ATMEL_AT45DB0X1B_PAGE_SIZE;
9078 tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED;
9079 break;
9080 case FLASH_VENDOR_ATMEL_FLASH_UNBUFFERED:
9081 tp->nvram_jedecnum = JEDEC_ATMEL;
9082 tp->nvram_pagesize = ATMEL_AT25F512_PAGE_SIZE;
9083 break;
9084 case FLASH_VENDOR_ATMEL_EEPROM:
9085 tp->nvram_jedecnum = JEDEC_ATMEL;
9086 tp->nvram_pagesize = ATMEL_AT24C512_CHIP_SIZE;
9087 tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED;
9088 break;
9089 case FLASH_VENDOR_ST:
9090 tp->nvram_jedecnum = JEDEC_ST;
9091 tp->nvram_pagesize = ST_M45PEX0_PAGE_SIZE;
9092 tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED;
9093 break;
9094 case FLASH_VENDOR_SAIFUN:
9095 tp->nvram_jedecnum = JEDEC_SAIFUN;
9096 tp->nvram_pagesize = SAIFUN_SA25F0XX_PAGE_SIZE;
9097 break;
9098 case FLASH_VENDOR_SST_SMALL:
9099 case FLASH_VENDOR_SST_LARGE:
9100 tp->nvram_jedecnum = JEDEC_SST;
9101 tp->nvram_pagesize = SST_25VF0X0_PAGE_SIZE;
9102 break;
9103 }
9104 }
9105 else {
9106 tp->nvram_jedecnum = JEDEC_ATMEL;
9107 tp->nvram_pagesize = ATMEL_AT45DB0X1B_PAGE_SIZE;
9108 tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED;
9109 }
9110}
9111
361b4ac2
MC
9112static void __devinit tg3_get_5752_nvram_info(struct tg3 *tp)
9113{
9114 u32 nvcfg1;
9115
9116 nvcfg1 = tr32(NVRAM_CFG1);
9117
e6af301b
MC
9118 /* NVRAM protection for TPM */
9119 if (nvcfg1 & (1 << 27))
9120 tp->tg3_flags2 |= TG3_FLG2_PROTECTED_NVRAM;
9121
361b4ac2
MC
9122 switch (nvcfg1 & NVRAM_CFG1_5752VENDOR_MASK) {
9123 case FLASH_5752VENDOR_ATMEL_EEPROM_64KHZ:
9124 case FLASH_5752VENDOR_ATMEL_EEPROM_376KHZ:
9125 tp->nvram_jedecnum = JEDEC_ATMEL;
9126 tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED;
9127 break;
9128 case FLASH_5752VENDOR_ATMEL_FLASH_BUFFERED:
9129 tp->nvram_jedecnum = JEDEC_ATMEL;
9130 tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED;
9131 tp->tg3_flags2 |= TG3_FLG2_FLASH;
9132 break;
9133 case FLASH_5752VENDOR_ST_M45PE10:
9134 case FLASH_5752VENDOR_ST_M45PE20:
9135 case FLASH_5752VENDOR_ST_M45PE40:
9136 tp->nvram_jedecnum = JEDEC_ST;
9137 tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED;
9138 tp->tg3_flags2 |= TG3_FLG2_FLASH;
9139 break;
9140 }
9141
9142 if (tp->tg3_flags2 & TG3_FLG2_FLASH) {
9143 switch (nvcfg1 & NVRAM_CFG1_5752PAGE_SIZE_MASK) {
9144 case FLASH_5752PAGE_SIZE_256:
9145 tp->nvram_pagesize = 256;
9146 break;
9147 case FLASH_5752PAGE_SIZE_512:
9148 tp->nvram_pagesize = 512;
9149 break;
9150 case FLASH_5752PAGE_SIZE_1K:
9151 tp->nvram_pagesize = 1024;
9152 break;
9153 case FLASH_5752PAGE_SIZE_2K:
9154 tp->nvram_pagesize = 2048;
9155 break;
9156 case FLASH_5752PAGE_SIZE_4K:
9157 tp->nvram_pagesize = 4096;
9158 break;
9159 case FLASH_5752PAGE_SIZE_264:
9160 tp->nvram_pagesize = 264;
9161 break;
9162 }
9163 }
9164 else {
9165 /* For eeprom, set pagesize to maximum eeprom size */
9166 tp->nvram_pagesize = ATMEL_AT24C512_CHIP_SIZE;
9167
9168 nvcfg1 &= ~NVRAM_CFG1_COMPAT_BYPASS;
9169 tw32(NVRAM_CFG1, nvcfg1);
9170 }
9171}
9172
d3c7b886
MC
9173static void __devinit tg3_get_5755_nvram_info(struct tg3 *tp)
9174{
9175 u32 nvcfg1;
9176
9177 nvcfg1 = tr32(NVRAM_CFG1);
9178
9179 /* NVRAM protection for TPM */
9180 if (nvcfg1 & (1 << 27))
9181 tp->tg3_flags2 |= TG3_FLG2_PROTECTED_NVRAM;
9182
9183 switch (nvcfg1 & NVRAM_CFG1_5752VENDOR_MASK) {
9184 case FLASH_5755VENDOR_ATMEL_EEPROM_64KHZ:
9185 case FLASH_5755VENDOR_ATMEL_EEPROM_376KHZ:
9186 tp->nvram_jedecnum = JEDEC_ATMEL;
9187 tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED;
9188 tp->nvram_pagesize = ATMEL_AT24C512_CHIP_SIZE;
9189
9190 nvcfg1 &= ~NVRAM_CFG1_COMPAT_BYPASS;
9191 tw32(NVRAM_CFG1, nvcfg1);
9192 break;
9193 case FLASH_5752VENDOR_ATMEL_FLASH_BUFFERED:
9194 case FLASH_5755VENDOR_ATMEL_FLASH_1:
9195 case FLASH_5755VENDOR_ATMEL_FLASH_2:
9196 case FLASH_5755VENDOR_ATMEL_FLASH_3:
9197 case FLASH_5755VENDOR_ATMEL_FLASH_4:
9198 tp->nvram_jedecnum = JEDEC_ATMEL;
9199 tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED;
9200 tp->tg3_flags2 |= TG3_FLG2_FLASH;
9201 tp->nvram_pagesize = 264;
9202 break;
9203 case FLASH_5752VENDOR_ST_M45PE10:
9204 case FLASH_5752VENDOR_ST_M45PE20:
9205 case FLASH_5752VENDOR_ST_M45PE40:
9206 tp->nvram_jedecnum = JEDEC_ST;
9207 tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED;
9208 tp->tg3_flags2 |= TG3_FLG2_FLASH;
9209 tp->nvram_pagesize = 256;
9210 break;
9211 }
9212}
9213
1b27777a
MC
9214static void __devinit tg3_get_5787_nvram_info(struct tg3 *tp)
9215{
9216 u32 nvcfg1;
9217
9218 nvcfg1 = tr32(NVRAM_CFG1);
9219
9220 switch (nvcfg1 & NVRAM_CFG1_5752VENDOR_MASK) {
9221 case FLASH_5787VENDOR_ATMEL_EEPROM_64KHZ:
9222 case FLASH_5787VENDOR_ATMEL_EEPROM_376KHZ:
9223 case FLASH_5787VENDOR_MICRO_EEPROM_64KHZ:
9224 case FLASH_5787VENDOR_MICRO_EEPROM_376KHZ:
9225 tp->nvram_jedecnum = JEDEC_ATMEL;
9226 tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED;
9227 tp->nvram_pagesize = ATMEL_AT24C512_CHIP_SIZE;
9228
9229 nvcfg1 &= ~NVRAM_CFG1_COMPAT_BYPASS;
9230 tw32(NVRAM_CFG1, nvcfg1);
9231 break;
9232 case FLASH_5752VENDOR_ATMEL_FLASH_BUFFERED:
9233 case FLASH_5755VENDOR_ATMEL_FLASH_1:
9234 case FLASH_5755VENDOR_ATMEL_FLASH_2:
9235 case FLASH_5755VENDOR_ATMEL_FLASH_3:
9236 tp->nvram_jedecnum = JEDEC_ATMEL;
9237 tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED;
9238 tp->tg3_flags2 |= TG3_FLG2_FLASH;
9239 tp->nvram_pagesize = 264;
9240 break;
9241 case FLASH_5752VENDOR_ST_M45PE10:
9242 case FLASH_5752VENDOR_ST_M45PE20:
9243 case FLASH_5752VENDOR_ST_M45PE40:
9244 tp->nvram_jedecnum = JEDEC_ST;
9245 tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED;
9246 tp->tg3_flags2 |= TG3_FLG2_FLASH;
9247 tp->nvram_pagesize = 256;
9248 break;
9249 }
9250}
9251
1da177e4
LT
9252/* Chips other than 5700/5701 use the NVRAM for fetching info. */
9253static void __devinit tg3_nvram_init(struct tg3 *tp)
9254{
9255 int j;
9256
1da177e4
LT
9257 tw32_f(GRC_EEPROM_ADDR,
9258 (EEPROM_ADDR_FSM_RESET |
9259 (EEPROM_DEFAULT_CLOCK_PERIOD <<
9260 EEPROM_ADDR_CLKPERD_SHIFT)));
9261
9262 /* XXX schedule_timeout() ... */
9263 for (j = 0; j < 100; j++)
9264 udelay(10);
9265
9266 /* Enable seeprom accesses. */
9267 tw32_f(GRC_LOCAL_CTRL,
9268 tr32(GRC_LOCAL_CTRL) | GRC_LCLCTRL_AUTO_SEEPROM);
9269 udelay(100);
9270
9271 if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5700 &&
9272 GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5701) {
9273 tp->tg3_flags |= TG3_FLAG_NVRAM;
9274
ec41c7df
MC
9275 if (tg3_nvram_lock(tp)) {
9276 printk(KERN_WARNING PFX "%s: Cannot get nvarm lock, "
9277 "tg3_nvram_init failed.\n", tp->dev->name);
9278 return;
9279 }
e6af301b 9280 tg3_enable_nvram_access(tp);
1da177e4 9281
361b4ac2
MC
9282 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5752)
9283 tg3_get_5752_nvram_info(tp);
d3c7b886
MC
9284 else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755)
9285 tg3_get_5755_nvram_info(tp);
1b27777a
MC
9286 else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787)
9287 tg3_get_5787_nvram_info(tp);
361b4ac2
MC
9288 else
9289 tg3_get_nvram_info(tp);
9290
1da177e4
LT
9291 tg3_get_nvram_size(tp);
9292
e6af301b 9293 tg3_disable_nvram_access(tp);
381291b7 9294 tg3_nvram_unlock(tp);
1da177e4
LT
9295
9296 } else {
9297 tp->tg3_flags &= ~(TG3_FLAG_NVRAM | TG3_FLAG_NVRAM_BUFFERED);
9298
9299 tg3_get_eeprom_size(tp);
9300 }
9301}
9302
9303static int tg3_nvram_read_using_eeprom(struct tg3 *tp,
9304 u32 offset, u32 *val)
9305{
9306 u32 tmp;
9307 int i;
9308
9309 if (offset > EEPROM_ADDR_ADDR_MASK ||
9310 (offset % 4) != 0)
9311 return -EINVAL;
9312
9313 tmp = tr32(GRC_EEPROM_ADDR) & ~(EEPROM_ADDR_ADDR_MASK |
9314 EEPROM_ADDR_DEVID_MASK |
9315 EEPROM_ADDR_READ);
9316 tw32(GRC_EEPROM_ADDR,
9317 tmp |
9318 (0 << EEPROM_ADDR_DEVID_SHIFT) |
9319 ((offset << EEPROM_ADDR_ADDR_SHIFT) &
9320 EEPROM_ADDR_ADDR_MASK) |
9321 EEPROM_ADDR_READ | EEPROM_ADDR_START);
9322
9323 for (i = 0; i < 10000; i++) {
9324 tmp = tr32(GRC_EEPROM_ADDR);
9325
9326 if (tmp & EEPROM_ADDR_COMPLETE)
9327 break;
9328 udelay(100);
9329 }
9330 if (!(tmp & EEPROM_ADDR_COMPLETE))
9331 return -EBUSY;
9332
9333 *val = tr32(GRC_EEPROM_DATA);
9334 return 0;
9335}
9336
9337#define NVRAM_CMD_TIMEOUT 10000
9338
9339static int tg3_nvram_exec_cmd(struct tg3 *tp, u32 nvram_cmd)
9340{
9341 int i;
9342
9343 tw32(NVRAM_CMD, nvram_cmd);
9344 for (i = 0; i < NVRAM_CMD_TIMEOUT; i++) {
9345 udelay(10);
9346 if (tr32(NVRAM_CMD) & NVRAM_CMD_DONE) {
9347 udelay(10);
9348 break;
9349 }
9350 }
9351 if (i == NVRAM_CMD_TIMEOUT) {
9352 return -EBUSY;
9353 }
9354 return 0;
9355}
9356
1820180b
MC
9357static u32 tg3_nvram_phys_addr(struct tg3 *tp, u32 addr)
9358{
9359 if ((tp->tg3_flags & TG3_FLAG_NVRAM) &&
9360 (tp->tg3_flags & TG3_FLAG_NVRAM_BUFFERED) &&
9361 (tp->tg3_flags2 & TG3_FLG2_FLASH) &&
9362 (tp->nvram_jedecnum == JEDEC_ATMEL))
9363
9364 addr = ((addr / tp->nvram_pagesize) <<
9365 ATMEL_AT45DB0X1B_PAGE_POS) +
9366 (addr % tp->nvram_pagesize);
9367
9368 return addr;
9369}
9370
c4e6575c
MC
9371static u32 tg3_nvram_logical_addr(struct tg3 *tp, u32 addr)
9372{
9373 if ((tp->tg3_flags & TG3_FLAG_NVRAM) &&
9374 (tp->tg3_flags & TG3_FLAG_NVRAM_BUFFERED) &&
9375 (tp->tg3_flags2 & TG3_FLG2_FLASH) &&
9376 (tp->nvram_jedecnum == JEDEC_ATMEL))
9377
9378 addr = ((addr >> ATMEL_AT45DB0X1B_PAGE_POS) *
9379 tp->nvram_pagesize) +
9380 (addr & ((1 << ATMEL_AT45DB0X1B_PAGE_POS) - 1));
9381
9382 return addr;
9383}
9384
1da177e4
LT
9385static int tg3_nvram_read(struct tg3 *tp, u32 offset, u32 *val)
9386{
9387 int ret;
9388
1da177e4
LT
9389 if (!(tp->tg3_flags & TG3_FLAG_NVRAM))
9390 return tg3_nvram_read_using_eeprom(tp, offset, val);
9391
1820180b 9392 offset = tg3_nvram_phys_addr(tp, offset);
1da177e4
LT
9393
9394 if (offset > NVRAM_ADDR_MSK)
9395 return -EINVAL;
9396
ec41c7df
MC
9397 ret = tg3_nvram_lock(tp);
9398 if (ret)
9399 return ret;
1da177e4 9400
e6af301b 9401 tg3_enable_nvram_access(tp);
1da177e4
LT
9402
9403 tw32(NVRAM_ADDR, offset);
9404 ret = tg3_nvram_exec_cmd(tp, NVRAM_CMD_RD | NVRAM_CMD_GO |
9405 NVRAM_CMD_FIRST | NVRAM_CMD_LAST | NVRAM_CMD_DONE);
9406
9407 if (ret == 0)
9408 *val = swab32(tr32(NVRAM_RDDATA));
9409
e6af301b 9410 tg3_disable_nvram_access(tp);
1da177e4 9411
381291b7
MC
9412 tg3_nvram_unlock(tp);
9413
1da177e4
LT
9414 return ret;
9415}
9416
1820180b
MC
9417static int tg3_nvram_read_swab(struct tg3 *tp, u32 offset, u32 *val)
9418{
9419 int err;
9420 u32 tmp;
9421
9422 err = tg3_nvram_read(tp, offset, &tmp);
9423 *val = swab32(tmp);
9424 return err;
9425}
9426
1da177e4
LT
9427static int tg3_nvram_write_block_using_eeprom(struct tg3 *tp,
9428 u32 offset, u32 len, u8 *buf)
9429{
9430 int i, j, rc = 0;
9431 u32 val;
9432
9433 for (i = 0; i < len; i += 4) {
9434 u32 addr, data;
9435
9436 addr = offset + i;
9437
9438 memcpy(&data, buf + i, 4);
9439
9440 tw32(GRC_EEPROM_DATA, cpu_to_le32(data));
9441
9442 val = tr32(GRC_EEPROM_ADDR);
9443 tw32(GRC_EEPROM_ADDR, val | EEPROM_ADDR_COMPLETE);
9444
9445 val &= ~(EEPROM_ADDR_ADDR_MASK | EEPROM_ADDR_DEVID_MASK |
9446 EEPROM_ADDR_READ);
9447 tw32(GRC_EEPROM_ADDR, val |
9448 (0 << EEPROM_ADDR_DEVID_SHIFT) |
9449 (addr & EEPROM_ADDR_ADDR_MASK) |
9450 EEPROM_ADDR_START |
9451 EEPROM_ADDR_WRITE);
6aa20a22 9452
1da177e4
LT
9453 for (j = 0; j < 10000; j++) {
9454 val = tr32(GRC_EEPROM_ADDR);
9455
9456 if (val & EEPROM_ADDR_COMPLETE)
9457 break;
9458 udelay(100);
9459 }
9460 if (!(val & EEPROM_ADDR_COMPLETE)) {
9461 rc = -EBUSY;
9462 break;
9463 }
9464 }
9465
9466 return rc;
9467}
9468
9469/* offset and length are dword aligned */
9470static int tg3_nvram_write_block_unbuffered(struct tg3 *tp, u32 offset, u32 len,
9471 u8 *buf)
9472{
9473 int ret = 0;
9474 u32 pagesize = tp->nvram_pagesize;
9475 u32 pagemask = pagesize - 1;
9476 u32 nvram_cmd;
9477 u8 *tmp;
9478
9479 tmp = kmalloc(pagesize, GFP_KERNEL);
9480 if (tmp == NULL)
9481 return -ENOMEM;
9482
9483 while (len) {
9484 int j;
e6af301b 9485 u32 phy_addr, page_off, size;
1da177e4
LT
9486
9487 phy_addr = offset & ~pagemask;
6aa20a22 9488
1da177e4
LT
9489 for (j = 0; j < pagesize; j += 4) {
9490 if ((ret = tg3_nvram_read(tp, phy_addr + j,
9491 (u32 *) (tmp + j))))
9492 break;
9493 }
9494 if (ret)
9495 break;
9496
9497 page_off = offset & pagemask;
9498 size = pagesize;
9499 if (len < size)
9500 size = len;
9501
9502 len -= size;
9503
9504 memcpy(tmp + page_off, buf, size);
9505
9506 offset = offset + (pagesize - page_off);
9507
e6af301b 9508 tg3_enable_nvram_access(tp);
1da177e4
LT
9509
9510 /*
9511 * Before we can erase the flash page, we need
9512 * to issue a special "write enable" command.
9513 */
9514 nvram_cmd = NVRAM_CMD_WREN | NVRAM_CMD_GO | NVRAM_CMD_DONE;
9515
9516 if (tg3_nvram_exec_cmd(tp, nvram_cmd))
9517 break;
9518
9519 /* Erase the target page */
9520 tw32(NVRAM_ADDR, phy_addr);
9521
9522 nvram_cmd = NVRAM_CMD_GO | NVRAM_CMD_DONE | NVRAM_CMD_WR |
9523 NVRAM_CMD_FIRST | NVRAM_CMD_LAST | NVRAM_CMD_ERASE;
9524
9525 if (tg3_nvram_exec_cmd(tp, nvram_cmd))
9526 break;
9527
9528 /* Issue another write enable to start the write. */
9529 nvram_cmd = NVRAM_CMD_WREN | NVRAM_CMD_GO | NVRAM_CMD_DONE;
9530
9531 if (tg3_nvram_exec_cmd(tp, nvram_cmd))
9532 break;
9533
9534 for (j = 0; j < pagesize; j += 4) {
9535 u32 data;
9536
9537 data = *((u32 *) (tmp + j));
9538 tw32(NVRAM_WRDATA, cpu_to_be32(data));
9539
9540 tw32(NVRAM_ADDR, phy_addr + j);
9541
9542 nvram_cmd = NVRAM_CMD_GO | NVRAM_CMD_DONE |
9543 NVRAM_CMD_WR;
9544
9545 if (j == 0)
9546 nvram_cmd |= NVRAM_CMD_FIRST;
9547 else if (j == (pagesize - 4))
9548 nvram_cmd |= NVRAM_CMD_LAST;
9549
9550 if ((ret = tg3_nvram_exec_cmd(tp, nvram_cmd)))
9551 break;
9552 }
9553 if (ret)
9554 break;
9555 }
9556
9557 nvram_cmd = NVRAM_CMD_WRDI | NVRAM_CMD_GO | NVRAM_CMD_DONE;
9558 tg3_nvram_exec_cmd(tp, nvram_cmd);
9559
9560 kfree(tmp);
9561
9562 return ret;
9563}
9564
9565/* offset and length are dword aligned */
9566static int tg3_nvram_write_block_buffered(struct tg3 *tp, u32 offset, u32 len,
9567 u8 *buf)
9568{
9569 int i, ret = 0;
9570
9571 for (i = 0; i < len; i += 4, offset += 4) {
9572 u32 data, page_off, phy_addr, nvram_cmd;
9573
9574 memcpy(&data, buf + i, 4);
9575 tw32(NVRAM_WRDATA, cpu_to_be32(data));
9576
9577 page_off = offset % tp->nvram_pagesize;
9578
1820180b 9579 phy_addr = tg3_nvram_phys_addr(tp, offset);
1da177e4
LT
9580
9581 tw32(NVRAM_ADDR, phy_addr);
9582
9583 nvram_cmd = NVRAM_CMD_GO | NVRAM_CMD_DONE | NVRAM_CMD_WR;
9584
9585 if ((page_off == 0) || (i == 0))
9586 nvram_cmd |= NVRAM_CMD_FIRST;
f6d9a256 9587 if (page_off == (tp->nvram_pagesize - 4))
1da177e4
LT
9588 nvram_cmd |= NVRAM_CMD_LAST;
9589
9590 if (i == (len - 4))
9591 nvram_cmd |= NVRAM_CMD_LAST;
9592
4c987487 9593 if ((GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5752) &&
af36e6b6 9594 (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5755) &&
1b27777a 9595 (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5787) &&
4c987487
MC
9596 (tp->nvram_jedecnum == JEDEC_ST) &&
9597 (nvram_cmd & NVRAM_CMD_FIRST)) {
1da177e4
LT
9598
9599 if ((ret = tg3_nvram_exec_cmd(tp,
9600 NVRAM_CMD_WREN | NVRAM_CMD_GO |
9601 NVRAM_CMD_DONE)))
9602
9603 break;
9604 }
9605 if (!(tp->tg3_flags2 & TG3_FLG2_FLASH)) {
9606 /* We always do complete word writes to eeprom. */
9607 nvram_cmd |= (NVRAM_CMD_FIRST | NVRAM_CMD_LAST);
9608 }
9609
9610 if ((ret = tg3_nvram_exec_cmd(tp, nvram_cmd)))
9611 break;
9612 }
9613 return ret;
9614}
9615
9616/* offset and length are dword aligned */
9617static int tg3_nvram_write_block(struct tg3 *tp, u32 offset, u32 len, u8 *buf)
9618{
9619 int ret;
9620
1da177e4 9621 if (tp->tg3_flags & TG3_FLAG_EEPROM_WRITE_PROT) {
314fba34
MC
9622 tw32_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl &
9623 ~GRC_LCLCTRL_GPIO_OUTPUT1);
1da177e4
LT
9624 udelay(40);
9625 }
9626
9627 if (!(tp->tg3_flags & TG3_FLAG_NVRAM)) {
9628 ret = tg3_nvram_write_block_using_eeprom(tp, offset, len, buf);
9629 }
9630 else {
9631 u32 grc_mode;
9632
ec41c7df
MC
9633 ret = tg3_nvram_lock(tp);
9634 if (ret)
9635 return ret;
1da177e4 9636
e6af301b
MC
9637 tg3_enable_nvram_access(tp);
9638 if ((tp->tg3_flags2 & TG3_FLG2_5750_PLUS) &&
9639 !(tp->tg3_flags2 & TG3_FLG2_PROTECTED_NVRAM))
1da177e4 9640 tw32(NVRAM_WRITE1, 0x406);
1da177e4
LT
9641
9642 grc_mode = tr32(GRC_MODE);
9643 tw32(GRC_MODE, grc_mode | GRC_MODE_NVRAM_WR_ENABLE);
9644
9645 if ((tp->tg3_flags & TG3_FLAG_NVRAM_BUFFERED) ||
9646 !(tp->tg3_flags2 & TG3_FLG2_FLASH)) {
9647
9648 ret = tg3_nvram_write_block_buffered(tp, offset, len,
9649 buf);
9650 }
9651 else {
9652 ret = tg3_nvram_write_block_unbuffered(tp, offset, len,
9653 buf);
9654 }
9655
9656 grc_mode = tr32(GRC_MODE);
9657 tw32(GRC_MODE, grc_mode & ~GRC_MODE_NVRAM_WR_ENABLE);
9658
e6af301b 9659 tg3_disable_nvram_access(tp);
1da177e4
LT
9660 tg3_nvram_unlock(tp);
9661 }
9662
9663 if (tp->tg3_flags & TG3_FLAG_EEPROM_WRITE_PROT) {
314fba34 9664 tw32_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl);
1da177e4
LT
9665 udelay(40);
9666 }
9667
9668 return ret;
9669}
9670
9671struct subsys_tbl_ent {
9672 u16 subsys_vendor, subsys_devid;
9673 u32 phy_id;
9674};
9675
9676static struct subsys_tbl_ent subsys_id_to_phy_id[] = {
9677 /* Broadcom boards. */
9678 { PCI_VENDOR_ID_BROADCOM, 0x1644, PHY_ID_BCM5401 }, /* BCM95700A6 */
9679 { PCI_VENDOR_ID_BROADCOM, 0x0001, PHY_ID_BCM5701 }, /* BCM95701A5 */
9680 { PCI_VENDOR_ID_BROADCOM, 0x0002, PHY_ID_BCM8002 }, /* BCM95700T6 */
9681 { PCI_VENDOR_ID_BROADCOM, 0x0003, 0 }, /* BCM95700A9 */
9682 { PCI_VENDOR_ID_BROADCOM, 0x0005, PHY_ID_BCM5701 }, /* BCM95701T1 */
9683 { PCI_VENDOR_ID_BROADCOM, 0x0006, PHY_ID_BCM5701 }, /* BCM95701T8 */
9684 { PCI_VENDOR_ID_BROADCOM, 0x0007, 0 }, /* BCM95701A7 */
9685 { PCI_VENDOR_ID_BROADCOM, 0x0008, PHY_ID_BCM5701 }, /* BCM95701A10 */
9686 { PCI_VENDOR_ID_BROADCOM, 0x8008, PHY_ID_BCM5701 }, /* BCM95701A12 */
9687 { PCI_VENDOR_ID_BROADCOM, 0x0009, PHY_ID_BCM5703 }, /* BCM95703Ax1 */
9688 { PCI_VENDOR_ID_BROADCOM, 0x8009, PHY_ID_BCM5703 }, /* BCM95703Ax2 */
9689
9690 /* 3com boards. */
9691 { PCI_VENDOR_ID_3COM, 0x1000, PHY_ID_BCM5401 }, /* 3C996T */
9692 { PCI_VENDOR_ID_3COM, 0x1006, PHY_ID_BCM5701 }, /* 3C996BT */
9693 { PCI_VENDOR_ID_3COM, 0x1004, 0 }, /* 3C996SX */
9694 { PCI_VENDOR_ID_3COM, 0x1007, PHY_ID_BCM5701 }, /* 3C1000T */
9695 { PCI_VENDOR_ID_3COM, 0x1008, PHY_ID_BCM5701 }, /* 3C940BR01 */
9696
9697 /* DELL boards. */
9698 { PCI_VENDOR_ID_DELL, 0x00d1, PHY_ID_BCM5401 }, /* VIPER */
9699 { PCI_VENDOR_ID_DELL, 0x0106, PHY_ID_BCM5401 }, /* JAGUAR */
9700 { PCI_VENDOR_ID_DELL, 0x0109, PHY_ID_BCM5411 }, /* MERLOT */
9701 { PCI_VENDOR_ID_DELL, 0x010a, PHY_ID_BCM5411 }, /* SLIM_MERLOT */
9702
9703 /* Compaq boards. */
9704 { PCI_VENDOR_ID_COMPAQ, 0x007c, PHY_ID_BCM5701 }, /* BANSHEE */
9705 { PCI_VENDOR_ID_COMPAQ, 0x009a, PHY_ID_BCM5701 }, /* BANSHEE_2 */
9706 { PCI_VENDOR_ID_COMPAQ, 0x007d, 0 }, /* CHANGELING */
9707 { PCI_VENDOR_ID_COMPAQ, 0x0085, PHY_ID_BCM5701 }, /* NC7780 */
9708 { PCI_VENDOR_ID_COMPAQ, 0x0099, PHY_ID_BCM5701 }, /* NC7780_2 */
9709
9710 /* IBM boards. */
9711 { PCI_VENDOR_ID_IBM, 0x0281, 0 } /* IBM??? */
9712};
9713
9714static inline struct subsys_tbl_ent *lookup_by_subsys(struct tg3 *tp)
9715{
9716 int i;
9717
9718 for (i = 0; i < ARRAY_SIZE(subsys_id_to_phy_id); i++) {
9719 if ((subsys_id_to_phy_id[i].subsys_vendor ==
9720 tp->pdev->subsystem_vendor) &&
9721 (subsys_id_to_phy_id[i].subsys_devid ==
9722 tp->pdev->subsystem_device))
9723 return &subsys_id_to_phy_id[i];
9724 }
9725 return NULL;
9726}
9727
7d0c41ef 9728static void __devinit tg3_get_eeprom_hw_cfg(struct tg3 *tp)
1da177e4 9729{
1da177e4 9730 u32 val;
caf636c7
MC
9731 u16 pmcsr;
9732
9733 /* On some early chips the SRAM cannot be accessed in D3hot state,
9734 * so need make sure we're in D0.
9735 */
9736 pci_read_config_word(tp->pdev, tp->pm_cap + PCI_PM_CTRL, &pmcsr);
9737 pmcsr &= ~PCI_PM_CTRL_STATE_MASK;
9738 pci_write_config_word(tp->pdev, tp->pm_cap + PCI_PM_CTRL, pmcsr);
9739 msleep(1);
7d0c41ef
MC
9740
9741 /* Make sure register accesses (indirect or otherwise)
9742 * will function correctly.
9743 */
9744 pci_write_config_dword(tp->pdev, TG3PCI_MISC_HOST_CTRL,
9745 tp->misc_host_ctrl);
1da177e4 9746
f49639e6
DM
9747 /* The memory arbiter has to be enabled in order for SRAM accesses
9748 * to succeed. Normally on powerup the tg3 chip firmware will make
9749 * sure it is enabled, but other entities such as system netboot
9750 * code might disable it.
9751 */
9752 val = tr32(MEMARB_MODE);
9753 tw32(MEMARB_MODE, val | MEMARB_MODE_ENABLE);
9754
1da177e4 9755 tp->phy_id = PHY_ID_INVALID;
7d0c41ef
MC
9756 tp->led_ctrl = LED_CTRL_MODE_PHY_1;
9757
f49639e6
DM
9758 /* Assume an onboard device by default. */
9759 tp->tg3_flags |= TG3_FLAG_EEPROM_WRITE_PROT;
72b845e0 9760
1da177e4
LT
9761 tg3_read_mem(tp, NIC_SRAM_DATA_SIG, &val);
9762 if (val == NIC_SRAM_DATA_SIG_MAGIC) {
9763 u32 nic_cfg, led_cfg;
7d0c41ef
MC
9764 u32 nic_phy_id, ver, cfg2 = 0, eeprom_phy_id;
9765 int eeprom_phy_serdes = 0;
1da177e4
LT
9766
9767 tg3_read_mem(tp, NIC_SRAM_DATA_CFG, &nic_cfg);
9768 tp->nic_sram_data_cfg = nic_cfg;
9769
9770 tg3_read_mem(tp, NIC_SRAM_DATA_VER, &ver);
9771 ver >>= NIC_SRAM_DATA_VER_SHIFT;
9772 if ((GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5700) &&
9773 (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5701) &&
9774 (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5703) &&
9775 (ver > 0) && (ver < 0x100))
9776 tg3_read_mem(tp, NIC_SRAM_DATA_CFG_2, &cfg2);
9777
1da177e4
LT
9778 if ((nic_cfg & NIC_SRAM_DATA_CFG_PHY_TYPE_MASK) ==
9779 NIC_SRAM_DATA_CFG_PHY_TYPE_FIBER)
9780 eeprom_phy_serdes = 1;
9781
9782 tg3_read_mem(tp, NIC_SRAM_DATA_PHY_ID, &nic_phy_id);
9783 if (nic_phy_id != 0) {
9784 u32 id1 = nic_phy_id & NIC_SRAM_DATA_PHY_ID1_MASK;
9785 u32 id2 = nic_phy_id & NIC_SRAM_DATA_PHY_ID2_MASK;
9786
9787 eeprom_phy_id = (id1 >> 16) << 10;
9788 eeprom_phy_id |= (id2 & 0xfc00) << 16;
9789 eeprom_phy_id |= (id2 & 0x03ff) << 0;
9790 } else
9791 eeprom_phy_id = 0;
9792
7d0c41ef 9793 tp->phy_id = eeprom_phy_id;
747e8f8b 9794 if (eeprom_phy_serdes) {
a4e2b347 9795 if (tp->tg3_flags2 & TG3_FLG2_5780_CLASS)
747e8f8b
MC
9796 tp->tg3_flags2 |= TG3_FLG2_MII_SERDES;
9797 else
9798 tp->tg3_flags2 |= TG3_FLG2_PHY_SERDES;
9799 }
7d0c41ef 9800
cbf46853 9801 if (tp->tg3_flags2 & TG3_FLG2_5750_PLUS)
1da177e4
LT
9802 led_cfg = cfg2 & (NIC_SRAM_DATA_CFG_LED_MODE_MASK |
9803 SHASTA_EXT_LED_MODE_MASK);
cbf46853 9804 else
1da177e4
LT
9805 led_cfg = nic_cfg & NIC_SRAM_DATA_CFG_LED_MODE_MASK;
9806
9807 switch (led_cfg) {
9808 default:
9809 case NIC_SRAM_DATA_CFG_LED_MODE_PHY_1:
9810 tp->led_ctrl = LED_CTRL_MODE_PHY_1;
9811 break;
9812
9813 case NIC_SRAM_DATA_CFG_LED_MODE_PHY_2:
9814 tp->led_ctrl = LED_CTRL_MODE_PHY_2;
9815 break;
9816
9817 case NIC_SRAM_DATA_CFG_LED_MODE_MAC:
9818 tp->led_ctrl = LED_CTRL_MODE_MAC;
9ba27794
MC
9819
9820 /* Default to PHY_1_MODE if 0 (MAC_MODE) is
9821 * read on some older 5700/5701 bootcode.
9822 */
9823 if (GET_ASIC_REV(tp->pci_chip_rev_id) ==
9824 ASIC_REV_5700 ||
9825 GET_ASIC_REV(tp->pci_chip_rev_id) ==
9826 ASIC_REV_5701)
9827 tp->led_ctrl = LED_CTRL_MODE_PHY_1;
9828
1da177e4
LT
9829 break;
9830
9831 case SHASTA_EXT_LED_SHARED:
9832 tp->led_ctrl = LED_CTRL_MODE_SHARED;
9833 if (tp->pci_chip_rev_id != CHIPREV_ID_5750_A0 &&
9834 tp->pci_chip_rev_id != CHIPREV_ID_5750_A1)
9835 tp->led_ctrl |= (LED_CTRL_MODE_PHY_1 |
9836 LED_CTRL_MODE_PHY_2);
9837 break;
9838
9839 case SHASTA_EXT_LED_MAC:
9840 tp->led_ctrl = LED_CTRL_MODE_SHASTA_MAC;
9841 break;
9842
9843 case SHASTA_EXT_LED_COMBO:
9844 tp->led_ctrl = LED_CTRL_MODE_COMBO;
9845 if (tp->pci_chip_rev_id != CHIPREV_ID_5750_A0)
9846 tp->led_ctrl |= (LED_CTRL_MODE_PHY_1 |
9847 LED_CTRL_MODE_PHY_2);
9848 break;
9849
9850 };
9851
9852 if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 ||
9853 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701) &&
9854 tp->pdev->subsystem_vendor == PCI_VENDOR_ID_DELL)
9855 tp->led_ctrl = LED_CTRL_MODE_PHY_2;
9856
bbadf503 9857 if (nic_cfg & NIC_SRAM_DATA_CFG_EEPROM_WP)
1da177e4 9858 tp->tg3_flags |= TG3_FLAG_EEPROM_WRITE_PROT;
f49639e6
DM
9859 else
9860 tp->tg3_flags &= ~TG3_FLAG_EEPROM_WRITE_PROT;
1da177e4
LT
9861
9862 if (nic_cfg & NIC_SRAM_DATA_CFG_ASF_ENABLE) {
9863 tp->tg3_flags |= TG3_FLAG_ENABLE_ASF;
cbf46853 9864 if (tp->tg3_flags2 & TG3_FLG2_5750_PLUS)
1da177e4
LT
9865 tp->tg3_flags2 |= TG3_FLG2_ASF_NEW_HANDSHAKE;
9866 }
9867 if (nic_cfg & NIC_SRAM_DATA_CFG_FIBER_WOL)
9868 tp->tg3_flags |= TG3_FLAG_SERDES_WOL_CAP;
9869
9870 if (cfg2 & (1 << 17))
9871 tp->tg3_flags2 |= TG3_FLG2_CAPACITIVE_COUPLING;
9872
9873 /* serdes signal pre-emphasis in register 0x590 set by */
9874 /* bootcode if bit 18 is set */
9875 if (cfg2 & (1 << 18))
9876 tp->tg3_flags2 |= TG3_FLG2_SERDES_PREEMPHASIS;
9877 }
7d0c41ef
MC
9878}
9879
9880static int __devinit tg3_phy_probe(struct tg3 *tp)
9881{
9882 u32 hw_phy_id_1, hw_phy_id_2;
9883 u32 hw_phy_id, hw_phy_id_masked;
9884 int err;
1da177e4
LT
9885
9886 /* Reading the PHY ID register can conflict with ASF
9887 * firwmare access to the PHY hardware.
9888 */
9889 err = 0;
9890 if (tp->tg3_flags & TG3_FLAG_ENABLE_ASF) {
9891 hw_phy_id = hw_phy_id_masked = PHY_ID_INVALID;
9892 } else {
9893 /* Now read the physical PHY_ID from the chip and verify
9894 * that it is sane. If it doesn't look good, we fall back
9895 * to either the hard-coded table based PHY_ID and failing
9896 * that the value found in the eeprom area.
9897 */
9898 err |= tg3_readphy(tp, MII_PHYSID1, &hw_phy_id_1);
9899 err |= tg3_readphy(tp, MII_PHYSID2, &hw_phy_id_2);
9900
9901 hw_phy_id = (hw_phy_id_1 & 0xffff) << 10;
9902 hw_phy_id |= (hw_phy_id_2 & 0xfc00) << 16;
9903 hw_phy_id |= (hw_phy_id_2 & 0x03ff) << 0;
9904
9905 hw_phy_id_masked = hw_phy_id & PHY_ID_MASK;
9906 }
9907
9908 if (!err && KNOWN_PHY_ID(hw_phy_id_masked)) {
9909 tp->phy_id = hw_phy_id;
9910 if (hw_phy_id_masked == PHY_ID_BCM8002)
9911 tp->tg3_flags2 |= TG3_FLG2_PHY_SERDES;
da6b2d01
MC
9912 else
9913 tp->tg3_flags2 &= ~TG3_FLG2_PHY_SERDES;
1da177e4 9914 } else {
7d0c41ef
MC
9915 if (tp->phy_id != PHY_ID_INVALID) {
9916 /* Do nothing, phy ID already set up in
9917 * tg3_get_eeprom_hw_cfg().
9918 */
1da177e4
LT
9919 } else {
9920 struct subsys_tbl_ent *p;
9921
9922 /* No eeprom signature? Try the hardcoded
9923 * subsys device table.
9924 */
9925 p = lookup_by_subsys(tp);
9926 if (!p)
9927 return -ENODEV;
9928
9929 tp->phy_id = p->phy_id;
9930 if (!tp->phy_id ||
9931 tp->phy_id == PHY_ID_BCM8002)
9932 tp->tg3_flags2 |= TG3_FLG2_PHY_SERDES;
9933 }
9934 }
9935
747e8f8b 9936 if (!(tp->tg3_flags2 & TG3_FLG2_ANY_SERDES) &&
1da177e4
LT
9937 !(tp->tg3_flags & TG3_FLAG_ENABLE_ASF)) {
9938 u32 bmsr, adv_reg, tg3_ctrl;
9939
9940 tg3_readphy(tp, MII_BMSR, &bmsr);
9941 if (!tg3_readphy(tp, MII_BMSR, &bmsr) &&
9942 (bmsr & BMSR_LSTATUS))
9943 goto skip_phy_reset;
6aa20a22 9944
1da177e4
LT
9945 err = tg3_phy_reset(tp);
9946 if (err)
9947 return err;
9948
9949 adv_reg = (ADVERTISE_10HALF | ADVERTISE_10FULL |
9950 ADVERTISE_100HALF | ADVERTISE_100FULL |
9951 ADVERTISE_CSMA | ADVERTISE_PAUSE_CAP);
9952 tg3_ctrl = 0;
9953 if (!(tp->tg3_flags & TG3_FLAG_10_100_ONLY)) {
9954 tg3_ctrl = (MII_TG3_CTRL_ADV_1000_HALF |
9955 MII_TG3_CTRL_ADV_1000_FULL);
9956 if (tp->pci_chip_rev_id == CHIPREV_ID_5701_A0 ||
9957 tp->pci_chip_rev_id == CHIPREV_ID_5701_B0)
9958 tg3_ctrl |= (MII_TG3_CTRL_AS_MASTER |
9959 MII_TG3_CTRL_ENABLE_AS_MASTER);
9960 }
9961
9962 if (!tg3_copper_is_advertising_all(tp)) {
9963 tg3_writephy(tp, MII_ADVERTISE, adv_reg);
9964
9965 if (!(tp->tg3_flags & TG3_FLAG_10_100_ONLY))
9966 tg3_writephy(tp, MII_TG3_CTRL, tg3_ctrl);
9967
9968 tg3_writephy(tp, MII_BMCR,
9969 BMCR_ANENABLE | BMCR_ANRESTART);
9970 }
9971 tg3_phy_set_wirespeed(tp);
9972
9973 tg3_writephy(tp, MII_ADVERTISE, adv_reg);
9974 if (!(tp->tg3_flags & TG3_FLAG_10_100_ONLY))
9975 tg3_writephy(tp, MII_TG3_CTRL, tg3_ctrl);
9976 }
9977
9978skip_phy_reset:
9979 if ((tp->phy_id & PHY_ID_MASK) == PHY_ID_BCM5401) {
9980 err = tg3_init_5401phy_dsp(tp);
9981 if (err)
9982 return err;
9983 }
9984
9985 if (!err && ((tp->phy_id & PHY_ID_MASK) == PHY_ID_BCM5401)) {
9986 err = tg3_init_5401phy_dsp(tp);
9987 }
9988
747e8f8b 9989 if (tp->tg3_flags2 & TG3_FLG2_ANY_SERDES)
1da177e4
LT
9990 tp->link_config.advertising =
9991 (ADVERTISED_1000baseT_Half |
9992 ADVERTISED_1000baseT_Full |
9993 ADVERTISED_Autoneg |
9994 ADVERTISED_FIBRE);
9995 if (tp->tg3_flags & TG3_FLAG_10_100_ONLY)
9996 tp->link_config.advertising &=
9997 ~(ADVERTISED_1000baseT_Half |
9998 ADVERTISED_1000baseT_Full);
9999
10000 return err;
10001}
10002
10003static void __devinit tg3_read_partno(struct tg3 *tp)
10004{
10005 unsigned char vpd_data[256];
10006 int i;
1b27777a 10007 u32 magic;
1da177e4 10008
1820180b 10009 if (tg3_nvram_read_swab(tp, 0x0, &magic))
f49639e6 10010 goto out_not_found;
1da177e4 10011
1820180b 10012 if (magic == TG3_EEPROM_MAGIC) {
1b27777a
MC
10013 for (i = 0; i < 256; i += 4) {
10014 u32 tmp;
1da177e4 10015
1b27777a
MC
10016 if (tg3_nvram_read(tp, 0x100 + i, &tmp))
10017 goto out_not_found;
10018
10019 vpd_data[i + 0] = ((tmp >> 0) & 0xff);
10020 vpd_data[i + 1] = ((tmp >> 8) & 0xff);
10021 vpd_data[i + 2] = ((tmp >> 16) & 0xff);
10022 vpd_data[i + 3] = ((tmp >> 24) & 0xff);
10023 }
10024 } else {
10025 int vpd_cap;
10026
10027 vpd_cap = pci_find_capability(tp->pdev, PCI_CAP_ID_VPD);
10028 for (i = 0; i < 256; i += 4) {
10029 u32 tmp, j = 0;
10030 u16 tmp16;
10031
10032 pci_write_config_word(tp->pdev, vpd_cap + PCI_VPD_ADDR,
10033 i);
10034 while (j++ < 100) {
10035 pci_read_config_word(tp->pdev, vpd_cap +
10036 PCI_VPD_ADDR, &tmp16);
10037 if (tmp16 & 0x8000)
10038 break;
10039 msleep(1);
10040 }
f49639e6
DM
10041 if (!(tmp16 & 0x8000))
10042 goto out_not_found;
10043
1b27777a
MC
10044 pci_read_config_dword(tp->pdev, vpd_cap + PCI_VPD_DATA,
10045 &tmp);
10046 tmp = cpu_to_le32(tmp);
10047 memcpy(&vpd_data[i], &tmp, 4);
10048 }
1da177e4
LT
10049 }
10050
10051 /* Now parse and find the part number. */
10052 for (i = 0; i < 256; ) {
10053 unsigned char val = vpd_data[i];
10054 int block_end;
10055
10056 if (val == 0x82 || val == 0x91) {
10057 i = (i + 3 +
10058 (vpd_data[i + 1] +
10059 (vpd_data[i + 2] << 8)));
10060 continue;
10061 }
10062
10063 if (val != 0x90)
10064 goto out_not_found;
10065
10066 block_end = (i + 3 +
10067 (vpd_data[i + 1] +
10068 (vpd_data[i + 2] << 8)));
10069 i += 3;
10070 while (i < block_end) {
10071 if (vpd_data[i + 0] == 'P' &&
10072 vpd_data[i + 1] == 'N') {
10073 int partno_len = vpd_data[i + 2];
10074
10075 if (partno_len > 24)
10076 goto out_not_found;
10077
10078 memcpy(tp->board_part_number,
10079 &vpd_data[i + 3],
10080 partno_len);
10081
10082 /* Success. */
10083 return;
10084 }
10085 }
10086
10087 /* Part number not found. */
10088 goto out_not_found;
10089 }
10090
10091out_not_found:
10092 strcpy(tp->board_part_number, "none");
10093}
10094
c4e6575c
MC
10095static void __devinit tg3_read_fw_ver(struct tg3 *tp)
10096{
10097 u32 val, offset, start;
10098
10099 if (tg3_nvram_read_swab(tp, 0, &val))
10100 return;
10101
10102 if (val != TG3_EEPROM_MAGIC)
10103 return;
10104
10105 if (tg3_nvram_read_swab(tp, 0xc, &offset) ||
10106 tg3_nvram_read_swab(tp, 0x4, &start))
10107 return;
10108
10109 offset = tg3_nvram_logical_addr(tp, offset);
10110 if (tg3_nvram_read_swab(tp, offset, &val))
10111 return;
10112
10113 if ((val & 0xfc000000) == 0x0c000000) {
10114 u32 ver_offset, addr;
10115 int i;
10116
10117 if (tg3_nvram_read_swab(tp, offset + 4, &val) ||
10118 tg3_nvram_read_swab(tp, offset + 8, &ver_offset))
10119 return;
10120
10121 if (val != 0)
10122 return;
10123
10124 addr = offset + ver_offset - start;
10125 for (i = 0; i < 16; i += 4) {
10126 if (tg3_nvram_read(tp, addr + i, &val))
10127 return;
10128
10129 val = cpu_to_le32(val);
10130 memcpy(tp->fw_ver + i, &val, 4);
10131 }
10132 }
10133}
10134
1da177e4
LT
10135static int __devinit tg3_get_invariants(struct tg3 *tp)
10136{
10137 static struct pci_device_id write_reorder_chipsets[] = {
1da177e4
LT
10138 { PCI_DEVICE(PCI_VENDOR_ID_AMD,
10139 PCI_DEVICE_ID_AMD_FE_GATE_700C) },
c165b004
JL
10140 { PCI_DEVICE(PCI_VENDOR_ID_AMD,
10141 PCI_DEVICE_ID_AMD_8131_BRIDGE) },
399de50b
MC
10142 { PCI_DEVICE(PCI_VENDOR_ID_VIA,
10143 PCI_DEVICE_ID_VIA_8385_0) },
1da177e4
LT
10144 { },
10145 };
10146 u32 misc_ctrl_reg;
10147 u32 cacheline_sz_reg;
10148 u32 pci_state_reg, grc_misc_cfg;
10149 u32 val;
10150 u16 pci_cmd;
10151 int err;
10152
1da177e4
LT
10153 /* Force memory write invalidate off. If we leave it on,
10154 * then on 5700_BX chips we have to enable a workaround.
10155 * The workaround is to set the TG3PCI_DMA_RW_CTRL boundary
10156 * to match the cacheline size. The Broadcom driver have this
10157 * workaround but turns MWI off all the times so never uses
10158 * it. This seems to suggest that the workaround is insufficient.
10159 */
10160 pci_read_config_word(tp->pdev, PCI_COMMAND, &pci_cmd);
10161 pci_cmd &= ~PCI_COMMAND_INVALIDATE;
10162 pci_write_config_word(tp->pdev, PCI_COMMAND, pci_cmd);
10163
10164 /* It is absolutely critical that TG3PCI_MISC_HOST_CTRL
10165 * has the register indirect write enable bit set before
10166 * we try to access any of the MMIO registers. It is also
10167 * critical that the PCI-X hw workaround situation is decided
10168 * before that as well.
10169 */
10170 pci_read_config_dword(tp->pdev, TG3PCI_MISC_HOST_CTRL,
10171 &misc_ctrl_reg);
10172
10173 tp->pci_chip_rev_id = (misc_ctrl_reg >>
10174 MISC_HOST_CTRL_CHIPREV_SHIFT);
10175
ff645bec
MC
10176 /* Wrong chip ID in 5752 A0. This code can be removed later
10177 * as A0 is not in production.
10178 */
10179 if (tp->pci_chip_rev_id == CHIPREV_ID_5752_A0_HW)
10180 tp->pci_chip_rev_id = CHIPREV_ID_5752_A0;
10181
6892914f
MC
10182 /* If we have 5702/03 A1 or A2 on certain ICH chipsets,
10183 * we need to disable memory and use config. cycles
10184 * only to access all registers. The 5702/03 chips
10185 * can mistakenly decode the special cycles from the
10186 * ICH chipsets as memory write cycles, causing corruption
10187 * of register and memory space. Only certain ICH bridges
10188 * will drive special cycles with non-zero data during the
10189 * address phase which can fall within the 5703's address
10190 * range. This is not an ICH bug as the PCI spec allows
10191 * non-zero address during special cycles. However, only
10192 * these ICH bridges are known to drive non-zero addresses
10193 * during special cycles.
10194 *
10195 * Since special cycles do not cross PCI bridges, we only
10196 * enable this workaround if the 5703 is on the secondary
10197 * bus of these ICH bridges.
10198 */
10199 if ((tp->pci_chip_rev_id == CHIPREV_ID_5703_A1) ||
10200 (tp->pci_chip_rev_id == CHIPREV_ID_5703_A2)) {
10201 static struct tg3_dev_id {
10202 u32 vendor;
10203 u32 device;
10204 u32 rev;
10205 } ich_chipsets[] = {
10206 { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AA_8,
10207 PCI_ANY_ID },
10208 { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AB_8,
10209 PCI_ANY_ID },
10210 { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801BA_11,
10211 0xa },
10212 { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801BA_6,
10213 PCI_ANY_ID },
10214 { },
10215 };
10216 struct tg3_dev_id *pci_id = &ich_chipsets[0];
10217 struct pci_dev *bridge = NULL;
10218
10219 while (pci_id->vendor != 0) {
10220 bridge = pci_get_device(pci_id->vendor, pci_id->device,
10221 bridge);
10222 if (!bridge) {
10223 pci_id++;
10224 continue;
10225 }
10226 if (pci_id->rev != PCI_ANY_ID) {
10227 u8 rev;
10228
10229 pci_read_config_byte(bridge, PCI_REVISION_ID,
10230 &rev);
10231 if (rev > pci_id->rev)
10232 continue;
10233 }
10234 if (bridge->subordinate &&
10235 (bridge->subordinate->number ==
10236 tp->pdev->bus->number)) {
10237
10238 tp->tg3_flags2 |= TG3_FLG2_ICH_WORKAROUND;
10239 pci_dev_put(bridge);
10240 break;
10241 }
10242 }
10243 }
10244
4a29cc2e
MC
10245 /* The EPB bridge inside 5714, 5715, and 5780 cannot support
10246 * DMA addresses > 40-bit. This bridge may have other additional
10247 * 57xx devices behind it in some 4-port NIC designs for example.
10248 * Any tg3 device found behind the bridge will also need the 40-bit
10249 * DMA workaround.
10250 */
a4e2b347
MC
10251 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5780 ||
10252 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5714) {
10253 tp->tg3_flags2 |= TG3_FLG2_5780_CLASS;
4a29cc2e 10254 tp->tg3_flags |= TG3_FLAG_40BIT_DMA_BUG;
4cf78e4f 10255 tp->msi_cap = pci_find_capability(tp->pdev, PCI_CAP_ID_MSI);
a4e2b347 10256 }
4a29cc2e
MC
10257 else {
10258 struct pci_dev *bridge = NULL;
10259
10260 do {
10261 bridge = pci_get_device(PCI_VENDOR_ID_SERVERWORKS,
10262 PCI_DEVICE_ID_SERVERWORKS_EPB,
10263 bridge);
10264 if (bridge && bridge->subordinate &&
10265 (bridge->subordinate->number <=
10266 tp->pdev->bus->number) &&
10267 (bridge->subordinate->subordinate >=
10268 tp->pdev->bus->number)) {
10269 tp->tg3_flags |= TG3_FLAG_40BIT_DMA_BUG;
10270 pci_dev_put(bridge);
10271 break;
10272 }
10273 } while (bridge);
10274 }
4cf78e4f 10275
1da177e4
LT
10276 /* Initialize misc host control in PCI block. */
10277 tp->misc_host_ctrl |= (misc_ctrl_reg &
10278 MISC_HOST_CTRL_CHIPREV);
10279 pci_write_config_dword(tp->pdev, TG3PCI_MISC_HOST_CTRL,
10280 tp->misc_host_ctrl);
10281
10282 pci_read_config_dword(tp->pdev, TG3PCI_CACHELINESZ,
10283 &cacheline_sz_reg);
10284
10285 tp->pci_cacheline_sz = (cacheline_sz_reg >> 0) & 0xff;
10286 tp->pci_lat_timer = (cacheline_sz_reg >> 8) & 0xff;
10287 tp->pci_hdr_type = (cacheline_sz_reg >> 16) & 0xff;
10288 tp->pci_bist = (cacheline_sz_reg >> 24) & 0xff;
10289
6708e5cc 10290 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750 ||
4cf78e4f 10291 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5752 ||
af36e6b6 10292 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 ||
d9ab5ad1 10293 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787 ||
a4e2b347 10294 (tp->tg3_flags2 & TG3_FLG2_5780_CLASS))
6708e5cc
JL
10295 tp->tg3_flags2 |= TG3_FLG2_5750_PLUS;
10296
1b440c56
JL
10297 if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) ||
10298 (tp->tg3_flags2 & TG3_FLG2_5750_PLUS))
10299 tp->tg3_flags2 |= TG3_FLG2_5705_PLUS;
10300
5a6f3074 10301 if (tp->tg3_flags2 & TG3_FLG2_5750_PLUS) {
af36e6b6
MC
10302 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 ||
10303 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787) {
5a6f3074 10304 tp->tg3_flags2 |= TG3_FLG2_HW_TSO_2;
fcfa0a32 10305 tp->tg3_flags2 |= TG3_FLG2_1SHOT_MSI;
52c0fd83
MC
10306 } else {
10307 tp->tg3_flags2 |= TG3_FLG2_HW_TSO_1 |
10308 TG3_FLG2_HW_TSO_1_BUG;
10309 if (GET_ASIC_REV(tp->pci_chip_rev_id) ==
10310 ASIC_REV_5750 &&
10311 tp->pci_chip_rev_id >= CHIPREV_ID_5750_C2)
10312 tp->tg3_flags2 &= ~TG3_FLG2_HW_TSO_1_BUG;
10313 }
5a6f3074 10314 }
1da177e4 10315
0f893dc6
MC
10316 if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5705 &&
10317 GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5750 &&
d9ab5ad1 10318 GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5752 &&
af36e6b6 10319 GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5755 &&
d9ab5ad1 10320 GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5787)
0f893dc6
MC
10321 tp->tg3_flags2 |= TG3_FLG2_JUMBO_CAPABLE;
10322
1da177e4
LT
10323 if (pci_find_capability(tp->pdev, PCI_CAP_ID_EXP) != 0)
10324 tp->tg3_flags2 |= TG3_FLG2_PCI_EXPRESS;
10325
399de50b
MC
10326 /* If we have an AMD 762 or VIA K8T800 chipset, write
10327 * reordering to the mailbox registers done by the host
10328 * controller can cause major troubles. We read back from
10329 * every mailbox register write to force the writes to be
10330 * posted to the chip in order.
10331 */
10332 if (pci_dev_present(write_reorder_chipsets) &&
10333 !(tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS))
10334 tp->tg3_flags |= TG3_FLAG_MBOX_WRITE_REORDER;
10335
1da177e4
LT
10336 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703 &&
10337 tp->pci_lat_timer < 64) {
10338 tp->pci_lat_timer = 64;
10339
10340 cacheline_sz_reg = ((tp->pci_cacheline_sz & 0xff) << 0);
10341 cacheline_sz_reg |= ((tp->pci_lat_timer & 0xff) << 8);
10342 cacheline_sz_reg |= ((tp->pci_hdr_type & 0xff) << 16);
10343 cacheline_sz_reg |= ((tp->pci_bist & 0xff) << 24);
10344
10345 pci_write_config_dword(tp->pdev, TG3PCI_CACHELINESZ,
10346 cacheline_sz_reg);
10347 }
10348
10349 pci_read_config_dword(tp->pdev, TG3PCI_PCISTATE,
10350 &pci_state_reg);
10351
10352 if ((pci_state_reg & PCISTATE_CONV_PCI_MODE) == 0) {
10353 tp->tg3_flags |= TG3_FLAG_PCIX_MODE;
10354
10355 /* If this is a 5700 BX chipset, and we are in PCI-X
10356 * mode, enable register write workaround.
10357 *
10358 * The workaround is to use indirect register accesses
10359 * for all chip writes not to mailbox registers.
10360 */
10361 if (GET_CHIP_REV(tp->pci_chip_rev_id) == CHIPREV_5700_BX) {
10362 u32 pm_reg;
10363 u16 pci_cmd;
10364
10365 tp->tg3_flags |= TG3_FLAG_PCIX_TARGET_HWBUG;
10366
10367 /* The chip can have it's power management PCI config
10368 * space registers clobbered due to this bug.
10369 * So explicitly force the chip into D0 here.
10370 */
10371 pci_read_config_dword(tp->pdev, TG3PCI_PM_CTRL_STAT,
10372 &pm_reg);
10373 pm_reg &= ~PCI_PM_CTRL_STATE_MASK;
10374 pm_reg |= PCI_PM_CTRL_PME_ENABLE | 0 /* D0 */;
10375 pci_write_config_dword(tp->pdev, TG3PCI_PM_CTRL_STAT,
10376 pm_reg);
10377
10378 /* Also, force SERR#/PERR# in PCI command. */
10379 pci_read_config_word(tp->pdev, PCI_COMMAND, &pci_cmd);
10380 pci_cmd |= PCI_COMMAND_PARITY | PCI_COMMAND_SERR;
10381 pci_write_config_word(tp->pdev, PCI_COMMAND, pci_cmd);
10382 }
10383 }
10384
087fe256
MC
10385 /* 5700 BX chips need to have their TX producer index mailboxes
10386 * written twice to workaround a bug.
10387 */
10388 if (GET_CHIP_REV(tp->pci_chip_rev_id) == CHIPREV_5700_BX)
10389 tp->tg3_flags |= TG3_FLAG_TXD_MBOX_HWBUG;
10390
1da177e4
LT
10391 /* Back to back register writes can cause problems on this chip,
10392 * the workaround is to read back all reg writes except those to
10393 * mailbox regs. See tg3_write_indirect_reg32().
10394 *
10395 * PCI Express 5750_A0 rev chips need this workaround too.
10396 */
10397 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701 ||
10398 ((tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS) &&
10399 tp->pci_chip_rev_id == CHIPREV_ID_5750_A0))
10400 tp->tg3_flags |= TG3_FLAG_5701_REG_WRITE_BUG;
10401
10402 if ((pci_state_reg & PCISTATE_BUS_SPEED_HIGH) != 0)
10403 tp->tg3_flags |= TG3_FLAG_PCI_HIGH_SPEED;
10404 if ((pci_state_reg & PCISTATE_BUS_32BIT) != 0)
10405 tp->tg3_flags |= TG3_FLAG_PCI_32BIT;
10406
10407 /* Chip-specific fixup from Broadcom driver */
10408 if ((tp->pci_chip_rev_id == CHIPREV_ID_5704_A0) &&
10409 (!(pci_state_reg & PCISTATE_RETRY_SAME_DMA))) {
10410 pci_state_reg |= PCISTATE_RETRY_SAME_DMA;
10411 pci_write_config_dword(tp->pdev, TG3PCI_PCISTATE, pci_state_reg);
10412 }
10413
1ee582d8 10414 /* Default fast path register access methods */
20094930 10415 tp->read32 = tg3_read32;
1ee582d8 10416 tp->write32 = tg3_write32;
09ee929c 10417 tp->read32_mbox = tg3_read32;
20094930 10418 tp->write32_mbox = tg3_write32;
1ee582d8
MC
10419 tp->write32_tx_mbox = tg3_write32;
10420 tp->write32_rx_mbox = tg3_write32;
10421
10422 /* Various workaround register access methods */
10423 if (tp->tg3_flags & TG3_FLAG_PCIX_TARGET_HWBUG)
10424 tp->write32 = tg3_write_indirect_reg32;
10425 else if (tp->tg3_flags & TG3_FLAG_5701_REG_WRITE_BUG)
10426 tp->write32 = tg3_write_flush_reg32;
10427
10428 if ((tp->tg3_flags & TG3_FLAG_TXD_MBOX_HWBUG) ||
10429 (tp->tg3_flags & TG3_FLAG_MBOX_WRITE_REORDER)) {
10430 tp->write32_tx_mbox = tg3_write32_tx_mbox;
10431 if (tp->tg3_flags & TG3_FLAG_MBOX_WRITE_REORDER)
10432 tp->write32_rx_mbox = tg3_write_flush_reg32;
10433 }
20094930 10434
6892914f
MC
10435 if (tp->tg3_flags2 & TG3_FLG2_ICH_WORKAROUND) {
10436 tp->read32 = tg3_read_indirect_reg32;
10437 tp->write32 = tg3_write_indirect_reg32;
10438 tp->read32_mbox = tg3_read_indirect_mbox;
10439 tp->write32_mbox = tg3_write_indirect_mbox;
10440 tp->write32_tx_mbox = tg3_write_indirect_mbox;
10441 tp->write32_rx_mbox = tg3_write_indirect_mbox;
10442
10443 iounmap(tp->regs);
22abe310 10444 tp->regs = NULL;
6892914f
MC
10445
10446 pci_read_config_word(tp->pdev, PCI_COMMAND, &pci_cmd);
10447 pci_cmd &= ~PCI_COMMAND_MEMORY;
10448 pci_write_config_word(tp->pdev, PCI_COMMAND, pci_cmd);
10449 }
10450
bbadf503
MC
10451 if (tp->write32 == tg3_write_indirect_reg32 ||
10452 ((tp->tg3_flags & TG3_FLAG_PCIX_MODE) &&
10453 (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 ||
f49639e6 10454 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701)))
bbadf503
MC
10455 tp->tg3_flags |= TG3_FLAG_SRAM_USE_CONFIG;
10456
7d0c41ef
MC
10457 /* Get eeprom hw config before calling tg3_set_power_state().
10458 * In particular, the TG3_FLAG_EEPROM_WRITE_PROT flag must be
10459 * determined before calling tg3_set_power_state() so that
10460 * we know whether or not to switch out of Vaux power.
10461 * When the flag is set, it means that GPIO1 is used for eeprom
10462 * write protect and also implies that it is a LOM where GPIOs
10463 * are not used to switch power.
6aa20a22 10464 */
7d0c41ef
MC
10465 tg3_get_eeprom_hw_cfg(tp);
10466
314fba34
MC
10467 /* Set up tp->grc_local_ctrl before calling tg3_set_power_state().
10468 * GPIO1 driven high will bring 5700's external PHY out of reset.
10469 * It is also used as eeprom write protect on LOMs.
10470 */
10471 tp->grc_local_ctrl = GRC_LCLCTRL_INT_ON_ATTN | GRC_LCLCTRL_AUTO_SEEPROM;
10472 if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700) ||
10473 (tp->tg3_flags & TG3_FLAG_EEPROM_WRITE_PROT))
10474 tp->grc_local_ctrl |= (GRC_LCLCTRL_GPIO_OE1 |
10475 GRC_LCLCTRL_GPIO_OUTPUT1);
3e7d83bc
MC
10476 /* Unused GPIO3 must be driven as output on 5752 because there
10477 * are no pull-up resistors on unused GPIO pins.
10478 */
10479 else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5752)
10480 tp->grc_local_ctrl |= GRC_LCLCTRL_GPIO_OE3;
314fba34 10481
af36e6b6
MC
10482 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755)
10483 tp->grc_local_ctrl |= GRC_LCLCTRL_GPIO_UART_SEL;
10484
1da177e4 10485 /* Force the chip into D0. */
bc1c7567 10486 err = tg3_set_power_state(tp, PCI_D0);
1da177e4
LT
10487 if (err) {
10488 printk(KERN_ERR PFX "(%s) transition to D0 failed\n",
10489 pci_name(tp->pdev));
10490 return err;
10491 }
10492
10493 /* 5700 B0 chips do not support checksumming correctly due
10494 * to hardware bugs.
10495 */
10496 if (tp->pci_chip_rev_id == CHIPREV_ID_5700_B0)
10497 tp->tg3_flags |= TG3_FLAG_BROKEN_CHECKSUMS;
10498
1da177e4
LT
10499 /* Derive initial jumbo mode from MTU assigned in
10500 * ether_setup() via the alloc_etherdev() call
10501 */
0f893dc6 10502 if (tp->dev->mtu > ETH_DATA_LEN &&
a4e2b347 10503 !(tp->tg3_flags2 & TG3_FLG2_5780_CLASS))
0f893dc6 10504 tp->tg3_flags |= TG3_FLAG_JUMBO_RING_ENABLE;
1da177e4
LT
10505
10506 /* Determine WakeOnLan speed to use. */
10507 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 ||
10508 tp->pci_chip_rev_id == CHIPREV_ID_5701_A0 ||
10509 tp->pci_chip_rev_id == CHIPREV_ID_5701_B0 ||
10510 tp->pci_chip_rev_id == CHIPREV_ID_5701_B2) {
10511 tp->tg3_flags &= ~(TG3_FLAG_WOL_SPEED_100MB);
10512 } else {
10513 tp->tg3_flags |= TG3_FLAG_WOL_SPEED_100MB;
10514 }
10515
10516 /* A few boards don't want Ethernet@WireSpeed phy feature */
10517 if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700) ||
10518 ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) &&
10519 (tp->pci_chip_rev_id != CHIPREV_ID_5705_A0) &&
747e8f8b
MC
10520 (tp->pci_chip_rev_id != CHIPREV_ID_5705_A1)) ||
10521 (tp->tg3_flags2 & TG3_FLG2_ANY_SERDES))
1da177e4
LT
10522 tp->tg3_flags2 |= TG3_FLG2_NO_ETH_WIRE_SPEED;
10523
10524 if (GET_CHIP_REV(tp->pci_chip_rev_id) == CHIPREV_5703_AX ||
10525 GET_CHIP_REV(tp->pci_chip_rev_id) == CHIPREV_5704_AX)
10526 tp->tg3_flags2 |= TG3_FLG2_PHY_ADC_BUG;
10527 if (tp->pci_chip_rev_id == CHIPREV_ID_5704_A0)
10528 tp->tg3_flags2 |= TG3_FLG2_PHY_5704_A0_BUG;
10529
c424cb24
MC
10530 if (tp->tg3_flags2 & TG3_FLG2_5705_PLUS) {
10531 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 ||
10532 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787)
10533 tp->tg3_flags2 |= TG3_FLG2_PHY_JITTER_BUG;
10534 else
10535 tp->tg3_flags2 |= TG3_FLG2_PHY_BER_BUG;
10536 }
1da177e4 10537
1da177e4 10538 tp->coalesce_mode = 0;
1da177e4
LT
10539 if (GET_CHIP_REV(tp->pci_chip_rev_id) != CHIPREV_5700_AX &&
10540 GET_CHIP_REV(tp->pci_chip_rev_id) != CHIPREV_5700_BX)
10541 tp->coalesce_mode |= HOSTCC_MODE_32BYTE;
10542
10543 /* Initialize MAC MI mode, polling disabled. */
10544 tw32_f(MAC_MI_MODE, tp->mi_mode);
10545 udelay(80);
10546
10547 /* Initialize data/descriptor byte/word swapping. */
10548 val = tr32(GRC_MODE);
10549 val &= GRC_MODE_HOST_STACKUP;
10550 tw32(GRC_MODE, val | tp->grc_mode);
10551
10552 tg3_switch_clocks(tp);
10553
10554 /* Clear this out for sanity. */
10555 tw32(TG3PCI_MEM_WIN_BASE_ADDR, 0);
10556
10557 pci_read_config_dword(tp->pdev, TG3PCI_PCISTATE,
10558 &pci_state_reg);
10559 if ((pci_state_reg & PCISTATE_CONV_PCI_MODE) == 0 &&
10560 (tp->tg3_flags & TG3_FLAG_PCIX_TARGET_HWBUG) == 0) {
10561 u32 chiprevid = GET_CHIP_REV_ID(tp->misc_host_ctrl);
10562
10563 if (chiprevid == CHIPREV_ID_5701_A0 ||
10564 chiprevid == CHIPREV_ID_5701_B0 ||
10565 chiprevid == CHIPREV_ID_5701_B2 ||
10566 chiprevid == CHIPREV_ID_5701_B5) {
10567 void __iomem *sram_base;
10568
10569 /* Write some dummy words into the SRAM status block
10570 * area, see if it reads back correctly. If the return
10571 * value is bad, force enable the PCIX workaround.
10572 */
10573 sram_base = tp->regs + NIC_SRAM_WIN_BASE + NIC_SRAM_STATS_BLK;
10574
10575 writel(0x00000000, sram_base);
10576 writel(0x00000000, sram_base + 4);
10577 writel(0xffffffff, sram_base + 4);
10578 if (readl(sram_base) != 0x00000000)
10579 tp->tg3_flags |= TG3_FLAG_PCIX_TARGET_HWBUG;
10580 }
10581 }
10582
10583 udelay(50);
10584 tg3_nvram_init(tp);
10585
10586 grc_misc_cfg = tr32(GRC_MISC_CFG);
10587 grc_misc_cfg &= GRC_MISC_CFG_BOARD_ID_MASK;
10588
10589 /* Broadcom's driver says that CIOBE multisplit has a bug */
10590#if 0
10591 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704 &&
10592 grc_misc_cfg == GRC_MISC_CFG_BOARD_ID_5704CIOBE) {
10593 tp->tg3_flags |= TG3_FLAG_SPLIT_MODE;
10594 tp->split_mode_max_reqs = SPLIT_MODE_5704_MAX_REQ;
10595 }
10596#endif
10597 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705 &&
10598 (grc_misc_cfg == GRC_MISC_CFG_BOARD_ID_5788 ||
10599 grc_misc_cfg == GRC_MISC_CFG_BOARD_ID_5788M))
10600 tp->tg3_flags2 |= TG3_FLG2_IS_5788;
10601
fac9b83e
DM
10602 if (!(tp->tg3_flags2 & TG3_FLG2_IS_5788) &&
10603 (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5700))
10604 tp->tg3_flags |= TG3_FLAG_TAGGED_STATUS;
10605 if (tp->tg3_flags & TG3_FLAG_TAGGED_STATUS) {
10606 tp->coalesce_mode |= (HOSTCC_MODE_CLRTICK_RXBD |
10607 HOSTCC_MODE_CLRTICK_TXBD);
10608
10609 tp->misc_host_ctrl |= MISC_HOST_CTRL_TAGGED_STATUS;
10610 pci_write_config_dword(tp->pdev, TG3PCI_MISC_HOST_CTRL,
10611 tp->misc_host_ctrl);
10612 }
10613
1da177e4
LT
10614 /* these are limited to 10/100 only */
10615 if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703 &&
10616 (grc_misc_cfg == 0x8000 || grc_misc_cfg == 0x4000)) ||
10617 (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705 &&
10618 tp->pdev->vendor == PCI_VENDOR_ID_BROADCOM &&
10619 (tp->pdev->device == PCI_DEVICE_ID_TIGON3_5901 ||
10620 tp->pdev->device == PCI_DEVICE_ID_TIGON3_5901_2 ||
10621 tp->pdev->device == PCI_DEVICE_ID_TIGON3_5705F)) ||
10622 (tp->pdev->vendor == PCI_VENDOR_ID_BROADCOM &&
10623 (tp->pdev->device == PCI_DEVICE_ID_TIGON3_5751F ||
10624 tp->pdev->device == PCI_DEVICE_ID_TIGON3_5753F)))
10625 tp->tg3_flags |= TG3_FLAG_10_100_ONLY;
10626
10627 err = tg3_phy_probe(tp);
10628 if (err) {
10629 printk(KERN_ERR PFX "(%s) phy probe failed, err %d\n",
10630 pci_name(tp->pdev), err);
10631 /* ... but do not return immediately ... */
10632 }
10633
10634 tg3_read_partno(tp);
c4e6575c 10635 tg3_read_fw_ver(tp);
1da177e4
LT
10636
10637 if (tp->tg3_flags2 & TG3_FLG2_PHY_SERDES) {
10638 tp->tg3_flags &= ~TG3_FLAG_USE_MI_INTERRUPT;
10639 } else {
10640 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700)
10641 tp->tg3_flags |= TG3_FLAG_USE_MI_INTERRUPT;
10642 else
10643 tp->tg3_flags &= ~TG3_FLAG_USE_MI_INTERRUPT;
10644 }
10645
10646 /* 5700 {AX,BX} chips have a broken status block link
10647 * change bit implementation, so we must use the
10648 * status register in those cases.
10649 */
10650 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700)
10651 tp->tg3_flags |= TG3_FLAG_USE_LINKCHG_REG;
10652 else
10653 tp->tg3_flags &= ~TG3_FLAG_USE_LINKCHG_REG;
10654
10655 /* The led_ctrl is set during tg3_phy_probe, here we might
10656 * have to force the link status polling mechanism based
10657 * upon subsystem IDs.
10658 */
10659 if (tp->pdev->subsystem_vendor == PCI_VENDOR_ID_DELL &&
10660 !(tp->tg3_flags2 & TG3_FLG2_PHY_SERDES)) {
10661 tp->tg3_flags |= (TG3_FLAG_USE_MI_INTERRUPT |
10662 TG3_FLAG_USE_LINKCHG_REG);
10663 }
10664
10665 /* For all SERDES we poll the MAC status register. */
10666 if (tp->tg3_flags2 & TG3_FLG2_PHY_SERDES)
10667 tp->tg3_flags |= TG3_FLAG_POLL_SERDES;
10668 else
10669 tp->tg3_flags &= ~TG3_FLAG_POLL_SERDES;
10670
5a6f3074 10671 /* All chips before 5787 can get confused if TX buffers
1da177e4
LT
10672 * straddle the 4GB address boundary in some cases.
10673 */
af36e6b6
MC
10674 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 ||
10675 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787)
5a6f3074
MC
10676 tp->dev->hard_start_xmit = tg3_start_xmit;
10677 else
10678 tp->dev->hard_start_xmit = tg3_start_xmit_dma_bug;
1da177e4
LT
10679
10680 tp->rx_offset = 2;
10681 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701 &&
10682 (tp->tg3_flags & TG3_FLAG_PCIX_MODE) != 0)
10683 tp->rx_offset = 0;
10684
f92905de
MC
10685 tp->rx_std_max_post = TG3_RX_RING_SIZE;
10686
10687 /* Increment the rx prod index on the rx std ring by at most
10688 * 8 for these chips to workaround hw errata.
10689 */
10690 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750 ||
10691 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5752 ||
10692 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755)
10693 tp->rx_std_max_post = 8;
10694
1da177e4
LT
10695 /* By default, disable wake-on-lan. User can change this
10696 * using ETHTOOL_SWOL.
10697 */
10698 tp->tg3_flags &= ~TG3_FLAG_WOL_ENABLE;
10699
10700 return err;
10701}
10702
10703#ifdef CONFIG_SPARC64
10704static int __devinit tg3_get_macaddr_sparc(struct tg3 *tp)
10705{
10706 struct net_device *dev = tp->dev;
10707 struct pci_dev *pdev = tp->pdev;
10708 struct pcidev_cookie *pcp = pdev->sysdata;
10709
10710 if (pcp != NULL) {
de8d28b1
DM
10711 unsigned char *addr;
10712 int len;
1da177e4 10713
de8d28b1
DM
10714 addr = of_get_property(pcp->prom_node, "local-mac-address",
10715 &len);
10716 if (addr && len == 6) {
10717 memcpy(dev->dev_addr, addr, 6);
2ff43697 10718 memcpy(dev->perm_addr, dev->dev_addr, 6);
1da177e4
LT
10719 return 0;
10720 }
10721 }
10722 return -ENODEV;
10723}
10724
10725static int __devinit tg3_get_default_macaddr_sparc(struct tg3 *tp)
10726{
10727 struct net_device *dev = tp->dev;
10728
10729 memcpy(dev->dev_addr, idprom->id_ethaddr, 6);
2ff43697 10730 memcpy(dev->perm_addr, idprom->id_ethaddr, 6);
1da177e4
LT
10731 return 0;
10732}
10733#endif
10734
10735static int __devinit tg3_get_device_address(struct tg3 *tp)
10736{
10737 struct net_device *dev = tp->dev;
10738 u32 hi, lo, mac_offset;
008652b3 10739 int addr_ok = 0;
1da177e4
LT
10740
10741#ifdef CONFIG_SPARC64
10742 if (!tg3_get_macaddr_sparc(tp))
10743 return 0;
10744#endif
10745
10746 mac_offset = 0x7c;
f49639e6 10747 if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704) ||
a4e2b347 10748 (tp->tg3_flags2 & TG3_FLG2_5780_CLASS)) {
1da177e4
LT
10749 if (tr32(TG3PCI_DUAL_MAC_CTRL) & DUAL_MAC_CTRL_ID)
10750 mac_offset = 0xcc;
10751 if (tg3_nvram_lock(tp))
10752 tw32_f(NVRAM_CMD, NVRAM_CMD_RESET);
10753 else
10754 tg3_nvram_unlock(tp);
10755 }
10756
10757 /* First try to get it from MAC address mailbox. */
10758 tg3_read_mem(tp, NIC_SRAM_MAC_ADDR_HIGH_MBOX, &hi);
10759 if ((hi >> 16) == 0x484b) {
10760 dev->dev_addr[0] = (hi >> 8) & 0xff;
10761 dev->dev_addr[1] = (hi >> 0) & 0xff;
10762
10763 tg3_read_mem(tp, NIC_SRAM_MAC_ADDR_LOW_MBOX, &lo);
10764 dev->dev_addr[2] = (lo >> 24) & 0xff;
10765 dev->dev_addr[3] = (lo >> 16) & 0xff;
10766 dev->dev_addr[4] = (lo >> 8) & 0xff;
10767 dev->dev_addr[5] = (lo >> 0) & 0xff;
1da177e4 10768
008652b3
MC
10769 /* Some old bootcode may report a 0 MAC address in SRAM */
10770 addr_ok = is_valid_ether_addr(&dev->dev_addr[0]);
10771 }
10772 if (!addr_ok) {
10773 /* Next, try NVRAM. */
f49639e6 10774 if (!tg3_nvram_read(tp, mac_offset + 0, &hi) &&
008652b3
MC
10775 !tg3_nvram_read(tp, mac_offset + 4, &lo)) {
10776 dev->dev_addr[0] = ((hi >> 16) & 0xff);
10777 dev->dev_addr[1] = ((hi >> 24) & 0xff);
10778 dev->dev_addr[2] = ((lo >> 0) & 0xff);
10779 dev->dev_addr[3] = ((lo >> 8) & 0xff);
10780 dev->dev_addr[4] = ((lo >> 16) & 0xff);
10781 dev->dev_addr[5] = ((lo >> 24) & 0xff);
10782 }
10783 /* Finally just fetch it out of the MAC control regs. */
10784 else {
10785 hi = tr32(MAC_ADDR_0_HIGH);
10786 lo = tr32(MAC_ADDR_0_LOW);
10787
10788 dev->dev_addr[5] = lo & 0xff;
10789 dev->dev_addr[4] = (lo >> 8) & 0xff;
10790 dev->dev_addr[3] = (lo >> 16) & 0xff;
10791 dev->dev_addr[2] = (lo >> 24) & 0xff;
10792 dev->dev_addr[1] = hi & 0xff;
10793 dev->dev_addr[0] = (hi >> 8) & 0xff;
10794 }
1da177e4
LT
10795 }
10796
10797 if (!is_valid_ether_addr(&dev->dev_addr[0])) {
10798#ifdef CONFIG_SPARC64
10799 if (!tg3_get_default_macaddr_sparc(tp))
10800 return 0;
10801#endif
10802 return -EINVAL;
10803 }
2ff43697 10804 memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len);
1da177e4
LT
10805 return 0;
10806}
10807
59e6b434
DM
10808#define BOUNDARY_SINGLE_CACHELINE 1
10809#define BOUNDARY_MULTI_CACHELINE 2
10810
10811static u32 __devinit tg3_calc_dma_bndry(struct tg3 *tp, u32 val)
10812{
10813 int cacheline_size;
10814 u8 byte;
10815 int goal;
10816
10817 pci_read_config_byte(tp->pdev, PCI_CACHE_LINE_SIZE, &byte);
10818 if (byte == 0)
10819 cacheline_size = 1024;
10820 else
10821 cacheline_size = (int) byte * 4;
10822
10823 /* On 5703 and later chips, the boundary bits have no
10824 * effect.
10825 */
10826 if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5700 &&
10827 GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5701 &&
10828 !(tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS))
10829 goto out;
10830
10831#if defined(CONFIG_PPC64) || defined(CONFIG_IA64) || defined(CONFIG_PARISC)
10832 goal = BOUNDARY_MULTI_CACHELINE;
10833#else
10834#if defined(CONFIG_SPARC64) || defined(CONFIG_ALPHA)
10835 goal = BOUNDARY_SINGLE_CACHELINE;
10836#else
10837 goal = 0;
10838#endif
10839#endif
10840
10841 if (!goal)
10842 goto out;
10843
10844 /* PCI controllers on most RISC systems tend to disconnect
10845 * when a device tries to burst across a cache-line boundary.
10846 * Therefore, letting tg3 do so just wastes PCI bandwidth.
10847 *
10848 * Unfortunately, for PCI-E there are only limited
10849 * write-side controls for this, and thus for reads
10850 * we will still get the disconnects. We'll also waste
10851 * these PCI cycles for both read and write for chips
10852 * other than 5700 and 5701 which do not implement the
10853 * boundary bits.
10854 */
10855 if ((tp->tg3_flags & TG3_FLAG_PCIX_MODE) &&
10856 !(tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS)) {
10857 switch (cacheline_size) {
10858 case 16:
10859 case 32:
10860 case 64:
10861 case 128:
10862 if (goal == BOUNDARY_SINGLE_CACHELINE) {
10863 val |= (DMA_RWCTRL_READ_BNDRY_128_PCIX |
10864 DMA_RWCTRL_WRITE_BNDRY_128_PCIX);
10865 } else {
10866 val |= (DMA_RWCTRL_READ_BNDRY_384_PCIX |
10867 DMA_RWCTRL_WRITE_BNDRY_384_PCIX);
10868 }
10869 break;
10870
10871 case 256:
10872 val |= (DMA_RWCTRL_READ_BNDRY_256_PCIX |
10873 DMA_RWCTRL_WRITE_BNDRY_256_PCIX);
10874 break;
10875
10876 default:
10877 val |= (DMA_RWCTRL_READ_BNDRY_384_PCIX |
10878 DMA_RWCTRL_WRITE_BNDRY_384_PCIX);
10879 break;
10880 };
10881 } else if (tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS) {
10882 switch (cacheline_size) {
10883 case 16:
10884 case 32:
10885 case 64:
10886 if (goal == BOUNDARY_SINGLE_CACHELINE) {
10887 val &= ~DMA_RWCTRL_WRITE_BNDRY_DISAB_PCIE;
10888 val |= DMA_RWCTRL_WRITE_BNDRY_64_PCIE;
10889 break;
10890 }
10891 /* fallthrough */
10892 case 128:
10893 default:
10894 val &= ~DMA_RWCTRL_WRITE_BNDRY_DISAB_PCIE;
10895 val |= DMA_RWCTRL_WRITE_BNDRY_128_PCIE;
10896 break;
10897 };
10898 } else {
10899 switch (cacheline_size) {
10900 case 16:
10901 if (goal == BOUNDARY_SINGLE_CACHELINE) {
10902 val |= (DMA_RWCTRL_READ_BNDRY_16 |
10903 DMA_RWCTRL_WRITE_BNDRY_16);
10904 break;
10905 }
10906 /* fallthrough */
10907 case 32:
10908 if (goal == BOUNDARY_SINGLE_CACHELINE) {
10909 val |= (DMA_RWCTRL_READ_BNDRY_32 |
10910 DMA_RWCTRL_WRITE_BNDRY_32);
10911 break;
10912 }
10913 /* fallthrough */
10914 case 64:
10915 if (goal == BOUNDARY_SINGLE_CACHELINE) {
10916 val |= (DMA_RWCTRL_READ_BNDRY_64 |
10917 DMA_RWCTRL_WRITE_BNDRY_64);
10918 break;
10919 }
10920 /* fallthrough */
10921 case 128:
10922 if (goal == BOUNDARY_SINGLE_CACHELINE) {
10923 val |= (DMA_RWCTRL_READ_BNDRY_128 |
10924 DMA_RWCTRL_WRITE_BNDRY_128);
10925 break;
10926 }
10927 /* fallthrough */
10928 case 256:
10929 val |= (DMA_RWCTRL_READ_BNDRY_256 |
10930 DMA_RWCTRL_WRITE_BNDRY_256);
10931 break;
10932 case 512:
10933 val |= (DMA_RWCTRL_READ_BNDRY_512 |
10934 DMA_RWCTRL_WRITE_BNDRY_512);
10935 break;
10936 case 1024:
10937 default:
10938 val |= (DMA_RWCTRL_READ_BNDRY_1024 |
10939 DMA_RWCTRL_WRITE_BNDRY_1024);
10940 break;
10941 };
10942 }
10943
10944out:
10945 return val;
10946}
10947
1da177e4
LT
10948static int __devinit tg3_do_test_dma(struct tg3 *tp, u32 *buf, dma_addr_t buf_dma, int size, int to_device)
10949{
10950 struct tg3_internal_buffer_desc test_desc;
10951 u32 sram_dma_descs;
10952 int i, ret;
10953
10954 sram_dma_descs = NIC_SRAM_DMA_DESC_POOL_BASE;
10955
10956 tw32(FTQ_RCVBD_COMP_FIFO_ENQDEQ, 0);
10957 tw32(FTQ_RCVDATA_COMP_FIFO_ENQDEQ, 0);
10958 tw32(RDMAC_STATUS, 0);
10959 tw32(WDMAC_STATUS, 0);
10960
10961 tw32(BUFMGR_MODE, 0);
10962 tw32(FTQ_RESET, 0);
10963
10964 test_desc.addr_hi = ((u64) buf_dma) >> 32;
10965 test_desc.addr_lo = buf_dma & 0xffffffff;
10966 test_desc.nic_mbuf = 0x00002100;
10967 test_desc.len = size;
10968
10969 /*
10970 * HP ZX1 was seeing test failures for 5701 cards running at 33Mhz
10971 * the *second* time the tg3 driver was getting loaded after an
10972 * initial scan.
10973 *
10974 * Broadcom tells me:
10975 * ...the DMA engine is connected to the GRC block and a DMA
10976 * reset may affect the GRC block in some unpredictable way...
10977 * The behavior of resets to individual blocks has not been tested.
10978 *
10979 * Broadcom noted the GRC reset will also reset all sub-components.
10980 */
10981 if (to_device) {
10982 test_desc.cqid_sqid = (13 << 8) | 2;
10983
10984 tw32_f(RDMAC_MODE, RDMAC_MODE_ENABLE);
10985 udelay(40);
10986 } else {
10987 test_desc.cqid_sqid = (16 << 8) | 7;
10988
10989 tw32_f(WDMAC_MODE, WDMAC_MODE_ENABLE);
10990 udelay(40);
10991 }
10992 test_desc.flags = 0x00000005;
10993
10994 for (i = 0; i < (sizeof(test_desc) / sizeof(u32)); i++) {
10995 u32 val;
10996
10997 val = *(((u32 *)&test_desc) + i);
10998 pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_BASE_ADDR,
10999 sram_dma_descs + (i * sizeof(u32)));
11000 pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_DATA, val);
11001 }
11002 pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_BASE_ADDR, 0);
11003
11004 if (to_device) {
11005 tw32(FTQ_DMA_HIGH_READ_FIFO_ENQDEQ, sram_dma_descs);
11006 } else {
11007 tw32(FTQ_DMA_HIGH_WRITE_FIFO_ENQDEQ, sram_dma_descs);
11008 }
11009
11010 ret = -ENODEV;
11011 for (i = 0; i < 40; i++) {
11012 u32 val;
11013
11014 if (to_device)
11015 val = tr32(FTQ_RCVBD_COMP_FIFO_ENQDEQ);
11016 else
11017 val = tr32(FTQ_RCVDATA_COMP_FIFO_ENQDEQ);
11018 if ((val & 0xffff) == sram_dma_descs) {
11019 ret = 0;
11020 break;
11021 }
11022
11023 udelay(100);
11024 }
11025
11026 return ret;
11027}
11028
ded7340d 11029#define TEST_BUFFER_SIZE 0x2000
1da177e4
LT
11030
11031static int __devinit tg3_test_dma(struct tg3 *tp)
11032{
11033 dma_addr_t buf_dma;
59e6b434 11034 u32 *buf, saved_dma_rwctrl;
1da177e4
LT
11035 int ret;
11036
11037 buf = pci_alloc_consistent(tp->pdev, TEST_BUFFER_SIZE, &buf_dma);
11038 if (!buf) {
11039 ret = -ENOMEM;
11040 goto out_nofree;
11041 }
11042
11043 tp->dma_rwctrl = ((0x7 << DMA_RWCTRL_PCI_WRITE_CMD_SHIFT) |
11044 (0x6 << DMA_RWCTRL_PCI_READ_CMD_SHIFT));
11045
59e6b434 11046 tp->dma_rwctrl = tg3_calc_dma_bndry(tp, tp->dma_rwctrl);
1da177e4
LT
11047
11048 if (tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS) {
11049 /* DMA read watermark not used on PCIE */
11050 tp->dma_rwctrl |= 0x00180000;
11051 } else if (!(tp->tg3_flags & TG3_FLAG_PCIX_MODE)) {
85e94ced
MC
11052 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705 ||
11053 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750)
1da177e4
LT
11054 tp->dma_rwctrl |= 0x003f0000;
11055 else
11056 tp->dma_rwctrl |= 0x003f000f;
11057 } else {
11058 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703 ||
11059 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704) {
11060 u32 ccval = (tr32(TG3PCI_CLOCK_CTRL) & 0x1f);
11061
4a29cc2e
MC
11062 /* If the 5704 is behind the EPB bridge, we can
11063 * do the less restrictive ONE_DMA workaround for
11064 * better performance.
11065 */
11066 if ((tp->tg3_flags & TG3_FLAG_40BIT_DMA_BUG) &&
11067 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704)
11068 tp->dma_rwctrl |= 0x8000;
11069 else if (ccval == 0x6 || ccval == 0x7)
1da177e4
LT
11070 tp->dma_rwctrl |= DMA_RWCTRL_ONE_DMA;
11071
59e6b434 11072 /* Set bit 23 to enable PCIX hw bug fix */
1da177e4 11073 tp->dma_rwctrl |= 0x009f0000;
4cf78e4f
MC
11074 } else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5780) {
11075 /* 5780 always in PCIX mode */
11076 tp->dma_rwctrl |= 0x00144000;
a4e2b347
MC
11077 } else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5714) {
11078 /* 5714 always in PCIX mode */
11079 tp->dma_rwctrl |= 0x00148000;
1da177e4
LT
11080 } else {
11081 tp->dma_rwctrl |= 0x001b000f;
11082 }
11083 }
11084
11085 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703 ||
11086 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704)
11087 tp->dma_rwctrl &= 0xfffffff0;
11088
11089 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 ||
11090 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701) {
11091 /* Remove this if it causes problems for some boards. */
11092 tp->dma_rwctrl |= DMA_RWCTRL_USE_MEM_READ_MULT;
11093
11094 /* On 5700/5701 chips, we need to set this bit.
11095 * Otherwise the chip will issue cacheline transactions
11096 * to streamable DMA memory with not all the byte
11097 * enables turned on. This is an error on several
11098 * RISC PCI controllers, in particular sparc64.
11099 *
11100 * On 5703/5704 chips, this bit has been reassigned
11101 * a different meaning. In particular, it is used
11102 * on those chips to enable a PCI-X workaround.
11103 */
11104 tp->dma_rwctrl |= DMA_RWCTRL_ASSERT_ALL_BE;
11105 }
11106
11107 tw32(TG3PCI_DMA_RW_CTRL, tp->dma_rwctrl);
11108
11109#if 0
11110 /* Unneeded, already done by tg3_get_invariants. */
11111 tg3_switch_clocks(tp);
11112#endif
11113
11114 ret = 0;
11115 if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5700 &&
11116 GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5701)
11117 goto out;
11118
59e6b434
DM
11119 /* It is best to perform DMA test with maximum write burst size
11120 * to expose the 5700/5701 write DMA bug.
11121 */
11122 saved_dma_rwctrl = tp->dma_rwctrl;
11123 tp->dma_rwctrl &= ~DMA_RWCTRL_WRITE_BNDRY_MASK;
11124 tw32(TG3PCI_DMA_RW_CTRL, tp->dma_rwctrl);
11125
1da177e4
LT
11126 while (1) {
11127 u32 *p = buf, i;
11128
11129 for (i = 0; i < TEST_BUFFER_SIZE / sizeof(u32); i++)
11130 p[i] = i;
11131
11132 /* Send the buffer to the chip. */
11133 ret = tg3_do_test_dma(tp, buf, buf_dma, TEST_BUFFER_SIZE, 1);
11134 if (ret) {
11135 printk(KERN_ERR "tg3_test_dma() Write the buffer failed %d\n", ret);
11136 break;
11137 }
11138
11139#if 0
11140 /* validate data reached card RAM correctly. */
11141 for (i = 0; i < TEST_BUFFER_SIZE / sizeof(u32); i++) {
11142 u32 val;
11143 tg3_read_mem(tp, 0x2100 + (i*4), &val);
11144 if (le32_to_cpu(val) != p[i]) {
11145 printk(KERN_ERR " tg3_test_dma() Card buffer corrupted on write! (%d != %d)\n", val, i);
11146 /* ret = -ENODEV here? */
11147 }
11148 p[i] = 0;
11149 }
11150#endif
11151 /* Now read it back. */
11152 ret = tg3_do_test_dma(tp, buf, buf_dma, TEST_BUFFER_SIZE, 0);
11153 if (ret) {
11154 printk(KERN_ERR "tg3_test_dma() Read the buffer failed %d\n", ret);
11155
11156 break;
11157 }
11158
11159 /* Verify it. */
11160 for (i = 0; i < TEST_BUFFER_SIZE / sizeof(u32); i++) {
11161 if (p[i] == i)
11162 continue;
11163
59e6b434
DM
11164 if ((tp->dma_rwctrl & DMA_RWCTRL_WRITE_BNDRY_MASK) !=
11165 DMA_RWCTRL_WRITE_BNDRY_16) {
11166 tp->dma_rwctrl &= ~DMA_RWCTRL_WRITE_BNDRY_MASK;
1da177e4
LT
11167 tp->dma_rwctrl |= DMA_RWCTRL_WRITE_BNDRY_16;
11168 tw32(TG3PCI_DMA_RW_CTRL, tp->dma_rwctrl);
11169 break;
11170 } else {
11171 printk(KERN_ERR "tg3_test_dma() buffer corrupted on read back! (%d != %d)\n", p[i], i);
11172 ret = -ENODEV;
11173 goto out;
11174 }
11175 }
11176
11177 if (i == (TEST_BUFFER_SIZE / sizeof(u32))) {
11178 /* Success. */
11179 ret = 0;
11180 break;
11181 }
11182 }
59e6b434
DM
11183 if ((tp->dma_rwctrl & DMA_RWCTRL_WRITE_BNDRY_MASK) !=
11184 DMA_RWCTRL_WRITE_BNDRY_16) {
6d1cfbab
MC
11185 static struct pci_device_id dma_wait_state_chipsets[] = {
11186 { PCI_DEVICE(PCI_VENDOR_ID_APPLE,
11187 PCI_DEVICE_ID_APPLE_UNI_N_PCI15) },
11188 { },
11189 };
11190
59e6b434 11191 /* DMA test passed without adjusting DMA boundary,
6d1cfbab
MC
11192 * now look for chipsets that are known to expose the
11193 * DMA bug without failing the test.
59e6b434 11194 */
6d1cfbab
MC
11195 if (pci_dev_present(dma_wait_state_chipsets)) {
11196 tp->dma_rwctrl &= ~DMA_RWCTRL_WRITE_BNDRY_MASK;
11197 tp->dma_rwctrl |= DMA_RWCTRL_WRITE_BNDRY_16;
11198 }
11199 else
11200 /* Safe to use the calculated DMA boundary. */
11201 tp->dma_rwctrl = saved_dma_rwctrl;
11202
59e6b434
DM
11203 tw32(TG3PCI_DMA_RW_CTRL, tp->dma_rwctrl);
11204 }
1da177e4
LT
11205
11206out:
11207 pci_free_consistent(tp->pdev, TEST_BUFFER_SIZE, buf, buf_dma);
11208out_nofree:
11209 return ret;
11210}
11211
11212static void __devinit tg3_init_link_config(struct tg3 *tp)
11213{
11214 tp->link_config.advertising =
11215 (ADVERTISED_10baseT_Half | ADVERTISED_10baseT_Full |
11216 ADVERTISED_100baseT_Half | ADVERTISED_100baseT_Full |
11217 ADVERTISED_1000baseT_Half | ADVERTISED_1000baseT_Full |
11218 ADVERTISED_Autoneg | ADVERTISED_MII);
11219 tp->link_config.speed = SPEED_INVALID;
11220 tp->link_config.duplex = DUPLEX_INVALID;
11221 tp->link_config.autoneg = AUTONEG_ENABLE;
1da177e4
LT
11222 tp->link_config.active_speed = SPEED_INVALID;
11223 tp->link_config.active_duplex = DUPLEX_INVALID;
11224 tp->link_config.phy_is_low_power = 0;
11225 tp->link_config.orig_speed = SPEED_INVALID;
11226 tp->link_config.orig_duplex = DUPLEX_INVALID;
11227 tp->link_config.orig_autoneg = AUTONEG_INVALID;
11228}
11229
11230static void __devinit tg3_init_bufmgr_config(struct tg3 *tp)
11231{
fdfec172
MC
11232 if (tp->tg3_flags2 & TG3_FLG2_5705_PLUS) {
11233 tp->bufmgr_config.mbuf_read_dma_low_water =
11234 DEFAULT_MB_RDMA_LOW_WATER_5705;
11235 tp->bufmgr_config.mbuf_mac_rx_low_water =
11236 DEFAULT_MB_MACRX_LOW_WATER_5705;
11237 tp->bufmgr_config.mbuf_high_water =
11238 DEFAULT_MB_HIGH_WATER_5705;
11239
11240 tp->bufmgr_config.mbuf_read_dma_low_water_jumbo =
11241 DEFAULT_MB_RDMA_LOW_WATER_JUMBO_5780;
11242 tp->bufmgr_config.mbuf_mac_rx_low_water_jumbo =
11243 DEFAULT_MB_MACRX_LOW_WATER_JUMBO_5780;
11244 tp->bufmgr_config.mbuf_high_water_jumbo =
11245 DEFAULT_MB_HIGH_WATER_JUMBO_5780;
11246 } else {
11247 tp->bufmgr_config.mbuf_read_dma_low_water =
11248 DEFAULT_MB_RDMA_LOW_WATER;
11249 tp->bufmgr_config.mbuf_mac_rx_low_water =
11250 DEFAULT_MB_MACRX_LOW_WATER;
11251 tp->bufmgr_config.mbuf_high_water =
11252 DEFAULT_MB_HIGH_WATER;
11253
11254 tp->bufmgr_config.mbuf_read_dma_low_water_jumbo =
11255 DEFAULT_MB_RDMA_LOW_WATER_JUMBO;
11256 tp->bufmgr_config.mbuf_mac_rx_low_water_jumbo =
11257 DEFAULT_MB_MACRX_LOW_WATER_JUMBO;
11258 tp->bufmgr_config.mbuf_high_water_jumbo =
11259 DEFAULT_MB_HIGH_WATER_JUMBO;
11260 }
1da177e4
LT
11261
11262 tp->bufmgr_config.dma_low_water = DEFAULT_DMA_LOW_WATER;
11263 tp->bufmgr_config.dma_high_water = DEFAULT_DMA_HIGH_WATER;
11264}
11265
11266static char * __devinit tg3_phy_string(struct tg3 *tp)
11267{
11268 switch (tp->phy_id & PHY_ID_MASK) {
11269 case PHY_ID_BCM5400: return "5400";
11270 case PHY_ID_BCM5401: return "5401";
11271 case PHY_ID_BCM5411: return "5411";
11272 case PHY_ID_BCM5701: return "5701";
11273 case PHY_ID_BCM5703: return "5703";
11274 case PHY_ID_BCM5704: return "5704";
11275 case PHY_ID_BCM5705: return "5705";
11276 case PHY_ID_BCM5750: return "5750";
85e94ced 11277 case PHY_ID_BCM5752: return "5752";
a4e2b347 11278 case PHY_ID_BCM5714: return "5714";
4cf78e4f 11279 case PHY_ID_BCM5780: return "5780";
af36e6b6 11280 case PHY_ID_BCM5755: return "5755";
d9ab5ad1 11281 case PHY_ID_BCM5787: return "5787";
1da177e4
LT
11282 case PHY_ID_BCM8002: return "8002/serdes";
11283 case 0: return "serdes";
11284 default: return "unknown";
11285 };
11286}
11287
f9804ddb
MC
11288static char * __devinit tg3_bus_string(struct tg3 *tp, char *str)
11289{
11290 if (tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS) {
11291 strcpy(str, "PCI Express");
11292 return str;
11293 } else if (tp->tg3_flags & TG3_FLAG_PCIX_MODE) {
11294 u32 clock_ctrl = tr32(TG3PCI_CLOCK_CTRL) & 0x1f;
11295
11296 strcpy(str, "PCIX:");
11297
11298 if ((clock_ctrl == 7) ||
11299 ((tr32(GRC_MISC_CFG) & GRC_MISC_CFG_BOARD_ID_MASK) ==
11300 GRC_MISC_CFG_BOARD_ID_5704CIOBE))
11301 strcat(str, "133MHz");
11302 else if (clock_ctrl == 0)
11303 strcat(str, "33MHz");
11304 else if (clock_ctrl == 2)
11305 strcat(str, "50MHz");
11306 else if (clock_ctrl == 4)
11307 strcat(str, "66MHz");
11308 else if (clock_ctrl == 6)
11309 strcat(str, "100MHz");
f9804ddb
MC
11310 } else {
11311 strcpy(str, "PCI:");
11312 if (tp->tg3_flags & TG3_FLAG_PCI_HIGH_SPEED)
11313 strcat(str, "66MHz");
11314 else
11315 strcat(str, "33MHz");
11316 }
11317 if (tp->tg3_flags & TG3_FLAG_PCI_32BIT)
11318 strcat(str, ":32-bit");
11319 else
11320 strcat(str, ":64-bit");
11321 return str;
11322}
11323
8c2dc7e1 11324static struct pci_dev * __devinit tg3_find_peer(struct tg3 *tp)
1da177e4
LT
11325{
11326 struct pci_dev *peer;
11327 unsigned int func, devnr = tp->pdev->devfn & ~7;
11328
11329 for (func = 0; func < 8; func++) {
11330 peer = pci_get_slot(tp->pdev->bus, devnr | func);
11331 if (peer && peer != tp->pdev)
11332 break;
11333 pci_dev_put(peer);
11334 }
16fe9d74
MC
11335 /* 5704 can be configured in single-port mode, set peer to
11336 * tp->pdev in that case.
11337 */
11338 if (!peer) {
11339 peer = tp->pdev;
11340 return peer;
11341 }
1da177e4
LT
11342
11343 /*
11344 * We don't need to keep the refcount elevated; there's no way
11345 * to remove one half of this device without removing the other
11346 */
11347 pci_dev_put(peer);
11348
11349 return peer;
11350}
11351
15f9850d
DM
11352static void __devinit tg3_init_coal(struct tg3 *tp)
11353{
11354 struct ethtool_coalesce *ec = &tp->coal;
11355
11356 memset(ec, 0, sizeof(*ec));
11357 ec->cmd = ETHTOOL_GCOALESCE;
11358 ec->rx_coalesce_usecs = LOW_RXCOL_TICKS;
11359 ec->tx_coalesce_usecs = LOW_TXCOL_TICKS;
11360 ec->rx_max_coalesced_frames = LOW_RXMAX_FRAMES;
11361 ec->tx_max_coalesced_frames = LOW_TXMAX_FRAMES;
11362 ec->rx_coalesce_usecs_irq = DEFAULT_RXCOAL_TICK_INT;
11363 ec->tx_coalesce_usecs_irq = DEFAULT_TXCOAL_TICK_INT;
11364 ec->rx_max_coalesced_frames_irq = DEFAULT_RXCOAL_MAXF_INT;
11365 ec->tx_max_coalesced_frames_irq = DEFAULT_TXCOAL_MAXF_INT;
11366 ec->stats_block_coalesce_usecs = DEFAULT_STAT_COAL_TICKS;
11367
11368 if (tp->coalesce_mode & (HOSTCC_MODE_CLRTICK_RXBD |
11369 HOSTCC_MODE_CLRTICK_TXBD)) {
11370 ec->rx_coalesce_usecs = LOW_RXCOL_TICKS_CLRTCKS;
11371 ec->rx_coalesce_usecs_irq = DEFAULT_RXCOAL_TICK_INT_CLRTCKS;
11372 ec->tx_coalesce_usecs = LOW_TXCOL_TICKS_CLRTCKS;
11373 ec->tx_coalesce_usecs_irq = DEFAULT_TXCOAL_TICK_INT_CLRTCKS;
11374 }
d244c892
MC
11375
11376 if (tp->tg3_flags2 & TG3_FLG2_5705_PLUS) {
11377 ec->rx_coalesce_usecs_irq = 0;
11378 ec->tx_coalesce_usecs_irq = 0;
11379 ec->stats_block_coalesce_usecs = 0;
11380 }
15f9850d
DM
11381}
11382
1da177e4
LT
11383static int __devinit tg3_init_one(struct pci_dev *pdev,
11384 const struct pci_device_id *ent)
11385{
11386 static int tg3_version_printed = 0;
11387 unsigned long tg3reg_base, tg3reg_len;
11388 struct net_device *dev;
11389 struct tg3 *tp;
72f2afb8 11390 int i, err, pm_cap;
f9804ddb 11391 char str[40];
72f2afb8 11392 u64 dma_mask, persist_dma_mask;
1da177e4
LT
11393
11394 if (tg3_version_printed++ == 0)
11395 printk(KERN_INFO "%s", version);
11396
11397 err = pci_enable_device(pdev);
11398 if (err) {
11399 printk(KERN_ERR PFX "Cannot enable PCI device, "
11400 "aborting.\n");
11401 return err;
11402 }
11403
11404 if (!(pci_resource_flags(pdev, 0) & IORESOURCE_MEM)) {
11405 printk(KERN_ERR PFX "Cannot find proper PCI device "
11406 "base address, aborting.\n");
11407 err = -ENODEV;
11408 goto err_out_disable_pdev;
11409 }
11410
11411 err = pci_request_regions(pdev, DRV_MODULE_NAME);
11412 if (err) {
11413 printk(KERN_ERR PFX "Cannot obtain PCI resources, "
11414 "aborting.\n");
11415 goto err_out_disable_pdev;
11416 }
11417
11418 pci_set_master(pdev);
11419
11420 /* Find power-management capability. */
11421 pm_cap = pci_find_capability(pdev, PCI_CAP_ID_PM);
11422 if (pm_cap == 0) {
11423 printk(KERN_ERR PFX "Cannot find PowerManagement capability, "
11424 "aborting.\n");
11425 err = -EIO;
11426 goto err_out_free_res;
11427 }
11428
1da177e4
LT
11429 tg3reg_base = pci_resource_start(pdev, 0);
11430 tg3reg_len = pci_resource_len(pdev, 0);
11431
11432 dev = alloc_etherdev(sizeof(*tp));
11433 if (!dev) {
11434 printk(KERN_ERR PFX "Etherdev alloc failed, aborting.\n");
11435 err = -ENOMEM;
11436 goto err_out_free_res;
11437 }
11438
11439 SET_MODULE_OWNER(dev);
11440 SET_NETDEV_DEV(dev, &pdev->dev);
11441
1da177e4
LT
11442#if TG3_VLAN_TAG_USED
11443 dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
11444 dev->vlan_rx_register = tg3_vlan_rx_register;
11445 dev->vlan_rx_kill_vid = tg3_vlan_rx_kill_vid;
11446#endif
11447
11448 tp = netdev_priv(dev);
11449 tp->pdev = pdev;
11450 tp->dev = dev;
11451 tp->pm_cap = pm_cap;
11452 tp->mac_mode = TG3_DEF_MAC_MODE;
11453 tp->rx_mode = TG3_DEF_RX_MODE;
11454 tp->tx_mode = TG3_DEF_TX_MODE;
11455 tp->mi_mode = MAC_MI_MODE_BASE;
11456 if (tg3_debug > 0)
11457 tp->msg_enable = tg3_debug;
11458 else
11459 tp->msg_enable = TG3_DEF_MSG_ENABLE;
11460
11461 /* The word/byte swap controls here control register access byte
11462 * swapping. DMA data byte swapping is controlled in the GRC_MODE
11463 * setting below.
11464 */
11465 tp->misc_host_ctrl =
11466 MISC_HOST_CTRL_MASK_PCI_INT |
11467 MISC_HOST_CTRL_WORD_SWAP |
11468 MISC_HOST_CTRL_INDIR_ACCESS |
11469 MISC_HOST_CTRL_PCISTATE_RW;
11470
11471 /* The NONFRM (non-frame) byte/word swap controls take effect
11472 * on descriptor entries, anything which isn't packet data.
11473 *
11474 * The StrongARM chips on the board (one for tx, one for rx)
11475 * are running in big-endian mode.
11476 */
11477 tp->grc_mode = (GRC_MODE_WSWAP_DATA | GRC_MODE_BSWAP_DATA |
11478 GRC_MODE_WSWAP_NONFRM_DATA);
11479#ifdef __BIG_ENDIAN
11480 tp->grc_mode |= GRC_MODE_BSWAP_NONFRM_DATA;
11481#endif
11482 spin_lock_init(&tp->lock);
1da177e4
LT
11483 spin_lock_init(&tp->indirect_lock);
11484 INIT_WORK(&tp->reset_task, tg3_reset_task, tp);
11485
11486 tp->regs = ioremap_nocache(tg3reg_base, tg3reg_len);
11487 if (tp->regs == 0UL) {
11488 printk(KERN_ERR PFX "Cannot map device registers, "
11489 "aborting.\n");
11490 err = -ENOMEM;
11491 goto err_out_free_dev;
11492 }
11493
11494 tg3_init_link_config(tp);
11495
1da177e4
LT
11496 tp->rx_pending = TG3_DEF_RX_RING_PENDING;
11497 tp->rx_jumbo_pending = TG3_DEF_RX_JUMBO_RING_PENDING;
11498 tp->tx_pending = TG3_DEF_TX_RING_PENDING;
11499
11500 dev->open = tg3_open;
11501 dev->stop = tg3_close;
11502 dev->get_stats = tg3_get_stats;
11503 dev->set_multicast_list = tg3_set_rx_mode;
11504 dev->set_mac_address = tg3_set_mac_addr;
11505 dev->do_ioctl = tg3_ioctl;
11506 dev->tx_timeout = tg3_tx_timeout;
11507 dev->poll = tg3_poll;
11508 dev->ethtool_ops = &tg3_ethtool_ops;
11509 dev->weight = 64;
11510 dev->watchdog_timeo = TG3_TX_TIMEOUT;
11511 dev->change_mtu = tg3_change_mtu;
11512 dev->irq = pdev->irq;
11513#ifdef CONFIG_NET_POLL_CONTROLLER
11514 dev->poll_controller = tg3_poll_controller;
11515#endif
11516
11517 err = tg3_get_invariants(tp);
11518 if (err) {
11519 printk(KERN_ERR PFX "Problem fetching invariants of chip, "
11520 "aborting.\n");
11521 goto err_out_iounmap;
11522 }
11523
4a29cc2e
MC
11524 /* The EPB bridge inside 5714, 5715, and 5780 and any
11525 * device behind the EPB cannot support DMA addresses > 40-bit.
72f2afb8
MC
11526 * On 64-bit systems with IOMMU, use 40-bit dma_mask.
11527 * On 64-bit systems without IOMMU, use 64-bit dma_mask and
11528 * do DMA address check in tg3_start_xmit().
11529 */
4a29cc2e
MC
11530 if (tp->tg3_flags2 & TG3_FLG2_IS_5788)
11531 persist_dma_mask = dma_mask = DMA_32BIT_MASK;
11532 else if (tp->tg3_flags & TG3_FLAG_40BIT_DMA_BUG) {
72f2afb8
MC
11533 persist_dma_mask = dma_mask = DMA_40BIT_MASK;
11534#ifdef CONFIG_HIGHMEM
11535 dma_mask = DMA_64BIT_MASK;
11536#endif
4a29cc2e 11537 } else
72f2afb8
MC
11538 persist_dma_mask = dma_mask = DMA_64BIT_MASK;
11539
11540 /* Configure DMA attributes. */
11541 if (dma_mask > DMA_32BIT_MASK) {
11542 err = pci_set_dma_mask(pdev, dma_mask);
11543 if (!err) {
11544 dev->features |= NETIF_F_HIGHDMA;
11545 err = pci_set_consistent_dma_mask(pdev,
11546 persist_dma_mask);
11547 if (err < 0) {
11548 printk(KERN_ERR PFX "Unable to obtain 64 bit "
11549 "DMA for consistent allocations\n");
11550 goto err_out_iounmap;
11551 }
11552 }
11553 }
11554 if (err || dma_mask == DMA_32BIT_MASK) {
11555 err = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
11556 if (err) {
11557 printk(KERN_ERR PFX "No usable DMA configuration, "
11558 "aborting.\n");
11559 goto err_out_iounmap;
11560 }
11561 }
11562
fdfec172 11563 tg3_init_bufmgr_config(tp);
1da177e4
LT
11564
11565#if TG3_TSO_SUPPORT != 0
11566 if (tp->tg3_flags2 & TG3_FLG2_HW_TSO) {
11567 tp->tg3_flags2 |= TG3_FLG2_TSO_CAPABLE;
11568 }
11569 else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 ||
11570 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701 ||
11571 tp->pci_chip_rev_id == CHIPREV_ID_5705_A0 ||
11572 (tp->tg3_flags & TG3_FLAG_ENABLE_ASF) != 0) {
11573 tp->tg3_flags2 &= ~TG3_FLG2_TSO_CAPABLE;
11574 } else {
11575 tp->tg3_flags2 |= TG3_FLG2_TSO_CAPABLE;
11576 }
11577
4e3a7aaa
MC
11578 /* TSO is on by default on chips that support hardware TSO.
11579 * Firmware TSO on older chips gives lower performance, so it
11580 * is off by default, but can be enabled using ethtool.
11581 */
b0026624 11582 if (tp->tg3_flags2 & TG3_FLG2_HW_TSO) {
1da177e4 11583 dev->features |= NETIF_F_TSO;
b0026624
MC
11584 if (tp->tg3_flags2 & TG3_FLG2_HW_TSO_2)
11585 dev->features |= NETIF_F_TSO6;
11586 }
1da177e4
LT
11587
11588#endif
11589
11590 if (tp->pci_chip_rev_id == CHIPREV_ID_5705_A1 &&
11591 !(tp->tg3_flags2 & TG3_FLG2_TSO_CAPABLE) &&
11592 !(tr32(TG3PCI_PCISTATE) & PCISTATE_BUS_SPEED_HIGH)) {
11593 tp->tg3_flags2 |= TG3_FLG2_MAX_RXPEND_64;
11594 tp->rx_pending = 63;
11595 }
11596
8c2dc7e1
MC
11597 if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704) ||
11598 (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5714))
11599 tp->pdev_peer = tg3_find_peer(tp);
1da177e4
LT
11600
11601 err = tg3_get_device_address(tp);
11602 if (err) {
11603 printk(KERN_ERR PFX "Could not obtain valid ethernet address, "
11604 "aborting.\n");
11605 goto err_out_iounmap;
11606 }
11607
11608 /*
11609 * Reset chip in case UNDI or EFI driver did not shutdown
11610 * DMA self test will enable WDMAC and we'll see (spurious)
11611 * pending DMA on the PCI bus at that point.
11612 */
11613 if ((tr32(HOSTCC_MODE) & HOSTCC_MODE_ENABLE) ||
11614 (tr32(WDMAC_MODE) & WDMAC_MODE_ENABLE)) {
11615 pci_save_state(tp->pdev);
11616 tw32(MEMARB_MODE, MEMARB_MODE_ENABLE);
944d980e 11617 tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
1da177e4
LT
11618 }
11619
11620 err = tg3_test_dma(tp);
11621 if (err) {
11622 printk(KERN_ERR PFX "DMA engine test failed, aborting.\n");
11623 goto err_out_iounmap;
11624 }
11625
11626 /* Tigon3 can do ipv4 only... and some chips have buggy
11627 * checksumming.
11628 */
11629 if ((tp->tg3_flags & TG3_FLAG_BROKEN_CHECKSUMS) == 0) {
af36e6b6
MC
11630 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 ||
11631 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787)
9c27dbdf
MC
11632 dev->features |= NETIF_F_HW_CSUM;
11633 else
11634 dev->features |= NETIF_F_IP_CSUM;
11635 dev->features |= NETIF_F_SG;
1da177e4
LT
11636 tp->tg3_flags |= TG3_FLAG_RX_CHECKSUMS;
11637 } else
11638 tp->tg3_flags &= ~TG3_FLAG_RX_CHECKSUMS;
11639
1da177e4
LT
11640 /* flow control autonegotiation is default behavior */
11641 tp->tg3_flags |= TG3_FLAG_PAUSE_AUTONEG;
11642
15f9850d
DM
11643 tg3_init_coal(tp);
11644
7d3f4c97
DM
11645 /* Now that we have fully setup the chip, save away a snapshot
11646 * of the PCI config space. We need to restore this after
11647 * GRC_MISC_CFG core clock resets and some resume events.
11648 */
11649 pci_save_state(tp->pdev);
11650
1da177e4
LT
11651 err = register_netdev(dev);
11652 if (err) {
11653 printk(KERN_ERR PFX "Cannot register net device, "
11654 "aborting.\n");
11655 goto err_out_iounmap;
11656 }
11657
11658 pci_set_drvdata(pdev, dev);
11659
f9804ddb 11660 printk(KERN_INFO "%s: Tigon3 [partno(%s) rev %04x PHY(%s)] (%s) %sBaseT Ethernet ",
1da177e4
LT
11661 dev->name,
11662 tp->board_part_number,
11663 tp->pci_chip_rev_id,
11664 tg3_phy_string(tp),
f9804ddb 11665 tg3_bus_string(tp, str),
1da177e4
LT
11666 (tp->tg3_flags & TG3_FLAG_10_100_ONLY) ? "10/100" : "10/100/1000");
11667
11668 for (i = 0; i < 6; i++)
11669 printk("%2.2x%c", dev->dev_addr[i],
11670 i == 5 ? '\n' : ':');
11671
11672 printk(KERN_INFO "%s: RXcsums[%d] LinkChgREG[%d] "
11673 "MIirq[%d] ASF[%d] Split[%d] WireSpeed[%d] "
11674 "TSOcap[%d] \n",
11675 dev->name,
11676 (tp->tg3_flags & TG3_FLAG_RX_CHECKSUMS) != 0,
11677 (tp->tg3_flags & TG3_FLAG_USE_LINKCHG_REG) != 0,
11678 (tp->tg3_flags & TG3_FLAG_USE_MI_INTERRUPT) != 0,
11679 (tp->tg3_flags & TG3_FLAG_ENABLE_ASF) != 0,
11680 (tp->tg3_flags & TG3_FLAG_SPLIT_MODE) != 0,
11681 (tp->tg3_flags2 & TG3_FLG2_NO_ETH_WIRE_SPEED) == 0,
11682 (tp->tg3_flags2 & TG3_FLG2_TSO_CAPABLE) != 0);
4a29cc2e
MC
11683 printk(KERN_INFO "%s: dma_rwctrl[%08x] dma_mask[%d-bit]\n",
11684 dev->name, tp->dma_rwctrl,
11685 (pdev->dma_mask == DMA_32BIT_MASK) ? 32 :
11686 (((u64) pdev->dma_mask == DMA_40BIT_MASK) ? 40 : 64));
1da177e4 11687
59f1741e
JM
11688 netif_carrier_off(tp->dev);
11689
1da177e4
LT
11690 return 0;
11691
11692err_out_iounmap:
6892914f
MC
11693 if (tp->regs) {
11694 iounmap(tp->regs);
22abe310 11695 tp->regs = NULL;
6892914f 11696 }
1da177e4
LT
11697
11698err_out_free_dev:
11699 free_netdev(dev);
11700
11701err_out_free_res:
11702 pci_release_regions(pdev);
11703
11704err_out_disable_pdev:
11705 pci_disable_device(pdev);
11706 pci_set_drvdata(pdev, NULL);
11707 return err;
11708}
11709
11710static void __devexit tg3_remove_one(struct pci_dev *pdev)
11711{
11712 struct net_device *dev = pci_get_drvdata(pdev);
11713
11714 if (dev) {
11715 struct tg3 *tp = netdev_priv(dev);
11716
7faa006f 11717 flush_scheduled_work();
1da177e4 11718 unregister_netdev(dev);
6892914f
MC
11719 if (tp->regs) {
11720 iounmap(tp->regs);
22abe310 11721 tp->regs = NULL;
6892914f 11722 }
1da177e4
LT
11723 free_netdev(dev);
11724 pci_release_regions(pdev);
11725 pci_disable_device(pdev);
11726 pci_set_drvdata(pdev, NULL);
11727 }
11728}
11729
11730static int tg3_suspend(struct pci_dev *pdev, pm_message_t state)
11731{
11732 struct net_device *dev = pci_get_drvdata(pdev);
11733 struct tg3 *tp = netdev_priv(dev);
11734 int err;
11735
11736 if (!netif_running(dev))
11737 return 0;
11738
7faa006f 11739 flush_scheduled_work();
1da177e4
LT
11740 tg3_netif_stop(tp);
11741
11742 del_timer_sync(&tp->timer);
11743
f47c11ee 11744 tg3_full_lock(tp, 1);
1da177e4 11745 tg3_disable_ints(tp);
f47c11ee 11746 tg3_full_unlock(tp);
1da177e4
LT
11747
11748 netif_device_detach(dev);
11749
f47c11ee 11750 tg3_full_lock(tp, 0);
944d980e 11751 tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
6a9eba15 11752 tp->tg3_flags &= ~TG3_FLAG_INIT_COMPLETE;
f47c11ee 11753 tg3_full_unlock(tp);
1da177e4
LT
11754
11755 err = tg3_set_power_state(tp, pci_choose_state(pdev, state));
11756 if (err) {
f47c11ee 11757 tg3_full_lock(tp, 0);
1da177e4 11758
6a9eba15 11759 tp->tg3_flags |= TG3_FLAG_INIT_COMPLETE;
b9ec6c1b
MC
11760 if (tg3_restart_hw(tp, 1))
11761 goto out;
1da177e4
LT
11762
11763 tp->timer.expires = jiffies + tp->timer_offset;
11764 add_timer(&tp->timer);
11765
11766 netif_device_attach(dev);
11767 tg3_netif_start(tp);
11768
b9ec6c1b 11769out:
f47c11ee 11770 tg3_full_unlock(tp);
1da177e4
LT
11771 }
11772
11773 return err;
11774}
11775
11776static int tg3_resume(struct pci_dev *pdev)
11777{
11778 struct net_device *dev = pci_get_drvdata(pdev);
11779 struct tg3 *tp = netdev_priv(dev);
11780 int err;
11781
11782 if (!netif_running(dev))
11783 return 0;
11784
11785 pci_restore_state(tp->pdev);
11786
bc1c7567 11787 err = tg3_set_power_state(tp, PCI_D0);
1da177e4
LT
11788 if (err)
11789 return err;
11790
11791 netif_device_attach(dev);
11792
f47c11ee 11793 tg3_full_lock(tp, 0);
1da177e4 11794
6a9eba15 11795 tp->tg3_flags |= TG3_FLAG_INIT_COMPLETE;
b9ec6c1b
MC
11796 err = tg3_restart_hw(tp, 1);
11797 if (err)
11798 goto out;
1da177e4
LT
11799
11800 tp->timer.expires = jiffies + tp->timer_offset;
11801 add_timer(&tp->timer);
11802
1da177e4
LT
11803 tg3_netif_start(tp);
11804
b9ec6c1b 11805out:
f47c11ee 11806 tg3_full_unlock(tp);
1da177e4 11807
b9ec6c1b 11808 return err;
1da177e4
LT
11809}
11810
11811static struct pci_driver tg3_driver = {
11812 .name = DRV_MODULE_NAME,
11813 .id_table = tg3_pci_tbl,
11814 .probe = tg3_init_one,
11815 .remove = __devexit_p(tg3_remove_one),
11816 .suspend = tg3_suspend,
11817 .resume = tg3_resume
11818};
11819
11820static int __init tg3_init(void)
11821{
29917620 11822 return pci_register_driver(&tg3_driver);
1da177e4
LT
11823}
11824
11825static void __exit tg3_cleanup(void)
11826{
11827 pci_unregister_driver(&tg3_driver);
11828}
11829
11830module_init(tg3_init);
11831module_exit(tg3_cleanup);