net/sfc: add pattern parsing stub to MAE backend
[dpdk.git] / drivers / net / bnxt / bnxt_txr.c
index c7a2de6..fb358d6 100644 (file)
@@ -78,6 +78,7 @@ int bnxt_init_tx_ring_struct(struct bnxt_tx_queue *txq, unsigned int socket_id)
        ring->bd_dma = txr->tx_desc_mapping;
        ring->vmem_size = ring->ring_size * sizeof(struct bnxt_sw_tx_bd);
        ring->vmem = (void **)&txr->tx_buf_ring;
+       ring->fw_ring_id = INVALID_HW_RING_ID;
 
        cpr = rte_zmalloc_socket("bnxt_tx_ring",
                                 sizeof(struct bnxt_cp_ring_info),
@@ -98,6 +99,7 @@ int bnxt_init_tx_ring_struct(struct bnxt_tx_queue *txq, unsigned int socket_id)
        ring->bd_dma = cpr->cp_desc_mapping;
        ring->vmem_size = 0;
        ring->vmem = NULL;
+       ring->fw_ring_id = INVALID_HW_RING_ID;
 
        return 0;
 }
@@ -214,6 +216,10 @@ static uint16_t bnxt_start_xmit(struct rte_mbuf *tx_pkt,
                                        &txr->tx_desc_ring[txr->tx_prod];
                txbd1->lflags = 0;
                txbd1->cfa_meta = vlan_tag_flags;
+               /* Legacy tx_bd_long_hi->mss =
+                * tx_bd_long_hi->kid_or_ts_high_mss
+                */
+               txbd1->kid_or_ts_high_mss = 0;
 
                if (txq->vfr_tx_cfa_action)
                        txbd1->cfa_action = txq->vfr_tx_cfa_action;
@@ -233,91 +239,76 @@ static uint16_t bnxt_start_xmit(struct rte_mbuf *tx_pkt,
                                    tx_pkt->outer_l3_len : 0;
                        /* The hdr_size is multiple of 16bit units not 8bit.
                         * Hence divide by 2.
+                        * Also legacy hdr_size = kid_or_ts_low_hdr_size.
                         */
-                       txbd1->hdr_size = hdr_size >> 1;
-                       txbd1->mss = tx_pkt->tso_segsz;
-                       RTE_VERIFY(txbd1->mss);
+                       txbd1->kid_or_ts_low_hdr_size = hdr_size >> 1;
+                       txbd1->kid_or_ts_high_mss = tx_pkt->tso_segsz;
+                       RTE_VERIFY(txbd1->kid_or_ts_high_mss);
 
                } else if ((tx_pkt->ol_flags & PKT_TX_OIP_IIP_TCP_UDP_CKSUM) ==
                           PKT_TX_OIP_IIP_TCP_UDP_CKSUM) {
                        /* Outer IP, Inner IP, Inner TCP/UDP CSO */
                        txbd1->lflags |= TX_BD_FLG_TIP_IP_TCP_UDP_CHKSUM;
-                       txbd1->mss = 0;
                } else if ((tx_pkt->ol_flags & PKT_TX_OIP_IIP_TCP_CKSUM) ==
                           PKT_TX_OIP_IIP_TCP_CKSUM) {
                        /* Outer IP, Inner IP, Inner TCP/UDP CSO */
                        txbd1->lflags |= TX_BD_FLG_TIP_IP_TCP_UDP_CHKSUM;
-                       txbd1->mss = 0;
                } else if ((tx_pkt->ol_flags & PKT_TX_OIP_IIP_UDP_CKSUM) ==
                           PKT_TX_OIP_IIP_UDP_CKSUM) {
                        /* Outer IP, Inner IP, Inner TCP/UDP CSO */
                        txbd1->lflags |= TX_BD_FLG_TIP_IP_TCP_UDP_CHKSUM;
-                       txbd1->mss = 0;
                } else if ((tx_pkt->ol_flags & PKT_TX_IIP_TCP_UDP_CKSUM) ==
                           PKT_TX_IIP_TCP_UDP_CKSUM) {
                        /* (Inner) IP, (Inner) TCP/UDP CSO */
                        txbd1->lflags |= TX_BD_FLG_IP_TCP_UDP_CHKSUM;
-                       txbd1->mss = 0;
                } else if ((tx_pkt->ol_flags & PKT_TX_IIP_UDP_CKSUM) ==
                           PKT_TX_IIP_UDP_CKSUM) {
                        /* (Inner) IP, (Inner) TCP/UDP CSO */
                        txbd1->lflags |= TX_BD_FLG_IP_TCP_UDP_CHKSUM;
-                       txbd1->mss = 0;
                } else if ((tx_pkt->ol_flags & PKT_TX_IIP_TCP_CKSUM) ==
                           PKT_TX_IIP_TCP_CKSUM) {
                        /* (Inner) IP, (Inner) TCP/UDP CSO */
                        txbd1->lflags |= TX_BD_FLG_IP_TCP_UDP_CHKSUM;
-                       txbd1->mss = 0;
                } else if ((tx_pkt->ol_flags & PKT_TX_OIP_TCP_UDP_CKSUM) ==
                           PKT_TX_OIP_TCP_UDP_CKSUM) {
                        /* Outer IP, (Inner) TCP/UDP CSO */
                        txbd1->lflags |= TX_BD_FLG_TIP_TCP_UDP_CHKSUM;
-                       txbd1->mss = 0;
                } else if ((tx_pkt->ol_flags & PKT_TX_OIP_UDP_CKSUM) ==
                           PKT_TX_OIP_UDP_CKSUM) {
                        /* Outer IP, (Inner) TCP/UDP CSO */
                        txbd1->lflags |= TX_BD_FLG_TIP_TCP_UDP_CHKSUM;
-                       txbd1->mss = 0;
                } else if ((tx_pkt->ol_flags & PKT_TX_OIP_TCP_CKSUM) ==
                           PKT_TX_OIP_TCP_CKSUM) {
                        /* Outer IP, (Inner) TCP/UDP CSO */
                        txbd1->lflags |= TX_BD_FLG_TIP_TCP_UDP_CHKSUM;
-                       txbd1->mss = 0;
                } else if ((tx_pkt->ol_flags & PKT_TX_OIP_IIP_CKSUM) ==
                           PKT_TX_OIP_IIP_CKSUM) {
                        /* Outer IP, Inner IP CSO */
                        txbd1->lflags |= TX_BD_FLG_TIP_IP_CHKSUM;
-                       txbd1->mss = 0;
                } else if ((tx_pkt->ol_flags & PKT_TX_TCP_UDP_CKSUM) ==
                           PKT_TX_TCP_UDP_CKSUM) {
                        /* TCP/UDP CSO */
                        txbd1->lflags |= TX_BD_LONG_LFLAGS_TCP_UDP_CHKSUM;
-                       txbd1->mss = 0;
                } else if ((tx_pkt->ol_flags & PKT_TX_TCP_CKSUM) ==
                           PKT_TX_TCP_CKSUM) {
                        /* TCP/UDP CSO */
                        txbd1->lflags |= TX_BD_LONG_LFLAGS_TCP_UDP_CHKSUM;
-                       txbd1->mss = 0;
                } else if ((tx_pkt->ol_flags & PKT_TX_UDP_CKSUM) ==
                           PKT_TX_UDP_CKSUM) {
                        /* TCP/UDP CSO */
                        txbd1->lflags |= TX_BD_LONG_LFLAGS_TCP_UDP_CHKSUM;
-                       txbd1->mss = 0;
                } else if ((tx_pkt->ol_flags & PKT_TX_IP_CKSUM) ==
                           PKT_TX_IP_CKSUM) {
                        /* IP CSO */
                        txbd1->lflags |= TX_BD_LONG_LFLAGS_IP_CHKSUM;
-                       txbd1->mss = 0;
                } else if ((tx_pkt->ol_flags & PKT_TX_OUTER_IP_CKSUM) ==
                           PKT_TX_OUTER_IP_CKSUM) {
                        /* IP CSO */
                        txbd1->lflags |= TX_BD_LONG_LFLAGS_T_IP_CHKSUM;
-                       txbd1->mss = 0;
                } else if ((tx_pkt->ol_flags & PKT_TX_IEEE1588_TMST) ==
                           PKT_TX_IEEE1588_TMST) {
                        /* PTP */
                        txbd1->lflags |= TX_BD_LONG_LFLAGS_STAMP;
-                       txbd1->mss = 0;
                }
        } else {
                txbd->flags_type |= TX_BD_SHORT_TYPE_TX_BD_SHORT;
@@ -346,6 +337,40 @@ static uint16_t bnxt_start_xmit(struct rte_mbuf *tx_pkt,
        return 0;
 }
 
+/*
+ * Transmit completion function for use when DEV_TX_OFFLOAD_MBUF_FAST_FREE
+ * is enabled.
+ */
+static void bnxt_tx_cmp_fast(struct bnxt_tx_queue *txq, int nr_pkts)
+{
+       struct bnxt_tx_ring_info *txr = txq->tx_ring;
+       struct rte_mbuf **free = txq->free;
+       uint16_t cons = txr->tx_cons;
+       unsigned int blk = 0;
+       int i, j;
+
+       for (i = 0; i < nr_pkts; i++) {
+               struct bnxt_sw_tx_bd *tx_buf;
+               unsigned short nr_bds;
+
+               tx_buf = &txr->tx_buf_ring[cons];
+               nr_bds = tx_buf->nr_bds;
+               for (j = 0; j < nr_bds; j++) {
+                       if (tx_buf->mbuf) {
+                               /* Add mbuf to the bulk free array */
+                               free[blk++] = tx_buf->mbuf;
+                               tx_buf->mbuf = NULL;
+                       }
+                       cons = RING_NEXT(txr->tx_ring_struct, cons);
+                       tx_buf = &txr->tx_buf_ring[cons];
+               }
+       }
+       if (blk)
+               rte_mempool_put_bulk(free[0]->pool, (void *)free, blk);
+
+       txr->tx_cons = cons;
+}
+
 static void bnxt_tx_cmp(struct bnxt_tx_queue *txq, int nr_pkts)
 {
        struct bnxt_tx_ring_info *txr = txq->tx_ring;
@@ -437,7 +462,10 @@ static int bnxt_handle_tx_cp(struct bnxt_tx_queue *txq)
        } while (nb_tx_pkts < ring_mask);
 
        if (nb_tx_pkts) {
-               bnxt_tx_cmp(txq, nb_tx_pkts);
+               if (txq->offloads & DEV_TX_OFFLOAD_MBUF_FAST_FREE)
+                       bnxt_tx_cmp_fast(txq, nb_tx_pkts);
+               else
+                       bnxt_tx_cmp(txq, nb_tx_pkts);
                cpr->cp_raw_cons = raw_cons;
                bnxt_db_cq(cpr);
        }