net/pfe: add MTU and MAC address set
[dpdk.git] / drivers / net / bnxt / bnxt_rxq.c
index d5fc526..9439fcd 100644 (file)
@@ -64,6 +64,7 @@ int bnxt_mq_rx_configure(struct bnxt *bp)
                        rc = -ENOMEM;
                        goto err_out;
                }
+               filter->flags |= HWRM_CFA_L2_FILTER_ALLOC_INPUT_FLAGS_OUTERMOST;
                STAILQ_INSERT_TAIL(&vnic->filter, filter, next);
                goto out;
        }
@@ -75,6 +76,7 @@ int bnxt_mq_rx_configure(struct bnxt *bp)
                switch (dev_conf->rxmode.mq_mode) {
                case ETH_MQ_RX_VMDQ_RSS:
                case ETH_MQ_RX_VMDQ_ONLY:
+               case ETH_MQ_RX_VMDQ_DCB_RSS:
                        /* FALLTHROUGH */
                        /* ETH_8/64_POOLs */
                        pools = conf->nb_queue_pools;
@@ -90,7 +92,7 @@ int bnxt_mq_rx_configure(struct bnxt *bp)
                                pools = max_pools;
                        break;
                case ETH_MQ_RX_RSS:
-                       pools = 1;
+                       pools = bp->rx_cosq_cnt ? bp->rx_cosq_cnt : 1;
                        break;
                default:
                        PMD_DRV_LOG(ERR, "Unsupported mq_mod %d\n",
@@ -100,6 +102,7 @@ int bnxt_mq_rx_configure(struct bnxt *bp)
                }
        }
        nb_q_per_grp = bp->rx_cp_nr_rings / pools;
+       bp->rx_num_qs_per_vnic = nb_q_per_grp;
        PMD_DRV_LOG(DEBUG, "pools = %u nb_q_per_grp = %u\n",
                    pools, nb_q_per_grp);
        start_grp_id = 0;
@@ -144,6 +147,7 @@ int bnxt_mq_rx_configure(struct bnxt *bp)
                        rc = -ENOMEM;
                        goto err_out;
                }
