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