net/bnxt: fix ring alignment for Thor-based adapters
[dpdk.git] / drivers / net / bnxt / bnxt_ring.c
index 2f57e03..b4c114d 100644 (file)
@@ -162,18 +162,21 @@ int bnxt_alloc_rings(struct bnxt *bp, uint16_t qidx,
        int nq_ring_len = BNXT_CHIP_THOR(bp) ? cp_ring_len : 0;
 
        int tx_ring_start = nq_ring_start + nq_ring_len;
+       tx_ring_start = RTE_ALIGN(tx_ring_start, 4096);
        int tx_ring_len = tx_ring_info ?
            RTE_CACHE_LINE_ROUNDUP(tx_ring_info->tx_ring_struct->ring_size *
                                   sizeof(struct tx_bd_long)) : 0;
        tx_ring_len = RTE_ALIGN(tx_ring_len, 4096);
 
        int rx_ring_start = tx_ring_start + tx_ring_len;
+       rx_ring_start = RTE_ALIGN(rx_ring_start, 4096);
        int rx_ring_len =  rx_ring_info ?
                RTE_CACHE_LINE_ROUNDUP(rx_ring_info->rx_ring_struct->ring_size *
                sizeof(struct rx_prod_pkt_bd)) : 0;
        rx_ring_len = RTE_ALIGN(rx_ring_len, 4096);
 
        int ag_ring_start = rx_ring_start + rx_ring_len;
+       ag_ring_start = RTE_ALIGN(ag_ring_start, 4096);
        int ag_ring_len = rx_ring_len * AGG_RING_SIZE_FACTOR;
        ag_ring_len = RTE_ALIGN(ag_ring_len, 4096);
 
@@ -561,11 +564,7 @@ int bnxt_alloc_hwrm_rx_ring(struct bnxt *bp, int queue_index)
        if (rc)
                goto err_out;
 
-       rxq->rx_buf_use_size = BNXT_MAX_MTU + RTE_ETHER_HDR_LEN +
-               RTE_ETHER_CRC_LEN + (2 * VLAN_TAG_SIZE);
-
-       if (bp->eth_dev->data->rx_queue_state[queue_index] ==
-           RTE_ETH_QUEUE_STATE_STARTED) {
+       if (rxq->rx_started) {
                if (bnxt_init_one_rx_ring(rxq)) {
                        RTE_LOG(ERR, PMD,
                                "bnxt_init_one_rx_ring failed!\n");
@@ -587,6 +586,42 @@ err_out:
        return rc;
 }
 
+/* Initialise all rings to -1, its used to free rings later if allocation
+ * of few rings fails.
+ */
+static void bnxt_init_all_rings(struct bnxt *bp)
+{
+       unsigned int i = 0;
+       struct bnxt_rx_queue *rxq;
+       struct bnxt_ring *cp_ring;
+       struct bnxt_ring *ring;
+       struct bnxt_rx_ring_info *rxr;
+       struct bnxt_tx_queue *txq;
+
+       for (i = 0; i < bp->rx_cp_nr_rings; i++) {
+               rxq = bp->rx_queues[i];
+               /* Rx-compl */
+               cp_ring = rxq->cp_ring->cp_ring_struct;
+               cp_ring->fw_ring_id = INVALID_HW_RING_ID;
+               /* Rx-Reg */
+               rxr = rxq->rx_ring;
+               ring = rxr->rx_ring_struct;
+               ring->fw_ring_id = INVALID_HW_RING_ID;
+               /* Rx-AGG */
+               ring = rxr->ag_ring_struct;
+               ring->fw_ring_id = INVALID_HW_RING_ID;
+       }
+       for (i = 0; i < bp->tx_cp_nr_rings; i++) {
+               txq = bp->tx_queues[i];
+               /* Tx cmpl */
+               cp_ring = txq->cp_ring->cp_ring_struct;
+               cp_ring->fw_ring_id = INVALID_HW_RING_ID;
+               /*Tx Ring */
+               ring = txq->tx_ring->tx_ring_struct;
+               ring->fw_ring_id = INVALID_HW_RING_ID;
+       }
+}
+
 /* ring_grp usage:
  * [0] = default completion ring
  * [1 -> +rx_cp_nr_rings] = rx_cp, rx rings
@@ -600,6 +635,7 @@ int bnxt_alloc_hwrm_rings(struct bnxt *bp)
        int rc = 0;
 
        bnxt_init_dflt_coal(&coal);
+       bnxt_init_all_rings(bp);
 
        for (i = 0; i < bp->rx_cp_nr_rings; i++) {
                struct bnxt_rx_queue *rxq = bp->rx_queues[i];
@@ -640,8 +676,6 @@ int bnxt_alloc_hwrm_rings(struct bnxt *bp)
                if (bnxt_alloc_rx_agg_ring(bp, i))
                        goto err_out;
 
-               rxq->rx_buf_use_size = BNXT_MAX_MTU + RTE_ETHER_HDR_LEN +
-                                       RTE_ETHER_CRC_LEN + (2 * VLAN_TAG_SIZE);
                if (bnxt_init_one_rx_ring(rxq)) {
                        PMD_DRV_LOG(ERR, "bnxt_init_one_rx_ring failed!\n");
                        bnxt_rx_queue_release_op(rxq);
@@ -694,13 +728,15 @@ err_out:
 int bnxt_alloc_async_cp_ring(struct bnxt *bp)
 {
        struct bnxt_cp_ring_info *cpr = bp->async_cp_ring;
-       struct bnxt_ring *cp_ring = cpr->cp_ring_struct;
+       struct bnxt_ring *cp_ring;
        uint8_t ring_type;
        int rc;
 
-       if (BNXT_NUM_ASYNC_CPR(bp) == 0)
+       if (BNXT_NUM_ASYNC_CPR(bp) == 0 || cpr == NULL)
                return 0;
 
+       cp_ring = cpr->cp_ring_struct;
+
        if (BNXT_HAS_NQ(bp))
                ring_type = HWRM_RING_ALLOC_INPUT_RING_TYPE_NQ;
        else