aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorJakub Kicinski <jakub.kicinski@netronome.com>2016-04-07 14:39:42 -0400
committerDavid S. Miller <davem@davemloft.net>2016-04-08 15:26:05 -0400
commitca40feab8f3d46a69bde7a13d652db2c9246c067 (patch)
tree9d9e6a25c575ec75d3c53ba5ece9dce09faf03dd /drivers
parent114bdef0be28aa9aa71e291d133e79edd514f8dc (diff)
nfp: move filling ring information to FW config
nfp_net_[rt]x_ring_{alloc,free} should only allocate or free ring resources without touching the device. Move setting parameters in the BAR to separate functions. This will make it possible to reuse alloc/free functions to allocate new rings while the device is running. Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/ethernet/netronome/nfp/nfp_net_common.c50
1 files changed, 32 insertions, 18 deletions
diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_common.c b/drivers/net/ethernet/netronome/nfp/nfp_net_common.c
index a6a917fe8e31..342335d09fb2 100644
--- a/drivers/net/ethernet/netronome/nfp/nfp_net_common.c
+++ b/drivers/net/ethernet/netronome/nfp/nfp_net_common.c
@@ -1387,10 +1387,6 @@ static void nfp_net_tx_ring_free(struct nfp_net_tx_ring *tx_ring)
1387 struct nfp_net *nn = r_vec->nfp_net; 1387 struct nfp_net *nn = r_vec->nfp_net;
1388 struct pci_dev *pdev = nn->pdev; 1388 struct pci_dev *pdev = nn->pdev;
1389 1389
1390 nn_writeq(nn, NFP_NET_CFG_TXR_ADDR(tx_ring->idx), 0);
1391 nn_writeb(nn, NFP_NET_CFG_TXR_SZ(tx_ring->idx), 0);
1392 nn_writeb(nn, NFP_NET_CFG_TXR_VEC(tx_ring->idx), 0);
1393
1394 kfree(tx_ring->txbufs); 1390 kfree(tx_ring->txbufs);
1395 1391
1396 if (tx_ring->txds) 1392 if (tx_ring->txds)
@@ -1430,11 +1426,6 @@ static int nfp_net_tx_ring_alloc(struct nfp_net_tx_ring *tx_ring)
1430 if (!tx_ring->txbufs) 1426 if (!tx_ring->txbufs)
1431 goto err_alloc; 1427 goto err_alloc;
1432 1428
1433 /* Write the DMA address, size and MSI-X info to the device */
1434 nn_writeq(nn, NFP_NET_CFG_TXR_ADDR(tx_ring->idx), tx_ring->dma);
1435 nn_writeb(nn, NFP_NET_CFG_TXR_SZ(tx_ring->idx), ilog2(tx_ring->cnt));
1436 nn_writeb(nn, NFP_NET_CFG_TXR_VEC(tx_ring->idx), r_vec->irq_idx);
1437
1438 netif_set_xps_queue(nn->netdev, &r_vec->affinity_mask, tx_ring->idx); 1429 netif_set_xps_queue(nn->netdev, &r_vec->affinity_mask, tx_ring->idx);
1439 1430
1440 nn_dbg(nn, "TxQ%02d: QCidx=%02d cnt=%d dma=%#llx host=%p\n", 1431 nn_dbg(nn, "TxQ%02d: QCidx=%02d cnt=%d dma=%#llx host=%p\n",
@@ -1458,10 +1449,6 @@ static void nfp_net_rx_ring_free(struct nfp_net_rx_ring *rx_ring)
1458 struct nfp_net *nn = r_vec->nfp_net; 1449 struct nfp_net *nn = r_vec->nfp_net;
1459 struct pci_dev *pdev = nn->pdev; 1450 struct pci_dev *pdev = nn->pdev;
1460 1451
1461 nn_writeq(nn, NFP_NET_CFG_RXR_ADDR(rx_ring->idx), 0);
1462 nn_writeb(nn, NFP_NET_CFG_RXR_SZ(rx_ring->idx), 0);
1463 nn_writeb(nn, NFP_NET_CFG_RXR_VEC(rx_ring->idx), 0);
1464
1465 kfree(rx_ring->rxbufs); 1452 kfree(rx_ring->rxbufs);
1466 1453
1467 if (rx_ring->rxds) 1454 if (rx_ring->rxds)
@@ -1501,11 +1488,6 @@ static int nfp_net_rx_ring_alloc(struct nfp_net_rx_ring *rx_ring)
1501 if (!rx_ring->rxbufs) 1488 if (!rx_ring->rxbufs)
1502 goto err_alloc; 1489 goto err_alloc;
1503 1490
1504 /* Write the DMA address, size and MSI-X info to the device */
1505 nn_writeq(nn, NFP_NET_CFG_RXR_ADDR(rx_ring->idx), rx_ring->dma);
1506 nn_writeb(nn, NFP_NET_CFG_RXR_SZ(rx_ring->idx), ilog2(rx_ring->cnt));
1507 nn_writeb(nn, NFP_NET_CFG_RXR_VEC(rx_ring->idx), r_vec->irq_idx);
1508
1509 nn_dbg(nn, "RxQ%02d: FlQCidx=%02d RxQCidx=%02d cnt=%d dma=%#llx host=%p\n", 1491 nn_dbg(nn, "RxQ%02d: FlQCidx=%02d RxQCidx=%02d cnt=%d dma=%#llx host=%p\n",
1510 rx_ring->idx, rx_ring->fl_qcidx, rx_ring->rx_qcidx, 1492 rx_ring->idx, rx_ring->fl_qcidx, rx_ring->rx_qcidx,
1511 rx_ring->cnt, (unsigned long long)rx_ring->dma, rx_ring->rxds); 1493 rx_ring->cnt, (unsigned long long)rx_ring->dma, rx_ring->rxds);
@@ -1630,6 +1612,17 @@ static void nfp_net_write_mac_addr(struct nfp_net *nn, const u8 *mac)
1630 get_unaligned_be16(nn->netdev->dev_addr + 4) << 16); 1612 get_unaligned_be16(nn->netdev->dev_addr + 4) << 16);
1631} 1613}
1632 1614
1615static void nfp_net_vec_clear_ring_data(struct nfp_net *nn, unsigned int idx)
1616{
1617 nn_writeq(nn, NFP_NET_CFG_RXR_ADDR(idx), 0);
1618 nn_writeb(nn, NFP_NET_CFG_RXR_SZ(idx), 0);
1619 nn_writeb(nn, NFP_NET_CFG_RXR_VEC(idx), 0);
1620
1621 nn_writeq(nn, NFP_NET_CFG_TXR_ADDR(idx), 0);
1622 nn_writeb(nn, NFP_NET_CFG_TXR_SZ(idx), 0);
1623 nn_writeb(nn, NFP_NET_CFG_TXR_VEC(idx), 0);
1624}
1625
1633/** 1626/**
1634 * nfp_net_clear_config_and_disable() - Clear control BAR and disable NFP 1627 * nfp_net_clear_config_and_disable() - Clear control BAR and disable NFP
1635 * @nn: NFP Net device to reconfigure 1628 * @nn: NFP Net device to reconfigure
@@ -1637,6 +1630,7 @@ static void nfp_net_write_mac_addr(struct nfp_net *nn, const u8 *mac)
1637static void nfp_net_clear_config_and_disable(struct nfp_net *nn) 1630static void nfp_net_clear_config_and_disable(struct nfp_net *nn)
1638{ 1631{
1639 u32 new_ctrl, update; 1632 u32 new_ctrl, update;
1633 unsigned int r;
1640 int err; 1634 int err;
1641 1635
1642 new_ctrl = nn->ctrl; 1636 new_ctrl = nn->ctrl;
@@ -1658,9 +1652,26 @@ static void nfp_net_clear_config_and_disable(struct nfp_net *nn)
1658 return; 1652 return;
1659 } 1653 }
1660 1654
1655 for (r = 0; r < nn->num_r_vecs; r++)
1656 nfp_net_vec_clear_ring_data(nn, r);
1657
1661 nn->ctrl = new_ctrl; 1658 nn->ctrl = new_ctrl;
1662} 1659}
1663 1660
1661static void
1662nfp_net_vec_write_ring_data(struct nfp_net *nn, struct nfp_net_r_vector *r_vec,
1663 unsigned int idx)
1664{
1665 /* Write the DMA address, size and MSI-X info to the device */
1666 nn_writeq(nn, NFP_NET_CFG_RXR_ADDR(idx), r_vec->rx_ring->dma);
1667 nn_writeb(nn, NFP_NET_CFG_RXR_SZ(idx), ilog2(r_vec->rx_ring->cnt));
1668 nn_writeb(nn, NFP_NET_CFG_RXR_VEC(idx), r_vec->irq_idx);
1669
1670 nn_writeq(nn, NFP_NET_CFG_TXR_ADDR(idx), r_vec->tx_ring->dma);
1671 nn_writeb(nn, NFP_NET_CFG_TXR_SZ(idx), ilog2(r_vec->tx_ring->cnt));
1672 nn_writeb(nn, NFP_NET_CFG_TXR_VEC(idx), r_vec->irq_idx);
1673}
1674
1664/** 1675/**
1665 * nfp_net_start_vec() - Start ring vector 1676 * nfp_net_start_vec() - Start ring vector
1666 * @nn: NFP Net device structure 1677 * @nn: NFP Net device structure
@@ -1768,6 +1779,9 @@ static int nfp_net_netdev_open(struct net_device *netdev)
1768 * - Set the Freelist buffer size 1779 * - Set the Freelist buffer size
1769 * - Enable the FW 1780 * - Enable the FW
1770 */ 1781 */
1782 for (r = 0; r < nn->num_r_vecs; r++)
1783 nfp_net_vec_write_ring_data(nn, &nn->r_vecs[r], r);
1784
1771 nn_writeq(nn, NFP_NET_CFG_TXRS_ENABLE, nn->num_tx_rings == 64 ? 1785 nn_writeq(nn, NFP_NET_CFG_TXRS_ENABLE, nn->num_tx_rings == 64 ?
1772 0xffffffffffffffffULL : ((u64)1 << nn->num_tx_rings) - 1); 1786 0xffffffffffffffffULL : ((u64)1 << nn->num_tx_rings) - 1);
1773 1787