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