net/mlx5: add header reformat HW steering action
[dpdk.git] / drivers / net / hns3 / hns3_rxtx.c
index d240e36..a28de06 100644 (file)
@@ -86,8 +86,7 @@ hns3_rx_queue_release(void *queue)
                hns3_rx_queue_release_mbufs(rxq);
                if (rxq->mz)
                        rte_memzone_free(rxq->mz);
-               if (rxq->sw_ring)
-                       rte_free(rxq->sw_ring);
+               rte_free(rxq->sw_ring);
                rte_free(rxq);
        }
 }
@@ -100,10 +99,8 @@ hns3_tx_queue_release(void *queue)
                hns3_tx_queue_release_mbufs(txq);
                if (txq->mz)
                        rte_memzone_free(txq->mz);
-               if (txq->sw_ring)
-                       rte_free(txq->sw_ring);
-               if (txq->free)
-                       rte_free(txq->free);
+               rte_free(txq->sw_ring);
+               rte_free(txq->free);
                rte_free(txq);
        }
 }
@@ -1382,9 +1379,6 @@ hns3_alloc_rxq_and_dma_zone(struct rte_eth_dev *dev,
        rxq->rx_ring = (struct hns3_desc *)rx_mz->addr;
        rxq->rx_ring_phys_addr = rx_mz->iova;
 
-       hns3_dbg(hw, "No.%u rx descriptors iova 0x%" PRIx64, q_info->idx,
-                rxq->rx_ring_phys_addr);
-
        return rxq;
 }
 
