net/nfp: improve PF probing logic
When using rte_eth_dev_pci_generic_probe() during probing a
rte_eth_dev will be created with the name field corresponding to the PCI
address of the device. NFP4000/6000 devices only have a single PF (but
potentially multiple physical ports). This means that in a simple two
port example the rte_eth_devices[] array will be populated with two
devices: 0000:02:00.0 and 0000:02:00.0_port1. This is inconsistent and
not ideal. It will also cause issues when a secondary process tries to
attach to these ports.
This patch removes the use of rte_eth_dev_pci_generic_probe() and
allocates eth_dev's for each physical port during PF initialization,
giving them more consistent names.
Fixes: 5e15e799d6
("net/nfp: create separate entity for PF device")
Cc: stable@dpdk.org
Signed-off-by: Heinrich Kuhn <heinrich.kuhn@netronome.com>
Signed-off-by: Simon Horman <simon.horman@corigine.com>
This commit is contained in:
parent
634b731044
commit
82caefd8d7
@ -60,7 +60,7 @@ static int nfp_net_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu);
|
||||
static int nfp_net_infos_get(struct rte_eth_dev *dev,
|
||||
struct rte_eth_dev_info *dev_info);
|
||||
static int nfp_net_init(struct rte_eth_dev *eth_dev);
|
||||
static int nfp_pf_init(struct rte_eth_dev *eth_dev);
|
||||
static int nfp_pf_init(struct rte_pci_device *pci_dev);
|
||||
static int nfp_pci_uninit(struct rte_eth_dev *eth_dev);
|
||||
static int nfp_init_phyports(struct nfp_pf_dev *pf_dev);
|
||||
static int nfp_net_link_update(struct rte_eth_dev *dev, int wait_to_complete);
|
||||
@ -3498,20 +3498,14 @@ static int nfp_init_phyports(struct nfp_pf_dev *pf_dev)
|
||||
goto nfp_net_init;
|
||||
}
|
||||
|
||||
/* First port has already been initialized */
|
||||
if (i == 0) {
|
||||
eth_dev = pf_dev->eth_dev;
|
||||
goto skip_dev_alloc;
|
||||
}
|
||||
|
||||
/* Allocate a eth_dev for remaining ports */
|
||||
/* Allocate a eth_dev for this phyport */
|
||||
eth_dev = rte_eth_dev_allocate(port_name);
|
||||
if (!eth_dev) {
|
||||
ret = -ENODEV;
|
||||
goto port_cleanup;
|
||||
}
|
||||
|
||||
/* Allocate memory for remaining ports */
|
||||
/* Allocate memory for this phyport */
|
||||
eth_dev->data->dev_private =
|
||||
rte_zmalloc_socket(port_name, sizeof(struct nfp_net_hw),
|
||||
RTE_CACHE_LINE_SIZE, numa_node);
|
||||
@ -3521,7 +3515,6 @@ static int nfp_init_phyports(struct nfp_pf_dev *pf_dev)
|
||||
goto port_cleanup;
|
||||
}
|
||||
|
||||
skip_dev_alloc:
|
||||
hw = NFP_NET_DEV_PRIVATE_TO_HW(eth_dev->data->dev_private);
|
||||
|
||||
/* Add this device to the PF's array of physical ports */
|
||||
@ -3568,24 +3561,20 @@ static int nfp_init_phyports(struct nfp_pf_dev *pf_dev)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int nfp_pf_init(struct rte_eth_dev *eth_dev)
|
||||
static int nfp_pf_init(struct rte_pci_device *pci_dev)
|
||||
{
|
||||
struct rte_pci_device *pci_dev;
|
||||
struct nfp_net_hw *hw = NULL;
|
||||
struct nfp_pf_dev *pf_dev = NULL;
|
||||
struct nfp_cpp *cpp;
|
||||
struct nfp_hwinfo *hwinfo;
|
||||
struct nfp_rtsym_table *sym_tbl;
|
||||
struct nfp_eth_table *nfp_eth_table = NULL;
|
||||
struct rte_service_spec service;
|
||||
uint32_t *nfp_cpp_service_id = NULL;
|
||||
char name[RTE_ETH_NAME_MAX_LEN];
|
||||
int total_ports;
|
||||
int ret = -ENODEV;
|
||||
int err;
|
||||
|
||||
pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev);
|
||||
hw = NFP_NET_DEV_PRIVATE_TO_HW(eth_dev);
|
||||
|
||||
if (!pci_dev)
|
||||
return ret;
|
||||
|
||||
@ -3653,7 +3642,7 @@ static int nfp_pf_init(struct rte_eth_dev *eth_dev)
|
||||
goto sym_tbl_cleanup;
|
||||
}
|
||||
/* Allocate memory for the PF "device" */
|
||||
snprintf(name, sizeof(name), "nfp_pf%d", eth_dev->data->port_id);
|
||||
snprintf(name, sizeof(name), "nfp_pf%d", 0);
|
||||
pf_dev = rte_zmalloc(name, sizeof(*pf_dev), 0);
|
||||
if (!pf_dev) {
|
||||
ret = -ENOMEM;
|
||||
@ -3671,9 +3660,6 @@ static int nfp_pf_init(struct rte_eth_dev *eth_dev)
|
||||
|
||||
pf_dev->pci_dev = pci_dev;
|
||||
|
||||
/* The first eth_dev is part of the PF struct */
|
||||
pf_dev->eth_dev = eth_dev;
|
||||
|
||||
/* Map the symbol table */
|
||||
pf_dev->ctrl_bar = nfp_rtsym_map(pf_dev->sym_tbl, "_pf0_net_bar0",
|
||||
pf_dev->total_phyports * 32768,
|
||||
@ -3722,7 +3708,7 @@ static int nfp_pf_init(struct rte_eth_dev *eth_dev)
|
||||
service.callback_userdata = (void *)cpp;
|
||||
|
||||
if (rte_service_component_register(&service,
|
||||
&hw->nfp_cpp_service_id))
|
||||
nfp_cpp_service_id))
|
||||
RTE_LOG(ERR, PMD, "NFP CPP bridge service register() failed");
|
||||
else
|
||||
RTE_LOG(DEBUG, PMD, "NFP CPP bridge service registered");
|
||||
@ -3748,8 +3734,7 @@ static int nfp_pf_init(struct rte_eth_dev *eth_dev)
|
||||
static int nfp_pf_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
|
||||
struct rte_pci_device *dev)
|
||||
{
|
||||
return rte_eth_dev_pci_generic_probe(dev,
|
||||
sizeof(struct nfp_net_hw), nfp_pf_init);
|
||||
return nfp_pf_init(dev);
|
||||
}
|
||||
|
||||
static const struct rte_pci_id pci_id_nfp_pf_net_map[] = {
|
||||
|
@ -389,9 +389,6 @@ struct nfp_pf_dev {
|
||||
/* Backpointer to associated pci device */
|
||||
struct rte_pci_device *pci_dev;
|
||||
|
||||
/* First physical port's eth device */
|
||||
struct rte_eth_dev *eth_dev;
|
||||
|
||||
/* Array of physical ports belonging to this PF */
|
||||
struct nfp_net_hw *ports[NFP_MAX_PHYPORTS];
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user