diff options
author | David S. Miller <davem@davemloft.net> | 2018-01-03 12:21:00 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2018-01-03 12:21:00 -0500 |
commit | 74c88af59fa31bc1bbb3f795b3bf2636e8b2fe2e (patch) | |
tree | 987e3da986b0d102099091641b719fafb1ee7a59 | |
parent | 15962a18284552b5ec58982ff60a5e92e0c5c92b (diff) | |
parent | ee4552aaf3fef5345199b8a82e40be7245b289fb (diff) |
Merge branch 'ena-fixes'
Netanel Belgazal says:
====================
bug fixes for ENA Ethernet driver
Changes from V1:
Revome incorrect "ena: invoke netif_carrier_off() only after netdev
registered" patch
This patchset contains 2 bug fixes:
* handle rare race condition during MSI-X initialization
* fix error processing in ena_down()
====================
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/ethernet/amazon/ena/ena_netdev.c | 45 |
1 files changed, 30 insertions, 15 deletions
diff --git a/drivers/net/ethernet/amazon/ena/ena_netdev.c b/drivers/net/ethernet/amazon/ena/ena_netdev.c index 97c5a89a9cf7..fbe21a817bd8 100644 --- a/drivers/net/ethernet/amazon/ena/ena_netdev.c +++ b/drivers/net/ethernet/amazon/ena/ena_netdev.c | |||
@@ -75,6 +75,9 @@ static struct workqueue_struct *ena_wq; | |||
75 | MODULE_DEVICE_TABLE(pci, ena_pci_tbl); | 75 | MODULE_DEVICE_TABLE(pci, ena_pci_tbl); |
76 | 76 | ||
77 | static int ena_rss_init_default(struct ena_adapter *adapter); | 77 | static int ena_rss_init_default(struct ena_adapter *adapter); |
78 | static void check_for_admin_com_state(struct ena_adapter *adapter); | ||
79 | static void ena_destroy_device(struct ena_adapter *adapter); | ||
80 | static int ena_restore_device(struct ena_adapter *adapter); | ||
78 | 81 | ||
79 | static void ena_tx_timeout(struct net_device *dev) | 82 | static void ena_tx_timeout(struct net_device *dev) |
80 | { | 83 | { |
@@ -1565,7 +1568,7 @@ static int ena_rss_configure(struct ena_adapter *adapter) | |||
1565 | 1568 | ||
1566 | static int ena_up_complete(struct ena_adapter *adapter) | 1569 | static int ena_up_complete(struct ena_adapter *adapter) |
1567 | { | 1570 | { |
1568 | int rc, i; | 1571 | int rc; |
1569 | 1572 | ||
1570 | rc = ena_rss_configure(adapter); | 1573 | rc = ena_rss_configure(adapter); |
1571 | if (rc) | 1574 | if (rc) |
@@ -1584,17 +1587,6 @@ static int ena_up_complete(struct ena_adapter *adapter) | |||
1584 | 1587 | ||
1585 | ena_napi_enable_all(adapter); | 1588 | ena_napi_enable_all(adapter); |
1586 | 1589 | ||
1587 | /* Enable completion queues interrupt */ | ||
1588 | for (i = 0; i < adapter->num_queues; i++) | ||
1589 | ena_unmask_interrupt(&adapter->tx_ring[i], | ||
1590 | &adapter->rx_ring[i]); | ||
1591 | |||
1592 | /* schedule napi in case we had pending packets | ||
1593 | * from the last time we disable napi | ||
1594 | */ | ||
1595 | for (i = 0; i < adapter->num_queues; i++) | ||
1596 | napi_schedule(&adapter->ena_napi[i].napi); | ||
1597 | |||
1598 | return 0; | 1590 | return 0; |
1599 | } | 1591 | } |
1600 | 1592 | ||
@@ -1731,7 +1723,7 @@ create_err: | |||
1731 | 1723 | ||
1732 | static int ena_up(struct ena_adapter *adapter) | 1724 | static int ena_up(struct ena_adapter *adapter) |
1733 | { | 1725 | { |
1734 | int rc; | 1726 | int rc, i; |
1735 | 1727 | ||
1736 | netdev_dbg(adapter->netdev, "%s\n", __func__); | 1728 | netdev_dbg(adapter->netdev, "%s\n", __func__); |
1737 | 1729 | ||
@@ -1774,6 +1766,17 @@ static int ena_up(struct ena_adapter *adapter) | |||
1774 | 1766 | ||
1775 | set_bit(ENA_FLAG_DEV_UP, &adapter->flags); | 1767 | set_bit(ENA_FLAG_DEV_UP, &adapter->flags); |
1776 | 1768 | ||
1769 | /* Enable completion queues interrupt */ | ||
1770 | for (i = 0; i < adapter->num_queues; i++) | ||
1771 | ena_unmask_interrupt(&adapter->tx_ring[i], | ||
1772 | &adapter->rx_ring[i]); | ||
1773 | |||
1774 | /* schedule napi in case we had pending packets | ||
1775 | * from the last time we disable napi | ||
1776 | */ | ||
1777 | for (i = 0; i < adapter->num_queues; i++) | ||
1778 | napi_schedule(&adapter->ena_napi[i].napi); | ||
1779 | |||
1777 | return rc; | 1780 | return rc; |
1778 | 1781 | ||
1779 | err_up: | 1782 | err_up: |
@@ -1884,6 +1887,17 @@ static int ena_close(struct net_device *netdev) | |||
1884 | if (test_bit(ENA_FLAG_DEV_UP, &adapter->flags)) | 1887 | if (test_bit(ENA_FLAG_DEV_UP, &adapter->flags)) |
1885 | ena_down(adapter); | 1888 | ena_down(adapter); |
1886 | 1889 | ||
1890 | /* Check for device status and issue reset if needed*/ | ||
1891 | check_for_admin_com_state(adapter); | ||
1892 | if (unlikely(test_bit(ENA_FLAG_TRIGGER_RESET, &adapter->flags))) { | ||
1893 | netif_err(adapter, ifdown, adapter->netdev, | ||
1894 | "Destroy failure, restarting device\n"); | ||
1895 | ena_dump_stats_to_dmesg(adapter); | ||
1896 | /* rtnl lock already obtained in dev_ioctl() layer */ | ||
1897 | ena_destroy_device(adapter); | ||
1898 | ena_restore_device(adapter); | ||
1899 | } | ||
1900 | |||
1887 | return 0; | 1901 | return 0; |
1888 | } | 1902 | } |
1889 | 1903 | ||
@@ -2544,11 +2558,12 @@ static void ena_destroy_device(struct ena_adapter *adapter) | |||
2544 | 2558 | ||
2545 | ena_com_set_admin_running_state(ena_dev, false); | 2559 | ena_com_set_admin_running_state(ena_dev, false); |
2546 | 2560 | ||
2547 | ena_close(netdev); | 2561 | if (test_bit(ENA_FLAG_DEV_UP, &adapter->flags)) |
2562 | ena_down(adapter); | ||
2548 | 2563 | ||
2549 | /* Before releasing the ENA resources, a device reset is required. | 2564 | /* Before releasing the ENA resources, a device reset is required. |
2550 | * (to prevent the device from accessing them). | 2565 | * (to prevent the device from accessing them). |
2551 | * In case the reset flag is set and the device is up, ena_close | 2566 | * In case the reset flag is set and the device is up, ena_down() |
2552 | * already perform the reset, so it can be skipped. | 2567 | * already perform the reset, so it can be skipped. |
2553 | */ | 2568 | */ |
2554 | if (!(test_bit(ENA_FLAG_TRIGGER_RESET, &adapter->flags) && dev_up)) | 2569 | if (!(test_bit(ENA_FLAG_TRIGGER_RESET, &adapter->flags) && dev_up)) |