Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]
Version: [ 2.6.11.8 ] [ 2.6.25 ] [ 2.6.25.8 ] [ 2.6.31.13 ] Architecture: [ i386 ]
  1 /* bnx2.c: Broadcom NX2 network driver.
  2  *
  3  * Copyright (c) 2004-2009 Broadcom Corporation
  4  *
  5  * This program is free software; you can redistribute it and/or modify
  6  * it under the terms of the GNU General Public License as published by
  7  * the Free Software Foundation.
  8  *
  9  * Written by: Michael Chan  (mchan@broadcom.com)
 10  */
 11 
 12 
 13 #include <linux/module.h>
 14 #include <linux/moduleparam.h>
 15 
 16 #include <linux/kernel.h>
 17 #include <linux/timer.h>
 18 #include <linux/errno.h>
 19 #include <linux/ioport.h>
 20 #include <linux/slab.h>
 21 #include <linux/vmalloc.h>
 22 #include <linux/interrupt.h>
 23 #include <linux/pci.h>
 24 #include <linux/init.h>
 25 #include <linux/netdevice.h>
 26 #include <linux/etherdevice.h>
 27 #include <linux/skbuff.h>
 28 #include <linux/dma-mapping.h>
 29 #include <linux/bitops.h>
 30 #include <asm/io.h>
 31 #include <asm/irq.h>
 32 #include <linux/delay.h>
 33 #include <asm/byteorder.h>
 34 #include <asm/page.h>
 35 #include <linux/time.h>
 36 #include <linux/ethtool.h>
 37 #include <linux/mii.h>
 38 #include <linux/if_vlan.h>
 39 #if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE)
 40 #define BCM_VLAN 1
 41 #endif
 42 #include <net/ip.h>
 43 #include <net/tcp.h>
 44 #include <net/checksum.h>
 45 #include <linux/workqueue.h>
 46 #include <linux/crc32.h>
 47 #include <linux/prefetch.h>
 48 #include <linux/cache.h>
 49 #include <linux/firmware.h>
 50 #include <linux/log2.h>
 51 #include <linux/list.h>
 52 
 53 #if defined(CONFIG_CNIC) || defined(CONFIG_CNIC_MODULE)
 54 #define BCM_CNIC 1
 55 #include "cnic_if.h"
 56 #endif
 57 #include "bnx2.h"
 58 #include "bnx2_fw.h"
 59 
 60 #define DRV_MODULE_NAME         "bnx2"
 61 #define PFX DRV_MODULE_NAME     ": "
 62 #define DRV_MODULE_VERSION      "2.0.1"
 63 #define DRV_MODULE_RELDATE      "May 6, 2009"
 64 #define FW_MIPS_FILE_06         "bnx2/bnx2-mips-06-4.6.16.fw"
 65 #define FW_RV2P_FILE_06         "bnx2/bnx2-rv2p-06-4.6.16.fw"
 66 #define FW_MIPS_FILE_09         "bnx2/bnx2-mips-09-4.6.17.fw"
 67 #define FW_RV2P_FILE_09         "bnx2/bnx2-rv2p-09-4.6.15.fw"
 68 
 69 #define RUN_AT(x) (jiffies + (x))
 70 
 71 /* Time in jiffies before concluding the transmitter is hung. */
 72 #define TX_TIMEOUT  (5*HZ)
 73 
 74 static char version[] __devinitdata =
 75         "Broadcom NetXtreme II Gigabit Ethernet Driver " DRV_MODULE_NAME " v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n";
 76 
 77 MODULE_AUTHOR("Michael Chan <mchan@broadcom.com>");
 78 MODULE_DESCRIPTION("Broadcom NetXtreme II BCM5706/5708/5709/5716 Driver");
 79 MODULE_LICENSE("GPL");
 80 MODULE_VERSION(DRV_MODULE_VERSION);
 81 MODULE_FIRMWARE(FW_MIPS_FILE_06);
 82 MODULE_FIRMWARE(FW_RV2P_FILE_06);
 83 MODULE_FIRMWARE(FW_MIPS_FILE_09);
 84 MODULE_FIRMWARE(FW_RV2P_FILE_09);
 85 
 86 static int disable_msi = 0;
 87 
 88 module_param(disable_msi, int, 0);
 89 MODULE_PARM_DESC(disable_msi, "Disable Message Signaled Interrupt (MSI)");
 90 
 91 typedef enum {
 92         BCM5706 = 0,
 93         NC370T,
 94         NC370I,
 95         BCM5706S,
 96         NC370F,
 97         BCM5708,
 98         BCM5708S,
 99         BCM5709,
100         BCM5709S,
101         BCM5716,
102         BCM5716S,
103 } board_t;
104 
105 /* indexed by board_t, above */
106 static struct {
107         char *name;
108 } board_info[] __devinitdata = {
109         { "Broadcom NetXtreme II BCM5706 1000Base-T" },
110         { "HP NC370T Multifunction Gigabit Server Adapter" },
111         { "HP NC370i Multifunction Gigabit Server Adapter" },
112         { "Broadcom NetXtreme II BCM5706 1000Base-SX" },
113         { "HP NC370F Multifunction Gigabit Server Adapter" },
114         { "Broadcom NetXtreme II BCM5708 1000Base-T" },
115         { "Broadcom NetXtreme II BCM5708 1000Base-SX" },
116         { "Broadcom NetXtreme II BCM5709 1000Base-T" },
117         { "Broadcom NetXtreme II BCM5709 1000Base-SX" },
118         { "Broadcom NetXtreme II BCM5716 1000Base-T" },
119         { "Broadcom NetXtreme II BCM5716 1000Base-SX" },
120         };
121 
122 static DEFINE_PCI_DEVICE_TABLE(bnx2_pci_tbl) = {
123         { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_5706,
124           PCI_VENDOR_ID_HP, 0x3101, 0, 0, NC370T },
125         { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_5706,
126           PCI_VENDOR_ID_HP, 0x3106, 0, 0, NC370I },
127         { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_5706,
128           PCI_ANY_ID, PCI_ANY_ID, 0, 0, BCM5706 },
129         { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_5708,
130           PCI_ANY_ID, PCI_ANY_ID, 0, 0, BCM5708 },
131         { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_5706S,
132           PCI_VENDOR_ID_HP, 0x3102, 0, 0, NC370F },
133         { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_5706S,
134           PCI_ANY_ID, PCI_ANY_ID, 0, 0, BCM5706S },
135         { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_5708S,
136           PCI_ANY_ID, PCI_ANY_ID, 0, 0, BCM5708S },
137         { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_5709,
138           PCI_ANY_ID, PCI_ANY_ID, 0, 0, BCM5709 },
139         { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_5709S,
140           PCI_ANY_ID, PCI_ANY_ID, 0, 0, BCM5709S },
141         { PCI_VENDOR_ID_BROADCOM, 0x163b,
142           PCI_ANY_ID, PCI_ANY_ID, 0, 0, BCM5716 },
143         { PCI_VENDOR_ID_BROADCOM, 0x163c,
144           PCI_ANY_ID, PCI_ANY_ID, 0, 0, BCM5716S },
145         { 0, }
146 };
147 
148 static struct flash_spec flash_table[] =
149 {
150 #define BUFFERED_FLAGS          (BNX2_NV_BUFFERED | BNX2_NV_TRANSLATE)
151 #define NONBUFFERED_FLAGS       (BNX2_NV_WREN)
152         /* Slow EEPROM */
153         {0x00000000, 0x40830380, 0x009f0081, 0xa184a053, 0xaf000400,
154          BUFFERED_FLAGS, SEEPROM_PAGE_BITS, SEEPROM_PAGE_SIZE,
155          SEEPROM_BYTE_ADDR_MASK, SEEPROM_TOTAL_SIZE,
156          "EEPROM - slow"},
157         /* Expansion entry 0001 */
158         {0x08000002, 0x4b808201, 0x00050081, 0x03840253, 0xaf020406,
159          NONBUFFERED_FLAGS, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE,
160          SAIFUN_FLASH_BYTE_ADDR_MASK, 0,
161          "Entry 0001"},
162         /* Saifun SA25F010 (non-buffered flash) */
163         /* strap, cfg1, & write1 need updates */
164         {0x04000001, 0x47808201, 0x00050081, 0x03840253, 0xaf020406,
165          NONBUFFERED_FLAGS, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE,
166          SAIFUN_FLASH_BYTE_ADDR_MASK, SAIFUN_FLASH_BASE_TOTAL_SIZE*2,
167          "Non-buffered flash (128kB)"},
168         /* Saifun SA25F020 (non-buffered flash) */
169         /* strap, cfg1, & write1 need updates */
170         {0x0c000003, 0x4f808201, 0x00050081, 0x03840253, 0xaf020406,
171          NONBUFFERED_FLAGS, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE,
172          SAIFUN_FLASH_BYTE_ADDR_MASK, SAIFUN_FLASH_BASE_TOTAL_SIZE*4,
173          "Non-buffered flash (256kB)"},
174         /* Expansion entry 0100 */
175         {0x11000000, 0x53808201, 0x00050081, 0x03840253, 0xaf020406,
176          NONBUFFERED_FLAGS, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE,
177          SAIFUN_FLASH_BYTE_ADDR_MASK, 0,
178          "Entry 0100"},
179         /* Entry 0101: ST M45PE10 (non-buffered flash, TetonII B0) */
180         {0x19000002, 0x5b808201, 0x000500db, 0x03840253, 0xaf020406,
181          NONBUFFERED_FLAGS, ST_MICRO_FLASH_PAGE_BITS, ST_MICRO_FLASH_PAGE_SIZE,
182          ST_MICRO_FLASH_BYTE_ADDR_MASK, ST_MICRO_FLASH_BASE_TOTAL_SIZE*2,
183          "Entry 0101: ST M45PE10 (128kB non-bufferred)"},
184         /* Entry 0110: ST M45PE20 (non-buffered flash)*/
185         {0x15000001, 0x57808201, 0x000500db, 0x03840253, 0xaf020406,
186          NONBUFFERED_FLAGS, ST_MICRO_FLASH_PAGE_BITS, ST_MICRO_FLASH_PAGE_SIZE,
187          ST_MICRO_FLASH_BYTE_ADDR_MASK, ST_MICRO_FLASH_BASE_TOTAL_SIZE*4,
188          "Entry 0110: ST M45PE20 (256kB non-bufferred)"},
189         /* Saifun SA25F005 (non-buffered flash) */
190         /* strap, cfg1, & write1 need updates */
191         {0x1d000003, 0x5f808201, 0x00050081, 0x03840253, 0xaf020406,
192          NONBUFFERED_FLAGS, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE,
193          SAIFUN_FLASH_BYTE_ADDR_MASK, SAIFUN_FLASH_BASE_TOTAL_SIZE,
194          "Non-buffered flash (64kB)"},
195         /* Fast EEPROM */
196         {0x22000000, 0x62808380, 0x009f0081, 0xa184a053, 0xaf000400,
197          BUFFERED_FLAGS, SEEPROM_PAGE_BITS, SEEPROM_PAGE_SIZE,
198          SEEPROM_BYTE_ADDR_MASK, SEEPROM_TOTAL_SIZE,
199          "EEPROM - fast"},
200         /* Expansion entry 1001 */
201         {0x2a000002, 0x6b808201, 0x00050081, 0x03840253, 0xaf020406,
202          NONBUFFERED_FLAGS, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE,
203          SAIFUN_FLASH_BYTE_ADDR_MASK, 0,
204          "Entry 1001"},
205         /* Expansion entry 1010 */
206         {0x26000001, 0x67808201, 0x00050081, 0x03840253, 0xaf020406,
207          NONBUFFERED_FLAGS, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE,
208          SAIFUN_FLASH_BYTE_ADDR_MASK, 0,
209          "Entry 1010"},
210         /* ATMEL AT45DB011B (buffered flash) */
211         {0x2e000003, 0x6e808273, 0x00570081, 0x68848353, 0xaf000400,
212          BUFFERED_FLAGS, BUFFERED_FLASH_PAGE_BITS, BUFFERED_FLASH_PAGE_SIZE,
213          BUFFERED_FLASH_BYTE_ADDR_MASK, BUFFERED_FLASH_TOTAL_SIZE,
214          "Buffered flash (128kB)"},
215         /* Expansion entry 1100 */
216         {0x33000000, 0x73808201, 0x00050081, 0x03840253, 0xaf020406,
217          NONBUFFERED_FLAGS, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE,
218          SAIFUN_FLASH_BYTE_ADDR_MASK, 0,
219          "Entry 1100"},
220         /* Expansion entry 1101 */
221         {0x3b000002, 0x7b808201, 0x00050081, 0x03840253, 0xaf020406,
222          NONBUFFERED_FLAGS, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE,
223          SAIFUN_FLASH_BYTE_ADDR_MASK, 0,
224          "Entry 1101"},
225         /* Ateml Expansion entry 1110 */
226         {0x37000001, 0x76808273, 0x00570081, 0x68848353, 0xaf000400,
227          BUFFERED_FLAGS, BUFFERED_FLASH_PAGE_BITS, BUFFERED_FLASH_PAGE_SIZE,
228          BUFFERED_FLASH_BYTE_ADDR_MASK, 0,
229          "Entry 1110 (Atmel)"},
230         /* ATMEL AT45DB021B (buffered flash) */
231         {0x3f000003, 0x7e808273, 0x00570081, 0x68848353, 0xaf000400,
232          BUFFERED_FLAGS, BUFFERED_FLASH_PAGE_BITS, BUFFERED_FLASH_PAGE_SIZE,
233          BUFFERED_FLASH_BYTE_ADDR_MASK, BUFFERED_FLASH_TOTAL_SIZE*2,
234          "Buffered flash (256kB)"},
235 };
236 
237 static struct flash_spec flash_5709 = {
238         .flags          = BNX2_NV_BUFFERED,
239         .page_bits      = BCM5709_FLASH_PAGE_BITS,
240         .page_size      = BCM5709_FLASH_PAGE_SIZE,
241         .addr_mask      = BCM5709_FLASH_BYTE_ADDR_MASK,
242         .total_size     = BUFFERED_FLASH_TOTAL_SIZE*2,
243         .name           = "5709 Buffered flash (256kB)",
244 };
245 
246 MODULE_DEVICE_TABLE(pci, bnx2_pci_tbl);
247 
248 static inline u32 bnx2_tx_avail(struct bnx2 *bp, struct bnx2_tx_ring_info *txr)
249 {
250         u32 diff;
251 
252         smp_mb();
253 
254         /* The ring uses 256 indices for 255 entries, one of them
255          * needs to be skipped.
256          */
257         diff = txr->tx_prod - txr->tx_cons;
258         if (unlikely(diff >= TX_DESC_CNT)) {
259                 diff &= 0xffff;
260                 if (diff == TX_DESC_CNT)
261                         diff = MAX_TX_DESC_CNT;
262         }
263         return (bp->tx_ring_size - diff);
264 }
265 
266 static u32
267 bnx2_reg_rd_ind(struct bnx2 *bp, u32 offset)
268 {
269         u32 val;
270 
271         spin_lock_bh(&bp->indirect_lock);
272         REG_WR(bp, BNX2_PCICFG_REG_WINDOW_ADDRESS, offset);
273         val = REG_RD(bp, BNX2_PCICFG_REG_WINDOW);
274         spin_unlock_bh(&bp->indirect_lock);
275         return val;
276 }
277 
278 static void
279 bnx2_reg_wr_ind(struct bnx2 *bp, u32 offset, u32 val)
280 {
281         spin_lock_bh(&bp->indirect_lock);
282         REG_WR(bp, BNX2_PCICFG_REG_WINDOW_ADDRESS, offset);
283         REG_WR(bp, BNX2_PCICFG_REG_WINDOW, val);
284         spin_unlock_bh(&bp->indirect_lock);
285 }
286 
287 static void
288 bnx2_shmem_wr(struct bnx2 *bp, u32 offset, u32 val)
289 {
290         bnx2_reg_wr_ind(bp, bp->shmem_base + offset, val);
291 }
292 
293 static u32
294 bnx2_shmem_rd(struct bnx2 *bp, u32 offset)
295 {
296         return (bnx2_reg_rd_ind(bp, bp->shmem_base + offset));
297 }
298 
299 static void
300 bnx2_ctx_wr(struct bnx2 *bp, u32 cid_addr, u32 offset, u32 val)
301 {
302         offset += cid_addr;
303         spin_lock_bh(&bp->indirect_lock);
304         if (CHIP_NUM(bp) == CHIP_NUM_5709) {
305                 int i;
306 
307                 REG_WR(bp, BNX2_CTX_CTX_DATA, val);
308                 REG_WR(bp, BNX2_CTX_CTX_CTRL,
309                        offset | BNX2_CTX_CTX_CTRL_WRITE_REQ);
310                 for (i = 0; i < 5; i++) {
311                         val = REG_RD(bp, BNX2_CTX_CTX_CTRL);
312                         if ((val & BNX2_CTX_CTX_CTRL_WRITE_REQ) == 0)
313                                 break;
314                         udelay(5);
315                 }
316         } else {
317                 REG_WR(bp, BNX2_CTX_DATA_ADR, offset);
318                 REG_WR(bp, BNX2_CTX_DATA, val);
319         }
320         spin_unlock_bh(&bp->indirect_lock);
321 }
322 
323 #ifdef BCM_CNIC
324 static int
325 bnx2_drv_ctl(struct net_device *dev, struct drv_ctl_info *info)
326 {
327         struct bnx2 *bp = netdev_priv(dev);
328         struct drv_ctl_io *io = &info->data.io;
329 
330         switch (info->cmd) {
331         case DRV_CTL_IO_WR_CMD:
332                 bnx2_reg_wr_ind(bp, io->offset, io->data);
333                 break;
334         case DRV_CTL_IO_RD_CMD:
335                 io->data = bnx2_reg_rd_ind(bp, io->offset);
336                 break;
337         case DRV_CTL_CTX_WR_CMD:
338                 bnx2_ctx_wr(bp, io->cid_addr, io->offset, io->data);
339                 break;
340         default:
341                 return -EINVAL;
342         }
343         return 0;
344 }
345 
346 static void bnx2_setup_cnic_irq_info(struct bnx2 *bp)
347 {
348         struct cnic_eth_dev *cp = &bp->cnic_eth_dev;
349         struct bnx2_napi *bnapi = &bp->bnx2_napi[0];
350         int sb_id;
351 
352         if (bp->flags & BNX2_FLAG_USING_MSIX) {
353                 cp->drv_state |= CNIC_DRV_STATE_USING_MSIX;
354                 bnapi->cnic_present = 0;
355                 sb_id = bp->irq_nvecs;
356                 cp->irq_arr[0].irq_flags |= CNIC_IRQ_FL_MSIX;
357         } else {
358                 cp->drv_state &= ~CNIC_DRV_STATE_USING_MSIX;
359                 bnapi->cnic_tag = bnapi->last_status_idx;
360                 bnapi->cnic_present = 1;
361                 sb_id = 0;
362                 cp->irq_arr[0].irq_flags &= ~CNIC_IRQ_FL_MSIX;
363         }
364 
365         cp->irq_arr[0].vector = bp->irq_tbl[sb_id].vector;
366         cp->irq_arr[0].status_blk = (void *)
367                 ((unsigned long) bnapi->status_blk.msi +
368                 (BNX2_SBLK_MSIX_ALIGN_SIZE * sb_id));
369         cp->irq_arr[0].status_blk_num = sb_id;
370         cp->num_irq = 1;
371 }
372 
373 static int bnx2_register_cnic(struct net_device *dev, struct cnic_ops *ops,
374                               void *data)
375 {
376         struct bnx2 *bp = netdev_priv(dev);
377         struct cnic_eth_dev *cp = &bp->cnic_eth_dev;
378 
379         if (ops == NULL)
380                 return -EINVAL;
381 
382         if (cp->drv_state & CNIC_DRV_STATE_REGD)
383                 return -EBUSY;
384 
385         bp->cnic_data = data;
386         rcu_assign_pointer(bp->cnic_ops, ops);
387 
388         cp->num_irq = 0;
389         cp->drv_state = CNIC_DRV_STATE_REGD;
390 
391         bnx2_setup_cnic_irq_info(bp);
392 
393         return 0;
394 }
395 
396 static int bnx2_unregister_cnic(struct net_device *dev)
397 {
398         struct bnx2 *bp = netdev_priv(dev);
399         struct bnx2_napi *bnapi = &bp->bnx2_napi[0];
400         struct cnic_eth_dev *cp = &bp->cnic_eth_dev;
401 
402         mutex_lock(&bp->cnic_lock);
403         cp->drv_state = 0;
404         bnapi->cnic_present = 0;
405         rcu_assign_pointer(bp->cnic_ops, NULL);
406         mutex_unlock(&bp->cnic_lock);
407         synchronize_rcu();
408         return 0;
409 }
410 
411 struct cnic_eth_dev *bnx2_cnic_probe(struct net_device *dev)
412 {
413         struct bnx2 *bp = netdev_priv(dev);
414         struct cnic_eth_dev *cp = &bp->cnic_eth_dev;
415 
416         cp->drv_owner = THIS_MODULE;
417         cp->chip_id = bp->chip_id;
418         cp->pdev = bp->pdev;
419         cp->io_base = bp->regview;
420         cp->drv_ctl = bnx2_drv_ctl;
421         cp->drv_register_cnic = bnx2_register_cnic;
422         cp->drv_unregister_cnic = bnx2_unregister_cnic;
423 
424         return cp;
425 }
426 EXPORT_SYMBOL(bnx2_cnic_probe);
427 
428 static void
429 bnx2_cnic_stop(struct bnx2 *bp)
430 {
431         struct cnic_ops *c_ops;
432         struct cnic_ctl_info info;
433 
434         mutex_lock(&bp->cnic_lock);
435         c_ops = bp->cnic_ops;
436         if (c_ops) {
437                 info.cmd = CNIC_CTL_STOP_CMD;
438                 c_ops->cnic_ctl(bp->cnic_data, &info);
439         }
440         mutex_unlock(&bp->cnic_lock);
441 }
442 
443 static void
444 bnx2_cnic_start(struct bnx2 *bp)
445 {
446         struct cnic_ops *c_ops;
447         struct cnic_ctl_info info;
448 
449         mutex_lock(&bp->cnic_lock);
450         c_ops = bp->cnic_ops;
451         if (c_ops) {
452                 if (!(bp->flags & BNX2_FLAG_USING_MSIX)) {
453                         struct bnx2_napi *bnapi = &bp->bnx2_napi[0];
454 
455                         bnapi->cnic_tag = bnapi->last_status_idx;
456                 }
457                 info.cmd = CNIC_CTL_START_CMD;
458                 c_ops->cnic_ctl(bp->cnic_data, &info);
459         }
460         mutex_unlock(&bp->cnic_lock);
461 }
462 
463 #else
464 
465 static void
466 bnx2_cnic_stop(struct bnx2 *bp)
467 {
468 }
469 
470 static void
471 bnx2_cnic_start(struct bnx2 *bp)
472 {
473 }
474 
475 #endif
476 
477 static int
478 bnx2_read_phy(struct bnx2 *bp, u32 reg, u32 *val)
479 {
480         u32 val1;
481         int i, ret;
482 
483         if (bp->phy_flags & BNX2_PHY_FLAG_INT_MODE_AUTO_POLLING) {
484                 val1 = REG_RD(bp, BNX2_EMAC_MDIO_MODE);
485                 val1 &= ~BNX2_EMAC_MDIO_MODE_AUTO_POLL;
486 
487                 REG_WR(bp, BNX2_EMAC_MDIO_MODE, val1);
488                 REG_RD(bp, BNX2_EMAC_MDIO_MODE);
489 
490                 udelay(40);
491         }
492 
493         val1 = (bp->phy_addr << 21) | (reg << 16) |
494                 BNX2_EMAC_MDIO_COMM_COMMAND_READ | BNX2_EMAC_MDIO_COMM_DISEXT |
495                 BNX2_EMAC_MDIO_COMM_START_BUSY;
496         REG_WR(bp, BNX2_EMAC_MDIO_COMM, val1);
497 
498         for (i = 0; i < 50; i++) {
499                 udelay(10);
500 
501                 val1 = REG_RD(bp, BNX2_EMAC_MDIO_COMM);
502                 if (!(val1 & BNX2_EMAC_MDIO_COMM_START_BUSY)) {
503                         udelay(5);
504 
505                         val1 = REG_RD(bp, BNX2_EMAC_MDIO_COMM);
506                         val1 &= BNX2_EMAC_MDIO_COMM_DATA;
507 
508                         break;
509                 }
510         }
511 
512         if (val1 & BNX2_EMAC_MDIO_COMM_START_BUSY) {
513                 *val = 0x0;
514                 ret = -EBUSY;
515         }
516         else {
517                 *val = val1;
518                 ret = 0;
519         }
520 
521         if (bp->phy_flags & BNX2_PHY_FLAG_INT_MODE_AUTO_POLLING) {
522                 val1 = REG_RD(bp, BNX2_EMAC_MDIO_MODE);
523                 val1 |= BNX2_EMAC_MDIO_MODE_AUTO_POLL;
524 
525                 REG_WR(bp, BNX2_EMAC_MDIO_MODE, val1);
526                 REG_RD(bp, BNX2_EMAC_MDIO_MODE);
527 
528                 udelay(40);
529         }
530 
531         return ret;
532 }
533 
534 static int
535 bnx2_write_phy(struct bnx2 *bp, u32 reg, u32 val)
536 {
537         u32 val1;
538         int i, ret;
539 
540         if (bp->phy_flags & BNX2_PHY_FLAG_INT_MODE_AUTO_POLLING) {
541                 val1 = REG_RD(bp, BNX2_EMAC_MDIO_MODE);
542                 val1 &= ~BNX2_EMAC_MDIO_MODE_AUTO_POLL;
543 
544                 REG_WR(bp, BNX2_EMAC_MDIO_MODE, val1);
545                 REG_RD(bp, BNX2_EMAC_MDIO_MODE);
546 
547                 udelay(40);
548         }
549 
550         val1 = (bp->phy_addr << 21) | (reg << 16) | val |
551                 BNX2_EMAC_MDIO_COMM_COMMAND_WRITE |
552                 BNX2_EMAC_MDIO_COMM_START_BUSY | BNX2_EMAC_MDIO_COMM_DISEXT;
553         REG_WR(bp, BNX2_EMAC_MDIO_COMM, val1);
554 
555         for (i = 0; i < 50; i++) {
556                 udelay(10);
557 
558                 val1 = REG_RD(bp, BNX2_EMAC_MDIO_COMM);
559                 if (!(val1 & BNX2_EMAC_MDIO_COMM_START_BUSY)) {
560                         udelay(5);
561                         break;
562                 }
563         }
564 
565         if (val1 & BNX2_EMAC_MDIO_COMM_START_BUSY)
566                 ret = -EBUSY;
567         else
568                 ret = 0;
569 
570         if (bp->phy_flags & BNX2_PHY_FLAG_INT_MODE_AUTO_POLLING) {
571                 val1 = REG_RD(bp, BNX2_EMAC_MDIO_MODE);
572                 val1 |= BNX2_EMAC_MDIO_MODE_AUTO_POLL;
573 
574                 REG_WR(bp, BNX2_EMAC_MDIO_MODE, val1);
575                 REG_RD(bp, BNX2_EMAC_MDIO_MODE);
576 
577                 udelay(40);
578         }
579 
580         return ret;
581 }
582 
583 static void
584 bnx2_disable_int(struct bnx2 *bp)
585 {
586         int i;
587         struct bnx2_napi *bnapi;
588 
589         for (i = 0; i < bp->irq_nvecs; i++) {
590                 bnapi = &bp->bnx2_napi[i];
591                 REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD, bnapi->int_num |
592                        BNX2_PCICFG_INT_ACK_CMD_MASK_INT);
593         }
594         REG_RD(bp, BNX2_PCICFG_INT_ACK_CMD);
595 }
596 
597 static void
598 bnx2_enable_int(struct bnx2 *bp)
599 {
600         int i;
601         struct bnx2_napi *bnapi;
602 
603         for (i = 0; i < bp->irq_nvecs; i++) {
604                 bnapi = &bp->bnx2_napi[i];
605 
606                 REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD, bnapi->int_num |
607                        BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID |
608                        BNX2_PCICFG_INT_ACK_CMD_MASK_INT |
609                        bnapi->last_status_idx);
610 
611                 REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD, bnapi->int_num |
612                        BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID |
613                        bnapi->last_status_idx);
614         }
615         REG_WR(bp, BNX2_HC_COMMAND, bp->hc_cmd | BNX2_HC_COMMAND_COAL_NOW);
616 }
617 
618 static void
619 bnx2_disable_int_sync(struct bnx2 *bp)
620 {
621         int i;
622 
623         atomic_inc(&bp->intr_sem);
624         bnx2_disable_int(bp);
625         for (i = 0; i < bp->irq_nvecs; i++)
626                 synchronize_irq(bp->irq_tbl[i].vector);
627 }
628 
629 static void
630 bnx2_napi_disable(struct bnx2 *bp)
631 {
632         int i;
633 
634         for (i = 0; i < bp->irq_nvecs; i++)
635                 napi_disable(&bp->bnx2_napi[i].napi);
636 }
637 
638 static void
639 bnx2_napi_enable(struct bnx2 *bp)
640 {
641         int i;
642 
643         for (i = 0; i < bp->irq_nvecs; i++)
644                 napi_enable(&bp->bnx2_napi[i].napi);
645 }
646 
647 static void
648 bnx2_netif_stop(struct bnx2 *bp)
649 {
650         bnx2_cnic_stop(bp);
651         bnx2_disable_int_sync(bp);
652         if (netif_running(bp->dev)) {
653                 bnx2_napi_disable(bp);
654                 netif_tx_disable(bp->dev);
655                 bp->dev->trans_start = jiffies; /* prevent tx timeout */
656         }
657 }
658 
659 static void
660 bnx2_netif_start(struct bnx2 *bp)
661 {
662         if (atomic_dec_and_test(&bp->intr_sem)) {
663                 if (netif_running(bp->dev)) {
664                         netif_tx_wake_all_queues(bp->dev);
665                         bnx2_napi_enable(bp);
666                         bnx2_enable_int(bp);
667                         bnx2_cnic_start(bp);
668                 }
669         }
670 }
671 
672 static void
673 bnx2_free_tx_mem(struct bnx2 *bp)
674 {
675         int i;
676 
677         for (i = 0; i < bp->num_tx_rings; i++) {
678                 struct bnx2_napi *bnapi = &bp->bnx2_napi[i];
679                 struct bnx2_tx_ring_info *txr = &bnapi->tx_ring;
680 
681                 if (txr->tx_desc_ring) {
682                         pci_free_consistent(bp->pdev, TXBD_RING_SIZE,
683                                             txr->tx_desc_ring,
684                                             txr->tx_desc_mapping);
685                         txr->tx_desc_ring = NULL;
686                 }
687                 kfree(txr->tx_buf_ring);
688                 txr->tx_buf_ring = NULL;
689         }
690 }
691 
692 static void
693 bnx2_free_rx_mem(struct bnx2 *bp)
694 {
695         int i;
696 
697         for (i = 0; i < bp->num_rx_rings; i++) {
698                 struct bnx2_napi *bnapi = &bp->bnx2_napi[i];
699                 struct bnx2_rx_ring_info *rxr = &bnapi->rx_ring;
700                 int j;
701 
702                 for (j = 0; j < bp->rx_max_ring; j++) {
703                         if (rxr->rx_desc_ring[j])
704                                 pci_free_consistent(bp->pdev, RXBD_RING_SIZE,
705                                                     rxr->rx_desc_ring[j],
706                                                     rxr->rx_desc_mapping[j]);
707                         rxr->rx_desc_ring[j] = NULL;
708                 }
709                 vfree(rxr->rx_buf_ring);
710                 rxr->rx_buf_ring = NULL;
711 
712                 for (j = 0; j < bp->rx_max_pg_ring; j++) {
713                         if (rxr->rx_pg_desc_ring[j])
714                                 pci_free_consistent(bp->pdev, RXBD_RING_SIZE,
715                                                     rxr->rx_pg_desc_ring[j],
716                                                     rxr->rx_pg_desc_mapping[j]);
717                         rxr->rx_pg_desc_ring[j] = NULL;
718                 }
719                 vfree(rxr->rx_pg_ring);
720                 rxr->rx_pg_ring = NULL;
721         }
722 }
723 
724 static int
725 bnx2_alloc_tx_mem(struct bnx2 *bp)
726 {
727         int i;
728 
729         for (i = 0; i < bp->num_tx_rings; i++) {
730                 struct bnx2_napi *bnapi = &bp->bnx2_napi[i];
731                 struct bnx2_tx_ring_info *txr = &bnapi->tx_ring;
732 
733                 txr->tx_buf_ring = kzalloc(SW_TXBD_RING_SIZE, GFP_KERNEL);
734                 if (txr->tx_buf_ring == NULL)
735                         return -ENOMEM;
736 
737                 txr->tx_desc_ring =
738                         pci_alloc_consistent(bp->pdev, TXBD_RING_SIZE,
739                                              &txr->tx_desc_mapping);
740                 if (txr->tx_desc_ring == NULL)
741                         return -ENOMEM;
742         }
743         return 0;
744 }
745 
746 static int
747 bnx2_alloc_rx_mem(struct bnx2 *bp)
748 {
749         int i;
750 
751         for (i = 0; i < bp->num_rx_rings; i++) {
752                 struct bnx2_napi *bnapi = &bp->bnx2_napi[i];
753                 struct bnx2_rx_ring_info *rxr = &bnapi->rx_ring;
754                 int j;
755 
756                 rxr->rx_buf_ring =
757                         vmalloc(SW_RXBD_RING_SIZE * bp->rx_max_ring);
758                 if (rxr->rx_buf_ring == NULL)
759                         return -ENOMEM;
760 
761                 memset(rxr->rx_buf_ring, 0,
762                        SW_RXBD_RING_SIZE * bp->rx_max_ring);
763 
764                 for (j = 0; j < bp->rx_max_ring; j++) {
765                         rxr->rx_desc_ring[j] =
766                                 pci_alloc_consistent(bp->pdev, RXBD_RING_SIZE,
767                                                      &rxr->rx_desc_mapping[j]);
768                         if (rxr->rx_desc_ring[j] == NULL)
769                                 return -ENOMEM;
770 
771                 }
772 
773                 if (bp->rx_pg_ring_size) {
774                         rxr->rx_pg_ring = vmalloc(SW_RXPG_RING_SIZE *
775                                                   bp->rx_max_pg_ring);
776                         if (rxr->rx_pg_ring == NULL)
777                                 return -ENOMEM;
778 
779                         memset(rxr->rx_pg_ring, 0, SW_RXPG_RING_SIZE *
780                                bp->rx_max_pg_ring);
781                 }
782 
783                 for (j = 0; j < bp->rx_max_pg_ring; j++) {
784                         rxr->rx_pg_desc_ring[j] =
785                                 pci_alloc_consistent(bp->pdev, RXBD_RING_SIZE,
786                                                 &rxr->rx_pg_desc_mapping[j]);
787                         if (rxr->rx_pg_desc_ring[j] == NULL)
788                                 return -ENOMEM;
789 
790                 }
791         }
792         return 0;
793 }
794 
795 static void
796 bnx2_free_mem(struct bnx2 *bp)
797 {
798         int i;
799         struct bnx2_napi *bnapi = &bp->bnx2_napi[0];
800 
801         bnx2_free_tx_mem(bp);
802         bnx2_free_rx_mem(bp);
803 
804         for (i = 0; i < bp->ctx_pages; i++) {
805                 if (bp->ctx_blk[i]) {
806                         pci_free_consistent(bp->pdev, BCM_PAGE_SIZE,
807                                             bp->ctx_blk[i],
808                                             bp->ctx_blk_mapping[i]);
809                         bp->ctx_blk[i] = NULL;
810                 }
811         }
812         if (bnapi->status_blk.msi) {
813                 pci_free_consistent(bp->pdev, bp->status_stats_size,
814                                     bnapi->status_blk.msi,
815                                     bp->status_blk_mapping);
816                 bnapi->status_blk.msi = NULL;
817                 bp->stats_blk = NULL;
818         }
819 }
820 
821 static int
822 bnx2_alloc_mem(struct bnx2 *bp)
823 {
824         int i, status_blk_size, err;
825         struct bnx2_napi *bnapi;
826         void *status_blk;
827 
828         /* Combine status and statistics blocks into one allocation. */
829         status_blk_size = L1_CACHE_ALIGN(sizeof(struct status_block));
830         if (bp->flags & BNX2_FLAG_MSIX_CAP)
831                 status_blk_size = L1_CACHE_ALIGN(BNX2_MAX_MSIX_HW_VEC *
832                                                  BNX2_SBLK_MSIX_ALIGN_SIZE);
833         bp->status_stats_size = status_blk_size +
834                                 sizeof(struct statistics_block);
835 
836         status_blk = pci_alloc_consistent(bp->pdev, bp->status_stats_size,
837                                           &bp->status_blk_mapping);
838         if (status_blk == NULL)
839                 goto alloc_mem_err;
840 
841         memset(status_blk, 0, bp->status_stats_size);
842 
843         bnapi = &bp->bnx2_napi[0];
844         bnapi->status_blk.msi = status_blk;
845         bnapi->hw_tx_cons_ptr =
846                 &bnapi->status_blk.msi->status_tx_quick_consumer_index0;
847         bnapi->hw_rx_cons_ptr =
848                 &bnapi->status_blk.msi->status_rx_quick_consumer_index0;
849         if (bp->flags & BNX2_FLAG_MSIX_CAP) {
850                 for (i = 1; i < BNX2_MAX_MSIX_VEC; i++) {
851                         struct status_block_msix *sblk;
852 
853                         bnapi = &bp->bnx2_napi[i];
854 
855                         sblk = (void *) (status_blk +
856                                          BNX2_SBLK_MSIX_ALIGN_SIZE * i);
857                         bnapi->status_blk.msix = sblk;
858                         bnapi->hw_tx_cons_ptr =
859                                 &sblk->status_tx_quick_consumer_index;
860                         bnapi->hw_rx_cons_ptr =
861                                 &sblk->status_rx_quick_consumer_index;
862                         bnapi->int_num = i << 24;
863                 }
864         }
865 
866         bp->stats_blk = status_blk + status_blk_size;
867 
868         bp->stats_blk_mapping = bp->status_blk_mapping + status_blk_size;
869 
870         if (CHIP_NUM(bp) == CHIP_NUM_5709) {
871                 bp->ctx_pages = 0x2000 / BCM_PAGE_SIZE;
872                 if (bp->ctx_pages == 0)
873                         bp->ctx_pages = 1;
874                 for (i = 0; i < bp->ctx_pages; i++) {
875                         bp->ctx_blk[i] = pci_alloc_consistent(bp->pdev,
876                                                 BCM_PAGE_SIZE,
877                                                 &bp->ctx_blk_mapping[i]);
878                         if (bp->ctx_blk[i] == NULL)
879                                 goto alloc_mem_err;
880                 }
881         }
882 
883         err = bnx2_alloc_rx_mem(bp);
884         if (err)
885                 goto alloc_mem_err;
886 
887         err = bnx2_alloc_tx_mem(bp);
888         if (err)
889                 goto alloc_mem_err;
890 
891         return 0;
892 
893 alloc_mem_err:
894         bnx2_free_mem(bp);
895         return -ENOMEM;
896 }
897 
898 static void
899 bnx2_report_fw_link(struct bnx2 *bp)
900 {
901         u32 fw_link_status = 0;
902 
903         if (bp->phy_flags & BNX2_PHY_FLAG_REMOTE_PHY_CAP)
904                 return;
905 
906         if (bp->link_up) {
907                 u32 bmsr;
908 
909                 switch (bp->line_speed) {
910                 case SPEED_10:
911                         if (bp->duplex == DUPLEX_HALF)
912                                 fw_link_status = BNX2_LINK_STATUS_10HALF;
913                         else
914                                 fw_link_status = BNX2_LINK_STATUS_10FULL;
915                         break;
916                 case SPEED_100:
917                         if (bp->duplex == DUPLEX_HALF)
918                                 fw_link_status = BNX2_LINK_STATUS_100HALF;
919                         else
920                                 fw_link_status = BNX2_LINK_STATUS_100FULL;
921                         break;
922                 case SPEED_1000:
923                         if (bp->duplex == DUPLEX_HALF)
924                                 fw_link_status = BNX2_LINK_STATUS_1000HALF;
925                         else
926                                 fw_link_status = BNX2_LINK_STATUS_1000FULL;
927                         break;
928                 case SPEED_2500:
929                         if (bp->duplex == DUPLEX_HALF)
930                                 fw_link_status = BNX2_LINK_STATUS_2500HALF;
931                         else
932                                 fw_link_status = BNX2_LINK_STATUS_2500FULL;
933                         break;
934                 }
935 
936                 fw_link_status |= BNX2_LINK_STATUS_LINK_UP;
937 
938                 if (bp->autoneg) {
939                         fw_link_status |= BNX2_LINK_STATUS_AN_ENABLED;
940 
941                         bnx2_read_phy(bp, bp->mii_bmsr, &bmsr);
942                         bnx2_read_phy(bp, bp->mii_bmsr, &bmsr);
943 
944                         if (!(bmsr & BMSR_ANEGCOMPLETE) ||
945                             bp->phy_flags & BNX2_PHY_FLAG_PARALLEL_DETECT)
946                                 fw_link_status |= BNX2_LINK_STATUS_PARALLEL_DET;
947                         else
948                                 fw_link_status |= BNX2_LINK_STATUS_AN_COMPLETE;
949                 }
950         }
951         else
952                 fw_link_status = BNX2_LINK_STATUS_LINK_DOWN;
953 
954         bnx2_shmem_wr(bp, BNX2_LINK_STATUS, fw_link_status);
955 }
956 
957 static char *
958 bnx2_xceiver_str(struct bnx2 *bp)
959 {
960         return ((bp->phy_port == PORT_FIBRE) ? "SerDes" :
961                 ((bp->phy_flags & BNX2_PHY_FLAG_SERDES) ? "Remote Copper" :
962                  "Copper"));
963 }
964 
965 static void
966 bnx2_report_link(struct bnx2 *bp)
967 {
968         if (bp->link_up) {
969                 netif_carrier_on(bp->dev);
970                 printk(KERN_INFO PFX "%s NIC %s Link is Up, ", bp->dev->name,
971                        bnx2_xceiver_str(bp));
972 
973                 printk("%d Mbps ", bp->line_speed);
974 
975                 if (bp->duplex == DUPLEX_FULL)
976                         printk("full duplex");
977                 else
978                         printk("half duplex");
979 
980                 if (bp->flow_ctrl) {
981                         if (bp->flow_ctrl & FLOW_CTRL_RX) {
982                                 printk(", receive ");
983                                 if (bp->flow_ctrl & FLOW_CTRL_TX)
984                                         printk("& transmit ");
985                         }
986                         else {
987                                 printk(", transmit ");
988                         }
989                         printk("flow control ON");
990                 }
991                 printk("\n");
992         }
993         else {
994                 netif_carrier_off(bp->dev);
995                 printk(KERN_ERR PFX "%s NIC %s Link is Down\n", bp->dev->name,
996                        bnx2_xceiver_str(bp));
997         }
998 
999         bnx2_report_fw_link(bp);
1000 }
1001 
1002 static void
1003 bnx2_resolve_flow_ctrl(struct bnx2 *bp)
1004 {
1005         u32 local_adv, remote_adv;
1006 
1007         bp->flow_ctrl = 0;
1008         if ((bp->autoneg & (AUTONEG_SPEED | AUTONEG_FLOW_CTRL)) !=
1009                 (AUTONEG_SPEED | AUTONEG_FLOW_CTRL)) {
1010 
1011                 if (bp->duplex == DUPLEX_FULL) {
1012                         bp->flow_ctrl = bp->req_flow_ctrl;
1013                 }
1014                 return;
1015         }
1016 
1017         if (bp->duplex != DUPLEX_FULL) {
1018                 return;
1019         }
1020 
1021         if ((bp->phy_flags & BNX2_PHY_FLAG_SERDES) &&
1022             (CHIP_NUM(bp) == CHIP_NUM_5708)) {
1023                 u32 val;
1024 
1025                 bnx2_read_phy(bp, BCM5708S_1000X_STAT1, &val);
1026                 if (val & BCM5708S_1000X_STAT1_TX_PAUSE)
1027                         bp->flow_ctrl |= FLOW_CTRL_TX;
1028                 if (val & BCM5708S_1000X_STAT1_RX_PAUSE)
1029                         bp->flow_ctrl |= FLOW_CTRL_RX;
1030                 return;
1031         }
1032 
1033         bnx2_read_phy(bp, bp->mii_adv, &local_adv);
1034         bnx2_read_phy(bp, bp->mii_lpa, &remote_adv);
1035 
1036         if (bp->phy_flags & BNX2_PHY_FLAG_SERDES) {
1037                 u32 new_local_adv = 0;
1038                 u32 new_remote_adv = 0;
1039 
1040                 if (local_adv & ADVERTISE_1000XPAUSE)
1041                         new_local_adv |= ADVERTISE_PAUSE_CAP;
1042                 if (local_adv & ADVERTISE_1000XPSE_ASYM)
1043                         new_local_adv |= ADVERTISE_PAUSE_ASYM;
1044                 if (remote_adv & ADVERTISE_1000XPAUSE)
1045                         new_remote_adv |= ADVERTISE_PAUSE_CAP;
1046                 if (remote_adv & ADVERTISE_1000XPSE_ASYM)
1047                         new_remote_adv |= ADVERTISE_PAUSE_ASYM;
1048 
1049                 local_adv = new_local_adv;
1050                 remote_adv = new_remote_adv;
1051         }
1052 
1053         /* See Table 28B-3 of 802.3ab-1999 spec. */
1054         if (local_adv & ADVERTISE_PAUSE_CAP) {
1055                 if(local_adv & ADVERTISE_PAUSE_ASYM) {
1056                         if (remote_adv & ADVERTISE_PAUSE_CAP) {
1057                                 bp->flow_ctrl = FLOW_CTRL_TX | FLOW_CTRL_RX;
1058                         }
1059                         else if (remote_adv & ADVERTISE_PAUSE_ASYM) {
1060                                 bp->flow_ctrl = FLOW_CTRL_RX;
1061                         }
1062                 }
1063                 else {
1064                         if (remote_adv & ADVERTISE_PAUSE_CAP) {
1065                                 bp->flow_ctrl = FLOW_CTRL_TX | FLOW_CTRL_RX;
1066                         }
1067                 }
1068         }
1069         else if (local_adv & ADVERTISE_PAUSE_ASYM) {
1070                 if ((remote_adv & ADVERTISE_PAUSE_CAP) &&
1071                         (remote_adv & ADVERTISE_PAUSE_ASYM)) {
1072 
1073                         bp->flow_ctrl = FLOW_CTRL_TX;
1074                 }
1075         }
1076 }
1077 
1078 static int
1079 bnx2_5709s_linkup(struct bnx2 *bp)
1080 {
1081         u32 val, speed;
1082 
1083         bp->link_up = 1;
1084 
1085         bnx2_write_phy(bp, MII_BNX2_BLK_ADDR, MII_BNX2_BLK_ADDR_GP_STATUS);
1086         bnx2_read_phy(bp, MII_BNX2_GP_TOP_AN_STATUS1, &val);
1087         bnx2_write_phy(bp, MII_BNX2_BLK_ADDR, MII_BNX2_BLK_ADDR_COMBO_IEEEB0);
1088 
1089         if ((bp->autoneg & AUTONEG_SPEED) == 0) {
1090                 bp->line_speed = bp->req_line_speed;
1091                 bp->duplex = bp->req_duplex;
1092                 return 0;
1093         }
1094         speed = val & MII_BNX2_GP_TOP_AN_SPEED_MSK;
1095         switch (speed) {
1096                 case MII_BNX2_GP_TOP_AN_SPEED_10:
1097                         bp->line_speed = SPEED_10;
1098                         break;
1099                 case MII_BNX2_GP_TOP_AN_SPEED_100:
1100                         bp->line_speed = SPEED_100;
1101                         break;
1102                 case MII_BNX2_GP_TOP_AN_SPEED_1G:
1103                 case MII_BNX2_GP_TOP_AN_SPEED_1GKV:
1104                         bp->line_speed = SPEED_1000;
1105                         break;
1106                 case MII_BNX2_GP_TOP_AN_SPEED_2_5G:
1107                         bp->line_speed = SPEED_2500;
1108                         break;
1109         }
1110         if (val & MII_BNX2_GP_TOP_AN_FD)
1111                 bp->duplex = DUPLEX_FULL;
1112         else
1113                 bp->duplex = DUPLEX_HALF;
1114         return 0;
1115 }
1116 
1117 static int
1118 bnx2_5708s_linkup(struct bnx2 *bp)
1119 {
1120         u32 val;
1121 
1122         bp->link_up = 1;
1123         bnx2_read_phy(bp, BCM5708S_1000X_STAT1, &val);
1124         switch (val & BCM5708S_1000X_STAT1_SPEED_MASK) {
1125                 case BCM5708S_1000X_STAT1_SPEED_10:
1126                         bp->line_speed = SPEED_10;
1127                         break;
1128                 case BCM5708S_1000X_STAT1_SPEED_100:
1129                         bp->line_speed = SPEED_100;
1130                         break;
1131                 case BCM5708S_1000X_STAT1_SPEED_1G:
1132                         bp->line_speed = SPEED_1000;
1133                         break;
1134                 case BCM5708S_1000X_STAT1_SPEED_2G5:
1135                         bp->line_speed = SPEED_2500;
1136                         break;
1137         }
1138         if (val & BCM5708S_1000X_STAT1_FD)
1139                 bp->duplex = DUPLEX_FULL;
1140         else
1141                 bp->duplex = DUPLEX_HALF;
1142 
1143         return 0;
1144 }
1145 
1146 static int
1147 bnx2_5706s_linkup(struct bnx2 *bp)
1148 {
1149         u32 bmcr, local_adv, remote_adv, common;
1150 
1151         bp->link_up = 1;
1152         bp->line_speed = SPEED_1000;
1153 
1154         bnx2_read_phy(bp, bp->mii_bmcr, &bmcr);
1155         if (bmcr & BMCR_FULLDPLX) {
1156                 bp->duplex = DUPLEX_FULL;
1157         }
1158         else {
1159                 bp->duplex = DUPLEX_HALF;
1160         }
1161 
1162         if (!(bmcr & BMCR_ANENABLE)) {
1163                 return 0;
1164         }
1165 
1166         bnx2_read_phy(bp, bp->mii_adv, &local_adv);
1167         bnx2_read_phy(bp, bp->mii_lpa, &remote_adv);
1168 
1169         common = local_adv & remote_adv;
1170         if (common & (ADVERTISE_1000XHALF | ADVERTISE_1000XFULL)) {
1171 
1172                 if (common & ADVERTISE_1000XFULL) {
1173                         bp->duplex = DUPLEX_FULL;
1174                 }
1175                 else {
1176                         bp->duplex = DUPLEX_HALF;
1177                 }
1178         }
1179 
1180         return 0;
1181 }
1182 
1183 static int
1184 bnx2_copper_linkup(struct bnx2 *bp)
1185 {
1186         u32 bmcr;
1187 
1188         bnx2_read_phy(bp, bp->mii_bmcr, &bmcr);
1189         if (bmcr & BMCR_ANENABLE) {
1190                 u32 local_adv, remote_adv, common;
1191 
1192                 bnx2_read_phy(bp, MII_CTRL1000, &local_adv);
1193                 bnx2_read_phy(bp, MII_STAT1000, &remote_adv);
1194 
1195                 common = local_adv & (remote_adv >> 2);
1196                 if (common & ADVERTISE_1000FULL) {
1197                         bp->line_speed = SPEED_1000;
1198                         bp->duplex = DUPLEX_FULL;
1199                 }
1200                 else if (common & ADVERTISE_1000HALF) {
1201                         bp->line_speed = SPEED_1000;
1202                         bp->duplex = DUPLEX_HALF;
1203                 }
1204                 else {
1205                         bnx2_read_phy(bp, bp->mii_adv, &local_adv);
1206                         bnx2_read_phy(bp, bp->mii_lpa, &remote_adv);
1207 
1208                         common = local_adv & remote_adv;
1209                         if (common & ADVERTISE_100FULL) {
1210                                 bp->line_speed = SPEED_100;
1211                                 bp->duplex = DUPLEX_FULL;
1212                         }
1213                         else if (common & ADVERTISE_100HALF) {
1214                                 bp->line_speed = SPEED_100;
1215                                 bp->duplex = DUPLEX_HALF;
1216                         }
1217                         else if (common & ADVERTISE_10FULL) {
1218                                 bp->line_speed = SPEED_10;
1219                                 bp->duplex = DUPLEX_FULL;
1220                         }
1221                         else if (common & ADVERTISE_10HALF) {
1222                                 bp->line_speed = SPEED_10;
1223                                 bp->duplex = DUPLEX_HALF;
1224                         }
1225                         else {
1226                                 bp->line_speed = 0;
1227                                 bp->link_up = 0;
1228                         }
1229                 }
1230         }
1231         else {
1232                 if (bmcr & BMCR_SPEED100) {
1233                         bp->line_speed = SPEED_100;
1234                 }
1235                 else {
1236                         bp->line_speed = SPEED_10;
1237                 }
1238                 if (bmcr & BMCR_FULLDPLX) {
1239                         bp->duplex = DUPLEX_FULL;
1240                 }
1241                 else {
1242                         bp->duplex = DUPLEX_HALF;
1243                 }
1244         }
1245 
1246         return 0;
1247 }
1248 
1249 static void
1250 bnx2_init_rx_context(struct bnx2 *bp, u32 cid)
1251 {
1252         u32 val, rx_cid_addr = GET_CID_ADDR(cid);
1253 
1254         val = BNX2_L2CTX_CTX_TYPE_CTX_BD_CHN_TYPE_VALUE;
1255         val |= BNX2_L2CTX_CTX_TYPE_SIZE_L2;
1256         val |= 0x02 << 8;
1257 
1258         if (CHIP_NUM(bp) == CHIP_NUM_5709) {
1259                 u32 lo_water, hi_water;
1260 
1261                 if (bp->flow_ctrl & FLOW_CTRL_TX)
1262                         lo_water = BNX2_L2CTX_LO_WATER_MARK_DEFAULT;
1263                 else
1264                         lo_water = BNX2_L2CTX_LO_WATER_MARK_DIS;
1265                 if (lo_water >= bp->rx_ring_size)
1266                         lo_water = 0;
1267 
1268                 hi_water = bp->rx_ring_size / 4;
1269 
1270                 if (hi_water <= lo_water)
1271                         lo_water = 0;
1272 
1273                 hi_water /= BNX2_L2CTX_HI_WATER_MARK_SCALE;
1274                 lo_water /= BNX2_L2CTX_LO_WATER_MARK_SCALE;
1275 
1276                 if (hi_water > 0xf)
1277                         hi_water = 0xf;
1278                 else if (hi_water == 0)
1279                         lo_water = 0;
1280                 val |= lo_water | (hi_water << BNX2_L2CTX_HI_WATER_MARK_SHIFT);
1281         }
1282         bnx2_ctx_wr(bp, rx_cid_addr, BNX2_L2CTX_CTX_TYPE, val);
1283 }
1284 
1285 static void
1286 bnx2_init_all_rx_contexts(struct bnx2 *bp)
1287 {
1288         int i;
1289         u32 cid;
1290 
1291         for (i = 0, cid = RX_CID; i < bp->num_rx_rings; i++, cid++) {
1292                 if (i == 1)
1293                         cid = RX_RSS_CID;
1294                 bnx2_init_rx_context(bp, cid);
1295         }
1296 }
1297 
1298 static void
1299 bnx2_set_mac_link(struct bnx2 *bp)
1300 {
1301         u32 val;
1302 
1303         REG_WR(bp, BNX2_EMAC_TX_LENGTHS, 0x2620);
1304         if (bp->link_up && (bp->line_speed == SPEED_1000) &&
1305                 (bp->duplex == DUPLEX_HALF)) {
1306                 REG_WR(bp, BNX2_EMAC_TX_LENGTHS, 0x26ff);
1307         }
1308 
1309         /* Configure the EMAC mode register. */
1310         val = REG_RD(bp, BNX2_EMAC_MODE);
1311 
1312         val &= ~(BNX2_EMAC_MODE_PORT | BNX2_EMAC_MODE_HALF_DUPLEX |
1313                 BNX2_EMAC_MODE_MAC_LOOP | BNX2_EMAC_MODE_FORCE_LINK |
1314                 BNX2_EMAC_MODE_25G_MODE);
1315 
1316         if (bp->link_up) {
1317                 switch (bp->line_speed) {
1318                         case SPEED_10:
1319                                 if (CHIP_NUM(bp) != CHIP_NUM_5706) {
1320                                         val |= BNX2_EMAC_MODE_PORT_MII_10M;
1321                                         break;
1322                                 }
1323                                 /* fall through */
1324                         case SPEED_100:
1325                                 val |= BNX2_EMAC_MODE_PORT_MII;
1326                                 break;
1327                         case SPEED_2500:
1328                                 val |= BNX2_EMAC_MODE_25G_MODE;
1329                                 /* fall through */
1330                         case SPEED_1000:
1331                                 val |= BNX2_EMAC_MODE_PORT_GMII;
1332                                 break;
1333                 }
1334         }
1335         else {
1336                 val |= BNX2_EMAC_MODE_PORT_GMII;
1337         }
1338 
1339         /* Set the MAC to operate in the appropriate duplex mode. */
1340         if (bp->duplex == DUPLEX_HALF)
1341                 val |= BNX2_EMAC_MODE_HALF_DUPLEX;
1342         REG_WR(bp, BNX2_EMAC_MODE, val);
1343 
1344         /* Enable/disable rx PAUSE. */
1345         bp->rx_mode &= ~BNX2_EMAC_RX_MODE_FLOW_EN;
1346 
1347         if (bp->flow_ctrl & FLOW_CTRL_RX)
1348                 bp->rx_mode |= BNX2_EMAC_RX_MODE_FLOW_EN;
1349         REG_WR(bp, BNX2_EMAC_RX_MODE, bp->rx_mode);
1350 
1351         /* Enable/disable tx PAUSE. */
1352         val = REG_RD(bp, BNX2_EMAC_TX_MODE);
1353         val &= ~BNX2_EMAC_TX_MODE_FLOW_EN;
1354 
1355         if (bp->flow_ctrl & FLOW_CTRL_TX)
1356                 val |= BNX2_EMAC_TX_MODE_FLOW_EN;
1357         REG_WR(bp, BNX2_EMAC_TX_MODE, val);
1358 
1359         /* Acknowledge the interrupt. */
1360         REG_WR(bp, BNX2_EMAC_STATUS, BNX2_EMAC_STATUS_LINK_CHANGE);
1361 
1362         if (CHIP_NUM(bp) == CHIP_NUM_5709)
1363                 bnx2_init_all_rx_contexts(bp);
1364 }
1365 
1366 static void
1367 bnx2_enable_bmsr1(struct bnx2 *bp)
1368 {
1369         if ((bp->phy_flags & BNX2_PHY_FLAG_SERDES) &&
1370             (CHIP_NUM(bp) == CHIP_NUM_5709))
1371                 bnx2_write_phy(bp, MII_BNX2_BLK_ADDR,
1372                                MII_BNX2_BLK_ADDR_GP_STATUS);
1373 }
1374 
1375 static void
1376 bnx2_disable_bmsr1(struct bnx2 *bp)
1377 {
1378         if ((bp->phy_flags & BNX2_PHY_FLAG_SERDES) &&
1379             (CHIP_NUM(bp) == CHIP_NUM_5709))
1380                 bnx2_write_phy(bp, MII_BNX2_BLK_ADDR,
1381                                MII_BNX2_BLK_ADDR_COMBO_IEEEB0);
1382 }
1383 
1384 static int
1385 bnx2_test_and_enable_2g5(struct bnx2 *bp)
1386 {
1387         u32 up1;
1388         int ret = 1;
1389 
1390         if (!(bp->phy_flags & BNX2_PHY_FLAG_2_5G_CAPABLE))
1391                 return 0;
1392 
1393         if (bp->autoneg & AUTONEG_SPEED)
1394                 bp->advertising |= ADVERTISED_2500baseX_Full;
1395 
1396         if (CHIP_NUM(bp) == CHIP_NUM_5709)
1397                 bnx2_write_phy(bp, MII_BNX2_BLK_ADDR, MII_BNX2_BLK_ADDR_OVER1G);
1398 
1399         bnx2_read_phy(bp, bp->mii_up1, &up1);
1400         if (!(up1 & BCM5708S_UP1_2G5)) {
1401                 up1 |= BCM5708S_UP1_2G5;
1402                 bnx2_write_phy(bp, bp->mii_up1, up1);
1403                 ret = 0;
1404         }
1405 
1406         if (CHIP_NUM(bp) == CHIP_NUM_5709)
1407                 bnx2_write_phy(bp, MII_BNX2_BLK_ADDR,
1408                                MII_BNX2_BLK_ADDR_COMBO_IEEEB0);
1409 
1410         return ret;
1411 }
1412 
1413 static int
1414 bnx2_test_and_disable_2g5(struct bnx2 *bp)
1415 {
1416         u32 up1;
1417         int ret = 0;
1418 
1419         if (!(bp->phy_flags & BNX2_PHY_FLAG_2_5G_CAPABLE))
1420                 return 0;
1421 
1422         if (CHIP_NUM(bp) == CHIP_NUM_5709)
1423                 bnx2_write_phy(bp, MII_BNX2_BLK_ADDR, MII_BNX2_BLK_ADDR_OVER1G);
1424 
1425         bnx2_read_phy(bp, bp->mii_up1, &up1);
1426         if (up1 & BCM5708S_UP1_2G5) {
1427                 up1 &= ~BCM5708S_UP1_2G5;
1428                 bnx2_write_phy(bp, bp->mii_up1, up1);
1429                 ret = 1;
1430         }
1431 
1432         if (CHIP_NUM(bp) == CHIP_NUM_5709)
1433                 bnx2_write_phy(bp, MII_BNX2_BLK_ADDR,
1434                                MII_BNX2_BLK_ADDR_COMBO_IEEEB0);
1435 
1436         return ret;
1437 }
1438 
1439 static void
1440 bnx2_enable_forced_2g5(struct bnx2 *bp)
1441 {
1442         u32 bmcr;
1443 
1444         if (!(bp->phy_flags & BNX2_PHY_FLAG_2_5G_CAPABLE))
1445                 return;
1446 
1447         if (CHIP_NUM(bp) == CHIP_NUM_5709) {
1448                 u32 val;
1449 
1450                 bnx2_write_phy(bp, MII_BNX2_BLK_ADDR,
1451                                MII_BNX2_BLK_ADDR_SERDES_DIG);
1452                 bnx2_read_phy(bp, MII_BNX2_SERDES_DIG_MISC1, &val);
1453                 val &= ~MII_BNX2_SD_MISC1_FORCE_MSK;
1454                 val |= MII_BNX2_SD_MISC1_FORCE | MII_BNX2_SD_MISC1_FORCE_2_5G;
1455                 bnx2_write_phy(bp, MII_BNX2_SERDES_DIG_MISC1, val);
1456 
1457                 bnx2_write_phy(bp, MII_BNX2_BLK_ADDR,
1458                                MII_BNX2_BLK_ADDR_COMBO_IEEEB0);
1459                 bnx2_read_phy(bp, bp->mii_bmcr, &bmcr);
1460 
1461         } else if (CHIP_NUM(bp) == CHIP_NUM_5708) {
1462                 bnx2_read_phy(bp, bp->mii_bmcr, &bmcr);
1463                 bmcr |= BCM5708S_BMCR_FORCE_2500;
1464         }
1465 
1466         if (bp->autoneg & AUTONEG_SPEED) {
1467                 bmcr &= ~BMCR_ANENABLE;
1468                 if (bp->req_duplex == DUPLEX_FULL)
1469                         bmcr |= BMCR_FULLDPLX;
1470         }
1471         bnx2_write_phy(bp, bp->mii_bmcr, bmcr);
1472 }
1473 
1474 static void
1475 bnx2_disable_forced_2g5(struct bnx2 *bp)
1476 {
1477         u32 bmcr;
1478 
1479         if (!(bp->phy_flags & BNX2_PHY_FLAG_2_5G_CAPABLE))
1480                 return;
1481 
1482         if (CHIP_NUM(bp) == CHIP_NUM_5709) {
1483                 u32 val;
1484 
1485                 bnx2_write_phy(bp, MII_BNX2_BLK_ADDR,
1486                                MII_BNX2_BLK_ADDR_SERDES_DIG);
1487                 bnx2_read_phy(bp, MII_BNX2_SERDES_DIG_MISC1, &val);
1488                 val &= ~MII_BNX2_SD_MISC1_FORCE;
1489                 bnx2_write_phy(bp, MII_BNX2_SERDES_DIG_MISC1, val);
1490 
1491                 bnx2_write_phy(bp, MII_BNX2_BLK_ADDR,
1492                                MII_BNX2_BLK_ADDR_COMBO_IEEEB0);
1493                 bnx2_read_phy(bp, bp->mii_bmcr, &bmcr);
1494 
1495         } else if (CHIP_NUM(bp) == CHIP_NUM_5708) {
1496                 bnx2_read_phy(bp, bp->mii_bmcr, &bmcr);
1497                 bmcr &= ~BCM5708S_BMCR_FORCE_2500;
1498         }
1499 
1500         if (bp->autoneg & AUTONEG_SPEED)
1501                 bmcr |= BMCR_SPEED1000 | BMCR_ANENABLE | BMCR_ANRESTART;
1502         bnx2_write_phy(bp, bp->mii_bmcr, bmcr);
1503 }
1504 
1505 static void
1506 bnx2_5706s_force_link_dn(struct bnx2 *bp, int start)
1507 {
1508         u32 val;
1509 
1510         bnx2_write_phy(bp, MII_BNX2_DSP_ADDRESS, MII_EXPAND_SERDES_CTL);
1511         bnx2_read_phy(bp, MII_BNX2_DSP_RW_PORT, &val);
1512         if (start)
1513                 bnx2_write_phy(bp, MII_BNX2_DSP_RW_PORT, val & 0xff0f);
1514         else
1515                 bnx2_write_phy(bp, MII_BNX2_DSP_RW_PORT, val | 0xc0);
1516 }
1517 
1518 static int
1519 bnx2_set_link(struct bnx2 *bp)
1520 {
1521         u32 bmsr;
1522         u8 link_up;
1523 
1524         if (bp->loopback == MAC_LOOPBACK || bp->loopback == PHY_LOOPBACK) {
1525                 bp->link_up = 1;
1526                 return 0;
1527         }
1528 
1529         if (bp->phy_flags & BNX2_PHY_FLAG_REMOTE_PHY_CAP)
1530                 return 0;
1531 
1532         link_up = bp->link_up;
1533 
1534         bnx2_enable_bmsr1(bp);
1535         bnx2_read_phy(bp, bp->mii_bmsr1, &bmsr);
1536         bnx2_read_phy(bp, bp->mii_bmsr1, &bmsr);
1537         bnx2_disable_bmsr1(bp);
1538 
1539         if ((bp->phy_flags & BNX2_PHY_FLAG_SERDES) &&
1540             (CHIP_NUM(bp) == CHIP_NUM_5706)) {
1541                 u32 val, an_dbg;
1542 
1543                 if (bp->phy_flags & BNX2_PHY_FLAG_FORCED_DOWN) {
1544                         bnx2_5706s_force_link_dn(bp, 0);
1545                         bp->phy_flags &= ~BNX2_PHY_FLAG_FORCED_DOWN;
1546                 }
1547                 val = REG_RD(bp, BNX2_EMAC_STATUS);
1548 
1549                 bnx2_write_phy(bp, MII_BNX2_MISC_SHADOW, MISC_SHDW_AN_DBG);
1550                 bnx2_read_phy(bp, MII_BNX2_MISC_SHADOW, &an_dbg);
1551                 bnx2_read_phy(bp, MII_BNX2_MISC_SHADOW, &an_dbg);
1552 
1553                 if ((val & BNX2_EMAC_STATUS_LINK) &&
1554                     !(an_dbg & MISC_SHDW_AN_DBG_NOSYNC))
1555                         bmsr |= BMSR_LSTATUS;
1556                 else
1557                         bmsr &= ~BMSR_LSTATUS;
1558         }
1559 
1560         if (bmsr & BMSR_LSTATUS) {
1561                 bp->link_up = 1;
1562 
1563                 if (bp->phy_flags & BNX2_PHY_FLAG_SERDES) {
1564                         if (CHIP_NUM(bp) == CHIP_NUM_5706)
1565                                 bnx2_5706s_linkup(bp);
1566                         else if (CHIP_NUM(bp) == CHIP_NUM_5708)
1567                                 bnx2_5708s_linkup(bp);
1568                         else if (CHIP_NUM(bp) == CHIP_NUM_5709)
1569                                 bnx2_5709s_linkup(bp);
1570                 }
1571                 else {
1572                         bnx2_copper_linkup(bp);
1573                 }
1574                 bnx2_resolve_flow_ctrl(bp);
1575         }
1576         else {
1577                 if ((bp->phy_flags & BNX2_PHY_FLAG_SERDES) &&
1578                     (bp->autoneg & AUTONEG_SPEED))
1579                         bnx2_disable_forced_2g5(bp);
1580 
1581                 if (bp->phy_flags & BNX2_PHY_FLAG_PARALLEL_DETECT) {
1582                         u32 bmcr;
1583 
1584                         bnx2_read_phy(bp, bp->mii_bmcr, &bmcr);
1585                         bmcr |= BMCR_ANENABLE;
1586                         bnx2_write_phy(bp, bp->mii_bmcr, bmcr);
1587 
1588                         bp->phy_flags &= ~BNX2_PHY_FLAG_PARALLEL_DETECT;
1589                 }
1590                 bp->link_up = 0;
1591         }
1592 
1593         if (bp->link_up != link_up) {
1594                 bnx2_report_link(bp);
1595         }
1596 
1597         bnx2_set_mac_link(bp);
1598 
1599         return 0;
1600 }
1601 
1602 static int
1603 bnx2_reset_phy(struct bnx2 *bp)
1604 {
1605         int i;
1606         u32 reg;
1607 
1608         bnx2_write_phy(bp, bp->mii_bmcr, BMCR_RESET);
1609 
1610 #define PHY_RESET_MAX_WAIT 100
1611         for (i = 0; i < PHY_RESET_MAX_WAIT; i++) {
1612                 udelay(10);
1613 
1614                 bnx2_read_phy(bp, bp->mii_bmcr, &reg);
1615                 if (!(reg & BMCR_RESET)) {
1616                         udelay(20);
1617                         break;
1618                 }
1619         }
1620         if (i == PHY_RESET_MAX_WAIT) {
1621                 return -EBUSY;
1622         }
1623         return 0;
1624 }
1625 
1626 static u32
1627 bnx2_phy_get_pause_adv(struct bnx2 *bp)
1628 {
1629         u32 adv = 0;
1630 
1631         if ((bp->req_flow_ctrl & (FLOW_CTRL_RX | FLOW_CTRL_TX)) ==
1632                 (FLOW_CTRL_RX | FLOW_CTRL_TX)) {
1633 
1634                 if (bp->phy_flags & BNX2_PHY_FLAG_SERDES) {
1635                         adv = ADVERTISE_1000XPAUSE;
1636                 }
1637                 else {
1638                         adv = ADVERTISE_PAUSE_CAP;
1639                 }
1640         }
1641         else if (bp->req_flow_ctrl & FLOW_CTRL_TX) {
1642                 if (bp->phy_flags & BNX2_PHY_FLAG_SERDES) {
1643                         adv = ADVERTISE_1000XPSE_ASYM;
1644                 }
1645                 else {
1646                         adv = ADVERTISE_PAUSE_ASYM;
1647                 }
1648         }
1649         else if (bp->req_flow_ctrl & FLOW_CTRL_RX) {
1650                 if (bp->phy_flags & BNX2_PHY_FLAG_SERDES) {
1651                         adv = ADVERTISE_1000XPAUSE | ADVERTISE_1000XPSE_ASYM;
1652                 }
1653                 else {
1654                         adv = ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM;
1655                 }
1656         }
1657         return adv;
1658 }
1659 
1660 static int bnx2_fw_sync(struct bnx2 *, u32, int, int);
1661 
1662 static int
1663 bnx2_setup_remote_phy(struct bnx2 *bp, u8 port)
1664 __releases(&bp->phy_lock)
1665 __acquires(&bp->phy_lock)
1666 {
1667         u32 speed_arg = 0, pause_adv;
1668 
1669         pause_adv = bnx2_phy_get_pause_adv(bp);
1670 
1671         if (bp->autoneg & AUTONEG_SPEED) {
1672                 speed_arg |= BNX2_NETLINK_SET_LINK_ENABLE_AUTONEG;
1673                 if (bp->advertising & ADVERTISED_10baseT_Half)
1674                         speed_arg |= BNX2_NETLINK_SET_LINK_SPEED_10HALF;
1675                 if (bp->advertising & ADVERTISED_10baseT_Full)
1676                         speed_arg |= BNX2_NETLINK_SET_LINK_SPEED_10FULL;
1677                 if (bp->advertising & ADVERTISED_100baseT_Half)
1678                         speed_arg |= BNX2_NETLINK_SET_LINK_SPEED_100HALF;
1679                 if (bp->advertising & ADVERTISED_100baseT_Full)
1680                         speed_arg |= BNX2_NETLINK_SET_LINK_SPEED_100FULL;
1681                 if (bp->advertising & ADVERTISED_1000baseT_Full)
1682                         speed_arg |= BNX2_NETLINK_SET_LINK_SPEED_1GFULL;
1683                 if (bp->advertising & ADVERTISED_2500baseX_Full)
1684                         speed_arg |= BNX2_NETLINK_SET_LINK_SPEED_2G5FULL;
1685         } else {
1686                 if (bp->req_line_speed == SPEED_2500)
1687                         speed_arg = BNX2_NETLINK_SET_LINK_SPEED_2G5FULL;
1688                 else if (bp->req_line_speed == SPEED_1000)
1689                         speed_arg = BNX2_NETLINK_SET_LINK_SPEED_1GFULL;
1690                 else if (bp->req_line_speed == SPEED_100) {
1691                         if (bp->req_duplex == DUPLEX_FULL)
1692                                 speed_arg = BNX2_NETLINK_SET_LINK_SPEED_100FULL;
1693                         else
1694                                 speed_arg = BNX2_NETLINK_SET_LINK_SPEED_100HALF;
1695                 } else if (bp->req_line_speed == SPEED_10) {
1696                         if (bp->req_duplex == DUPLEX_FULL)
1697                                 speed_arg = BNX2_NETLINK_SET_LINK_SPEED_10FULL;
1698                         else
1699                                 speed_arg = BNX2_NETLINK_SET_LINK_SPEED_10HALF;
1700                 }
1701         }
1702 
1703         if (pause_adv & (ADVERTISE_1000XPAUSE | ADVERTISE_PAUSE_CAP))
1704                 speed_arg |= BNX2_NETLINK_SET_LINK_FC_SYM_PAUSE;
1705         if (pause_adv & (ADVERTISE_1000XPSE_ASYM | ADVERTISE_PAUSE_ASYM))
1706                 speed_arg |= BNX2_NETLINK_SET_LINK_FC_ASYM_PAUSE;
1707 
1708         if (port == PORT_TP)
1709                 speed_arg |= BNX2_NETLINK_SET_LINK_PHY_APP_REMOTE |
1710                              BNX2_NETLINK_SET_LINK_ETH_AT_WIRESPEED;
1711 
1712         bnx2_shmem_wr(bp, BNX2_DRV_MB_ARG0, speed_arg);
1713 
1714         spin_unlock_bh(&bp->phy_lock);
1715         bnx2_fw_sync(bp, BNX2_DRV_MSG_CODE_CMD_SET_LINK, 1, 0);
1716         spin_lock_bh(&bp->phy_lock);
1717 
1718         return 0;
1719 }
1720 
1721 static int
1722 bnx2_setup_serdes_phy(struct bnx2 *bp, u8 port)
1723 __releases(&bp->phy_lock)
1724 __acquires(&bp->phy_lock)
1725 {
1726         u32 adv, bmcr;
1727         u32 new_adv = 0;
1728 
1729         if (bp->phy_flags & BNX2_PHY_FLAG_REMOTE_PHY_CAP)
1730                 return (bnx2_setup_remote_phy(bp, port));
1731 
1732         if (!(bp->autoneg & AUTONEG_SPEED)) {
1733                 u32 new_bmcr;
1734                 int force_link_down = 0;
1735 
1736                 if (bp->req_line_speed == SPEED_2500) {
1737                         if (!bnx2_test_and_enable_2g5(bp))
1738                                 force_link_down = 1;
1739                 } else if (bp->req_line_speed == SPEED_1000) {
1740                         if (bnx2_test_and_disable_2g5(bp))
1741                                 force_link_down = 1;
1742                 }
1743                 bnx2_read_phy(bp, bp->mii_adv, &adv);
1744                 adv &= ~(ADVERTISE_1000XFULL | ADVERTISE_1000XHALF);
1745 
1746                 bnx2_read_phy(bp, bp->mii_bmcr, &bmcr);
1747                 new_bmcr = bmcr & ~BMCR_ANENABLE;
1748                 new_bmcr |= BMCR_SPEED1000;
1749 
1750                 if (CHIP_NUM(bp) == CHIP_NUM_5709) {
1751                         if (bp->req_line_speed == SPEED_2500)
1752                                 bnx2_enable_forced_2g5(bp);
1753                         else if (bp->req_line_speed == SPEED_1000) {
1754                                 bnx2_disable_forced_2g5(bp);
1755                                 new_bmcr &= ~0x2000;
1756                         }
1757 
1758                 } else if (CHIP_NUM(bp) == CHIP_NUM_5708) {
1759                         if (bp->req_line_speed == SPEED_2500)
1760                                 new_bmcr |= BCM5708S_BMCR_FORCE_2500;
1761                         else
1762                                 new_bmcr = bmcr & ~BCM5708S_BMCR_FORCE_2500;
1763                 }
1764 
1765                 if (bp->req_duplex == DUPLEX_FULL) {
1766                         adv |= ADVERTISE_1000XFULL;
1767                         new_bmcr |= BMCR_FULLDPLX;
1768                 }
1769                 else {
1770                         adv |= ADVERTISE_1000XHALF;
1771                         new_bmcr &= ~BMCR_FULLDPLX;
1772                 }
1773                 if ((new_bmcr != bmcr) || (force_link_down)) {
1774                         /* Force a link down visible on the other side */
1775                         if (bp->link_up) {
1776                                 bnx2_write_phy(bp, bp->mii_adv, adv &
1777                                                ~(ADVERTISE_1000XFULL |
1778                                                  ADVERTISE_1000XHALF));
1779                                 bnx2_write_phy(bp, bp->mii_bmcr, bmcr |
1780                                         BMCR_ANRESTART | BMCR_ANENABLE);
1781 
1782                                 bp->link_up = 0;
1783                                 netif_carrier_off(bp->dev);
1784                                 bnx2_write_phy(bp, bp->mii_bmcr, new_bmcr);
1785                                 bnx2_report_link(bp);
1786                         }
1787                         bnx2_write_phy(bp, bp->mii_adv, adv);
1788                         bnx2_write_phy(bp, bp->mii_bmcr, new_bmcr);
1789                 } else {
1790                         bnx2_resolve_flow_ctrl(bp);
1791                         bnx2_set_mac_link(bp);
1792                 }
1793                 return 0;
1794         }
1795 
1796         bnx2_test_and_enable_2g5(bp);
1797 
1798         if (bp->advertising & ADVERTISED_1000baseT_Full)
1799                 new_adv |= ADVERTISE_1000XFULL;
1800 
1801         new_adv |= bnx2_phy_get_pause_adv(bp);
1802 
1803         bnx2_read_phy(bp, bp->mii_adv, &adv);
1804         bnx2_read_phy(bp, bp->mii_bmcr, &bmcr);
1805 
1806         bp->serdes_an_pending = 0;
1807         if ((adv != new_adv) || ((bmcr & BMCR_ANENABLE) == 0)) {
1808                 /* Force a link down visible on the other side */
1809                 if (bp->link_up) {
1810                         bnx2_write_phy(bp, bp->mii_bmcr, BMCR_LOOPBACK);
1811                         spin_unlock_bh(&bp->phy_lock);
1812                         msleep(20);
1813                         spin_lock_bh(&bp->phy_lock);
1814                 }
1815 
1816                 bnx2_write_phy(bp, bp->mii_adv, new_adv);
1817                 bnx2_write_phy(bp, bp->mii_bmcr, bmcr | BMCR_ANRESTART |
1818                         BMCR_ANENABLE);
1819                 /* Speed up link-up time when the link partner
1820                  * does not autonegotiate which is very common
1821                  * in blade servers. Some blade servers use
1822                  * IPMI for kerboard input and it's important
1823                  * to minimize link disruptions. Autoneg. involves
1824                  * exchanging base pages plus 3 next pages and
1825                  * normally completes in about 120 msec.
1826                  */
1827                 bp->current_interval = BNX2_SERDES_AN_TIMEOUT;
1828                 bp->serdes_an_pending = 1;
1829                 mod_timer(&bp->timer, jiffies + bp->current_interval);
1830         } else {
1831                 bnx2_resolve_flow_ctrl(bp);
1832                 bnx2_set_mac_link(bp);
1833         }
1834 
1835         return 0;
1836 }
1837 
1838 #define ETHTOOL_ALL_FIBRE_SPEED                                         \
1839         (bp->phy_flags & BNX2_PHY_FLAG_2_5G_CAPABLE) ?                  \
1840                 (ADVERTISED_2500baseX_Full | ADVERTISED_1000baseT_Full) :\
1841                 (ADVERTISED_1000baseT_Full)
1842 
1843 #define ETHTOOL_ALL_COPPER_SPEED                                        \
1844         (ADVERTISED_10baseT_Half | ADVERTISED_10baseT_Full |            \
1845         ADVERTISED_100baseT_Half | ADVERTISED_100baseT_Full |           \
1846         ADVERTISED_1000baseT_Full)
1847 
1848 #define PHY_ALL_10_100_SPEED (ADVERTISE_10HALF | ADVERTISE_10FULL | \
1849         ADVERTISE_100HALF | ADVERTISE_100FULL | ADVERTISE_CSMA)
1850 
1851 #define PHY_ALL_1000_SPEED (ADVERTISE_1000HALF | ADVERTISE_1000FULL)
1852 
1853 static void
1854 bnx2_set_default_remote_link(struct bnx2 *bp)
1855 {
1856         u32 link;
1857 
1858         if (bp->phy_port == PORT_TP)
1859                 link = bnx2_shmem_rd(bp, BNX2_RPHY_COPPER_LINK);
1860         else
1861                 link = bnx2_shmem_rd(bp, BNX2_RPHY_SERDES_LINK);
1862 
1863         if (link & BNX2_NETLINK_SET_LINK_ENABLE_AUTONEG) {
1864                 bp->req_line_speed = 0;
1865                 bp->autoneg |= AUTONEG_SPEED;
1866                 bp->advertising = ADVERTISED_Autoneg;
1867                 if (link & BNX2_NETLINK_SET_LINK_SPEED_10HALF)
1868                         bp->advertising |= ADVERTISED_10baseT_Half;
1869                 if (link & BNX2_NETLINK_SET_LINK_SPEED_10FULL)
1870                         bp->advertising |= ADVERTISED_10baseT_Full;
1871                 if (link & BNX2_NETLINK_SET_LINK_SPEED_100HALF)
1872                         bp->advertising |= ADVERTISED_100baseT_Half;
1873                 if (link & BNX2_NETLINK_SET_LINK_SPEED_100FULL)
1874                         bp->advertising |= ADVERTISED_100baseT_Full;
1875                 if (link & BNX2_NETLINK_SET_LINK_SPEED_1GFULL)
1876                         bp->advertising |= ADVERTISED_1000baseT_Full;
1877                 if (link & BNX2_NETLINK_SET_LINK_SPEED_2G5FULL)
1878                         bp->advertising |= ADVERTISED_2500baseX_Full;
1879         } else {
1880                 bp->autoneg = 0;
1881                 bp->advertising = 0;
1882                 bp->req_duplex = DUPLEX_FULL;
1883                 if (link & BNX2_NETLINK_SET_LINK_SPEED_10) {
1884                         bp->req_line_speed = SPEED_10;
1885                         if (link & BNX2_NETLINK_SET_LINK_SPEED_10HALF)
1886                                 bp->req_duplex = DUPLEX_HALF;
1887                 }
1888                 if (link & BNX2_NETLINK_SET_LINK_SPEED_100) {
1889                         bp->req_line_speed = SPEED_100;
1890                         if (link & BNX2_NETLINK_SET_LINK_SPEED_100HALF)
1891                                 bp->req_duplex = DUPLEX_HALF;
1892                 }
1893                 if (link & BNX2_NETLINK_SET_LINK_SPEED_1GFULL)
1894                         bp->req_line_speed = SPEED_1000;
1895                 if (link & BNX2_NETLINK_SET_LINK_SPEED_2G5FULL)
1896                         bp->req_line_speed = SPEED_2500;
1897         }
1898 }
1899 
1900 static void
1901 bnx2_set_default_link(struct bnx2 *bp)
1902 {
1903         if (bp->phy_flags & BNX2_PHY_FLAG_REMOTE_PHY_CAP) {
1904                 bnx2_set_default_remote_link(bp);
1905                 return;
1906         }
1907 
1908         bp->autoneg = AUTONEG_SPEED | AUTONEG_FLOW_CTRL;
1909         bp->req_line_speed = 0;
1910         if (bp->phy_flags & BNX2_PHY_FLAG_SERDES) {
1911                 u32 reg;
1912 
1913                 bp->advertising = ETHTOOL_ALL_FIBRE_SPEED | ADVERTISED_Autoneg;
1914 
1915                 reg = bnx2_shmem_rd(bp, BNX2_PORT_HW_CFG_CONFIG);
1916                 reg &= BNX2_PORT_HW_CFG_CFG_DFLT_LINK_MASK;
1917                 if (reg == BNX2_PORT_HW_CFG_CFG_DFLT_LINK_1G) {
1918                         bp->autoneg = 0;
1919                         bp->req_line_speed = bp->line_speed = SPEED_1000;
1920                         bp->req_duplex = DUPLEX_FULL;
1921                 }
1922         } else
1923                 bp->advertising = ETHTOOL_ALL_COPPER_SPEED | ADVERTISED_Autoneg;
1924 }
1925 
1926 static void
1927 bnx2_send_heart_beat(struct bnx2 *bp)
1928 {
1929         u32 msg;
1930         u32 addr;
1931 
1932         spin_lock(&bp->indirect_lock);
1933         msg = (u32) (++bp->fw_drv_pulse_wr_seq & BNX2_DRV_PULSE_SEQ_MASK);
1934         addr = bp->shmem_base + BNX2_DRV_PULSE_MB;
1935         REG_WR(bp, BNX2_PCICFG_REG_WINDOW_ADDRESS, addr);
1936         REG_WR(bp, BNX2_PCICFG_REG_WINDOW, msg);
1937         spin_unlock(&bp->indirect_lock);
1938 }
1939 
1940 static void
1941 bnx2_remote_phy_event(struct bnx2 *bp)
1942 {
1943         u32 msg;
1944         u8 link_up = bp->link_up;
1945         u8 old_port;
1946 
1947         msg = bnx2_shmem_rd(bp, BNX2_LINK_STATUS);
1948 
1949         if (msg & BNX2_LINK_STATUS_HEART_BEAT_EXPIRED)
1950                 bnx2_send_heart_beat(bp);
1951 
1952         msg &= ~BNX2_LINK_STATUS_HEART_BEAT_EXPIRED;
1953 
1954         if ((msg & BNX2_LINK_STATUS_LINK_UP) == BNX2_LINK_STATUS_LINK_DOWN)
1955                 bp->link_up = 0;
1956         else {
1957                 u32 speed;
1958 
1959                 bp->link_up = 1;
1960                 speed = msg & BNX2_LINK_STATUS_SPEED_MASK;
1961                 bp->duplex = DUPLEX_FULL;
1962                 switch (speed) {
1963                         case BNX2_LINK_STATUS_10HALF:
1964                                 bp->duplex = DUPLEX_HALF;
1965                         case BNX2_LINK_STATUS_10FULL:
1966                                 bp->line_speed = SPEED_10;
1967                                 break;
1968                         case BNX2_LINK_STATUS_100HALF:
1969                                 bp->duplex = DUPLEX_HALF;
1970                         case BNX2_LINK_STATUS_100BASE_T4:
1971                         case BNX2_LINK_STATUS_100FULL:
1972                                 bp->line_speed = SPEED_100;
1973                                 break;
1974                         case BNX2_LINK_STATUS_1000HALF:
1975                                 bp->duplex = DUPLEX_HALF;
1976                         case BNX2_LINK_STATUS_1000FULL:
1977                                 bp->line_speed = SPEED_1000;
1978                                 break;
1979                         case BNX2_LINK_STATUS_2500HALF:
1980                                 bp->duplex = DUPLEX_HALF;
1981                         case BNX2_LINK_STATUS_2500FULL:
1982                                 bp->line_speed = SPEED_2500;
1983                                 break;
1984                         default:
1985                                 bp->line_speed = 0;
1986                                 break;
1987                 }
1988 
1989                 bp->flow_ctrl = 0;
1990                 if ((bp->autoneg & (AUTONEG_SPEED | AUTONEG_FLOW_CTRL)) !=
1991                     (AUTONEG_SPEED | AUTONEG_FLOW_CTRL)) {
1992                         if (bp->duplex == DUPLEX_FULL)
1993                                 bp->flow_ctrl = bp->req_flow_ctrl;
1994                 } else {
1995                         if (msg & BNX2_LINK_STATUS_TX_FC_ENABLED)
1996                                 bp->flow_ctrl |= FLOW_CTRL_TX;
1997                         if (msg & BNX2_LINK_STATUS_RX_FC_ENABLED)
1998                                 bp->flow_ctrl |= FLOW_CTRL_RX;
1999                 }
2000 
2001                 old_port = bp->phy_port;
2002                 if (msg & BNX2_LINK_STATUS_SERDES_LINK)
2003                         bp->phy_port = PORT_FIBRE;
2004                 else
2005                         bp->phy_port = PORT_TP;
2006 
2007                 if (old_port != bp->phy_port)
2008                         bnx2_set_default_link(bp);
2009 
2010         }
2011         if (bp->link_up != link_up)
2012                 bnx2_report_link(bp);
2013 
2014         bnx2_set_mac_link(bp);
2015 }
2016 
2017 static int
2018 bnx2_set_remote_link(struct bnx2 *bp)
2019 {
2020         u32 evt_code;
2021 
2022         evt_code = bnx2_shmem_rd(bp, BNX2_FW_EVT_CODE_MB);
2023         switch (evt_code) {
2024                 case BNX2_FW_EVT_CODE_LINK_EVENT:
2025                         bnx2_remote_phy_event(bp);
2026                         break;
2027                 case BNX2_FW_EVT_CODE_SW_TIMER_EXPIRATION_EVENT:
2028                 default:
2029                         bnx2_send_heart_beat(bp);
2030                         break;
2031         }
2032         return 0;
2033 }
2034 
2035 static int
2036 bnx2_setup_copper_phy(struct bnx2 *bp)
2037 __releases(&bp->phy_lock)
2038 __acquires(&bp->phy_lock)
2039 {
2040         u32 bmcr;
2041         u32 new_bmcr;
2042 
2043         bnx2_read_phy(bp, bp->mii_bmcr, &bmcr);
2044 
2045         if (bp->autoneg & AUTONEG_SPEED) {
2046                 u32 adv_reg, adv1000_reg;
2047                 u32 new_adv_reg = 0;
2048                 u32 new_adv1000_reg = 0;
2049 
2050                 bnx2_read_phy(bp, bp->mii_adv, &adv_reg);
2051                 adv_reg &= (PHY_ALL_10_100_SPEED | ADVERTISE_PAUSE_CAP |
2052                         ADVERTISE_PAUSE_ASYM);
2053 
2054                 bnx2_read_phy(bp, MII_CTRL1000, &adv1000_reg);
2055                 adv1000_reg &= PHY_ALL_1000_SPEED;
2056 
2057                 if (bp->advertising & ADVERTISED_10baseT_Half)
2058                         new_adv_reg |= ADVERTISE_10HALF;
2059                 if (bp->advertising & ADVERTISED_10baseT_Full)
2060                         new_adv_reg |= ADVERTISE_10FULL;
2061                 if (bp->advertising & ADVERTISED_100baseT_Half)
2062                         new_adv_reg |= ADVERTISE_100HALF;
2063                 if (bp->advertising & ADVERTISED_100baseT_Full)
2064                         new_adv_reg |= ADVERTISE_100FULL;
2065                 if (bp->advertising & ADVERTISED_1000baseT_Full)
2066                         new_adv1000_reg |= ADVERTISE_1000FULL;
2067 
2068                 new_adv_reg |= ADVERTISE_CSMA;
2069 
2070                 new_adv_reg |= bnx2_phy_get_pause_adv(bp);
2071 
2072                 if ((adv1000_reg != new_adv1000_reg) ||
2073                         (adv_reg != new_adv_reg) ||
2074                         ((bmcr & BMCR_ANENABLE) == 0)) {
2075 
2076                         bnx2_write_phy(bp, bp->mii_adv, new_adv_reg);
2077                         bnx2_write_phy(bp, MII_CTRL1000, new_adv1000_reg);
2078                         bnx2_write_phy(bp, bp->mii_bmcr, BMCR_ANRESTART |
2079                                 BMCR_ANENABLE);
2080                 }
2081                 else if (bp->link_up) {
2082                         /* Flow ctrl may have changed from auto to forced */
2083                         /* or vice-versa. */
2084 
2085                         bnx2_resolve_flow_ctrl(bp);
2086                         bnx2_set_mac_link(bp);
2087                 }
2088                 return 0;
2089         }
2090 
2091         new_bmcr = 0;
2092         if (bp->req_line_speed == SPEED_100) {
2093                 new_bmcr |= BMCR_SPEED100;
2094         }
2095         if (bp->req_duplex == DUPLEX_FULL) {
2096                 new_bmcr |= BMCR_FULLDPLX;
2097         }
2098         if (new_bmcr != bmcr) {
2099                 u32 bmsr;
2100 
2101                 bnx2_read_phy(bp, bp->mii_bmsr, &bmsr);
2102                 bnx2_read_phy(bp, bp->mii_bmsr, &bmsr);
2103 
2104                 if (bmsr & BMSR_LSTATUS) {
2105                         /* Force link down */
2106                         bnx2_write_phy(bp, bp->mii_bmcr, BMCR_LOOPBACK);
2107                         spin_unlock_bh(&bp->phy_lock);
2108                         msleep(50);
2109                         spin_lock_bh(&bp->phy_lock);
2110 
2111                         bnx2_read_phy(bp, bp->mii_bmsr, &bmsr);
2112                         bnx2_read_phy(bp, bp->mii_bmsr, &bmsr);
2113                 }
2114 
2115                 bnx2_write_phy(bp, bp->mii_bmcr, new_bmcr);
2116 
2117                 /* Normally, the new speed is setup after the link has
2118                  * gone down and up again. In some cases, link will not go
2119                  * down so we need to set up the new speed here.
2120                  */
2121                 if (bmsr & BMSR_LSTATUS) {
2122                         bp->line_speed = bp->req_line_speed;
2123                         bp->duplex = bp->req_duplex;
2124                         bnx2_resolve_flow_ctrl(bp);
2125                         bnx2_set_mac_link(bp);
2126                 }
2127         } else {
2128                 bnx2_resolve_flow_ctrl(bp);
2129                 bnx2_set_mac_link(bp);
2130         }
2131         return 0;
2132 }
2133 
2134 static int
2135 bnx2_setup_phy(struct bnx2 *bp, u8 port)
2136 __releases(&bp->phy_lock)
2137 __acquires(&bp->phy_lock)
2138 {
2139         if (bp->loopback == MAC_LOOPBACK)
2140                 return 0;
2141 
2142         if (bp->phy_flags & BNX2_PHY_FLAG_SERDES) {
2143                 return (bnx2_setup_serdes_phy(bp, port));
2144         }
2145         else {
2146                 return (bnx2_setup_copper_phy(bp));
2147         }
2148 }
2149 
2150 static int
2151 bnx2_init_5709s_phy(struct bnx2 *bp, int reset_phy)
2152 {
2153         u32 val;
2154 
2155         bp->mii_bmcr = MII_BMCR + 0x10;
2156         bp->mii_bmsr = MII_BMSR + 0x10;
2157         bp->mii_bmsr1 = MII_BNX2_GP_TOP_AN_STATUS1;
2158         bp->mii_adv = MII_ADVERTISE + 0x10;
2159         bp->mii_lpa = MII_LPA + 0x10;
2160         bp->mii_up1 = MII_BNX2_OVER1G_UP1;
2161 
2162         bnx2_write_phy(bp, MII_BNX2_BLK_ADDR, MII_BNX2_BLK_ADDR_AER);
2163         bnx2_write_phy(bp, MII_BNX2_AER_AER, MII_BNX2_AER_AER_AN_MMD);
2164 
2165         bnx2_write_phy(bp, MII_BNX2_BLK_ADDR, MII_BNX2_BLK_ADDR_COMBO_IEEEB0);
2166         if (reset_phy)
2167                 bnx2_reset_phy(bp);
2168 
2169         bnx2_write_phy(bp, MII_BNX2_BLK_ADDR, MII_BNX2_BLK_ADDR_SERDES_DIG);
2170 
2171         bnx2_read_phy(bp, MII_BNX2_SERDES_DIG_1000XCTL1, &val);
2172         val &= ~MII_BNX2_SD_1000XCTL1_AUTODET;
2173         val |= MII_BNX2_SD_1000XCTL1_FIBER;
2174         bnx2_write_phy(bp, MII_BNX2_SERDES_DIG_1000XCTL1, val);
2175 
2176         bnx2_write_phy(bp, MII_BNX2_BLK_ADDR, MII_BNX2_BLK_ADDR_OVER1G);
2177         bnx2_read_phy(bp, MII_BNX2_OVER1G_UP1, &val);
2178         if (bp->phy_flags & BNX2_PHY_FLAG_2_5G_CAPABLE)
2179                 val |= BCM5708S_UP1_2G5;
2180         else
2181                 val &= ~BCM5708S_UP1_2G5;
2182         bnx2_write_phy(bp, MII_BNX2_OVER1G_UP1, val);
2183 
2184         bnx2_write_phy(bp, MII_BNX2_BLK_ADDR, MII_BNX2_BLK_ADDR_BAM_NXTPG);
2185         bnx2_read_phy(bp, MII_BNX2_BAM_NXTPG_CTL, &val);
2186         val |= MII_BNX2_NXTPG_CTL_T2 | MII_BNX2_NXTPG_CTL_BAM;
2187         bnx2_write_phy(bp, MII_BNX2_BAM_NXTPG_CTL, val);
2188 
2189         bnx2_write_phy(bp, MII_BNX2_BLK_ADDR, MII_BNX2_BLK_ADDR_CL73_USERB0);
2190 
2191         val = MII_BNX2_CL73_BAM_EN | MII_BNX2_CL73_BAM_STA_MGR_EN |
2192               MII_BNX2_CL73_BAM_NP_AFT_BP_EN;
2193         bnx2_write_phy(bp, MII_BNX2_CL73_BAM_CTL1, val);
2194 
2195         bnx2_write_phy(bp, MII_BNX2_BLK_ADDR, MII_BNX2_BLK_ADDR_COMBO_IEEEB0);
2196 
2197         return 0;
2198 }
2199 
2200 static int
2201 bnx2_init_5708s_phy(struct bnx2 *bp, int reset_phy)
2202 {
2203         u32 val;
2204 
2205         if (reset_phy)
2206                 bnx2_reset_phy(bp);
2207 
2208         bp->mii_up1 = BCM5708S_UP1;
2209 
2210         bnx2_write_phy(bp, BCM5708S_BLK_ADDR, BCM5708S_BLK_ADDR_DIG3);
2211         bnx2_write_phy(bp, BCM5708S_DIG_3_0, BCM5708S_DIG_3_0_USE_IEEE);
2212         bnx2_write_phy(bp, BCM5708S_BLK_ADDR, BCM5708S_BLK_ADDR_DIG);
2213 
2214         bnx2_read_phy(bp, BCM5708S_1000X_CTL1, &val);
2215         val |= BCM5708S_1000X_CTL1_FIBER_MODE | BCM5708S_1000X_CTL1_AUTODET_EN;
2216         bnx2_write_phy(bp, BCM5708S_1000X_CTL1, val);
2217 
2218         bnx2_read_phy(bp, BCM5708S_1000X_CTL2, &val);
2219         val |= BCM5708S_1000X_CTL2_PLLEL_DET_EN;
2220         bnx2_write_phy(bp, BCM5708S_1000X_CTL2, val);
2221 
2222         if (bp->phy_flags & BNX2_PHY_FLAG_2_5G_CAPABLE) {
2223                 bnx2_read_phy(bp, BCM5708S_UP1, &val);
2224                 val |= BCM5708S_UP1_2G5;
2225                 bnx2_write_phy(bp, BCM5708S_UP1, val);
2226         }
2227 
2228         if ((CHIP_ID(bp) == CHIP_ID_5708_A0) ||
2229             (CHIP_ID(bp) == CHIP_ID_5708_B0) ||
2230             (CHIP_ID(bp) == CHIP_ID_5708_B1)) {
2231                 /* increase tx signal amplitude */
2232                 bnx2_write_phy(bp, BCM5708S_BLK_ADDR,
2233                                BCM5708S_BLK_ADDR_TX_MISC);
2234                 bnx2_read_phy(bp, BCM5708S_TX_ACTL1, &val);
2235                 val &= ~BCM5708S_TX_ACTL1_DRIVER_VCM;
2236                 bnx2_write_phy(bp, BCM5708S_TX_ACTL1, val);
2237                 bnx2_write_phy(bp, BCM5708S_BLK_ADDR, BCM5708S_BLK_ADDR_DIG);
2238         }
2239 
2240         val = bnx2_shmem_rd(bp, BNX2_PORT_HW_CFG_CONFIG) &
2241               BNX2_PORT_HW_CFG_CFG_TXCTL3_MASK;
2242 
2243         if (val) {
2244                 u32 is_backplane;
2245 
2246                 is_backplane = bnx2_shmem_rd(bp, BNX2_SHARED_HW_CFG_CONFIG);
2247                 if (is_backplane & BNX2_SHARED_HW_CFG_PHY_BACKPLANE) {
2248                         bnx2_write_phy(bp, BCM5708S_BLK_ADDR,
2249                                        BCM5708S_BLK_ADDR_TX_MISC);
2250                         bnx2_write_phy(bp, BCM5708S_TX_ACTL3, val);
2251                         bnx2_write_phy(bp, BCM5708S_BLK_ADDR,
2252                                        BCM5708S_BLK_ADDR_DIG);
2253                 }
2254         }
2255         return 0;
2256 }
2257 
2258 static int
2259 bnx2_init_5706s_phy(struct bnx2 *bp, int reset_phy)
2260 {
2261         if (reset_phy)
2262                 bnx2_reset_phy(bp);
2263 
2264         bp->phy_flags &= ~BNX2_PHY_FLAG_PARALLEL_DETECT;
2265 
2266         if (CHIP_NUM(bp) == CHIP_NUM_5706)
2267                 REG_WR(bp, BNX2_MISC_GP_HW_CTL0, 0x300);
2268 
2269         if (bp->dev->mtu > 1500) {
2270                 u32 val;
2271 
2272                 /* Set extended packet length bit */
2273                 bnx2_write_phy(bp, 0x18, 0x7);
2274                 bnx2_read_phy(bp, 0x18, &val);
2275                 bnx2_write_phy(bp, 0x18, (val & 0xfff8) | 0x4000);
2276 
2277                 bnx2_write_phy(bp, 0x1c, 0x6c00);
2278                 bnx2_read_phy(bp, 0x1c, &val);
2279                 bnx2_write_phy(bp, 0x1c, (val & 0x3ff) | 0xec02);
2280         }
2281         else {
2282                 u32 val;
2283 
2284                 bnx2_write_phy(bp, 0x18, 0x7);
2285                 bnx2_read_phy(bp, 0x18, &val);
2286                 bnx2_write_phy(bp, 0x18, val & ~0x4007);
2287 
2288                 bnx2_write_phy(bp, 0x1c, 0x6c00);
2289                 bnx2_read_phy(bp, 0x1c, &val);
2290                 bnx2_write_phy(bp, 0x1c, (val & 0x3fd) | 0xec00);
2291         }
2292 
2293         return 0;
2294 }
2295 
2296 static int
2297 bnx2_init_copper_phy(struct bnx2 *bp, int reset_phy)
2298 {
2299         u32 val;
2300 
2301         if (reset_phy)
2302                 bnx2_reset_phy(bp);
2303 
2304         if (bp->phy_flags & BNX2_PHY_FLAG_CRC_FIX) {
2305                 bnx2_write_phy(bp, 0x18, 0x0c00);
2306                 bnx2_write_phy(bp, 0x17, 0x000a);
2307                 bnx2_write_phy(bp, 0x15, 0x310b);
2308                 bnx2_write_phy(bp, 0x17, 0x201f);
2309                 bnx2_write_phy(bp, 0x15, 0x9506);
2310                 bnx2_write_phy(bp, 0x17, 0x401f);
2311                 bnx2_write_phy(bp, 0x15, 0x14e2);
2312                 bnx2_write_phy(bp, 0x18, 0x0400);
2313         }
2314 
2315         if (bp->phy_flags & BNX2_PHY_FLAG_DIS_EARLY_DAC) {
2316                 bnx2_write_phy(bp, MII_BNX2_DSP_ADDRESS,
2317                                MII_BNX2_DSP_EXPAND_REG | 0x8);
2318                 bnx2_read_phy(bp, MII_BNX2_DSP_RW_PORT, &val);
2319                 val &= ~(1 << 8);
2320                 bnx2_write_phy(bp, MII_BNX2_DSP_RW_PORT, val);
2321         }
2322 
2323         if (bp->dev->mtu > 1500) {
2324                 /* Set extended packet length bit */
2325                 bnx2_write_phy(bp, 0x18, 0x7);
2326                 bnx2_read_phy(bp, 0x18, &val);
2327                 bnx2_write_phy(bp, 0x18, val | 0x4000);
2328 
2329                 bnx2_read_phy(bp, 0x10, &val);
2330                 bnx2_write_phy(bp, 0x10, val | 0x1);
2331         }
2332         else {
2333                 bnx2_write_phy(bp, 0x18, 0x7);
2334                 bnx2_read_phy(bp, 0x18, &val);
2335                 bnx2_write_phy(bp, 0x18, val & ~0x4007);
2336 
2337                 bnx2_read_phy(bp, 0x10, &val);
2338                 bnx2_write_phy(bp, 0x10, val & ~0x1);
2339         }
2340 
2341         /* ethernet@wirespeed */
2342         bnx2_write_phy(bp, 0x18, 0x7007);
2343         bnx2_read_phy(bp, 0x18, &val);
2344         bnx2_write_phy(bp, 0x18, val | (1 << 15) | (1 << 4));
2345         return 0;
2346 }
2347 
2348 
2349 static int
2350 bnx2_init_phy(struct bnx2 *bp, int reset_phy)
2351 __releases(&bp->phy_lock)
2352 __acquires(&bp->phy_lock)
2353 {
2354         u32 val;
2355         int rc = 0;
2356 
2357         bp->phy_flags &= ~BNX2_PHY_FLAG_INT_MODE_MASK;
2358         bp->phy_flags |= BNX2_PHY_FLAG_INT_MODE_LINK_READY;
2359 
2360         bp->mii_bmcr = MII_BMCR;
2361         bp->mii_bmsr = MII_BMSR;
2362         bp->mii_bmsr1 = MII_BMSR;
2363         bp->mii_adv = MII_ADVERTISE;
2364         bp->mii_lpa = MII_LPA;
2365 
2366         REG_WR(bp, BNX2_EMAC_ATTENTION_ENA, BNX2_EMAC_ATTENTION_ENA_LINK);
2367 
2368         if (bp->phy_flags & BNX2_PHY_FLAG_REMOTE_PHY_CAP)
2369                 goto setup_phy;
2370 
2371         bnx2_read_phy(bp, MII_PHYSID1, &val);
2372         bp->phy_id = val << 16;
2373         bnx2_read_phy(bp, MII_PHYSID2, &val);
2374         bp->phy_id |= val & 0xffff;
2375 
2376         if (bp->phy_flags & BNX2_PHY_FLAG_SERDES) {
2377                 if (CHIP_NUM(bp) == CHIP_NUM_5706)
2378                         rc = bnx2_init_5706s_phy(bp, reset_phy);
2379                 else if (CHIP_NUM(bp) == CHIP_NUM_5708)
2380                         rc = bnx2_init_5708s_phy(bp, reset_phy);
2381                 else if (CHIP_NUM(bp) == CHIP_NUM_5709)
2382                         rc = bnx2_init_5709s_phy(bp, reset_phy);
2383         }
2384         else {
2385                 rc = bnx2_init_copper_phy(bp, reset_phy);
2386         }
2387 
2388 setup_phy:
2389         if (!rc)
2390                 rc = bnx2_setup_phy(bp, bp->phy_port);
2391 
2392         return rc;
2393 }
2394 
2395 static int
2396 bnx2_set_mac_loopback(struct bnx2 *bp)
2397 {
2398         u32 mac_mode;
2399 
2400         mac_mode = REG_RD(bp, BNX2_EMAC_MODE);
2401         mac_mode &= ~BNX2_EMAC_MODE_PORT;
2402         mac_mode |= BNX2_EMAC_MODE_MAC_LOOP | BNX2_EMAC_MODE_FORCE_LINK;
2403         REG_WR(bp, BNX2_EMAC_MODE, mac_mode);
2404         bp->link_up = 1;
2405         return 0;
2406 }
2407 
2408 static int bnx2_test_link(struct bnx2 *);
2409 
2410 static int
2411 bnx2_set_phy_loopback(struct bnx2 *bp)
2412 {
2413         u32 mac_mode;
2414         int rc, i;
2415 
2416         spin_lock_bh(&bp->phy_lock);
2417         rc = bnx2_write_phy(bp, bp->mii_bmcr, BMCR_LOOPBACK | BMCR_FULLDPLX |
2418                             BMCR_SPEED1000);
2419         spin_unlock_bh(&bp->phy_lock);
2420         if (rc)
2421                 return rc;
2422 
2423         for (i = 0; i < 10; i++) {
2424                 if (bnx2_test_link(bp) == 0)
2425                         break;
2426                 msleep(100);
2427         }
2428 
2429         mac_mode = REG_RD(bp, BNX2_EMAC_MODE);
2430         mac_mode &= ~(BNX2_EMAC_MODE_PORT | BNX2_EMAC_MODE_HALF_DUPLEX |
2431                       BNX2_EMAC_MODE_MAC_LOOP | BNX2_EMAC_MODE_FORCE_LINK |
2432                       BNX2_EMAC_MODE_25G_MODE);
2433 
2434         mac_mode |= BNX2_EMAC_MODE_PORT_GMII;
2435         REG_WR(bp, BNX2_EMAC_MODE, mac_mode);
2436         bp->link_up = 1;
2437         return 0;
2438 }
2439 
2440 static int
2441 bnx2_fw_sync(struct bnx2 *bp, u32 msg_data, int ack, int silent)
2442 {
2443         int i;
2444         u32 val;
2445 
2446         bp->fw_wr_seq++;
2447         msg_data |= bp->fw_wr_seq;
2448 
2449         bnx2_shmem_wr(bp, BNX2_DRV_MB, msg_data);
2450 
2451         if (!ack)
2452                 return 0;
2453 
2454         /* wait for an acknowledgement. */
2455         for (i = 0; i < (BNX2_FW_ACK_TIME_OUT_MS / 10); i++) {
2456                 msleep(10);
2457 
2458                 val = bnx2_shmem_rd(bp, BNX2_FW_MB);
2459 
2460                 if ((val & BNX2_FW_MSG_ACK) == (msg_data & BNX2_DRV_MSG_SEQ))
2461                         break;
2462         }
2463         if ((msg_data & BNX2_DRV_MSG_DATA) == BNX2_DRV_MSG_DATA_WAIT0)
2464                 return 0;
2465 
2466         /* If we timed out, inform the firmware that this is the case. */
2467         if ((val & BNX2_FW_MSG_ACK) != (msg_data & BNX2_DRV_MSG_SEQ)) {
2468                 if (!silent)
2469                         printk(KERN_ERR PFX "fw sync timeout, reset code = "
2470                                             "%x\n", msg_data);
2471 
2472                 msg_data &= ~BNX2_DRV_MSG_CODE;
2473                 msg_data |= BNX2_DRV_MSG_CODE_FW_TIMEOUT;
2474 
2475                 bnx2_shmem_wr(bp, BNX2_DRV_MB, msg_data);
2476 
2477                 return -EBUSY;
2478         }
2479 
2480         if ((val & BNX2_FW_MSG_STATUS_MASK) != BNX2_FW_MSG_STATUS_OK)
2481                 return -EIO;
2482 
2483         return 0;
2484 }
2485 
2486 static int
2487 bnx2_init_5709_context(struct bnx2 *bp)
2488 {
2489         int i, ret = 0;
2490         u32 val;
2491 
2492         val = BNX2_CTX_COMMAND_ENABLED | BNX2_CTX_COMMAND_MEM_INIT | (1 << 12);
2493         val |= (BCM_PAGE_BITS - 8) << 16;
2494         REG_WR(bp, BNX2_CTX_COMMAND, val);
2495         for (i = 0; i < 10; i++) {
2496                 val = REG_RD(bp, BNX2_CTX_COMMAND);
2497                 if (!(val & BNX2_CTX_COMMAND_MEM_INIT))
2498                         break;
2499                 udelay(2);
2500         }
2501         if (val & BNX2_CTX_COMMAND_MEM_INIT)
2502                 return -EBUSY;
2503 
2504         for (i = 0; i < bp->ctx_pages; i++) {
2505                 int j;
2506 
2507                 if (bp->ctx_blk[i])
2508                         memset(bp->ctx_blk[i], 0, BCM_PAGE_SIZE);
2509                 else
2510                         return -ENOMEM;
2511 
2512                 REG_WR(bp, BNX2_CTX_HOST_PAGE_TBL_DATA0,
2513                        (bp->ctx_blk_mapping[i] & 0xffffffff) |
2514                        BNX2_CTX_HOST_PAGE_TBL_DATA0_VALID);
2515                 REG_WR(bp, BNX2_CTX_HOST_PAGE_TBL_DATA1,
2516                        (u64) bp->ctx_blk_mapping[i] >> 32);
2517                 REG_WR(bp, BNX2_CTX_HOST_PAGE_TBL_CTRL, i |
2518                        BNX2_CTX_HOST_PAGE_TBL_CTRL_WRITE_REQ);
2519                 for (j = 0; j < 10; j++) {
2520 
2521                         val = REG_RD(bp, BNX2_CTX_HOST_PAGE_TBL_CTRL);
2522                         if (!(val & BNX2_CTX_HOST_PAGE_TBL_CTRL_WRITE_REQ))
2523                                 break;
2524                         udelay(5);
2525                 }
2526                 if (val & BNX2_CTX_HOST_PAGE_TBL_CTRL_WRITE_REQ) {
2527                         ret = -EBUSY;
2528                         break;
2529                 }
2530         }
2531         return ret;
2532 }
2533 
2534 static void
2535 bnx2_init_context(struct bnx2 *bp)
2536 {
2537         u32 vcid;
2538 
2539         vcid = 96;
2540         while (vcid) {
2541                 u32 vcid_addr, pcid_addr, offset;
2542                 int i;
2543 
2544                 vcid--;
2545 
2546                 if (CHIP_ID(bp) == CHIP_ID_5706_A0) {
2547                         u32 new_vcid;
2548 
2549                         vcid_addr = GET_PCID_ADDR(vcid);
2550                         if (vcid & 0x8) {
2551                                 new_vcid = 0x60 + (vcid & 0xf0) + (vcid & 0x7);
2552                         }
2553                         else {
2554                                 new_vcid = vcid;
2555                         }
2556                         pcid_addr = GET_PCID_ADDR(new_vcid);
2557                 }
2558                 else {
2559                         vcid_addr = GET_CID_ADDR(vcid);
2560                         pcid_addr = vcid_addr;
2561                 }
2562 
2563                 for (i = 0; i < (CTX_SIZE / PHY_CTX_SIZE); i++) {
2564                         vcid_addr += (i << PHY_CTX_SHIFT);
2565                         pcid_addr += (i << PHY_CTX_SHIFT);
2566 
2567                         REG_WR(bp, BNX2_CTX_VIRT_ADDR, vcid_addr);
2568                         REG_WR(bp, BNX2_CTX_PAGE_TBL, pcid_addr);
2569 
2570                         /* Zero out the context. */
2571                         for (offset = 0; offset < PHY_CTX_SIZE; offset += 4)
2572                                 bnx2_ctx_wr(bp, vcid_addr, offset, 0);
2573                 }
2574         }
2575 }
2576 
2577 static int
2578 bnx2_alloc_bad_rbuf(struct bnx2 *bp)
2579 {
2580         u16 *good_mbuf;
2581         u32 good_mbuf_cnt;
2582         u32 val;
2583 
2584         good_mbuf = kmalloc(512 * sizeof(u16), GFP_KERNEL);
2585         if (good_mbuf == NULL) {
2586                 printk(KERN_ERR PFX "Failed to allocate memory in "
2587                                     "bnx2_alloc_bad_rbuf\n");
2588                 return -ENOMEM;
2589         }
2590 
2591         REG_WR(bp, BNX2_MISC_ENABLE_SET_BITS,
2592                 BNX2_MISC_ENABLE_SET_BITS_RX_MBUF_ENABLE);
2593 
2594         good_mbuf_cnt = 0;
2595 
2596         /* Allocate a bunch of mbufs and save the good ones in an array. */
2597         val = bnx2_reg_rd_ind(bp, BNX2_RBUF_STATUS1);
2598         while (val & BNX2_RBUF_STATUS1_FREE_COUNT) {
2599                 bnx2_reg_wr_ind(bp, BNX2_RBUF_COMMAND,
2600                                 BNX2_RBUF_COMMAND_ALLOC_REQ);
2601 
2602                 val = bnx2_reg_rd_ind(bp, BNX2_RBUF_FW_BUF_ALLOC);
2603 
2604                 val &= BNX2_RBUF_FW_BUF_ALLOC_VALUE;
2605 
2606                 /* The addresses with Bit 9 set are bad memory blocks. */
2607                 if (!(val & (1 << 9))) {
2608                         good_mbuf[good_mbuf_cnt] = (u16) val;
2609                         good_mbuf_cnt++;
2610                 }
2611 
2612                 val = bnx2_reg_rd_ind(bp, BNX2_RBUF_STATUS1);
2613         }
2614 
2615         /* Free the good ones back to the mbuf pool thus discarding
2616          * all the bad ones. */
2617         while (good_mbuf_cnt) {
2618                 good_mbuf_cnt--;
2619 
2620                 val = good_mbuf[good_mbuf_cnt];
2621                 val = (val << 9) | val | 1;
2622 
2623                 bnx2_reg_wr_ind(bp, BNX2_RBUF_FW_BUF_FREE, val);
2624         }
2625         kfree(good_mbuf);
2626         return 0;
2627 }
2628 
2629 static void
2630 bnx2_set_mac_addr(struct bnx2 *bp, u8 *mac_addr, u32 pos)
2631 {
2632         u32 val;
2633 
2634         val = (mac_addr[0] << 8) | mac_addr[1];
2635 
2636         REG_WR(bp, BNX2_EMAC_MAC_MATCH0 + (pos * 8), val);
2637 
2638         val = (mac_addr[2] << 24) | (mac_addr[3] << 16) |
2639                 (mac_addr[4] << 8) | mac_addr[5];
2640 
2641         REG_WR(bp, BNX2_EMAC_MAC_MATCH1 + (pos * 8), val);
2642 }
2643 
2644 static inline int
2645 bnx2_alloc_rx_page(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, u16 index)
2646 {
2647         dma_addr_t mapping;
2648         struct sw_pg *rx_pg = &rxr->rx_pg_ring[index];
2649         struct rx_bd *rxbd =
2650                 &rxr->rx_pg_desc_ring[RX_RING(index)][RX_IDX(index)];
2651         struct page *page = alloc_page(GFP_ATOMIC);
2652 
2653         if (!page)
2654                 return -ENOMEM;
2655         mapping = pci_map_page(bp->pdev, page, 0, PAGE_SIZE,
2656                                PCI_DMA_FROMDEVICE);
2657         if (pci_dma_mapping_error(bp->pdev, mapping)) {
2658                 __free_page(page);
2659                 return -EIO;
2660         }
2661 
2662         rx_pg->page = page;
2663         pci_unmap_addr_set(rx_pg, mapping, mapping);
2664         rxbd->rx_bd_haddr_hi = (u64) mapping >> 32;
2665         rxbd->rx_bd_haddr_lo = (u64) mapping & 0xffffffff;
2666         return 0;
2667 }
2668 
2669 static void
2670 bnx2_free_rx_page(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, u16 index)
2671 {
2672         struct sw_pg *rx_pg = &rxr->rx_pg_ring[index];
2673         struct page *page = rx_pg->page;
2674 
2675         if (!page)
2676                 return;
2677 
2678         pci_unmap_page(bp->pdev, pci_unmap_addr(rx_pg, mapping), PAGE_SIZE,
2679                        PCI_DMA_FROMDEVICE);
2680 
2681         __free_page(page);
2682         rx_pg->page = NULL;
2683 }
2684 
2685 static inline int
2686 bnx2_alloc_rx_skb(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, u16 index)
2687 {
2688         struct sk_buff *skb;
2689         struct sw_bd *rx_buf = &rxr->rx_buf_ring[index];
2690         dma_addr_t mapping;
2691         struct rx_bd *rxbd = &rxr->rx_desc_ring[RX_RING(index)][RX_IDX(index)];
2692         unsigned long align;
2693 
2694         skb = netdev_alloc_skb(bp->dev, bp->rx_buf_size);
2695         if (skb == NULL) {
2696                 return -ENOMEM;
2697         }
2698 
2699         if (unlikely((align = (unsigned long) skb->data & (BNX2_RX_ALIGN - 1))))
2700                 skb_reserve(skb, BNX2_RX_ALIGN - align);
2701 
2702         mapping = pci_map_single(bp->pdev, skb->data, bp->rx_buf_use_size,
2703                 PCI_DMA_FROMDEVICE);
2704         if (pci_dma_mapping_error(bp->pdev, mapping)) {
2705                 dev_kfree_skb(skb);
2706                 return -EIO;
2707         }
2708 
2709         rx_buf->skb = skb;
2710         pci_unmap_addr_set(rx_buf, mapping, mapping);
2711 
2712         rxbd->rx_bd_haddr_hi = (u64) mapping >> 32;
2713         rxbd->rx_bd_haddr_lo = (u64) mapping & 0xffffffff;
2714 
2715         rxr->rx_prod_bseq += bp->rx_buf_use_size;
2716 
2717         return 0;
2718 }
2719 
2720 static int
2721 bnx2_phy_event_is_set(struct bnx2 *bp, struct bnx2_napi *bnapi, u32 event)
2722 {
2723         struct status_block *sblk = bnapi->status_blk.msi;
2724         u32 new_link_state, old_link_state;
2725         int is_set = 1;
2726 
2727         new_link_state = sblk->status_attn_bits & event;
2728         old_link_state = sblk->status_attn_bits_ack & event;
2729         if (new_link_state != old_link_state) {
2730                 if (new_link_state)
2731                         REG_WR(bp, BNX2_PCICFG_STATUS_BIT_SET_CMD, event);
2732                 else
2733                         REG_WR(bp, BNX2_PCICFG_STATUS_BIT_CLEAR_CMD, event);
2734         } else
2735                 is_set = 0;
2736 
2737         return is_set;
2738 }
2739 
2740 static void
2741 bnx2_phy_int(struct bnx2 *bp, struct bnx2_napi *bnapi)
2742 {
2743         spin_lock(&bp->phy_lock);
2744 
2745         if (bnx2_phy_event_is_set(bp, bnapi, STATUS_ATTN_BITS_LINK_STATE))
2746                 bnx2_set_link(bp);
2747         if (bnx2_phy_event_is_set(bp, bnapi, STATUS_ATTN_BITS_TIMER_ABORT))
2748                 bnx2_set_remote_link(bp);
2749 
2750         spin_unlock(&bp->phy_lock);
2751 
2752 }
2753 
2754 static inline u16
2755 bnx2_get_hw_tx_cons(struct bnx2_napi *bnapi)
2756 {
2757         u16 cons;
2758 
2759         /* Tell compiler that status block fields can change. */
2760         barrier();
2761         cons = *bnapi->hw_tx_cons_ptr;
2762         barrier();
2763         if (unlikely((cons & MAX_TX_DESC_CNT) == MAX_TX_DESC_CNT))
2764                 cons++;
2765         return cons;
2766 }
2767 
2768 static int
2769 bnx2_tx_int(struct bnx2 *bp, struct bnx2_napi *bnapi, int budget)
2770 {
2771         struct bnx2_tx_ring_info *txr = &bnapi->tx_ring;
2772         u16 hw_cons, sw_cons, sw_ring_cons;
2773         int tx_pkt = 0, index;
2774         struct netdev_queue *txq;
2775 
2776         index = (bnapi - bp->bnx2_napi);
2777         txq = netdev_get_tx_queue(bp->dev, index);
2778 
2779         hw_cons = bnx2_get_hw_tx_cons(bnapi);
2780         sw_cons = txr->tx_cons;
2781 
2782         while (sw_cons != hw_cons) {
2783                 struct sw_tx_bd *tx_buf;
2784                 struct sk_buff *skb;
2785                 int i, last;
2786 
2787                 sw_ring_cons = TX_RING_IDX(sw_cons);
2788 
2789                 tx_buf = &txr->tx_buf_ring[sw_ring_cons];
2790                 skb = tx_buf->skb;
2791 
2792                 /* prefetch skb_end_pointer() to speedup skb_shinfo(skb) */
2793                 prefetch(&skb->end);
2794 
2795                 /* partial BD completions possible with TSO packets */
2796                 if (tx_buf->is_gso) {
2797                         u16 last_idx, last_ring_idx;
2798 
2799                         last_idx = sw_cons + tx_buf->nr_frags + 1;
2800                         last_ring_idx = sw_ring_cons + tx_buf->nr_frags + 1;
2801                         if (unlikely(last_ring_idx >= MAX_TX_DESC_CNT)) {
2802                                 last_idx++;
2803                         }
2804                         if (((s16) ((s16) last_idx - (s16) hw_cons)) > 0) {
2805                                 break;
2806                         }
2807                 }
2808 
2809                 skb_dma_unmap(&bp->pdev->dev, skb, DMA_TO_DEVICE);
2810 
2811                 tx_buf->skb = NULL;
2812                 last = tx_buf->nr_frags;
2813 
2814                 for (i = 0; i < last; i++) {
2815                         sw_cons = NEXT_TX_BD(sw_cons);
2816                 }
2817 
2818                 sw_cons = NEXT_TX_BD(sw_cons);
2819 
2820                 dev_kfree_skb(skb);
2821                 tx_pkt++;
2822                 if (tx_pkt == budget)
2823                         break;
2824 
2825                 if (hw_cons == sw_cons)
2826                         hw_cons = bnx2_get_hw_tx_cons(bnapi);
2827         }
2828 
2829         txr->hw_tx_cons = hw_cons;
2830         txr->tx_cons = sw_cons;
2831 
2832         /* Need to make the tx_cons update visible to bnx2_start_xmit()
2833          * before checking for netif_tx_queue_stopped().  Without the
2834          * memory barrier, there is a small possibility that bnx2_start_xmit()
2835          * will miss it and cause the queue to be stopped forever.
2836          */
2837         smp_mb();
2838 
2839         if (unlikely(netif_tx_queue_stopped(txq)) &&
2840                      (bnx2_tx_avail(bp, txr) > bp->tx_wake_thresh)) {
2841                 __netif_tx_lock(txq, smp_processor_id());
2842                 if ((netif_tx_queue_stopped(txq)) &&
2843                     (bnx2_tx_avail(bp, txr) > bp->tx_wake_thresh))
2844                         netif_tx_wake_queue(txq);
2845                 __netif_tx_unlock(txq);
2846         }
2847 
2848         return tx_pkt;
2849 }
2850 
2851 static void
2852 bnx2_reuse_rx_skb_pages(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr,
2853                         struct sk_buff *skb, int count)
2854 {
2855         struct sw_pg *cons_rx_pg, *prod_rx_pg;
2856         struct rx_bd *cons_bd, *prod_bd;
2857         int i;
2858         u16 hw_prod, prod;
2859         u16 cons = rxr->rx_pg_cons;
2860 
2861         cons_rx_pg = &rxr->rx_pg_ring[cons];
2862 
2863         /* The caller was unable to allocate a new page to replace the
2864          * last one in the frags array, so we need to recycle that page
2865          * and then free the skb.
2866          */
2867         if (skb) {
2868                 struct page *page;
2869                 struct skb_shared_info *shinfo;
2870 
2871                 shinfo = skb_shinfo(skb);
2872                 shinfo->nr_frags--;
2873                 page = shinfo->frags[shinfo->nr_frags].page;
2874                 shinfo->frags[shinfo->nr_frags].page = NULL;
2875 
2876                 cons_rx_pg->page = page;
2877                 dev_kfree_skb(skb);
2878         }
2879 
2880         hw_prod = rxr->rx_pg_prod;
2881 
2882         for (i = 0; i < count; i++) {
2883                 prod = RX_PG_RING_IDX(hw_prod);
2884 
2885                 prod_rx_pg = &rxr->rx_pg_ring[prod];
2886                 cons_rx_pg = &rxr->rx_pg_ring[cons];
2887                 cons_bd = &rxr->rx_pg_desc_ring[RX_RING(cons)][RX_IDX(cons)];
2888                 prod_bd = &rxr->rx_pg_desc_ring[RX_RING(prod)][RX_IDX(prod)];
2889 
2890                 if (prod != cons) {
2891                         prod_rx_pg->page = cons_rx_pg->page;
2892                         cons_rx_pg->page = NULL;
2893                         pci_unmap_addr_set(prod_rx_pg, mapping,
2894                                 pci_unmap_addr(cons_rx_pg, mapping));
2895 
2896                         prod_bd->rx_bd_haddr_hi = cons_bd->rx_bd_haddr_hi;
2897                         prod_bd->rx_bd_haddr_lo = cons_bd->rx_bd_haddr_lo;
2898 
2899                 }
2900                 cons = RX_PG_RING_IDX(NEXT_RX_BD(cons));
2901                 hw_prod = NEXT_RX_BD(hw_prod);
2902         }
2903         rxr->rx_pg_prod = hw_prod;
2904         rxr->rx_pg_cons = cons;
2905 }
2906 
2907 static inline void
2908 bnx2_reuse_rx_skb(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr,
2909                   struct sk_buff *skb, u16 cons, u16 prod)
2910 {
2911         struct sw_bd *cons_rx_buf, *prod_rx_buf;
2912         struct rx_bd *cons_bd, *prod_bd;
2913 
2914         cons_rx_buf = &rxr->rx_buf_ring[cons];
2915         prod_rx_buf = &rxr->rx_buf_ring[prod];
2916 
2917         pci_dma_sync_single_for_device(bp->pdev,
2918                 pci_unmap_addr(cons_rx_buf, mapping),
2919                 BNX2_RX_OFFSET + BNX2_RX_COPY_THRESH, PCI_DMA_FROMDEVICE);
2920 
2921         rxr->rx_prod_bseq += bp->rx_buf_use_size;
2922 
2923         prod_rx_buf->skb = skb;
2924 
2925         if (cons == prod)
2926                 return;
2927 
2928         pci_unmap_addr_set(prod_rx_buf, mapping,
2929                         pci_unmap_addr(cons_rx_buf, mapping));
2930 
2931         cons_bd = &rxr->rx_desc_ring[RX_RING(cons)][RX_IDX(cons)];
2932         prod_bd = &rxr->rx_desc_ring[RX_RING(prod)][RX_IDX(prod)];
2933         prod_bd->rx_bd_haddr_hi = cons_bd->rx_bd_haddr_hi;
2934         prod_bd->rx_bd_haddr_lo = cons_bd->rx_bd_haddr_lo;
2935 }
2936 
2937 static int
2938 bnx2_rx_skb(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, struct sk_buff *skb,
2939             unsigned int len, unsigned int hdr_len, dma_addr_t dma_addr,
2940             u32 ring_idx)
2941 {
2942         int err;
2943         u16 prod = ring_idx & 0xffff;
2944 
2945         err = bnx2_alloc_rx_skb(bp, rxr, prod);
2946         if (unlikely(err)) {
2947                 bnx2_reuse_rx_skb(bp, rxr, skb, (u16) (ring_idx >> 16), prod);
2948                 if (hdr_len) {
2949                         unsigned int raw_len = len + 4;
2950                         int pages = PAGE_ALIGN(raw_len - hdr_len) >> PAGE_SHIFT;
2951 
2952                         bnx2_reuse_rx_skb_pages(bp, rxr, NULL, pages);
2953                 }
2954                 return err;
2955         }
2956 
2957         skb_reserve(skb, BNX2_RX_OFFSET);
2958         pci_unmap_single(bp->pdev, dma_addr, bp->rx_buf_use_size,
2959                          PCI_DMA_FROMDEVICE);
2960 
2961         if (hdr_len == 0) {
2962                 skb_put(skb, len);
2963                 return 0;
2964         } else {
2965                 unsigned int i, frag_len, frag_size, pages;
2966                 struct sw_pg *rx_pg;
2967                 u16 pg_cons = rxr->rx_pg_cons;
2968                 u16 pg_prod = rxr->rx_pg_prod;
2969 
2970                 frag_size = len + 4 - hdr_len;
2971                 pages = PAGE_ALIGN(frag_size) >> PAGE_SHIFT;
2972                 skb_put(skb, hdr_len);
2973 
2974                 for (i = 0; i < pages; i++) {
2975                         dma_addr_t mapping_old;
2976 
2977                         frag_len = min(frag_size, (unsigned int) PAGE_SIZE);
2978                         if (unlikely(frag_len <= 4)) {
2979                                 unsigned int tail = 4 - frag_len;
2980 
2981                                 rxr->rx_pg_cons = pg_cons;
2982                                 rxr->rx_pg_prod = pg_prod;
2983                                 bnx2_reuse_rx_skb_pages(bp, rxr, NULL,
2984                                                         pages - i);
2985                                 skb->len -= tail;
2986                                 if (i == 0) {
2987                                         skb->tail -= tail;
2988                                 } else {
2989                                         skb_frag_t *frag =
2990                                                 &skb_shinfo(skb)->frags[i - 1];
2991                                         frag->size -= tail;
2992                                         skb->data_len -= tail;
2993                                         skb->truesize -= tail;
2994                                 }
2995                                 return 0;
2996                         }
2997                         rx_pg = &rxr->rx_pg_ring[pg_cons];
2998 
2999                         /* Don't unmap yet.  If we're unable to allocate a new
3000                          * page, we need to recycle the page and the DMA addr.
3001                          */
3002                         mapping_old = pci_unmap_addr(rx_pg, mapping);
3003                         if (i == pages - 1)
3004                                 frag_len -= 4;
3005 
3006                         skb_fill_page_desc(skb, i, rx_pg->page, 0, frag_len);
3007                         rx_pg->page = NULL;
3008 
3009                         err = bnx2_alloc_rx_page(bp, rxr,
3010                                                  RX_PG_RING_IDX(pg_prod));
3011                         if (unlikely(err)) {
3012                                 rxr->rx_pg_cons = pg_cons;
3013                                 rxr->rx_pg_prod = pg_prod;
3014                                 bnx2_reuse_rx_skb_pages(bp, rxr, skb,
3015                                                         pages - i);
3016                                 return err;
3017                         }
3018 
3019                         pci_unmap_page(bp->pdev, mapping_old,
3020                                        PAGE_SIZE, PCI_DMA_FROMDEVICE);
3021 
3022                         frag_size -= frag_len;
3023                         skb->data_len += frag_len;
3024                         skb->truesize += frag_len;
3025                         skb->len += frag_len;
3026 
3027                         pg_prod = NEXT_RX_BD(pg_prod);
3028                         pg_cons = RX_PG_RING_IDX(NEXT_RX_BD(pg_cons));
3029                 }
3030                 rxr->rx_pg_prod = pg_prod;
3031                 rxr->rx_pg_cons = pg_cons;
3032         }
3033         return 0;
3034 }
3035 
3036 static inline u16
3037 bnx2_get_hw_rx_cons(struct bnx2_napi *bnapi)
3038 {
3039         u16 cons;
3040 
3041         /* Tell compiler that status block fields can change. */
3042         barrier();
3043         cons = *bnapi->hw_rx_cons_ptr;
3044         barrier();
3045         if (unlikely((cons & MAX_RX_DESC_CNT) == MAX_RX_DESC_CNT))
3046                 cons++;
3047         return cons;
3048 }
3049 
3050 static int
3051 bnx2_rx_int(struct bnx2 *bp, struct bnx2_napi *bnapi, int budget)
3052 {
3053         struct bnx2_rx_ring_info *rxr = &bnapi->rx_ring;
3054         u16 hw_cons, sw_cons, sw_ring_cons, sw_prod, sw_ring_prod;
3055         struct l2_fhdr *rx_hdr;
3056         int rx_pkt = 0, pg_ring_used = 0;
3057 
3058         hw_cons = bnx2_get_hw_rx_cons(bnapi);
3059         sw_cons = rxr->rx_cons;
3060         sw_prod = rxr->rx_prod;
3061 
3062         /* Memory barrier necessary as speculative reads of the rx
3063          * buffer can be ahead of the index in the status block
3064          */
3065         rmb();
3066         while (sw_cons != hw_cons) {
3067                 unsigned int len, hdr_len;
3068                 u32 status;
3069                 struct sw_bd *rx_buf;
3070                 struct sk_buff *skb;
3071                 dma_addr_t dma_addr;
3072                 u16 vtag = 0;
3073                 int hw_vlan __maybe_unused = 0;
3074 
3075                 sw_ring_cons = RX_RING_IDX(sw_cons);
3076                 sw_ring_prod = RX_RING_IDX(sw_prod);
3077 
3078                 rx_buf = &rxr->rx_buf_ring[sw_ring_cons];
3079                 skb = rx_buf->skb;
3080 
3081                 rx_buf->skb = NULL;
3082 
3083                 dma_addr = pci_unmap_addr(rx_buf, mapping);
3084 
3085                 pci_dma_sync_single_for_cpu(bp->pdev, dma_addr,
3086                         BNX2_RX_OFFSET + BNX2_RX_COPY_THRESH,
3087                         PCI_DMA_FROMDEVICE);
3088 
3089                 rx_hdr = (struct l2_fhdr *) skb->data;
3090                 len = rx_hdr->l2_fhdr_pkt_len;
3091                 status = rx_hdr->l2_fhdr_status;
3092 
3093                 hdr_len = 0;
3094                 if (status & L2_FHDR_STATUS_SPLIT) {
3095                         hdr_len = rx_hdr->l2_fhdr_ip_xsum;
3096                         pg_ring_used = 1;
3097                 } else if (len > bp->rx_jumbo_thresh) {
3098                         hdr_len = bp->rx_jumbo_thresh;
3099                         pg_ring_used = 1;
3100                 }
3101 
3102                 if (unlikely(status & (L2_FHDR_ERRORS_BAD_CRC |
3103                                        L2_FHDR_ERRORS_PHY_DECODE |
3104                                        L2_FHDR_ERRORS_ALIGNMENT |
3105                                        L2_FHDR_ERRORS_TOO_SHORT |
3106                                        L2_FHDR_ERRORS_GIANT_FRAME))) {
3107 
3108                         bnx2_reuse_rx_skb(bp, rxr, skb, sw_ring_cons,
3109                                           sw_ring_prod);
3110                         if (pg_ring_used) {
3111                                 int pages;
3112 
3113                                 pages = PAGE_ALIGN(len - hdr_len) >> PAGE_SHIFT;
3114 
3115                                 bnx2_reuse_rx_skb_pages(bp, rxr, NULL, pages);
3116                         }
3117                         goto next_rx;
3118                 }
3119 
3120                 len -= 4;
3121 
3122                 if (len <= bp->rx_copy_thresh) {
3123                         struct sk_buff *new_skb;
3124 
3125                         new_skb = netdev_alloc_skb(bp->dev, len + 6);
3126                         if (new_skb == NULL) {
3127                                 bnx2_reuse_rx_skb(bp, rxr, skb, sw_ring_cons,
3128                                                   sw_ring_prod);
3129                                 goto next_rx;
3130                         }
3131 
3132                         /* aligned copy */
3133                         skb_copy_from_linear_data_offset(skb,
3134                                                          BNX2_RX_OFFSET - 6,
3135                                       new_skb->data, len + 6);
3136                         skb_reserve(new_skb, 6);
3137                         skb_put(new_skb, len);
3138 
3139                         bnx2_reuse_rx_skb(bp, rxr, skb,
3140                                 sw_ring_cons, sw_ring_prod);
3141 
3142                         skb = new_skb;
3143                 } else if (unlikely(bnx2_rx_skb(bp, rxr, skb, len, hdr_len,
3144                            dma_addr, (sw_ring_cons << 16) | sw_ring_prod)))
3145                         goto next_rx;
3146 
3147                 if ((status & L2_FHDR_STATUS_L2_VLAN_TAG) &&
3148                     !(bp->rx_mode & BNX2_EMAC_RX_MODE_KEEP_VLAN_TAG)) {
3149                         vtag = rx_hdr->l2_fhdr_vlan_tag;
3150 #ifdef BCM_VLAN
3151                         if (bp->vlgrp)
3152                                 hw_vlan = 1;
3153                         else
3154 #endif
3155                         {
3156                                 struct vlan_ethhdr *ve = (struct vlan_ethhdr *)
3157                                         __skb_push(skb, 4);
3158 
3159                                 memmove(ve, skb->data + 4, ETH_ALEN * 2);
3160                                 ve->h_vlan_proto = htons(ETH_P_8021Q);
3161                                 ve->h_vlan_TCI = htons(vtag);
3162                                 len += 4;
3163                         }
3164                 }
3165 
3166                 skb->protocol = eth_type_trans(skb, bp->dev);
3167 
3168                 if ((len > (bp->dev->mtu + ETH_HLEN)) &&
3169                         (ntohs(skb->protocol) != 0x8100)) {
3170 
3171                         dev_kfree_skb(skb);
3172                         goto next_rx;
3173 
3174                 }
3175 
3176                 skb->ip_summed = CHECKSUM_NONE;
3177                 if (bp->rx_csum &&
3178                         (status & (L2_FHDR_STATUS_TCP_SEGMENT |
3179                         L2_FHDR_STATUS_UDP_DATAGRAM))) {
3180 
3181                         if (likely((status & (L2_FHDR_ERRORS_TCP_XSUM |
3182                                               L2_FHDR_ERRORS_UDP_XSUM)) == 0))
3183                                 skb->ip_summed = CHECKSUM_UNNECESSARY;
3184                 }
3185 
3186                 skb_record_rx_queue(skb, bnapi - &bp->bnx2_napi[0]);
3187 
3188 #ifdef BCM_VLAN
3189                 if (hw_vlan)
3190                         vlan_hwaccel_receive_skb(skb, bp->vlgrp, vtag);
3191                 else
3192 #endif
3193                         netif_receive_skb(skb);
3194 
3195                 rx_pkt++;
3196 
3197 next_rx:
3198                 sw_cons = NEXT_RX_BD(sw_cons);
3199                 sw_prod = NEXT_RX_BD(sw_prod);
3200 
3201                 if ((rx_pkt == budget))
3202                         break;
3203 
3204                 /* Refresh hw_cons to see if there is new work */
3205                 if (sw_cons == hw_cons) {
3206                         hw_cons = bnx2_get_hw_rx_cons(bnapi);
3207                         rmb();
3208                 }
3209         }
3210         rxr->rx_cons = sw_cons;
3211         rxr->rx_prod = sw_prod;
3212 
3213         if (pg_ring_used)
3214                 REG_WR16(bp, rxr->rx_pg_bidx_addr, rxr->rx_pg_prod);
3215 
3216         REG_WR16(bp, rxr->rx_bidx_addr, sw_prod);
3217 
3218         REG_WR(bp, rxr->rx_bseq_addr, rxr->rx_prod_bseq);
3219 
3220         mmiowb();
3221 
3222         return rx_pkt;
3223 
3224 }
3225 
3226 /* MSI ISR - The only difference between this and the INTx ISR
3227  * is that the MSI interrupt is always serviced.
3228  */
3229 static irqreturn_t
3230 bnx2_msi(int irq, void *dev_instance)
3231 {
3232         struct bnx2_napi *bnapi = dev_instance;
3233         struct bnx2 *bp = bnapi->bp;
3234 
3235         prefetch(bnapi->status_blk.msi);
3236         REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD,
3237                 BNX2_PCICFG_INT_ACK_CMD_USE_INT_HC_PARAM |
3238                 BNX2_PCICFG_INT_ACK_CMD_MASK_INT);
3239 
3240         /* Return here if interrupt is disabled. */
3241         if (unlikely(atomic_read(&bp->intr_sem) != 0))
3242                 return IRQ_HANDLED;
3243 
3244         napi_schedule(&bnapi->napi);
3245 
3246         return IRQ_HANDLED;
3247 }
3248 
3249 static irqreturn_t
3250 bnx2_msi_1shot(int irq, void *dev_instance)
3251 {
3252         struct bnx2_napi *bnapi = dev_instance;
3253         struct bnx2 *bp = bnapi->bp;
3254 
3255         prefetch(bnapi->status_blk.msi);
3256 
3257         /* Return here if interrupt is disabled. */
3258         if (unlikely(atomic_read(&bp->intr_sem) != 0))
3259                 return IRQ_HANDLED;
3260 
3261         napi_schedule(&bnapi->napi);
3262 
3263         return IRQ_HANDLED;
3264 }
3265 
3266 static irqreturn_t
3267 bnx2_interrupt(int irq, void *dev_instance)
3268 {
3269         struct bnx2_napi *bnapi = dev_instance;
3270         struct bnx2 *bp = bnapi->bp;
3271         struct status_block *sblk = bnapi->status_blk.msi;
3272 
3273         /* When using INTx, it is possible for the interrupt to arrive
3274          * at the CPU before the status block posted prior to the
3275          * interrupt. Reading a register will flush the status block.
3276          * When using MSI, the MSI message will always complete after
3277          * the status block write.
3278          */
3279         if ((sblk->status_idx == bnapi->last_status_idx) &&
3280             (REG_RD(bp, BNX2_PCICFG_MISC_STATUS) &
3281              BNX2_PCICFG_MISC_STATUS_INTA_VALUE))
3282                 return IRQ_NONE;
3283 
3284         REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD,
3285                 BNX2_PCICFG_INT_ACK_CMD_USE_INT_HC_PARAM |
3286                 BNX2_PCICFG_INT_ACK_CMD_MASK_INT);
3287 
3288         /* Read back to deassert IRQ immediately to avoid too many
3289          * spurious interrupts.
3290          */
3291         REG_RD(bp, BNX2_PCICFG_INT_ACK_CMD);
3292 
3293         /* Return here if interrupt is shared and is disabled. */
3294         if (unlikely(atomic_read(&bp->intr_sem) != 0))
3295                 return IRQ_HANDLED;
3296 
3297         if (napi_schedule_prep(&bnapi->napi)) {
3298                 bnapi->last_status_idx = sblk->status_idx;
3299                 __napi_schedule(&bnapi->napi);
3300         }
3301 
3302         return IRQ_HANDLED;
3303 }
3304 
3305 static inline int
3306 bnx2_has_fast_work(struct bnx2_napi *bnapi)
3307 {
3308         struct bnx2_tx_ring_info *txr = &bnapi->tx_ring;
3309         struct bnx2_rx_ring_info *rxr = &bnapi->rx_ring;
3310 
3311         if ((bnx2_get_hw_rx_cons(bnapi) != rxr->rx_cons) ||
3312             (bnx2_get_hw_tx_cons(bnapi) != txr->hw_tx_cons))
3313                 return 1;
3314         return 0;
3315 }
3316 
3317 #define STATUS_ATTN_EVENTS      (STATUS_ATTN_BITS_LINK_STATE | \
3318                                  STATUS_ATTN_BITS_TIMER_ABORT)
3319 
3320 static inline int
3321 bnx2_has_work(struct bnx2_napi *bnapi)
3322 {
3323         struct status_block *sblk = bnapi->status_blk.msi;
3324 
3325         if (bnx2_has_fast_work(bnapi))
3326                 return 1;
3327 
3328 #ifdef BCM_CNIC
3329         if (bnapi->cnic_present && (bnapi->cnic_tag != sblk->status_idx))
3330                 return 1;
3331 #endif
3332 
3333         if ((sblk->status_attn_bits & STATUS_ATTN_EVENTS) !=
3334             (sblk->status_attn_bits_ack & STATUS_ATTN_EVENTS))
3335                 return 1;
3336 
3337         return 0;
3338 }
3339 
3340 static void
3341 bnx2_chk_missed_msi(struct bnx2 *bp)
3342 {
3343         struct bnx2_napi *bnapi = &bp->bnx2_napi[0];
3344         u32 msi_ctrl;
3345 
3346         if (bnx2_has_work(bnapi)) {
3347                 msi_ctrl = REG_RD(bp, BNX2_PCICFG_MSI_CONTROL);
3348                 if (!(msi_ctrl & BNX2_PCICFG_MSI_CONTROL_ENABLE))
3349                         return;
3350 
3351                 if (bnapi->last_status_idx == bp->idle_chk_status_idx) {
3352                         REG_WR(bp, BNX2_PCICFG_MSI_CONTROL, msi_ctrl &
3353                                ~BNX2_PCICFG_MSI_CONTROL_ENABLE);
3354                         REG_WR(bp, BNX2_PCICFG_MSI_CONTROL, msi_ctrl);
3355                         bnx2_msi(bp->irq_tbl[0].vector, bnapi);
3356                 }
3357         }
3358 
3359         bp->idle_chk_status_idx = bnapi->last_status_idx;
3360 }
3361 
3362 #ifdef BCM_CNIC
3363 static void bnx2_poll_cnic(struct bnx2 *bp, struct bnx2_napi *bnapi)
3364 {
3365         struct cnic_ops *c_ops;
3366 
3367         if (!bnapi->cnic_present)
3368                 return;
3369 
3370         rcu_read_lock();
3371         c_ops = rcu_dereference(bp->cnic_ops);
3372         if (c_ops)
3373                 bnapi->cnic_tag = c_ops->cnic_handler(bp->cnic_data,
3374                                                       bnapi->status_blk.msi);
3375         rcu_read_unlock();
3376 }
3377 #endif
3378 
3379 static void bnx2_poll_link(struct bnx2 *bp, struct bnx2_napi *bnapi)
3380 {
3381         struct status_block *sblk = bnapi->status_blk.msi;
3382         u32 status_attn_bits = sblk->status_attn_bits;
3383         u32 status_attn_bits_ack = sblk->status_attn_bits_ack;
3384 
3385         if ((status_attn_bits & STATUS_ATTN_EVENTS) !=
3386             (status_attn_bits_ack & STATUS_ATTN_EVENTS)) {
3387 
3388                 bnx2_phy_int(bp, bnapi);
3389 
3390                 /* This is needed to take care of transient status
3391                  * during link changes.
3392                  */
3393                 REG_WR(bp, BNX2_HC_COMMAND,
3394                        bp->hc_cmd | BNX2_HC_COMMAND_COAL_NOW_WO_INT);
3395                 REG_RD(bp, BNX2_HC_COMMAND);
3396         }
3397 }
3398 
3399 static int bnx2_poll_work(struct bnx2 *bp, struct bnx2_napi *bnapi,
3400                           int work_done, int budget)
3401 {
3402         struct bnx2_tx_ring_info *txr = &bnapi->tx_ring;
3403         struct bnx2_rx_ring_info *rxr = &bnapi->rx_ring;
3404 
3405         if (bnx2_get_hw_tx_cons(bnapi) != txr->hw_tx_cons)
3406                 bnx2_tx_int(bp, bnapi, 0);
3407 
3408         if (bnx2_get_hw_rx_cons(bnapi) != rxr->rx_cons)
3409                 work_done += bnx2_rx_int(bp, bnapi, budget - work_done);
3410 
3411         return work_done;
3412 }
3413 
3414 static int bnx2_poll_msix(struct napi_struct *napi, int budget)
3415 {
3416         struct bnx2_napi *bnapi = container_of(napi, struct bnx2_napi, napi);
3417         struct bnx2 *bp = bnapi->bp;
3418         int work_done = 0;
3419         struct status_block_msix *sblk = bnapi->status_blk.msix;
3420 
3421         while (1) {
3422                 work_done = bnx2_poll_work(bp, bnapi, work_done, budget);
3423                 if (unlikely(work_done >= budget))
3424                         break;
3425 
3426                 bnapi->last_status_idx = sblk->status_idx;
3427                 /* status idx must be read before checking for more work. */
3428                 rmb();
3429                 if (likely(!bnx2_has_fast_work(bnapi))) {
3430 
3431                         napi_complete(napi);
3432                         REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD, bnapi->int_num |
3433                                BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID |
3434                                bnapi->last_status_idx);
3435                         break;
3436                 }
3437         }
3438         return work_done;
3439 }
3440 
3441 static int bnx2_poll(struct napi_struct *napi, int budget)
3442 {
3443         struct bnx2_napi *bnapi = container_of(napi, struct bnx2_napi, napi);
3444         struct bnx2 *bp = bnapi->bp;
3445         int work_done = 0;
3446         struct status_block *sblk = bnapi->status_blk.msi;
3447 
3448         while (1) {
3449                 bnx2_poll_link(bp, bnapi);
3450 
3451                 work_done = bnx2_poll_work(bp, bnapi, work_done, budget);
3452 
3453 #ifdef BCM_CNIC
3454                 bnx2_poll_cnic(bp, bnapi);
3455 #endif
3456 
3457                 /* bnapi->last_status_idx is used below to tell the hw how
3458                  * much work has been processed, so we must read it before
3459                  * checking for more work.
3460                  */
3461                 bnapi->last_status_idx = sblk->status_idx;
3462 
3463                 if (unlikely(work_done >= budget))
3464                         break;
3465 
3466                 rmb();
3467                 if (likely(!bnx2_has_work(bnapi))) {
3468                         napi_complete(napi);
3469                         if (likely(bp->flags & BNX2_FLAG_USING_MSI_OR_MSIX)) {
3470                                 REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD,
3471                                        BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID |
3472                                        bnapi->last_status_idx);
3473                                 break;
3474                         }
3475                         REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD,
3476                                BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID |
3477                                BNX2_PCICFG_INT_ACK_CMD_MASK_INT |
3478                                bnapi->last_status_idx);
3479 
3480                         REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD,
3481                                BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID |
3482                                bnapi->last_status_idx);
3483                         break;
3484                 }
3485         }
3486 
3487         return work_done;
3488 }
3489 
3490 /* Called with rtnl_lock from vlan functions and also netif_tx_lock
3491  * from set_multicast.
3492  */
3493 static void
3494 bnx2_set_rx_mode(struct net_device *dev)
3495 {
3496         struct bnx2 *bp = netdev_priv(dev);
3497         u32 rx_mode, sort_mode;
3498         struct netdev_hw_addr *ha;
3499         int i;
3500 
3501         if (!netif_running(dev))
3502                 return;
3503 
3504         spin_lock_bh(&bp->phy_lock);
3505 
3506         rx_mode = bp->rx_mode & ~(BNX2_EMAC_RX_MODE_PROMISCUOUS |
3507                                   BNX2_EMAC_RX_MODE_KEEP_VLAN_TAG);
3508         sort_mode = 1 | BNX2_RPM_SORT_USER0_BC_EN;
3509 #ifdef BCM_VLAN
3510         if (!bp->vlgrp && (bp->flags & BNX2_FLAG_CAN_KEEP_VLAN))
3511                 rx_mode |= BNX2_EMAC_RX_MODE_KEEP_VLAN_TAG;
3512 #else
3513         if (bp->flags & BNX2_FLAG_CAN_KEEP_VLAN)
3514                 rx_mode |= BNX2_EMAC_RX_MODE_KEEP_VLAN_TAG;
3515 #endif
3516         if (dev->flags & IFF_PROMISC) {
3517                 /* Promiscuous mode. */
3518                 rx_mode |= BNX2_EMAC_RX_MODE_PROMISCUOUS;
3519                 sort_mode |= BNX2_RPM_SORT_USER0_PROM_EN |
3520                              BNX2_RPM_SORT_USER0_PROM_VLAN;
3521         }
3522         else if (dev->flags & IFF_ALLMULTI) {
3523                 for (i = 0; i < NUM_MC_HASH_REGISTERS; i++) {
3524                         REG_WR(bp, BNX2_EMAC_MULTICAST_HASH0 + (i * 4),
3525                                0xffffffff);
3526                 }
3527                 sort_mode |= BNX2_RPM_SORT_USER0_MC_EN;
3528         }
3529         else {
3530                 /* Accept one or more multicast(s). */
3531                 struct dev_mc_list *mclist;
3532                 u32 mc_filter[NUM_MC_HASH_REGISTERS];
3533                 u32 regidx;
3534                 u32 bit;
3535                 u32 crc;
3536 
3537                 memset(mc_filter, 0, 4 * NUM_MC_HASH_REGISTERS);
3538 
3539                 for (i = 0, mclist = dev->mc_list; mclist && i < dev->mc_count;
3540                      i++, mclist = mclist->next) {
3541 
3542                         crc = ether_crc_le(ETH_ALEN, mclist->dmi_addr);
3543                         bit = crc & 0xff;
3544                         regidx = (bit & 0xe0) >> 5;
3545                         bit &= 0x1f;
3546                         mc_filter[regidx] |= (1 << bit);
3547                 }
3548 
3549                 for (i = 0; i < NUM_MC_HASH_REGISTERS; i++) {
3550                         REG_WR(bp, BNX2_EMAC_MULTICAST_HASH0 + (i * 4),
3551                                mc_filter[i]);
3552                 }
3553 
3554                 sort_mode |= BNX2_RPM_SORT_USER0_MC_HSH_EN;
3555         }
3556 
3557         if (dev->uc.count > BNX2_MAX_UNICAST_ADDRESSES) {
3558                 rx_mode |= BNX2_EMAC_RX_MODE_PROMISCUOUS;
3559                 sort_mode |= BNX2_RPM_SORT_USER0_PROM_EN |
3560                              BNX2_RPM_SORT_USER0_PROM_VLAN;
3561         } else if (!(dev->flags & IFF_PROMISC)) {
3562                 /* Add all entries into to the match filter list */
3563                 i = 0;
3564                 list_for_each_entry(ha, &dev->uc.list, list) {
3565                         bnx2_set_mac_addr(bp, ha->addr,
3566                                           i + BNX2_START_UNICAST_ADDRESS_INDEX);
3567                         sort_mode |= (1 <<
3568                                       (i + BNX2_START_UNICAST_ADDRESS_INDEX));
3569                         i++;
3570                 }
3571 
3572         }
3573 
3574         if (rx_mode != bp->rx_mode) {
3575                 bp->rx_mode = rx_mode;
3576                 REG_WR(bp, BNX2_EMAC_RX_MODE, rx_mode);
3577         }
3578 
3579         REG_WR(bp, BNX2_RPM_SORT_USER0, 0x0);
3580         REG_WR(bp, BNX2_RPM_SORT_USER0, sort_mode);
3581         REG_WR(bp, BNX2_RPM_SORT_USER0, sort_mode | BNX2_RPM_SORT_USER0_ENA);
3582 
3583         spin_unlock_bh(&bp->phy_lock);
3584 }
3585 
3586 static int __devinit
3587 check_fw_section(const struct firmware *fw,
3588                  const struct bnx2_fw_file_section *section,
3589                  u32 alignment, bool non_empty)
3590 {
3591         u32 offset = be32_to_cpu(section->offset);
3592         u32 len = be32_to_cpu(section->len);
3593 
3594         if ((offset == 0 && len != 0) || offset >= fw->size || offset & 3)
3595                 return -EINVAL;
3596         if ((non_empty && len == 0) || len > fw->size - offset ||
3597             len & (alignment - 1))
3598                 return -EINVAL;
3599         return 0;
3600 }
3601 
3602 static int __devinit
3603 check_mips_fw_entry(const struct firmware *fw,
3604                     const struct bnx2_mips_fw_file_entry *entry)
3605 {
3606         if (check_fw_section(fw, &entry->text, 4, true) ||
3607             check_fw_section(fw, &entry->data, 4, false) ||
3608             check_fw_section(fw, &entry->rodata, 4, false))
3609                 return -EINVAL;
3610         return 0;
3611 }
3612 
3613 static int __devinit
3614 bnx2_request_firmware(struct bnx2 *bp)
3615 {
3616         const char *mips_fw_file, *rv2p_fw_file;
3617         const struct bnx2_mips_fw_file *mips_fw;
3618         const struct bnx2_rv2p_fw_file *rv2p_fw;
3619         int rc;
3620 
3621         if (CHIP_NUM(bp) == CHIP_NUM_5709) {
3622                 mips_fw_file = FW_MIPS_FILE_09;
3623                 rv2p_fw_file = FW_RV2P_FILE_09;
3624         } else {
3625                 mips_fw_file = FW_MIPS_FILE_06;
3626                 rv2p_fw_file = FW_RV2P_FILE_06;
3627         }
3628 
3629         rc = request_firmware(&bp->mips_firmware, mips_fw_file, &bp->pdev->dev);
3630         if (rc) {
3631                 printk(KERN_ERR PFX "Can't load firmware file \"%s\"\n",
3632                        mips_fw_file);
3633                 return rc;
3634         }
3635 
3636         rc = request_firmware(&bp->rv2p_firmware, rv2p_fw_file, &bp->pdev->dev);
3637         if (rc) {
3638                 printk(KERN_ERR PFX "Can't load firmware file \"%s\"\n",
3639                        rv2p_fw_file);
3640                 return rc;
3641         }
3642         mips_fw = (const struct bnx2_mips_fw_file *) bp->mips_firmware->data;
3643         rv2p_fw = (const struct bnx2_rv2p_fw_file *) bp->rv2p_firmware->data;
3644         if (bp->mips_firmware->size < sizeof(*mips_fw) ||
3645             check_mips_fw_entry(bp->mips_firmware, &mips_fw->com) ||
3646             check_mips_fw_entry(bp->mips_firmware, &mips_fw->cp) ||
3647             check_mips_fw_entry(bp->mips_firmware, &mips_fw->rxp) ||
3648             check_mips_fw_entry(bp->mips_firmware, &mips_fw->tpat) ||
3649             check_mips_fw_entry(bp->mips_firmware, &mips_fw->txp)) {
3650                 printk(KERN_ERR PFX "Firmware file \"%s\" is invalid\n",
3651                        mips_fw_file);
3652                 return -EINVAL;
3653         }
3654         if (bp->rv2p_firmware->size < sizeof(*rv2p_fw) ||
3655             check_fw_section(bp->rv2p_firmware, &rv2p_fw->proc1.rv2p, 8, true) ||
3656             check_fw_section(bp->rv2p_firmware, &rv2p_fw->proc2.rv2p, 8, true)) {
3657                 printk(KERN_ERR PFX "Firmware file \"%s\" is invalid\n",
3658                        rv2p_fw_file);
3659                 return -EINVAL;
3660         }
3661 
3662         return 0;
3663 }
3664 
3665 static u32
3666 rv2p_fw_fixup(u32 rv2p_proc, int idx, u32 loc, u32 rv2p_code)
3667 {
3668         switch (idx) {
3669         case RV2P_P1_FIXUP_PAGE_SIZE_IDX:
3670                 rv2p_code &= ~RV2P_BD_PAGE_SIZE_MSK;
3671                 rv2p_code |= RV2P_BD_PAGE_SIZE;
3672                 break;
3673         }
3674         return rv2p_code;
3675 }
3676 
3677 static int
3678 load_rv2p_fw(struct bnx2 *bp, u32 rv2p_proc,
3679              const struct bnx2_rv2p_fw_file_entry *fw_entry)
3680 {
3681         u32 rv2p_code_len, file_offset;
3682         __be32 *rv2p_code;
3683         int i;
3684         u32 val, cmd, addr;
3685 
3686         rv2p_code_len = be32_to_cpu(fw_entry->rv2p.len);
3687         file_offset = be32_to_cpu(fw_entry->rv2p.offset);
3688 
3689         rv2p_code = (__be32 *)(bp->rv2p_firmware->data + file_offset);
3690 
3691         if (rv2p_proc == RV2P_PROC1) {
3692                 cmd = BNX2_RV2P_PROC1_ADDR_CMD_RDWR;
3693                 addr = BNX2_RV2P_PROC1_ADDR_CMD;
3694         } else {
3695                 cmd = BNX2_RV2P_PROC2_ADDR_CMD_RDWR;
3696                 addr = BNX2_RV2P_PROC2_ADDR_CMD;
3697         }
3698 
3699         for (i = 0; i < rv2p_code_len; i += 8) {
3700                 REG_WR(bp, BNX2_RV2P_INSTR_HIGH, be32_to_cpu(*rv2p_code));
3701                 rv2p_code++;
3702                 REG_WR(bp, BNX2_RV2P_INSTR_LOW, be32_to_cpu(*rv2p_code));
3703                 rv2p_code++;
3704 
3705                 val = (i / 8) | cmd;
3706                 REG_WR(bp, addr, val);
3707         }
3708 
3709         rv2p_code = (__be32 *)(bp->rv2p_firmware->data + file_offset);
3710         for (i = 0; i < 8; i++) {
3711                 u32 loc, code;
3712 
3713                 loc = be32_to_cpu(fw_entry->fixup[i]);
3714                 if (loc && ((loc * 4) < rv2p_code_len)) {
3715                         code = be32_to_cpu(*(rv2p_code + loc - 1));
3716                         REG_WR(bp, BNX2_RV2P_INSTR_HIGH, code);
3717                         code = be32_to_cpu(*(rv2p_code + loc));
3718                         code = rv2p_fw_fixup(rv2p_proc, i, loc, code);
3719                         REG_WR(bp, BNX2_RV2P_INSTR_LOW, code);
3720 
3721                         val = (loc / 2) | cmd;
3722                         REG_WR(bp, addr, val);
3723                 }
3724         }
3725 
3726         /* Reset the processor, un-stall is done later. */
3727         if (rv2p_proc == RV2P_PROC1) {
3728                 REG_WR(bp, BNX2_RV2P_COMMAND, BNX2_RV2P_COMMAND_PROC1_RESET);
3729         }
3730         else {
3731                 REG_WR(bp, BNX2_RV2P_COMMAND, BNX2_RV2P_COMMAND_PROC2_RESET);
3732         }
3733 
3734         return 0;
3735 }
3736 
3737 static int
3738 load_cpu_fw(struct bnx2 *bp, const struct cpu_reg *cpu_reg,
3739             const struct bnx2_mips_fw_file_entry *fw_entry)
3740 {
3741         u32 addr, len, file_offset;
3742         __be32 *data;
3743         u32 offset;
3744         u32 val;
3745 
3746         /* Halt the CPU. */
3747         val = bnx2_reg_rd_ind(bp, cpu_reg->mode);
3748         val |= cpu_reg->mode_value_halt;
3749         bnx2_reg_wr_ind(bp, cpu_reg->mode, val);
3750         bnx2_reg_wr_ind(bp, cpu_reg->state, cpu_reg->state_value_clear);
3751 
3752         /* Load the Text area. */
3753         addr = be32_to_cpu(fw_entry->text.addr);
3754         len = be32_to_cpu(fw_entry->text.len);
3755         file_offset = be32_to_cpu(fw_entry->text.offset);
3756         data = (__be32 *)(bp->mips_firmware->data + file_offset);
3757 
3758         offset = cpu_reg->spad_base + (addr - cpu_reg->mips_view_base);
3759         if (len) {
3760                 int j;
3761 
3762                 for (j = 0; j < (len / 4); j++, offset += 4)
3763                         bnx2_reg_wr_ind(bp, offset, be32_to_cpu(data[j]));
3764         }
3765 
3766         /* Load the Data area. */
3767         addr = be32_to_cpu(fw_entry->data.addr);
3768         len = be32_to_cpu(fw_entry->data.len);
3769         file_offset = be32_to_cpu(fw_entry->data.offset);
3770         data = (__be32 *)(bp->mips_firmware->data + file_offset);
3771 
3772         offset = cpu_reg->spad_base + (addr - cpu_reg->mips_view_base);
3773         if (len) {
3774                 int j;
3775 
3776                 for (j = 0; j < (len / 4); j++, offset += 4)
3777                         bnx2_reg_wr_ind(bp, offset, be32_to_cpu(data[j]));
3778         }
3779 
3780         /* Load the Read-Only area. */
3781         addr = be32_to_cpu(fw_entry->rodata.addr);
3782         len = be32_to_cpu(fw_entry->rodata.len);
3783         file_offset = be32_to_cpu(fw_entry->rodata.offset);
3784         data = (__be32 *)(bp->mips_firmware->data + file_offset);
3785 
3786         offset = cpu_reg->spad_base + (addr - cpu_reg->mips_view_base);
3787         if (len) {
3788                 int j;
3789 
3790                 for (j = 0; j < (len / 4); j++, offset += 4)
3791                         bnx2_reg_wr_ind(bp, offset, be32_to_cpu(data[j]));
3792         }
3793 
3794         /* Clear the pre-fetch instruction. */
3795         bnx2_reg_wr_ind(bp, cpu_reg->inst, 0);
3796 
3797         val = be32_to_cpu(fw_entry->start_addr);
3798         bnx2_reg_wr_ind(bp, cpu_reg->pc, val);
3799 
3800         /* Start the CPU. */
3801         val = bnx2_reg_rd_ind(bp, cpu_reg->mode);
3802         val &= ~cpu_reg->mode_value_halt;
3803         bnx2_reg_wr_ind(bp, cpu_reg->state, cpu_reg->state_value_clear);
3804         bnx2_reg_wr_ind(bp, cpu_reg->mode, val);
3805 
3806         return 0;
3807 }
3808 
3809 static int
3810 bnx2_init_cpus(struct bnx2 *bp)
3811 {
3812         const struct bnx2_mips_fw_file *mips_fw =
3813                 (const struct bnx2_mips_fw_file *) bp->mips_firmware->data;
3814         const struct bnx2_rv2p_fw_file *rv2p_fw =
3815                 (const struct bnx2_rv2p_fw_file *) bp->rv2p_firmware->data;
3816         int rc;
3817 
3818         /* Initialize the RV2P processor. */
3819         load_rv2p_fw(bp, RV2P_PROC1, &rv2p_fw->proc1);
3820         load_rv2p_fw(bp, RV2P_PROC2, &rv2p_fw->proc2);
3821 
3822         /* Initialize the RX Processor. */
3823         rc = load_cpu_fw(bp, &cpu_reg_rxp, &mips_fw->rxp);
3824         if (rc)
3825                 goto init_cpu_err;
3826 
3827         /* Initialize the TX Processor. */
3828         rc = load_cpu_fw(bp, &cpu_reg_txp, &mips_fw->txp);
3829         if (rc)
3830                 goto init_cpu_err;
3831 
3832         /* Initialize the TX Patch-up Processor. */
3833         rc = load_cpu_fw(bp, &cpu_reg_tpat, &mips_fw->tpat);
3834         if (rc)
3835                 goto init_cpu_err;
3836 
3837         /* Initialize the Completion Processor. */
3838         rc = load_cpu_fw(bp, &cpu_reg_com, &mips_fw->com);
3839         if (rc)
3840                 goto init_cpu_err;
3841 
3842         /* Initialize the Command Processor. */
3843         rc = load_cpu_fw(bp, &cpu_reg_cp, &mips_fw->cp);
3844 
3845 init_cpu_err:
3846         return rc;
3847 }
3848 
3849 static int
3850 bnx2_set_power_state(struct bnx2 *bp, pci_power_t state)
3851 {
3852         u16 pmcsr;
3853 
3854         pci_read_config_word(bp->pdev, bp->pm_cap + PCI_PM_CTRL, &pmcsr);
3855 
3856         switch (state) {
3857         case PCI_D0: {
3858                 u32 val;
3859 
3860                 pci_write_config_word(bp->pdev, bp->pm_cap + PCI_PM_CTRL,
3861                         (pmcsr & ~PCI_PM_CTRL_STATE_MASK) |
3862                         PCI_PM_CTRL_PME_STATUS);
3863 
3864                 if (pmcsr & PCI_PM_CTRL_STATE_MASK)
3865                         /* delay required during transition out of D3hot */
3866                         msleep(20);
3867 
3868                 val = REG_RD(bp, BNX2_EMAC_MODE);
3869                 val |= BNX2_EMAC_MODE_MPKT_RCVD | BNX2_EMAC_MODE_ACPI_RCVD;
3870