net/i40e: remove duplicate tunnel type check
[dpdk.git] / drivers / net / dpaa / dpaa_rxtx.c
index 2de1a1a..5303c9b 100644 (file)
@@ -44,7 +44,7 @@
 #include <fsl_usd.h>
 #include <fsl_qman.h>
 #include <fsl_bman.h>
-#include <of.h>
+#include <dpaa_of.h>
 #include <netcfg.h>
 
 #define DPAA_MBUF_TO_CONTIG_FD(_mbuf, _fd, _bpid) \
@@ -305,7 +305,7 @@ dpaa_eth_sg_to_mbuf(const struct qm_fd *fd, uint32_t ifid)
        struct qm_sg_entry *sgt, *sg_temp;
        void *vaddr, *sg_vaddr;
        int i = 0;
-       uint8_t fd_offset = fd->offset;
+       uint16_t fd_offset = fd->offset;
 
        vaddr = DPAA_MEMPOOL_PTOV(bp_info, qm_fd_addr(fd));
        if (!vaddr) {
@@ -398,6 +398,69 @@ dpaa_eth_fd_to_mbuf(const struct qm_fd *fd, uint32_t ifid)
        return mbuf;
 }
 
+uint16_t
+dpaa_free_mbuf(const struct qm_fd *fd)
+{
+       struct rte_mbuf *mbuf;
+       struct dpaa_bp_info *bp_info;
+       uint8_t format;
+       void *ptr;
+
+       bp_info = DPAA_BPID_TO_POOL_INFO(fd->bpid);
+       format = (fd->opaque & DPAA_FD_FORMAT_MASK) >> DPAA_FD_FORMAT_SHIFT;
+       if (unlikely(format == qm_fd_sg)) {
+               struct rte_mbuf *first_seg, *prev_seg, *cur_seg, *temp;
+               struct qm_sg_entry *sgt, *sg_temp;
+               void *vaddr, *sg_vaddr;
+               int i = 0;
+               uint16_t fd_offset = fd->offset;
+
+               vaddr = DPAA_MEMPOOL_PTOV(bp_info, qm_fd_addr(fd));
+               if (!vaddr) {
+                       DPAA_PMD_ERR("unable to convert physical address");
+                       return -1;
+               }
+               sgt = vaddr + fd_offset;
+               sg_temp = &sgt[i++];
+               hw_sg_to_cpu(sg_temp);
+               temp = (struct rte_mbuf *)
+                       ((char *)vaddr - bp_info->meta_data_size);
+               sg_vaddr = DPAA_MEMPOOL_PTOV(bp_info,
+                                               qm_sg_entry_get64(sg_temp));
+
+               first_seg = (struct rte_mbuf *)((char *)sg_vaddr -
+                                               bp_info->meta_data_size);
+               first_seg->nb_segs = 1;
+               prev_seg = first_seg;
+               while (i < DPAA_SGT_MAX_ENTRIES) {
+                       sg_temp = &sgt[i++];
+                       hw_sg_to_cpu(sg_temp);
+                       sg_vaddr = DPAA_MEMPOOL_PTOV(bp_info,
+                                               qm_sg_entry_get64(sg_temp));
+                       cur_seg = (struct rte_mbuf *)((char *)sg_vaddr -
+                                                     bp_info->meta_data_size);
+                       first_seg->nb_segs += 1;
+                       prev_seg->next = cur_seg;
+                       if (sg_temp->final) {
+                               cur_seg->next = NULL;
+                               break;
+                       }
+                       prev_seg = cur_seg;
+               }
+
+               rte_pktmbuf_free_seg(temp);
+               rte_pktmbuf_free_seg(first_seg);
+               return 0;
+       }
+
+       ptr = DPAA_MEMPOOL_PTOV(bp_info, qm_fd_addr(fd));
+       mbuf = (struct rte_mbuf *)((char *)ptr - bp_info->meta_data_size);
+
+       rte_pktmbuf_free(mbuf);
+
+       return 0;
+}
+
 /* Specific for LS1043 */
 void
 dpaa_rx_cb_no_prefetch(struct qman_fq **fq, struct qm_dqrr_entry **dqrr,
@@ -607,7 +670,7 @@ uint16_t dpaa_eth_queue_rx(void *q,
        if (likely(fq->is_static))
                return dpaa_eth_queue_portal_rx(fq, bufs, nb_bufs);
 
-       if (unlikely(!RTE_PER_LCORE(dpaa_io))) {
+       if (unlikely(!DPAA_PER_LCORE_PORTAL)) {
                ret = rte_dpaa_portal_init((void *)0);
                if (ret) {
                        DPAA_PMD_ERR("Failure in affining portal");
@@ -907,7 +970,7 @@ dpaa_eth_queue_tx(void *q, struct rte_mbuf **bufs, uint16_t nb_bufs)
        int ret, realloc_mbuf = 0;
        uint32_t seqn, index, flags[DPAA_TX_BURST_SIZE] = {0};
 
-       if (unlikely(!RTE_PER_LCORE(dpaa_io))) {
+       if (unlikely(!DPAA_PER_LCORE_PORTAL)) {
                ret = rte_dpaa_portal_init((void *)0);
                if (ret) {
                        DPAA_PMD_ERR("Failure in affining portal");
@@ -927,7 +990,7 @@ dpaa_eth_queue_tx(void *q, struct rte_mbuf **bufs, uint16_t nb_bufs)
                         * the buffer in such case.
                         */
                        if (dpaa_svr_family == SVR_LS1043A_FAMILY &&
-                                       (mbuf->data_off & 0xFF) != 0x0)
+                                       (mbuf->data_off & 0x7F) != 0x0)
                                realloc_mbuf = 1;
                        seqn = mbuf->seqn;
                        if (seqn != DPAA_INVALID_MBUF_SEQN) {
@@ -1011,6 +1074,14 @@ send_pkts:
        return sent;
 }
 
+uint16_t
+dpaa_eth_queue_tx_slow(void *q, struct rte_mbuf **bufs, uint16_t nb_bufs)
+{
+       qman_ern_poll_free();
+
+       return dpaa_eth_queue_tx(q, bufs, nb_bufs);
+}
+
 uint16_t dpaa_eth_tx_drop_all(void *q  __rte_unused,
                              struct rte_mbuf **bufs __rte_unused,
                uint16_t nb_bufs __rte_unused)