net/bnxt: check FW capability for VLAN offloads
[dpdk.git] / drivers / net / bnxt / bnxt_hwrm.c
index e6c46d4..02613bd 100644 (file)
@@ -941,6 +941,10 @@ static int __bnxt_hwrm_func_qcaps(struct bnxt *bp)
        if (flags & HWRM_FUNC_QCAPS_OUTPUT_FLAGS_LINK_ADMIN_STATUS_SUPPORTED)
                bp->fw_cap |= BNXT_FW_CAP_LINK_ADMIN;
 
+       if (!(flags & HWRM_FUNC_QCAPS_OUTPUT_FLAGS_VLAN_ACCELERATION_TX_DISABLED)) {
+               bp->fw_cap |= BNXT_FW_CAP_VLAN_TX_INSERT;
+               PMD_DRV_LOG(DEBUG, "VLAN acceleration for TX is enabled\n");
+       }
 unlock:
        HWRM_UNLOCK();
 
@@ -1001,6 +1005,11 @@ int bnxt_hwrm_vnic_qcaps(struct bnxt *bp)
        if (flags & HWRM_VNIC_QCAPS_OUTPUT_FLAGS_RX_CMPL_V2_CAP)
                bp->vnic_cap_flags |= BNXT_VNIC_CAP_RX_CMPL_V2;
 
+       if (flags & HWRM_VNIC_QCAPS_OUTPUT_FLAGS_VLAN_STRIP_CAP) {
+               bp->vnic_cap_flags |= BNXT_VNIC_CAP_VLAN_RX_STRIP;
+               PMD_DRV_LOG(DEBUG, "Rx VLAN strip capability enabled\n");
+       }
+
        bp->max_tpa_v2 = rte_le_to_cpu_16(resp->max_aggs_supported);
 
        HWRM_UNLOCK();
@@ -2717,6 +2726,9 @@ void bnxt_free_hwrm_rx_ring(struct bnxt *bp, int queue_index)
        struct bnxt_ring *ring = rxr->rx_ring_struct;
        struct bnxt_cp_ring_info *cpr = rxq->cp_ring;
 
+       if (BNXT_HAS_RING_GRPS(bp))
+               bnxt_hwrm_ring_grp_free(bp, queue_index);
+
        bnxt_hwrm_ring_free(bp, ring,
                            HWRM_RING_FREE_INPUT_RING_TYPE_RX,
                            cpr->cp_ring_struct->fw_ring_id);
@@ -3390,16 +3402,6 @@ int bnxt_hwrm_parent_pf_qcfg(struct bnxt *bp)
        bp->parent->fid = rte_le_to_cpu_16(resp->fid);
        bp->parent->port_id = rte_le_to_cpu_16(resp->port_id);
 
-       /* FIXME: Temporary workaround - remove when firmware issue is fixed. */
-       if (bp->parent->vnic == 0) {
-               PMD_DRV_LOG(DEBUG, "parent VNIC unavailable.\n");
-               /* Use hard-coded values appropriate for current Wh+ fw. */
-               if (bp->parent->fid == 2)
-                       bp->parent->vnic = 0x100;
-               else
-                       bp->parent->vnic = 1;
-       }
-
        HWRM_UNLOCK();
 
        return 0;
@@ -5085,6 +5087,7 @@ static int
 bnxt_vnic_rss_configure_p5(struct bnxt *bp, struct bnxt_vnic_info *vnic)
 {
        struct hwrm_vnic_rss_cfg_output *resp = bp->hwrm_cmd_resp_addr;
+       uint8_t *rxq_state = bp->eth_dev->data->rx_queue_state;
        struct hwrm_vnic_rss_cfg_input req = {.req_type = 0 };
        struct bnxt_rx_queue **rxqs = bp->rx_queues;
        uint16_t *ring_tbl = vnic->rss_table;
@@ -5118,7 +5121,7 @@ bnxt_vnic_rss_configure_p5(struct bnxt *bp, struct bnxt_vnic_info *vnic)
 
                        /* Find next active ring. */
                        for (cnt = 0; cnt < max_rings; cnt++) {
-                               if (rxqs[k]->rx_started)
+                               if (rxq_state[k] != RTE_ETH_QUEUE_STATE_STOPPED)
                                        break;
                                if (++k == max_rings)
                                        k = 0;