X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fbnxt%2Fbnxt_rxq.c;h=78514143e533b4b9147cd6a099e7603ab887dffc;hb=bd885ab120e2335f978a28ee0aa4303017390e15;hp=f8b3f5df7fe92e5f690ef6dd352af2ecdfc74f80;hpb=cec43bbf3805911eec0081681faa6dea6a06e7a9;p=dpdk.git diff --git a/drivers/net/bnxt/bnxt_rxq.c b/drivers/net/bnxt/bnxt_rxq.c index f8b3f5df7f..78514143e5 100644 --- a/drivers/net/bnxt/bnxt_rxq.c +++ b/drivers/net/bnxt/bnxt_rxq.c @@ -172,9 +172,15 @@ out: bp->flags &= ~BNXT_FLAG_UPDATE_HASH; for (i = 0; i < bp->nr_vnics; i++) { + uint32_t lvl = ETH_RSS_LEVEL(rss->rss_hf); + vnic = &bp->vnic_info[i]; vnic->hash_type = bnxt_rte_to_hwrm_hash_types(rss->rss_hf); + vnic->hash_mode = + bnxt_rte_to_hwrm_hash_level(bp, + rss->rss_hf, + lvl); /* * Use the supplied key if the key length is @@ -201,7 +207,7 @@ void bnxt_rx_queue_release_mbufs(struct bnxt_rx_queue *rxq) struct bnxt_tpa_info *tpa_info; uint16_t i; - if (!rxq) + if (!rxq || !rxq->rx_ring) return; rte_spinlock_lock(&rxq->lock); @@ -211,7 +217,8 @@ void bnxt_rx_queue_release_mbufs(struct bnxt_rx_queue *rxq) for (i = 0; i < rxq->rx_ring->rx_ring_struct->ring_size; i++) { if (sw_ring[i]) { - rte_pktmbuf_free_seg(sw_ring[i]); + if (sw_ring[i] != &rxq->fake_mbuf) + rte_pktmbuf_free_seg(sw_ring[i]); sw_ring[i] = NULL; } } @@ -266,12 +273,21 @@ void bnxt_rx_queue_release_op(void *rx_queue) bnxt_rx_queue_release_mbufs(rxq); /* Free RX ring hardware descriptors */ - bnxt_free_ring(rxq->rx_ring->rx_ring_struct); - /* Free RX Agg ring hardware descriptors */ - bnxt_free_ring(rxq->rx_ring->ag_ring_struct); - + if (rxq->rx_ring) { + bnxt_free_ring(rxq->rx_ring->rx_ring_struct); + rte_free(rxq->rx_ring->rx_ring_struct); + /* Free RX Agg ring hardware descriptors */ + bnxt_free_ring(rxq->rx_ring->ag_ring_struct); + rte_free(rxq->rx_ring->ag_ring_struct); + + rte_free(rxq->rx_ring); + } /* Free RX completion ring hardware descriptors */ - bnxt_free_ring(rxq->cp_ring->cp_ring_struct); + if (rxq->cp_ring) { + bnxt_free_ring(rxq->cp_ring->cp_ring_struct); + rte_free(rxq->cp_ring->cp_ring_struct); + rte_free(rxq->cp_ring); + } bnxt_free_rxq_stats(rxq); rte_memzone_free(rxq->mz); @@ -307,8 +323,7 @@ int bnxt_rx_queue_setup_op(struct rte_eth_dev *eth_dev, if (nb_desc < BNXT_MIN_RING_DESC || nb_desc > MAX_RX_DESC_CNT) { PMD_DRV_LOG(ERR, "nb_desc %d is invalid\n", nb_desc); - rc = -EINVAL; - goto out; + return -EINVAL; } if (eth_dev->data->rx_queues) { @@ -320,8 +335,7 @@ int bnxt_rx_queue_setup_op(struct rte_eth_dev *eth_dev, RTE_CACHE_LINE_SIZE, socket_id); if (!rxq) { PMD_DRV_LOG(ERR, "bnxt_rx_queue allocation failed!\n"); - rc = -ENOMEM; - goto out; + return -ENOMEM; } rxq->bp = bp; rxq->mb_pool = mp; @@ -329,11 +343,19 @@ int bnxt_rx_queue_setup_op(struct rte_eth_dev *eth_dev, rxq->rx_free_thresh = RTE_MIN(rte_align32pow2(nb_desc) / 4, RTE_BNXT_MAX_RX_BURST); + if (rx_conf->rx_drop_en != BNXT_DEFAULT_RX_DROP_EN) + PMD_DRV_LOG(NOTICE, + "Per-queue config of drop-en is not supported.\n"); + rxq->drop_en = BNXT_DEFAULT_RX_DROP_EN; + 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; + if (rc) { + PMD_DRV_LOG(ERR, + "init_rx_ring_struct failed!\n"); + goto err; + } PMD_DRV_LOG(DEBUG, "RX Buf size is %d\n", rxq->rx_buf_size); rxq->queue_id = queue_idx; @@ -348,10 +370,8 @@ int bnxt_rx_queue_setup_op(struct rte_eth_dev *eth_dev, 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); - rc = -ENOMEM; - goto out; + "ring_dma_zone_reserve for rx_ring failed!\n"); + goto err; } rte_atomic64_init(&rxq->rx_mbuf_alloc_fail); @@ -375,7 +395,9 @@ int bnxt_rx_queue_setup_op(struct rte_eth_dev *eth_dev, if (!queue_idx) bnxt_mtu_set_op(eth_dev, eth_dev->data->mtu); -out: + return 0; +err: + bnxt_rx_queue_release_op(rxq); return rc; }