diff options
| author | Jakub Kicinski <jakub.kicinski@netronome.com> | 2016-04-07 14:39:42 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2016-04-08 15:26:05 -0400 |
| commit | ca40feab8f3d46a69bde7a13d652db2c9246c067 (patch) | |
| tree | 9d9e6a25c575ec75d3c53ba5ece9dce09faf03dd /drivers | |
| parent | 114bdef0be28aa9aa71e291d133e79edd514f8dc (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.c | 50 |
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 | ||
| 1615 | static 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) | |||
| 1637 | static void nfp_net_clear_config_and_disable(struct nfp_net *nn) | 1630 | static 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 | ||
| 1661 | static void | ||
| 1662 | nfp_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 | ||
