net: add rte prefix to ether structures
[dpdk.git] / drivers / net / bnx2x / bnx2x.c
index 4c775c1..17b6817 100644 (file)
@@ -25,6 +25,7 @@
 #include <sys/stat.h>
 #include <fcntl.h>
 #include <zlib.h>
+#include <rte_string_fns.h>
 
 #define BNX2X_PMD_VER_PREFIX "BNX2X PMD"
 #define BNX2X_PMD_VERSION_MAJOR 1
@@ -123,7 +124,7 @@ static __rte_noinline
 int bnx2x_nic_load(struct bnx2x_softc *sc);
 
 static int bnx2x_handle_sp_tq(struct bnx2x_softc *sc);
-static void bnx2x_handle_fp_tq(struct bnx2x_fastpath *fp, int scan_fp);
+static void bnx2x_handle_fp_tq(struct bnx2x_fastpath *fp);
 static void bnx2x_ack_sb(struct bnx2x_softc *sc, uint8_t igu_sb_id,
                         uint8_t storm, uint16_t index, uint8_t op,
                         uint8_t update);
@@ -184,6 +185,7 @@ bnx2x_dma_alloc(struct bnx2x_softc *sc, size_t size, struct bnx2x_dma *dma,
        }
        dma->paddr = (uint64_t) z->iova;
        dma->vaddr = z->addr;
+       dma->mzone = (const void *)z;
 
        PMD_DRV_LOG(DEBUG, sc,
                    "%s: virt=%p phys=%" PRIx64, msg, dma->vaddr, dma->paddr);
@@ -191,6 +193,19 @@ bnx2x_dma_alloc(struct bnx2x_softc *sc, size_t size, struct bnx2x_dma *dma,
        return 0;
 }
 