+               filter->flags |= HWRM_CFA_L2_FILTER_ALLOC_INPUT_FLAGS_OUTERMOST;
                /*
                 * TODO: Configure & associate CFA rule for
                 * each VNIC for each VMDq with MACVLAN, MACVLAN+TC
@@ -158,29 +162,16 @@ skip_filter_allocation:
 out:
        if (dev_conf->rxmode.mq_mode & ETH_MQ_RX_RSS_FLAG) {
                struct rte_eth_rss_conf *rss = &dev_conf->rx_adv_conf.rss_conf;
-               uint16_t hash_type = 0;
 
                if (bp->flags & BNXT_FLAG_UPDATE_HASH) {
                        rss = &bp->rss_conf;
                        bp->flags &= ~BNXT_FLAG_UPDATE_HASH;
                }
 
-               if (rss->rss_hf & ETH_RSS_IPV4)
-                       hash_type |= HWRM_VNIC_RSS_CFG_INPUT_HASH_TYPE_IPV4;
-               if (rss->rss_hf & ETH_RSS_NONFRAG_IPV4_TCP)
-                       hash_type |= HWRM_VNIC_RSS_CFG_INPUT_HASH_TYPE_TCP_IPV4;
-               if (rss->rss_hf & ETH_RSS_NONFRAG_IPV4_UDP)
-                       hash_type |= HWRM_VNIC_RSS_CFG_INPUT_HASH_TYPE_UDP_IPV4;
-               if (rss->rss_hf & ETH_RSS_IPV6)
-                       hash_type |= HWRM_VNIC_RSS_CFG_INPUT_HASH_TYPE_IPV6;
-               if (rss->rss_hf & ETH_RSS_NONFRAG_IPV6_TCP)
-                       hash_type |= HWRM_VNIC_RSS_CFG_INPUT_HASH_TYPE_TCP_IPV6;
-               if (rss->rss_hf & ETH_RSS_NONFRAG_IPV6_UDP)
-                       hash_type |= HWRM_VNIC_RSS_CFG_INPUT_HASH_TYPE_UDP_IPV6;
-
                for (i = 0; i < bp->nr_vnics; i++) {
                        vnic = &bp->vnic_info[i];
-                       vnic->hash_type = hash_type;
+                       vnic->hash_type =
+                               bnxt_rte_to_hwrm_hash_types(rss->rss_hf);
 
                        /*
                         * Use the supplied key if the key length is
@@ -207,39 +198,42 @@ void bnxt_rx_queue_release_mbufs(struct bnxt_rx_queue *rxq)
        struct bnxt_tpa_info *tpa_info;
        uint16_t i;
 
+       if (!rxq)
+               return;
+
        rte_spinlock_lock(&rxq->lock);
 
-       if (rxq) {
-               sw_ring = rxq->rx_ring->rx_buf_ring;
-               if (sw_ring) {
-                       for (i = 0;
-                            i < rxq->rx_ring->rx_ring_struct->ring_size; i++) {
-                               if (sw_ring[i].mbuf) {
-                                       rte_pktmbuf_free_seg(sw_ring[i].mbuf);
-                                       sw_ring[i].mbuf = NULL;
-                               }
+       sw_ring = rxq->rx_ring->rx_buf_ring;
+       if (sw_ring) {
+               for (i = 0;
+                    i < rxq->rx_ring->rx_ring_struct->ring_size; i++) {
+                       if (sw_ring[i].mbuf) {
+                               rte_pktmbuf_free_seg(sw_ring[i].mbuf);
+                               sw_ring[i].mbuf = NULL;
                        }
                }
-               /* Free up mbufs in Agg ring */
-               sw_ring = rxq->rx_ring->ag_buf_ring;
-               if (sw_ring) {
-                       for (i = 0;
-                            i < rxq->rx_ring->ag_ring_struct->ring_size; i++) {
-                               if (sw_ring[i].mbuf) {
-                                       rte_pktmbuf_free_seg(sw_ring[i].mbuf);
-                                       sw_ring[i].mbuf = NULL;
-                               }
+       }
+       /* Free up mbufs in Agg ring */
+       sw_ring = rxq->rx_ring->ag_buf_ring;
+       if (sw_ring) {
+               for (i = 0;
+                    i < rxq->rx_ring->ag_ring_struct->ring_size; i++) {
+                       if (sw_ring[i].mbuf) {
+                               rte_pktmbuf_free_seg(sw_ring[i].mbuf);
+                               sw_ring[i].mbuf = NULL;
                        }
                }
+       }
 
-               /* Free up mbufs in TPA */
-               tpa_info = rxq->rx_ring->tpa_info;
-               if (tpa_info) {
-                       for (i = 0; i < BNXT_TPA_MAX; i++) {
-                               if (tpa_info[i].mbuf) {
-                                       rte_pktmbuf_free_seg(tpa_info[i].mbuf);
-                                       tpa_info[i].mbuf = NULL;
-                               }
+       /* Free up mbufs in TPA */
+       tpa_info = rxq->rx_ring->tpa_info;
+       if (tpa_info) {
+               int max_aggs = BNXT_TPA_MAX_AGGS(rxq->bp);
+
+               for (i = 0; i < max_aggs; i++) {
+                       if (tpa_info[i].mbuf) {
+                               rte_pktmbuf_free_seg(tpa_info[i].mbuf);
+                               tpa_info[i].mbuf = NULL;
                        }
                }
        }
@@ -331,13 +325,13 @@ int bnxt_rx_queue_setup_op(struct rte_eth_dev *eth_dev,
        rxq->nb_rx_desc = nb_desc;
        rxq->rx_free_thresh = rx_conf->rx_free_thresh;
 
-       PMD_DRV_LOG(DEBUG, "RX Buf size is %d\n", rxq->rx_buf_use_size);
        PMD_DRV_LOG(DEBUG, "RX Buf MTU %d\n", eth_dev->data->mtu);
 
        rc = bnxt_init_rx_ring_struct(rxq, socket_id);
        if (rc)
                goto out;
 
+       PMD_DRV_LOG(DEBUG, "RX Buf size is %d\n", rxq->rx_buf_size);
        rxq->queue_id = queue_idx;
        rxq->port_id = eth_dev->data->port_id;
        if (rx_offloads & DEV_RX_OFFLOAD_KEEP_CRC)
@@ -347,8 +341,8 @@ int bnxt_rx_queue_setup_op(struct rte_eth_dev *eth_dev,
 
        eth_dev->data->rx_queues[queue_idx] = rxq;
        /* Allocate RX ring hardware descriptors */
-       if (bnxt_alloc_rings(bp, queue_idx, NULL, rxq, rxq->cp_ring,
-                       rxq->nq_ring, "rxr")) {
+       if (bnxt_alloc_rings(bp, queue_idx, NULL, rxq, rxq->cp_ring, NULL,
+                            "rxr")) {
                PMD_DRV_LOG(ERR,
                        "ring_dma_zone_reserve for rx_ring failed!\n");
                bnxt_rx_queue_release_op(rxq);
@@ -357,9 +351,19 @@ int bnxt_rx_queue_setup_op(struct rte_eth_dev *eth_dev,
        }
        rte_atomic64_init(&rxq->rx_mbuf_alloc_fail);
 
-       rxq->rx_deferred_start = rx_conf->rx_deferred_start;
-       queue_state = rxq->rx_deferred_start ? RTE_ETH_QUEUE_STATE_STOPPED :
-                                               RTE_ETH_QUEUE_STATE_STARTED;
+       /* rxq 0 must not be stopped when used as async CPR */
+       if (!BNXT_NUM_ASYNC_CPR(bp) && queue_idx == 0)
+               rxq->rx_deferred_start = false;
+       else
+               rxq->rx_deferred_start = rx_conf->rx_deferred_start;
+
+       if (rxq->rx_deferred_start) {
+               queue_state = RTE_ETH_QUEUE_STATE_STOPPED;
+               rxq->rx_started = false;
+       } else {
+               queue_state = RTE_ETH_QUEUE_STATE_STARTED;
+               rxq->rx_started = true;
+       }
        eth_dev->data->rx_queue_state[queue_idx] = queue_state;
        rte_spinlock_init(&rxq->lock);
 
@@ -432,6 +436,11 @@ int bnxt_rx_queue_start(struct rte_eth_dev *dev, uint16_t rx_queue_id)
                return -EINVAL;
        }
 
+       /* Set the queue state to started here.
+        * We check the status of the queue while posting buffer.
+        * If queue is it started, we do not post buffers for Rx.
+        */
+       rxq->rx_started = true;
        bnxt_free_hwrm_rx_ring(bp, rx_queue_id);
        rc = bnxt_alloc_hwrm_rx_ring(bp, rx_queue_id);
        if (rc)
@@ -448,20 +457,21 @@ int bnxt_rx_queue_start(struct rte_eth_dev *dev, uint16_t rx_queue_id)
 
                        vnic->fw_grp_ids[rx_queue_id] =
                                        bp->grp_info[rx_queue_id].fw_grp_id;
+                       PMD_DRV_LOG(DEBUG,
+                                   "vnic = %p fw_grp_id = %d\n",
+                                   vnic, bp->grp_info[rx_queue_id].fw_grp_id);
                }
 
-               PMD_DRV_LOG(DEBUG,
-                           "vnic = %p fw_grp_id = %d\n",
-                           vnic, bp->grp_info[rx_queue_id].fw_grp_id);
-
-               rc = bnxt_vnic_rss_configure(bp, vnic);
+               PMD_DRV_LOG(DEBUG, "Rx Queue Count %d\n", vnic->rx_queue_cnt);
+               if (vnic->rx_queue_cnt > 1)
+                       rc = bnxt_vnic_rss_configure(bp, vnic);
        }
 
-       if (rc == 0) {
+       if (rc == 0)
                dev->data->rx_queue_state[rx_queue_id] =
                                RTE_ETH_QUEUE_STATE_STARTED;
-               rxq->rx_deferred_start = false;
-       }
+       else
+               rxq->rx_started = false;
 
        PMD_DRV_LOG(INFO,
                    "queue %d, rx_deferred_start %d, state %d!\n",
@@ -500,14 +510,17 @@ int bnxt_rx_queue_stop(struct rte_eth_dev *dev, uint16_t rx_queue_id)
        }
 
        dev->data->rx_queue_state[rx_queue_id] = RTE_ETH_QUEUE_STATE_STOPPED;
-       rxq->rx_deferred_start = true;
+       rxq->rx_started = false;
        PMD_DRV_LOG(DEBUG, "Rx queue stopped\n");
 
        if (dev_conf->rxmode.mq_mode & ETH_MQ_RX_RSS_FLAG) {
                vnic = rxq->vnic;
                if (BNXT_HAS_RING_GRPS(bp))
                        vnic->fw_grp_ids[rx_queue_id] = INVALID_HW_RING_ID;
-               rc = bnxt_vnic_rss_configure(bp, vnic);
+
+               PMD_DRV_LOG(DEBUG, "Rx Queue Count %d\n", vnic->rx_queue_cnt);
+               if (vnic->rx_queue_cnt > 1)
+                       rc = bnxt_vnic_rss_configure(bp, vnic);
        }
 
        if (rc == 0)