Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
[pandora-kernel.git] / drivers / net / bnx2.c
1 /* bnx2.c: Broadcom NX2 network driver.
2  *
3  * Copyright (c) 2004-2009 Broadcom Corporation
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation.
8  *
9  * Written by: Michael Chan  (mchan@broadcom.com)
10  */
11
12
13 #include <linux/module.h>
14 #include <linux/moduleparam.h>
15
16 #include <linux/kernel.h>
17 #include <linux/timer.h>
18 #include <linux/errno.h>
19 #include <linux/ioport.h>
20 #include <linux/slab.h>
21 #include <linux/vmalloc.h>
22 #include <linux/interrupt.h>
23 #include <linux/pci.h>
24 #include <linux/init.h>
25 #include <linux/netdevice.h>
26 #include <linux/etherdevice.h>
27 #include <linux/skbuff.h>
28 #include <linux/dma-mapping.h>
29 #include <linux/bitops.h>
30 #include <asm/io.h>
31 #include <asm/irq.h>
32 #include <linux/delay.h>
33 #include <asm/byteorder.h>
34 #include <asm/page.h>
35 #include <linux/time.h>
36 #include <linux/ethtool.h>
37 #include <linux/mii.h>
38 #include <linux/if_vlan.h>
39 #if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE)
40 #define BCM_VLAN 1
41 #endif
42 #include <net/ip.h>
43 #include <net/tcp.h>
44 #include <net/checksum.h>
45 #include <linux/workqueue.h>
46 #include <linux/crc32.h>
47 #include <linux/prefetch.h>
48 #include <linux/cache.h>
49 #include <linux/firmware.h>
50 #include <linux/log2.h>
51
52 #if defined(CONFIG_CNIC) || defined(CONFIG_CNIC_MODULE)
53 #define BCM_CNIC 1
54 #include "cnic_if.h"
55 #endif
56 #include "bnx2.h"
57 #include "bnx2_fw.h"
58
59 #define DRV_MODULE_NAME         "bnx2"
60 #define PFX DRV_MODULE_NAME     ": "
61 #define DRV_MODULE_VERSION      "2.0.1"
62 #define DRV_MODULE_RELDATE      "May 6, 2009"
63 #define FW_MIPS_FILE_06         "bnx2/bnx2-mips-06-4.6.16.fw"
64 #define FW_RV2P_FILE_06         "bnx2/bnx2-rv2p-06-4.6.16.fw"
65 #define FW_MIPS_FILE_09         "bnx2/bnx2-mips-09-4.6.17.fw"
66 #define FW_RV2P_FILE_09         "bnx2/bnx2-rv2p-09-4.6.15.fw"
67
68 #define RUN_AT(x) (jiffies + (x))
69
70 /* Time in jiffies before concluding the transmitter is hung. */
71 #define TX_TIMEOUT  (5*HZ)
72
73 static char version[] __devinitdata =
74         "Broadcom NetXtreme II Gigabit Ethernet Driver " DRV_MODULE_NAME " v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n";
75
76 MODULE_AUTHOR("Michael Chan <mchan@broadcom.com>");
77 MODULE_DESCRIPTION("Broadcom NetXtreme II BCM5706/5708/5709/5716 Driver");
78 MODULE_LICENSE("GPL");
79 MODULE_VERSION(DRV_MODULE_VERSION);
80 MODULE_FIRMWARE(FW_MIPS_FILE_06);
81 MODULE_FIRMWARE(FW_RV2P_FILE_06);
82 MODULE_FIRMWARE(FW_MIPS_FILE_09);
83 MODULE_FIRMWARE(FW_RV2P_FILE_09);
84
85 static int disable_msi = 0;
86
87 module_param(disable_msi, int, 0);
88 MODULE_PARM_DESC(disable_msi, "Disable Message Signaled Interrupt (MSI)");
89
90 typedef enum {
91         BCM5706 = 0,
92         NC370T,
93         NC370I,
94         BCM5706S,
95         NC370F,
96         BCM5708,
97         BCM5708S,
98         BCM5709,
99         BCM5709S,
100         BCM5716,
101         BCM5716S,
102 } board_t;
103
104 /* indexed by board_t, above */
105 static struct {
106         char *name;
107 } board_info[] __devinitdata = {
108         { "Broadcom NetXtreme II BCM5706 1000Base-T" },
109         { "HP NC370T Multifunction Gigabit Server Adapter" },
110         { "HP NC370i Multifunction Gigabit Server Adapter" },
111         { "Broadcom NetXtreme II BCM5706 1000Base-SX" },
112         { "HP NC370F Multifunction Gigabit Server Adapter" },
113         { "Broadcom NetXtreme II BCM5708 1000Base-T" },
114         { "Broadcom NetXtreme II BCM5708 1000Base-SX" },
115         { "Broadcom NetXtreme II BCM5709 1000Base-T" },
116         { "Broadcom NetXtreme II BCM5709 1000Base-SX" },
117         { "Broadcom NetXtreme II BCM5716 1000Base-T" },
118         { "Broadcom NetXtreme II BCM5716 1000Base-SX" },
119         };
120
121 static DEFINE_PCI_DEVICE_TABLE(bnx2_pci_tbl) = {
122         { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_5706,
123           PCI_VENDOR_ID_HP, 0x3101, 0, 0, NC370T },
124         { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_5706,
125           PCI_VENDOR_ID_HP, 0x3106, 0, 0, NC370I },
126         { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_5706,
127           PCI_ANY_ID, PCI_ANY_ID, 0, 0, BCM5706 },
128         { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_5708,
129           PCI_ANY_ID, PCI_ANY_ID, 0, 0, BCM5708 },
130         { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_5706S,
131           PCI_VENDOR_ID_HP, 0x3102, 0, 0, NC370F },
132         { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_5706S,
133           PCI_ANY_ID, PCI_ANY_ID, 0, 0, BCM5706S },
134         { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_5708S,
135           PCI_ANY_ID, PCI_ANY_ID, 0, 0, BCM5708S },
136         { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_5709,
137           PCI_ANY_ID, PCI_ANY_ID, 0, 0, BCM5709 },
138         { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_5709S,
139           PCI_ANY_ID, PCI_ANY_ID, 0, 0, BCM5709S },
140         { PCI_VENDOR_ID_BROADCOM, 0x163b,
141           PCI_ANY_ID, PCI_ANY_ID, 0, 0, BCM5716 },
142         { PCI_VENDOR_ID_BROADCOM, 0x163c,
143           PCI_ANY_ID, PCI_ANY_ID, 0, 0, BCM5716S },
144         { 0, }
145 };
146
147 static struct flash_spec flash_table[] =
148 {
149 #define BUFFERED_FLAGS          (BNX2_NV_BUFFERED | BNX2_NV_TRANSLATE)
150 #define NONBUFFERED_FLAGS       (BNX2_NV_WREN)
151         /* Slow EEPROM */
152         {0x00000000, 0x40830380, 0x009f0081, 0xa184a053, 0xaf000400,
153          BUFFERED_FLAGS, SEEPROM_PAGE_BITS, SEEPROM_PAGE_SIZE,
154          SEEPROM_BYTE_ADDR_MASK, SEEPROM_TOTAL_SIZE,
155          "EEPROM - slow"},
156         /* Expansion entry 0001 */
157         {0x08000002, 0x4b808201, 0x00050081, 0x03840253, 0xaf020406,
158          NONBUFFERED_FLAGS, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE,
159          SAIFUN_FLASH_BYTE_ADDR_MASK, 0,
160          "Entry 0001"},
161         /* Saifun SA25F010 (non-buffered flash) */
162         /* strap, cfg1, & write1 need updates */
163         {0x04000001, 0x47808201, 0x00050081, 0x03840253, 0xaf020406,
164          NONBUFFERED_FLAGS, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE,
165          SAIFUN_FLASH_BYTE_ADDR_MASK, SAIFUN_FLASH_BASE_TOTAL_SIZE*2,
166          "Non-buffered flash (128kB)"},
167         /* Saifun SA25F020 (non-buffered flash) */
168         /* strap, cfg1, & write1 need updates */
169         {0x0c000003, 0x4f808201, 0x00050081, 0x03840253, 0xaf020406,
170          NONBUFFERED_FLAGS, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE,
171          SAIFUN_FLASH_BYTE_ADDR_MASK, SAIFUN_FLASH_BASE_TOTAL_SIZE*4,
172          "Non-buffered flash (256kB)"},
173         /* Expansion entry 0100 */
174         {0x11000000, 0x53808201, 0x00050081, 0x03840253, 0xaf020406,
175          NONBUFFERED_FLAGS, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE,
176          SAIFUN_FLASH_BYTE_ADDR_MASK, 0,
177          "Entry 0100"},
178         /* Entry 0101: ST M45PE10 (non-buffered flash, TetonII B0) */
179         {0x19000002, 0x5b808201, 0x000500db, 0x03840253, 0xaf020406,
180          NONBUFFERED_FLAGS, ST_MICRO_FLASH_PAGE_BITS, ST_MICRO_FLASH_PAGE_SIZE,
181          ST_MICRO_FLASH_BYTE_ADDR_MASK, ST_MICRO_FLASH_BASE_TOTAL_SIZE*2,
182          "Entry 0101: ST M45PE10 (128kB non-bufferred)"},
183         /* Entry 0110: ST M45PE20 (non-buffered flash)*/
184         {0x15000001, 0x57808201, 0x000500db, 0x03840253, 0xaf020406,
185          NONBUFFERED_FLAGS, ST_MICRO_FLASH_PAGE_BITS, ST_MICRO_FLASH_PAGE_SIZE,
186          ST_MICRO_FLASH_BYTE_ADDR_MASK, ST_MICRO_FLASH_BASE_TOTAL_SIZE*4,
187          "Entry 0110: ST M45PE20 (256kB non-bufferred)"},
188         /* Saifun SA25F005 (non-buffered flash) */
189         /* strap, cfg1, & write1 need updates */
190         {0x1d000003, 0x5f808201, 0x00050081, 0x03840253, 0xaf020406,
191          NONBUFFERED_FLAGS, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE,
192          SAIFUN_FLASH_BYTE_ADDR_MASK, SAIFUN_FLASH_BASE_TOTAL_SIZE,
193          "Non-buffered flash (64kB)"},
194         /* Fast EEPROM */
195         {0x22000000, 0x62808380, 0x009f0081, 0xa184a053, 0xaf000400,
196          BUFFERED_FLAGS, SEEPROM_PAGE_BITS, SEEPROM_PAGE_SIZE,
197          SEEPROM_BYTE_ADDR_MASK, SEEPROM_TOTAL_SIZE,
198          "EEPROM - fast"},
199         /* Expansion entry 1001 */
200         {0x2a000002, 0x6b808201, 0x00050081, 0x03840253, 0xaf020406,
201          NONBUFFERED_FLAGS, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE,
202          SAIFUN_FLASH_BYTE_ADDR_MASK, 0,
203          "Entry 1001"},
204         /* Expansion entry 1010 */
205         {0x26000001, 0x67808201, 0x00050081, 0x03840253, 0xaf020406,
206          NONBUFFERED_FLAGS, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE,
207          SAIFUN_FLASH_BYTE_ADDR_MASK, 0,
208          "Entry 1010"},
209         /* ATMEL AT45DB011B (buffered flash) */
210         {0x2e000003, 0x6e808273, 0x00570081, 0x68848353, 0xaf000400,
211          BUFFERED_FLAGS, BUFFERED_FLASH_PAGE_BITS, BUFFERED_FLASH_PAGE_SIZE,
212          BUFFERED_FLASH_BYTE_ADDR_MASK, BUFFERED_FLASH_TOTAL_SIZE,
213          "Buffered flash (128kB)"},
214         /* Expansion entry 1100 */
215         {0x33000000, 0x73808201, 0x00050081, 0x03840253, 0xaf020406,
216          NONBUFFERED_FLAGS, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE,
217          SAIFUN_FLASH_BYTE_ADDR_MASK, 0,
218          "Entry 1100"},
219         /* Expansion entry 1101 */
220         {0x3b000002, 0x7b808201, 0x00050081, 0x03840253, 0xaf020406,
221          NONBUFFERED_FLAGS, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE,
222          SAIFUN_FLASH_BYTE_ADDR_MASK, 0,
223          "Entry 1101"},
224         /* Ateml Expansion entry 1110 */
225         {0x37000001, 0x76808273, 0x00570081, 0x68848353, 0xaf000400,
226          BUFFERED_FLAGS, BUFFERED_FLASH_PAGE_BITS, BUFFERED_FLASH_PAGE_SIZE,
227          BUFFERED_FLASH_BYTE_ADDR_MASK, 0,
228          "Entry 1110 (Atmel)"},
229         /* ATMEL AT45DB021B (buffered flash) */
230         {0x3f000003, 0x7e808273, 0x00570081, 0x68848353, 0xaf000400,
231          BUFFERED_FLAGS, BUFFERED_FLASH_PAGE_BITS, BUFFERED_FLASH_PAGE_SIZE,
232          BUFFERED_FLASH_BYTE_ADDR_MASK, BUFFERED_FLASH_TOTAL_SIZE*2,
233          "Buffered flash (256kB)"},
234 };
235
236 static struct flash_spec flash_5709 = {
237         .flags          = BNX2_NV_BUFFERED,
238         .page_bits      = BCM5709_FLASH_PAGE_BITS,
239         .page_size      = BCM5709_FLASH_PAGE_SIZE,
240         .addr_mask      = BCM5709_FLASH_BYTE_ADDR_MASK,
241         .total_size     = BUFFERED_FLASH_TOTAL_SIZE*2,
242         .name           = "5709 Buffered flash (256kB)",
243 };
244
245 MODULE_DEVICE_TABLE(pci, bnx2_pci_tbl);
246
247 static inline u32 bnx2_tx_avail(struct bnx2 *bp, struct bnx2_tx_ring_info *txr)
248 {
249         u32 diff;
250
251         smp_mb();
252
253         /* The ring uses 256 indices for 255 entries, one of them
254          * needs to be skipped.
255          */
256         diff = txr->tx_prod - txr->tx_cons;
257         if (unlikely(diff >= TX_DESC_CNT)) {
258                 diff &= 0xffff;
259                 if (diff == TX_DESC_CNT)
260                         diff = MAX_TX_DESC_CNT;
261         }
262         return (bp->tx_ring_size - diff);
263 }
264
265 static u32
266 bnx2_reg_rd_ind(struct bnx2 *bp, u32 offset)
267 {
268         u32 val;
269
270         spin_lock_bh(&bp->indirect_lock);
271         REG_WR(bp, BNX2_PCICFG_REG_WINDOW_ADDRESS, offset);
272         val = REG_RD(bp, BNX2_PCICFG_REG_WINDOW);
273         spin_unlock_bh(&bp->indirect_lock);
274         return val;
275 }
276
277 static void
278 bnx2_reg_wr_ind(struct bnx2 *bp, u32 offset, u32 val)
279 {
280         spin_lock_bh(&bp->indirect_lock);
281         REG_WR(bp, BNX2_PCICFG_REG_WINDOW_ADDRESS, offset);
282         REG_WR(bp, BNX2_PCICFG_REG_WINDOW, val);
283         spin_unlock_bh(&bp->indirect_lock);
284 }
285
286 static void
287 bnx2_shmem_wr(struct bnx2 *bp, u32 offset, u32 val)
288 {
289         bnx2_reg_wr_ind(bp, bp->shmem_base + offset, val);
290 }
291
292 static u32
293 bnx2_shmem_rd(struct bnx2 *bp, u32 offset)
294 {
295         return (bnx2_reg_rd_ind(bp, bp->shmem_base + offset));
296 }
297
298 static void
299 bnx2_ctx_wr(struct bnx2 *bp, u32 cid_addr, u32 offset, u32 val)
300 {
301         offset += cid_addr;
302         spin_lock_bh(&bp->indirect_lock);
303         if (CHIP_NUM(bp) == CHIP_NUM_5709) {
304                 int i;
305
306                 REG_WR(bp, BNX2_CTX_CTX_DATA, val);
307                 REG_WR(bp, BNX2_CTX_CTX_CTRL,
308                        offset | BNX2_CTX_CTX_CTRL_WRITE_REQ);
309                 for (i = 0; i < 5; i++) {
310                         val = REG_RD(bp, BNX2_CTX_CTX_CTRL);
311                         if ((val & BNX2_CTX_CTX_CTRL_WRITE_REQ) == 0)
312                                 break;
313                         udelay(5);
314                 }
315         } else {
316                 REG_WR(bp, BNX2_CTX_DATA_ADR, offset);
317                 REG_WR(bp, BNX2_CTX_DATA, val);
318         }
319         spin_unlock_bh(&bp->indirect_lock);
320 }
321
322 #ifdef BCM_CNIC
323 static int
324 bnx2_drv_ctl(struct net_device *dev, struct drv_ctl_info *info)
325 {
326         struct bnx2 *bp = netdev_priv(dev);
327         struct drv_ctl_io *io = &info->data.io;
328
329         switch (info->cmd) {
330         case DRV_CTL_IO_WR_CMD:
331                 bnx2_reg_wr_ind(bp, io->offset, io->data);
332                 break;
333         case DRV_CTL_IO_RD_CMD:
334                 io->data = bnx2_reg_rd_ind(bp, io->offset);
335                 break;
336         case DRV_CTL_CTX_WR_CMD:
337                 bnx2_ctx_wr(bp, io->cid_addr, io->offset, io->data);
338                 break;
339         default:
340                 return -EINVAL;
341         }
342         return 0;
343 }
344
345 static void bnx2_setup_cnic_irq_info(struct bnx2 *bp)
346 {
347         struct cnic_eth_dev *cp = &bp->cnic_eth_dev;
348         struct bnx2_napi *bnapi = &bp->bnx2_napi[0];
349         int sb_id;
350
351         if (bp->flags & BNX2_FLAG_USING_MSIX) {
352                 cp->drv_state |= CNIC_DRV_STATE_USING_MSIX;
353                 bnapi->cnic_present = 0;
354                 sb_id = bp->irq_nvecs;
355                 cp->irq_arr[0].irq_flags |= CNIC_IRQ_FL_MSIX;
356         } else {
357                 cp->drv_state &= ~CNIC_DRV_STATE_USING_MSIX;
358                 bnapi->cnic_tag = bnapi->last_status_idx;
359                 bnapi->cnic_present = 1;
360                 sb_id = 0;
361                 cp->irq_arr[0].irq_flags &= ~CNIC_IRQ_FL_MSIX;
362         }
363
364         cp->irq_arr[0].vector = bp->irq_tbl[sb_id].vector;
365         cp->irq_arr[0].status_blk = (void *)
366                 ((unsigned long) bnapi->status_blk.msi +
367                 (BNX2_SBLK_MSIX_ALIGN_SIZE * sb_id));
368         cp->irq_arr[0].status_blk_num = sb_id;
369         cp->num_irq = 1;
370 }
371
372 static int bnx2_register_cnic(struct net_device *dev, struct cnic_ops *ops,
373                               void *data)
374 {
375         struct bnx2 *bp = netdev_priv(dev);
376         struct cnic_eth_dev *cp = &bp->cnic_eth_dev;
377
378         if (ops == NULL)
379                 return -EINVAL;
380
381         if (cp->drv_state & CNIC_DRV_STATE_REGD)
382                 return -EBUSY;
383
384         bp->cnic_data = data;
385         rcu_assign_pointer(bp->cnic_ops, ops);
386
387         cp->num_irq = 0;
388         cp->drv_state = CNIC_DRV_STATE_REGD;
389
390         bnx2_setup_cnic_irq_info(bp);
391
392         return 0;
393 }
394
395 static int bnx2_unregister_cnic(struct net_device *dev)
396 {
397         struct bnx2 *bp = netdev_priv(dev);
398         struct bnx2_napi *bnapi = &bp->bnx2_napi[0];
399         struct cnic_eth_dev *cp = &bp->cnic_eth_dev;
400
401         cp->drv_state = 0;
402         bnapi->cnic_present = 0;
403         rcu_assign_pointer(bp->cnic_ops, NULL);
404         synchronize_rcu();
405         return 0;
406 }
407
408 struct cnic_eth_dev *bnx2_cnic_probe(struct net_device *dev)
409 {
410         struct bnx2 *bp = netdev_priv(dev);
411         struct cnic_eth_dev *cp = &bp->cnic_eth_dev;
412
413         cp->drv_owner = THIS_MODULE;
414         cp->chip_id = bp->chip_id;
415         cp->pdev = bp->pdev;
416         cp->io_base = bp->regview;
417         cp->drv_ctl = bnx2_drv_ctl;
418         cp->drv_register_cnic = bnx2_register_cnic;
419         cp->drv_unregister_cnic = bnx2_unregister_cnic;
420
421         return cp;
422 }
423 EXPORT_SYMBOL(bnx2_cnic_probe);
424
425 static void
426 bnx2_cnic_stop(struct bnx2 *bp)
427 {
428         struct cnic_ops *c_ops;
429         struct cnic_ctl_info info;
430
431         rcu_read_lock();
432         c_ops = rcu_dereference(bp->cnic_ops);
433         if (c_ops) {
434                 info.cmd = CNIC_CTL_STOP_CMD;
435                 c_ops->cnic_ctl(bp->cnic_data, &info);
436         }
437         rcu_read_unlock();
438 }
439
440 static void
441 bnx2_cnic_start(struct bnx2 *bp)
442 {
443         struct cnic_ops *c_ops;
444         struct cnic_ctl_info info;
445
446         rcu_read_lock();
447         c_ops = rcu_dereference(bp->cnic_ops);
448         if (c_ops) {
449                 if (!(bp->flags & BNX2_FLAG_USING_MSIX)) {
450                         struct bnx2_napi *bnapi = &bp->bnx2_napi[0];
451
452                         bnapi->cnic_tag = bnapi->last_status_idx;
453                 }
454                 info.cmd = CNIC_CTL_START_CMD;
455                 c_ops->cnic_ctl(bp->cnic_data, &info);
456         }
457         rcu_read_unlock();
458 }
459
460 #else
461
462 static void
463 bnx2_cnic_stop(struct bnx2 *bp)
464 {
465 }
466
467 static void
468 bnx2_cnic_start(struct bnx2 *bp)
469 {
470 }
471
472 #endif
473
474 static int
475 bnx2_read_phy(struct bnx2 *bp, u32 reg, u32 *val)
476 {
477         u32 val1;
478         int i, ret;
479
480         if (bp->phy_flags & BNX2_PHY_FLAG_INT_MODE_AUTO_POLLING) {
481                 val1 = REG_RD(bp, BNX2_EMAC_MDIO_MODE);
482                 val1 &= ~BNX2_EMAC_MDIO_MODE_AUTO_POLL;
483
484                 REG_WR(bp, BNX2_EMAC_MDIO_MODE, val1);
485                 REG_RD(bp, BNX2_EMAC_MDIO_MODE);
486
487                 udelay(40);
488         }
489
490         val1 = (bp->phy_addr << 21) | (reg << 16) |
491                 BNX2_EMAC_MDIO_COMM_COMMAND_READ | BNX2_EMAC_MDIO_COMM_DISEXT |
492                 BNX2_EMAC_MDIO_COMM_START_BUSY;
493         REG_WR(bp, BNX2_EMAC_MDIO_COMM, val1);
494
495         for (i = 0; i < 50; i++) {
496                 udelay(10);
497
498                 val1 = REG_RD(bp, BNX2_EMAC_MDIO_COMM);
499                 if (!(val1 & BNX2_EMAC_MDIO_COMM_START_BUSY)) {
500                         udelay(5);
501
502                         val1 = REG_RD(bp, BNX2_EMAC_MDIO_COMM);
503                         val1 &= BNX2_EMAC_MDIO_COMM_DATA;
504
505                         break;
506                 }
507         }
508
509         if (val1 & BNX2_EMAC_MDIO_COMM_START_BUSY) {
510                 *val = 0x0;
511                 ret = -EBUSY;
512         }
513         else {
514                 *val = val1;
515                 ret = 0;
516         }
517
518         if (bp->phy_flags & BNX2_PHY_FLAG_INT_MODE_AUTO_POLLING) {
519                 val1 = REG_RD(bp, BNX2_EMAC_MDIO_MODE);
520                 val1 |= BNX2_EMAC_MDIO_MODE_AUTO_POLL;
521
522                 REG_WR(bp, BNX2_EMAC_MDIO_MODE, val1);
523                 REG_RD(bp, BNX2_EMAC_MDIO_MODE);
524
525                 udelay(40);
526         }
527
528         return ret;
529 }
530
531 static int
532 bnx2_write_phy(struct bnx2 *bp, u32 reg, u32 val)
533 {
534         u32 val1;
535         int i, ret;
536
537         if (bp->phy_flags & BNX2_PHY_FLAG_INT_MODE_AUTO_POLLING) {
538                 val1 = REG_RD(bp, BNX2_EMAC_MDIO_MODE);
539                 val1 &= ~BNX2_EMAC_MDIO_MODE_AUTO_POLL;
540
541                 REG_WR(bp, BNX2_EMAC_MDIO_MODE, val1);
542                 REG_RD(bp, BNX2_EMAC_MDIO_MODE);
543
544                 udelay(40);
545         }
546
547         val1 = (bp->phy_addr << 21) | (reg << 16) | val |
548                 BNX2_EMAC_MDIO_COMM_COMMAND_WRITE |
549                 BNX2_EMAC_MDIO_COMM_START_BUSY | BNX2_EMAC_MDIO_COMM_DISEXT;
550         REG_WR(bp, BNX2_EMAC_MDIO_COMM, val1);
551
552         for (i = 0; i < 50; i++) {
553                 udelay(10);
554
555                 val1 = REG_RD(bp, BNX2_EMAC_MDIO_COMM);
556                 if (!(val1 & BNX2_EMAC_MDIO_COMM_START_BUSY)) {
557                         udelay(5);
558                         break;
559                 }
560         }
561
562         if (val1 & BNX2_EMAC_MDIO_COMM_START_BUSY)
563                 ret = -EBUSY;
564         else
565                 ret = 0;
566
567         if (bp->phy_flags & BNX2_PHY_FLAG_INT_MODE_AUTO_POLLING) {
568                 val1 = REG_RD(bp, BNX2_EMAC_MDIO_MODE);
569                 val1 |= BNX2_EMAC_MDIO_MODE_AUTO_POLL;
570
571                 REG_WR(bp, BNX2_EMAC_MDIO_MODE, val1);
572                 REG_RD(bp, BNX2_EMAC_MDIO_MODE);
573
574                 udelay(40);
575         }
576
577         return ret;
578 }
579
580 static void
581 bnx2_disable_int(struct bnx2 *bp)
582 {
583         int i;
584         struct bnx2_napi *bnapi;
585
586         for (i = 0; i < bp->irq_nvecs; i++) {
587                 bnapi = &bp->bnx2_napi[i];
588                 REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD, bnapi->int_num |
589                        BNX2_PCICFG_INT_ACK_CMD_MASK_INT);
590         }
591         REG_RD(bp, BNX2_PCICFG_INT_ACK_CMD);
592 }
593
594 static void
595 bnx2_enable_int(struct bnx2 *bp)
596 {
597         int i;
598         struct bnx2_napi *bnapi;
599
600         for (i = 0; i < bp->irq_nvecs; i++) {
601                 bnapi = &bp->bnx2_napi[i];
602
603                 REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD, bnapi->int_num |
604                        BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID |
605                        BNX2_PCICFG_INT_ACK_CMD_MASK_INT |
606                        bnapi->last_status_idx);
607
608                 REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD, bnapi->int_num |
609                        BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID |
610                        bnapi->last_status_idx);
611         }
612         REG_WR(bp, BNX2_HC_COMMAND, bp->hc_cmd | BNX2_HC_COMMAND_COAL_NOW);
613 }
614
615 static void
616 bnx2_disable_int_sync(struct bnx2 *bp)
617 {
618         int i;
619
620         atomic_inc(&bp->intr_sem);
621         bnx2_disable_int(bp);
622         for (i = 0; i < bp->irq_nvecs; i++)
623                 synchronize_irq(bp->irq_tbl[i].vector);
624 }
625
626 static void
627 bnx2_napi_disable(struct bnx2 *bp)
628 {
629         int i;
630
631         for (i = 0; i < bp->irq_nvecs; i++)
632                 napi_disable(&bp->bnx2_napi[i].napi);
633 }
634
635 static void
636 bnx2_napi_enable(struct bnx2 *bp)
637 {
638         int i;
639
640         for (i = 0; i < bp->irq_nvecs; i++)
641                 napi_enable(&bp->bnx2_napi[i].napi);
642 }
643
644 static void
645 bnx2_netif_stop(struct bnx2 *bp)
646 {
647         bnx2_cnic_stop(bp);
648         bnx2_disable_int_sync(bp);
649         if (netif_running(bp->dev)) {
650                 bnx2_napi_disable(bp);
651                 netif_tx_disable(bp->dev);
652                 bp->dev->trans_start = jiffies; /* prevent tx timeout */
653         }
654 }
655
656 static void
657 bnx2_netif_start(struct bnx2 *bp)
658 {
659         if (atomic_dec_and_test(&bp->intr_sem)) {
660                 if (netif_running(bp->dev)) {
661                         netif_tx_wake_all_queues(bp->dev);
662                         bnx2_napi_enable(bp);
663                         bnx2_enable_int(bp);
664                         bnx2_cnic_start(bp);
665                 }
666         }
667 }
668
669 static void
670 bnx2_free_tx_mem(struct bnx2 *bp)
671 {
672         int i;
673
674         for (i = 0; i < bp->num_tx_rings; i++) {
675                 struct bnx2_napi *bnapi = &bp->bnx2_napi[i];
676                 struct bnx2_tx_ring_info *txr = &bnapi->tx_ring;
677
678                 if (txr->tx_desc_ring) {
679                         pci_free_consistent(bp->pdev, TXBD_RING_SIZE,
680                                             txr->tx_desc_ring,
681                                             txr->tx_desc_mapping);
682                         txr->tx_desc_ring = NULL;
683                 }
684                 kfree(txr->tx_buf_ring);
685                 txr->tx_buf_ring = NULL;
686         }
687 }
688
689 static void
690 bnx2_free_rx_mem(struct bnx2 *bp)
691 {
692         int i;
693
694         for (i = 0; i < bp->num_rx_rings; i++) {
695                 struct bnx2_napi *bnapi = &bp->bnx2_napi[i];
696                 struct bnx2_rx_ring_info *rxr = &bnapi->rx_ring;
697                 int j;
698
699                 for (j = 0; j < bp->rx_max_ring; j++) {
700                         if (rxr->rx_desc_ring[j])
701                                 pci_free_consistent(bp->pdev, RXBD_RING_SIZE,
702                                                     rxr->rx_desc_ring[j],
703                                                     rxr->rx_desc_mapping[j]);
704                         rxr->rx_desc_ring[j] = NULL;
705                 }
706                 if (rxr->rx_buf_ring)
707                         vfree(rxr->rx_buf_ring);
708                 rxr->rx_buf_ring = NULL;
709
710                 for (j = 0; j < bp->rx_max_pg_ring; j++) {
711                         if (rxr->rx_pg_desc_ring[j])
712                                 pci_free_consistent(bp->pdev, RXBD_RING_SIZE,
713                                                     rxr->rx_pg_desc_ring[j],
714                                                     rxr->rx_pg_desc_mapping[j]);
715                         rxr->rx_pg_desc_ring[j] = NULL;
716                 }
717                 if (rxr->rx_pg_ring)
718                         vfree(rxr->rx_pg_ring);
719                 rxr->rx_pg_ring = NULL;
720         }
721 }
722
723 static int
724 bnx2_alloc_tx_mem(struct bnx2 *bp)
725 {
726         int i;
727
728         for (i = 0; i < bp->num_tx_rings; i++) {
729                 struct bnx2_napi *bnapi = &bp->bnx2_napi[i];
730                 struct bnx2_tx_ring_info *txr = &bnapi->tx_ring;
731
732                 txr->tx_buf_ring = kzalloc(SW_TXBD_RING_SIZE, GFP_KERNEL);
733                 if (txr->tx_buf_ring == NULL)
734                         return -ENOMEM;
735
736                 txr->tx_desc_ring =
737                         pci_alloc_consistent(bp->pdev, TXBD_RING_SIZE,
738                                              &txr->tx_desc_mapping);
739                 if (txr->tx_desc_ring == NULL)
740                         return -ENOMEM;
741         }
742         return 0;
743 }
744
745 static int
746 bnx2_alloc_rx_mem(struct bnx2 *bp)
747 {
748         int i;
749
750         for (i = 0; i < bp->num_rx_rings; i++) {
751                 struct bnx2_napi *bnapi = &bp->bnx2_napi[i];
752                 struct bnx2_rx_ring_info *rxr = &bnapi->rx_ring;
753                 int j;
754
755                 rxr->rx_buf_ring =
756                         vmalloc(SW_RXBD_RING_SIZE * bp->rx_max_ring);
757                 if (rxr->rx_buf_ring == NULL)
758                         return -ENOMEM;
759
760                 memset(rxr->rx_buf_ring, 0,
761                        SW_RXBD_RING_SIZE * bp->rx_max_ring);
762
763                 for (j = 0; j < bp->rx_max_ring; j++) {
764                         rxr->rx_desc_ring[j] =
765                                 pci_alloc_consistent(bp->pdev, RXBD_RING_SIZE,
766                                                      &rxr->rx_desc_mapping[j]);
767                         if (rxr->rx_desc_ring[j] == NULL)
768                                 return -ENOMEM;
769
770                 }
771
772                 if (bp->rx_pg_ring_size) {
773                         rxr->rx_pg_ring = vmalloc(SW_RXPG_RING_SIZE *
774                                                   bp->rx_max_pg_ring);
775                         if (rxr->rx_pg_ring == NULL)
776                                 return -ENOMEM;
777
778                         memset(rxr->rx_pg_ring, 0, SW_RXPG_RING_SIZE *
779                                bp->rx_max_pg_ring);
780                 }
781
782                 for (j = 0; j < bp->rx_max_pg_ring; j++) {
783                         rxr->rx_pg_desc_ring[j] =
784                                 pci_alloc_consistent(bp->pdev, RXBD_RING_SIZE,
785                                                 &rxr->rx_pg_desc_mapping[j]);
786                         if (rxr->rx_pg_desc_ring[j] == NULL)
787                                 return -ENOMEM;
788
789                 }
790         }
791         return 0;
792 }
793
794 static void
795 bnx2_free_mem(struct bnx2 *bp)
796 {
797         int i;
798         struct bnx2_napi *bnapi = &bp->bnx2_napi[0];
799
800         bnx2_free_tx_mem(bp);
801         bnx2_free_rx_mem(bp);
802
803         for (i = 0; i < bp->ctx_pages; i++) {
804                 if (bp->ctx_blk[i]) {
805                         pci_free_consistent(bp->pdev, BCM_PAGE_SIZE,
806                                             bp->ctx_blk[i],
807                                             bp->ctx_blk_mapping[i]);
808                         bp->ctx_blk[i] = NULL;
809                 }
810         }
811         if (bnapi->status_blk.msi) {
812                 pci_free_consistent(bp->pdev, bp->status_stats_size,
813                                     bnapi->status_blk.msi,
814                                     bp->status_blk_mapping);
815                 bnapi->status_blk.msi = NULL;
816                 bp->stats_blk = NULL;
817         }
818 }
819
820 static int
821 bnx2_alloc_mem(struct bnx2 *bp)
822 {
823         int i, status_blk_size, err;
824         struct bnx2_napi *bnapi;
825         void *status_blk;
826
827         /* Combine status and statistics blocks into one allocation. */
828         status_blk_size = L1_CACHE_ALIGN(sizeof(struct status_block));
829         if (bp->flags & BNX2_FLAG_MSIX_CAP)
830                 status_blk_size = L1_CACHE_ALIGN(BNX2_MAX_MSIX_HW_VEC *
831                                                  BNX2_SBLK_MSIX_ALIGN_SIZE);
832         bp->status_stats_size = status_blk_size +
833                                 sizeof(struct statistics_block);
834
835         status_blk = pci_alloc_consistent(bp->pdev, bp->status_stats_size,
836                                           &bp->status_blk_mapping);
837         if (status_blk == NULL)
838                 goto alloc_mem_err;
839
840         memset(status_blk, 0, bp->status_stats_size);
841
842         bnapi = &bp->bnx2_napi[0];
843         bnapi->status_blk.msi = status_blk;
844         bnapi->hw_tx_cons_ptr =
845                 &bnapi->status_blk.msi->status_tx_quick_consumer_index0;
846         bnapi->hw_rx_cons_ptr =
847                 &bnapi->status_blk.msi->status_rx_quick_consumer_index0;
848         if (bp->flags & BNX2_FLAG_MSIX_CAP) {
849                 for (i = 1; i < BNX2_MAX_MSIX_VEC; i++) {
850                         struct status_block_msix *sblk;
851
852                         bnapi = &bp->bnx2_napi[i];
853
854                         sblk = (void *) (status_blk +
855                                          BNX2_SBLK_MSIX_ALIGN_SIZE * i);
856                         bnapi->status_blk.msix = sblk;
857                         bnapi->hw_tx_cons_ptr =
858                                 &sblk->status_tx_quick_consumer_index;
859                         bnapi->hw_rx_cons_ptr =
860                                 &sblk->status_rx_quick_consumer_index;
861                         bnapi->int_num = i << 24;
862                 }
863         }
864
865         bp->stats_blk = status_blk + status_blk_size;
866
867         bp->stats_blk_mapping = bp->status_blk_mapping + status_blk_size;
868
869         if (CHIP_NUM(bp) == CHIP_NUM_5709) {
870                 bp->ctx_pages = 0x2000 / BCM_PAGE_SIZE;
871                 if (bp->ctx_pages == 0)
872                         bp->ctx_pages = 1;
873                 for (i = 0; i < bp->ctx_pages; i++) {
874                         bp->ctx_blk[i] = pci_alloc_consistent(bp->pdev,
875                                                 BCM_PAGE_SIZE,
876                                                 &bp->ctx_blk_mapping[i]);
877                         if (bp->ctx_blk[i] == NULL)
878                                 goto alloc_mem_err;
879                 }
880         }
881
882         err = bnx2_alloc_rx_mem(bp);
883         if (err)
884                 goto alloc_mem_err;
885
886         err = bnx2_alloc_tx_mem(bp);
887         if (err)
888                 goto alloc_mem_err;
889
890         return 0;
891
892 alloc_mem_err:
893         bnx2_free_mem(bp);
894         return -ENOMEM;
895 }
896
897 static void
898 bnx2_report_fw_link(struct bnx2 *bp)
899 {
900         u32 fw_link_status = 0;
901
902         if (bp->phy_flags & BNX2_PHY_FLAG_REMOTE_PHY_CAP)
903                 return;
904
905         if (bp->link_up) {
906                 u32 bmsr;
907
908                 switch (bp->line_speed) {
909                 case SPEED_10:
910                         if (bp->duplex == DUPLEX_HALF)
911                                 fw_link_status = BNX2_LINK_STATUS_10HALF;
912                         else
913                                 fw_link_status = BNX2_LINK_STATUS_10FULL;
914                         break;
915                 case SPEED_100:
916                         if (bp->duplex == DUPLEX_HALF)
917                                 fw_link_status = BNX2_LINK_STATUS_100HALF;
918                         else
919                                 fw_link_status = BNX2_LINK_STATUS_100FULL;
920                         break;
921                 case SPEED_1000:
922                         if (bp->duplex == DUPLEX_HALF)
923                                 fw_link_status = BNX2_LINK_STATUS_1000HALF;
924                         else
925                                 fw_link_status = BNX2_LINK_STATUS_1000FULL;
926                         break;
927                 case SPEED_2500:
928                         if (bp->duplex == DUPLEX_HALF)
929                                 fw_link_status = BNX2_LINK_STATUS_2500HALF;
930                         else
931                                 fw_link_status = BNX2_LINK_STATUS_2500FULL;
932                         break;
933                 }
934
935                 fw_link_status |= BNX2_LINK_STATUS_LINK_UP;
936
937                 if (bp->autoneg) {
938                         fw_link_status |= BNX2_LINK_STATUS_AN_ENABLED;
939
940                         bnx2_read_phy(bp, bp->mii_bmsr, &bmsr);
941                         bnx2_read_phy(bp, bp->mii_bmsr, &bmsr);
942
943                         if (!(bmsr & BMSR_ANEGCOMPLETE) ||
944                             bp->phy_flags & BNX2_PHY_FLAG_PARALLEL_DETECT)
945                                 fw_link_status |= BNX2_LINK_STATUS_PARALLEL_DET;
946                         else
947                                 fw_link_status |= BNX2_LINK_STATUS_AN_COMPLETE;
948                 }
949         }
950         else
951                 fw_link_status = BNX2_LINK_STATUS_LINK_DOWN;
952
953         bnx2_shmem_wr(bp, BNX2_LINK_STATUS, fw_link_status);
954 }
955
956 static char *
957 bnx2_xceiver_str(struct bnx2 *bp)
958 {
959         return ((bp->phy_port == PORT_FIBRE) ? "SerDes" :
960                 ((bp->phy_flags & BNX2_PHY_FLAG_SERDES) ? "Remote Copper" :
961                  "Copper"));
962 }
963
964 static void
965 bnx2_report_link(struct bnx2 *bp)
966 {
967         if (bp->link_up) {
968                 netif_carrier_on(bp->dev);
969                 printk(KERN_INFO PFX "%s NIC %s Link is Up, ", bp->dev->name,
970                        bnx2_xceiver_str(bp));
971
972                 printk("%d Mbps ", bp->line_speed);
973
974                 if (bp->duplex == DUPLEX_FULL)
975                         printk("full duplex");
976                 else
977                         printk("half duplex");
978
979                 if (bp->flow_ctrl) {
980                         if (bp->flow_ctrl & FLOW_CTRL_RX) {
981                                 printk(", receive ");
982                                 if (bp->flow_ctrl & FLOW_CTRL_TX)
983                                         printk("& transmit ");
984                         }
985                         else {
986                                 printk(", transmit ");
987                         }
988                         printk("flow control ON");
989                 }
990                 printk("\n");
991         }
992         else {
993                 netif_carrier_off(bp->dev);
994                 printk(KERN_ERR PFX "%s NIC %s Link is Down\n", bp->dev->name,
995                        bnx2_xceiver_str(bp));
996         }
997
998         bnx2_report_fw_link(bp);
999 }
1000
1001 static void
1002 bnx2_resolve_flow_ctrl(struct bnx2 *bp)
1003 {
1004         u32 local_adv, remote_adv;
1005
1006         bp->flow_ctrl = 0;
1007         if ((bp->autoneg & (AUTONEG_SPEED | AUTONEG_FLOW_CTRL)) !=
1008                 (AUTONEG_SPEED | AUTONEG_FLOW_CTRL)) {
1009
1010                 if (bp->duplex == DUPLEX_FULL) {
1011                         bp->flow_ctrl = bp->req_flow_ctrl;
1012                 }
1013                 return;
1014         }
1015
1016         if (bp->duplex != DUPLEX_FULL) {
1017                 return;
1018         }
1019
1020         if ((bp->phy_flags & BNX2_PHY_FLAG_SERDES) &&
1021             (CHIP_NUM(bp) == CHIP_NUM_5708)) {
1022                 u32 val;
1023
1024                 bnx2_read_phy(bp, BCM5708S_1000X_STAT1, &val);
1025                 if (val & BCM5708S_1000X_STAT1_TX_PAUSE)
1026                         bp->flow_ctrl |= FLOW_CTRL_TX;
1027                 if (val & BCM5708S_1000X_STAT1_RX_PAUSE)
1028                         bp->flow_ctrl |= FLOW_CTRL_RX;
1029                 return;
1030         }
1031
1032         bnx2_read_phy(bp, bp->mii_adv, &local_adv);
1033         bnx2_read_phy(bp, bp->mii_lpa, &remote_adv);
1034
1035         if (bp->phy_flags & BNX2_PHY_FLAG_SERDES) {
1036                 u32 new_local_adv = 0;
1037                 u32 new_remote_adv = 0;
1038
1039                 if (local_adv & ADVERTISE_1000XPAUSE)
1040                         new_local_adv |= ADVERTISE_PAUSE_CAP;
1041                 if (local_adv & ADVERTISE_1000XPSE_ASYM)
1042                         new_local_adv |= ADVERTISE_PAUSE_ASYM;
1043                 if (remote_adv & ADVERTISE_1000XPAUSE)
1044                         new_remote_adv |= ADVERTISE_PAUSE_CAP;
1045                 if (remote_adv & ADVERTISE_1000XPSE_ASYM)
1046                         new_remote_adv |= ADVERTISE_PAUSE_ASYM;
1047
1048                 local_adv = new_local_adv;
1049                 remote_adv = new_remote_adv;
1050         }
1051
1052         /* See Table 28B-3 of 802.3ab-1999 spec. */
1053         if (local_adv & ADVERTISE_PAUSE_CAP) {
1054                 if(local_adv & ADVERTISE_PAUSE_ASYM) {
1055                         if (remote_adv & ADVERTISE_PAUSE_CAP) {
1056                                 bp->flow_ctrl = FLOW_CTRL_TX | FLOW_CTRL_RX;
1057                         }
1058                         else if (remote_adv & ADVERTISE_PAUSE_ASYM) {
1059                                 bp->flow_ctrl = FLOW_CTRL_RX;
1060                         }
1061                 }
1062                 else {
1063                         if (remote_adv & ADVERTISE_PAUSE_CAP) {
1064                                 bp->flow_ctrl = FLOW_CTRL_TX | FLOW_CTRL_RX;
1065                         }
1066                 }
1067         }
1068         else if (local_adv & ADVERTISE_PAUSE_ASYM) {
1069                 if ((remote_adv & ADVERTISE_PAUSE_CAP) &&
1070                         (remote_adv & ADVERTISE_PAUSE_ASYM)) {
1071
1072                         bp->flow_ctrl = FLOW_CTRL_TX;
1073                 }
1074         }
1075 }
1076
1077 static int
1078 bnx2_5709s_linkup(struct bnx2 *bp)
1079 {
1080         u32 val, speed;
1081
1082         bp->link_up = 1;
1083
1084         bnx2_write_phy(bp, MII_BNX2_BLK_ADDR, MII_BNX2_BLK_ADDR_GP_STATUS);
1085         bnx2_read_phy(bp, MII_BNX2_GP_TOP_AN_STATUS1, &val);
1086         bnx2_write_phy(bp, MII_BNX2_BLK_ADDR, MII_BNX2_BLK_ADDR_COMBO_IEEEB0);
1087
1088         if ((bp->autoneg & AUTONEG_SPEED) == 0) {
1089                 bp->line_speed = bp->req_line_speed;
1090                 bp->duplex = bp->req_duplex;
1091                 return 0;
1092         }
1093         speed = val & MII_BNX2_GP_TOP_AN_SPEED_MSK;
1094         switch (speed) {
1095                 case MII_BNX2_GP_TOP_AN_SPEED_10:
1096                         bp->line_speed = SPEED_10;
1097                         break;
1098                 case MII_BNX2_GP_TOP_AN_SPEED_100:
1099                         bp->line_speed = SPEED_100;
1100                         break;
1101                 case MII_BNX2_GP_TOP_AN_SPEED_1G:
1102                 case MII_BNX2_GP_TOP_AN_SPEED_1GKV:
1103                         bp->line_speed = SPEED_1000;
1104                         break;
1105                 case MII_BNX2_GP_TOP_AN_SPEED_2_5G:
1106                         bp->line_speed = SPEED_2500;
1107                         break;
1108         }
1109         if (val & MII_BNX2_GP_TOP_AN_FD)
1110                 bp->duplex = DUPLEX_FULL;
1111         else
1112                 bp->duplex = DUPLEX_HALF;
1113         return 0;
1114 }
1115
1116 static int
1117 bnx2_5708s_linkup(struct bnx2 *bp)
1118 {
1119         u32 val;
1120
1121         bp->link_up = 1;
1122         bnx2_read_phy(bp, BCM5708S_1000X_STAT1, &val);
1123         switch (val & BCM5708S_1000X_STAT1_SPEED_MASK) {
1124                 case BCM5708S_1000X_STAT1_SPEED_10:
1125                         bp->line_speed = SPEED_10;
1126                         break;
1127                 case BCM5708S_1000X_STAT1_SPEED_100:
1128                         bp->line_speed = SPEED_100;
1129                         break;
1130                 case BCM5708S_1000X_STAT1_SPEED_1G:
1131                         bp->line_speed = SPEED_1000;
1132                         break;
1133                 case BCM5708S_1000X_STAT1_SPEED_2G5:
1134                         bp->line_speed = SPEED_2500;
1135                         break;
1136         }
1137         if (val & BCM5708S_1000X_STAT1_FD)
1138                 bp->duplex = DUPLEX_FULL;
1139         else
1140                 bp->duplex = DUPLEX_HALF;
1141
1142         return 0;
1143 }
1144
1145 static int
1146 bnx2_5706s_linkup(struct bnx2 *bp)
1147 {
1148         u32 bmcr, local_adv, remote_adv, common;
1149
1150         bp->link_up = 1;
1151         bp->line_speed = SPEED_1000;
1152
1153         bnx2_read_phy(bp, bp->mii_bmcr, &bmcr);
1154         if (bmcr & BMCR_FULLDPLX) {
1155                 bp->duplex = DUPLEX_FULL;
1156         }
1157         else {
1158                 bp->duplex = DUPLEX_HALF;
1159         }
1160
1161         if (!(bmcr & BMCR_ANENABLE)) {
1162                 return 0;
1163         }
1164
1165         bnx2_read_phy(bp, bp->mii_adv, &local_adv);
1166         bnx2_read_phy(bp, bp->mii_lpa, &remote_adv);
1167
1168         common = local_adv & remote_adv;
1169         if (common & (ADVERTISE_1000XHALF | ADVERTISE_1000XFULL)) {
1170
1171                 if (common & ADVERTISE_1000XFULL) {
1172                         bp->duplex = DUPLEX_FULL;
1173                 }
1174                 else {
1175                         bp->duplex = DUPLEX_HALF;
1176                 }
1177         }
1178
1179         return 0;
1180 }
1181
1182 static int
1183 bnx2_copper_linkup(struct bnx2 *bp)
1184 {
1185         u32 bmcr;
1186
1187         bnx2_read_phy(bp, bp->mii_bmcr, &bmcr);
1188         if (bmcr & BMCR_ANENABLE) {
1189                 u32 local_adv, remote_adv, common;
1190
1191                 bnx2_read_phy(bp, MII_CTRL1000, &local_adv);
1192                 bnx2_read_phy(bp, MII_STAT1000, &remote_adv);
1193
1194                 common = local_adv & (remote_adv >> 2);
1195                 if (common & ADVERTISE_1000FULL) {
1196                         bp->line_speed = SPEED_1000;
1197                         bp->duplex = DUPLEX_FULL;
1198                 }
1199                 else if (common & ADVERTISE_1000HALF) {
1200                         bp->line_speed = SPEED_1000;
1201                         bp->duplex = DUPLEX_HALF;
1202                 }
1203                 else {
1204                         bnx2_read_phy(bp, bp->mii_adv, &local_adv);
1205                         bnx2_read_phy(bp, bp->mii_lpa, &remote_adv);
1206
1207                         common = local_adv & remote_adv;
1208                         if (common & ADVERTISE_100FULL) {
1209                                 bp->line_speed = SPEED_100;
1210                                 bp->duplex = DUPLEX_FULL;
1211                         }
1212                         else if (common & ADVERTISE_100HALF) {
1213                                 bp->line_speed = SPEED_100;
1214                                 bp->duplex = DUPLEX_HALF;
1215                         }
1216                         else if (common & ADVERTISE_10FULL) {
1217                                 bp->line_speed = SPEED_10;
1218                                 bp->duplex = DUPLEX_FULL;
1219                         }
1220                         else if (common & ADVERTISE_10HALF) {
1221                                 bp->line_speed = SPEED_10;
1222                                 bp->duplex = DUPLEX_HALF;
1223                         }
1224                         else {
1225                                 bp->line_speed = 0;
1226                                 bp->link_up = 0;
1227                         }
1228                 }
1229         }
1230         else {
1231                 if (bmcr & BMCR_SPEED100) {
1232                         bp->line_speed = SPEED_100;
1233                 }
1234                 else {
1235                         bp->line_speed = SPEED_10;
1236                 }
1237                 if (bmcr & BMCR_FULLDPLX) {
1238                         bp->duplex = DUPLEX_FULL;
1239                 }
1240                 else {
1241                         bp->duplex = DUPLEX_HALF;
1242                 }
1243         }
1244
1245         return 0;
1246 }
1247
1248 static void
1249 bnx2_init_rx_context(struct bnx2 *bp, u32 cid)
1250 {
1251         u32 val, rx_cid_addr = GET_CID_ADDR(cid);
1252
1253         val = BNX2_L2CTX_CTX_TYPE_CTX_BD_CHN_TYPE_VALUE;
1254         val |= BNX2_L2CTX_CTX_TYPE_SIZE_L2;
1255         val |= 0x02 << 8;
1256
1257         if (CHIP_NUM(bp) == CHIP_NUM_5709) {
1258                 u32 lo_water, hi_water;
1259
1260                 if (bp->flow_ctrl & FLOW_CTRL_TX)
1261                         lo_water = BNX2_L2CTX_LO_WATER_MARK_DEFAULT;
1262                 else
1263                         lo_water = BNX2_L2CTX_LO_WATER_MARK_DIS;
1264                 if (lo_water >= bp->rx_ring_size)
1265                         lo_water = 0;
1266
1267                 hi_water = bp->rx_ring_size / 4;
1268
1269                 if (hi_water <= lo_water)
1270                         lo_water = 0;
1271
1272                 hi_water /= BNX2_L2CTX_HI_WATER_MARK_SCALE;
1273                 lo_water /= BNX2_L2CTX_LO_WATER_MARK_SCALE;
1274
1275                 if (hi_water > 0xf)
1276                         hi_water = 0xf;
1277                 else if (hi_water == 0)
1278                         lo_water = 0;
1279                 val |= lo_water | (hi_water << BNX2_L2CTX_HI_WATER_MARK_SHIFT);
1280         }
1281         bnx2_ctx_wr(bp, rx_cid_addr, BNX2_L2CTX_CTX_TYPE, val);
1282 }
1283
1284 static void
1285 bnx2_init_all_rx_contexts(struct bnx2 *bp)
1286 {
1287         int i;
1288         u32 cid;
1289
1290         for (i = 0, cid = RX_CID; i < bp->num_rx_rings; i++, cid++) {
1291                 if (i == 1)
1292                         cid = RX_RSS_CID;
1293                 bnx2_init_rx_context(bp, cid);
1294         }
1295 }
1296
1297 static void
1298 bnx2_set_mac_link(struct bnx2 *bp)
1299 {
1300         u32 val;
1301
1302         REG_WR(bp, BNX2_EMAC_TX_LENGTHS, 0x2620);
1303         if (bp->link_up && (bp->line_speed == SPEED_1000) &&
1304                 (bp->duplex == DUPLEX_HALF)) {
1305                 REG_WR(bp, BNX2_EMAC_TX_LENGTHS, 0x26ff);
1306         }
1307
1308         /* Configure the EMAC mode register. */
1309         val = REG_RD(bp, BNX2_EMAC_MODE);
1310
1311         val &= ~(BNX2_EMAC_MODE_PORT | BNX2_EMAC_MODE_HALF_DUPLEX |
1312                 BNX2_EMAC_MODE_MAC_LOOP | BNX2_EMAC_MODE_FORCE_LINK |
1313                 BNX2_EMAC_MODE_25G_MODE);
1314
1315         if (bp->link_up) {
1316                 switch (bp->line_speed) {
1317                         case SPEED_10:
1318                                 if (CHIP_NUM(bp) != CHIP_NUM_5706) {
1319                                         val |= BNX2_EMAC_MODE_PORT_MII_10M;
1320                                         break;
1321                                 }
1322                                 /* fall through */
1323                         case SPEED_100:
1324                                 val |= BNX2_EMAC_MODE_PORT_MII;
1325                                 break;
1326                         case SPEED_2500:
1327                                 val |= BNX2_EMAC_MODE_25G_MODE;
1328                                 /* fall through */
1329                         case SPEED_1000:
1330                                 val |= BNX2_EMAC_MODE_PORT_GMII;
1331                                 break;
1332                 }
1333         }
1334         else {
1335                 val |= BNX2_EMAC_MODE_PORT_GMII;
1336         }
1337
1338         /* Set the MAC to operate in the appropriate duplex mode. */
1339         if (bp->duplex == DUPLEX_HALF)
1340                 val |= BNX2_EMAC_MODE_HALF_DUPLEX;
1341         REG_WR(bp, BNX2_EMAC_MODE, val);
1342
1343         /* Enable/disable rx PAUSE. */
1344         bp->rx_mode &= ~BNX2_EMAC_RX_MODE_FLOW_EN;
1345
1346         if (bp->flow_ctrl & FLOW_CTRL_RX)
1347                 bp->rx_mode |= BNX2_EMAC_RX_MODE_FLOW_EN;
1348         REG_WR(bp, BNX2_EMAC_RX_MODE, bp->rx_mode);
1349
1350         /* Enable/disable tx PAUSE. */
1351         val = REG_RD(bp, BNX2_EMAC_TX_MODE);
1352         val &= ~BNX2_EMAC_TX_MODE_FLOW_EN;
1353
1354         if (bp->flow_ctrl & FLOW_CTRL_TX)
1355                 val |= BNX2_EMAC_TX_MODE_FLOW_EN;
1356         REG_WR(bp, BNX2_EMAC_TX_MODE, val);
1357
1358         /* Acknowledge the interrupt. */
1359         REG_WR(bp, BNX2_EMAC_STATUS, BNX2_EMAC_STATUS_LINK_CHANGE);
1360
1361         if (CHIP_NUM(bp) == CHIP_NUM_5709)
1362                 bnx2_init_all_rx_contexts(bp);
1363 }
1364
1365 static void
1366 bnx2_enable_bmsr1(struct bnx2 *bp)
1367 {
1368         if ((bp->phy_flags & BNX2_PHY_FLAG_SERDES) &&
1369             (CHIP_NUM(bp) == CHIP_NUM_5709))
1370                 bnx2_write_phy(bp, MII_BNX2_BLK_ADDR,
1371                                MII_BNX2_BLK_ADDR_GP_STATUS);
1372 }
1373
1374 static void
1375 bnx2_disable_bmsr1(struct bnx2 *bp)
1376 {
1377         if ((bp->phy_flags & BNX2_PHY_FLAG_SERDES) &&
1378             (CHIP_NUM(bp) == CHIP_NUM_5709))
1379                 bnx2_write_phy(bp, MII_BNX2_BLK_ADDR,
1380                                MII_BNX2_BLK_ADDR_COMBO_IEEEB0);
1381 }
1382
1383 static int
1384 bnx2_test_and_enable_2g5(struct bnx2 *bp)
1385 {
1386         u32 up1;
1387         int ret = 1;
1388
1389         if (!(bp->phy_flags & BNX2_PHY_FLAG_2_5G_CAPABLE))
1390                 return 0;
1391
1392         if (bp->autoneg & AUTONEG_SPEED)
1393                 bp->advertising |= ADVERTISED_2500baseX_Full;
1394
1395         if (CHIP_NUM(bp) == CHIP_NUM_5709)
1396                 bnx2_write_phy(bp, MII_BNX2_BLK_ADDR, MII_BNX2_BLK_ADDR_OVER1G);
1397
1398         bnx2_read_phy(bp, bp->mii_up1, &up1);
1399         if (!(up1 & BCM5708S_UP1_2G5)) {
1400                 up1 |= BCM5708S_UP1_2G5;
1401                 bnx2_write_phy(bp, bp->mii_up1, up1);
1402                 ret = 0;
1403         }
1404
1405         if (CHIP_NUM(bp) == CHIP_NUM_5709)
1406                 bnx2_write_phy(bp, MII_BNX2_BLK_ADDR,
1407                                MII_BNX2_BLK_ADDR_COMBO_IEEEB0);
1408
1409         return ret;
1410 }
1411
1412 static int
1413 bnx2_test_and_disable_2g5(struct bnx2 *bp)
1414 {
1415         u32 up1;
1416         int ret = 0;
1417
1418         if (!(bp->phy_flags & BNX2_PHY_FLAG_2_5G_CAPABLE))
1419                 return 0;
1420
1421         if (CHIP_NUM(bp) == CHIP_NUM_5709)
1422                 bnx2_write_phy(bp, MII_BNX2_BLK_ADDR, MII_BNX2_BLK_ADDR_OVER1G);
1423
1424         bnx2_read_phy(bp, bp->mii_up1, &up1);
1425         if (up1 & BCM5708S_UP1_2G5) {
1426                 up1 &= ~BCM5708S_UP1_2G5;
1427                 bnx2_write_phy(bp, bp->mii_up1, up1);
1428                 ret = 1;
1429         }
1430
1431         if (CHIP_NUM(bp) == CHIP_NUM_5709)
1432                 bnx2_write_phy(bp, MII_BNX2_BLK_ADDR,
1433                                MII_BNX2_BLK_ADDR_COMBO_IEEEB0);
1434
1435         return ret;
1436 }
1437
1438 static void
1439 bnx2_enable_forced_2g5(struct bnx2 *bp)
1440 {
1441         u32 bmcr;
1442
1443         if (!(bp->phy_flags & BNX2_PHY_FLAG_2_5G_CAPABLE))
1444                 return;
1445
1446         if (CHIP_NUM(bp) == CHIP_NUM_5709) {
1447                 u32 val;
1448
1449                 bnx2_write_phy(bp, MII_BNX2_BLK_ADDR,
1450                                MII_BNX2_BLK_ADDR_SERDES_DIG);
1451                 bnx2_read_phy(bp, MII_BNX2_SERDES_DIG_MISC1, &val);
1452                 val &= ~MII_BNX2_SD_MISC1_FORCE_MSK;
1453                 val |= MII_BNX2_SD_MISC1_FORCE | MII_BNX2_SD_MISC1_FORCE_2_5G;
1454                 bnx2_write_phy(bp, MII_BNX2_SERDES_DIG_MISC1, val);
1455
1456                 bnx2_write_phy(bp, MII_BNX2_BLK_ADDR,
1457                                MII_BNX2_BLK_ADDR_COMBO_IEEEB0);
1458                 bnx2_read_phy(bp, bp->mii_bmcr, &bmcr);
1459
1460         } else if (CHIP_NUM(bp) == CHIP_NUM_5708) {
1461                 bnx2_read_phy(bp, bp->mii_bmcr, &bmcr);
1462                 bmcr |= BCM5708S_BMCR_FORCE_2500;
1463         }
1464
1465         if (bp->autoneg & AUTONEG_SPEED) {
1466                 bmcr &= ~BMCR_ANENABLE;
1467                 if (bp->req_duplex == DUPLEX_FULL)
1468                         bmcr |= BMCR_FULLDPLX;
1469         }
1470         bnx2_write_phy(bp, bp->mii_bmcr, bmcr);
1471 }
1472
1473 static void
1474 bnx2_disable_forced_2g5(struct bnx2 *bp)
1475 {
1476         u32 bmcr;
1477
1478         if (!(bp->phy_flags & BNX2_PHY_FLAG_2_5G_CAPABLE))
1479                 return;
1480
1481         if (CHIP_NUM(bp) == CHIP_NUM_5709) {
1482                 u32 val;
1483
1484                 bnx2_write_phy(bp, MII_BNX2_BLK_ADDR,
1485                                MII_BNX2_BLK_ADDR_SERDES_DIG);
1486                 bnx2_read_phy(bp, MII_BNX2_SERDES_DIG_MISC1, &val);
1487                 val &= ~MII_BNX2_SD_MISC1_FORCE;
1488                 bnx2_write_phy(bp, MII_BNX2_SERDES_DIG_MISC1, val);
1489
1490                 bnx2_write_phy(bp, MII_BNX2_BLK_ADDR,
1491                                MII_BNX2_BLK_ADDR_COMBO_IEEEB0);
1492                 bnx2_read_phy(bp, bp->mii_bmcr, &bmcr);
1493
1494         } else if (CHIP_NUM(bp) == CHIP_NUM_5708) {
1495                 bnx2_read_phy(bp, bp->mii_bmcr, &bmcr);
1496                 bmcr &= ~BCM5708S_BMCR_FORCE_2500;
1497         }
1498
1499         if (bp->autoneg & AUTONEG_SPEED)
1500                 bmcr |= BMCR_SPEED1000 | BMCR_ANENABLE | BMCR_ANRESTART;
1501         bnx2_write_phy(bp, bp->mii_bmcr, bmcr);
1502 }
1503
1504 static void
1505 bnx2_5706s_force_link_dn(struct bnx2 *bp, int start)
1506 {
1507         u32 val;
1508
1509         bnx2_write_phy(bp, MII_BNX2_DSP_ADDRESS, MII_EXPAND_SERDES_CTL);
1510         bnx2_read_phy(bp, MII_BNX2_DSP_RW_PORT, &val);
1511         if (start)
1512                 bnx2_write_phy(bp, MII_BNX2_DSP_RW_PORT, val & 0xff0f);
1513         else
1514                 bnx2_write_phy(bp, MII_BNX2_DSP_RW_PORT, val | 0xc0);
1515 }
1516
1517 static int
1518 bnx2_set_link(struct bnx2 *bp)
1519 {
1520         u32 bmsr;
1521         u8 link_up;
1522
1523         if (bp->loopback == MAC_LOOPBACK || bp->loopback == PHY_LOOPBACK) {
1524                 bp->link_up = 1;
1525                 return 0;
1526         }
1527
1528         if (bp->phy_flags & BNX2_PHY_FLAG_REMOTE_PHY_CAP)
1529                 return 0;
1530
1531         link_up = bp->link_up;
1532
1533         bnx2_enable_bmsr1(bp);
1534         bnx2_read_phy(bp, bp->mii_bmsr1, &bmsr);
1535         bnx2_read_phy(bp, bp->mii_bmsr1, &bmsr);
1536         bnx2_disable_bmsr1(bp);
1537
1538         if ((bp->phy_flags & BNX2_PHY_FLAG_SERDES) &&
1539             (CHIP_NUM(bp) == CHIP_NUM_5706)) {
1540                 u32 val, an_dbg;
1541
1542                 if (bp->phy_flags & BNX2_PHY_FLAG_FORCED_DOWN) {
1543                         bnx2_5706s_force_link_dn(bp, 0);
1544                         bp->phy_flags &= ~BNX2_PHY_FLAG_FORCED_DOWN;
1545                 }
1546                 val = REG_RD(bp, BNX2_EMAC_STATUS);
1547
1548                 bnx2_write_phy(bp, MII_BNX2_MISC_SHADOW, MISC_SHDW_AN_DBG);
1549                 bnx2_read_phy(bp, MII_BNX2_MISC_SHADOW, &an_dbg);
1550                 bnx2_read_phy(bp, MII_BNX2_MISC_SHADOW, &an_dbg);
1551
1552                 if ((val & BNX2_EMAC_STATUS_LINK) &&
1553                     !(an_dbg & MISC_SHDW_AN_DBG_NOSYNC))
1554                         bmsr |= BMSR_LSTATUS;
1555                 else
1556                         bmsr &= ~BMSR_LSTATUS;
1557         }
1558
1559         if (bmsr & BMSR_LSTATUS) {
1560                 bp->link_up = 1;
1561
1562                 if (bp->phy_flags & BNX2_PHY_FLAG_SERDES) {
1563                         if (CHIP_NUM(bp) == CHIP_NUM_5706)
1564                                 bnx2_5706s_linkup(bp);
1565                         else if (CHIP_NUM(bp) == CHIP_NUM_5708)
1566                                 bnx2_5708s_linkup(bp);
1567                         else if (CHIP_NUM(bp) == CHIP_NUM_5709)
1568                                 bnx2_5709s_linkup(bp);
1569                 }
1570                 else {
1571                         bnx2_copper_linkup(bp);
1572                 }
1573                 bnx2_resolve_flow_ctrl(bp);
1574         }
1575         else {
1576                 if ((bp->phy_flags & BNX2_PHY_FLAG_SERDES) &&
1577                     (bp->autoneg & AUTONEG_SPEED))
1578                         bnx2_disable_forced_2g5(bp);
1579
1580                 if (bp->phy_flags & BNX2_PHY_FLAG_PARALLEL_DETECT) {
1581                         u32 bmcr;
1582
1583                         bnx2_read_phy(bp, bp->mii_bmcr, &bmcr);
1584                         bmcr |= BMCR_ANENABLE;
1585                         bnx2_write_phy(bp, bp->mii_bmcr, bmcr);
1586
1587                         bp->phy_flags &= ~BNX2_PHY_FLAG_PARALLEL_DETECT;
1588                 }
1589                 bp->link_up = 0;
1590         }
1591
1592         if (bp->link_up != link_up) {
1593                 bnx2_report_link(bp);
1594         }
1595
1596         bnx2_set_mac_link(bp);
1597
1598         return 0;
1599 }
1600
1601 static int
1602 bnx2_reset_phy(struct bnx2 *bp)
1603 {
1604         int i;
1605         u32 reg;
1606
1607         bnx2_write_phy(bp, bp->mii_bmcr, BMCR_RESET);
1608
1609 #define PHY_RESET_MAX_WAIT 100
1610         for (i = 0; i < PHY_RESET_MAX_WAIT; i++) {
1611                 udelay(10);
1612
1613                 bnx2_read_phy(bp, bp->mii_bmcr, &reg);
1614                 if (!(reg & BMCR_RESET)) {
1615                         udelay(20);
1616                         break;
1617                 }
1618         }
1619         if (i == PHY_RESET_MAX_WAIT) {
1620                 return -EBUSY;
1621         }
1622         return 0;
1623 }
1624
1625 static u32
1626 bnx2_phy_get_pause_adv(struct bnx2 *bp)
1627 {
1628         u32 adv = 0;
1629
1630         if ((bp->req_flow_ctrl & (FLOW_CTRL_RX | FLOW_CTRL_TX)) ==
1631                 (FLOW_CTRL_RX | FLOW_CTRL_TX)) {
1632
1633                 if (bp->phy_flags & BNX2_PHY_FLAG_SERDES) {
1634                         adv = ADVERTISE_1000XPAUSE;
1635                 }
1636                 else {
1637                         adv = ADVERTISE_PAUSE_CAP;
1638                 }
1639         }
1640         else if (bp->req_flow_ctrl & FLOW_CTRL_TX) {
1641                 if (bp->phy_flags & BNX2_PHY_FLAG_SERDES) {
1642                         adv = ADVERTISE_1000XPSE_ASYM;
1643                 }
1644                 else {
1645                         adv = ADVERTISE_PAUSE_ASYM;
1646                 }
1647         }
1648         else if (bp->req_flow_ctrl & FLOW_CTRL_RX) {
1649                 if (bp->phy_flags & BNX2_PHY_FLAG_SERDES) {
1650                         adv = ADVERTISE_1000XPAUSE | ADVERTISE_1000XPSE_ASYM;
1651                 }
1652                 else {
1653                         adv = ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM;
1654                 }
1655         }
1656         return adv;
1657 }
1658
1659 static int bnx2_fw_sync(struct bnx2 *, u32, int, int);
1660
1661 static int
1662 bnx2_setup_remote_phy(struct bnx2 *bp, u8 port)
1663 __releases(&bp->phy_lock)
1664 __acquires(&bp->phy_lock)
1665 {
1666         u32 speed_arg = 0, pause_adv;
1667
1668         pause_adv = bnx2_phy_get_pause_adv(bp);
1669
1670         if (bp->autoneg & AUTONEG_SPEED) {
1671                 speed_arg |= BNX2_NETLINK_SET_LINK_ENABLE_AUTONEG;
1672                 if (bp->advertising & ADVERTISED_10baseT_Half)
1673                         speed_arg |= BNX2_NETLINK_SET_LINK_SPEED_10HALF;
1674                 if (bp->advertising & ADVERTISED_10baseT_Full)
1675                         speed_arg |= BNX2_NETLINK_SET_LINK_SPEED_10FULL;
1676                 if (bp->advertising & ADVERTISED_100baseT_Half)
1677                         speed_arg |= BNX2_NETLINK_SET_LINK_SPEED_100HALF;
1678                 if (bp->advertising & ADVERTISED_100baseT_Full)
1679                         speed_arg |= BNX2_NETLINK_SET_LINK_SPEED_100FULL;
1680                 if (bp->advertising & ADVERTISED_1000baseT_Full)
1681                         speed_arg |= BNX2_NETLINK_SET_LINK_SPEED_1GFULL;
1682                 if (bp->advertising & ADVERTISED_2500baseX_Full)
1683                         speed_arg |= BNX2_NETLINK_SET_LINK_SPEED_2G5FULL;
1684         } else {
1685                 if (bp->req_line_speed == SPEED_2500)
1686                         speed_arg = BNX2_NETLINK_SET_LINK_SPEED_2G5FULL;
1687                 else if (bp->req_line_speed == SPEED_1000)
1688                         speed_arg = BNX2_NETLINK_SET_LINK_SPEED_1GFULL;
1689                 else if (bp->req_line_speed == SPEED_100) {
1690                         if (bp->req_duplex == DUPLEX_FULL)
1691                                 speed_arg = BNX2_NETLINK_SET_LINK_SPEED_100FULL;
1692                         else
1693                                 speed_arg = BNX2_NETLINK_SET_LINK_SPEED_100HALF;
1694                 } else if (bp->req_line_speed == SPEED_10) {
1695                         if (bp->req_duplex == DUPLEX_FULL)
1696                                 speed_arg = BNX2_NETLINK_SET_LINK_SPEED_10FULL;
1697                         else
1698                                 speed_arg = BNX2_NETLINK_SET_LINK_SPEED_10HALF;
1699                 }
1700         }
1701
1702         if (pause_adv & (ADVERTISE_1000XPAUSE | ADVERTISE_PAUSE_CAP))
1703                 speed_arg |= BNX2_NETLINK_SET_LINK_FC_SYM_PAUSE;
1704         if (pause_adv & (ADVERTISE_1000XPSE_ASYM | ADVERTISE_PAUSE_ASYM))
1705                 speed_arg |= BNX2_NETLINK_SET_LINK_FC_ASYM_PAUSE;
1706
1707         if (port == PORT_TP)
1708                 speed_arg |= BNX2_NETLINK_SET_LINK_PHY_APP_REMOTE |
1709                              BNX2_NETLINK_SET_LINK_ETH_AT_WIRESPEED;
1710
1711         bnx2_shmem_wr(bp, BNX2_DRV_MB_ARG0, speed_arg);
1712
1713         spin_unlock_bh(&bp->phy_lock);
1714         bnx2_fw_sync(bp, BNX2_DRV_MSG_CODE_CMD_SET_LINK, 1, 0);
1715         spin_lock_bh(&bp->phy_lock);
1716
1717         return 0;
1718 }
1719
1720 static int
1721 bnx2_setup_serdes_phy(struct bnx2 *bp, u8 port)
1722 __releases(&bp->phy_lock)
1723 __acquires(&bp->phy_lock)
1724 {
1725         u32 adv, bmcr;
1726         u32 new_adv = 0;
1727
1728         if (bp->phy_flags & BNX2_PHY_FLAG_REMOTE_PHY_CAP)
1729                 return (bnx2_setup_remote_phy(bp, port));
1730
1731         if (!(bp->autoneg & AUTONEG_SPEED)) {
1732                 u32 new_bmcr;
1733                 int force_link_down = 0;
1734
1735                 if (bp->req_line_speed == SPEED_2500) {
1736                         if (!bnx2_test_and_enable_2g5(bp))
1737                                 force_link_down = 1;
1738                 } else if (bp->req_line_speed == SPEED_1000) {
1739                         if (bnx2_test_and_disable_2g5(bp))
1740                                 force_link_down = 1;
1741                 }
1742                 bnx2_read_phy(bp, bp->mii_adv, &adv);
1743                 adv &= ~(ADVERTISE_1000XFULL | ADVERTISE_1000XHALF);
1744
1745                 bnx2_read_phy(bp, bp->mii_bmcr, &bmcr);
1746                 new_bmcr = bmcr & ~BMCR_ANENABLE;
1747                 new_bmcr |= BMCR_SPEED1000;
1748
1749                 if (CHIP_NUM(bp) == CHIP_NUM_5709) {
1750                         if (bp->req_line_speed == SPEED_2500)
1751                                 bnx2_enable_forced_2g5(bp);
1752                         else if (bp->req_line_speed == SPEED_1000) {
1753                                 bnx2_disable_forced_2g5(bp);
1754                                 new_bmcr &= ~0x2000;
1755                         }
1756
1757                 } else if (CHIP_NUM(bp) == CHIP_NUM_5708) {
1758                         if (bp->req_line_speed == SPEED_2500)
1759                                 new_bmcr |= BCM5708S_BMCR_FORCE_2500;
1760                         else
1761                                 new_bmcr = bmcr & ~BCM5708S_BMCR_FORCE_2500;
1762                 }
1763
1764                 if (bp->req_duplex == DUPLEX_FULL) {
1765                         adv |= ADVERTISE_1000XFULL;
1766                         new_bmcr |= BMCR_FULLDPLX;
1767                 }
1768                 else {
1769                         adv |= ADVERTISE_1000XHALF;
1770                         new_bmcr &= ~BMCR_FULLDPLX;
1771                 }
1772                 if ((new_bmcr != bmcr) || (force_link_down)) {
1773                         /* Force a link down visible on the other side */
1774                         if (bp->link_up) {
1775                                 bnx2_write_phy(bp, bp->mii_adv, adv &
1776                                                ~(ADVERTISE_1000XFULL |
1777                                                  ADVERTISE_1000XHALF));
1778                                 bnx2_write_phy(bp, bp->mii_bmcr, bmcr |
1779                                         BMCR_ANRESTART | BMCR_ANENABLE);
1780
1781                                 bp->link_up = 0;
1782                                 netif_carrier_off(bp->dev);
1783                                 bnx2_write_phy(bp, bp->mii_bmcr, new_bmcr);
1784                                 bnx2_report_link(bp);
1785                         }
1786                         bnx2_write_phy(bp, bp->mii_adv, adv);
1787                         bnx2_write_phy(bp, bp->mii_bmcr, new_bmcr);
1788                 } else {
1789                         bnx2_resolve_flow_ctrl(bp);
1790                         bnx2_set_mac_link(bp);
1791                 }
1792                 return 0;
1793         }
1794
1795         bnx2_test_and_enable_2g5(bp);
1796
1797         if (bp->advertising & ADVERTISED_1000baseT_Full)
1798                 new_adv |= ADVERTISE_1000XFULL;
1799
1800         new_adv |= bnx2_phy_get_pause_adv(bp);
1801
1802         bnx2_read_phy(bp, bp->mii_adv, &adv);
1803         bnx2_read_phy(bp, bp->mii_bmcr, &bmcr);
1804
1805         bp->serdes_an_pending = 0;
1806         if ((adv != new_adv) || ((bmcr & BMCR_ANENABLE) == 0)) {
1807                 /* Force a link down visible on the other side */
1808                 if (bp->link_up) {
1809                         bnx2_write_phy(bp, bp->mii_bmcr, BMCR_LOOPBACK);
1810                         spin_unlock_bh(&bp->phy_lock);
1811                         msleep(20);
1812                         spin_lock_bh(&bp->phy_lock);
1813                 }
1814
1815                 bnx2_write_phy(bp, bp->mii_adv, new_adv);
1816                 bnx2_write_phy(bp, bp->mii_bmcr, bmcr | BMCR_ANRESTART |
1817                         BMCR_ANENABLE);
1818                 /* Speed up link-up time when the link partner
1819                  * does not autonegotiate which is very common
1820                  * in blade servers. Some blade servers use
1821                  * IPMI for kerboard input and it's important
1822                  * to minimize link disruptions. Autoneg. involves
1823                  * exchanging base pages plus 3 next pages and
1824                  * normally completes in about 120 msec.
1825                  */
1826                 bp->current_interval = BNX2_SERDES_AN_TIMEOUT;
1827                 bp->serdes_an_pending = 1;
1828                 mod_timer(&bp->timer, jiffies + bp->current_interval);
1829         } else {
1830                 bnx2_resolve_flow_ctrl(bp);
1831                 bnx2_set_mac_link(bp);
1832         }
1833
1834         return 0;
1835 }
1836
1837 #define ETHTOOL_ALL_FIBRE_SPEED                                         \
1838         (bp->phy_flags & BNX2_PHY_FLAG_2_5G_CAPABLE) ?                  \
1839                 (ADVERTISED_2500baseX_Full | ADVERTISED_1000baseT_Full) :\
1840                 (ADVERTISED_1000baseT_Full)
1841
1842 #define ETHTOOL_ALL_COPPER_SPEED                                        \
1843         (ADVERTISED_10baseT_Half | ADVERTISED_10baseT_Full |            \
1844         ADVERTISED_100baseT_Half | ADVERTISED_100baseT_Full |           \
1845         ADVERTISED_1000baseT_Full)
1846
1847 #define PHY_ALL_10_100_SPEED (ADVERTISE_10HALF | ADVERTISE_10FULL | \
1848         ADVERTISE_100HALF | ADVERTISE_100FULL | ADVERTISE_CSMA)
1849
1850 #define PHY_ALL_1000_SPEED (ADVERTISE_1000HALF | ADVERTISE_1000FULL)
1851
1852 static void
1853 bnx2_set_default_remote_link(struct bnx2 *bp)
1854 {
1855         u32 link;
1856
1857         if (bp->phy_port == PORT_TP)
1858                 link = bnx2_shmem_rd(bp, BNX2_RPHY_COPPER_LINK);
1859         else
1860                 link = bnx2_shmem_rd(bp, BNX2_RPHY_SERDES_LINK);
1861
1862         if (link & BNX2_NETLINK_SET_LINK_ENABLE_AUTONEG) {
1863                 bp->req_line_speed = 0;
1864                 bp->autoneg |= AUTONEG_SPEED;
1865                 bp->advertising = ADVERTISED_Autoneg;
1866                 if (link & BNX2_NETLINK_SET_LINK_SPEED_10HALF)
1867                         bp->advertising |= ADVERTISED_10baseT_Half;
1868                 if (link & BNX2_NETLINK_SET_LINK_SPEED_10FULL)
1869                         bp->advertising |= ADVERTISED_10baseT_Full;
1870                 if (link & BNX2_NETLINK_SET_LINK_SPEED_100HALF)
1871                         bp->advertising |= ADVERTISED_100baseT_Half;
1872                 if (link & BNX2_NETLINK_SET_LINK_SPEED_100FULL)
1873                         bp->advertising |= ADVERTISED_100baseT_Full;
1874                 if (link & BNX2_NETLINK_SET_LINK_SPEED_1GFULL)
1875                         bp->advertising |= ADVERTISED_1000baseT_Full;
1876                 if (link & BNX2_NETLINK_SET_LINK_SPEED_2G5FULL)
1877                         bp->advertising |= ADVERTISED_2500baseX_Full;
1878         } else {
1879                 bp->autoneg = 0;
1880                 bp->advertising = 0;
1881                 bp->req_duplex = DUPLEX_FULL;
1882                 if (link & BNX2_NETLINK_SET_LINK_SPEED_10) {
1883                         bp->req_line_speed = SPEED_10;
1884                         if (link & BNX2_NETLINK_SET_LINK_SPEED_10HALF)
1885                                 bp->req_duplex = DUPLEX_HALF;
1886                 }
1887                 if (link & BNX2_NETLINK_SET_LINK_SPEED_100) {
1888                         bp->req_line_speed = SPEED_100;
1889                         if (link & BNX2_NETLINK_SET_LINK_SPEED_100HALF)
1890                                 bp->req_duplex = DUPLEX_HALF;
1891                 }
1892                 if (link & BNX2_NETLINK_SET_LINK_SPEED_1GFULL)
1893                         bp->req_line_speed = SPEED_1000;
1894                 if (link & BNX2_NETLINK_SET_LINK_SPEED_2G5FULL)
1895                         bp->req_line_speed = SPEED_2500;
1896         }
1897 }
1898
1899 static void
1900 bnx2_set_default_link(struct bnx2 *bp)
1901 {
1902         if (bp->phy_flags & BNX2_PHY_FLAG_REMOTE_PHY_CAP) {
1903                 bnx2_set_default_remote_link(bp);
1904                 return;
1905         }
1906
1907         bp->autoneg = AUTONEG_SPEED | AUTONEG_FLOW_CTRL;
1908         bp->req_line_speed = 0;
1909         if (bp->phy_flags & BNX2_PHY_FLAG_SERDES) {
1910                 u32 reg;
1911
1912                 bp->advertising = ETHTOOL_ALL_FIBRE_SPEED | ADVERTISED_Autoneg;
1913
1914                 reg = bnx2_shmem_rd(bp, BNX2_PORT_HW_CFG_CONFIG);
1915                 reg &= BNX2_PORT_HW_CFG_CFG_DFLT_LINK_MASK;
1916                 if (reg == BNX2_PORT_HW_CFG_CFG_DFLT_LINK_1G) {
1917                         bp->autoneg = 0;
1918                         bp->req_line_speed = bp->line_speed = SPEED_1000;
1919                         bp->req_duplex = DUPLEX_FULL;
1920                 }
1921         } else
1922                 bp->advertising = ETHTOOL_ALL_COPPER_SPEED | ADVERTISED_Autoneg;
1923 }
1924
1925 static void
1926 bnx2_send_heart_beat(struct bnx2 *bp)
1927 {
1928         u32 msg;
1929         u32 addr;
1930
1931         spin_lock(&bp->indirect_lock);
1932         msg = (u32) (++bp->fw_drv_pulse_wr_seq & BNX2_DRV_PULSE_SEQ_MASK);
1933         addr = bp->shmem_base + BNX2_DRV_PULSE_MB;
1934         REG_WR(bp, BNX2_PCICFG_REG_WINDOW_ADDRESS, addr);
1935         REG_WR(bp, BNX2_PCICFG_REG_WINDOW, msg);
1936         spin_unlock(&bp->indirect_lock);
1937 }
1938
1939 static void
1940 bnx2_remote_phy_event(struct bnx2 *bp)
1941 {
1942         u32 msg;
1943         u8 link_up = bp->link_up;
1944         u8 old_port;
1945
1946         msg = bnx2_shmem_rd(bp, BNX2_LINK_STATUS);
1947
1948         if (msg & BNX2_LINK_STATUS_HEART_BEAT_EXPIRED)
1949                 bnx2_send_heart_beat(bp);
1950
1951         msg &= ~BNX2_LINK_STATUS_HEART_BEAT_EXPIRED;
1952
1953         if ((msg & BNX2_LINK_STATUS_LINK_UP) == BNX2_LINK_STATUS_LINK_DOWN)
1954                 bp->link_up = 0;
1955         else {
1956                 u32 speed;
1957
1958                 bp->link_up = 1;
1959                 speed = msg & BNX2_LINK_STATUS_SPEED_MASK;
1960                 bp->duplex = DUPLEX_FULL;
1961                 switch (speed) {
1962                         case BNX2_LINK_STATUS_10HALF:
1963                                 bp->duplex = DUPLEX_HALF;
1964                         case BNX2_LINK_STATUS_10FULL:
1965                                 bp->line_speed = SPEED_10;
1966                                 break;
1967                         case BNX2_LINK_STATUS_100HALF:
1968                                 bp->duplex = DUPLEX_HALF;
1969                         case BNX2_LINK_STATUS_100BASE_T4:
1970                         case BNX2_LINK_STATUS_100FULL:
1971                                 bp->line_speed = SPEED_100;
1972                                 break;
1973                         case BNX2_LINK_STATUS_1000HALF:
1974                                 bp->duplex = DUPLEX_HALF;
1975                         case BNX2_LINK_STATUS_1000FULL:
1976                                 bp->line_speed = SPEED_1000;
1977                                 break;
1978                         case BNX2_LINK_STATUS_2500HALF:
1979                                 bp->duplex = DUPLEX_HALF;
1980                         case BNX2_LINK_STATUS_2500FULL:
1981                                 bp->line_speed = SPEED_2500;
1982                                 break;
1983                         default:
1984                                 bp->line_speed = 0;
1985                                 break;
1986                 }
1987
1988                 bp->flow_ctrl = 0;
1989                 if ((bp->autoneg & (AUTONEG_SPEED | AUTONEG_FLOW_CTRL)) !=
1990                     (AUTONEG_SPEED | AUTONEG_FLOW_CTRL)) {
1991                         if (bp->duplex == DUPLEX_FULL)
1992                                 bp->flow_ctrl = bp->req_flow_ctrl;
1993                 } else {
1994                         if (msg & BNX2_LINK_STATUS_TX_FC_ENABLED)
1995                                 bp->flow_ctrl |= FLOW_CTRL_TX;
1996                         if (msg & BNX2_LINK_STATUS_RX_FC_ENABLED)
1997                                 bp->flow_ctrl |= FLOW_CTRL_RX;
1998                 }
1999
2000                 old_port = bp->phy_port;
2001                 if (msg & BNX2_LINK_STATUS_SERDES_LINK)
2002                         bp->phy_port = PORT_FIBRE;
2003                 else
2004                         bp->phy_port = PORT_TP;
2005
2006                 if (old_port != bp->phy_port)
2007                         bnx2_set_default_link(bp);
2008
2009         }
2010         if (bp->link_up != link_up)
2011                 bnx2_report_link(bp);
2012
2013         bnx2_set_mac_link(bp);
2014 }
2015
2016 static int
2017 bnx2_set_remote_link(struct bnx2 *bp)
2018 {
2019         u32 evt_code;
2020
2021         evt_code = bnx2_shmem_rd(bp, BNX2_FW_EVT_CODE_MB);
2022         switch (evt_code) {
2023                 case BNX2_FW_EVT_CODE_LINK_EVENT:
2024                         bnx2_remote_phy_event(bp);
2025                         break;
2026                 case BNX2_FW_EVT_CODE_SW_TIMER_EXPIRATION_EVENT:
2027                 default:
2028                         bnx2_send_heart_beat(bp);
2029                         break;
2030         }
2031         return 0;
2032 }
2033
2034 static int
2035 bnx2_setup_copper_phy(struct bnx2 *bp)
2036 __releases(&bp->phy_lock)
2037 __acquires(&bp->phy_lock)
2038 {
2039         u32 bmcr;
2040         u32 new_bmcr;
2041
2042         bnx2_read_phy(bp, bp->mii_bmcr, &bmcr);
2043
2044         if (bp->autoneg & AUTONEG_SPEED) {
2045                 u32 adv_reg, adv1000_reg;
2046                 u32 new_adv_reg = 0;
2047                 u32 new_adv1000_reg = 0;
2048
2049                 bnx2_read_phy(bp, bp->mii_adv, &adv_reg);
2050                 adv_reg &= (PHY_ALL_10_100_SPEED | ADVERTISE_PAUSE_CAP |
2051                         ADVERTISE_PAUSE_ASYM);
2052
2053                 bnx2_read_phy(bp, MII_CTRL1000, &adv1000_reg);
2054                 adv1000_reg &= PHY_ALL_1000_SPEED;
2055
2056                 if (bp->advertising & ADVERTISED_10baseT_Half)
2057                         new_adv_reg |= ADVERTISE_10HALF;
2058                 if (bp->advertising & ADVERTISED_10baseT_Full)
2059                         new_adv_reg |= ADVERTISE_10FULL;
2060                 if (bp->advertising & ADVERTISED_100baseT_Half)
2061                         new_adv_reg |= ADVERTISE_100HALF;
2062                 if (bp->advertising & ADVERTISED_100baseT_Full)
2063                         new_adv_reg |= ADVERTISE_100FULL;
2064                 if (bp->advertising & ADVERTISED_1000baseT_Full)
2065                         new_adv1000_reg |= ADVERTISE_1000FULL;
2066
2067                 new_adv_reg |= ADVERTISE_CSMA;
2068
2069                 new_adv_reg |= bnx2_phy_get_pause_adv(bp);
2070
2071                 if ((adv1000_reg != new_adv1000_reg) ||
2072                         (adv_reg != new_adv_reg) ||
2073                         ((bmcr & BMCR_ANENABLE) == 0)) {
2074
2075                         bnx2_write_phy(bp, bp->mii_adv, new_adv_reg);
2076                         bnx2_write_phy(bp, MII_CTRL1000, new_adv1000_reg);
2077                         bnx2_write_phy(bp, bp->mii_bmcr, BMCR_ANRESTART |
2078                                 BMCR_ANENABLE);
2079                 }
2080                 else if (bp->link_up) {
2081                         /* Flow ctrl may have changed from auto to forced */
2082                         /* or vice-versa. */
2083
2084                         bnx2_resolve_flow_ctrl(bp);
2085                         bnx2_set_mac_link(bp);
2086                 }
2087                 return 0;
2088         }
2089
2090         new_bmcr = 0;
2091         if (bp->req_line_speed == SPEED_100) {
2092                 new_bmcr |= BMCR_SPEED100;
2093         }
2094         if (bp->req_duplex == DUPLEX_FULL) {
2095                 new_bmcr |= BMCR_FULLDPLX;
2096         }
2097         if (new_bmcr != bmcr) {
2098                 u32 bmsr;
2099
2100                 bnx2_read_phy(bp, bp->mii_bmsr, &bmsr);
2101                 bnx2_read_phy(bp, bp->mii_bmsr, &bmsr);
2102
2103                 if (bmsr & BMSR_LSTATUS) {
2104                         /* Force link down */
2105                         bnx2_write_phy(bp, bp->mii_bmcr, BMCR_LOOPBACK);
2106                         spin_unlock_bh(&bp->phy_lock);
2107                         msleep(50);
2108                         spin_lock_bh(&bp->phy_lock);
2109
2110                         bnx2_read_phy(bp, bp->mii_bmsr, &bmsr);
2111                         bnx2_read_phy(bp, bp->mii_bmsr, &bmsr);
2112                 }
2113
2114                 bnx2_write_phy(bp, bp->mii_bmcr, new_bmcr);
2115
2116                 /* Normally, the new speed is setup after the link has
2117                  * gone down and up again. In some cases, link will not go
2118                  * down so we need to set up the new speed here.
2119                  */
2120                 if (bmsr & BMSR_LSTATUS) {
2121                         bp->line_speed = bp->req_line_speed;
2122                         bp->duplex = bp->req_duplex;
2123                         bnx2_resolve_flow_ctrl(bp);
2124                         bnx2_set_mac_link(bp);
2125                 }
2126         } else {
2127                 bnx2_resolve_flow_ctrl(bp);
2128                 bnx2_set_mac_link(bp);
2129         }
2130         return 0;
2131 }
2132
2133 static int
2134 bnx2_setup_phy(struct bnx2 *bp, u8 port)
2135 __releases(&bp->phy_lock)
2136 __acquires(&bp->phy_lock)
2137 {
2138         if (bp->loopback == MAC_LOOPBACK)
2139                 return 0;
2140
2141         if (bp->phy_flags & BNX2_PHY_FLAG_SERDES) {
2142                 return (bnx2_setup_serdes_phy(bp, port));
2143         }
2144         else {
2145                 return (bnx2_setup_copper_phy(bp));
2146         }
2147 }
2148
2149 static int
2150 bnx2_init_5709s_phy(struct bnx2 *bp, int reset_phy)
2151 {
2152         u32 val;
2153
2154         bp->mii_bmcr = MII_BMCR + 0x10;
2155         bp->mii_bmsr = MII_BMSR + 0x10;
2156         bp->mii_bmsr1 = MII_BNX2_GP_TOP_AN_STATUS1;
2157         bp->mii_adv = MII_ADVERTISE + 0x10;
2158         bp->mii_lpa = MII_LPA + 0x10;
2159         bp->mii_up1 = MII_BNX2_OVER1G_UP1;
2160
2161         bnx2_write_phy(bp, MII_BNX2_BLK_ADDR, MII_BNX2_BLK_ADDR_AER);
2162         bnx2_write_phy(bp, MII_BNX2_AER_AER, MII_BNX2_AER_AER_AN_MMD);
2163
2164         bnx2_write_phy(bp, MII_BNX2_BLK_ADDR, MII_BNX2_BLK_ADDR_COMBO_IEEEB0);
2165         if (reset_phy)
2166                 bnx2_reset_phy(bp);
2167
2168         bnx2_write_phy(bp, MII_BNX2_BLK_ADDR, MII_BNX2_BLK_ADDR_SERDES_DIG);
2169
2170         bnx2_read_phy(bp, MII_BNX2_SERDES_DIG_1000XCTL1, &val);
2171         val &= ~MII_BNX2_SD_1000XCTL1_AUTODET;
2172         val |= MII_BNX2_SD_1000XCTL1_FIBER;
2173         bnx2_write_phy(bp, MII_BNX2_SERDES_DIG_1000XCTL1, val);
2174
2175         bnx2_write_phy(bp, MII_BNX2_BLK_ADDR, MII_BNX2_BLK_ADDR_OVER1G);
2176         bnx2_read_phy(bp, MII_BNX2_OVER1G_UP1, &val);
2177         if (bp->phy_flags & BNX2_PHY_FLAG_2_5G_CAPABLE)
2178                 val |= BCM5708S_UP1_2G5;
2179         else
2180                 val &= ~BCM5708S_UP1_2G5;
2181         bnx2_write_phy(bp, MII_BNX2_OVER1G_UP1, val);
2182
2183         bnx2_write_phy(bp, MII_BNX2_BLK_ADDR, MII_BNX2_BLK_ADDR_BAM_NXTPG);
2184         bnx2_read_phy(bp, MII_BNX2_BAM_NXTPG_CTL, &val);
2185         val |= MII_BNX2_NXTPG_CTL_T2 | MII_BNX2_NXTPG_CTL_BAM;
2186         bnx2_write_phy(bp, MII_BNX2_BAM_NXTPG_CTL, val);
2187
2188         bnx2_write_phy(bp, MII_BNX2_BLK_ADDR, MII_BNX2_BLK_ADDR_CL73_USERB0);
2189
2190         val = MII_BNX2_CL73_BAM_EN | MII_BNX2_CL73_BAM_STA_MGR_EN |
2191               MII_BNX2_CL73_BAM_NP_AFT_BP_EN;
2192         bnx2_write_phy(bp, MII_BNX2_CL73_BAM_CTL1, val);
2193
2194         bnx2_write_phy(bp, MII_BNX2_BLK_ADDR, MII_BNX2_BLK_ADDR_COMBO_IEEEB0);
2195
2196         return 0;
2197 }
2198
2199 static int
2200 bnx2_init_5708s_phy(struct bnx2 *bp, int reset_phy)
2201 {
2202         u32 val;
2203
2204         if (reset_phy)
2205                 bnx2_reset_phy(bp);
2206
2207         bp->mii_up1 = BCM5708S_UP1;
2208
2209         bnx2_write_phy(bp, BCM5708S_BLK_ADDR, BCM5708S_BLK_ADDR_DIG3);
2210         bnx2_write_phy(bp, BCM5708S_DIG_3_0, BCM5708S_DIG_3_0_USE_IEEE);
2211         bnx2_write_phy(bp, BCM5708S_BLK_ADDR, BCM5708S_BLK_ADDR_DIG);
2212
2213         bnx2_read_phy(bp, BCM5708S_1000X_CTL1, &val);
2214         val |= BCM5708S_1000X_CTL1_FIBER_MODE | BCM5708S_1000X_CTL1_AUTODET_EN;
2215         bnx2_write_phy(bp, BCM5708S_1000X_CTL1, val);
2216
2217         bnx2_read_phy(bp, BCM5708S_1000X_CTL2, &val);
2218         val |= BCM5708S_1000X_CTL2_PLLEL_DET_EN;
2219         bnx2_write_phy(bp, BCM5708S_1000X_CTL2, val);
2220
2221         if (bp->phy_flags & BNX2_PHY_FLAG_2_5G_CAPABLE) {
2222                 bnx2_read_phy(bp, BCM5708S_UP1, &val);
2223                 val |= BCM5708S_UP1_2G5;
2224                 bnx2_write_phy(bp, BCM5708S_UP1, val);
2225         }
2226
2227         if ((CHIP_ID(bp) == CHIP_ID_5708_A0) ||
2228             (CHIP_ID(bp) == CHIP_ID_5708_B0) ||
2229             (CHIP_ID(bp) == CHIP_ID_5708_B1)) {
2230                 /* increase tx signal amplitude */
2231                 bnx2_write_phy(bp, BCM5708S_BLK_ADDR,
2232                                BCM5708S_BLK_ADDR_TX_MISC);
2233                 bnx2_read_phy(bp, BCM5708S_TX_ACTL1, &val);
2234                 val &= ~BCM5708S_TX_ACTL1_DRIVER_VCM;
2235                 bnx2_write_phy(bp, BCM5708S_TX_ACTL1, val);
2236                 bnx2_write_phy(bp, BCM5708S_BLK_ADDR, BCM5708S_BLK_ADDR_DIG);
2237         }
2238
2239         val = bnx2_shmem_rd(bp, BNX2_PORT_HW_CFG_CONFIG) &
2240               BNX2_PORT_HW_CFG_CFG_TXCTL3_MASK;
2241
2242         if (val) {
2243                 u32 is_backplane;
2244
2245                 is_backplane = bnx2_shmem_rd(bp, BNX2_SHARED_HW_CFG_CONFIG);
2246                 if (is_backplane & BNX2_SHARED_HW_CFG_PHY_BACKPLANE) {
2247                         bnx2_write_phy(bp, BCM5708S_BLK_ADDR,
2248                                        BCM5708S_BLK_ADDR_TX_MISC);
2249                         bnx2_write_phy(bp, BCM5708S_TX_ACTL3, val);
2250                         bnx2_write_phy(bp, BCM5708S_BLK_ADDR,
2251                                        BCM5708S_BLK_ADDR_DIG);
2252                 }
2253         }
2254         return 0;
2255 }
2256
2257 static int
2258 bnx2_init_5706s_phy(struct bnx2 *bp, int reset_phy)
2259 {
2260         if (reset_phy)
2261                 bnx2_reset_phy(bp);
2262
2263         bp->phy_flags &= ~BNX2_PHY_FLAG_PARALLEL_DETECT;
2264
2265         if (CHIP_NUM(bp) == CHIP_NUM_5706)
2266                 REG_WR(bp, BNX2_MISC_GP_HW_CTL0, 0x300);
2267
2268         if (bp->dev->mtu > 1500) {
2269                 u32 val;
2270
2271                 /* Set extended packet length bit */
2272                 bnx2_write_phy(bp, 0x18, 0x7);
2273                 bnx2_read_phy(bp, 0x18, &val);
2274                 bnx2_write_phy(bp, 0x18, (val & 0xfff8) | 0x4000);
2275
2276                 bnx2_write_phy(bp, 0x1c, 0x6c00);
2277                 bnx2_read_phy(bp, 0x1c, &val);
2278                 bnx2_write_phy(bp, 0x1c, (val & 0x3ff) | 0xec02);
2279         }
2280         else {
2281                 u32 val;
2282
2283                 bnx2_write_phy(bp, 0x18, 0x7);
2284                 bnx2_read_phy(bp, 0x18, &val);
2285                 bnx2_write_phy(bp, 0x18, val & ~0x4007);
2286
2287                 bnx2_write_phy(bp, 0x1c, 0x6c00);
2288                 bnx2_read_phy(bp, 0x1c, &val);
2289                 bnx2_write_phy(bp, 0x1c, (val & 0x3fd) | 0xec00);
2290         }
2291
2292         return 0;
2293 }
2294
2295 static int
2296 bnx2_init_copper_phy(struct bnx2 *bp, int reset_phy)
2297 {
2298         u32 val;
2299
2300         if (reset_phy)
2301                 bnx2_reset_phy(bp);
2302
2303         if (bp->phy_flags & BNX2_PHY_FLAG_CRC_FIX) {
2304                 bnx2_write_phy(bp, 0x18, 0x0c00);
2305                 bnx2_write_phy(bp, 0x17, 0x000a);
2306                 bnx2_write_phy(bp, 0x15, 0x310b);
2307                 bnx2_write_phy(bp, 0x17, 0x201f);
2308                 bnx2_write_phy(bp, 0x15, 0x9506);
2309                 bnx2_write_phy(bp, 0x17, 0x401f);
2310                 bnx2_write_phy(bp, 0x15, 0x14e2);
2311                 bnx2_write_phy(bp, 0x18, 0x0400);
2312         }
2313
2314         if (bp->phy_flags & BNX2_PHY_FLAG_DIS_EARLY_DAC) {
2315                 bnx2_write_phy(bp, MII_BNX2_DSP_ADDRESS,
2316                                MII_BNX2_DSP_EXPAND_REG | 0x8);
2317                 bnx2_read_phy(bp, MII_BNX2_DSP_RW_PORT, &val);
2318                 val &= ~(1 << 8);
2319                 bnx2_write_phy(bp, MII_BNX2_DSP_RW_PORT, val);
2320         }
2321
2322         if (bp->dev->mtu > 1500) {
2323                 /* Set extended packet length bit */
2324                 bnx2_write_phy(bp, 0x18, 0x7);
2325                 bnx2_read_phy(bp, 0x18, &val);
2326                 bnx2_write_phy(bp, 0x18, val | 0x4000);
2327
2328                 bnx2_read_phy(bp, 0x10, &val);
2329                 bnx2_write_phy(bp, 0x10, val | 0x1);
2330         }
2331         else {
2332                 bnx2_write_phy(bp, 0x18, 0x7);
2333                 bnx2_read_phy(bp, 0x18, &val);
2334                 bnx2_write_phy(bp, 0x18, val & ~0x4007);
2335
2336                 bnx2_read_phy(bp, 0x10, &val);
2337                 bnx2_write_phy(bp, 0x10, val & ~0x1);
2338         }
2339
2340         /* ethernet@wirespeed */
2341         bnx2_write_phy(bp, 0x18, 0x7007);
2342         bnx2_read_phy(bp, 0x18, &val);
2343         bnx2_write_phy(bp, 0x18, val | (1 << 15) | (1 << 4));
2344         return 0;
2345 }
2346
2347
2348 static int
2349 bnx2_init_phy(struct bnx2 *bp, int reset_phy)
2350 __releases(&bp->phy_lock)
2351 __acquires(&bp->phy_lock)
2352 {
2353         u32 val;
2354         int rc = 0;
2355
2356         bp->phy_flags &= ~BNX2_PHY_FLAG_INT_MODE_MASK;
2357         bp->phy_flags |= BNX2_PHY_FLAG_INT_MODE_LINK_READY;
2358
2359         bp->mii_bmcr = MII_BMCR;
2360         bp->mii_bmsr = MII_BMSR;
2361         bp->mii_bmsr1 = MII_BMSR;
2362         bp->mii_adv = MII_ADVERTISE;
2363         bp->mii_lpa = MII_LPA;
2364
2365         REG_WR(bp, BNX2_EMAC_ATTENTION_ENA, BNX2_EMAC_ATTENTION_ENA_LINK);
2366
2367         if (bp->phy_flags & BNX2_PHY_FLAG_REMOTE_PHY_CAP)
2368                 goto setup_phy;
2369
2370         bnx2_read_phy(bp, MII_PHYSID1, &val);
2371         bp->phy_id = val << 16;
2372         bnx2_read_phy(bp, MII_PHYSID2, &val);
2373         bp->phy_id |= val & 0xffff;
2374
2375         if (bp->phy_flags & BNX2_PHY_FLAG_SERDES) {
2376                 if (CHIP_NUM(bp) == CHIP_NUM_5706)
2377                         rc = bnx2_init_5706s_phy(bp, reset_phy);
2378                 else if (CHIP_NUM(bp) == CHIP_NUM_5708)
2379                         rc = bnx2_init_5708s_phy(bp, reset_phy);
2380                 else if (CHIP_NUM(bp) == CHIP_NUM_5709)
2381                         rc = bnx2_init_5709s_phy(bp, reset_phy);
2382         }
2383         else {
2384                 rc = bnx2_init_copper_phy(bp, reset_phy);
2385         }
2386
2387 setup_phy:
2388         if (!rc)
2389                 rc = bnx2_setup_phy(bp, bp->phy_port);
2390
2391         return rc;
2392 }
2393
2394 static int
2395 bnx2_set_mac_loopback(struct bnx2 *bp)
2396 {
2397         u32 mac_mode;
2398
2399         mac_mode = REG_RD(bp, BNX2_EMAC_MODE);
2400         mac_mode &= ~BNX2_EMAC_MODE_PORT;
2401         mac_mode |= BNX2_EMAC_MODE_MAC_LOOP | BNX2_EMAC_MODE_FORCE_LINK;
2402         REG_WR(bp, BNX2_EMAC_MODE, mac_mode);
2403         bp->link_up = 1;
2404         return 0;
2405 }
2406
2407 static int bnx2_test_link(struct bnx2 *);
2408
2409 static int
2410 bnx2_set_phy_loopback(struct bnx2 *bp)
2411 {
2412         u32 mac_mode;
2413         int rc, i;
2414
2415         spin_lock_bh(&bp->phy_lock);
2416         rc = bnx2_write_phy(bp, bp->mii_bmcr, BMCR_LOOPBACK | BMCR_FULLDPLX |
2417                             BMCR_SPEED1000);
2418         spin_unlock_bh(&bp->phy_lock);
2419         if (rc)
2420                 return rc;
2421
2422         for (i = 0; i < 10; i++) {
2423                 if (bnx2_test_link(bp) == 0)
2424                         break;
2425                 msleep(100);
2426         }
2427
2428         mac_mode = REG_RD(bp, BNX2_EMAC_MODE);
2429         mac_mode &= ~(BNX2_EMAC_MODE_PORT | BNX2_EMAC_MODE_HALF_DUPLEX |
2430                       BNX2_EMAC_MODE_MAC_LOOP | BNX2_EMAC_MODE_FORCE_LINK |
2431                       BNX2_EMAC_MODE_25G_MODE);
2432
2433         mac_mode |= BNX2_EMAC_MODE_PORT_GMII;
2434         REG_WR(bp, BNX2_EMAC_MODE, mac_mode);
2435         bp->link_up = 1;
2436         return 0;
2437 }
2438
2439 static int
2440 bnx2_fw_sync(struct bnx2 *bp, u32 msg_data, int ack, int silent)
2441 {
2442         int i;
2443         u32 val;
2444
2445         bp->fw_wr_seq++;
2446         msg_data |= bp->fw_wr_seq;
2447
2448         bnx2_shmem_wr(bp, BNX2_DRV_MB, msg_data);
2449
2450         if (!ack)
2451                 return 0;
2452
2453         /* wait for an acknowledgement. */
2454         for (i = 0; i < (BNX2_FW_ACK_TIME_OUT_MS / 10); i++) {
2455                 msleep(10);
2456
2457                 val = bnx2_shmem_rd(bp, BNX2_FW_MB);
2458
2459                 if ((val & BNX2_FW_MSG_ACK) == (msg_data & BNX2_DRV_MSG_SEQ))
2460                         break;
2461         }
2462         if ((msg_data & BNX2_DRV_MSG_DATA) == BNX2_DRV_MSG_DATA_WAIT0)
2463                 return 0;
2464
2465         /* If we timed out, inform the firmware that this is the case. */
2466         if ((val & BNX2_FW_MSG_ACK) != (msg_data & BNX2_DRV_MSG_SEQ)) {
2467                 if (!silent)
2468                         printk(KERN_ERR PFX "fw sync timeout, reset code = "
2469                                             "%x\n", msg_data);
2470
2471                 msg_data &= ~BNX2_DRV_MSG_CODE;
2472                 msg_data |= BNX2_DRV_MSG_CODE_FW_TIMEOUT;
2473
2474                 bnx2_shmem_wr(bp, BNX2_DRV_MB, msg_data);
2475
2476                 return -EBUSY;
2477         }
2478
2479         if ((val & BNX2_FW_MSG_STATUS_MASK) != BNX2_FW_MSG_STATUS_OK)
2480                 return -EIO;
2481
2482         return 0;
2483 }
2484
2485 static int
2486 bnx2_init_5709_context(struct bnx2 *bp)
2487 {
2488         int i, ret = 0;
2489         u32 val;
2490
2491         val = BNX2_CTX_COMMAND_ENABLED | BNX2_CTX_COMMAND_MEM_INIT | (1 << 12);
2492         val |= (BCM_PAGE_BITS - 8) << 16;
2493         REG_WR(bp, BNX2_CTX_COMMAND, val);
2494         for (i = 0; i < 10; i++) {
2495                 val = REG_RD(bp, BNX2_CTX_COMMAND);
2496                 if (!(val & BNX2_CTX_COMMAND_MEM_INIT))
2497                         break;
2498                 udelay(2);
2499         }
2500         if (val & BNX2_CTX_COMMAND_MEM_INIT)
2501                 return -EBUSY;
2502
2503         for (i = 0; i < bp->ctx_pages; i++) {
2504                 int j;
2505
2506                 if (bp->ctx_blk[i])
2507                         memset(bp->ctx_blk[i], 0, BCM_PAGE_SIZE);
2508                 else
2509                         return -ENOMEM;
2510
2511                 REG_WR(bp, BNX2_CTX_HOST_PAGE_TBL_DATA0,
2512                        (bp->ctx_blk_mapping[i] & 0xffffffff) |
2513                        BNX2_CTX_HOST_PAGE_TBL_DATA0_VALID);
2514                 REG_WR(bp, BNX2_CTX_HOST_PAGE_TBL_DATA1,
2515                        (u64) bp->ctx_blk_mapping[i] >> 32);
2516                 REG_WR(bp, BNX2_CTX_HOST_PAGE_TBL_CTRL, i |
2517                        BNX2_CTX_HOST_PAGE_TBL_CTRL_WRITE_REQ);
2518                 for (j = 0; j < 10; j++) {
2519
2520                         val = REG_RD(bp, BNX2_CTX_HOST_PAGE_TBL_CTRL);
2521                         if (!(val & BNX2_CTX_HOST_PAGE_TBL_CTRL_WRITE_REQ))
2522                                 break;
2523                         udelay(5);
2524                 }
2525                 if (val & BNX2_CTX_HOST_PAGE_TBL_CTRL_WRITE_REQ) {
2526                         ret = -EBUSY;
2527                         break;
2528                 }
2529         }
2530         return ret;
2531 }
2532
2533 static void
2534 bnx2_init_context(struct bnx2 *bp)
2535 {
2536         u32 vcid;
2537
2538         vcid = 96;
2539         while (vcid) {
2540                 u32 vcid_addr, pcid_addr, offset;
2541                 int i;
2542
2543                 vcid--;
2544
2545                 if (CHIP_ID(bp) == CHIP_ID_5706_A0) {
2546                         u32 new_vcid;
2547
2548                         vcid_addr = GET_PCID_ADDR(vcid);
2549                         if (vcid & 0x8) {
2550                                 new_vcid = 0x60 + (vcid & 0xf0) + (vcid & 0x7);
2551                         }
2552                         else {
2553                                 new_vcid = vcid;
2554                         }
2555                         pcid_addr = GET_PCID_ADDR(new_vcid);
2556                 }
2557                 else {
2558                         vcid_addr = GET_CID_ADDR(vcid);
2559                         pcid_addr = vcid_addr;
2560                 }
2561
2562                 for (i = 0; i < (CTX_SIZE / PHY_CTX_SIZE); i++) {
2563                         vcid_addr += (i << PHY_CTX_SHIFT);
2564                         pcid_addr += (i << PHY_CTX_SHIFT);
2565
2566                         REG_WR(bp, BNX2_CTX_VIRT_ADDR, vcid_addr);
2567                         REG_WR(bp, BNX2_CTX_PAGE_TBL, pcid_addr);
2568
2569                         /* Zero out the context. */
2570                         for (offset = 0; offset < PHY_CTX_SIZE; offset += 4)
2571                                 bnx2_ctx_wr(bp, vcid_addr, offset, 0);
2572                 }
2573         }
2574 }
2575
2576 static int
2577 bnx2_alloc_bad_rbuf(struct bnx2 *bp)
2578 {
2579         u16 *good_mbuf;
2580         u32 good_mbuf_cnt;
2581         u32 val;
2582
2583         good_mbuf = kmalloc(512 * sizeof(u16), GFP_KERNEL);
2584         if (good_mbuf == NULL) {
2585                 printk(KERN_ERR PFX "Failed to allocate memory in "
2586                                     "bnx2_alloc_bad_rbuf\n");
2587                 return -ENOMEM;
2588         }
2589
2590         REG_WR(bp, BNX2_MISC_ENABLE_SET_BITS,
2591                 BNX2_MISC_ENABLE_SET_BITS_RX_MBUF_ENABLE);
2592
2593         good_mbuf_cnt = 0;
2594
2595         /* Allocate a bunch of mbufs and save the good ones in an array. */
2596         val = bnx2_reg_rd_ind(bp, BNX2_RBUF_STATUS1);
2597         while (val & BNX2_RBUF_STATUS1_FREE_COUNT) {
2598                 bnx2_reg_wr_ind(bp, BNX2_RBUF_COMMAND,
2599                                 BNX2_RBUF_COMMAND_ALLOC_REQ);
2600
2601                 val = bnx2_reg_rd_ind(bp, BNX2_RBUF_FW_BUF_ALLOC);
2602
2603                 val &= BNX2_RBUF_FW_BUF_ALLOC_VALUE;
2604
2605                 /* The addresses with Bit 9 set are bad memory blocks. */
2606                 if (!(val & (1 << 9))) {
2607                         good_mbuf[good_mbuf_cnt] = (u16) val;
2608                         good_mbuf_cnt++;
2609                 }
2610
2611                 val = bnx2_reg_rd_ind(bp, BNX2_RBUF_STATUS1);
2612         }
2613
2614         /* Free the good ones back to the mbuf pool thus discarding
2615          * all the bad ones. */
2616         while (good_mbuf_cnt) {
2617                 good_mbuf_cnt--;
2618
2619                 val = good_mbuf[good_mbuf_cnt];
2620                 val = (val << 9) | val | 1;
2621
2622                 bnx2_reg_wr_ind(bp, BNX2_RBUF_FW_BUF_FREE, val);
2623         }
2624         kfree(good_mbuf);
2625         return 0;
2626 }
2627
2628 static void
2629 bnx2_set_mac_addr(struct bnx2 *bp, u8 *mac_addr, u32 pos)
2630 {
2631         u32 val;
2632
2633         val = (mac_addr[0] << 8) | mac_addr[1];
2634
2635         REG_WR(bp, BNX2_EMAC_MAC_MATCH0 + (pos * 8), val);
2636
2637         val = (mac_addr[2] << 24) | (mac_addr[3] << 16) |
2638                 (mac_addr[4] << 8) | mac_addr[5];
2639
2640         REG_WR(bp, BNX2_EMAC_MAC_MATCH1 + (pos * 8), val);
2641 }
2642
2643 static inline int
2644 bnx2_alloc_rx_page(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, u16 index)
2645 {
2646         dma_addr_t mapping;
2647         struct sw_pg *rx_pg = &rxr->rx_pg_ring[index];
2648         struct rx_bd *rxbd =
2649                 &rxr->rx_pg_desc_ring[RX_RING(index)][RX_IDX(index)];
2650         struct page *page = alloc_page(GFP_ATOMIC);
2651
2652         if (!page)
2653                 return -ENOMEM;
2654         mapping = pci_map_page(bp->pdev, page, 0, PAGE_SIZE,
2655                                PCI_DMA_FROMDEVICE);
2656         if (pci_dma_mapping_error(bp->pdev, mapping)) {
2657                 __free_page(page);
2658                 return -EIO;
2659         }
2660
2661         rx_pg->page = page;
2662         pci_unmap_addr_set(rx_pg, mapping, mapping);
2663         rxbd->rx_bd_haddr_hi = (u64) mapping >> 32;
2664         rxbd->rx_bd_haddr_lo = (u64) mapping & 0xffffffff;
2665         return 0;
2666 }
2667
2668 static void
2669 bnx2_free_rx_page(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, u16 index)
2670 {
2671         struct sw_pg *rx_pg = &rxr->rx_pg_ring[index];
2672         struct page *page = rx_pg->page;
2673
2674         if (!page)
2675                 return;
2676
2677         pci_unmap_page(bp->pdev, pci_unmap_addr(rx_pg, mapping), PAGE_SIZE,
2678                        PCI_DMA_FROMDEVICE);
2679
2680         __free_page(page);
2681         rx_pg->page = NULL;
2682 }
2683
2684 static inline int
2685 bnx2_alloc_rx_skb(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, u16 index)
2686 {
2687         struct sk_buff *skb;
2688         struct sw_bd *rx_buf = &rxr->rx_buf_ring[index];
2689         dma_addr_t mapping;
2690         struct rx_bd *rxbd = &rxr->rx_desc_ring[RX_RING(index)][RX_IDX(index)];
2691         unsigned long align;
2692
2693         skb = netdev_alloc_skb(bp->dev, bp->rx_buf_size);
2694         if (skb == NULL) {
2695                 return -ENOMEM;
2696         }
2697
2698         if (unlikely((align = (unsigned long) skb->data & (BNX2_RX_ALIGN - 1))))
2699                 skb_reserve(skb, BNX2_RX_ALIGN - align);
2700
2701         mapping = pci_map_single(bp->pdev, skb->data, bp->rx_buf_use_size,
2702                 PCI_DMA_FROMDEVICE);
2703         if (pci_dma_mapping_error(bp->pdev, mapping)) {
2704                 dev_kfree_skb(skb);
2705                 return -EIO;
2706         }
2707
2708         rx_buf->skb = skb;
2709         pci_unmap_addr_set(rx_buf, mapping, mapping);
2710
2711         rxbd->rx_bd_haddr_hi = (u64) mapping >> 32;
2712         rxbd->rx_bd_haddr_lo = (u64) mapping & 0xffffffff;
2713
2714         rxr->rx_prod_bseq += bp->rx_buf_use_size;
2715
2716         return 0;
2717 }
2718
2719 static int
2720 bnx2_phy_event_is_set(struct bnx2 *bp, struct bnx2_napi *bnapi, u32 event)
2721 {
2722         struct status_block *sblk = bnapi->status_blk.msi;
2723         u32 new_link_state, old_link_state;
2724         int is_set = 1;
2725
2726         new_link_state = sblk->status_attn_bits & event;
2727         old_link_state = sblk->status_attn_bits_ack & event;
2728         if (new_link_state != old_link_state) {
2729                 if (new_link_state)
2730                         REG_WR(bp, BNX2_PCICFG_STATUS_BIT_SET_CMD, event);
2731                 else
2732                         REG_WR(bp, BNX2_PCICFG_STATUS_BIT_CLEAR_CMD, event);
2733         } else
2734                 is_set = 0;
2735
2736         return is_set;
2737 }
2738
2739 static void
2740 bnx2_phy_int(struct bnx2 *bp, struct bnx2_napi *bnapi)
2741 {
2742         spin_lock(&bp->phy_lock);
2743
2744         if (bnx2_phy_event_is_set(bp, bnapi, STATUS_ATTN_BITS_LINK_STATE))
2745                 bnx2_set_link(bp);
2746         if (bnx2_phy_event_is_set(bp, bnapi, STATUS_ATTN_BITS_TIMER_ABORT))
2747                 bnx2_set_remote_link(bp);
2748
2749         spin_unlock(&bp->phy_lock);
2750
2751 }
2752
2753 static inline u16
2754 bnx2_get_hw_tx_cons(struct bnx2_napi *bnapi)
2755 {
2756         u16 cons;
2757
2758         /* Tell compiler that status block fields can change. */
2759         barrier();
2760         cons = *bnapi->hw_tx_cons_ptr;
2761         barrier();
2762         if (unlikely((cons & MAX_TX_DESC_CNT) == MAX_TX_DESC_CNT))
2763                 cons++;
2764         return cons;
2765 }
2766
2767 static int
2768 bnx2_tx_int(struct bnx2 *bp, struct bnx2_napi *bnapi, int budget)
2769 {
2770         struct bnx2_tx_ring_info *txr = &bnapi->tx_ring;
2771         u16 hw_cons, sw_cons, sw_ring_cons;
2772         int tx_pkt = 0, index;
2773         struct netdev_queue *txq;
2774
2775         index = (bnapi - bp->bnx2_napi);
2776         txq = netdev_get_tx_queue(bp->dev, index);
2777
2778         hw_cons = bnx2_get_hw_tx_cons(bnapi);
2779         sw_cons = txr->tx_cons;
2780
2781         while (sw_cons != hw_cons) {
2782                 struct sw_tx_bd *tx_buf;
2783                 struct sk_buff *skb;
2784                 int i, last;
2785
2786                 sw_ring_cons = TX_RING_IDX(sw_cons);
2787
2788                 tx_buf = &txr->tx_buf_ring[sw_ring_cons];
2789                 skb = tx_buf->skb;
2790
2791                 /* partial BD completions possible with TSO packets */
2792                 if (skb_is_gso(skb)) {
2793                         u16 last_idx, last_ring_idx;
2794
2795                         last_idx = sw_cons +
2796                                 skb_shinfo(skb)->nr_frags + 1;
2797                         last_ring_idx = sw_ring_cons +
2798                                 skb_shinfo(skb)->nr_frags + 1;
2799                         if (unlikely(last_ring_idx >= MAX_TX_DESC_CNT)) {
2800                                 last_idx++;
2801                         }
2802                         if (((s16) ((s16) last_idx - (s16) hw_cons)) > 0) {
2803                                 break;
2804                         }
2805                 }
2806
2807                 skb_dma_unmap(&bp->pdev->dev, skb, DMA_TO_DEVICE);
2808
2809                 tx_buf->skb = NULL;
2810                 last = skb_shinfo(skb)->nr_frags;
2811
2812                 for (i = 0; i < last; i++) {
2813                         sw_cons = NEXT_TX_BD(sw_cons);
2814                 }
2815
2816                 sw_cons = NEXT_TX_BD(sw_cons);
2817
2818                 dev_kfree_skb(skb);
2819                 tx_pkt++;
2820                 if (tx_pkt == budget)
2821                         break;
2822
2823                 hw_cons = bnx2_get_hw_tx_cons(bnapi);
2824         }
2825
2826         txr->hw_tx_cons = hw_cons;
2827         txr->tx_cons = sw_cons;
2828
2829         /* Need to make the tx_cons update visible to bnx2_start_xmit()
2830          * before checking for netif_tx_queue_stopped().  Without the
2831          * memory barrier, there is a small possibility that bnx2_start_xmit()
2832          * will miss it and cause the queue to be stopped forever.
2833          */
2834         smp_mb();
2835
2836         if (unlikely(netif_tx_queue_stopped(txq)) &&
2837                      (bnx2_tx_avail(bp, txr) > bp->tx_wake_thresh)) {
2838                 __netif_tx_lock(txq, smp_processor_id());
2839                 if ((netif_tx_queue_stopped(txq)) &&
2840                     (bnx2_tx_avail(bp, txr) > bp->tx_wake_thresh))
2841                         netif_tx_wake_queue(txq);
2842                 __netif_tx_unlock(txq);
2843         }
2844
2845         return tx_pkt;
2846 }
2847
2848 static void
2849 bnx2_reuse_rx_skb_pages(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr,
2850                         struct sk_buff *skb, int count)
2851 {
2852         struct sw_pg *cons_rx_pg, *prod_rx_pg;
2853         struct rx_bd *cons_bd, *prod_bd;
2854         int i;
2855         u16 hw_prod, prod;
2856         u16 cons = rxr->rx_pg_cons;
2857
2858         cons_rx_pg = &rxr->rx_pg_ring[cons];
2859
2860         /* The caller was unable to allocate a new page to replace the
2861          * last one in the frags array, so we need to recycle that page
2862          * and then free the skb.
2863          */
2864         if (skb) {
2865                 struct page *page;
2866                 struct skb_shared_info *shinfo;
2867
2868                 shinfo = skb_shinfo(skb);
2869                 shinfo->nr_frags--;
2870                 page = shinfo->frags[shinfo->nr_frags].page;
2871                 shinfo->frags[shinfo->nr_frags].page = NULL;
2872
2873                 cons_rx_pg->page = page;
2874                 dev_kfree_skb(skb);
2875         }
2876
2877         hw_prod = rxr->rx_pg_prod;
2878
2879         for (i = 0; i < count; i++) {
2880                 prod = RX_PG_RING_IDX(hw_prod);
2881
2882                 prod_rx_pg = &rxr->rx_pg_ring[prod];
2883                 cons_rx_pg = &rxr->rx_pg_ring[cons];
2884                 cons_bd = &rxr->rx_pg_desc_ring[RX_RING(cons)][RX_IDX(cons)];
2885                 prod_bd = &rxr->rx_pg_desc_ring[RX_RING(prod)][RX_IDX(prod)];
2886
2887                 if (prod != cons) {
2888                         prod_rx_pg->page = cons_rx_pg->page;
2889                         cons_rx_pg->page = NULL;
2890                         pci_unmap_addr_set(prod_rx_pg, mapping,
2891                                 pci_unmap_addr(cons_rx_pg, mapping));
2892
2893                         prod_bd->rx_bd_haddr_hi = cons_bd->rx_bd_haddr_hi;
2894                         prod_bd->rx_bd_haddr_lo = cons_bd->rx_bd_haddr_lo;
2895
2896                 }
2897                 cons = RX_PG_RING_IDX(NEXT_RX_BD(cons));
2898                 hw_prod = NEXT_RX_BD(hw_prod);
2899         }
2900         rxr->rx_pg_prod = hw_prod;
2901         rxr->rx_pg_cons = cons;
2902 }
2903
2904 static inline void
2905 bnx2_reuse_rx_skb(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr,
2906                   struct sk_buff *skb, u16 cons, u16 prod)
2907 {
2908         struct sw_bd *cons_rx_buf, *prod_rx_buf;
2909         struct rx_bd *cons_bd, *prod_bd;
2910
2911         cons_rx_buf = &rxr->rx_buf_ring[cons];
2912         prod_rx_buf = &rxr->rx_buf_ring[prod];
2913
2914         pci_dma_sync_single_for_device(bp->pdev,
2915                 pci_unmap_addr(cons_rx_buf, mapping),
2916                 BNX2_RX_OFFSET + BNX2_RX_COPY_THRESH, PCI_DMA_FROMDEVICE);
2917
2918         rxr->rx_prod_bseq += bp->rx_buf_use_size;
2919
2920         prod_rx_buf->skb = skb;
2921
2922         if (cons == prod)
2923                 return;
2924
2925         pci_unmap_addr_set(prod_rx_buf, mapping,
2926                         pci_unmap_addr(cons_rx_buf, mapping));
2927
2928         cons_bd = &rxr->rx_desc_ring[RX_RING(cons)][RX_IDX(cons)];
2929         prod_bd = &rxr->rx_desc_ring[RX_RING(prod)][RX_IDX(prod)];
2930         prod_bd->rx_bd_haddr_hi = cons_bd->rx_bd_haddr_hi;
2931         prod_bd->rx_bd_haddr_lo = cons_bd->rx_bd_haddr_lo;
2932 }
2933
2934 static int
2935 bnx2_rx_skb(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, struct sk_buff *skb,
2936             unsigned int len, unsigned int hdr_len, dma_addr_t dma_addr,
2937             u32 ring_idx)
2938 {
2939         int err;
2940         u16 prod = ring_idx & 0xffff;
2941
2942         err = bnx2_alloc_rx_skb(bp, rxr, prod);
2943         if (unlikely(err)) {
2944                 bnx2_reuse_rx_skb(bp, rxr, skb, (u16) (ring_idx >> 16), prod);
2945                 if (hdr_len) {
2946                         unsigned int raw_len = len + 4;
2947                         int pages = PAGE_ALIGN(raw_len - hdr_len) >> PAGE_SHIFT;
2948
2949                         bnx2_reuse_rx_skb_pages(bp, rxr, NULL, pages);
2950                 }
2951                 return err;
2952         }
2953
2954         skb_reserve(skb, BNX2_RX_OFFSET);
2955         pci_unmap_single(bp->pdev, dma_addr, bp->rx_buf_use_size,
2956                          PCI_DMA_FROMDEVICE);
2957
2958         if (hdr_len == 0) {
2959                 skb_put(skb, len);
2960                 return 0;
2961         } else {
2962                 unsigned int i, frag_len, frag_size, pages;
2963                 struct sw_pg *rx_pg;
2964                 u16 pg_cons = rxr->rx_pg_cons;
2965                 u16 pg_prod = rxr->rx_pg_prod;
2966
2967                 frag_size = len + 4 - hdr_len;
2968                 pages = PAGE_ALIGN(frag_size) >> PAGE_SHIFT;
2969                 skb_put(skb, hdr_len);
2970
2971                 for (i = 0; i < pages; i++) {
2972                         dma_addr_t mapping_old;
2973
2974                         frag_len = min(frag_size, (unsigned int) PAGE_SIZE);
2975                         if (unlikely(frag_len <= 4)) {
2976                                 unsigned int tail = 4 - frag_len;
2977
2978                                 rxr->rx_pg_cons = pg_cons;
2979                                 rxr->rx_pg_prod = pg_prod;
2980                                 bnx2_reuse_rx_skb_pages(bp, rxr, NULL,
2981                                                         pages - i);
2982                                 skb->len -= tail;
2983                                 if (i == 0) {
2984                                         skb->tail -= tail;
2985                                 } else {
2986                                         skb_frag_t *frag =
2987                                                 &skb_shinfo(skb)->frags[i - 1];
2988                                         frag->size -= tail;
2989                                         skb->data_len -= tail;
2990                                         skb->truesize -= tail;
2991                                 }
2992                                 return 0;
2993                         }
2994                         rx_pg = &rxr->rx_pg_ring[pg_cons];
2995
2996                         /* Don't unmap yet.  If we're unable to allocate a new
2997                          * page, we need to recycle the page and the DMA addr.
2998                          */
2999                         mapping_old = pci_unmap_addr(rx_pg, mapping);
3000                         if (i == pages - 1)
3001                                 frag_len -= 4;
3002
3003                         skb_fill_page_desc(skb, i, rx_pg->page, 0, frag_len);
3004                         rx_pg->page = NULL;
3005
3006                         err = bnx2_alloc_rx_page(bp, rxr,
3007                                                  RX_PG_RING_IDX(pg_prod));
3008                         if (unlikely(err)) {
3009                                 rxr->rx_pg_cons = pg_cons;
3010                                 rxr->rx_pg_prod = pg_prod;
3011                                 bnx2_reuse_rx_skb_pages(bp, rxr, skb,
3012                                                         pages - i);
3013                                 return err;
3014                         }
3015
3016                         pci_unmap_page(bp->pdev, mapping_old,
3017                                        PAGE_SIZE, PCI_DMA_FROMDEVICE);
3018
3019                         frag_size -= frag_len;
3020                         skb->data_len += frag_len;
3021                         skb->truesize += frag_len;
3022                         skb->len += frag_len;
3023
3024                         pg_prod = NEXT_RX_BD(pg_prod);
3025                         pg_cons = RX_PG_RING_IDX(NEXT_RX_BD(pg_cons));
3026                 }
3027                 rxr->rx_pg_prod = pg_prod;
3028                 rxr->rx_pg_cons = pg_cons;
3029         }
3030         return 0;
3031 }
3032
3033 static inline u16
3034 bnx2_get_hw_rx_cons(struct bnx2_napi *bnapi)
3035 {
3036         u16 cons;
3037
3038         /* Tell compiler that status block fields can change. */
3039         barrier();
3040         cons = *bnapi->hw_rx_cons_ptr;
3041         barrier();
3042         if (unlikely((cons & MAX_RX_DESC_CNT) == MAX_RX_DESC_CNT))
3043                 cons++;
3044         return cons;
3045 }
3046
3047 static int
3048 bnx2_rx_int(struct bnx2 *bp, struct bnx2_napi *bnapi, int budget)
3049 {
3050         struct bnx2_rx_ring_info *rxr = &bnapi->rx_ring;
3051         u16 hw_cons, sw_cons, sw_ring_cons, sw_prod, sw_ring_prod;
3052         struct l2_fhdr *rx_hdr;
3053         int rx_pkt = 0, pg_ring_used = 0;
3054
3055         hw_cons = bnx2_get_hw_rx_cons(bnapi);
3056         sw_cons = rxr->rx_cons;
3057         sw_prod = rxr->rx_prod;
3058
3059         /* Memory barrier necessary as speculative reads of the rx
3060          * buffer can be ahead of the index in the status block
3061          */
3062         rmb();
3063         while (sw_cons != hw_cons) {
3064                 unsigned int len, hdr_len;
3065                 u32 status;
3066                 struct sw_bd *rx_buf;
3067                 struct sk_buff *skb;
3068                 dma_addr_t dma_addr;
3069                 u16 vtag = 0;
3070                 int hw_vlan __maybe_unused = 0;
3071
3072                 sw_ring_cons = RX_RING_IDX(sw_cons);
3073                 sw_ring_prod = RX_RING_IDX(sw_prod);
3074
3075                 rx_buf = &rxr->rx_buf_ring[sw_ring_cons];
3076                 skb = rx_buf->skb;
3077
3078                 rx_buf->skb = NULL;
3079
3080                 dma_addr = pci_unmap_addr(rx_buf, mapping);
3081
3082                 pci_dma_sync_single_for_cpu(bp->pdev, dma_addr,
3083                         BNX2_RX_OFFSET + BNX2_RX_COPY_THRESH,
3084                         PCI_DMA_FROMDEVICE);
3085
3086                 rx_hdr = (struct l2_fhdr *) skb->data;
3087                 len = rx_hdr->l2_fhdr_pkt_len;
3088                 status = rx_hdr->l2_fhdr_status;
3089
3090                 hdr_len = 0;
3091                 if (status & L2_FHDR_STATUS_SPLIT) {
3092                         hdr_len = rx_hdr->l2_fhdr_ip_xsum;
3093                         pg_ring_used = 1;
3094                 } else if (len > bp->rx_jumbo_thresh) {
3095                         hdr_len = bp->rx_jumbo_thresh;
3096                         pg_ring_used = 1;
3097                 }
3098
3099                 if (unlikely(status & (L2_FHDR_ERRORS_BAD_CRC |
3100                                        L2_FHDR_ERRORS_PHY_DECODE |
3101                                        L2_FHDR_ERRORS_ALIGNMENT |
3102                                        L2_FHDR_ERRORS_TOO_SHORT |
3103                                        L2_FHDR_ERRORS_GIANT_FRAME))) {
3104
3105                         bnx2_reuse_rx_skb(bp, rxr, skb, sw_ring_cons,
3106                                           sw_ring_prod);
3107                         if (pg_ring_used) {
3108                                 int pages;
3109
3110                                 pages = PAGE_ALIGN(len - hdr_len) >> PAGE_SHIFT;
3111
3112                                 bnx2_reuse_rx_skb_pages(bp, rxr, NULL, pages);
3113                         }
3114                         goto next_rx;
3115                 }
3116
3117                 len -= 4;
3118
3119                 if (len <= bp->rx_copy_thresh) {
3120                         struct sk_buff *new_skb;
3121
3122                         new_skb = netdev_alloc_skb(bp->dev, len + 6);
3123                         if (new_skb == NULL) {
3124                                 bnx2_reuse_rx_skb(bp, rxr, skb, sw_ring_cons,
3125                                                   sw_ring_prod);
3126                                 goto next_rx;
3127                         }
3128
3129                         /* aligned copy */
3130                         skb_copy_from_linear_data_offset(skb,
3131                                                          BNX2_RX_OFFSET - 6,
3132                                       new_skb->data, len + 6);
3133                         skb_reserve(new_skb, 6);
3134                         skb_put(new_skb, len);
3135
3136                         bnx2_reuse_rx_skb(bp, rxr, skb,
3137                                 sw_ring_cons, sw_ring_prod);
3138
3139                         skb = new_skb;
3140                 } else if (unlikely(bnx2_rx_skb(bp, rxr, skb, len, hdr_len,
3141                            dma_addr, (sw_ring_cons << 16) | sw_ring_prod)))
3142                         goto next_rx;
3143
3144                 if ((status & L2_FHDR_STATUS_L2_VLAN_TAG) &&
3145                     !(bp->rx_mode & BNX2_EMAC_RX_MODE_KEEP_VLAN_TAG)) {
3146                         vtag = rx_hdr->l2_fhdr_vlan_tag;
3147 #ifdef BCM_VLAN
3148                         if (bp->vlgrp)
3149                                 hw_vlan = 1;
3150                         else
3151 #endif
3152                         {
3153                                 struct vlan_ethhdr *ve = (struct vlan_ethhdr *)
3154                                         __skb_push(skb, 4);
3155
3156                                 memmove(ve, skb->data + 4, ETH_ALEN * 2);
3157                                 ve->h_vlan_proto = htons(ETH_P_8021Q);
3158                                 ve->h_vlan_TCI = htons(vtag);
3159                                 len += 4;
3160                         }
3161                 }
3162
3163                 skb->protocol = eth_type_trans(skb, bp->dev);
3164
3165                 if ((len > (bp->dev->mtu + ETH_HLEN)) &&
3166                         (ntohs(skb->protocol) != 0x8100)) {
3167
3168                         dev_kfree_skb(skb);
3169                         goto next_rx;
3170
3171                 }
3172
3173                 skb->ip_summed = CHECKSUM_NONE;
3174                 if (bp->rx_csum &&
3175                         (status & (L2_FHDR_STATUS_TCP_SEGMENT |
3176                         L2_FHDR_STATUS_UDP_DATAGRAM))) {
3177
3178                         if (likely((status & (L2_FHDR_ERRORS_TCP_XSUM |
3179                                               L2_FHDR_ERRORS_UDP_XSUM)) == 0))
3180                                 skb->ip_summed = CHECKSUM_UNNECESSARY;
3181                 }
3182
3183                 skb_record_rx_queue(skb, bnapi - &bp->bnx2_napi[0]);
3184
3185 #ifdef BCM_VLAN
3186                 if (hw_vlan)
3187                         vlan_hwaccel_receive_skb(skb, bp->vlgrp, vtag);
3188                 else
3189 #endif
3190                         netif_receive_skb(skb);
3191
3192                 rx_pkt++;
3193
3194 next_rx:
3195                 sw_cons = NEXT_RX_BD(sw_cons);
3196                 sw_prod = NEXT_RX_BD(sw_prod);
3197
3198                 if ((rx_pkt == budget))
3199                         break;
3200
3201                 /* Refresh hw_cons to see if there is new work */
3202                 if (sw_cons == hw_cons) {
3203                         hw_cons = bnx2_get_hw_rx_cons(bnapi);
3204                         rmb();
3205                 }
3206         }
3207         rxr->rx_cons = sw_cons;
3208         rxr->rx_prod = sw_prod;
3209
3210         if (pg_ring_used)
3211                 REG_WR16(bp, rxr->rx_pg_bidx_addr, rxr->rx_pg_prod);
3212
3213         REG_WR16(bp, rxr->rx_bidx_addr, sw_prod);
3214
3215         REG_WR(bp, rxr->rx_bseq_addr, rxr->rx_prod_bseq);
3216
3217         mmiowb();
3218
3219         return rx_pkt;
3220
3221 }
3222
3223 /* MSI ISR - The only difference between this and the INTx ISR
3224  * is that the MSI interrupt is always serviced.
3225  */
3226 static irqreturn_t
3227 bnx2_msi(int irq, void *dev_instance)
3228 {
3229         struct bnx2_napi *bnapi = dev_instance;
3230         struct bnx2 *bp = bnapi->bp;
3231
3232         prefetch(bnapi->status_blk.msi);
3233         REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD,
3234                 BNX2_PCICFG_INT_ACK_CMD_USE_INT_HC_PARAM |
3235                 BNX2_PCICFG_INT_ACK_CMD_MASK_INT);
3236
3237         /* Return here if interrupt is disabled. */
3238         if (unlikely(atomic_read(&bp->intr_sem) != 0))
3239                 return IRQ_HANDLED;
3240
3241         napi_schedule(&bnapi->napi);
3242
3243         return IRQ_HANDLED;
3244 }
3245
3246 static irqreturn_t
3247 bnx2_msi_1shot(int irq, void *dev_instance)
3248 {
3249         struct bnx2_napi *bnapi = dev_instance;
3250         struct bnx2 *bp = bnapi->bp;
3251
3252         prefetch(bnapi->status_blk.msi);
3253
3254         /* Return here if interrupt is disabled. */
3255         if (unlikely(atomic_read(&bp->intr_sem) != 0))
3256                 return IRQ_HANDLED;
3257
3258         napi_schedule(&bnapi->napi);
3259
3260         return IRQ_HANDLED;
3261 }
3262
3263 static irqreturn_t
3264 bnx2_interrupt(int irq, void *dev_instance)
3265 {
3266         struct bnx2_napi *bnapi = dev_instance;
3267         struct bnx2 *bp = bnapi->bp;
3268         struct status_block *sblk = bnapi->status_blk.msi;
3269
3270         /* When using INTx, it is possible for the interrupt to arrive
3271          * at the CPU before the status block posted prior to the
3272          * interrupt. Reading a register will flush the status block.
3273          * When using MSI, the MSI message will always complete after
3274          * the status block write.
3275          */
3276         if ((sblk->status_idx == bnapi->last_status_idx) &&
3277             (REG_RD(bp, BNX2_PCICFG_MISC_STATUS) &
3278              BNX2_PCICFG_MISC_STATUS_INTA_VALUE))
3279                 return IRQ_NONE;
3280
3281         REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD,
3282                 BNX2_PCICFG_INT_ACK_CMD_USE_INT_HC_PARAM |
3283                 BNX2_PCICFG_INT_ACK_CMD_MASK_INT);
3284
3285         /* Read back to deassert IRQ immediately to avoid too many
3286          * spurious interrupts.
3287          */
3288         REG_RD(bp, BNX2_PCICFG_INT_ACK_CMD);
3289
3290         /* Return here if interrupt is shared and is disabled. */
3291         if (unlikely(atomic_read(&bp->intr_sem) != 0))
3292                 return IRQ_HANDLED;
3293
3294         if (napi_schedule_prep(&bnapi->napi)) {
3295                 bnapi->last_status_idx = sblk->status_idx;
3296                 __napi_schedule(&bnapi->napi);
3297         }
3298
3299         return IRQ_HANDLED;
3300 }
3301
3302 static inline int
3303 bnx2_has_fast_work(struct bnx2_napi *bnapi)
3304 {
3305         struct bnx2_tx_ring_info *txr = &bnapi->tx_ring;
3306         struct bnx2_rx_ring_info *rxr = &bnapi->rx_ring;
3307
3308         if ((bnx2_get_hw_rx_cons(bnapi) != rxr->rx_cons) ||
3309             (bnx2_get_hw_tx_cons(bnapi) != txr->hw_tx_cons))
3310                 return 1;
3311         return 0;
3312 }
3313
3314 #define STATUS_ATTN_EVENTS      (STATUS_ATTN_BITS_LINK_STATE | \
3315                                  STATUS_ATTN_BITS_TIMER_ABORT)
3316
3317 static inline int
3318 bnx2_has_work(struct bnx2_napi *bnapi)
3319 {
3320         struct status_block *sblk = bnapi->status_blk.msi;
3321
3322         if (bnx2_has_fast_work(bnapi))
3323                 return 1;
3324
3325 #ifdef BCM_CNIC
3326         if (bnapi->cnic_present && (bnapi->cnic_tag != sblk->status_idx))
3327                 return 1;
3328 #endif
3329
3330         if ((sblk->status_attn_bits & STATUS_ATTN_EVENTS) !=
3331             (sblk->status_attn_bits_ack & STATUS_ATTN_EVENTS))
3332                 return 1;
3333
3334         return 0;
3335 }
3336
3337 static void
3338 bnx2_chk_missed_msi(struct bnx2 *bp)
3339 {
3340         struct bnx2_napi *bnapi = &bp->bnx2_napi[0];
3341         u32 msi_ctrl;
3342
3343         if (bnx2_has_work(bnapi)) {
3344                 msi_ctrl = REG_RD(bp, BNX2_PCICFG_MSI_CONTROL);
3345                 if (!(msi_ctrl & BNX2_PCICFG_MSI_CONTROL_ENABLE))
3346                         return;
3347
3348                 if (bnapi->last_status_idx == bp->idle_chk_status_idx) {
3349                         REG_WR(bp, BNX2_PCICFG_MSI_CONTROL, msi_ctrl &
3350                                ~BNX2_PCICFG_MSI_CONTROL_ENABLE);
3351                         REG_WR(bp, BNX2_PCICFG_MSI_CONTROL, msi_ctrl);
3352                         bnx2_msi(bp->irq_tbl[0].vector, bnapi);
3353                 }
3354         }
3355
3356         bp->idle_chk_status_idx = bnapi->last_status_idx;
3357 }
3358
3359 #ifdef BCM_CNIC
3360 static void bnx2_poll_cnic(struct bnx2 *bp, struct bnx2_napi *bnapi)
3361 {
3362         struct cnic_ops *c_ops;
3363
3364         if (!bnapi->cnic_present)
3365                 return;
3366
3367         rcu_read_lock();
3368         c_ops = rcu_dereference(bp->cnic_ops);
3369         if (c_ops)
3370                 bnapi->cnic_tag = c_ops->cnic_handler(bp->cnic_data,
3371                                                       bnapi->status_blk.msi);
3372         rcu_read_unlock();
3373 }
3374 #endif
3375
3376 static void bnx2_poll_link(struct bnx2 *bp, struct bnx2_napi *bnapi)
3377 {
3378         struct status_block *sblk = bnapi->status_blk.msi;
3379         u32 status_attn_bits = sblk->status_attn_bits;
3380         u32 status_attn_bits_ack = sblk->status_attn_bits_ack;
3381
3382         if ((status_attn_bits & STATUS_ATTN_EVENTS) !=
3383             (status_attn_bits_ack & STATUS_ATTN_EVENTS)) {
3384
3385                 bnx2_phy_int(bp, bnapi);
3386
3387                 /* This is needed to take care of transient status
3388                  * during link changes.
3389                  */
3390                 REG_WR(bp, BNX2_HC_COMMAND,
3391                        bp->hc_cmd | BNX2_HC_COMMAND_COAL_NOW_WO_INT);
3392                 REG_RD(bp, BNX2_HC_COMMAND);
3393         }
3394 }
3395
3396 static int bnx2_poll_work(struct bnx2 *bp, struct bnx2_napi *bnapi,
3397                           int work_done, int budget)
3398 {
3399         struct bnx2_tx_ring_info *txr = &bnapi->tx_ring;
3400         struct bnx2_rx_ring_info *rxr = &bnapi->rx_ring;
3401
3402         if (bnx2_get_hw_tx_cons(bnapi) != txr->hw_tx_cons)
3403                 bnx2_tx_int(bp, bnapi, 0);
3404
3405         if (bnx2_get_hw_rx_cons(bnapi) != rxr->rx_cons)
3406                 work_done += bnx2_rx_int(bp, bnapi, budget - work_done);
3407
3408         return work_done;
3409 }
3410
3411 static int bnx2_poll_msix(struct napi_struct *napi, int budget)
3412 {
3413         struct bnx2_napi *bnapi = container_of(napi, struct bnx2_napi, napi);
3414         struct bnx2 *bp = bnapi->bp;
3415         int work_done = 0;
3416         struct status_block_msix *sblk = bnapi->status_blk.msix;
3417
3418         while (1) {
3419                 work_done = bnx2_poll_work(bp, bnapi, work_done, budget);
3420                 if (unlikely(work_done >= budget))
3421                         break;
3422
3423                 bnapi->last_status_idx = sblk->status_idx;
3424                 /* status idx must be read before checking for more work. */
3425                 rmb();
3426                 if (likely(!bnx2_has_fast_work(bnapi))) {
3427
3428                         napi_complete(napi);
3429                         REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD, bnapi->int_num |
3430                                BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID |
3431                                bnapi->last_status_idx);
3432                         break;
3433                 }
3434         }
3435         return work_done;
3436 }
3437
3438 static int bnx2_poll(struct napi_struct *napi, int budget)
3439 {
3440         struct bnx2_napi *bnapi = container_of(napi, struct bnx2_napi, napi);
3441         struct bnx2 *bp = bnapi->bp;
3442         int work_done = 0;
3443         struct status_block *sblk = bnapi->status_blk.msi;
3444
3445         while (1) {
3446                 bnx2_poll_link(bp, bnapi);
3447
3448                 work_done = bnx2_poll_work(bp, bnapi, work_done, budget);
3449
3450 #ifdef BCM_CNIC
3451                 bnx2_poll_cnic(bp, bnapi);
3452 #endif
3453
3454                 /* bnapi->last_status_idx is used below to tell the hw how
3455                  * much work has been processed, so we must read it before
3456                  * checking for more work.
3457                  */
3458                 bnapi->last_status_idx = sblk->status_idx;
3459
3460                 if (unlikely(work_done >= budget))
3461                         break;
3462
3463                 rmb();
3464                 if (likely(!bnx2_has_work(bnapi))) {
3465                         napi_complete(napi);
3466                         if (likely(bp->flags & BNX2_FLAG_USING_MSI_OR_MSIX)) {
3467                                 REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD,
3468                                        BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID |
3469                                        bnapi->last_status_idx);
3470                                 break;
3471                         }
3472                         REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD,
3473                                BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID |
3474                                BNX2_PCICFG_INT_ACK_CMD_MASK_INT |
3475                                bnapi->last_status_idx);
3476
3477                         REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD,
3478                                BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID |
3479                                bnapi->last_status_idx);
3480                         break;
3481                 }
3482         }
3483
3484         return work_done;
3485 }
3486
3487 /* Called with rtnl_lock from vlan functions and also netif_tx_lock
3488  * from set_multicast.
3489  */
3490 static void
3491 bnx2_set_rx_mode(struct net_device *dev)
3492 {
3493         struct bnx2 *bp = netdev_priv(dev);
3494         u32 rx_mode, sort_mode;
3495         struct dev_addr_list *uc_ptr;
3496         int i;
3497
3498         if (!netif_running(dev))
3499                 return;
3500
3501         spin_lock_bh(&bp->phy_lock);
3502
3503         rx_mode = bp->rx_mode & ~(BNX2_EMAC_RX_MODE_PROMISCUOUS |
3504                                   BNX2_EMAC_RX_MODE_KEEP_VLAN_TAG);
3505         sort_mode = 1 | BNX2_RPM_SORT_USER0_BC_EN;
3506 #ifdef BCM_VLAN
3507         if (!bp->vlgrp && (bp->flags & BNX2_FLAG_CAN_KEEP_VLAN))
3508                 rx_mode |= BNX2_EMAC_RX_MODE_KEEP_VLAN_TAG;
3509 #else
3510         if (bp->flags & BNX2_FLAG_CAN_KEEP_VLAN)
3511                 rx_mode |= BNX2_EMAC_RX_MODE_KEEP_VLAN_TAG;
3512 #endif
3513         if (dev->flags & IFF_PROMISC) {
3514                 /* Promiscuous mode. */
3515                 rx_mode |= BNX2_EMAC_RX_MODE_PROMISCUOUS;
3516                 sort_mode |= BNX2_RPM_SORT_USER0_PROM_EN |
3517                              BNX2_RPM_SORT_USER0_PROM_VLAN;
3518         }
3519         else if (dev->flags & IFF_ALLMULTI) {
3520                 for (i = 0; i < NUM_MC_HASH_REGISTERS; i++) {
3521                         REG_WR(bp, BNX2_EMAC_MULTICAST_HASH0 + (i * 4),
3522                                0xffffffff);
3523                 }
3524                 sort_mode |= BNX2_RPM_SORT_USER0_MC_EN;
3525         }
3526         else {
3527                 /* Accept one or more multicast(s). */
3528                 struct dev_mc_list *mclist;
3529                 u32 mc_filter[NUM_MC_HASH_REGISTERS];
3530                 u32 regidx;
3531                 u32 bit;
3532                 u32 crc;
3533
3534                 memset(mc_filter, 0, 4 * NUM_MC_HASH_REGISTERS);
3535
3536                 for (i = 0, mclist = dev->mc_list; mclist && i < dev->mc_count;
3537                      i++, mclist = mclist->next) {
3538
3539                         crc = ether_crc_le(ETH_ALEN, mclist->dmi_addr);
3540                         bit = crc & 0xff;
3541                         regidx = (bit & 0xe0) >> 5;
3542                         bit &= 0x1f;
3543                         mc_filter[regidx] |= (1 << bit);
3544                 }
3545
3546                 for (i = 0; i < NUM_MC_HASH_REGISTERS; i++) {
3547                         REG_WR(bp, BNX2_EMAC_MULTICAST_HASH0 + (i * 4),
3548                                mc_filter[i]);
3549                 }
3550
3551                 sort_mode |= BNX2_RPM_SORT_USER0_MC_HSH_EN;
3552         }
3553
3554         uc_ptr = NULL;
3555         if (dev->uc_count > BNX2_MAX_UNICAST_ADDRESSES) {
3556                 rx_mode |= BNX2_EMAC_RX_MODE_PROMISCUOUS;
3557                 sort_mode |= BNX2_RPM_SORT_USER0_PROM_EN |
3558                              BNX2_RPM_SORT_USER0_PROM_VLAN;
3559         } else if (!(dev->flags & IFF_PROMISC)) {
3560                 uc_ptr = dev->uc_list;
3561
3562                 /* Add all entries into to the match filter list */
3563                 for (i = 0; i < dev->uc_count; i++) {
3564                         bnx2_set_mac_addr(bp, uc_ptr->da_addr,
3565                                           i + BNX2_START_UNICAST_ADDRESS_INDEX);
3566                         sort_mode |= (1 <<
3567                                       (i + BNX2_START_UNICAST_ADDRESS_INDEX));
3568                         uc_ptr = uc_ptr->next;
3569                 }
3570
3571         }
3572
3573         if (rx_mode != bp->rx_mode) {
3574                 bp->rx_mode = rx_mode;
3575                 REG_WR(bp, BNX2_EMAC_RX_MODE, rx_mode);
3576         }
3577
3578         REG_WR(bp, BNX2_RPM_SORT_USER0, 0x0);
3579         REG_WR(bp, BNX2_RPM_SORT_USER0, sort_mode);
3580         REG_WR(bp, BNX2_RPM_SORT_USER0, sort_mode | BNX2_RPM_SORT_USER0_ENA);
3581
3582         spin_unlock_bh(&bp->phy_lock);
3583 }
3584
3585 static int __devinit
3586 check_fw_section(const struct firmware *fw,
3587                  const struct bnx2_fw_file_section *section,
3588                  u32 alignment, bool non_empty)
3589 {
3590         u32 offset = be32_to_cpu(section->offset);
3591         u32 len = be32_to_cpu(section->len);
3592
3593         if ((offset == 0 && len != 0) || offset >= fw->size || offset & 3)
3594                 return -EINVAL;
3595         if ((non_empty && len == 0) || len > fw->size - offset ||
3596             len & (alignment - 1))
3597                 return -EINVAL;
3598         return 0;
3599 }
3600
3601 static int __devinit
3602 check_mips_fw_entry(const struct firmware *fw,
3603                     const struct bnx2_mips_fw_file_entry *entry)
3604 {
3605         if (check_fw_section(fw, &entry->text, 4, true) ||
3606             check_fw_section(fw, &entry->data, 4, false) ||
3607             check_fw_section(fw, &entry->rodata, 4, false))
3608                 return -EINVAL;
3609         return 0;
3610 }
3611
3612 static int __devinit
3613 bnx2_request_firmware(struct bnx2 *bp)
3614 {
3615         const char *mips_fw_file, *rv2p_fw_file;
3616         const struct bnx2_mips_fw_file *mips_fw;
3617         const struct bnx2_rv2p_fw_file *rv2p_fw;
3618         int rc;
3619
3620         if (CHIP_NUM(bp) == CHIP_NUM_5709) {
3621                 mips_fw_file = FW_MIPS_FILE_09;
3622                 rv2p_fw_file = FW_RV2P_FILE_09;
3623         } else {
3624                 mips_fw_file = FW_MIPS_FILE_06;
3625                 rv2p_fw_file = FW_RV2P_FILE_06;
3626         }
3627
3628         rc = request_firmware(&bp->mips_firmware, mips_fw_file, &bp->pdev->dev);
3629         if (rc) {
3630                 printk(KERN_ERR PFX "Can't load firmware file \"%s\"\n",
3631                        mips_fw_file);
3632                 return rc;
3633         }
3634
3635         rc = request_firmware(&bp->rv2p_firmware, rv2p_fw_file, &bp->pdev->dev);
3636         if (rc) {
3637                 printk(KERN_ERR PFX "Can't load firmware file \"%s\"\n",
3638                        rv2p_fw_file);
3639                 return rc;
3640         }
3641         mips_fw = (const struct bnx2_mips_fw_file *) bp->mips_firmware->data;
3642         rv2p_fw = (const struct bnx2_rv2p_fw_file *) bp->rv2p_firmware->data;
3643         if (bp->mips_firmware->size < sizeof(*mips_fw) ||
3644             check_mips_fw_entry(bp->mips_firmware, &mips_fw->com) ||
3645             check_mips_fw_entry(bp->mips_firmware, &mips_fw->cp) ||
3646             check_mips_fw_entry(bp->mips_firmware, &mips_fw->rxp) ||
3647             check_mips_fw_entry(bp->mips_firmware, &mips_fw->tpat) ||
3648             check_mips_fw_entry(bp->mips_firmware, &mips_fw->txp)) {
3649                 printk(KERN_ERR PFX "Firmware file \"%s\" is invalid\n",
3650                        mips_fw_file);
3651                 return -EINVAL;
3652         }
3653         if (bp->rv2p_firmware->size < sizeof(*rv2p_fw) ||
3654             check_fw_section(bp->rv2p_firmware, &rv2p_fw->proc1.rv2p, 8, true) ||
3655             check_fw_section(bp->rv2p_firmware, &rv2p_fw->proc2.rv2p, 8, true)) {
3656                 printk(KERN_ERR PFX "Firmware file \"%s\" is invalid\n",
3657                        rv2p_fw_file);
3658                 return -EINVAL;
3659         }
3660
3661         return 0;
3662 }
3663
3664 static u32
3665 rv2p_fw_fixup(u32 rv2p_proc, int idx, u32 loc, u32 rv2p_code)
3666 {
3667         switch (idx) {
3668         case RV2P_P1_FIXUP_PAGE_SIZE_IDX:
3669                 rv2p_code &= ~RV2P_BD_PAGE_SIZE_MSK;
3670                 rv2p_code |= RV2P_BD_PAGE_SIZE;
3671                 break;
3672         }
3673         return rv2p_code;
3674 }
3675
3676 static int
3677 load_rv2p_fw(struct bnx2 *bp, u32 rv2p_proc,
3678              const struct bnx2_rv2p_fw_file_entry *fw_entry)
3679 {
3680         u32 rv2p_code_len, file_offset;
3681         __be32 *rv2p_code;
3682         int i;
3683         u32 val, cmd, addr;
3684
3685         rv2p_code_len = be32_to_cpu(fw_entry->rv2p.len);
3686         file_offset = be32_to_cpu(fw_entry->rv2p.offset);
3687
3688         rv2p_code = (__be32 *)(bp->rv2p_firmware->data + file_offset);
3689
3690         if (rv2p_proc == RV2P_PROC1) {
3691                 cmd = BNX2_RV2P_PROC1_ADDR_CMD_RDWR;
3692                 addr = BNX2_RV2P_PROC1_ADDR_CMD;
3693         } else {
3694                 cmd = BNX2_RV2P_PROC2_ADDR_CMD_RDWR;
3695                 addr = BNX2_RV2P_PROC2_ADDR_CMD;
3696         }
3697
3698         for (i = 0; i < rv2p_code_len; i += 8) {
3699                 REG_WR(bp, BNX2_RV2P_INSTR_HIGH, be32_to_cpu(*rv2p_code));
3700                 rv2p_code++;
3701                 REG_WR(bp, BNX2_RV2P_INSTR_LOW, be32_to_cpu(*rv2p_code));
3702                 rv2p_code++;
3703
3704                 val = (i / 8) | cmd;
3705                 REG_WR(bp, addr, val);
3706         }
3707
3708         rv2p_code = (__be32 *)(bp->rv2p_firmware->data + file_offset);
3709         for (i = 0; i < 8; i++) {
3710                 u32 loc, code;
3711
3712                 loc = be32_to_cpu(fw_entry->fixup[i]);
3713                 if (loc && ((loc * 4) < rv2p_code_len)) {
3714                         code = be32_to_cpu(*(rv2p_code + loc - 1));
3715                         REG_WR(bp, BNX2_RV2P_INSTR_HIGH, code);
3716                         code = be32_to_cpu(*(rv2p_code + loc));
3717                         code = rv2p_fw_fixup(rv2p_proc, i, loc, code);
3718                         REG_WR(bp, BNX2_RV2P_INSTR_LOW, code);
3719
3720                         val = (loc / 2) | cmd;
3721                         REG_WR(bp, addr, val);
3722                 }
3723         }
3724
3725         /* Reset the processor, un-stall is done later. */
3726         if (rv2p_proc == RV2P_PROC1) {
3727                 REG_WR(bp, BNX2_RV2P_COMMAND, BNX2_RV2P_COMMAND_PROC1_RESET);
3728         }
3729         else {
3730                 REG_WR(bp, BNX2_RV2P_COMMAND, BNX2_RV2P_COMMAND_PROC2_RESET);
3731         }
3732
3733         return 0;
3734 }
3735
3736 static int
3737 load_cpu_fw(struct bnx2 *bp, const struct cpu_reg *cpu_reg,
3738             const struct bnx2_mips_fw_file_entry *fw_entry)
3739 {
3740         u32 addr, len, file_offset;
3741         __be32 *data;
3742         u32 offset;
3743         u32 val;
3744
3745         /* Halt the CPU. */
3746         val = bnx2_reg_rd_ind(bp, cpu_reg->mode);
3747         val |= cpu_reg->mode_value_halt;
3748         bnx2_reg_wr_ind(bp, cpu_reg->mode, val);
3749         bnx2_reg_wr_ind(bp, cpu_reg->state, cpu_reg->state_value_clear);
3750
3751         /* Load the Text area. */
3752         addr = be32_to_cpu(fw_entry->text.addr);
3753         len = be32_to_cpu(fw_entry->text.len);
3754         file_offset = be32_to_cpu(fw_entry->text.offset);
3755         data = (__be32 *)(bp->mips_firmware->data + file_offset);
3756
3757         offset = cpu_reg->spad_base + (addr - cpu_reg->mips_view_base);
3758         if (len) {
3759                 int j;
3760
3761                 for (j = 0; j < (len / 4); j++, offset += 4)
3762                         bnx2_reg_wr_ind(bp, offset, be32_to_cpu(data[j]));
3763         }
3764
3765         /* Load the Data area. */
3766         addr = be32_to_cpu(fw_entry->data.addr);
3767         len = be32_to_cpu(fw_entry->data.len);
3768         file_offset = be32_to_cpu(fw_entry->data.offset);
3769         data = (__be32 *)(bp->mips_firmware->data + file_offset);
3770
3771         offset = cpu_reg->spad_base + (addr - cpu_reg->mips_view_base);
3772         if (len) {
3773                 int j;
3774
3775                 for (j = 0; j < (len / 4); j++, offset += 4)
3776                         bnx2_reg_wr_ind(bp, offset, be32_to_cpu(data[j]));
3777         }
3778
3779         /* Load the Read-Only area. */
3780         addr = be32_to_cpu(fw_entry->rodata.addr);
3781         len = be32_to_cpu(fw_entry->rodata.len);
3782         file_offset = be32_to_cpu(fw_entry->rodata.offset);
3783         data = (__be32 *)(bp->mips_firmware->data + file_offset);
3784
3785         offset = cpu_reg->spad_base + (addr - cpu_reg->mips_view_base);
3786         if (len) {
3787                 int j;
3788
3789                 for (j = 0; j < (len / 4); j++, offset += 4)
3790                         bnx2_reg_wr_ind(bp, offset, be32_to_cpu(data[j]));
3791         }
3792
3793         /* Clear the pre-fetch instruction. */
3794         bnx2_reg_wr_ind(bp, cpu_reg->inst, 0);
3795
3796         val = be32_to_cpu(fw_entry->start_addr);
3797         bnx2_reg_wr_ind(bp, cpu_reg->pc, val);
3798
3799         /* Start the CPU. */
3800         val = bnx2_reg_rd_ind(bp, cpu_reg->mode);
3801         val &= ~cpu_reg->mode_value_halt;
3802         bnx2_reg_wr_ind(bp, cpu_reg->state, cpu_reg->state_value_clear);
3803         bnx2_reg_wr_ind(bp, cpu_reg->mode, val);
3804
3805         return 0;
3806 }
3807
3808 static int
3809 bnx2_init_cpus(struct bnx2 *bp)
3810 {
3811         const struct bnx2_mips_fw_file *mips_fw =
3812                 (const struct bnx2_mips_fw_file *) bp->mips_firmware->data;
3813         const struct bnx2_rv2p_fw_file *rv2p_fw =
3814                 (const struct bnx2_rv2p_fw_file *) bp->rv2p_firmware->data;
3815         int rc;
3816
3817         /* Initialize the RV2P processor. */
3818         load_rv2p_fw(bp, RV2P_PROC1, &rv2p_fw->proc1);
3819         load_rv2p_fw(bp, RV2P_PROC2, &rv2p_fw->proc2);
3820
3821         /* Initialize the RX Processor. */
3822         rc = load_cpu_fw(bp, &cpu_reg_rxp, &mips_fw->rxp);
3823         if (rc)
3824                 goto init_cpu_err;
3825
3826         /* Initialize the TX Processor. */
3827         rc = load_cpu_fw(bp, &cpu_reg_txp, &mips_fw->txp);
3828         if (rc)
3829                 goto init_cpu_err;
3830
3831         /* Initialize the TX Patch-up Processor. */
3832         rc = load_cpu_fw(bp, &cpu_reg_tpat, &mips_fw->tpat);
3833         if (rc)
3834                 goto init_cpu_err;
3835
3836         /* Initialize the Completion Processor. */
3837         rc = load_cpu_fw(bp, &cpu_reg_com, &mips_fw->com);
3838         if (rc)
3839                 goto init_cpu_err;
3840
3841         /* Initialize the Command Processor. */
3842         rc = load_cpu_fw(bp, &cpu_reg_cp, &mips_fw->cp);
3843
3844 init_cpu_err:
3845         return rc;
3846 }
3847
3848 static int
3849 bnx2_set_power_state(struct bnx2 *bp, pci_power_t state)
3850 {
3851         u16 pmcsr;
3852
3853         pci_read_config_word(bp->pdev, bp->pm_cap + PCI_PM_CTRL, &pmcsr);
3854
3855         switch (state) {
3856         case PCI_D0: {
3857                 u32 val;
3858
3859                 pci_write_config_word(bp->pdev, bp->pm_cap + PCI_PM_CTRL,
3860                         (pmcsr & ~PCI_PM_CTRL_STATE_MASK) |
3861                         PCI_PM_CTRL_PME_STATUS);
3862
3863                 if (pmcsr & PCI_PM_CTRL_STATE_MASK)
3864                         /* delay required during transition out of D3hot */
3865                         msleep(20);
3866
3867                 val = REG_RD(bp, BNX2_EMAC_MODE);
3868                 val |= BNX2_EMAC_MODE_MPKT_RCVD | BNX2_EMAC_MODE_ACPI_RCVD;
3869                 val &= ~BNX2_EMAC_MODE_MPKT;
3870                 REG_WR(bp, BNX2_EMAC_MODE, val);
3871
3872                 val = REG_RD(bp, BNX2_RPM_CONFIG);
3873                 val &= ~BNX2_RPM_CONFIG_ACPI_ENA;
3874                 REG_WR(bp, BNX2_RPM_CONFIG, val);
3875                 break;
3876         }
3877         case PCI_D3hot: {
3878                 int i;
3879                 u32 val, wol_msg;
3880
3881                 if (bp->wol) {
3882                         u32 advertising;
3883                         u8 autoneg;
3884
3885                         autoneg = bp->autoneg;
3886                         advertising = bp->advertising;
3887
3888                         if (bp->phy_port == PORT_TP) {
3889                                 bp->autoneg = AUTONEG_SPEED;
3890                                 bp->advertising = ADVERTISED_10baseT_Half |
3891                                         ADVERTISED_10baseT_Full |
3892                                         ADVERTISED_100baseT_Half |
3893                                         ADVERTISED_100baseT_Full |
3894                                         ADVERTISED_Autoneg;
3895                         }
3896
3897                         spin_lock_bh(&bp->phy_lock);
3898                         bnx2_setup_phy(bp, bp->phy_port);
3899                         spin_unlock_bh(&bp->phy_lock);
3900
3901                         bp->autoneg = autoneg;
3902                         bp->advertising = advertising;
3903
3904                         bnx2_set_mac_addr(bp, bp->dev->dev_addr, 0);
3905
3906                         val = REG_RD(bp, BNX2_EMAC_MODE);
3907
3908                         /* Enable port mode. */
3909                         val &= ~BNX2_EMAC_MODE_PORT;
3910                         val |= BNX2_EMAC_MODE_MPKT_RCVD |
3911                                BNX2_EMAC_MODE_ACPI_RCVD |
3912                                BNX2_EMAC_MODE_MPKT;
3913                         if (bp->phy_port == PORT_TP)
3914                                 val |= BNX2_EMAC_MODE_PORT_MII;
3915                         else {
3916                                 val |= BNX2_EMAC_MODE_PORT_GMII;
3917                                 if (bp->line_speed == SPEED_2500)
3918                                         val |= BNX2_EMAC_MODE_25G_MODE;
3919                         }
3920
3921                         REG_WR(bp, BNX2_EMAC_MODE, val);
3922
3923                         /* receive all multicast */
3924                         for (i = 0; i < NUM_MC_HASH_REGISTERS; i++) {
3925                                 REG_WR(bp, BNX2_EMAC_MULTICAST_HASH0 + (i * 4),
3926                                        0xffffffff);
3927                         }
3928                         REG_WR(bp, BNX2_EMAC_RX_MODE,
3929                                BNX2_EMAC_RX_MODE_SORT_MODE);
3930
3931                         val = 1 | BNX2_RPM_SORT_USER0_BC_EN |
3932                               BNX2_RPM_SORT_USER0_MC_EN;
3933                         REG_WR(bp, BNX2_RPM_SORT_USER0, 0x0);
3934                         REG_WR(bp, BNX2_RPM_SORT_USER0, val);
3935                         REG_WR(bp, BNX2_RPM_SORT_USER0, val |
3936                                BNX2_RPM_SORT_USER0_ENA);
3937
3938                         /* Need to enable EMAC and RPM for WOL. */
3939                         REG_WR(bp, BNX2_MISC_ENABLE_SET_BITS,
3940                                BNX2_MISC_ENABLE_SET_BITS_RX_PARSER_MAC_ENABLE |
3941                                BNX2_MISC_ENABLE_SET_BITS_TX_HEADER_Q_ENABLE |
3942                                BNX2_MISC_ENABLE_SET_BITS_EMAC_ENABLE);
3943
3944                         val = REG_RD(bp, BNX2_RPM_CONFIG);
3945                         val &= ~BNX2_RPM_CONFIG_ACPI_ENA;
3946                         REG_WR(bp, BNX2_RPM_CONFIG, val);
3947
3948                         wol_msg = BNX2_DRV_MSG_CODE_SUSPEND_WOL;
3949                 }
3950                 else {
3951                         wol_msg = BNX2_DRV_MSG_CODE_SUSPEND_NO_WOL;
3952                 }
3953
3954                 if (!(bp->flags & BNX2_FLAG_NO_WOL))
3955                         bnx2_fw_sync(bp, BNX2_DRV_MSG_DATA_WAIT3 | wol_msg,
3956                                      1, 0);
3957
3958                 pmcsr &= ~PCI_PM_CTRL_STATE_MASK;
3959                 if ((CHIP_ID(bp) == CHIP_ID_5706_A0) ||
3960                     (CHIP_ID(bp) == CHIP_ID_5706_A1)) {
3961
3962                         if (bp->wol)
3963                                 pmcsr |= 3;
3964                 }
3965                 else {
3966                         pmcsr |= 3;
3967                 }
3968                 if (bp->wol) {
3969                         pmcsr |= PCI_PM_CTRL_PME_ENABLE;
3970                 }
3971                 pci_write_config_word(bp->pdev, bp->pm_cap + PCI_PM_CTRL,
3972                                       pmcsr);
3973
3974                 /* No more memory access after this point until
3975                  * device is brought back to D0.
3976                  */
3977                 udelay(50);
3978                 break;
3979         }
3980         default:
3981                 return -EINVAL;
3982         }
3983         return 0;
3984 }
3985
3986 static int
3987 bnx2_acquire_nvram_lock(struct bnx2 *bp)
3988 {
3989         u32 val;
3990         int j;
3991
3992         /* Request access to the flash interface. */
3993         REG_WR(bp, BNX2_NVM_SW_ARB, BNX2_NVM_SW_ARB_ARB_REQ_SET2);
3994         for (j = 0; j < NVRAM_TIMEOUT_COUNT; j++) {
3995                 val = REG_RD(bp, BNX2_NVM_SW_ARB);
3996                 if (val & BNX2_NVM_SW_ARB_ARB_ARB2)
3997                         break;
3998
3999                 udelay(5);
4000         }
4001
4002         if (j >= NVRAM_TIMEOUT_COUNT)
4003                 return -EBUSY;
4004
4005         return 0;
4006 }
4007
4008 static int
4009 bnx2_release_nvram_lock(struct bnx2 *bp)
4010 {
4011         int j;
4012         u32 val;
4013
4014         /* Relinquish nvram interface. */
4015         REG_WR(bp, BNX2_NVM_SW_ARB, BNX2_NVM_SW_ARB_ARB_REQ_CLR2);
4016
4017         for (j = 0; j < NVRAM_TIMEOUT_COUNT; j++) {
4018                 val = REG_RD(bp, BNX2_NVM_SW_ARB);
4019                 if (!(val & BNX2_NVM_SW_ARB_ARB_ARB2))
4020                         break;
4021
4022                 udelay(5);
4023         }
4024
4025         if (j >= NVRAM_TIMEOUT_COUNT)
4026                 return -EBUSY;
4027
4028         return 0;
4029 }
4030
4031
4032 static int
4033 bnx2_enable_nvram_write(struct bnx2 *bp)
4034 {
4035         u32 val;
4036
4037         val = REG_RD(bp, BNX2_MISC_CFG);
4038         REG_WR(bp, BNX2_MISC_CFG, val | BNX2_MISC_CFG_NVM_WR_EN_PCI);
4039
4040         if (bp->flash_info->flags & BNX2_NV_WREN) {
4041                 int j;
4042
4043                 REG_WR(bp, BNX2_NVM_COMMAND, BNX2_NVM_COMMAND_DONE);
4044                 REG_WR(bp, BNX2_NVM_COMMAND,
4045                        BNX2_NVM_COMMAND_WREN | BNX2_NVM_COMMAND_DOIT);
4046
4047                 for (j = 0; j < NVRAM_TIMEOUT_COUNT; j++) {
4048                         udelay(5);
4049
4050                         val = REG_RD(bp, BNX2_NVM_COMMAND);
4051                         if (val & BNX2_NVM_COMMAND_DONE)
4052                                 break;
4053                 }
4054
4055                 if (j >= NVRAM_TIMEOUT_COUNT)
4056                         return -EBUSY;
4057         }
4058         return 0;
4059 }
4060
4061 static void
4062 bnx2_disable_nvram_write(struct bnx2 *bp)
4063 {
4064         u32 val;
4065
4066         val = REG_RD(bp, BNX2_MISC_CFG);
4067         REG_WR(bp, BNX2_MISC_CFG, val & ~BNX2_MISC_CFG_NVM_WR_EN);
4068 }
4069
4070
4071 static void
4072 bnx2_enable_nvram_access(struct bnx2 *bp)
4073 {
4074         u32 val;
4075
4076         val = REG_RD(bp, BNX2_NVM_ACCESS_ENABLE);
4077         /* Enable both bits, even on read. */
4078         REG_WR(bp, BNX2_NVM_ACCESS_ENABLE,
4079                val | BNX2_NVM_ACCESS_ENABLE_EN | BNX2_NVM_ACCESS_ENABLE_WR_EN);
4080 }
4081
4082 static void
4083 bnx2_disable_nvram_access(struct bnx2 *bp)
4084 {
4085         u32 val;
4086
4087         val = REG_RD(bp, BNX2_NVM_ACCESS_ENABLE);
4088         /* Disable both bits, even after read. */
4089         REG_WR(bp, BNX2_NVM_ACCESS_ENABLE,
4090                 val & ~(BNX2_NVM_ACCESS_ENABLE_EN |
4091                         BNX2_NVM_ACCESS_ENABLE_WR_EN));
4092 }
4093
4094 static int
4095 bnx2_nvram_erase_page(struct bnx2 *bp, u32 offset)
4096 {
4097         u32 cmd;
4098         int j;
4099
4100         if (bp->flash_info->flags & BNX2_NV_BUFFERED)
4101                 /* Buffered flash, no erase needed */
4102                 return 0;
4103
4104         /* Build an erase command */
4105         cmd = BNX2_NVM_COMMAND_ERASE | BNX2_NVM_COMMAND_WR |
4106               BNX2_NVM_COMMAND_DOIT;
4107
4108         /* Need to clear DONE bit separately. */
4109         REG_WR(bp, BNX2_NVM_COMMAND, BNX2_NVM_COMMAND_DONE);
4110
4111         /* Address of the NVRAM to read from. */
4112         REG_WR(bp, BNX2_NVM_ADDR, offset & BNX2_NVM_ADDR_NVM_ADDR_VALUE);
4113
4114         /* Issue an erase command. */
4115         REG_WR(bp, BNX2_NVM_COMMAND, cmd);
4116
4117         /* Wait for completion. */
4118         for (j = 0; j < NVRAM_TIMEOUT_COUNT; j++) {
4119                 u32 val;
4120
4121                 udelay(5);
4122
4123                 val = REG_RD(bp, BNX2_NVM_COMMAND);
4124                 if (val & BNX2_NVM_COMMAND_DONE)
4125                         break;
4126         }
4127
4128         if (j >= NVRAM_TIMEOUT_COUNT)
4129                 return -EBUSY;
4130
4131         return 0;
4132 }
4133
4134 static int
4135 bnx2_nvram_read_dword(struct bnx2 *bp, u32 offset, u8 *ret_val, u32 cmd_flags)
4136 {
4137         u32 cmd;
4138         int j;
4139
4140         /* Build the command word. */
4141         cmd = BNX2_NVM_COMMAND_DOIT | cmd_flags;
4142
4143         /* Calculate an offset of a buffered flash, not needed for 5709. */
4144         if (bp->flash_info->flags & BNX2_NV_TRANSLATE) {
4145                 offset = ((offset / bp->flash_info->page_size) <<
4146                            bp->flash_info->page_bits) +
4147                           (offset % bp->flash_info->page_size);
4148         }
4149
4150         /* Need to clear DONE bit separately. */
4151         REG_WR(bp, BNX2_NVM_COMMAND, BNX2_NVM_COMMAND_DONE);
4152
4153         /* Address of the NVRAM to read from. */
4154         REG_WR(bp, BNX2_NVM_ADDR, offset & BNX2_NVM_ADDR_NVM_ADDR_VALUE);
4155
4156         /* Issue a read command. */
4157         REG_WR(bp, BNX2_NVM_COMMAND, cmd);
4158
4159         /* Wait for completion. */
4160         for (j = 0; j < NVRAM_TIMEOUT_COUNT; j++) {
4161                 u32 val;
4162
4163                 udelay(5);
4164
4165                 val = REG_RD(bp, BNX2_NVM_COMMAND);
4166                 if (val & BNX2_NVM_COMMAND_DONE) {
4167                         __be32 v = cpu_to_be32(REG_RD(bp, BNX2_NVM_READ));
4168                         memcpy(ret_val, &v, 4);
4169                         break;
4170                 }
4171         }
4172         if (j >= NVRAM_TIMEOUT_COUNT)
4173                 return -EBUSY;
4174
4175         return 0;
4176 }
4177
4178
4179 static int
4180 bnx2_nvram_write_dword(struct bnx2 *bp, u32 offset, u8 *val, u32 cmd_flags)
4181 {
4182         u32 cmd;
4183         __be32 val32;
4184         int j;
4185
4186         /* Build the command word. */
4187         cmd = BNX2_NVM_COMMAND_DOIT | BNX2_NVM_COMMAND_WR | cmd_flags;
4188
4189         /* Calculate an offset of a buffered flash, not needed for 5709. */
4190         if (bp->flash_info->flags & BNX2_NV_TRANSLATE) {
4191                 offset = ((offset / bp->flash_info->page_size) <<
4192                           bp->flash_info->page_bits) +
4193                          (offset % bp->flash_info->page_size);
4194         }
4195
4196         /* Need to clear DONE bit separately. */
4197         REG_WR(bp, BNX2_NVM_COMMAND, BNX2_NVM_COMMAND_DONE);
4198
4199         memcpy(&val32, val, 4);
4200
4201         /* Write the data. */
4202         REG_WR(bp, BNX2_NVM_WRITE, be32_to_cpu(val32));
4203
4204         /* Address of the NVRAM to write to. */
4205         REG_WR(bp, BNX2_NVM_ADDR, offset & BNX2_NVM_ADDR_NVM_ADDR_VALUE);
4206
4207         /* Issue the write command. */
4208         REG_WR(bp, BNX2_NVM_COMMAND, cmd);
4209
4210         /* Wait for completion. */
4211         for (j = 0; j < NVRAM_TIMEOUT_COUNT; j++) {
4212                 udelay(5);
4213
4214                 if (REG_RD(bp, BNX2_NVM_COMMAND) & BNX2_NVM_COMMAND_DONE)
4215                         break;
4216         }
4217         if (j >= NVRAM_TIMEOUT_COUNT)
4218                 return -EBUSY;
4219
4220         return 0;
4221 }
4222
4223 static int
4224 bnx2_init_nvram(struct bnx2 *bp)
4225 {
4226         u32 val;
4227         int j, entry_count, rc = 0;
4228         struct flash_spec *flash;
4229
4230         if (CHIP_NUM(bp) == CHIP_NUM_5709) {
4231                 bp->flash_info = &flash_5709;
4232                 goto get_flash_size;
4233         }
4234
4235         /* Determine the selected interface. */
4236         val = REG_RD(bp, BNX2_NVM_CFG1);
4237
4238         entry_count = ARRAY_SIZE(flash_table);
4239
4240         if (val & 0x40000000) {
4241
4242                 /* Flash interface has been reconfigured */
4243                 for (j = 0, flash = &flash_table[0]; j < entry_count;
4244                      j++, flash++) {
4245                         if ((val & FLASH_BACKUP_STRAP_MASK) ==
4246                             (flash->config1 & FLASH_BACKUP_STRAP_MASK)) {
4247                                 bp->flash_info = flash;
4248                                 break;
4249                         }
4250                 }
4251         }
4252         else {
4253                 u32 mask;
4254                 /* Not yet been reconfigured */
4255
4256                 if (val & (1 << 23))
4257                         mask = FLASH_BACKUP_STRAP_MASK;
4258                 else
4259                         mask = FLASH_STRAP_MASK;
4260
4261                 for (j = 0, flash = &flash_table[0]; j < entry_count;
4262                         j++, flash++) {
4263
4264                         if ((val & mask) == (flash->strapping & mask)) {
4265                                 bp->flash_info = flash;
4266
4267                                 /* Request access to the flash interface. */
4268                                 if ((rc = bnx2_acquire_nvram_lock(bp)) != 0)
4269                                         return rc;
4270
4271                                 /* Enable access to flash interface */
4272                                 bnx2_enable_nvram_access(bp);
4273
4274                                 /* Reconfigure the flash interface */
4275                                 REG_WR(bp, BNX2_NVM_CFG1, flash->config1);
4276                                 REG_WR(bp, BNX2_NVM_CFG2, flash->config2);
4277                                 REG_WR(bp, BNX2_NVM_CFG3, flash->config3);
4278                                 REG_WR(bp, BNX2_NVM_WRITE1, flash->write1);
4279
4280                                 /* Disable access to flash interface */
4281                                 bnx2_disable_nvram_access(bp);
4282                                 bnx2_release_nvram_lock(bp);
4283
4284                                 break;
4285                         }
4286                 }
4287         } /* if (val & 0x40000000) */
4288
4289         if (j == entry_count) {
4290                 bp->flash_info = NULL;
4291                 printk(KERN_ALERT PFX "Unknown flash/EEPROM type.\n");
4292                 return -ENODEV;
4293         }
4294
4295 get_flash_size:
4296         val = bnx2_shmem_rd(bp, BNX2_SHARED_HW_CFG_CONFIG2);
4297         val &= BNX2_SHARED_HW_CFG2_NVM_SIZE_MASK;
4298         if (val)
4299                 bp->flash_size = val;
4300         else
4301                 bp->flash_size = bp->flash_info->total_size;
4302
4303         return rc;
4304 }
4305
4306 static int
4307 bnx2_nvram_read(struct bnx2 *bp, u32 offset, u8 *ret_buf,
4308                 int buf_size)
4309 {
4310         int rc = 0;
4311         u32 cmd_flags, offset32, len32, extra;
4312
4313         if (buf_size == 0)
4314                 return 0;
4315
4316         /* Request access to the flash interface. */
4317         if ((rc = bnx2_acquire_nvram_lock(bp)) != 0)
4318                 return rc;
4319
4320         /* Enable access to flash interface */
4321         bnx2_enable_nvram_access(bp);
4322
4323         len32 = buf_size;
4324         offset32 = offset;
4325         extra = 0;
4326
4327         cmd_flags = 0;
4328
4329         if (offset32 & 3) {
4330                 u8 buf[4];
4331                 u32 pre_len;
4332
4333                 offset32 &= ~3;
4334                 pre_len = 4 - (offset & 3);
4335
4336                 if (pre_len >= len32) {
4337                         pre_len = len32;
4338                         cmd_flags = BNX2_NVM_COMMAND_FIRST |
4339                                     BNX2_NVM_COMMAND_LAST;
4340                 }
4341                 else {
4342                         cmd_flags = BNX2_NVM_COMMAND_FIRST;
4343                 }
4344
4345                 rc = bnx2_nvram_read_dword(bp, offset32, buf, cmd_flags);
4346
4347                 if (rc)
4348                         return rc;
4349
4350                 memcpy(ret_buf, buf + (offset & 3), pre_len);
4351
4352                 offset32 += 4;
4353                 ret_buf += pre_len;
4354                 len32 -= pre_len;
4355         }
4356         if (len32 & 3) {
4357                 extra = 4 - (len32 & 3);
4358                 len32 = (len32 + 4) & ~3;
4359         }
4360
4361         if (len32 == 4) {
4362                 u8 buf[4];
4363
4364                 if (cmd_flags)
4365                         cmd_flags = BNX2_NVM_COMMAND_LAST;
4366                 else
4367                         cmd_flags = BNX2_NVM_COMMAND_FIRST |
4368                                     BNX2_NVM_COMMAND_LAST;
4369
4370                 rc = bnx2_nvram_read_dword(bp, offset32, buf, cmd_flags);
4371
4372                 memcpy(ret_buf, buf, 4 - extra);
4373         }
4374         else if (len32 > 0) {
4375                 u8 buf[4];
4376
4377                 /* Read the first word. */
4378                 if (cmd_flags)
4379                         cmd_flags = 0;
4380                 else
4381                         cmd_flags = BNX2_NVM_COMMAND_FIRST;
4382
4383                 rc = bnx2_nvram_read_dword(bp, offset32, ret_buf, cmd_flags);
4384
4385                 /* Advance to the next dword. */
4386                 offset32 += 4;
4387                 ret_buf += 4;
4388                 len32 -= 4;
4389
4390                 while (len32 > 4 && rc == 0) {
4391                         rc = bnx2_nvram_read_dword(bp, offset32, ret_buf, 0);
4392
4393                         /* Advance to the next dword. */
4394                         offset32 += 4;
4395                         ret_buf += 4;
4396                         len32 -= 4;
4397                 }
4398
4399                 if (rc)
4400                         return rc;
4401
4402                 cmd_flags = BNX2_NVM_COMMAND_LAST;
4403                 rc = bnx2_nvram_read_dword(bp, offset32, buf, cmd_flags);
4404
4405                 memcpy(ret_buf, buf, 4 - extra);
4406         }
4407
4408         /* Disable access to flash interface */
4409         bnx2_disable_nvram_access(bp);
4410
4411         bnx2_release_nvram_lock(bp);
4412
4413         return rc;
4414 }
4415
4416 static int
4417 bnx2_nvram_write(struct bnx2 *bp, u32 offset, u8 *data_buf,
4418                 int buf_size)
4419 {
4420         u32 written, offset32, len32;
4421         u8 *buf, start[4], end[4], *align_buf = NULL, *flash_buffer = NULL;
4422         int rc = 0;
4423         int align_start, align_end;
4424
4425         buf = data_buf;
4426         offset32 = offset;
4427         len32 = buf_size;
4428         align_start = align_end = 0;
4429
4430         if ((align_start = (offset32 & 3))) {
4431                 offset32 &= ~3;
4432                 len32 += align_start;
4433                 if (len32 < 4)
4434                         len32 = 4;
4435                 if ((rc = bnx2_nvram_read(bp, offset32, start, 4)))
4436                         return rc;
4437         }
4438
4439         if (len32 & 3) {
4440                 align_end = 4 - (len32 & 3);
4441                 len32 += align_end;
4442                 if ((rc = bnx2_nvram_read(bp, offset32 + len32 - 4, end, 4)))
4443                         return rc;
4444         }
4445
4446         if (align_start || align_end) {
4447                 align_buf = kmalloc(len32, GFP_KERNEL);
4448                 if (align_buf == NULL)
4449                         return -ENOMEM;
4450                 if (align_start) {
4451                         memcpy(align_buf, start, 4);
4452                 }
4453                 if (align_end) {
4454                         memcpy(align_buf + len32 - 4, end, 4);
4455                 }
4456                 memcpy(align_buf + align_start, data_buf, buf_size);
4457                 buf = align_buf;
4458         }
4459
4460         if (!(bp->flash_info->flags & BNX2_NV_BUFFERED)) {
4461                 flash_buffer = kmalloc(264, GFP_KERNEL);
4462                 if (flash_buffer == NULL) {
4463                         rc = -ENOMEM;
4464                         goto nvram_write_end;
4465                 }
4466         }
4467
4468         written = 0;
4469         while ((written < len32) && (rc == 0)) {
4470                 u32 page_start, page_end, data_start, data_end;
4471                 u32 addr, cmd_flags;
4472                 int i;
4473
4474                 /* Find the page_start addr */
4475                 page_start = offset32 + written;
4476                 page_start -= (page_start % bp->flash_info->page_size);
4477                 /* Find the page_end addr */
4478                 page_end = page_start + bp->flash_info->page_size;
4479                 /* Find the data_start addr */
4480                 data_start = (written == 0) ? offset32 : page_start;
4481                 /* Find the data_end addr */
4482                 data_end = (page_end > offset32 + len32) ?
4483                         (offset32 + len32) : page_end;
4484
4485                 /* Request access to the flash interface. */
4486                 if ((rc = bnx2_acquire_nvram_lock(bp)) != 0)
4487                         goto nvram_write_end;
4488
4489                 /* Enable access to flash interface */
4490                 bnx2_enable_nvram_access(bp);
4491
4492                 cmd_flags = BNX2_NVM_COMMAND_FIRST;
4493                 if (!(bp->flash_info->flags & BNX2_NV_BUFFERED)) {
4494                         int j;
4495
4496                         /* Read the whole page into the buffer
4497                          * (non-buffer flash only) */
4498                         for (j = 0; j < bp->flash_info->page_size; j += 4) {
4499                                 if (j == (bp->flash_info->page_size - 4)) {
4500                                         cmd_flags |= BNX2_NVM_COMMAND_LAST;
4501                                 }
4502                                 rc = bnx2_nvram_read_dword(bp,
4503                                         page_start + j,
4504                                         &flash_buffer[j],
4505                                         cmd_flags);
4506
4507                                 if (rc)
4508                                         goto nvram_write_end;
4509
4510                                 cmd_flags = 0;
4511                         }
4512                 }
4513
4514                 /* Enable writes to flash interface (unlock write-protect) */
4515                 if ((rc = bnx2_enable_nvram_write(bp)) != 0)
4516                         goto nvram_write_end;
4517
4518                 /* Loop to write back the buffer data from page_start to
4519                  * data_start */
4520                 i = 0;
4521                 if (!(bp->flash_info->flags & BNX2_NV_BUFFERED)) {
4522                         /* Erase the page */
4523                         if ((rc = bnx2_nvram_erase_page(bp, page_start)) != 0)
4524                                 goto nvram_write_end;
4525
4526                         /* Re-enable the write again for the actual write */
4527                         bnx2_enable_nvram_write(bp);
4528
4529                         for (addr = page_start; addr < data_start;
4530                                 addr += 4, i += 4) {
4531
4532                                 rc = bnx2_nvram_write_dword(bp, addr,
4533                                         &flash_buffer[i], cmd_flags);
4534
4535                                 if (rc != 0)
4536                                         goto nvram_write_end;
4537
4538                                 cmd_flags = 0;
4539                         }
4540                 }
4541
4542                 /* Loop to write the new data from data_start to data_end */
4543                 for (addr = data_start; addr < data_end; addr += 4, i += 4) {
4544                         if ((addr == page_end - 4) ||
4545                                 ((bp->flash_info->flags & BNX2_NV_BUFFERED) &&
4546                                  (addr == data_end - 4))) {
4547
4548                                 cmd_flags |= BNX2_NVM_COMMAND_LAST;
4549                         }
4550                         rc = bnx2_nvram_write_dword(bp, addr, buf,
4551                                 cmd_flags);
4552
4553                         if (rc != 0)
4554                                 goto nvram_write_end;
4555
4556                         cmd_flags = 0;
4557                         buf += 4;
4558                 }
4559
4560                 /* Loop to write back the buffer data from data_end
4561                  * to page_end */
4562                 if (!(bp->flash_info->flags & BNX2_NV_BUFFERED)) {
4563                         for (addr = data_end; addr < page_end;
4564                                 addr += 4, i += 4) {
4565
4566                                 if (addr == page_end-4) {
4567                                         cmd_flags = BNX2_NVM_COMMAND_LAST;
4568                                 }
4569                                 rc = bnx2_nvram_write_dword(bp, addr,
4570                                         &flash_buffer[i], cmd_flags);
4571
4572                                 if (rc != 0)
4573                                         goto nvram_write_end;
4574
4575                                 cmd_flags = 0;
4576                         }
4577                 }
4578
4579                 /* Disable writes to flash interface (lock write-protect) */
4580                 bnx2_disable_nvram_write(bp);
4581
4582                 /* Disable access to flash interface */
4583                 bnx2_disable_nvram_access(bp);
4584                 bnx2_release_nvram_lock(bp);
4585
4586                 /* Increment written */
4587                 written += data_end - data_start;
4588         }
4589
4590 nvram_write_end:
4591         kfree(flash_buffer);
4592         kfree(align_buf);
4593         return rc;
4594 }
4595
4596 static void
4597 bnx2_init_fw_cap(struct bnx2 *bp)
4598 {
4599         u32 val, sig = 0;
4600
4601         bp->phy_flags &= ~BNX2_PHY_FLAG_REMOTE_PHY_CAP;
4602         bp->flags &= ~BNX2_FLAG_CAN_KEEP_VLAN;
4603
4604         if (!(bp->flags & BNX2_FLAG_ASF_ENABLE))
4605                 bp->flags |= BNX2_FLAG_CAN_KEEP_VLAN;
4606
4607         val = bnx2_shmem_rd(bp, BNX2_FW_CAP_MB);
4608         if ((val & BNX2_FW_CAP_SIGNATURE_MASK) != BNX2_FW_CAP_SIGNATURE)
4609                 return;
4610
4611         if ((val & BNX2_FW_CAP_CAN_KEEP_VLAN) == BNX2_FW_CAP_CAN_KEEP_VLAN) {
4612                 bp->flags |= BNX2_FLAG_CAN_KEEP_VLAN;
4613                 sig |= BNX2_DRV_ACK_CAP_SIGNATURE | BNX2_FW_CAP_CAN_KEEP_VLAN;
4614         }
4615
4616         if ((bp->phy_flags & BNX2_PHY_FLAG_SERDES) &&
4617             (val & BNX2_FW_CAP_REMOTE_PHY_CAPABLE)) {
4618                 u32 link;
4619
4620                 bp->phy_flags |= BNX2_PHY_FLAG_REMOTE_PHY_CAP;
4621
4622                 link = bnx2_shmem_rd(bp, BNX2_LINK_STATUS);
4623                 if (link & BNX2_LINK_STATUS_SERDES_LINK)
4624                         bp->phy_port = PORT_FIBRE;
4625                 else
4626                         bp->phy_port = PORT_TP;
4627
4628                 sig |= BNX2_DRV_ACK_CAP_SIGNATURE |
4629                        BNX2_FW_CAP_REMOTE_PHY_CAPABLE;
4630         }
4631
4632         if (netif_running(bp->dev) && sig)
4633                 bnx2_shmem_wr(bp, BNX2_DRV_ACK_CAP_MB, sig);
4634 }
4635
4636 static void
4637 bnx2_setup_msix_tbl(struct bnx2 *bp)
4638 {
4639         REG_WR(bp, BNX2_PCI_GRC_WINDOW_ADDR, BNX2_PCI_GRC_WINDOW_ADDR_SEP_WIN);
4640
4641         REG_WR(bp, BNX2_PCI_GRC_WINDOW2_ADDR, BNX2_MSIX_TABLE_ADDR);
4642         REG_WR(bp, BNX2_PCI_GRC_WINDOW3_ADDR, BNX2_MSIX_PBA_ADDR);
4643 }
4644
4645 static int
4646 bnx2_reset_chip(struct bnx2 *bp, u32 reset_code)
4647 {
4648         u32 val;
4649         int i, rc = 0;
4650         u8 old_port;
4651
4652         /* Wait for the current PCI transaction to complete before
4653          * issuing a reset. */
4654         REG_WR(bp, BNX2_MISC_ENABLE_CLR_BITS,
4655                BNX2_MISC_ENABLE_CLR_BITS_TX_DMA_ENABLE |
4656                BNX2_MISC_ENABLE_CLR_BITS_DMA_ENGINE_ENABLE |
4657                BNX2_MISC_ENABLE_CLR_BITS_RX_DMA_ENABLE |
4658                BNX2_MISC_ENABLE_CLR_BITS_HOST_COALESCE_ENABLE);
4659         val = REG_RD(bp, BNX2_MISC_ENABLE_CLR_BITS);
4660         udelay(5);
4661
4662         /* Wait for the firmware to tell us it is ok to issue a reset. */
4663         bnx2_fw_sync(bp, BNX2_DRV_MSG_DATA_WAIT0 | reset_code, 1, 1);
4664
4665         /* Deposit a driver reset signature so the firmware knows that
4666          * this is a soft reset. */
4667         bnx2_shmem_wr(bp, BNX2_DRV_RESET_SIGNATURE,
4668                       BNX2_DRV_RESET_SIGNATURE_MAGIC);
4669
4670         /* Do a dummy read to force the chip to complete all current transaction
4671          * before we issue a reset. */
4672         val = REG_RD(bp, BNX2_MISC_ID);
4673
4674         if (CHIP_NUM(bp) == CHIP_NUM_5709) {
4675                 REG_WR(bp, BNX2_MISC_COMMAND, BNX2_MISC_COMMAND_SW_RESET);
4676                 REG_RD(bp, BNX2_MISC_COMMAND);
4677                 udelay(5);
4678
4679                 val = BNX2_PCICFG_MISC_CONFIG_REG_WINDOW_ENA |
4680                       BNX2_PCICFG_MISC_CONFIG_TARGET_MB_WORD_SWAP;
4681
4682                 pci_write_config_dword(bp->pdev, BNX2_PCICFG_MISC_CONFIG, val);
4683
4684         } else {
4685                 val = BNX2_PCICFG_MISC_CONFIG_CORE_RST_REQ |
4686                       BNX2_PCICFG_MISC_CONFIG_REG_WINDOW_ENA |
4687                       BNX2_PCICFG_MISC_CONFIG_TARGET_MB_WORD_SWAP;
4688
4689                 /* Chip reset. */
4690                 REG_WR(bp, BNX2_PCICFG_MISC_CONFIG, val);
4691
4692                 /* Reading back any register after chip reset will hang the
4693                  * bus on 5706 A0 and A1.  The msleep below provides plenty
4694                  * of margin for write posting.
4695                  */
4696                 if ((CHIP_ID(bp) == CHIP_ID_5706_A0) ||
4697                     (CHIP_ID(bp) == CHIP_ID_5706_A1))
4698                         msleep(20);
4699
4700                 /* Reset takes approximate 30 usec */
4701                 for (i = 0; i < 10; i++) {
4702                         val = REG_RD(bp, BNX2_PCICFG_MISC_CONFIG);
4703                         if ((val & (BNX2_PCICFG_MISC_CONFIG_CORE_RST_REQ |
4704                                     BNX2_PCICFG_MISC_CONFIG_CORE_RST_BSY)) == 0)
4705                                 break;
4706                         udelay(10);
4707                 }
4708
4709                 if (val & (BNX2_PCICFG_MISC_CONFIG_CORE_RST_REQ |
4710                            BNX2_PCICFG_MISC_CONFIG_CORE_RST_BSY)) {
4711                         printk(KERN_ERR PFX "Chip reset did not complete\n");
4712                         return -EBUSY;
4713                 }
4714         }
4715
4716         /* Make sure byte swapping is properly configured. */
4717         val = REG_RD(bp, BNX2_PCI_SWAP_DIAG0);
4718         if (val != 0x01020304) {
4719                 printk(KERN_ERR PFX "Chip not in correct endian mode\n");
4720                 return -ENODEV;
4721         }
4722
4723         /* Wait for the firmware to finish its initialization. */
4724         rc = bnx2_fw_sync(bp, BNX2_DRV_MSG_DATA_WAIT1 | reset_code, 1, 0);
4725         if (rc)
4726                 return rc;
4727
4728         spin_lock_bh(&bp->phy_lock);
4729         old_port = bp->phy_port;
4730         bnx2_init_fw_cap(bp);
4731         if ((bp->phy_flags & BNX2_PHY_FLAG_REMOTE_PHY_CAP) &&
4732             old_port != bp->phy_port)
4733                 bnx2_set_default_remote_link(bp);
4734         spin_unlock_bh(&bp->phy_lock);
4735
4736         if (CHIP_ID(bp) == CHIP_ID_5706_A0) {
4737                 /* Adjust the voltage regular to two steps lower.  The default
4738                  * of this register is 0x0000000e. */
4739                 REG_WR(bp, BNX2_MISC_VREG_CONTROL, 0x000000fa);
4740
4741                 /* Remove bad rbuf memory from the free pool. */
4742                 rc = bnx2_alloc_bad_rbuf(bp);
4743         }
4744
4745         if (bp->flags & BNX2_FLAG_USING_MSIX)
4746                 bnx2_setup_msix_tbl(bp);
4747
4748         return rc;
4749 }
4750
4751 static int
4752 bnx2_init_chip(struct bnx2 *bp)
4753 {
4754         u32 val, mtu;
4755         int rc, i;
4756
4757         /* Make sure the interrupt is not active. */
4758         REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD, BNX2_PCICFG_INT_ACK_CMD_MASK_INT);
4759
4760         val = BNX2_DMA_CONFIG_DATA_BYTE_SWAP |
4761               BNX2_DMA_CONFIG_DATA_WORD_SWAP |
4762 #ifdef __BIG_ENDIAN
4763               BNX2_DMA_CONFIG_CNTL_BYTE_SWAP |
4764 #endif
4765               BNX2_DMA_CONFIG_CNTL_WORD_SWAP |
4766               DMA_READ_CHANS << 12 |
4767               DMA_WRITE_CHANS << 16;
4768
4769         val |= (0x2 << 20) | (1 << 11);
4770
4771         if ((bp->flags & BNX2_FLAG_PCIX) && (bp->bus_speed_mhz == 133))
4772                 val |= (1 << 23);
4773
4774         if ((CHIP_NUM(bp) == CHIP_NUM_5706) &&
4775             (CHIP_ID(bp) != CHIP_ID_5706_A0) && !(bp->flags & BNX2_FLAG_PCIX))
4776                 val |= BNX2_DMA_CONFIG_CNTL_PING_PONG_DMA;
4777
4778         REG_WR(bp, BNX2_DMA_CONFIG, val);
4779
4780         if (CHIP_ID(bp) == CHIP_ID_5706_A0) {
4781                 val = REG_RD(bp, BNX2_TDMA_CONFIG);
4782                 val |= BNX2_TDMA_CONFIG_ONE_DMA;
4783                 REG_WR(bp, BNX2_TDMA_CONFIG, val);
4784         }
4785
4786         if (bp->flags & BNX2_FLAG_PCIX) {
4787                 u16 val16;
4788
4789                 pci_read_config_word(bp->pdev, bp->pcix_cap + PCI_X_CMD,
4790                                      &val16);
4791                 pci_write_config_word(bp->pdev, bp->pcix_cap + PCI_X_CMD,
4792                                       val16 & ~PCI_X_CMD_ERO);
4793         }
4794
4795         REG_WR(bp, BNX2_MISC_ENABLE_SET_BITS,
4796                BNX2_MISC_ENABLE_SET_BITS_HOST_COALESCE_ENABLE |
4797                BNX2_MISC_ENABLE_STATUS_BITS_RX_V2P_ENABLE |
4798                BNX2_MISC_ENABLE_STATUS_BITS_CONTEXT_ENABLE);
4799
4800         /* Initialize context mapping and zero out the quick contexts.  The
4801          * context block must have already been enabled. */
4802         if (CHIP_NUM(bp) == CHIP_NUM_5709) {
4803                 rc = bnx2_init_5709_context(bp);
4804                 if (rc)
4805                         return rc;
4806         } else
4807                 bnx2_init_context(bp);
4808
4809         if ((rc = bnx2_init_cpus(bp)) != 0)
4810                 return rc;
4811
4812         bnx2_init_nvram(bp);
4813
4814         bnx2_set_mac_addr(bp, bp->dev->dev_addr, 0);
4815
4816         val = REG_RD(bp, BNX2_MQ_CONFIG);
4817         val &= ~BNX2_MQ_CONFIG_KNL_BYP_BLK_SIZE;
4818         val |= BNX2_MQ_CONFIG_KNL_BYP_BLK_SIZE_256;
4819         if (CHIP_NUM(bp) == CHIP_NUM_5709) {
4820                 val |= BNX2_MQ_CONFIG_BIN_MQ_MODE;
4821                 if (CHIP_REV(bp) == CHIP_REV_Ax)
4822                         val |= BNX2_MQ_CONFIG_HALT_DIS;
4823         }
4824
4825         REG_WR(bp, BNX2_MQ_CONFIG, val);
4826
4827         val = 0x10000 + (MAX_CID_CNT * MB_KERNEL_CTX_SIZE);
4828         REG_WR(bp, BNX2_MQ_KNL_BYP_WIND_START, val);
4829         REG_WR(bp, BNX2_MQ_KNL_WIND_END, val);
4830
4831         val = (BCM_PAGE_BITS - 8) << 24;
4832         REG_WR(bp, BNX2_RV2P_CONFIG, val);
4833
4834         /* Configure page size. */
4835         val = REG_RD(bp, BNX2_TBDR_CONFIG);
4836         val &= ~BNX2_TBDR_CONFIG_PAGE_SIZE;
4837         val |= (BCM_PAGE_BITS - 8) << 24 | 0x40;
4838         REG_WR(bp, BNX2_TBDR_CONFIG, val);
4839
4840         val = bp->mac_addr[0] +
4841               (bp->mac_addr[1] << 8) +
4842               (bp->mac_addr[2] << 16) +
4843               bp->mac_addr[3] +
4844               (bp->mac_addr[4] << 8) +
4845               (bp->mac_addr[5] << 16);
4846         REG_WR(bp, BNX2_EMAC_BACKOFF_SEED, val);
4847
4848         /* Program the MTU.  Also include 4 bytes for CRC32. */
4849         mtu = bp->dev->mtu;
4850         val = mtu + ETH_HLEN + ETH_FCS_LEN;
4851         if (val > (MAX_ETHERNET_PACKET_SIZE + 4))
4852                 val |= BNX2_EMAC_RX_MTU_SIZE_JUMBO_ENA;
4853         REG_WR(bp, BNX2_EMAC_RX_MTU_SIZE, val);
4854
4855         if (mtu < 1500)
4856                 mtu = 1500;
4857
4858         bnx2_reg_wr_ind(bp, BNX2_RBUF_CONFIG, BNX2_RBUF_CONFIG_VAL(mtu));
4859         bnx2_reg_wr_ind(bp, BNX2_RBUF_CONFIG2, BNX2_RBUF_CONFIG2_VAL(mtu));
4860         bnx2_reg_wr_ind(bp, BNX2_RBUF_CONFIG3, BNX2_RBUF_CONFIG3_VAL(mtu));
4861
4862         for (i = 0; i < BNX2_MAX_MSIX_VEC; i++)
4863                 bp->bnx2_napi[i].last_status_idx = 0;
4864
4865         bp->idle_chk_status_idx = 0xffff;
4866
4867         bp->rx_mode = BNX2_EMAC_RX_MODE_SORT_MODE;
4868
4869         /* Set up how to generate a link change interrupt. */
4870         REG_WR(bp, BNX2_EMAC_ATTENTION_ENA, BNX2_EMAC_ATTENTION_ENA_LINK);
4871
4872         REG_WR(bp, BNX2_HC_STATUS_ADDR_L,
4873                (u64) bp->status_blk_mapping & 0xffffffff);
4874         REG_WR(bp, BNX2_HC_STATUS_ADDR_H, (u64) bp->status_blk_mapping >> 32);
4875
4876         REG_WR(bp, BNX2_HC_STATISTICS_ADDR_L,
4877                (u64) bp->stats_blk_mapping & 0xffffffff);
4878         REG_WR(bp, BNX2_HC_STATISTICS_ADDR_H,
4879                (u64) bp->stats_blk_mapping >> 32);
4880
4881         REG_WR(bp, BNX2_HC_TX_QUICK_CONS_TRIP,
4882                (bp->tx_quick_cons_trip_int << 16) | bp->tx_quick_cons_trip);
4883
4884         REG_WR(bp, BNX2_HC_RX_QUICK_CONS_TRIP,
4885                (bp->rx_quick_cons_trip_int << 16) | bp->rx_quick_cons_trip);
4886
4887         REG_WR(bp, BNX2_HC_COMP_PROD_TRIP,
4888                (bp->comp_prod_trip_int << 16) | bp->comp_prod_trip);
4889
4890         REG_WR(bp, BNX2_HC_TX_TICKS, (bp->tx_ticks_int << 16) | bp->tx_ticks);
4891
4892         REG_WR(bp, BNX2_HC_RX_TICKS, (bp->rx_ticks_int << 16) | bp->rx_ticks);
4893
4894         REG_WR(bp, BNX2_HC_COM_TICKS,
4895                (bp->com_ticks_int << 16) | bp->com_ticks);
4896
4897         REG_WR(bp, BNX2_HC_CMD_TICKS,
4898                (bp->cmd_ticks_int << 16) | bp->cmd_ticks);
4899
4900         if (CHIP_NUM(bp) == CHIP_NUM_5708)
4901                 REG_WR(bp, BNX2_HC_STATS_TICKS, 0);
4902         else
4903                 REG_WR(bp, BNX2_HC_STATS_TICKS, bp->stats_ticks);
4904         REG_WR(bp, BNX2_HC_STAT_COLLECT_TICKS, 0xbb8);  /* 3ms */
4905
4906         if (CHIP_ID(bp) == CHIP_ID_5706_A1)
4907                 val = BNX2_HC_CONFIG_COLLECT_STATS;
4908         else {
4909                 val = BNX2_HC_CONFIG_RX_TMR_MODE | BNX2_HC_CONFIG_TX_TMR_MODE |
4910                       BNX2_HC_CONFIG_COLLECT_STATS;
4911         }
4912
4913         if (bp->irq_nvecs > 1) {
4914                 REG_WR(bp, BNX2_HC_MSIX_BIT_VECTOR,
4915                        BNX2_HC_MSIX_BIT_VECTOR_VAL);
4916
4917                 val |= BNX2_HC_CONFIG_SB_ADDR_INC_128B;
4918         }
4919
4920         if (bp->flags & BNX2_FLAG_ONE_SHOT_MSI)
4921                 val |= BNX2_HC_CONFIG_ONE_SHOT;
4922
4923         REG_WR(bp, BNX2_HC_CONFIG, val);
4924
4925         for (i = 1; i < bp->irq_nvecs; i++) {
4926                 u32 base = ((i - 1) * BNX2_HC_SB_CONFIG_SIZE) +
4927                            BNX2_HC_SB_CONFIG_1;
4928
4929                 REG_WR(bp, base,
4930                         BNX2_HC_SB_CONFIG_1_TX_TMR_MODE |
4931                         BNX2_HC_SB_CONFIG_1_RX_TMR_MODE |
4932                         BNX2_HC_SB_CONFIG_1_ONE_SHOT);
4933
4934                 REG_WR(bp, base + BNX2_HC_TX_QUICK_CONS_TRIP_OFF,
4935                         (bp->tx_quick_cons_trip_int << 16) |
4936                          bp->tx_quick_cons_trip);
4937
4938                 REG_WR(bp, base + BNX2_HC_TX_TICKS_OFF,
4939                         (bp->tx_ticks_int << 16) | bp->tx_ticks);
4940
4941                 REG_WR(bp, base + BNX2_HC_RX_QUICK_CONS_TRIP_OFF,
4942                        (bp->rx_quick_cons_trip_int << 16) |
4943                         bp->rx_quick_cons_trip);
4944
4945                 REG_WR(bp, base + BNX2_HC_RX_TICKS_OFF,
4946                         (bp->rx_ticks_int << 16) | bp->rx_ticks);
4947         }
4948
4949         /* Clear internal stats counters. */
4950         REG_WR(bp, BNX2_HC_COMMAND, BNX2_HC_COMMAND_CLR_STAT_NOW);
4951
4952         REG_WR(bp, BNX2_HC_ATTN_BITS_ENABLE, STATUS_ATTN_EVENTS);
4953
4954         /* Initialize the receive filter. */
4955         bnx2_set_rx_mode(bp->dev);
4956
4957         if (CHIP_NUM(bp) == CHIP_NUM_5709) {
4958                 val = REG_RD(bp, BNX2_MISC_NEW_CORE_CTL);
4959                 val |= BNX2_MISC_NEW_CORE_CTL_DMA_ENABLE;
4960                 REG_WR(bp, BNX2_MISC_NEW_CORE_CTL, val);
4961         }
4962         rc = bnx2_fw_sync(bp, BNX2_DRV_MSG_DATA_WAIT2 | BNX2_DRV_MSG_CODE_RESET,
4963                           1, 0);
4964
4965         REG_WR(bp, BNX2_MISC_ENABLE_SET_BITS, BNX2_MISC_ENABLE_DEFAULT);
4966         REG_RD(bp, BNX2_MISC_ENABLE_SET_BITS);
4967
4968         udelay(20);
4969
4970         bp->hc_cmd = REG_RD(bp, BNX2_HC_COMMAND);
4971
4972         return rc;
4973 }
4974
4975 static void
4976 bnx2_clear_ring_states(struct bnx2 *bp)
4977 {
4978         struct bnx2_napi *bnapi;
4979         struct bnx2_tx_ring_info *txr;
4980         struct bnx2_rx_ring_info *rxr;
4981         int i;
4982
4983         for (i = 0; i < BNX2_MAX_MSIX_VEC; i++) {
4984                 bnapi = &bp->bnx2_napi[i];
4985                 txr = &bnapi->tx_ring;
4986                 rxr = &bnapi->rx_ring;
4987
4988                 txr->tx_cons = 0;
4989                 txr->hw_tx_cons = 0;
4990                 rxr->rx_prod_bseq = 0;
4991                 rxr->rx_prod = 0;
4992                 rxr->rx_cons = 0;
4993                 rxr->rx_pg_prod = 0;
4994                 rxr->rx_pg_cons = 0;
4995         }
4996 }
4997
4998 static void
4999 bnx2_init_tx_context(struct bnx2 *bp, u32 cid, struct bnx2_tx_ring_info *txr)
5000 {
5001         u32 val, offset0, offset1, offset2, offset3;
5002         u32 cid_addr = GET_CID_ADDR(cid);
5003
5004         if (CHIP_NUM(bp) == CHIP_NUM_5709) {
5005                 offset0 = BNX2_L2CTX_TYPE_XI;
5006                 offset1 = BNX2_L2CTX_CMD_TYPE_XI;
5007                 offset2 = BNX2_L2CTX_TBDR_BHADDR_HI_XI;
5008                 offset3 = BNX2_L2CTX_TBDR_BHADDR_LO_XI;
5009         } else {
5010                 offset0 = BNX2_L2CTX_TYPE;
5011                 offset1 = BNX2_L2CTX_CMD_TYPE;
5012                 offset2 = BNX2_L2CTX_TBDR_BHADDR_HI;
5013                 offset3 = BNX2_L2CTX_TBDR_BHADDR_LO;
5014         }
5015         val = BNX2_L2CTX_TYPE_TYPE_L2 | BNX2_L2CTX_TYPE_SIZE_L2;
5016         bnx2_ctx_wr(bp, cid_addr, offset0, val);
5017
5018         val = BNX2_L2CTX_CMD_TYPE_TYPE_L2 | (8 << 16);
5019         bnx2_ctx_wr(bp, cid_addr, offset1, val);
5020
5021         val = (u64) txr->tx_desc_mapping >> 32;
5022         bnx2_ctx_wr(bp, cid_addr, offset2, val);
5023
5024         val = (u64) txr->tx_desc_mapping & 0xffffffff;
5025         bnx2_ctx_wr(bp, cid_addr, offset3, val);
5026 }
5027
5028 static void
5029 bnx2_init_tx_ring(struct bnx2 *bp, int ring_num)
5030 {
5031         struct tx_bd *txbd;
5032         u32 cid = TX_CID;
5033         struct bnx2_napi *bnapi;
5034         struct bnx2_tx_ring_info *txr;
5035
5036         bnapi = &bp->bnx2_napi[ring_num];
5037         txr = &bnapi->tx_ring;
5038
5039         if (ring_num == 0)
5040                 cid = TX_CID;
5041         else
5042                 cid = TX_TSS_CID + ring_num - 1;
5043
5044         bp->tx_wake_thresh = bp->tx_ring_size / 2;
5045
5046         txbd = &txr->tx_desc_ring[MAX_TX_DESC_CNT];
5047
5048         txbd->tx_bd_haddr_hi = (u64) txr->tx_desc_mapping >> 32;
5049         txbd->tx_bd_haddr_lo = (u64) txr->tx_desc_mapping & 0xffffffff;
5050
5051         txr->tx_prod = 0;
5052         txr->tx_prod_bseq = 0;
5053
5054         txr->tx_bidx_addr = MB_GET_CID_ADDR(cid) + BNX2_L2CTX_TX_HOST_BIDX;
5055         txr->tx_bseq_addr = MB_GET_CID_ADDR(cid) + BNX2_L2CTX_TX_HOST_BSEQ;
5056
5057         bnx2_init_tx_context(bp, cid, txr);
5058 }
5059
5060 static void
5061 bnx2_init_rxbd_rings(struct rx_bd *rx_ring[], dma_addr_t dma[], u32 buf_size,
5062                      int num_rings)
5063 {
5064         int i;
5065         struct rx_bd *rxbd;
5066
5067         for (i = 0; i < num_rings; i++) {
5068                 int j;
5069
5070                 rxbd = &rx_ring[i][0];
5071                 for (j = 0; j < MAX_RX_DESC_CNT; j++, rxbd++) {
5072                         rxbd->rx_bd_len = buf_size;
5073                         rxbd->rx_bd_flags = RX_BD_FLAGS_START | RX_BD_FLAGS_END;
5074                 }
5075                 if (i == (num_rings - 1))
5076                         j = 0;
5077                 else
5078                         j = i + 1;
5079                 rxbd->rx_bd_haddr_hi = (u64) dma[j] >> 32;
5080                 rxbd->rx_bd_haddr_lo = (u64) dma[j] & 0xffffffff;
5081         }
5082 }
5083
5084 static void
5085 bnx2_init_rx_ring(struct bnx2 *bp, int ring_num)
5086 {
5087         int i;
5088         u16 prod, ring_prod;
5089         u32 cid, rx_cid_addr, val;
5090         struct bnx2_napi *bnapi = &bp->bnx2_napi[ring_num];
5091         struct bnx2_rx_ring_info *rxr = &bnapi->rx_ring;
5092
5093         if (ring_num == 0)
5094                 cid = RX_CID;
5095         else
5096                 cid = RX_RSS_CID + ring_num - 1;
5097
5098         rx_cid_addr = GET_CID_ADDR(cid);
5099
5100         bnx2_init_rxbd_rings(rxr->rx_desc_ring, rxr->rx_desc_mapping,
5101                              bp->rx_buf_use_size, bp->rx_max_ring);
5102
5103         bnx2_init_rx_context(bp, cid);
5104
5105         if (CHIP_NUM(bp) == CHIP_NUM_5709) {
5106                 val = REG_RD(bp, BNX2_MQ_MAP_L2_5);
5107                 REG_WR(bp, BNX2_MQ_MAP_L2_5, val | BNX2_MQ_MAP_L2_5_ARM);
5108         }
5109
5110         bnx2_ctx_wr(bp, rx_cid_addr, BNX2_L2CTX_PG_BUF_SIZE, 0);
5111         if (bp->rx_pg_ring_size) {
5112                 bnx2_init_rxbd_rings(rxr->rx_pg_desc_ring,
5113                                      rxr->rx_pg_desc_mapping,
5114                                      PAGE_SIZE, bp->rx_max_pg_ring);
5115                 val = (bp->rx_buf_use_size << 16) | PAGE_SIZE;
5116                 bnx2_ctx_wr(bp, rx_cid_addr, BNX2_L2CTX_PG_BUF_SIZE, val);
5117                 bnx2_ctx_wr(bp, rx_cid_addr, BNX2_L2CTX_RBDC_KEY,
5118                        BNX2_L2CTX_RBDC_JUMBO_KEY - ring_num);
5119
5120                 val = (u64) rxr->rx_pg_desc_mapping[0] >> 32;
5121                 bnx2_ctx_wr(bp, rx_cid_addr, BNX2_L2CTX_NX_PG_BDHADDR_HI, val);
5122
5123                 val = (u64) rxr->rx_pg_desc_mapping[0] & 0xffffffff;
5124                 bnx2_ctx_wr(bp, rx_cid_addr, BNX2_L2CTX_NX_PG_BDHADDR_LO, val);
5125
5126                 if (CHIP_NUM(bp) == CHIP_NUM_5709)
5127                         REG_WR(bp, BNX2_MQ_MAP_L2_3, BNX2_MQ_MAP_L2_3_DEFAULT);
5128         }
5129
5130         val = (u64) rxr->rx_desc_mapping[0] >> 32;
5131         bnx2_ctx_wr(bp, rx_cid_addr, BNX2_L2CTX_NX_BDHADDR_HI, val);
5132
5133         val = (u64) rxr->rx_desc_mapping[0] & 0xffffffff;
5134         bnx2_ctx_wr(bp, rx_cid_addr, BNX2_L2CTX_NX_BDHADDR_LO, val);
5135
5136         ring_prod = prod = rxr->rx_pg_prod;
5137         for (i = 0; i < bp->rx_pg_ring_size; i++) {
5138                 if (bnx2_alloc_rx_page(bp, rxr, ring_prod) < 0)
5139                         break;
5140                 prod = NEXT_RX_BD(prod);
5141                 ring_prod = RX_PG_RING_IDX(prod);
5142         }
5143         rxr->rx_pg_prod = prod;
5144
5145         ring_prod = prod = rxr->rx_prod;
5146         for (i = 0; i < bp->rx_ring_size; i++) {
5147                 if (bnx2_alloc_rx_skb(bp, rxr, ring_prod) < 0)
5148                         break;
5149                 prod = NEXT_RX_BD(prod);
5150                 ring_prod = RX_RING_IDX(prod);
5151         }
5152         rxr->rx_prod = prod;
5153
5154         rxr->rx_bidx_addr = MB_GET_CID_ADDR(cid) + BNX2_L2CTX_HOST_BDIDX;
5155         rxr->rx_bseq_addr = MB_GET_CID_ADDR(cid) + BNX2_L2CTX_HOST_BSEQ;
5156         rxr->rx_pg_bidx_addr = MB_GET_CID_ADDR(cid) + BNX2_L2CTX_HOST_PG_BDIDX;
5157
5158         REG_WR16(bp, rxr->rx_pg_bidx_addr, rxr->rx_pg_prod);
5159         REG_WR16(bp, rxr->rx_bidx_addr, prod);
5160
5161         REG_WR(bp, rxr->rx_bseq_addr, rxr->rx_prod_bseq);
5162 }
5163
5164 static void
5165 bnx2_init_all_rings(struct bnx2 *bp)
5166 {
5167         int i;
5168         u32 val;
5169
5170         bnx2_clear_ring_states(bp);
5171
5172         REG_WR(bp, BNX2_TSCH_TSS_CFG, 0);
5173         for (i = 0; i < bp->num_tx_rings; i++)
5174                 bnx2_init_tx_ring(bp, i);
5175
5176         if (bp->num_tx_rings > 1)
5177                 REG_WR(bp, BNX2_TSCH_TSS_CFG, ((bp->num_tx_rings - 1) << 24) |
5178                        (TX_TSS_CID << 7));
5179
5180         REG_WR(bp, BNX2_RLUP_RSS_CONFIG, 0);
5181         bnx2_reg_wr_ind(bp, BNX2_RXP_SCRATCH_RSS_TBL_SZ, 0);
5182
5183         for (i = 0; i < bp->num_rx_rings; i++)
5184                 bnx2_init_rx_ring(bp, i);
5185
5186         if (bp->num_rx_rings > 1) {
5187                 u32 tbl_32;
5188                 u8 *tbl = (u8 *) &tbl_32;
5189
5190                 bnx2_reg_wr_ind(bp, BNX2_RXP_SCRATCH_RSS_TBL_SZ,
5191                                 BNX2_RXP_SCRATCH_RSS_TBL_MAX_ENTRIES);
5192
5193                 for (i = 0; i < BNX2_RXP_SCRATCH_RSS_TBL_MAX_ENTRIES; i++) {
5194                         tbl[i % 4] = i % (bp->num_rx_rings - 1);
5195                         if ((i % 4) == 3)
5196                                 bnx2_reg_wr_ind(bp,
5197                                                 BNX2_RXP_SCRATCH_RSS_TBL + i,
5198                                                 cpu_to_be32(tbl_32));
5199                 }
5200
5201                 val = BNX2_RLUP_RSS_CONFIG_IPV4_RSS_TYPE_ALL_XI |
5202                       BNX2_RLUP_RSS_CONFIG_IPV6_RSS_TYPE_ALL_XI;
5203
5204                 REG_WR(bp, BNX2_RLUP_RSS_CONFIG, val);
5205
5206         }
5207 }
5208
5209 static u32 bnx2_find_max_ring(u32 ring_size, u32 max_size)
5210 {
5211         u32 max, num_rings = 1;
5212
5213         while (ring_size > MAX_RX_DESC_CNT) {
5214                 ring_size -= MAX_RX_DESC_CNT;
5215                 num_rings++;
5216         }
5217         /* round to next power of 2 */
5218         max = max_size;
5219         while ((max & num_rings) == 0)
5220                 max >>= 1;
5221
5222         if (num_rings != max)
5223                 max <<= 1;
5224
5225         return max;
5226 }
5227
5228 static void
5229 bnx2_set_rx_ring_size(struct bnx2 *bp, u32 size)
5230 {
5231         u32 rx_size, rx_space, jumbo_size;
5232
5233         /* 8 for CRC and VLAN */
5234         rx_size = bp->dev->mtu + ETH_HLEN + BNX2_RX_OFFSET + 8;
5235
5236         rx_space = SKB_DATA_ALIGN(rx_size + BNX2_RX_ALIGN) + NET_SKB_PAD +
5237                 sizeof(struct skb_shared_info);
5238
5239         bp->rx_copy_thresh = BNX2_RX_COPY_THRESH;
5240         bp->rx_pg_ring_size = 0;
5241         bp->rx_max_pg_ring = 0;
5242         bp->rx_max_pg_ring_idx = 0;
5243         if ((rx_space > PAGE_SIZE) && !(bp->flags & BNX2_FLAG_JUMBO_BROKEN)) {
5244                 int pages = PAGE_ALIGN(bp->dev->mtu - 40) >> PAGE_SHIFT;
5245
5246                 jumbo_size = size * pages;
5247                 if (jumbo_size > MAX_TOTAL_RX_PG_DESC_CNT)
5248                         jumbo_size = MAX_TOTAL_RX_PG_DESC_CNT;
5249
5250                 bp->rx_pg_ring_size = jumbo_size;
5251                 bp->rx_max_pg_ring = bnx2_find_max_ring(jumbo_size,
5252                                                         MAX_RX_PG_RINGS);
5253                 bp->rx_max_pg_ring_idx = (bp->rx_max_pg_ring * RX_DESC_CNT) - 1;
5254                 rx_size = BNX2_RX_COPY_THRESH + BNX2_RX_OFFSET;
5255                 bp->rx_copy_thresh = 0;
5256         }
5257
5258         bp->rx_buf_use_size = rx_size;
5259         /* hw alignment */
5260         bp->rx_buf_size = bp->rx_buf_use_size + BNX2_RX_ALIGN;
5261         bp->rx_jumbo_thresh = rx_size - BNX2_RX_OFFSET;
5262         bp->rx_ring_size = size;
5263         bp->rx_max_ring = bnx2_find_max_ring(size, MAX_RX_RINGS);
5264         bp->rx_max_ring_idx = (bp->rx_max_ring * RX_DESC_CNT) - 1;
5265 }
5266
5267 static void
5268 bnx2_free_tx_skbs(struct bnx2 *bp)
5269 {
5270         int i;
5271
5272         for (i = 0; i < bp->num_tx_rings; i++) {
5273                 struct bnx2_napi *bnapi = &bp->bnx2_napi[i];
5274                 struct bnx2_tx_ring_info *txr = &bnapi->tx_ring;
5275                 int j;
5276
5277                 if (txr->tx_buf_ring == NULL)
5278                         continue;
5279
5280                 for (j = 0; j < TX_DESC_CNT; ) {
5281                         struct sw_tx_bd *tx_buf = &txr->tx_buf_ring[j];
5282                         struct sk_buff *skb = tx_buf->skb;
5283
5284                         if (skb == NULL) {
5285                                 j++;
5286                                 continue;
5287                         }
5288
5289                         skb_dma_unmap(&bp->pdev->dev, skb, DMA_TO_DEVICE);
5290
5291                         tx_buf->skb = NULL;
5292
5293                         j += skb_shinfo(skb)->nr_frags + 1;
5294                         dev_kfree_skb(skb);
5295                 }
5296         }
5297 }
5298
5299 static void
5300 bnx2_free_rx_skbs(struct bnx2 *bp)
5301 {
5302         int i;
5303
5304         for (i = 0; i < bp->num_rx_rings; i++) {
5305                 struct bnx2_napi *bnapi = &bp->bnx2_napi[i];
5306                 struct bnx2_rx_ring_info *rxr = &bnapi->rx_ring;
5307                 int j;
5308
5309                 if (rxr->rx_buf_ring == NULL)
5310                         return;
5311
5312                 for (j = 0; j < bp->rx_max_ring_idx; j++) {
5313                         struct sw_bd *rx_buf = &rxr->rx_buf_ring[j];
5314                         struct sk_buff *skb = rx_buf->skb;
5315
5316                         if (skb == NULL)
5317                                 continue;
5318
5319                         pci_unmap_single(bp->pdev,
5320                                          pci_unmap_addr(rx_buf, mapping),
5321                                          bp->rx_buf_use_size,
5322                                          PCI_DMA_FROMDEVICE);
5323
5324                         rx_buf->skb = NULL;
5325
5326                         dev_kfree_skb(skb);
5327                 }
5328                 for (j = 0; j < bp->rx_max_pg_ring_idx; j++)
5329                         bnx2_free_rx_page(bp, rxr, j);
5330         }
5331 }
5332
5333 static void
5334 bnx2_free_skbs(struct bnx2 *bp)
5335 {
5336         bnx2_free_tx_skbs(bp);
5337         bnx2_free_rx_skbs(bp);
5338 }
5339
5340 static int
5341 bnx2_reset_nic(struct bnx2 *bp, u32 reset_code)
5342 {
5343         int rc;
5344
5345         rc = bnx2_reset_chip(bp, reset_code);
5346         bnx2_free_skbs(bp);
5347         if (rc)
5348                 return rc;
5349
5350         if ((rc = bnx2_init_chip(bp)) != 0)
5351                 return rc;
5352
5353         bnx2_init_all_rings(bp);
5354         return 0;
5355 }
5356
5357 static int
5358 bnx2_init_nic(struct bnx2 *bp, int reset_phy)
5359 {
5360         int rc;
5361
5362         if ((rc = bnx2_reset_nic(bp, BNX2_DRV_MSG_CODE_RESET)) != 0)
5363                 return rc;
5364
5365         spin_lock_bh(&bp->phy_lock);
5366         bnx2_init_phy(bp, reset_phy);
5367         bnx2_set_link(bp);
5368         if (bp->phy_flags & BNX2_PHY_FLAG_REMOTE_PHY_CAP)
5369                 bnx2_remote_phy_event(bp);
5370         spin_unlock_bh(&bp->phy_lock);
5371         return 0;
5372 }
5373
5374 static int
5375 bnx2_shutdown_chip(struct bnx2 *bp)
5376 {
5377         u32 reset_code;
5378
5379         if (bp->flags & BNX2_FLAG_NO_WOL)
5380                 reset_code = BNX2_DRV_MSG_CODE_UNLOAD_LNK_DN;
5381         else if (bp->wol)
5382                 reset_code = BNX2_DRV_MSG_CODE_SUSPEND_WOL;
5383         else
5384                 reset_code = BNX2_DRV_MSG_CODE_SUSPEND_NO_WOL;
5385
5386         return bnx2_reset_chip(bp, reset_code);
5387 }
5388
5389 static int
5390 bnx2_test_registers(struct bnx2 *bp)
5391 {
5392         int ret;
5393         int i, is_5709;
5394         static const struct {
5395                 u16   offset;
5396                 u16   flags;
5397 #define BNX2_FL_NOT_5709        1
5398                 u32   rw_mask;
5399                 u32   ro_mask;
5400         } reg_tbl[] = {
5401                 { 0x006c, 0, 0x00000000, 0x0000003f },
5402                 { 0x0090, 0, 0xffffffff, 0x00000000 },
5403                 { 0x0094, 0, 0x00000000, 0x00000000 },
5404
5405                 { 0x0404, BNX2_FL_NOT_5709, 0x00003f00, 0x00000000 },
5406                 { 0x0418, BNX2_FL_NOT_5709, 0x00000000, 0xffffffff },
5407                 { 0x041c, BNX2_FL_NOT_5709, 0x00000000, 0xffffffff },
5408                 { 0x0420, BNX2_FL_NOT_5709, 0x00000000, 0x80ffffff },
5409                 { 0x0424, BNX2_FL_NOT_5709, 0x00000000, 0x00000000 },
5410                 { 0x0428, BNX2_FL_NOT_5709, 0x00000000, 0x00000001 },
5411                 { 0x0450, BNX2_FL_NOT_5709, 0x00000000, 0x0000ffff },
5412                 { 0x0454, BNX2_FL_NOT_5709, 0x00000000, 0xffffffff },
5413                 { 0x0458, BNX2_FL_NOT_5709, 0x00000000, 0xffffffff },
5414
5415                 { 0x0808, BNX2_FL_NOT_5709, 0x00000000, 0xffffffff },
5416                 { 0x0854, BNX2_FL_NOT_5709, 0x00000000, 0xffffffff },
5417                 { 0x0868, BNX2_FL_NOT_5709, 0x00000000, 0x77777777 },
5418                 { 0x086c, BNX2_FL_NOT_5709, 0x00000000, 0x77777777 },
5419                 { 0x0870, BNX2_FL_NOT_5709, 0x00000000, 0x77777777 },
5420                 { 0x0874, BNX2_FL_NOT_5709, 0x00000000, 0x77777777 },
5421
5422                 { 0x0c00, BNX2_FL_NOT_5709, 0x00000000, 0x00000001 },
5423                 { 0x0c04, BNX2_FL_NOT_5709, 0x00000000, 0x03ff0001 },
5424                 { 0x0c08, BNX2_FL_NOT_5709,  0x0f0ff073, 0x00000000 },
5425
5426                 { 0x1000, 0, 0x00000000, 0x00000001 },
5427                 { 0x1004, BNX2_FL_NOT_5709, 0x00000000, 0x000f0001 },
5428
5429                 { 0x1408, 0, 0x01c00800, 0x00000000 },
5430                 { 0x149c, 0, 0x8000ffff, 0x00000000 },
5431                 { 0x14a8, 0, 0x00000000, 0x000001ff },
5432                 { 0x14ac, 0, 0x0fffffff, 0x10000000 },
5433                 { 0x14b0, 0, 0x00000002, 0x00000001 },
5434                 { 0x14b8, 0, 0x00000000, 0x00000000 },
5435                 { 0x14c0, 0, 0x00000000, 0x00000009 },
5436                 { 0x14c4, 0, 0x00003fff, 0x00000000 },
5437                 { 0x14cc, 0, 0x00000000, 0x00000001 },
5438                 { 0x14d0, 0, 0xffffffff, 0x00000000 },
5439
5440                 { 0x1800, 0, 0x00000000, 0x00000001 },
5441                 { 0x1804, 0, 0x00000000, 0x00000003 },
5442
5443                 { 0x2800, 0, 0x00000000, 0x00000001 },
5444                 { 0x2804, 0, 0x00000000, 0x00003f01 },
5445                 { 0x2808, 0, 0x0f3f3f03, 0x00000000 },
5446                 { 0x2810, 0, 0xffff0000, 0x00000000 },
5447                 { 0x2814, 0, 0xffff0000, 0x00000000 },
5448                 { 0x2818, 0, 0xffff0000, 0x00000000 },
5449                 { 0x281c, 0, 0xffff0000, 0x00000000 },
5450                 { 0x2834, 0, 0xffffffff, 0x00000000 },
5451                 { 0x2840, 0, 0x00000000, 0xffffffff },
5452                 { 0x2844, 0, 0x00000000, 0xffffffff },
5453                 { 0x2848, 0, 0xffffffff, 0x00000000 },
5454                 { 0x284c, 0, 0xf800f800, 0x07ff07ff },
5455
5456                 { 0x2c00, 0, 0x00000000, 0x00000011 },
5457                 { 0x2c04, 0, 0x00000000, 0x00030007 },
5458
5459                 { 0x3c00, 0, 0x00000000, 0x00000001 },
5460                 { 0x3c04, 0, 0x00000000, 0x00070000 },
5461                 { 0x3c08, 0, 0x00007f71, 0x07f00000 },
5462                 { 0x3c0c, 0, 0x1f3ffffc, 0x00000000 },
5463                 { 0x3c10, 0, 0xffffffff, 0x00000000 },
5464                 { 0x3c14, 0, 0x00000000, 0xffffffff },
5465                 { 0x3c18, 0, 0x00000000, 0xffffffff },
5466                 { 0x3c1c, 0, 0xfffff000, 0x00000000 },
5467                 { 0x3c20, 0, 0xffffff00, 0x00000000 },
5468
5469                 { 0x5004, 0, 0x00000000, 0x0000007f },
5470                 { 0x5008, 0, 0x0f0007ff, 0x00000000 },
5471
5472                 { 0x5c00, 0, 0x00000000, 0x00000001 },
5473                 { 0x5c04, 0, 0x00000000, 0x0003000f },
5474                 { 0x5c08, 0, 0x00000003, 0x00000000 },
5475                 { 0x5c0c, 0, 0x0000fff8, 0x00000000 },
5476                 { 0x5c10, 0, 0x00000000, 0xffffffff },
5477                 { 0x5c80, 0, 0x00000000, 0x0f7113f1 },
5478                 { 0x5c84, 0, 0x00000000, 0x0000f333 },
5479                 { 0x5c88, 0, 0x00000000, 0x00077373 },
5480                 { 0x5c8c, 0, 0x00000000, 0x0007f737 },
5481
5482                 { 0x6808, 0, 0x0000ff7f, 0x00000000 },
5483                 { 0x680c, 0, 0xffffffff, 0x00000000 },
5484                 { 0x6810, 0, 0xffffffff, 0x00000000 },
5485                 { 0x6814, 0, 0xffffffff, 0x00000000 },
5486                 { 0x6818, 0, 0xffffffff, 0x00000000 },
5487                 { 0x681c, 0, 0xffffffff, 0x00000000 },
5488                 { 0x6820, 0, 0x00ff00ff, 0x00000000 },
5489                 { 0x6824, 0, 0x00ff00ff, 0x00000000 },
5490                 { 0x6828, 0, 0x00ff00ff, 0x00000000 },
5491                 { 0x682c, 0, 0x03ff03ff, 0x00000000 },
5492                 { 0x6830, 0, 0x03ff03ff, 0x00000000 },
5493                 { 0x6834, 0, 0x03ff03ff, 0x00000000 },
5494                 { 0x6838, 0, 0x03ff03ff, 0x00000000 },
5495                 { 0x683c, 0, 0x0000ffff, 0x00000000 },
5496                 { 0x6840, 0, 0x00000ff0, 0x00000000 },
5497                 { 0x6844, 0, 0x00ffff00, 0x00000000 },
5498                 { 0x684c, 0, 0xffffffff, 0x00000000 },
5499                 { 0x6850, 0, 0x7f7f7f7f, 0x00000000 },
5500                 { 0x6854, 0, 0x7f7f7f7f, 0x00000000 },
5501                 { 0x6858, 0, 0x7f7f7f7f, 0x00000000 },
5502                 { 0x685c, 0, 0x7f7f7f7f, 0x00000000 },
5503                 { 0x6908, 0, 0x00000000, 0x0001ff0f },
5504                 { 0x690c, 0, 0x00000000, 0x0ffe00f0 },
5505
5506                 { 0xffff, 0, 0x00000000, 0x00000000 },
5507         };
5508
5509         ret = 0;
5510         is_5709 = 0;
5511         if (CHIP_NUM(bp) == CHIP_NUM_5709)
5512                 is_5709 = 1;
5513
5514         for (i = 0; reg_tbl[i].offset != 0xffff; i++) {
5515                 u32 offset, rw_mask, ro_mask, save_val, val;
5516                 u16 flags = reg_tbl[i].flags;
5517
5518                 if (is_5709 && (flags & BNX2_FL_NOT_5709))
5519                         continue;
5520
5521                 offset = (u32) reg_tbl[i].offset;
5522                 rw_mask = reg_tbl[i].rw_mask;
5523                 ro_mask = reg_tbl[i].ro_mask;
5524
5525                 save_val = readl(bp->regview + offset);
5526
5527                 writel(0, bp->regview + offset);
5528
5529                 val = readl(bp->regview + offset);
5530                 if ((val & rw_mask) != 0) {
5531                         goto reg_test_err;
5532                 }
5533
5534                 if ((val & ro_mask) != (save_val & ro_mask)) {
5535                         goto reg_test_err;
5536                 }
5537
5538                 writel(0xffffffff, bp->regview + offset);
5539
5540                 val = readl(bp->regview + offset);
5541                 if ((val & rw_mask) != rw_mask) {
5542                         goto reg_test_err;
5543                 }
5544
5545                 if ((val & ro_mask) != (save_val & ro_mask)) {
5546                         goto reg_test_err;
5547                 }
5548
5549                 writel(save_val, bp->regview + offset);
5550                 continue;
5551
5552 reg_test_err:
5553                 writel(save_val, bp->regview + offset);
5554                 ret = -ENODEV;
5555                 break;
5556         }
5557         return ret;
5558 }
5559
5560 static int
5561 bnx2_do_mem_test(struct bnx2 *bp, u32 start, u32 size)
5562 {
5563         static const u32 test_pattern[] = { 0x00000000, 0xffffffff, 0x55555555,
5564                 0xaaaaaaaa , 0xaa55aa55, 0x55aa55aa };
5565         int i;
5566
5567         for (i = 0; i < sizeof(test_pattern) / 4; i++) {
5568                 u32 offset;
5569
5570                 for (offset = 0; offset < size; offset += 4) {
5571
5572                         bnx2_reg_wr_ind(bp, start + offset, test_pattern[i]);
5573
5574                         if (bnx2_reg_rd_ind(bp, start + offset) !=
5575                                 test_pattern[i]) {
5576                                 return -ENODEV;
5577                         }
5578                 }
5579         }
5580         return 0;
5581 }
5582
5583 static int
5584 bnx2_test_memory(struct bnx2 *bp)
5585 {
5586         int ret = 0;
5587         int i;
5588         static struct mem_entry {
5589                 u32   offset;
5590                 u32   len;
5591         } mem_tbl_5706[] = {
5592                 { 0x60000,  0x4000 },
5593                 { 0xa0000,  0x3000 },
5594                 { 0xe0000,  0x4000 },
5595                 { 0x120000, 0x4000 },
5596                 { 0x1a0000, 0x4000 },
5597                 { 0x160000, 0x4000 },
5598                 { 0xffffffff, 0    },
5599         },
5600         mem_tbl_5709[] = {
5601                 { 0x60000,  0x4000 },
5602                 { 0xa0000,  0x3000 },
5603                 { 0xe0000,  0x4000 },
5604                 { 0x120000, 0x4000 },
5605                 { 0x1a0000, 0x4000 },
5606                 { 0xffffffff, 0    },
5607         };
5608         struct mem_entry *mem_tbl;
5609
5610         if (CHIP_NUM(bp) == CHIP_NUM_5709)
5611                 mem_tbl = mem_tbl_5709;
5612         else
5613                 mem_tbl = mem_tbl_5706;
5614
5615         for (i = 0; mem_tbl[i].offset != 0xffffffff; i++) {
5616                 if ((ret = bnx2_do_mem_test(bp, mem_tbl[i].offset,
5617                         mem_tbl[i].len)) != 0) {
5618                         return ret;
5619                 }
5620         }
5621
5622         return ret;
5623 }
5624
5625 #define BNX2_MAC_LOOPBACK       0
5626 #define BNX2_PHY_LOOPBACK       1
5627
5628 static int
5629 bnx2_run_loopback(struct bnx2 *bp, int loopback_mode)
5630 {
5631         unsigned int pkt_size, num_pkts, i;
5632         struct sk_buff *skb, *rx_skb;
5633         unsigned char *packet;
5634         u16 rx_start_idx, rx_idx;
5635         dma_addr_t map;
5636         struct tx_bd *txbd;
5637         struct sw_bd *rx_buf;
5638         struct l2_fhdr *rx_hdr;
5639         int ret = -ENODEV;
5640         struct bnx2_napi *bnapi = &bp->bnx2_napi[0], *tx_napi;
5641         struct bnx2_tx_ring_info *txr = &bnapi->tx_ring;
5642         struct bnx2_rx_ring_info *rxr = &bnapi->rx_ring;
5643
5644         tx_napi = bnapi;
5645
5646         txr = &tx_napi->tx_ring;
5647         rxr = &bnapi->rx_ring;
5648         if (loopback_mode == BNX2_MAC_LOOPBACK) {
5649                 bp->loopback = MAC_LOOPBACK;
5650                 bnx2_set_mac_loopback(bp);
5651         }
5652         else if (loopback_mode == BNX2_PHY_LOOPBACK) {
5653                 if (bp->phy_flags & BNX2_PHY_FLAG_REMOTE_PHY_CAP)
5654                         return 0;
5655
5656                 bp->loopback = PHY_LOOPBACK;
5657                 bnx2_set_phy_loopback(bp);
5658         }
5659         else
5660                 return -EINVAL;
5661
5662         pkt_size = min(bp->dev->mtu + ETH_HLEN, bp->rx_jumbo_thresh - 4);
5663         skb = netdev_alloc_skb(bp->dev, pkt_size);
5664         if (!skb)
5665                 return -ENOMEM;
5666         packet = skb_put(skb, pkt_size);
5667         memcpy(packet, bp->dev->dev_addr, 6);
5668         memset(packet + 6, 0x0, 8);
5669         for (i = 14; i < pkt_size; i++)
5670                 packet[i] = (unsigned char) (i & 0xff);
5671
5672         if (skb_dma_map(&bp->pdev->dev, skb, DMA_TO_DEVICE)) {
5673                 dev_kfree_skb(skb);
5674                 return -EIO;
5675         }
5676         map = skb_shinfo(skb)->dma_maps[0];
5677
5678         REG_WR(bp, BNX2_HC_COMMAND,
5679                bp->hc_cmd | BNX2_HC_COMMAND_COAL_NOW_WO_INT);
5680
5681         REG_RD(bp, BNX2_HC_COMMAND);
5682
5683         udelay(5);
5684         rx_start_idx = bnx2_get_hw_rx_cons(bnapi);
5685
5686         num_pkts = 0;
5687
5688         txbd = &txr->tx_desc_ring[TX_RING_IDX(txr->tx_prod)];
5689
5690         txbd->tx_bd_haddr_hi = (u64) map >> 32;
5691         txbd->tx_bd_haddr_lo = (u64) map & 0xffffffff;
5692         txbd->tx_bd_mss_nbytes = pkt_size;
5693         txbd->tx_bd_vlan_tag_flags = TX_BD_FLAGS_START | TX_BD_FLAGS_END;
5694
5695         num_pkts++;
5696         txr->tx_prod = NEXT_TX_BD(txr->tx_prod);
5697         txr->tx_prod_bseq += pkt_size;
5698
5699         REG_WR16(bp, txr->tx_bidx_addr, txr->tx_prod);
5700         REG_WR(bp, txr->tx_bseq_addr, txr->tx_prod_bseq);
5701
5702         udelay(100);
5703
5704         REG_WR(bp, BNX2_HC_COMMAND,
5705                bp->hc_cmd | BNX2_HC_COMMAND_COAL_NOW_WO_INT);
5706
5707         REG_RD(bp, BNX2_HC_COMMAND);
5708
5709         udelay(5);
5710
5711         skb_dma_unmap(&bp->pdev->dev, skb, DMA_TO_DEVICE);
5712         dev_kfree_skb(skb);
5713
5714         if (bnx2_get_hw_tx_cons(tx_napi) != txr->tx_prod)
5715                 goto loopback_test_done;
5716
5717         rx_idx = bnx2_get_hw_rx_cons(bnapi);
5718         if (rx_idx != rx_start_idx + num_pkts) {
5719                 goto loopback_test_done;
5720         }
5721
5722         rx_buf = &rxr->rx_buf_ring[rx_start_idx];
5723         rx_skb = rx_buf->skb;
5724
5725         rx_hdr = (struct l2_fhdr *) rx_skb->data;
5726         skb_reserve(rx_skb, BNX2_RX_OFFSET);
5727
5728         pci_dma_sync_single_for_cpu(bp->pdev,
5729                 pci_unmap_addr(rx_buf, mapping),
5730                 bp->rx_buf_size, PCI_DMA_FROMDEVICE);
5731
5732         if (rx_hdr->l2_fhdr_status &
5733                 (L2_FHDR_ERRORS_BAD_CRC |
5734                 L2_FHDR_ERRORS_PHY_DECODE |
5735                 L2_FHDR_ERRORS_ALIGNMENT |
5736                 L2_FHDR_ERRORS_TOO_SHORT |
5737                 L2_FHDR_ERRORS_GIANT_FRAME)) {
5738
5739                 goto loopback_test_done;
5740         }
5741
5742         if ((rx_hdr->l2_fhdr_pkt_len - 4) != pkt_size) {
5743                 goto loopback_test_done;
5744         }
5745
5746         for (i = 14; i < pkt_size; i++) {
5747                 if (*(rx_skb->data + i) != (unsigned char) (i & 0xff)) {
5748                         goto loopback_test_done;
5749                 }
5750         }
5751
5752         ret = 0;
5753
5754 loopback_test_done:
5755         bp->loopback = 0;
5756         return ret;
5757 }
5758
5759 #define BNX2_MAC_LOOPBACK_FAILED        1
5760 #define BNX2_PHY_LOOPBACK_FAILED        2
5761 #define BNX2_LOOPBACK_FAILED            (BNX2_MAC_LOOPBACK_FAILED |     \
5762                                          BNX2_PHY_LOOPBACK_FAILED)
5763
5764 static int
5765 bnx2_test_loopback(struct bnx2 *bp)
5766 {
5767         int rc = 0;
5768
5769         if (!netif_running(bp->dev))
5770                 return BNX2_LOOPBACK_FAILED;
5771
5772         bnx2_reset_nic(bp, BNX2_DRV_MSG_CODE_RESET);
5773         spin_lock_bh(&bp->phy_lock);
5774         bnx2_init_phy(bp, 1);
5775         spin_unlock_bh(&bp->phy_lock);
5776         if (bnx2_run_loopback(bp, BNX2_MAC_LOOPBACK))
5777                 rc |= BNX2_MAC_LOOPBACK_FAILED;
5778         if (bnx2_run_loopback(bp, BNX2_PHY_LOOPBACK))
5779                 rc |= BNX2_PHY_LOOPBACK_FAILED;
5780         return rc;
5781 }
5782
5783 #define NVRAM_SIZE 0x200
5784 #define CRC32_RESIDUAL 0xdebb20e3
5785
5786 static int
5787 bnx2_test_nvram(struct bnx2 *bp)
5788 {
5789         __be32 buf[NVRAM_SIZE / 4];
5790         u8 *data = (u8 *) buf;
5791         int rc = 0;
5792         u32 magic, csum;
5793
5794         if ((rc = bnx2_nvram_read(bp, 0, data, 4)) != 0)
5795                 goto test_nvram_done;
5796
5797         magic = be32_to_cpu(buf[0]);
5798         if (magic != 0x669955aa) {
5799                 rc = -ENODEV;
5800                 goto test_nvram_done;
5801         }
5802
5803         if ((rc = bnx2_nvram_read(bp, 0x100, data, NVRAM_SIZE)) != 0)
5804                 goto test_nvram_done;
5805
5806         csum = ether_crc_le(0x100, data);
5807         if (csum != CRC32_RESIDUAL) {
5808                 rc = -ENODEV;
5809                 goto test_nvram_done;
5810         }
5811
5812         csum = ether_crc_le(0x100, data + 0x100);
5813         if (csum != CRC32_RESIDUAL) {
5814                 rc = -ENODEV;
5815         }
5816
5817 test_nvram_done:
5818         return rc;
5819 }
5820
5821 static int
5822 bnx2_test_link(struct bnx2 *bp)
5823 {
5824         u32 bmsr;
5825
5826         if (!netif_running(bp->dev))
5827                 return -ENODEV;
5828
5829         if (bp->phy_flags & BNX2_PHY_FLAG_REMOTE_PHY_CAP) {
5830                 if (bp->link_up)
5831                         return 0;
5832                 return -ENODEV;
5833         }
5834         spin_lock_bh(&bp->phy_lock);
5835         bnx2_enable_bmsr1(bp);
5836         bnx2_read_phy(bp, bp->mii_bmsr1, &bmsr);
5837         bnx2_read_phy(bp, bp->mii_bmsr1, &bmsr);
5838         bnx2_disable_bmsr1(bp);
5839         spin_unlock_bh(&bp->phy_lock);
5840
5841         if (bmsr & BMSR_LSTATUS) {
5842                 return 0;
5843         }
5844         return -ENODEV;
5845 }
5846
5847 static int
5848 bnx2_test_intr(struct bnx2 *bp)
5849 {
5850         int i;
5851         u16 status_idx;
5852
5853         if (!netif_running(bp->dev))
5854                 return -ENODEV;
5855
5856         status_idx = REG_RD(bp, BNX2_PCICFG_INT_ACK_CMD) & 0xffff;
5857
5858         /* This register is not touched during run-time. */
5859         REG_WR(bp, BNX2_HC_COMMAND, bp->hc_cmd | BNX2_HC_COMMAND_COAL_NOW);
5860         REG_RD(bp, BNX2_HC_COMMAND);
5861
5862         for (i = 0; i < 10; i++) {
5863                 if ((REG_RD(bp, BNX2_PCICFG_INT_ACK_CMD) & 0xffff) !=
5864                         status_idx) {
5865
5866                         break;
5867                 }
5868
5869                 msleep_interruptible(10);
5870         }
5871         if (i < 10)
5872                 return 0;
5873
5874         return -ENODEV;
5875 }
5876
5877 /* Determining link for parallel detection. */
5878 static int
5879 bnx2_5706_serdes_has_link(struct bnx2 *bp)
5880 {
5881         u32 mode_ctl, an_dbg, exp;
5882
5883         if (bp->phy_flags & BNX2_PHY_FLAG_NO_PARALLEL)
5884                 return 0;
5885
5886         bnx2_write_phy(bp, MII_BNX2_MISC_SHADOW, MISC_SHDW_MODE_CTL);
5887         bnx2_read_phy(bp, MII_BNX2_MISC_SHADOW, &mode_ctl);
5888
5889         if (!(mode_ctl & MISC_SHDW_MODE_CTL_SIG_DET))
5890                 return 0;
5891
5892         bnx2_write_phy(bp, MII_BNX2_MISC_SHADOW, MISC_SHDW_AN_DBG);
5893         bnx2_read_phy(bp, MII_BNX2_MISC_SHADOW, &an_dbg);
5894         bnx2_read_phy(bp, MII_BNX2_MISC_SHADOW, &an_dbg);
5895
5896         if (an_dbg & (MISC_SHDW_AN_DBG_NOSYNC | MISC_SHDW_AN_DBG_RUDI_INVALID))
5897                 return 0;
5898
5899         bnx2_write_phy(bp, MII_BNX2_DSP_ADDRESS, MII_EXPAND_REG1);
5900         bnx2_read_phy(bp, MII_BNX2_DSP_RW_PORT, &exp);
5901         bnx2_read_phy(bp, MII_BNX2_DSP_RW_PORT, &exp);
5902
5903         if (exp & MII_EXPAND_REG1_RUDI_C)       /* receiving CONFIG */
5904                 return 0;
5905
5906         return 1;
5907 }
5908
5909 static void
5910 bnx2_5706_serdes_timer(struct bnx2 *bp)
5911 {
5912         int check_link = 1;
5913
5914         spin_lock(&bp->phy_lock);
5915         if (bp->serdes_an_pending) {
5916                 bp->serdes_an_pending--;
5917                 check_link = 0;
5918         } else if ((bp->link_up == 0) && (bp->autoneg & AUTONEG_SPEED)) {
5919                 u32 bmcr;
5920
5921                 bp->current_interval = BNX2_TIMER_INTERVAL;
5922
5923                 bnx2_read_phy(bp, bp->mii_bmcr, &bmcr);
5924
5925                 if (bmcr & BMCR_ANENABLE) {
5926                         if (bnx2_5706_serdes_has_link(bp)) {
5927                                 bmcr &= ~BMCR_ANENABLE;
5928                                 bmcr |= BMCR_SPEED1000 | BMCR_FULLDPLX;
5929                                 bnx2_write_phy(bp, bp->mii_bmcr, bmcr);
5930                                 bp->phy_flags |= BNX2_PHY_FLAG_PARALLEL_DETECT;
5931                         }
5932                 }
5933         }
5934         else if ((bp->link_up) && (bp->autoneg & AUTONEG_SPEED) &&
5935                  (bp->phy_flags & BNX2_PHY_FLAG_PARALLEL_DETECT)) {
5936                 u32 phy2;
5937
5938                 bnx2_write_phy(bp, 0x17, 0x0f01);
5939                 bnx2_read_phy(bp, 0x15, &phy2);
5940                 if (phy2 & 0x20) {
5941                         u32 bmcr;
5942
5943                         bnx2_read_phy(bp, bp->mii_bmcr, &bmcr);
5944                         bmcr |= BMCR_ANENABLE;
5945                         bnx2_write_phy(bp, bp->mii_bmcr, bmcr);
5946
5947                         bp->phy_flags &= ~BNX2_PHY_FLAG_PARALLEL_DETECT;
5948                 }
5949         } else
5950                 bp->current_interval = BNX2_TIMER_INTERVAL;
5951
5952         if (check_link) {
5953                 u32 val;
5954
5955                 bnx2_write_phy(bp, MII_BNX2_MISC_SHADOW, MISC_SHDW_AN_DBG);
5956                 bnx2_read_phy(bp, MII_BNX2_MISC_SHADOW, &val);
5957                 bnx2_read_phy(bp, MII_BNX2_MISC_SHADOW, &val);
5958
5959                 if (bp->link_up && (val & MISC_SHDW_AN_DBG_NOSYNC)) {
5960                         if (!(bp->phy_flags & BNX2_PHY_FLAG_FORCED_DOWN)) {
5961                                 bnx2_5706s_force_link_dn(bp, 1);
5962                                 bp->phy_flags |= BNX2_PHY_FLAG_FORCED_DOWN;
5963                         } else
5964                                 bnx2_set_link(bp);
5965                 } else if (!bp->link_up && !(val & MISC_SHDW_AN_DBG_NOSYNC))
5966                         bnx2_set_link(bp);
5967         }
5968         spin_unlock(&bp->phy_lock);
5969 }
5970
5971 static void
5972 bnx2_5708_serdes_timer(struct bnx2 *bp)
5973 {
5974         if (bp->phy_flags & BNX2_PHY_FLAG_REMOTE_PHY_CAP)
5975                 return;
5976
5977         if ((bp->phy_flags & BNX2_PHY_FLAG_2_5G_CAPABLE) == 0) {
5978                 bp->serdes_an_pending = 0;
5979                 return;
5980         }
5981
5982         spin_lock(&bp->phy_lock);
5983         if (bp->serdes_an_pending)
5984                 bp->serdes_an_pending--;
5985         else if ((bp->link_up == 0) && (bp->autoneg & AUTONEG_SPEED)) {
5986                 u32 bmcr;
5987
5988                 bnx2_read_phy(bp, bp->mii_bmcr, &bmcr);
5989                 if (bmcr & BMCR_ANENABLE) {
5990                         bnx2_enable_forced_2g5(bp);
5991                         bp->current_interval = BNX2_SERDES_FORCED_TIMEOUT;
5992                 } else {
5993                         bnx2_disable_forced_2g5(bp);
5994                         bp->serdes_an_pending = 2;
5995                         bp->current_interval = BNX2_TIMER_INTERVAL;
5996                 }
5997
5998         } else
5999                 bp->current_interval = BNX2_TIMER_INTERVAL;
6000
6001         spin_unlock(&bp->phy_lock);
6002 }
6003
6004 static void
6005 bnx2_timer(unsigned long data)
6006 {
6007         struct bnx2 *bp = (struct bnx2 *) data;
6008
6009         if (!netif_running(bp->dev))
6010                 return;
6011
6012         if (atomic_read(&bp->intr_sem) != 0)
6013                 goto bnx2_restart_timer;
6014
6015         if ((bp->flags & (BNX2_FLAG_USING_MSI | BNX2_FLAG_ONE_SHOT_MSI)) ==
6016              BNX2_FLAG_USING_MSI)
6017                 bnx2_chk_missed_msi(bp);
6018
6019         bnx2_send_heart_beat(bp);
6020
6021         bp->stats_blk->stat_FwRxDrop =
6022                 bnx2_reg_rd_ind(bp, BNX2_FW_RX_DROP_COUNT);
6023
6024         /* workaround occasional corrupted counters */
6025         if (CHIP_NUM(bp) == CHIP_NUM_5708 && bp->stats_ticks)
6026                 REG_WR(bp, BNX2_HC_COMMAND, bp->hc_cmd |
6027                                             BNX2_HC_COMMAND_STATS_NOW);
6028
6029         if (bp->phy_flags & BNX2_PHY_FLAG_SERDES) {
6030                 if (CHIP_NUM(bp) == CHIP_NUM_5706)
6031                         bnx2_5706_serdes_timer(bp);
6032                 else
6033                         bnx2_5708_serdes_timer(bp);
6034         }
6035
6036 bnx2_restart_timer:
6037         mod_timer(&bp->timer, jiffies + bp->current_interval);
6038 }
6039
6040 static int
6041 bnx2_request_irq(struct bnx2 *bp)
6042 {
6043         unsigned long flags;
6044         struct bnx2_irq *irq;
6045         int rc = 0, i;
6046
6047         if (bp->flags & BNX2_FLAG_USING_MSI_OR_MSIX)
6048                 flags = 0;
6049         else
6050                 flags = IRQF_SHARED;
6051
6052         for (i = 0; i < bp->irq_nvecs; i++) {
6053                 irq = &bp->irq_tbl[i];
6054                 rc = request_irq(irq->vector, irq->handler, flags, irq->name,
6055                                  &bp->bnx2_napi[i]);
6056                 if (rc)
6057                         break;
6058                 irq->requested = 1;
6059         }
6060         return rc;
6061 }
6062
6063 static void
6064 bnx2_free_irq(struct bnx2 *bp)
6065 {
6066         struct bnx2_irq *irq;
6067         int i;
6068
6069         for (i = 0; i < bp->irq_nvecs; i++) {
6070                 irq = &bp->irq_tbl[i];
6071                 if (irq->requested)
6072                         free_irq(irq->vector, &bp->bnx2_napi[i]);
6073                 irq->requested = 0;
6074         }
6075         if (bp->flags & BNX2_FLAG_USING_MSI)
6076                 pci_disable_msi(bp->pdev);
6077         else if (bp->flags & BNX2_FLAG_USING_MSIX)
6078                 pci_disable_msix(bp->pdev);
6079
6080         bp->flags &= ~(BNX2_FLAG_USING_MSI_OR_MSIX | BNX2_FLAG_ONE_SHOT_MSI);
6081 }
6082
6083 static void
6084 bnx2_enable_msix(struct bnx2 *bp, int msix_vecs)
6085 {
6086         int i, rc;
6087         struct msix_entry msix_ent[BNX2_MAX_MSIX_VEC];
6088         struct net_device *dev = bp->dev;
6089         const int len = sizeof(bp->irq_tbl[0].name);
6090
6091         bnx2_setup_msix_tbl(bp);
6092         REG_WR(bp, BNX2_PCI_MSIX_CONTROL, BNX2_MAX_MSIX_HW_VEC - 1);
6093         REG_WR(bp, BNX2_PCI_MSIX_TBL_OFF_BIR, BNX2_PCI_GRC_WINDOW2_BASE);
6094         REG_WR(bp, BNX2_PCI_MSIX_PBA_OFF_BIT, BNX2_PCI_GRC_WINDOW3_BASE);
6095
6096         for (i = 0; i < BNX2_MAX_MSIX_VEC; i++) {
6097                 msix_ent[i].entry = i;
6098                 msix_ent[i].vector = 0;
6099         }
6100
6101         rc = pci_enable_msix(bp->pdev, msix_ent, BNX2_MAX_MSIX_VEC);
6102         if (rc != 0)
6103                 return;
6104
6105         bp->irq_nvecs = msix_vecs;
6106         bp->flags |= BNX2_FLAG_USING_MSIX | BNX2_FLAG_ONE_SHOT_MSI;
6107         for (i = 0; i < BNX2_MAX_MSIX_VEC; i++) {
6108                 bp->irq_tbl[i].vector = msix_ent[i].vector;
6109                 snprintf(bp->irq_tbl[i].name, len, "%s-%d", dev->name, i);
6110                 bp->irq_tbl[i].handler = bnx2_msi_1shot;
6111         }
6112 }
6113
6114 static void
6115 bnx2_setup_int_mode(struct bnx2 *bp, int dis_msi)
6116 {
6117         int cpus = num_online_cpus();
6118         int msix_vecs = min(cpus + 1, RX_MAX_RINGS);
6119
6120         bp->irq_tbl[0].handler = bnx2_interrupt;
6121         strcpy(bp->irq_tbl[0].name, bp->dev->name);
6122         bp->irq_nvecs = 1;
6123         bp->irq_tbl[0].vector = bp->pdev->irq;
6124
6125         if ((bp->flags & BNX2_FLAG_MSIX_CAP) && !dis_msi && cpus > 1)
6126                 bnx2_enable_msix(bp, msix_vecs);
6127
6128         if ((bp->flags & BNX2_FLAG_MSI_CAP) && !dis_msi &&
6129             !(bp->flags & BNX2_FLAG_USING_MSIX)) {
6130                 if (pci_enable_msi(bp->pdev) == 0) {
6131                         bp->flags |= BNX2_FLAG_USING_MSI;
6132                         if (CHIP_NUM(bp) == CHIP_NUM_5709) {
6133                                 bp->flags |= BNX2_FLAG_ONE_SHOT_MSI;
6134                                 bp->irq_tbl[0].handler = bnx2_msi_1shot;
6135                         } else
6136                                 bp->irq_tbl[0].handler = bnx2_msi;
6137
6138                         bp->irq_tbl[0].vector = bp->pdev->irq;
6139                 }
6140         }
6141
6142         bp->num_tx_rings = rounddown_pow_of_two(bp->irq_nvecs);
6143         bp->dev->real_num_tx_queues = bp->num_tx_rings;
6144
6145         bp->num_rx_rings = bp->irq_nvecs;
6146 }
6147
6148 /* Called with rtnl_lock */
6149 static int
6150 bnx2_open(struct net_device *dev)
6151 {
6152         struct bnx2 *bp = netdev_priv(dev);
6153         int rc;
6154
6155         netif_carrier_off(dev);
6156
6157         bnx2_set_power_state(bp, PCI_D0);
6158         bnx2_disable_int(bp);
6159
6160         bnx2_setup_int_mode(bp, disable_msi);
6161         bnx2_napi_enable(bp);
6162         rc = bnx2_alloc_mem(bp);
6163         if (rc)
6164                 goto open_err;
6165
6166         rc = bnx2_request_irq(bp);
6167         if (rc)
6168                 goto open_err;
6169
6170         rc = bnx2_init_nic(bp, 1);
6171         if (rc)
6172                 goto open_err;
6173
6174         mod_timer(&bp->timer, jiffies + bp->current_interval);
6175
6176         atomic_set(&bp->intr_sem, 0);
6177
6178         bnx2_enable_int(bp);
6179
6180         if (bp->flags & BNX2_FLAG_USING_MSI) {
6181                 /* Test MSI to make sure it is working
6182                  * If MSI test fails, go back to INTx mode
6183                  */
6184                 if (bnx2_test_intr(bp) != 0) {
6185                         printk(KERN_WARNING PFX "%s: No interrupt was generated"
6186                                " using MSI, switching to INTx mode. Please"
6187                                " report this failure to the PCI maintainer"
6188                                " and include system chipset information.\n",
6189                                bp->dev->name);
6190
6191                         bnx2_disable_int(bp);
6192                         bnx2_free_irq(bp);
6193
6194                         bnx2_setup_int_mode(bp, 1);
6195
6196                         rc = bnx2_init_nic(bp, 0);
6197
6198                         if (!rc)
6199                                 rc = bnx2_request_irq(bp);
6200
6201                         if (rc) {
6202                                 del_timer_sync(&bp->timer);
6203                                 goto open_err;
6204                         }
6205                         bnx2_enable_int(bp);
6206                 }
6207         }
6208         if (bp->flags & BNX2_FLAG_USING_MSI)
6209                 printk(KERN_INFO PFX "%s: using MSI\n", dev->name);
6210         else if (bp->flags & BNX2_FLAG_USING_MSIX)
6211                 printk(KERN_INFO PFX "%s: using MSIX\n", dev->name);
6212
6213         netif_tx_start_all_queues(dev);
6214
6215         return 0;
6216
6217 open_err:
6218         bnx2_napi_disable(bp);
6219         bnx2_free_skbs(bp);
6220         bnx2_free_irq(bp);
6221         bnx2_free_mem(bp);
6222         return rc;
6223 }
6224
6225 static void
6226 bnx2_reset_task(struct work_struct *work)
6227 {
6228         struct bnx2 *bp = container_of(work, struct bnx2, reset_task);
6229
6230         if (!netif_running(bp->dev))
6231                 return;
6232
6233         bnx2_netif_stop(bp);
6234
6235         bnx2_init_nic(bp, 1);
6236
6237         atomic_set(&bp->intr_sem, 1);
6238         bnx2_netif_start(bp);
6239 }
6240
6241 static void
6242 bnx2_tx_timeout(struct net_device *dev)
6243 {
6244         struct bnx2 *bp = netdev_priv(dev);
6245
6246         /* This allows the netif to be shutdown gracefully before resetting */
6247         schedule_work(&bp->reset_task);
6248 }
6249
6250 #ifdef BCM_VLAN
6251 /* Called with rtnl_lock */
6252 static void
6253 bnx2_vlan_rx_register(struct net_device *dev, struct vlan_group *vlgrp)
6254 {
6255         struct bnx2 *bp = netdev_priv(dev);
6256
6257         bnx2_netif_stop(bp);
6258
6259         bp->vlgrp = vlgrp;
6260         bnx2_set_rx_mode(dev);
6261         if (bp->flags & BNX2_FLAG_CAN_KEEP_VLAN)
6262                 bnx2_fw_sync(bp, BNX2_DRV_MSG_CODE_KEEP_VLAN_UPDATE, 0, 1);
6263
6264         bnx2_netif_start(bp);
6265 }
6266 #endif
6267
6268 /* Called with netif_tx_lock.
6269  * bnx2_tx_int() runs without netif_tx_lock unless it needs to call
6270  * netif_wake_queue().
6271  */
6272 static int
6273 bnx2_start_xmit(struct sk_buff *skb, struct net_device *dev)
6274 {
6275         struct bnx2 *bp = netdev_priv(dev);
6276         dma_addr_t mapping;
6277         struct tx_bd *txbd;
6278         struct sw_tx_bd *tx_buf;
6279         u32 len, vlan_tag_flags, last_frag, mss;
6280         u16 prod, ring_prod;
6281         int i;
6282         struct bnx2_napi *bnapi;
6283         struct bnx2_tx_ring_info *txr;
6284         struct netdev_queue *txq;
6285         struct skb_shared_info *sp;
6286
6287         /*  Determine which tx ring we will be placed on */
6288         i = skb_get_queue_mapping(skb);
6289         bnapi = &bp->bnx2_napi[i];
6290         txr = &bnapi->tx_ring;
6291         txq = netdev_get_tx_queue(dev, i);
6292
6293         if (unlikely(bnx2_tx_avail(bp, txr) <
6294             (skb_shinfo(skb)->nr_frags + 1))) {
6295                 netif_tx_stop_queue(txq);
6296                 printk(KERN_ERR PFX "%s: BUG! Tx ring full when queue awake!\n",
6297                         dev->name);
6298
6299                 return NETDEV_TX_BUSY;
6300         }
6301         len = skb_headlen(skb);
6302         prod = txr->tx_prod;
6303         ring_prod = TX_RING_IDX(prod);
6304
6305         vlan_tag_flags = 0;
6306         if (skb->ip_summed == CHECKSUM_PARTIAL) {
6307                 vlan_tag_flags |= TX_BD_FLAGS_TCP_UDP_CKSUM;
6308         }
6309
6310 #ifdef BCM_VLAN
6311         if (bp->vlgrp && vlan_tx_tag_present(skb)) {
6312                 vlan_tag_flags |=
6313                         (TX_BD_FLAGS_VLAN_TAG | (vlan_tx_tag_get(skb) << 16));
6314         }
6315 #endif
6316         if ((mss = skb_shinfo(skb)->gso_size)) {
6317                 u32 tcp_opt_len;
6318                 struct iphdr *iph;
6319
6320                 vlan_tag_flags |= TX_BD_FLAGS_SW_LSO;
6321
6322                 tcp_opt_len = tcp_optlen(skb);
6323
6324                 if (skb_shinfo(skb)->gso_type & SKB_GSO_TCPV6) {
6325                         u32 tcp_off = skb_transport_offset(skb) -
6326                                       sizeof(struct ipv6hdr) - ETH_HLEN;
6327
6328                         vlan_tag_flags |= ((tcp_opt_len >> 2) << 8) |
6329                                           TX_BD_FLAGS_SW_FLAGS;
6330                         if (likely(tcp_off == 0))
6331                                 vlan_tag_flags &= ~TX_BD_FLAGS_TCP6_OFF0_MSK;
6332                         else {
6333                                 tcp_off >>= 3;
6334                                 vlan_tag_flags |= ((tcp_off & 0x3) <<
6335                                                    TX_BD_FLAGS_TCP6_OFF0_SHL) |
6336                                                   ((tcp_off & 0x10) <<
6337                                                    TX_BD_FLAGS_TCP6_OFF4_SHL);
6338                                 mss |= (tcp_off & 0xc) << TX_BD_TCP6_OFF2_SHL;
6339                         }
6340                 } else {
6341                         iph = ip_hdr(skb);
6342                         if (tcp_opt_len || (iph->ihl > 5)) {
6343                                 vlan_tag_flags |= ((iph->ihl - 5) +
6344                                                    (tcp_opt_len >> 2)) << 8;
6345                         }
6346                 }
6347         } else
6348                 mss = 0;
6349
6350         if (skb_dma_map(&bp->pdev->dev, skb, DMA_TO_DEVICE)) {
6351                 dev_kfree_skb(skb);
6352                 return NETDEV_TX_OK;
6353         }
6354
6355         sp = skb_shinfo(skb);
6356         mapping = sp->dma_maps[0];
6357
6358         tx_buf = &txr->tx_buf_ring[ring_prod];
6359         tx_buf->skb = skb;
6360
6361         txbd = &txr->tx_desc_ring[ring_prod];
6362
6363         txbd->tx_bd_haddr_hi = (u64) mapping >> 32;
6364         txbd->tx_bd_haddr_lo = (u64) mapping & 0xffffffff;
6365         txbd->tx_bd_mss_nbytes = len | (mss << 16);
6366         txbd->tx_bd_vlan_tag_flags = vlan_tag_flags | TX_BD_FLAGS_START;
6367
6368         last_frag = skb_shinfo(skb)->nr_frags;
6369
6370         for (i = 0; i < last_frag; i++) {
6371                 skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
6372
6373                 prod = NEXT_TX_BD(prod);
6374                 ring_prod = TX_RING_IDX(prod);
6375                 txbd = &txr->tx_desc_ring[ring_prod];
6376
6377                 len = frag->size;
6378                 mapping = sp->dma_maps[i + 1];
6379
6380                 txbd->tx_bd_haddr_hi = (u64) mapping >> 32;
6381                 txbd->tx_bd_haddr_lo = (u64) mapping & 0xffffffff;
6382                 txbd->tx_bd_mss_nbytes = len | (mss << 16);
6383                 txbd->tx_bd_vlan_tag_flags = vlan_tag_flags;
6384
6385         }
6386         txbd->tx_bd_vlan_tag_flags |= TX_BD_FLAGS_END;
6387
6388         prod = NEXT_TX_BD(prod);
6389         txr->tx_prod_bseq += skb->len;
6390
6391         REG_WR16(bp, txr->tx_bidx_addr, prod);
6392         REG_WR(bp, txr->tx_bseq_addr, txr->tx_prod_bseq);
6393
6394         mmiowb();
6395
6396         txr->tx_prod = prod;
6397         dev->trans_start = jiffies;
6398
6399         if (unlikely(bnx2_tx_avail(bp, txr) <= MAX_SKB_FRAGS)) {
6400                 netif_tx_stop_queue(txq);
6401                 if (bnx2_tx_avail(bp, txr) > bp->tx_wake_thresh)
6402                         netif_tx_wake_queue(txq);
6403         }
6404
6405         return NETDEV_TX_OK;
6406 }
6407
6408 /* Called with rtnl_lock */
6409 static int
6410 bnx2_close(struct net_device *dev)
6411 {
6412         struct bnx2 *bp = netdev_priv(dev);
6413
6414         cancel_work_sync(&bp->reset_task);
6415
6416         bnx2_disable_int_sync(bp);
6417         bnx2_napi_disable(bp);
6418         del_timer_sync(&bp->timer);
6419         bnx2_shutdown_chip(bp);
6420         bnx2_free_irq(bp);
6421         bnx2_free_skbs(bp);
6422         bnx2_free_mem(bp);
6423         bp->link_up = 0;
6424         netif_carrier_off(bp->dev);
6425         bnx2_set_power_state(bp, PCI_D3hot);
6426         return 0;
6427 }
6428
6429 #define GET_NET_STATS64(ctr)                                    \
6430         (unsigned long) ((unsigned long) (ctr##_hi) << 32) +    \
6431         (unsigned long) (ctr##_lo)
6432
6433 #define GET_NET_STATS32(ctr)            \
6434         (ctr##_lo)
6435
6436 #if (BITS_PER_LONG == 64)
6437 #define GET_NET_STATS   GET_NET_STATS64
6438 #else
6439 #define GET_NET_STATS   GET_NET_STATS32
6440 #endif
6441
6442 static struct net_device_stats *
6443 bnx2_get_stats(struct net_device *dev)
6444 {
6445         struct bnx2 *bp = netdev_priv(dev);
6446         struct statistics_block *stats_blk = bp->stats_blk;
6447         struct net_device_stats *net_stats = &dev->stats;
6448
6449         if (bp->stats_blk == NULL) {
6450                 return net_stats;
6451         }
6452         net_stats->rx_packets =
6453                 GET_NET_STATS(stats_blk->stat_IfHCInUcastPkts) +
6454                 GET_NET_STATS(stats_blk->stat_IfHCInMulticastPkts) +
6455                 GET_NET_STATS(stats_blk->stat_IfHCInBroadcastPkts);
6456
6457         net_stats->tx_packets =
6458                 GET_NET_STATS(stats_blk->stat_IfHCOutUcastPkts) +
6459                 GET_NET_STATS(stats_blk->stat_IfHCOutMulticastPkts) +
6460                 GET_NET_STATS(stats_blk->stat_IfHCOutBroadcastPkts);
6461
6462         net_stats->rx_bytes =
6463                 GET_NET_STATS(stats_blk->stat_IfHCInOctets);
6464
6465         net_stats->tx_bytes =
6466                 GET_NET_STATS(stats_blk->stat_IfHCOutOctets);
6467
6468         net_stats->multicast =
6469                 GET_NET_STATS(stats_blk->stat_IfHCOutMulticastPkts);
6470
6471         net_stats->collisions =
6472                 (unsigned long) stats_blk->stat_EtherStatsCollisions;
6473
6474         net_stats->rx_length_errors =
6475                 (unsigned long) (stats_blk->stat_EtherStatsUndersizePkts +
6476                 stats_blk->stat_EtherStatsOverrsizePkts);
6477
6478         net_stats->rx_over_errors =
6479                 (unsigned long) stats_blk->stat_IfInMBUFDiscards;
6480
6481         net_stats->rx_frame_errors =
6482                 (unsigned long) stats_blk->stat_Dot3StatsAlignmentErrors;
6483
6484         net_stats->rx_crc_errors =
6485                 (unsigned long) stats_blk->stat_Dot3StatsFCSErrors;
6486
6487         net_stats->rx_errors = net_stats->rx_length_errors +
6488                 net_stats->rx_over_errors + net_stats->rx_frame_errors +
6489                 net_stats->rx_crc_errors;
6490
6491         net_stats->tx_aborted_errors =
6492                 (unsigned long) (stats_blk->stat_Dot3StatsExcessiveCollisions +
6493                 stats_blk->stat_Dot3StatsLateCollisions);
6494
6495         if ((CHIP_NUM(bp) == CHIP_NUM_5706) ||
6496             (CHIP_ID(bp) == CHIP_ID_5708_A0))
6497                 net_stats->tx_carrier_errors = 0;
6498         else {
6499                 net_stats->tx_carrier_errors =
6500                         (unsigned long)
6501                         stats_blk->stat_Dot3StatsCarrierSenseErrors;
6502         }
6503
6504         net_stats->tx_errors =
6505                 (unsigned long)
6506                 stats_blk->stat_emac_tx_stat_dot3statsinternalmactransmiterrors
6507                 +
6508                 net_stats->tx_aborted_errors +
6509                 net_stats->tx_carrier_errors;
6510
6511         net_stats->rx_missed_errors =
6512                 (unsigned long) (stats_blk->stat_IfInMBUFDiscards +
6513                 stats_blk->stat_FwRxDrop);
6514
6515         return net_stats;
6516 }
6517
6518 /* All ethtool functions called with rtnl_lock */
6519
6520 static int
6521 bnx2_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
6522 {
6523         struct bnx2 *bp = netdev_priv(dev);
6524         int support_serdes = 0, support_copper = 0;
6525
6526         cmd->supported = SUPPORTED_Autoneg;
6527         if (bp->phy_flags & BNX2_PHY_FLAG_REMOTE_PHY_CAP) {
6528                 support_serdes = 1;
6529                 support_copper = 1;
6530         } else if (bp->phy_port == PORT_FIBRE)
6531                 support_serdes = 1;
6532         else
6533                 support_copper = 1;
6534
6535         if (support_serdes) {
6536                 cmd->supported |= SUPPORTED_1000baseT_Full |
6537                         SUPPORTED_FIBRE;
6538                 if (bp->phy_flags & BNX2_PHY_FLAG_2_5G_CAPABLE)
6539                         cmd->supported |= SUPPORTED_2500baseX_Full;
6540
6541         }
6542         if (support_copper) {
6543                 cmd->supported |= SUPPORTED_10baseT_Half |
6544                         SUPPORTED_10baseT_Full |
6545                         SUPPORTED_100baseT_Half |
6546                         SUPPORTED_100baseT_Full |
6547                         SUPPORTED_1000baseT_Full |
6548                         SUPPORTED_TP;
6549
6550         }
6551
6552         spin_lock_bh(&bp->phy_lock);
6553         cmd->port = bp->phy_port;
6554         cmd->advertising = bp->advertising;
6555
6556         if (bp->autoneg & AUTONEG_SPEED) {
6557                 cmd->autoneg = AUTONEG_ENABLE;
6558         }
6559         else {
6560                 cmd->autoneg = AUTONEG_DISABLE;
6561         }
6562
6563         if (netif_carrier_ok(dev)) {
6564                 cmd->speed = bp->line_speed;
6565                 cmd->duplex = bp->duplex;
6566         }
6567         else {
6568                 cmd->speed = -1;
6569                 cmd->duplex = -1;
6570         }
6571         spin_unlock_bh(&bp->phy_lock);
6572
6573         cmd->transceiver = XCVR_INTERNAL;
6574         cmd->phy_address = bp->phy_addr;
6575
6576         return 0;
6577 }
6578
6579 static int
6580 bnx2_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
6581 {
6582         struct bnx2 *bp = netdev_priv(dev);
6583         u8 autoneg = bp->autoneg;
6584         u8 req_duplex = bp->req_duplex;
6585         u16 req_line_speed = bp->req_line_speed;
6586         u32 advertising = bp->advertising;
6587         int err = -EINVAL;
6588
6589         spin_lock_bh(&bp->phy_lock);
6590
6591         if (cmd->port != PORT_TP && cmd->port != PORT_FIBRE)
6592                 goto err_out_unlock;
6593
6594         if (cmd->port != bp->phy_port &&
6595             !(bp->phy_flags & BNX2_PHY_FLAG_REMOTE_PHY_CAP))
6596                 goto err_out_unlock;
6597
6598         /* If device is down, we can store the settings only if the user
6599          * is setting the currently active port.
6600          */
6601         if (!netif_running(dev) && cmd->port != bp->phy_port)
6602                 goto err_out_unlock;
6603
6604         if (cmd->autoneg == AUTONEG_ENABLE) {
6605                 autoneg |= AUTONEG_SPEED;
6606
6607                 cmd->advertising &= ETHTOOL_ALL_COPPER_SPEED;
6608
6609                 /* allow advertising 1 speed */
6610                 if ((cmd->advertising == ADVERTISED_10baseT_Half) ||
6611                         (cmd->advertising == ADVERTISED_10baseT_Full) ||
6612                         (cmd->advertising == ADVERTISED_100baseT_Half) ||
6613                         (cmd->advertising == ADVERTISED_100baseT_Full)) {
6614
6615                         if (cmd->port == PORT_FIBRE)
6616                                 goto err_out_unlock;
6617
6618                         advertising = cmd->advertising;
6619
6620                 } else if (cmd->advertising == ADVERTISED_2500baseX_Full) {
6621                         if (!(bp->phy_flags & BNX2_PHY_FLAG_2_5G_CAPABLE) ||
6622                             (cmd->port == PORT_TP))
6623                                 goto err_out_unlock;
6624                 } else if (cmd->advertising == ADVERTISED_1000baseT_Full)
6625                         advertising = cmd->advertising;
6626                 else if (cmd->advertising == ADVERTISED_1000baseT_Half)
6627                         goto err_out_unlock;
6628                 else {
6629                         if (cmd->port == PORT_FIBRE)
6630                                 advertising = ETHTOOL_ALL_FIBRE_SPEED;
6631                         else
6632                                 advertising = ETHTOOL_ALL_COPPER_SPEED;
6633                 }
6634                 advertising |= ADVERTISED_Autoneg;
6635         }
6636         else {
6637                 if (cmd->port == PORT_FIBRE) {
6638                         if ((cmd->speed != SPEED_1000 &&
6639                              cmd->speed != SPEED_2500) ||
6640                             (cmd->duplex != DUPLEX_FULL))
6641                                 goto err_out_unlock;
6642
6643                         if (cmd->speed == SPEED_2500 &&
6644                             !(bp->phy_flags & BNX2_PHY_FLAG_2_5G_CAPABLE))
6645                                 goto err_out_unlock;
6646                 }
6647                 else if (cmd->speed == SPEED_1000 || cmd->speed == SPEED_2500)
6648                         goto err_out_unlock;
6649
6650                 autoneg &= ~AUTONEG_SPEED;
6651                 req_line_speed = cmd->speed;
6652                 req_duplex = cmd->duplex;
6653                 advertising = 0;
6654         }
6655
6656         bp->autoneg = autoneg;
6657         bp->advertising = advertising;
6658         bp->req_line_speed = req_line_speed;
6659         bp->req_duplex = req_duplex;
6660
6661         err = 0;
6662         /* If device is down, the new settings will be picked up when it is
6663          * brought up.
6664          */
6665         if (netif_running(dev))
6666                 err = bnx2_setup_phy(bp, cmd->port);
6667
6668 err_out_unlock:
6669         spin_unlock_bh(&bp->phy_lock);
6670
6671         return err;
6672 }
6673
6674 static void
6675 bnx2_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)
6676 {
6677         struct bnx2 *bp = netdev_priv(dev);
6678
6679         strcpy(info->driver, DRV_MODULE_NAME);
6680         strcpy(info->version, DRV_MODULE_VERSION);
6681         strcpy(info->bus_info, pci_name(bp->pdev));
6682         strcpy(info->fw_version, bp->fw_version);
6683 }
6684
6685 #define BNX2_REGDUMP_LEN                (32 * 1024)
6686
6687 static int
6688 bnx2_get_regs_len(struct net_device *dev)
6689 {
6690         return BNX2_REGDUMP_LEN;
6691 }
6692
6693 static void
6694 bnx2_get_regs(struct net_device *dev, struct ethtool_regs *regs, void *_p)
6695 {
6696         u32 *p = _p, i, offset;
6697         u8 *orig_p = _p;
6698         struct bnx2 *bp = netdev_priv(dev);
6699         u32 reg_boundaries[] = { 0x0000, 0x0098, 0x0400, 0x045c,
6700                                  0x0800, 0x0880, 0x0c00, 0x0c10,
6701                                  0x0c30, 0x0d08, 0x1000, 0x101c,
6702                                  0x1040, 0x1048, 0x1080, 0x10a4,
6703                                  0x1400, 0x1490, 0x1498, 0x14f0,
6704                                  0x1500, 0x155c, 0x1580, 0x15dc,
6705                                  0x1600, 0x1658, 0x1680, 0x16d8,
6706                                  0x1800, 0x1820, 0x1840, 0x1854,
6707                                  0x1880, 0x1894, 0x1900, 0x1984,
6708                                  0x1c00, 0x1c0c, 0x1c40, 0x1c54,
6709                                  0x1c80, 0x1c94, 0x1d00, 0x1d84,
6710                                  0x2000, 0x2030, 0x23c0, 0x2400,
6711                                  0x2800, 0x2820, 0x2830, 0x2850,
6712                                  0x2b40, 0x2c10, 0x2fc0, 0x3058,
6713                                  0x3c00, 0x3c94, 0x4000, 0x4010,
6714                                  0x4080, 0x4090, 0x43c0, 0x4458,
6715                                  0x4c00, 0x4c18, 0x4c40, 0x4c54,
6716                                  0x4fc0, 0x5010, 0x53c0, 0x5444,
6717                                  0x5c00, 0x5c18, 0x5c80, 0x5c90,
6718                                  0x5fc0, 0x6000, 0x6400, 0x6428,
6719                                  0x6800, 0x6848, 0x684c, 0x6860,
6720                                  0x6888, 0x6910, 0x8000 };
6721
6722         regs->version = 0;
6723
6724         memset(p, 0, BNX2_REGDUMP_LEN);
6725
6726         if (!netif_running(bp->dev))
6727                 return;
6728
6729         i = 0;
6730         offset = reg_boundaries[0];
6731         p += offset;
6732         while (offset < BNX2_REGDUMP_LEN) {
6733                 *p++ = REG_RD(bp, offset);
6734                 offset += 4;
6735                 if (offset == reg_boundaries[i + 1]) {
6736                         offset = reg_boundaries[i + 2];
6737                         p = (u32 *) (orig_p + offset);
6738                         i += 2;
6739                 }
6740         }
6741 }
6742
6743 static void
6744 bnx2_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
6745 {
6746         struct bnx2 *bp = netdev_priv(dev);
6747
6748         if (bp->flags & BNX2_FLAG_NO_WOL) {
6749                 wol->supported = 0;
6750                 wol->wolopts = 0;
6751         }
6752         else {
6753                 wol->supported = WAKE_MAGIC;
6754                 if (bp->wol)
6755                         wol->wolopts = WAKE_MAGIC;
6756                 else
6757                         wol->wolopts = 0;
6758         }
6759         memset(&wol->sopass, 0, sizeof(wol->sopass));
6760 }
6761
6762 static int
6763 bnx2_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
6764 {
6765         struct bnx2 *bp = netdev_priv(dev);
6766
6767         if (wol->wolopts & ~WAKE_MAGIC)
6768                 return -EINVAL;
6769
6770         if (wol->wolopts & WAKE_MAGIC) {
6771                 if (bp->flags & BNX2_FLAG_NO_WOL)
6772                         return -EINVAL;
6773
6774                 bp->wol = 1;
6775         }
6776         else {
6777                 bp->wol = 0;
6778         }
6779         return 0;
6780 }
6781
6782 static int
6783 bnx2_nway_reset(struct net_device *dev)
6784 {
6785         struct bnx2 *bp = netdev_priv(dev);
6786         u32 bmcr;
6787
6788         if (!netif_running(dev))
6789                 return -EAGAIN;
6790
6791         if (!(bp->autoneg & AUTONEG_SPEED)) {
6792                 return -EINVAL;
6793         }
6794
6795         spin_lock_bh(&bp->phy_lock);
6796
6797         if (bp->phy_flags & BNX2_PHY_FLAG_REMOTE_PHY_CAP) {
6798                 int rc;
6799
6800                 rc = bnx2_setup_remote_phy(bp, bp->phy_port);
6801                 spin_unlock_bh(&bp->phy_lock);
6802                 return rc;
6803         }
6804
6805         /* Force a link down visible on the other side */
6806         if (bp->phy_flags & BNX2_PHY_FLAG_SERDES) {
6807                 bnx2_write_phy(bp, bp->mii_bmcr, BMCR_LOOPBACK);
6808                 spin_unlock_bh(&bp->phy_lock);
6809
6810                 msleep(20);
6811
6812                 spin_lock_bh(&bp->phy_lock);
6813
6814                 bp->current_interval = BNX2_SERDES_AN_TIMEOUT;
6815                 bp->serdes_an_pending = 1;
6816                 mod_timer(&bp->timer, jiffies + bp->current_interval);
6817         }
6818
6819         bnx2_read_phy(bp, bp->mii_bmcr, &bmcr);
6820         bmcr &= ~BMCR_LOOPBACK;
6821         bnx2_write_phy(bp, bp->mii_bmcr, bmcr | BMCR_ANRESTART | BMCR_ANENABLE);
6822
6823         spin_unlock_bh(&bp->phy_lock);
6824
6825         return 0;
6826 }
6827
6828 static int
6829 bnx2_get_eeprom_len(struct net_device *dev)
6830 {
6831         struct bnx2 *bp = netdev_priv(dev);
6832
6833         if (bp->flash_info == NULL)
6834                 return 0;
6835
6836         return (int) bp->flash_size;
6837 }
6838
6839 static int
6840 bnx2_get_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom,
6841                 u8 *eebuf)
6842 {
6843         struct bnx2 *bp = netdev_priv(dev);
6844         int rc;
6845
6846         if (!netif_running(dev))
6847                 return -EAGAIN;
6848
6849         /* parameters already validated in ethtool_get_eeprom */
6850
6851         rc = bnx2_nvram_read(bp, eeprom->offset, eebuf, eeprom->len);
6852
6853         return rc;
6854 }
6855
6856 static int
6857 bnx2_set_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom,
6858                 u8 *eebuf)
6859 {
6860         struct bnx2 *bp = netdev_priv(dev);
6861         int rc;
6862
6863         if (!netif_running(dev))
6864                 return -EAGAIN;
6865
6866         /* parameters already validated in ethtool_set_eeprom */
6867
6868         rc = bnx2_nvram_write(bp, eeprom->offset, eebuf, eeprom->len);
6869
6870         return rc;
6871 }
6872
6873 static int
6874 bnx2_get_coalesce(struct net_device *dev, struct ethtool_coalesce *coal)
6875 {
6876         struct bnx2 *bp = netdev_priv(dev);
6877
6878         memset(coal, 0, sizeof(struct ethtool_coalesce));
6879
6880         coal->rx_coalesce_usecs = bp->rx_ticks;
6881         coal->rx_max_coalesced_frames = bp->rx_quick_cons_trip;
6882         coal->rx_coalesce_usecs_irq = bp->rx_ticks_int;
6883         coal->rx_max_coalesced_frames_irq = bp->rx_quick_cons_trip_int;
6884
6885         coal->tx_coalesce_usecs = bp->tx_ticks;
6886         coal->tx_max_coalesced_frames = bp->tx_quick_cons_trip;
6887         coal->tx_coalesce_usecs_irq = bp->tx_ticks_int;
6888         coal->tx_max_coalesced_frames_irq = bp->tx_quick_cons_trip_int;
6889
6890         coal->stats_block_coalesce_usecs = bp->stats_ticks;
6891
6892         return 0;
6893 }
6894
6895 static int
6896 bnx2_set_coalesce(struct net_device *dev, struct ethtool_coalesce *coal)
6897 {
6898         struct bnx2 *bp = netdev_priv(dev);
6899
6900         bp->rx_ticks = (u16) coal->rx_coalesce_usecs;
6901         if (bp->rx_ticks > 0x3ff) bp->rx_ticks = 0x3ff;
6902
6903         bp->rx_quick_cons_trip = (u16) coal->rx_max_coalesced_frames;
6904         if (bp->rx_quick_cons_trip > 0xff) bp->rx_quick_cons_trip = 0xff;
6905
6906         bp->rx_ticks_int = (u16) coal->rx_coalesce_usecs_irq;
6907         if (bp->rx_ticks_int > 0x3ff) bp->rx_ticks_int = 0x3ff;
6908
6909         bp->rx_quick_cons_trip_int = (u16) coal->rx_max_coalesced_frames_irq;
6910         if (bp->rx_quick_cons_trip_int > 0xff)
6911                 bp->rx_quick_cons_trip_int = 0xff;
6912
6913         bp->tx_ticks = (u16) coal->tx_coalesce_usecs;
6914         if (bp->tx_ticks > 0x3ff) bp->tx_ticks = 0x3ff;
6915
6916         bp->tx_quick_cons_trip = (u16) coal->tx_max_coalesced_frames;
6917         if (bp->tx_quick_cons_trip > 0xff) bp->tx_quick_cons_trip = 0xff;
6918
6919         bp->tx_ticks_int = (u16) coal->tx_coalesce_usecs_irq;
6920         if (bp->tx_ticks_int > 0x3ff) bp->tx_ticks_int = 0x3ff;
6921
6922         bp->tx_quick_cons_trip_int = (u16) coal->tx_max_coalesced_frames_irq;
6923         if (bp->tx_quick_cons_trip_int > 0xff) bp->tx_quick_cons_trip_int =
6924                 0xff;
6925
6926         bp->stats_ticks = coal->stats_block_coalesce_usecs;
6927         if (CHIP_NUM(bp) == CHIP_NUM_5708) {
6928                 if (bp->stats_ticks != 0 && bp->stats_ticks != USEC_PER_SEC)
6929                         bp->stats_ticks = USEC_PER_SEC;
6930         }
6931         if (bp->stats_ticks > BNX2_HC_STATS_TICKS_HC_STAT_TICKS)
6932                 bp->stats_ticks = BNX2_HC_STATS_TICKS_HC_STAT_TICKS;
6933         bp->stats_ticks &= BNX2_HC_STATS_TICKS_HC_STAT_TICKS;
6934
6935         if (netif_running(bp->dev)) {
6936                 bnx2_netif_stop(bp);
6937                 bnx2_init_nic(bp, 0);
6938                 bnx2_netif_start(bp);
6939         }
6940
6941         return 0;
6942 }
6943
6944 static void
6945 bnx2_get_ringparam(struct net_device *dev, struct ethtool_ringparam *ering)
6946 {
6947         struct bnx2 *bp = netdev_priv(dev);
6948
6949         ering->rx_max_pending = MAX_TOTAL_RX_DESC_CNT;
6950         ering->rx_mini_max_pending = 0;
6951         ering->rx_jumbo_max_pending = MAX_TOTAL_RX_PG_DESC_CNT;
6952
6953         ering->rx_pending = bp->rx_ring_size;
6954         ering->rx_mini_pending = 0;
6955         ering->rx_jumbo_pending = bp->rx_pg_ring_size;
6956
6957         ering->tx_max_pending = MAX_TX_DESC_CNT;
6958         ering->tx_pending = bp->tx_ring_size;
6959 }
6960
6961 static int
6962 bnx2_change_ring_size(struct bnx2 *bp, u32 rx, u32 tx)
6963 {
6964         if (netif_running(bp->dev)) {
6965                 bnx2_netif_stop(bp);
6966                 bnx2_reset_chip(bp, BNX2_DRV_MSG_CODE_RESET);
6967                 bnx2_free_skbs(bp);
6968                 bnx2_free_mem(bp);
6969         }
6970
6971         bnx2_set_rx_ring_size(bp, rx);
6972         bp->tx_ring_size = tx;
6973
6974         if (netif_running(bp->dev)) {
6975                 int rc;
6976
6977                 rc = bnx2_alloc_mem(bp);
6978                 if (rc)
6979                         return rc;
6980                 bnx2_init_nic(bp, 0);
6981                 bnx2_netif_start(bp);
6982         }
6983         return 0;
6984 }
6985
6986 static int
6987 bnx2_set_ringparam(struct net_device *dev, struct ethtool_ringparam *ering)
6988 {
6989         struct bnx2 *bp = netdev_priv(dev);
6990         int rc;
6991
6992         if ((ering->rx_pending > MAX_TOTAL_RX_DESC_CNT) ||
6993                 (ering->tx_pending > MAX_TX_DESC_CNT) ||
6994                 (ering->tx_pending <= MAX_SKB_FRAGS)) {
6995
6996                 return -EINVAL;
6997         }
6998         rc = bnx2_change_ring_size(bp, ering->rx_pending, ering->tx_pending);
6999         return rc;
7000 }
7001
7002 static void
7003 bnx2_get_pauseparam(struct net_device *dev, struct ethtool_pauseparam *epause)
7004 {
7005         struct bnx2 *bp = netdev_priv(dev);
7006
7007         epause->autoneg = ((bp->autoneg & AUTONEG_FLOW_CTRL) != 0);
7008         epause->rx_pause = ((bp->flow_ctrl & FLOW_CTRL_RX) != 0);
7009         epause->tx_pause = ((bp->flow_ctrl & FLOW_CTRL_TX) != 0);
7010 }
7011
7012 static int
7013 bnx2_set_pauseparam(struct net_device *dev, struct ethtool_pauseparam *epause)
7014 {
7015         struct bnx2 *bp = netdev_priv(dev);
7016
7017         bp->req_flow_ctrl = 0;
7018         if (epause->rx_pause)
7019                 bp->req_flow_ctrl |= FLOW_CTRL_RX;
7020         if (epause->tx_pause)
7021                 bp->req_flow_ctrl |= FLOW_CTRL_TX;
7022
7023         if (epause->autoneg) {
7024                 bp->autoneg |= AUTONEG_FLOW_CTRL;
7025         }
7026         else {
7027                 bp->autoneg &= ~AUTONEG_FLOW_CTRL;
7028         }
7029
7030         if (netif_running(dev)) {
7031                 spin_lock_bh(&bp->phy_lock);
7032                 bnx2_setup_phy(bp, bp->phy_port);
7033                 spin_unlock_bh(&bp->phy_lock);
7034         }
7035
7036         return 0;
7037 }
7038
7039 static u32
7040 bnx2_get_rx_csum(struct net_device *dev)
7041 {
7042         struct bnx2 *bp = netdev_priv(dev);
7043
7044         return bp->rx_csum;
7045 }
7046
7047 static int
7048 bnx2_set_rx_csum(struct net_device *dev, u32 data)
7049 {
7050         struct bnx2 *bp = netdev_priv(dev);
7051
7052         bp->rx_csum = data;
7053         return 0;
7054 }
7055
7056 static int
7057 bnx2_set_tso(struct net_device *dev, u32 data)
7058 {
7059         struct bnx2 *bp = netdev_priv(dev);
7060
7061         if (data) {
7062                 dev->features |= NETIF_F_TSO | NETIF_F_TSO_ECN;
7063                 if (CHIP_NUM(bp) == CHIP_NUM_5709)
7064                         dev->features |= NETIF_F_TSO6;
7065         } else
7066                 dev->features &= ~(NETIF_F_TSO | NETIF_F_TSO6 |
7067                                    NETIF_F_TSO_ECN);
7068         return 0;
7069 }
7070
7071 #define BNX2_NUM_STATS 46
7072
7073 static struct {
7074         char string[ETH_GSTRING_LEN];
7075 } bnx2_stats_str_arr[BNX2_NUM_STATS] = {
7076         { "rx_bytes" },
7077         { "rx_error_bytes" },
7078         { "tx_bytes" },
7079         { "tx_error_bytes" },
7080         { "rx_ucast_packets" },
7081         { "rx_mcast_packets" },
7082         { "rx_bcast_packets" },
7083         { "tx_ucast_packets" },
7084         { "tx_mcast_packets" },
7085         { "tx_bcast_packets" },
7086         { "tx_mac_errors" },
7087         { "tx_carrier_errors" },
7088         { "rx_crc_errors" },
7089         { "rx_align_errors" },
7090         { "tx_single_collisions" },
7091         { "tx_multi_collisions" },
7092         { "tx_deferred" },
7093         { "tx_excess_collisions" },
7094         { "tx_late_collisions" },
7095         { "tx_total_collisions" },
7096         { "rx_fragments" },
7097         { "rx_jabbers" },
7098         { "rx_undersize_packets" },
7099         { "rx_oversize_packets" },
7100         { "rx_64_byte_packets" },
7101         { "rx_65_to_127_byte_packets" },
7102         { "rx_128_to_255_byte_packets" },
7103         { "rx_256_to_511_byte_packets" },
7104         { "rx_512_to_1023_byte_packets" },
7105         { "rx_1024_to_1522_byte_packets" },
7106         { "rx_1523_to_9022_byte_packets" },
7107         { "tx_64_byte_packets" },
7108         { "tx_65_to_127_byte_packets" },
7109         { "tx_128_to_255_byte_packets" },
7110         { "tx_256_to_511_byte_packets" },
7111         { "tx_512_to_1023_byte_packets" },
7112         { "tx_1024_to_1522_byte_packets" },
7113         { "tx_1523_to_9022_byte_packets" },
7114         { "rx_xon_frames" },
7115         { "rx_xoff_frames" },
7116         { "tx_xon_frames" },
7117         { "tx_xoff_frames" },
7118         { "rx_mac_ctrl_frames" },
7119         { "rx_filtered_packets" },
7120         { "rx_discards" },
7121         { "rx_fw_discards" },
7122 };
7123
7124 #define STATS_OFFSET32(offset_name) (offsetof(struct statistics_block, offset_name) / 4)
7125
7126 static const unsigned long bnx2_stats_offset_arr[BNX2_NUM_STATS] = {
7127     STATS_OFFSET32(stat_IfHCInOctets_hi),
7128     STATS_OFFSET32(stat_IfHCInBadOctets_hi),
7129     STATS_OFFSET32(stat_IfHCOutOctets_hi),
7130     STATS_OFFSET32(stat_IfHCOutBadOctets_hi),
7131     STATS_OFFSET32(stat_IfHCInUcastPkts_hi),
7132     STATS_OFFSET32(stat_IfHCInMulticastPkts_hi),
7133     STATS_OFFSET32(stat_IfHCInBroadcastPkts_hi),
7134     STATS_OFFSET32(stat_IfHCOutUcastPkts_hi),
7135     STATS_OFFSET32(stat_IfHCOutMulticastPkts_hi),
7136     STATS_OFFSET32(stat_IfHCOutBroadcastPkts_hi),
7137     STATS_OFFSET32(stat_emac_tx_stat_dot3statsinternalmactransmiterrors),
7138     STATS_OFFSET32(stat_Dot3StatsCarrierSenseErrors),
7139     STATS_OFFSET32(stat_Dot3StatsFCSErrors),
7140     STATS_OFFSET32(stat_Dot3StatsAlignmentErrors),
7141     STATS_OFFSET32(stat_Dot3StatsSingleCollisionFrames),
7142     STATS_OFFSET32(stat_Dot3StatsMultipleCollisionFrames),
7143     STATS_OFFSET32(stat_Dot3StatsDeferredTransmissions),
7144     STATS_OFFSET32(stat_Dot3StatsExcessiveCollisions),
7145     STATS_OFFSET32(stat_Dot3StatsLateCollisions),
7146     STATS_OFFSET32(stat_EtherStatsCollisions),
7147     STATS_OFFSET32(stat_EtherStatsFragments),
7148     STATS_OFFSET32(stat_EtherStatsJabbers),
7149     STATS_OFFSET32(stat_EtherStatsUndersizePkts),
7150     STATS_OFFSET32(stat_EtherStatsOverrsizePkts),
7151     STATS_OFFSET32(stat_EtherStatsPktsRx64Octets),
7152     STATS_OFFSET32(stat_EtherStatsPktsRx65Octetsto127Octets),
7153     STATS_OFFSET32(stat_EtherStatsPktsRx128Octetsto255Octets),
7154     STATS_OFFSET32(stat_EtherStatsPktsRx256Octetsto511Octets),
7155     STATS_OFFSET32(stat_EtherStatsPktsRx512Octetsto1023Octets),
7156     STATS_OFFSET32(stat_EtherStatsPktsRx1024Octetsto1522Octets),
7157     STATS_OFFSET32(stat_EtherStatsPktsRx1523Octetsto9022Octets),
7158     STATS_OFFSET32(stat_EtherStatsPktsTx64Octets),
7159     STATS_OFFSET32(stat_EtherStatsPktsTx65Octetsto127Octets),
7160     STATS_OFFSET32(stat_EtherStatsPktsTx128Octetsto255Octets),
7161     STATS_OFFSET32(stat_EtherStatsPktsTx256Octetsto511Octets),
7162     STATS_OFFSET32(stat_EtherStatsPktsTx512Octetsto1023Octets),
7163     STATS_OFFSET32(stat_EtherStatsPktsTx1024Octetsto1522Octets),
7164     STATS_OFFSET32(stat_EtherStatsPktsTx1523Octetsto9022Octets),
7165     STATS_OFFSET32(stat_XonPauseFramesReceived),
7166     STATS_OFFSET32(stat_XoffPauseFramesReceived),
7167     STATS_OFFSET32(stat_OutXonSent),
7168     STATS_OFFSET32(stat_OutXoffSent),
7169     STATS_OFFSET32(stat_MacControlFramesReceived),
7170     STATS_OFFSET32(stat_IfInFramesL2FilterDiscards),
7171     STATS_OFFSET32(stat_IfInMBUFDiscards),
7172     STATS_OFFSET32(stat_FwRxDrop),
7173 };
7174
7175 /* stat_IfHCInBadOctets and stat_Dot3StatsCarrierSenseErrors are
7176  * skipped because of errata.
7177  */
7178 static u8 bnx2_5706_stats_len_arr[BNX2_NUM_STATS] = {
7179         8,0,8,8,8,8,8,8,8,8,
7180         4,0,4,4,4,4,4,4,4,4,
7181         4,4,4,4,4,4,4,4,4,4,
7182         4,4,4,4,4,4,4,4,4,4,
7183         4,4,4,4,4,4,
7184 };
7185
7186 static u8 bnx2_5708_stats_len_arr[BNX2_NUM_STATS] = {
7187         8,0,8,8,8,8,8,8,8,8,
7188         4,4,4,4,4,4,4,4,4,4,
7189         4,4,4,4,4,4,4,4,4,4,
7190         4,4,4,4,4,4,4,4,4,4,
7191         4,4,4,4,4,4,
7192 };
7193
7194 #define BNX2_NUM_TESTS 6
7195
7196 static struct {
7197         char string[ETH_GSTRING_LEN];
7198 } bnx2_tests_str_arr[BNX2_NUM_TESTS] = {
7199         { "register_test (offline)" },
7200         { "memory_test (offline)" },
7201         { "loopback_test (offline)" },
7202         { "nvram_test (online)" },
7203         { "interrupt_test (online)" },
7204         { "link_test (online)" },
7205 };
7206
7207 static int
7208 bnx2_get_sset_count(struct net_device *dev, int sset)
7209 {
7210         switch (sset) {
7211         case ETH_SS_TEST:
7212                 return BNX2_NUM_TESTS;
7213         case ETH_SS_STATS:
7214                 return BNX2_NUM_STATS;
7215         default:
7216                 return -EOPNOTSUPP;
7217         }
7218 }
7219
7220 static void
7221 bnx2_self_test(struct net_device *dev, struct ethtool_test *etest, u64 *buf)
7222 {
7223         struct bnx2 *bp = netdev_priv(dev);
7224
7225         bnx2_set_power_state(bp, PCI_D0);
7226
7227         memset(buf, 0, sizeof(u64) * BNX2_NUM_TESTS);
7228         if (etest->flags & ETH_TEST_FL_OFFLINE) {
7229                 int i;
7230
7231                 bnx2_netif_stop(bp);
7232                 bnx2_reset_chip(bp, BNX2_DRV_MSG_CODE_DIAG);
7233                 bnx2_free_skbs(bp);
7234
7235                 if (bnx2_test_registers(bp) != 0) {
7236                         buf[0] = 1;
7237                         etest->flags |= ETH_TEST_FL_FAILED;
7238                 }
7239                 if (bnx2_test_memory(bp) != 0) {
7240                         buf[1] = 1;
7241                         etest->flags |= ETH_TEST_FL_FAILED;
7242                 }
7243                 if ((buf[2] = bnx2_test_loopback(bp)) != 0)
7244                         etest->flags |= ETH_TEST_FL_FAILED;
7245
7246                 if (!netif_running(bp->dev))
7247                         bnx2_shutdown_chip(bp);
7248                 else {
7249                         bnx2_init_nic(bp, 1);
7250                         bnx2_netif_start(bp);
7251                 }
7252
7253                 /* wait for link up */
7254                 for (i = 0; i < 7; i++) {
7255                         if (bp->link_up)
7256                                 break;
7257                         msleep_interruptible(1000);
7258                 }
7259         }
7260
7261         if (bnx2_test_nvram(bp) != 0) {
7262                 buf[3] = 1;
7263                 etest->flags |= ETH_TEST_FL_FAILED;
7264         }
7265         if (bnx2_test_intr(bp) != 0) {
7266                 buf[4] = 1;
7267                 etest->flags |= ETH_TEST_FL_FAILED;
7268         }
7269
7270         if (bnx2_test_link(bp) != 0) {
7271                 buf[5] = 1;
7272                 etest->flags |= ETH_TEST_FL_FAILED;
7273
7274         }
7275         if (!netif_running(bp->dev))
7276                 bnx2_set_power_state(bp, PCI_D3hot);
7277 }
7278
7279 static void
7280 bnx2_get_strings(struct net_device *dev, u32 stringset, u8 *buf)
7281 {
7282         switch (stringset) {
7283         case ETH_SS_STATS:
7284                 memcpy(buf, bnx2_stats_str_arr,
7285                         sizeof(bnx2_stats_str_arr));
7286                 break;
7287         case ETH_SS_TEST:
7288                 memcpy(buf, bnx2_tests_str_arr,
7289                         sizeof(bnx2_tests_str_arr));
7290                 break;
7291         }
7292 }
7293
7294 static void
7295 bnx2_get_ethtool_stats(struct net_device *dev,
7296                 struct ethtool_stats *stats, u64 *buf)
7297 {
7298         struct bnx2 *bp = netdev_priv(dev);
7299         int i;
7300         u32 *hw_stats = (u32 *) bp->stats_blk;
7301         u8 *stats_len_arr = NULL;
7302
7303         if (hw_stats == NULL) {
7304                 memset(buf, 0, sizeof(u64) * BNX2_NUM_STATS);
7305                 return;
7306         }
7307
7308         if ((CHIP_ID(bp) == CHIP_ID_5706_A0) ||
7309             (CHIP_ID(bp) == CHIP_ID_5706_A1) ||
7310             (CHIP_ID(bp) == CHIP_ID_5706_A2) ||
7311             (CHIP_ID(bp) == CHIP_ID_5708_A0))
7312                 stats_len_arr = bnx2_5706_stats_len_arr;
7313         else
7314                 stats_len_arr = bnx2_5708_stats_len_arr;
7315
7316         for (i = 0; i < BNX2_NUM_STATS; i++) {
7317                 if (stats_len_arr[i] == 0) {
7318                         /* skip this counter */
7319                         buf[i] = 0;
7320                         continue;
7321                 }
7322                 if (stats_len_arr[i] == 4) {
7323                         /* 4-byte counter */
7324                         buf[i] = (u64)
7325                                 *(hw_stats + bnx2_stats_offset_arr[i]);
7326                         continue;
7327                 }
7328                 /* 8-byte counter */
7329                 buf[i] = (((u64) *(hw_stats +
7330                                         bnx2_stats_offset_arr[i])) << 32) +
7331                                 *(hw_stats + bnx2_stats_offset_arr[i] + 1);
7332         }
7333 }
7334
7335 static int
7336 bnx2_phys_id(struct net_device *dev, u32 data)
7337 {
7338         struct bnx2 *bp = netdev_priv(dev);
7339         int i;
7340         u32 save;
7341
7342         bnx2_set_power_state(bp, PCI_D0);
7343
7344         if (data == 0)
7345                 data = 2;
7346
7347         save = REG_RD(bp, BNX2_MISC_CFG);
7348         REG_WR(bp, BNX2_MISC_CFG, BNX2_MISC_CFG_LEDMODE_MAC);
7349
7350         for (i = 0; i < (data * 2); i++) {
7351                 if ((i % 2) == 0) {
7352                         REG_WR(bp, BNX2_EMAC_LED, BNX2_EMAC_LED_OVERRIDE);
7353                 }
7354                 else {
7355                         REG_WR(bp, BNX2_EMAC_LED, BNX2_EMAC_LED_OVERRIDE |
7356                                 BNX2_EMAC_LED_1000MB_OVERRIDE |
7357                                 BNX2_EMAC_LED_100MB_OVERRIDE |
7358                                 BNX2_EMAC_LED_10MB_OVERRIDE |
7359                                 BNX2_EMAC_LED_TRAFFIC_OVERRIDE |
7360                                 BNX2_EMAC_LED_TRAFFIC);
7361                 }
7362                 msleep_interruptible(500);
7363                 if (signal_pending(current))
7364                         break;
7365         }
7366         REG_WR(bp, BNX2_EMAC_LED, 0);
7367         REG_WR(bp, BNX2_MISC_CFG, save);
7368
7369         if (!netif_running(dev))
7370                 bnx2_set_power_state(bp, PCI_D3hot);
7371
7372         return 0;
7373 }
7374
7375 static int
7376 bnx2_set_tx_csum(struct net_device *dev, u32 data)
7377 {
7378         struct bnx2 *bp = netdev_priv(dev);
7379
7380         if (CHIP_NUM(bp) == CHIP_NUM_5709)
7381                 return (ethtool_op_set_tx_ipv6_csum(dev, data));
7382         else
7383                 return (ethtool_op_set_tx_csum(dev, data));
7384 }
7385
7386 static const struct ethtool_ops bnx2_ethtool_ops = {
7387         .get_settings           = bnx2_get_settings,
7388         .set_settings           = bnx2_set_settings,
7389         .get_drvinfo            = bnx2_get_drvinfo,
7390         .get_regs_len           = bnx2_get_regs_len,
7391         .get_regs               = bnx2_get_regs,
7392         .get_wol                = bnx2_get_wol,
7393         .set_wol                = bnx2_set_wol,
7394         .nway_reset             = bnx2_nway_reset,
7395         .get_link               = ethtool_op_get_link,
7396         .get_eeprom_len         = bnx2_get_eeprom_len,
7397         .get_eeprom             = bnx2_get_eeprom,
7398         .set_eeprom             = bnx2_set_eeprom,
7399         .get_coalesce           = bnx2_get_coalesce,
7400         .set_coalesce           = bnx2_set_coalesce,
7401         .get_ringparam          = bnx2_get_ringparam,
7402         .set_ringparam          = bnx2_set_ringparam,
7403         .get_pauseparam         = bnx2_get_pauseparam,
7404         .set_pauseparam         = bnx2_set_pauseparam,
7405         .get_rx_csum            = bnx2_get_rx_csum,
7406         .set_rx_csum            = bnx2_set_rx_csum,
7407         .set_tx_csum            = bnx2_set_tx_csum,
7408         .set_sg                 = ethtool_op_set_sg,
7409         .set_tso                = bnx2_set_tso,
7410         .self_test              = bnx2_self_test,
7411         .get_strings            = bnx2_get_strings,
7412         .phys_id                = bnx2_phys_id,
7413         .get_ethtool_stats      = bnx2_get_ethtool_stats,
7414         .get_sset_count         = bnx2_get_sset_count,
7415 };
7416
7417 /* Called with rtnl_lock */
7418 static int
7419 bnx2_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
7420 {
7421         struct mii_ioctl_data *data = if_mii(ifr);
7422         struct bnx2 *bp = netdev_priv(dev);
7423         int err;
7424
7425         switch(cmd) {
7426         case SIOCGMIIPHY:
7427                 data->phy_id = bp->phy_addr;
7428
7429                 /* fallthru */
7430         case SIOCGMIIREG: {
7431                 u32 mii_regval;
7432
7433                 if (bp->phy_flags & BNX2_PHY_FLAG_REMOTE_PHY_CAP)
7434                         return -EOPNOTSUPP;
7435
7436                 if (!netif_running(dev))
7437                         return -EAGAIN;
7438
7439                 spin_lock_bh(&bp->phy_lock);
7440                 err = bnx2_read_phy(bp, data->reg_num & 0x1f, &mii_regval);
7441                 spin_unlock_bh(&bp->phy_lock);
7442
7443                 data->val_out = mii_regval;
7444
7445                 return err;
7446         }
7447
7448         case SIOCSMIIREG:
7449                 if (!capable(CAP_NET_ADMIN))
7450                         return -EPERM;
7451
7452                 if (bp->phy_flags & BNX2_PHY_FLAG_REMOTE_PHY_CAP)
7453                         return -EOPNOTSUPP;
7454
7455                 if (!netif_running(dev))
7456                         return -EAGAIN;
7457
7458                 spin_lock_bh(&bp->phy_lock);
7459                 err = bnx2_write_phy(bp, data->reg_num & 0x1f, data->val_in);
7460                 spin_unlock_bh(&bp->phy_lock);
7461
7462                 return err;
7463
7464         default:
7465                 /* do nothing */
7466                 break;
7467         }
7468         return -EOPNOTSUPP;
7469 }
7470
7471 /* Called with rtnl_lock */
7472 static int
7473 bnx2_change_mac_addr(struct net_device *dev, void *p)
7474 {
7475         struct sockaddr *addr = p;
7476         struct bnx2 *bp = netdev_priv(dev);
7477
7478         if (!is_valid_ether_addr(addr->sa_data))
7479                 return -EINVAL;
7480
7481         memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
7482         if (netif_running(dev))
7483                 bnx2_set_mac_addr(bp, bp->dev->dev_addr, 0);
7484
7485         return 0;
7486 }
7487
7488 /* Called with rtnl_lock */
7489 static int
7490 bnx2_change_mtu(struct net_device *dev, int new_mtu)
7491 {
7492         struct bnx2 *bp = netdev_priv(dev);
7493
7494         if (((new_mtu + ETH_HLEN) > MAX_ETHERNET_JUMBO_PACKET_SIZE) ||
7495                 ((new_mtu + ETH_HLEN) < MIN_ETHERNET_PACKET_SIZE))
7496                 return -EINVAL;
7497
7498         dev->mtu = new_mtu;
7499         return (bnx2_change_ring_size(bp, bp->rx_ring_size, bp->tx_ring_size));
7500 }
7501
7502 #if defined(HAVE_POLL_CONTROLLER) || defined(CONFIG_NET_POLL_CONTROLLER)
7503 static void
7504 poll_bnx2(struct net_device *dev)
7505 {
7506         struct bnx2 *bp = netdev_priv(dev);
7507         int i;
7508
7509         for (i = 0; i < bp->irq_nvecs; i++) {
7510                 disable_irq(bp->irq_tbl[i].vector);
7511                 bnx2_interrupt(bp->irq_tbl[i].vector, &bp->bnx2_napi[i]);
7512                 enable_irq(bp->irq_tbl[i].vector);
7513         }
7514 }
7515 #endif
7516
7517 static void __devinit
7518 bnx2_get_5709_media(struct bnx2 *bp)
7519 {
7520         u32 val = REG_RD(bp, BNX2_MISC_DUAL_MEDIA_CTRL);
7521         u32 bond_id = val & BNX2_MISC_DUAL_MEDIA_CTRL_BOND_ID;
7522         u32 strap;
7523
7524         if (bond_id == BNX2_MISC_DUAL_MEDIA_CTRL_BOND_ID_C)
7525                 return;
7526         else if (bond_id == BNX2_MISC_DUAL_MEDIA_CTRL_BOND_ID_S) {
7527                 bp->phy_flags |= BNX2_PHY_FLAG_SERDES;
7528                 return;
7529         }
7530
7531         if (val & BNX2_MISC_DUAL_MEDIA_CTRL_STRAP_OVERRIDE)
7532                 strap = (val & BNX2_MISC_DUAL_MEDIA_CTRL_PHY_CTRL) >> 21;
7533         else
7534                 strap = (val & BNX2_MISC_DUAL_MEDIA_CTRL_PHY_CTRL_STRAP) >> 8;
7535
7536         if (PCI_FUNC(bp->pdev->devfn) == 0) {
7537                 switch (strap) {
7538                 case 0x4:
7539                 case 0x5:
7540                 case 0x6:
7541                         bp->phy_flags |= BNX2_PHY_FLAG_SERDES;
7542                         return;
7543                 }
7544         } else {
7545                 switch (strap) {
7546                 case 0x1:
7547                 case 0x2:
7548                 case 0x4:
7549                         bp->phy_flags |= BNX2_PHY_FLAG_SERDES;
7550                         return;
7551                 }
7552         }
7553 }
7554
7555 static void __devinit
7556 bnx2_get_pci_speed(struct bnx2 *bp)
7557 {
7558         u32 reg;
7559
7560         reg = REG_RD(bp, BNX2_PCICFG_MISC_STATUS);
7561         if (reg & BNX2_PCICFG_MISC_STATUS_PCIX_DET) {
7562                 u32 clkreg;
7563
7564                 bp->flags |= BNX2_FLAG_PCIX;
7565
7566                 clkreg = REG_RD(bp, BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS);
7567
7568                 clkreg &= BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET;
7569                 switch (clkreg) {
7570                 case BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_133MHZ:
7571                         bp->bus_speed_mhz = 133;
7572                         break;
7573
7574                 case BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_95MHZ:
7575                         bp->bus_speed_mhz = 100;
7576                         break;
7577
7578                 case BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_66MHZ:
7579                 case BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_80MHZ:
7580                         bp->bus_speed_mhz = 66;
7581                         break;
7582
7583                 case BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_48MHZ:
7584                 case BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_55MHZ:
7585                         bp->bus_speed_mhz = 50;
7586                         break;
7587
7588                 case BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_LOW:
7589                 case BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_32MHZ:
7590                 case BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_38MHZ:
7591                         bp->bus_speed_mhz = 33;
7592                         break;
7593                 }
7594         }
7595         else {
7596                 if (reg & BNX2_PCICFG_MISC_STATUS_M66EN)
7597                         bp->bus_speed_mhz = 66;
7598                 else
7599                         bp->bus_speed_mhz = 33;
7600         }
7601
7602         if (reg & BNX2_PCICFG_MISC_STATUS_32BIT_DET)
7603                 bp->flags |= BNX2_FLAG_PCI_32BIT;
7604
7605 }
7606
7607 static int __devinit
7608 bnx2_init_board(struct pci_dev *pdev, struct net_device *dev)
7609 {
7610         struct bnx2 *bp;
7611         unsigned long mem_len;
7612         int rc, i, j;
7613         u32 reg;
7614         u64 dma_mask, persist_dma_mask;
7615
7616         SET_NETDEV_DEV(dev, &pdev->dev);
7617         bp = netdev_priv(dev);
7618
7619         bp->flags = 0;
7620         bp->phy_flags = 0;
7621
7622         /* enable device (incl. PCI PM wakeup), and bus-mastering */
7623         rc = pci_enable_device(pdev);
7624         if (rc) {
7625                 dev_err(&pdev->dev, "Cannot enable PCI device, aborting.\n");
7626                 goto err_out;
7627         }
7628
7629         if (!(pci_resource_flags(pdev, 0) & IORESOURCE_MEM)) {
7630                 dev_err(&pdev->dev,
7631                         "Cannot find PCI device base address, aborting.\n");
7632                 rc = -ENODEV;
7633                 goto err_out_disable;
7634         }
7635
7636         rc = pci_request_regions(pdev, DRV_MODULE_NAME);
7637         if (rc) {
7638                 dev_err(&pdev->dev, "Cannot obtain PCI resources, aborting.\n");
7639                 goto err_out_disable;
7640         }
7641
7642         pci_set_master(pdev);
7643         pci_save_state(pdev);
7644
7645         bp->pm_cap = pci_find_capability(pdev, PCI_CAP_ID_PM);
7646         if (bp->pm_cap == 0) {
7647                 dev_err(&pdev->dev,
7648                         "Cannot find power management capability, aborting.\n");
7649                 rc = -EIO;
7650                 goto err_out_release;
7651         }
7652
7653         bp->dev = dev;
7654         bp->pdev = pdev;
7655
7656         spin_lock_init(&bp->phy_lock);
7657         spin_lock_init(&bp->indirect_lock);
7658         INIT_WORK(&bp->reset_task, bnx2_reset_task);
7659
7660         dev->base_addr = dev->mem_start = pci_resource_start(pdev, 0);
7661         mem_len = MB_GET_CID_ADDR(TX_TSS_CID + TX_MAX_TSS_RINGS + 1);
7662         dev->mem_end = dev->mem_start + mem_len;
7663         dev->irq = pdev->irq;
7664
7665         bp->regview = ioremap_nocache(dev->base_addr, mem_len);
7666
7667         if (!bp->regview) {
7668                 dev_err(&pdev->dev, "Cannot map register space, aborting.\n");
7669                 rc = -ENOMEM;
7670                 goto err_out_release;
7671         }
7672
7673         /* Configure byte swap and enable write to the reg_window registers.
7674          * Rely on CPU to do target byte swapping on big endian systems
7675          * The chip's target access swapping will not swap all accesses
7676          */
7677         pci_write_config_dword(bp->pdev, BNX2_PCICFG_MISC_CONFIG,
7678                                BNX2_PCICFG_MISC_CONFIG_REG_WINDOW_ENA |
7679                                BNX2_PCICFG_MISC_CONFIG_TARGET_MB_WORD_SWAP);
7680
7681         bnx2_set_power_state(bp, PCI_D0);
7682
7683         bp->chip_id = REG_RD(bp, BNX2_MISC_ID);
7684
7685         if (CHIP_NUM(bp) == CHIP_NUM_5709) {
7686                 if (pci_find_capability(pdev, PCI_CAP_ID_EXP) == 0) {
7687                         dev_err(&pdev->dev,
7688                                 "Cannot find PCIE capability, aborting.\n");
7689                         rc = -EIO;
7690                         goto err_out_unmap;
7691                 }
7692                 bp->flags |= BNX2_FLAG_PCIE;
7693                 if (CHIP_REV(bp) == CHIP_REV_Ax)
7694                         bp->flags |= BNX2_FLAG_JUMBO_BROKEN;
7695         } else {
7696                 bp->pcix_cap = pci_find_capability(pdev, PCI_CAP_ID_PCIX);
7697                 if (bp->pcix_cap == 0) {
7698                         dev_err(&pdev->dev,
7699                                 "Cannot find PCIX capability, aborting.\n");
7700                         rc = -EIO;
7701                         goto err_out_unmap;
7702                 }
7703         }
7704
7705         if (CHIP_NUM(bp) == CHIP_NUM_5709 && CHIP_REV(bp) != CHIP_REV_Ax) {
7706                 if (pci_find_capability(pdev, PCI_CAP_ID_MSIX))
7707                         bp->flags |= BNX2_FLAG_MSIX_CAP;
7708         }
7709
7710         if (CHIP_ID(bp) != CHIP_ID_5706_A0 && CHIP_ID(bp) != CHIP_ID_5706_A1) {
7711                 if (pci_find_capability(pdev, PCI_CAP_ID_MSI))
7712                         bp->flags |= BNX2_FLAG_MSI_CAP;
7713         }
7714
7715         /* 5708 cannot support DMA addresses > 40-bit.  */
7716         if (CHIP_NUM(bp) == CHIP_NUM_5708)
7717                 persist_dma_mask = dma_mask = DMA_BIT_MASK(40);
7718         else
7719                 persist_dma_mask = dma_mask = DMA_BIT_MASK(64);
7720
7721         /* Configure DMA attributes. */
7722         if (pci_set_dma_mask(pdev, dma_mask) == 0) {
7723                 dev->features |= NETIF_F_HIGHDMA;
7724                 rc = pci_set_consistent_dma_mask(pdev, persist_dma_mask);
7725                 if (rc) {
7726                         dev_err(&pdev->dev,
7727                                 "pci_set_consistent_dma_mask failed, aborting.\n");
7728                         goto err_out_unmap;
7729                 }
7730         } else if ((rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(32))) != 0) {
7731                 dev_err(&pdev->dev, "System does not support DMA, aborting.\n");
7732                 goto err_out_unmap;
7733         }
7734
7735         if (!(bp->flags & BNX2_FLAG_PCIE))
7736                 bnx2_get_pci_speed(bp);
7737
7738         /* 5706A0 may falsely detect SERR and PERR. */
7739         if (CHIP_ID(bp) == CHIP_ID_5706_A0) {
7740                 reg = REG_RD(bp, PCI_COMMAND);
7741                 reg &= ~(PCI_COMMAND_SERR | PCI_COMMAND_PARITY);
7742                 REG_WR(bp, PCI_COMMAND, reg);
7743         }
7744         else if ((CHIP_ID(bp) == CHIP_ID_5706_A1) &&
7745                 !(bp->flags & BNX2_FLAG_PCIX)) {
7746
7747                 dev_err(&pdev->dev,
7748                         "5706 A1 can only be used in a PCIX bus, aborting.\n");
7749                 goto err_out_unmap;
7750         }
7751
7752         bnx2_init_nvram(bp);
7753
7754         reg = bnx2_reg_rd_ind(bp, BNX2_SHM_HDR_SIGNATURE);
7755
7756         if ((reg & BNX2_SHM_HDR_SIGNATURE_SIG_MASK) ==
7757             BNX2_SHM_HDR_SIGNATURE_SIG) {
7758                 u32 off = PCI_FUNC(pdev->devfn) << 2;
7759
7760                 bp->shmem_base = bnx2_reg_rd_ind(bp, BNX2_SHM_HDR_ADDR_0 + off);
7761         } else
7762                 bp->shmem_base = HOST_VIEW_SHMEM_BASE;
7763
7764         /* Get the permanent MAC address.  First we need to make sure the
7765          * firmware is actually running.
7766          */
7767         reg = bnx2_shmem_rd(bp, BNX2_DEV_INFO_SIGNATURE);
7768
7769         if ((reg & BNX2_DEV_INFO_SIGNATURE_MAGIC_MASK) !=
7770             BNX2_DEV_INFO_SIGNATURE_MAGIC) {
7771                 dev_err(&pdev->dev, "Firmware not running, aborting.\n");
7772                 rc = -ENODEV;
7773                 goto err_out_unmap;
7774         }
7775
7776         reg = bnx2_shmem_rd(bp, BNX2_DEV_INFO_BC_REV);
7777         for (i = 0, j = 0; i < 3; i++) {
7778                 u8 num, k, skip0;
7779
7780                 num = (u8) (reg >> (24 - (i * 8)));
7781                 for (k = 100, skip0 = 1; k >= 1; num %= k, k /= 10) {
7782                         if (num >= k || !skip0 || k == 1) {
7783                                 bp->fw_version[j++] = (num / k) + '0';
7784                                 skip0 = 0;
7785                         }
7786                 }
7787                 if (i != 2)
7788                         bp->fw_version[j++] = '.';
7789         }
7790         reg = bnx2_shmem_rd(bp, BNX2_PORT_FEATURE);
7791         if (reg & BNX2_PORT_FEATURE_WOL_ENABLED)
7792                 bp->wol = 1;
7793
7794         if (reg & BNX2_PORT_FEATURE_ASF_ENABLED) {
7795                 bp->flags |= BNX2_FLAG_ASF_ENABLE;
7796
7797                 for (i = 0; i < 30; i++) {
7798                         reg = bnx2_shmem_rd(bp, BNX2_BC_STATE_CONDITION);
7799                         if (reg & BNX2_CONDITION_MFW_RUN_MASK)
7800                                 break;
7801                         msleep(10);
7802                 }
7803         }
7804         reg = bnx2_shmem_rd(bp, BNX2_BC_STATE_CONDITION);
7805         reg &= BNX2_CONDITION_MFW_RUN_MASK;
7806         if (reg != BNX2_CONDITION_MFW_RUN_UNKNOWN &&
7807             reg != BNX2_CONDITION_MFW_RUN_NONE) {
7808                 u32 addr = bnx2_shmem_rd(bp, BNX2_MFW_VER_PTR);
7809
7810                 bp->fw_version[j++] = ' ';
7811                 for (i = 0; i < 3; i++) {
7812                         reg = bnx2_reg_rd_ind(bp, addr + i * 4);
7813                         reg = swab32(reg);
7814                         memcpy(&bp->fw_version[j], &reg, 4);
7815                         j += 4;
7816                 }
7817         }
7818
7819         reg = bnx2_shmem_rd(bp, BNX2_PORT_HW_CFG_MAC_UPPER);
7820         bp->mac_addr[0] = (u8) (reg >> 8);
7821         bp->mac_addr[1] = (u8) reg;
7822
7823         reg = bnx2_shmem_rd(bp, BNX2_PORT_HW_CFG_MAC_LOWER);
7824         bp->mac_addr[2] = (u8) (reg >> 24);
7825         bp->mac_addr[3] = (u8) (reg >> 16);
7826         bp->mac_addr[4] = (u8) (reg >> 8);
7827         bp->mac_addr[5] = (u8) reg;
7828
7829         bp->tx_ring_size = MAX_TX_DESC_CNT;
7830         bnx2_set_rx_ring_size(bp, 255);
7831
7832         bp->rx_csum = 1;
7833
7834         bp->tx_quick_cons_trip_int = 20;
7835         bp->tx_quick_cons_trip = 20;
7836         bp->tx_ticks_int = 80;
7837         bp->tx_ticks = 80;
7838
7839         bp->rx_quick_cons_trip_int = 6;
7840         bp->rx_quick_cons_trip = 6;
7841         bp->rx_ticks_int = 18;
7842         bp->rx_ticks = 18;
7843
7844         bp->stats_ticks = USEC_PER_SEC & BNX2_HC_STATS_TICKS_HC_STAT_TICKS;
7845
7846         bp->current_interval = BNX2_TIMER_INTERVAL;
7847
7848         bp->phy_addr = 1;
7849
7850         /* Disable WOL support if we are running on a SERDES chip. */
7851         if (CHIP_NUM(bp) == CHIP_NUM_5709)
7852                 bnx2_get_5709_media(bp);
7853         else if (CHIP_BOND_ID(bp) & CHIP_BOND_ID_SERDES_BIT)
7854                 bp->phy_flags |= BNX2_PHY_FLAG_SERDES;
7855
7856         bp->phy_port = PORT_TP;
7857         if (bp->phy_flags & BNX2_PHY_FLAG_SERDES) {
7858                 bp->phy_port = PORT_FIBRE;
7859                 reg = bnx2_shmem_rd(bp, BNX2_SHARED_HW_CFG_CONFIG);
7860                 if (!(reg & BNX2_SHARED_HW_CFG_GIG_LINK_ON_VAUX)) {
7861                         bp->flags |= BNX2_FLAG_NO_WOL;
7862                         bp->wol = 0;
7863                 }
7864                 if (CHIP_NUM(bp) == CHIP_NUM_5706) {
7865                         /* Don't do parallel detect on this board because of
7866                          * some board problems.  The link will not go down
7867                          * if we do parallel detect.
7868                          */
7869                         if (pdev->subsystem_vendor == PCI_VENDOR_ID_HP &&
7870                             pdev->subsystem_device == 0x310c)
7871                                 bp->phy_flags |= BNX2_PHY_FLAG_NO_PARALLEL;
7872                 } else {
7873                         bp->phy_addr = 2;
7874                         if (reg & BNX2_SHARED_HW_CFG_PHY_2_5G)
7875                                 bp->phy_flags |= BNX2_PHY_FLAG_2_5G_CAPABLE;
7876                 }
7877         } else if (CHIP_NUM(bp) == CHIP_NUM_5706 ||
7878                    CHIP_NUM(bp) == CHIP_NUM_5708)
7879                 bp->phy_flags |= BNX2_PHY_FLAG_CRC_FIX;
7880         else if (CHIP_NUM(bp) == CHIP_NUM_5709 &&
7881                  (CHIP_REV(bp) == CHIP_REV_Ax ||
7882                   CHIP_REV(bp) == CHIP_REV_Bx))
7883                 bp->phy_flags |= BNX2_PHY_FLAG_DIS_EARLY_DAC;
7884
7885         bnx2_init_fw_cap(bp);
7886
7887         if ((CHIP_ID(bp) == CHIP_ID_5708_A0) ||
7888             (CHIP_ID(bp) == CHIP_ID_5708_B0) ||
7889             (CHIP_ID(bp) == CHIP_ID_5708_B1) ||
7890             !(REG_RD(bp, BNX2_PCI_CONFIG_3) & BNX2_PCI_CONFIG_3_VAUX_PRESET)) {
7891                 bp->flags |= BNX2_FLAG_NO_WOL;
7892                 bp->wol = 0;
7893         }
7894
7895         if (CHIP_ID(bp) == CHIP_ID_5706_A0) {
7896                 bp->tx_quick_cons_trip_int =
7897                         bp->tx_quick_cons_trip;
7898                 bp->tx_ticks_int = bp->tx_ticks;
7899                 bp->rx_quick_cons_trip_int =
7900                         bp->rx_quick_cons_trip;
7901                 bp->rx_ticks_int = bp->rx_ticks;
7902                 bp->comp_prod_trip_int = bp->comp_prod_trip;
7903                 bp->com_ticks_int = bp->com_ticks;
7904                 bp->cmd_ticks_int = bp->cmd_ticks;
7905         }
7906
7907         /* Disable MSI on 5706 if AMD 8132 bridge is found.
7908          *
7909          * MSI is defined to be 32-bit write.  The 5706 does 64-bit MSI writes
7910          * with byte enables disabled on the unused 32-bit word.  This is legal
7911          * but causes problems on the AMD 8132 which will eventually stop
7912          * responding after a while.
7913          *
7914          * AMD believes this incompatibility is unique to the 5706, and
7915          * prefers to locally disable MSI rather than globally disabling it.
7916          */
7917         if (CHIP_NUM(bp) == CHIP_NUM_5706 && disable_msi == 0) {
7918                 struct pci_dev *amd_8132 = NULL;
7919
7920                 while ((amd_8132 = pci_get_device(PCI_VENDOR_ID_AMD,
7921                                                   PCI_DEVICE_ID_AMD_8132_BRIDGE,
7922                                                   amd_8132))) {
7923
7924                         if (amd_8132->revision >= 0x10 &&
7925                             amd_8132->revision <= 0x13) {
7926                                 disable_msi = 1;
7927                                 pci_dev_put(amd_8132);
7928                                 break;
7929                         }
7930                 }
7931         }
7932
7933         bnx2_set_default_link(bp);
7934         bp->req_flow_ctrl = FLOW_CTRL_RX | FLOW_CTRL_TX;
7935
7936         init_timer(&bp->timer);
7937         bp->timer.expires = RUN_AT(BNX2_TIMER_INTERVAL);
7938         bp->timer.data = (unsigned long) bp;
7939         bp->timer.function = bnx2_timer;
7940
7941         return 0;
7942
7943 err_out_unmap:
7944         if (bp->regview) {
7945                 iounmap(bp->regview);
7946                 bp->regview = NULL;
7947         }
7948
7949 err_out_release:
7950         pci_release_regions(pdev);
7951
7952 err_out_disable:
7953         pci_disable_device(pdev);
7954         pci_set_drvdata(pdev, NULL);
7955
7956 err_out:
7957         return rc;
7958 }
7959
7960 static char * __devinit
7961 bnx2_bus_string(struct bnx2 *bp, char *str)
7962 {
7963         char *s = str;
7964
7965         if (bp->flags & BNX2_FLAG_PCIE) {
7966                 s += sprintf(s, "PCI Express");
7967         } else {
7968                 s += sprintf(s, "PCI");
7969                 if (bp->flags & BNX2_FLAG_PCIX)
7970                         s += sprintf(s, "-X");
7971                 if (bp->flags & BNX2_FLAG_PCI_32BIT)
7972                         s += sprintf(s, " 32-bit");
7973                 else
7974                         s += sprintf(s, " 64-bit");
7975                 s += sprintf(s, " %dMHz", bp->bus_speed_mhz);
7976         }
7977         return str;
7978 }
7979
7980 static void __devinit
7981 bnx2_init_napi(struct bnx2 *bp)
7982 {
7983         int i;
7984
7985         for (i = 0; i < BNX2_MAX_MSIX_VEC; i++) {
7986                 struct bnx2_napi *bnapi = &bp->bnx2_napi[i];
7987                 int (*poll)(struct napi_struct *, int);
7988
7989                 if (i == 0)
7990                         poll = bnx2_poll;
7991                 else
7992                         poll = bnx2_poll_msix;
7993
7994                 netif_napi_add(bp->dev, &bp->bnx2_napi[i].napi, poll, 64);
7995                 bnapi->bp = bp;
7996         }
7997 }
7998
7999 static const struct net_device_ops bnx2_netdev_ops = {
8000         .ndo_open               = bnx2_open,
8001         .ndo_start_xmit         = bnx2_start_xmit,
8002         .ndo_stop               = bnx2_close,
8003         .ndo_get_stats          = bnx2_get_stats,
8004         .ndo_set_rx_mode        = bnx2_set_rx_mode,
8005         .ndo_do_ioctl           = bnx2_ioctl,
8006         .ndo_validate_addr      = eth_validate_addr,
8007         .ndo_set_mac_address    = bnx2_change_mac_addr,
8008         .ndo_change_mtu         = bnx2_change_mtu,
8009         .ndo_tx_timeout         = bnx2_tx_timeout,
8010 #ifdef BCM_VLAN
8011         .ndo_vlan_rx_register   = bnx2_vlan_rx_register,
8012 #endif
8013 #if defined(HAVE_POLL_CONTROLLER) || defined(CONFIG_NET_POLL_CONTROLLER)
8014         .ndo_poll_controller    = poll_bnx2,
8015 #endif
8016 };
8017
8018 static int __devinit
8019 bnx2_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
8020 {
8021         static int version_printed = 0;
8022         struct net_device *dev = NULL;
8023         struct bnx2 *bp;
8024         int rc;
8025         char str[40];
8026
8027         if (version_printed++ == 0)
8028                 printk(KERN_INFO "%s", version);
8029
8030         /* dev zeroed in init_etherdev */
8031         dev = alloc_etherdev_mq(sizeof(*bp), TX_MAX_RINGS);
8032
8033         if (!dev)
8034                 return -ENOMEM;
8035
8036         rc = bnx2_init_board(pdev, dev);
8037         if (rc < 0) {
8038                 free_netdev(dev);
8039                 return rc;
8040         }
8041
8042         dev->netdev_ops = &bnx2_netdev_ops;
8043         dev->watchdog_timeo = TX_TIMEOUT;
8044         dev->ethtool_ops = &bnx2_ethtool_ops;
8045
8046         bp = netdev_priv(dev);
8047         bnx2_init_napi(bp);
8048
8049         pci_set_drvdata(pdev, dev);
8050
8051         rc = bnx2_request_firmware(bp);
8052         if (rc)
8053                 goto error;
8054
8055         memcpy(dev->dev_addr, bp->mac_addr, 6);
8056         memcpy(dev->perm_addr, bp->mac_addr, 6);
8057
8058         dev->features |= NETIF_F_IP_CSUM | NETIF_F_SG;
8059         if (CHIP_NUM(bp) == CHIP_NUM_5709)
8060                 dev->features |= NETIF_F_IPV6_CSUM;
8061
8062 #ifdef BCM_VLAN
8063         dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
8064 #endif
8065         dev->features |= NETIF_F_TSO | NETIF_F_TSO_ECN;
8066         if (CHIP_NUM(bp) == CHIP_NUM_5709)
8067                 dev->features |= NETIF_F_TSO6;
8068
8069         if ((rc = register_netdev(dev))) {
8070                 dev_err(&pdev->dev, "Cannot register net device\n");
8071                 goto error;
8072         }
8073
8074         printk(KERN_INFO "%s: %s (%c%d) %s found at mem %lx, "
8075                 "IRQ %d, node addr %pM\n",
8076                 dev->name,
8077                 board_info[ent->driver_data].name,
8078                 ((CHIP_ID(bp) & 0xf000) >> 12) + 'A',
8079                 ((CHIP_ID(bp) & 0x0ff0) >> 4),
8080                 bnx2_bus_string(bp, str),
8081                 dev->base_addr,
8082                 bp->pdev->irq, dev->dev_addr);
8083
8084         return 0;
8085
8086 error:
8087         if (bp->mips_firmware)
8088                 release_firmware(bp->mips_firmware);
8089         if (bp->rv2p_firmware)
8090                 release_firmware(bp->rv2p_firmware);
8091
8092         if (bp->regview)
8093                 iounmap(bp->regview);
8094         pci_release_regions(pdev);
8095         pci_disable_device(pdev);
8096         pci_set_drvdata(pdev, NULL);
8097         free_netdev(dev);
8098         return rc;
8099 }
8100
8101 static void __devexit
8102 bnx2_remove_one(struct pci_dev *pdev)
8103 {
8104         struct net_device *dev = pci_get_drvdata(pdev);
8105         struct bnx2 *bp = netdev_priv(dev);
8106
8107         flush_scheduled_work();
8108
8109         unregister_netdev(dev);
8110
8111         if (bp->mips_firmware)
8112                 release_firmware(bp->mips_firmware);
8113         if (bp->rv2p_firmware)
8114                 release_firmware(bp->rv2p_firmware);
8115
8116         if (bp->regview)
8117                 iounmap(bp->regview);
8118
8119         free_netdev(dev);
8120         pci_release_regions(pdev);
8121         pci_disable_device(pdev);
8122         pci_set_drvdata(pdev, NULL);
8123 }
8124
8125 static int
8126 bnx2_suspend(struct pci_dev *pdev, pm_message_t state)
8127 {
8128         struct net_device *dev = pci_get_drvdata(pdev);
8129         struct bnx2 *bp = netdev_priv(dev);
8130
8131         /* PCI register 4 needs to be saved whether netif_running() or not.
8132          * MSI address and data need to be saved if using MSI and
8133          * netif_running().
8134          */
8135         pci_save_state(pdev);
8136         if (!netif_running(dev))
8137                 return 0;
8138
8139         flush_scheduled_work();
8140         bnx2_netif_stop(bp);
8141         netif_device_detach(dev);
8142         del_timer_sync(&bp->timer);
8143         bnx2_shutdown_chip(bp);
8144         bnx2_free_skbs(bp);
8145         bnx2_set_power_state(bp, pci_choose_state(pdev, state));
8146         return 0;
8147 }
8148
8149 static int
8150 bnx2_resume(struct pci_dev *pdev)
8151 {
8152         struct net_device *dev = pci_get_drvdata(pdev);
8153         struct bnx2 *bp = netdev_priv(dev);
8154
8155         pci_restore_state(pdev);
8156         if (!netif_running(dev))
8157                 return 0;
8158
8159         bnx2_set_power_state(bp, PCI_D0);
8160         netif_device_attach(dev);
8161         bnx2_init_nic(bp, 1);
8162         bnx2_netif_start(bp);
8163         return 0;
8164 }
8165
8166 /**
8167  * bnx2_io_error_detected - called when PCI error is detected
8168  * @pdev: Pointer to PCI device
8169  * @state: The current pci connection state
8170  *
8171  * This function is called after a PCI bus error affecting
8172  * this device has been detected.
8173  */
8174 static pci_ers_result_t bnx2_io_error_detected(struct pci_dev *pdev,
8175                                                pci_channel_state_t state)
8176 {
8177         struct net_device *dev = pci_get_drvdata(pdev);
8178         struct bnx2 *bp = netdev_priv(dev);
8179
8180         rtnl_lock();
8181         netif_device_detach(dev);
8182
8183         if (netif_running(dev)) {
8184                 bnx2_netif_stop(bp);
8185                 del_timer_sync(&bp->timer);
8186                 bnx2_reset_nic(bp, BNX2_DRV_MSG_CODE_RESET);
8187         }
8188
8189         pci_disable_device(pdev);
8190         rtnl_unlock();
8191
8192         /* Request a slot slot reset. */
8193         return PCI_ERS_RESULT_NEED_RESET;
8194 }
8195
8196 /**
8197  * bnx2_io_slot_reset - called after the pci bus has been reset.
8198  * @pdev: Pointer to PCI device
8199  *
8200  * Restart the card from scratch, as if from a cold-boot.
8201  */
8202 static pci_ers_result_t bnx2_io_slot_reset(struct pci_dev *pdev)
8203 {
8204         struct net_device *dev = pci_get_drvdata(pdev);
8205         struct bnx2 *bp = netdev_priv(dev);
8206
8207         rtnl_lock();
8208         if (pci_enable_device(pdev)) {
8209                 dev_err(&pdev->dev,
8210                         "Cannot re-enable PCI device after reset.\n");
8211                 rtnl_unlock();
8212                 return PCI_ERS_RESULT_DISCONNECT;
8213         }
8214         pci_set_master(pdev);
8215         pci_restore_state(pdev);
8216
8217         if (netif_running(dev)) {
8218                 bnx2_set_power_state(bp, PCI_D0);
8219                 bnx2_init_nic(bp, 1);
8220         }
8221
8222         rtnl_unlock();
8223         return PCI_ERS_RESULT_RECOVERED;
8224 }
8225
8226 /**
8227  * bnx2_io_resume - called when traffic can start flowing again.
8228  * @pdev: Pointer to PCI device
8229  *
8230  * This callback is called when the error recovery driver tells us that
8231  * its OK to resume normal operation.
8232  */
8233 static void bnx2_io_resume(struct pci_dev *pdev)
8234 {
8235         struct net_device *dev = pci_get_drvdata(pdev);
8236         struct bnx2 *bp = netdev_priv(dev);
8237
8238         rtnl_lock();
8239         if (netif_running(dev))
8240                 bnx2_netif_start(bp);
8241
8242         netif_device_attach(dev);
8243         rtnl_unlock();
8244 }
8245
8246 static struct pci_error_handlers bnx2_err_handler = {
8247         .error_detected = bnx2_io_error_detected,
8248         .slot_reset     = bnx2_io_slot_reset,
8249         .resume         = bnx2_io_resume,
8250 };
8251
8252 static struct pci_driver bnx2_pci_driver = {
8253         .name           = DRV_MODULE_NAME,
8254         .id_table       = bnx2_pci_tbl,
8255         .probe          = bnx2_init_one,
8256         .remove         = __devexit_p(bnx2_remove_one),
8257         .suspend        = bnx2_suspend,
8258         .resume         = bnx2_resume,
8259         .err_handler    = &bnx2_err_handler,
8260 };
8261
8262 static int __init bnx2_init(void)
8263 {
8264         return pci_register_driver(&bnx2_pci_driver);
8265 }
8266
8267 static void __exit bnx2_cleanup(void)
8268 {
8269         pci_unregister_driver(&bnx2_pci_driver);
8270 }
8271
8272 module_init(bnx2_init);
8273 module_exit(bnx2_cleanup);
8274
8275
8276