DPDK patches and discussions
 help / color / mirror / Atom feed
From: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
To: Chaoyong He <chaoyong.he@corigine.com>, dev@dpdk.org
Cc: niklas.soderlund@corigine.com,
	Heinrich Kuhn <heinrich.kuhn@corigine.com>
Subject: Re: [PATCH v5 01/12] net/nfp: move app specific attributes to own struct
Date: Fri, 5 Aug 2022 13:49:04 +0300	[thread overview]
Message-ID: <3ea40ed7-3c0a-de21-df58-51fbf7c59cc9@oktetlabs.ru> (raw)
In-Reply-To: <1659681155-16525-2-git-send-email-chaoyong.he@corigine.com>

On 8/5/22 09:32, Chaoyong He wrote:
> The NFP Card can load different firmware applications. Currently
> only the CoreNIC application is supported. This commit makes
> needed infrastructure changes in order to support other firmware
> applications too.
> 
> Clearer separation is made between the PF device and any application
> specific concepts. The PF struct is now generic regardless of the
> application loaded. A new struct is also made for the CoreNIC
> application. Future additions to support other applications should
> also add an applications specific struct.
> 
> Signed-off-by: Chaoyong He <chaoyong.he@corigine.com>
> Signed-off-by: Heinrich Kuhn <heinrich.kuhn@corigine.com>
> Reviewed-by: Niklas Söderlund <niklas.soderlund@corigine.com>
> ---
>   drivers/net/nfp/nfp_common.h |  33 +++++++-
>   drivers/net/nfp/nfp_ethdev.c | 196 +++++++++++++++++++++++++++----------------
>   2 files changed, 154 insertions(+), 75 deletions(-)
> 
> diff --git a/drivers/net/nfp/nfp_common.h b/drivers/net/nfp/nfp_common.h
> index 6d917e4..2aaf1d6 100644
> --- a/drivers/net/nfp/nfp_common.h
> +++ b/drivers/net/nfp/nfp_common.h
> @@ -111,6 +111,14 @@
>   #include <linux/types.h>
>   #include <rte_io.h>
>   
> +/* Firmware application ID's */
> +enum nfp_app_id {
> +	NFP_APP_CORE_NIC               = 0x1,

[snip]

> +	NFP_APP_BPF_NIC                = 0x2,
> +	NFP_APP_FLOWER_NIC             = 0x3,
> +	NFP_APP_ACTIVE_BUFFER_MGMT_NIC = 0x4,

Above three defines are dead in the patch. I think it would make
subsequent patches more selfcontained if corresponding defines are
added later when they are really required and used.

> +};
> +
>   /* nfp_qcp_ptr - Read or Write Pointer of a queue */
>   enum nfp_qcp_ptr {
>   	NFP_QCP_READ_PTR = 0,
> @@ -121,8 +129,10 @@ struct nfp_pf_dev {
>   	/* Backpointer to associated pci device */
>   	struct rte_pci_device *pci_dev;
>   
> -	/* Array of physical ports belonging to this PF */
> -	struct nfp_net_hw *ports[NFP_MAX_PHYPORTS];
> +	enum nfp_app_id app_id;
> +
> +	/* Pointer to the app running on the PF */
> +	void *app_priv;
>   
>   	/* Current values for control */
>   	uint32_t ctrl;
> @@ -151,8 +161,6 @@ struct nfp_pf_dev {
>   	struct nfp_cpp_area *msix_area;
>   
>   	uint8_t *hw_queues;
> -	uint8_t total_phyports;
> -	bool	multiport;
>   
>   	union eth_table_entry *eth_table;
>   
> @@ -161,6 +169,20 @@ struct nfp_pf_dev {
>   	uint32_t nfp_cpp_service_id;
>   };
>   
> +struct nfp_app_nic {
> +	/* Backpointer to the PF device */
> +	struct nfp_pf_dev *pf_dev;
> +
> +	/*
> +	 * Array of physical ports belonging to the this CoreNIC app
> +	 * This is really a list of vNIC's. One for each physical port
> +	 */
> +	struct nfp_net_hw *ports[NFP_MAX_PHYPORTS];
> +
> +	bool multiport;
> +	uint8_t total_phyports;
> +};
> +
>   struct nfp_net_hw {
>   	/* Backpointer to the PF this port belongs to */
>   	struct nfp_pf_dev *pf_dev;
> @@ -424,6 +446,9 @@ int nfp_net_rss_hash_conf_get(struct rte_eth_dev *dev,
>   #define NFP_NET_DEV_PRIVATE_TO_PF(dev_priv)\
>   	(((struct nfp_net_hw *)dev_priv)->pf_dev)
>   
> +#define NFP_APP_PRIV_TO_APP_NIC(app_priv)\
> +	((struct nfp_app_nic *)app_priv)
> +

Wouldn't it be better if tiny function is used instead.
It should accept struct nfp_pf_dev pointer as an input argument.
It would allow to validate that pf_dev->app_id is NFP_APP_CORE_NIC and
make code more robust.

>   #endif /* _NFP_COMMON_H_ */
>   /*
>    * Local variables:
> diff --git a/drivers/net/nfp/nfp_ethdev.c b/drivers/net/nfp/nfp_ethdev.c
> index 5cdd34e..3c4b0ac 100644
> --- a/drivers/net/nfp/nfp_ethdev.c
> +++ b/drivers/net/nfp/nfp_ethdev.c
> @@ -39,15 +39,15 @@
>   #include "nfp_cpp_bridge.h"
>   
>   static int
> -nfp_net_pf_read_mac(struct nfp_pf_dev *pf_dev, int port)
> +nfp_net_pf_read_mac(struct nfp_app_nic *app_nic, int port)
>   {
>   	struct nfp_eth_table *nfp_eth_table;
>   	struct nfp_net_hw *hw = NULL;
>   
>   	/* Grab a pointer to the correct physical port */
> -	hw = pf_dev->ports[port];
> +	hw = app_nic->ports[port];
>   
> -	nfp_eth_table = nfp_eth_read_ports(pf_dev->cpp);
> +	nfp_eth_table = nfp_eth_read_ports(app_nic->pf_dev->cpp);
>   
>   	nfp_eth_copy_mac((uint8_t *)&hw->mac_addr,
>   			 (uint8_t *)&nfp_eth_table->ports[port].mac_addr);
> @@ -64,6 +64,7 @@
>   	uint32_t new_ctrl, update = 0;
>   	struct nfp_net_hw *hw;
>   	struct nfp_pf_dev *pf_dev;
> +	struct nfp_app_nic *app_nic;
>   	struct rte_eth_conf *dev_conf;
>   	struct rte_eth_rxmode *rxmode;
>   	uint32_t intr_vector;
> @@ -71,6 +72,7 @@
>   
>   	hw = NFP_NET_DEV_PRIVATE_TO_HW(dev->data->dev_private);
>   	pf_dev = NFP_NET_DEV_PRIVATE_TO_PF(dev->data->dev_private);
> +	app_nic = NFP_APP_PRIV_TO_APP_NIC(pf_dev->app_priv);
>   
>   	PMD_INIT_LOG(DEBUG, "Start");
>   
> @@ -82,7 +84,7 @@
>   
>   	/* check and configure queue intr-vector mapping */
>   	if (dev->data->dev_conf.intr_conf.rxq != 0) {
> -		if (pf_dev->multiport) {
> +		if (app_nic->multiport) {
>   			PMD_INIT_LOG(ERR, "PMD rx interrupt is not supported "
>   					  "with NFP multiport PF");
>   				return -EINVAL;
> @@ -250,6 +252,7 @@
>   	struct nfp_net_hw *hw;
>   	struct rte_pci_device *pci_dev;
>   	struct nfp_pf_dev *pf_dev;
> +	struct nfp_app_nic *app_nic;
>   	int i;
>   
>   	if (rte_eal_process_type() != RTE_PROC_PRIMARY)
> @@ -260,6 +263,7 @@
>   	pf_dev = NFP_NET_DEV_PRIVATE_TO_PF(dev->data->dev_private);
>   	hw = NFP_NET_DEV_PRIVATE_TO_HW(dev->data->dev_private);
>   	pci_dev = RTE_ETH_DEV_TO_PCI(dev);
> +	app_nic = NFP_APP_PRIV_TO_APP_NIC(pf_dev->app_priv);
>   
>   	/*
>   	 * We assume that the DPDK application is stopping all the
> @@ -280,12 +284,12 @@
>   	/* Only free PF resources after all physical ports have been closed */
>   	/* Mark this port as unused and free device priv resources*/
>   	nn_cfg_writeb(hw, NFP_NET_CFG_LSC, 0xff);
> -	pf_dev->ports[hw->idx] = NULL;
> +	app_nic->ports[hw->idx] = NULL;
>   	rte_eth_dev_release_port(dev);
>   
> -	for (i = 0; i < pf_dev->total_phyports; i++) {
> +	for (i = 0; i < app_nic->total_phyports; i++) {
>   		/* Check to see if ports are still in use */
> -		if (pf_dev->ports[i])
> +		if (app_nic->ports[i])
>   			return 0;
>   	}
>   
> @@ -296,6 +300,7 @@
>   	free(pf_dev->hwinfo);
>   	free(pf_dev->sym_tbl);
>   	nfp_cpp_free(pf_dev->cpp);
> +	rte_free(app_nic);
>   	rte_free(pf_dev);
>   
>   	rte_intr_disable(pci_dev->intr_handle);
> @@ -404,6 +409,7 @@
>   {
>   	struct rte_pci_device *pci_dev;
>   	struct nfp_pf_dev *pf_dev;
> +	struct nfp_app_nic *app_nic;
>   	struct nfp_net_hw *hw;
>   	struct rte_ether_addr *tmp_ether_addr;
>   	uint64_t rx_bar_off = 0;
> @@ -420,6 +426,9 @@
>   	/* Use backpointer here to the PF of this eth_dev */
>   	pf_dev = NFP_NET_DEV_PRIVATE_TO_PF(eth_dev->data->dev_private);
>   
> +	/* Use backpointer to the CoreNIC app struct */
> +	app_nic = NFP_APP_PRIV_TO_APP_NIC(pf_dev->app_priv);
> +
>   	/* NFP can not handle DMA addresses requiring more than 40 bits */
>   	if (rte_mem_check_dma_mask(40)) {
>   		RTE_LOG(ERR, PMD,
> @@ -438,7 +447,7 @@
>   	 * Use PF array of physical ports to get pointer to
>   	 * this specific port
>   	 */
> -	hw = pf_dev->ports[port];
> +	hw = app_nic->ports[port];
>   
>   	PMD_INIT_LOG(DEBUG, "Working with physical port number: %d, "
>   			"NFP internal port number: %d", port, hw->nfp_idx);
> @@ -568,7 +577,7 @@
>   		goto dev_err_queues_map;
>   	}
>   
> -	nfp_net_pf_read_mac(pf_dev, port);
> +	nfp_net_pf_read_mac(app_nic, port);
>   	nfp_net_write_mac(hw, (uint8_t *)&hw->mac_addr);
>   
>   	tmp_ether_addr = (struct rte_ether_addr *)&hw->mac_addr;
> @@ -718,25 +727,67 @@
>   }
>   
>   static int
> -nfp_init_phyports(struct nfp_pf_dev *pf_dev)
> +nfp_init_app_nic(struct nfp_pf_dev *pf_dev,
> +		struct nfp_eth_table *nfp_eth_table)
>   {
>   	int i;
> -	int ret = 0;
> +	int ret;
> +	int err = 0;
> +	int total_vnics;
>   	struct nfp_net_hw *hw;
> +	unsigned int numa_node;
>   	struct rte_eth_dev *eth_dev;
> -	struct nfp_eth_table *nfp_eth_table;
> +	struct nfp_app_nic *app_nic;
> +	char port_name[RTE_ETH_NAME_MAX_LEN];
>   
> -	nfp_eth_table = nfp_eth_read_ports(pf_dev->cpp);
> -	if (nfp_eth_table == NULL) {
> -		PMD_INIT_LOG(ERR, "Error reading NFP ethernet table");
> -		return -EIO;
> +	PMD_INIT_LOG(INFO, "Total physical ports: %d", nfp_eth_table->count);
> +
> +	/* Allocate memory for the CoreNIC app */
> +	app_nic = rte_zmalloc("nfp_app_nic", sizeof(*app_nic), 0);
> +	if (app_nic == NULL)
> +		return -ENOMEM;
> +
> +	/* Point the app_priv pointer in the PF to the coreNIC app */
> +	pf_dev->app_priv = app_nic;
> +
> +	/* Read the number of vNIC's created for the PF */
> +	total_vnics = nfp_rtsym_read_le(pf_dev->sym_tbl, "nfd_cfg_pf0_num_ports", &err);
> +	if (err || total_vnics <= 0 || total_vnics > 8) {

DPDK coding style says to compare integers with 0 explicitly.
Since both ways are already present in net/nfp code and there is no
clear preference in the driver itself, please, following DPDK coding
style in a new code.

> +		PMD_INIT_LOG(ERR, "nfd_cfg_pf0_num_ports symbol with wrong value");
> +		ret = -ENODEV;
> +		goto app_cleanup;
>   	}
>   
> -	/* Loop through all physical ports on PF */
> -	for (i = 0; i < pf_dev->total_phyports; i++) {
> -		const unsigned int numa_node = rte_socket_id();
> -		char port_name[RTE_ETH_NAME_MAX_LEN];
> +	/*
> +	 * For coreNIC the number of vNICs exposed should be the same as the
> +	 * number of physical ports
> +	 */
> +	if (total_vnics != (int)nfp_eth_table->count) {
> +		PMD_INIT_LOG(ERR, "Total physical ports do not match number of vNICs");
> +		ret = -ENODEV;
> +		goto app_cleanup;
> +	}
>   
> +	/* Populate coreNIC app properties*/
> +	app_nic->total_phyports = total_vnics;
> +	app_nic->pf_dev = pf_dev;
> +	if (total_vnics > 1)
> +		app_nic->multiport = true;
> +
> +	/* Map the symbol table */
> +	pf_dev->ctrl_bar = nfp_rtsym_map(pf_dev->sym_tbl, "_pf0_net_bar0",
> +			app_nic->total_phyports * 32768, &pf_dev->ctrl_area);
> +	if (pf_dev->ctrl_bar == NULL) {
> +		PMD_INIT_LOG(ERR, "nfp_rtsym_map fails for _pf0_net_ctrl_bar");
> +		ret = -EIO;
> +		goto app_cleanup;
> +	}
> +
> +	PMD_INIT_LOG(DEBUG, "ctrl bar: %p", pf_dev->ctrl_bar);
> +
> +	/* Loop through all physical ports on PF */
> +	numa_node = rte_socket_id();
> +	for (i = 0; i < app_nic->total_phyports; i++) {
>   		snprintf(port_name, sizeof(port_name), "%s_port%d",
>   			 pf_dev->pci_dev->device.name, i);
>   
> @@ -760,7 +811,7 @@
>   		hw = NFP_NET_DEV_PRIVATE_TO_HW(eth_dev->data->dev_private);
>   
>   		/* Add this device to the PF's array of physical ports */
> -		pf_dev->ports[i] = hw;
> +		app_nic->ports[i] = hw;
>   
>   		hw->pf_dev = pf_dev;
>   		hw->cpp = pf_dev->cpp;
> @@ -783,20 +834,21 @@
>   		rte_eth_dev_probing_finish(eth_dev);
>   
>   	} /* End loop, all ports on this PF */
> -	ret = 0;
> -	goto eth_table_cleanup;
> +
> +	return 0;
>   
>   port_cleanup:
> -	for (i = 0; i < pf_dev->total_phyports; i++) {
> -		if (pf_dev->ports[i] && pf_dev->ports[i]->eth_dev) {
> +	for (i = 0; i < app_nic->total_phyports; i++) {
> +		if (app_nic->ports[i] && app_nic->ports[i]->eth_dev) {
>   			struct rte_eth_dev *tmp_dev;
> -			tmp_dev = pf_dev->ports[i]->eth_dev;
> +			tmp_dev = app_nic->ports[i]->eth_dev;
>   			rte_eth_dev_release_port(tmp_dev);
> -			pf_dev->ports[i] = NULL;
> +			app_nic->ports[i] = NULL;
>   		}
>   	}
> -eth_table_cleanup:
> -	free(nfp_eth_table);
> +	nfp_cpp_area_free(pf_dev->ctrl_area);
> +app_cleanup:
> +	rte_free(app_nic);
>   
>   	return ret;
>   }
> @@ -804,11 +856,11 @@
>   static int
>   nfp_pf_init(struct rte_pci_device *pci_dev)
>   {
> -	int err;
> -	int ret = 0;
> +	int ret;
> +	int err = 0;
>   	uint64_t addr;
> -	int total_ports;
>   	struct nfp_cpp *cpp;
> +	enum nfp_app_id app_id;
>   	struct nfp_pf_dev *pf_dev;
>   	struct nfp_hwinfo *hwinfo;
>   	char name[RTE_ETH_NAME_MAX_LEN];
> @@ -840,9 +892,10 @@
>   	if (hwinfo == NULL) {
>   		PMD_INIT_LOG(ERR, "Error reading hwinfo table");
>   		ret = -EIO;
> -		goto error;
> +		goto cpp_cleanup;
>   	}
>   
> +	/* Read the number of physical ports from hardware */
>   	nfp_eth_table = nfp_eth_read_ports(cpp);
>   	if (nfp_eth_table == NULL) {
>   		PMD_INIT_LOG(ERR, "Error reading NFP ethernet table");
> @@ -865,20 +918,14 @@
>   		goto eth_table_cleanup;
>   	}
>   
> -	total_ports = nfp_rtsym_read_le(sym_tbl, "nfd_cfg_pf0_num_ports", &err);
> -	if (total_ports != (int)nfp_eth_table->count) {
> -		PMD_DRV_LOG(ERR, "Inconsistent number of ports");
> +	/* Read the app ID of the firmware loaded */
> +	app_id = nfp_rtsym_read_le(sym_tbl, "_pf0_net_app_id", &err);
> +	if (err) {

Compare vs 0

> +		PMD_INIT_LOG(ERR, "Couldn't read app_id from fw");
>   		ret = -EIO;
>   		goto sym_tbl_cleanup;
>   	}
>   
> -	PMD_INIT_LOG(INFO, "Total physical ports: %d", total_ports);
> -
> -	if (total_ports <= 0 || total_ports > 8) {
> -		PMD_INIT_LOG(ERR, "nfd_cfg_pf0_num_ports symbol with wrong value");
> -		ret = -ENODEV;
> -		goto sym_tbl_cleanup;
> -	}
>   	/* Allocate memory for the PF "device" */
>   	snprintf(name, sizeof(name), "nfp_pf%d", 0);
>   	pf_dev = rte_zmalloc(name, sizeof(*pf_dev), 0);
> @@ -888,27 +935,12 @@
>   	}
>   
>   	/* Populate the newly created PF device */
> +	pf_dev->app_id = app_id;
>   	pf_dev->cpp = cpp;
>   	pf_dev->hwinfo = hwinfo;
>   	pf_dev->sym_tbl = sym_tbl;
> -	pf_dev->total_phyports = total_ports;
> -
> -	if (total_ports > 1)
> -		pf_dev->multiport = true;
> -
>   	pf_dev->pci_dev = pci_dev;
>   
> -	/* Map the symbol table */
> -	pf_dev->ctrl_bar = nfp_rtsym_map(pf_dev->sym_tbl, "_pf0_net_bar0",
> -			pf_dev->total_phyports * 32768, &pf_dev->ctrl_area);
> -	if (pf_dev->ctrl_bar == NULL) {
> -		PMD_INIT_LOG(ERR, "nfp_rtsym_map fails for _pf0_net_ctrl_bar");
> -		ret = -EIO;
> -		goto pf_cleanup;
> -	}
> -
> -	PMD_INIT_LOG(DEBUG, "ctrl bar: %p", pf_dev->ctrl_bar);
> -
>   	/* configure access to tx/rx vNIC BARs */
>   	switch (pci_dev->id.device_id) {
>   	case PCI_DEVICE_ID_NFP3800_PF_NIC:
> @@ -923,7 +955,7 @@
>   	default:
>   		PMD_INIT_LOG(ERR, "nfp_net: no device ID matching");
>   		err = -ENODEV;
> -		goto ctrl_area_cleanup;
> +		goto pf_cleanup;
>   	}
>   
>   	pf_dev->hw_queues = nfp_cpp_map_area(pf_dev->cpp, 0, 0,
> @@ -932,18 +964,27 @@
>   	if (pf_dev->hw_queues == NULL) {
>   		PMD_INIT_LOG(ERR, "nfp_rtsym_map fails for net.qc");
>   		ret = -EIO;
> -		goto ctrl_area_cleanup;
> +		goto pf_cleanup;
>   	}
>   
>   	PMD_INIT_LOG(DEBUG, "tx/rx bar address: 0x%p", pf_dev->hw_queues);
>   
>   	/*
> -	 * Initialize and prep physical ports now
> -	 * This will loop through all physical ports
> +	 * PF initialization has been done at this point. Call app specific
> +	 * init code now
>   	 */
> -	ret = nfp_init_phyports(pf_dev);
> -	if (ret) {
> -		PMD_INIT_LOG(ERR, "Could not create physical ports");
> +	switch (pf_dev->app_id) {
> +	case NFP_APP_CORE_NIC:
> +		PMD_INIT_LOG(INFO, "Initializing coreNIC");
> +		ret = nfp_init_app_nic(pf_dev, nfp_eth_table);
> +		if (ret) {

Compare vs 0

> +			PMD_INIT_LOG(ERR, "Could not initialize coreNIC!");
> +			goto hwqueues_cleanup;
> +		}
> +		break;
> +	default:
> +		PMD_INIT_LOG(ERR, "Unsupported Firmware loaded");
> +		ret = -EINVAL;
>   		goto hwqueues_cleanup;
>   	}
>   
> @@ -954,8 +995,6 @@
>   
>   hwqueues_cleanup:
>   	nfp_cpp_area_free(pf_dev->hwqueues_area);
> -ctrl_area_cleanup:
> -	nfp_cpp_area_free(pf_dev->ctrl_area);
>   pf_cleanup:
>   	rte_free(pf_dev);
>   sym_tbl_cleanup:
> @@ -964,6 +1003,8 @@
>   	free(nfp_eth_table);
>   hwinfo_cleanup:
>   	free(hwinfo);
> +cpp_cleanup:
> +	nfp_cpp_free(cpp);
>   error:
>   	return ret;
>   }
> @@ -977,7 +1018,8 @@
>   nfp_pf_secondary_init(struct rte_pci_device *pci_dev)
>   {
>   	int i;
> -	int err;
> +	int err = 0;
> +	int ret = 0;
>   	int total_ports;
>   	struct nfp_cpp *cpp;
>   	struct nfp_net_hw *hw;
> @@ -1015,6 +1057,11 @@
>   	}
>   
>   	total_ports = nfp_rtsym_read_le(sym_tbl, "nfd_cfg_pf0_num_ports", &err);
> +	if (err || total_ports <= 0 || total_ports > 8) {

Compare err vs 0

> +		PMD_INIT_LOG(ERR, "nfd_cfg_pf0_num_ports symbol with wrong value");
> +		ret = -ENODEV;
> +		goto sym_tbl_cleanup;
> +	}
>   
>   	for (i = 0; i < total_ports; i++) {
>   		struct rte_eth_dev *eth_dev;
> @@ -1028,7 +1075,8 @@
>   		if (eth_dev == NULL) {
>   			RTE_LOG(ERR, EAL,
>   				"secondary process attach failed, ethdev doesn't exist");
> -			return -ENODEV;
> +			ret = -ENODEV;
> +			break;
>   		}
>   
>   		hw = NFP_NET_DEV_PRIVATE_TO_HW(eth_dev->data->dev_private);
> @@ -1041,10 +1089,16 @@
>   		rte_eth_dev_probing_finish(eth_dev);
>   	}
>   
> +	if (ret)

Compare vs 0

> +		goto sym_tbl_cleanup;
> +
>   	/* Register the CPP bridge service for the secondary too */
>   	nfp_register_cpp_service(cpp);
>   
> -	return 0;
> +sym_tbl_cleanup:
> +	free(sym_tbl);
> +
> +	return ret;
>   }
>   
>   static int


  reply	other threads:[~2022-08-05 10:49 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-08-05  6:32 [PATCH v5 00/12] preparation for the rte_flow offload of nfp PMD Chaoyong He
2022-08-05  6:32 ` [PATCH v5 01/12] net/nfp: move app specific attributes to own struct Chaoyong He
2022-08-05 10:49   ` Andrew Rybchenko [this message]
2022-08-05  6:32 ` [PATCH v5 02/12] net/nfp: simplify initialization and remove dead code Chaoyong He
2022-08-05  6:32 ` [PATCH v5 03/12] net/nfp: move app specific init logic to own function Chaoyong He
2022-08-05 10:53   ` Andrew Rybchenko
2022-08-05  6:32 ` [PATCH v5 04/12] net/nfp: add initial flower firmware support Chaoyong He
2022-08-05 11:00   ` Andrew Rybchenko
2022-08-05  6:32 ` [PATCH v5 05/12] net/nfp: add flower PF setup and mempool init logic Chaoyong He
2022-08-05 12:49   ` Andrew Rybchenko
2022-08-05  6:32 ` [PATCH v5 06/12] net/nfp: add flower PF related routines Chaoyong He
2022-08-05 12:55   ` Andrew Rybchenko
2022-08-05  6:32 ` [PATCH v5 07/12] net/nfp: add flower ctrl VNIC related logics Chaoyong He
2022-08-05 13:05   ` Andrew Rybchenko
2022-08-08 11:32     ` Chaoyong He
2022-08-08 14:45       ` Stephen Hemminger
2022-08-10  1:51         ` Chaoyong He
2022-08-10 19:39           ` Stephen Hemminger
2022-08-11  1:26             ` Chaoyong He
2022-08-11  4:24               ` Stephen Hemminger
2022-08-11  6:31                 ` Chaoyong He
2022-08-11 15:07                   ` Stephen Hemminger
2022-08-05  6:32 ` [PATCH v5 08/12] net/nfp: move common rxtx function for flower use Chaoyong He
2022-08-05  6:32 ` [PATCH v5 09/12] net/nfp: add flower ctrl VNIC rxtx logic Chaoyong He
2022-08-05  6:32 ` [PATCH v5 10/12] net/nfp: add flower representor framework Chaoyong He
2022-08-05 14:23   ` Andrew Rybchenko
2022-08-08 11:56     ` Chaoyong He
2022-08-05  6:32 ` [PATCH v5 11/12] net/nfp: move rxtx function to header file Chaoyong He
2022-08-05  6:32 ` [PATCH v5 12/12] net/nfp: add flower PF rxtx logic Chaoyong He

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=3ea40ed7-3c0a-de21-df58-51fbf7c59cc9@oktetlabs.ru \
    --to=andrew.rybchenko@oktetlabs.ru \
    --cc=chaoyong.he@corigine.com \
    --cc=dev@dpdk.org \
    --cc=heinrich.kuhn@corigine.com \
    --cc=niklas.soderlund@corigine.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).