aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJakub Kicinski <jakub.kicinski@netronome.com>2016-04-07 14:39:36 -0400
committerDavid S. Miller <davem@davemloft.net>2016-04-08 15:26:04 -0400
commit0afbfb183bf5e1029ecc644acbc487d22e095b14 (patch)
tree3f1adc861a40d84fb02b6a914e2f97bc28ea3c51
parent0ba40af963f01b557a4d7a0a6c550a51b0fb8d34 (diff)
nfp: break up nfp_net_{alloc|free}_rings
nfp_net_{alloc|free}_rings contained strange mix of allocations and vector initialization. Remove it, declare vector init as a separate function and handle allocations explicitly. 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.c126
1 files changed, 47 insertions, 79 deletions
diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_common.c b/drivers/net/ethernet/netronome/nfp/nfp_net_common.c
index 5da1199e7afb..8692587904c5 100644
--- a/drivers/net/ethernet/netronome/nfp/nfp_net_common.c
+++ b/drivers/net/ethernet/netronome/nfp/nfp_net_common.c
@@ -1488,91 +1488,40 @@ err_alloc:
1488 return -ENOMEM; 1488 return -ENOMEM;
1489} 1489}
1490 1490
1491static void __nfp_net_free_rings(struct nfp_net *nn, unsigned int n_free) 1491static int
1492nfp_net_prepare_vector(struct nfp_net *nn, struct nfp_net_r_vector *r_vec,
1493 int idx)
1492{ 1494{
1493 struct nfp_net_r_vector *r_vec; 1495 struct msix_entry *entry = &nn->irq_entries[r_vec->irq_idx];
1494 struct msix_entry *entry; 1496 int err;
1495 1497
1496 while (n_free--) { 1498 snprintf(r_vec->name, sizeof(r_vec->name),
1497 r_vec = &nn->r_vecs[n_free]; 1499 "%s-rxtx-%d", nn->netdev->name, idx);
1498 entry = &nn->irq_entries[r_vec->irq_idx]; 1500 err = request_irq(entry->vector, r_vec->handler, 0, r_vec->name, r_vec);
1501 if (err) {
1502 nn_err(nn, "Error requesting IRQ %d\n", entry->vector);
1503 return err;
1504 }
1499 1505
1500 nfp_net_rx_ring_free(r_vec->rx_ring); 1506 /* Setup NAPI */
1501 nfp_net_tx_ring_free(r_vec->tx_ring); 1507 netif_napi_add(nn->netdev, &r_vec->napi,
1508 nfp_net_poll, NAPI_POLL_WEIGHT);
1502 1509
1503 irq_set_affinity_hint(entry->vector, NULL); 1510 irq_set_affinity_hint(entry->vector, &r_vec->affinity_mask);
1504 free_irq(entry->vector, r_vec);
1505 1511
1506 netif_napi_del(&r_vec->napi); 1512 nn_dbg(nn, "RV%02d: irq=%03d/%03d\n", idx, entry->vector, entry->entry);
1507 }
1508}
1509 1513
1510/** 1514 return 0;
1511 * nfp_net_free_rings() - Free all ring resources
1512 * @nn: NFP Net device to reconfigure
1513 */
1514static void nfp_net_free_rings(struct nfp_net *nn)
1515{
1516 __nfp_net_free_rings(nn, nn->num_r_vecs);
1517} 1515}
1518 1516
1519/** 1517static void
1520 * nfp_net_alloc_rings() - Allocate resources for RX and TX rings 1518nfp_net_cleanup_vector(struct nfp_net *nn, struct nfp_net_r_vector *r_vec)
1521 * @nn: NFP Net device to reconfigure
1522 *
1523 * Return: 0 on success or negative errno on error.
1524 */
1525static int nfp_net_alloc_rings(struct nfp_net *nn)
1526{ 1519{
1527 struct nfp_net_r_vector *r_vec; 1520 struct msix_entry *entry = &nn->irq_entries[r_vec->irq_idx];
1528 struct msix_entry *entry;
1529 int err;
1530 int r;
1531 1521
1532 for (r = 0; r < nn->num_r_vecs; r++) {
1533 r_vec = &nn->r_vecs[r];
1534 entry = &nn->irq_entries[r_vec->irq_idx];
1535
1536 /* Setup NAPI */
1537 netif_napi_add(nn->netdev, &r_vec->napi,
1538 nfp_net_poll, NAPI_POLL_WEIGHT);
1539
1540 snprintf(r_vec->name, sizeof(r_vec->name),
1541 "%s-rxtx-%d", nn->netdev->name, r);
1542 err = request_irq(entry->vector, r_vec->handler, 0,
1543 r_vec->name, r_vec);
1544 if (err) {
1545 nn_dbg(nn, "Error requesting IRQ %d\n", entry->vector);
1546 goto err_napi_del;
1547 }
1548
1549 irq_set_affinity_hint(entry->vector, &r_vec->affinity_mask);
1550
1551 nn_dbg(nn, "RV%02d: irq=%03d/%03d\n",
1552 r, entry->vector, entry->entry);
1553
1554 /* Allocate TX ring resources */
1555 err = nfp_net_tx_ring_alloc(r_vec->tx_ring);
1556 if (err)
1557 goto err_free_irq;
1558
1559 /* Allocate RX ring resources */
1560 err = nfp_net_rx_ring_alloc(r_vec->rx_ring);
1561 if (err)
1562 goto err_free_tx;
1563 }
1564
1565 return 0;
1566
1567err_free_tx:
1568 nfp_net_tx_ring_free(r_vec->tx_ring);
1569err_free_irq:
1570 irq_set_affinity_hint(entry->vector, NULL); 1522 irq_set_affinity_hint(entry->vector, NULL);
1571 free_irq(entry->vector, r_vec);
1572err_napi_del:
1573 netif_napi_del(&r_vec->napi); 1523 netif_napi_del(&r_vec->napi);
1574 __nfp_net_free_rings(nn, r); 1524 free_irq(entry->vector, r_vec);
1575 return err;
1576} 1525}
1577 1526
1578/** 1527/**
@@ -1736,9 +1685,19 @@ static int nfp_net_netdev_open(struct net_device *netdev)
1736 goto err_free_exn; 1685 goto err_free_exn;
1737 disable_irq(nn->irq_entries[NFP_NET_CFG_LSC].vector); 1686 disable_irq(nn->irq_entries[NFP_NET_CFG_LSC].vector);
1738 1687
1739 err = nfp_net_alloc_rings(nn); 1688 for (r = 0; r < nn->num_r_vecs; r++) {
1740 if (err) 1689 err = nfp_net_prepare_vector(nn, &nn->r_vecs[r], r);
1741 goto err_free_lsc; 1690 if (err)
1691 goto err_free_prev_vecs;
1692
1693 err = nfp_net_tx_ring_alloc(nn->r_vecs[r].tx_ring);
1694 if (err)
1695 goto err_cleanup_vec_p;
1696
1697 err = nfp_net_rx_ring_alloc(nn->r_vecs[r].rx_ring);
1698 if (err)
1699 goto err_free_tx_ring_p;
1700 }
1742 1701
1743 err = netif_set_real_num_tx_queues(netdev, nn->num_tx_rings); 1702 err = netif_set_real_num_tx_queues(netdev, nn->num_tx_rings);
1744 if (err) 1703 if (err)
@@ -1831,8 +1790,15 @@ err_disable_napi:
1831err_clear_config: 1790err_clear_config:
1832 nfp_net_clear_config_and_disable(nn); 1791 nfp_net_clear_config_and_disable(nn);
1833err_free_rings: 1792err_free_rings:
1834 nfp_net_free_rings(nn); 1793 r = nn->num_r_vecs;
1835err_free_lsc: 1794err_free_prev_vecs:
1795 while (r--) {
1796 nfp_net_rx_ring_free(nn->r_vecs[r].rx_ring);
1797err_free_tx_ring_p:
1798 nfp_net_tx_ring_free(nn->r_vecs[r].tx_ring);
1799err_cleanup_vec_p:
1800 nfp_net_cleanup_vector(nn, &nn->r_vecs[r]);
1801 }
1836 nfp_net_aux_irq_free(nn, NFP_NET_CFG_LSC, NFP_NET_IRQ_LSC_IDX); 1802 nfp_net_aux_irq_free(nn, NFP_NET_CFG_LSC, NFP_NET_IRQ_LSC_IDX);
1837err_free_exn: 1803err_free_exn:
1838 nfp_net_aux_irq_free(nn, NFP_NET_CFG_EXN, NFP_NET_IRQ_EXN_IDX); 1804 nfp_net_aux_irq_free(nn, NFP_NET_CFG_EXN, NFP_NET_IRQ_EXN_IDX);
@@ -1873,9 +1839,11 @@ static int nfp_net_netdev_close(struct net_device *netdev)
1873 for (r = 0; r < nn->num_r_vecs; r++) { 1839 for (r = 0; r < nn->num_r_vecs; r++) {
1874 nfp_net_rx_flush(nn->r_vecs[r].rx_ring); 1840 nfp_net_rx_flush(nn->r_vecs[r].rx_ring);
1875 nfp_net_tx_flush(nn->r_vecs[r].tx_ring); 1841 nfp_net_tx_flush(nn->r_vecs[r].tx_ring);
1842 nfp_net_rx_ring_free(nn->r_vecs[r].rx_ring);
1843 nfp_net_tx_ring_free(nn->r_vecs[r].tx_ring);
1844 nfp_net_cleanup_vector(nn, &nn->r_vecs[r]);
1876 } 1845 }
1877 1846
1878 nfp_net_free_rings(nn);
1879 nfp_net_aux_irq_free(nn, NFP_NET_CFG_LSC, NFP_NET_IRQ_LSC_IDX); 1847 nfp_net_aux_irq_free(nn, NFP_NET_CFG_LSC, NFP_NET_IRQ_LSC_IDX);
1880 nfp_net_aux_irq_free(nn, NFP_NET_CFG_EXN, NFP_NET_IRQ_EXN_IDX); 1848 nfp_net_aux_irq_free(nn, NFP_NET_CFG_EXN, NFP_NET_IRQ_EXN_IDX);
1881 1849