net/ena: check memory BAR before initializing LLQ
[dpdk.git] / drivers / net / ixgbe / ixgbe_ethdev.c
index c8f0460..7643842 100644 (file)
@@ -1223,13 +1223,8 @@ eth_ixgbe_dev_init(struct rte_eth_dev *eth_dev, void *init_params __rte_unused)
 
        /* initialize PF if max_vfs not zero */
        ret = ixgbe_pf_host_init(eth_dev);
-       if (ret) {
-               rte_free(eth_dev->data->mac_addrs);
-               eth_dev->data->mac_addrs = NULL;
-               rte_free(eth_dev->data->hash_mac_addrs);
-               eth_dev->data->hash_mac_addrs = NULL;
-               return ret;
-       }
+       if (ret)
+               goto err_pf_host_init;
 
        ctrl_ext = IXGBE_READ_REG(hw, IXGBE_CTRL_EXT);
        /* let hardware know driver is loaded */
@@ -1268,10 +1263,14 @@ eth_ixgbe_dev_init(struct rte_eth_dev *eth_dev, void *init_params __rte_unused)
        TAILQ_INIT(&filter_info->fivetuple_list);
 
        /* initialize flow director filter list & hash */
-       ixgbe_fdir_filter_init(eth_dev);
+       ret = ixgbe_fdir_filter_init(eth_dev);
+       if (ret)
+               goto err_fdir_filter_init;
 
        /* initialize l2 tunnel filter list & hash */
-       ixgbe_l2_tn_filter_init(eth_dev);
+       ret = ixgbe_l2_tn_filter_init(eth_dev);
+       if (ret)
+               goto err_l2_tn_filter_init;
 
        /* initialize flow filter lists */
        ixgbe_filterlist_init();
@@ -1283,6 +1282,21 @@ eth_ixgbe_dev_init(struct rte_eth_dev *eth_dev, void *init_params __rte_unused)
        ixgbe_tm_conf_init(eth_dev);
 
        return 0;
+
+err_l2_tn_filter_init:
+       ixgbe_fdir_filter_uninit(eth_dev);
+err_fdir_filter_init:
+       ixgbe_disable_intr(hw);
+       rte_intr_disable(intr_handle);
+       rte_intr_callback_unregister(intr_handle,
+               ixgbe_dev_interrupt_handler, eth_dev);
+       ixgbe_pf_host_uninit(eth_dev);
+err_pf_host_init:
+       rte_free(eth_dev->data->mac_addrs);
+       eth_dev->data->mac_addrs = NULL;
+       rte_free(eth_dev->data->hash_mac_addrs);
+       eth_dev->data->hash_mac_addrs = NULL;
+       return ret;
 }
 
 static int
@@ -1322,10 +1336,8 @@ static int ixgbe_fdir_filter_uninit(struct rte_eth_dev *eth_dev)
                IXGBE_DEV_PRIVATE_TO_FDIR_INFO(eth_dev->data->dev_private);
        struct ixgbe_fdir_filter *fdir_filter;
 
-               if (fdir_info->hash_map)
-               rte_free(fdir_info->hash_map);
-       if (fdir_info->hash_handle)
-               rte_hash_free(fdir_info->hash_handle);
+       rte_free(fdir_info->hash_map);
+       rte_hash_free(fdir_info->hash_handle);
 
        while ((fdir_filter = TAILQ_FIRST(&fdir_info->fdir_list))) {
                TAILQ_REMOVE(&fdir_info->fdir_list,
@@ -1343,10 +1355,8 @@ static int ixgbe_l2_tn_filter_uninit(struct rte_eth_dev *eth_dev)
                IXGBE_DEV_PRIVATE_TO_L2_TN_INFO(eth_dev->data->dev_private);
        struct ixgbe_l2_tn_filter *l2_tn_filter;
 
-       if (l2_tn_info->hash_map)
-               rte_free(l2_tn_info->hash_map);
-       if (l2_tn_info->hash_handle)
-               rte_hash_free(l2_tn_info->hash_handle);
+       rte_free(l2_tn_info->hash_map);
+       rte_hash_free(l2_tn_info->hash_handle);
 
        while ((l2_tn_filter = TAILQ_FIRST(&l2_tn_info->l2_tn_list))) {
                TAILQ_REMOVE(&l2_tn_info->l2_tn_list,
@@ -3028,6 +3038,7 @@ ixgbe_dev_close(struct rte_eth_dev *dev)
 
 #ifdef RTE_LIB_SECURITY
        rte_free(dev->security_ctx);
+       dev->security_ctx = NULL;
 #endif
 
        return ret;