OpenCores
URL https://opencores.org/ocsvn/test_project/test_project/trunk

Subversion Repositories test_project

[/] [test_project/] [trunk/] [linux_sd_driver/] [drivers/] [net/] [bnx2.c] - Blame information for rev 62

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.