diff options
Diffstat (limited to 'drivers/net/myri10ge/myri10ge.c')
-rw-r--r-- | drivers/net/myri10ge/myri10ge.c | 60 |
1 files changed, 33 insertions, 27 deletions
diff --git a/drivers/net/myri10ge/myri10ge.c b/drivers/net/myri10ge/myri10ge.c index 72aad42db7b4..9bdd43ab3573 100644 --- a/drivers/net/myri10ge/myri10ge.c +++ b/drivers/net/myri10ge/myri10ge.c | |||
@@ -177,6 +177,7 @@ struct myri10ge_priv { | |||
177 | struct work_struct watchdog_work; | 177 | struct work_struct watchdog_work; |
178 | struct timer_list watchdog_timer; | 178 | struct timer_list watchdog_timer; |
179 | int watchdog_tx_done; | 179 | int watchdog_tx_done; |
180 | int watchdog_tx_req; | ||
180 | int watchdog_resets; | 181 | int watchdog_resets; |
181 | int tx_linearized; | 182 | int tx_linearized; |
182 | int pause; | 183 | int pause; |
@@ -188,7 +189,6 @@ struct myri10ge_priv { | |||
188 | int vendor_specific_offset; | 189 | int vendor_specific_offset; |
189 | u32 devctl; | 190 | u32 devctl; |
190 | u16 msi_flags; | 191 | u16 msi_flags; |
191 | u32 pm_state[16]; | ||
192 | u32 read_dma; | 192 | u32 read_dma; |
193 | u32 write_dma; | 193 | u32 write_dma; |
194 | u32 read_write_dma; | 194 | u32 read_write_dma; |
@@ -449,6 +449,7 @@ static int myri10ge_load_hotplug_firmware(struct myri10ge_priv *mgp, u32 * size) | |||
449 | struct mcp_gen_header *hdr; | 449 | struct mcp_gen_header *hdr; |
450 | size_t hdr_offset; | 450 | size_t hdr_offset; |
451 | int status; | 451 | int status; |
452 | unsigned i; | ||
452 | 453 | ||
453 | if ((status = request_firmware(&fw, mgp->fw_name, dev)) < 0) { | 454 | if ((status = request_firmware(&fw, mgp->fw_name, dev)) < 0) { |
454 | dev_err(dev, "Unable to load %s firmware image via hotplug\n", | 455 | dev_err(dev, "Unable to load %s firmware image via hotplug\n", |
@@ -480,18 +481,12 @@ static int myri10ge_load_hotplug_firmware(struct myri10ge_priv *mgp, u32 * size) | |||
480 | goto abort_with_fw; | 481 | goto abort_with_fw; |
481 | 482 | ||
482 | crc = crc32(~0, fw->data, fw->size); | 483 | crc = crc32(~0, fw->data, fw->size); |
483 | if (mgp->tx.boundary == 2048) { | 484 | for (i = 0; i < fw->size; i += 256) { |
484 | /* Avoid PCI burst on chipset with unaligned completions. */ | 485 | myri10ge_pio_copy(mgp->sram + MYRI10GE_FW_OFFSET + i, |
485 | int i; | 486 | fw->data + i, |
486 | __iomem u32 *ptr = (__iomem u32 *) (mgp->sram + | 487 | min(256U, (unsigned)(fw->size - i))); |
487 | MYRI10GE_FW_OFFSET); | 488 | mb(); |
488 | for (i = 0; i < fw->size / 4; i++) { | 489 | readb(mgp->sram); |
489 | __raw_writel(((u32 *) fw->data)[i], ptr + i); | ||
490 | wmb(); | ||
491 | } | ||
492 | } else { | ||
493 | myri10ge_pio_copy(mgp->sram + MYRI10GE_FW_OFFSET, fw->data, | ||
494 | fw->size); | ||
495 | } | 490 | } |
496 | /* corruption checking is good for parity recovery and buggy chipset */ | 491 | /* corruption checking is good for parity recovery and buggy chipset */ |
497 | memcpy_fromio(fw->data, mgp->sram + MYRI10GE_FW_OFFSET, fw->size); | 492 | memcpy_fromio(fw->data, mgp->sram + MYRI10GE_FW_OFFSET, fw->size); |
@@ -621,7 +616,7 @@ static int myri10ge_load_firmware(struct myri10ge_priv *mgp) | |||
621 | return -ENXIO; | 616 | return -ENXIO; |
622 | } | 617 | } |
623 | dev_info(&mgp->pdev->dev, "handoff confirmed\n"); | 618 | dev_info(&mgp->pdev->dev, "handoff confirmed\n"); |
624 | myri10ge_dummy_rdma(mgp, mgp->tx.boundary != 4096); | 619 | myri10ge_dummy_rdma(mgp, 1); |
625 | 620 | ||
626 | return 0; | 621 | return 0; |
627 | } | 622 | } |
@@ -1289,6 +1284,7 @@ static const char myri10ge_gstrings_stats[][ETH_GSTRING_LEN] = { | |||
1289 | "tx_aborted_errors", "tx_carrier_errors", "tx_fifo_errors", | 1284 | "tx_aborted_errors", "tx_carrier_errors", "tx_fifo_errors", |
1290 | "tx_heartbeat_errors", "tx_window_errors", | 1285 | "tx_heartbeat_errors", "tx_window_errors", |
1291 | /* device-specific stats */ | 1286 | /* device-specific stats */ |
1287 | "tx_boundary", "WC", "irq", "MSI", | ||
1292 | "read_dma_bw_MBs", "write_dma_bw_MBs", "read_write_dma_bw_MBs", | 1288 | "read_dma_bw_MBs", "write_dma_bw_MBs", "read_write_dma_bw_MBs", |
1293 | "serial_number", "tx_pkt_start", "tx_pkt_done", | 1289 | "serial_number", "tx_pkt_start", "tx_pkt_done", |
1294 | "tx_req", "tx_done", "rx_small_cnt", "rx_big_cnt", | 1290 | "tx_req", "tx_done", "rx_small_cnt", "rx_big_cnt", |
@@ -1327,6 +1323,10 @@ myri10ge_get_ethtool_stats(struct net_device *netdev, | |||
1327 | for (i = 0; i < MYRI10GE_NET_STATS_LEN; i++) | 1323 | for (i = 0; i < MYRI10GE_NET_STATS_LEN; i++) |
1328 | data[i] = ((unsigned long *)&mgp->stats)[i]; | 1324 | data[i] = ((unsigned long *)&mgp->stats)[i]; |
1329 | 1325 | ||
1326 | data[i++] = (unsigned int)mgp->tx.boundary; | ||
1327 | data[i++] = (unsigned int)(mgp->mtrr >= 0); | ||
1328 | data[i++] = (unsigned int)mgp->pdev->irq; | ||
1329 | data[i++] = (unsigned int)mgp->msi_enabled; | ||
1330 | data[i++] = (unsigned int)mgp->read_dma; | 1330 | data[i++] = (unsigned int)mgp->read_dma; |
1331 | data[i++] = (unsigned int)mgp->write_dma; | 1331 | data[i++] = (unsigned int)mgp->write_dma; |
1332 | data[i++] = (unsigned int)mgp->read_write_dma; | 1332 | data[i++] = (unsigned int)mgp->read_write_dma; |
@@ -2112,7 +2112,7 @@ abort_linearize: | |||
2112 | } | 2112 | } |
2113 | idx = (idx + 1) & tx->mask; | 2113 | idx = (idx + 1) & tx->mask; |
2114 | } while (idx != last_idx); | 2114 | } while (idx != last_idx); |
2115 | if (skb_shinfo(skb)->gso_size) { | 2115 | if (skb_is_gso(skb)) { |
2116 | printk(KERN_ERR | 2116 | printk(KERN_ERR |
2117 | "myri10ge: %s: TSO but wanted to linearize?!?!?\n", | 2117 | "myri10ge: %s: TSO but wanted to linearize?!?!?\n", |
2118 | mgp->dev->name); | 2118 | mgp->dev->name); |
@@ -2197,8 +2197,6 @@ static int myri10ge_change_mtu(struct net_device *dev, int new_mtu) | |||
2197 | * any other device, except if forced with myri10ge_ecrc_enable > 1. | 2197 | * any other device, except if forced with myri10ge_ecrc_enable > 1. |
2198 | */ | 2198 | */ |
2199 | 2199 | ||
2200 | #define PCI_DEVICE_ID_NVIDIA_NFORCE_CK804_PCIE 0x005d | ||
2201 | |||
2202 | static void myri10ge_enable_ecrc(struct myri10ge_priv *mgp) | 2200 | static void myri10ge_enable_ecrc(struct myri10ge_priv *mgp) |
2203 | { | 2201 | { |
2204 | struct pci_dev *bridge = mgp->pdev->bus->self; | 2202 | struct pci_dev *bridge = mgp->pdev->bus->self; |
@@ -2410,18 +2408,24 @@ static int myri10ge_resume(struct pci_dev *pdev) | |||
2410 | return -EIO; | 2408 | return -EIO; |
2411 | } | 2409 | } |
2412 | myri10ge_restore_state(mgp); | 2410 | myri10ge_restore_state(mgp); |
2413 | pci_enable_device(pdev); | 2411 | |
2412 | status = pci_enable_device(pdev); | ||
2413 | if (status < 0) { | ||
2414 | dev_err(&pdev->dev, "failed to enable device\n"); | ||
2415 | return -EIO; | ||
2416 | } | ||
2417 | |||
2414 | pci_set_master(pdev); | 2418 | pci_set_master(pdev); |
2415 | 2419 | ||
2416 | status = request_irq(pdev->irq, myri10ge_intr, IRQF_SHARED, | 2420 | status = request_irq(pdev->irq, myri10ge_intr, IRQF_SHARED, |
2417 | netdev->name, mgp); | 2421 | netdev->name, mgp); |
2418 | if (status != 0) { | 2422 | if (status != 0) { |
2419 | dev_err(&pdev->dev, "failed to allocate IRQ\n"); | 2423 | dev_err(&pdev->dev, "failed to allocate IRQ\n"); |
2420 | goto abort_with_msi; | 2424 | goto abort_with_enabled; |
2421 | } | 2425 | } |
2422 | 2426 | ||
2423 | myri10ge_reset(mgp); | 2427 | myri10ge_reset(mgp); |
2424 | myri10ge_dummy_rdma(mgp, mgp->tx.boundary != 4096); | 2428 | myri10ge_dummy_rdma(mgp, 1); |
2425 | 2429 | ||
2426 | /* Save configuration space to be restored if the | 2430 | /* Save configuration space to be restored if the |
2427 | * nic resets due to a parity error */ | 2431 | * nic resets due to a parity error */ |
@@ -2436,7 +2440,8 @@ static int myri10ge_resume(struct pci_dev *pdev) | |||
2436 | 2440 | ||
2437 | return 0; | 2441 | return 0; |
2438 | 2442 | ||
2439 | abort_with_msi: | 2443 | abort_with_enabled: |
2444 | pci_disable_device(pdev); | ||
2440 | return -EIO; | 2445 | return -EIO; |
2441 | 2446 | ||
2442 | } | 2447 | } |
@@ -2538,7 +2543,8 @@ static void myri10ge_watchdog_timer(unsigned long arg) | |||
2538 | 2543 | ||
2539 | mgp = (struct myri10ge_priv *)arg; | 2544 | mgp = (struct myri10ge_priv *)arg; |
2540 | if (mgp->tx.req != mgp->tx.done && | 2545 | if (mgp->tx.req != mgp->tx.done && |
2541 | mgp->tx.done == mgp->watchdog_tx_done) | 2546 | mgp->tx.done == mgp->watchdog_tx_done && |
2547 | mgp->watchdog_tx_req != mgp->watchdog_tx_done) | ||
2542 | /* nic seems like it might be stuck.. */ | 2548 | /* nic seems like it might be stuck.. */ |
2543 | schedule_work(&mgp->watchdog_work); | 2549 | schedule_work(&mgp->watchdog_work); |
2544 | else | 2550 | else |
@@ -2547,6 +2553,7 @@ static void myri10ge_watchdog_timer(unsigned long arg) | |||
2547 | jiffies + myri10ge_watchdog_timeout * HZ); | 2553 | jiffies + myri10ge_watchdog_timeout * HZ); |
2548 | 2554 | ||
2549 | mgp->watchdog_tx_done = mgp->tx.done; | 2555 | mgp->watchdog_tx_done = mgp->tx.done; |
2556 | mgp->watchdog_tx_req = mgp->tx.req; | ||
2550 | } | 2557 | } |
2551 | 2558 | ||
2552 | static int myri10ge_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | 2559 | static int myri10ge_probe(struct pci_dev *pdev, const struct pci_device_id *ent) |
@@ -2737,11 +2744,10 @@ static int myri10ge_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
2737 | dev_err(&pdev->dev, "register_netdev failed: %d\n", status); | 2744 | dev_err(&pdev->dev, "register_netdev failed: %d\n", status); |
2738 | goto abort_with_irq; | 2745 | goto abort_with_irq; |
2739 | } | 2746 | } |
2740 | 2747 | dev_info(dev, "%s IRQ %d, tx bndry %d, fw %s, WC %s\n", | |
2741 | printk(KERN_INFO "myri10ge: %s: %s IRQ %d, tx bndry %d, fw %s, WC %s\n", | 2748 | (mgp->msi_enabled ? "MSI" : "xPIC"), |
2742 | netdev->name, (mgp->msi_enabled ? "MSI" : "xPIC"), | 2749 | pdev->irq, mgp->tx.boundary, mgp->fw_name, |
2743 | pdev->irq, mgp->tx.boundary, mgp->fw_name, | 2750 | (mgp->mtrr >= 0 ? "Enabled" : "Disabled")); |
2744 | (mgp->mtrr >= 0 ? "Enabled" : "Disabled")); | ||
2745 | 2751 | ||
2746 | return 0; | 2752 | return 0; |
2747 | 2753 | ||