[dpdk-dev,v2,06/15] bnxt: Add support for port hotplug
Commit Message
This patch adds support for port hotplug framework.
Signed-off-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
---
drivers/net/bnxt/bnxt_cpr.c | 3 +++
drivers/net/bnxt/bnxt_ethdev.c | 24 ++++++++++++++++++++----
drivers/net/bnxt/bnxt_filter.c | 3 +++
drivers/net/bnxt/bnxt_vnic.c | 3 +++
4 files changed, 29 insertions(+), 4 deletions(-)
@@ -124,6 +124,9 @@ void bnxt_free_def_cp_ring(struct bnxt *bp)
{
struct bnxt_cp_ring_info *cpr = bp->def_cp_ring;
+ if (cpr == NULL)
+ return;
+
bnxt_free_ring(cpr->cp_ring_struct);
rte_free(cpr->cp_ring_struct);
rte_free(cpr);
@@ -478,7 +478,14 @@ static void bnxt_dev_close_op(struct rte_eth_dev *eth_dev)
bnxt_free_tx_mbufs(bp);
bnxt_free_rx_mbufs(bp);
bnxt_free_mem(bp);
- rte_free(eth_dev->data->mac_addrs);
+ if (eth_dev->data->mac_addrs != NULL) {
+ rte_free(eth_dev->data->mac_addrs);
+ eth_dev->data->mac_addrs = NULL;
+ }
+ if (bp->grp_info != NULL) {
+ rte_free(bp->grp_info);
+ bp->grp_info = NULL;
+ }
}
/* Unload the driver, release resources */
@@ -1084,12 +1091,20 @@ bnxt_dev_uninit(struct rte_eth_dev *eth_dev) {
struct bnxt *bp = eth_dev->data->dev_private;
int rc;
- if (eth_dev->data->mac_addrs)
+ if (eth_dev->data->mac_addrs != NULL) {
rte_free(eth_dev->data->mac_addrs);
- if (bp->grp_info)
+ eth_dev->data->mac_addrs = NULL;
+ }
+ if (bp->grp_info != NULL) {
rte_free(bp->grp_info);
+ bp->grp_info = NULL;
+ }
rc = bnxt_hwrm_func_driver_unregister(bp, 0);
bnxt_free_hwrm_resources(bp);
+ eth_dev->dev_ops = NULL;
+ eth_dev->rx_pkt_burst = NULL;
+ eth_dev->tx_pkt_burst = NULL;
+
return rc;
}
@@ -1097,7 +1112,8 @@ static struct eth_driver bnxt_rte_pmd = {
.pci_drv = {
.name = "rte_" DRV_MODULE_NAME "_pmd",
.id_table = bnxt_pci_id_map,
- .drv_flags = RTE_PCI_DRV_NEED_MAPPING,
+ .drv_flags = RTE_PCI_DRV_NEED_MAPPING |
+ RTE_PCI_DRV_DETACHABLE,
},
.eth_dev_init = bnxt_dev_init,
.eth_dev_uninit = bnxt_dev_uninit,
@@ -118,6 +118,9 @@ void bnxt_free_filter_mem(struct bnxt *bp)
uint16_t max_filters, i;
int rc = 0;
+ if (bp->filter_info == NULL)
+ return;
+
/* Ensure that all filters are freed */
if (BNXT_PF(bp)) {
struct bnxt_pf_info *pf = &bp->pf;
@@ -229,6 +229,9 @@ void bnxt_free_vnic_mem(struct bnxt *bp)
struct bnxt_vnic_info *vnic;
uint16_t max_vnics, i;
+ if (bp->vnic_info == NULL)
+ return;
+
if (BNXT_PF(bp)) {
struct bnxt_pf_info *pf = &bp->pf;