NFP can support several physical ports per PF device. Depending on firmware info, one or more eth_dev objects will need to be created.
This patch adds the call to create just one eth_dev by now with future commits supporting the multiport option. Once the eth_dev has been created, probe function invokes pmd initialization with the new eth_dev. Signed-off-by: Alejandro Lucero <alejandro.luc...@netronome.com> --- drivers/net/nfp/nfp_net.c | 50 +++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 42 insertions(+), 8 deletions(-) diff --git a/drivers/net/nfp/nfp_net.c b/drivers/net/nfp/nfp_net.c index 7c23b7a..6005e41 100644 --- a/drivers/net/nfp/nfp_net.c +++ b/drivers/net/nfp/nfp_net.c @@ -2677,13 +2677,16 @@ uint32_t nfp_net_txq_full(struct nfp_net_txq *txq) static int nfp_pf_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, struct rte_pci_device *dev) { + struct rte_eth_dev *eth_dev; + struct nfp_net_hw *hw; nfpu_desc_t *nfpu_desc; nspu_desc_t *nspu_desc; uint64_t offset_symbol; int major, minor; + int ret = -ENODEV; if (!dev) - return -ENODEV; + return ret; nfpu_desc = rte_malloc("nfp nfpu", sizeof(nfpu_desc_t), 0); if (!nfpu_desc) @@ -2697,29 +2700,60 @@ static int nfp_pf_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, nspu_desc = nfpu_desc->nspu; - /* Check NSP ABI version */ if (nfp_nsp_get_abi_version(nspu_desc, &major, &minor) < 0) { RTE_LOG(INFO, PMD, "NFP NSP not present\n"); - goto no_abi; + goto error; } PMD_INIT_LOG(INFO, "nspu ABI version: %d.%d\n", major, minor); if (minor < 20) { RTE_LOG(INFO, PMD, "NFP NSP ABI version too old. Required 0.20 or higher\n"); - goto no_abi; + goto error; } - nfp_nsp_fw_setup(nspu_desc, "nfd_cfg_pf0_num_ports", &offset_symbol); + ret = nfp_nsp_fw_setup(nspu_desc, "nfd_cfg_pf0_num_ports", + &offset_symbol); + if (ret) + goto error; - /* No port is created yet */ + eth_dev = rte_eth_dev_allocate(dev->device.name); + if (!eth_dev) { + ret = -ENODEV; + goto error; + } -no_abi: + eth_dev->data->dev_private = rte_zmalloc("nfp_pf_port", + sizeof(struct nfp_net_adapter), + RTE_CACHE_LINE_SIZE); + if (!eth_dev->data->dev_private) { + rte_eth_dev_release_port(eth_dev); + ret = -ENODEV; + goto error; + } + + hw = (struct nfp_net_hw *)(eth_dev->data->dev_private); + hw->nspu_desc = nspu_desc; + hw->nfpu_desc = nfpu_desc; + hw->is_pf = 1; + + eth_dev->device = &dev->device; + rte_eth_copy_pci_info(eth_dev, dev); + + ret = nfp_net_init(eth_dev); + + if (!ret) + return 0; + + /* something went wrong */ + rte_eth_dev_release_port(eth_dev); + +error: nfpu_close(nfpu_desc); nfpu_error: rte_free(nfpu_desc); - return -ENODEV; + return ret; } static const struct rte_pci_id pci_id_nfp_pf_net_map[] = { -- 1.9.1