+void bnx2x_dma_free(struct bnx2x_dma *dma)
+{
+       if (dma->mzone == NULL)
+               return;
+
+       rte_memzone_free((const struct rte_memzone *)dma->mzone);
+       dma->sc = NULL;
+       dma->paddr = 0;
+       dma->vaddr = NULL;
+       dma->nseg = 0;
+       dma->mzone = NULL;
+}
+
 static int bnx2x_acquire_hw_lock(struct bnx2x_softc *sc, uint32_t resource)
 {
        uint32_t lock_status;
@@ -1099,6 +1114,12 @@ bnx2x_sp_post(struct bnx2x_softc *sc, int command, int cid, uint32_t data_hi,
                    atomic_load_acq_long(&sc->cq_spq_left),
                    atomic_load_acq_long(&sc->eq_spq_left));
 
+       /* RAMROD completion is processed in bnx2x_intr_legacy()
+        * which can run from different contexts.
+        * Ask bnx2x_intr_intr() to process RAMROD
+        * completion whenever it gets scheduled.
+        */
+       rte_atomic32_set(&sc->scan_fp, 1);
        bnx2x_sp_prod_update(sc);
 
        return 0;
@@ -2176,8 +2197,8 @@ int bnx2x_tx_encap(struct bnx2x_tx_queue *txq, struct rte_mbuf *m0)
                        tx_start_bd->vlan_or_ethertype =
                            rte_cpu_to_le_16(pkt_prod);
                else {
-                       struct ether_hdr *eh =
-                           rte_pktmbuf_mtod(m0, struct ether_hdr *);
+                       struct rte_ether_hdr *eh =
+                           rte_pktmbuf_mtod(m0, struct rte_ether_hdr *);
 
                        tx_start_bd->vlan_or_ethertype =
                            rte_cpu_to_le_16(rte_be_to_cpu_16(eh->ether_type));
@@ -2187,8 +2208,8 @@ int bnx2x_tx_encap(struct bnx2x_tx_queue *txq, struct rte_mbuf *m0)
        bd_prod = NEXT_TX_BD(bd_prod);
        if (IS_VF(sc)) {
                struct eth_tx_parse_bd_e2 *tx_parse_bd;
-               const struct ether_hdr *eh =
-                   rte_pktmbuf_mtod(m0, struct ether_hdr *);
+               const struct rte_ether_hdr *eh =
+                   rte_pktmbuf_mtod(m0, struct rte_ether_hdr *);
                uint8_t mac_type = UNICAST_ADDRESS;
 
                tx_parse_bd =
@@ -2435,6 +2456,7 @@ static int bnx2x_alloc_mem(struct bnx2x_softc *sc)
 
 static void bnx2x_free_fw_stats_mem(struct bnx2x_softc *sc)
 {
+       bnx2x_dma_free(&sc->fw_stats_dma);
        sc->fw_stats_num = 0;
 
        sc->fw_stats_req_size = 0;
@@ -4201,6 +4223,9 @@ static uint16_t bnx2x_update_dsb_idx(struct bnx2x_softc *sc)
        struct host_sp_status_block *def_sb = sc->def_sb;
        uint16_t rc = 0;
 
+       if (!def_sb)
+               return 0;
+
        mb();                   /* status block is written to by the chip */
 
        if (sc->def_att_idx != def_sb->atten_status_block.attn_bits_index) {
@@ -4520,25 +4545,29 @@ static int bnx2x_handle_sp_tq(struct bnx2x_softc *sc)
        return rc;
 }
 
-static void bnx2x_handle_fp_tq(struct bnx2x_fastpath *fp, int scan_fp)
+static void bnx2x_handle_fp_tq(struct bnx2x_fastpath *fp)
 {
        struct bnx2x_softc *sc = fp->sc;
        uint8_t more_rx = FALSE;
 
+       /* Make sure FP is initialized */
+       if (!fp->sb_running_index)
+               return;
+
        PMD_DEBUG_PERIODIC_LOG(DEBUG, sc,
                               "---> FP TASK QUEUE (%d) <--", fp->index);
 
        /* update the fastpath index */
        bnx2x_update_fp_sb_idx(fp);
 
-       if (scan_fp) {
+       if (rte_atomic32_read(&sc->scan_fp) == 1) {
                if (bnx2x_has_rx_work(fp)) {
                        more_rx = bnx2x_rxeof(sc, fp);
                }
 
                if (more_rx) {
                        /* still more work to do */
-                       bnx2x_handle_fp_tq(fp, scan_fp);
+                       bnx2x_handle_fp_tq(fp);
                        return;
                }
        }
@@ -4554,7 +4583,7 @@ static void bnx2x_handle_fp_tq(struct bnx2x_fastpath *fp, int scan_fp)
  * then calls a separate routine to handle the various
  * interrupt causes: link, RX, and TX.
  */
-int bnx2x_intr_legacy(struct bnx2x_softc *sc, int scan_fp)
+int bnx2x_intr_legacy(struct bnx2x_softc *sc)
 {
        struct bnx2x_fastpath *fp;
        uint32_t status, mask;
@@ -4586,7 +4615,7 @@ int bnx2x_intr_legacy(struct bnx2x_softc *sc, int scan_fp)
                /* acknowledge and disable further fastpath interrupts */
                        bnx2x_ack_sb(sc, fp->igu_sb_id, USTORM_ID,
                                     0, IGU_INT_DISABLE, 0);
-                       bnx2x_handle_fp_tq(fp, scan_fp);
+                       bnx2x_handle_fp_tq(fp);
                        status &= ~mask;
                }
        }
@@ -8074,6 +8103,27 @@ static int bnx2x_get_shmem_info(struct bnx2x_softc *sc)
                    ~ELINK_FEATURE_CONFIG_OVERRIDE_PREEMPHASIS_ENABLED;
        }
 
+       val = sc->devinfo.bc_ver >> 8;
+       if (val < BNX2X_BC_VER) {
+               /* for now only warn later we might need to enforce this */
+               PMD_DRV_LOG(NOTICE, sc, "This driver needs bc_ver %X but found %X, please upgrade BC\n",
+                           BNX2X_BC_VER, val);
+       }
+       sc->link_params.feature_config_flags |=
+                               (val >= REQ_BC_VER_4_VRFY_FIRST_PHY_OPT_MDL) ?
+                               ELINK_FEATURE_CONFIG_BC_SUPPORTS_OPT_MDL_VRFY :
+                               0;
+
+       sc->link_params.feature_config_flags |=
+               (val >= REQ_BC_VER_4_VRFY_SPECIFIC_PHY_OPT_MDL) ?
+               ELINK_FEATURE_CONFIG_BC_SUPPORTS_DUAL_PHY_OPT_MDL_VRFY : 0;
+       sc->link_params.feature_config_flags |=
+               (val >= REQ_BC_VER_4_VRFY_AFEX_SUPPORTED) ?
+               ELINK_FEATURE_CONFIG_BC_SUPPORTS_AFEX : 0;
+       sc->link_params.feature_config_flags |=
+               (val >= REQ_BC_VER_4_SFP_TX_DISABLE_SUPPORTED) ?
+               ELINK_FEATURE_CONFIG_BC_SUPPORTS_SFP_TX_DISABLED : 0;
+
        /* get the initial value of the link params */
        sc->link_params.multi_phy_config =
            SHMEM_RD(sc, dev_info.port_hw_config[port].multi_phy_config);
@@ -11734,13 +11784,13 @@ static const char *get_bnx2x_flags(uint32_t flags)
 
        for (i = 0; i < 5; i++)
                if (flags & (1 << i)) {
-                       strcat(flag_str, flag[i]);
+                       strlcat(flag_str, flag[i], sizeof(flag_str));
                        flags ^= (1 << i);
                }
        if (flags) {
                static char unknown[BNX2X_INFO_STR_MAX];
                snprintf(unknown, 32, "Unknown flag mask %x", flags);
-               strcat(flag_str, unknown);
+               strlcat(flag_str, unknown, sizeof(flag_str));
        }
        return flag_str;
 }