aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJakub Kicinski <jakub.kicinski@netronome.com>2016-04-07 14:39:35 -0400
committerDavid S. Miller <davem@davemloft.net>2016-04-08 15:26:03 -0400
commit0ba40af963f01b557a4d7a0a6c550a51b0fb8d34 (patch)
treea2dedb98694d93da6ed844428d9280b74ff5ef43
parentff1b68ab2daf292c0f0897f9c155a6ddc8484693 (diff)
nfp: move link state interrupt request/free calls
We need to be able to disable the link state interrupt when the device is brought down. We used to just free the IRQ at the beginning of .ndo_stop(). As we now move towards more ordered .ndo_open()/.ndo_stop() paths LSC allocation should be placed in the "allocate resource" section. Since the IRQ can't be freed early in .ndo_stop(), it is disabled instead. Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/netronome/nfp/nfp_net_common.c23
1 files changed, 12 insertions, 11 deletions
diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_common.c b/drivers/net/ethernet/netronome/nfp/nfp_net_common.c
index 0dae81454e77..5da1199e7afb 100644
--- a/drivers/net/ethernet/netronome/nfp/nfp_net_common.c
+++ b/drivers/net/ethernet/netronome/nfp/nfp_net_common.c
@@ -1729,10 +1729,16 @@ static int nfp_net_netdev_open(struct net_device *netdev)
1729 NFP_NET_IRQ_EXN_IDX, nn->exn_handler); 1729 NFP_NET_IRQ_EXN_IDX, nn->exn_handler);
1730 if (err) 1730 if (err)
1731 return err; 1731 return err;
1732 err = nfp_net_aux_irq_request(nn, NFP_NET_CFG_LSC, "%s-lsc",
1733 nn->lsc_name, sizeof(nn->lsc_name),
1734 NFP_NET_IRQ_LSC_IDX, nn->lsc_handler);
1735 if (err)
1736 goto err_free_exn;
1737 disable_irq(nn->irq_entries[NFP_NET_CFG_LSC].vector);
1732 1738
1733 err = nfp_net_alloc_rings(nn); 1739 err = nfp_net_alloc_rings(nn);
1734 if (err) 1740 if (err)
1735 goto err_free_exn; 1741 goto err_free_lsc;
1736 1742
1737 err = netif_set_real_num_tx_queues(netdev, nn->num_tx_rings); 1743 err = netif_set_real_num_tx_queues(netdev, nn->num_tx_rings);
1738 if (err) 1744 if (err)
@@ -1812,19 +1818,11 @@ static int nfp_net_netdev_open(struct net_device *netdev)
1812 1818
1813 netif_tx_wake_all_queues(netdev); 1819 netif_tx_wake_all_queues(netdev);
1814 1820
1815 err = nfp_net_aux_irq_request(nn, NFP_NET_CFG_LSC, "%s-lsc", 1821 enable_irq(nn->irq_entries[NFP_NET_CFG_LSC].vector);
1816 nn->lsc_name, sizeof(nn->lsc_name),
1817 NFP_NET_IRQ_LSC_IDX, nn->lsc_handler);
1818 if (err)
1819 goto err_stop_tx;
1820 nfp_net_read_link_status(nn); 1822 nfp_net_read_link_status(nn);
1821 1823
1822 return 0; 1824 return 0;
1823 1825
1824err_stop_tx:
1825 netif_tx_disable(netdev);
1826 for (r = 0; r < nn->num_r_vecs; r++)
1827 nfp_net_tx_flush(nn->r_vecs[r].tx_ring);
1828err_disable_napi: 1826err_disable_napi:
1829 while (r--) { 1827 while (r--) {
1830 napi_disable(&nn->r_vecs[r].napi); 1828 napi_disable(&nn->r_vecs[r].napi);
@@ -1834,6 +1832,8 @@ err_clear_config:
1834 nfp_net_clear_config_and_disable(nn); 1832 nfp_net_clear_config_and_disable(nn);
1835err_free_rings: 1833err_free_rings:
1836 nfp_net_free_rings(nn); 1834 nfp_net_free_rings(nn);
1835err_free_lsc:
1836 nfp_net_aux_irq_free(nn, NFP_NET_CFG_LSC, NFP_NET_IRQ_LSC_IDX);
1837err_free_exn: 1837err_free_exn:
1838 nfp_net_aux_irq_free(nn, NFP_NET_CFG_EXN, NFP_NET_IRQ_EXN_IDX); 1838 nfp_net_aux_irq_free(nn, NFP_NET_CFG_EXN, NFP_NET_IRQ_EXN_IDX);
1839 return err; 1839 return err;
@@ -1855,7 +1855,7 @@ static int nfp_net_netdev_close(struct net_device *netdev)
1855 1855
1856 /* Step 1: Disable RX and TX rings from the Linux kernel perspective 1856 /* Step 1: Disable RX and TX rings from the Linux kernel perspective
1857 */ 1857 */
1858 nfp_net_aux_irq_free(nn, NFP_NET_CFG_LSC, NFP_NET_IRQ_LSC_IDX); 1858 disable_irq(nn->irq_entries[NFP_NET_CFG_LSC].vector);
1859 netif_carrier_off(netdev); 1859 netif_carrier_off(netdev);
1860 nn->link_up = false; 1860 nn->link_up = false;
1861 1861
@@ -1876,6 +1876,7 @@ static int nfp_net_netdev_close(struct net_device *netdev)
1876 } 1876 }
1877 1877
1878 nfp_net_free_rings(nn); 1878 nfp_net_free_rings(nn);
1879 nfp_net_aux_irq_free(nn, NFP_NET_CFG_LSC, NFP_NET_IRQ_LSC_IDX);
1879 nfp_net_aux_irq_free(nn, NFP_NET_CFG_EXN, NFP_NET_IRQ_EXN_IDX); 1880 nfp_net_aux_irq_free(nn, NFP_NET_CFG_EXN, NFP_NET_IRQ_EXN_IDX);
1880 1881
1881 nn_dbg(nn, "%s down", netdev->name); 1882 nn_dbg(nn, "%s down", netdev->name);