diff options
Diffstat (limited to 'drivers/net/myri10ge/myri10ge.c')
| -rw-r--r-- | drivers/net/myri10ge/myri10ge.c | 42 |
1 files changed, 33 insertions, 9 deletions
diff --git a/drivers/net/myri10ge/myri10ge.c b/drivers/net/myri10ge/myri10ge.c index b05dc6ed7fb7..ac02b3b60f92 100644 --- a/drivers/net/myri10ge/myri10ge.c +++ b/drivers/net/myri10ge/myri10ge.c | |||
| @@ -181,6 +181,7 @@ struct myri10ge_priv { | |||
| 181 | int intr_coal_delay; | 181 | int intr_coal_delay; |
| 182 | __be32 __iomem *intr_coal_delay_ptr; | 182 | __be32 __iomem *intr_coal_delay_ptr; |
| 183 | int mtrr; | 183 | int mtrr; |
| 184 | int wc_enabled; | ||
| 184 | int wake_queue; | 185 | int wake_queue; |
| 185 | int stop_queue; | 186 | int stop_queue; |
| 186 | int down_cnt; | 187 | int down_cnt; |
| @@ -717,6 +718,8 @@ static int myri10ge_reset(struct myri10ge_priv *mgp) | |||
| 717 | int status; | 718 | int status; |
| 718 | size_t bytes; | 719 | size_t bytes; |
| 719 | u32 len; | 720 | u32 len; |
| 721 | struct page *dmatest_page; | ||
| 722 | dma_addr_t dmatest_bus; | ||
| 720 | 723 | ||
| 721 | /* try to send a reset command to the card to see if it | 724 | /* try to send a reset command to the card to see if it |
| 722 | * is alive */ | 725 | * is alive */ |
| @@ -726,6 +729,11 @@ static int myri10ge_reset(struct myri10ge_priv *mgp) | |||
| 726 | dev_err(&mgp->pdev->dev, "failed reset\n"); | 729 | dev_err(&mgp->pdev->dev, "failed reset\n"); |
| 727 | return -ENXIO; | 730 | return -ENXIO; |
| 728 | } | 731 | } |
| 732 | dmatest_page = alloc_page(GFP_KERNEL); | ||
| 733 | if (!dmatest_page) | ||
| 734 | return -ENOMEM; | ||
| 735 | dmatest_bus = pci_map_page(mgp->pdev, dmatest_page, 0, PAGE_SIZE, | ||
| 736 | DMA_BIDIRECTIONAL); | ||
| 729 | 737 | ||
| 730 | /* Now exchange information about interrupts */ | 738 | /* Now exchange information about interrupts */ |
| 731 | 739 | ||
| @@ -764,8 +772,8 @@ static int myri10ge_reset(struct myri10ge_priv *mgp) | |||
| 764 | 772 | ||
| 765 | len = mgp->tx.boundary; | 773 | len = mgp->tx.boundary; |
| 766 | 774 | ||
| 767 | cmd.data0 = MYRI10GE_LOWPART_TO_U32(mgp->rx_done.bus); | 775 | cmd.data0 = MYRI10GE_LOWPART_TO_U32(dmatest_bus); |
| 768 | cmd.data1 = MYRI10GE_HIGHPART_TO_U32(mgp->rx_done.bus); | 776 | cmd.data1 = MYRI10GE_HIGHPART_TO_U32(dmatest_bus); |
| 769 | cmd.data2 = len * 0x10000; | 777 | cmd.data2 = len * 0x10000; |
| 770 | status = myri10ge_send_cmd(mgp, MXGEFW_DMA_TEST, &cmd, 0); | 778 | status = myri10ge_send_cmd(mgp, MXGEFW_DMA_TEST, &cmd, 0); |
| 771 | if (status == 0) | 779 | if (status == 0) |
| @@ -774,8 +782,8 @@ static int myri10ge_reset(struct myri10ge_priv *mgp) | |||
| 774 | else | 782 | else |
| 775 | dev_warn(&mgp->pdev->dev, "DMA read benchmark failed: %d\n", | 783 | dev_warn(&mgp->pdev->dev, "DMA read benchmark failed: %d\n", |
| 776 | status); | 784 | status); |
| 777 | cmd.data0 = MYRI10GE_LOWPART_TO_U32(mgp->rx_done.bus); | 785 | cmd.data0 = MYRI10GE_LOWPART_TO_U32(dmatest_bus); |
| 778 | cmd.data1 = MYRI10GE_HIGHPART_TO_U32(mgp->rx_done.bus); | 786 | cmd.data1 = MYRI10GE_HIGHPART_TO_U32(dmatest_bus); |
| 779 | cmd.data2 = len * 0x1; | 787 | cmd.data2 = len * 0x1; |
| 780 | status = myri10ge_send_cmd(mgp, MXGEFW_DMA_TEST, &cmd, 0); | 788 | status = myri10ge_send_cmd(mgp, MXGEFW_DMA_TEST, &cmd, 0); |
| 781 | if (status == 0) | 789 | if (status == 0) |
| @@ -785,8 +793,8 @@ static int myri10ge_reset(struct myri10ge_priv *mgp) | |||
| 785 | dev_warn(&mgp->pdev->dev, "DMA write benchmark failed: %d\n", | 793 | dev_warn(&mgp->pdev->dev, "DMA write benchmark failed: %d\n", |
| 786 | status); | 794 | status); |
| 787 | 795 | ||
| 788 | cmd.data0 = MYRI10GE_LOWPART_TO_U32(mgp->rx_done.bus); | 796 | cmd.data0 = MYRI10GE_LOWPART_TO_U32(dmatest_bus); |
| 789 | cmd.data1 = MYRI10GE_HIGHPART_TO_U32(mgp->rx_done.bus); | 797 | cmd.data1 = MYRI10GE_HIGHPART_TO_U32(dmatest_bus); |
| 790 | cmd.data2 = len * 0x10001; | 798 | cmd.data2 = len * 0x10001; |
| 791 | status = myri10ge_send_cmd(mgp, MXGEFW_DMA_TEST, &cmd, 0); | 799 | status = myri10ge_send_cmd(mgp, MXGEFW_DMA_TEST, &cmd, 0); |
| 792 | if (status == 0) | 800 | if (status == 0) |
| @@ -796,6 +804,9 @@ static int myri10ge_reset(struct myri10ge_priv *mgp) | |||
| 796 | dev_warn(&mgp->pdev->dev, | 804 | dev_warn(&mgp->pdev->dev, |
| 797 | "DMA read/write benchmark failed: %d\n", status); | 805 | "DMA read/write benchmark failed: %d\n", status); |
| 798 | 806 | ||
| 807 | pci_unmap_page(mgp->pdev, dmatest_bus, PAGE_SIZE, DMA_BIDIRECTIONAL); | ||
| 808 | put_page(dmatest_page); | ||
| 809 | |||
| 799 | memset(mgp->rx_done.entry, 0, bytes); | 810 | memset(mgp->rx_done.entry, 0, bytes); |
| 800 | 811 | ||
| 801 | /* reset mcp/driver shared state back to 0 */ | 812 | /* reset mcp/driver shared state back to 0 */ |
| @@ -1375,7 +1386,7 @@ myri10ge_get_ethtool_stats(struct net_device *netdev, | |||
| 1375 | data[i] = ((unsigned long *)&mgp->stats)[i]; | 1386 | data[i] = ((unsigned long *)&mgp->stats)[i]; |
| 1376 | 1387 | ||
| 1377 | data[i++] = (unsigned int)mgp->tx.boundary; | 1388 | data[i++] = (unsigned int)mgp->tx.boundary; |
| 1378 | data[i++] = (unsigned int)(mgp->mtrr >= 0); | 1389 | data[i++] = (unsigned int)mgp->wc_enabled; |
| 1379 | data[i++] = (unsigned int)mgp->pdev->irq; | 1390 | data[i++] = (unsigned int)mgp->pdev->irq; |
| 1380 | data[i++] = (unsigned int)mgp->msi_enabled; | 1391 | data[i++] = (unsigned int)mgp->msi_enabled; |
| 1381 | data[i++] = (unsigned int)mgp->read_dma; | 1392 | data[i++] = (unsigned int)mgp->read_dma; |
| @@ -1456,6 +1467,8 @@ static int myri10ge_allocate_rings(struct net_device *dev) | |||
| 1456 | status = myri10ge_send_cmd(mgp, MXGEFW_CMD_GET_SEND_RING_SIZE, &cmd, 0); | 1467 | status = myri10ge_send_cmd(mgp, MXGEFW_CMD_GET_SEND_RING_SIZE, &cmd, 0); |
| 1457 | tx_ring_size = cmd.data0; | 1468 | tx_ring_size = cmd.data0; |
| 1458 | status |= myri10ge_send_cmd(mgp, MXGEFW_CMD_GET_RX_RING_SIZE, &cmd, 0); | 1469 | status |= myri10ge_send_cmd(mgp, MXGEFW_CMD_GET_RX_RING_SIZE, &cmd, 0); |
| 1470 | if (status != 0) | ||
| 1471 | return status; | ||
| 1459 | rx_ring_size = cmd.data0; | 1472 | rx_ring_size = cmd.data0; |
| 1460 | 1473 | ||
| 1461 | tx_ring_entries = tx_ring_size / sizeof(struct mcp_kreq_ether_send); | 1474 | tx_ring_entries = tx_ring_size / sizeof(struct mcp_kreq_ether_send); |
| @@ -1463,6 +1476,8 @@ static int myri10ge_allocate_rings(struct net_device *dev) | |||
| 1463 | mgp->tx.mask = tx_ring_entries - 1; | 1476 | mgp->tx.mask = tx_ring_entries - 1; |
| 1464 | mgp->rx_small.mask = mgp->rx_big.mask = rx_ring_entries - 1; | 1477 | mgp->rx_small.mask = mgp->rx_big.mask = rx_ring_entries - 1; |
| 1465 | 1478 | ||
| 1479 | status = -ENOMEM; | ||
| 1480 | |||
| 1466 | /* allocate the host shadow rings */ | 1481 | /* allocate the host shadow rings */ |
| 1467 | 1482 | ||
| 1468 | bytes = 8 + (MYRI10GE_MAX_SEND_DESC_TSO + 4) | 1483 | bytes = 8 + (MYRI10GE_MAX_SEND_DESC_TSO + 4) |
| @@ -1735,7 +1750,7 @@ static int myri10ge_open(struct net_device *dev) | |||
| 1735 | goto abort_with_irq; | 1750 | goto abort_with_irq; |
| 1736 | } | 1751 | } |
| 1737 | 1752 | ||
| 1738 | if (myri10ge_wcfifo && mgp->mtrr >= 0) { | 1753 | if (myri10ge_wcfifo && mgp->wc_enabled) { |
| 1739 | mgp->tx.wc_fifo = (u8 __iomem *) mgp->sram + MXGEFW_ETH_SEND_4; | 1754 | mgp->tx.wc_fifo = (u8 __iomem *) mgp->sram + MXGEFW_ETH_SEND_4; |
| 1740 | mgp->rx_small.wc_fifo = | 1755 | mgp->rx_small.wc_fifo = |
| 1741 | (u8 __iomem *) mgp->sram + MXGEFW_ETH_RECV_SMALL; | 1756 | (u8 __iomem *) mgp->sram + MXGEFW_ETH_RECV_SMALL; |
| @@ -2510,6 +2525,12 @@ static void myri10ge_select_firmware(struct myri10ge_priv *mgp) | |||
| 2510 | bridge->vendor, bridge->device); | 2525 | bridge->vendor, bridge->device); |
| 2511 | mgp->tx.boundary = 4096; | 2526 | mgp->tx.boundary = 4096; |
| 2512 | mgp->fw_name = myri10ge_fw_aligned; | 2527 | mgp->fw_name = myri10ge_fw_aligned; |
| 2528 | } else if (bridge && | ||
| 2529 | bridge->vendor == PCI_VENDOR_ID_SGI && | ||
| 2530 | bridge->device == 0x4002 /* TIOCE pcie-port */ ) { | ||
| 2531 | /* this pcie bridge does not support 4K rdma request */ | ||
| 2532 | mgp->tx.boundary = 2048; | ||
| 2533 | mgp->fw_name = myri10ge_fw_aligned; | ||
| 2513 | } | 2534 | } |
| 2514 | } else { | 2535 | } else { |
| 2515 | if (myri10ge_force_firmware == 1) { | 2536 | if (myri10ge_force_firmware == 1) { |
| @@ -2830,9 +2851,12 @@ static int myri10ge_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 2830 | mgp->board_span = pci_resource_len(pdev, 0); | 2851 | mgp->board_span = pci_resource_len(pdev, 0); |
| 2831 | mgp->iomem_base = pci_resource_start(pdev, 0); | 2852 | mgp->iomem_base = pci_resource_start(pdev, 0); |
| 2832 | mgp->mtrr = -1; | 2853 | mgp->mtrr = -1; |
| 2854 | mgp->wc_enabled = 0; | ||
| 2833 | #ifdef CONFIG_MTRR | 2855 | #ifdef CONFIG_MTRR |
| 2834 | mgp->mtrr = mtrr_add(mgp->iomem_base, mgp->board_span, | 2856 | mgp->mtrr = mtrr_add(mgp->iomem_base, mgp->board_span, |
| 2835 | MTRR_TYPE_WRCOMB, 1); | 2857 | MTRR_TYPE_WRCOMB, 1); |
| 2858 | if (mgp->mtrr >= 0) | ||
| 2859 | mgp->wc_enabled = 1; | ||
| 2836 | #endif | 2860 | #endif |
| 2837 | /* Hack. need to get rid of these magic numbers */ | 2861 | /* Hack. need to get rid of these magic numbers */ |
| 2838 | mgp->sram_size = | 2862 | mgp->sram_size = |
| @@ -2927,7 +2951,7 @@ static int myri10ge_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 2927 | dev_info(dev, "%s IRQ %d, tx bndry %d, fw %s, WC %s\n", | 2951 | dev_info(dev, "%s IRQ %d, tx bndry %d, fw %s, WC %s\n", |
| 2928 | (mgp->msi_enabled ? "MSI" : "xPIC"), | 2952 | (mgp->msi_enabled ? "MSI" : "xPIC"), |
| 2929 | netdev->irq, mgp->tx.boundary, mgp->fw_name, | 2953 | netdev->irq, mgp->tx.boundary, mgp->fw_name, |
| 2930 | (mgp->mtrr >= 0 ? "Enabled" : "Disabled")); | 2954 | (mgp->wc_enabled ? "Enabled" : "Disabled")); |
| 2931 | 2955 | ||
| 2932 | return 0; | 2956 | return 0; |
| 2933 | 2957 | ||
