net/sfc/base: report support for Tx checksum op descriptors
[dpdk.git] / drivers / net / dpaa2 / dpaa2_rxtx.c
index bc8b9ff..2d4b9ef 100644 (file)
@@ -42,6 +42,7 @@ dpaa2_dev_rx_parse_slow(struct rte_mbuf *mbuf,
 static inline void __attribute__((hot))
 dpaa2_dev_rx_parse_new(struct rte_mbuf *m, const struct qbman_fd *fd)
 {
+       struct dpaa2_annot_hdr *annotation;
        uint16_t frc = DPAA2_GET_FD_FRC_PARSE_SUM(fd);
 
        m->packet_type = RTE_PTYPE_UNKNOWN;
@@ -104,6 +105,19 @@ dpaa2_dev_rx_parse_new(struct rte_mbuf *m, const struct qbman_fd *fd)
        }
        m->hash.rss = fd->simple.flc_hi;
        m->ol_flags |= PKT_RX_RSS_HASH;
+
+       if (dpaa2_enable_ts == PMD_DPAA2_ENABLE_TS) {
+               annotation = (struct dpaa2_annot_hdr *)
+                       ((size_t)DPAA2_IOVA_TO_VADDR(
+                       DPAA2_GET_FD_ADDR(fd)) + DPAA2_FD_PTA_SIZE);
+               m->timestamp = annotation->word2;
+               m->ol_flags |= PKT_RX_TIMESTAMP;
+               DPAA2_PMD_DP_DEBUG("pkt timestamp:0x%" PRIx64 "", m->timestamp);
+       }
+
+       DPAA2_PMD_DP_DEBUG("HW frc = 0x%x\t packet type =0x%x "
+               "ol_flags =0x%" PRIx64 "",
+               frc, m->packet_type, m->ol_flags);
 }
 
 static inline uint32_t __attribute__((hot))
@@ -157,6 +171,11 @@ dpaa2_dev_rx_parse_slow(struct rte_mbuf *mbuf,
                goto parse_done;
        }
 
+       if (BIT_ISSET_AT_POS(annotation->word8, DPAA2_ETH_FAS_L3CE))
+               mbuf->ol_flags |= PKT_RX_IP_CKSUM_BAD;
+       else if (BIT_ISSET_AT_POS(annotation->word8, DPAA2_ETH_FAS_L4CE))
+               mbuf->ol_flags |= PKT_RX_L4_CKSUM_BAD;
+
        if (BIT_ISSET_AT_POS(annotation->word4, L3_IP_1_FIRST_FRAGMENT |
            L3_IP_1_MORE_FRAGMENT |
            L3_IP_N_FIRST_FRAGMENT |
@@ -200,6 +219,10 @@ dpaa2_dev_rx_parse(struct rte_mbuf *mbuf, void *hw_annot_addr)
        else if (BIT_ISSET_AT_POS(annotation->word8, DPAA2_ETH_FAS_L4CE))
                mbuf->ol_flags |= PKT_RX_L4_CKSUM_BAD;
 
+       mbuf->ol_flags |= PKT_RX_TIMESTAMP;
+       mbuf->timestamp = annotation->word2;
+       DPAA2_PMD_DP_DEBUG("pkt timestamp: 0x%" PRIx64 "", mbuf->timestamp);
+
        /* Check detailed parsing requirement */
        if (annotation->word3 & 0x7FFFFC3FFFF)
                return dpaa2_dev_rx_parse_slow(mbuf, annotation);
@@ -486,7 +509,7 @@ dpaa2_dev_prefetch_rx(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts)
        const struct qbman_fd *fd, *next_fd;
        struct qbman_pull_desc pulldesc;
        struct queue_storage_info_t *q_storage = dpaa2_q->q_storage;
-       struct rte_eth_dev *dev = dpaa2_q->dev;
+       struct rte_eth_dev_data *eth_data = dpaa2_q->eth_data;
 
        if (unlikely(!DPAA2_PER_LCORE_ETHRX_DPIO)) {
                ret = dpaa2_affine_qbman_ethrx_swp();
@@ -495,6 +518,11 @@ dpaa2_dev_prefetch_rx(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts)
                        return 0;
                }
        }
+
+       if (unlikely(!rte_dpaa2_bpid_info &&
+                    rte_eal_process_type() == RTE_PROC_SECONDARY))
+               rte_dpaa2_bpid_info = dpaa2_q->bp_array;
+
        swp = DPAA2_PER_LCORE_ETHRX_PORTAL;
        pull_size = (nb_pkts > dpaa2_dqrr_size) ? dpaa2_dqrr_size : nb_pkts;
        if (unlikely(!q_storage->active_dqs)) {
@@ -585,9 +613,10 @@ dpaa2_dev_prefetch_rx(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts)
                        bufs[num_rx] = eth_sg_fd_to_mbuf(fd);
                else
                        bufs[num_rx] = eth_fd_to_mbuf(fd);
-               bufs[num_rx]->port = dev->data->port_id;
+               bufs[num_rx]->port = eth_data->port_id;
 
-               if (dev->data->dev_conf.rxmode.offloads & DEV_RX_OFFLOAD_VLAN_STRIP)
+               if (eth_data->dev_conf.rxmode.offloads &
+                               DEV_RX_OFFLOAD_VLAN_STRIP)
                        rte_vlan_strip(bufs[num_rx]);
 
                dq_storage++;
@@ -688,8 +717,8 @@ dpaa2_dev_tx(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts)
        struct qbman_swp *swp;
        uint16_t num_tx = 0;
        uint16_t bpid;
-       struct rte_eth_dev *dev = dpaa2_q->dev;
-       struct dpaa2_dev_priv *priv = dev->data->dev_private;
+       struct rte_eth_dev_data *eth_data = dpaa2_q->eth_data;
+       struct dpaa2_dev_priv *priv = eth_data->dev_private;
        uint32_t flags[MAX_TX_RING_SLOTS] = {0};
 
        if (unlikely(!DPAA2_PER_LCORE_DPIO)) {
@@ -701,7 +730,8 @@ dpaa2_dev_tx(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts)
        }
        swp = DPAA2_PER_LCORE_PORTAL;
 
-       DPAA2_PMD_DP_DEBUG("===> dev =%p, fqid =%d\n", dev, dpaa2_q->fqid);
+       DPAA2_PMD_DP_DEBUG("===> eth_data =%p, fqid =%d\n",
+                       eth_data, dpaa2_q->fqid);
 
        /*Prepare enqueue descriptor*/
        qbman_eq_desc_clear(&eqdesc);
@@ -744,7 +774,7 @@ dpaa2_dev_tx(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts)
                                    rte_mbuf_refcnt_read((*bufs)) == 1)) {
                                        if (unlikely(((*bufs)->ol_flags
                                                & PKT_TX_VLAN_PKT) ||
-                                               (dev->data->dev_conf.txmode.offloads
+                                               (eth_data->dev_conf.txmode.offloads
                                                & DEV_TX_OFFLOAD_VLAN_INSERT))) {
                                                ret = rte_vlan_insert(bufs);
                                                if (ret)
@@ -766,7 +796,7 @@ dpaa2_dev_tx(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts)
                        }
 
                        if (unlikely(((*bufs)->ol_flags & PKT_TX_VLAN_PKT) ||
-                               (dev->data->dev_conf.txmode.offloads
+                               (eth_data->dev_conf.txmode.offloads
                                & DEV_TX_OFFLOAD_VLAN_INSERT))) {
                                int ret = rte_vlan_insert(bufs);
                                if (ret)