net/bnxt: fix race between interrupt handler and dev config
[dpdk.git] / drivers / net / bnxt / bnxt_ethdev.c
index 69dafc4..e7ec99e 100644 (file)
@@ -32,54 +32,9 @@ static const char bnxt_version[] =
        "Broadcom NetXtreme driver " DRV_MODULE_NAME;
 int bnxt_logtype_driver;
 
-#define PCI_VENDOR_ID_BROADCOM 0x14E4
-
-#define BROADCOM_DEV_ID_STRATUS_NIC_VF1 0x1606
-#define BROADCOM_DEV_ID_STRATUS_NIC_VF2 0x1609
-#define BROADCOM_DEV_ID_STRATUS_NIC 0x1614
-#define BROADCOM_DEV_ID_57414_VF 0x16c1
-#define BROADCOM_DEV_ID_57301 0x16c8
-#define BROADCOM_DEV_ID_57302 0x16c9
-#define BROADCOM_DEV_ID_57304_PF 0x16ca
-#define BROADCOM_DEV_ID_57304_VF 0x16cb
-#define BROADCOM_DEV_ID_57417_MF 0x16cc
-#define BROADCOM_DEV_ID_NS2 0x16cd
-#define BROADCOM_DEV_ID_57311 0x16ce
-#define BROADCOM_DEV_ID_57312 0x16cf
-#define BROADCOM_DEV_ID_57402 0x16d0
-#define BROADCOM_DEV_ID_57404 0x16d1
-#define BROADCOM_DEV_ID_57406_PF 0x16d2
-#define BROADCOM_DEV_ID_57406_VF 0x16d3
-#define BROADCOM_DEV_ID_57402_MF 0x16d4
-#define BROADCOM_DEV_ID_57407_RJ45 0x16d5
-#define BROADCOM_DEV_ID_57412 0x16d6
-#define BROADCOM_DEV_ID_57414 0x16d7
-#define BROADCOM_DEV_ID_57416_RJ45 0x16d8
-#define BROADCOM_DEV_ID_57417_RJ45 0x16d9
-#define BROADCOM_DEV_ID_5741X_VF 0x16dc
-#define BROADCOM_DEV_ID_57412_MF 0x16de
-#define BROADCOM_DEV_ID_57314 0x16df
-#define BROADCOM_DEV_ID_57317_RJ45 0x16e0
-#define BROADCOM_DEV_ID_5731X_VF 0x16e1
-#define BROADCOM_DEV_ID_57417_SFP 0x16e2
-#define BROADCOM_DEV_ID_57416_SFP 0x16e3
-#define BROADCOM_DEV_ID_57317_SFP 0x16e4
-#define BROADCOM_DEV_ID_57404_MF 0x16e7
-#define BROADCOM_DEV_ID_57406_MF 0x16e8
-#define BROADCOM_DEV_ID_57407_SFP 0x16e9
-#define BROADCOM_DEV_ID_57407_MF 0x16ea
-#define BROADCOM_DEV_ID_57414_MF 0x16ec
-#define BROADCOM_DEV_ID_57416_MF 0x16ee
-#define BROADCOM_DEV_ID_57508 0x1750
-#define BROADCOM_DEV_ID_57504 0x1751
-#define BROADCOM_DEV_ID_57502 0x1752
-#define BROADCOM_DEV_ID_57500_VF1 0x1806
-#define BROADCOM_DEV_ID_57500_VF2 0x1807
-#define BROADCOM_DEV_ID_58802 0xd802
-#define BROADCOM_DEV_ID_58804 0xd804
-#define BROADCOM_DEV_ID_58808 0x16f0
-#define BROADCOM_DEV_ID_58802_VF 0xd800
-
+/*
+ * The set of PCI devices this driver supports
+ */
 static const struct rte_pci_id bnxt_pci_id_map[] = {
        { RTE_PCI_DEVICE(PCI_VENDOR_ID_BROADCOM,
                         BROADCOM_DEV_ID_STRATUS_NIC_VF1) },
@@ -672,6 +627,9 @@ static int bnxt_dev_configure_op(struct rte_eth_dev *eth_dev)
                 * resource reservation. This will ensure the resource counts
                 * are calculated correctly.
                 */
+
+               pthread_mutex_lock(&bp->def_cp_lock);
+
                if (!BNXT_HAS_NQ(bp) && bp->async_cp_ring) {
                        bnxt_disable_int(bp);
                        bnxt_free_cp_ring(bp, bp->async_cp_ring);
@@ -680,15 +638,20 @@ static int bnxt_dev_configure_op(struct rte_eth_dev *eth_dev)
                rc = bnxt_hwrm_func_reserve_vf_resc(bp, false);
                if (rc) {
                        PMD_DRV_LOG(ERR, "HWRM resource alloc fail:%x\n", rc);
+                       pthread_mutex_unlock(&bp->def_cp_lock);
                        return -ENOSPC;
                }
 
                if (!BNXT_HAS_NQ(bp) && bp->async_cp_ring) {
                        rc = bnxt_alloc_async_cp_ring(bp);
-                       if (rc)
+                       if (rc) {
+                               pthread_mutex_unlock(&bp->def_cp_lock);
                                return rc;
+                       }
                        bnxt_enable_int(bp);
                }
+
+               pthread_mutex_unlock(&bp->def_cp_lock);
        } else {
                /* legacy driver needs to get updated values */
                rc = bnxt_hwrm_func_qcaps(bp);
@@ -874,7 +837,6 @@ static int bnxt_dev_start_op(struct rte_eth_dev *eth_dev)
                        bp->rx_cp_nr_rings, RTE_ETHDEV_QUEUE_STAT_CNTRS);
        }
 
-       bnxt_enable_int(bp);
        rc = bnxt_hwrm_if_change(bp, 1);
        if (!rc) {
                if (bp->flags & BNXT_FLAG_IF_CHANGE_HOT_FW_RESET_DONE) {
@@ -883,6 +845,7 @@ static int bnxt_dev_start_op(struct rte_eth_dev *eth_dev)
                                return rc;
                }
        }
+       bnxt_enable_int(bp);
 
        rc = bnxt_init_chip(bp);
        if (rc)
@@ -3002,7 +2965,6 @@ bnxt_parse_fdir_filter(struct bnxt *bp,
                return -EINVAL;
        }
 
-
        if (fdir_mode == RTE_FDIR_MODE_PERFECT_MAC_VLAN) {
                rte_memcpy(filter->dst_macaddr,
                        fdir->input.flow.mac_vlan_flow.mac_addr.addr_bytes, 6);
@@ -4631,8 +4593,14 @@ bnxt_init_locks(struct bnxt *bp)
        int err;
 
        err = pthread_mutex_init(&bp->flow_lock, NULL);
-       if (err)
+       if (err) {
                PMD_DRV_LOG(ERR, "Unable to initialize flow_lock\n");
+               return err;
+       }
+
+       err = pthread_mutex_init(&bp->def_cp_lock, NULL);
+       if (err)
+               PMD_DRV_LOG(ERR, "Unable to initialize def_cp_lock\n");
        return err;
 }
 
@@ -4781,6 +4749,7 @@ static void
 bnxt_uninit_locks(struct bnxt *bp)
 {
        pthread_mutex_destroy(&bp->flow_lock);
+       pthread_mutex_destroy(&bp->def_cp_lock);
 }
 
 static int