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