@@ -1469,9 +1463,6 @@ hns3_alloc_txq_and_dma_zone(struct rte_eth_dev *dev,
        txq->tx_ring = (struct hns3_desc *)tx_mz->addr;
        txq->tx_ring_phys_addr = tx_mz->iova;
 
-       hns3_dbg(hw, "No.%u tx descriptors iova 0x%" PRIx64, q_info->idx,
-                txq->tx_ring_phys_addr);
-
        /* Clear tx bd */
        desc = txq->tx_ring;
        for (i = 0; i < txq->nb_tx_desc; i++) {
@@ -2388,14 +2379,14 @@ hns3_rx_alloc_buffer(struct hns3_rx_queue *rxq)
                return rte_mbuf_raw_alloc(rxq->mb_pool);
 }
 
-static inline void
+static void
 hns3_rx_ptp_timestamp_handle(struct hns3_rx_queue *rxq, struct rte_mbuf *mbuf,
-                 volatile struct hns3_desc *rxd)
+                            uint64_t timestamp)
 {
        struct hns3_pf *pf = HNS3_DEV_PRIVATE_TO_PF(rxq->hns);
-       uint64_t timestamp = rte_le_to_cpu_64(rxd->timestamp);
 
-       mbuf->ol_flags |= RTE_MBUF_F_RX_IEEE1588_PTP | RTE_MBUF_F_RX_IEEE1588_TMST;
+       mbuf->ol_flags |= RTE_MBUF_F_RX_IEEE1588_PTP |
+                         RTE_MBUF_F_RX_IEEE1588_TMST;
        if (hns3_timestamp_rx_dynflag > 0) {
                *RTE_MBUF_DYNFIELD(mbuf, hns3_timestamp_dynfield_offset,
                        rte_mbuf_timestamp_t *) = timestamp;
@@ -2469,7 +2460,8 @@ hns3_recv_pkts_simple(void *rx_queue,
                rxe->mbuf = nmb;
 
                if (unlikely(bd_base_info & BIT(HNS3_RXD_TS_VLD_B)))
-                       hns3_rx_ptp_timestamp_handle(rxq, rxm, rxdp);
+                       hns3_rx_ptp_timestamp_handle(rxq, rxm,
+                               rte_le_to_cpu_64(rxdp->timestamp));
 
                dma_addr = rte_mbuf_data_iova_default(nmb);
                rxdp->addr = rte_cpu_to_le_64(dma_addr);
@@ -2540,6 +2532,7 @@ hns3_recv_scattered_pkts(void *rx_queue,
        struct rte_mbuf *rxm;
        struct rte_eth_dev *dev;
        uint32_t bd_base_info;
+       uint64_t timestamp;
        uint32_t l234_info;
        uint32_t gro_size;
        uint32_t ol_info;
@@ -2649,6 +2642,9 @@ hns3_recv_scattered_pkts(void *rx_queue,
                rxm = rxe->mbuf;
                rxe->mbuf = nmb;
 
+               if (unlikely(bd_base_info & BIT(HNS3_RXD_TS_VLD_B)))
+                       timestamp = rte_le_to_cpu_64(rxdp->timestamp);
+
                dma_addr = rte_cpu_to_le_64(rte_mbuf_data_iova_default(nmb));
                rxdp->rx.bd_base_info = 0;
                rxdp->addr = dma_addr;
@@ -2671,7 +2667,7 @@ hns3_recv_scattered_pkts(void *rx_queue,
                }
 
                if (unlikely(bd_base_info & BIT(HNS3_RXD_TS_VLD_B)))
-                       hns3_rx_ptp_timestamp_handle(rxq, first_seg, rxdp);
+                       hns3_rx_ptp_timestamp_handle(rxq, first_seg, timestamp);
 
                /*
                 * The last buffer of the received packet. packet len from
@@ -4044,7 +4040,7 @@ static inline void
 hns3_tx_setup_4bd(struct hns3_desc *txdp, struct rte_mbuf **pkts)
 {
 #define PER_LOOP_NUM   4
-       const uint16_t bd_flag = BIT(HNS3_TXD_VLD_B) | BIT(HNS3_TXD_FE_B);
+       uint16_t bd_flag = BIT(HNS3_TXD_VLD_B) | BIT(HNS3_TXD_FE_B);
        uint64_t dma_addr;
        uint32_t i;
 
@@ -4055,6 +4051,8 @@ hns3_tx_setup_4bd(struct hns3_desc *txdp, struct rte_mbuf **pkts)
                txdp->tx.paylen_fd_dop_ol4cs = 0;
                txdp->tx.type_cs_vlan_tso_len = 0;
                txdp->tx.ol_type_vlan_len_msec = 0;
+               if (unlikely((*pkts)->ol_flags & RTE_MBUF_F_TX_IEEE1588_TMST))
+                       bd_flag |= BIT(HNS3_TXD_TSYN_B);
                txdp->tx.tp_fe_sc_vld_ra_ri = rte_cpu_to_le_16(bd_flag);
        }
 }
@@ -4062,7 +4060,7 @@ hns3_tx_setup_4bd(struct hns3_desc *txdp, struct rte_mbuf **pkts)
 static inline void
 hns3_tx_setup_1bd(struct hns3_desc *txdp, struct rte_mbuf **pkts)
 {
-       const uint16_t bd_flag = BIT(HNS3_TXD_VLD_B) | BIT(HNS3_TXD_FE_B);
+       uint16_t bd_flag = BIT(HNS3_TXD_VLD_B) | BIT(HNS3_TXD_FE_B);
        uint64_t dma_addr;
 
        dma_addr = rte_mbuf_data_iova(*pkts);
@@ -4071,6 +4069,8 @@ hns3_tx_setup_1bd(struct hns3_desc *txdp, struct rte_mbuf **pkts)
        txdp->tx.paylen_fd_dop_ol4cs = 0;
        txdp->tx.type_cs_vlan_tso_len = 0;
        txdp->tx.ol_type_vlan_len_msec = 0;
+       if (unlikely((*pkts)->ol_flags & RTE_MBUF_F_TX_IEEE1588_TMST))
+               bd_flag |= BIT(HNS3_TXD_TSYN_B);
        txdp->tx.tp_fe_sc_vld_ra_ri = rte_cpu_to_le_16(bd_flag);
 }
 
@@ -4312,10 +4312,6 @@ hns3_tx_check_simple_support(struct rte_eth_dev *dev)
 {
        uint64_t offloads = dev->data->dev_conf.txmode.offloads;
 
-       struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-       if (hns3_dev_get_support(hw, PTP))
-               return false;
-
        return (offloads == (offloads & RTE_ETH_TX_OFFLOAD_MBUF_FAST_FREE));
 }
 
@@ -4384,14 +4380,6 @@ hns3_get_tx_function(struct rte_eth_dev *dev, eth_tx_prep_t *prep)
        return hns3_xmit_pkts;
 }
 
-uint16_t
-hns3_dummy_rxtx_burst(void *dpdk_txq __rte_unused,
-                     struct rte_mbuf **pkts __rte_unused,
-                     uint16_t pkts_n __rte_unused)
-{
-       return 0;
-}
-
 static void
 hns3_trace_rxtx_function(struct rte_eth_dev *dev)
 {
@@ -4408,7 +4396,21 @@ hns3_trace_rxtx_function(struct rte_eth_dev *dev)
                 rx_mode.info, tx_mode.info);
 }
 
-void hns3_set_rxtx_function(struct rte_eth_dev *eth_dev)
+static void
+hns3_eth_dev_fp_ops_config(const struct rte_eth_dev *dev)
+{
+       struct rte_eth_fp_ops *fpo = rte_eth_fp_ops;
+       uint16_t port_id = dev->data->port_id;
+
+       fpo[port_id].rx_pkt_burst = dev->rx_pkt_burst;
+       fpo[port_id].tx_pkt_burst = dev->tx_pkt_burst;
+       fpo[port_id].tx_pkt_prepare = dev->tx_pkt_prepare;
+       fpo[port_id].rx_descriptor_status = dev->rx_descriptor_status;
+       fpo[port_id].tx_descriptor_status = dev->tx_descriptor_status;
+}
+
+void
+hns3_set_rxtx_function(struct rte_eth_dev *eth_dev)
 {
        struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(eth_dev->data->dev_private);
        struct hns3_adapter *hns = eth_dev->data->dev_private;
@@ -4419,16 +4421,18 @@ void hns3_set_rxtx_function(struct rte_eth_dev *eth_dev)
                eth_dev->rx_pkt_burst = hns3_get_rx_function(eth_dev);
                eth_dev->rx_descriptor_status = hns3_dev_rx_descriptor_status;
                eth_dev->tx_pkt_burst = hw->set_link_down ?
-                                       hns3_dummy_rxtx_burst :
+                                       rte_eth_pkt_burst_dummy :
                                        hns3_get_tx_function(eth_dev, &prep);
                eth_dev->tx_pkt_prepare = prep;
                eth_dev->tx_descriptor_status = hns3_dev_tx_descriptor_status;
                hns3_trace_rxtx_function(eth_dev);
        } else {
-               eth_dev->rx_pkt_burst = hns3_dummy_rxtx_burst;
-               eth_dev->tx_pkt_burst = hns3_dummy_rxtx_burst;
+               eth_dev->rx_pkt_burst = rte_eth_pkt_burst_dummy;
+               eth_dev->tx_pkt_burst = rte_eth_pkt_burst_dummy;
                eth_dev->tx_pkt_prepare = NULL;
        }
+
+       hns3_eth_dev_fp_ops_config(eth_dev);
 }
 
 void
@@ -4617,7 +4621,7 @@ hns3_tx_done_cleanup(void *txq, uint32_t free_cnt)
 
        if (dev->tx_pkt_burst == hns3_xmit_pkts)
                return hns3_tx_done_cleanup_full(q, free_cnt);
-       else if (dev->tx_pkt_burst == hns3_dummy_rxtx_burst)
+       else if (dev->tx_pkt_burst == rte_eth_pkt_burst_dummy)
                return 0;
        else
                return -ENOTSUP;
@@ -4727,8 +4731,13 @@ hns3_enable_rxd_adv_layout(struct hns3_hw *hw)
 void
 hns3_stop_tx_datapath(struct rte_eth_dev *dev)
 {
-       dev->tx_pkt_burst = hns3_dummy_rxtx_burst;
+       dev->tx_pkt_burst = rte_eth_pkt_burst_dummy;
        dev->tx_pkt_prepare = NULL;
+       hns3_eth_dev_fp_ops_config(dev);
+
+       if (rte_eal_process_type() == RTE_PROC_SECONDARY)
+               return;
+
        rte_wmb();
        /* Disable tx datapath on secondary process. */
        hns3_mp_req_stop_tx(dev);
@@ -4743,5 +4752,10 @@ hns3_start_tx_datapath(struct rte_eth_dev *dev)
 
        dev->tx_pkt_burst = hns3_get_tx_function(dev, &prep);
        dev->tx_pkt_prepare = prep;
+       hns3_eth_dev_fp_ops_config(dev);
+
+       if (rte_eal_process_type() == RTE_PROC_SECONDARY)
+               return;
+
        hns3_mp_req_start_tx(dev);
 }