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