diff options
Diffstat (limited to 'drivers/net/ethernet')
48 files changed, 719 insertions, 334 deletions
diff --git a/drivers/net/ethernet/allwinner/Kconfig b/drivers/net/ethernet/allwinner/Kconfig index 53ad213e865b..d8d95d4cd45a 100644 --- a/drivers/net/ethernet/allwinner/Kconfig +++ b/drivers/net/ethernet/allwinner/Kconfig | |||
| @@ -3,19 +3,20 @@ | |||
| 3 | # | 3 | # |
| 4 | 4 | ||
| 5 | config NET_VENDOR_ALLWINNER | 5 | config NET_VENDOR_ALLWINNER |
| 6 | bool "Allwinner devices" | 6 | bool "Allwinner devices" |
| 7 | default y | 7 | default y |
| 8 | depends on ARCH_SUNXI | ||
| 9 | ---help--- | ||
| 10 | If you have a network (Ethernet) card belonging to this | ||
| 11 | class, say Y and read the Ethernet-HOWTO, available from | ||
| 12 | <http://www.tldp.org/docs.html#howto>. | ||
| 13 | 8 | ||
| 14 | Note that the answer to this question doesn't directly | 9 | depends on ARCH_SUNXI |
| 15 | affect the kernel: saying N will just cause the configurator | 10 | ---help--- |
| 16 | to skip all the questions about Allwinner cards. If you say Y, | 11 | If you have a network (Ethernet) card belonging to this |
| 17 | you will be asked for your specific card in the following | 12 | class, say Y and read the Ethernet-HOWTO, available from |
| 18 | questions. | 13 | <http://www.tldp.org/docs.html#howto>. |
| 14 | |||
| 15 | Note that the answer to this question doesn't directly | ||
| 16 | affect the kernel: saying N will just cause the configurator | ||
| 17 | to skip all the questions about Allwinner cards. If you say Y, | ||
| 18 | you will be asked for your specific card in the following | ||
| 19 | questions. | ||
| 19 | 20 | ||
| 20 | if NET_VENDOR_ALLWINNER | 21 | if NET_VENDOR_ALLWINNER |
| 21 | 22 | ||
| @@ -26,6 +27,7 @@ config SUN4I_EMAC | |||
| 26 | select CRC32 | 27 | select CRC32 |
| 27 | select MII | 28 | select MII |
| 28 | select PHYLIB | 29 | select PHYLIB |
| 30 | select MDIO_SUN4I | ||
| 29 | ---help--- | 31 | ---help--- |
| 30 | Support for Allwinner A10 EMAC ethernet driver. | 32 | Support for Allwinner A10 EMAC ethernet driver. |
| 31 | 33 | ||
diff --git a/drivers/net/ethernet/atheros/atl1c/atl1c.h b/drivers/net/ethernet/atheros/atl1c/atl1c.h index b2bf324631dc..0f0556526ba9 100644 --- a/drivers/net/ethernet/atheros/atl1c/atl1c.h +++ b/drivers/net/ethernet/atheros/atl1c/atl1c.h | |||
| @@ -520,6 +520,9 @@ struct atl1c_adapter { | |||
| 520 | struct net_device *netdev; | 520 | struct net_device *netdev; |
| 521 | struct pci_dev *pdev; | 521 | struct pci_dev *pdev; |
| 522 | struct napi_struct napi; | 522 | struct napi_struct napi; |
| 523 | struct page *rx_page; | ||
| 524 | unsigned int rx_page_offset; | ||
| 525 | unsigned int rx_frag_size; | ||
| 523 | struct atl1c_hw hw; | 526 | struct atl1c_hw hw; |
| 524 | struct atl1c_hw_stats hw_stats; | 527 | struct atl1c_hw_stats hw_stats; |
| 525 | struct mii_if_info mii; /* MII interface info */ | 528 | struct mii_if_info mii; /* MII interface info */ |
diff --git a/drivers/net/ethernet/atheros/atl1c/atl1c_main.c b/drivers/net/ethernet/atheros/atl1c/atl1c_main.c index 786a87483298..a36a760ada28 100644 --- a/drivers/net/ethernet/atheros/atl1c/atl1c_main.c +++ b/drivers/net/ethernet/atheros/atl1c/atl1c_main.c | |||
| @@ -481,10 +481,15 @@ static int atl1c_set_mac_addr(struct net_device *netdev, void *p) | |||
| 481 | static void atl1c_set_rxbufsize(struct atl1c_adapter *adapter, | 481 | static void atl1c_set_rxbufsize(struct atl1c_adapter *adapter, |
| 482 | struct net_device *dev) | 482 | struct net_device *dev) |
| 483 | { | 483 | { |
| 484 | unsigned int head_size; | ||
| 484 | int mtu = dev->mtu; | 485 | int mtu = dev->mtu; |
| 485 | 486 | ||
| 486 | adapter->rx_buffer_len = mtu > AT_RX_BUF_SIZE ? | 487 | adapter->rx_buffer_len = mtu > AT_RX_BUF_SIZE ? |
| 487 | roundup(mtu + ETH_HLEN + ETH_FCS_LEN + VLAN_HLEN, 8) : AT_RX_BUF_SIZE; | 488 | roundup(mtu + ETH_HLEN + ETH_FCS_LEN + VLAN_HLEN, 8) : AT_RX_BUF_SIZE; |
| 489 | |||
| 490 | head_size = SKB_DATA_ALIGN(adapter->rx_buffer_len + NET_SKB_PAD) + | ||
| 491 | SKB_DATA_ALIGN(sizeof(struct skb_shared_info)); | ||
| 492 | adapter->rx_frag_size = roundup_pow_of_two(head_size); | ||
| 488 | } | 493 | } |
| 489 | 494 | ||
| 490 | static netdev_features_t atl1c_fix_features(struct net_device *netdev, | 495 | static netdev_features_t atl1c_fix_features(struct net_device *netdev, |
| @@ -952,6 +957,10 @@ static void atl1c_free_ring_resources(struct atl1c_adapter *adapter) | |||
| 952 | kfree(adapter->tpd_ring[0].buffer_info); | 957 | kfree(adapter->tpd_ring[0].buffer_info); |
| 953 | adapter->tpd_ring[0].buffer_info = NULL; | 958 | adapter->tpd_ring[0].buffer_info = NULL; |
| 954 | } | 959 | } |
| 960 | if (adapter->rx_page) { | ||
| 961 | put_page(adapter->rx_page); | ||
| 962 | adapter->rx_page = NULL; | ||
| 963 | } | ||
| 955 | } | 964 | } |
| 956 | 965 | ||
| 957 | /** | 966 | /** |
| @@ -1639,6 +1648,35 @@ static inline void atl1c_rx_checksum(struct atl1c_adapter *adapter, | |||
| 1639 | skb_checksum_none_assert(skb); | 1648 | skb_checksum_none_assert(skb); |
| 1640 | } | 1649 | } |
| 1641 | 1650 | ||
| 1651 | static struct sk_buff *atl1c_alloc_skb(struct atl1c_adapter *adapter) | ||
| 1652 | { | ||
| 1653 | struct sk_buff *skb; | ||
| 1654 | struct page *page; | ||
| 1655 | |||
| 1656 | if (adapter->rx_frag_size > PAGE_SIZE) | ||
| 1657 | return netdev_alloc_skb(adapter->netdev, | ||
| 1658 | adapter->rx_buffer_len); | ||
| 1659 | |||
| 1660 | page = adapter->rx_page; | ||
| 1661 | if (!page) { | ||
| 1662 | adapter->rx_page = page = alloc_page(GFP_ATOMIC); | ||
| 1663 | if (unlikely(!page)) | ||
| 1664 | return NULL; | ||
| 1665 | adapter->rx_page_offset = 0; | ||
| 1666 | } | ||
| 1667 | |||
| 1668 | skb = build_skb(page_address(page) + adapter->rx_page_offset, | ||
| 1669 | adapter->rx_frag_size); | ||
| 1670 | if (likely(skb)) { | ||
| 1671 | adapter->rx_page_offset += adapter->rx_frag_size; | ||
| 1672 | if (adapter->rx_page_offset >= PAGE_SIZE) | ||
| 1673 | adapter->rx_page = NULL; | ||
| 1674 | else | ||
| 1675 | get_page(page); | ||
| 1676 | } | ||
| 1677 | return skb; | ||
| 1678 | } | ||
| 1679 | |||
| 1642 | static int atl1c_alloc_rx_buffer(struct atl1c_adapter *adapter) | 1680 | static int atl1c_alloc_rx_buffer(struct atl1c_adapter *adapter) |
| 1643 | { | 1681 | { |
| 1644 | struct atl1c_rfd_ring *rfd_ring = &adapter->rfd_ring; | 1682 | struct atl1c_rfd_ring *rfd_ring = &adapter->rfd_ring; |
| @@ -1660,7 +1698,7 @@ static int atl1c_alloc_rx_buffer(struct atl1c_adapter *adapter) | |||
| 1660 | while (next_info->flags & ATL1C_BUFFER_FREE) { | 1698 | while (next_info->flags & ATL1C_BUFFER_FREE) { |
| 1661 | rfd_desc = ATL1C_RFD_DESC(rfd_ring, rfd_next_to_use); | 1699 | rfd_desc = ATL1C_RFD_DESC(rfd_ring, rfd_next_to_use); |
| 1662 | 1700 | ||
| 1663 | skb = netdev_alloc_skb(adapter->netdev, adapter->rx_buffer_len); | 1701 | skb = atl1c_alloc_skb(adapter); |
| 1664 | if (unlikely(!skb)) { | 1702 | if (unlikely(!skb)) { |
| 1665 | if (netif_msg_rx_err(adapter)) | 1703 | if (netif_msg_rx_err(adapter)) |
| 1666 | dev_warn(&pdev->dev, "alloc rx buffer failed\n"); | 1704 | dev_warn(&pdev->dev, "alloc rx buffer failed\n"); |
diff --git a/drivers/net/ethernet/atheros/atl1e/atl1e_main.c b/drivers/net/ethernet/atheros/atl1e/atl1e_main.c index 6d1a62a84c9d..1966444590f6 100644 --- a/drivers/net/ethernet/atheros/atl1e/atl1e_main.c +++ b/drivers/net/ethernet/atheros/atl1e/atl1e_main.c | |||
| @@ -1678,6 +1678,7 @@ static int atl1e_tx_map(struct atl1e_adapter *adapter, | |||
| 1678 | u16 f; | 1678 | u16 f; |
| 1679 | int segment; | 1679 | int segment; |
| 1680 | int ring_start = adapter->tx_ring.next_to_use; | 1680 | int ring_start = adapter->tx_ring.next_to_use; |
| 1681 | int ring_end; | ||
| 1681 | 1682 | ||
| 1682 | nr_frags = skb_shinfo(skb)->nr_frags; | 1683 | nr_frags = skb_shinfo(skb)->nr_frags; |
| 1683 | segment = (tpd->word3 >> TPD_SEGMENT_EN_SHIFT) & TPD_SEGMENT_EN_MASK; | 1684 | segment = (tpd->word3 >> TPD_SEGMENT_EN_SHIFT) & TPD_SEGMENT_EN_MASK; |
| @@ -1721,6 +1722,15 @@ static int atl1e_tx_map(struct atl1e_adapter *adapter, | |||
| 1721 | map_len, PCI_DMA_TODEVICE); | 1722 | map_len, PCI_DMA_TODEVICE); |
| 1722 | 1723 | ||
| 1723 | if (dma_mapping_error(&adapter->pdev->dev, tx_buffer->dma)) { | 1724 | if (dma_mapping_error(&adapter->pdev->dev, tx_buffer->dma)) { |
| 1725 | /* We need to unwind the mappings we've done */ | ||
| 1726 | ring_end = adapter->tx_ring.next_to_use; | ||
| 1727 | adapter->tx_ring.next_to_use = ring_start; | ||
| 1728 | while (adapter->tx_ring.next_to_use != ring_end) { | ||
| 1729 | tpd = atl1e_get_tpd(adapter); | ||
| 1730 | tx_buffer = atl1e_get_tx_buffer(adapter, tpd); | ||
| 1731 | pci_unmap_single(adapter->pdev, tx_buffer->dma, | ||
| 1732 | tx_buffer->length, PCI_DMA_TODEVICE); | ||
| 1733 | } | ||
| 1724 | /* Reset the tx rings next pointer */ | 1734 | /* Reset the tx rings next pointer */ |
| 1725 | adapter->tx_ring.next_to_use = ring_start; | 1735 | adapter->tx_ring.next_to_use = ring_start; |
| 1726 | return -ENOSPC; | 1736 | return -ENOSPC; |
| @@ -1763,6 +1773,16 @@ static int atl1e_tx_map(struct atl1e_adapter *adapter, | |||
| 1763 | DMA_TO_DEVICE); | 1773 | DMA_TO_DEVICE); |
| 1764 | 1774 | ||
| 1765 | if (dma_mapping_error(&adapter->pdev->dev, tx_buffer->dma)) { | 1775 | if (dma_mapping_error(&adapter->pdev->dev, tx_buffer->dma)) { |
| 1776 | /* We need to unwind the mappings we've done */ | ||
| 1777 | ring_end = adapter->tx_ring.next_to_use; | ||
| 1778 | adapter->tx_ring.next_to_use = ring_start; | ||
| 1779 | while (adapter->tx_ring.next_to_use != ring_end) { | ||
| 1780 | tpd = atl1e_get_tpd(adapter); | ||
| 1781 | tx_buffer = atl1e_get_tx_buffer(adapter, tpd); | ||
| 1782 | dma_unmap_page(&adapter->pdev->dev, tx_buffer->dma, | ||
| 1783 | tx_buffer->length, DMA_TO_DEVICE); | ||
| 1784 | } | ||
| 1785 | |||
| 1766 | /* Reset the ring next to use pointer */ | 1786 | /* Reset the ring next to use pointer */ |
| 1767 | adapter->tx_ring.next_to_use = ring_start; | 1787 | adapter->tx_ring.next_to_use = ring_start; |
| 1768 | return -ENOSPC; | 1788 | return -ENOSPC; |
| @@ -1853,8 +1873,10 @@ static netdev_tx_t atl1e_xmit_frame(struct sk_buff *skb, | |||
| 1853 | return NETDEV_TX_OK; | 1873 | return NETDEV_TX_OK; |
| 1854 | } | 1874 | } |
| 1855 | 1875 | ||
| 1856 | if (atl1e_tx_map(adapter, skb, tpd)) | 1876 | if (atl1e_tx_map(adapter, skb, tpd)) { |
| 1877 | dev_kfree_skb_any(skb); | ||
| 1857 | goto out; | 1878 | goto out; |
| 1879 | } | ||
| 1858 | 1880 | ||
| 1859 | atl1e_tx_queue(adapter, tpd_req, tpd); | 1881 | atl1e_tx_queue(adapter, tpd_req, tpd); |
| 1860 | 1882 | ||
diff --git a/drivers/net/ethernet/broadcom/Kconfig b/drivers/net/ethernet/broadcom/Kconfig index 1d680baf43d6..52c96036dcc4 100644 --- a/drivers/net/ethernet/broadcom/Kconfig +++ b/drivers/net/ethernet/broadcom/Kconfig | |||
| @@ -131,6 +131,7 @@ config BNX2X_SRIOV | |||
| 131 | config BGMAC | 131 | config BGMAC |
| 132 | tristate "BCMA bus GBit core support" | 132 | tristate "BCMA bus GBit core support" |
| 133 | depends on BCMA_HOST_SOC && HAS_DMA | 133 | depends on BCMA_HOST_SOC && HAS_DMA |
| 134 | select PHYLIB | ||
| 134 | ---help--- | 135 | ---help--- |
| 135 | This driver supports GBit MAC and BCM4706 GBit MAC cores on BCMA bus. | 136 | This driver supports GBit MAC and BCM4706 GBit MAC cores on BCMA bus. |
| 136 | They can be found on BCM47xx SoCs and provide gigabit ethernet. | 137 | They can be found on BCM47xx SoCs and provide gigabit ethernet. |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h index dedbd76c033e..d80e34b8285f 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h | |||
| @@ -486,7 +486,7 @@ struct bnx2x_fastpath { | |||
| 486 | 486 | ||
| 487 | struct napi_struct napi; | 487 | struct napi_struct napi; |
| 488 | 488 | ||
| 489 | #ifdef CONFIG_NET_LL_RX_POLL | 489 | #ifdef CONFIG_NET_RX_BUSY_POLL |
| 490 | unsigned int state; | 490 | unsigned int state; |
| 491 | #define BNX2X_FP_STATE_IDLE 0 | 491 | #define BNX2X_FP_STATE_IDLE 0 |
| 492 | #define BNX2X_FP_STATE_NAPI (1 << 0) /* NAPI owns this FP */ | 492 | #define BNX2X_FP_STATE_NAPI (1 << 0) /* NAPI owns this FP */ |
| @@ -498,7 +498,7 @@ struct bnx2x_fastpath { | |||
| 498 | #define BNX2X_FP_USER_PEND (BNX2X_FP_STATE_POLL | BNX2X_FP_STATE_POLL_YIELD) | 498 | #define BNX2X_FP_USER_PEND (BNX2X_FP_STATE_POLL | BNX2X_FP_STATE_POLL_YIELD) |
| 499 | /* protect state */ | 499 | /* protect state */ |
| 500 | spinlock_t lock; | 500 | spinlock_t lock; |
| 501 | #endif /* CONFIG_NET_LL_RX_POLL */ | 501 | #endif /* CONFIG_NET_RX_BUSY_POLL */ |
| 502 | 502 | ||
| 503 | union host_hc_status_block status_blk; | 503 | union host_hc_status_block status_blk; |
| 504 | /* chip independent shortcuts into sb structure */ | 504 | /* chip independent shortcuts into sb structure */ |
| @@ -572,7 +572,7 @@ struct bnx2x_fastpath { | |||
| 572 | #define bnx2x_fp_stats(bp, fp) (&((bp)->fp_stats[(fp)->index])) | 572 | #define bnx2x_fp_stats(bp, fp) (&((bp)->fp_stats[(fp)->index])) |
| 573 | #define bnx2x_fp_qstats(bp, fp) (&((bp)->fp_stats[(fp)->index].eth_q_stats)) | 573 | #define bnx2x_fp_qstats(bp, fp) (&((bp)->fp_stats[(fp)->index].eth_q_stats)) |
| 574 | 574 | ||
| 575 | #ifdef CONFIG_NET_LL_RX_POLL | 575 | #ifdef CONFIG_NET_RX_BUSY_POLL |
| 576 | static inline void bnx2x_fp_init_lock(struct bnx2x_fastpath *fp) | 576 | static inline void bnx2x_fp_init_lock(struct bnx2x_fastpath *fp) |
| 577 | { | 577 | { |
| 578 | spin_lock_init(&fp->lock); | 578 | spin_lock_init(&fp->lock); |
| @@ -680,7 +680,7 @@ static inline bool bnx2x_fp_ll_polling(struct bnx2x_fastpath *fp) | |||
| 680 | { | 680 | { |
| 681 | return false; | 681 | return false; |
| 682 | } | 682 | } |
| 683 | #endif /* CONFIG_NET_LL_RX_POLL */ | 683 | #endif /* CONFIG_NET_RX_BUSY_POLL */ |
| 684 | 684 | ||
| 685 | /* Use 2500 as a mini-jumbo MTU for FCoE */ | 685 | /* Use 2500 as a mini-jumbo MTU for FCoE */ |
| 686 | #define BNX2X_FCOE_MINI_JUMBO_MTU 2500 | 686 | #define BNX2X_FCOE_MINI_JUMBO_MTU 2500 |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c index ee350bde1818..f2d1ff10054b 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c | |||
| @@ -3117,7 +3117,7 @@ int bnx2x_poll(struct napi_struct *napi, int budget) | |||
| 3117 | return work_done; | 3117 | return work_done; |
| 3118 | } | 3118 | } |
| 3119 | 3119 | ||
| 3120 | #ifdef CONFIG_NET_LL_RX_POLL | 3120 | #ifdef CONFIG_NET_RX_BUSY_POLL |
| 3121 | /* must be called with local_bh_disable()d */ | 3121 | /* must be called with local_bh_disable()d */ |
| 3122 | int bnx2x_low_latency_recv(struct napi_struct *napi) | 3122 | int bnx2x_low_latency_recv(struct napi_struct *napi) |
| 3123 | { | 3123 | { |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c index e5da07858a2f..e06186c305d8 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c | |||
| @@ -12026,7 +12026,7 @@ static const struct net_device_ops bnx2x_netdev_ops = { | |||
| 12026 | .ndo_fcoe_get_wwn = bnx2x_fcoe_get_wwn, | 12026 | .ndo_fcoe_get_wwn = bnx2x_fcoe_get_wwn, |
| 12027 | #endif | 12027 | #endif |
| 12028 | 12028 | ||
| 12029 | #ifdef CONFIG_NET_LL_RX_POLL | 12029 | #ifdef CONFIG_NET_RX_BUSY_POLL |
| 12030 | .ndo_busy_poll = bnx2x_low_latency_recv, | 12030 | .ndo_busy_poll = bnx2x_low_latency_recv, |
| 12031 | #endif | 12031 | #endif |
| 12032 | }; | 12032 | }; |
diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c index d964f302ac94..ddebc7a5dda0 100644 --- a/drivers/net/ethernet/broadcom/tg3.c +++ b/drivers/net/ethernet/broadcom/tg3.c | |||
| @@ -17625,7 +17625,8 @@ err_out_free_res: | |||
| 17625 | pci_release_regions(pdev); | 17625 | pci_release_regions(pdev); |
| 17626 | 17626 | ||
| 17627 | err_out_disable_pdev: | 17627 | err_out_disable_pdev: |
| 17628 | pci_disable_device(pdev); | 17628 | if (pci_is_enabled(pdev)) |
| 17629 | pci_disable_device(pdev); | ||
| 17629 | pci_set_drvdata(pdev, NULL); | 17630 | pci_set_drvdata(pdev, NULL); |
| 17630 | return err; | 17631 | return err; |
| 17631 | } | 17632 | } |
| @@ -17773,7 +17774,8 @@ static pci_ers_result_t tg3_io_error_detected(struct pci_dev *pdev, | |||
| 17773 | 17774 | ||
| 17774 | rtnl_lock(); | 17775 | rtnl_lock(); |
| 17775 | 17776 | ||
| 17776 | if (!netif_running(netdev)) | 17777 | /* We probably don't have netdev yet */ |
| 17778 | if (!netdev || !netif_running(netdev)) | ||
| 17777 | goto done; | 17779 | goto done; |
| 17778 | 17780 | ||
| 17779 | tg3_phy_stop(tp); | 17781 | tg3_phy_stop(tp); |
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c index 2df48bb0f1ca..181edb522450 100644 --- a/drivers/net/ethernet/emulex/benet/be_main.c +++ b/drivers/net/ethernet/emulex/benet/be_main.c | |||
| @@ -782,16 +782,22 @@ static struct sk_buff *be_insert_vlan_in_pkt(struct be_adapter *adapter, | |||
| 782 | 782 | ||
| 783 | if (vlan_tx_tag_present(skb)) | 783 | if (vlan_tx_tag_present(skb)) |
| 784 | vlan_tag = be_get_tx_vlan_tag(adapter, skb); | 784 | vlan_tag = be_get_tx_vlan_tag(adapter, skb); |
| 785 | else if (qnq_async_evt_rcvd(adapter) && adapter->pvid) | 785 | |
| 786 | vlan_tag = adapter->pvid; | 786 | if (qnq_async_evt_rcvd(adapter) && adapter->pvid) { |
| 787 | if (!vlan_tag) | ||
| 788 | vlan_tag = adapter->pvid; | ||
| 789 | /* f/w workaround to set skip_hw_vlan = 1, informs the F/W to | ||
| 790 | * skip VLAN insertion | ||
| 791 | */ | ||
| 792 | if (skip_hw_vlan) | ||
| 793 | *skip_hw_vlan = true; | ||
| 794 | } | ||
| 787 | 795 | ||
| 788 | if (vlan_tag) { | 796 | if (vlan_tag) { |
| 789 | skb = __vlan_put_tag(skb, htons(ETH_P_8021Q), vlan_tag); | 797 | skb = __vlan_put_tag(skb, htons(ETH_P_8021Q), vlan_tag); |
| 790 | if (unlikely(!skb)) | 798 | if (unlikely(!skb)) |
| 791 | return skb; | 799 | return skb; |
| 792 | skb->vlan_tci = 0; | 800 | skb->vlan_tci = 0; |
| 793 | if (skip_hw_vlan) | ||
| 794 | *skip_hw_vlan = true; | ||
| 795 | } | 801 | } |
| 796 | 802 | ||
| 797 | /* Insert the outer VLAN, if any */ | 803 | /* Insert the outer VLAN, if any */ |
diff --git a/drivers/net/ethernet/freescale/fec.h b/drivers/net/ethernet/freescale/fec.h index 2b0a0ea4f8e7..ae236009f1a8 100644 --- a/drivers/net/ethernet/freescale/fec.h +++ b/drivers/net/ethernet/freescale/fec.h | |||
| @@ -259,6 +259,7 @@ struct bufdesc_ex { | |||
| 259 | struct fec_enet_delayed_work { | 259 | struct fec_enet_delayed_work { |
| 260 | struct delayed_work delay_work; | 260 | struct delayed_work delay_work; |
| 261 | bool timeout; | 261 | bool timeout; |
| 262 | bool trig_tx; | ||
| 262 | }; | 263 | }; |
| 263 | 264 | ||
| 264 | /* The FEC buffer descriptors track the ring buffers. The rx_bd_base and | 265 | /* The FEC buffer descriptors track the ring buffers. The rx_bd_base and |
diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c index d3ad5ea711d3..77ea0db0bbfc 100644 --- a/drivers/net/ethernet/freescale/fec_main.c +++ b/drivers/net/ethernet/freescale/fec_main.c | |||
| @@ -93,6 +93,20 @@ static void set_multicast_list(struct net_device *ndev); | |||
| 93 | #define FEC_QUIRK_HAS_CSUM (1 << 5) | 93 | #define FEC_QUIRK_HAS_CSUM (1 << 5) |
| 94 | /* Controller has hardware vlan support */ | 94 | /* Controller has hardware vlan support */ |
| 95 | #define FEC_QUIRK_HAS_VLAN (1 << 6) | 95 | #define FEC_QUIRK_HAS_VLAN (1 << 6) |
| 96 | /* ENET IP errata ERR006358 | ||
| 97 | * | ||
| 98 | * If the ready bit in the transmit buffer descriptor (TxBD[R]) is previously | ||
| 99 | * detected as not set during a prior frame transmission, then the | ||
| 100 | * ENET_TDAR[TDAR] bit is cleared at a later time, even if additional TxBDs | ||
| 101 | * were added to the ring and the ENET_TDAR[TDAR] bit is set. This results in | ||
| 102 | * If the ready bit in the transmit buffer descriptor (TxBD[R]) is previously | ||
| 103 | * detected as not set during a prior frame transmission, then the | ||
| 104 | * ENET_TDAR[TDAR] bit is cleared at a later time, even if additional TxBDs | ||
| 105 | * were added to the ring and the ENET_TDAR[TDAR] bit is set. This results in | ||
| 106 | * frames not being transmitted until there is a 0-to-1 transition on | ||
| 107 | * ENET_TDAR[TDAR]. | ||
| 108 | */ | ||
| 109 | #define FEC_QUIRK_ERR006358 (1 << 7) | ||
| 96 | 110 | ||
| 97 | static struct platform_device_id fec_devtype[] = { | 111 | static struct platform_device_id fec_devtype[] = { |
| 98 | { | 112 | { |
| @@ -112,7 +126,7 @@ static struct platform_device_id fec_devtype[] = { | |||
| 112 | .name = "imx6q-fec", | 126 | .name = "imx6q-fec", |
| 113 | .driver_data = FEC_QUIRK_ENET_MAC | FEC_QUIRK_HAS_GBIT | | 127 | .driver_data = FEC_QUIRK_ENET_MAC | FEC_QUIRK_HAS_GBIT | |
| 114 | FEC_QUIRK_HAS_BUFDESC_EX | FEC_QUIRK_HAS_CSUM | | 128 | FEC_QUIRK_HAS_BUFDESC_EX | FEC_QUIRK_HAS_CSUM | |
| 115 | FEC_QUIRK_HAS_VLAN, | 129 | FEC_QUIRK_HAS_VLAN | FEC_QUIRK_ERR006358, |
| 116 | }, { | 130 | }, { |
| 117 | .name = "mvf600-fec", | 131 | .name = "mvf600-fec", |
| 118 | .driver_data = FEC_QUIRK_ENET_MAC, | 132 | .driver_data = FEC_QUIRK_ENET_MAC, |
| @@ -275,16 +289,11 @@ fec_enet_start_xmit(struct sk_buff *skb, struct net_device *ndev) | |||
| 275 | struct fec_enet_private *fep = netdev_priv(ndev); | 289 | struct fec_enet_private *fep = netdev_priv(ndev); |
| 276 | const struct platform_device_id *id_entry = | 290 | const struct platform_device_id *id_entry = |
| 277 | platform_get_device_id(fep->pdev); | 291 | platform_get_device_id(fep->pdev); |
| 278 | struct bufdesc *bdp; | 292 | struct bufdesc *bdp, *bdp_pre; |
| 279 | void *bufaddr; | 293 | void *bufaddr; |
| 280 | unsigned short status; | 294 | unsigned short status; |
| 281 | unsigned int index; | 295 | unsigned int index; |
| 282 | 296 | ||
| 283 | if (!fep->link) { | ||
| 284 | /* Link is down or auto-negotiation is in progress. */ | ||
| 285 | return NETDEV_TX_BUSY; | ||
| 286 | } | ||
| 287 | |||
| 288 | /* Fill in a Tx ring entry */ | 297 | /* Fill in a Tx ring entry */ |
| 289 | bdp = fep->cur_tx; | 298 | bdp = fep->cur_tx; |
| 290 | 299 | ||
| @@ -370,6 +379,15 @@ fec_enet_start_xmit(struct sk_buff *skb, struct net_device *ndev) | |||
| 370 | ebdp->cbd_esc |= BD_ENET_TX_PINS; | 379 | ebdp->cbd_esc |= BD_ENET_TX_PINS; |
| 371 | } | 380 | } |
| 372 | } | 381 | } |
| 382 | |||
| 383 | bdp_pre = fec_enet_get_prevdesc(bdp, fep->bufdesc_ex); | ||
| 384 | if ((id_entry->driver_data & FEC_QUIRK_ERR006358) && | ||
| 385 | !(bdp_pre->cbd_sc & BD_ENET_TX_READY)) { | ||
| 386 | fep->delay_work.trig_tx = true; | ||
| 387 | schedule_delayed_work(&(fep->delay_work.delay_work), | ||
| 388 | msecs_to_jiffies(1)); | ||
| 389 | } | ||
| 390 | |||
| 373 | /* If this was the last BD in the ring, start at the beginning again. */ | 391 | /* If this was the last BD in the ring, start at the beginning again. */ |
| 374 | if (status & BD_ENET_TX_WRAP) | 392 | if (status & BD_ENET_TX_WRAP) |
| 375 | bdp = fep->tx_bd_base; | 393 | bdp = fep->tx_bd_base; |
| @@ -689,6 +707,11 @@ static void fec_enet_work(struct work_struct *work) | |||
| 689 | fec_restart(fep->netdev, fep->full_duplex); | 707 | fec_restart(fep->netdev, fep->full_duplex); |
| 690 | netif_wake_queue(fep->netdev); | 708 | netif_wake_queue(fep->netdev); |
| 691 | } | 709 | } |
| 710 | |||
| 711 | if (fep->delay_work.trig_tx) { | ||
| 712 | fep->delay_work.trig_tx = false; | ||
| 713 | writel(0, fep->hwp + FEC_X_DES_ACTIVE); | ||
| 714 | } | ||
| 692 | } | 715 | } |
| 693 | 716 | ||
| 694 | static void | 717 | static void |
| @@ -2279,4 +2302,5 @@ static struct platform_driver fec_driver = { | |||
| 2279 | 2302 | ||
| 2280 | module_platform_driver(fec_driver); | 2303 | module_platform_driver(fec_driver); |
| 2281 | 2304 | ||
| 2305 | MODULE_ALIAS("platform:"DRIVER_NAME); | ||
| 2282 | MODULE_LICENSE("GPL"); | 2306 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c index 6a0c1b66ce54..c1d72c03cb59 100644 --- a/drivers/net/ethernet/intel/igb/igb_main.c +++ b/drivers/net/ethernet/intel/igb/igb_main.c | |||
| @@ -3739,9 +3739,8 @@ static void igb_set_rx_mode(struct net_device *netdev) | |||
| 3739 | rctl &= ~(E1000_RCTL_UPE | E1000_RCTL_MPE | E1000_RCTL_VFE); | 3739 | rctl &= ~(E1000_RCTL_UPE | E1000_RCTL_MPE | E1000_RCTL_VFE); |
| 3740 | 3740 | ||
| 3741 | if (netdev->flags & IFF_PROMISC) { | 3741 | if (netdev->flags & IFF_PROMISC) { |
| 3742 | u32 mrqc = rd32(E1000_MRQC); | ||
| 3743 | /* retain VLAN HW filtering if in VT mode */ | 3742 | /* retain VLAN HW filtering if in VT mode */ |
| 3744 | if (mrqc & E1000_MRQC_ENABLE_VMDQ) | 3743 | if (adapter->vfs_allocated_count) |
| 3745 | rctl |= E1000_RCTL_VFE; | 3744 | rctl |= E1000_RCTL_VFE; |
| 3746 | rctl |= (E1000_RCTL_UPE | E1000_RCTL_MPE); | 3745 | rctl |= (E1000_RCTL_UPE | E1000_RCTL_MPE); |
| 3747 | vmolr |= (E1000_VMOLR_ROPE | E1000_VMOLR_MPME); | 3746 | vmolr |= (E1000_VMOLR_ROPE | E1000_VMOLR_MPME); |
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe.h b/drivers/net/ethernet/intel/ixgbe/ixgbe.h index 7be725cdfea8..a6494e5daffe 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe.h +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe.h | |||
| @@ -54,7 +54,7 @@ | |||
| 54 | 54 | ||
| 55 | #include <net/busy_poll.h> | 55 | #include <net/busy_poll.h> |
| 56 | 56 | ||
| 57 | #ifdef CONFIG_NET_LL_RX_POLL | 57 | #ifdef CONFIG_NET_RX_BUSY_POLL |
| 58 | #define LL_EXTENDED_STATS | 58 | #define LL_EXTENDED_STATS |
| 59 | #endif | 59 | #endif |
| 60 | /* common prefix used by pr_<> macros */ | 60 | /* common prefix used by pr_<> macros */ |
| @@ -366,7 +366,7 @@ struct ixgbe_q_vector { | |||
| 366 | struct rcu_head rcu; /* to avoid race with update stats on free */ | 366 | struct rcu_head rcu; /* to avoid race with update stats on free */ |
| 367 | char name[IFNAMSIZ + 9]; | 367 | char name[IFNAMSIZ + 9]; |
| 368 | 368 | ||
| 369 | #ifdef CONFIG_NET_LL_RX_POLL | 369 | #ifdef CONFIG_NET_RX_BUSY_POLL |
| 370 | unsigned int state; | 370 | unsigned int state; |
| 371 | #define IXGBE_QV_STATE_IDLE 0 | 371 | #define IXGBE_QV_STATE_IDLE 0 |
| 372 | #define IXGBE_QV_STATE_NAPI 1 /* NAPI owns this QV */ | 372 | #define IXGBE_QV_STATE_NAPI 1 /* NAPI owns this QV */ |
| @@ -377,12 +377,12 @@ struct ixgbe_q_vector { | |||
| 377 | #define IXGBE_QV_YIELD (IXGBE_QV_STATE_NAPI_YIELD | IXGBE_QV_STATE_POLL_YIELD) | 377 | #define IXGBE_QV_YIELD (IXGBE_QV_STATE_NAPI_YIELD | IXGBE_QV_STATE_POLL_YIELD) |
| 378 | #define IXGBE_QV_USER_PEND (IXGBE_QV_STATE_POLL | IXGBE_QV_STATE_POLL_YIELD) | 378 | #define IXGBE_QV_USER_PEND (IXGBE_QV_STATE_POLL | IXGBE_QV_STATE_POLL_YIELD) |
| 379 | spinlock_t lock; | 379 | spinlock_t lock; |
| 380 | #endif /* CONFIG_NET_LL_RX_POLL */ | 380 | #endif /* CONFIG_NET_RX_BUSY_POLL */ |
| 381 | 381 | ||
| 382 | /* for dynamic allocation of rings associated with this q_vector */ | 382 | /* for dynamic allocation of rings associated with this q_vector */ |
| 383 | struct ixgbe_ring ring[0] ____cacheline_internodealigned_in_smp; | 383 | struct ixgbe_ring ring[0] ____cacheline_internodealigned_in_smp; |
| 384 | }; | 384 | }; |
| 385 | #ifdef CONFIG_NET_LL_RX_POLL | 385 | #ifdef CONFIG_NET_RX_BUSY_POLL |
| 386 | static inline void ixgbe_qv_init_lock(struct ixgbe_q_vector *q_vector) | 386 | static inline void ixgbe_qv_init_lock(struct ixgbe_q_vector *q_vector) |
| 387 | { | 387 | { |
| 388 | 388 | ||
| @@ -462,7 +462,7 @@ static inline bool ixgbe_qv_ll_polling(struct ixgbe_q_vector *q_vector) | |||
| 462 | WARN_ON(!(q_vector->state & IXGBE_QV_LOCKED)); | 462 | WARN_ON(!(q_vector->state & IXGBE_QV_LOCKED)); |
| 463 | return q_vector->state & IXGBE_QV_USER_PEND; | 463 | return q_vector->state & IXGBE_QV_USER_PEND; |
| 464 | } | 464 | } |
| 465 | #else /* CONFIG_NET_LL_RX_POLL */ | 465 | #else /* CONFIG_NET_RX_BUSY_POLL */ |
| 466 | static inline void ixgbe_qv_init_lock(struct ixgbe_q_vector *q_vector) | 466 | static inline void ixgbe_qv_init_lock(struct ixgbe_q_vector *q_vector) |
| 467 | { | 467 | { |
| 468 | } | 468 | } |
| @@ -491,7 +491,7 @@ static inline bool ixgbe_qv_ll_polling(struct ixgbe_q_vector *q_vector) | |||
| 491 | { | 491 | { |
| 492 | return false; | 492 | return false; |
| 493 | } | 493 | } |
| 494 | #endif /* CONFIG_NET_LL_RX_POLL */ | 494 | #endif /* CONFIG_NET_RX_BUSY_POLL */ |
| 495 | 495 | ||
| 496 | #ifdef CONFIG_IXGBE_HWMON | 496 | #ifdef CONFIG_IXGBE_HWMON |
| 497 | 497 | ||
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_dcb_82598.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_dcb_82598.c index ac780770863d..7a77f37a7cbc 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_dcb_82598.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_dcb_82598.c | |||
| @@ -108,9 +108,8 @@ s32 ixgbe_dcb_config_tx_desc_arbiter_82598(struct ixgbe_hw *hw, | |||
| 108 | 108 | ||
| 109 | /* Enable arbiter */ | 109 | /* Enable arbiter */ |
| 110 | reg &= ~IXGBE_DPMCS_ARBDIS; | 110 | reg &= ~IXGBE_DPMCS_ARBDIS; |
| 111 | /* Enable DFP and Recycle mode */ | ||
| 112 | reg |= (IXGBE_DPMCS_TDPAC | IXGBE_DPMCS_TRM); | ||
| 113 | reg |= IXGBE_DPMCS_TSOEF; | 111 | reg |= IXGBE_DPMCS_TSOEF; |
| 112 | |||
| 114 | /* Configure Max TSO packet size 34KB including payload and headers */ | 113 | /* Configure Max TSO packet size 34KB including payload and headers */ |
| 115 | reg |= (0x4 << IXGBE_DPMCS_MTSOS_SHIFT); | 114 | reg |= (0x4 << IXGBE_DPMCS_MTSOS_SHIFT); |
| 116 | 115 | ||
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c index bad8f14b1941..be4b1fb3d0d2 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | |||
| @@ -1998,7 +1998,7 @@ static int ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector, | |||
| 1998 | return total_rx_packets; | 1998 | return total_rx_packets; |
| 1999 | } | 1999 | } |
| 2000 | 2000 | ||
| 2001 | #ifdef CONFIG_NET_LL_RX_POLL | 2001 | #ifdef CONFIG_NET_RX_BUSY_POLL |
| 2002 | /* must be called with local_bh_disable()d */ | 2002 | /* must be called with local_bh_disable()d */ |
| 2003 | static int ixgbe_low_latency_recv(struct napi_struct *napi) | 2003 | static int ixgbe_low_latency_recv(struct napi_struct *napi) |
| 2004 | { | 2004 | { |
| @@ -2030,7 +2030,7 @@ static int ixgbe_low_latency_recv(struct napi_struct *napi) | |||
| 2030 | 2030 | ||
| 2031 | return found; | 2031 | return found; |
| 2032 | } | 2032 | } |
| 2033 | #endif /* CONFIG_NET_LL_RX_POLL */ | 2033 | #endif /* CONFIG_NET_RX_BUSY_POLL */ |
| 2034 | 2034 | ||
| 2035 | /** | 2035 | /** |
| 2036 | * ixgbe_configure_msix - Configure MSI-X hardware | 2036 | * ixgbe_configure_msix - Configure MSI-X hardware |
| @@ -7227,7 +7227,7 @@ static const struct net_device_ops ixgbe_netdev_ops = { | |||
| 7227 | #ifdef CONFIG_NET_POLL_CONTROLLER | 7227 | #ifdef CONFIG_NET_POLL_CONTROLLER |
| 7228 | .ndo_poll_controller = ixgbe_netpoll, | 7228 | .ndo_poll_controller = ixgbe_netpoll, |
| 7229 | #endif | 7229 | #endif |
| 7230 | #ifdef CONFIG_NET_LL_RX_POLL | 7230 | #ifdef CONFIG_NET_RX_BUSY_POLL |
| 7231 | .ndo_busy_poll = ixgbe_low_latency_recv, | 7231 | .ndo_busy_poll = ixgbe_low_latency_recv, |
| 7232 | #endif | 7232 | #endif |
| 7233 | #ifdef IXGBE_FCOE | 7233 | #ifdef IXGBE_FCOE |
diff --git a/drivers/net/ethernet/marvell/mvneta.c b/drivers/net/ethernet/marvell/mvneta.c index 712779fb12b7..b017818bccae 100644 --- a/drivers/net/ethernet/marvell/mvneta.c +++ b/drivers/net/ethernet/marvell/mvneta.c | |||
| @@ -88,6 +88,8 @@ | |||
| 88 | #define MVNETA_TX_IN_PRGRS BIT(1) | 88 | #define MVNETA_TX_IN_PRGRS BIT(1) |
| 89 | #define MVNETA_TX_FIFO_EMPTY BIT(8) | 89 | #define MVNETA_TX_FIFO_EMPTY BIT(8) |
| 90 | #define MVNETA_RX_MIN_FRAME_SIZE 0x247c | 90 | #define MVNETA_RX_MIN_FRAME_SIZE 0x247c |
| 91 | #define MVNETA_SGMII_SERDES_CFG 0x24A0 | ||
| 92 | #define MVNETA_SGMII_SERDES_PROTO 0x0cc7 | ||
| 91 | #define MVNETA_TYPE_PRIO 0x24bc | 93 | #define MVNETA_TYPE_PRIO 0x24bc |
| 92 | #define MVNETA_FORCE_UNI BIT(21) | 94 | #define MVNETA_FORCE_UNI BIT(21) |
| 93 | #define MVNETA_TXQ_CMD_1 0x24e4 | 95 | #define MVNETA_TXQ_CMD_1 0x24e4 |
| @@ -655,6 +657,8 @@ static void mvneta_port_sgmii_config(struct mvneta_port *pp) | |||
| 655 | val = mvreg_read(pp, MVNETA_GMAC_CTRL_2); | 657 | val = mvreg_read(pp, MVNETA_GMAC_CTRL_2); |
| 656 | val |= MVNETA_GMAC2_PSC_ENABLE; | 658 | val |= MVNETA_GMAC2_PSC_ENABLE; |
| 657 | mvreg_write(pp, MVNETA_GMAC_CTRL_2, val); | 659 | mvreg_write(pp, MVNETA_GMAC_CTRL_2, val); |
| 660 | |||
| 661 | mvreg_write(pp, MVNETA_SGMII_SERDES_CFG, MVNETA_SGMII_SERDES_PROTO); | ||
| 658 | } | 662 | } |
| 659 | 663 | ||
| 660 | /* Start the Ethernet port RX and TX activity */ | 664 | /* Start the Ethernet port RX and TX activity */ |
| @@ -2728,28 +2732,24 @@ static int mvneta_probe(struct platform_device *pdev) | |||
| 2728 | 2732 | ||
| 2729 | pp = netdev_priv(dev); | 2733 | pp = netdev_priv(dev); |
| 2730 | 2734 | ||
| 2731 | pp->tx_done_timer.function = mvneta_tx_done_timer_callback; | ||
| 2732 | init_timer(&pp->tx_done_timer); | ||
| 2733 | clear_bit(MVNETA_F_TX_DONE_TIMER_BIT, &pp->flags); | ||
| 2734 | |||
| 2735 | pp->weight = MVNETA_RX_POLL_WEIGHT; | 2735 | pp->weight = MVNETA_RX_POLL_WEIGHT; |
| 2736 | pp->phy_node = phy_node; | 2736 | pp->phy_node = phy_node; |
| 2737 | pp->phy_interface = phy_mode; | 2737 | pp->phy_interface = phy_mode; |
| 2738 | 2738 | ||
| 2739 | pp->base = of_iomap(dn, 0); | ||
| 2740 | if (pp->base == NULL) { | ||
| 2741 | err = -ENOMEM; | ||
| 2742 | goto err_free_irq; | ||
| 2743 | } | ||
| 2744 | |||
| 2745 | pp->clk = devm_clk_get(&pdev->dev, NULL); | 2739 | pp->clk = devm_clk_get(&pdev->dev, NULL); |
| 2746 | if (IS_ERR(pp->clk)) { | 2740 | if (IS_ERR(pp->clk)) { |
| 2747 | err = PTR_ERR(pp->clk); | 2741 | err = PTR_ERR(pp->clk); |
| 2748 | goto err_unmap; | 2742 | goto err_free_irq; |
| 2749 | } | 2743 | } |
| 2750 | 2744 | ||
| 2751 | clk_prepare_enable(pp->clk); | 2745 | clk_prepare_enable(pp->clk); |
| 2752 | 2746 | ||
| 2747 | pp->base = of_iomap(dn, 0); | ||
| 2748 | if (pp->base == NULL) { | ||
| 2749 | err = -ENOMEM; | ||
| 2750 | goto err_clk; | ||
| 2751 | } | ||
| 2752 | |||
| 2753 | dt_mac_addr = of_get_mac_address(dn); | 2753 | dt_mac_addr = of_get_mac_address(dn); |
| 2754 | if (dt_mac_addr && is_valid_ether_addr(dt_mac_addr)) { | 2754 | if (dt_mac_addr && is_valid_ether_addr(dt_mac_addr)) { |
| 2755 | mac_from = "device tree"; | 2755 | mac_from = "device tree"; |
| @@ -2766,6 +2766,9 @@ static int mvneta_probe(struct platform_device *pdev) | |||
| 2766 | } | 2766 | } |
| 2767 | 2767 | ||
| 2768 | pp->tx_done_timer.data = (unsigned long)dev; | 2768 | pp->tx_done_timer.data = (unsigned long)dev; |
| 2769 | pp->tx_done_timer.function = mvneta_tx_done_timer_callback; | ||
| 2770 | init_timer(&pp->tx_done_timer); | ||
| 2771 | clear_bit(MVNETA_F_TX_DONE_TIMER_BIT, &pp->flags); | ||
| 2769 | 2772 | ||
| 2770 | pp->tx_ring_size = MVNETA_MAX_TXD; | 2773 | pp->tx_ring_size = MVNETA_MAX_TXD; |
| 2771 | pp->rx_ring_size = MVNETA_MAX_RXD; | 2774 | pp->rx_ring_size = MVNETA_MAX_RXD; |
| @@ -2776,7 +2779,7 @@ static int mvneta_probe(struct platform_device *pdev) | |||
| 2776 | err = mvneta_init(pp, phy_addr); | 2779 | err = mvneta_init(pp, phy_addr); |
| 2777 | if (err < 0) { | 2780 | if (err < 0) { |
| 2778 | dev_err(&pdev->dev, "can't init eth hal\n"); | 2781 | dev_err(&pdev->dev, "can't init eth hal\n"); |
| 2779 | goto err_clk; | 2782 | goto err_unmap; |
| 2780 | } | 2783 | } |
| 2781 | mvneta_port_power_up(pp, phy_mode); | 2784 | mvneta_port_power_up(pp, phy_mode); |
| 2782 | 2785 | ||
| @@ -2806,10 +2809,10 @@ static int mvneta_probe(struct platform_device *pdev) | |||
| 2806 | 2809 | ||
| 2807 | err_deinit: | 2810 | err_deinit: |
| 2808 | mvneta_deinit(pp); | 2811 | mvneta_deinit(pp); |
| 2809 | err_clk: | ||
| 2810 | clk_disable_unprepare(pp->clk); | ||
| 2811 | err_unmap: | 2812 | err_unmap: |
| 2812 | iounmap(pp->base); | 2813 | iounmap(pp->base); |
| 2814 | err_clk: | ||
| 2815 | clk_disable_unprepare(pp->clk); | ||
| 2813 | err_free_irq: | 2816 | err_free_irq: |
| 2814 | irq_dispose_mapping(dev->irq); | 2817 | irq_dispose_mapping(dev->irq); |
| 2815 | err_free_netdev: | 2818 | err_free_netdev: |
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c index 727874f575ce..a28cd801a236 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c | |||
| @@ -223,7 +223,7 @@ static int mlx4_en_get_sset_count(struct net_device *dev, int sset) | |||
| 223 | case ETH_SS_STATS: | 223 | case ETH_SS_STATS: |
| 224 | return (priv->stats_bitmap ? bit_count : NUM_ALL_STATS) + | 224 | return (priv->stats_bitmap ? bit_count : NUM_ALL_STATS) + |
| 225 | (priv->tx_ring_num * 2) + | 225 | (priv->tx_ring_num * 2) + |
| 226 | #ifdef CONFIG_NET_LL_RX_POLL | 226 | #ifdef CONFIG_NET_RX_BUSY_POLL |
| 227 | (priv->rx_ring_num * 5); | 227 | (priv->rx_ring_num * 5); |
| 228 | #else | 228 | #else |
| 229 | (priv->rx_ring_num * 2); | 229 | (priv->rx_ring_num * 2); |
| @@ -276,7 +276,7 @@ static void mlx4_en_get_ethtool_stats(struct net_device *dev, | |||
| 276 | for (i = 0; i < priv->rx_ring_num; i++) { | 276 | for (i = 0; i < priv->rx_ring_num; i++) { |
| 277 | data[index++] = priv->rx_ring[i].packets; | 277 | data[index++] = priv->rx_ring[i].packets; |
| 278 | data[index++] = priv->rx_ring[i].bytes; | 278 | data[index++] = priv->rx_ring[i].bytes; |
| 279 | #ifdef CONFIG_NET_LL_RX_POLL | 279 | #ifdef CONFIG_NET_RX_BUSY_POLL |
| 280 | data[index++] = priv->rx_ring[i].yields; | 280 | data[index++] = priv->rx_ring[i].yields; |
| 281 | data[index++] = priv->rx_ring[i].misses; | 281 | data[index++] = priv->rx_ring[i].misses; |
| 282 | data[index++] = priv->rx_ring[i].cleaned; | 282 | data[index++] = priv->rx_ring[i].cleaned; |
| @@ -344,7 +344,7 @@ static void mlx4_en_get_strings(struct net_device *dev, | |||
| 344 | "rx%d_packets", i); | 344 | "rx%d_packets", i); |
| 345 | sprintf(data + (index++) * ETH_GSTRING_LEN, | 345 | sprintf(data + (index++) * ETH_GSTRING_LEN, |
| 346 | "rx%d_bytes", i); | 346 | "rx%d_bytes", i); |
| 347 | #ifdef CONFIG_NET_LL_RX_POLL | 347 | #ifdef CONFIG_NET_RX_BUSY_POLL |
| 348 | sprintf(data + (index++) * ETH_GSTRING_LEN, | 348 | sprintf(data + (index++) * ETH_GSTRING_LEN, |
| 349 | "rx%d_napi_yield", i); | 349 | "rx%d_napi_yield", i); |
| 350 | sprintf(data + (index++) * ETH_GSTRING_LEN, | 350 | sprintf(data + (index++) * ETH_GSTRING_LEN, |
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c index 5eac871399d8..fa37b7a61213 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c | |||
| @@ -68,7 +68,7 @@ int mlx4_en_setup_tc(struct net_device *dev, u8 up) | |||
| 68 | return 0; | 68 | return 0; |
| 69 | } | 69 | } |
| 70 | 70 | ||
| 71 | #ifdef CONFIG_NET_LL_RX_POLL | 71 | #ifdef CONFIG_NET_RX_BUSY_POLL |
| 72 | /* must be called with local_bh_disable()d */ | 72 | /* must be called with local_bh_disable()d */ |
| 73 | static int mlx4_en_low_latency_recv(struct napi_struct *napi) | 73 | static int mlx4_en_low_latency_recv(struct napi_struct *napi) |
| 74 | { | 74 | { |
| @@ -94,7 +94,7 @@ static int mlx4_en_low_latency_recv(struct napi_struct *napi) | |||
| 94 | 94 | ||
| 95 | return done; | 95 | return done; |
| 96 | } | 96 | } |
| 97 | #endif /* CONFIG_NET_LL_RX_POLL */ | 97 | #endif /* CONFIG_NET_RX_BUSY_POLL */ |
| 98 | 98 | ||
| 99 | #ifdef CONFIG_RFS_ACCEL | 99 | #ifdef CONFIG_RFS_ACCEL |
| 100 | 100 | ||
| @@ -2140,7 +2140,7 @@ static const struct net_device_ops mlx4_netdev_ops = { | |||
| 2140 | #ifdef CONFIG_RFS_ACCEL | 2140 | #ifdef CONFIG_RFS_ACCEL |
| 2141 | .ndo_rx_flow_steer = mlx4_en_filter_rfs, | 2141 | .ndo_rx_flow_steer = mlx4_en_filter_rfs, |
| 2142 | #endif | 2142 | #endif |
| 2143 | #ifdef CONFIG_NET_LL_RX_POLL | 2143 | #ifdef CONFIG_NET_RX_BUSY_POLL |
| 2144 | .ndo_busy_poll = mlx4_en_low_latency_recv, | 2144 | .ndo_busy_poll = mlx4_en_low_latency_recv, |
| 2145 | #endif | 2145 | #endif |
| 2146 | }; | 2146 | }; |
diff --git a/drivers/net/ethernet/mellanox/mlx4/fw.c b/drivers/net/ethernet/mellanox/mlx4/fw.c index 8873d6802c80..6fc6dabc78d5 100644 --- a/drivers/net/ethernet/mellanox/mlx4/fw.c +++ b/drivers/net/ethernet/mellanox/mlx4/fw.c | |||
| @@ -845,16 +845,7 @@ int mlx4_QUERY_PORT_wrapper(struct mlx4_dev *dev, int slave, | |||
| 845 | MLX4_CMD_NATIVE); | 845 | MLX4_CMD_NATIVE); |
| 846 | 846 | ||
| 847 | if (!err && dev->caps.function != slave) { | 847 | if (!err && dev->caps.function != slave) { |
| 848 | /* if config MAC in DB use it */ | 848 | def_mac = priv->mfunc.master.vf_oper[slave].vport[vhcr->in_modifier].state.mac; |
| 849 | if (priv->mfunc.master.vf_oper[slave].vport[vhcr->in_modifier].state.mac) | ||
| 850 | def_mac = priv->mfunc.master.vf_oper[slave].vport[vhcr->in_modifier].state.mac; | ||
| 851 | else { | ||
| 852 | /* set slave default_mac address */ | ||
| 853 | MLX4_GET(def_mac, outbox->buf, QUERY_PORT_MAC_OFFSET); | ||
| 854 | def_mac += slave << 8; | ||
| 855 | priv->mfunc.master.vf_admin[slave].vport[vhcr->in_modifier].mac = def_mac; | ||
| 856 | } | ||
| 857 | |||
| 858 | MLX4_PUT(outbox->buf, def_mac, QUERY_PORT_MAC_OFFSET); | 849 | MLX4_PUT(outbox->buf, def_mac, QUERY_PORT_MAC_OFFSET); |
| 859 | 850 | ||
| 860 | /* get port type - currently only eth is enabled */ | 851 | /* get port type - currently only eth is enabled */ |
diff --git a/drivers/net/ethernet/mellanox/mlx4/main.c b/drivers/net/ethernet/mellanox/mlx4/main.c index e85af922dcdc..36be3208786a 100644 --- a/drivers/net/ethernet/mellanox/mlx4/main.c +++ b/drivers/net/ethernet/mellanox/mlx4/main.c | |||
| @@ -371,7 +371,7 @@ static int mlx4_dev_cap(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap) | |||
| 371 | 371 | ||
| 372 | dev->caps.sqp_demux = (mlx4_is_master(dev)) ? MLX4_MAX_NUM_SLAVES : 0; | 372 | dev->caps.sqp_demux = (mlx4_is_master(dev)) ? MLX4_MAX_NUM_SLAVES : 0; |
| 373 | 373 | ||
| 374 | if (!enable_64b_cqe_eqe) { | 374 | if (!enable_64b_cqe_eqe && !mlx4_is_slave(dev)) { |
| 375 | if (dev_cap->flags & | 375 | if (dev_cap->flags & |
| 376 | (MLX4_DEV_CAP_FLAG_64B_CQE | MLX4_DEV_CAP_FLAG_64B_EQE)) { | 376 | (MLX4_DEV_CAP_FLAG_64B_CQE | MLX4_DEV_CAP_FLAG_64B_EQE)) { |
| 377 | mlx4_warn(dev, "64B EQEs/CQEs supported by the device but not enabled\n"); | 377 | mlx4_warn(dev, "64B EQEs/CQEs supported by the device but not enabled\n"); |
diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h index 35fb60e2320c..5e0aa569306a 100644 --- a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h +++ b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h | |||
| @@ -292,7 +292,7 @@ struct mlx4_en_rx_ring { | |||
| 292 | void *rx_info; | 292 | void *rx_info; |
| 293 | unsigned long bytes; | 293 | unsigned long bytes; |
| 294 | unsigned long packets; | 294 | unsigned long packets; |
| 295 | #ifdef CONFIG_NET_LL_RX_POLL | 295 | #ifdef CONFIG_NET_RX_BUSY_POLL |
| 296 | unsigned long yields; | 296 | unsigned long yields; |
| 297 | unsigned long misses; | 297 | unsigned long misses; |
| 298 | unsigned long cleaned; | 298 | unsigned long cleaned; |
| @@ -318,7 +318,7 @@ struct mlx4_en_cq { | |||
| 318 | struct mlx4_cqe *buf; | 318 | struct mlx4_cqe *buf; |
| 319 | #define MLX4_EN_OPCODE_ERROR 0x1e | 319 | #define MLX4_EN_OPCODE_ERROR 0x1e |
| 320 | 320 | ||
| 321 | #ifdef CONFIG_NET_LL_RX_POLL | 321 | #ifdef CONFIG_NET_RX_BUSY_POLL |
| 322 | unsigned int state; | 322 | unsigned int state; |
| 323 | #define MLX4_EN_CQ_STATE_IDLE 0 | 323 | #define MLX4_EN_CQ_STATE_IDLE 0 |
| 324 | #define MLX4_EN_CQ_STATE_NAPI 1 /* NAPI owns this CQ */ | 324 | #define MLX4_EN_CQ_STATE_NAPI 1 /* NAPI owns this CQ */ |
| @@ -329,7 +329,7 @@ struct mlx4_en_cq { | |||
| 329 | #define CQ_YIELD (MLX4_EN_CQ_STATE_NAPI_YIELD | MLX4_EN_CQ_STATE_POLL_YIELD) | 329 | #define CQ_YIELD (MLX4_EN_CQ_STATE_NAPI_YIELD | MLX4_EN_CQ_STATE_POLL_YIELD) |
| 330 | #define CQ_USER_PEND (MLX4_EN_CQ_STATE_POLL | MLX4_EN_CQ_STATE_POLL_YIELD) | 330 | #define CQ_USER_PEND (MLX4_EN_CQ_STATE_POLL | MLX4_EN_CQ_STATE_POLL_YIELD) |
| 331 | spinlock_t poll_lock; /* protects from LLS/napi conflicts */ | 331 | spinlock_t poll_lock; /* protects from LLS/napi conflicts */ |
| 332 | #endif /* CONFIG_NET_LL_RX_POLL */ | 332 | #endif /* CONFIG_NET_RX_BUSY_POLL */ |
| 333 | }; | 333 | }; |
| 334 | 334 | ||
| 335 | struct mlx4_en_port_profile { | 335 | struct mlx4_en_port_profile { |
| @@ -580,7 +580,7 @@ struct mlx4_mac_entry { | |||
| 580 | struct rcu_head rcu; | 580 | struct rcu_head rcu; |
| 581 | }; | 581 | }; |
| 582 | 582 | ||
| 583 | #ifdef CONFIG_NET_LL_RX_POLL | 583 | #ifdef CONFIG_NET_RX_BUSY_POLL |
| 584 | static inline void mlx4_en_cq_init_lock(struct mlx4_en_cq *cq) | 584 | static inline void mlx4_en_cq_init_lock(struct mlx4_en_cq *cq) |
| 585 | { | 585 | { |
| 586 | spin_lock_init(&cq->poll_lock); | 586 | spin_lock_init(&cq->poll_lock); |
| @@ -687,7 +687,7 @@ static inline bool mlx4_en_cq_ll_polling(struct mlx4_en_cq *cq) | |||
| 687 | { | 687 | { |
| 688 | return false; | 688 | return false; |
| 689 | } | 689 | } |
| 690 | #endif /* CONFIG_NET_LL_RX_POLL */ | 690 | #endif /* CONFIG_NET_RX_BUSY_POLL */ |
| 691 | 691 | ||
| 692 | #define MLX4_EN_WOL_DO_MODIFY (1ULL << 63) | 692 | #define MLX4_EN_WOL_DO_MODIFY (1ULL << 63) |
| 693 | 693 | ||
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/cmd.c b/drivers/net/ethernet/mellanox/mlx5/core/cmd.c index 205753a04cfc..c571de85d0f9 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/cmd.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/cmd.c | |||
| @@ -46,7 +46,7 @@ | |||
| 46 | #include "mlx5_core.h" | 46 | #include "mlx5_core.h" |
| 47 | 47 | ||
| 48 | enum { | 48 | enum { |
| 49 | CMD_IF_REV = 3, | 49 | CMD_IF_REV = 4, |
| 50 | }; | 50 | }; |
| 51 | 51 | ||
| 52 | enum { | 52 | enum { |
| @@ -282,6 +282,12 @@ const char *mlx5_command_str(int command) | |||
| 282 | case MLX5_CMD_OP_TEARDOWN_HCA: | 282 | case MLX5_CMD_OP_TEARDOWN_HCA: |
| 283 | return "TEARDOWN_HCA"; | 283 | return "TEARDOWN_HCA"; |
| 284 | 284 | ||
| 285 | case MLX5_CMD_OP_ENABLE_HCA: | ||
| 286 | return "MLX5_CMD_OP_ENABLE_HCA"; | ||
| 287 | |||
| 288 | case MLX5_CMD_OP_DISABLE_HCA: | ||
| 289 | return "MLX5_CMD_OP_DISABLE_HCA"; | ||
| 290 | |||
| 285 | case MLX5_CMD_OP_QUERY_PAGES: | 291 | case MLX5_CMD_OP_QUERY_PAGES: |
| 286 | return "QUERY_PAGES"; | 292 | return "QUERY_PAGES"; |
| 287 | 293 | ||
| @@ -1113,7 +1119,13 @@ void mlx5_cmd_comp_handler(struct mlx5_core_dev *dev, unsigned long vector) | |||
| 1113 | 1119 | ||
| 1114 | for (i = 0; i < (1 << cmd->log_sz); i++) { | 1120 | for (i = 0; i < (1 << cmd->log_sz); i++) { |
| 1115 | if (test_bit(i, &vector)) { | 1121 | if (test_bit(i, &vector)) { |
| 1122 | struct semaphore *sem; | ||
| 1123 | |||
| 1116 | ent = cmd->ent_arr[i]; | 1124 | ent = cmd->ent_arr[i]; |
| 1125 | if (ent->page_queue) | ||
| 1126 | sem = &cmd->pages_sem; | ||
| 1127 | else | ||
| 1128 | sem = &cmd->sem; | ||
| 1117 | ktime_get_ts(&ent->ts2); | 1129 | ktime_get_ts(&ent->ts2); |
| 1118 | memcpy(ent->out->first.data, ent->lay->out, sizeof(ent->lay->out)); | 1130 | memcpy(ent->out->first.data, ent->lay->out, sizeof(ent->lay->out)); |
| 1119 | dump_command(dev, ent, 0); | 1131 | dump_command(dev, ent, 0); |
| @@ -1136,10 +1148,7 @@ void mlx5_cmd_comp_handler(struct mlx5_core_dev *dev, unsigned long vector) | |||
| 1136 | } else { | 1148 | } else { |
| 1137 | complete(&ent->done); | 1149 | complete(&ent->done); |
| 1138 | } | 1150 | } |
| 1139 | if (ent->page_queue) | 1151 | up(sem); |
| 1140 | up(&cmd->pages_sem); | ||
| 1141 | else | ||
| 1142 | up(&cmd->sem); | ||
| 1143 | } | 1152 | } |
| 1144 | } | 1153 | } |
| 1145 | } | 1154 | } |
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/debugfs.c b/drivers/net/ethernet/mellanox/mlx5/core/debugfs.c index 4273c06e2e96..9c7194b26ee2 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/debugfs.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/debugfs.c | |||
| @@ -156,7 +156,7 @@ static ssize_t average_read(struct file *filp, char __user *buf, size_t count, | |||
| 156 | stats = filp->private_data; | 156 | stats = filp->private_data; |
| 157 | spin_lock(&stats->lock); | 157 | spin_lock(&stats->lock); |
| 158 | if (stats->n) | 158 | if (stats->n) |
| 159 | field = stats->sum / stats->n; | 159 | field = div64_u64(stats->sum, stats->n); |
| 160 | spin_unlock(&stats->lock); | 160 | spin_unlock(&stats->lock); |
| 161 | ret = snprintf(tbuf, sizeof(tbuf), "%llu\n", field); | 161 | ret = snprintf(tbuf, sizeof(tbuf), "%llu\n", field); |
| 162 | if (ret > 0) { | 162 | if (ret > 0) { |
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/main.c b/drivers/net/ethernet/mellanox/mlx5/core/main.c index 12242de2b0e3..b47739b0b5f6 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/main.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/main.c | |||
| @@ -249,6 +249,44 @@ static int set_hca_ctrl(struct mlx5_core_dev *dev) | |||
| 249 | return err; | 249 | return err; |
| 250 | } | 250 | } |
| 251 | 251 | ||
| 252 | static int mlx5_core_enable_hca(struct mlx5_core_dev *dev) | ||
| 253 | { | ||
| 254 | int err; | ||
| 255 | struct mlx5_enable_hca_mbox_in in; | ||
| 256 | struct mlx5_enable_hca_mbox_out out; | ||
| 257 | |||
| 258 | memset(&in, 0, sizeof(in)); | ||
| 259 | memset(&out, 0, sizeof(out)); | ||
| 260 | in.hdr.opcode = cpu_to_be16(MLX5_CMD_OP_ENABLE_HCA); | ||
| 261 | err = mlx5_cmd_exec(dev, &in, sizeof(in), &out, sizeof(out)); | ||
| 262 | if (err) | ||
| 263 | return err; | ||
| 264 | |||
| 265 | if (out.hdr.status) | ||
| 266 | return mlx5_cmd_status_to_err(&out.hdr); | ||
| 267 | |||
| 268 | return 0; | ||
| 269 | } | ||
| 270 | |||
| 271 | static int mlx5_core_disable_hca(struct mlx5_core_dev *dev) | ||
| 272 | { | ||
| 273 | int err; | ||
| 274 | struct mlx5_disable_hca_mbox_in in; | ||
| 275 | struct mlx5_disable_hca_mbox_out out; | ||
| 276 | |||
| 277 | memset(&in, 0, sizeof(in)); | ||
| 278 | memset(&out, 0, sizeof(out)); | ||
| 279 | in.hdr.opcode = cpu_to_be16(MLX5_CMD_OP_DISABLE_HCA); | ||
| 280 | err = mlx5_cmd_exec(dev, &in, sizeof(in), &out, sizeof(out)); | ||
| 281 | if (err) | ||
| 282 | return err; | ||
| 283 | |||
| 284 | if (out.hdr.status) | ||
| 285 | return mlx5_cmd_status_to_err(&out.hdr); | ||
| 286 | |||
| 287 | return 0; | ||
| 288 | } | ||
| 289 | |||
| 252 | int mlx5_dev_init(struct mlx5_core_dev *dev, struct pci_dev *pdev) | 290 | int mlx5_dev_init(struct mlx5_core_dev *dev, struct pci_dev *pdev) |
| 253 | { | 291 | { |
| 254 | struct mlx5_priv *priv = &dev->priv; | 292 | struct mlx5_priv *priv = &dev->priv; |
| @@ -304,28 +342,41 @@ int mlx5_dev_init(struct mlx5_core_dev *dev, struct pci_dev *pdev) | |||
| 304 | } | 342 | } |
| 305 | 343 | ||
| 306 | mlx5_pagealloc_init(dev); | 344 | mlx5_pagealloc_init(dev); |
| 345 | |||
| 346 | err = mlx5_core_enable_hca(dev); | ||
| 347 | if (err) { | ||
| 348 | dev_err(&pdev->dev, "enable hca failed\n"); | ||
| 349 | goto err_pagealloc_cleanup; | ||
| 350 | } | ||
| 351 | |||
| 352 | err = mlx5_satisfy_startup_pages(dev, 1); | ||
| 353 | if (err) { | ||
| 354 | dev_err(&pdev->dev, "failed to allocate boot pages\n"); | ||
| 355 | goto err_disable_hca; | ||
| 356 | } | ||
| 357 | |||
| 307 | err = set_hca_ctrl(dev); | 358 | err = set_hca_ctrl(dev); |
| 308 | if (err) { | 359 | if (err) { |
| 309 | dev_err(&pdev->dev, "set_hca_ctrl failed\n"); | 360 | dev_err(&pdev->dev, "set_hca_ctrl failed\n"); |
| 310 | goto err_pagealloc_cleanup; | 361 | goto reclaim_boot_pages; |
| 311 | } | 362 | } |
| 312 | 363 | ||
| 313 | err = handle_hca_cap(dev); | 364 | err = handle_hca_cap(dev); |
| 314 | if (err) { | 365 | if (err) { |
| 315 | dev_err(&pdev->dev, "handle_hca_cap failed\n"); | 366 | dev_err(&pdev->dev, "handle_hca_cap failed\n"); |
| 316 | goto err_pagealloc_cleanup; | 367 | goto reclaim_boot_pages; |
| 317 | } | 368 | } |
| 318 | 369 | ||
| 319 | err = mlx5_satisfy_startup_pages(dev); | 370 | err = mlx5_satisfy_startup_pages(dev, 0); |
| 320 | if (err) { | 371 | if (err) { |
| 321 | dev_err(&pdev->dev, "failed to allocate startup pages\n"); | 372 | dev_err(&pdev->dev, "failed to allocate init pages\n"); |
| 322 | goto err_pagealloc_cleanup; | 373 | goto reclaim_boot_pages; |
| 323 | } | 374 | } |
| 324 | 375 | ||
| 325 | err = mlx5_pagealloc_start(dev); | 376 | err = mlx5_pagealloc_start(dev); |
| 326 | if (err) { | 377 | if (err) { |
| 327 | dev_err(&pdev->dev, "mlx5_pagealloc_start failed\n"); | 378 | dev_err(&pdev->dev, "mlx5_pagealloc_start failed\n"); |
| 328 | goto err_reclaim_pages; | 379 | goto reclaim_boot_pages; |
| 329 | } | 380 | } |
| 330 | 381 | ||
| 331 | err = mlx5_cmd_init_hca(dev); | 382 | err = mlx5_cmd_init_hca(dev); |
| @@ -396,9 +447,12 @@ err_stop_poll: | |||
| 396 | err_pagealloc_stop: | 447 | err_pagealloc_stop: |
| 397 | mlx5_pagealloc_stop(dev); | 448 | mlx5_pagealloc_stop(dev); |
| 398 | 449 | ||
| 399 | err_reclaim_pages: | 450 | reclaim_boot_pages: |
| 400 | mlx5_reclaim_startup_pages(dev); | 451 | mlx5_reclaim_startup_pages(dev); |
| 401 | 452 | ||
| 453 | err_disable_hca: | ||
| 454 | mlx5_core_disable_hca(dev); | ||
| 455 | |||
| 402 | err_pagealloc_cleanup: | 456 | err_pagealloc_cleanup: |
| 403 | mlx5_pagealloc_cleanup(dev); | 457 | mlx5_pagealloc_cleanup(dev); |
| 404 | mlx5_cmd_cleanup(dev); | 458 | mlx5_cmd_cleanup(dev); |
| @@ -434,6 +488,7 @@ void mlx5_dev_cleanup(struct mlx5_core_dev *dev) | |||
| 434 | mlx5_cmd_teardown_hca(dev); | 488 | mlx5_cmd_teardown_hca(dev); |
| 435 | mlx5_pagealloc_stop(dev); | 489 | mlx5_pagealloc_stop(dev); |
| 436 | mlx5_reclaim_startup_pages(dev); | 490 | mlx5_reclaim_startup_pages(dev); |
| 491 | mlx5_core_disable_hca(dev); | ||
| 437 | mlx5_pagealloc_cleanup(dev); | 492 | mlx5_pagealloc_cleanup(dev); |
| 438 | mlx5_cmd_cleanup(dev); | 493 | mlx5_cmd_cleanup(dev); |
| 439 | iounmap(dev->iseg); | 494 | iounmap(dev->iseg); |
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/pagealloc.c b/drivers/net/ethernet/mellanox/mlx5/core/pagealloc.c index f0bf46339b28..4a3e137931a3 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/pagealloc.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/pagealloc.c | |||
| @@ -64,7 +64,7 @@ struct mlx5_query_pages_inbox { | |||
| 64 | 64 | ||
| 65 | struct mlx5_query_pages_outbox { | 65 | struct mlx5_query_pages_outbox { |
| 66 | struct mlx5_outbox_hdr hdr; | 66 | struct mlx5_outbox_hdr hdr; |
| 67 | u8 reserved[2]; | 67 | __be16 num_boot_pages; |
| 68 | __be16 func_id; | 68 | __be16 func_id; |
| 69 | __be16 init_pages; | 69 | __be16 init_pages; |
| 70 | __be16 num_pages; | 70 | __be16 num_pages; |
| @@ -146,7 +146,7 @@ static struct page *remove_page(struct mlx5_core_dev *dev, u64 addr) | |||
| 146 | } | 146 | } |
| 147 | 147 | ||
| 148 | static int mlx5_cmd_query_pages(struct mlx5_core_dev *dev, u16 *func_id, | 148 | static int mlx5_cmd_query_pages(struct mlx5_core_dev *dev, u16 *func_id, |
| 149 | s16 *pages, s16 *init_pages) | 149 | s16 *pages, s16 *init_pages, u16 *boot_pages) |
| 150 | { | 150 | { |
| 151 | struct mlx5_query_pages_inbox in; | 151 | struct mlx5_query_pages_inbox in; |
| 152 | struct mlx5_query_pages_outbox out; | 152 | struct mlx5_query_pages_outbox out; |
| @@ -164,8 +164,13 @@ static int mlx5_cmd_query_pages(struct mlx5_core_dev *dev, u16 *func_id, | |||
| 164 | 164 | ||
| 165 | if (pages) | 165 | if (pages) |
| 166 | *pages = be16_to_cpu(out.num_pages); | 166 | *pages = be16_to_cpu(out.num_pages); |
| 167 | |||
| 167 | if (init_pages) | 168 | if (init_pages) |
| 168 | *init_pages = be16_to_cpu(out.init_pages); | 169 | *init_pages = be16_to_cpu(out.init_pages); |
| 170 | |||
| 171 | if (boot_pages) | ||
| 172 | *boot_pages = be16_to_cpu(out.num_boot_pages); | ||
| 173 | |||
| 169 | *func_id = be16_to_cpu(out.func_id); | 174 | *func_id = be16_to_cpu(out.func_id); |
| 170 | 175 | ||
| 171 | return err; | 176 | return err; |
| @@ -357,19 +362,22 @@ void mlx5_core_req_pages_handler(struct mlx5_core_dev *dev, u16 func_id, | |||
| 357 | queue_work(dev->priv.pg_wq, &req->work); | 362 | queue_work(dev->priv.pg_wq, &req->work); |
| 358 | } | 363 | } |
| 359 | 364 | ||
| 360 | int mlx5_satisfy_startup_pages(struct mlx5_core_dev *dev) | 365 | int mlx5_satisfy_startup_pages(struct mlx5_core_dev *dev, int boot) |
| 361 | { | 366 | { |
| 367 | u16 uninitialized_var(boot_pages); | ||
| 362 | s16 uninitialized_var(init_pages); | 368 | s16 uninitialized_var(init_pages); |
| 363 | u16 uninitialized_var(func_id); | 369 | u16 uninitialized_var(func_id); |
| 364 | int err; | 370 | int err; |
| 365 | 371 | ||
| 366 | err = mlx5_cmd_query_pages(dev, &func_id, NULL, &init_pages); | 372 | err = mlx5_cmd_query_pages(dev, &func_id, NULL, &init_pages, |
| 373 | &boot_pages); | ||
| 367 | if (err) | 374 | if (err) |
| 368 | return err; | 375 | return err; |
| 369 | 376 | ||
| 370 | mlx5_core_dbg(dev, "requested %d init pages for func_id 0x%x\n", init_pages, func_id); | ||
| 371 | 377 | ||
| 372 | return give_pages(dev, func_id, init_pages, 0); | 378 | mlx5_core_dbg(dev, "requested %d init pages and %d boot pages for func_id 0x%x\n", |
| 379 | init_pages, boot_pages, func_id); | ||
| 380 | return give_pages(dev, func_id, boot ? boot_pages : init_pages, 0); | ||
| 373 | } | 381 | } |
| 374 | 382 | ||
| 375 | static int optimal_reclaimed_pages(void) | 383 | static int optimal_reclaimed_pages(void) |
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/uar.c b/drivers/net/ethernet/mellanox/mlx5/core/uar.c index 71d4a3937200..68f5d9c77c7b 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/uar.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/uar.c | |||
| @@ -164,6 +164,7 @@ int mlx5_alloc_uuars(struct mlx5_core_dev *dev, struct mlx5_uuar_info *uuari) | |||
| 164 | uuari->uars[i].map = ioremap(addr, PAGE_SIZE); | 164 | uuari->uars[i].map = ioremap(addr, PAGE_SIZE); |
| 165 | if (!uuari->uars[i].map) { | 165 | if (!uuari->uars[i].map) { |
| 166 | mlx5_cmd_free_uar(dev, uuari->uars[i].index); | 166 | mlx5_cmd_free_uar(dev, uuari->uars[i].index); |
| 167 | err = -ENOMEM; | ||
| 167 | goto out_count; | 168 | goto out_count; |
| 168 | } | 169 | } |
| 169 | mlx5_core_dbg(dev, "allocated uar index 0x%x, mmaped at %p\n", | 170 | mlx5_core_dbg(dev, "allocated uar index 0x%x, mmaped at %p\n", |
diff --git a/drivers/net/ethernet/oki-semi/pch_gbe/Kconfig b/drivers/net/ethernet/oki-semi/pch_gbe/Kconfig index cb22341a14a8..a588ffde9700 100644 --- a/drivers/net/ethernet/oki-semi/pch_gbe/Kconfig +++ b/drivers/net/ethernet/oki-semi/pch_gbe/Kconfig | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | 4 | ||
| 5 | config PCH_GBE | 5 | config PCH_GBE |
| 6 | tristate "OKI SEMICONDUCTOR IOH(ML7223/ML7831) GbE" | 6 | tristate "OKI SEMICONDUCTOR IOH(ML7223/ML7831) GbE" |
| 7 | depends on PCI | 7 | depends on PCI && (X86 || COMPILE_TEST) |
| 8 | select MII | 8 | select MII |
| 9 | select PTP_1588_CLOCK_PCH | 9 | select PTP_1588_CLOCK_PCH |
| 10 | ---help--- | 10 | ---help--- |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h b/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h index b00cf5665eab..221645e9f182 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h | |||
| @@ -1400,8 +1400,8 @@ void qlcnic_pci_camqm_write_2M(struct qlcnic_adapter *, u64, u64); | |||
| 1400 | #define ADDR_IN_RANGE(addr, low, high) \ | 1400 | #define ADDR_IN_RANGE(addr, low, high) \ |
| 1401 | (((addr) < (high)) && ((addr) >= (low))) | 1401 | (((addr) < (high)) && ((addr) >= (low))) |
| 1402 | 1402 | ||
| 1403 | #define QLCRD32(adapter, off) \ | 1403 | #define QLCRD32(adapter, off, err) \ |
| 1404 | (adapter->ahw->hw_ops->read_reg)(adapter, off) | 1404 | (adapter->ahw->hw_ops->read_reg)(adapter, off, err) |
| 1405 | 1405 | ||
| 1406 | #define QLCWR32(adapter, off, val) \ | 1406 | #define QLCWR32(adapter, off, val) \ |
| 1407 | adapter->ahw->hw_ops->write_reg(adapter, off, val) | 1407 | adapter->ahw->hw_ops->write_reg(adapter, off, val) |
| @@ -1604,7 +1604,7 @@ struct qlcnic_nic_template { | |||
| 1604 | struct qlcnic_hardware_ops { | 1604 | struct qlcnic_hardware_ops { |
| 1605 | void (*read_crb) (struct qlcnic_adapter *, char *, loff_t, size_t); | 1605 | void (*read_crb) (struct qlcnic_adapter *, char *, loff_t, size_t); |
| 1606 | void (*write_crb) (struct qlcnic_adapter *, char *, loff_t, size_t); | 1606 | void (*write_crb) (struct qlcnic_adapter *, char *, loff_t, size_t); |
| 1607 | int (*read_reg) (struct qlcnic_adapter *, ulong); | 1607 | int (*read_reg) (struct qlcnic_adapter *, ulong, int *); |
| 1608 | int (*write_reg) (struct qlcnic_adapter *, ulong, u32); | 1608 | int (*write_reg) (struct qlcnic_adapter *, ulong, u32); |
| 1609 | void (*get_ocm_win) (struct qlcnic_hardware_context *); | 1609 | void (*get_ocm_win) (struct qlcnic_hardware_context *); |
| 1610 | int (*get_mac_address) (struct qlcnic_adapter *, u8 *); | 1610 | int (*get_mac_address) (struct qlcnic_adapter *, u8 *); |
| @@ -1662,12 +1662,6 @@ static inline void qlcnic_write_crb(struct qlcnic_adapter *adapter, char *buf, | |||
| 1662 | adapter->ahw->hw_ops->write_crb(adapter, buf, offset, size); | 1662 | adapter->ahw->hw_ops->write_crb(adapter, buf, offset, size); |
| 1663 | } | 1663 | } |
| 1664 | 1664 | ||
| 1665 | static inline int qlcnic_hw_read_wx_2M(struct qlcnic_adapter *adapter, | ||
| 1666 | ulong off) | ||
| 1667 | { | ||
| 1668 | return adapter->ahw->hw_ops->read_reg(adapter, off); | ||
| 1669 | } | ||
| 1670 | |||
| 1671 | static inline int qlcnic_hw_write_wx_2M(struct qlcnic_adapter *adapter, | 1665 | static inline int qlcnic_hw_write_wx_2M(struct qlcnic_adapter *adapter, |
| 1672 | ulong off, u32 data) | 1666 | ulong off, u32 data) |
| 1673 | { | 1667 | { |
| @@ -1869,7 +1863,8 @@ static inline void qlcnic_free_mac_list(struct qlcnic_adapter *adapter) | |||
| 1869 | 1863 | ||
| 1870 | static inline void qlcnic_set_mac_filter_count(struct qlcnic_adapter *adapter) | 1864 | static inline void qlcnic_set_mac_filter_count(struct qlcnic_adapter *adapter) |
| 1871 | { | 1865 | { |
| 1872 | adapter->ahw->hw_ops->set_mac_filter_count(adapter); | 1866 | if (adapter->ahw->hw_ops->set_mac_filter_count) |
| 1867 | adapter->ahw->hw_ops->set_mac_filter_count(adapter); | ||
| 1873 | } | 1868 | } |
| 1874 | 1869 | ||
| 1875 | static inline void qlcnic_dev_request_reset(struct qlcnic_adapter *adapter, | 1870 | static inline void qlcnic_dev_request_reset(struct qlcnic_adapter *adapter, |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c index 0913c623a67e..92da9980a0a0 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c | |||
| @@ -228,17 +228,17 @@ static int __qlcnic_set_win_base(struct qlcnic_adapter *adapter, u32 addr) | |||
| 228 | return 0; | 228 | return 0; |
| 229 | } | 229 | } |
| 230 | 230 | ||
| 231 | int qlcnic_83xx_rd_reg_indirect(struct qlcnic_adapter *adapter, ulong addr) | 231 | int qlcnic_83xx_rd_reg_indirect(struct qlcnic_adapter *adapter, ulong addr, |
| 232 | int *err) | ||
| 232 | { | 233 | { |
| 233 | int ret; | ||
| 234 | struct qlcnic_hardware_context *ahw = adapter->ahw; | 234 | struct qlcnic_hardware_context *ahw = adapter->ahw; |
| 235 | 235 | ||
| 236 | ret = __qlcnic_set_win_base(adapter, (u32) addr); | 236 | *err = __qlcnic_set_win_base(adapter, (u32) addr); |
| 237 | if (!ret) { | 237 | if (!*err) { |
| 238 | return QLCRDX(ahw, QLCNIC_WILDCARD); | 238 | return QLCRDX(ahw, QLCNIC_WILDCARD); |
| 239 | } else { | 239 | } else { |
| 240 | dev_err(&adapter->pdev->dev, | 240 | dev_err(&adapter->pdev->dev, |
| 241 | "%s failed, addr = 0x%x\n", __func__, (int)addr); | 241 | "%s failed, addr = 0x%lx\n", __func__, addr); |
| 242 | return -EIO; | 242 | return -EIO; |
| 243 | } | 243 | } |
| 244 | } | 244 | } |
| @@ -561,7 +561,7 @@ void qlcnic_83xx_cam_unlock(struct qlcnic_adapter *adapter) | |||
| 561 | void qlcnic_83xx_read_crb(struct qlcnic_adapter *adapter, char *buf, | 561 | void qlcnic_83xx_read_crb(struct qlcnic_adapter *adapter, char *buf, |
| 562 | loff_t offset, size_t size) | 562 | loff_t offset, size_t size) |
| 563 | { | 563 | { |
| 564 | int ret; | 564 | int ret = 0; |
| 565 | u32 data; | 565 | u32 data; |
| 566 | 566 | ||
| 567 | if (qlcnic_api_lock(adapter)) { | 567 | if (qlcnic_api_lock(adapter)) { |
| @@ -571,7 +571,7 @@ void qlcnic_83xx_read_crb(struct qlcnic_adapter *adapter, char *buf, | |||
| 571 | return; | 571 | return; |
| 572 | } | 572 | } |
| 573 | 573 | ||
| 574 | ret = qlcnic_83xx_rd_reg_indirect(adapter, (u32) offset); | 574 | data = QLCRD32(adapter, (u32) offset, &ret); |
| 575 | qlcnic_api_unlock(adapter); | 575 | qlcnic_api_unlock(adapter); |
| 576 | 576 | ||
| 577 | if (ret == -EIO) { | 577 | if (ret == -EIO) { |
| @@ -580,7 +580,6 @@ void qlcnic_83xx_read_crb(struct qlcnic_adapter *adapter, char *buf, | |||
| 580 | __func__, (u32)offset); | 580 | __func__, (u32)offset); |
| 581 | return; | 581 | return; |
| 582 | } | 582 | } |
| 583 | data = ret; | ||
| 584 | memcpy(buf, &data, size); | 583 | memcpy(buf, &data, size); |
| 585 | } | 584 | } |
| 586 | 585 | ||
| @@ -2075,18 +2074,25 @@ void qlcnic_83xx_config_intr_coal(struct qlcnic_adapter *adapter) | |||
| 2075 | static void qlcnic_83xx_handle_link_aen(struct qlcnic_adapter *adapter, | 2074 | static void qlcnic_83xx_handle_link_aen(struct qlcnic_adapter *adapter, |
| 2076 | u32 data[]) | 2075 | u32 data[]) |
| 2077 | { | 2076 | { |
| 2077 | struct qlcnic_hardware_context *ahw = adapter->ahw; | ||
| 2078 | u8 link_status, duplex; | 2078 | u8 link_status, duplex; |
| 2079 | /* link speed */ | 2079 | /* link speed */ |
| 2080 | link_status = LSB(data[3]) & 1; | 2080 | link_status = LSB(data[3]) & 1; |
| 2081 | adapter->ahw->link_speed = MSW(data[2]); | 2081 | if (link_status) { |
| 2082 | adapter->ahw->link_autoneg = MSB(MSW(data[3])); | 2082 | ahw->link_speed = MSW(data[2]); |
| 2083 | adapter->ahw->module_type = MSB(LSW(data[3])); | 2083 | duplex = LSB(MSW(data[3])); |
| 2084 | duplex = LSB(MSW(data[3])); | 2084 | if (duplex) |
| 2085 | if (duplex) | 2085 | ahw->link_duplex = DUPLEX_FULL; |
| 2086 | adapter->ahw->link_duplex = DUPLEX_FULL; | 2086 | else |
| 2087 | else | 2087 | ahw->link_duplex = DUPLEX_HALF; |
| 2088 | adapter->ahw->link_duplex = DUPLEX_HALF; | 2088 | } else { |
| 2089 | adapter->ahw->has_link_events = 1; | 2089 | ahw->link_speed = SPEED_UNKNOWN; |
| 2090 | ahw->link_duplex = DUPLEX_UNKNOWN; | ||
| 2091 | } | ||
| 2092 | |||
| 2093 | ahw->link_autoneg = MSB(MSW(data[3])); | ||
| 2094 | ahw->module_type = MSB(LSW(data[3])); | ||
| 2095 | ahw->has_link_events = 1; | ||
| 2090 | qlcnic_advert_link_change(adapter, link_status); | 2096 | qlcnic_advert_link_change(adapter, link_status); |
| 2091 | } | 2097 | } |
| 2092 | 2098 | ||
| @@ -2384,9 +2390,9 @@ int qlcnic_83xx_lockless_flash_read32(struct qlcnic_adapter *adapter, | |||
| 2384 | u32 flash_addr, u8 *p_data, | 2390 | u32 flash_addr, u8 *p_data, |
| 2385 | int count) | 2391 | int count) |
| 2386 | { | 2392 | { |
| 2387 | int i, ret; | 2393 | u32 word, range, flash_offset, addr = flash_addr, ret; |
| 2388 | u32 word, range, flash_offset, addr = flash_addr; | ||
| 2389 | ulong indirect_add, direct_window; | 2394 | ulong indirect_add, direct_window; |
| 2395 | int i, err = 0; | ||
| 2390 | 2396 | ||
| 2391 | flash_offset = addr & (QLCNIC_FLASH_SECTOR_SIZE - 1); | 2397 | flash_offset = addr & (QLCNIC_FLASH_SECTOR_SIZE - 1); |
| 2392 | if (addr & 0x3) { | 2398 | if (addr & 0x3) { |
| @@ -2404,10 +2410,9 @@ int qlcnic_83xx_lockless_flash_read32(struct qlcnic_adapter *adapter, | |||
| 2404 | /* Multi sector read */ | 2410 | /* Multi sector read */ |
| 2405 | for (i = 0; i < count; i++) { | 2411 | for (i = 0; i < count; i++) { |
| 2406 | indirect_add = QLC_83XX_FLASH_DIRECT_DATA(addr); | 2412 | indirect_add = QLC_83XX_FLASH_DIRECT_DATA(addr); |
| 2407 | ret = qlcnic_83xx_rd_reg_indirect(adapter, | 2413 | ret = QLCRD32(adapter, indirect_add, &err); |
| 2408 | indirect_add); | 2414 | if (err == -EIO) |
| 2409 | if (ret == -EIO) | 2415 | return err; |
| 2410 | return -EIO; | ||
| 2411 | 2416 | ||
| 2412 | word = ret; | 2417 | word = ret; |
| 2413 | *(u32 *)p_data = word; | 2418 | *(u32 *)p_data = word; |
| @@ -2428,10 +2433,9 @@ int qlcnic_83xx_lockless_flash_read32(struct qlcnic_adapter *adapter, | |||
| 2428 | /* Single sector read */ | 2433 | /* Single sector read */ |
| 2429 | for (i = 0; i < count; i++) { | 2434 | for (i = 0; i < count; i++) { |
| 2430 | indirect_add = QLC_83XX_FLASH_DIRECT_DATA(addr); | 2435 | indirect_add = QLC_83XX_FLASH_DIRECT_DATA(addr); |
| 2431 | ret = qlcnic_83xx_rd_reg_indirect(adapter, | 2436 | ret = QLCRD32(adapter, indirect_add, &err); |
| 2432 | indirect_add); | 2437 | if (err == -EIO) |
| 2433 | if (ret == -EIO) | 2438 | return err; |
| 2434 | return -EIO; | ||
| 2435 | 2439 | ||
| 2436 | word = ret; | 2440 | word = ret; |
| 2437 | *(u32 *)p_data = word; | 2441 | *(u32 *)p_data = word; |
| @@ -2447,10 +2451,13 @@ static int qlcnic_83xx_poll_flash_status_reg(struct qlcnic_adapter *adapter) | |||
| 2447 | { | 2451 | { |
| 2448 | u32 status; | 2452 | u32 status; |
| 2449 | int retries = QLC_83XX_FLASH_READ_RETRY_COUNT; | 2453 | int retries = QLC_83XX_FLASH_READ_RETRY_COUNT; |
| 2454 | int err = 0; | ||
| 2450 | 2455 | ||
| 2451 | do { | 2456 | do { |
| 2452 | status = qlcnic_83xx_rd_reg_indirect(adapter, | 2457 | status = QLCRD32(adapter, QLC_83XX_FLASH_STATUS, &err); |
| 2453 | QLC_83XX_FLASH_STATUS); | 2458 | if (err == -EIO) |
| 2459 | return err; | ||
| 2460 | |||
| 2454 | if ((status & QLC_83XX_FLASH_STATUS_READY) == | 2461 | if ((status & QLC_83XX_FLASH_STATUS_READY) == |
| 2455 | QLC_83XX_FLASH_STATUS_READY) | 2462 | QLC_83XX_FLASH_STATUS_READY) |
| 2456 | break; | 2463 | break; |
| @@ -2502,7 +2509,8 @@ int qlcnic_83xx_disable_flash_write(struct qlcnic_adapter *adapter) | |||
| 2502 | 2509 | ||
| 2503 | int qlcnic_83xx_read_flash_mfg_id(struct qlcnic_adapter *adapter) | 2510 | int qlcnic_83xx_read_flash_mfg_id(struct qlcnic_adapter *adapter) |
| 2504 | { | 2511 | { |
| 2505 | int ret, mfg_id; | 2512 | int ret, err = 0; |
| 2513 | u32 mfg_id; | ||
| 2506 | 2514 | ||
| 2507 | if (qlcnic_83xx_lock_flash(adapter)) | 2515 | if (qlcnic_83xx_lock_flash(adapter)) |
| 2508 | return -EIO; | 2516 | return -EIO; |
| @@ -2517,9 +2525,11 @@ int qlcnic_83xx_read_flash_mfg_id(struct qlcnic_adapter *adapter) | |||
| 2517 | return -EIO; | 2525 | return -EIO; |
| 2518 | } | 2526 | } |
| 2519 | 2527 | ||
| 2520 | mfg_id = qlcnic_83xx_rd_reg_indirect(adapter, QLC_83XX_FLASH_RDDATA); | 2528 | mfg_id = QLCRD32(adapter, QLC_83XX_FLASH_RDDATA, &err); |
| 2521 | if (mfg_id == -EIO) | 2529 | if (err == -EIO) { |
| 2522 | return -EIO; | 2530 | qlcnic_83xx_unlock_flash(adapter); |
| 2531 | return err; | ||
| 2532 | } | ||
| 2523 | 2533 | ||
| 2524 | adapter->flash_mfg_id = (mfg_id & 0xFF); | 2534 | adapter->flash_mfg_id = (mfg_id & 0xFF); |
| 2525 | qlcnic_83xx_unlock_flash(adapter); | 2535 | qlcnic_83xx_unlock_flash(adapter); |
| @@ -2636,7 +2646,7 @@ int qlcnic_83xx_flash_bulk_write(struct qlcnic_adapter *adapter, u32 addr, | |||
| 2636 | u32 *p_data, int count) | 2646 | u32 *p_data, int count) |
| 2637 | { | 2647 | { |
| 2638 | u32 temp; | 2648 | u32 temp; |
| 2639 | int ret = -EIO; | 2649 | int ret = -EIO, err = 0; |
| 2640 | 2650 | ||
| 2641 | if ((count < QLC_83XX_FLASH_WRITE_MIN) || | 2651 | if ((count < QLC_83XX_FLASH_WRITE_MIN) || |
| 2642 | (count > QLC_83XX_FLASH_WRITE_MAX)) { | 2652 | (count > QLC_83XX_FLASH_WRITE_MAX)) { |
| @@ -2645,8 +2655,10 @@ int qlcnic_83xx_flash_bulk_write(struct qlcnic_adapter *adapter, u32 addr, | |||
| 2645 | return -EIO; | 2655 | return -EIO; |
| 2646 | } | 2656 | } |
| 2647 | 2657 | ||
| 2648 | temp = qlcnic_83xx_rd_reg_indirect(adapter, | 2658 | temp = QLCRD32(adapter, QLC_83XX_FLASH_SPI_CONTROL, &err); |
| 2649 | QLC_83XX_FLASH_SPI_CONTROL); | 2659 | if (err == -EIO) |
| 2660 | return err; | ||
| 2661 | |||
| 2650 | qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_SPI_CONTROL, | 2662 | qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_SPI_CONTROL, |
| 2651 | (temp | QLC_83XX_FLASH_SPI_CTRL)); | 2663 | (temp | QLC_83XX_FLASH_SPI_CTRL)); |
| 2652 | qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_ADDR, | 2664 | qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_ADDR, |
| @@ -2695,13 +2707,18 @@ int qlcnic_83xx_flash_bulk_write(struct qlcnic_adapter *adapter, u32 addr, | |||
| 2695 | return -EIO; | 2707 | return -EIO; |
| 2696 | } | 2708 | } |
| 2697 | 2709 | ||
| 2698 | ret = qlcnic_83xx_rd_reg_indirect(adapter, QLC_83XX_FLASH_SPI_STATUS); | 2710 | ret = QLCRD32(adapter, QLC_83XX_FLASH_SPI_STATUS, &err); |
| 2711 | if (err == -EIO) | ||
| 2712 | return err; | ||
| 2713 | |||
| 2699 | if ((ret & QLC_83XX_FLASH_SPI_CTRL) == QLC_83XX_FLASH_SPI_CTRL) { | 2714 | if ((ret & QLC_83XX_FLASH_SPI_CTRL) == QLC_83XX_FLASH_SPI_CTRL) { |
| 2700 | dev_err(&adapter->pdev->dev, "%s: failed at %d\n", | 2715 | dev_err(&adapter->pdev->dev, "%s: failed at %d\n", |
| 2701 | __func__, __LINE__); | 2716 | __func__, __LINE__); |
| 2702 | /* Operation failed, clear error bit */ | 2717 | /* Operation failed, clear error bit */ |
| 2703 | temp = qlcnic_83xx_rd_reg_indirect(adapter, | 2718 | temp = QLCRD32(adapter, QLC_83XX_FLASH_SPI_CONTROL, &err); |
| 2704 | QLC_83XX_FLASH_SPI_CONTROL); | 2719 | if (err == -EIO) |
| 2720 | return err; | ||
| 2721 | |||
| 2705 | qlcnic_83xx_wrt_reg_indirect(adapter, | 2722 | qlcnic_83xx_wrt_reg_indirect(adapter, |
| 2706 | QLC_83XX_FLASH_SPI_CONTROL, | 2723 | QLC_83XX_FLASH_SPI_CONTROL, |
| 2707 | (temp | QLC_83XX_FLASH_SPI_CTRL)); | 2724 | (temp | QLC_83XX_FLASH_SPI_CTRL)); |
| @@ -2823,6 +2840,7 @@ int qlcnic_83xx_ms_mem_write128(struct qlcnic_adapter *adapter, u64 addr, | |||
| 2823 | { | 2840 | { |
| 2824 | int i, j, ret = 0; | 2841 | int i, j, ret = 0; |
| 2825 | u32 temp; | 2842 | u32 temp; |
| 2843 | int err = 0; | ||
| 2826 | 2844 | ||
| 2827 | /* Check alignment */ | 2845 | /* Check alignment */ |
| 2828 | if (addr & 0xF) | 2846 | if (addr & 0xF) |
| @@ -2855,8 +2873,12 @@ int qlcnic_83xx_ms_mem_write128(struct qlcnic_adapter *adapter, u64 addr, | |||
| 2855 | QLCNIC_TA_WRITE_START); | 2873 | QLCNIC_TA_WRITE_START); |
| 2856 | 2874 | ||
| 2857 | for (j = 0; j < MAX_CTL_CHECK; j++) { | 2875 | for (j = 0; j < MAX_CTL_CHECK; j++) { |
| 2858 | temp = qlcnic_83xx_rd_reg_indirect(adapter, | 2876 | temp = QLCRD32(adapter, QLCNIC_MS_CTRL, &err); |
| 2859 | QLCNIC_MS_CTRL); | 2877 | if (err == -EIO) { |
| 2878 | mutex_unlock(&adapter->ahw->mem_lock); | ||
| 2879 | return err; | ||
| 2880 | } | ||
| 2881 | |||
| 2860 | if ((temp & TA_CTL_BUSY) == 0) | 2882 | if ((temp & TA_CTL_BUSY) == 0) |
| 2861 | break; | 2883 | break; |
| 2862 | } | 2884 | } |
| @@ -2878,9 +2900,9 @@ int qlcnic_83xx_ms_mem_write128(struct qlcnic_adapter *adapter, u64 addr, | |||
| 2878 | int qlcnic_83xx_flash_read32(struct qlcnic_adapter *adapter, u32 flash_addr, | 2900 | int qlcnic_83xx_flash_read32(struct qlcnic_adapter *adapter, u32 flash_addr, |
| 2879 | u8 *p_data, int count) | 2901 | u8 *p_data, int count) |
| 2880 | { | 2902 | { |
| 2881 | int i, ret; | 2903 | u32 word, addr = flash_addr, ret; |
| 2882 | u32 word, addr = flash_addr; | ||
| 2883 | ulong indirect_addr; | 2904 | ulong indirect_addr; |
| 2905 | int i, err = 0; | ||
| 2884 | 2906 | ||
| 2885 | if (qlcnic_83xx_lock_flash(adapter) != 0) | 2907 | if (qlcnic_83xx_lock_flash(adapter) != 0) |
| 2886 | return -EIO; | 2908 | return -EIO; |
| @@ -2900,10 +2922,10 @@ int qlcnic_83xx_flash_read32(struct qlcnic_adapter *adapter, u32 flash_addr, | |||
| 2900 | } | 2922 | } |
| 2901 | 2923 | ||
| 2902 | indirect_addr = QLC_83XX_FLASH_DIRECT_DATA(addr); | 2924 | indirect_addr = QLC_83XX_FLASH_DIRECT_DATA(addr); |
| 2903 | ret = qlcnic_83xx_rd_reg_indirect(adapter, | 2925 | ret = QLCRD32(adapter, indirect_addr, &err); |
| 2904 | indirect_addr); | 2926 | if (err == -EIO) |
| 2905 | if (ret == -EIO) | 2927 | return err; |
| 2906 | return -EIO; | 2928 | |
| 2907 | word = ret; | 2929 | word = ret; |
| 2908 | *(u32 *)p_data = word; | 2930 | *(u32 *)p_data = word; |
| 2909 | p_data = p_data + 4; | 2931 | p_data = p_data + 4; |
| @@ -3014,8 +3036,8 @@ int qlcnic_83xx_get_settings(struct qlcnic_adapter *adapter, | |||
| 3014 | } | 3036 | } |
| 3015 | 3037 | ||
| 3016 | if (ahw->port_type == QLCNIC_XGBE) { | 3038 | if (ahw->port_type == QLCNIC_XGBE) { |
| 3017 | ecmd->supported = SUPPORTED_1000baseT_Full; | 3039 | ecmd->supported = SUPPORTED_10000baseT_Full; |
| 3018 | ecmd->advertising = ADVERTISED_1000baseT_Full; | 3040 | ecmd->advertising = ADVERTISED_10000baseT_Full; |
| 3019 | } else { | 3041 | } else { |
| 3020 | ecmd->supported = (SUPPORTED_10baseT_Half | | 3042 | ecmd->supported = (SUPPORTED_10baseT_Half | |
| 3021 | SUPPORTED_10baseT_Full | | 3043 | SUPPORTED_10baseT_Full | |
| @@ -3369,7 +3391,8 @@ int qlcnic_83xx_set_pauseparam(struct qlcnic_adapter *adapter, | |||
| 3369 | 3391 | ||
| 3370 | static int qlcnic_83xx_read_flash_status_reg(struct qlcnic_adapter *adapter) | 3392 | static int qlcnic_83xx_read_flash_status_reg(struct qlcnic_adapter *adapter) |
| 3371 | { | 3393 | { |
| 3372 | int ret; | 3394 | int ret, err = 0; |
| 3395 | u32 temp; | ||
| 3373 | 3396 | ||
| 3374 | qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_ADDR, | 3397 | qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_ADDR, |
| 3375 | QLC_83XX_FLASH_OEM_READ_SIG); | 3398 | QLC_83XX_FLASH_OEM_READ_SIG); |
| @@ -3379,8 +3402,11 @@ static int qlcnic_83xx_read_flash_status_reg(struct qlcnic_adapter *adapter) | |||
| 3379 | if (ret) | 3402 | if (ret) |
| 3380 | return -EIO; | 3403 | return -EIO; |
| 3381 | 3404 | ||
| 3382 | ret = qlcnic_83xx_rd_reg_indirect(adapter, QLC_83XX_FLASH_RDDATA); | 3405 | temp = QLCRD32(adapter, QLC_83XX_FLASH_RDDATA, &err); |
| 3383 | return ret & 0xFF; | 3406 | if (err == -EIO) |
| 3407 | return err; | ||
| 3408 | |||
| 3409 | return temp & 0xFF; | ||
| 3384 | } | 3410 | } |
| 3385 | 3411 | ||
| 3386 | int qlcnic_83xx_flash_test(struct qlcnic_adapter *adapter) | 3412 | int qlcnic_83xx_flash_test(struct qlcnic_adapter *adapter) |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h index 2548d1403d75..272f56a2e14b 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h | |||
| @@ -508,7 +508,7 @@ void qlcnic_83xx_add_sysfs(struct qlcnic_adapter *); | |||
| 508 | void qlcnic_83xx_remove_sysfs(struct qlcnic_adapter *); | 508 | void qlcnic_83xx_remove_sysfs(struct qlcnic_adapter *); |
| 509 | void qlcnic_83xx_write_crb(struct qlcnic_adapter *, char *, loff_t, size_t); | 509 | void qlcnic_83xx_write_crb(struct qlcnic_adapter *, char *, loff_t, size_t); |
| 510 | void qlcnic_83xx_read_crb(struct qlcnic_adapter *, char *, loff_t, size_t); | 510 | void qlcnic_83xx_read_crb(struct qlcnic_adapter *, char *, loff_t, size_t); |
| 511 | int qlcnic_83xx_rd_reg_indirect(struct qlcnic_adapter *, ulong); | 511 | int qlcnic_83xx_rd_reg_indirect(struct qlcnic_adapter *, ulong, int *); |
| 512 | int qlcnic_83xx_wrt_reg_indirect(struct qlcnic_adapter *, ulong, u32); | 512 | int qlcnic_83xx_wrt_reg_indirect(struct qlcnic_adapter *, ulong, u32); |
| 513 | void qlcnic_83xx_process_rcv_diag(struct qlcnic_adapter *, int, u64 []); | 513 | void qlcnic_83xx_process_rcv_diag(struct qlcnic_adapter *, int, u64 []); |
| 514 | int qlcnic_83xx_nic_set_promisc(struct qlcnic_adapter *, u32); | 514 | int qlcnic_83xx_nic_set_promisc(struct qlcnic_adapter *, u32); |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c index f41dfab1e9a3..9f4b8d5f0865 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c | |||
| @@ -1303,8 +1303,11 @@ static void qlcnic_83xx_dump_pause_control_regs(struct qlcnic_adapter *adapter) | |||
| 1303 | { | 1303 | { |
| 1304 | int i, j; | 1304 | int i, j; |
| 1305 | u32 val = 0, val1 = 0, reg = 0; | 1305 | u32 val = 0, val1 = 0, reg = 0; |
| 1306 | int err = 0; | ||
| 1306 | 1307 | ||
| 1307 | val = QLCRD32(adapter, QLC_83XX_SRE_SHIM_REG); | 1308 | val = QLCRD32(adapter, QLC_83XX_SRE_SHIM_REG, &err); |
| 1309 | if (err == -EIO) | ||
| 1310 | return; | ||
| 1308 | dev_info(&adapter->pdev->dev, "SRE-Shim Ctrl:0x%x\n", val); | 1311 | dev_info(&adapter->pdev->dev, "SRE-Shim Ctrl:0x%x\n", val); |
| 1309 | 1312 | ||
| 1310 | for (j = 0; j < 2; j++) { | 1313 | for (j = 0; j < 2; j++) { |
| @@ -1318,7 +1321,9 @@ static void qlcnic_83xx_dump_pause_control_regs(struct qlcnic_adapter *adapter) | |||
| 1318 | reg = QLC_83XX_PORT1_THRESHOLD; | 1321 | reg = QLC_83XX_PORT1_THRESHOLD; |
| 1319 | } | 1322 | } |
| 1320 | for (i = 0; i < 8; i++) { | 1323 | for (i = 0; i < 8; i++) { |
| 1321 | val = QLCRD32(adapter, reg + (i * 0x4)); | 1324 | val = QLCRD32(adapter, reg + (i * 0x4), &err); |
| 1325 | if (err == -EIO) | ||
| 1326 | return; | ||
| 1322 | dev_info(&adapter->pdev->dev, "0x%x ", val); | 1327 | dev_info(&adapter->pdev->dev, "0x%x ", val); |
| 1323 | } | 1328 | } |
| 1324 | dev_info(&adapter->pdev->dev, "\n"); | 1329 | dev_info(&adapter->pdev->dev, "\n"); |
| @@ -1335,8 +1340,10 @@ static void qlcnic_83xx_dump_pause_control_regs(struct qlcnic_adapter *adapter) | |||
| 1335 | reg = QLC_83XX_PORT1_TC_MC_REG; | 1340 | reg = QLC_83XX_PORT1_TC_MC_REG; |
| 1336 | } | 1341 | } |
| 1337 | for (i = 0; i < 4; i++) { | 1342 | for (i = 0; i < 4; i++) { |
| 1338 | val = QLCRD32(adapter, reg + (i * 0x4)); | 1343 | val = QLCRD32(adapter, reg + (i * 0x4), &err); |
| 1339 | dev_info(&adapter->pdev->dev, "0x%x ", val); | 1344 | if (err == -EIO) |
| 1345 | return; | ||
| 1346 | dev_info(&adapter->pdev->dev, "0x%x ", val); | ||
| 1340 | } | 1347 | } |
| 1341 | dev_info(&adapter->pdev->dev, "\n"); | 1348 | dev_info(&adapter->pdev->dev, "\n"); |
| 1342 | } | 1349 | } |
| @@ -1352,17 +1359,25 @@ static void qlcnic_83xx_dump_pause_control_regs(struct qlcnic_adapter *adapter) | |||
| 1352 | reg = QLC_83XX_PORT1_TC_STATS; | 1359 | reg = QLC_83XX_PORT1_TC_STATS; |
| 1353 | } | 1360 | } |
| 1354 | for (i = 7; i >= 0; i--) { | 1361 | for (i = 7; i >= 0; i--) { |
| 1355 | val = QLCRD32(adapter, reg); | 1362 | val = QLCRD32(adapter, reg, &err); |
| 1363 | if (err == -EIO) | ||
| 1364 | return; | ||
| 1356 | val &= ~(0x7 << 29); /* Reset bits 29 to 31 */ | 1365 | val &= ~(0x7 << 29); /* Reset bits 29 to 31 */ |
| 1357 | QLCWR32(adapter, reg, (val | (i << 29))); | 1366 | QLCWR32(adapter, reg, (val | (i << 29))); |
| 1358 | val = QLCRD32(adapter, reg); | 1367 | val = QLCRD32(adapter, reg, &err); |
| 1368 | if (err == -EIO) | ||
| 1369 | return; | ||
| 1359 | dev_info(&adapter->pdev->dev, "0x%x ", val); | 1370 | dev_info(&adapter->pdev->dev, "0x%x ", val); |
| 1360 | } | 1371 | } |
| 1361 | dev_info(&adapter->pdev->dev, "\n"); | 1372 | dev_info(&adapter->pdev->dev, "\n"); |
| 1362 | } | 1373 | } |
| 1363 | 1374 | ||
| 1364 | val = QLCRD32(adapter, QLC_83XX_PORT2_IFB_THRESHOLD); | 1375 | val = QLCRD32(adapter, QLC_83XX_PORT2_IFB_THRESHOLD, &err); |
| 1365 | val1 = QLCRD32(adapter, QLC_83XX_PORT3_IFB_THRESHOLD); | 1376 | if (err == -EIO) |
| 1377 | return; | ||
| 1378 | val1 = QLCRD32(adapter, QLC_83XX_PORT3_IFB_THRESHOLD, &err); | ||
| 1379 | if (err == -EIO) | ||
| 1380 | return; | ||
| 1366 | dev_info(&adapter->pdev->dev, | 1381 | dev_info(&adapter->pdev->dev, |
| 1367 | "IFB-Pause Thresholds: Port 2:0x%x, Port 3:0x%x\n", | 1382 | "IFB-Pause Thresholds: Port 2:0x%x, Port 3:0x%x\n", |
| 1368 | val, val1); | 1383 | val, val1); |
| @@ -1425,7 +1440,7 @@ static void qlcnic_83xx_take_eport_out_of_reset(struct qlcnic_adapter *adapter) | |||
| 1425 | static int qlcnic_83xx_check_heartbeat(struct qlcnic_adapter *p_dev) | 1440 | static int qlcnic_83xx_check_heartbeat(struct qlcnic_adapter *p_dev) |
| 1426 | { | 1441 | { |
| 1427 | u32 heartbeat, peg_status; | 1442 | u32 heartbeat, peg_status; |
| 1428 | int retries, ret = -EIO; | 1443 | int retries, ret = -EIO, err = 0; |
| 1429 | 1444 | ||
| 1430 | retries = QLCNIC_HEARTBEAT_CHECK_RETRY_COUNT; | 1445 | retries = QLCNIC_HEARTBEAT_CHECK_RETRY_COUNT; |
| 1431 | p_dev->heartbeat = QLC_SHARED_REG_RD32(p_dev, | 1446 | p_dev->heartbeat = QLC_SHARED_REG_RD32(p_dev, |
| @@ -1453,11 +1468,11 @@ static int qlcnic_83xx_check_heartbeat(struct qlcnic_adapter *p_dev) | |||
| 1453 | "PEG_NET_2_PC: 0x%x, PEG_NET_3_PC: 0x%x,\n" | 1468 | "PEG_NET_2_PC: 0x%x, PEG_NET_3_PC: 0x%x,\n" |
| 1454 | "PEG_NET_4_PC: 0x%x\n", peg_status, | 1469 | "PEG_NET_4_PC: 0x%x\n", peg_status, |
| 1455 | QLC_SHARED_REG_RD32(p_dev, QLCNIC_PEG_HALT_STATUS2), | 1470 | QLC_SHARED_REG_RD32(p_dev, QLCNIC_PEG_HALT_STATUS2), |
| 1456 | QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_0), | 1471 | QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_0, &err), |
| 1457 | QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_1), | 1472 | QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_1, &err), |
| 1458 | QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_2), | 1473 | QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_2, &err), |
| 1459 | QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_3), | 1474 | QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_3, &err), |
| 1460 | QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_4)); | 1475 | QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_4, &err)); |
| 1461 | 1476 | ||
| 1462 | if (QLCNIC_FWERROR_CODE(peg_status) == 0x67) | 1477 | if (QLCNIC_FWERROR_CODE(peg_status) == 0x67) |
| 1463 | dev_err(&p_dev->pdev->dev, | 1478 | dev_err(&p_dev->pdev->dev, |
| @@ -1501,18 +1516,22 @@ int qlcnic_83xx_check_hw_status(struct qlcnic_adapter *p_dev) | |||
| 1501 | static int qlcnic_83xx_poll_reg(struct qlcnic_adapter *p_dev, u32 addr, | 1516 | static int qlcnic_83xx_poll_reg(struct qlcnic_adapter *p_dev, u32 addr, |
| 1502 | int duration, u32 mask, u32 status) | 1517 | int duration, u32 mask, u32 status) |
| 1503 | { | 1518 | { |
| 1519 | int timeout_error, err = 0; | ||
| 1504 | u32 value; | 1520 | u32 value; |
| 1505 | int timeout_error; | ||
| 1506 | u8 retries; | 1521 | u8 retries; |
| 1507 | 1522 | ||
| 1508 | value = qlcnic_83xx_rd_reg_indirect(p_dev, addr); | 1523 | value = QLCRD32(p_dev, addr, &err); |
| 1524 | if (err == -EIO) | ||
| 1525 | return err; | ||
| 1509 | retries = duration / 10; | 1526 | retries = duration / 10; |
| 1510 | 1527 | ||
| 1511 | do { | 1528 | do { |
| 1512 | if ((value & mask) != status) { | 1529 | if ((value & mask) != status) { |
| 1513 | timeout_error = 1; | 1530 | timeout_error = 1; |
| 1514 | msleep(duration / 10); | 1531 | msleep(duration / 10); |
| 1515 | value = qlcnic_83xx_rd_reg_indirect(p_dev, addr); | 1532 | value = QLCRD32(p_dev, addr, &err); |
| 1533 | if (err == -EIO) | ||
| 1534 | return err; | ||
| 1516 | } else { | 1535 | } else { |
| 1517 | timeout_error = 0; | 1536 | timeout_error = 0; |
| 1518 | break; | 1537 | break; |
| @@ -1606,9 +1625,12 @@ int qlcnic_83xx_get_reset_instruction_template(struct qlcnic_adapter *p_dev) | |||
| 1606 | static void qlcnic_83xx_read_write_crb_reg(struct qlcnic_adapter *p_dev, | 1625 | static void qlcnic_83xx_read_write_crb_reg(struct qlcnic_adapter *p_dev, |
| 1607 | u32 raddr, u32 waddr) | 1626 | u32 raddr, u32 waddr) |
| 1608 | { | 1627 | { |
| 1609 | int value; | 1628 | int err = 0; |
| 1629 | u32 value; | ||
| 1610 | 1630 | ||
| 1611 | value = qlcnic_83xx_rd_reg_indirect(p_dev, raddr); | 1631 | value = QLCRD32(p_dev, raddr, &err); |
| 1632 | if (err == -EIO) | ||
| 1633 | return; | ||
| 1612 | qlcnic_83xx_wrt_reg_indirect(p_dev, waddr, value); | 1634 | qlcnic_83xx_wrt_reg_indirect(p_dev, waddr, value); |
| 1613 | } | 1635 | } |
| 1614 | 1636 | ||
| @@ -1617,12 +1639,16 @@ static void qlcnic_83xx_rmw_crb_reg(struct qlcnic_adapter *p_dev, | |||
| 1617 | u32 raddr, u32 waddr, | 1639 | u32 raddr, u32 waddr, |
| 1618 | struct qlc_83xx_rmw *p_rmw_hdr) | 1640 | struct qlc_83xx_rmw *p_rmw_hdr) |
| 1619 | { | 1641 | { |
| 1620 | int value; | 1642 | int err = 0; |
| 1643 | u32 value; | ||
| 1621 | 1644 | ||
| 1622 | if (p_rmw_hdr->index_a) | 1645 | if (p_rmw_hdr->index_a) { |
| 1623 | value = p_dev->ahw->reset.array[p_rmw_hdr->index_a]; | 1646 | value = p_dev->ahw->reset.array[p_rmw_hdr->index_a]; |
| 1624 | else | 1647 | } else { |
| 1625 | value = qlcnic_83xx_rd_reg_indirect(p_dev, raddr); | 1648 | value = QLCRD32(p_dev, raddr, &err); |
| 1649 | if (err == -EIO) | ||
| 1650 | return; | ||
| 1651 | } | ||
| 1626 | 1652 | ||
| 1627 | value &= p_rmw_hdr->mask; | 1653 | value &= p_rmw_hdr->mask; |
| 1628 | value <<= p_rmw_hdr->shl; | 1654 | value <<= p_rmw_hdr->shl; |
| @@ -1675,7 +1701,7 @@ static void qlcnic_83xx_poll_list(struct qlcnic_adapter *p_dev, | |||
| 1675 | long delay; | 1701 | long delay; |
| 1676 | struct qlc_83xx_entry *entry; | 1702 | struct qlc_83xx_entry *entry; |
| 1677 | struct qlc_83xx_poll *poll; | 1703 | struct qlc_83xx_poll *poll; |
| 1678 | int i; | 1704 | int i, err = 0; |
| 1679 | unsigned long arg1, arg2; | 1705 | unsigned long arg1, arg2; |
| 1680 | 1706 | ||
| 1681 | poll = (struct qlc_83xx_poll *)((char *)p_hdr + | 1707 | poll = (struct qlc_83xx_poll *)((char *)p_hdr + |
| @@ -1699,10 +1725,12 @@ static void qlcnic_83xx_poll_list(struct qlcnic_adapter *p_dev, | |||
| 1699 | arg1, delay, | 1725 | arg1, delay, |
| 1700 | poll->mask, | 1726 | poll->mask, |
| 1701 | poll->status)){ | 1727 | poll->status)){ |
| 1702 | qlcnic_83xx_rd_reg_indirect(p_dev, | 1728 | QLCRD32(p_dev, arg1, &err); |
| 1703 | arg1); | 1729 | if (err == -EIO) |
| 1704 | qlcnic_83xx_rd_reg_indirect(p_dev, | 1730 | return; |
| 1705 | arg2); | 1731 | QLCRD32(p_dev, arg2, &err); |
| 1732 | if (err == -EIO) | ||
| 1733 | return; | ||
| 1706 | } | 1734 | } |
| 1707 | } | 1735 | } |
| 1708 | } | 1736 | } |
| @@ -1768,7 +1796,7 @@ static void qlcnic_83xx_poll_read_list(struct qlcnic_adapter *p_dev, | |||
| 1768 | struct qlc_83xx_entry_hdr *p_hdr) | 1796 | struct qlc_83xx_entry_hdr *p_hdr) |
| 1769 | { | 1797 | { |
| 1770 | long delay; | 1798 | long delay; |
| 1771 | int index, i, j; | 1799 | int index, i, j, err; |
| 1772 | struct qlc_83xx_quad_entry *entry; | 1800 | struct qlc_83xx_quad_entry *entry; |
| 1773 | struct qlc_83xx_poll *poll; | 1801 | struct qlc_83xx_poll *poll; |
| 1774 | unsigned long addr; | 1802 | unsigned long addr; |
| @@ -1788,7 +1816,10 @@ static void qlcnic_83xx_poll_read_list(struct qlcnic_adapter *p_dev, | |||
| 1788 | poll->mask, poll->status)){ | 1816 | poll->mask, poll->status)){ |
| 1789 | index = p_dev->ahw->reset.array_index; | 1817 | index = p_dev->ahw->reset.array_index; |
| 1790 | addr = entry->dr_addr; | 1818 | addr = entry->dr_addr; |
| 1791 | j = qlcnic_83xx_rd_reg_indirect(p_dev, addr); | 1819 | j = QLCRD32(p_dev, addr, &err); |
| 1820 | if (err == -EIO) | ||
| 1821 | return; | ||
| 1822 | |||
| 1792 | p_dev->ahw->reset.array[index++] = j; | 1823 | p_dev->ahw->reset.array[index++] = j; |
| 1793 | 1824 | ||
| 1794 | if (index == QLC_83XX_MAX_RESET_SEQ_ENTRIES) | 1825 | if (index == QLC_83XX_MAX_RESET_SEQ_ENTRIES) |
| @@ -2123,6 +2154,8 @@ int qlcnic_83xx_init(struct qlcnic_adapter *adapter, int pci_using_dac) | |||
| 2123 | set_bit(QLC_83XX_MBX_READY, &adapter->ahw->idc.status); | 2154 | set_bit(QLC_83XX_MBX_READY, &adapter->ahw->idc.status); |
| 2124 | qlcnic_83xx_clear_function_resources(adapter); | 2155 | qlcnic_83xx_clear_function_resources(adapter); |
| 2125 | 2156 | ||
| 2157 | INIT_DELAYED_WORK(&adapter->idc_aen_work, qlcnic_83xx_idc_aen_work); | ||
| 2158 | |||
| 2126 | /* register for NIC IDC AEN Events */ | 2159 | /* register for NIC IDC AEN Events */ |
| 2127 | qlcnic_83xx_register_nic_idc_func(adapter, 1); | 2160 | qlcnic_83xx_register_nic_idc_func(adapter, 1); |
| 2128 | 2161 | ||
| @@ -2140,8 +2173,6 @@ int qlcnic_83xx_init(struct qlcnic_adapter *adapter, int pci_using_dac) | |||
| 2140 | if (adapter->nic_ops->init_driver(adapter)) | 2173 | if (adapter->nic_ops->init_driver(adapter)) |
| 2141 | return -EIO; | 2174 | return -EIO; |
| 2142 | 2175 | ||
| 2143 | INIT_DELAYED_WORK(&adapter->idc_aen_work, qlcnic_83xx_idc_aen_work); | ||
| 2144 | |||
| 2145 | /* Periodically monitor device status */ | 2176 | /* Periodically monitor device status */ |
| 2146 | qlcnic_83xx_idc_poll_dev_state(&adapter->fw_work.work); | 2177 | qlcnic_83xx_idc_poll_dev_state(&adapter->fw_work.work); |
| 2147 | 2178 | ||
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c index 0581a484ceb5..d09389b33474 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c | |||
| @@ -104,7 +104,7 @@ static u32 | |||
| 104 | qlcnic_poll_rsp(struct qlcnic_adapter *adapter) | 104 | qlcnic_poll_rsp(struct qlcnic_adapter *adapter) |
| 105 | { | 105 | { |
| 106 | u32 rsp; | 106 | u32 rsp; |
| 107 | int timeout = 0; | 107 | int timeout = 0, err = 0; |
| 108 | 108 | ||
| 109 | do { | 109 | do { |
| 110 | /* give atleast 1ms for firmware to respond */ | 110 | /* give atleast 1ms for firmware to respond */ |
| @@ -113,7 +113,7 @@ qlcnic_poll_rsp(struct qlcnic_adapter *adapter) | |||
| 113 | if (++timeout > QLCNIC_OS_CRB_RETRY_COUNT) | 113 | if (++timeout > QLCNIC_OS_CRB_RETRY_COUNT) |
| 114 | return QLCNIC_CDRP_RSP_TIMEOUT; | 114 | return QLCNIC_CDRP_RSP_TIMEOUT; |
| 115 | 115 | ||
| 116 | rsp = QLCRD32(adapter, QLCNIC_CDRP_CRB_OFFSET); | 116 | rsp = QLCRD32(adapter, QLCNIC_CDRP_CRB_OFFSET, &err); |
| 117 | } while (!QLCNIC_CDRP_IS_RSP(rsp)); | 117 | } while (!QLCNIC_CDRP_IS_RSP(rsp)); |
| 118 | 118 | ||
| 119 | return rsp; | 119 | return rsp; |
| @@ -122,7 +122,7 @@ qlcnic_poll_rsp(struct qlcnic_adapter *adapter) | |||
| 122 | int qlcnic_82xx_issue_cmd(struct qlcnic_adapter *adapter, | 122 | int qlcnic_82xx_issue_cmd(struct qlcnic_adapter *adapter, |
| 123 | struct qlcnic_cmd_args *cmd) | 123 | struct qlcnic_cmd_args *cmd) |
| 124 | { | 124 | { |
| 125 | int i; | 125 | int i, err = 0; |
| 126 | u32 rsp; | 126 | u32 rsp; |
| 127 | u32 signature; | 127 | u32 signature; |
| 128 | struct pci_dev *pdev = adapter->pdev; | 128 | struct pci_dev *pdev = adapter->pdev; |
| @@ -148,7 +148,7 @@ int qlcnic_82xx_issue_cmd(struct qlcnic_adapter *adapter, | |||
| 148 | dev_err(&pdev->dev, "card response timeout.\n"); | 148 | dev_err(&pdev->dev, "card response timeout.\n"); |
| 149 | cmd->rsp.arg[0] = QLCNIC_RCODE_TIMEOUT; | 149 | cmd->rsp.arg[0] = QLCNIC_RCODE_TIMEOUT; |
| 150 | } else if (rsp == QLCNIC_CDRP_RSP_FAIL) { | 150 | } else if (rsp == QLCNIC_CDRP_RSP_FAIL) { |
| 151 | cmd->rsp.arg[0] = QLCRD32(adapter, QLCNIC_CDRP_ARG(1)); | 151 | cmd->rsp.arg[0] = QLCRD32(adapter, QLCNIC_CDRP_ARG(1), &err); |
| 152 | switch (cmd->rsp.arg[0]) { | 152 | switch (cmd->rsp.arg[0]) { |
| 153 | case QLCNIC_RCODE_INVALID_ARGS: | 153 | case QLCNIC_RCODE_INVALID_ARGS: |
| 154 | fmt = "CDRP invalid args: [%d]\n"; | 154 | fmt = "CDRP invalid args: [%d]\n"; |
| @@ -175,7 +175,7 @@ int qlcnic_82xx_issue_cmd(struct qlcnic_adapter *adapter, | |||
| 175 | cmd->rsp.arg[0] = QLCNIC_RCODE_SUCCESS; | 175 | cmd->rsp.arg[0] = QLCNIC_RCODE_SUCCESS; |
| 176 | 176 | ||
| 177 | for (i = 1; i < cmd->rsp.num; i++) | 177 | for (i = 1; i < cmd->rsp.num; i++) |
| 178 | cmd->rsp.arg[i] = QLCRD32(adapter, QLCNIC_CDRP_ARG(i)); | 178 | cmd->rsp.arg[i] = QLCRD32(adapter, QLCNIC_CDRP_ARG(i), &err); |
| 179 | 179 | ||
| 180 | /* Release semaphore */ | 180 | /* Release semaphore */ |
| 181 | qlcnic_api_unlock(adapter); | 181 | qlcnic_api_unlock(adapter); |
| @@ -210,10 +210,10 @@ int qlcnic_fw_cmd_set_drv_version(struct qlcnic_adapter *adapter, u32 fw_cmd) | |||
| 210 | if (err) { | 210 | if (err) { |
| 211 | dev_info(&adapter->pdev->dev, | 211 | dev_info(&adapter->pdev->dev, |
| 212 | "Failed to set driver version in firmware\n"); | 212 | "Failed to set driver version in firmware\n"); |
| 213 | return -EIO; | 213 | err = -EIO; |
| 214 | } | 214 | } |
| 215 | 215 | qlcnic_free_mbx_args(&cmd); | |
| 216 | return 0; | 216 | return err; |
| 217 | } | 217 | } |
| 218 | 218 | ||
| 219 | int | 219 | int |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c index 700a46324d09..7aac23ab31d1 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c | |||
| @@ -150,6 +150,7 @@ static const char qlcnic_gstrings_test[][ETH_GSTRING_LEN] = { | |||
| 150 | "Link_Test_on_offline", | 150 | "Link_Test_on_offline", |
| 151 | "Interrupt_Test_offline", | 151 | "Interrupt_Test_offline", |
| 152 | "Internal_Loopback_offline", | 152 | "Internal_Loopback_offline", |
| 153 | "External_Loopback_offline", | ||
| 153 | "EEPROM_Test_offline" | 154 | "EEPROM_Test_offline" |
| 154 | }; | 155 | }; |
| 155 | 156 | ||
| @@ -266,7 +267,7 @@ int qlcnic_82xx_get_settings(struct qlcnic_adapter *adapter, | |||
| 266 | { | 267 | { |
| 267 | struct qlcnic_hardware_context *ahw = adapter->ahw; | 268 | struct qlcnic_hardware_context *ahw = adapter->ahw; |
| 268 | u32 speed, reg; | 269 | u32 speed, reg; |
| 269 | int check_sfp_module = 0; | 270 | int check_sfp_module = 0, err = 0; |
| 270 | u16 pcifn = ahw->pci_func; | 271 | u16 pcifn = ahw->pci_func; |
| 271 | 272 | ||
| 272 | /* read which mode */ | 273 | /* read which mode */ |
| @@ -289,7 +290,7 @@ int qlcnic_82xx_get_settings(struct qlcnic_adapter *adapter, | |||
| 289 | 290 | ||
| 290 | } else if (adapter->ahw->port_type == QLCNIC_XGBE) { | 291 | } else if (adapter->ahw->port_type == QLCNIC_XGBE) { |
| 291 | u32 val = 0; | 292 | u32 val = 0; |
| 292 | val = QLCRD32(adapter, QLCNIC_PORT_MODE_ADDR); | 293 | val = QLCRD32(adapter, QLCNIC_PORT_MODE_ADDR, &err); |
| 293 | 294 | ||
| 294 | if (val == QLCNIC_PORT_MODE_802_3_AP) { | 295 | if (val == QLCNIC_PORT_MODE_802_3_AP) { |
| 295 | ecmd->supported = SUPPORTED_1000baseT_Full; | 296 | ecmd->supported = SUPPORTED_1000baseT_Full; |
| @@ -300,9 +301,13 @@ int qlcnic_82xx_get_settings(struct qlcnic_adapter *adapter, | |||
| 300 | } | 301 | } |
| 301 | 302 | ||
| 302 | if (netif_running(adapter->netdev) && ahw->has_link_events) { | 303 | if (netif_running(adapter->netdev) && ahw->has_link_events) { |
| 303 | reg = QLCRD32(adapter, P3P_LINK_SPEED_REG(pcifn)); | 304 | if (ahw->linkup) { |
| 304 | speed = P3P_LINK_SPEED_VAL(pcifn, reg); | 305 | reg = QLCRD32(adapter, |
| 305 | ahw->link_speed = speed * P3P_LINK_SPEED_MHZ; | 306 | P3P_LINK_SPEED_REG(pcifn), &err); |
| 307 | speed = P3P_LINK_SPEED_VAL(pcifn, reg); | ||
| 308 | ahw->link_speed = speed * P3P_LINK_SPEED_MHZ; | ||
| 309 | } | ||
| 310 | |||
| 306 | ethtool_cmd_speed_set(ecmd, ahw->link_speed); | 311 | ethtool_cmd_speed_set(ecmd, ahw->link_speed); |
| 307 | ecmd->autoneg = ahw->link_autoneg; | 312 | ecmd->autoneg = ahw->link_autoneg; |
| 308 | ecmd->duplex = ahw->link_duplex; | 313 | ecmd->duplex = ahw->link_duplex; |
| @@ -463,13 +468,14 @@ static int qlcnic_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd) | |||
| 463 | static int qlcnic_82xx_get_registers(struct qlcnic_adapter *adapter, | 468 | static int qlcnic_82xx_get_registers(struct qlcnic_adapter *adapter, |
| 464 | u32 *regs_buff) | 469 | u32 *regs_buff) |
| 465 | { | 470 | { |
| 466 | int i, j = 0; | 471 | int i, j = 0, err = 0; |
| 467 | 472 | ||
| 468 | for (i = QLCNIC_DEV_INFO_SIZE + 1; diag_registers[j] != -1; j++, i++) | 473 | for (i = QLCNIC_DEV_INFO_SIZE + 1; diag_registers[j] != -1; j++, i++) |
| 469 | regs_buff[i] = QLC_SHARED_REG_RD32(adapter, diag_registers[j]); | 474 | regs_buff[i] = QLC_SHARED_REG_RD32(adapter, diag_registers[j]); |
| 470 | j = 0; | 475 | j = 0; |
| 471 | while (ext_diag_registers[j] != -1) | 476 | while (ext_diag_registers[j] != -1) |
| 472 | regs_buff[i++] = QLCRD32(adapter, ext_diag_registers[j++]); | 477 | regs_buff[i++] = QLCRD32(adapter, ext_diag_registers[j++], |
| 478 | &err); | ||
| 473 | return i; | 479 | return i; |
| 474 | } | 480 | } |
| 475 | 481 | ||
| @@ -519,13 +525,16 @@ qlcnic_get_regs(struct net_device *dev, struct ethtool_regs *regs, void *p) | |||
| 519 | static u32 qlcnic_test_link(struct net_device *dev) | 525 | static u32 qlcnic_test_link(struct net_device *dev) |
| 520 | { | 526 | { |
| 521 | struct qlcnic_adapter *adapter = netdev_priv(dev); | 527 | struct qlcnic_adapter *adapter = netdev_priv(dev); |
| 528 | int err = 0; | ||
| 522 | u32 val; | 529 | u32 val; |
| 523 | 530 | ||
| 524 | if (qlcnic_83xx_check(adapter)) { | 531 | if (qlcnic_83xx_check(adapter)) { |
| 525 | val = qlcnic_83xx_test_link(adapter); | 532 | val = qlcnic_83xx_test_link(adapter); |
| 526 | return (val & 1) ? 0 : 1; | 533 | return (val & 1) ? 0 : 1; |
| 527 | } | 534 | } |
| 528 | val = QLCRD32(adapter, CRB_XG_STATE_P3P); | 535 | val = QLCRD32(adapter, CRB_XG_STATE_P3P, &err); |
| 536 | if (err == -EIO) | ||
| 537 | return err; | ||
| 529 | val = XG_LINK_STATE_P3P(adapter->ahw->pci_func, val); | 538 | val = XG_LINK_STATE_P3P(adapter->ahw->pci_func, val); |
| 530 | return (val == XG_LINK_UP_P3P) ? 0 : 1; | 539 | return (val == XG_LINK_UP_P3P) ? 0 : 1; |
| 531 | } | 540 | } |
| @@ -658,6 +667,7 @@ qlcnic_get_pauseparam(struct net_device *netdev, | |||
| 658 | { | 667 | { |
| 659 | struct qlcnic_adapter *adapter = netdev_priv(netdev); | 668 | struct qlcnic_adapter *adapter = netdev_priv(netdev); |
| 660 | int port = adapter->ahw->physical_port; | 669 | int port = adapter->ahw->physical_port; |
| 670 | int err = 0; | ||
| 661 | __u32 val; | 671 | __u32 val; |
| 662 | 672 | ||
| 663 | if (qlcnic_83xx_check(adapter)) { | 673 | if (qlcnic_83xx_check(adapter)) { |
| @@ -668,9 +678,13 @@ qlcnic_get_pauseparam(struct net_device *netdev, | |||
| 668 | if ((port < 0) || (port > QLCNIC_NIU_MAX_GBE_PORTS)) | 678 | if ((port < 0) || (port > QLCNIC_NIU_MAX_GBE_PORTS)) |
| 669 | return; | 679 | return; |
| 670 | /* get flow control settings */ | 680 | /* get flow control settings */ |
| 671 | val = QLCRD32(adapter, QLCNIC_NIU_GB_MAC_CONFIG_0(port)); | 681 | val = QLCRD32(adapter, QLCNIC_NIU_GB_MAC_CONFIG_0(port), &err); |
| 682 | if (err == -EIO) | ||
| 683 | return; | ||
| 672 | pause->rx_pause = qlcnic_gb_get_rx_flowctl(val); | 684 | pause->rx_pause = qlcnic_gb_get_rx_flowctl(val); |
| 673 | val = QLCRD32(adapter, QLCNIC_NIU_GB_PAUSE_CTL); | 685 | val = QLCRD32(adapter, QLCNIC_NIU_GB_PAUSE_CTL, &err); |
| 686 | if (err == -EIO) | ||
| 687 | return; | ||
| 674 | switch (port) { | 688 | switch (port) { |
| 675 | case 0: | 689 | case 0: |
| 676 | pause->tx_pause = !(qlcnic_gb_get_gb0_mask(val)); | 690 | pause->tx_pause = !(qlcnic_gb_get_gb0_mask(val)); |
| @@ -690,7 +704,9 @@ qlcnic_get_pauseparam(struct net_device *netdev, | |||
| 690 | if ((port < 0) || (port > QLCNIC_NIU_MAX_XG_PORTS)) | 704 | if ((port < 0) || (port > QLCNIC_NIU_MAX_XG_PORTS)) |
| 691 | return; | 705 | return; |
| 692 | pause->rx_pause = 1; | 706 | pause->rx_pause = 1; |
| 693 | val = QLCRD32(adapter, QLCNIC_NIU_XG_PAUSE_CTL); | 707 | val = QLCRD32(adapter, QLCNIC_NIU_XG_PAUSE_CTL, &err); |
| 708 | if (err == -EIO) | ||
| 709 | return; | ||
| 694 | if (port == 0) | 710 | if (port == 0) |
| 695 | pause->tx_pause = !(qlcnic_xg_get_xg0_mask(val)); | 711 | pause->tx_pause = !(qlcnic_xg_get_xg0_mask(val)); |
| 696 | else | 712 | else |
| @@ -707,6 +723,7 @@ qlcnic_set_pauseparam(struct net_device *netdev, | |||
| 707 | { | 723 | { |
| 708 | struct qlcnic_adapter *adapter = netdev_priv(netdev); | 724 | struct qlcnic_adapter *adapter = netdev_priv(netdev); |
| 709 | int port = adapter->ahw->physical_port; | 725 | int port = adapter->ahw->physical_port; |
| 726 | int err = 0; | ||
| 710 | __u32 val; | 727 | __u32 val; |
| 711 | 728 | ||
| 712 | if (qlcnic_83xx_check(adapter)) | 729 | if (qlcnic_83xx_check(adapter)) |
| @@ -717,7 +734,9 @@ qlcnic_set_pauseparam(struct net_device *netdev, | |||
| 717 | if ((port < 0) || (port > QLCNIC_NIU_MAX_GBE_PORTS)) | 734 | if ((port < 0) || (port > QLCNIC_NIU_MAX_GBE_PORTS)) |
| 718 | return -EIO; | 735 | return -EIO; |
| 719 | /* set flow control */ | 736 | /* set flow control */ |
| 720 | val = QLCRD32(adapter, QLCNIC_NIU_GB_MAC_CONFIG_0(port)); | 737 | val = QLCRD32(adapter, QLCNIC_NIU_GB_MAC_CONFIG_0(port), &err); |
| 738 | if (err == -EIO) | ||
| 739 | return err; | ||
| 721 | 740 | ||
| 722 | if (pause->rx_pause) | 741 | if (pause->rx_pause) |
| 723 | qlcnic_gb_rx_flowctl(val); | 742 | qlcnic_gb_rx_flowctl(val); |
| @@ -728,7 +747,9 @@ qlcnic_set_pauseparam(struct net_device *netdev, | |||
| 728 | val); | 747 | val); |
| 729 | QLCWR32(adapter, QLCNIC_NIU_GB_MAC_CONFIG_0(port), val); | 748 | QLCWR32(adapter, QLCNIC_NIU_GB_MAC_CONFIG_0(port), val); |
| 730 | /* set autoneg */ | 749 | /* set autoneg */ |
| 731 | val = QLCRD32(adapter, QLCNIC_NIU_GB_PAUSE_CTL); | 750 | val = QLCRD32(adapter, QLCNIC_NIU_GB_PAUSE_CTL, &err); |
| 751 | if (err == -EIO) | ||
| 752 | return err; | ||
| 732 | switch (port) { | 753 | switch (port) { |
| 733 | case 0: | 754 | case 0: |
| 734 | if (pause->tx_pause) | 755 | if (pause->tx_pause) |
| @@ -764,7 +785,9 @@ qlcnic_set_pauseparam(struct net_device *netdev, | |||
| 764 | if ((port < 0) || (port > QLCNIC_NIU_MAX_XG_PORTS)) | 785 | if ((port < 0) || (port > QLCNIC_NIU_MAX_XG_PORTS)) |
| 765 | return -EIO; | 786 | return -EIO; |
| 766 | 787 | ||
| 767 | val = QLCRD32(adapter, QLCNIC_NIU_XG_PAUSE_CTL); | 788 | val = QLCRD32(adapter, QLCNIC_NIU_XG_PAUSE_CTL, &err); |
| 789 | if (err == -EIO) | ||
| 790 | return err; | ||
| 768 | if (port == 0) { | 791 | if (port == 0) { |
| 769 | if (pause->tx_pause) | 792 | if (pause->tx_pause) |
| 770 | qlcnic_xg_unset_xg0_mask(val); | 793 | qlcnic_xg_unset_xg0_mask(val); |
| @@ -788,11 +811,14 @@ static int qlcnic_reg_test(struct net_device *dev) | |||
| 788 | { | 811 | { |
| 789 | struct qlcnic_adapter *adapter = netdev_priv(dev); | 812 | struct qlcnic_adapter *adapter = netdev_priv(dev); |
| 790 | u32 data_read; | 813 | u32 data_read; |
| 814 | int err = 0; | ||
| 791 | 815 | ||
| 792 | if (qlcnic_83xx_check(adapter)) | 816 | if (qlcnic_83xx_check(adapter)) |
| 793 | return qlcnic_83xx_reg_test(adapter); | 817 | return qlcnic_83xx_reg_test(adapter); |
| 794 | 818 | ||
| 795 | data_read = QLCRD32(adapter, QLCNIC_PCIX_PH_REG(0)); | 819 | data_read = QLCRD32(adapter, QLCNIC_PCIX_PH_REG(0), &err); |
| 820 | if (err == -EIO) | ||
| 821 | return err; | ||
| 796 | if ((data_read & 0xffff) != adapter->pdev->vendor) | 822 | if ((data_read & 0xffff) != adapter->pdev->vendor) |
| 797 | return 1; | 823 | return 1; |
| 798 | 824 | ||
| @@ -1026,8 +1052,15 @@ qlcnic_diag_test(struct net_device *dev, struct ethtool_test *eth_test, | |||
| 1026 | if (data[3]) | 1052 | if (data[3]) |
| 1027 | eth_test->flags |= ETH_TEST_FL_FAILED; | 1053 | eth_test->flags |= ETH_TEST_FL_FAILED; |
| 1028 | 1054 | ||
| 1029 | data[4] = qlcnic_eeprom_test(dev); | 1055 | if (eth_test->flags & ETH_TEST_FL_EXTERNAL_LB) { |
| 1030 | if (data[4]) | 1056 | data[4] = qlcnic_loopback_test(dev, QLCNIC_ELB_MODE); |
| 1057 | if (data[4]) | ||
| 1058 | eth_test->flags |= ETH_TEST_FL_FAILED; | ||
| 1059 | eth_test->flags |= ETH_TEST_FL_EXTERNAL_LB_DONE; | ||
| 1060 | } | ||
| 1061 | |||
| 1062 | data[5] = qlcnic_eeprom_test(dev); | ||
| 1063 | if (data[5]) | ||
| 1031 | eth_test->flags |= ETH_TEST_FL_FAILED; | 1064 | eth_test->flags |= ETH_TEST_FL_FAILED; |
| 1032 | } | 1065 | } |
| 1033 | } | 1066 | } |
| @@ -1257,17 +1290,20 @@ qlcnic_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol) | |||
| 1257 | { | 1290 | { |
| 1258 | struct qlcnic_adapter *adapter = netdev_priv(dev); | 1291 | struct qlcnic_adapter *adapter = netdev_priv(dev); |
| 1259 | u32 wol_cfg; | 1292 | u32 wol_cfg; |
| 1293 | int err = 0; | ||
| 1260 | 1294 | ||
| 1261 | if (qlcnic_83xx_check(adapter)) | 1295 | if (qlcnic_83xx_check(adapter)) |
| 1262 | return; | 1296 | return; |
| 1263 | wol->supported = 0; | 1297 | wol->supported = 0; |
| 1264 | wol->wolopts = 0; | 1298 | wol->wolopts = 0; |
| 1265 | 1299 | ||
| 1266 | wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG_NV); | 1300 | wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG_NV, &err); |
| 1301 | if (err == -EIO) | ||
| 1302 | return; | ||
| 1267 | if (wol_cfg & (1UL << adapter->portnum)) | 1303 | if (wol_cfg & (1UL << adapter->portnum)) |
| 1268 | wol->supported |= WAKE_MAGIC; | 1304 | wol->supported |= WAKE_MAGIC; |
| 1269 | 1305 | ||
| 1270 | wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG); | 1306 | wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG, &err); |
| 1271 | if (wol_cfg & (1UL << adapter->portnum)) | 1307 | if (wol_cfg & (1UL << adapter->portnum)) |
| 1272 | wol->wolopts |= WAKE_MAGIC; | 1308 | wol->wolopts |= WAKE_MAGIC; |
| 1273 | } | 1309 | } |
| @@ -1277,17 +1313,22 @@ qlcnic_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol) | |||
| 1277 | { | 1313 | { |
| 1278 | struct qlcnic_adapter *adapter = netdev_priv(dev); | 1314 | struct qlcnic_adapter *adapter = netdev_priv(dev); |
| 1279 | u32 wol_cfg; | 1315 | u32 wol_cfg; |
| 1316 | int err = 0; | ||
| 1280 | 1317 | ||
| 1281 | if (qlcnic_83xx_check(adapter)) | 1318 | if (qlcnic_83xx_check(adapter)) |
| 1282 | return -EOPNOTSUPP; | 1319 | return -EOPNOTSUPP; |
| 1283 | if (wol->wolopts & ~WAKE_MAGIC) | 1320 | if (wol->wolopts & ~WAKE_MAGIC) |
| 1284 | return -EINVAL; | 1321 | return -EINVAL; |
| 1285 | 1322 | ||
| 1286 | wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG_NV); | 1323 | wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG_NV, &err); |
| 1324 | if (err == -EIO) | ||
| 1325 | return err; | ||
| 1287 | if (!(wol_cfg & (1 << adapter->portnum))) | 1326 | if (!(wol_cfg & (1 << adapter->portnum))) |
| 1288 | return -EOPNOTSUPP; | 1327 | return -EOPNOTSUPP; |
| 1289 | 1328 | ||
| 1290 | wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG); | 1329 | wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG, &err); |
| 1330 | if (err == -EIO) | ||
| 1331 | return err; | ||
| 1291 | if (wol->wolopts & WAKE_MAGIC) | 1332 | if (wol->wolopts & WAKE_MAGIC) |
| 1292 | wol_cfg |= 1UL << adapter->portnum; | 1333 | wol_cfg |= 1UL << adapter->portnum; |
| 1293 | else | 1334 | else |
| @@ -1540,7 +1581,7 @@ qlcnic_set_dump(struct net_device *netdev, struct ethtool_dump *val) | |||
| 1540 | return 0; | 1581 | return 0; |
| 1541 | case QLCNIC_SET_QUIESCENT: | 1582 | case QLCNIC_SET_QUIESCENT: |
| 1542 | case QLCNIC_RESET_QUIESCENT: | 1583 | case QLCNIC_RESET_QUIESCENT: |
| 1543 | state = QLCRD32(adapter, QLCNIC_CRB_DEV_STATE); | 1584 | state = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DEV_STATE); |
| 1544 | if (state == QLCNIC_DEV_FAILED || (state == QLCNIC_DEV_BADBAD)) | 1585 | if (state == QLCNIC_DEV_FAILED || (state == QLCNIC_DEV_BADBAD)) |
| 1545 | netdev_info(netdev, "Device in FAILED state\n"); | 1586 | netdev_info(netdev, "Device in FAILED state\n"); |
| 1546 | return 0; | 1587 | return 0; |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.c index 5b5d2edf125d..4d5f59b2d153 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.c | |||
| @@ -317,16 +317,20 @@ static void qlcnic_write_window_reg(u32 addr, void __iomem *bar0, u32 data) | |||
| 317 | int | 317 | int |
| 318 | qlcnic_pcie_sem_lock(struct qlcnic_adapter *adapter, int sem, u32 id_reg) | 318 | qlcnic_pcie_sem_lock(struct qlcnic_adapter *adapter, int sem, u32 id_reg) |
| 319 | { | 319 | { |
| 320 | int done = 0, timeout = 0; | 320 | int timeout = 0; |
| 321 | int err = 0; | ||
| 322 | u32 done = 0; | ||
| 321 | 323 | ||
| 322 | while (!done) { | 324 | while (!done) { |
| 323 | done = QLCRD32(adapter, QLCNIC_PCIE_REG(PCIE_SEM_LOCK(sem))); | 325 | done = QLCRD32(adapter, QLCNIC_PCIE_REG(PCIE_SEM_LOCK(sem)), |
| 326 | &err); | ||
| 324 | if (done == 1) | 327 | if (done == 1) |
| 325 | break; | 328 | break; |
| 326 | if (++timeout >= QLCNIC_PCIE_SEM_TIMEOUT) { | 329 | if (++timeout >= QLCNIC_PCIE_SEM_TIMEOUT) { |
| 327 | dev_err(&adapter->pdev->dev, | 330 | dev_err(&adapter->pdev->dev, |
| 328 | "Failed to acquire sem=%d lock; holdby=%d\n", | 331 | "Failed to acquire sem=%d lock; holdby=%d\n", |
| 329 | sem, id_reg ? QLCRD32(adapter, id_reg) : -1); | 332 | sem, |
| 333 | id_reg ? QLCRD32(adapter, id_reg, &err) : -1); | ||
| 330 | return -EIO; | 334 | return -EIO; |
| 331 | } | 335 | } |
| 332 | msleep(1); | 336 | msleep(1); |
| @@ -341,19 +345,22 @@ qlcnic_pcie_sem_lock(struct qlcnic_adapter *adapter, int sem, u32 id_reg) | |||
| 341 | void | 345 | void |
| 342 | qlcnic_pcie_sem_unlock(struct qlcnic_adapter *adapter, int sem) | 346 | qlcnic_pcie_sem_unlock(struct qlcnic_adapter *adapter, int sem) |
| 343 | { | 347 | { |
| 344 | QLCRD32(adapter, QLCNIC_PCIE_REG(PCIE_SEM_UNLOCK(sem))); | 348 | int err = 0; |
| 349 | |||
| 350 | QLCRD32(adapter, QLCNIC_PCIE_REG(PCIE_SEM_UNLOCK(sem)), &err); | ||
| 345 | } | 351 | } |
| 346 | 352 | ||
| 347 | int qlcnic_ind_rd(struct qlcnic_adapter *adapter, u32 addr) | 353 | int qlcnic_ind_rd(struct qlcnic_adapter *adapter, u32 addr) |
| 348 | { | 354 | { |
| 355 | int err = 0; | ||
| 349 | u32 data; | 356 | u32 data; |
| 350 | 357 | ||
| 351 | if (qlcnic_82xx_check(adapter)) | 358 | if (qlcnic_82xx_check(adapter)) |
| 352 | qlcnic_read_window_reg(addr, adapter->ahw->pci_base0, &data); | 359 | qlcnic_read_window_reg(addr, adapter->ahw->pci_base0, &data); |
| 353 | else { | 360 | else { |
| 354 | data = qlcnic_83xx_rd_reg_indirect(adapter, addr); | 361 | data = QLCRD32(adapter, addr, &err); |
| 355 | if (data == -EIO) | 362 | if (err == -EIO) |
| 356 | return -EIO; | 363 | return err; |
| 357 | } | 364 | } |
| 358 | return data; | 365 | return data; |
| 359 | } | 366 | } |
| @@ -516,20 +523,18 @@ void __qlcnic_set_multi(struct net_device *netdev, u16 vlan) | |||
| 516 | if (netdev->flags & IFF_PROMISC) { | 523 | if (netdev->flags & IFF_PROMISC) { |
| 517 | if (!(adapter->flags & QLCNIC_PROMISC_DISABLED)) | 524 | if (!(adapter->flags & QLCNIC_PROMISC_DISABLED)) |
| 518 | mode = VPORT_MISS_MODE_ACCEPT_ALL; | 525 | mode = VPORT_MISS_MODE_ACCEPT_ALL; |
| 519 | } else if (netdev->flags & IFF_ALLMULTI) { | 526 | } else if ((netdev->flags & IFF_ALLMULTI) || |
| 520 | if (netdev_mc_count(netdev) > ahw->max_mc_count) { | 527 | (netdev_mc_count(netdev) > ahw->max_mc_count)) { |
| 521 | mode = VPORT_MISS_MODE_ACCEPT_MULTI; | 528 | mode = VPORT_MISS_MODE_ACCEPT_MULTI; |
| 522 | } else if (!netdev_mc_empty(netdev) && | 529 | } else if (!netdev_mc_empty(netdev) && |
| 523 | !qlcnic_sriov_vf_check(adapter)) { | 530 | !qlcnic_sriov_vf_check(adapter)) { |
| 524 | netdev_for_each_mc_addr(ha, netdev) | 531 | netdev_for_each_mc_addr(ha, netdev) |
| 525 | qlcnic_nic_add_mac(adapter, ha->addr, | 532 | qlcnic_nic_add_mac(adapter, ha->addr, vlan); |
| 526 | vlan); | ||
| 527 | } | ||
| 528 | if (mode != VPORT_MISS_MODE_ACCEPT_MULTI && | ||
| 529 | qlcnic_sriov_vf_check(adapter)) | ||
| 530 | qlcnic_vf_add_mc_list(netdev, vlan); | ||
| 531 | } | 533 | } |
| 532 | 534 | ||
| 535 | if (qlcnic_sriov_vf_check(adapter)) | ||
| 536 | qlcnic_vf_add_mc_list(netdev, vlan); | ||
| 537 | |||
| 533 | /* configure unicast MAC address, if there is not sufficient space | 538 | /* configure unicast MAC address, if there is not sufficient space |
| 534 | * to store all the unicast addresses then enable promiscuous mode | 539 | * to store all the unicast addresses then enable promiscuous mode |
| 535 | */ | 540 | */ |
| @@ -1161,7 +1166,8 @@ int qlcnic_82xx_hw_write_wx_2M(struct qlcnic_adapter *adapter, ulong off, | |||
| 1161 | return -EIO; | 1166 | return -EIO; |
| 1162 | } | 1167 | } |
| 1163 | 1168 | ||
| 1164 | int qlcnic_82xx_hw_read_wx_2M(struct qlcnic_adapter *adapter, ulong off) | 1169 | int qlcnic_82xx_hw_read_wx_2M(struct qlcnic_adapter *adapter, ulong off, |
| 1170 | int *err) | ||
| 1165 | { | 1171 | { |
| 1166 | unsigned long flags; | 1172 | unsigned long flags; |
| 1167 | int rv; | 1173 | int rv; |
| @@ -1417,7 +1423,7 @@ int qlcnic_pci_mem_read_2M(struct qlcnic_adapter *adapter, u64 off, u64 *data) | |||
| 1417 | 1423 | ||
| 1418 | int qlcnic_82xx_get_board_info(struct qlcnic_adapter *adapter) | 1424 | int qlcnic_82xx_get_board_info(struct qlcnic_adapter *adapter) |
| 1419 | { | 1425 | { |
| 1420 | int offset, board_type, magic; | 1426 | int offset, board_type, magic, err = 0; |
| 1421 | struct pci_dev *pdev = adapter->pdev; | 1427 | struct pci_dev *pdev = adapter->pdev; |
| 1422 | 1428 | ||
| 1423 | offset = QLCNIC_FW_MAGIC_OFFSET; | 1429 | offset = QLCNIC_FW_MAGIC_OFFSET; |
| @@ -1437,7 +1443,9 @@ int qlcnic_82xx_get_board_info(struct qlcnic_adapter *adapter) | |||
| 1437 | adapter->ahw->board_type = board_type; | 1443 | adapter->ahw->board_type = board_type; |
| 1438 | 1444 | ||
| 1439 | if (board_type == QLCNIC_BRDTYPE_P3P_4_GB_MM) { | 1445 | if (board_type == QLCNIC_BRDTYPE_P3P_4_GB_MM) { |
| 1440 | u32 gpio = QLCRD32(adapter, QLCNIC_ROMUSB_GLB_PAD_GPIO_I); | 1446 | u32 gpio = QLCRD32(adapter, QLCNIC_ROMUSB_GLB_PAD_GPIO_I, &err); |
| 1447 | if (err == -EIO) | ||
| 1448 | return err; | ||
| 1441 | if ((gpio & 0x8000) == 0) | 1449 | if ((gpio & 0x8000) == 0) |
| 1442 | board_type = QLCNIC_BRDTYPE_P3P_10G_TP; | 1450 | board_type = QLCNIC_BRDTYPE_P3P_10G_TP; |
| 1443 | } | 1451 | } |
| @@ -1477,10 +1485,13 @@ int | |||
| 1477 | qlcnic_wol_supported(struct qlcnic_adapter *adapter) | 1485 | qlcnic_wol_supported(struct qlcnic_adapter *adapter) |
| 1478 | { | 1486 | { |
| 1479 | u32 wol_cfg; | 1487 | u32 wol_cfg; |
| 1488 | int err = 0; | ||
| 1480 | 1489 | ||
| 1481 | wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG_NV); | 1490 | wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG_NV, &err); |
| 1482 | if (wol_cfg & (1UL << adapter->portnum)) { | 1491 | if (wol_cfg & (1UL << adapter->portnum)) { |
| 1483 | wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG); | 1492 | wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG, &err); |
| 1493 | if (err == -EIO) | ||
| 1494 | return err; | ||
| 1484 | if (wol_cfg & (1 << adapter->portnum)) | 1495 | if (wol_cfg & (1 << adapter->portnum)) |
| 1485 | return 1; | 1496 | return 1; |
| 1486 | } | 1497 | } |
| @@ -1541,6 +1552,7 @@ void qlcnic_82xx_get_func_no(struct qlcnic_adapter *adapter) | |||
| 1541 | void qlcnic_82xx_read_crb(struct qlcnic_adapter *adapter, char *buf, | 1552 | void qlcnic_82xx_read_crb(struct qlcnic_adapter *adapter, char *buf, |
| 1542 | loff_t offset, size_t size) | 1553 | loff_t offset, size_t size) |
| 1543 | { | 1554 | { |
| 1555 | int err = 0; | ||
| 1544 | u32 data; | 1556 | u32 data; |
| 1545 | u64 qmdata; | 1557 | u64 qmdata; |
| 1546 | 1558 | ||
| @@ -1548,7 +1560,7 @@ void qlcnic_82xx_read_crb(struct qlcnic_adapter *adapter, char *buf, | |||
| 1548 | qlcnic_pci_camqm_read_2M(adapter, offset, &qmdata); | 1560 | qlcnic_pci_camqm_read_2M(adapter, offset, &qmdata); |
| 1549 | memcpy(buf, &qmdata, size); | 1561 | memcpy(buf, &qmdata, size); |
| 1550 | } else { | 1562 | } else { |
| 1551 | data = QLCRD32(adapter, offset); | 1563 | data = QLCRD32(adapter, offset, &err); |
| 1552 | memcpy(buf, &data, size); | 1564 | memcpy(buf, &data, size); |
| 1553 | } | 1565 | } |
| 1554 | } | 1566 | } |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.h b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.h index 2c22504f57aa..4a71b28effcb 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.h +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.h | |||
| @@ -154,7 +154,7 @@ struct qlcnic_hardware_context; | |||
| 154 | struct qlcnic_adapter; | 154 | struct qlcnic_adapter; |
| 155 | 155 | ||
| 156 | int qlcnic_82xx_start_firmware(struct qlcnic_adapter *); | 156 | int qlcnic_82xx_start_firmware(struct qlcnic_adapter *); |
| 157 | int qlcnic_82xx_hw_read_wx_2M(struct qlcnic_adapter *adapter, ulong); | 157 | int qlcnic_82xx_hw_read_wx_2M(struct qlcnic_adapter *adapter, ulong, int *); |
| 158 | int qlcnic_82xx_hw_write_wx_2M(struct qlcnic_adapter *, ulong, u32); | 158 | int qlcnic_82xx_hw_write_wx_2M(struct qlcnic_adapter *, ulong, u32); |
| 159 | int qlcnic_82xx_config_hw_lro(struct qlcnic_adapter *adapter, int); | 159 | int qlcnic_82xx_config_hw_lro(struct qlcnic_adapter *adapter, int); |
| 160 | int qlcnic_82xx_nic_set_promisc(struct qlcnic_adapter *adapter, u32); | 160 | int qlcnic_82xx_nic_set_promisc(struct qlcnic_adapter *adapter, u32); |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_init.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_init.c index d28336fc65ab..974d62607e13 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_init.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_init.c | |||
| @@ -142,7 +142,7 @@ void qlcnic_release_tx_buffers(struct qlcnic_adapter *adapter) | |||
| 142 | buffrag->length, PCI_DMA_TODEVICE); | 142 | buffrag->length, PCI_DMA_TODEVICE); |
| 143 | buffrag->dma = 0ULL; | 143 | buffrag->dma = 0ULL; |
| 144 | } | 144 | } |
| 145 | for (j = 0; j < cmd_buf->frag_count; j++) { | 145 | for (j = 1; j < cmd_buf->frag_count; j++) { |
| 146 | buffrag++; | 146 | buffrag++; |
| 147 | if (buffrag->dma) { | 147 | if (buffrag->dma) { |
| 148 | pci_unmap_page(adapter->pdev, buffrag->dma, | 148 | pci_unmap_page(adapter->pdev, buffrag->dma, |
| @@ -286,10 +286,11 @@ static int qlcnic_wait_rom_done(struct qlcnic_adapter *adapter) | |||
| 286 | { | 286 | { |
| 287 | long timeout = 0; | 287 | long timeout = 0; |
| 288 | long done = 0; | 288 | long done = 0; |
| 289 | int err = 0; | ||
| 289 | 290 | ||
| 290 | cond_resched(); | 291 | cond_resched(); |
| 291 | while (done == 0) { | 292 | while (done == 0) { |
| 292 | done = QLCRD32(adapter, QLCNIC_ROMUSB_GLB_STATUS); | 293 | done = QLCRD32(adapter, QLCNIC_ROMUSB_GLB_STATUS, &err); |
| 293 | done &= 2; | 294 | done &= 2; |
| 294 | if (++timeout >= QLCNIC_MAX_ROM_WAIT_USEC) { | 295 | if (++timeout >= QLCNIC_MAX_ROM_WAIT_USEC) { |
| 295 | dev_err(&adapter->pdev->dev, | 296 | dev_err(&adapter->pdev->dev, |
| @@ -304,6 +305,8 @@ static int qlcnic_wait_rom_done(struct qlcnic_adapter *adapter) | |||
| 304 | static int do_rom_fast_read(struct qlcnic_adapter *adapter, | 305 | static int do_rom_fast_read(struct qlcnic_adapter *adapter, |
| 305 | u32 addr, u32 *valp) | 306 | u32 addr, u32 *valp) |
| 306 | { | 307 | { |
| 308 | int err = 0; | ||
| 309 | |||
| 307 | QLCWR32(adapter, QLCNIC_ROMUSB_ROM_ADDRESS, addr); | 310 | QLCWR32(adapter, QLCNIC_ROMUSB_ROM_ADDRESS, addr); |
| 308 | QLCWR32(adapter, QLCNIC_ROMUSB_ROM_DUMMY_BYTE_CNT, 0); | 311 | QLCWR32(adapter, QLCNIC_ROMUSB_ROM_DUMMY_BYTE_CNT, 0); |
| 309 | QLCWR32(adapter, QLCNIC_ROMUSB_ROM_ABYTE_CNT, 3); | 312 | QLCWR32(adapter, QLCNIC_ROMUSB_ROM_ABYTE_CNT, 3); |
| @@ -317,7 +320,9 @@ static int do_rom_fast_read(struct qlcnic_adapter *adapter, | |||
| 317 | udelay(10); | 320 | udelay(10); |
| 318 | QLCWR32(adapter, QLCNIC_ROMUSB_ROM_DUMMY_BYTE_CNT, 0); | 321 | QLCWR32(adapter, QLCNIC_ROMUSB_ROM_DUMMY_BYTE_CNT, 0); |
| 319 | 322 | ||
| 320 | *valp = QLCRD32(adapter, QLCNIC_ROMUSB_ROM_RDATA); | 323 | *valp = QLCRD32(adapter, QLCNIC_ROMUSB_ROM_RDATA, &err); |
| 324 | if (err == -EIO) | ||
| 325 | return err; | ||
| 321 | return 0; | 326 | return 0; |
| 322 | } | 327 | } |
| 323 | 328 | ||
| @@ -369,11 +374,11 @@ int qlcnic_rom_fast_read(struct qlcnic_adapter *adapter, u32 addr, u32 *valp) | |||
| 369 | 374 | ||
| 370 | int qlcnic_pinit_from_rom(struct qlcnic_adapter *adapter) | 375 | int qlcnic_pinit_from_rom(struct qlcnic_adapter *adapter) |
| 371 | { | 376 | { |
| 372 | int addr, val; | 377 | int addr, err = 0; |
| 373 | int i, n, init_delay; | 378 | int i, n, init_delay; |
| 374 | struct crb_addr_pair *buf; | 379 | struct crb_addr_pair *buf; |
| 375 | unsigned offset; | 380 | unsigned offset; |
| 376 | u32 off; | 381 | u32 off, val; |
| 377 | struct pci_dev *pdev = adapter->pdev; | 382 | struct pci_dev *pdev = adapter->pdev; |
| 378 | 383 | ||
| 379 | QLC_SHARED_REG_WR32(adapter, QLCNIC_CMDPEG_STATE, 0); | 384 | QLC_SHARED_REG_WR32(adapter, QLCNIC_CMDPEG_STATE, 0); |
| @@ -402,7 +407,9 @@ int qlcnic_pinit_from_rom(struct qlcnic_adapter *adapter) | |||
| 402 | QLCWR32(adapter, QLCNIC_CRB_NIU + 0xb0000, 0x00); | 407 | QLCWR32(adapter, QLCNIC_CRB_NIU + 0xb0000, 0x00); |
| 403 | 408 | ||
| 404 | /* halt sre */ | 409 | /* halt sre */ |
| 405 | val = QLCRD32(adapter, QLCNIC_CRB_SRE + 0x1000); | 410 | val = QLCRD32(adapter, QLCNIC_CRB_SRE + 0x1000, &err); |
| 411 | if (err == -EIO) | ||
| 412 | return err; | ||
| 406 | QLCWR32(adapter, QLCNIC_CRB_SRE + 0x1000, val & (~(0x1))); | 413 | QLCWR32(adapter, QLCNIC_CRB_SRE + 0x1000, val & (~(0x1))); |
| 407 | 414 | ||
| 408 | /* halt epg */ | 415 | /* halt epg */ |
| @@ -719,10 +726,12 @@ qlcnic_check_flash_fw_ver(struct qlcnic_adapter *adapter) | |||
| 719 | static int | 726 | static int |
| 720 | qlcnic_has_mn(struct qlcnic_adapter *adapter) | 727 | qlcnic_has_mn(struct qlcnic_adapter *adapter) |
| 721 | { | 728 | { |
| 722 | u32 capability; | 729 | u32 capability = 0; |
| 723 | capability = 0; | 730 | int err = 0; |
| 724 | 731 | ||
| 725 | capability = QLCRD32(adapter, QLCNIC_PEG_TUNE_CAPABILITY); | 732 | capability = QLCRD32(adapter, QLCNIC_PEG_TUNE_CAPABILITY, &err); |
| 733 | if (err == -EIO) | ||
| 734 | return err; | ||
| 726 | if (capability & QLCNIC_PEG_TUNE_MN_PRESENT) | 735 | if (capability & QLCNIC_PEG_TUNE_MN_PRESENT) |
| 727 | return 1; | 736 | return 1; |
| 728 | 737 | ||
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c index d3f8797efcc3..6946d354f44f 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c | |||
| @@ -161,36 +161,68 @@ static inline int qlcnic_82xx_is_lb_pkt(u64 sts_data) | |||
| 161 | return (qlcnic_get_sts_status(sts_data) == STATUS_CKSUM_LOOP) ? 1 : 0; | 161 | return (qlcnic_get_sts_status(sts_data) == STATUS_CKSUM_LOOP) ? 1 : 0; |
| 162 | } | 162 | } |
| 163 | 163 | ||
| 164 | static void qlcnic_delete_rx_list_mac(struct qlcnic_adapter *adapter, | ||
| 165 | struct qlcnic_filter *fil, | ||
| 166 | void *addr, u16 vlan_id) | ||
| 167 | { | ||
| 168 | int ret; | ||
| 169 | u8 op; | ||
| 170 | |||
| 171 | op = vlan_id ? QLCNIC_MAC_VLAN_ADD : QLCNIC_MAC_ADD; | ||
| 172 | ret = qlcnic_sre_macaddr_change(adapter, addr, vlan_id, op); | ||
| 173 | if (ret) | ||
| 174 | return; | ||
| 175 | |||
| 176 | op = vlan_id ? QLCNIC_MAC_VLAN_DEL : QLCNIC_MAC_DEL; | ||
| 177 | ret = qlcnic_sre_macaddr_change(adapter, addr, vlan_id, op); | ||
| 178 | if (!ret) { | ||
| 179 | hlist_del(&fil->fnode); | ||
| 180 | adapter->rx_fhash.fnum--; | ||
| 181 | } | ||
| 182 | } | ||
| 183 | |||
| 184 | static struct qlcnic_filter *qlcnic_find_mac_filter(struct hlist_head *head, | ||
| 185 | void *addr, u16 vlan_id) | ||
| 186 | { | ||
| 187 | struct qlcnic_filter *tmp_fil = NULL; | ||
| 188 | struct hlist_node *n; | ||
| 189 | |||
| 190 | hlist_for_each_entry_safe(tmp_fil, n, head, fnode) { | ||
| 191 | if (!memcmp(tmp_fil->faddr, addr, ETH_ALEN) && | ||
| 192 | tmp_fil->vlan_id == vlan_id) | ||
| 193 | return tmp_fil; | ||
| 194 | } | ||
| 195 | |||
| 196 | return NULL; | ||
| 197 | } | ||
| 198 | |||
| 164 | void qlcnic_add_lb_filter(struct qlcnic_adapter *adapter, struct sk_buff *skb, | 199 | void qlcnic_add_lb_filter(struct qlcnic_adapter *adapter, struct sk_buff *skb, |
| 165 | int loopback_pkt, u16 vlan_id) | 200 | int loopback_pkt, u16 vlan_id) |
| 166 | { | 201 | { |
| 167 | struct ethhdr *phdr = (struct ethhdr *)(skb->data); | 202 | struct ethhdr *phdr = (struct ethhdr *)(skb->data); |
| 168 | struct qlcnic_filter *fil, *tmp_fil; | 203 | struct qlcnic_filter *fil, *tmp_fil; |
| 169 | struct hlist_node *n; | ||
| 170 | struct hlist_head *head; | 204 | struct hlist_head *head; |
| 171 | unsigned long time; | 205 | unsigned long time; |
| 172 | u64 src_addr = 0; | 206 | u64 src_addr = 0; |
| 173 | u8 hindex, found = 0, op; | 207 | u8 hindex, op; |
| 174 | int ret; | 208 | int ret; |
| 175 | 209 | ||
| 176 | memcpy(&src_addr, phdr->h_source, ETH_ALEN); | 210 | memcpy(&src_addr, phdr->h_source, ETH_ALEN); |
| 211 | hindex = qlcnic_mac_hash(src_addr) & | ||
| 212 | (adapter->fhash.fbucket_size - 1); | ||
| 177 | 213 | ||
| 178 | if (loopback_pkt) { | 214 | if (loopback_pkt) { |
| 179 | if (adapter->rx_fhash.fnum >= adapter->rx_fhash.fmax) | 215 | if (adapter->rx_fhash.fnum >= adapter->rx_fhash.fmax) |
| 180 | return; | 216 | return; |
| 181 | 217 | ||
| 182 | hindex = qlcnic_mac_hash(src_addr) & | ||
| 183 | (adapter->fhash.fbucket_size - 1); | ||
| 184 | head = &(adapter->rx_fhash.fhead[hindex]); | 218 | head = &(adapter->rx_fhash.fhead[hindex]); |
| 185 | 219 | ||
| 186 | hlist_for_each_entry_safe(tmp_fil, n, head, fnode) { | 220 | tmp_fil = qlcnic_find_mac_filter(head, &src_addr, vlan_id); |
| 187 | if (!memcmp(tmp_fil->faddr, &src_addr, ETH_ALEN) && | 221 | if (tmp_fil) { |
| 188 | tmp_fil->vlan_id == vlan_id) { | 222 | time = tmp_fil->ftime; |
| 189 | time = tmp_fil->ftime; | 223 | if (time_after(jiffies, QLCNIC_READD_AGE * HZ + time)) |
| 190 | if (jiffies > (QLCNIC_READD_AGE * HZ + time)) | 224 | tmp_fil->ftime = jiffies; |
| 191 | tmp_fil->ftime = jiffies; | 225 | return; |
| 192 | return; | ||
| 193 | } | ||
| 194 | } | 226 | } |
| 195 | 227 | ||
| 196 | fil = kzalloc(sizeof(struct qlcnic_filter), GFP_ATOMIC); | 228 | fil = kzalloc(sizeof(struct qlcnic_filter), GFP_ATOMIC); |
| @@ -205,36 +237,37 @@ void qlcnic_add_lb_filter(struct qlcnic_adapter *adapter, struct sk_buff *skb, | |||
| 205 | adapter->rx_fhash.fnum++; | 237 | adapter->rx_fhash.fnum++; |
| 206 | spin_unlock(&adapter->rx_mac_learn_lock); | 238 | spin_unlock(&adapter->rx_mac_learn_lock); |
| 207 | } else { | 239 | } else { |
| 208 | hindex = qlcnic_mac_hash(src_addr) & | 240 | head = &adapter->fhash.fhead[hindex]; |
| 209 | (adapter->fhash.fbucket_size - 1); | ||
| 210 | head = &(adapter->rx_fhash.fhead[hindex]); | ||
| 211 | spin_lock(&adapter->rx_mac_learn_lock); | ||
| 212 | hlist_for_each_entry_safe(tmp_fil, n, head, fnode) { | ||
| 213 | if (!memcmp(tmp_fil->faddr, &src_addr, ETH_ALEN) && | ||
| 214 | tmp_fil->vlan_id == vlan_id) { | ||
| 215 | found = 1; | ||
| 216 | break; | ||
| 217 | } | ||
| 218 | } | ||
| 219 | 241 | ||
| 220 | if (!found) { | 242 | spin_lock(&adapter->mac_learn_lock); |
| 221 | spin_unlock(&adapter->rx_mac_learn_lock); | ||
| 222 | return; | ||
| 223 | } | ||
| 224 | 243 | ||
| 225 | op = vlan_id ? QLCNIC_MAC_VLAN_ADD : QLCNIC_MAC_ADD; | 244 | tmp_fil = qlcnic_find_mac_filter(head, &src_addr, vlan_id); |
| 226 | ret = qlcnic_sre_macaddr_change(adapter, (u8 *)&src_addr, | 245 | if (tmp_fil) { |
| 227 | vlan_id, op); | ||
| 228 | if (!ret) { | ||
| 229 | op = vlan_id ? QLCNIC_MAC_VLAN_DEL : QLCNIC_MAC_DEL; | 246 | op = vlan_id ? QLCNIC_MAC_VLAN_DEL : QLCNIC_MAC_DEL; |
| 230 | ret = qlcnic_sre_macaddr_change(adapter, | 247 | ret = qlcnic_sre_macaddr_change(adapter, |
| 231 | (u8 *)&src_addr, | 248 | (u8 *)&src_addr, |
| 232 | vlan_id, op); | 249 | vlan_id, op); |
| 233 | if (!ret) { | 250 | if (!ret) { |
| 234 | hlist_del(&(tmp_fil->fnode)); | 251 | hlist_del(&tmp_fil->fnode); |
| 235 | adapter->rx_fhash.fnum--; | 252 | adapter->fhash.fnum--; |
| 236 | } | 253 | } |
| 254 | |||
| 255 | spin_unlock(&adapter->mac_learn_lock); | ||
| 256 | |||
| 257 | return; | ||
| 237 | } | 258 | } |
| 259 | |||
| 260 | spin_unlock(&adapter->mac_learn_lock); | ||
| 261 | |||
| 262 | head = &adapter->rx_fhash.fhead[hindex]; | ||
| 263 | |||
| 264 | spin_lock(&adapter->rx_mac_learn_lock); | ||
| 265 | |||
| 266 | tmp_fil = qlcnic_find_mac_filter(head, &src_addr, vlan_id); | ||
| 267 | if (tmp_fil) | ||
| 268 | qlcnic_delete_rx_list_mac(adapter, tmp_fil, &src_addr, | ||
| 269 | vlan_id); | ||
| 270 | |||
| 238 | spin_unlock(&adapter->rx_mac_learn_lock); | 271 | spin_unlock(&adapter->rx_mac_learn_lock); |
| 239 | } | 272 | } |
| 240 | } | 273 | } |
| @@ -262,7 +295,7 @@ void qlcnic_82xx_change_filter(struct qlcnic_adapter *adapter, u64 *uaddr, | |||
| 262 | 295 | ||
| 263 | mac_req = (struct qlcnic_mac_req *)&(req->words[0]); | 296 | mac_req = (struct qlcnic_mac_req *)&(req->words[0]); |
| 264 | mac_req->op = vlan_id ? QLCNIC_MAC_VLAN_ADD : QLCNIC_MAC_ADD; | 297 | mac_req->op = vlan_id ? QLCNIC_MAC_VLAN_ADD : QLCNIC_MAC_ADD; |
| 265 | memcpy(mac_req->mac_addr, &uaddr, ETH_ALEN); | 298 | memcpy(mac_req->mac_addr, uaddr, ETH_ALEN); |
| 266 | 299 | ||
| 267 | vlan_req = (struct qlcnic_vlan_req *)&req->words[1]; | 300 | vlan_req = (struct qlcnic_vlan_req *)&req->words[1]; |
| 268 | vlan_req->vlan_id = cpu_to_le16(vlan_id); | 301 | vlan_req->vlan_id = cpu_to_le16(vlan_id); |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c index 4528f8ec333b..ee013fcc3322 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c | |||
| @@ -977,8 +977,8 @@ qlcnic_check_options(struct qlcnic_adapter *adapter) | |||
| 977 | static int | 977 | static int |
| 978 | qlcnic_initialize_nic(struct qlcnic_adapter *adapter) | 978 | qlcnic_initialize_nic(struct qlcnic_adapter *adapter) |
| 979 | { | 979 | { |
| 980 | int err; | ||
| 981 | struct qlcnic_info nic_info; | 980 | struct qlcnic_info nic_info; |
| 981 | int err = 0; | ||
| 982 | 982 | ||
| 983 | memset(&nic_info, 0, sizeof(struct qlcnic_info)); | 983 | memset(&nic_info, 0, sizeof(struct qlcnic_info)); |
| 984 | err = qlcnic_get_nic_info(adapter, &nic_info, adapter->ahw->pci_func); | 984 | err = qlcnic_get_nic_info(adapter, &nic_info, adapter->ahw->pci_func); |
| @@ -993,7 +993,9 @@ qlcnic_initialize_nic(struct qlcnic_adapter *adapter) | |||
| 993 | 993 | ||
| 994 | if (adapter->ahw->capabilities & QLCNIC_FW_CAPABILITY_MORE_CAPS) { | 994 | if (adapter->ahw->capabilities & QLCNIC_FW_CAPABILITY_MORE_CAPS) { |
| 995 | u32 temp; | 995 | u32 temp; |
| 996 | temp = QLCRD32(adapter, CRB_FW_CAPABILITIES_2); | 996 | temp = QLCRD32(adapter, CRB_FW_CAPABILITIES_2, &err); |
| 997 | if (err == -EIO) | ||
| 998 | return err; | ||
| 997 | adapter->ahw->extra_capability[0] = temp; | 999 | adapter->ahw->extra_capability[0] = temp; |
| 998 | } | 1000 | } |
| 999 | adapter->ahw->max_mac_filters = nic_info.max_mac_filters; | 1001 | adapter->ahw->max_mac_filters = nic_info.max_mac_filters; |
| @@ -1383,6 +1385,8 @@ qlcnic_request_irq(struct qlcnic_adapter *adapter) | |||
| 1383 | if (adapter->ahw->diag_test == QLCNIC_INTERRUPT_TEST) { | 1385 | if (adapter->ahw->diag_test == QLCNIC_INTERRUPT_TEST) { |
| 1384 | if (qlcnic_82xx_check(adapter)) | 1386 | if (qlcnic_82xx_check(adapter)) |
| 1385 | handler = qlcnic_tmp_intr; | 1387 | handler = qlcnic_tmp_intr; |
| 1388 | else | ||
| 1389 | handler = qlcnic_83xx_tmp_intr; | ||
| 1386 | if (!QLCNIC_IS_MSI_FAMILY(adapter)) | 1390 | if (!QLCNIC_IS_MSI_FAMILY(adapter)) |
| 1387 | flags |= IRQF_SHARED; | 1391 | flags |= IRQF_SHARED; |
| 1388 | 1392 | ||
| @@ -1531,12 +1535,12 @@ int __qlcnic_up(struct qlcnic_adapter *adapter, struct net_device *netdev) | |||
| 1531 | if (netdev->features & NETIF_F_LRO) | 1535 | if (netdev->features & NETIF_F_LRO) |
| 1532 | qlcnic_config_hw_lro(adapter, QLCNIC_LRO_ENABLED); | 1536 | qlcnic_config_hw_lro(adapter, QLCNIC_LRO_ENABLED); |
| 1533 | 1537 | ||
| 1538 | set_bit(__QLCNIC_DEV_UP, &adapter->state); | ||
| 1534 | qlcnic_napi_enable(adapter); | 1539 | qlcnic_napi_enable(adapter); |
| 1535 | 1540 | ||
| 1536 | qlcnic_linkevent_request(adapter, 1); | 1541 | qlcnic_linkevent_request(adapter, 1); |
| 1537 | 1542 | ||
| 1538 | adapter->ahw->reset_context = 0; | 1543 | adapter->ahw->reset_context = 0; |
| 1539 | set_bit(__QLCNIC_DEV_UP, &adapter->state); | ||
| 1540 | return 0; | 1544 | return 0; |
| 1541 | } | 1545 | } |
| 1542 | 1546 | ||
| @@ -2139,7 +2143,7 @@ qlcnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 2139 | if (qlcnic_83xx_check(adapter) && !qlcnic_use_msi_x && | 2143 | if (qlcnic_83xx_check(adapter) && !qlcnic_use_msi_x && |
| 2140 | !!qlcnic_use_msi) | 2144 | !!qlcnic_use_msi) |
| 2141 | dev_warn(&pdev->dev, | 2145 | dev_warn(&pdev->dev, |
| 2142 | "83xx adapter do not support MSI interrupts\n"); | 2146 | "Device does not support MSI interrupts\n"); |
| 2143 | 2147 | ||
| 2144 | err = qlcnic_setup_intr(adapter, 0); | 2148 | err = qlcnic_setup_intr(adapter, 0); |
| 2145 | if (err) { | 2149 | if (err) { |
| @@ -3093,6 +3097,7 @@ qlcnic_check_health(struct qlcnic_adapter *adapter) | |||
| 3093 | { | 3097 | { |
| 3094 | u32 state = 0, heartbeat; | 3098 | u32 state = 0, heartbeat; |
| 3095 | u32 peg_status; | 3099 | u32 peg_status; |
| 3100 | int err = 0; | ||
| 3096 | 3101 | ||
| 3097 | if (qlcnic_check_temp(adapter)) | 3102 | if (qlcnic_check_temp(adapter)) |
| 3098 | goto detach; | 3103 | goto detach; |
| @@ -3139,11 +3144,11 @@ qlcnic_check_health(struct qlcnic_adapter *adapter) | |||
| 3139 | "PEG_NET_4_PC: 0x%x\n", | 3144 | "PEG_NET_4_PC: 0x%x\n", |
| 3140 | peg_status, | 3145 | peg_status, |
| 3141 | QLC_SHARED_REG_RD32(adapter, QLCNIC_PEG_HALT_STATUS2), | 3146 | QLC_SHARED_REG_RD32(adapter, QLCNIC_PEG_HALT_STATUS2), |
| 3142 | QLCRD32(adapter, QLCNIC_CRB_PEG_NET_0 + 0x3c), | 3147 | QLCRD32(adapter, QLCNIC_CRB_PEG_NET_0 + 0x3c, &err), |
| 3143 | QLCRD32(adapter, QLCNIC_CRB_PEG_NET_1 + 0x3c), | 3148 | QLCRD32(adapter, QLCNIC_CRB_PEG_NET_1 + 0x3c, &err), |
| 3144 | QLCRD32(adapter, QLCNIC_CRB_PEG_NET_2 + 0x3c), | 3149 | QLCRD32(adapter, QLCNIC_CRB_PEG_NET_2 + 0x3c, &err), |
| 3145 | QLCRD32(adapter, QLCNIC_CRB_PEG_NET_3 + 0x3c), | 3150 | QLCRD32(adapter, QLCNIC_CRB_PEG_NET_3 + 0x3c, &err), |
| 3146 | QLCRD32(adapter, QLCNIC_CRB_PEG_NET_4 + 0x3c)); | 3151 | QLCRD32(adapter, QLCNIC_CRB_PEG_NET_4 + 0x3c, &err)); |
| 3147 | if (QLCNIC_FWERROR_CODE(peg_status) == 0x67) | 3152 | if (QLCNIC_FWERROR_CODE(peg_status) == 0x67) |
| 3148 | dev_err(&adapter->pdev->dev, | 3153 | dev_err(&adapter->pdev->dev, |
| 3149 | "Firmware aborted with error code 0x00006700. " | 3154 | "Firmware aborted with error code 0x00006700. " |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c index ab8a6744d402..79e54efe07b9 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c | |||
| @@ -1084,7 +1084,7 @@ flash_temp: | |||
| 1084 | tmpl_hdr = ahw->fw_dump.tmpl_hdr; | 1084 | tmpl_hdr = ahw->fw_dump.tmpl_hdr; |
| 1085 | tmpl_hdr->drv_cap_mask = QLCNIC_DUMP_MASK_DEF; | 1085 | tmpl_hdr->drv_cap_mask = QLCNIC_DUMP_MASK_DEF; |
| 1086 | 1086 | ||
| 1087 | if ((tmpl_hdr->version & 0xffffff) >= 0x20001) | 1087 | if ((tmpl_hdr->version & 0xfffff) >= 0x20001) |
| 1088 | ahw->fw_dump.use_pex_dma = true; | 1088 | ahw->fw_dump.use_pex_dma = true; |
| 1089 | else | 1089 | else |
| 1090 | ahw->fw_dump.use_pex_dma = false; | 1090 | ahw->fw_dump.use_pex_dma = false; |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c index 62380ce89905..5d40045b3cea 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c | |||
| @@ -562,7 +562,7 @@ static int qlcnic_sriov_setup_vf(struct qlcnic_adapter *adapter, | |||
| 562 | INIT_LIST_HEAD(&adapter->vf_mc_list); | 562 | INIT_LIST_HEAD(&adapter->vf_mc_list); |
| 563 | if (!qlcnic_use_msi_x && !!qlcnic_use_msi) | 563 | if (!qlcnic_use_msi_x && !!qlcnic_use_msi) |
| 564 | dev_warn(&adapter->pdev->dev, | 564 | dev_warn(&adapter->pdev->dev, |
| 565 | "83xx adapter do not support MSI interrupts\n"); | 565 | "Device does not support MSI interrupts\n"); |
| 566 | 566 | ||
| 567 | err = qlcnic_setup_intr(adapter, 1); | 567 | err = qlcnic_setup_intr(adapter, 1); |
| 568 | if (err) { | 568 | if (err) { |
| @@ -762,6 +762,7 @@ static int qlcnic_sriov_alloc_bc_mbx_args(struct qlcnic_cmd_args *mbx, u32 type) | |||
| 762 | memset(mbx->rsp.arg, 0, sizeof(u32) * mbx->rsp.num); | 762 | memset(mbx->rsp.arg, 0, sizeof(u32) * mbx->rsp.num); |
| 763 | mbx->req.arg[0] = (type | (mbx->req.num << 16) | | 763 | mbx->req.arg[0] = (type | (mbx->req.num << 16) | |
| 764 | (3 << 29)); | 764 | (3 << 29)); |
| 765 | mbx->rsp.arg[0] = (type & 0xffff) | mbx->rsp.num << 16; | ||
| 765 | return 0; | 766 | return 0; |
| 766 | } | 767 | } |
| 767 | } | 768 | } |
| @@ -813,6 +814,7 @@ static int qlcnic_sriov_prepare_bc_hdr(struct qlcnic_bc_trans *trans, | |||
| 813 | cmd->req.num = trans->req_pay_size / 4; | 814 | cmd->req.num = trans->req_pay_size / 4; |
| 814 | cmd->rsp.num = trans->rsp_pay_size / 4; | 815 | cmd->rsp.num = trans->rsp_pay_size / 4; |
| 815 | hdr = trans->rsp_hdr; | 816 | hdr = trans->rsp_hdr; |
| 817 | cmd->op_type = trans->req_hdr->op_type; | ||
| 816 | } | 818 | } |
| 817 | 819 | ||
| 818 | trans->trans_id = seq; | 820 | trans->trans_id = seq; |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c index ee0c1d307966..eb49cd65378c 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c | |||
| @@ -635,12 +635,12 @@ static int qlcnic_sriov_pf_channel_cfg_cmd(struct qlcnic_bc_trans *trans, | |||
| 635 | struct qlcnic_cmd_args *cmd) | 635 | struct qlcnic_cmd_args *cmd) |
| 636 | { | 636 | { |
| 637 | struct qlcnic_vf_info *vf = trans->vf; | 637 | struct qlcnic_vf_info *vf = trans->vf; |
| 638 | struct qlcnic_adapter *adapter = vf->adapter; | 638 | struct qlcnic_vport *vp = vf->vp; |
| 639 | int err; | 639 | struct qlcnic_adapter *adapter; |
| 640 | u16 func = vf->pci_func; | 640 | u16 func = vf->pci_func; |
| 641 | int err; | ||
| 641 | 642 | ||
| 642 | cmd->rsp.arg[0] = trans->req_hdr->cmd_op; | 643 | adapter = vf->adapter; |
| 643 | cmd->rsp.arg[0] |= (1 << 16); | ||
| 644 | 644 | ||
| 645 | if (trans->req_hdr->cmd_op == QLCNIC_BC_CMD_CHANNEL_INIT) { | 645 | if (trans->req_hdr->cmd_op == QLCNIC_BC_CMD_CHANNEL_INIT) { |
| 646 | err = qlcnic_sriov_pf_config_vport(adapter, 1, func); | 646 | err = qlcnic_sriov_pf_config_vport(adapter, 1, func); |
| @@ -650,6 +650,8 @@ static int qlcnic_sriov_pf_channel_cfg_cmd(struct qlcnic_bc_trans *trans, | |||
| 650 | qlcnic_sriov_pf_config_vport(adapter, 0, func); | 650 | qlcnic_sriov_pf_config_vport(adapter, 0, func); |
| 651 | } | 651 | } |
| 652 | } else { | 652 | } else { |
| 653 | if (vp->vlan_mode == QLC_GUEST_VLAN_MODE) | ||
| 654 | vp->vlan = 0; | ||
| 653 | err = qlcnic_sriov_pf_config_vport(adapter, 0, func); | 655 | err = qlcnic_sriov_pf_config_vport(adapter, 0, func); |
| 654 | } | 656 | } |
| 655 | 657 | ||
| @@ -1183,7 +1185,7 @@ static int qlcnic_sriov_pf_get_acl_cmd(struct qlcnic_bc_trans *trans, | |||
| 1183 | u8 cmd_op, mode = vp->vlan_mode; | 1185 | u8 cmd_op, mode = vp->vlan_mode; |
| 1184 | 1186 | ||
| 1185 | cmd_op = trans->req_hdr->cmd_op; | 1187 | cmd_op = trans->req_hdr->cmd_op; |
| 1186 | cmd->rsp.arg[0] = (cmd_op & 0xffff) | 14 << 16 | 1 << 25; | 1188 | cmd->rsp.arg[0] |= 1 << 25; |
| 1187 | 1189 | ||
| 1188 | switch (mode) { | 1190 | switch (mode) { |
| 1189 | case QLC_GUEST_VLAN_MODE: | 1191 | case QLC_GUEST_VLAN_MODE: |
| @@ -1561,6 +1563,7 @@ void qlcnic_sriov_pf_handle_flr(struct qlcnic_sriov *sriov, | |||
| 1561 | struct qlcnic_vf_info *vf) | 1563 | struct qlcnic_vf_info *vf) |
| 1562 | { | 1564 | { |
| 1563 | struct net_device *dev = vf->adapter->netdev; | 1565 | struct net_device *dev = vf->adapter->netdev; |
| 1566 | struct qlcnic_vport *vp = vf->vp; | ||
| 1564 | 1567 | ||
| 1565 | if (!test_and_clear_bit(QLC_BC_VF_STATE, &vf->state)) { | 1568 | if (!test_and_clear_bit(QLC_BC_VF_STATE, &vf->state)) { |
| 1566 | clear_bit(QLC_BC_VF_FLR, &vf->state); | 1569 | clear_bit(QLC_BC_VF_FLR, &vf->state); |
| @@ -1573,6 +1576,9 @@ void qlcnic_sriov_pf_handle_flr(struct qlcnic_sriov *sriov, | |||
| 1573 | return; | 1576 | return; |
| 1574 | } | 1577 | } |
| 1575 | 1578 | ||
| 1579 | if (vp->vlan_mode == QLC_GUEST_VLAN_MODE) | ||
| 1580 | vp->vlan = 0; | ||
| 1581 | |||
| 1576 | qlcnic_sriov_schedule_flr(sriov, vf, qlcnic_sriov_pf_process_flr); | 1582 | qlcnic_sriov_schedule_flr(sriov, vf, qlcnic_sriov_pf_process_flr); |
| 1577 | netdev_info(dev, "FLR received for PCI func %d\n", vf->pci_func); | 1583 | netdev_info(dev, "FLR received for PCI func %d\n", vf->pci_func); |
| 1578 | } | 1584 | } |
| @@ -1621,13 +1627,15 @@ int qlcnic_sriov_set_vf_mac(struct net_device *netdev, int vf, u8 *mac) | |||
| 1621 | { | 1627 | { |
| 1622 | struct qlcnic_adapter *adapter = netdev_priv(netdev); | 1628 | struct qlcnic_adapter *adapter = netdev_priv(netdev); |
| 1623 | struct qlcnic_sriov *sriov = adapter->ahw->sriov; | 1629 | struct qlcnic_sriov *sriov = adapter->ahw->sriov; |
| 1624 | int i, num_vfs = sriov->num_vfs; | 1630 | int i, num_vfs; |
| 1625 | struct qlcnic_vf_info *vf_info; | 1631 | struct qlcnic_vf_info *vf_info; |
| 1626 | u8 *curr_mac; | 1632 | u8 *curr_mac; |
| 1627 | 1633 | ||
| 1628 | if (!qlcnic_sriov_pf_check(adapter)) | 1634 | if (!qlcnic_sriov_pf_check(adapter)) |
| 1629 | return -EOPNOTSUPP; | 1635 | return -EOPNOTSUPP; |
| 1630 | 1636 | ||
| 1637 | num_vfs = sriov->num_vfs; | ||
| 1638 | |||
| 1631 | if (!is_valid_ether_addr(mac) || vf >= num_vfs) | 1639 | if (!is_valid_ether_addr(mac) || vf >= num_vfs) |
| 1632 | return -EINVAL; | 1640 | return -EINVAL; |
| 1633 | 1641 | ||
| @@ -1741,6 +1749,7 @@ int qlcnic_sriov_set_vf_vlan(struct net_device *netdev, int vf, | |||
| 1741 | 1749 | ||
| 1742 | switch (vlan) { | 1750 | switch (vlan) { |
| 1743 | case 4095: | 1751 | case 4095: |
| 1752 | vp->vlan = 0; | ||
| 1744 | vp->vlan_mode = QLC_GUEST_VLAN_MODE; | 1753 | vp->vlan_mode = QLC_GUEST_VLAN_MODE; |
| 1745 | break; | 1754 | break; |
| 1746 | case 0: | 1755 | case 0: |
| @@ -1759,6 +1768,29 @@ int qlcnic_sriov_set_vf_vlan(struct net_device *netdev, int vf, | |||
| 1759 | return 0; | 1768 | return 0; |
| 1760 | } | 1769 | } |
| 1761 | 1770 | ||
| 1771 | static inline __u32 qlcnic_sriov_get_vf_vlan(struct qlcnic_adapter *adapter, | ||
| 1772 | struct qlcnic_vport *vp, int vf) | ||
| 1773 | { | ||
| 1774 | __u32 vlan = 0; | ||
| 1775 | |||
| 1776 | switch (vp->vlan_mode) { | ||
| 1777 | case QLC_PVID_MODE: | ||
| 1778 | vlan = vp->vlan; | ||
| 1779 | break; | ||
| 1780 | case QLC_GUEST_VLAN_MODE: | ||
| 1781 | vlan = MAX_VLAN_ID; | ||
| 1782 | break; | ||
| 1783 | case QLC_NO_VLAN_MODE: | ||
| 1784 | vlan = 0; | ||
| 1785 | break; | ||
| 1786 | default: | ||
| 1787 | netdev_info(adapter->netdev, "Invalid VLAN mode = %d for VF %d\n", | ||
| 1788 | vp->vlan_mode, vf); | ||
| 1789 | } | ||
| 1790 | |||
| 1791 | return vlan; | ||
| 1792 | } | ||
| 1793 | |||
| 1762 | int qlcnic_sriov_get_vf_config(struct net_device *netdev, | 1794 | int qlcnic_sriov_get_vf_config(struct net_device *netdev, |
| 1763 | int vf, struct ifla_vf_info *ivi) | 1795 | int vf, struct ifla_vf_info *ivi) |
| 1764 | { | 1796 | { |
| @@ -1774,7 +1806,7 @@ int qlcnic_sriov_get_vf_config(struct net_device *netdev, | |||
| 1774 | 1806 | ||
| 1775 | vp = sriov->vf_info[vf].vp; | 1807 | vp = sriov->vf_info[vf].vp; |
| 1776 | memcpy(&ivi->mac, vp->mac, ETH_ALEN); | 1808 | memcpy(&ivi->mac, vp->mac, ETH_ALEN); |
| 1777 | ivi->vlan = vp->vlan; | 1809 | ivi->vlan = qlcnic_sriov_get_vf_vlan(adapter, vp, vf); |
| 1778 | ivi->qos = vp->qos; | 1810 | ivi->qos = vp->qos; |
| 1779 | ivi->spoofchk = vp->spoofchk; | 1811 | ivi->spoofchk = vp->spoofchk; |
| 1780 | if (vp->max_tx_bw == MAX_BW) | 1812 | if (vp->max_tx_bw == MAX_BW) |
diff --git a/drivers/net/ethernet/realtek/8139cp.c b/drivers/net/ethernet/realtek/8139cp.c index e6acb9fa5767..6f35f8404d68 100644 --- a/drivers/net/ethernet/realtek/8139cp.c +++ b/drivers/net/ethernet/realtek/8139cp.c | |||
| @@ -478,7 +478,7 @@ rx_status_loop: | |||
| 478 | 478 | ||
| 479 | while (1) { | 479 | while (1) { |
| 480 | u32 status, len; | 480 | u32 status, len; |
| 481 | dma_addr_t mapping; | 481 | dma_addr_t mapping, new_mapping; |
| 482 | struct sk_buff *skb, *new_skb; | 482 | struct sk_buff *skb, *new_skb; |
| 483 | struct cp_desc *desc; | 483 | struct cp_desc *desc; |
| 484 | const unsigned buflen = cp->rx_buf_sz; | 484 | const unsigned buflen = cp->rx_buf_sz; |
| @@ -520,6 +520,13 @@ rx_status_loop: | |||
| 520 | goto rx_next; | 520 | goto rx_next; |
| 521 | } | 521 | } |
| 522 | 522 | ||
| 523 | new_mapping = dma_map_single(&cp->pdev->dev, new_skb->data, buflen, | ||
| 524 | PCI_DMA_FROMDEVICE); | ||
| 525 | if (dma_mapping_error(&cp->pdev->dev, new_mapping)) { | ||
| 526 | dev->stats.rx_dropped++; | ||
| 527 | goto rx_next; | ||
| 528 | } | ||
| 529 | |||
| 523 | dma_unmap_single(&cp->pdev->dev, mapping, | 530 | dma_unmap_single(&cp->pdev->dev, mapping, |
| 524 | buflen, PCI_DMA_FROMDEVICE); | 531 | buflen, PCI_DMA_FROMDEVICE); |
| 525 | 532 | ||
| @@ -531,12 +538,11 @@ rx_status_loop: | |||
| 531 | 538 | ||
| 532 | skb_put(skb, len); | 539 | skb_put(skb, len); |
| 533 | 540 | ||
| 534 | mapping = dma_map_single(&cp->pdev->dev, new_skb->data, buflen, | ||
| 535 | PCI_DMA_FROMDEVICE); | ||
| 536 | cp->rx_skb[rx_tail] = new_skb; | 541 | cp->rx_skb[rx_tail] = new_skb; |
| 537 | 542 | ||
| 538 | cp_rx_skb(cp, skb, desc); | 543 | cp_rx_skb(cp, skb, desc); |
| 539 | rx++; | 544 | rx++; |
| 545 | mapping = new_mapping; | ||
| 540 | 546 | ||
| 541 | rx_next: | 547 | rx_next: |
| 542 | cp->rx_ring[rx_tail].opts2 = 0; | 548 | cp->rx_ring[rx_tail].opts2 = 0; |
| @@ -716,6 +722,22 @@ static inline u32 cp_tx_vlan_tag(struct sk_buff *skb) | |||
| 716 | TxVlanTag | swab16(vlan_tx_tag_get(skb)) : 0x00; | 722 | TxVlanTag | swab16(vlan_tx_tag_get(skb)) : 0x00; |
| 717 | } | 723 | } |
| 718 | 724 | ||
| 725 | static void unwind_tx_frag_mapping(struct cp_private *cp, struct sk_buff *skb, | ||
| 726 | int first, int entry_last) | ||
| 727 | { | ||
| 728 | int frag, index; | ||
| 729 | struct cp_desc *txd; | ||
| 730 | skb_frag_t *this_frag; | ||
| 731 | for (frag = 0; frag+first < entry_last; frag++) { | ||
| 732 | index = first+frag; | ||
| 733 | cp->tx_skb[index] = NULL; | ||
| 734 | txd = &cp->tx_ring[index]; | ||
| 735 | this_frag = &skb_shinfo(skb)->frags[frag]; | ||
| 736 | dma_unmap_single(&cp->pdev->dev, le64_to_cpu(txd->addr), | ||
| 737 | skb_frag_size(this_frag), PCI_DMA_TODEVICE); | ||
| 738 | } | ||
| 739 | } | ||
| 740 | |||
| 719 | static netdev_tx_t cp_start_xmit (struct sk_buff *skb, | 741 | static netdev_tx_t cp_start_xmit (struct sk_buff *skb, |
| 720 | struct net_device *dev) | 742 | struct net_device *dev) |
| 721 | { | 743 | { |
| @@ -749,6 +771,9 @@ static netdev_tx_t cp_start_xmit (struct sk_buff *skb, | |||
| 749 | 771 | ||
| 750 | len = skb->len; | 772 | len = skb->len; |
| 751 | mapping = dma_map_single(&cp->pdev->dev, skb->data, len, PCI_DMA_TODEVICE); | 773 | mapping = dma_map_single(&cp->pdev->dev, skb->data, len, PCI_DMA_TODEVICE); |
| 774 | if (dma_mapping_error(&cp->pdev->dev, mapping)) | ||
| 775 | goto out_dma_error; | ||
| 776 | |||
| 752 | txd->opts2 = opts2; | 777 | txd->opts2 = opts2; |
| 753 | txd->addr = cpu_to_le64(mapping); | 778 | txd->addr = cpu_to_le64(mapping); |
| 754 | wmb(); | 779 | wmb(); |
| @@ -786,6 +811,9 @@ static netdev_tx_t cp_start_xmit (struct sk_buff *skb, | |||
| 786 | first_len = skb_headlen(skb); | 811 | first_len = skb_headlen(skb); |
| 787 | first_mapping = dma_map_single(&cp->pdev->dev, skb->data, | 812 | first_mapping = dma_map_single(&cp->pdev->dev, skb->data, |
| 788 | first_len, PCI_DMA_TODEVICE); | 813 | first_len, PCI_DMA_TODEVICE); |
| 814 | if (dma_mapping_error(&cp->pdev->dev, first_mapping)) | ||
| 815 | goto out_dma_error; | ||
| 816 | |||
| 789 | cp->tx_skb[entry] = skb; | 817 | cp->tx_skb[entry] = skb; |
| 790 | entry = NEXT_TX(entry); | 818 | entry = NEXT_TX(entry); |
| 791 | 819 | ||
| @@ -799,6 +827,11 @@ static netdev_tx_t cp_start_xmit (struct sk_buff *skb, | |||
| 799 | mapping = dma_map_single(&cp->pdev->dev, | 827 | mapping = dma_map_single(&cp->pdev->dev, |
| 800 | skb_frag_address(this_frag), | 828 | skb_frag_address(this_frag), |
| 801 | len, PCI_DMA_TODEVICE); | 829 | len, PCI_DMA_TODEVICE); |
| 830 | if (dma_mapping_error(&cp->pdev->dev, mapping)) { | ||
| 831 | unwind_tx_frag_mapping(cp, skb, first_entry, entry); | ||
| 832 | goto out_dma_error; | ||
| 833 | } | ||
| 834 | |||
| 802 | eor = (entry == (CP_TX_RING_SIZE - 1)) ? RingEnd : 0; | 835 | eor = (entry == (CP_TX_RING_SIZE - 1)) ? RingEnd : 0; |
| 803 | 836 | ||
| 804 | ctrl = eor | len | DescOwn; | 837 | ctrl = eor | len | DescOwn; |
| @@ -859,11 +892,16 @@ static netdev_tx_t cp_start_xmit (struct sk_buff *skb, | |||
| 859 | if (TX_BUFFS_AVAIL(cp) <= (MAX_SKB_FRAGS + 1)) | 892 | if (TX_BUFFS_AVAIL(cp) <= (MAX_SKB_FRAGS + 1)) |
| 860 | netif_stop_queue(dev); | 893 | netif_stop_queue(dev); |
| 861 | 894 | ||
| 895 | out_unlock: | ||
| 862 | spin_unlock_irqrestore(&cp->lock, intr_flags); | 896 | spin_unlock_irqrestore(&cp->lock, intr_flags); |
| 863 | 897 | ||
| 864 | cpw8(TxPoll, NormalTxPoll); | 898 | cpw8(TxPoll, NormalTxPoll); |
| 865 | 899 | ||
| 866 | return NETDEV_TX_OK; | 900 | return NETDEV_TX_OK; |
| 901 | out_dma_error: | ||
| 902 | kfree_skb(skb); | ||
| 903 | cp->dev->stats.tx_dropped++; | ||
| 904 | goto out_unlock; | ||
| 867 | } | 905 | } |
| 868 | 906 | ||
| 869 | /* Set or clear the multicast filter for this adaptor. | 907 | /* Set or clear the multicast filter for this adaptor. |
| @@ -1054,6 +1092,10 @@ static int cp_refill_rx(struct cp_private *cp) | |||
| 1054 | 1092 | ||
| 1055 | mapping = dma_map_single(&cp->pdev->dev, skb->data, | 1093 | mapping = dma_map_single(&cp->pdev->dev, skb->data, |
| 1056 | cp->rx_buf_sz, PCI_DMA_FROMDEVICE); | 1094 | cp->rx_buf_sz, PCI_DMA_FROMDEVICE); |
| 1095 | if (dma_mapping_error(&cp->pdev->dev, mapping)) { | ||
| 1096 | kfree_skb(skb); | ||
| 1097 | goto err_out; | ||
| 1098 | } | ||
| 1057 | cp->rx_skb[i] = skb; | 1099 | cp->rx_skb[i] = skb; |
| 1058 | 1100 | ||
| 1059 | cp->rx_ring[i].opts2 = 0; | 1101 | cp->rx_ring[i].opts2 = 0; |
diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c index 4106a743ca74..b5eb4195fc99 100644 --- a/drivers/net/ethernet/realtek/r8169.c +++ b/drivers/net/ethernet/realtek/r8169.c | |||
| @@ -3689,7 +3689,7 @@ static void rtl_phy_work(struct rtl8169_private *tp) | |||
| 3689 | if (tp->link_ok(ioaddr)) | 3689 | if (tp->link_ok(ioaddr)) |
| 3690 | return; | 3690 | return; |
| 3691 | 3691 | ||
| 3692 | netif_warn(tp, link, tp->dev, "PHY reset until link up\n"); | 3692 | netif_dbg(tp, link, tp->dev, "PHY reset until link up\n"); |
| 3693 | 3693 | ||
| 3694 | tp->phy_reset_enable(tp); | 3694 | tp->phy_reset_enable(tp); |
| 3695 | 3695 | ||
| @@ -6468,6 +6468,8 @@ static int rtl8169_close(struct net_device *dev) | |||
| 6468 | rtl8169_down(dev); | 6468 | rtl8169_down(dev); |
| 6469 | rtl_unlock_work(tp); | 6469 | rtl_unlock_work(tp); |
| 6470 | 6470 | ||
| 6471 | cancel_work_sync(&tp->wk.work); | ||
| 6472 | |||
| 6471 | free_irq(pdev->irq, dev); | 6473 | free_irq(pdev->irq, dev); |
| 6472 | 6474 | ||
| 6473 | dma_free_coherent(&pdev->dev, R8169_RX_RING_BYTES, tp->RxDescArray, | 6475 | dma_free_coherent(&pdev->dev, R8169_RX_RING_BYTES, tp->RxDescArray, |
| @@ -6793,8 +6795,6 @@ static void rtl_remove_one(struct pci_dev *pdev) | |||
| 6793 | rtl8168_driver_stop(tp); | 6795 | rtl8168_driver_stop(tp); |
| 6794 | } | 6796 | } |
| 6795 | 6797 | ||
| 6796 | cancel_work_sync(&tp->wk.work); | ||
| 6797 | |||
| 6798 | netif_napi_del(&tp->napi); | 6798 | netif_napi_del(&tp->napi); |
| 6799 | 6799 | ||
| 6800 | unregister_netdev(dev); | 6800 | unregister_netdev(dev); |
diff --git a/drivers/net/ethernet/sfc/filter.c b/drivers/net/ethernet/sfc/filter.c index b74a60ab9ac7..2a469b27a506 100644 --- a/drivers/net/ethernet/sfc/filter.c +++ b/drivers/net/ethernet/sfc/filter.c | |||
| @@ -1209,7 +1209,9 @@ int efx_filter_rfs(struct net_device *net_dev, const struct sk_buff *skb, | |||
| 1209 | EFX_BUG_ON_PARANOID(skb_headlen(skb) < nhoff + 4 * ip->ihl + 4); | 1209 | EFX_BUG_ON_PARANOID(skb_headlen(skb) < nhoff + 4 * ip->ihl + 4); |
| 1210 | ports = (const __be16 *)(skb->data + nhoff + 4 * ip->ihl); | 1210 | ports = (const __be16 *)(skb->data + nhoff + 4 * ip->ihl); |
| 1211 | 1211 | ||
| 1212 | efx_filter_init_rx(&spec, EFX_FILTER_PRI_HINT, 0, rxq_index); | 1212 | efx_filter_init_rx(&spec, EFX_FILTER_PRI_HINT, |
| 1213 | efx->rx_scatter ? EFX_FILTER_FLAG_RX_SCATTER : 0, | ||
| 1214 | rxq_index); | ||
| 1213 | rc = efx_filter_set_ipv4_full(&spec, ip->protocol, | 1215 | rc = efx_filter_set_ipv4_full(&spec, ip->protocol, |
| 1214 | ip->daddr, ports[1], ip->saddr, ports[0]); | 1216 | ip->daddr, ports[1], ip->saddr, ports[0]); |
| 1215 | if (rc) | 1217 | if (rc) |
diff --git a/drivers/net/ethernet/sis/sis900.c b/drivers/net/ethernet/sis/sis900.c index eb4aea3fe793..f5d7ad75e479 100644 --- a/drivers/net/ethernet/sis/sis900.c +++ b/drivers/net/ethernet/sis/sis900.c | |||
| @@ -1318,7 +1318,7 @@ static void sis900_timer(unsigned long data) | |||
| 1318 | if (duplex){ | 1318 | if (duplex){ |
| 1319 | sis900_set_mode(sis_priv, speed, duplex); | 1319 | sis900_set_mode(sis_priv, speed, duplex); |
| 1320 | sis630_set_eq(net_dev, sis_priv->chipset_rev); | 1320 | sis630_set_eq(net_dev, sis_priv->chipset_rev); |
| 1321 | netif_start_queue(net_dev); | 1321 | netif_carrier_on(net_dev); |
| 1322 | } | 1322 | } |
| 1323 | 1323 | ||
| 1324 | sis_priv->timer.expires = jiffies + HZ; | 1324 | sis_priv->timer.expires = jiffies + HZ; |
| @@ -1336,10 +1336,8 @@ static void sis900_timer(unsigned long data) | |||
| 1336 | status = sis900_default_phy(net_dev); | 1336 | status = sis900_default_phy(net_dev); |
| 1337 | mii_phy = sis_priv->mii; | 1337 | mii_phy = sis_priv->mii; |
| 1338 | 1338 | ||
| 1339 | if (status & MII_STAT_LINK){ | 1339 | if (status & MII_STAT_LINK) |
| 1340 | sis900_check_mode(net_dev, mii_phy); | 1340 | sis900_check_mode(net_dev, mii_phy); |
| 1341 | netif_carrier_on(net_dev); | ||
| 1342 | } | ||
| 1343 | } else { | 1341 | } else { |
| 1344 | /* Link ON -> OFF */ | 1342 | /* Link ON -> OFF */ |
| 1345 | if (!(status & MII_STAT_LINK)){ | 1343 | if (!(status & MII_STAT_LINK)){ |
| @@ -1612,12 +1610,6 @@ sis900_start_xmit(struct sk_buff *skb, struct net_device *net_dev) | |||
| 1612 | unsigned int index_cur_tx, index_dirty_tx; | 1610 | unsigned int index_cur_tx, index_dirty_tx; |
| 1613 | unsigned int count_dirty_tx; | 1611 | unsigned int count_dirty_tx; |
| 1614 | 1612 | ||
| 1615 | /* Don't transmit data before the complete of auto-negotiation */ | ||
| 1616 | if(!sis_priv->autong_complete){ | ||
| 1617 | netif_stop_queue(net_dev); | ||
| 1618 | return NETDEV_TX_BUSY; | ||
| 1619 | } | ||
| 1620 | |||
| 1621 | spin_lock_irqsave(&sis_priv->lock, flags); | 1613 | spin_lock_irqsave(&sis_priv->lock, flags); |
| 1622 | 1614 | ||
| 1623 | /* Calculate the next Tx descriptor entry. */ | 1615 | /* Calculate the next Tx descriptor entry. */ |
diff --git a/drivers/net/ethernet/ti/cpsw.c b/drivers/net/ethernet/ti/cpsw.c index 05a1674e204f..22a7a4336211 100644 --- a/drivers/net/ethernet/ti/cpsw.c +++ b/drivers/net/ethernet/ti/cpsw.c | |||
| @@ -1867,7 +1867,7 @@ static int cpsw_probe(struct platform_device *pdev) | |||
| 1867 | 1867 | ||
| 1868 | while ((res = platform_get_resource(priv->pdev, IORESOURCE_IRQ, k))) { | 1868 | while ((res = platform_get_resource(priv->pdev, IORESOURCE_IRQ, k))) { |
| 1869 | for (i = res->start; i <= res->end; i++) { | 1869 | for (i = res->start; i <= res->end; i++) { |
| 1870 | if (request_irq(i, cpsw_interrupt, IRQF_DISABLED, | 1870 | if (request_irq(i, cpsw_interrupt, 0, |
| 1871 | dev_name(&pdev->dev), priv)) { | 1871 | dev_name(&pdev->dev), priv)) { |
| 1872 | dev_err(priv->dev, "error attaching irq\n"); | 1872 | dev_err(priv->dev, "error attaching irq\n"); |
| 1873 | goto clean_ale_ret; | 1873 | goto clean_ale_ret; |
diff --git a/drivers/net/ethernet/ti/davinci_emac.c b/drivers/net/ethernet/ti/davinci_emac.c index 07b176bcf929..1a222bce4bd7 100644 --- a/drivers/net/ethernet/ti/davinci_emac.c +++ b/drivers/net/ethernet/ti/davinci_emac.c | |||
| @@ -1568,8 +1568,7 @@ static int emac_dev_open(struct net_device *ndev) | |||
| 1568 | while ((res = platform_get_resource(priv->pdev, IORESOURCE_IRQ, k))) { | 1568 | while ((res = platform_get_resource(priv->pdev, IORESOURCE_IRQ, k))) { |
| 1569 | for (i = res->start; i <= res->end; i++) { | 1569 | for (i = res->start; i <= res->end; i++) { |
| 1570 | if (devm_request_irq(&priv->pdev->dev, i, emac_irq, | 1570 | if (devm_request_irq(&priv->pdev->dev, i, emac_irq, |
| 1571 | IRQF_DISABLED, | 1571 | 0, ndev->name, ndev)) |
| 1572 | ndev->name, ndev)) | ||
| 1573 | goto rollback; | 1572 | goto rollback; |
| 1574 | } | 1573 | } |
| 1575 | k++; | 1574 | k++; |
