]> Pileus Git - ~andy/linux/blob - drivers/net/bnx2.c
[BNX2]: Improve SerDes handling.
[~andy/linux] / drivers / net / bnx2.c
1 /* bnx2.c: Broadcom NX2 network driver.
2  *
3  * Copyright (c) 2004, 2005, 2006 Broadcom Corporation
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation.
8  *
9  * Written by: Michael Chan  (mchan@broadcom.com)
10  */
11
12
13 #include <linux/module.h>
14 #include <linux/moduleparam.h>
15
16 #include <linux/kernel.h>
17 #include <linux/timer.h>
18 #include <linux/errno.h>
19 #include <linux/ioport.h>
20 #include <linux/slab.h>
21 #include <linux/vmalloc.h>
22 #include <linux/interrupt.h>
23 #include <linux/pci.h>
24 #include <linux/init.h>
25 #include <linux/netdevice.h>
26 #include <linux/etherdevice.h>
27 #include <linux/skbuff.h>
28 #include <linux/dma-mapping.h>
29 #include <asm/bitops.h>
30 #include <asm/io.h>
31 #include <asm/irq.h>
32 #include <linux/delay.h>
33 #include <asm/byteorder.h>
34 #include <asm/page.h>
35 #include <linux/time.h>
36 #include <linux/ethtool.h>
37 #include <linux/mii.h>
38 #ifdef NETIF_F_HW_VLAN_TX
39 #include <linux/if_vlan.h>
40 #define BCM_VLAN 1
41 #endif
42 #ifdef NETIF_F_TSO
43 #include <net/ip.h>
44 #include <net/tcp.h>
45 #include <net/checksum.h>
46 #define BCM_TSO 1
47 #endif
48 #include <linux/workqueue.h>
49 #include <linux/crc32.h>
50 #include <linux/prefetch.h>
51 #include <linux/cache.h>
52 #include <linux/zlib.h>
53
54 #include "bnx2.h"
55 #include "bnx2_fw.h"
56
57 #define DRV_MODULE_NAME         "bnx2"
58 #define PFX DRV_MODULE_NAME     ": "
59 #define DRV_MODULE_VERSION      "1.4.45"
60 #define DRV_MODULE_RELDATE      "September 29, 2006"
61
62 #define RUN_AT(x) (jiffies + (x))
63
64 /* Time in jiffies before concluding the transmitter is hung. */
65 #define TX_TIMEOUT  (5*HZ)
66
67 static const char version[] __devinitdata =
68         "Broadcom NetXtreme II Gigabit Ethernet Driver " DRV_MODULE_NAME " v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n";
69
70 MODULE_AUTHOR("Michael Chan <mchan@broadcom.com>");
71 MODULE_DESCRIPTION("Broadcom NetXtreme II BCM5706/5708 Driver");
72 MODULE_LICENSE("GPL");
73 MODULE_VERSION(DRV_MODULE_VERSION);
74
75 static int disable_msi = 0;
76
77 module_param(disable_msi, int, 0);
78 MODULE_PARM_DESC(disable_msi, "Disable Message Signaled Interrupt (MSI)");
79
80 typedef enum {
81         BCM5706 = 0,
82         NC370T,
83         NC370I,
84         BCM5706S,
85         NC370F,
86         BCM5708,
87         BCM5708S,
88 } board_t;
89
90 /* indexed by board_t, above */
91 static const struct {
92         char *name;
93 } board_info[] __devinitdata = {
94         { "Broadcom NetXtreme II BCM5706 1000Base-T" },
95         { "HP NC370T Multifunction Gigabit Server Adapter" },
96         { "HP NC370i Multifunction Gigabit Server Adapter" },
97         { "Broadcom NetXtreme II BCM5706 1000Base-SX" },
98         { "HP NC370F Multifunction Gigabit Server Adapter" },
99         { "Broadcom NetXtreme II BCM5708 1000Base-T" },
100         { "Broadcom NetXtreme II BCM5708 1000Base-SX" },
101         };
102
103 static struct pci_device_id bnx2_pci_tbl[] = {
104         { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_5706,
105           PCI_VENDOR_ID_HP, 0x3101, 0, 0, NC370T },
106         { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_5706,
107           PCI_VENDOR_ID_HP, 0x3106, 0, 0, NC370I },
108         { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_5706,
109           PCI_ANY_ID, PCI_ANY_ID, 0, 0, BCM5706 },
110         { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_5708,
111           PCI_ANY_ID, PCI_ANY_ID, 0, 0, BCM5708 },
112         { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_5706S,
113           PCI_VENDOR_ID_HP, 0x3102, 0, 0, NC370F },
114         { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_5706S,
115           PCI_ANY_ID, PCI_ANY_ID, 0, 0, BCM5706S },
116         { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_5708S,
117           PCI_ANY_ID, PCI_ANY_ID, 0, 0, BCM5708S },
118         { 0, }
119 };
120
121 static struct flash_spec flash_table[] =
122 {
123         /* Slow EEPROM */
124         {0x00000000, 0x40830380, 0x009f0081, 0xa184a053, 0xaf000400,
125          1, SEEPROM_PAGE_BITS, SEEPROM_PAGE_SIZE,
126          SEEPROM_BYTE_ADDR_MASK, SEEPROM_TOTAL_SIZE,
127          "EEPROM - slow"},
128         /* Expansion entry 0001 */
129         {0x08000002, 0x4b808201, 0x00050081, 0x03840253, 0xaf020406,
130          0, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE,
131          SAIFUN_FLASH_BYTE_ADDR_MASK, 0,
132          "Entry 0001"},
133         /* Saifun SA25F010 (non-buffered flash) */
134         /* strap, cfg1, & write1 need updates */
135         {0x04000001, 0x47808201, 0x00050081, 0x03840253, 0xaf020406,
136          0, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE,
137          SAIFUN_FLASH_BYTE_ADDR_MASK, SAIFUN_FLASH_BASE_TOTAL_SIZE*2,
138          "Non-buffered flash (128kB)"},
139         /* Saifun SA25F020 (non-buffered flash) */
140         /* strap, cfg1, & write1 need updates */
141         {0x0c000003, 0x4f808201, 0x00050081, 0x03840253, 0xaf020406,
142          0, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE,
143          SAIFUN_FLASH_BYTE_ADDR_MASK, SAIFUN_FLASH_BASE_TOTAL_SIZE*4,
144          "Non-buffered flash (256kB)"},
145         /* Expansion entry 0100 */
146         {0x11000000, 0x53808201, 0x00050081, 0x03840253, 0xaf020406,
147          0, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE,
148          SAIFUN_FLASH_BYTE_ADDR_MASK, 0,
149          "Entry 0100"},
150         /* Entry 0101: ST M45PE10 (non-buffered flash, TetonII B0) */
151         {0x19000002, 0x5b808201, 0x000500db, 0x03840253, 0xaf020406,
152          0, ST_MICRO_FLASH_PAGE_BITS, ST_MICRO_FLASH_PAGE_SIZE,
153          ST_MICRO_FLASH_BYTE_ADDR_MASK, ST_MICRO_FLASH_BASE_TOTAL_SIZE*2,
154          "Entry 0101: ST M45PE10 (128kB non-bufferred)"},
155         /* Entry 0110: ST M45PE20 (non-buffered flash)*/
156         {0x15000001, 0x57808201, 0x000500db, 0x03840253, 0xaf020406,
157          0, ST_MICRO_FLASH_PAGE_BITS, ST_MICRO_FLASH_PAGE_SIZE,
158          ST_MICRO_FLASH_BYTE_ADDR_MASK, ST_MICRO_FLASH_BASE_TOTAL_SIZE*4,
159          "Entry 0110: ST M45PE20 (256kB non-bufferred)"},
160         /* Saifun SA25F005 (non-buffered flash) */
161         /* strap, cfg1, & write1 need updates */
162         {0x1d000003, 0x5f808201, 0x00050081, 0x03840253, 0xaf020406,
163          0, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE,
164          SAIFUN_FLASH_BYTE_ADDR_MASK, SAIFUN_FLASH_BASE_TOTAL_SIZE,
165          "Non-buffered flash (64kB)"},
166         /* Fast EEPROM */
167         {0x22000000, 0x62808380, 0x009f0081, 0xa184a053, 0xaf000400,
168          1, SEEPROM_PAGE_BITS, SEEPROM_PAGE_SIZE,
169          SEEPROM_BYTE_ADDR_MASK, SEEPROM_TOTAL_SIZE,
170          "EEPROM - fast"},
171         /* Expansion entry 1001 */
172         {0x2a000002, 0x6b808201, 0x00050081, 0x03840253, 0xaf020406,
173          0, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE,
174          SAIFUN_FLASH_BYTE_ADDR_MASK, 0,
175          "Entry 1001"},
176         /* Expansion entry 1010 */
177         {0x26000001, 0x67808201, 0x00050081, 0x03840253, 0xaf020406,
178          0, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE,
179          SAIFUN_FLASH_BYTE_ADDR_MASK, 0,
180          "Entry 1010"},
181         /* ATMEL AT45DB011B (buffered flash) */
182         {0x2e000003, 0x6e808273, 0x00570081, 0x68848353, 0xaf000400,
183          1, BUFFERED_FLASH_PAGE_BITS, BUFFERED_FLASH_PAGE_SIZE,
184          BUFFERED_FLASH_BYTE_ADDR_MASK, BUFFERED_FLASH_TOTAL_SIZE,
185          "Buffered flash (128kB)"},
186         /* Expansion entry 1100 */
187         {0x33000000, 0x73808201, 0x00050081, 0x03840253, 0xaf020406,
188          0, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE,
189          SAIFUN_FLASH_BYTE_ADDR_MASK, 0,
190          "Entry 1100"},
191         /* Expansion entry 1101 */
192         {0x3b000002, 0x7b808201, 0x00050081, 0x03840253, 0xaf020406,
193          0, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE,
194          SAIFUN_FLASH_BYTE_ADDR_MASK, 0,
195          "Entry 1101"},
196         /* Ateml Expansion entry 1110 */
197         {0x37000001, 0x76808273, 0x00570081, 0x68848353, 0xaf000400,
198          1, BUFFERED_FLASH_PAGE_BITS, BUFFERED_FLASH_PAGE_SIZE,
199          BUFFERED_FLASH_BYTE_ADDR_MASK, 0,
200          "Entry 1110 (Atmel)"},
201         /* ATMEL AT45DB021B (buffered flash) */
202         {0x3f000003, 0x7e808273, 0x00570081, 0x68848353, 0xaf000400,
203          1, BUFFERED_FLASH_PAGE_BITS, BUFFERED_FLASH_PAGE_SIZE,
204          BUFFERED_FLASH_BYTE_ADDR_MASK, BUFFERED_FLASH_TOTAL_SIZE*2,
205          "Buffered flash (256kB)"},
206 };
207
208 MODULE_DEVICE_TABLE(pci, bnx2_pci_tbl);
209
210 static inline u32 bnx2_tx_avail(struct bnx2 *bp)
211 {
212         u32 diff;
213
214         smp_mb();
215         diff = TX_RING_IDX(bp->tx_prod) - TX_RING_IDX(bp->tx_cons);
216         if (diff > MAX_TX_DESC_CNT)
217                 diff = (diff & MAX_TX_DESC_CNT) - 1;
218         return (bp->tx_ring_size - diff);
219 }
220
221 static u32
222 bnx2_reg_rd_ind(struct bnx2 *bp, u32 offset)
223 {
224         REG_WR(bp, BNX2_PCICFG_REG_WINDOW_ADDRESS, offset);
225         return (REG_RD(bp, BNX2_PCICFG_REG_WINDOW));
226 }
227
228 static void
229 bnx2_reg_wr_ind(struct bnx2 *bp, u32 offset, u32 val)
230 {
231         REG_WR(bp, BNX2_PCICFG_REG_WINDOW_ADDRESS, offset);
232         REG_WR(bp, BNX2_PCICFG_REG_WINDOW, val);
233 }
234
235 static void
236 bnx2_ctx_wr(struct bnx2 *bp, u32 cid_addr, u32 offset, u32 val)
237 {
238         offset += cid_addr;
239         REG_WR(bp, BNX2_CTX_DATA_ADR, offset);
240         REG_WR(bp, BNX2_CTX_DATA, val);
241 }
242
243 static int
244 bnx2_read_phy(struct bnx2 *bp, u32 reg, u32 *val)
245 {
246         u32 val1;
247         int i, ret;
248
249         if (bp->phy_flags & PHY_INT_MODE_AUTO_POLLING_FLAG) {
250                 val1 = REG_RD(bp, BNX2_EMAC_MDIO_MODE);
251                 val1 &= ~BNX2_EMAC_MDIO_MODE_AUTO_POLL;
252
253                 REG_WR(bp, BNX2_EMAC_MDIO_MODE, val1);
254                 REG_RD(bp, BNX2_EMAC_MDIO_MODE);
255
256                 udelay(40);
257         }
258
259         val1 = (bp->phy_addr << 21) | (reg << 16) |
260                 BNX2_EMAC_MDIO_COMM_COMMAND_READ | BNX2_EMAC_MDIO_COMM_DISEXT |
261                 BNX2_EMAC_MDIO_COMM_START_BUSY;
262         REG_WR(bp, BNX2_EMAC_MDIO_COMM, val1);
263
264         for (i = 0; i < 50; i++) {
265                 udelay(10);
266
267                 val1 = REG_RD(bp, BNX2_EMAC_MDIO_COMM);
268                 if (!(val1 & BNX2_EMAC_MDIO_COMM_START_BUSY)) {
269                         udelay(5);
270
271                         val1 = REG_RD(bp, BNX2_EMAC_MDIO_COMM);
272                         val1 &= BNX2_EMAC_MDIO_COMM_DATA;
273
274                         break;
275                 }
276         }
277
278         if (val1 & BNX2_EMAC_MDIO_COMM_START_BUSY) {
279                 *val = 0x0;
280                 ret = -EBUSY;
281         }
282         else {
283                 *val = val1;
284                 ret = 0;
285         }
286
287         if (bp->phy_flags & PHY_INT_MODE_AUTO_POLLING_FLAG) {
288                 val1 = REG_RD(bp, BNX2_EMAC_MDIO_MODE);
289                 val1 |= BNX2_EMAC_MDIO_MODE_AUTO_POLL;
290
291                 REG_WR(bp, BNX2_EMAC_MDIO_MODE, val1);
292                 REG_RD(bp, BNX2_EMAC_MDIO_MODE);
293
294                 udelay(40);
295         }
296
297         return ret;
298 }
299
300 static int
301 bnx2_write_phy(struct bnx2 *bp, u32 reg, u32 val)
302 {
303         u32 val1;
304         int i, ret;
305
306         if (bp->phy_flags & PHY_INT_MODE_AUTO_POLLING_FLAG) {
307                 val1 = REG_RD(bp, BNX2_EMAC_MDIO_MODE);
308                 val1 &= ~BNX2_EMAC_MDIO_MODE_AUTO_POLL;
309
310                 REG_WR(bp, BNX2_EMAC_MDIO_MODE, val1);
311                 REG_RD(bp, BNX2_EMAC_MDIO_MODE);
312
313                 udelay(40);
314         }
315
316         val1 = (bp->phy_addr << 21) | (reg << 16) | val |
317                 BNX2_EMAC_MDIO_COMM_COMMAND_WRITE |
318                 BNX2_EMAC_MDIO_COMM_START_BUSY | BNX2_EMAC_MDIO_COMM_DISEXT;
319         REG_WR(bp, BNX2_EMAC_MDIO_COMM, val1);
320
321         for (i = 0; i < 50; i++) {
322                 udelay(10);
323
324                 val1 = REG_RD(bp, BNX2_EMAC_MDIO_COMM);
325                 if (!(val1 & BNX2_EMAC_MDIO_COMM_START_BUSY)) {
326                         udelay(5);
327                         break;
328                 }
329         }
330
331         if (val1 & BNX2_EMAC_MDIO_COMM_START_BUSY)
332                 ret = -EBUSY;
333         else
334                 ret = 0;
335
336         if (bp->phy_flags & PHY_INT_MODE_AUTO_POLLING_FLAG) {
337                 val1 = REG_RD(bp, BNX2_EMAC_MDIO_MODE);
338                 val1 |= BNX2_EMAC_MDIO_MODE_AUTO_POLL;
339
340                 REG_WR(bp, BNX2_EMAC_MDIO_MODE, val1);
341                 REG_RD(bp, BNX2_EMAC_MDIO_MODE);
342
343                 udelay(40);
344         }
345
346         return ret;
347 }
348
349 static void
350 bnx2_disable_int(struct bnx2 *bp)
351 {
352         REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD,
353                BNX2_PCICFG_INT_ACK_CMD_MASK_INT);
354         REG_RD(bp, BNX2_PCICFG_INT_ACK_CMD);
355 }
356
357 static void
358 bnx2_enable_int(struct bnx2 *bp)
359 {
360         REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD,
361                BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID |
362                BNX2_PCICFG_INT_ACK_CMD_MASK_INT | bp->last_status_idx);
363
364         REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD,
365                BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID | bp->last_status_idx);
366
367         REG_WR(bp, BNX2_HC_COMMAND, bp->hc_cmd | BNX2_HC_COMMAND_COAL_NOW);
368 }
369
370 static void
371 bnx2_disable_int_sync(struct bnx2 *bp)
372 {
373         atomic_inc(&bp->intr_sem);
374         bnx2_disable_int(bp);
375         synchronize_irq(bp->pdev->irq);
376 }
377
378 static void
379 bnx2_netif_stop(struct bnx2 *bp)
380 {
381         bnx2_disable_int_sync(bp);
382         if (netif_running(bp->dev)) {
383                 netif_poll_disable(bp->dev);
384                 netif_tx_disable(bp->dev);
385                 bp->dev->trans_start = jiffies; /* prevent tx timeout */
386         }
387 }
388
389 static void
390 bnx2_netif_start(struct bnx2 *bp)
391 {
392         if (atomic_dec_and_test(&bp->intr_sem)) {
393                 if (netif_running(bp->dev)) {
394                         netif_wake_queue(bp->dev);
395                         netif_poll_enable(bp->dev);
396                         bnx2_enable_int(bp);
397                 }
398         }
399 }
400
401 static void
402 bnx2_free_mem(struct bnx2 *bp)
403 {
404         int i;
405
406         if (bp->status_blk) {
407                 pci_free_consistent(bp->pdev, bp->status_stats_size,
408                                     bp->status_blk, bp->status_blk_mapping);
409                 bp->status_blk = NULL;
410                 bp->stats_blk = NULL;
411         }
412         if (bp->tx_desc_ring) {
413                 pci_free_consistent(bp->pdev,
414                                     sizeof(struct tx_bd) * TX_DESC_CNT,
415                                     bp->tx_desc_ring, bp->tx_desc_mapping);
416                 bp->tx_desc_ring = NULL;
417         }
418         kfree(bp->tx_buf_ring);
419         bp->tx_buf_ring = NULL;
420         for (i = 0; i < bp->rx_max_ring; i++) {
421                 if (bp->rx_desc_ring[i])
422                         pci_free_consistent(bp->pdev,
423                                             sizeof(struct rx_bd) * RX_DESC_CNT,
424                                             bp->rx_desc_ring[i],
425                                             bp->rx_desc_mapping[i]);
426                 bp->rx_desc_ring[i] = NULL;
427         }
428         vfree(bp->rx_buf_ring);
429         bp->rx_buf_ring = NULL;
430 }
431
432 static int
433 bnx2_alloc_mem(struct bnx2 *bp)
434 {
435         int i, status_blk_size;
436
437         bp->tx_buf_ring = kzalloc(sizeof(struct sw_bd) * TX_DESC_CNT,
438                                   GFP_KERNEL);
439         if (bp->tx_buf_ring == NULL)
440                 return -ENOMEM;
441
442         bp->tx_desc_ring = pci_alloc_consistent(bp->pdev,
443                                                 sizeof(struct tx_bd) *
444                                                 TX_DESC_CNT,
445                                                 &bp->tx_desc_mapping);
446         if (bp->tx_desc_ring == NULL)
447                 goto alloc_mem_err;
448
449         bp->rx_buf_ring = vmalloc(sizeof(struct sw_bd) * RX_DESC_CNT *
450                                   bp->rx_max_ring);
451         if (bp->rx_buf_ring == NULL)
452                 goto alloc_mem_err;
453
454         memset(bp->rx_buf_ring, 0, sizeof(struct sw_bd) * RX_DESC_CNT *
455                                    bp->rx_max_ring);
456
457         for (i = 0; i < bp->rx_max_ring; i++) {
458                 bp->rx_desc_ring[i] =
459                         pci_alloc_consistent(bp->pdev,
460                                              sizeof(struct rx_bd) * RX_DESC_CNT,
461                                              &bp->rx_desc_mapping[i]);
462                 if (bp->rx_desc_ring[i] == NULL)
463                         goto alloc_mem_err;
464
465         }
466
467         /* Combine status and statistics blocks into one allocation. */
468         status_blk_size = L1_CACHE_ALIGN(sizeof(struct status_block));
469         bp->status_stats_size = status_blk_size +
470                                 sizeof(struct statistics_block);
471
472         bp->status_blk = pci_alloc_consistent(bp->pdev, bp->status_stats_size,
473                                               &bp->status_blk_mapping);
474         if (bp->status_blk == NULL)
475                 goto alloc_mem_err;
476
477         memset(bp->status_blk, 0, bp->status_stats_size);
478
479         bp->stats_blk = (void *) ((unsigned long) bp->status_blk +
480                                   status_blk_size);
481
482         bp->stats_blk_mapping = bp->status_blk_mapping + status_blk_size;
483
484         return 0;
485
486 alloc_mem_err:
487         bnx2_free_mem(bp);
488         return -ENOMEM;
489 }
490
491 static void
492 bnx2_report_fw_link(struct bnx2 *bp)
493 {
494         u32 fw_link_status = 0;
495
496         if (bp->link_up) {
497                 u32 bmsr;
498
499                 switch (bp->line_speed) {
500                 case SPEED_10:
501                         if (bp->duplex == DUPLEX_HALF)
502                                 fw_link_status = BNX2_LINK_STATUS_10HALF;
503                         else
504                                 fw_link_status = BNX2_LINK_STATUS_10FULL;
505                         break;
506                 case SPEED_100:
507                         if (bp->duplex == DUPLEX_HALF)
508                                 fw_link_status = BNX2_LINK_STATUS_100HALF;
509                         else
510                                 fw_link_status = BNX2_LINK_STATUS_100FULL;
511                         break;
512                 case SPEED_1000:
513                         if (bp->duplex == DUPLEX_HALF)
514                                 fw_link_status = BNX2_LINK_STATUS_1000HALF;
515                         else
516                                 fw_link_status = BNX2_LINK_STATUS_1000FULL;
517                         break;
518                 case SPEED_2500:
519                         if (bp->duplex == DUPLEX_HALF)
520                                 fw_link_status = BNX2_LINK_STATUS_2500HALF;
521                         else
522                                 fw_link_status = BNX2_LINK_STATUS_2500FULL;
523                         break;
524                 }
525
526                 fw_link_status |= BNX2_LINK_STATUS_LINK_UP;
527
528                 if (bp->autoneg) {
529                         fw_link_status |= BNX2_LINK_STATUS_AN_ENABLED;
530
531                         bnx2_read_phy(bp, MII_BMSR, &bmsr);
532                         bnx2_read_phy(bp, MII_BMSR, &bmsr);
533
534                         if (!(bmsr & BMSR_ANEGCOMPLETE) ||
535                             bp->phy_flags & PHY_PARALLEL_DETECT_FLAG)
536                                 fw_link_status |= BNX2_LINK_STATUS_PARALLEL_DET;
537                         else
538                                 fw_link_status |= BNX2_LINK_STATUS_AN_COMPLETE;
539                 }
540         }
541         else
542                 fw_link_status = BNX2_LINK_STATUS_LINK_DOWN;
543
544         REG_WR_IND(bp, bp->shmem_base + BNX2_LINK_STATUS, fw_link_status);
545 }
546
547 static void
548 bnx2_report_link(struct bnx2 *bp)
549 {
550         if (bp->link_up) {
551                 netif_carrier_on(bp->dev);
552                 printk(KERN_INFO PFX "%s NIC Link is Up, ", bp->dev->name);
553
554                 printk("%d Mbps ", bp->line_speed);
555
556                 if (bp->duplex == DUPLEX_FULL)
557                         printk("full duplex");
558                 else
559                         printk("half duplex");
560
561                 if (bp->flow_ctrl) {
562                         if (bp->flow_ctrl & FLOW_CTRL_RX) {
563                                 printk(", receive ");
564                                 if (bp->flow_ctrl & FLOW_CTRL_TX)
565                                         printk("& transmit ");
566                         }
567                         else {
568                                 printk(", transmit ");
569                         }
570                         printk("flow control ON");
571                 }
572                 printk("\n");
573         }
574         else {
575                 netif_carrier_off(bp->dev);
576                 printk(KERN_ERR PFX "%s NIC Link is Down\n", bp->dev->name);
577         }
578
579         bnx2_report_fw_link(bp);
580 }
581
582 static void
583 bnx2_resolve_flow_ctrl(struct bnx2 *bp)
584 {
585         u32 local_adv, remote_adv;
586
587         bp->flow_ctrl = 0;
588         if ((bp->autoneg & (AUTONEG_SPEED | AUTONEG_FLOW_CTRL)) !=
589                 (AUTONEG_SPEED | AUTONEG_FLOW_CTRL)) {
590
591                 if (bp->duplex == DUPLEX_FULL) {
592                         bp->flow_ctrl = bp->req_flow_ctrl;
593                 }
594                 return;
595         }
596
597         if (bp->duplex != DUPLEX_FULL) {
598                 return;
599         }
600
601         if ((bp->phy_flags & PHY_SERDES_FLAG) &&
602             (CHIP_NUM(bp) == CHIP_NUM_5708)) {
603                 u32 val;
604
605                 bnx2_read_phy(bp, BCM5708S_1000X_STAT1, &val);
606                 if (val & BCM5708S_1000X_STAT1_TX_PAUSE)
607                         bp->flow_ctrl |= FLOW_CTRL_TX;
608                 if (val & BCM5708S_1000X_STAT1_RX_PAUSE)
609                         bp->flow_ctrl |= FLOW_CTRL_RX;
610                 return;
611         }
612
613         bnx2_read_phy(bp, MII_ADVERTISE, &local_adv);
614         bnx2_read_phy(bp, MII_LPA, &remote_adv);
615
616         if (bp->phy_flags & PHY_SERDES_FLAG) {
617                 u32 new_local_adv = 0;
618                 u32 new_remote_adv = 0;
619
620                 if (local_adv & ADVERTISE_1000XPAUSE)
621                         new_local_adv |= ADVERTISE_PAUSE_CAP;
622                 if (local_adv & ADVERTISE_1000XPSE_ASYM)
623                         new_local_adv |= ADVERTISE_PAUSE_ASYM;
624                 if (remote_adv & ADVERTISE_1000XPAUSE)
625                         new_remote_adv |= ADVERTISE_PAUSE_CAP;
626                 if (remote_adv & ADVERTISE_1000XPSE_ASYM)
627                         new_remote_adv |= ADVERTISE_PAUSE_ASYM;
628
629                 local_adv = new_local_adv;
630                 remote_adv = new_remote_adv;
631         }
632
633         /* See Table 28B-3 of 802.3ab-1999 spec. */
634         if (local_adv & ADVERTISE_PAUSE_CAP) {
635                 if(local_adv & ADVERTISE_PAUSE_ASYM) {
636                         if (remote_adv & ADVERTISE_PAUSE_CAP) {
637                                 bp->flow_ctrl = FLOW_CTRL_TX | FLOW_CTRL_RX;
638                         }
639                         else if (remote_adv & ADVERTISE_PAUSE_ASYM) {
640                                 bp->flow_ctrl = FLOW_CTRL_RX;
641                         }
642                 }
643                 else {
644                         if (remote_adv & ADVERTISE_PAUSE_CAP) {
645                                 bp->flow_ctrl = FLOW_CTRL_TX | FLOW_CTRL_RX;
646                         }
647                 }
648         }
649         else if (local_adv & ADVERTISE_PAUSE_ASYM) {
650                 if ((remote_adv & ADVERTISE_PAUSE_CAP) &&
651                         (remote_adv & ADVERTISE_PAUSE_ASYM)) {
652
653                         bp->flow_ctrl = FLOW_CTRL_TX;
654                 }
655         }
656 }
657
658 static int
659 bnx2_5708s_linkup(struct bnx2 *bp)
660 {
661         u32 val;
662
663         bp->link_up = 1;
664         bnx2_read_phy(bp, BCM5708S_1000X_STAT1, &val);
665         switch (val & BCM5708S_1000X_STAT1_SPEED_MASK) {
666                 case BCM5708S_1000X_STAT1_SPEED_10:
667                         bp->line_speed = SPEED_10;
668                         break;
669                 case BCM5708S_1000X_STAT1_SPEED_100:
670                         bp->line_speed = SPEED_100;
671                         break;
672                 case BCM5708S_1000X_STAT1_SPEED_1G:
673                         bp->line_speed = SPEED_1000;
674                         break;
675                 case BCM5708S_1000X_STAT1_SPEED_2G5:
676                         bp->line_speed = SPEED_2500;
677                         break;
678         }
679         if (val & BCM5708S_1000X_STAT1_FD)
680                 bp->duplex = DUPLEX_FULL;
681         else
682                 bp->duplex = DUPLEX_HALF;
683
684         return 0;
685 }
686
687 static int
688 bnx2_5706s_linkup(struct bnx2 *bp)
689 {
690         u32 bmcr, local_adv, remote_adv, common;
691
692         bp->link_up = 1;
693         bp->line_speed = SPEED_1000;
694
695         bnx2_read_phy(bp, MII_BMCR, &bmcr);
696         if (bmcr & BMCR_FULLDPLX) {
697                 bp->duplex = DUPLEX_FULL;
698         }
699         else {
700                 bp->duplex = DUPLEX_HALF;
701         }
702
703         if (!(bmcr & BMCR_ANENABLE)) {
704                 return 0;
705         }
706
707         bnx2_read_phy(bp, MII_ADVERTISE, &local_adv);
708         bnx2_read_phy(bp, MII_LPA, &remote_adv);
709
710         common = local_adv & remote_adv;
711         if (common & (ADVERTISE_1000XHALF | ADVERTISE_1000XFULL)) {
712
713                 if (common & ADVERTISE_1000XFULL) {
714                         bp->duplex = DUPLEX_FULL;
715                 }
716                 else {
717                         bp->duplex = DUPLEX_HALF;
718                 }
719         }
720
721         return 0;
722 }
723
724 static int
725 bnx2_copper_linkup(struct bnx2 *bp)
726 {
727         u32 bmcr;
728
729         bnx2_read_phy(bp, MII_BMCR, &bmcr);
730         if (bmcr & BMCR_ANENABLE) {
731                 u32 local_adv, remote_adv, common;
732
733                 bnx2_read_phy(bp, MII_CTRL1000, &local_adv);
734                 bnx2_read_phy(bp, MII_STAT1000, &remote_adv);
735
736                 common = local_adv & (remote_adv >> 2);
737                 if (common & ADVERTISE_1000FULL) {
738                         bp->line_speed = SPEED_1000;
739                         bp->duplex = DUPLEX_FULL;
740                 }
741                 else if (common & ADVERTISE_1000HALF) {
742                         bp->line_speed = SPEED_1000;
743                         bp->duplex = DUPLEX_HALF;
744                 }
745                 else {
746                         bnx2_read_phy(bp, MII_ADVERTISE, &local_adv);
747                         bnx2_read_phy(bp, MII_LPA, &remote_adv);
748
749                         common = local_adv & remote_adv;
750                         if (common & ADVERTISE_100FULL) {
751                                 bp->line_speed = SPEED_100;
752                                 bp->duplex = DUPLEX_FULL;
753                         }
754                         else if (common & ADVERTISE_100HALF) {
755                                 bp->line_speed = SPEED_100;
756                                 bp->duplex = DUPLEX_HALF;
757                         }
758                         else if (common & ADVERTISE_10FULL) {
759                                 bp->line_speed = SPEED_10;
760                                 bp->duplex = DUPLEX_FULL;
761                         }
762                         else if (common & ADVERTISE_10HALF) {
763                                 bp->line_speed = SPEED_10;
764                                 bp->duplex = DUPLEX_HALF;
765                         }
766                         else {
767                                 bp->line_speed = 0;
768                                 bp->link_up = 0;
769                         }
770                 }
771         }
772         else {
773                 if (bmcr & BMCR_SPEED100) {
774                         bp->line_speed = SPEED_100;
775                 }
776                 else {
777                         bp->line_speed = SPEED_10;
778                 }
779                 if (bmcr & BMCR_FULLDPLX) {
780                         bp->duplex = DUPLEX_FULL;
781                 }
782                 else {
783                         bp->duplex = DUPLEX_HALF;
784                 }
785         }
786
787         return 0;
788 }
789
790 static int
791 bnx2_set_mac_link(struct bnx2 *bp)
792 {
793         u32 val;
794
795         REG_WR(bp, BNX2_EMAC_TX_LENGTHS, 0x2620);
796         if (bp->link_up && (bp->line_speed == SPEED_1000) &&
797                 (bp->duplex == DUPLEX_HALF)) {
798                 REG_WR(bp, BNX2_EMAC_TX_LENGTHS, 0x26ff);
799         }
800
801         /* Configure the EMAC mode register. */
802         val = REG_RD(bp, BNX2_EMAC_MODE);
803
804         val &= ~(BNX2_EMAC_MODE_PORT | BNX2_EMAC_MODE_HALF_DUPLEX |
805                 BNX2_EMAC_MODE_MAC_LOOP | BNX2_EMAC_MODE_FORCE_LINK |
806                 BNX2_EMAC_MODE_25G);
807
808         if (bp->link_up) {
809                 switch (bp->line_speed) {
810                         case SPEED_10:
811                                 if (CHIP_NUM(bp) == CHIP_NUM_5708) {
812                                         val |= BNX2_EMAC_MODE_PORT_MII_10;
813                                         break;
814                                 }
815                                 /* fall through */
816                         case SPEED_100:
817                                 val |= BNX2_EMAC_MODE_PORT_MII;
818                                 break;
819                         case SPEED_2500:
820                                 val |= BNX2_EMAC_MODE_25G;
821                                 /* fall through */
822                         case SPEED_1000:
823                                 val |= BNX2_EMAC_MODE_PORT_GMII;
824                                 break;
825                 }
826         }
827         else {
828                 val |= BNX2_EMAC_MODE_PORT_GMII;
829         }
830
831         /* Set the MAC to operate in the appropriate duplex mode. */
832         if (bp->duplex == DUPLEX_HALF)
833                 val |= BNX2_EMAC_MODE_HALF_DUPLEX;
834         REG_WR(bp, BNX2_EMAC_MODE, val);
835
836         /* Enable/disable rx PAUSE. */
837         bp->rx_mode &= ~BNX2_EMAC_RX_MODE_FLOW_EN;
838
839         if (bp->flow_ctrl & FLOW_CTRL_RX)
840                 bp->rx_mode |= BNX2_EMAC_RX_MODE_FLOW_EN;
841         REG_WR(bp, BNX2_EMAC_RX_MODE, bp->rx_mode);
842
843         /* Enable/disable tx PAUSE. */
844         val = REG_RD(bp, BNX2_EMAC_TX_MODE);
845         val &= ~BNX2_EMAC_TX_MODE_FLOW_EN;
846
847         if (bp->flow_ctrl & FLOW_CTRL_TX)
848                 val |= BNX2_EMAC_TX_MODE_FLOW_EN;
849         REG_WR(bp, BNX2_EMAC_TX_MODE, val);
850
851         /* Acknowledge the interrupt. */
852         REG_WR(bp, BNX2_EMAC_STATUS, BNX2_EMAC_STATUS_LINK_CHANGE);
853
854         return 0;
855 }
856
857 static int
858 bnx2_set_link(struct bnx2 *bp)
859 {
860         u32 bmsr;
861         u8 link_up;
862
863         if (bp->loopback == MAC_LOOPBACK || bp->loopback == PHY_LOOPBACK) {
864                 bp->link_up = 1;
865                 return 0;
866         }
867
868         link_up = bp->link_up;
869
870         bnx2_read_phy(bp, MII_BMSR, &bmsr);
871         bnx2_read_phy(bp, MII_BMSR, &bmsr);
872
873         if ((bp->phy_flags & PHY_SERDES_FLAG) &&
874             (CHIP_NUM(bp) == CHIP_NUM_5706)) {
875                 u32 val;
876
877                 val = REG_RD(bp, BNX2_EMAC_STATUS);
878                 if (val & BNX2_EMAC_STATUS_LINK)
879                         bmsr |= BMSR_LSTATUS;
880                 else
881                         bmsr &= ~BMSR_LSTATUS;
882         }
883
884         if (bmsr & BMSR_LSTATUS) {
885                 bp->link_up = 1;
886
887                 if (bp->phy_flags & PHY_SERDES_FLAG) {
888                         if (CHIP_NUM(bp) == CHIP_NUM_5706)
889                                 bnx2_5706s_linkup(bp);
890                         else if (CHIP_NUM(bp) == CHIP_NUM_5708)
891                                 bnx2_5708s_linkup(bp);
892                 }
893                 else {
894                         bnx2_copper_linkup(bp);
895                 }
896                 bnx2_resolve_flow_ctrl(bp);
897         }
898         else {
899                 if ((bp->phy_flags & PHY_SERDES_FLAG) &&
900                         (bp->autoneg & AUTONEG_SPEED)) {
901
902                         u32 bmcr;
903
904                         bnx2_read_phy(bp, MII_BMCR, &bmcr);
905                         bmcr &= ~BCM5708S_BMCR_FORCE_2500;
906                         if (!(bmcr & BMCR_ANENABLE)) {
907                                 bnx2_write_phy(bp, MII_BMCR, bmcr |
908                                         BMCR_ANENABLE);
909                         }
910                 }
911                 bp->phy_flags &= ~PHY_PARALLEL_DETECT_FLAG;
912                 bp->link_up = 0;
913         }
914
915         if (bp->link_up != link_up) {
916                 bnx2_report_link(bp);
917         }
918
919         bnx2_set_mac_link(bp);
920
921         return 0;
922 }
923
924 static int
925 bnx2_reset_phy(struct bnx2 *bp)
926 {
927         int i;
928         u32 reg;
929
930         bnx2_write_phy(bp, MII_BMCR, BMCR_RESET);
931
932 #define PHY_RESET_MAX_WAIT 100
933         for (i = 0; i < PHY_RESET_MAX_WAIT; i++) {
934                 udelay(10);
935
936                 bnx2_read_phy(bp, MII_BMCR, &reg);
937                 if (!(reg & BMCR_RESET)) {
938                         udelay(20);
939                         break;
940                 }
941         }
942         if (i == PHY_RESET_MAX_WAIT) {
943                 return -EBUSY;
944         }
945         return 0;
946 }
947
948 static u32
949 bnx2_phy_get_pause_adv(struct bnx2 *bp)
950 {
951         u32 adv = 0;
952
953         if ((bp->req_flow_ctrl & (FLOW_CTRL_RX | FLOW_CTRL_TX)) ==
954                 (FLOW_CTRL_RX | FLOW_CTRL_TX)) {
955
956                 if (bp->phy_flags & PHY_SERDES_FLAG) {
957                         adv = ADVERTISE_1000XPAUSE;
958                 }
959                 else {
960                         adv = ADVERTISE_PAUSE_CAP;
961                 }
962         }
963         else if (bp->req_flow_ctrl & FLOW_CTRL_TX) {
964                 if (bp->phy_flags & PHY_SERDES_FLAG) {
965                         adv = ADVERTISE_1000XPSE_ASYM;
966                 }
967                 else {
968                         adv = ADVERTISE_PAUSE_ASYM;
969                 }
970         }
971         else if (bp->req_flow_ctrl & FLOW_CTRL_RX) {
972                 if (bp->phy_flags & PHY_SERDES_FLAG) {
973                         adv = ADVERTISE_1000XPAUSE | ADVERTISE_1000XPSE_ASYM;
974                 }
975                 else {
976                         adv = ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM;
977                 }
978         }
979         return adv;
980 }
981
982 static int
983 bnx2_setup_serdes_phy(struct bnx2 *bp)
984 {
985         u32 adv, bmcr, up1;
986         u32 new_adv = 0;
987
988         if (!(bp->autoneg & AUTONEG_SPEED)) {
989                 u32 new_bmcr;
990                 int force_link_down = 0;
991
992                 bnx2_read_phy(bp, MII_ADVERTISE, &adv);
993                 adv &= ~(ADVERTISE_1000XFULL | ADVERTISE_1000XHALF);
994
995                 bnx2_read_phy(bp, MII_BMCR, &bmcr);
996                 new_bmcr = bmcr & ~(BMCR_ANENABLE | BCM5708S_BMCR_FORCE_2500);
997                 new_bmcr |= BMCR_SPEED1000;
998                 if (bp->req_line_speed == SPEED_2500) {
999                         new_bmcr |= BCM5708S_BMCR_FORCE_2500;
1000                         bnx2_read_phy(bp, BCM5708S_UP1, &up1);
1001                         if (!(up1 & BCM5708S_UP1_2G5)) {
1002                                 up1 |= BCM5708S_UP1_2G5;
1003                                 bnx2_write_phy(bp, BCM5708S_UP1, up1);
1004                                 force_link_down = 1;
1005                         }
1006                 } else if (CHIP_NUM(bp) == CHIP_NUM_5708) {
1007                         bnx2_read_phy(bp, BCM5708S_UP1, &up1);
1008                         if (up1 & BCM5708S_UP1_2G5) {
1009                                 up1 &= ~BCM5708S_UP1_2G5;
1010                                 bnx2_write_phy(bp, BCM5708S_UP1, up1);
1011                                 force_link_down = 1;
1012                         }
1013                 }
1014
1015                 if (bp->req_duplex == DUPLEX_FULL) {
1016                         adv |= ADVERTISE_1000XFULL;
1017                         new_bmcr |= BMCR_FULLDPLX;
1018                 }
1019                 else {
1020                         adv |= ADVERTISE_1000XHALF;
1021                         new_bmcr &= ~BMCR_FULLDPLX;
1022                 }
1023                 if ((new_bmcr != bmcr) || (force_link_down)) {
1024                         /* Force a link down visible on the other side */
1025                         if (bp->link_up) {
1026                                 bnx2_write_phy(bp, MII_ADVERTISE, adv &
1027                                                ~(ADVERTISE_1000XFULL |
1028                                                  ADVERTISE_1000XHALF));
1029                                 bnx2_write_phy(bp, MII_BMCR, bmcr |
1030                                         BMCR_ANRESTART | BMCR_ANENABLE);
1031
1032                                 bp->link_up = 0;
1033                                 netif_carrier_off(bp->dev);
1034                                 bnx2_write_phy(bp, MII_BMCR, new_bmcr);
1035                                 bnx2_report_link(bp);
1036                         }
1037                         bnx2_write_phy(bp, MII_ADVERTISE, adv);
1038                         bnx2_write_phy(bp, MII_BMCR, new_bmcr);
1039                 }
1040                 return 0;
1041         }
1042
1043         if (bp->phy_flags & PHY_2_5G_CAPABLE_FLAG) {
1044                 bnx2_read_phy(bp, BCM5708S_UP1, &up1);
1045                 up1 |= BCM5708S_UP1_2G5;
1046                 bnx2_write_phy(bp, BCM5708S_UP1, up1);
1047         }
1048
1049         if (bp->advertising & ADVERTISED_1000baseT_Full)
1050                 new_adv |= ADVERTISE_1000XFULL;
1051
1052         new_adv |= bnx2_phy_get_pause_adv(bp);
1053
1054         bnx2_read_phy(bp, MII_ADVERTISE, &adv);
1055         bnx2_read_phy(bp, MII_BMCR, &bmcr);
1056
1057         bp->serdes_an_pending = 0;
1058         if ((adv != new_adv) || ((bmcr & BMCR_ANENABLE) == 0)) {
1059                 /* Force a link down visible on the other side */
1060                 if (bp->link_up) {
1061                         bnx2_write_phy(bp, MII_BMCR, BMCR_LOOPBACK);
1062                         spin_unlock_bh(&bp->phy_lock);
1063                         msleep(20);
1064                         spin_lock_bh(&bp->phy_lock);
1065                 }
1066
1067                 bnx2_write_phy(bp, MII_ADVERTISE, new_adv);
1068                 bnx2_write_phy(bp, MII_BMCR, bmcr | BMCR_ANRESTART |
1069                         BMCR_ANENABLE);
1070                 if (CHIP_NUM(bp) == CHIP_NUM_5706) {
1071                         /* Speed up link-up time when the link partner
1072                          * does not autonegotiate which is very common
1073                          * in blade servers. Some blade servers use
1074                          * IPMI for kerboard input and it's important
1075                          * to minimize link disruptions. Autoneg. involves
1076                          * exchanging base pages plus 3 next pages and
1077                          * normally completes in about 120 msec.
1078                          */
1079                         bp->current_interval = SERDES_AN_TIMEOUT;
1080                         bp->serdes_an_pending = 1;
1081                         mod_timer(&bp->timer, jiffies + bp->current_interval);
1082                 }
1083         }
1084
1085         return 0;
1086 }
1087
1088 #define ETHTOOL_ALL_FIBRE_SPEED                                         \
1089         (ADVERTISED_1000baseT_Full)
1090
1091 #define ETHTOOL_ALL_COPPER_SPEED                                        \
1092         (ADVERTISED_10baseT_Half | ADVERTISED_10baseT_Full |            \
1093         ADVERTISED_100baseT_Half | ADVERTISED_100baseT_Full |           \
1094         ADVERTISED_1000baseT_Full)
1095
1096 #define PHY_ALL_10_100_SPEED (ADVERTISE_10HALF | ADVERTISE_10FULL | \
1097         ADVERTISE_100HALF | ADVERTISE_100FULL | ADVERTISE_CSMA)
1098
1099 #define PHY_ALL_1000_SPEED (ADVERTISE_1000HALF | ADVERTISE_1000FULL)
1100
1101 static int
1102 bnx2_setup_copper_phy(struct bnx2 *bp)
1103 {
1104         u32 bmcr;
1105         u32 new_bmcr;
1106
1107         bnx2_read_phy(bp, MII_BMCR, &bmcr);
1108
1109         if (bp->autoneg & AUTONEG_SPEED) {
1110                 u32 adv_reg, adv1000_reg;
1111                 u32 new_adv_reg = 0;
1112                 u32 new_adv1000_reg = 0;
1113
1114                 bnx2_read_phy(bp, MII_ADVERTISE, &adv_reg);
1115                 adv_reg &= (PHY_ALL_10_100_SPEED | ADVERTISE_PAUSE_CAP |
1116                         ADVERTISE_PAUSE_ASYM);
1117
1118                 bnx2_read_phy(bp, MII_CTRL1000, &adv1000_reg);
1119                 adv1000_reg &= PHY_ALL_1000_SPEED;
1120
1121                 if (bp->advertising & ADVERTISED_10baseT_Half)
1122                         new_adv_reg |= ADVERTISE_10HALF;
1123                 if (bp->advertising & ADVERTISED_10baseT_Full)
1124                         new_adv_reg |= ADVERTISE_10FULL;
1125                 if (bp->advertising & ADVERTISED_100baseT_Half)
1126                         new_adv_reg |= ADVERTISE_100HALF;
1127                 if (bp->advertising & ADVERTISED_100baseT_Full)
1128                         new_adv_reg |= ADVERTISE_100FULL;
1129                 if (bp->advertising & ADVERTISED_1000baseT_Full)
1130                         new_adv1000_reg |= ADVERTISE_1000FULL;
1131
1132                 new_adv_reg |= ADVERTISE_CSMA;
1133
1134                 new_adv_reg |= bnx2_phy_get_pause_adv(bp);
1135
1136                 if ((adv1000_reg != new_adv1000_reg) ||
1137                         (adv_reg != new_adv_reg) ||
1138                         ((bmcr & BMCR_ANENABLE) == 0)) {
1139
1140                         bnx2_write_phy(bp, MII_ADVERTISE, new_adv_reg);
1141                         bnx2_write_phy(bp, MII_CTRL1000, new_adv1000_reg);
1142                         bnx2_write_phy(bp, MII_BMCR, BMCR_ANRESTART |
1143                                 BMCR_ANENABLE);
1144                 }
1145                 else if (bp->link_up) {
1146                         /* Flow ctrl may have changed from auto to forced */
1147                         /* or vice-versa. */
1148
1149                         bnx2_resolve_flow_ctrl(bp);
1150                         bnx2_set_mac_link(bp);
1151                 }
1152                 return 0;
1153         }
1154
1155         new_bmcr = 0;
1156         if (bp->req_line_speed == SPEED_100) {
1157                 new_bmcr |= BMCR_SPEED100;
1158         }
1159         if (bp->req_duplex == DUPLEX_FULL) {
1160                 new_bmcr |= BMCR_FULLDPLX;
1161         }
1162         if (new_bmcr != bmcr) {
1163                 u32 bmsr;
1164                 int i = 0;
1165
1166                 bnx2_read_phy(bp, MII_BMSR, &bmsr);
1167                 bnx2_read_phy(bp, MII_BMSR, &bmsr);
1168
1169                 if (bmsr & BMSR_LSTATUS) {
1170                         /* Force link down */
1171                         bnx2_write_phy(bp, MII_BMCR, BMCR_LOOPBACK);
1172                         do {
1173                                 udelay(100);
1174                                 bnx2_read_phy(bp, MII_BMSR, &bmsr);
1175                                 bnx2_read_phy(bp, MII_BMSR, &bmsr);
1176                                 i++;
1177                         } while ((bmsr & BMSR_LSTATUS) && (i < 620));
1178                 }
1179
1180                 bnx2_write_phy(bp, MII_BMCR, new_bmcr);
1181
1182                 /* Normally, the new speed is setup after the link has
1183                  * gone down and up again. In some cases, link will not go
1184                  * down so we need to set up the new speed here.
1185                  */
1186                 if (bmsr & BMSR_LSTATUS) {
1187                         bp->line_speed = bp->req_line_speed;
1188                         bp->duplex = bp->req_duplex;
1189                         bnx2_resolve_flow_ctrl(bp);
1190                         bnx2_set_mac_link(bp);
1191                 }
1192         }
1193         return 0;
1194 }
1195
1196 static int
1197 bnx2_setup_phy(struct bnx2 *bp)
1198 {
1199         if (bp->loopback == MAC_LOOPBACK)
1200                 return 0;
1201
1202         if (bp->phy_flags & PHY_SERDES_FLAG) {
1203                 return (bnx2_setup_serdes_phy(bp));
1204         }
1205         else {
1206                 return (bnx2_setup_copper_phy(bp));
1207         }
1208 }
1209
1210 static int
1211 bnx2_init_5708s_phy(struct bnx2 *bp)
1212 {
1213         u32 val;
1214
1215         bnx2_write_phy(bp, BCM5708S_BLK_ADDR, BCM5708S_BLK_ADDR_DIG3);
1216         bnx2_write_phy(bp, BCM5708S_DIG_3_0, BCM5708S_DIG_3_0_USE_IEEE);
1217         bnx2_write_phy(bp, BCM5708S_BLK_ADDR, BCM5708S_BLK_ADDR_DIG);
1218
1219         bnx2_read_phy(bp, BCM5708S_1000X_CTL1, &val);
1220         val |= BCM5708S_1000X_CTL1_FIBER_MODE | BCM5708S_1000X_CTL1_AUTODET_EN;
1221         bnx2_write_phy(bp, BCM5708S_1000X_CTL1, val);
1222
1223         bnx2_read_phy(bp, BCM5708S_1000X_CTL2, &val);
1224         val |= BCM5708S_1000X_CTL2_PLLEL_DET_EN;
1225         bnx2_write_phy(bp, BCM5708S_1000X_CTL2, val);
1226
1227         if (bp->phy_flags & PHY_2_5G_CAPABLE_FLAG) {
1228                 bnx2_read_phy(bp, BCM5708S_UP1, &val);
1229                 val |= BCM5708S_UP1_2G5;
1230                 bnx2_write_phy(bp, BCM5708S_UP1, val);
1231         }
1232
1233         if ((CHIP_ID(bp) == CHIP_ID_5708_A0) ||
1234             (CHIP_ID(bp) == CHIP_ID_5708_B0) ||
1235             (CHIP_ID(bp) == CHIP_ID_5708_B1)) {
1236                 /* increase tx signal amplitude */
1237                 bnx2_write_phy(bp, BCM5708S_BLK_ADDR,
1238                                BCM5708S_BLK_ADDR_TX_MISC);
1239                 bnx2_read_phy(bp, BCM5708S_TX_ACTL1, &val);
1240                 val &= ~BCM5708S_TX_ACTL1_DRIVER_VCM;
1241                 bnx2_write_phy(bp, BCM5708S_TX_ACTL1, val);
1242                 bnx2_write_phy(bp, BCM5708S_BLK_ADDR, BCM5708S_BLK_ADDR_DIG);
1243         }
1244
1245         val = REG_RD_IND(bp, bp->shmem_base + BNX2_PORT_HW_CFG_CONFIG) &
1246               BNX2_PORT_HW_CFG_CFG_TXCTL3_MASK;
1247
1248         if (val) {
1249                 u32 is_backplane;
1250
1251                 is_backplane = REG_RD_IND(bp, bp->shmem_base +
1252                                           BNX2_SHARED_HW_CFG_CONFIG);
1253                 if (is_backplane & BNX2_SHARED_HW_CFG_PHY_BACKPLANE) {
1254                         bnx2_write_phy(bp, BCM5708S_BLK_ADDR,
1255                                        BCM5708S_BLK_ADDR_TX_MISC);
1256                         bnx2_write_phy(bp, BCM5708S_TX_ACTL3, val);
1257                         bnx2_write_phy(bp, BCM5708S_BLK_ADDR,
1258                                        BCM5708S_BLK_ADDR_DIG);
1259                 }
1260         }
1261         return 0;
1262 }
1263
1264 static int
1265 bnx2_init_5706s_phy(struct bnx2 *bp)
1266 {
1267         bp->phy_flags &= ~PHY_PARALLEL_DETECT_FLAG;
1268
1269         if (CHIP_NUM(bp) == CHIP_NUM_5706) {
1270                 REG_WR(bp, BNX2_MISC_UNUSED0, 0x300);
1271         }
1272
1273         if (bp->dev->mtu > 1500) {
1274                 u32 val;
1275
1276                 /* Set extended packet length bit */
1277                 bnx2_write_phy(bp, 0x18, 0x7);
1278                 bnx2_read_phy(bp, 0x18, &val);
1279                 bnx2_write_phy(bp, 0x18, (val & 0xfff8) | 0x4000);
1280
1281                 bnx2_write_phy(bp, 0x1c, 0x6c00);
1282                 bnx2_read_phy(bp, 0x1c, &val);
1283                 bnx2_write_phy(bp, 0x1c, (val & 0x3ff) | 0xec02);
1284         }
1285         else {
1286                 u32 val;
1287
1288                 bnx2_write_phy(bp, 0x18, 0x7);
1289                 bnx2_read_phy(bp, 0x18, &val);
1290                 bnx2_write_phy(bp, 0x18, val & ~0x4007);
1291
1292                 bnx2_write_phy(bp, 0x1c, 0x6c00);
1293                 bnx2_read_phy(bp, 0x1c, &val);
1294                 bnx2_write_phy(bp, 0x1c, (val & 0x3fd) | 0xec00);
1295         }
1296
1297         return 0;
1298 }
1299
1300 static int
1301 bnx2_init_copper_phy(struct bnx2 *bp)
1302 {
1303         u32 val;
1304
1305         bp->phy_flags |= PHY_CRC_FIX_FLAG;
1306
1307         if (bp->phy_flags & PHY_CRC_FIX_FLAG) {
1308                 bnx2_write_phy(bp, 0x18, 0x0c00);
1309                 bnx2_write_phy(bp, 0x17, 0x000a);
1310                 bnx2_write_phy(bp, 0x15, 0x310b);
1311                 bnx2_write_phy(bp, 0x17, 0x201f);
1312                 bnx2_write_phy(bp, 0x15, 0x9506);
1313                 bnx2_write_phy(bp, 0x17, 0x401f);
1314                 bnx2_write_phy(bp, 0x15, 0x14e2);
1315                 bnx2_write_phy(bp, 0x18, 0x0400);
1316         }
1317
1318         if (bp->dev->mtu > 1500) {
1319                 /* Set extended packet length bit */
1320                 bnx2_write_phy(bp, 0x18, 0x7);
1321                 bnx2_read_phy(bp, 0x18, &val);
1322                 bnx2_write_phy(bp, 0x18, val | 0x4000);
1323
1324                 bnx2_read_phy(bp, 0x10, &val);
1325                 bnx2_write_phy(bp, 0x10, val | 0x1);
1326         }
1327         else {
1328                 bnx2_write_phy(bp, 0x18, 0x7);
1329                 bnx2_read_phy(bp, 0x18, &val);
1330                 bnx2_write_phy(bp, 0x18, val & ~0x4007);
1331
1332                 bnx2_read_phy(bp, 0x10, &val);
1333                 bnx2_write_phy(bp, 0x10, val & ~0x1);
1334         }
1335
1336         /* ethernet@wirespeed */
1337         bnx2_write_phy(bp, 0x18, 0x7007);
1338         bnx2_read_phy(bp, 0x18, &val);
1339         bnx2_write_phy(bp, 0x18, val | (1 << 15) | (1 << 4));
1340         return 0;
1341 }
1342
1343
1344 static int
1345 bnx2_init_phy(struct bnx2 *bp)
1346 {
1347         u32 val;
1348         int rc = 0;
1349
1350         bp->phy_flags &= ~PHY_INT_MODE_MASK_FLAG;
1351         bp->phy_flags |= PHY_INT_MODE_LINK_READY_FLAG;
1352
1353         REG_WR(bp, BNX2_EMAC_ATTENTION_ENA, BNX2_EMAC_ATTENTION_ENA_LINK);
1354
1355         bnx2_reset_phy(bp);
1356
1357         bnx2_read_phy(bp, MII_PHYSID1, &val);
1358         bp->phy_id = val << 16;
1359         bnx2_read_phy(bp, MII_PHYSID2, &val);
1360         bp->phy_id |= val & 0xffff;
1361
1362         if (bp->phy_flags & PHY_SERDES_FLAG) {
1363                 if (CHIP_NUM(bp) == CHIP_NUM_5706)
1364                         rc = bnx2_init_5706s_phy(bp);
1365                 else if (CHIP_NUM(bp) == CHIP_NUM_5708)
1366                         rc = bnx2_init_5708s_phy(bp);
1367         }
1368         else {
1369                 rc = bnx2_init_copper_phy(bp);
1370         }
1371
1372         bnx2_setup_phy(bp);
1373
1374         return rc;
1375 }
1376
1377 static int
1378 bnx2_set_mac_loopback(struct bnx2 *bp)
1379 {
1380         u32 mac_mode;
1381
1382         mac_mode = REG_RD(bp, BNX2_EMAC_MODE);
1383         mac_mode &= ~BNX2_EMAC_MODE_PORT;
1384         mac_mode |= BNX2_EMAC_MODE_MAC_LOOP | BNX2_EMAC_MODE_FORCE_LINK;
1385         REG_WR(bp, BNX2_EMAC_MODE, mac_mode);
1386         bp->link_up = 1;
1387         return 0;
1388 }
1389
1390 static int bnx2_test_link(struct bnx2 *);
1391
1392 static int
1393 bnx2_set_phy_loopback(struct bnx2 *bp)
1394 {
1395         u32 mac_mode;
1396         int rc, i;
1397
1398         spin_lock_bh(&bp->phy_lock);
1399         rc = bnx2_write_phy(bp, MII_BMCR, BMCR_LOOPBACK | BMCR_FULLDPLX |
1400                             BMCR_SPEED1000);
1401         spin_unlock_bh(&bp->phy_lock);
1402         if (rc)
1403                 return rc;
1404
1405         for (i = 0; i < 10; i++) {
1406                 if (bnx2_test_link(bp) == 0)
1407                         break;
1408                 msleep(100);
1409         }
1410
1411         mac_mode = REG_RD(bp, BNX2_EMAC_MODE);
1412         mac_mode &= ~(BNX2_EMAC_MODE_PORT | BNX2_EMAC_MODE_HALF_DUPLEX |
1413                       BNX2_EMAC_MODE_MAC_LOOP | BNX2_EMAC_MODE_FORCE_LINK |
1414                       BNX2_EMAC_MODE_25G);
1415
1416         mac_mode |= BNX2_EMAC_MODE_PORT_GMII;
1417         REG_WR(bp, BNX2_EMAC_MODE, mac_mode);
1418         bp->link_up = 1;
1419         return 0;
1420 }
1421
1422 static int
1423 bnx2_fw_sync(struct bnx2 *bp, u32 msg_data, int silent)
1424 {
1425         int i;
1426         u32 val;
1427
1428         bp->fw_wr_seq++;
1429         msg_data |= bp->fw_wr_seq;
1430
1431         REG_WR_IND(bp, bp->shmem_base + BNX2_DRV_MB, msg_data);
1432
1433         /* wait for an acknowledgement. */
1434         for (i = 0; i < (FW_ACK_TIME_OUT_MS / 10); i++) {
1435                 msleep(10);
1436
1437                 val = REG_RD_IND(bp, bp->shmem_base + BNX2_FW_MB);
1438
1439                 if ((val & BNX2_FW_MSG_ACK) == (msg_data & BNX2_DRV_MSG_SEQ))
1440                         break;
1441         }
1442         if ((msg_data & BNX2_DRV_MSG_DATA) == BNX2_DRV_MSG_DATA_WAIT0)
1443                 return 0;
1444
1445         /* If we timed out, inform the firmware that this is the case. */
1446         if ((val & BNX2_FW_MSG_ACK) != (msg_data & BNX2_DRV_MSG_SEQ)) {
1447                 if (!silent)
1448                         printk(KERN_ERR PFX "fw sync timeout, reset code = "
1449                                             "%x\n", msg_data);
1450
1451                 msg_data &= ~BNX2_DRV_MSG_CODE;
1452                 msg_data |= BNX2_DRV_MSG_CODE_FW_TIMEOUT;
1453
1454                 REG_WR_IND(bp, bp->shmem_base + BNX2_DRV_MB, msg_data);
1455
1456                 return -EBUSY;
1457         }
1458
1459         if ((val & BNX2_FW_MSG_STATUS_MASK) != BNX2_FW_MSG_STATUS_OK)
1460                 return -EIO;
1461
1462         return 0;
1463 }
1464
1465 static void
1466 bnx2_init_context(struct bnx2 *bp)
1467 {
1468         u32 vcid;
1469
1470         vcid = 96;
1471         while (vcid) {
1472                 u32 vcid_addr, pcid_addr, offset;
1473
1474                 vcid--;
1475
1476                 if (CHIP_ID(bp) == CHIP_ID_5706_A0) {
1477                         u32 new_vcid;
1478
1479                         vcid_addr = GET_PCID_ADDR(vcid);
1480                         if (vcid & 0x8) {
1481                                 new_vcid = 0x60 + (vcid & 0xf0) + (vcid & 0x7);
1482                         }
1483                         else {
1484                                 new_vcid = vcid;
1485                         }
1486                         pcid_addr = GET_PCID_ADDR(new_vcid);
1487                 }
1488                 else {
1489                         vcid_addr = GET_CID_ADDR(vcid);
1490                         pcid_addr = vcid_addr;
1491                 }
1492
1493                 REG_WR(bp, BNX2_CTX_VIRT_ADDR, 0x00);
1494                 REG_WR(bp, BNX2_CTX_PAGE_TBL, pcid_addr);
1495
1496                 /* Zero out the context. */
1497                 for (offset = 0; offset < PHY_CTX_SIZE; offset += 4) {
1498                         CTX_WR(bp, 0x00, offset, 0);
1499                 }
1500
1501                 REG_WR(bp, BNX2_CTX_VIRT_ADDR, vcid_addr);
1502                 REG_WR(bp, BNX2_CTX_PAGE_TBL, pcid_addr);
1503         }
1504 }
1505
1506 static int
1507 bnx2_alloc_bad_rbuf(struct bnx2 *bp)
1508 {
1509         u16 *good_mbuf;
1510         u32 good_mbuf_cnt;
1511         u32 val;
1512
1513         good_mbuf = kmalloc(512 * sizeof(u16), GFP_KERNEL);
1514         if (good_mbuf == NULL) {
1515                 printk(KERN_ERR PFX "Failed to allocate memory in "
1516                                     "bnx2_alloc_bad_rbuf\n");
1517                 return -ENOMEM;
1518         }
1519
1520         REG_WR(bp, BNX2_MISC_ENABLE_SET_BITS,
1521                 BNX2_MISC_ENABLE_SET_BITS_RX_MBUF_ENABLE);
1522
1523         good_mbuf_cnt = 0;
1524
1525         /* Allocate a bunch of mbufs and save the good ones in an array. */
1526         val = REG_RD_IND(bp, BNX2_RBUF_STATUS1);
1527         while (val & BNX2_RBUF_STATUS1_FREE_COUNT) {
1528                 REG_WR_IND(bp, BNX2_RBUF_COMMAND, BNX2_RBUF_COMMAND_ALLOC_REQ);
1529
1530                 val = REG_RD_IND(bp, BNX2_RBUF_FW_BUF_ALLOC);
1531
1532                 val &= BNX2_RBUF_FW_BUF_ALLOC_VALUE;
1533
1534                 /* The addresses with Bit 9 set are bad memory blocks. */
1535                 if (!(val & (1 << 9))) {
1536                         good_mbuf[good_mbuf_cnt] = (u16) val;
1537                         good_mbuf_cnt++;
1538                 }
1539
1540                 val = REG_RD_IND(bp, BNX2_RBUF_STATUS1);
1541         }
1542
1543         /* Free the good ones back to the mbuf pool thus discarding
1544          * all the bad ones. */
1545         while (good_mbuf_cnt) {
1546                 good_mbuf_cnt--;
1547
1548                 val = good_mbuf[good_mbuf_cnt];
1549                 val = (val << 9) | val | 1;
1550
1551                 REG_WR_IND(bp, BNX2_RBUF_FW_BUF_FREE, val);
1552         }
1553         kfree(good_mbuf);
1554         return 0;
1555 }
1556
1557 static void
1558 bnx2_set_mac_addr(struct bnx2 *bp)
1559 {
1560         u32 val;
1561         u8 *mac_addr = bp->dev->dev_addr;
1562
1563         val = (mac_addr[0] << 8) | mac_addr[1];
1564
1565         REG_WR(bp, BNX2_EMAC_MAC_MATCH0, val);
1566
1567         val = (mac_addr[2] << 24) | (mac_addr[3] << 16) |
1568                 (mac_addr[4] << 8) | mac_addr[5];
1569
1570         REG_WR(bp, BNX2_EMAC_MAC_MATCH1, val);
1571 }
1572
1573 static inline int
1574 bnx2_alloc_rx_skb(struct bnx2 *bp, u16 index)
1575 {
1576         struct sk_buff *skb;
1577         struct sw_bd *rx_buf = &bp->rx_buf_ring[index];
1578         dma_addr_t mapping;
1579         struct rx_bd *rxbd = &bp->rx_desc_ring[RX_RING(index)][RX_IDX(index)];
1580         unsigned long align;
1581
1582         skb = netdev_alloc_skb(bp->dev, bp->rx_buf_size);
1583         if (skb == NULL) {
1584                 return -ENOMEM;
1585         }
1586
1587         if (unlikely((align = (unsigned long) skb->data & 0x7))) {
1588                 skb_reserve(skb, 8 - align);
1589         }
1590
1591         mapping = pci_map_single(bp->pdev, skb->data, bp->rx_buf_use_size,
1592                 PCI_DMA_FROMDEVICE);
1593
1594         rx_buf->skb = skb;
1595         pci_unmap_addr_set(rx_buf, mapping, mapping);
1596
1597         rxbd->rx_bd_haddr_hi = (u64) mapping >> 32;
1598         rxbd->rx_bd_haddr_lo = (u64) mapping & 0xffffffff;
1599
1600         bp->rx_prod_bseq += bp->rx_buf_use_size;
1601
1602         return 0;
1603 }
1604
1605 static void
1606 bnx2_phy_int(struct bnx2 *bp)
1607 {
1608         u32 new_link_state, old_link_state;
1609
1610         new_link_state = bp->status_blk->status_attn_bits &
1611                 STATUS_ATTN_BITS_LINK_STATE;
1612         old_link_state = bp->status_blk->status_attn_bits_ack &
1613                 STATUS_ATTN_BITS_LINK_STATE;
1614         if (new_link_state != old_link_state) {
1615                 if (new_link_state) {
1616                         REG_WR(bp, BNX2_PCICFG_STATUS_BIT_SET_CMD,
1617                                 STATUS_ATTN_BITS_LINK_STATE);
1618                 }
1619                 else {
1620                         REG_WR(bp, BNX2_PCICFG_STATUS_BIT_CLEAR_CMD,
1621                                 STATUS_ATTN_BITS_LINK_STATE);
1622                 }
1623                 bnx2_set_link(bp);
1624         }
1625 }
1626
1627 static void
1628 bnx2_tx_int(struct bnx2 *bp)
1629 {
1630         struct status_block *sblk = bp->status_blk;
1631         u16 hw_cons, sw_cons, sw_ring_cons;
1632         int tx_free_bd = 0;
1633
1634         hw_cons = bp->hw_tx_cons = sblk->status_tx_quick_consumer_index0;
1635         if ((hw_cons & MAX_TX_DESC_CNT) == MAX_TX_DESC_CNT) {
1636                 hw_cons++;
1637         }
1638         sw_cons = bp->tx_cons;
1639
1640         while (sw_cons != hw_cons) {
1641                 struct sw_bd *tx_buf;
1642                 struct sk_buff *skb;
1643                 int i, last;
1644
1645                 sw_ring_cons = TX_RING_IDX(sw_cons);
1646
1647                 tx_buf = &bp->tx_buf_ring[sw_ring_cons];
1648                 skb = tx_buf->skb;
1649 #ifdef BCM_TSO
1650                 /* partial BD completions possible with TSO packets */
1651                 if (skb_is_gso(skb)) {
1652                         u16 last_idx, last_ring_idx;
1653
1654                         last_idx = sw_cons +
1655                                 skb_shinfo(skb)->nr_frags + 1;
1656                         last_ring_idx = sw_ring_cons +
1657                                 skb_shinfo(skb)->nr_frags + 1;
1658                         if (unlikely(last_ring_idx >= MAX_TX_DESC_CNT)) {
1659                                 last_idx++;
1660                         }
1661                         if (((s16) ((s16) last_idx - (s16) hw_cons)) > 0) {
1662                                 break;
1663                         }
1664                 }
1665 #endif
1666                 pci_unmap_single(bp->pdev, pci_unmap_addr(tx_buf, mapping),
1667                         skb_headlen(skb), PCI_DMA_TODEVICE);
1668
1669                 tx_buf->skb = NULL;
1670                 last = skb_shinfo(skb)->nr_frags;
1671
1672                 for (i = 0; i < last; i++) {
1673                         sw_cons = NEXT_TX_BD(sw_cons);
1674
1675                         pci_unmap_page(bp->pdev,
1676                                 pci_unmap_addr(
1677                                         &bp->tx_buf_ring[TX_RING_IDX(sw_cons)],
1678                                         mapping),
1679                                 skb_shinfo(skb)->frags[i].size,
1680                                 PCI_DMA_TODEVICE);
1681                 }
1682
1683                 sw_cons = NEXT_TX_BD(sw_cons);
1684
1685                 tx_free_bd += last + 1;
1686
1687                 dev_kfree_skb(skb);
1688
1689                 hw_cons = bp->hw_tx_cons =
1690                         sblk->status_tx_quick_consumer_index0;
1691
1692                 if ((hw_cons & MAX_TX_DESC_CNT) == MAX_TX_DESC_CNT) {
1693                         hw_cons++;
1694                 }
1695         }
1696
1697         bp->tx_cons = sw_cons;
1698         /* Need to make the tx_cons update visible to bnx2_start_xmit()
1699          * before checking for netif_queue_stopped().  Without the
1700          * memory barrier, there is a small possibility that bnx2_start_xmit()
1701          * will miss it and cause the queue to be stopped forever.
1702          */
1703         smp_mb();
1704
1705         if (unlikely(netif_queue_stopped(bp->dev)) &&
1706                      (bnx2_tx_avail(bp) > bp->tx_wake_thresh)) {
1707                 netif_tx_lock(bp->dev);
1708                 if ((netif_queue_stopped(bp->dev)) &&
1709                     (bnx2_tx_avail(bp) > bp->tx_wake_thresh))
1710                         netif_wake_queue(bp->dev);
1711                 netif_tx_unlock(bp->dev);
1712         }
1713 }
1714
1715 static inline void
1716 bnx2_reuse_rx_skb(struct bnx2 *bp, struct sk_buff *skb,
1717         u16 cons, u16 prod)
1718 {
1719         struct sw_bd *cons_rx_buf, *prod_rx_buf;
1720         struct rx_bd *cons_bd, *prod_bd;
1721
1722         cons_rx_buf = &bp->rx_buf_ring[cons];
1723         prod_rx_buf = &bp->rx_buf_ring[prod];
1724
1725         pci_dma_sync_single_for_device(bp->pdev,
1726                 pci_unmap_addr(cons_rx_buf, mapping),
1727                 bp->rx_offset + RX_COPY_THRESH, PCI_DMA_FROMDEVICE);
1728
1729         bp->rx_prod_bseq += bp->rx_buf_use_size;
1730
1731         prod_rx_buf->skb = skb;
1732
1733         if (cons == prod)
1734                 return;
1735
1736         pci_unmap_addr_set(prod_rx_buf, mapping,
1737                         pci_unmap_addr(cons_rx_buf, mapping));
1738
1739         cons_bd = &bp->rx_desc_ring[RX_RING(cons)][RX_IDX(cons)];
1740         prod_bd = &bp->rx_desc_ring[RX_RING(prod)][RX_IDX(prod)];
1741         prod_bd->rx_bd_haddr_hi = cons_bd->rx_bd_haddr_hi;
1742         prod_bd->rx_bd_haddr_lo = cons_bd->rx_bd_haddr_lo;
1743 }
1744
1745 static int
1746 bnx2_rx_int(struct bnx2 *bp, int budget)
1747 {
1748         struct status_block *sblk = bp->status_blk;
1749         u16 hw_cons, sw_cons, sw_ring_cons, sw_prod, sw_ring_prod;
1750         struct l2_fhdr *rx_hdr;
1751         int rx_pkt = 0;
1752
1753         hw_cons = bp->hw_rx_cons = sblk->status_rx_quick_consumer_index0;
1754         if ((hw_cons & MAX_RX_DESC_CNT) == MAX_RX_DESC_CNT) {
1755                 hw_cons++;
1756         }
1757         sw_cons = bp->rx_cons;
1758         sw_prod = bp->rx_prod;
1759
1760         /* Memory barrier necessary as speculative reads of the rx
1761          * buffer can be ahead of the index in the status block
1762          */
1763         rmb();
1764         while (sw_cons != hw_cons) {
1765                 unsigned int len;
1766                 u32 status;
1767                 struct sw_bd *rx_buf;
1768                 struct sk_buff *skb;
1769                 dma_addr_t dma_addr;
1770
1771                 sw_ring_cons = RX_RING_IDX(sw_cons);
1772                 sw_ring_prod = RX_RING_IDX(sw_prod);
1773
1774                 rx_buf = &bp->rx_buf_ring[sw_ring_cons];
1775                 skb = rx_buf->skb;
1776
1777                 rx_buf->skb = NULL;
1778
1779                 dma_addr = pci_unmap_addr(rx_buf, mapping);
1780
1781                 pci_dma_sync_single_for_cpu(bp->pdev, dma_addr,
1782                         bp->rx_offset + RX_COPY_THRESH, PCI_DMA_FROMDEVICE);
1783
1784                 rx_hdr = (struct l2_fhdr *) skb->data;
1785                 len = rx_hdr->l2_fhdr_pkt_len - 4;
1786
1787                 if ((status = rx_hdr->l2_fhdr_status) &
1788                         (L2_FHDR_ERRORS_BAD_CRC |
1789                         L2_FHDR_ERRORS_PHY_DECODE |
1790                         L2_FHDR_ERRORS_ALIGNMENT |
1791                         L2_FHDR_ERRORS_TOO_SHORT |
1792                         L2_FHDR_ERRORS_GIANT_FRAME)) {
1793
1794                         goto reuse_rx;
1795                 }
1796
1797                 /* Since we don't have a jumbo ring, copy small packets
1798                  * if mtu > 1500
1799                  */
1800                 if ((bp->dev->mtu > 1500) && (len <= RX_COPY_THRESH)) {
1801                         struct sk_buff *new_skb;
1802
1803                         new_skb = netdev_alloc_skb(bp->dev, len + 2);
1804                         if (new_skb == NULL)
1805                                 goto reuse_rx;
1806
1807                         /* aligned copy */
1808                         memcpy(new_skb->data,
1809                                 skb->data + bp->rx_offset - 2,
1810                                 len + 2);
1811
1812                         skb_reserve(new_skb, 2);
1813                         skb_put(new_skb, len);
1814
1815                         bnx2_reuse_rx_skb(bp, skb,
1816                                 sw_ring_cons, sw_ring_prod);
1817
1818                         skb = new_skb;
1819                 }
1820                 else if (bnx2_alloc_rx_skb(bp, sw_ring_prod) == 0) {
1821                         pci_unmap_single(bp->pdev, dma_addr,
1822                                 bp->rx_buf_use_size, PCI_DMA_FROMDEVICE);
1823
1824                         skb_reserve(skb, bp->rx_offset);
1825                         skb_put(skb, len);
1826                 }
1827                 else {
1828 reuse_rx:
1829                         bnx2_reuse_rx_skb(bp, skb,
1830                                 sw_ring_cons, sw_ring_prod);
1831                         goto next_rx;
1832                 }
1833
1834                 skb->protocol = eth_type_trans(skb, bp->dev);
1835
1836                 if ((len > (bp->dev->mtu + ETH_HLEN)) &&
1837                         (ntohs(skb->protocol) != 0x8100)) {
1838
1839                         dev_kfree_skb(skb);
1840                         goto next_rx;
1841
1842                 }
1843
1844                 skb->ip_summed = CHECKSUM_NONE;
1845                 if (bp->rx_csum &&
1846                         (status & (L2_FHDR_STATUS_TCP_SEGMENT |
1847                         L2_FHDR_STATUS_UDP_DATAGRAM))) {
1848
1849                         if (likely((status & (L2_FHDR_ERRORS_TCP_XSUM |
1850                                               L2_FHDR_ERRORS_UDP_XSUM)) == 0))
1851                                 skb->ip_summed = CHECKSUM_UNNECESSARY;
1852                 }
1853
1854 #ifdef BCM_VLAN
1855                 if ((status & L2_FHDR_STATUS_L2_VLAN_TAG) && (bp->vlgrp != 0)) {
1856                         vlan_hwaccel_receive_skb(skb, bp->vlgrp,
1857                                 rx_hdr->l2_fhdr_vlan_tag);
1858                 }
1859                 else
1860 #endif
1861                         netif_receive_skb(skb);
1862
1863                 bp->dev->last_rx = jiffies;
1864                 rx_pkt++;
1865
1866 next_rx:
1867                 sw_cons = NEXT_RX_BD(sw_cons);
1868                 sw_prod = NEXT_RX_BD(sw_prod);
1869
1870                 if ((rx_pkt == budget))
1871                         break;
1872
1873                 /* Refresh hw_cons to see if there is new work */
1874                 if (sw_cons == hw_cons) {
1875                         hw_cons = bp->hw_rx_cons =
1876                                 sblk->status_rx_quick_consumer_index0;
1877                         if ((hw_cons & MAX_RX_DESC_CNT) == MAX_RX_DESC_CNT)
1878                                 hw_cons++;
1879                         rmb();
1880                 }
1881         }
1882         bp->rx_cons = sw_cons;
1883         bp->rx_prod = sw_prod;
1884
1885         REG_WR16(bp, MB_RX_CID_ADDR + BNX2_L2CTX_HOST_BDIDX, sw_prod);
1886
1887         REG_WR(bp, MB_RX_CID_ADDR + BNX2_L2CTX_HOST_BSEQ, bp->rx_prod_bseq);
1888
1889         mmiowb();
1890
1891         return rx_pkt;
1892
1893 }
1894
1895 /* MSI ISR - The only difference between this and the INTx ISR
1896  * is that the MSI interrupt is always serviced.
1897  */
1898 static irqreturn_t
1899 bnx2_msi(int irq, void *dev_instance)
1900 {
1901         struct net_device *dev = dev_instance;
1902         struct bnx2 *bp = netdev_priv(dev);
1903
1904         prefetch(bp->status_blk);
1905         REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD,
1906                 BNX2_PCICFG_INT_ACK_CMD_USE_INT_HC_PARAM |
1907                 BNX2_PCICFG_INT_ACK_CMD_MASK_INT);
1908
1909         /* Return here if interrupt is disabled. */
1910         if (unlikely(atomic_read(&bp->intr_sem) != 0))
1911                 return IRQ_HANDLED;
1912
1913         netif_rx_schedule(dev);
1914
1915         return IRQ_HANDLED;
1916 }
1917
1918 static irqreturn_t
1919 bnx2_interrupt(int irq, void *dev_instance)
1920 {
1921         struct net_device *dev = dev_instance;
1922         struct bnx2 *bp = netdev_priv(dev);
1923
1924         /* When using INTx, it is possible for the interrupt to arrive
1925          * at the CPU before the status block posted prior to the
1926          * interrupt. Reading a register will flush the status block.
1927          * When using MSI, the MSI message will always complete after
1928          * the status block write.
1929          */
1930         if ((bp->status_blk->status_idx == bp->last_status_idx) &&
1931             (REG_RD(bp, BNX2_PCICFG_MISC_STATUS) &
1932              BNX2_PCICFG_MISC_STATUS_INTA_VALUE))
1933                 return IRQ_NONE;
1934
1935         REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD,
1936                 BNX2_PCICFG_INT_ACK_CMD_USE_INT_HC_PARAM |
1937                 BNX2_PCICFG_INT_ACK_CMD_MASK_INT);
1938
1939         /* Return here if interrupt is shared and is disabled. */
1940         if (unlikely(atomic_read(&bp->intr_sem) != 0))
1941                 return IRQ_HANDLED;
1942
1943         netif_rx_schedule(dev);
1944
1945         return IRQ_HANDLED;
1946 }
1947
1948 static inline int
1949 bnx2_has_work(struct bnx2 *bp)
1950 {
1951         struct status_block *sblk = bp->status_blk;
1952
1953         if ((sblk->status_rx_quick_consumer_index0 != bp->hw_rx_cons) ||
1954             (sblk->status_tx_quick_consumer_index0 != bp->hw_tx_cons))
1955                 return 1;
1956
1957         if (((sblk->status_attn_bits & STATUS_ATTN_BITS_LINK_STATE) != 0) !=
1958             bp->link_up)
1959                 return 1;
1960
1961         return 0;
1962 }
1963
1964 static int
1965 bnx2_poll(struct net_device *dev, int *budget)
1966 {
1967         struct bnx2 *bp = netdev_priv(dev);
1968
1969         if ((bp->status_blk->status_attn_bits &
1970                 STATUS_ATTN_BITS_LINK_STATE) !=
1971                 (bp->status_blk->status_attn_bits_ack &
1972                 STATUS_ATTN_BITS_LINK_STATE)) {
1973
1974                 spin_lock(&bp->phy_lock);
1975                 bnx2_phy_int(bp);
1976                 spin_unlock(&bp->phy_lock);
1977
1978                 /* This is needed to take care of transient status
1979                  * during link changes.
1980                  */
1981                 REG_WR(bp, BNX2_HC_COMMAND,
1982                        bp->hc_cmd | BNX2_HC_COMMAND_COAL_NOW_WO_INT);
1983                 REG_RD(bp, BNX2_HC_COMMAND);
1984         }
1985
1986         if (bp->status_blk->status_tx_quick_consumer_index0 != bp->hw_tx_cons)
1987                 bnx2_tx_int(bp);
1988
1989         if (bp->status_blk->status_rx_quick_consumer_index0 != bp->hw_rx_cons) {
1990                 int orig_budget = *budget;
1991                 int work_done;
1992
1993                 if (orig_budget > dev->quota)
1994                         orig_budget = dev->quota;
1995
1996                 work_done = bnx2_rx_int(bp, orig_budget);
1997                 *budget -= work_done;
1998                 dev->quota -= work_done;
1999         }
2000
2001         bp->last_status_idx = bp->status_blk->status_idx;
2002         rmb();
2003
2004         if (!bnx2_has_work(bp)) {
2005                 netif_rx_complete(dev);
2006                 if (likely(bp->flags & USING_MSI_FLAG)) {
2007                         REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD,
2008                                BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID |
2009                                bp->last_status_idx);
2010                         return 0;
2011                 }
2012                 REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD,
2013                        BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID |
2014                        BNX2_PCICFG_INT_ACK_CMD_MASK_INT |
2015                        bp->last_status_idx);
2016
2017                 REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD,
2018                        BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID |
2019                        bp->last_status_idx);
2020                 return 0;
2021         }
2022
2023         return 1;
2024 }
2025
2026 /* Called with rtnl_lock from vlan functions and also netif_tx_lock
2027  * from set_multicast.
2028  */
2029 static void
2030 bnx2_set_rx_mode(struct net_device *dev)
2031 {
2032         struct bnx2 *bp = netdev_priv(dev);
2033         u32 rx_mode, sort_mode;
2034         int i;
2035
2036         spin_lock_bh(&bp->phy_lock);
2037
2038         rx_mode = bp->rx_mode & ~(BNX2_EMAC_RX_MODE_PROMISCUOUS |
2039                                   BNX2_EMAC_RX_MODE_KEEP_VLAN_TAG);
2040         sort_mode = 1 | BNX2_RPM_SORT_USER0_BC_EN;
2041 #ifdef BCM_VLAN
2042         if (!bp->vlgrp && !(bp->flags & ASF_ENABLE_FLAG))
2043                 rx_mode |= BNX2_EMAC_RX_MODE_KEEP_VLAN_TAG;
2044 #else
2045         if (!(bp->flags & ASF_ENABLE_FLAG))
2046                 rx_mode |= BNX2_EMAC_RX_MODE_KEEP_VLAN_TAG;
2047 #endif
2048         if (dev->flags & IFF_PROMISC) {
2049                 /* Promiscuous mode. */
2050                 rx_mode |= BNX2_EMAC_RX_MODE_PROMISCUOUS;
2051                 sort_mode |= BNX2_RPM_SORT_USER0_PROM_EN |
2052                              BNX2_RPM_SORT_USER0_PROM_VLAN;
2053         }
2054         else if (dev->flags & IFF_ALLMULTI) {
2055                 for (i = 0; i < NUM_MC_HASH_REGISTERS; i++) {
2056                         REG_WR(bp, BNX2_EMAC_MULTICAST_HASH0 + (i * 4),
2057                                0xffffffff);
2058                 }
2059                 sort_mode |= BNX2_RPM_SORT_USER0_MC_EN;
2060         }
2061         else {
2062                 /* Accept one or more multicast(s). */
2063                 struct dev_mc_list *mclist;
2064                 u32 mc_filter[NUM_MC_HASH_REGISTERS];
2065                 u32 regidx;
2066                 u32 bit;
2067                 u32 crc;
2068
2069                 memset(mc_filter, 0, 4 * NUM_MC_HASH_REGISTERS);
2070
2071                 for (i = 0, mclist = dev->mc_list; mclist && i < dev->mc_count;
2072                      i++, mclist = mclist->next) {
2073
2074                         crc = ether_crc_le(ETH_ALEN, mclist->dmi_addr);
2075                         bit = crc & 0xff;
2076                         regidx = (bit & 0xe0) >> 5;
2077                         bit &= 0x1f;
2078                         mc_filter[regidx] |= (1 << bit);
2079                 }
2080
2081                 for (i = 0; i < NUM_MC_HASH_REGISTERS; i++) {
2082                         REG_WR(bp, BNX2_EMAC_MULTICAST_HASH0 + (i * 4),
2083                                mc_filter[i]);
2084                 }
2085
2086                 sort_mode |= BNX2_RPM_SORT_USER0_MC_HSH_EN;
2087         }
2088
2089         if (rx_mode != bp->rx_mode) {
2090                 bp->rx_mode = rx_mode;
2091                 REG_WR(bp, BNX2_EMAC_RX_MODE, rx_mode);
2092         }
2093
2094         REG_WR(bp, BNX2_RPM_SORT_USER0, 0x0);
2095         REG_WR(bp, BNX2_RPM_SORT_USER0, sort_mode);
2096         REG_WR(bp, BNX2_RPM_SORT_USER0, sort_mode | BNX2_RPM_SORT_USER0_ENA);
2097
2098         spin_unlock_bh(&bp->phy_lock);
2099 }
2100
2101 #define FW_BUF_SIZE     0x8000
2102
2103 static int
2104 bnx2_gunzip_init(struct bnx2 *bp)
2105 {
2106         if ((bp->gunzip_buf = vmalloc(FW_BUF_SIZE)) == NULL)
2107                 goto gunzip_nomem1;
2108
2109         if ((bp->strm = kmalloc(sizeof(*bp->strm), GFP_KERNEL)) == NULL)
2110                 goto gunzip_nomem2;
2111
2112         bp->strm->workspace = kmalloc(zlib_inflate_workspacesize(), GFP_KERNEL);
2113         if (bp->strm->workspace == NULL)
2114                 goto gunzip_nomem3;
2115
2116         return 0;
2117
2118 gunzip_nomem3:
2119         kfree(bp->strm);
2120         bp->strm = NULL;
2121
2122 gunzip_nomem2:
2123         vfree(bp->gunzip_buf);
2124         bp->gunzip_buf = NULL;
2125
2126 gunzip_nomem1:
2127         printk(KERN_ERR PFX "%s: Cannot allocate firmware buffer for "
2128                             "uncompression.\n", bp->dev->name);
2129         return -ENOMEM;
2130 }
2131
2132 static void
2133 bnx2_gunzip_end(struct bnx2 *bp)
2134 {
2135         kfree(bp->strm->workspace);
2136
2137         kfree(bp->strm);
2138         bp->strm = NULL;
2139
2140         if (bp->gunzip_buf) {
2141                 vfree(bp->gunzip_buf);
2142                 bp->gunzip_buf = NULL;
2143         }
2144 }
2145
2146 static int
2147 bnx2_gunzip(struct bnx2 *bp, u8 *zbuf, int len, void **outbuf, int *outlen)
2148 {
2149         int n, rc;
2150
2151         /* check gzip header */
2152         if ((zbuf[0] != 0x1f) || (zbuf[1] != 0x8b) || (zbuf[2] != Z_DEFLATED))
2153                 return -EINVAL;
2154
2155         n = 10;
2156
2157 #define FNAME   0x8
2158         if (zbuf[3] & FNAME)
2159                 while ((zbuf[n++] != 0) && (n < len));
2160
2161         bp->strm->next_in = zbuf + n;
2162         bp->strm->avail_in = len - n;
2163         bp->strm->next_out = bp->gunzip_buf;
2164         bp->strm->avail_out = FW_BUF_SIZE;
2165
2166         rc = zlib_inflateInit2(bp->strm, -MAX_WBITS);
2167         if (rc != Z_OK)
2168                 return rc;
2169
2170         rc = zlib_inflate(bp->strm, Z_FINISH);
2171
2172         *outlen = FW_BUF_SIZE - bp->strm->avail_out;
2173         *outbuf = bp->gunzip_buf;
2174
2175         if ((rc != Z_OK) && (rc != Z_STREAM_END))
2176                 printk(KERN_ERR PFX "%s: Firmware decompression error: %s\n",
2177                        bp->dev->name, bp->strm->msg);
2178
2179         zlib_inflateEnd(bp->strm);
2180
2181         if (rc == Z_STREAM_END)
2182                 return 0;
2183
2184         return rc;
2185 }
2186
2187 static void
2188 load_rv2p_fw(struct bnx2 *bp, u32 *rv2p_code, u32 rv2p_code_len,
2189         u32 rv2p_proc)
2190 {
2191         int i;
2192         u32 val;
2193
2194
2195         for (i = 0; i < rv2p_code_len; i += 8) {
2196                 REG_WR(bp, BNX2_RV2P_INSTR_HIGH, cpu_to_le32(*rv2p_code));
2197                 rv2p_code++;
2198                 REG_WR(bp, BNX2_RV2P_INSTR_LOW, cpu_to_le32(*rv2p_code));
2199                 rv2p_code++;
2200
2201                 if (rv2p_proc == RV2P_PROC1) {
2202                         val = (i / 8) | BNX2_RV2P_PROC1_ADDR_CMD_RDWR;
2203                         REG_WR(bp, BNX2_RV2P_PROC1_ADDR_CMD, val);
2204                 }
2205                 else {
2206                         val = (i / 8) | BNX2_RV2P_PROC2_ADDR_CMD_RDWR;
2207                         REG_WR(bp, BNX2_RV2P_PROC2_ADDR_CMD, val);
2208                 }
2209         }
2210
2211         /* Reset the processor, un-stall is done later. */
2212         if (rv2p_proc == RV2P_PROC1) {
2213                 REG_WR(bp, BNX2_RV2P_COMMAND, BNX2_RV2P_COMMAND_PROC1_RESET);
2214         }
2215         else {
2216                 REG_WR(bp, BNX2_RV2P_COMMAND, BNX2_RV2P_COMMAND_PROC2_RESET);
2217         }
2218 }
2219
2220 static void
2221 load_cpu_fw(struct bnx2 *bp, struct cpu_reg *cpu_reg, struct fw_info *fw)
2222 {
2223         u32 offset;
2224         u32 val;
2225
2226         /* Halt the CPU. */
2227         val = REG_RD_IND(bp, cpu_reg->mode);
2228         val |= cpu_reg->mode_value_halt;
2229         REG_WR_IND(bp, cpu_reg->mode, val);
2230         REG_WR_IND(bp, cpu_reg->state, cpu_reg->state_value_clear);
2231
2232         /* Load the Text area. */
2233         offset = cpu_reg->spad_base + (fw->text_addr - cpu_reg->mips_view_base);
2234         if (fw->text) {
2235                 int j;
2236
2237                 for (j = 0; j < (fw->text_len / 4); j++, offset += 4) {
2238                         REG_WR_IND(bp, offset, cpu_to_le32(fw->text[j]));
2239                 }
2240         }
2241
2242         /* Load the Data area. */
2243         offset = cpu_reg->spad_base + (fw->data_addr - cpu_reg->mips_view_base);
2244         if (fw->data) {
2245                 int j;
2246
2247                 for (j = 0; j < (fw->data_len / 4); j++, offset += 4) {
2248                         REG_WR_IND(bp, offset, fw->data[j]);
2249                 }
2250         }
2251
2252         /* Load the SBSS area. */
2253         offset = cpu_reg->spad_base + (fw->sbss_addr - cpu_reg->mips_view_base);
2254         if (fw->sbss) {
2255                 int j;
2256
2257                 for (j = 0; j < (fw->sbss_len / 4); j++, offset += 4) {
2258                         REG_WR_IND(bp, offset, fw->sbss[j]);
2259                 }
2260         }
2261
2262         /* Load the BSS area. */
2263         offset = cpu_reg->spad_base + (fw->bss_addr - cpu_reg->mips_view_base);
2264         if (fw->bss) {
2265                 int j;
2266
2267                 for (j = 0; j < (fw->bss_len/4); j++, offset += 4) {
2268                         REG_WR_IND(bp, offset, fw->bss[j]);
2269                 }
2270         }
2271
2272         /* Load the Read-Only area. */
2273         offset = cpu_reg->spad_base +
2274                 (fw->rodata_addr - cpu_reg->mips_view_base);
2275         if (fw->rodata) {
2276                 int j;
2277
2278                 for (j = 0; j < (fw->rodata_len / 4); j++, offset += 4) {
2279                         REG_WR_IND(bp, offset, fw->rodata[j]);
2280                 }
2281         }
2282
2283         /* Clear the pre-fetch instruction. */
2284         REG_WR_IND(bp, cpu_reg->inst, 0);
2285         REG_WR_IND(bp, cpu_reg->pc, fw->start_addr);
2286
2287         /* Start the CPU. */
2288         val = REG_RD_IND(bp, cpu_reg->mode);
2289         val &= ~cpu_reg->mode_value_halt;
2290         REG_WR_IND(bp, cpu_reg->state, cpu_reg->state_value_clear);
2291         REG_WR_IND(bp, cpu_reg->mode, val);
2292 }
2293
2294 static int
2295 bnx2_init_cpus(struct bnx2 *bp)
2296 {
2297         struct cpu_reg cpu_reg;
2298         struct fw_info fw;
2299         int rc = 0;
2300         void *text;
2301         u32 text_len;
2302
2303         if ((rc = bnx2_gunzip_init(bp)) != 0)
2304                 return rc;
2305
2306         /* Initialize the RV2P processor. */
2307         rc = bnx2_gunzip(bp, bnx2_rv2p_proc1, sizeof(bnx2_rv2p_proc1), &text,
2308                          &text_len);
2309         if (rc)
2310                 goto init_cpu_err;
2311
2312         load_rv2p_fw(bp, text, text_len, RV2P_PROC1);
2313
2314         rc = bnx2_gunzip(bp, bnx2_rv2p_proc2, sizeof(bnx2_rv2p_proc2), &text,
2315                          &text_len);
2316         if (rc)
2317                 goto init_cpu_err;
2318
2319         load_rv2p_fw(bp, text, text_len, RV2P_PROC2);
2320
2321         /* Initialize the RX Processor. */
2322         cpu_reg.mode = BNX2_RXP_CPU_MODE;
2323         cpu_reg.mode_value_halt = BNX2_RXP_CPU_MODE_SOFT_HALT;
2324         cpu_reg.mode_value_sstep = BNX2_RXP_CPU_MODE_STEP_ENA;
2325         cpu_reg.state = BNX2_RXP_CPU_STATE;
2326         cpu_reg.state_value_clear = 0xffffff;
2327         cpu_reg.gpr0 = BNX2_RXP_CPU_REG_FILE;
2328         cpu_reg.evmask = BNX2_RXP_CPU_EVENT_MASK;
2329         cpu_reg.pc = BNX2_RXP_CPU_PROGRAM_COUNTER;
2330         cpu_reg.inst = BNX2_RXP_CPU_INSTRUCTION;
2331         cpu_reg.bp = BNX2_RXP_CPU_HW_BREAKPOINT;
2332         cpu_reg.spad_base = BNX2_RXP_SCRATCH;
2333         cpu_reg.mips_view_base = 0x8000000;
2334
2335         fw.ver_major = bnx2_RXP_b06FwReleaseMajor;
2336         fw.ver_minor = bnx2_RXP_b06FwReleaseMinor;
2337         fw.ver_fix = bnx2_RXP_b06FwReleaseFix;
2338         fw.start_addr = bnx2_RXP_b06FwStartAddr;
2339
2340         fw.text_addr = bnx2_RXP_b06FwTextAddr;
2341         fw.text_len = bnx2_RXP_b06FwTextLen;
2342         fw.text_index = 0;
2343
2344         rc = bnx2_gunzip(bp, bnx2_RXP_b06FwText, sizeof(bnx2_RXP_b06FwText),
2345                          &text, &text_len);
2346         if (rc)
2347                 goto init_cpu_err;
2348
2349         fw.text = text;
2350
2351         fw.data_addr = bnx2_RXP_b06FwDataAddr;
2352         fw.data_len = bnx2_RXP_b06FwDataLen;
2353         fw.data_index = 0;
2354         fw.data = bnx2_RXP_b06FwData;
2355
2356         fw.sbss_addr = bnx2_RXP_b06FwSbssAddr;
2357         fw.sbss_len = bnx2_RXP_b06FwSbssLen;
2358         fw.sbss_index = 0;
2359         fw.sbss = bnx2_RXP_b06FwSbss;
2360
2361         fw.bss_addr = bnx2_RXP_b06FwBssAddr;
2362         fw.bss_len = bnx2_RXP_b06FwBssLen;
2363         fw.bss_index = 0;
2364         fw.bss = bnx2_RXP_b06FwBss;
2365
2366         fw.rodata_addr = bnx2_RXP_b06FwRodataAddr;
2367         fw.rodata_len = bnx2_RXP_b06FwRodataLen;
2368         fw.rodata_index = 0;
2369         fw.rodata = bnx2_RXP_b06FwRodata;
2370
2371         load_cpu_fw(bp, &cpu_reg, &fw);
2372
2373         /* Initialize the TX Processor. */
2374         cpu_reg.mode = BNX2_TXP_CPU_MODE;
2375         cpu_reg.mode_value_halt = BNX2_TXP_CPU_MODE_SOFT_HALT;
2376         cpu_reg.mode_value_sstep = BNX2_TXP_CPU_MODE_STEP_ENA;
2377         cpu_reg.state = BNX2_TXP_CPU_STATE;
2378         cpu_reg.state_value_clear = 0xffffff;
2379         cpu_reg.gpr0 = BNX2_TXP_CPU_REG_FILE;
2380         cpu_reg.evmask = BNX2_TXP_CPU_EVENT_MASK;
2381         cpu_reg.pc = BNX2_TXP_CPU_PROGRAM_COUNTER;
2382         cpu_reg.inst = BNX2_TXP_CPU_INSTRUCTION;
2383         cpu_reg.bp = BNX2_TXP_CPU_HW_BREAKPOINT;
2384         cpu_reg.spad_base = BNX2_TXP_SCRATCH;
2385         cpu_reg.mips_view_base = 0x8000000;
2386
2387         fw.ver_major = bnx2_TXP_b06FwReleaseMajor;
2388         fw.ver_minor = bnx2_TXP_b06FwReleaseMinor;
2389         fw.ver_fix = bnx2_TXP_b06FwReleaseFix;
2390         fw.start_addr = bnx2_TXP_b06FwStartAddr;
2391
2392         fw.text_addr = bnx2_TXP_b06FwTextAddr;
2393         fw.text_len = bnx2_TXP_b06FwTextLen;
2394         fw.text_index = 0;
2395
2396         rc = bnx2_gunzip(bp, bnx2_TXP_b06FwText, sizeof(bnx2_TXP_b06FwText),
2397                          &text, &text_len);
2398         if (rc)
2399                 goto init_cpu_err;
2400
2401         fw.text = text;
2402
2403         fw.data_addr = bnx2_TXP_b06FwDataAddr;
2404         fw.data_len = bnx2_TXP_b06FwDataLen;
2405         fw.data_index = 0;
2406         fw.data = bnx2_TXP_b06FwData;
2407
2408         fw.sbss_addr = bnx2_TXP_b06FwSbssAddr;
2409         fw.sbss_len = bnx2_TXP_b06FwSbssLen;
2410         fw.sbss_index = 0;
2411         fw.sbss = bnx2_TXP_b06FwSbss;
2412
2413         fw.bss_addr = bnx2_TXP_b06FwBssAddr;
2414         fw.bss_len = bnx2_TXP_b06FwBssLen;
2415         fw.bss_index = 0;
2416         fw.bss = bnx2_TXP_b06FwBss;
2417
2418         fw.rodata_addr = bnx2_TXP_b06FwRodataAddr;
2419         fw.rodata_len = bnx2_TXP_b06FwRodataLen;
2420         fw.rodata_index = 0;
2421         fw.rodata = bnx2_TXP_b06FwRodata;
2422
2423         load_cpu_fw(bp, &cpu_reg, &fw);
2424
2425         /* Initialize the TX Patch-up Processor. */
2426         cpu_reg.mode = BNX2_TPAT_CPU_MODE;
2427         cpu_reg.mode_value_halt = BNX2_TPAT_CPU_MODE_SOFT_HALT;
2428         cpu_reg.mode_value_sstep = BNX2_TPAT_CPU_MODE_STEP_ENA;
2429         cpu_reg.state = BNX2_TPAT_CPU_STATE;
2430         cpu_reg.state_value_clear = 0xffffff;
2431         cpu_reg.gpr0 = BNX2_TPAT_CPU_REG_FILE;
2432         cpu_reg.evmask = BNX2_TPAT_CPU_EVENT_MASK;
2433         cpu_reg.pc = BNX2_TPAT_CPU_PROGRAM_COUNTER;
2434         cpu_reg.inst = BNX2_TPAT_CPU_INSTRUCTION;
2435         cpu_reg.bp = BNX2_TPAT_CPU_HW_BREAKPOINT;
2436         cpu_reg.spad_base = BNX2_TPAT_SCRATCH;
2437         cpu_reg.mips_view_base = 0x8000000;
2438
2439         fw.ver_major = bnx2_TPAT_b06FwReleaseMajor;
2440         fw.ver_minor = bnx2_TPAT_b06FwReleaseMinor;
2441         fw.ver_fix = bnx2_TPAT_b06FwReleaseFix;
2442         fw.start_addr = bnx2_TPAT_b06FwStartAddr;
2443
2444         fw.text_addr = bnx2_TPAT_b06FwTextAddr;
2445         fw.text_len = bnx2_TPAT_b06FwTextLen;
2446         fw.text_index = 0;
2447
2448         rc = bnx2_gunzip(bp, bnx2_TPAT_b06FwText, sizeof(bnx2_TPAT_b06FwText),
2449                          &text, &text_len);
2450         if (rc)
2451                 goto init_cpu_err;
2452
2453         fw.text = text;
2454
2455         fw.data_addr = bnx2_TPAT_b06FwDataAddr;
2456         fw.data_len = bnx2_TPAT_b06FwDataLen;
2457         fw.data_index = 0;
2458         fw.data = bnx2_TPAT_b06FwData;
2459
2460         fw.sbss_addr = bnx2_TPAT_b06FwSbssAddr;
2461         fw.sbss_len = bnx2_TPAT_b06FwSbssLen;
2462         fw.sbss_index = 0;
2463         fw.sbss = bnx2_TPAT_b06FwSbss;
2464
2465         fw.bss_addr = bnx2_TPAT_b06FwBssAddr;
2466         fw.bss_len = bnx2_TPAT_b06FwBssLen;
2467         fw.bss_index = 0;
2468         fw.bss = bnx2_TPAT_b06FwBss;
2469
2470         fw.rodata_addr = bnx2_TPAT_b06FwRodataAddr;
2471         fw.rodata_len = bnx2_TPAT_b06FwRodataLen;
2472         fw.rodata_index = 0;
2473         fw.rodata = bnx2_TPAT_b06FwRodata;
2474
2475         load_cpu_fw(bp, &cpu_reg, &fw);
2476
2477         /* Initialize the Completion Processor. */
2478         cpu_reg.mode = BNX2_COM_CPU_MODE;
2479         cpu_reg.mode_value_halt = BNX2_COM_CPU_MODE_SOFT_HALT;
2480         cpu_reg.mode_value_sstep = BNX2_COM_CPU_MODE_STEP_ENA;
2481         cpu_reg.state = BNX2_COM_CPU_STATE;
2482         cpu_reg.state_value_clear = 0xffffff;
2483         cpu_reg.gpr0 = BNX2_COM_CPU_REG_FILE;
2484         cpu_reg.evmask = BNX2_COM_CPU_EVENT_MASK;
2485         cpu_reg.pc = BNX2_COM_CPU_PROGRAM_COUNTER;
2486         cpu_reg.inst = BNX2_COM_CPU_INSTRUCTION;
2487         cpu_reg.bp = BNX2_COM_CPU_HW_BREAKPOINT;
2488         cpu_reg.spad_base = BNX2_COM_SCRATCH;
2489         cpu_reg.mips_view_base = 0x8000000;
2490
2491         fw.ver_major = bnx2_COM_b06FwReleaseMajor;
2492         fw.ver_minor = bnx2_COM_b06FwReleaseMinor;
2493         fw.ver_fix = bnx2_COM_b06FwReleaseFix;
2494         fw.start_addr = bnx2_COM_b06FwStartAddr;
2495
2496         fw.text_addr = bnx2_COM_b06FwTextAddr;
2497         fw.text_len = bnx2_COM_b06FwTextLen;
2498         fw.text_index = 0;
2499
2500         rc = bnx2_gunzip(bp, bnx2_COM_b06FwText, sizeof(bnx2_COM_b06FwText),
2501                          &text, &text_len);
2502         if (rc)
2503                 goto init_cpu_err;
2504
2505         fw.text = text;
2506
2507         fw.data_addr = bnx2_COM_b06FwDataAddr;
2508         fw.data_len = bnx2_COM_b06FwDataLen;
2509         fw.data_index = 0;
2510         fw.data = bnx2_COM_b06FwData;
2511
2512         fw.sbss_addr = bnx2_COM_b06FwSbssAddr;
2513         fw.sbss_len = bnx2_COM_b06FwSbssLen;
2514         fw.sbss_index = 0;
2515         fw.sbss = bnx2_COM_b06FwSbss;
2516
2517         fw.bss_addr = bnx2_COM_b06FwBssAddr;
2518         fw.bss_len = bnx2_COM_b06FwBssLen;
2519         fw.bss_index = 0;
2520         fw.bss = bnx2_COM_b06FwBss;
2521
2522         fw.rodata_addr = bnx2_COM_b06FwRodataAddr;
2523         fw.rodata_len = bnx2_COM_b06FwRodataLen;
2524         fw.rodata_index = 0;
2525         fw.rodata = bnx2_COM_b06FwRodata;
2526
2527         load_cpu_fw(bp, &cpu_reg, &fw);
2528
2529 init_cpu_err:
2530         bnx2_gunzip_end(bp);
2531         return rc;
2532 }
2533
2534 static int
2535 bnx2_set_power_state(struct bnx2 *bp, pci_power_t state)
2536 {
2537         u16 pmcsr;
2538
2539         pci_read_config_word(bp->pdev, bp->pm_cap + PCI_PM_CTRL, &pmcsr);
2540
2541         switch (state) {
2542         case PCI_D0: {
2543                 u32 val;
2544
2545                 pci_write_config_word(bp->pdev, bp->pm_cap + PCI_PM_CTRL,
2546                         (pmcsr & ~PCI_PM_CTRL_STATE_MASK) |
2547                         PCI_PM_CTRL_PME_STATUS);
2548
2549                 if (pmcsr & PCI_PM_CTRL_STATE_MASK)
2550                         /* delay required during transition out of D3hot */
2551                         msleep(20);
2552
2553                 val = REG_RD(bp, BNX2_EMAC_MODE);
2554                 val |= BNX2_EMAC_MODE_MPKT_RCVD | BNX2_EMAC_MODE_ACPI_RCVD;
2555                 val &= ~BNX2_EMAC_MODE_MPKT;
2556                 REG_WR(bp, BNX2_EMAC_MODE, val);
2557
2558                 val = REG_RD(bp, BNX2_RPM_CONFIG);
2559                 val &= ~BNX2_RPM_CONFIG_ACPI_ENA;
2560                 REG_WR(bp, BNX2_RPM_CONFIG, val);
2561                 break;
2562         }
2563         case PCI_D3hot: {
2564                 int i;
2565                 u32 val, wol_msg;
2566
2567                 if (bp->wol) {
2568                         u32 advertising;
2569                         u8 autoneg;
2570
2571                         autoneg = bp->autoneg;
2572                         advertising = bp->advertising;
2573
2574                         bp->autoneg = AUTONEG_SPEED;
2575                         bp->advertising = ADVERTISED_10baseT_Half |
2576                                 ADVERTISED_10baseT_Full |
2577                                 ADVERTISED_100baseT_Half |
2578                                 ADVERTISED_100baseT_Full |
2579                                 ADVERTISED_Autoneg;
2580
2581                         bnx2_setup_copper_phy(bp);
2582
2583                         bp->autoneg = autoneg;
2584                         bp->advertising = advertising;
2585
2586                         bnx2_set_mac_addr(bp);
2587
2588                         val = REG_RD(bp, BNX2_EMAC_MODE);
2589
2590                         /* Enable port mode. */
2591                         val &= ~BNX2_EMAC_MODE_PORT;
2592                         val |= BNX2_EMAC_MODE_PORT_MII |
2593                                BNX2_EMAC_MODE_MPKT_RCVD |
2594                                BNX2_EMAC_MODE_ACPI_RCVD |
2595                                BNX2_EMAC_MODE_MPKT;
2596
2597                         REG_WR(bp, BNX2_EMAC_MODE, val);
2598
2599                         /* receive all multicast */
2600                         for (i = 0; i < NUM_MC_HASH_REGISTERS; i++) {
2601                                 REG_WR(bp, BNX2_EMAC_MULTICAST_HASH0 + (i * 4),
2602                                        0xffffffff);
2603                         }
2604                         REG_WR(bp, BNX2_EMAC_RX_MODE,
2605                                BNX2_EMAC_RX_MODE_SORT_MODE);
2606
2607                         val = 1 | BNX2_RPM_SORT_USER0_BC_EN |
2608                               BNX2_RPM_SORT_USER0_MC_EN;
2609                         REG_WR(bp, BNX2_RPM_SORT_USER0, 0x0);
2610                         REG_WR(bp, BNX2_RPM_SORT_USER0, val);
2611                         REG_WR(bp, BNX2_RPM_SORT_USER0, val |
2612                                BNX2_RPM_SORT_USER0_ENA);
2613
2614                         /* Need to enable EMAC and RPM for WOL. */
2615                         REG_WR(bp, BNX2_MISC_ENABLE_SET_BITS,
2616                                BNX2_MISC_ENABLE_SET_BITS_RX_PARSER_MAC_ENABLE |
2617                                BNX2_MISC_ENABLE_SET_BITS_TX_HEADER_Q_ENABLE |
2618                                BNX2_MISC_ENABLE_SET_BITS_EMAC_ENABLE);
2619
2620                         val = REG_RD(bp, BNX2_RPM_CONFIG);
2621                         val &= ~BNX2_RPM_CONFIG_ACPI_ENA;
2622                         REG_WR(bp, BNX2_RPM_CONFIG, val);
2623
2624                         wol_msg = BNX2_DRV_MSG_CODE_SUSPEND_WOL;
2625                 }
2626                 else {
2627                         wol_msg = BNX2_DRV_MSG_CODE_SUSPEND_NO_WOL;
2628                 }
2629
2630                 if (!(bp->flags & NO_WOL_FLAG))
2631                         bnx2_fw_sync(bp, BNX2_DRV_MSG_DATA_WAIT3 | wol_msg, 0);
2632
2633                 pmcsr &= ~PCI_PM_CTRL_STATE_MASK;
2634                 if ((CHIP_ID(bp) == CHIP_ID_5706_A0) ||
2635                     (CHIP_ID(bp) == CHIP_ID_5706_A1)) {
2636
2637                         if (bp->wol)
2638                                 pmcsr |= 3;
2639                 }
2640                 else {
2641                         pmcsr |= 3;
2642                 }
2643                 if (bp->wol) {
2644                         pmcsr |= PCI_PM_CTRL_PME_ENABLE;
2645                 }
2646                 pci_write_config_word(bp->pdev, bp->pm_cap + PCI_PM_CTRL,
2647                                       pmcsr);
2648
2649                 /* No more memory access after this point until
2650                  * device is brought back to D0.
2651                  */
2652                 udelay(50);
2653                 break;
2654         }
2655         default:
2656                 return -EINVAL;
2657         }
2658         return 0;
2659 }
2660
2661 static int
2662 bnx2_acquire_nvram_lock(struct bnx2 *bp)
2663 {
2664         u32 val;
2665         int j;
2666
2667         /* Request access to the flash interface. */
2668         REG_WR(bp, BNX2_NVM_SW_ARB, BNX2_NVM_SW_ARB_ARB_REQ_SET2);
2669         for (j = 0; j < NVRAM_TIMEOUT_COUNT; j++) {
2670                 val = REG_RD(bp, BNX2_NVM_SW_ARB);
2671                 if (val & BNX2_NVM_SW_ARB_ARB_ARB2)
2672                         break;
2673
2674                 udelay(5);
2675         }
2676
2677         if (j >= NVRAM_TIMEOUT_COUNT)
2678                 return -EBUSY;
2679
2680         return 0;
2681 }
2682
2683 static int
2684 bnx2_release_nvram_lock(struct bnx2 *bp)
2685 {
2686         int j;
2687         u32 val;
2688
2689         /* Relinquish nvram interface. */
2690         REG_WR(bp, BNX2_NVM_SW_ARB, BNX2_NVM_SW_ARB_ARB_REQ_CLR2);
2691
2692         for (j = 0; j < NVRAM_TIMEOUT_COUNT; j++) {
2693                 val = REG_RD(bp, BNX2_NVM_SW_ARB);
2694                 if (!(val & BNX2_NVM_SW_ARB_ARB_ARB2))
2695                         break;
2696
2697                 udelay(5);
2698         }
2699
2700         if (j >= NVRAM_TIMEOUT_COUNT)
2701                 return -EBUSY;
2702
2703         return 0;
2704 }
2705
2706
2707 static int
2708 bnx2_enable_nvram_write(struct bnx2 *bp)
2709 {
2710         u32 val;
2711
2712         val = REG_RD(bp, BNX2_MISC_CFG);
2713         REG_WR(bp, BNX2_MISC_CFG, val | BNX2_MISC_CFG_NVM_WR_EN_PCI);
2714
2715         if (!bp->flash_info->buffered) {
2716                 int j;
2717
2718                 REG_WR(bp, BNX2_NVM_COMMAND, BNX2_NVM_COMMAND_DONE);
2719                 REG_WR(bp, BNX2_NVM_COMMAND,
2720                        BNX2_NVM_COMMAND_WREN | BNX2_NVM_COMMAND_DOIT);
2721
2722                 for (j = 0; j < NVRAM_TIMEOUT_COUNT; j++) {
2723                         udelay(5);
2724
2725                         val = REG_RD(bp, BNX2_NVM_COMMAND);
2726                         if (val & BNX2_NVM_COMMAND_DONE)
2727                                 break;
2728                 }
2729
2730                 if (j >= NVRAM_TIMEOUT_COUNT)
2731                         return -EBUSY;
2732         }
2733         return 0;
2734 }
2735
2736 static void
2737 bnx2_disable_nvram_write(struct bnx2 *bp)
2738 {
2739         u32 val;
2740
2741         val = REG_RD(bp, BNX2_MISC_CFG);
2742         REG_WR(bp, BNX2_MISC_CFG, val & ~BNX2_MISC_CFG_NVM_WR_EN);
2743 }
2744
2745
2746 static void
2747 bnx2_enable_nvram_access(struct bnx2 *bp)
2748 {
2749         u32 val;
2750
2751         val = REG_RD(bp, BNX2_NVM_ACCESS_ENABLE);
2752         /* Enable both bits, even on read. */
2753         REG_WR(bp, BNX2_NVM_ACCESS_ENABLE,
2754                val | BNX2_NVM_ACCESS_ENABLE_EN | BNX2_NVM_ACCESS_ENABLE_WR_EN);
2755 }
2756
2757 static void
2758 bnx2_disable_nvram_access(struct bnx2 *bp)
2759 {
2760         u32 val;
2761
2762         val = REG_RD(bp, BNX2_NVM_ACCESS_ENABLE);
2763         /* Disable both bits, even after read. */
2764         REG_WR(bp, BNX2_NVM_ACCESS_ENABLE,
2765                 val & ~(BNX2_NVM_ACCESS_ENABLE_EN |
2766                         BNX2_NVM_ACCESS_ENABLE_WR_EN));
2767 }
2768
2769 static int
2770 bnx2_nvram_erase_page(struct bnx2 *bp, u32 offset)
2771 {
2772         u32 cmd;
2773         int j;
2774
2775         if (bp->flash_info->buffered)
2776                 /* Buffered flash, no erase needed */
2777                 return 0;
2778
2779         /* Build an erase command */
2780         cmd = BNX2_NVM_COMMAND_ERASE | BNX2_NVM_COMMAND_WR |
2781               BNX2_NVM_COMMAND_DOIT;
2782
2783         /* Need to clear DONE bit separately. */
2784         REG_WR(bp, BNX2_NVM_COMMAND, BNX2_NVM_COMMAND_DONE);
2785
2786         /* Address of the NVRAM to read from. */
2787         REG_WR(bp, BNX2_NVM_ADDR, offset & BNX2_NVM_ADDR_NVM_ADDR_VALUE);
2788
2789         /* Issue an erase command. */
2790         REG_WR(bp, BNX2_NVM_COMMAND, cmd);
2791
2792         /* Wait for completion. */
2793         for (j = 0; j < NVRAM_TIMEOUT_COUNT; j++) {
2794                 u32 val;
2795
2796                 udelay(5);
2797
2798                 val = REG_RD(bp, BNX2_NVM_COMMAND);
2799                 if (val & BNX2_NVM_COMMAND_DONE)
2800                         break;
2801         }
2802
2803         if (j >= NVRAM_TIMEOUT_COUNT)
2804                 return -EBUSY;
2805
2806         return 0;
2807 }
2808
2809 static int
2810 bnx2_nvram_read_dword(struct bnx2 *bp, u32 offset, u8 *ret_val, u32 cmd_flags)
2811 {
2812         u32 cmd;
2813         int j;
2814
2815         /* Build the command word. */
2816         cmd = BNX2_NVM_COMMAND_DOIT | cmd_flags;
2817
2818         /* Calculate an offset of a buffered flash. */
2819         if (bp->flash_info->buffered) {
2820                 offset = ((offset / bp->flash_info->page_size) <<
2821                            bp->flash_info->page_bits) +
2822                           (offset % bp->flash_info->page_size);
2823         }
2824
2825         /* Need to clear DONE bit separately. */
2826         REG_WR(bp, BNX2_NVM_COMMAND, BNX2_NVM_COMMAND_DONE);
2827
2828         /* Address of the NVRAM to read from. */
2829         REG_WR(bp, BNX2_NVM_ADDR, offset & BNX2_NVM_ADDR_NVM_ADDR_VALUE);
2830
2831         /* Issue a read command. */
2832         REG_WR(bp, BNX2_NVM_COMMAND, cmd);
2833
2834         /* Wait for completion. */
2835         for (j = 0; j < NVRAM_TIMEOUT_COUNT; j++) {
2836                 u32 val;
2837
2838                 udelay(5);
2839
2840                 val = REG_RD(bp, BNX2_NVM_COMMAND);
2841                 if (val & BNX2_NVM_COMMAND_DONE) {
2842                         val = REG_RD(bp, BNX2_NVM_READ);
2843
2844                         val = be32_to_cpu(val);
2845                         memcpy(ret_val, &val, 4);
2846                         break;
2847                 }
2848         }
2849         if (j >= NVRAM_TIMEOUT_COUNT)
2850                 return -EBUSY;
2851
2852         return 0;
2853 }
2854
2855
2856 static int
2857 bnx2_nvram_write_dword(struct bnx2 *bp, u32 offset, u8 *val, u32 cmd_flags)
2858 {
2859         u32 cmd, val32;
2860         int j;
2861
2862         /* Build the command word. */
2863         cmd = BNX2_NVM_COMMAND_DOIT | BNX2_NVM_COMMAND_WR | cmd_flags;
2864
2865         /* Calculate an offset of a buffered flash. */
2866         if (bp->flash_info->buffered) {
2867                 offset = ((offset / bp->flash_info->page_size) <<
2868                           bp->flash_info->page_bits) +
2869                          (offset % bp->flash_info->page_size);
2870         }
2871
2872         /* Need to clear DONE bit separately. */
2873         REG_WR(bp, BNX2_NVM_COMMAND, BNX2_NVM_COMMAND_DONE);
2874
2875         memcpy(&val32, val, 4);
2876         val32 = cpu_to_be32(val32);
2877
2878         /* Write the data. */
2879         REG_WR(bp, BNX2_NVM_WRITE, val32);
2880
2881         /* Address of the NVRAM to write to. */
2882         REG_WR(bp, BNX2_NVM_ADDR, offset & BNX2_NVM_ADDR_NVM_ADDR_VALUE);
2883
2884         /* Issue the write command. */
2885         REG_WR(bp, BNX2_NVM_COMMAND, cmd);
2886
2887         /* Wait for completion. */
2888         for (j = 0; j < NVRAM_TIMEOUT_COUNT; j++) {
2889                 udelay(5);
2890
2891                 if (REG_RD(bp, BNX2_NVM_COMMAND) & BNX2_NVM_COMMAND_DONE)
2892                         break;
2893         }
2894         if (j >= NVRAM_TIMEOUT_COUNT)
2895                 return -EBUSY;
2896
2897         return 0;
2898 }
2899
2900 static int
2901 bnx2_init_nvram(struct bnx2 *bp)
2902 {
2903         u32 val;
2904         int j, entry_count, rc;
2905         struct flash_spec *flash;
2906
2907         /* Determine the selected interface. */
2908         val = REG_RD(bp, BNX2_NVM_CFG1);
2909
2910         entry_count = sizeof(flash_table) / sizeof(struct flash_spec);
2911
2912         rc = 0;
2913         if (val & 0x40000000) {
2914
2915                 /* Flash interface has been reconfigured */
2916                 for (j = 0, flash = &flash_table[0]; j < entry_count;
2917                      j++, flash++) {
2918                         if ((val & FLASH_BACKUP_STRAP_MASK) ==
2919                             (flash->config1 & FLASH_BACKUP_STRAP_MASK)) {
2920                                 bp->flash_info = flash;
2921                                 break;
2922                         }
2923                 }
2924         }
2925         else {
2926                 u32 mask;
2927                 /* Not yet been reconfigured */
2928
2929                 if (val & (1 << 23))
2930                         mask = FLASH_BACKUP_STRAP_MASK;
2931                 else
2932                         mask = FLASH_STRAP_MASK;
2933
2934                 for (j = 0, flash = &flash_table[0]; j < entry_count;
2935                         j++, flash++) {
2936
2937                         if ((val & mask) == (flash->strapping & mask)) {
2938                                 bp->flash_info = flash;
2939
2940                                 /* Request access to the flash interface. */
2941                                 if ((rc = bnx2_acquire_nvram_lock(bp)) != 0)
2942                                         return rc;
2943
2944                                 /* Enable access to flash interface */
2945                                 bnx2_enable_nvram_access(bp);
2946
2947                                 /* Reconfigure the flash interface */
2948                                 REG_WR(bp, BNX2_NVM_CFG1, flash->config1);
2949                                 REG_WR(bp, BNX2_NVM_CFG2, flash->config2);
2950                                 REG_WR(bp, BNX2_NVM_CFG3, flash->config3);
2951                                 REG_WR(bp, BNX2_NVM_WRITE1, flash->write1);
2952
2953                                 /* Disable access to flash interface */
2954                                 bnx2_disable_nvram_access(bp);
2955                                 bnx2_release_nvram_lock(bp);
2956
2957                                 break;
2958                         }
2959                 }
2960         } /* if (val & 0x40000000) */
2961
2962         if (j == entry_count) {
2963                 bp->flash_info = NULL;
2964                 printk(KERN_ALERT PFX "Unknown flash/EEPROM type.\n");
2965                 return -ENODEV;
2966         }
2967
2968         val = REG_RD_IND(bp, bp->shmem_base + BNX2_SHARED_HW_CFG_CONFIG2);
2969         val &= BNX2_SHARED_HW_CFG2_NVM_SIZE_MASK;
2970         if (val)
2971                 bp->flash_size = val;
2972         else
2973                 bp->flash_size = bp->flash_info->total_size;
2974
2975         return rc;
2976 }
2977
2978 static int
2979 bnx2_nvram_read(struct bnx2 *bp, u32 offset, u8 *ret_buf,
2980                 int buf_size)
2981 {
2982         int rc = 0;
2983         u32 cmd_flags, offset32, len32, extra;
2984
2985         if (buf_size == 0)
2986                 return 0;
2987
2988         /* Request access to the flash interface. */
2989         if ((rc = bnx2_acquire_nvram_lock(bp)) != 0)
2990                 return rc;
2991
2992         /* Enable access to flash interface */
2993         bnx2_enable_nvram_access(bp);
2994
2995         len32 = buf_size;
2996         offset32 = offset;
2997         extra = 0;
2998
2999         cmd_flags = 0;
3000
3001         if (offset32 & 3) {
3002                 u8 buf[4];
3003                 u32 pre_len;
3004
3005                 offset32 &= ~3;
3006                 pre_len = 4 - (offset & 3);
3007
3008                 if (pre_len >= len32) {
3009                         pre_len = len32;
3010                         cmd_flags = BNX2_NVM_COMMAND_FIRST |
3011                                     BNX2_NVM_COMMAND_LAST;
3012                 }
3013                 else {
3014                         cmd_flags = BNX2_NVM_COMMAND_FIRST;
3015                 }
3016
3017                 rc = bnx2_nvram_read_dword(bp, offset32, buf, cmd_flags);
3018
3019                 if (rc)
3020                         return rc;
3021
3022                 memcpy(ret_buf, buf + (offset & 3), pre_len);
3023
3024                 offset32 += 4;
3025                 ret_buf += pre_len;
3026                 len32 -= pre_len;
3027         }
3028         if (len32 & 3) {
3029                 extra = 4 - (len32 & 3);
3030                 len32 = (len32 + 4) & ~3;
3031         }
3032
3033         if (len32 == 4) {
3034                 u8 buf[4];
3035
3036                 if (cmd_flags)
3037                         cmd_flags = BNX2_NVM_COMMAND_LAST;
3038                 else
3039                         cmd_flags = BNX2_NVM_COMMAND_FIRST |
3040                                     BNX2_NVM_COMMAND_LAST;
3041
3042                 rc = bnx2_nvram_read_dword(bp, offset32, buf, cmd_flags);
3043
3044                 memcpy(ret_buf, buf, 4 - extra);
3045         }
3046         else if (len32 > 0) {
3047                 u8 buf[4];
3048
3049                 /* Read the first word. */
3050                 if (cmd_flags)
3051                         cmd_flags = 0;
3052                 else
3053                         cmd_flags = BNX2_NVM_COMMAND_FIRST;
3054
3055                 rc = bnx2_nvram_read_dword(bp, offset32, ret_buf, cmd_flags);
3056
3057                 /* Advance to the next dword. */
3058                 offset32 += 4;
3059                 ret_buf += 4;
3060                 len32 -= 4;
3061
3062                 while (len32 > 4 && rc == 0) {
3063                         rc = bnx2_nvram_read_dword(bp, offset32, ret_buf, 0);
3064
3065                         /* Advance to the next dword. */
3066                         offset32 += 4;
3067                         ret_buf += 4;
3068                         len32 -= 4;
3069                 }
3070
3071                 if (rc)
3072                         return rc;
3073
3074                 cmd_flags = BNX2_NVM_COMMAND_LAST;
3075                 rc = bnx2_nvram_read_dword(bp, offset32, buf, cmd_flags);
3076
3077                 memcpy(ret_buf, buf, 4 - extra);
3078         }
3079
3080         /* Disable access to flash interface */
3081         bnx2_disable_nvram_access(bp);
3082
3083         bnx2_release_nvram_lock(bp);
3084
3085         return rc;
3086 }
3087
3088 static int
3089 bnx2_nvram_write(struct bnx2 *bp, u32 offset, u8 *data_buf,
3090                 int buf_size)
3091 {
3092         u32 written, offset32, len32;
3093         u8 *buf, start[4], end[4], *flash_buffer = NULL;
3094         int rc = 0;
3095         int align_start, align_end;
3096
3097         buf = data_buf;
3098         offset32 = offset;
3099         len32 = buf_size;
3100         align_start = align_end = 0;
3101
3102         if ((align_start = (offset32 & 3))) {
3103                 offset32 &= ~3;
3104                 len32 += align_start;
3105                 if ((rc = bnx2_nvram_read(bp, offset32, start, 4)))
3106                         return rc;
3107         }
3108
3109         if (len32 & 3) {
3110                 if ((len32 > 4) || !align_start) {
3111                         align_end = 4 - (len32 & 3);
3112                         len32 += align_end;
3113                         if ((rc = bnx2_nvram_read(bp, offset32 + len32 - 4,
3114                                 end, 4))) {
3115                                 return rc;
3116                         }
3117                 }
3118         }
3119
3120         if (align_start || align_end) {
3121                 buf = kmalloc(len32, GFP_KERNEL);
3122                 if (buf == 0)
3123                         return -ENOMEM;
3124                 if (align_start) {
3125                         memcpy(buf, start, 4);
3126                 }
3127                 if (align_end) {
3128                         memcpy(buf + len32 - 4, end, 4);
3129                 }
3130                 memcpy(buf + align_start, data_buf, buf_size);
3131         }
3132
3133         if (bp->flash_info->buffered == 0) {
3134                 flash_buffer = kmalloc(264, GFP_KERNEL);
3135                 if (flash_buffer == NULL) {
3136                         rc = -ENOMEM;
3137                         goto nvram_write_end;
3138                 }
3139         }
3140
3141         written = 0;
3142         while ((written < len32) && (rc == 0)) {
3143                 u32 page_start, page_end, data_start, data_end;
3144                 u32 addr, cmd_flags;
3145                 int i;
3146
3147                 /* Find the page_start addr */
3148                 page_start = offset32 + written;
3149                 page_start -= (page_start % bp->flash_info->page_size);
3150                 /* Find the page_end addr */
3151                 page_end = page_start + bp->flash_info->page_size;
3152                 /* Find the data_start addr */
3153                 data_start = (written == 0) ? offset32 : page_start;
3154                 /* Find the data_end addr */
3155                 data_end = (page_end > offset32 + len32) ?
3156                         (offset32 + len32) : page_end;
3157
3158                 /* Request access to the flash interface. */
3159                 if ((rc = bnx2_acquire_nvram_lock(bp)) != 0)
3160                         goto nvram_write_end;
3161
3162                 /* Enable access to flash interface */
3163                 bnx2_enable_nvram_access(bp);
3164
3165                 cmd_flags = BNX2_NVM_COMMAND_FIRST;
3166                 if (bp->flash_info->buffered == 0) {
3167                         int j;
3168
3169                         /* Read the whole page into the buffer
3170                          * (non-buffer flash only) */
3171                         for (j = 0; j < bp->flash_info->page_size; j += 4) {
3172                                 if (j == (bp->flash_info->page_size - 4)) {
3173                                         cmd_flags |= BNX2_NVM_COMMAND_LAST;
3174                                 }
3175                                 rc = bnx2_nvram_read_dword(bp,
3176                                         page_start + j,
3177                                         &flash_buffer[j],
3178                                         cmd_flags);
3179
3180                                 if (rc)
3181                                         goto nvram_write_end;
3182
3183                                 cmd_flags = 0;
3184                         }
3185                 }
3186
3187                 /* Enable writes to flash interface (unlock write-protect) */
3188                 if ((rc = bnx2_enable_nvram_write(bp)) != 0)
3189                         goto nvram_write_end;
3190
3191                 /* Erase the page */
3192                 if ((rc = bnx2_nvram_erase_page(bp, page_start)) != 0)
3193                         goto nvram_write_end;
3194
3195                 /* Re-enable the write again for the actual write */
3196                 bnx2_enable_nvram_write(bp);
3197
3198                 /* Loop to write back the buffer data from page_start to
3199                  * data_start */
3200                 i = 0;
3201                 if (bp->flash_info->buffered == 0) {
3202                         for (addr = page_start; addr < data_start;
3203                                 addr += 4, i += 4) {
3204
3205                                 rc = bnx2_nvram_write_dword(bp, addr,
3206                                         &flash_buffer[i], cmd_flags);
3207
3208                                 if (rc != 0)
3209                                         goto nvram_write_end;
3210
3211                                 cmd_flags = 0;
3212                         }
3213                 }
3214
3215                 /* Loop to write the new data from data_start to data_end */
3216                 for (addr = data_start; addr < data_end; addr += 4, i += 4) {
3217                         if ((addr == page_end - 4) ||
3218                                 ((bp->flash_info->buffered) &&
3219                                  (addr == data_end - 4))) {
3220
3221                                 cmd_flags |= BNX2_NVM_COMMAND_LAST;
3222                         }
3223                         rc = bnx2_nvram_write_dword(bp, addr, buf,
3224                                 cmd_flags);
3225
3226                         if (rc != 0)
3227                                 goto nvram_write_end;
3228
3229                         cmd_flags = 0;
3230                         buf += 4;
3231                 }
3232
3233                 /* Loop to write back the buffer data from data_end
3234                  * to page_end */
3235                 if (bp->flash_info->buffered == 0) {
3236                         for (addr = data_end; addr < page_end;
3237                                 addr += 4, i += 4) {
3238
3239                                 if (addr == page_end-4) {
3240                                         cmd_flags = BNX2_NVM_COMMAND_LAST;
3241                                 }
3242                                 rc = bnx2_nvram_write_dword(bp, addr,
3243                                         &flash_buffer[i], cmd_flags);
3244
3245                                 if (rc != 0)
3246                                         goto nvram_write_end;
3247
3248                                 cmd_flags = 0;
3249                         }
3250                 }
3251
3252                 /* Disable writes to flash interface (lock write-protect) */
3253                 bnx2_disable_nvram_write(bp);
3254
3255                 /* Disable access to flash interface */
3256                 bnx2_disable_nvram_access(bp);
3257                 bnx2_release_nvram_lock(bp);
3258
3259                 /* Increment written */
3260                 written += data_end - data_start;
3261         }
3262
3263 nvram_write_end:
3264         if (bp->flash_info->buffered == 0)
3265                 kfree(flash_buffer);
3266
3267         if (align_start || align_end)
3268                 kfree(buf);
3269         return rc;
3270 }
3271
3272 static int
3273 bnx2_reset_chip(struct bnx2 *bp, u32 reset_code)
3274 {
3275         u32 val;
3276         int i, rc = 0;
3277
3278         /* Wait for the current PCI transaction to complete before
3279          * issuing a reset. */
3280         REG_WR(bp, BNX2_MISC_ENABLE_CLR_BITS,
3281                BNX2_MISC_ENABLE_CLR_BITS_TX_DMA_ENABLE |
3282                BNX2_MISC_ENABLE_CLR_BITS_DMA_ENGINE_ENABLE |
3283                BNX2_MISC_ENABLE_CLR_BITS_RX_DMA_ENABLE |
3284                BNX2_MISC_ENABLE_CLR_BITS_HOST_COALESCE_ENABLE);
3285         val = REG_RD(bp, BNX2_MISC_ENABLE_CLR_BITS);
3286         udelay(5);
3287
3288         /* Wait for the firmware to tell us it is ok to issue a reset. */
3289         bnx2_fw_sync(bp, BNX2_DRV_MSG_DATA_WAIT0 | reset_code, 1);
3290
3291         /* Deposit a driver reset signature so the firmware knows that
3292          * this is a soft reset. */
3293         REG_WR_IND(bp, bp->shmem_base + BNX2_DRV_RESET_SIGNATURE,
3294                    BNX2_DRV_RESET_SIGNATURE_MAGIC);
3295
3296         /* Do a dummy read to force the chip to complete all current transaction
3297          * before we issue a reset. */
3298         val = REG_RD(bp, BNX2_MISC_ID);
3299
3300         val = BNX2_PCICFG_MISC_CONFIG_CORE_RST_REQ |
3301               BNX2_PCICFG_MISC_CONFIG_REG_WINDOW_ENA |
3302               BNX2_PCICFG_MISC_CONFIG_TARGET_MB_WORD_SWAP;
3303
3304         /* Chip reset. */
3305         REG_WR(bp, BNX2_PCICFG_MISC_CONFIG, val);
3306
3307         if ((CHIP_ID(bp) == CHIP_ID_5706_A0) ||
3308             (CHIP_ID(bp) == CHIP_ID_5706_A1))
3309                 msleep(15);
3310
3311         /* Reset takes approximate 30 usec */
3312         for (i = 0; i < 10; i++) {
3313                 val = REG_RD(bp, BNX2_PCICFG_MISC_CONFIG);
3314                 if ((val & (BNX2_PCICFG_MISC_CONFIG_CORE_RST_REQ |
3315                             BNX2_PCICFG_MISC_CONFIG_CORE_RST_BSY)) == 0) {
3316                         break;
3317                 }
3318                 udelay(10);
3319         }
3320
3321         if (val & (BNX2_PCICFG_MISC_CONFIG_CORE_RST_REQ |
3322                    BNX2_PCICFG_MISC_CONFIG_CORE_RST_BSY)) {
3323                 printk(KERN_ERR PFX "Chip reset did not complete\n");
3324                 return -EBUSY;
3325         }
3326
3327         /* Make sure byte swapping is properly configured. */
3328         val = REG_RD(bp, BNX2_PCI_SWAP_DIAG0);
3329         if (val != 0x01020304) {
3330                 printk(KERN_ERR PFX "Chip not in correct endian mode\n");
3331                 return -ENODEV;
3332         }
3333
3334         /* Wait for the firmware to finish its initialization. */
3335         rc = bnx2_fw_sync(bp, BNX2_DRV_MSG_DATA_WAIT1 | reset_code, 0);
3336         if (rc)
3337                 return rc;
3338
3339         if (CHIP_ID(bp) == CHIP_ID_5706_A0) {
3340                 /* Adjust the voltage regular to two steps lower.  The default
3341                  * of this register is 0x0000000e. */
3342                 REG_WR(bp, BNX2_MISC_VREG_CONTROL, 0x000000fa);
3343
3344                 /* Remove bad rbuf memory from the free pool. */
3345                 rc = bnx2_alloc_bad_rbuf(bp);
3346         }
3347
3348         return rc;
3349 }
3350
3351 static int
3352 bnx2_init_chip(struct bnx2 *bp)
3353 {
3354         u32 val;
3355         int rc;
3356
3357         /* Make sure the interrupt is not active. */
3358         REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD, BNX2_PCICFG_INT_ACK_CMD_MASK_INT);
3359
3360         val = BNX2_DMA_CONFIG_DATA_BYTE_SWAP |
3361               BNX2_DMA_CONFIG_DATA_WORD_SWAP |
3362 #ifdef __BIG_ENDIAN
3363               BNX2_DMA_CONFIG_CNTL_BYTE_SWAP |
3364 #endif
3365               BNX2_DMA_CONFIG_CNTL_WORD_SWAP |
3366               DMA_READ_CHANS << 12 |
3367               DMA_WRITE_CHANS << 16;
3368
3369         val |= (0x2 << 20) | (1 << 11);
3370
3371         if ((bp->flags & PCIX_FLAG) && (bp->bus_speed_mhz == 133))
3372                 val |= (1 << 23);
3373
3374         if ((CHIP_NUM(bp) == CHIP_NUM_5706) &&
3375             (CHIP_ID(bp) != CHIP_ID_5706_A0) && !(bp->flags & PCIX_FLAG))
3376                 val |= BNX2_DMA_CONFIG_CNTL_PING_PONG_DMA;
3377
3378         REG_WR(bp, BNX2_DMA_CONFIG, val);
3379
3380         if (CHIP_ID(bp) == CHIP_ID_5706_A0) {
3381                 val = REG_RD(bp, BNX2_TDMA_CONFIG);
3382                 val |= BNX2_TDMA_CONFIG_ONE_DMA;
3383                 REG_WR(bp, BNX2_TDMA_CONFIG, val);
3384         }
3385
3386         if (bp->flags & PCIX_FLAG) {
3387                 u16 val16;
3388
3389                 pci_read_config_word(bp->pdev, bp->pcix_cap + PCI_X_CMD,
3390                                      &val16);
3391                 pci_write_config_word(bp->pdev, bp->pcix_cap + PCI_X_CMD,
3392                                       val16 & ~PCI_X_CMD_ERO);
3393         }
3394
3395         REG_WR(bp, BNX2_MISC_ENABLE_SET_BITS,
3396                BNX2_MISC_ENABLE_SET_BITS_HOST_COALESCE_ENABLE |
3397                BNX2_MISC_ENABLE_STATUS_BITS_RX_V2P_ENABLE |
3398                BNX2_MISC_ENABLE_STATUS_BITS_CONTEXT_ENABLE);
3399
3400         /* Initialize context mapping and zero out the quick contexts.  The
3401          * context block must have already been enabled. */
3402         bnx2_init_context(bp);
3403
3404         if ((rc = bnx2_init_cpus(bp)) != 0)
3405                 return rc;
3406
3407         bnx2_init_nvram(bp);
3408
3409         bnx2_set_mac_addr(bp);
3410
3411         val = REG_RD(bp, BNX2_MQ_CONFIG);
3412         val &= ~BNX2_MQ_CONFIG_KNL_BYP_BLK_SIZE;
3413         val |= BNX2_MQ_CONFIG_KNL_BYP_BLK_SIZE_256;
3414         REG_WR(bp, BNX2_MQ_CONFIG, val);
3415
3416         val = 0x10000 + (MAX_CID_CNT * MB_KERNEL_CTX_SIZE);
3417         REG_WR(bp, BNX2_MQ_KNL_BYP_WIND_START, val);
3418         REG_WR(bp, BNX2_MQ_KNL_WIND_END, val);
3419
3420         val = (BCM_PAGE_BITS - 8) << 24;
3421         REG_WR(bp, BNX2_RV2P_CONFIG, val);
3422
3423         /* Configure page size. */
3424         val = REG_RD(bp, BNX2_TBDR_CONFIG);
3425         val &= ~BNX2_TBDR_CONFIG_PAGE_SIZE;
3426         val |= (BCM_PAGE_BITS - 8) << 24 | 0x40;
3427         REG_WR(bp, BNX2_TBDR_CONFIG, val);
3428
3429         val = bp->mac_addr[0] +
3430               (bp->mac_addr[1] << 8) +
3431               (bp->mac_addr[2] << 16) +
3432               bp->mac_addr[3] +
3433               (bp->mac_addr[4] << 8) +
3434               (bp->mac_addr[5] << 16);
3435         REG_WR(bp, BNX2_EMAC_BACKOFF_SEED, val);
3436
3437         /* Program the MTU.  Also include 4 bytes for CRC32. */
3438         val = bp->dev->mtu + ETH_HLEN + 4;
3439         if (val > (MAX_ETHERNET_PACKET_SIZE + 4))
3440                 val |= BNX2_EMAC_RX_MTU_SIZE_JUMBO_ENA;
3441         REG_WR(bp, BNX2_EMAC_RX_MTU_SIZE, val);
3442
3443         bp->last_status_idx = 0;
3444         bp->rx_mode = BNX2_EMAC_RX_MODE_SORT_MODE;
3445
3446         /* Set up how to generate a link change interrupt. */
3447         REG_WR(bp, BNX2_EMAC_ATTENTION_ENA, BNX2_EMAC_ATTENTION_ENA_LINK);
3448
3449         REG_WR(bp, BNX2_HC_STATUS_ADDR_L,
3450                (u64) bp->status_blk_mapping & 0xffffffff);
3451         REG_WR(bp, BNX2_HC_STATUS_ADDR_H, (u64) bp->status_blk_mapping >> 32);
3452
3453         REG_WR(bp, BNX2_HC_STATISTICS_ADDR_L,
3454                (u64) bp->stats_blk_mapping & 0xffffffff);
3455         REG_WR(bp, BNX2_HC_STATISTICS_ADDR_H,
3456                (u64) bp->stats_blk_mapping >> 32);
3457
3458         REG_WR(bp, BNX2_HC_TX_QUICK_CONS_TRIP,
3459                (bp->tx_quick_cons_trip_int << 16) | bp->tx_quick_cons_trip);
3460
3461         REG_WR(bp, BNX2_HC_RX_QUICK_CONS_TRIP,
3462                (bp->rx_quick_cons_trip_int << 16) | bp->rx_quick_cons_trip);
3463
3464         REG_WR(bp, BNX2_HC_COMP_PROD_TRIP,
3465                (bp->comp_prod_trip_int << 16) | bp->comp_prod_trip);
3466
3467         REG_WR(bp, BNX2_HC_TX_TICKS, (bp->tx_ticks_int << 16) | bp->tx_ticks);
3468
3469         REG_WR(bp, BNX2_HC_RX_TICKS, (bp->rx_ticks_int << 16) | bp->rx_ticks);
3470
3471         REG_WR(bp, BNX2_HC_COM_TICKS,
3472                (bp->com_ticks_int << 16) | bp->com_ticks);
3473
3474         REG_WR(bp, BNX2_HC_CMD_TICKS,
3475                (bp->cmd_ticks_int << 16) | bp->cmd_ticks);
3476
3477         REG_WR(bp, BNX2_HC_STATS_TICKS, bp->stats_ticks & 0xffff00);
3478         REG_WR(bp, BNX2_HC_STAT_COLLECT_TICKS, 0xbb8);  /* 3ms */
3479
3480         if (CHIP_ID(bp) == CHIP_ID_5706_A1)
3481                 REG_WR(bp, BNX2_HC_CONFIG, BNX2_HC_CONFIG_COLLECT_STATS);
3482         else {
3483                 REG_WR(bp, BNX2_HC_CONFIG, BNX2_HC_CONFIG_RX_TMR_MODE |
3484                        BNX2_HC_CONFIG_TX_TMR_MODE |
3485                        BNX2_HC_CONFIG_COLLECT_STATS);
3486         }
3487
3488         /* Clear internal stats counters. */
3489         REG_WR(bp, BNX2_HC_COMMAND, BNX2_HC_COMMAND_CLR_STAT_NOW);
3490
3491         REG_WR(bp, BNX2_HC_ATTN_BITS_ENABLE, STATUS_ATTN_BITS_LINK_STATE);
3492
3493         if (REG_RD_IND(bp, bp->shmem_base + BNX2_PORT_FEATURE) &
3494             BNX2_PORT_FEATURE_ASF_ENABLED)
3495                 bp->flags |= ASF_ENABLE_FLAG;
3496
3497         /* Initialize the receive filter. */
3498         bnx2_set_rx_mode(bp->dev);
3499
3500         rc = bnx2_fw_sync(bp, BNX2_DRV_MSG_DATA_WAIT2 | BNX2_DRV_MSG_CODE_RESET,
3501                           0);
3502
3503         REG_WR(bp, BNX2_MISC_ENABLE_SET_BITS, 0x5ffffff);
3504         REG_RD(bp, BNX2_MISC_ENABLE_SET_BITS);
3505
3506         udelay(20);
3507
3508         bp->hc_cmd = REG_RD(bp, BNX2_HC_COMMAND);
3509
3510         return rc;
3511 }
3512
3513
3514 static void
3515 bnx2_init_tx_ring(struct bnx2 *bp)
3516 {
3517         struct tx_bd *txbd;
3518         u32 val;
3519
3520         bp->tx_wake_thresh = bp->tx_ring_size / 2;
3521
3522         txbd = &bp->tx_desc_ring[MAX_TX_DESC_CNT];
3523
3524         txbd->tx_bd_haddr_hi = (u64) bp->tx_desc_mapping >> 32;
3525         txbd->tx_bd_haddr_lo = (u64) bp->tx_desc_mapping & 0xffffffff;
3526
3527         bp->tx_prod = 0;
3528         bp->tx_cons = 0;
3529         bp->hw_tx_cons = 0;
3530         bp->tx_prod_bseq = 0;
3531
3532         val = BNX2_L2CTX_TYPE_TYPE_L2;
3533         val |= BNX2_L2CTX_TYPE_SIZE_L2;
3534         CTX_WR(bp, GET_CID_ADDR(TX_CID), BNX2_L2CTX_TYPE, val);
3535
3536         val = BNX2_L2CTX_CMD_TYPE_TYPE_L2;
3537         val |= 8 << 16;
3538         CTX_WR(bp, GET_CID_ADDR(TX_CID), BNX2_L2CTX_CMD_TYPE, val);
3539
3540         val = (u64) bp->tx_desc_mapping >> 32;
3541         CTX_WR(bp, GET_CID_ADDR(TX_CID), BNX2_L2CTX_TBDR_BHADDR_HI, val);
3542
3543         val = (u64) bp->tx_desc_mapping & 0xffffffff;
3544         CTX_WR(bp, GET_CID_ADDR(TX_CID), BNX2_L2CTX_TBDR_BHADDR_LO, val);
3545 }
3546
3547 static void
3548 bnx2_init_rx_ring(struct bnx2 *bp)
3549 {
3550         struct rx_bd *rxbd;
3551         int i;
3552         u16 prod, ring_prod;
3553         u32 val;
3554
3555         /* 8 for CRC and VLAN */
3556         bp->rx_buf_use_size = bp->dev->mtu + ETH_HLEN + bp->rx_offset + 8;
3557         /* 8 for alignment */
3558         bp->rx_buf_size = bp->rx_buf_use_size + 8;
3559
3560         ring_prod = prod = bp->rx_prod = 0;
3561         bp->rx_cons = 0;
3562         bp->hw_rx_cons = 0;
3563         bp->rx_prod_bseq = 0;
3564
3565         for (i = 0; i < bp->rx_max_ring; i++) {
3566                 int j;
3567
3568                 rxbd = &bp->rx_desc_ring[i][0];
3569                 for (j = 0; j < MAX_RX_DESC_CNT; j++, rxbd++) {
3570                         rxbd->rx_bd_len = bp->rx_buf_use_size;
3571                         rxbd->rx_bd_flags = RX_BD_FLAGS_START | RX_BD_FLAGS_END;
3572                 }
3573                 if (i == (bp->rx_max_ring - 1))
3574                         j = 0;
3575                 else
3576                         j = i + 1;
3577                 rxbd->rx_bd_haddr_hi = (u64) bp->rx_desc_mapping[j] >> 32;
3578                 rxbd->rx_bd_haddr_lo = (u64) bp->rx_desc_mapping[j] &
3579                                        0xffffffff;
3580         }
3581
3582         val = BNX2_L2CTX_CTX_TYPE_CTX_BD_CHN_TYPE_VALUE;
3583         val |= BNX2_L2CTX_CTX_TYPE_SIZE_L2;
3584         val |= 0x02 << 8;
3585         CTX_WR(bp, GET_CID_ADDR(RX_CID), BNX2_L2CTX_CTX_TYPE, val);
3586
3587         val = (u64) bp->rx_desc_mapping[0] >> 32;
3588         CTX_WR(bp, GET_CID_ADDR(RX_CID), BNX2_L2CTX_NX_BDHADDR_HI, val);
3589
3590         val = (u64) bp->rx_desc_mapping[0] & 0xffffffff;
3591         CTX_WR(bp, GET_CID_ADDR(RX_CID), BNX2_L2CTX_NX_BDHADDR_LO, val);
3592
3593         for (i = 0; i < bp->rx_ring_size; i++) {
3594                 if (bnx2_alloc_rx_skb(bp, ring_prod) < 0) {
3595                         break;
3596                 }
3597                 prod = NEXT_RX_BD(prod);
3598                 ring_prod = RX_RING_IDX(prod);
3599         }
3600         bp->rx_prod = prod;
3601
3602         REG_WR16(bp, MB_RX_CID_ADDR + BNX2_L2CTX_HOST_BDIDX, prod);
3603
3604         REG_WR(bp, MB_RX_CID_ADDR + BNX2_L2CTX_HOST_BSEQ, bp->rx_prod_bseq);
3605 }
3606
3607 static void
3608 bnx2_set_rx_ring_size(struct bnx2 *bp, u32 size)
3609 {
3610         u32 num_rings, max;
3611
3612         bp->rx_ring_size = size;
3613         num_rings = 1;
3614         while (size > MAX_RX_DESC_CNT) {
3615                 size -= MAX_RX_DESC_CNT;
3616                 num_rings++;
3617         }
3618         /* round to next power of 2 */
3619         max = MAX_RX_RINGS;
3620         while ((max & num_rings) == 0)
3621                 max >>= 1;
3622
3623         if (num_rings != max)
3624                 max <<= 1;
3625
3626         bp->rx_max_ring = max;
3627         bp->rx_max_ring_idx = (bp->rx_max_ring * RX_DESC_CNT) - 1;
3628 }
3629
3630 static void
3631 bnx2_free_tx_skbs(struct bnx2 *bp)
3632 {
3633         int i;
3634
3635         if (bp->tx_buf_ring == NULL)
3636                 return;
3637
3638         for (i = 0; i < TX_DESC_CNT; ) {
3639                 struct sw_bd *tx_buf = &bp->tx_buf_ring[i];
3640                 struct sk_buff *skb = tx_buf->skb;
3641                 int j, last;
3642
3643                 if (skb == NULL) {
3644                         i++;
3645                         continue;
3646                 }
3647
3648                 pci_unmap_single(bp->pdev, pci_unmap_addr(tx_buf, mapping),
3649                         skb_headlen(skb), PCI_DMA_TODEVICE);
3650
3651                 tx_buf->skb = NULL;
3652
3653                 last = skb_shinfo(skb)->nr_frags;
3654                 for (j = 0; j < last; j++) {
3655                         tx_buf = &bp->tx_buf_ring[i + j + 1];
3656                         pci_unmap_page(bp->pdev,
3657                                 pci_unmap_addr(tx_buf, mapping),
3658                                 skb_shinfo(skb)->frags[j].size,
3659                                 PCI_DMA_TODEVICE);
3660                 }
3661                 dev_kfree_skb(skb);
3662                 i += j + 1;
3663         }
3664
3665 }
3666
3667 static void
3668 bnx2_free_rx_skbs(struct bnx2 *bp)
3669 {
3670         int i;
3671
3672         if (bp->rx_buf_ring == NULL)
3673                 return;
3674
3675         for (i = 0; i < bp->rx_max_ring_idx; i++) {
3676                 struct sw_bd *rx_buf = &bp->rx_buf_ring[i];
3677                 struct sk_buff *skb = rx_buf->skb;
3678
3679                 if (skb == NULL)
3680                         continue;
3681
3682                 pci_unmap_single(bp->pdev, pci_unmap_addr(rx_buf, mapping),
3683                         bp->rx_buf_use_size, PCI_DMA_FROMDEVICE);
3684
3685                 rx_buf->skb = NULL;
3686
3687                 dev_kfree_skb(skb);
3688         }
3689 }
3690
3691 static void
3692 bnx2_free_skbs(struct bnx2 *bp)
3693 {
3694         bnx2_free_tx_skbs(bp);
3695         bnx2_free_rx_skbs(bp);
3696 }
3697
3698 static int
3699 bnx2_reset_nic(struct bnx2 *bp, u32 reset_code)
3700 {
3701         int rc;
3702
3703         rc = bnx2_reset_chip(bp, reset_code);
3704         bnx2_free_skbs(bp);
3705         if (rc)
3706                 return rc;
3707
3708         if ((rc = bnx2_init_chip(bp)) != 0)
3709                 return rc;
3710
3711         bnx2_init_tx_ring(bp);
3712         bnx2_init_rx_ring(bp);
3713         return 0;
3714 }
3715
3716 static int
3717 bnx2_init_nic(struct bnx2 *bp)
3718 {
3719         int rc;
3720
3721         if ((rc = bnx2_reset_nic(bp, BNX2_DRV_MSG_CODE_RESET)) != 0)
3722                 return rc;
3723
3724         spin_lock_bh(&bp->phy_lock);
3725         bnx2_init_phy(bp);
3726         spin_unlock_bh(&bp->phy_lock);
3727         bnx2_set_link(bp);
3728         return 0;
3729 }
3730
3731 static int
3732 bnx2_test_registers(struct bnx2 *bp)
3733 {
3734         int ret;
3735         int i;
3736         static const struct {
3737                 u16   offset;
3738                 u16   flags;
3739                 u32   rw_mask;
3740                 u32   ro_mask;
3741         } reg_tbl[] = {
3742                 { 0x006c, 0, 0x00000000, 0x0000003f },
3743                 { 0x0090, 0, 0xffffffff, 0x00000000 },
3744                 { 0x0094, 0, 0x00000000, 0x00000000 },
3745
3746                 { 0x0404, 0, 0x00003f00, 0x00000000 },
3747                 { 0x0418, 0, 0x00000000, 0xffffffff },
3748                 { 0x041c, 0, 0x00000000, 0xffffffff },
3749                 { 0x0420, 0, 0x00000000, 0x80ffffff },
3750                 { 0x0424, 0, 0x00000000, 0x00000000 },
3751                 { 0x0428, 0, 0x00000000, 0x00000001 },
3752                 { 0x0450, 0, 0x00000000, 0x0000ffff },
3753                 { 0x0454, 0, 0x00000000, 0xffffffff },
3754                 { 0x0458, 0, 0x00000000, 0xffffffff },
3755
3756                 { 0x0808, 0, 0x00000000, 0xffffffff },
3757                 { 0x0854, 0, 0x00000000, 0xffffffff },
3758                 { 0x0868, 0, 0x00000000, 0x77777777 },
3759                 { 0x086c, 0, 0x00000000, 0x77777777 },
3760                 { 0x0870, 0, 0x00000000, 0x77777777 },
3761                 { 0x0874, 0, 0x00000000, 0x77777777 },
3762
3763                 { 0x0c00, 0, 0x00000000, 0x00000001 },
3764                 { 0x0c04, 0, 0x00000000, 0x03ff0001 },
3765                 { 0x0c08, 0, 0x0f0ff073, 0x00000000 },
3766
3767                 { 0x1000, 0, 0x00000000, 0x00000001 },
3768                 { 0x1004, 0, 0x00000000, 0x000f0001 },
3769
3770                 { 0x1408, 0, 0x01c00800, 0x00000000 },
3771                 { 0x149c, 0, 0x8000ffff, 0x00000000 },
3772                 { 0x14a8, 0, 0x00000000, 0x000001ff },
3773                 { 0x14ac, 0, 0x0fffffff, 0x10000000 },
3774                 { 0x14b0, 0, 0x00000002, 0x00000001 },
3775                 { 0x14b8, 0, 0x00000000, 0x00000000 },
3776                 { 0x14c0, 0, 0x00000000, 0x00000009 },
3777                 { 0x14c4, 0, 0x00003fff, 0x00000000 },
3778                 { 0x14cc, 0, 0x00000000, 0x00000001 },
3779                 { 0x14d0, 0, 0xffffffff, 0x00000000 },
3780
3781                 { 0x1800, 0, 0x00000000, 0x00000001 },
3782                 { 0x1804, 0, 0x00000000, 0x00000003 },
3783
3784                 { 0x2800, 0, 0x00000000, 0x00000001 },
3785                 { 0x2804, 0, 0x00000000, 0x00003f01 },
3786                 { 0x2808, 0, 0x0f3f3f03, 0x00000000 },
3787                 { 0x2810, 0, 0xffff0000, 0x00000000 },
3788                 { 0x2814, 0, 0xffff0000, 0x00000000 },
3789                 { 0x2818, 0, 0xffff0000, 0x00000000 },
3790                 { 0x281c, 0, 0xffff0000, 0x00000000 },
3791                 { 0x2834, 0, 0xffffffff, 0x00000000 },
3792                 { 0x2840, 0, 0x00000000, 0xffffffff },
3793                 { 0x2844, 0, 0x00000000, 0xffffffff },
3794                 { 0x2848, 0, 0xffffffff, 0x00000000 },
3795                 { 0x284c, 0, 0xf800f800, 0x07ff07ff },
3796
3797                 { 0x2c00, 0, 0x00000000, 0x00000011 },
3798                 { 0x2c04, 0, 0x00000000, 0x00030007 },
3799
3800                 { 0x3c00, 0, 0x00000000, 0x00000001 },
3801                 { 0x3c04, 0, 0x00000000, 0x00070000 },
3802                 { 0x3c08, 0, 0x00007f71, 0x07f00000 },
3803                 { 0x3c0c, 0, 0x1f3ffffc, 0x00000000 },
3804                 { 0x3c10, 0, 0xffffffff, 0x00000000 },
3805                 { 0x3c14, 0, 0x00000000, 0xffffffff },
3806                 { 0x3c18, 0, 0x00000000, 0xffffffff },
3807                 { 0x3c1c, 0, 0xfffff000, 0x00000000 },
3808                 { 0x3c20, 0, 0xffffff00, 0x00000000 },
3809
3810                 { 0x5004, 0, 0x00000000, 0x0000007f },
3811                 { 0x5008, 0, 0x0f0007ff, 0x00000000 },
3812                 { 0x500c, 0, 0xf800f800, 0x07ff07ff },
3813
3814                 { 0x5c00, 0, 0x00000000, 0x00000001 },
3815                 { 0x5c04, 0, 0x00000000, 0x0003000f },
3816                 { 0x5c08, 0, 0x00000003, 0x00000000 },
3817                 { 0x5c0c, 0, 0x0000fff8, 0x00000000 },
3818                 { 0x5c10, 0, 0x00000000, 0xffffffff },
3819                 { 0x5c80, 0, 0x00000000, 0x0f7113f1 },
3820                 { 0x5c84, 0, 0x00000000, 0x0000f333 },
3821                 { 0x5c88, 0, 0x00000000, 0x00077373 },
3822                 { 0x5c8c, 0, 0x00000000, 0x0007f737 },
3823
3824                 { 0x6808, 0, 0x0000ff7f, 0x00000000 },
3825                 { 0x680c, 0, 0xffffffff, 0x00000000 },
3826                 { 0x6810, 0, 0xffffffff, 0x00000000 },
3827                 { 0x6814, 0, 0xffffffff, 0x00000000 },
3828                 { 0x6818, 0, 0xffffffff, 0x00000000 },
3829                 { 0x681c, 0, 0xffffffff, 0x00000000 },
3830                 { 0x6820, 0, 0x00ff00ff, 0x00000000 },
3831                 { 0x6824, 0, 0x00ff00ff, 0x00000000 },
3832                 { 0x6828, 0, 0x00ff00ff, 0x00000000 },
3833                 { 0x682c, 0, 0x03ff03ff, 0x00000000 },
3834                 { 0x6830, 0, 0x03ff03ff, 0x00000000 },
3835                 { 0x6834, 0, 0x03ff03ff, 0x00000000 },
3836                 { 0x6838, 0, 0x03ff03ff, 0x00000000 },
3837                 { 0x683c, 0, 0x0000ffff, 0x00000000 },
3838                 { 0x6840, 0, 0x00000ff0, 0x00000000 },
3839                 { 0x6844, 0, 0x00ffff00, 0x00000000 },
3840                 { 0x684c, 0, 0xffffffff, 0x00000000 },
3841                 { 0x6850, 0, 0x7f7f7f7f, 0x00000000 },
3842                 { 0x6854, 0, 0x7f7f7f7f, 0x00000000 },
3843                 { 0x6858, 0, 0x7f7f7f7f, 0x00000000 },
3844                 { 0x685c, 0, 0x7f7f7f7f, 0x00000000 },
3845                 { 0x6908, 0, 0x00000000, 0x0001ff0f },
3846                 { 0x690c, 0, 0x00000000, 0x0ffe00f0 },
3847
3848                 { 0xffff, 0, 0x00000000, 0x00000000 },
3849         };
3850
3851         ret = 0;
3852         for (i = 0; reg_tbl[i].offset != 0xffff; i++) {
3853                 u32 offset, rw_mask, ro_mask, save_val, val;
3854
3855                 offset = (u32) reg_tbl[i].offset;
3856                 rw_mask = reg_tbl[i].rw_mask;
3857                 ro_mask = reg_tbl[i].ro_mask;
3858
3859                 save_val = readl(bp->regview + offset);
3860
3861                 writel(0, bp->regview + offset);
3862
3863                 val = readl(bp->regview + offset);
3864                 if ((val & rw_mask) != 0) {
3865                         goto reg_test_err;
3866                 }
3867
3868                 if ((val & ro_mask) != (save_val & ro_mask)) {
3869                         goto reg_test_err;
3870                 }
3871
3872                 writel(0xffffffff, bp->regview + offset);
3873
3874                 val = readl(bp->regview + offset);
3875                 if ((val & rw_mask) != rw_mask) {
3876                         goto reg_test_err;
3877                 }
3878
3879                 if ((val & ro_mask) != (save_val & ro_mask)) {
3880                         goto reg_test_err;
3881                 }
3882
3883                 writel(save_val, bp->regview + offset);
3884                 continue;
3885
3886 reg_test_err:
3887                 writel(save_val, bp->regview + offset);
3888                 ret = -ENODEV;
3889                 break;
3890         }
3891         return ret;
3892 }
3893
3894 static int
3895 bnx2_do_mem_test(struct bnx2 *bp, u32 start, u32 size)
3896 {
3897         static const u32 test_pattern[] = { 0x00000000, 0xffffffff, 0x55555555,
3898                 0xaaaaaaaa , 0xaa55aa55, 0x55aa55aa };
3899         int i;
3900
3901         for (i = 0; i < sizeof(test_pattern) / 4; i++) {
3902                 u32 offset;
3903
3904                 for (offset = 0; offset < size; offset += 4) {
3905
3906                         REG_WR_IND(bp, start + offset, test_pattern[i]);
3907
3908                         if (REG_RD_IND(bp, start + offset) !=
3909                                 test_pattern[i]) {
3910                                 return -ENODEV;
3911                         }
3912                 }
3913         }
3914         return 0;
3915 }
3916
3917 static int
3918 bnx2_test_memory(struct bnx2 *bp)
3919 {
3920         int ret = 0;
3921         int i;
3922         static const struct {
3923                 u32   offset;
3924                 u32   len;
3925         } mem_tbl[] = {
3926                 { 0x60000,  0x4000 },
3927                 { 0xa0000,  0x3000 },
3928                 { 0xe0000,  0x4000 },
3929                 { 0x120000, 0x4000 },
3930                 { 0x1a0000, 0x4000 },
3931                 { 0x160000, 0x4000 },
3932                 { 0xffffffff, 0    },
3933         };
3934
3935         for (i = 0; mem_tbl[i].offset != 0xffffffff; i++) {
3936                 if ((ret = bnx2_do_mem_test(bp, mem_tbl[i].offset,
3937                         mem_tbl[i].len)) != 0) {
3938                         return ret;
3939                 }
3940         }
3941
3942         return ret;
3943 }
3944
3945 #define BNX2_MAC_LOOPBACK       0
3946 #define BNX2_PHY_LOOPBACK       1
3947
3948 static int
3949 bnx2_run_loopback(struct bnx2 *bp, int loopback_mode)
3950 {
3951         unsigned int pkt_size, num_pkts, i;
3952         struct sk_buff *skb, *rx_skb;
3953         unsigned char *packet;
3954         u16 rx_start_idx, rx_idx;
3955         dma_addr_t map;
3956         struct tx_bd *txbd;
3957         struct sw_bd *rx_buf;
3958         struct l2_fhdr *rx_hdr;
3959         int ret = -ENODEV;
3960
3961         if (loopback_mode == BNX2_MAC_LOOPBACK) {
3962                 bp->loopback = MAC_LOOPBACK;
3963                 bnx2_set_mac_loopback(bp);
3964         }
3965         else if (loopback_mode == BNX2_PHY_LOOPBACK) {
3966                 bp->loopback = PHY_LOOPBACK;
3967                 bnx2_set_phy_loopback(bp);
3968         }
3969         else
3970                 return -EINVAL;
3971
3972         pkt_size = 1514;
3973         skb = netdev_alloc_skb(bp->dev, pkt_size);
3974         if (!skb)
3975                 return -ENOMEM;
3976         packet = skb_put(skb, pkt_size);
3977         memcpy(packet, bp->mac_addr, 6);
3978         memset(packet + 6, 0x0, 8);
3979         for (i = 14; i < pkt_size; i++)
3980                 packet[i] = (unsigned char) (i & 0xff);
3981
3982         map = pci_map_single(bp->pdev, skb->data, pkt_size,
3983                 PCI_DMA_TODEVICE);
3984
3985         REG_WR(bp, BNX2_HC_COMMAND,
3986                bp->hc_cmd | BNX2_HC_COMMAND_COAL_NOW_WO_INT);
3987
3988         REG_RD(bp, BNX2_HC_COMMAND);
3989
3990         udelay(5);
3991         rx_start_idx = bp->status_blk->status_rx_quick_consumer_index0;
3992
3993         num_pkts = 0;
3994
3995         txbd = &bp->tx_desc_ring[TX_RING_IDX(bp->tx_prod)];
3996
3997         txbd->tx_bd_haddr_hi = (u64) map >> 32;
3998         txbd->tx_bd_haddr_lo = (u64) map & 0xffffffff;
3999         txbd->tx_bd_mss_nbytes = pkt_size;
4000         txbd->tx_bd_vlan_tag_flags = TX_BD_FLAGS_START | TX_BD_FLAGS_END;
4001
4002         num_pkts++;
4003         bp->tx_prod = NEXT_TX_BD(bp->tx_prod);
4004         bp->tx_prod_bseq += pkt_size;
4005
4006         REG_WR16(bp, MB_TX_CID_ADDR + BNX2_L2CTX_TX_HOST_BIDX, bp->tx_prod);
4007         REG_WR(bp, MB_TX_CID_ADDR + BNX2_L2CTX_TX_HOST_BSEQ, bp->tx_prod_bseq);
4008
4009         udelay(100);
4010
4011         REG_WR(bp, BNX2_HC_COMMAND,
4012                bp->hc_cmd | BNX2_HC_COMMAND_COAL_NOW_WO_INT);
4013
4014         REG_RD(bp, BNX2_HC_COMMAND);
4015
4016         udelay(5);
4017
4018         pci_unmap_single(bp->pdev, map, pkt_size, PCI_DMA_TODEVICE);
4019         dev_kfree_skb(skb);
4020
4021         if (bp->status_blk->status_tx_quick_consumer_index0 != bp->tx_prod) {
4022                 goto loopback_test_done;
4023         }
4024
4025         rx_idx = bp->status_blk->status_rx_quick_consumer_index0;
4026         if (rx_idx != rx_start_idx + num_pkts) {
4027                 goto loopback_test_done;
4028         }
4029
4030         rx_buf = &bp->rx_buf_ring[rx_start_idx];
4031         rx_skb = rx_buf->skb;
4032
4033         rx_hdr = (struct l2_fhdr *) rx_skb->data;
4034         skb_reserve(rx_skb, bp->rx_offset);
4035
4036         pci_dma_sync_single_for_cpu(bp->pdev,
4037                 pci_unmap_addr(rx_buf, mapping),
4038                 bp->rx_buf_size, PCI_DMA_FROMDEVICE);
4039
4040         if (rx_hdr->l2_fhdr_status &
4041                 (L2_FHDR_ERRORS_BAD_CRC |
4042                 L2_FHDR_ERRORS_PHY_DECODE |
4043                 L2_FHDR_ERRORS_ALIGNMENT |
4044                 L2_FHDR_ERRORS_TOO_SHORT |
4045                 L2_FHDR_ERRORS_GIANT_FRAME)) {
4046
4047                 goto loopback_test_done;
4048         }
4049
4050         if ((rx_hdr->l2_fhdr_pkt_len - 4) != pkt_size) {
4051                 goto loopback_test_done;
4052         }
4053
4054         for (i = 14; i < pkt_size; i++) {
4055                 if (*(rx_skb->data + i) != (unsigned char) (i & 0xff)) {
4056                         goto loopback_test_done;
4057                 }
4058         }
4059
4060         ret = 0;
4061
4062 loopback_test_done:
4063         bp->loopback = 0;
4064         return ret;
4065 }
4066
4067 #define BNX2_MAC_LOOPBACK_FAILED        1
4068 #define BNX2_PHY_LOOPBACK_FAILED        2
4069 #define BNX2_LOOPBACK_FAILED            (BNX2_MAC_LOOPBACK_FAILED |     \
4070                                          BNX2_PHY_LOOPBACK_FAILED)
4071
4072 static int
4073 bnx2_test_loopback(struct bnx2 *bp)
4074 {
4075         int rc = 0;
4076
4077         if (!netif_running(bp->dev))
4078                 return BNX2_LOOPBACK_FAILED;
4079
4080         bnx2_reset_nic(bp, BNX2_DRV_MSG_CODE_RESET);
4081         spin_lock_bh(&bp->phy_lock);
4082         bnx2_init_phy(bp);
4083         spin_unlock_bh(&bp->phy_lock);
4084         if (bnx2_run_loopback(bp, BNX2_MAC_LOOPBACK))
4085                 rc |= BNX2_MAC_LOOPBACK_FAILED;
4086         if (bnx2_run_loopback(bp, BNX2_PHY_LOOPBACK))
4087                 rc |= BNX2_PHY_LOOPBACK_FAILED;
4088         return rc;
4089 }
4090
4091 #define NVRAM_SIZE 0x200
4092 #define CRC32_RESIDUAL 0xdebb20e3
4093
4094 static int
4095 bnx2_test_nvram(struct bnx2 *bp)
4096 {
4097         u32 buf[NVRAM_SIZE / 4];
4098         u8 *data = (u8 *) buf;
4099         int rc = 0;
4100         u32 magic, csum;
4101
4102         if ((rc = bnx2_nvram_read(bp, 0, data, 4)) != 0)
4103                 goto test_nvram_done;
4104
4105         magic = be32_to_cpu(buf[0]);
4106         if (magic != 0x669955aa) {
4107                 rc = -ENODEV;
4108                 goto test_nvram_done;
4109         }
4110
4111         if ((rc = bnx2_nvram_read(bp, 0x100, data, NVRAM_SIZE)) != 0)
4112                 goto test_nvram_done;
4113
4114         csum = ether_crc_le(0x100, data);
4115         if (csum != CRC32_RESIDUAL) {
4116                 rc = -ENODEV;
4117                 goto test_nvram_done;
4118         }
4119
4120         csum = ether_crc_le(0x100, data + 0x100);
4121         if (csum != CRC32_RESIDUAL) {
4122                 rc = -ENODEV;
4123         }
4124
4125 test_nvram_done:
4126         return rc;
4127 }
4128
4129 static int
4130 bnx2_test_link(struct bnx2 *bp)
4131 {
4132         u32 bmsr;
4133
4134         spin_lock_bh(&bp->phy_lock);
4135         bnx2_read_phy(bp, MII_BMSR, &bmsr);
4136         bnx2_read_phy(bp, MII_BMSR, &bmsr);
4137         spin_unlock_bh(&bp->phy_lock);
4138
4139         if (bmsr & BMSR_LSTATUS) {
4140                 return 0;
4141         }
4142         return -ENODEV;
4143 }
4144
4145 static int
4146 bnx2_test_intr(struct bnx2 *bp)
4147 {
4148         int i;
4149         u16 status_idx;
4150
4151         if (!netif_running(bp->dev))
4152                 return -ENODEV;
4153
4154         status_idx = REG_RD(bp, BNX2_PCICFG_INT_ACK_CMD) & 0xffff;
4155
4156         /* This register is not touched during run-time. */
4157         REG_WR(bp, BNX2_HC_COMMAND, bp->hc_cmd | BNX2_HC_COMMAND_COAL_NOW);
4158         REG_RD(bp, BNX2_HC_COMMAND);
4159
4160         for (i = 0; i < 10; i++) {
4161                 if ((REG_RD(bp, BNX2_PCICFG_INT_ACK_CMD) & 0xffff) !=
4162                         status_idx) {
4163
4164                         break;
4165                 }
4166
4167                 msleep_interruptible(10);
4168         }
4169         if (i < 10)
4170                 return 0;
4171
4172         return -ENODEV;
4173 }
4174
4175 static void
4176 bnx2_timer(unsigned long data)
4177 {
4178         struct bnx2 *bp = (struct bnx2 *) data;
4179         u32 msg;
4180
4181         if (!netif_running(bp->dev))
4182                 return;
4183
4184         if (atomic_read(&bp->intr_sem) != 0)
4185                 goto bnx2_restart_timer;
4186
4187         msg = (u32) ++bp->fw_drv_pulse_wr_seq;
4188         REG_WR_IND(bp, bp->shmem_base + BNX2_DRV_PULSE_MB, msg);
4189
4190         bp->stats_blk->stat_FwRxDrop = REG_RD_IND(bp, BNX2_FW_RX_DROP_COUNT);
4191
4192         if ((bp->phy_flags & PHY_SERDES_FLAG) &&
4193             (CHIP_NUM(bp) == CHIP_NUM_5706)) {
4194
4195                 spin_lock(&bp->phy_lock);
4196                 if (bp->serdes_an_pending) {
4197                         bp->serdes_an_pending--;
4198                 }
4199                 else if ((bp->link_up == 0) && (bp->autoneg & AUTONEG_SPEED)) {
4200                         u32 bmcr;
4201
4202                         bp->current_interval = bp->timer_interval;
4203
4204                         bnx2_read_phy(bp, MII_BMCR, &bmcr);
4205
4206                         if (bmcr & BMCR_ANENABLE) {
4207                                 u32 phy1, phy2;
4208
4209                                 bnx2_write_phy(bp, 0x1c, 0x7c00);
4210                                 bnx2_read_phy(bp, 0x1c, &phy1);
4211
4212                                 bnx2_write_phy(bp, 0x17, 0x0f01);
4213                                 bnx2_read_phy(bp, 0x15, &phy2);
4214                                 bnx2_write_phy(bp, 0x17, 0x0f01);
4215                                 bnx2_read_phy(bp, 0x15, &phy2);
4216
4217                                 if ((phy1 & 0x10) &&    /* SIGNAL DETECT */
4218                                         !(phy2 & 0x20)) {       /* no CONFIG */
4219
4220                                         bmcr &= ~BMCR_ANENABLE;
4221                                         bmcr |= BMCR_SPEED1000 |
4222                                                 BMCR_FULLDPLX;
4223                                         bnx2_write_phy(bp, MII_BMCR, bmcr);
4224                                         bp->phy_flags |=
4225                                                 PHY_PARALLEL_DETECT_FLAG;
4226                                 }
4227                         }
4228                 }
4229                 else if ((bp->link_up) && (bp->autoneg & AUTONEG_SPEED) &&
4230                         (bp->phy_flags & PHY_PARALLEL_DETECT_FLAG)) {
4231                         u32 phy2;
4232
4233                         bnx2_write_phy(bp, 0x17, 0x0f01);
4234                         bnx2_read_phy(bp, 0x15, &phy2);
4235                         if (phy2 & 0x20) {
4236                                 u32 bmcr;
4237
4238                                 bnx2_read_phy(bp, MII_BMCR, &bmcr);
4239                                 bmcr |= BMCR_ANENABLE;
4240                                 bnx2_write_phy(bp, MII_BMCR, bmcr);
4241
4242                                 bp->phy_flags &= ~PHY_PARALLEL_DETECT_FLAG;
4243
4244                         }
4245                 }
4246                 else
4247                         bp->current_interval = bp->timer_interval;
4248
4249                 spin_unlock(&bp->phy_lock);
4250         }
4251
4252 bnx2_restart_timer:
4253         mod_timer(&bp->timer, jiffies + bp->current_interval);
4254 }
4255
4256 /* Called with rtnl_lock */
4257 static int
4258 bnx2_open(struct net_device *dev)
4259 {
4260         struct bnx2 *bp = netdev_priv(dev);
4261         int rc;
4262
4263         bnx2_set_power_state(bp, PCI_D0);
4264         bnx2_disable_int(bp);
4265
4266         rc = bnx2_alloc_mem(bp);
4267         if (rc)
4268                 return rc;
4269
4270         if ((CHIP_ID(bp) != CHIP_ID_5706_A0) &&
4271                 (CHIP_ID(bp) != CHIP_ID_5706_A1) &&
4272                 !disable_msi) {
4273
4274                 if (pci_enable_msi(bp->pdev) == 0) {
4275                         bp->flags |= USING_MSI_FLAG;
4276                         rc = request_irq(bp->pdev->irq, bnx2_msi, 0, dev->name,
4277                                         dev);
4278                 }
4279                 else {
4280                         rc = request_irq(bp->pdev->irq, bnx2_interrupt,
4281                                         IRQF_SHARED, dev->name, dev);
4282                 }
4283         }
4284         else {
4285                 rc = request_irq(bp->pdev->irq, bnx2_interrupt, IRQF_SHARED,
4286                                 dev->name, dev);
4287         }
4288         if (rc) {
4289                 bnx2_free_mem(bp);
4290                 return rc;
4291         }
4292
4293         rc = bnx2_init_nic(bp);
4294
4295         if (rc) {
4296                 free_irq(bp->pdev->irq, dev);
4297                 if (bp->flags & USING_MSI_FLAG) {
4298                         pci_disable_msi(bp->pdev);
4299                         bp->flags &= ~USING_MSI_FLAG;
4300                 }
4301                 bnx2_free_skbs(bp);
4302                 bnx2_free_mem(bp);
4303                 return rc;
4304         }
4305
4306         mod_timer(&bp->timer, jiffies + bp->current_interval);
4307
4308         atomic_set(&bp->intr_sem, 0);
4309
4310         bnx2_enable_int(bp);
4311
4312         if (bp->flags & USING_MSI_FLAG) {
4313                 /* Test MSI to make sure it is working
4314                  * If MSI test fails, go back to INTx mode
4315                  */
4316                 if (bnx2_test_intr(bp) != 0) {
4317                         printk(KERN_WARNING PFX "%s: No interrupt was generated"
4318                                " using MSI, switching to INTx mode. Please"
4319                                " report this failure to the PCI maintainer"
4320                                " and include system chipset information.\n",
4321                                bp->dev->name);
4322
4323                         bnx2_disable_int(bp);
4324                         free_irq(bp->pdev->irq, dev);
4325                         pci_disable_msi(bp->pdev);
4326                         bp->flags &= ~USING_MSI_FLAG;
4327
4328                         rc = bnx2_init_nic(bp);
4329
4330                         if (!rc) {
4331                                 rc = request_irq(bp->pdev->irq, bnx2_interrupt,
4332                                         IRQF_SHARED, dev->name, dev);
4333                         }
4334                         if (rc) {
4335                                 bnx2_free_skbs(bp);
4336                                 bnx2_free_mem(bp);
4337                                 del_timer_sync(&bp->timer);
4338                                 return rc;
4339                         }
4340                         bnx2_enable_int(bp);
4341                 }
4342         }
4343         if (bp->flags & USING_MSI_FLAG) {
4344                 printk(KERN_INFO PFX "%s: using MSI\n", dev->name);
4345         }
4346
4347         netif_start_queue(dev);
4348
4349         return 0;
4350 }
4351
4352 static void
4353 bnx2_reset_task(void *data)
4354 {
4355         struct bnx2 *bp = data;
4356
4357         if (!netif_running(bp->dev))
4358                 return;
4359
4360         bp->in_reset_task = 1;
4361         bnx2_netif_stop(bp);
4362
4363         bnx2_init_nic(bp);
4364
4365         atomic_set(&bp->intr_sem, 1);
4366         bnx2_netif_start(bp);
4367         bp->in_reset_task = 0;
4368 }
4369
4370 static void
4371 bnx2_tx_timeout(struct net_device *dev)
4372 {
4373         struct bnx2 *bp = netdev_priv(dev);
4374
4375         /* This allows the netif to be shutdown gracefully before resetting */
4376         schedule_work(&bp->reset_task);
4377 }
4378
4379 #ifdef BCM_VLAN
4380 /* Called with rtnl_lock */
4381 static void
4382 bnx2_vlan_rx_register(struct net_device *dev, struct vlan_group *vlgrp)
4383 {
4384         struct bnx2 *bp = netdev_priv(dev);
4385
4386         bnx2_netif_stop(bp);
4387
4388         bp->vlgrp = vlgrp;
4389         bnx2_set_rx_mode(dev);
4390
4391         bnx2_netif_start(bp);
4392 }
4393
4394 /* Called with rtnl_lock */
4395 static void
4396 bnx2_vlan_rx_kill_vid(struct net_device *dev, uint16_t vid)
4397 {
4398         struct bnx2 *bp = netdev_priv(dev);
4399
4400         bnx2_netif_stop(bp);
4401
4402         if (bp->vlgrp)
4403                 bp->vlgrp->vlan_devices[vid] = NULL;
4404         bnx2_set_rx_mode(dev);
4405
4406         bnx2_netif_start(bp);
4407 }
4408 #endif
4409
4410 /* Called with netif_tx_lock.
4411  * bnx2_tx_int() runs without netif_tx_lock unless it needs to call
4412  * netif_wake_queue().
4413  */
4414 static int
4415 bnx2_start_xmit(struct sk_buff *skb, struct net_device *dev)
4416 {
4417         struct bnx2 *bp = netdev_priv(dev);
4418         dma_addr_t mapping;
4419         struct tx_bd *txbd;
4420         struct sw_bd *tx_buf;
4421         u32 len, vlan_tag_flags, last_frag, mss;
4422         u16 prod, ring_prod;
4423         int i;
4424
4425         if (unlikely(bnx2_tx_avail(bp) < (skb_shinfo(skb)->nr_frags + 1))) {
4426                 netif_stop_queue(dev);
4427                 printk(KERN_ERR PFX "%s: BUG! Tx ring full when queue awake!\n",
4428                         dev->name);
4429
4430                 return NETDEV_TX_BUSY;
4431         }
4432         len = skb_headlen(skb);
4433         prod = bp->tx_prod;
4434         ring_prod = TX_RING_IDX(prod);
4435
4436         vlan_tag_flags = 0;
4437         if (skb->ip_summed == CHECKSUM_PARTIAL) {
4438                 vlan_tag_flags |= TX_BD_FLAGS_TCP_UDP_CKSUM;
4439         }
4440
4441         if (bp->vlgrp != 0 && vlan_tx_tag_present(skb)) {
4442                 vlan_tag_flags |=
4443                         (TX_BD_FLAGS_VLAN_TAG | (vlan_tx_tag_get(skb) << 16));
4444         }
4445 #ifdef BCM_TSO
4446         if ((mss = skb_shinfo(skb)->gso_size) &&
4447                 (skb->len > (bp->dev->mtu + ETH_HLEN))) {
4448                 u32 tcp_opt_len, ip_tcp_len;
4449
4450                 if (skb_header_cloned(skb) &&
4451                     pskb_expand_head(skb, 0, 0, GFP_ATOMIC)) {
4452                         dev_kfree_skb(skb);
4453                         return NETDEV_TX_OK;
4454                 }
4455
4456                 tcp_opt_len = ((skb->h.th->doff - 5) * 4);
4457                 vlan_tag_flags |= TX_BD_FLAGS_SW_LSO;
4458
4459                 tcp_opt_len = 0;
4460                 if (skb->h.th->doff > 5) {
4461                         tcp_opt_len = (skb->h.th->doff - 5) << 2;
4462                 }
4463                 ip_tcp_len = (skb->nh.iph->ihl << 2) + sizeof(struct tcphdr);
4464
4465                 skb->nh.iph->check = 0;
4466                 skb->nh.iph->tot_len = htons(mss + ip_tcp_len + tcp_opt_len);
4467                 skb->h.th->check =
4468                         ~csum_tcpudp_magic(skb->nh.iph->saddr,
4469                                             skb->nh.iph->daddr,
4470                                             0, IPPROTO_TCP, 0);
4471
4472                 if (tcp_opt_len || (skb->nh.iph->ihl > 5)) {
4473                         vlan_tag_flags |= ((skb->nh.iph->ihl - 5) +
4474                                 (tcp_opt_len >> 2)) << 8;
4475                 }
4476         }
4477         else
4478 #endif
4479         {
4480                 mss = 0;
4481         }
4482
4483         mapping = pci_map_single(bp->pdev, skb->data, len, PCI_DMA_TODEVICE);
4484
4485         tx_buf = &bp->tx_buf_ring[ring_prod];
4486         tx_buf->skb = skb;
4487         pci_unmap_addr_set(tx_buf, mapping, mapping);
4488
4489         txbd = &bp->tx_desc_ring[ring_prod];
4490
4491         txbd->tx_bd_haddr_hi = (u64) mapping >> 32;
4492         txbd->tx_bd_haddr_lo = (u64) mapping & 0xffffffff;
4493         txbd->tx_bd_mss_nbytes = len | (mss << 16);
4494         txbd->tx_bd_vlan_tag_flags = vlan_tag_flags | TX_BD_FLAGS_START;
4495
4496         last_frag = skb_shinfo(skb)->nr_frags;
4497
4498         for (i = 0; i < last_frag; i++) {
4499                 skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
4500
4501                 prod = NEXT_TX_BD(prod);
4502                 ring_prod = TX_RING_IDX(prod);
4503                 txbd = &bp->tx_desc_ring[ring_prod];
4504
4505                 len = frag->size;
4506                 mapping = pci_map_page(bp->pdev, frag->page, frag->page_offset,
4507                         len, PCI_DMA_TODEVICE);
4508                 pci_unmap_addr_set(&bp->tx_buf_ring[ring_prod],
4509                                 mapping, mapping);
4510
4511                 txbd->tx_bd_haddr_hi = (u64) mapping >> 32;
4512                 txbd->tx_bd_haddr_lo = (u64) mapping & 0xffffffff;
4513                 txbd->tx_bd_mss_nbytes = len | (mss << 16);
4514                 txbd->tx_bd_vlan_tag_flags = vlan_tag_flags;
4515
4516         }
4517         txbd->tx_bd_vlan_tag_flags |= TX_BD_FLAGS_END;
4518
4519         prod = NEXT_TX_BD(prod);
4520         bp->tx_prod_bseq += skb->len;
4521
4522         REG_WR16(bp, MB_TX_CID_ADDR + BNX2_L2CTX_TX_HOST_BIDX, prod);
4523         REG_WR(bp, MB_TX_CID_ADDR + BNX2_L2CTX_TX_HOST_BSEQ, bp->tx_prod_bseq);
4524
4525         mmiowb();
4526
4527         bp->tx_prod = prod;
4528         dev->trans_start = jiffies;
4529
4530         if (unlikely(bnx2_tx_avail(bp) <= MAX_SKB_FRAGS)) {
4531                 netif_stop_queue(dev);
4532                 if (bnx2_tx_avail(bp) > bp->tx_wake_thresh)
4533                         netif_wake_queue(dev);
4534         }
4535
4536         return NETDEV_TX_OK;
4537 }
4538
4539 /* Called with rtnl_lock */
4540 static int
4541 bnx2_close(struct net_device *dev)
4542 {
4543         struct bnx2 *bp = netdev_priv(dev);
4544         u32 reset_code;
4545
4546         /* Calling flush_scheduled_work() may deadlock because
4547          * linkwatch_event() may be on the workqueue and it will try to get
4548          * the rtnl_lock which we are holding.
4549          */
4550         while (bp->in_reset_task)
4551                 msleep(1);
4552
4553         bnx2_netif_stop(bp);
4554         del_timer_sync(&bp->timer);
4555         if (bp->flags & NO_WOL_FLAG)
4556                 reset_code = BNX2_DRV_MSG_CODE_UNLOAD_LNK_DN;
4557         else if (bp->wol)
4558                 reset_code = BNX2_DRV_MSG_CODE_SUSPEND_WOL;
4559         else
4560                 reset_code = BNX2_DRV_MSG_CODE_SUSPEND_NO_WOL;
4561         bnx2_reset_chip(bp, reset_code);
4562         free_irq(bp->pdev->irq, dev);
4563         if (bp->flags & USING_MSI_FLAG) {
4564                 pci_disable_msi(bp->pdev);
4565                 bp->flags &= ~USING_MSI_FLAG;
4566         }
4567         bnx2_free_skbs(bp);
4568         bnx2_free_mem(bp);
4569         bp->link_up = 0;
4570         netif_carrier_off(bp->dev);
4571         bnx2_set_power_state(bp, PCI_D3hot);
4572         return 0;
4573 }
4574
4575 #define GET_NET_STATS64(ctr)                                    \
4576         (unsigned long) ((unsigned long) (ctr##_hi) << 32) +    \
4577         (unsigned long) (ctr##_lo)
4578
4579 #define GET_NET_STATS32(ctr)            \
4580         (ctr##_lo)
4581
4582 #if (BITS_PER_LONG == 64)
4583 #define GET_NET_STATS   GET_NET_STATS64
4584 #else
4585 #define GET_NET_STATS   GET_NET_STATS32
4586 #endif
4587
4588 static struct net_device_stats *
4589 bnx2_get_stats(struct net_device *dev)
4590 {
4591         struct bnx2 *bp = netdev_priv(dev);
4592         struct statistics_block *stats_blk = bp->stats_blk;
4593         struct net_device_stats *net_stats = &bp->net_stats;
4594
4595         if (bp->stats_blk == NULL) {
4596                 return net_stats;
4597         }
4598         net_stats->rx_packets =
4599                 GET_NET_STATS(stats_blk->stat_IfHCInUcastPkts) +
4600                 GET_NET_STATS(stats_blk->stat_IfHCInMulticastPkts) +
4601                 GET_NET_STATS(stats_blk->stat_IfHCInBroadcastPkts);
4602
4603         net_stats->tx_packets =
4604                 GET_NET_STATS(stats_blk->stat_IfHCOutUcastPkts) +
4605                 GET_NET_STATS(stats_blk->stat_IfHCOutMulticastPkts) +
4606                 GET_NET_STATS(stats_blk->stat_IfHCOutBroadcastPkts);
4607
4608         net_stats->rx_bytes =
4609                 GET_NET_STATS(stats_blk->stat_IfHCInOctets);
4610
4611         net_stats->tx_bytes =
4612                 GET_NET_STATS(stats_blk->stat_IfHCOutOctets);
4613
4614         net_stats->multicast =
4615                 GET_NET_STATS(stats_blk->stat_IfHCOutMulticastPkts);
4616
4617         net_stats->collisions =
4618                 (unsigned long) stats_blk->stat_EtherStatsCollisions;
4619
4620         net_stats->rx_length_errors =
4621                 (unsigned long) (stats_blk->stat_EtherStatsUndersizePkts +
4622                 stats_blk->stat_EtherStatsOverrsizePkts);
4623
4624         net_stats->rx_over_errors =
4625                 (unsigned long) stats_blk->stat_IfInMBUFDiscards;
4626
4627         net_stats->rx_frame_errors =
4628                 (unsigned long) stats_blk->stat_Dot3StatsAlignmentErrors;
4629
4630         net_stats->rx_crc_errors =
4631                 (unsigned long) stats_blk->stat_Dot3StatsFCSErrors;
4632
4633         net_stats->rx_errors = net_stats->rx_length_errors +
4634                 net_stats->rx_over_errors + net_stats->rx_frame_errors +
4635                 net_stats->rx_crc_errors;
4636
4637         net_stats->tx_aborted_errors =
4638                 (unsigned long) (stats_blk->stat_Dot3StatsExcessiveCollisions +
4639                 stats_blk->stat_Dot3StatsLateCollisions);
4640
4641         if ((CHIP_NUM(bp) == CHIP_NUM_5706) ||
4642             (CHIP_ID(bp) == CHIP_ID_5708_A0))
4643                 net_stats->tx_carrier_errors = 0;
4644         else {
4645                 net_stats->tx_carrier_errors =
4646                         (unsigned long)
4647                         stats_blk->stat_Dot3StatsCarrierSenseErrors;
4648         }
4649
4650         net_stats->tx_errors =
4651                 (unsigned long)
4652                 stats_blk->stat_emac_tx_stat_dot3statsinternalmactransmiterrors
4653                 +
4654                 net_stats->tx_aborted_errors +
4655                 net_stats->tx_carrier_errors;
4656
4657         net_stats->rx_missed_errors =
4658                 (unsigned long) (stats_blk->stat_IfInMBUFDiscards +
4659                 stats_blk->stat_FwRxDrop);
4660
4661         return net_stats;
4662 }
4663
4664 /* All ethtool functions called with rtnl_lock */
4665
4666 static int
4667 bnx2_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
4668 {
4669         struct bnx2 *bp = netdev_priv(dev);
4670
4671         cmd->supported = SUPPORTED_Autoneg;
4672         if (bp->phy_flags & PHY_SERDES_FLAG) {
4673                 cmd->supported |= SUPPORTED_1000baseT_Full |
4674                         SUPPORTED_FIBRE;
4675
4676                 cmd->port = PORT_FIBRE;
4677         }
4678         else {
4679                 cmd->supported |= SUPPORTED_10baseT_Half |
4680                         SUPPORTED_10baseT_Full |
4681                         SUPPORTED_100baseT_Half |
4682                         SUPPORTED_100baseT_Full |
4683                         SUPPORTED_1000baseT_Full |
4684                         SUPPORTED_TP;
4685
4686                 cmd->port = PORT_TP;
4687         }
4688
4689         cmd->advertising = bp->advertising;
4690
4691         if (bp->autoneg & AUTONEG_SPEED) {
4692                 cmd->autoneg = AUTONEG_ENABLE;
4693         }
4694         else {
4695                 cmd->autoneg = AUTONEG_DISABLE;
4696         }
4697
4698         if (netif_carrier_ok(dev)) {
4699                 cmd->speed = bp->line_speed;
4700                 cmd->duplex = bp->duplex;
4701         }
4702         else {
4703                 cmd->speed = -1;
4704                 cmd->duplex = -1;
4705         }
4706
4707         cmd->transceiver = XCVR_INTERNAL;
4708         cmd->phy_address = bp->phy_addr;
4709
4710         return 0;
4711 }
4712
4713 static int
4714 bnx2_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
4715 {
4716         struct bnx2 *bp = netdev_priv(dev);
4717         u8 autoneg = bp->autoneg;
4718         u8 req_duplex = bp->req_duplex;
4719         u16 req_line_speed = bp->req_line_speed;
4720         u32 advertising = bp->advertising;
4721
4722         if (cmd->autoneg == AUTONEG_ENABLE) {
4723                 autoneg |= AUTONEG_SPEED;
4724
4725                 cmd->advertising &= ETHTOOL_ALL_COPPER_SPEED;
4726
4727                 /* allow advertising 1 speed */
4728                 if ((cmd->advertising == ADVERTISED_10baseT_Half) ||
4729                         (cmd->advertising == ADVERTISED_10baseT_Full) ||
4730                         (cmd->advertising == ADVERTISED_100baseT_Half) ||
4731                         (cmd->advertising == ADVERTISED_100baseT_Full)) {
4732
4733                         if (bp->phy_flags & PHY_SERDES_FLAG)
4734                                 return -EINVAL;
4735
4736                         advertising = cmd->advertising;
4737
4738                 }
4739                 else if (cmd->advertising == ADVERTISED_1000baseT_Full) {
4740                         advertising = cmd->advertising;
4741                 }
4742                 else if (cmd->advertising == ADVERTISED_1000baseT_Half) {
4743                         return -EINVAL;
4744                 }
4745                 else {
4746                         if (bp->phy_flags & PHY_SERDES_FLAG) {
4747                                 advertising = ETHTOOL_ALL_FIBRE_SPEED;
4748                         }
4749                         else {
4750                                 advertising = ETHTOOL_ALL_COPPER_SPEED;
4751                         }
4752                 }
4753                 advertising |= ADVERTISED_Autoneg;
4754         }
4755         else {
4756                 if (bp->phy_flags & PHY_SERDES_FLAG) {
4757                         if ((cmd->speed != SPEED_1000 &&
4758                              cmd->speed != SPEED_2500) ||
4759                             (cmd->duplex != DUPLEX_FULL))
4760                                 return -EINVAL;
4761
4762                         if (cmd->speed == SPEED_2500 &&
4763                             !(bp->phy_flags & PHY_2_5G_CAPABLE_FLAG))
4764                                 return -EINVAL;
4765                 }
4766                 else if (cmd->speed == SPEED_1000) {
4767                         return -EINVAL;
4768                 }
4769                 autoneg &= ~AUTONEG_SPEED;
4770                 req_line_speed = cmd->speed;
4771                 req_duplex = cmd->duplex;
4772                 advertising = 0;
4773         }
4774
4775         bp->autoneg = autoneg;
4776         bp->advertising = advertising;
4777         bp->req_line_speed = req_line_speed;
4778         bp->req_duplex = req_duplex;
4779
4780         spin_lock_bh(&bp->phy_lock);
4781
4782         bnx2_setup_phy(bp);
4783
4784         spin_unlock_bh(&bp->phy_lock);
4785
4786         return 0;
4787 }
4788
4789 static void
4790 bnx2_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)
4791 {
4792         struct bnx2 *bp = netdev_priv(dev);
4793
4794         strcpy(info->driver, DRV_MODULE_NAME);
4795         strcpy(info->version, DRV_MODULE_VERSION);
4796         strcpy(info->bus_info, pci_name(bp->pdev));
4797         info->fw_version[0] = ((bp->fw_ver & 0xff000000) >> 24) + '0';
4798         info->fw_version[2] = ((bp->fw_ver & 0xff0000) >> 16) + '0';
4799         info->fw_version[4] = ((bp->fw_ver & 0xff00) >> 8) + '0';
4800         info->fw_version[1] = info->fw_version[3] = '.';
4801         info->fw_version[5] = 0;
4802 }
4803
4804 #define BNX2_REGDUMP_LEN                (32 * 1024)
4805
4806 static int
4807 bnx2_get_regs_len(struct net_device *dev)
4808 {
4809         return BNX2_REGDUMP_LEN;
4810 }
4811
4812 static void
4813 bnx2_get_regs(struct net_device *dev, struct ethtool_regs *regs, void *_p)
4814 {
4815         u32 *p = _p, i, offset;
4816         u8 *orig_p = _p;
4817         struct bnx2 *bp = netdev_priv(dev);
4818         u32 reg_boundaries[] = { 0x0000, 0x0098, 0x0400, 0x045c,
4819                                  0x0800, 0x0880, 0x0c00, 0x0c10,
4820                                  0x0c30, 0x0d08, 0x1000, 0x101c,
4821                                  0x1040, 0x1048, 0x1080, 0x10a4,
4822                                  0x1400, 0x1490, 0x1498, 0x14f0,
4823                                  0x1500, 0x155c, 0x1580, 0x15dc,
4824                                  0x1600, 0x1658, 0x1680, 0x16d8,
4825                                  0x1800, 0x1820, 0x1840, 0x1854,
4826                                  0x1880, 0x1894, 0x1900, 0x1984,
4827                                  0x1c00, 0x1c0c, 0x1c40, 0x1c54,
4828                                  0x1c80, 0x1c94, 0x1d00, 0x1d84,
4829                                  0x2000, 0x2030, 0x23c0, 0x2400,
4830                                  0x2800, 0x2820, 0x2830, 0x2850,
4831                                  0x2b40, 0x2c10, 0x2fc0, 0x3058,
4832                                  0x3c00, 0x3c94, 0x4000, 0x4010,
4833                                  0x4080, 0x4090, 0x43c0, 0x4458,
4834                                  0x4c00, 0x4c18, 0x4c40, 0x4c54,
4835                                  0x4fc0, 0x5010, 0x53c0, 0x5444,
4836                                  0x5c00, 0x5c18, 0x5c80, 0x5c90,
4837                                  0x5fc0, 0x6000, 0x6400, 0x6428,
4838                                  0x6800, 0x6848, 0x684c, 0x6860,
4839                                  0x6888, 0x6910, 0x8000 };
4840
4841         regs->version = 0;
4842
4843         memset(p, 0, BNX2_REGDUMP_LEN);
4844
4845         if (!netif_running(bp->dev))
4846                 return;
4847
4848         i = 0;
4849         offset = reg_boundaries[0];
4850         p += offset;
4851         while (offset < BNX2_REGDUMP_LEN) {
4852                 *p++ = REG_RD(bp, offset);
4853                 offset += 4;
4854                 if (offset == reg_boundaries[i + 1]) {
4855                         offset = reg_boundaries[i + 2];
4856                         p = (u32 *) (orig_p + offset);
4857                         i += 2;
4858                 }
4859         }
4860 }
4861
4862 static void
4863 bnx2_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
4864 {
4865         struct bnx2 *bp = netdev_priv(dev);
4866
4867         if (bp->flags & NO_WOL_FLAG) {
4868                 wol->supported = 0;
4869                 wol->wolopts = 0;
4870         }
4871         else {
4872                 wol->supported = WAKE_MAGIC;
4873                 if (bp->wol)
4874                         wol->wolopts = WAKE_MAGIC;
4875                 else
4876                         wol->wolopts = 0;
4877         }
4878         memset(&wol->sopass, 0, sizeof(wol->sopass));
4879 }
4880
4881 static int
4882 bnx2_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
4883 {
4884         struct bnx2 *bp = netdev_priv(dev);
4885
4886         if (wol->wolopts & ~WAKE_MAGIC)
4887                 return -EINVAL;
4888
4889         if (wol->wolopts & WAKE_MAGIC) {
4890                 if (bp->flags & NO_WOL_FLAG)
4891                         return -EINVAL;
4892
4893                 bp->wol = 1;
4894         }
4895         else {
4896                 bp->wol = 0;
4897         }
4898         return 0;
4899 }
4900
4901 static int
4902 bnx2_nway_reset(struct net_device *dev)
4903 {
4904         struct bnx2 *bp = netdev_priv(dev);
4905         u32 bmcr;
4906
4907         if (!(bp->autoneg & AUTONEG_SPEED)) {
4908                 return -EINVAL;
4909         }
4910
4911         spin_lock_bh(&bp->phy_lock);
4912
4913         /* Force a link down visible on the other side */
4914         if (bp->phy_flags & PHY_SERDES_FLAG) {
4915                 bnx2_write_phy(bp, MII_BMCR, BMCR_LOOPBACK);
4916                 spin_unlock_bh(&bp->phy_lock);
4917
4918                 msleep(20);
4919
4920                 spin_lock_bh(&bp->phy_lock);
4921                 if (CHIP_NUM(bp) == CHIP_NUM_5706) {
4922                         bp->current_interval = SERDES_AN_TIMEOUT;
4923                         bp->serdes_an_pending = 1;
4924                         mod_timer(&bp->timer, jiffies + bp->current_interval);
4925                 }
4926         }
4927
4928         bnx2_read_phy(bp, MII_BMCR, &bmcr);
4929         bmcr &= ~BMCR_LOOPBACK;
4930         bnx2_write_phy(bp, MII_BMCR, bmcr | BMCR_ANRESTART | BMCR_ANENABLE);
4931
4932         spin_unlock_bh(&bp->phy_lock);
4933
4934         return 0;
4935 }
4936
4937 static int
4938 bnx2_get_eeprom_len(struct net_device *dev)
4939 {
4940         struct bnx2 *bp = netdev_priv(dev);
4941
4942         if (bp->flash_info == NULL)
4943                 return 0;
4944
4945         return (int) bp->flash_size;
4946 }
4947
4948 static int
4949 bnx2_get_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom,
4950                 u8 *eebuf)
4951 {
4952         struct bnx2 *bp = netdev_priv(dev);
4953         int rc;
4954
4955         /* parameters already validated in ethtool_get_eeprom */
4956
4957         rc = bnx2_nvram_read(bp, eeprom->offset, eebuf, eeprom->len);
4958
4959         return rc;
4960 }
4961
4962 static int
4963 bnx2_set_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom,
4964                 u8 *eebuf)
4965 {
4966         struct bnx2 *bp = netdev_priv(dev);
4967         int rc;
4968
4969         /* parameters already validated in ethtool_set_eeprom */
4970
4971         rc = bnx2_nvram_write(bp, eeprom->offset, eebuf, eeprom->len);
4972
4973         return rc;
4974 }
4975
4976 static int
4977 bnx2_get_coalesce(struct net_device *dev, struct ethtool_coalesce *coal)
4978 {
4979         struct bnx2 *bp = netdev_priv(dev);
4980
4981         memset(coal, 0, sizeof(struct ethtool_coalesce));
4982
4983         coal->rx_coalesce_usecs = bp->rx_ticks;
4984         coal->rx_max_coalesced_frames = bp->rx_quick_cons_trip;
4985         coal->rx_coalesce_usecs_irq = bp->rx_ticks_int;
4986         coal->rx_max_coalesced_frames_irq = bp->rx_quick_cons_trip_int;
4987
4988         coal->tx_coalesce_usecs = bp->tx_ticks;
4989         coal->tx_max_coalesced_frames = bp->tx_quick_cons_trip;
4990         coal->tx_coalesce_usecs_irq = bp->tx_ticks_int;
4991         coal->tx_max_coalesced_frames_irq = bp->tx_quick_cons_trip_int;
4992
4993         coal->stats_block_coalesce_usecs = bp->stats_ticks;
4994
4995         return 0;
4996 }
4997
4998 static int
4999 bnx2_set_coalesce(struct net_device *dev, struct ethtool_coalesce *coal)
5000 {
5001         struct bnx2 *bp = netdev_priv(dev);
5002
5003         bp->rx_ticks = (u16) coal->rx_coalesce_usecs;
5004         if (bp->rx_ticks > 0x3ff) bp->rx_ticks = 0x3ff;
5005
5006         bp->rx_quick_cons_trip = (u16) coal->rx_max_coalesced_frames;
5007         if (bp->rx_quick_cons_trip > 0xff) bp->rx_quick_cons_trip = 0xff;
5008
5009         bp->rx_ticks_int = (u16) coal->rx_coalesce_usecs_irq;
5010         if (bp->rx_ticks_int > 0x3ff) bp->rx_ticks_int = 0x3ff;
5011
5012         bp->rx_quick_cons_trip_int = (u16) coal->rx_max_coalesced_frames_irq;
5013         if (bp->rx_quick_cons_trip_int > 0xff)
5014                 bp->rx_quick_cons_trip_int = 0xff;
5015
5016         bp->tx_ticks = (u16) coal->tx_coalesce_usecs;
5017         if (bp->tx_ticks > 0x3ff) bp->tx_ticks = 0x3ff;
5018
5019         bp->tx_quick_cons_trip = (u16) coal->tx_max_coalesced_frames;
5020         if (bp->tx_quick_cons_trip > 0xff) bp->tx_quick_cons_trip = 0xff;
5021
5022         bp->tx_ticks_int = (u16) coal->tx_coalesce_usecs_irq;
5023         if (bp->tx_ticks_int > 0x3ff) bp->tx_ticks_int = 0x3ff;
5024
5025         bp->tx_quick_cons_trip_int = (u16) coal->tx_max_coalesced_frames_irq;
5026         if (bp->tx_quick_cons_trip_int > 0xff) bp->tx_quick_cons_trip_int =
5027                 0xff;
5028
5029         bp->stats_ticks = coal->stats_block_coalesce_usecs;
5030         if (bp->stats_ticks > 0xffff00) bp->stats_ticks = 0xffff00;
5031         bp->stats_ticks &= 0xffff00;
5032
5033         if (netif_running(bp->dev)) {
5034                 bnx2_netif_stop(bp);
5035                 bnx2_init_nic(bp);
5036                 bnx2_netif_start(bp);
5037         }
5038
5039         return 0;
5040 }
5041
5042 static void
5043 bnx2_get_ringparam(struct net_device *dev, struct ethtool_ringparam *ering)
5044 {
5045         struct bnx2 *bp = netdev_priv(dev);
5046
5047         ering->rx_max_pending = MAX_TOTAL_RX_DESC_CNT;
5048         ering->rx_mini_max_pending = 0;
5049         ering->rx_jumbo_max_pending = 0;
5050
5051         ering->rx_pending = bp->rx_ring_size;
5052         ering->rx_mini_pending = 0;
5053         ering->rx_jumbo_pending = 0;
5054
5055         ering->tx_max_pending = MAX_TX_DESC_CNT;
5056         ering->tx_pending = bp->tx_ring_size;
5057 }
5058
5059 static int
5060 bnx2_set_ringparam(struct net_device *dev, struct ethtool_ringparam *ering)
5061 {
5062         struct bnx2 *bp = netdev_priv(dev);
5063
5064         if ((ering->rx_pending > MAX_TOTAL_RX_DESC_CNT) ||
5065                 (ering->tx_pending > MAX_TX_DESC_CNT) ||
5066                 (ering->tx_pending <= MAX_SKB_FRAGS)) {
5067
5068                 return -EINVAL;
5069         }
5070         if (netif_running(bp->dev)) {
5071                 bnx2_netif_stop(bp);
5072                 bnx2_reset_chip(bp, BNX2_DRV_MSG_CODE_RESET);
5073                 bnx2_free_skbs(bp);
5074                 bnx2_free_mem(bp);
5075         }
5076
5077         bnx2_set_rx_ring_size(bp, ering->rx_pending);
5078         bp->tx_ring_size = ering->tx_pending;
5079
5080         if (netif_running(bp->dev)) {
5081                 int rc;
5082
5083                 rc = bnx2_alloc_mem(bp);
5084                 if (rc)
5085                         return rc;
5086                 bnx2_init_nic(bp);
5087                 bnx2_netif_start(bp);
5088         }
5089
5090         return 0;
5091 }
5092
5093 static void
5094 bnx2_get_pauseparam(struct net_device *dev, struct ethtool_pauseparam *epause)
5095 {
5096         struct bnx2 *bp = netdev_priv(dev);
5097
5098         epause->autoneg = ((bp->autoneg & AUTONEG_FLOW_CTRL) != 0);
5099         epause->rx_pause = ((bp->flow_ctrl & FLOW_CTRL_RX) != 0);
5100         epause->tx_pause = ((bp->flow_ctrl & FLOW_CTRL_TX) != 0);
5101 }
5102
5103 static int
5104 bnx2_set_pauseparam(struct net_device *dev, struct ethtool_pauseparam *epause)
5105 {
5106         struct bnx2 *bp = netdev_priv(dev);
5107
5108         bp->req_flow_ctrl = 0;
5109         if (epause->rx_pause)
5110                 bp->req_flow_ctrl |= FLOW_CTRL_RX;
5111         if (epause->tx_pause)
5112                 bp->req_flow_ctrl |= FLOW_CTRL_TX;
5113
5114         if (epause->autoneg) {
5115                 bp->autoneg |= AUTONEG_FLOW_CTRL;
5116         }
5117         else {
5118                 bp->autoneg &= ~AUTONEG_FLOW_CTRL;
5119         }
5120
5121         spin_lock_bh(&bp->phy_lock);
5122
5123         bnx2_setup_phy(bp);
5124
5125         spin_unlock_bh(&bp->phy_lock);
5126
5127         return 0;
5128 }
5129
5130 static u32
5131 bnx2_get_rx_csum(struct net_device *dev)
5132 {
5133         struct bnx2 *bp = netdev_priv(dev);
5134
5135         return bp->rx_csum;
5136 }
5137
5138 static int
5139 bnx2_set_rx_csum(struct net_device *dev, u32 data)
5140 {
5141         struct bnx2 *bp = netdev_priv(dev);
5142
5143         bp->rx_csum = data;
5144         return 0;
5145 }
5146
5147 static int
5148 bnx2_set_tso(struct net_device *dev, u32 data)
5149 {
5150         if (data)
5151                 dev->features |= NETIF_F_TSO | NETIF_F_TSO_ECN;
5152         else
5153                 dev->features &= ~(NETIF_F_TSO | NETIF_F_TSO_ECN);
5154         return 0;
5155 }
5156
5157 #define BNX2_NUM_STATS 46
5158
5159 static struct {
5160         char string[ETH_GSTRING_LEN];
5161 } bnx2_stats_str_arr[BNX2_NUM_STATS] = {
5162         { "rx_bytes" },
5163         { "rx_error_bytes" },
5164         { "tx_bytes" },
5165         { "tx_error_bytes" },
5166         { "rx_ucast_packets" },
5167         { "rx_mcast_packets" },
5168         { "rx_bcast_packets" },
5169         { "tx_ucast_packets" },
5170         { "tx_mcast_packets" },
5171         { "tx_bcast_packets" },
5172         { "tx_mac_errors" },
5173         { "tx_carrier_errors" },
5174         { "rx_crc_errors" },
5175         { "rx_align_errors" },
5176         { "tx_single_collisions" },
5177         { "tx_multi_collisions" },
5178         { "tx_deferred" },
5179         { "tx_excess_collisions" },
5180         { "tx_late_collisions" },
5181         { "tx_total_collisions" },
5182         { "rx_fragments" },
5183         { "rx_jabbers" },
5184         { "rx_undersize_packets" },
5185         { "rx_oversize_packets" },
5186         { "rx_64_byte_packets" },
5187         { "rx_65_to_127_byte_packets" },
5188         { "rx_128_to_255_byte_packets" },
5189         { "rx_256_to_511_byte_packets" },
5190         { "rx_512_to_1023_byte_packets" },
5191         { "rx_1024_to_1522_byte_packets" },
5192         { "rx_1523_to_9022_byte_packets" },
5193         { "tx_64_byte_packets" },
5194         { "tx_65_to_127_byte_packets" },
5195         { "tx_128_to_255_byte_packets" },
5196         { "tx_256_to_511_byte_packets" },
5197         { "tx_512_to_1023_byte_packets" },
5198         { "tx_1024_to_1522_byte_packets" },
5199         { "tx_1523_to_9022_byte_packets" },
5200         { "rx_xon_frames" },
5201         { "rx_xoff_frames" },
5202         { "tx_xon_frames" },
5203         { "tx_xoff_frames" },
5204         { "rx_mac_ctrl_frames" },
5205         { "rx_filtered_packets" },
5206         { "rx_discards" },
5207         { "rx_fw_discards" },
5208 };
5209
5210 #define STATS_OFFSET32(offset_name) (offsetof(struct statistics_block, offset_name) / 4)
5211
5212 static const unsigned long bnx2_stats_offset_arr[BNX2_NUM_STATS] = {
5213     STATS_OFFSET32(stat_IfHCInOctets_hi),
5214     STATS_OFFSET32(stat_IfHCInBadOctets_hi),
5215     STATS_OFFSET32(stat_IfHCOutOctets_hi),
5216     STATS_OFFSET32(stat_IfHCOutBadOctets_hi),
5217     STATS_OFFSET32(stat_IfHCInUcastPkts_hi),
5218     STATS_OFFSET32(stat_IfHCInMulticastPkts_hi),
5219     STATS_OFFSET32(stat_IfHCInBroadcastPkts_hi),
5220     STATS_OFFSET32(stat_IfHCOutUcastPkts_hi),
5221     STATS_OFFSET32(stat_IfHCOutMulticastPkts_hi),
5222     STATS_OFFSET32(stat_IfHCOutBroadcastPkts_hi),
5223     STATS_OFFSET32(stat_emac_tx_stat_dot3statsinternalmactransmiterrors),
5224     STATS_OFFSET32(stat_Dot3StatsCarrierSenseErrors),
5225     STATS_OFFSET32(stat_Dot3StatsFCSErrors),
5226     STATS_OFFSET32(stat_Dot3StatsAlignmentErrors),
5227     STATS_OFFSET32(stat_Dot3StatsSingleCollisionFrames),
5228     STATS_OFFSET32(stat_Dot3StatsMultipleCollisionFrames),
5229     STATS_OFFSET32(stat_Dot3StatsDeferredTransmissions),
5230     STATS_OFFSET32(stat_Dot3StatsExcessiveCollisions),
5231     STATS_OFFSET32(stat_Dot3StatsLateCollisions),
5232     STATS_OFFSET32(stat_EtherStatsCollisions),
5233     STATS_OFFSET32(stat_EtherStatsFragments),
5234     STATS_OFFSET32(stat_EtherStatsJabbers),
5235     STATS_OFFSET32(stat_EtherStatsUndersizePkts),
5236     STATS_OFFSET32(stat_EtherStatsOverrsizePkts),
5237     STATS_OFFSET32(stat_EtherStatsPktsRx64Octets),
5238     STATS_OFFSET32(stat_EtherStatsPktsRx65Octetsto127Octets),
5239     STATS_OFFSET32(stat_EtherStatsPktsRx128Octetsto255Octets),
5240     STATS_OFFSET32(stat_EtherStatsPktsRx256Octetsto511Octets),
5241     STATS_OFFSET32(stat_EtherStatsPktsRx512Octetsto1023Octets),
5242     STATS_OFFSET32(stat_EtherStatsPktsRx1024Octetsto1522Octets),
5243     STATS_OFFSET32(stat_EtherStatsPktsRx1523Octetsto9022Octets),
5244     STATS_OFFSET32(stat_EtherStatsPktsTx64Octets),
5245     STATS_OFFSET32(stat_EtherStatsPktsTx65Octetsto127Octets),
5246     STATS_OFFSET32(stat_EtherStatsPktsTx128Octetsto255Octets),
5247     STATS_OFFSET32(stat_EtherStatsPktsTx256Octetsto511Octets),
5248     STATS_OFFSET32(stat_EtherStatsPktsTx512Octetsto1023Octets),
5249     STATS_OFFSET32(stat_EtherStatsPktsTx1024Octetsto1522Octets),
5250     STATS_OFFSET32(stat_EtherStatsPktsTx1523Octetsto9022Octets),
5251     STATS_OFFSET32(stat_XonPauseFramesReceived),
5252     STATS_OFFSET32(stat_XoffPauseFramesReceived),
5253     STATS_OFFSET32(stat_OutXonSent),
5254     STATS_OFFSET32(stat_OutXoffSent),
5255     STATS_OFFSET32(stat_MacControlFramesReceived),
5256     STATS_OFFSET32(stat_IfInFramesL2FilterDiscards),
5257     STATS_OFFSET32(stat_IfInMBUFDiscards),
5258     STATS_OFFSET32(stat_FwRxDrop),
5259 };
5260
5261 /* stat_IfHCInBadOctets and stat_Dot3StatsCarrierSenseErrors are
5262  * skipped because of errata.
5263  */
5264 static u8 bnx2_5706_stats_len_arr[BNX2_NUM_STATS] = {
5265         8,0,8,8,8,8,8,8,8,8,
5266         4,0,4,4,4,4,4,4,4,4,
5267         4,4,4,4,4,4,4,4,4,4,
5268         4,4,4,4,4,4,4,4,4,4,
5269         4,4,4,4,4,4,
5270 };
5271
5272 static u8 bnx2_5708_stats_len_arr[BNX2_NUM_STATS] = {
5273         8,0,8,8,8,8,8,8,8,8,
5274         4,4,4,4,4,4,4,4,4,4,
5275         4,4,4,4,4,4,4,4,4,4,
5276         4,4,4,4,4,4,4,4,4,4,
5277         4,4,4,4,4,4,
5278 };
5279
5280 #define BNX2_NUM_TESTS 6
5281
5282 static struct {
5283         char string[ETH_GSTRING_LEN];
5284 } bnx2_tests_str_arr[BNX2_NUM_TESTS] = {
5285         { "register_test (offline)" },
5286         { "memory_test (offline)" },
5287         { "loopback_test (offline)" },
5288         { "nvram_test (online)" },
5289         { "interrupt_test (online)" },
5290         { "link_test (online)" },
5291 };
5292
5293 static int
5294 bnx2_self_test_count(struct net_device *dev)
5295 {
5296         return BNX2_NUM_TESTS;
5297 }
5298
5299 static void
5300 bnx2_self_test(struct net_device *dev, struct ethtool_test *etest, u64 *buf)
5301 {
5302         struct bnx2 *bp = netdev_priv(dev);
5303
5304         memset(buf, 0, sizeof(u64) * BNX2_NUM_TESTS);
5305         if (etest->flags & ETH_TEST_FL_OFFLINE) {
5306                 int i;
5307
5308                 bnx2_netif_stop(bp);
5309                 bnx2_reset_chip(bp, BNX2_DRV_MSG_CODE_DIAG);
5310                 bnx2_free_skbs(bp);
5311
5312                 if (bnx2_test_registers(bp) != 0) {
5313                         buf[0] = 1;
5314                         etest->flags |= ETH_TEST_FL_FAILED;
5315                 }
5316                 if (bnx2_test_memory(bp) != 0) {
5317                         buf[1] = 1;
5318                         etest->flags |= ETH_TEST_FL_FAILED;
5319                 }
5320                 if ((buf[2] = bnx2_test_loopback(bp)) != 0)
5321                         etest->flags |= ETH_TEST_FL_FAILED;
5322
5323                 if (!netif_running(bp->dev)) {
5324                         bnx2_reset_chip(bp, BNX2_DRV_MSG_CODE_RESET);
5325                 }
5326                 else {
5327                         bnx2_init_nic(bp);
5328                         bnx2_netif_start(bp);
5329                 }
5330
5331                 /* wait for link up */
5332                 for (i = 0; i < 7; i++) {
5333                         if (bp->link_up)
5334                                 break;
5335                         msleep_interruptible(1000);
5336                 }
5337         }
5338
5339         if (bnx2_test_nvram(bp) != 0) {
5340                 buf[3] = 1;
5341                 etest->flags |= ETH_TEST_FL_FAILED;
5342         }
5343         if (bnx2_test_intr(bp) != 0) {
5344                 buf[4] = 1;
5345                 etest->flags |= ETH_TEST_FL_FAILED;
5346         }
5347
5348         if (bnx2_test_link(bp) != 0) {
5349                 buf[5] = 1;
5350                 etest->flags |= ETH_TEST_FL_FAILED;
5351
5352         }
5353 }
5354
5355 static void
5356 bnx2_get_strings(struct net_device *dev, u32 stringset, u8 *buf)
5357 {
5358         switch (stringset) {
5359         case ETH_SS_STATS:
5360                 memcpy(buf, bnx2_stats_str_arr,
5361                         sizeof(bnx2_stats_str_arr));
5362                 break;
5363         case ETH_SS_TEST:
5364                 memcpy(buf, bnx2_tests_str_arr,
5365                         sizeof(bnx2_tests_str_arr));
5366                 break;
5367         }
5368 }
5369
5370 static int
5371 bnx2_get_stats_count(struct net_device *dev)
5372 {
5373         return BNX2_NUM_STATS;
5374 }
5375
5376 static void
5377 bnx2_get_ethtool_stats(struct net_device *dev,
5378                 struct ethtool_stats *stats, u64 *buf)
5379 {
5380         struct bnx2 *bp = netdev_priv(dev);
5381         int i;
5382         u32 *hw_stats = (u32 *) bp->stats_blk;
5383         u8 *stats_len_arr = NULL;
5384
5385         if (hw_stats == NULL) {
5386                 memset(buf, 0, sizeof(u64) * BNX2_NUM_STATS);
5387                 return;
5388         }
5389
5390         if ((CHIP_ID(bp) == CHIP_ID_5706_A0) ||
5391             (CHIP_ID(bp) == CHIP_ID_5706_A1) ||
5392             (CHIP_ID(bp) == CHIP_ID_5706_A2) ||
5393             (CHIP_ID(bp) == CHIP_ID_5708_A0))
5394                 stats_len_arr = bnx2_5706_stats_len_arr;
5395         else
5396                 stats_len_arr = bnx2_5708_stats_len_arr;
5397
5398         for (i = 0; i < BNX2_NUM_STATS; i++) {
5399                 if (stats_len_arr[i] == 0) {
5400                         /* skip this counter */
5401                         buf[i] = 0;
5402                         continue;
5403                 }
5404                 if (stats_len_arr[i] == 4) {
5405                         /* 4-byte counter */
5406                         buf[i] = (u64)
5407                                 *(hw_stats + bnx2_stats_offset_arr[i]);
5408                         continue;
5409                 }
5410                 /* 8-byte counter */
5411                 buf[i] = (((u64) *(hw_stats +
5412                                         bnx2_stats_offset_arr[i])) << 32) +
5413                                 *(hw_stats + bnx2_stats_offset_arr[i] + 1);
5414         }
5415 }
5416
5417 static int
5418 bnx2_phys_id(struct net_device *dev, u32 data)
5419 {
5420         struct bnx2 *bp = netdev_priv(dev);
5421         int i;
5422         u32 save;
5423
5424         if (data == 0)
5425                 data = 2;
5426
5427         save = REG_RD(bp, BNX2_MISC_CFG);
5428         REG_WR(bp, BNX2_MISC_CFG, BNX2_MISC_CFG_LEDMODE_MAC);
5429
5430         for (i = 0; i < (data * 2); i++) {
5431                 if ((i % 2) == 0) {
5432                         REG_WR(bp, BNX2_EMAC_LED, BNX2_EMAC_LED_OVERRIDE);
5433                 }
5434                 else {
5435                         REG_WR(bp, BNX2_EMAC_LED, BNX2_EMAC_LED_OVERRIDE |
5436                                 BNX2_EMAC_LED_1000MB_OVERRIDE |
5437                                 BNX2_EMAC_LED_100MB_OVERRIDE |
5438                                 BNX2_EMAC_LED_10MB_OVERRIDE |
5439                                 BNX2_EMAC_LED_TRAFFIC_OVERRIDE |
5440                                 BNX2_EMAC_LED_TRAFFIC);
5441                 }
5442                 msleep_interruptible(500);
5443                 if (signal_pending(current))
5444                         break;
5445         }
5446         REG_WR(bp, BNX2_EMAC_LED, 0);
5447         REG_WR(bp, BNX2_MISC_CFG, save);
5448         return 0;
5449 }
5450
5451 static const struct ethtool_ops bnx2_ethtool_ops = {
5452         .get_settings           = bnx2_get_settings,
5453         .set_settings           = bnx2_set_settings,
5454         .get_drvinfo            = bnx2_get_drvinfo,
5455         .get_regs_len           = bnx2_get_regs_len,
5456         .get_regs               = bnx2_get_regs,
5457         .get_wol                = bnx2_get_wol,
5458         .set_wol                = bnx2_set_wol,
5459         .nway_reset             = bnx2_nway_reset,
5460         .get_link               = ethtool_op_get_link,
5461         .get_eeprom_len         = bnx2_get_eeprom_len,
5462         .get_eeprom             = bnx2_get_eeprom,
5463         .set_eeprom             = bnx2_set_eeprom,
5464         .get_coalesce           = bnx2_get_coalesce,
5465         .set_coalesce           = bnx2_set_coalesce,
5466         .get_ringparam          = bnx2_get_ringparam,
5467         .set_ringparam          = bnx2_set_ringparam,
5468         .get_pauseparam         = bnx2_get_pauseparam,
5469         .set_pauseparam         = bnx2_set_pauseparam,
5470         .get_rx_csum            = bnx2_get_rx_csum,
5471         .set_rx_csum            = bnx2_set_rx_csum,
5472         .get_tx_csum            = ethtool_op_get_tx_csum,
5473         .set_tx_csum            = ethtool_op_set_tx_csum,
5474         .get_sg                 = ethtool_op_get_sg,
5475         .set_sg                 = ethtool_op_set_sg,
5476 #ifdef BCM_TSO
5477         .get_tso                = ethtool_op_get_tso,
5478         .set_tso                = bnx2_set_tso,
5479 #endif
5480         .self_test_count        = bnx2_self_test_count,
5481         .self_test              = bnx2_self_test,
5482         .get_strings            = bnx2_get_strings,
5483         .phys_id                = bnx2_phys_id,
5484         .get_stats_count        = bnx2_get_stats_count,
5485         .get_ethtool_stats      = bnx2_get_ethtool_stats,
5486         .get_perm_addr          = ethtool_op_get_perm_addr,
5487 };
5488
5489 /* Called with rtnl_lock */
5490 static int
5491 bnx2_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
5492 {
5493         struct mii_ioctl_data *data = if_mii(ifr);
5494         struct bnx2 *bp = netdev_priv(dev);
5495         int err;
5496
5497         switch(cmd) {
5498         case SIOCGMIIPHY:
5499                 data->phy_id = bp->phy_addr;
5500
5501                 /* fallthru */
5502         case SIOCGMIIREG: {
5503                 u32 mii_regval;
5504
5505                 spin_lock_bh(&bp->phy_lock);
5506                 err = bnx2_read_phy(bp, data->reg_num & 0x1f, &mii_regval);
5507                 spin_unlock_bh(&bp->phy_lock);
5508
5509                 data->val_out = mii_regval;
5510
5511                 return err;
5512         }
5513
5514         case SIOCSMIIREG:
5515                 if (!capable(CAP_NET_ADMIN))
5516                         return -EPERM;
5517
5518                 spin_lock_bh(&bp->phy_lock);
5519                 err = bnx2_write_phy(bp, data->reg_num & 0x1f, data->val_in);
5520                 spin_unlock_bh(&bp->phy_lock);
5521
5522                 return err;
5523
5524         default:
5525                 /* do nothing */
5526                 break;
5527         }
5528         return -EOPNOTSUPP;
5529 }
5530
5531 /* Called with rtnl_lock */
5532 static int
5533 bnx2_change_mac_addr(struct net_device *dev, void *p)
5534 {
5535         struct sockaddr *addr = p;
5536         struct bnx2 *bp = netdev_priv(dev);
5537
5538         if (!is_valid_ether_addr(addr->sa_data))
5539                 return -EINVAL;
5540
5541         memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
5542         if (netif_running(dev))
5543                 bnx2_set_mac_addr(bp);
5544
5545         return 0;
5546 }
5547
5548 /* Called with rtnl_lock */
5549 static int
5550 bnx2_change_mtu(struct net_device *dev, int new_mtu)
5551 {
5552         struct bnx2 *bp = netdev_priv(dev);
5553
5554         if (((new_mtu + ETH_HLEN) > MAX_ETHERNET_JUMBO_PACKET_SIZE) ||
5555                 ((new_mtu + ETH_HLEN) < MIN_ETHERNET_PACKET_SIZE))
5556                 return -EINVAL;
5557
5558         dev->mtu = new_mtu;
5559         if (netif_running(dev)) {
5560                 bnx2_netif_stop(bp);
5561
5562                 bnx2_init_nic(bp);
5563
5564                 bnx2_netif_start(bp);
5565         }
5566         return 0;
5567 }
5568
5569 #if defined(HAVE_POLL_CONTROLLER) || defined(CONFIG_NET_POLL_CONTROLLER)
5570 static void
5571 poll_bnx2(struct net_device *dev)
5572 {
5573         struct bnx2 *bp = netdev_priv(dev);
5574
5575         disable_irq(bp->pdev->irq);
5576         bnx2_interrupt(bp->pdev->irq, dev);
5577         enable_irq(bp->pdev->irq);
5578 }
5579 #endif
5580
5581 static int __devinit
5582 bnx2_init_board(struct pci_dev *pdev, struct net_device *dev)
5583 {
5584         struct bnx2 *bp;
5585         unsigned long mem_len;
5586         int rc;
5587         u32 reg;
5588
5589         SET_MODULE_OWNER(dev);
5590         SET_NETDEV_DEV(dev, &pdev->dev);
5591         bp = netdev_priv(dev);
5592
5593         bp->flags = 0;
5594         bp->phy_flags = 0;
5595
5596         /* enable device (incl. PCI PM wakeup), and bus-mastering */
5597         rc = pci_enable_device(pdev);
5598         if (rc) {
5599                 dev_err(&pdev->dev, "Cannot enable PCI device, aborting.");
5600                 goto err_out;
5601         }
5602
5603         if (!(pci_resource_flags(pdev, 0) & IORESOURCE_MEM)) {
5604                 dev_err(&pdev->dev,
5605                         "Cannot find PCI device base address, aborting.\n");
5606                 rc = -ENODEV;
5607                 goto err_out_disable;
5608         }
5609
5610         rc = pci_request_regions(pdev, DRV_MODULE_NAME);
5611         if (rc) {
5612                 dev_err(&pdev->dev, "Cannot obtain PCI resources, aborting.\n");
5613                 goto err_out_disable;
5614         }
5615
5616         pci_set_master(pdev);
5617
5618         bp->pm_cap = pci_find_capability(pdev, PCI_CAP_ID_PM);
5619         if (bp->pm_cap == 0) {
5620                 dev_err(&pdev->dev,
5621                         "Cannot find power management capability, aborting.\n");
5622                 rc = -EIO;
5623                 goto err_out_release;
5624         }
5625
5626         bp->pcix_cap = pci_find_capability(pdev, PCI_CAP_ID_PCIX);
5627         if (bp->pcix_cap == 0) {
5628                 dev_err(&pdev->dev, "Cannot find PCIX capability, aborting.\n");
5629                 rc = -EIO;
5630                 goto err_out_release;
5631         }
5632
5633         if (pci_set_dma_mask(pdev, DMA_64BIT_MASK) == 0) {
5634                 bp->flags |= USING_DAC_FLAG;
5635                 if (pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK) != 0) {
5636                         dev_err(&pdev->dev,
5637                                 "pci_set_consistent_dma_mask failed, aborting.\n");
5638                         rc = -EIO;
5639                         goto err_out_release;
5640                 }
5641         }
5642         else if (pci_set_dma_mask(pdev, DMA_32BIT_MASK) != 0) {
5643                 dev_err(&pdev->dev, "System does not support DMA, aborting.\n");
5644                 rc = -EIO;
5645                 goto err_out_release;
5646         }
5647
5648         bp->dev = dev;
5649         bp->pdev = pdev;
5650
5651         spin_lock_init(&bp->phy_lock);
5652         INIT_WORK(&bp->reset_task, bnx2_reset_task, bp);
5653
5654         dev->base_addr = dev->mem_start = pci_resource_start(pdev, 0);
5655         mem_len = MB_GET_CID_ADDR(17);
5656         dev->mem_end = dev->mem_start + mem_len;
5657         dev->irq = pdev->irq;
5658
5659         bp->regview = ioremap_nocache(dev->base_addr, mem_len);
5660
5661         if (!bp->regview) {
5662                 dev_err(&pdev->dev, "Cannot map register space, aborting.\n");
5663                 rc = -ENOMEM;
5664                 goto err_out_release;
5665         }
5666
5667         /* Configure byte swap and enable write to the reg_window registers.
5668          * Rely on CPU to do target byte swapping on big endian systems
5669          * The chip's target access swapping will not swap all accesses
5670          */
5671         pci_write_config_dword(bp->pdev, BNX2_PCICFG_MISC_CONFIG,
5672                                BNX2_PCICFG_MISC_CONFIG_REG_WINDOW_ENA |
5673                                BNX2_PCICFG_MISC_CONFIG_TARGET_MB_WORD_SWAP);
5674
5675         bnx2_set_power_state(bp, PCI_D0);
5676
5677         bp->chip_id = REG_RD(bp, BNX2_MISC_ID);
5678
5679         /* Get bus information. */
5680         reg = REG_RD(bp, BNX2_PCICFG_MISC_STATUS);
5681         if (reg & BNX2_PCICFG_MISC_STATUS_PCIX_DET) {
5682                 u32 clkreg;
5683
5684                 bp->flags |= PCIX_FLAG;
5685
5686                 clkreg = REG_RD(bp, BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS);
5687
5688                 clkreg &= BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET;
5689                 switch (clkreg) {
5690                 case BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_133MHZ:
5691                         bp->bus_speed_mhz = 133;
5692                         break;
5693
5694                 case BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_95MHZ:
5695                         bp->bus_speed_mhz = 100;
5696                         break;
5697
5698                 case BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_66MHZ:
5699                 case BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_80MHZ:
5700                         bp->bus_speed_mhz = 66;
5701                         break;
5702
5703                 case BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_48MHZ:
5704                 case BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_55MHZ:
5705                         bp->bus_speed_mhz = 50;
5706                         break;
5707
5708                 case BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_LOW:
5709                 case BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_32MHZ:
5710                 case BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_38MHZ:
5711                         bp->bus_speed_mhz = 33;
5712                         break;
5713                 }
5714         }
5715         else {
5716                 if (reg & BNX2_PCICFG_MISC_STATUS_M66EN)
5717                         bp->bus_speed_mhz = 66;
5718                 else
5719                         bp->bus_speed_mhz = 33;
5720         }
5721
5722         if (reg & BNX2_PCICFG_MISC_STATUS_32BIT_DET)
5723                 bp->flags |= PCI_32BIT_FLAG;
5724
5725         /* 5706A0 may falsely detect SERR and PERR. */
5726         if (CHIP_ID(bp) == CHIP_ID_5706_A0) {
5727                 reg = REG_RD(bp, PCI_COMMAND);
5728                 reg &= ~(PCI_COMMAND_SERR | PCI_COMMAND_PARITY);
5729                 REG_WR(bp, PCI_COMMAND, reg);
5730         }
5731         else if ((CHIP_ID(bp) == CHIP_ID_5706_A1) &&
5732                 !(bp->flags & PCIX_FLAG)) {
5733
5734                 dev_err(&pdev->dev,
5735                         "5706 A1 can only be used in a PCIX bus, aborting.\n");
5736                 goto err_out_unmap;
5737         }
5738
5739         bnx2_init_nvram(bp);
5740
5741         reg = REG_RD_IND(bp, BNX2_SHM_HDR_SIGNATURE);
5742
5743         if ((reg & BNX2_SHM_HDR_SIGNATURE_SIG_MASK) ==
5744             BNX2_SHM_HDR_SIGNATURE_SIG)
5745                 bp->shmem_base = REG_RD_IND(bp, BNX2_SHM_HDR_ADDR_0);
5746         else
5747                 bp->shmem_base = HOST_VIEW_SHMEM_BASE;
5748
5749         /* Get the permanent MAC address.  First we need to make sure the
5750          * firmware is actually running.
5751          */
5752         reg = REG_RD_IND(bp, bp->shmem_base + BNX2_DEV_INFO_SIGNATURE);
5753
5754         if ((reg & BNX2_DEV_INFO_SIGNATURE_MAGIC_MASK) !=
5755             BNX2_DEV_INFO_SIGNATURE_MAGIC) {
5756                 dev_err(&pdev->dev, "Firmware not running, aborting.\n");
5757                 rc = -ENODEV;
5758                 goto err_out_unmap;
5759         }
5760
5761         bp->fw_ver = REG_RD_IND(bp, bp->shmem_base + BNX2_DEV_INFO_BC_REV);
5762
5763         reg = REG_RD_IND(bp, bp->shmem_base + BNX2_PORT_HW_CFG_MAC_UPPER);
5764         bp->mac_addr[0] = (u8) (reg >> 8);
5765         bp->mac_addr[1] = (u8) reg;
5766
5767         reg = REG_RD_IND(bp, bp->shmem_base + BNX2_PORT_HW_CFG_MAC_LOWER);
5768         bp->mac_addr[2] = (u8) (reg >> 24);
5769         bp->mac_addr[3] = (u8) (reg >> 16);
5770         bp->mac_addr[4] = (u8) (reg >> 8);
5771         bp->mac_addr[5] = (u8) reg;
5772
5773         bp->tx_ring_size = MAX_TX_DESC_CNT;
5774         bnx2_set_rx_ring_size(bp, 255);
5775
5776         bp->rx_csum = 1;
5777
5778         bp->rx_offset = sizeof(struct l2_fhdr) + 2;
5779
5780         bp->tx_quick_cons_trip_int = 20;
5781         bp->tx_quick_cons_trip = 20;
5782         bp->tx_ticks_int = 80;
5783         bp->tx_ticks = 80;
5784
5785         bp->rx_quick_cons_trip_int = 6;
5786         bp->rx_quick_cons_trip = 6;
5787         bp->rx_ticks_int = 18;
5788         bp->rx_ticks = 18;
5789
5790         bp->stats_ticks = 1000000 & 0xffff00;
5791
5792         bp->timer_interval =  HZ;
5793         bp->current_interval =  HZ;
5794
5795         bp->phy_addr = 1;
5796
5797         /* Disable WOL support if we are running on a SERDES chip. */
5798         if (CHIP_BOND_ID(bp) & CHIP_BOND_ID_SERDES_BIT) {
5799                 bp->phy_flags |= PHY_SERDES_FLAG;
5800                 bp->flags |= NO_WOL_FLAG;
5801                 if (CHIP_NUM(bp) == CHIP_NUM_5708) {
5802                         bp->phy_addr = 2;
5803                         reg = REG_RD_IND(bp, bp->shmem_base +
5804                                          BNX2_SHARED_HW_CFG_CONFIG);
5805                         if (reg & BNX2_SHARED_HW_CFG_PHY_2_5G)
5806                                 bp->phy_flags |= PHY_2_5G_CAPABLE_FLAG;
5807                 }
5808         }
5809
5810         if ((CHIP_ID(bp) == CHIP_ID_5708_A0) ||
5811             (CHIP_ID(bp) == CHIP_ID_5708_B0) ||
5812             (CHIP_ID(bp) == CHIP_ID_5708_B1))
5813                 bp->flags |= NO_WOL_FLAG;
5814
5815         if (CHIP_ID(bp) == CHIP_ID_5706_A0) {
5816                 bp->tx_quick_cons_trip_int =
5817                         bp->tx_quick_cons_trip;
5818                 bp->tx_ticks_int = bp->tx_ticks;
5819                 bp->rx_quick_cons_trip_int =
5820                         bp->rx_quick_cons_trip;
5821                 bp->rx_ticks_int = bp->rx_ticks;
5822                 bp->comp_prod_trip_int = bp->comp_prod_trip;
5823                 bp->com_ticks_int = bp->com_ticks;
5824                 bp->cmd_ticks_int = bp->cmd_ticks;
5825         }
5826
5827         /* Disable MSI on 5706 if AMD 8132 bridge is found.
5828          *
5829          * MSI is defined to be 32-bit write.  The 5706 does 64-bit MSI writes
5830          * with byte enables disabled on the unused 32-bit word.  This is legal
5831          * but causes problems on the AMD 8132 which will eventually stop
5832          * responding after a while.
5833          *
5834          * AMD believes this incompatibility is unique to the 5706, and
5835          * prefers to locally disable MSI rather than globally disabling it
5836          * using pci_msi_quirk.
5837          */
5838         if (CHIP_NUM(bp) == CHIP_NUM_5706 && disable_msi == 0) {
5839                 struct pci_dev *amd_8132 = NULL;
5840
5841                 while ((amd_8132 = pci_get_device(PCI_VENDOR_ID_AMD,
5842                                                   PCI_DEVICE_ID_AMD_8132_BRIDGE,
5843                                                   amd_8132))) {
5844                         u8 rev;
5845
5846                         pci_read_config_byte(amd_8132, PCI_REVISION_ID, &rev);
5847                         if (rev >= 0x10 && rev <= 0x13) {
5848                                 disable_msi = 1;
5849                                 pci_dev_put(amd_8132);
5850                                 break;
5851                         }
5852                 }
5853         }
5854
5855         bp->autoneg = AUTONEG_SPEED | AUTONEG_FLOW_CTRL;
5856         bp->req_line_speed = 0;
5857         if (bp->phy_flags & PHY_SERDES_FLAG) {
5858                 bp->advertising = ETHTOOL_ALL_FIBRE_SPEED | ADVERTISED_Autoneg;
5859
5860                 reg = REG_RD_IND(bp, bp->shmem_base + BNX2_PORT_HW_CFG_CONFIG);
5861                 reg &= BNX2_PORT_HW_CFG_CFG_DFLT_LINK_MASK;
5862                 if (reg == BNX2_PORT_HW_CFG_CFG_DFLT_LINK_1G) {
5863                         bp->autoneg = 0;
5864                         bp->req_line_speed = bp->line_speed = SPEED_1000;
5865                         bp->req_duplex = DUPLEX_FULL;
5866                 }
5867         }
5868         else {
5869                 bp->advertising = ETHTOOL_ALL_COPPER_SPEED | ADVERTISED_Autoneg;
5870         }
5871
5872         bp->req_flow_ctrl = FLOW_CTRL_RX | FLOW_CTRL_TX;
5873
5874         init_timer(&bp->timer);
5875         bp->timer.expires = RUN_AT(bp->timer_interval);
5876         bp->timer.data = (unsigned long) bp;
5877         bp->timer.function = bnx2_timer;
5878
5879         return 0;
5880
5881 err_out_unmap:
5882         if (bp->regview) {
5883                 iounmap(bp->regview);
5884                 bp->regview = NULL;
5885         }
5886
5887 err_out_release:
5888         pci_release_regions(pdev);
5889
5890 err_out_disable:
5891         pci_disable_device(pdev);
5892         pci_set_drvdata(pdev, NULL);
5893
5894 err_out:
5895         return rc;
5896 }
5897
5898 static int __devinit
5899 bnx2_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
5900 {
5901         static int version_printed = 0;
5902         struct net_device *dev = NULL;
5903         struct bnx2 *bp;
5904         int rc, i;
5905
5906         if (version_printed++ == 0)
5907                 printk(KERN_INFO "%s", version);
5908
5909         /* dev zeroed in init_etherdev */
5910         dev = alloc_etherdev(sizeof(*bp));
5911
5912         if (!dev)
5913                 return -ENOMEM;
5914
5915         rc = bnx2_init_board(pdev, dev);
5916         if (rc < 0) {
5917                 free_netdev(dev);
5918                 return rc;
5919         }
5920
5921         dev->open = bnx2_open;
5922         dev->hard_start_xmit = bnx2_start_xmit;
5923         dev->stop = bnx2_close;
5924         dev->get_stats = bnx2_get_stats;
5925         dev->set_multicast_list = bnx2_set_rx_mode;
5926         dev->do_ioctl = bnx2_ioctl;
5927         dev->set_mac_address = bnx2_change_mac_addr;
5928         dev->change_mtu = bnx2_change_mtu;
5929         dev->tx_timeout = bnx2_tx_timeout;
5930         dev->watchdog_timeo = TX_TIMEOUT;
5931 #ifdef BCM_VLAN
5932         dev->vlan_rx_register = bnx2_vlan_rx_register;
5933         dev->vlan_rx_kill_vid = bnx2_vlan_rx_kill_vid;
5934 #endif
5935         dev->poll = bnx2_poll;
5936         dev->ethtool_ops = &bnx2_ethtool_ops;
5937         dev->weight = 64;
5938
5939         bp = netdev_priv(dev);
5940
5941 #if defined(HAVE_POLL_CONTROLLER) || defined(CONFIG_NET_POLL_CONTROLLER)
5942         dev->poll_controller = poll_bnx2;
5943 #endif
5944
5945         if ((rc = register_netdev(dev))) {
5946                 dev_err(&pdev->dev, "Cannot register net device\n");
5947                 if (bp->regview)
5948                         iounmap(bp->regview);
5949                 pci_release_regions(pdev);
5950                 pci_disable_device(pdev);
5951                 pci_set_drvdata(pdev, NULL);
5952                 free_netdev(dev);
5953                 return rc;
5954         }
5955
5956         pci_set_drvdata(pdev, dev);
5957
5958         memcpy(dev->dev_addr, bp->mac_addr, 6);
5959         memcpy(dev->perm_addr, bp->mac_addr, 6);
5960         bp->name = board_info[ent->driver_data].name,
5961         printk(KERN_INFO "%s: %s (%c%d) PCI%s %s %dMHz found at mem %lx, "
5962                 "IRQ %d, ",
5963                 dev->name,
5964                 bp->name,
5965                 ((CHIP_ID(bp) & 0xf000) >> 12) + 'A',
5966                 ((CHIP_ID(bp) & 0x0ff0) >> 4),
5967                 ((bp->flags & PCIX_FLAG) ? "-X" : ""),
5968                 ((bp->flags & PCI_32BIT_FLAG) ? "32-bit" : "64-bit"),
5969                 bp->bus_speed_mhz,
5970                 dev->base_addr,
5971                 bp->pdev->irq);
5972
5973         printk("node addr ");
5974         for (i = 0; i < 6; i++)
5975                 printk("%2.2x", dev->dev_addr[i]);
5976         printk("\n");
5977
5978         dev->features |= NETIF_F_SG;
5979         if (bp->flags & USING_DAC_FLAG)
5980                 dev->features |= NETIF_F_HIGHDMA;
5981         dev->features |= NETIF_F_IP_CSUM;
5982 #ifdef BCM_VLAN
5983         dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
5984 #endif
5985 #ifdef BCM_TSO
5986         dev->features |= NETIF_F_TSO | NETIF_F_TSO_ECN;
5987 #endif
5988
5989         netif_carrier_off(bp->dev);
5990
5991         return 0;
5992 }
5993
5994 static void __devexit
5995 bnx2_remove_one(struct pci_dev *pdev)
5996 {
5997         struct net_device *dev = pci_get_drvdata(pdev);
5998         struct bnx2 *bp = netdev_priv(dev);
5999
6000         flush_scheduled_work();
6001
6002         unregister_netdev(dev);
6003
6004         if (bp->regview)
6005                 iounmap(bp->regview);
6006
6007         free_netdev(dev);
6008         pci_release_regions(pdev);
6009         pci_disable_device(pdev);
6010         pci_set_drvdata(pdev, NULL);
6011 }
6012
6013 static int
6014 bnx2_suspend(struct pci_dev *pdev, pm_message_t state)
6015 {
6016         struct net_device *dev = pci_get_drvdata(pdev);
6017         struct bnx2 *bp = netdev_priv(dev);
6018         u32 reset_code;
6019
6020         if (!netif_running(dev))
6021                 return 0;
6022
6023         flush_scheduled_work();
6024         bnx2_netif_stop(bp);
6025         netif_device_detach(dev);
6026         del_timer_sync(&bp->timer);
6027         if (bp->flags & NO_WOL_FLAG)
6028                 reset_code = BNX2_DRV_MSG_CODE_UNLOAD_LNK_DN;
6029         else if (bp->wol)
6030                 reset_code = BNX2_DRV_MSG_CODE_SUSPEND_WOL;
6031         else
6032                 reset_code = BNX2_DRV_MSG_CODE_SUSPEND_NO_WOL;
6033         bnx2_reset_chip(bp, reset_code);
6034         bnx2_free_skbs(bp);
6035         bnx2_set_power_state(bp, pci_choose_state(pdev, state));
6036         return 0;
6037 }
6038
6039 static int
6040 bnx2_resume(struct pci_dev *pdev)
6041 {
6042         struct net_device *dev = pci_get_drvdata(pdev);
6043         struct bnx2 *bp = netdev_priv(dev);
6044
6045         if (!netif_running(dev))
6046                 return 0;
6047
6048         bnx2_set_power_state(bp, PCI_D0);
6049         netif_device_attach(dev);
6050         bnx2_init_nic(bp);
6051         bnx2_netif_start(bp);
6052         return 0;
6053 }
6054
6055 static struct pci_driver bnx2_pci_driver = {
6056         .name           = DRV_MODULE_NAME,
6057         .id_table       = bnx2_pci_tbl,
6058         .probe          = bnx2_init_one,
6059         .remove         = __devexit_p(bnx2_remove_one),
6060         .suspend        = bnx2_suspend,
6061         .resume         = bnx2_resume,
6062 };
6063
6064 static int __init bnx2_init(void)
6065 {
6066         return pci_register_driver(&bnx2_pci_driver);
6067 }
6068
6069 static void __exit bnx2_cleanup(void)
6070 {
6071         pci_unregister_driver(&bnx2_pci_driver);
6072 }
6073
6074 module_init(bnx2_init);
6075 module_exit(bnx2_cleanup);
6076
6077
6078