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