LCOV - code coverage report
Current view: top level - drivers/net/dpaa - dpaa_rxtx.c (source / functions) Hit Total Coverage
Test: Code coverage Lines: 0 568 0.0 %
Date: 2025-12-01 19:08:10 Functions: 0 23 0.0 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 0 263 0.0 %

           Branch data     Line data    Source code
       1                 :            : /* SPDX-License-Identifier: BSD-3-Clause
       2                 :            :  *
       3                 :            :  *   Copyright 2016 Freescale Semiconductor, Inc. All rights reserved.
       4                 :            :  *   Copyright 2017,2019-2025 NXP
       5                 :            :  *
       6                 :            :  */
       7                 :            : 
       8                 :            : /* System headers */
       9                 :            : #include <inttypes.h>
      10                 :            : #include <unistd.h>
      11                 :            : #include <stdio.h>
      12                 :            : #include <limits.h>
      13                 :            : #include <sched.h>
      14                 :            : #include <pthread.h>
      15                 :            : 
      16                 :            : #include <rte_byteorder.h>
      17                 :            : #include <rte_common.h>
      18                 :            : #include <rte_interrupts.h>
      19                 :            : #include <rte_log.h>
      20                 :            : #include <rte_debug.h>
      21                 :            : #include <rte_pci.h>
      22                 :            : #include <rte_atomic.h>
      23                 :            : #include <rte_branch_prediction.h>
      24                 :            : #include <rte_memory.h>
      25                 :            : #include <rte_tailq.h>
      26                 :            : #include <rte_eal.h>
      27                 :            : #include <rte_alarm.h>
      28                 :            : #include <rte_ether.h>
      29                 :            : #include <ethdev_driver.h>
      30                 :            : #include <rte_malloc.h>
      31                 :            : #include <rte_ring.h>
      32                 :            : #include <rte_ip.h>
      33                 :            : #include <rte_tcp.h>
      34                 :            : #include <rte_udp.h>
      35                 :            : #include <rte_net.h>
      36                 :            : #include <rte_eventdev.h>
      37                 :            : 
      38                 :            : #include "dpaa_ethdev.h"
      39                 :            : #include "dpaa_rxtx.h"
      40                 :            : #include <bus_dpaa_driver.h>
      41                 :            : #include <dpaa_mempool.h>
      42                 :            : 
      43                 :            : #include <qman.h>
      44                 :            : #include <fsl_usd.h>
      45                 :            : #include <fsl_qman.h>
      46                 :            : #include <fsl_bman.h>
      47                 :            : #include <dpaa_of.h>
      48                 :            : #include <dpaax_ptp.h>
      49                 :            : #include <netcfg.h>
      50                 :            : 
      51                 :            : #ifdef RTE_LIBRTE_DPAA_DEBUG_DRIVER
      52                 :            : static int s_force_display_frm;
      53                 :            : #endif
      54                 :            : 
      55                 :            : #define DPAA_MBUF_TO_CONTIG_FD(_mbuf, _fd, _bpid) \
      56                 :            :         do { \
      57                 :            :                 (_fd)->opaque_addr = 0; \
      58                 :            :                 (_fd)->opaque = QM_FD_CONTIG << DPAA_FD_FORMAT_SHIFT; \
      59                 :            :                 (_fd)->opaque |= ((_mbuf)->data_off) << DPAA_FD_OFFSET_SHIFT; \
      60                 :            :                 (_fd)->opaque |= (_mbuf)->pkt_len; \
      61                 :            :                 (_fd)->addr = (_mbuf)->buf_iova; \
      62                 :            :                 (_fd)->bpid = _bpid; \
      63                 :            :         } while (0)
      64                 :            : 
      65                 :            : #ifdef RTE_LIBRTE_DPAA_DEBUG_DRIVER
      66                 :            : void
      67                 :            : dpaa_force_display_frame_set(int set)
      68                 :            : {
      69                 :            :         s_force_display_frm = set;
      70                 :            : }
      71                 :            : 
      72                 :            : #define DISPLAY_PRINT printf
      73                 :            : static void
      74                 :            : dpaa_display_frame_info(const struct qm_fd *fd,
      75                 :            :         uint32_t fqid, bool rx)
      76                 :            : {
      77                 :            :         int pos, offset = 0;
      78                 :            :         char *ptr, info[1024];
      79                 :            :         struct annotations_t *annot = rte_dpaa_mem_ptov(fd->addr);
      80                 :            :         uint8_t format;
      81                 :            :         const struct dpaa_eth_parse_results_t *psr;
      82                 :            : 
      83                 :            :         if (!fd->status && !s_force_display_frm) {
      84                 :            :                 /* Do not display correct packets unless force display.*/
      85                 :            :                 return;
      86                 :            :         }
      87                 :            :         psr = &annot->parse;
      88                 :            : 
      89                 :            :         format = (fd->opaque & DPAA_FD_FORMAT_MASK) >> DPAA_FD_FORMAT_SHIFT;
      90                 :            :         if (format == qm_fd_contig)
      91                 :            :                 sprintf(info, "simple");
      92                 :            :         else if (format == qm_fd_sg)
      93                 :            :                 sprintf(info, "sg");
      94                 :            :         else
      95                 :            :                 sprintf(info, "unknown format(%d)", format);
      96                 :            : 
      97                 :            :         DISPLAY_PRINT("%s: fqid=%08x, bpid=%d, phy addr=0x%lx ",
      98                 :            :                 rx ? "RX" : "TX", fqid, fd->bpid, (unsigned long)fd->addr);
      99                 :            :         DISPLAY_PRINT("format=%s offset=%d, len=%d, stat=0x%x\r\n",
     100                 :            :                 info, fd->offset, fd->length20, fd->status);
     101                 :            :         if (rx) {
     102                 :            :                 DISPLAY_PRINT("Display usual RX parser result:\r\n");
     103                 :            :                 if (psr->eth_frame_type == 0)
     104                 :            :                         offset += sprintf(&info[offset], "unicast");
     105                 :            :                 else if (psr->eth_frame_type == 1)
     106                 :            :                         offset += sprintf(&info[offset], "multicast");
     107                 :            :                 else if (psr->eth_frame_type == 3)
     108                 :            :                         offset += sprintf(&info[offset], "broadcast");
     109                 :            :                 else
     110                 :            :                         offset += sprintf(&info[offset], "unknown eth type(%d)",
     111                 :            :                                 psr->eth_frame_type);
     112                 :            :                 if (psr->l2r_err) {
     113                 :            :                         offset += sprintf(&info[offset], " L2 error(%d)",
     114                 :            :                                 psr->l2r_err);
     115                 :            :                 } else {
     116                 :            :                         offset += sprintf(&info[offset], " L2 non error");
     117                 :            :                 }
     118                 :            :                 DISPLAY_PRINT("L2: %s, %s, ethernet type:%s\r\n",
     119                 :            :                         psr->ethernet ? "is ethernet" : "non ethernet",
     120                 :            :                         psr->vlan ? "is vlan" : "non vlan", info);
     121                 :            : 
     122                 :            :                 offset = 0;
     123                 :            :                 DISPLAY_PRINT("L3: %s/%s, %s/%s, %s, %s\r\n",
     124                 :            :                         psr->first_ipv4 ? "first IPv4" : "non first IPv4",
     125                 :            :                         psr->last_ipv4 ? "last IPv4" : "non last IPv4",
     126                 :            :                         psr->first_ipv6 ? "first IPv6" : "non first IPv6",
     127                 :            :                         psr->last_ipv6 ? "last IPv6" : "non last IPv6",
     128                 :            :                         psr->gre ? "GRE" : "non GRE",
     129                 :            :                         psr->l3_err ? "L3 has error" : "L3 non error");
     130                 :            : 
     131                 :            :                 if (psr->l4_type == DPAA_PR_L4_TCP_TYPE) {
     132                 :            :                         offset += sprintf(&info[offset], "tcp");
     133                 :            :                 } else if (psr->l4_type == DPAA_PR_L4_UDP_TYPE) {
     134                 :            :                         offset += sprintf(&info[offset], "udp");
     135                 :            :                 } else if (psr->l4_type == DPAA_PR_L4_IPSEC_TYPE) {
     136                 :            :                         offset += sprintf(&info[offset], "IPSec ");
     137                 :            :                         if (psr->esp_sum)
     138                 :            :                                 offset += sprintf(&info[offset], "ESP");
     139                 :            :                         if (psr->ah)
     140                 :            :                                 offset += sprintf(&info[offset], "AH");
     141                 :            :                 } else if (psr->l4_type == DPAA_PR_L4_SCTP_TYPE) {
     142                 :            :                         offset += sprintf(&info[offset], "sctp");
     143                 :            :                 } else if (psr->l4_type == DPAA_PR_L4_DCCP_TYPE) {
     144                 :            :                         offset += sprintf(&info[offset], "dccp");
     145                 :            :                 } else {
     146                 :            :                         offset += sprintf(&info[offset], "unknown l4 type(%d)",
     147                 :            :                                 psr->l4_type);
     148                 :            :                 }
     149                 :            :                 DISPLAY_PRINT("L4: type:%s, L4 validation %s\r\n",
     150                 :            :                         info, psr->l4cv ? "Performed" : "NOT performed");
     151                 :            : 
     152                 :            :                 offset = 0;
     153                 :            :                 if (psr->ethernet) {
     154                 :            :                         offset += sprintf(&info[offset],
     155                 :            :                                 "Eth offset=%d, ethtype offset=%d, ",
     156                 :            :                                 psr->eth_off, psr->etype_off);
     157                 :            :                 }
     158                 :            :                 if (psr->vlan) {
     159                 :            :                         offset += sprintf(&info[offset], "vLAN offset=%d, ",
     160                 :            :                                 psr->vlan_off[0]);
     161                 :            :                 }
     162                 :            :                 if (psr->first_ipv4 || psr->first_ipv6) {
     163                 :            :                         offset += sprintf(&info[offset], "first IP offset=%d, ",
     164                 :            :                                 psr->ip_off[0]);
     165                 :            :                 }
     166                 :            :                 if (psr->last_ipv4 || psr->last_ipv6) {
     167                 :            :                         offset += sprintf(&info[offset], "last IP offset=%d, ",
     168                 :            :                                 psr->ip_off[1]);
     169                 :            :                 }
     170                 :            :                 if (psr->gre) {
     171                 :            :                         offset += sprintf(&info[offset], "GRE offset=%d, ",
     172                 :            :                                 psr->gre_off);
     173                 :            :                 }
     174                 :            :                 if (psr->l4_type >= DPAA_PR_L4_TCP_TYPE) {
     175                 :            :                         offset += sprintf(&info[offset], "L4 offset=%d, ",
     176                 :            :                                 psr->l4_off);
     177                 :            :                 }
     178                 :            :                 offset += sprintf(&info[offset], "Next HDR(0x%04x) offset=%d.",
     179                 :            :                         rte_be_to_cpu_16(psr->nxthdr), psr->nxthdr_off);
     180                 :            : 
     181                 :            :                 DISPLAY_PRINT("%s\r\n", info);
     182                 :            :         }
     183                 :            : 
     184                 :            :         if (unlikely(format == qm_fd_sg)) {
     185                 :            :                 /*TBD:S/G display: to be implemented*/
     186                 :            :                 return;
     187                 :            :         }
     188                 :            : 
     189                 :            :         DISPLAY_PRINT("Frame payload:\r\n");
     190                 :            :         ptr = (char *)annot;
     191                 :            :         ptr += fd->offset;
     192                 :            :         for (pos = 0; pos < fd->length20; pos++) {
     193                 :            :                 DISPLAY_PRINT("%02x ", ptr[pos]);
     194                 :            :                 if (((pos + 1) % 16) == 0)
     195                 :            :                         DISPLAY_PRINT("\n");
     196                 :            :         }
     197                 :            :         DISPLAY_PRINT("\n");
     198                 :            : }
     199                 :            : 
     200                 :            : #else
     201                 :            : #define dpaa_display_frame_info(a, b, c)
     202                 :            : #endif
     203                 :            : 
     204                 :            : static inline void
     205                 :          0 : dpaa_slow_parsing(struct rte_mbuf *m,
     206                 :            :         const struct annotations_t *annot)
     207                 :            : {
     208                 :            :         const struct dpaa_eth_parse_results_t *parse;
     209                 :            : 
     210                 :            :         DPAA_DP_LOG(DEBUG, "Slow parsing");
     211                 :            :         parse = &annot->parse;
     212                 :            : 
     213         [ #  # ]:          0 :         if (parse->ethernet)
     214                 :          0 :                 m->packet_type |= RTE_PTYPE_L2_ETHER;
     215         [ #  # ]:          0 :         if (parse->vlan)
     216                 :          0 :                 m->packet_type |= RTE_PTYPE_L2_ETHER_VLAN;
     217         [ #  # ]:          0 :         if (parse->first_ipv4)
     218                 :          0 :                 m->packet_type |= RTE_PTYPE_L3_IPV4;
     219         [ #  # ]:          0 :         if (parse->first_ipv6)
     220                 :          0 :                 m->packet_type |= RTE_PTYPE_L3_IPV6;
     221         [ #  # ]:          0 :         if (parse->gre)
     222                 :          0 :                 m->packet_type |= RTE_PTYPE_TUNNEL_GRE;
     223         [ #  # ]:          0 :         if (parse->last_ipv4)
     224                 :          0 :                 m->packet_type |= RTE_PTYPE_L3_IPV4_EXT;
     225         [ #  # ]:          0 :         if (parse->last_ipv6)
     226                 :          0 :                 m->packet_type |= RTE_PTYPE_L3_IPV6_EXT;
     227         [ #  # ]:          0 :         if (parse->l4_type == DPAA_PR_L4_TCP_TYPE)
     228                 :          0 :                 m->packet_type |= RTE_PTYPE_L4_TCP;
     229         [ #  # ]:          0 :         else if (parse->l4_type == DPAA_PR_L4_UDP_TYPE)
     230                 :          0 :                 m->packet_type |= RTE_PTYPE_L4_UDP;
     231                 :          0 :         else if (parse->l4_type == DPAA_PR_L4_IPSEC_TYPE &&
     232         [ #  # ]:          0 :                 !parse->l4_info_err && parse->esp_sum)
     233                 :          0 :                 m->packet_type |= RTE_PTYPE_TUNNEL_ESP;
     234         [ #  # ]:          0 :         else if (parse->l4_type == DPAA_PR_L4_SCTP_TYPE)
     235                 :          0 :                 m->packet_type |= RTE_PTYPE_L4_SCTP;
     236                 :          0 : }
     237                 :            : 
     238                 :            : static inline void
     239                 :          0 : dpaa_eth_packet_info(struct dpaa_if *dpaa_intf, struct rte_mbuf *m,
     240                 :            :         struct annotations_t *annot)
     241                 :            : {
     242                 :          0 :         uint64_t prs = *((uintptr_t *)(&annot->parse)) & DPAA_PARSE_MASK;
     243                 :            : 
     244                 :            :         DPAA_DP_LOG(DEBUG, " Parsing mbuf: %p with annotations: %p", m, annot);
     245                 :            : 
     246                 :          0 :         m->ol_flags = RTE_MBUF_F_RX_RSS_HASH | RTE_MBUF_F_RX_IP_CKSUM_GOOD |
     247                 :            :                 RTE_MBUF_F_RX_L4_CKSUM_GOOD;
     248                 :            : 
     249   [ #  #  #  #  :          0 :         switch (prs) {
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
             #  #  #  # ]
     250                 :          0 :         case DPAA_PKT_TYPE_IPV4:
     251                 :          0 :                 m->packet_type = RTE_PTYPE_L2_ETHER |
     252                 :            :                         RTE_PTYPE_L3_IPV4;
     253                 :          0 :                 break;
     254                 :          0 :         case DPAA_PKT_TYPE_IPV6:
     255                 :          0 :                 m->packet_type = RTE_PTYPE_L2_ETHER |
     256                 :            :                         RTE_PTYPE_L3_IPV6;
     257                 :          0 :                 break;
     258                 :          0 :         case DPAA_PKT_TYPE_ETHER:
     259                 :          0 :                 m->packet_type = RTE_PTYPE_L2_ETHER;
     260                 :          0 :                 break;
     261                 :          0 :         case DPAA_PKT_TYPE_IPV4_FRAG:
     262                 :            :         case DPAA_PKT_TYPE_IPV4_FRAG_UDP:
     263                 :            :         case DPAA_PKT_TYPE_IPV4_FRAG_TCP:
     264                 :            :         case DPAA_PKT_TYPE_IPV4_FRAG_SCTP:
     265                 :          0 :                 m->packet_type = RTE_PTYPE_L2_ETHER |
     266                 :            :                         RTE_PTYPE_L3_IPV4 | RTE_PTYPE_L4_FRAG;
     267                 :          0 :                 break;
     268                 :          0 :         case DPAA_PKT_TYPE_IPV6_FRAG:
     269                 :            :         case DPAA_PKT_TYPE_IPV6_FRAG_UDP:
     270                 :            :         case DPAA_PKT_TYPE_IPV6_FRAG_TCP:
     271                 :            :         case DPAA_PKT_TYPE_IPV6_FRAG_SCTP:
     272                 :          0 :                 m->packet_type = RTE_PTYPE_L2_ETHER |
     273                 :            :                         RTE_PTYPE_L3_IPV6 | RTE_PTYPE_L4_FRAG;
     274                 :          0 :                 break;
     275                 :          0 :         case DPAA_PKT_TYPE_IPV4_EXT:
     276                 :          0 :                 m->packet_type = RTE_PTYPE_L2_ETHER |
     277                 :            :                         RTE_PTYPE_L3_IPV4_EXT;
     278                 :          0 :                 break;
     279                 :          0 :         case DPAA_PKT_TYPE_IPV6_EXT:
     280                 :          0 :                 m->packet_type = RTE_PTYPE_L2_ETHER |
     281                 :            :                         RTE_PTYPE_L3_IPV6_EXT;
     282                 :          0 :                 break;
     283                 :          0 :         case DPAA_PKT_TYPE_IPV4_TCP:
     284                 :          0 :                 m->packet_type = RTE_PTYPE_L2_ETHER |
     285                 :            :                         RTE_PTYPE_L3_IPV4 | RTE_PTYPE_L4_TCP;
     286                 :          0 :                 break;
     287                 :          0 :         case DPAA_PKT_TYPE_IPV6_TCP:
     288                 :          0 :                 m->packet_type = RTE_PTYPE_L2_ETHER |
     289                 :            :                         RTE_PTYPE_L3_IPV6 | RTE_PTYPE_L4_TCP;
     290                 :          0 :                 break;
     291                 :          0 :         case DPAA_PKT_TYPE_IPV4_UDP:
     292                 :          0 :                 m->packet_type = RTE_PTYPE_L2_ETHER |
     293                 :            :                         RTE_PTYPE_L3_IPV4 | RTE_PTYPE_L4_UDP;
     294                 :          0 :                 break;
     295                 :          0 :         case DPAA_PKT_TYPE_IPV6_UDP:
     296                 :          0 :                 m->packet_type = RTE_PTYPE_L2_ETHER |
     297                 :            :                         RTE_PTYPE_L3_IPV6 | RTE_PTYPE_L4_UDP;
     298                 :          0 :                 break;
     299                 :          0 :         case DPAA_PKT_TYPE_IPSEC_IPV4:
     300         [ #  # ]:          0 :                 if (*((uintptr_t *)&annot->parse) & DPAA_PARSE_ESP_MASK)
     301                 :          0 :                         m->packet_type = RTE_PTYPE_L2_ETHER |
     302                 :            :                                 RTE_PTYPE_L3_IPV4 | RTE_PTYPE_TUNNEL_ESP;
     303                 :            :                 break;
     304                 :          0 :         case DPAA_PKT_TYPE_IPSEC_IPV6:
     305         [ #  # ]:          0 :                 if (*((uintptr_t *)&annot->parse) & DPAA_PARSE_ESP_MASK)
     306                 :          0 :                         m->packet_type = RTE_PTYPE_L2_ETHER |
     307                 :            :                                 RTE_PTYPE_L3_IPV6 | RTE_PTYPE_TUNNEL_ESP;
     308                 :            :                 break;
     309                 :          0 :         case DPAA_PKT_TYPE_IPV4_EXT_UDP:
     310                 :          0 :                 m->packet_type = RTE_PTYPE_L2_ETHER |
     311                 :            :                         RTE_PTYPE_L3_IPV4_EXT | RTE_PTYPE_L4_UDP;
     312                 :          0 :                 break;
     313                 :          0 :         case DPAA_PKT_TYPE_IPV6_EXT_UDP:
     314                 :          0 :                 m->packet_type = RTE_PTYPE_L2_ETHER |
     315                 :            :                         RTE_PTYPE_L3_IPV6_EXT | RTE_PTYPE_L4_UDP;
     316                 :          0 :                 break;
     317                 :          0 :         case DPAA_PKT_TYPE_IPV4_EXT_TCP:
     318                 :          0 :                 m->packet_type = RTE_PTYPE_L2_ETHER |
     319                 :            :                         RTE_PTYPE_L3_IPV4_EXT | RTE_PTYPE_L4_TCP;
     320                 :          0 :                 break;
     321                 :          0 :         case DPAA_PKT_TYPE_IPV6_EXT_TCP:
     322                 :          0 :                 m->packet_type = RTE_PTYPE_L2_ETHER |
     323                 :            :                         RTE_PTYPE_L3_IPV6_EXT | RTE_PTYPE_L4_TCP;
     324                 :          0 :                 break;
     325                 :          0 :         case DPAA_PKT_TYPE_IPV4_SCTP:
     326                 :          0 :                 m->packet_type = RTE_PTYPE_L2_ETHER |
     327                 :            :                         RTE_PTYPE_L3_IPV4 | RTE_PTYPE_L4_SCTP;
     328                 :          0 :                 break;
     329                 :          0 :         case DPAA_PKT_TYPE_IPV6_SCTP:
     330                 :          0 :                 m->packet_type = RTE_PTYPE_L2_ETHER |
     331                 :            :                         RTE_PTYPE_L3_IPV6 | RTE_PTYPE_L4_SCTP;
     332                 :          0 :                 break;
     333                 :          0 :         case DPAA_PKT_TYPE_IPV4_CSUM_ERR:
     334                 :            :         case DPAA_PKT_TYPE_IPV6_CSUM_ERR:
     335                 :          0 :                 m->ol_flags = RTE_MBUF_F_RX_RSS_HASH | RTE_MBUF_F_RX_IP_CKSUM_BAD;
     336                 :          0 :                 break;
     337                 :          0 :         case DPAA_PKT_TYPE_IPV4_TCP_CSUM_ERR:
     338                 :            :         case DPAA_PKT_TYPE_IPV6_TCP_CSUM_ERR:
     339                 :            :         case DPAA_PKT_TYPE_IPV4_UDP_CSUM_ERR:
     340                 :            :         case DPAA_PKT_TYPE_IPV6_UDP_CSUM_ERR:
     341                 :          0 :                 m->ol_flags = RTE_MBUF_F_RX_RSS_HASH | RTE_MBUF_F_RX_L4_CKSUM_BAD;
     342                 :          0 :                 break;
     343                 :          0 :         case DPAA_PKT_TYPE_NONE:
     344                 :          0 :                 m->packet_type = 0;
     345                 :          0 :                 break;
     346                 :            :         /* More switch cases can be added */
     347                 :          0 :         default:
     348                 :          0 :                 dpaa_slow_parsing(m, annot);
     349                 :            :         }
     350                 :            : 
     351                 :          0 :         m->tx_offload = annot->parse.ip_off[0];
     352                 :          0 :         m->tx_offload |= (annot->parse.l4_off - annot->parse.ip_off[0])
     353                 :          0 :                                         << DPAA_PKT_L3_LEN_SHIFT;
     354                 :            : 
     355                 :            :         /* Set the hash values */
     356                 :          0 :         m->hash.rss = (uint32_t)(annot->hash);
     357                 :            : 
     358                 :            :         /* Check if Vlan is present */
     359                 :            :         if (prs & DPAA_PARSE_VLAN_MASK)
     360                 :            :                 m->ol_flags |= RTE_MBUF_F_RX_VLAN;
     361                 :            :         /* Packet received without stripping the vlan */
     362                 :            : 
     363         [ #  # ]:          0 :         if (unlikely(dpaa_intf->ts_enable)) {
     364         [ #  # ]:          0 :                 if (dpaax_timesync_ptp_parse_header(m, NULL, NULL)) {
     365                 :          0 :                         m->ol_flags |= RTE_MBUF_F_RX_IEEE1588_PTP;
     366                 :          0 :                         m->ol_flags |= RTE_MBUF_F_RX_IEEE1588_TMST;
     367                 :            :                 }
     368                 :            :         }
     369                 :          0 : }
     370                 :            : 
     371                 :          0 : static inline void dpaa_checksum(struct rte_mbuf *mbuf)
     372                 :            : {
     373                 :          0 :         struct rte_ether_hdr *eth_hdr =
     374                 :          0 :                 rte_pktmbuf_mtod(mbuf, struct rte_ether_hdr *);
     375                 :          0 :         char *l3_hdr = (char *)eth_hdr + mbuf->l2_len;
     376                 :            :         struct rte_ipv4_hdr *ipv4_hdr = (struct rte_ipv4_hdr *)l3_hdr;
     377                 :            :         struct rte_ipv6_hdr *ipv6_hdr = (struct rte_ipv6_hdr *)l3_hdr;
     378                 :            : 
     379                 :            :         DPAA_DP_LOG(DEBUG, "Calculating checksum for mbuf: %p", mbuf);
     380                 :            : 
     381         [ #  # ]:          0 :         if (((mbuf->packet_type & RTE_PTYPE_L3_MASK) == RTE_PTYPE_L3_IPV4) ||
     382                 :            :             ((mbuf->packet_type & RTE_PTYPE_L3_MASK) ==
     383                 :            :             RTE_PTYPE_L3_IPV4_EXT)) {
     384                 :            :                 ipv4_hdr = (struct rte_ipv4_hdr *)l3_hdr;
     385                 :          0 :                 ipv4_hdr->hdr_checksum = 0;
     386                 :          0 :                 ipv4_hdr->hdr_checksum = rte_ipv4_cksum(ipv4_hdr);
     387                 :            :         } else if (((mbuf->packet_type & RTE_PTYPE_L3_MASK) ==
     388                 :            :                    RTE_PTYPE_L3_IPV6) ||
     389                 :            :                    ((mbuf->packet_type & RTE_PTYPE_L3_MASK) ==
     390                 :            :                    RTE_PTYPE_L3_IPV6_EXT))
     391                 :            :                 ipv6_hdr = (struct rte_ipv6_hdr *)l3_hdr;
     392                 :            : 
     393         [ #  # ]:          0 :         if ((mbuf->packet_type & RTE_PTYPE_L4_MASK) == RTE_PTYPE_L4_TCP) {
     394                 :          0 :                 struct rte_tcp_hdr *tcp_hdr = (struct rte_tcp_hdr *)(l3_hdr +
     395                 :          0 :                                           mbuf->l3_len);
     396                 :          0 :                 tcp_hdr->cksum = 0;
     397         [ #  # ]:          0 :                 if (eth_hdr->ether_type == htons(RTE_ETHER_TYPE_IPV4))
     398                 :          0 :                         tcp_hdr->cksum = rte_ipv4_udptcp_cksum(ipv4_hdr,
     399                 :            :                                                                tcp_hdr);
     400                 :            :                 else /* assume ethertype == RTE_ETHER_TYPE_IPV6 */
     401                 :          0 :                         tcp_hdr->cksum = rte_ipv6_udptcp_cksum(ipv6_hdr,
     402                 :            :                                                                tcp_hdr);
     403         [ #  # ]:          0 :         } else if ((mbuf->packet_type & RTE_PTYPE_L4_MASK) ==
     404                 :            :                    RTE_PTYPE_L4_UDP) {
     405                 :          0 :                 struct rte_udp_hdr *udp_hdr = (struct rte_udp_hdr *)(l3_hdr +
     406                 :          0 :                                                              mbuf->l3_len);
     407                 :          0 :                 udp_hdr->dgram_cksum = 0;
     408         [ #  # ]:          0 :                 if (eth_hdr->ether_type == htons(RTE_ETHER_TYPE_IPV4))
     409                 :          0 :                         udp_hdr->dgram_cksum = rte_ipv4_udptcp_cksum(ipv4_hdr,
     410                 :            :                                                                      udp_hdr);
     411                 :            :                 else /* assume ethertype == RTE_ETHER_TYPE_IPV6 */
     412                 :          0 :                         udp_hdr->dgram_cksum = rte_ipv6_udptcp_cksum(ipv6_hdr,
     413                 :            :                                                                      udp_hdr);
     414                 :            :         }
     415                 :          0 : }
     416                 :            : 
     417                 :          0 : static inline void dpaa_checksum_offload(struct rte_mbuf *mbuf,
     418                 :            :                                          struct qm_fd *fd, char *prs_buf)
     419                 :            : {
     420                 :            :         struct dpaa_eth_parse_results_t *prs;
     421                 :            : 
     422                 :            :         DPAA_DP_LOG(DEBUG, " Offloading checksum for mbuf: %p", mbuf);
     423                 :            : 
     424                 :            :         prs = GET_TX_PRS(prs_buf);
     425                 :          0 :         prs->l3r = 0;
     426                 :          0 :         prs->l4r = 0;
     427         [ #  # ]:          0 :         if (((mbuf->packet_type & RTE_PTYPE_L3_MASK) == RTE_PTYPE_L3_IPV4) ||
     428                 :            :            ((mbuf->packet_type & RTE_PTYPE_L3_MASK) ==
     429                 :            :            RTE_PTYPE_L3_IPV4_EXT))
     430                 :          0 :                 prs->l3r = DPAA_L3_PARSE_RESULT_IPV4;
     431                 :          0 :         else if (((mbuf->packet_type & RTE_PTYPE_L3_MASK) ==
     432         [ #  # ]:          0 :                    RTE_PTYPE_L3_IPV6) ||
     433                 :            :                  ((mbuf->packet_type & RTE_PTYPE_L3_MASK) ==
     434                 :            :                 RTE_PTYPE_L3_IPV6_EXT))
     435                 :          0 :                 prs->l3r = DPAA_L3_PARSE_RESULT_IPV6;
     436                 :            : 
     437         [ #  # ]:          0 :         if ((mbuf->packet_type & RTE_PTYPE_L4_MASK) == RTE_PTYPE_L4_TCP)
     438                 :          0 :                 prs->l4r = DPAA_L4_PARSE_RESULT_TCP;
     439         [ #  # ]:          0 :         else if ((mbuf->packet_type & RTE_PTYPE_L4_MASK) == RTE_PTYPE_L4_UDP)
     440                 :          0 :                 prs->l4r = DPAA_L4_PARSE_RESULT_UDP;
     441                 :            : 
     442                 :          0 :         prs->ip_off[0] = mbuf->l2_len;
     443                 :          0 :         prs->l4_off = mbuf->l3_len + mbuf->l2_len;
     444                 :            :         /* Enable L3 (and L4, if TCP or UDP) HW checksum*/
     445                 :          0 :         fd->cmd |= DPAA_FD_CMD_RPD | DPAA_FD_CMD_DTC;
     446                 :          0 : }
     447                 :            : 
     448                 :            : static inline void
     449                 :          0 : dpaa_unsegmented_checksum(struct rte_mbuf *mbuf, struct qm_fd *fd_arr)
     450                 :            : {
     451         [ #  # ]:          0 :         if (!mbuf->packet_type) {
     452                 :            :                 struct rte_net_hdr_lens hdr_lens;
     453                 :            : 
     454                 :          0 :                 mbuf->packet_type = rte_net_get_ptype(mbuf, &hdr_lens,
     455                 :            :                                 RTE_PTYPE_L2_MASK | RTE_PTYPE_L3_MASK
     456                 :            :                                 | RTE_PTYPE_L4_MASK);
     457                 :          0 :                 mbuf->l2_len = hdr_lens.l2_len;
     458                 :          0 :                 mbuf->l3_len = hdr_lens.l3_len;
     459                 :            :         }
     460         [ #  # ]:          0 :         if (mbuf->data_off < (DEFAULT_TX_ICEOF +
     461                 :            :             sizeof(struct dpaa_eth_parse_results_t))) {
     462                 :            :                 DPAA_DP_LOG(DEBUG, "Checksum offload Err: "
     463                 :            :                         "Not enough Headroom "
     464                 :            :                         "space for correct Checksum offload."
     465                 :            :                         "So Calculating checksum in Software.");
     466                 :          0 :                 dpaa_checksum(mbuf);
     467                 :            :         } else {
     468                 :          0 :                 dpaa_checksum_offload(mbuf, fd_arr, mbuf->buf_addr);
     469                 :            :         }
     470                 :          0 : }
     471                 :            : 
     472                 :            : static struct rte_mbuf *
     473                 :          0 : dpaa_eth_sg_to_mbuf(struct dpaa_if *dpaa_intf, const struct qm_fd *fd)
     474                 :            : {
     475                 :          0 :         struct dpaa_bp_info *bp_info = DPAA_BPID_TO_POOL_INFO(fd->bpid);
     476                 :            :         struct rte_mbuf *first_seg, *prev_seg, *cur_seg, *temp;
     477                 :            :         struct qm_sg_entry *sgt, *sg_temp;
     478                 :            :         void *vaddr, *sg_vaddr;
     479                 :            :         int i = 0;
     480                 :          0 :         uint16_t fd_offset = fd->offset;
     481                 :            : 
     482                 :            :         vaddr = DPAA_MEMPOOL_PTOV(bp_info, qm_fd_addr(fd));
     483         [ #  # ]:          0 :         if (!vaddr) {
     484                 :          0 :                 DPAA_PMD_ERR("unable to convert physical address");
     485                 :          0 :                 return NULL;
     486                 :            :         }
     487                 :          0 :         sgt = vaddr + fd_offset;
     488                 :            :         sg_temp = &sgt[i++];
     489                 :          0 :         hw_sg_to_cpu(sg_temp);
     490                 :          0 :         temp = (struct rte_mbuf *)((char *)vaddr - bp_info->meta_data_size);
     491                 :            :         sg_vaddr = DPAA_MEMPOOL_PTOV(bp_info, qm_sg_entry_get64(sg_temp));
     492                 :            : 
     493                 :          0 :         first_seg = (struct rte_mbuf *)((char *)sg_vaddr -
     494                 :          0 :                                                 bp_info->meta_data_size);
     495                 :          0 :         first_seg->data_off = sg_temp->offset;
     496                 :          0 :         first_seg->data_len = sg_temp->length;
     497                 :          0 :         first_seg->pkt_len = sg_temp->length;
     498                 :            :         rte_mbuf_refcnt_set(first_seg, 1);
     499                 :            : #ifdef RTE_LIBRTE_MEMPOOL_DEBUG
     500                 :            :         rte_mempool_check_cookies(rte_mempool_from_obj((void *)first_seg),
     501                 :            :                         (void **)&first_seg, 1, 1);
     502                 :            : #endif
     503                 :            : 
     504                 :          0 :         first_seg->port = dpaa_intf->ifid;
     505                 :          0 :         first_seg->nb_segs = 1;
     506                 :          0 :         first_seg->ol_flags = 0;
     507                 :            :         prev_seg = first_seg;
     508         [ #  # ]:          0 :         while (i < DPAA_SGT_MAX_ENTRIES) {
     509                 :          0 :                 sg_temp = &sgt[i++];
     510                 :          0 :                 hw_sg_to_cpu(sg_temp);
     511                 :            :                 sg_vaddr = DPAA_MEMPOOL_PTOV(bp_info,
     512                 :            :                                              qm_sg_entry_get64(sg_temp));
     513                 :          0 :                 cur_seg = (struct rte_mbuf *)((char *)sg_vaddr -
     514                 :          0 :                                                       bp_info->meta_data_size);
     515                 :          0 :                 cur_seg->data_off = sg_temp->offset;
     516                 :          0 :                 cur_seg->data_len = sg_temp->length;
     517                 :          0 :                 first_seg->pkt_len += sg_temp->length;
     518         [ #  # ]:          0 :                 first_seg->nb_segs += 1;
     519                 :            :                 rte_mbuf_refcnt_set(cur_seg, 1);
     520                 :            : #ifdef RTE_LIBRTE_MEMPOOL_DEBUG
     521                 :            :                 rte_mempool_check_cookies(rte_mempool_from_obj((void *)cur_seg),
     522                 :            :                                 (void **)&cur_seg, 1, 1);
     523                 :            : #endif
     524                 :          0 :                 prev_seg->next = cur_seg;
     525         [ #  # ]:          0 :                 if (sg_temp->final) {
     526                 :          0 :                         cur_seg->next = NULL;
     527                 :          0 :                         break;
     528                 :            :                 }
     529                 :            :                 prev_seg = cur_seg;
     530                 :            :         }
     531                 :            :         DPAA_DP_LOG(DEBUG, "Received an SG frame len =%d, num_sg =%d",
     532                 :            :                         first_seg->pkt_len, first_seg->nb_segs);
     533                 :            : 
     534                 :          0 :         dpaa_eth_packet_info(dpaa_intf, first_seg, GET_ANNOTATIONS(vaddr));
     535                 :            : #ifdef RTE_LIBRTE_MEMPOOL_DEBUG
     536                 :            :         rte_mempool_check_cookies(rte_mempool_from_obj((void *)temp),
     537                 :            :                         (void **)&temp, 1, 1);
     538                 :            : #endif
     539                 :            :         rte_pktmbuf_free_seg(temp);
     540                 :            : 
     541                 :            :         return first_seg;
     542                 :            : }
     543                 :            : 
     544                 :            : static inline struct rte_mbuf *
     545                 :          0 : dpaa_eth_fd_to_mbuf(struct dpaa_if *dpaa_intf, const struct qm_fd *fd)
     546                 :            : {
     547                 :            :         struct rte_mbuf *mbuf;
     548                 :          0 :         struct dpaa_bp_info *bp_info = DPAA_BPID_TO_POOL_INFO(fd->bpid);
     549                 :            :         void *ptr;
     550                 :          0 :         uint8_t format =
     551                 :          0 :                 (fd->opaque & DPAA_FD_FORMAT_MASK) >> DPAA_FD_FORMAT_SHIFT;
     552                 :            :         uint16_t offset;
     553                 :            :         uint32_t length;
     554                 :            : 
     555         [ #  # ]:          0 :         if (unlikely(format == qm_fd_sg))
     556                 :          0 :                 return dpaa_eth_sg_to_mbuf(dpaa_intf, fd);
     557                 :            : 
     558                 :          0 :         offset = (fd->opaque & DPAA_FD_OFFSET_MASK) >> DPAA_FD_OFFSET_SHIFT;
     559                 :          0 :         length = fd->opaque & DPAA_FD_LENGTH_MASK;
     560                 :            : 
     561                 :            :         DPAA_DP_LOG(DEBUG, " FD--->MBUF off %d len = %d", offset, length);
     562                 :            : 
     563                 :            :         /* Ignoring case when format != qm_fd_contig */
     564                 :            :         ptr = DPAA_MEMPOOL_PTOV(bp_info, qm_fd_addr(fd));
     565                 :            : 
     566                 :          0 :         mbuf = (struct rte_mbuf *)((char *)ptr - bp_info->meta_data_size);
     567                 :            :         /* Prefetch the Parse results and packet data to L1 */
     568                 :          0 :         rte_prefetch0((void *)((uint8_t *)ptr + DEFAULT_RX_ICEOF));
     569                 :            : 
     570                 :          0 :         mbuf->data_off = offset;
     571                 :          0 :         mbuf->data_len = length;
     572                 :          0 :         mbuf->pkt_len = length;
     573                 :            : 
     574                 :          0 :         mbuf->port = dpaa_intf->ifid;
     575                 :          0 :         mbuf->nb_segs = 1;
     576                 :          0 :         mbuf->ol_flags = 0;
     577                 :          0 :         mbuf->next = NULL;
     578                 :            :         rte_mbuf_refcnt_set(mbuf, 1);
     579                 :            : #ifdef RTE_LIBRTE_MEMPOOL_DEBUG
     580                 :            :         rte_mempool_check_cookies(rte_mempool_from_obj((void *)mbuf),
     581                 :            :                         (void **)&mbuf, 1, 1);
     582                 :            : #endif
     583                 :          0 :         dpaa_eth_packet_info(dpaa_intf, mbuf, GET_ANNOTATIONS(mbuf->buf_addr));
     584                 :            : 
     585                 :          0 :         return mbuf;
     586                 :            : }
     587                 :            : 
     588                 :            : uint16_t
     589                 :          0 : dpaa_free_mbuf(const struct qm_fd *fd)
     590                 :            : {
     591                 :            :         struct rte_mbuf *mbuf;
     592                 :            :         struct dpaa_bp_info *bp_info;
     593                 :            :         uint8_t format;
     594                 :            :         void *ptr;
     595                 :            : 
     596                 :          0 :         bp_info = DPAA_BPID_TO_POOL_INFO(fd->bpid);
     597                 :          0 :         format = (fd->opaque & DPAA_FD_FORMAT_MASK) >> DPAA_FD_FORMAT_SHIFT;
     598         [ #  # ]:          0 :         if (unlikely(format == qm_fd_sg)) {
     599                 :            :                 struct rte_mbuf *first_seg, *cur_seg;
     600                 :            :                 struct qm_sg_entry *sgt, *sg_temp;
     601                 :            :                 void *vaddr, *sg_vaddr;
     602                 :            :                 int i = 0;
     603                 :          0 :                 uint16_t fd_offset = fd->offset;
     604                 :            : 
     605                 :            :                 vaddr = DPAA_MEMPOOL_PTOV(bp_info, qm_fd_addr(fd));
     606         [ #  # ]:          0 :                 if (!vaddr) {
     607                 :          0 :                         DPAA_PMD_ERR("unable to convert physical address");
     608                 :          0 :                         return -1;
     609                 :            :                 }
     610                 :          0 :                 sgt = vaddr + fd_offset;
     611                 :            :                 sg_temp = &sgt[i++];
     612                 :          0 :                 hw_sg_to_cpu(sg_temp);
     613                 :            :                 sg_vaddr = DPAA_MEMPOOL_PTOV(bp_info,
     614                 :            :                                                 qm_sg_entry_get64(sg_temp));
     615                 :          0 :                 first_seg = (struct rte_mbuf *)((char *)sg_vaddr -
     616                 :          0 :                                                 bp_info->meta_data_size);
     617                 :          0 :                 first_seg->nb_segs = 1;
     618         [ #  # ]:          0 :                 while (i < DPAA_SGT_MAX_ENTRIES) {
     619                 :          0 :                         sg_temp = &sgt[i++];
     620                 :          0 :                         hw_sg_to_cpu(sg_temp);
     621         [ #  # ]:          0 :                         if (sg_temp->bpid != 0xFF) {
     622                 :          0 :                                 bp_info = DPAA_BPID_TO_POOL_INFO(sg_temp->bpid);
     623                 :            :                                 sg_vaddr = DPAA_MEMPOOL_PTOV(bp_info,
     624                 :            :                                                 qm_sg_entry_get64(sg_temp));
     625                 :          0 :                                 cur_seg = (struct rte_mbuf *)((char *)sg_vaddr -
     626         [ #  # ]:          0 :                                                       bp_info->meta_data_size);
     627                 :            :                                 rte_pktmbuf_free_seg(cur_seg);
     628                 :            :                         }
     629         [ #  # ]:          0 :                         if (sg_temp->final)
     630                 :            :                                 break;
     631                 :            :                 }
     632                 :            :                 rte_pktmbuf_free_seg(first_seg);
     633                 :          0 :                 return 0;
     634                 :            :         }
     635                 :            : 
     636                 :            :         ptr = DPAA_MEMPOOL_PTOV(bp_info, qm_fd_addr(fd));
     637                 :          0 :         mbuf = (struct rte_mbuf *)((char *)ptr - bp_info->meta_data_size);
     638                 :            : 
     639                 :          0 :         rte_pktmbuf_free(mbuf);
     640                 :            : 
     641                 :          0 :         return 0;
     642                 :            : }
     643                 :            : 
     644                 :            : /* Specific for LS1043 */
     645                 :            : void
     646                 :          0 : dpaa_rx_cb_no_prefetch(struct qman_fq **fq, struct qm_dqrr_entry **dqrr,
     647                 :            :            void **bufs, int num_bufs)
     648                 :            : {
     649                 :            :         struct rte_mbuf *mbuf;
     650                 :            :         struct dpaa_bp_info *bp_info;
     651                 :            :         const struct qm_fd *fd;
     652                 :            :         void *ptr;
     653                 :            :         struct dpaa_if *dpaa_intf;
     654                 :            :         uint16_t offset, i;
     655                 :            :         uint32_t length;
     656                 :            :         uint8_t format;
     657                 :            :         struct annotations_t *annot;
     658                 :            : 
     659                 :          0 :         bp_info = DPAA_BPID_TO_POOL_INFO(dqrr[0]->fd.bpid);
     660                 :          0 :         ptr = rte_dpaa_mem_ptov(qm_fd_addr(&dqrr[0]->fd));
     661                 :          0 :         rte_prefetch0((void *)((uint8_t *)ptr + DEFAULT_RX_ICEOF));
     662                 :          0 :         bufs[0] = (struct rte_mbuf *)((char *)ptr - bp_info->meta_data_size);
     663                 :            : 
     664         [ #  # ]:          0 :         for (i = 0; i < num_bufs; i++) {
     665         [ #  # ]:          0 :                 if (i < num_bufs - 1) {
     666                 :          0 :                         bp_info = DPAA_BPID_TO_POOL_INFO(dqrr[i + 1]->fd.bpid);
     667                 :          0 :                         ptr = rte_dpaa_mem_ptov(qm_fd_addr(&dqrr[i + 1]->fd));
     668                 :          0 :                         rte_prefetch0((void *)((uint8_t *)ptr +
     669                 :            :                                         DEFAULT_RX_ICEOF));
     670                 :          0 :                         bufs[i + 1] = (struct rte_mbuf *)((char *)ptr -
     671                 :          0 :                                         bp_info->meta_data_size);
     672                 :            :                 }
     673                 :            : 
     674                 :          0 :                 fd = &dqrr[i]->fd;
     675                 :          0 :                 dpaa_intf = fq[i]->dpaa_intf;
     676                 :          0 :                 format = (fd->opaque & DPAA_FD_FORMAT_MASK) >>
     677                 :            :                                 DPAA_FD_FORMAT_SHIFT;
     678         [ #  # ]:          0 :                 if (unlikely(format == qm_fd_sg)) {
     679                 :          0 :                         bufs[i] = dpaa_eth_sg_to_mbuf(dpaa_intf, fd);
     680                 :          0 :                         continue;
     681                 :            :                 }
     682                 :            : 
     683                 :          0 :                 offset = (fd->opaque & DPAA_FD_OFFSET_MASK) >>
     684                 :            :                                 DPAA_FD_OFFSET_SHIFT;
     685                 :          0 :                 length = fd->opaque & DPAA_FD_LENGTH_MASK;
     686                 :            : 
     687                 :          0 :                 mbuf = bufs[i];
     688                 :          0 :                 mbuf->data_off = offset;
     689                 :          0 :                 mbuf->data_len = length;
     690                 :          0 :                 mbuf->pkt_len = length;
     691                 :          0 :                 mbuf->port = dpaa_intf->ifid;
     692                 :            : 
     693                 :          0 :                 mbuf->nb_segs = 1;
     694                 :          0 :                 mbuf->ol_flags = 0;
     695                 :          0 :                 mbuf->next = NULL;
     696                 :            :                 rte_mbuf_refcnt_set(mbuf, 1);
     697                 :            : #ifdef RTE_LIBRTE_MEMPOOL_DEBUG
     698                 :            :                 rte_mempool_check_cookies(rte_mempool_from_obj((void *)mbuf),
     699                 :            :                         (void **)&mbuf, 1, 1);
     700                 :            : #endif
     701                 :          0 :                 annot = GET_ANNOTATIONS(mbuf->buf_addr);
     702                 :          0 :                 dpaa_eth_packet_info(dpaa_intf, mbuf, annot);
     703                 :            :                 dpaa_display_frame_info(fd, fq[i]->fqid, true);
     704         [ #  # ]:          0 :                 if (unlikely(dpaa_intf->ts_enable))
     705         [ #  # ]:          0 :                         dpaa_intf->rx_timestamp = rte_be_to_cpu_64(annot->timestamp);
     706                 :            :         }
     707                 :          0 : }
     708                 :            : 
     709                 :            : void
     710                 :          0 : dpaa_rx_cb(struct qman_fq **fq, struct qm_dqrr_entry **dqrr,
     711                 :            :            void **bufs, int num_bufs)
     712                 :            : {
     713                 :            :         struct rte_mbuf *mbuf;
     714                 :            :         const struct qm_fd *fd;
     715                 :            :         struct dpaa_if *dpaa_intf;
     716                 :            :         uint16_t offset, i;
     717                 :            :         uint32_t length;
     718                 :            :         uint8_t format;
     719                 :            :         struct annotations_t *annot;
     720                 :            : 
     721         [ #  # ]:          0 :         for (i = 0; i < num_bufs; i++) {
     722                 :          0 :                 fd = &dqrr[i]->fd;
     723                 :          0 :                 dpaa_intf = fq[i]->dpaa_intf;
     724                 :          0 :                 format = (fd->opaque & DPAA_FD_FORMAT_MASK) >>
     725                 :            :                                 DPAA_FD_FORMAT_SHIFT;
     726         [ #  # ]:          0 :                 if (unlikely(format == qm_fd_sg)) {
     727                 :          0 :                         bufs[i] = dpaa_eth_sg_to_mbuf(dpaa_intf, fd);
     728                 :          0 :                         continue;
     729                 :            :                 }
     730                 :            : 
     731                 :          0 :                 offset = (fd->opaque & DPAA_FD_OFFSET_MASK) >>
     732                 :            :                                 DPAA_FD_OFFSET_SHIFT;
     733                 :          0 :                 length = fd->opaque & DPAA_FD_LENGTH_MASK;
     734                 :            : 
     735                 :          0 :                 mbuf = bufs[i];
     736                 :          0 :                 mbuf->data_off = offset;
     737                 :          0 :                 mbuf->data_len = length;
     738                 :          0 :                 mbuf->pkt_len = length;
     739                 :          0 :                 mbuf->port = dpaa_intf->ifid;
     740                 :            : 
     741                 :          0 :                 mbuf->nb_segs = 1;
     742                 :          0 :                 mbuf->ol_flags = 0;
     743                 :          0 :                 mbuf->next = NULL;
     744                 :            :                 rte_mbuf_refcnt_set(mbuf, 1);
     745                 :            : #ifdef RTE_LIBRTE_MEMPOOL_DEBUG
     746                 :            :                 rte_mempool_check_cookies(rte_mempool_from_obj((void *)mbuf),
     747                 :            :                         (void **)&mbuf, 1, 1);
     748                 :            : #endif
     749                 :          0 :                 annot = GET_ANNOTATIONS(mbuf->buf_addr);
     750                 :          0 :                 dpaa_eth_packet_info(dpaa_intf, mbuf, annot);
     751                 :            :                 dpaa_display_frame_info(fd, fq[i]->fqid, true);
     752         [ #  # ]:          0 :                 if (unlikely(dpaa_intf->ts_enable))
     753         [ #  # ]:          0 :                         dpaa_intf->rx_timestamp = rte_be_to_cpu_64(annot->timestamp);
     754                 :            :         }
     755                 :          0 : }
     756                 :            : 
     757                 :          0 : void dpaa_rx_cb_prepare(struct qm_dqrr_entry *dq, void **bufs)
     758                 :            : {
     759                 :          0 :         struct dpaa_bp_info *bp_info = DPAA_BPID_TO_POOL_INFO(dq->fd.bpid);
     760                 :          0 :         void *ptr = rte_dpaa_mem_ptov(qm_fd_addr(&dq->fd));
     761                 :            : 
     762                 :            :         /* In case of LS1046, annotation stashing is disabled due to L2 cache
     763                 :            :          * being bottleneck in case of multicore scenario for this platform.
     764                 :            :          * So we prefetch the annotation beforehand, so that it is available
     765                 :            :          * in cache when accessed.
     766                 :            :          */
     767                 :          0 :         rte_prefetch0((void *)((uint8_t *)ptr + DEFAULT_RX_ICEOF));
     768                 :            : 
     769                 :          0 :         *bufs = (struct rte_mbuf *)((char *)ptr - bp_info->meta_data_size);
     770                 :          0 : }
     771                 :            : 
     772                 :            : static uint16_t
     773                 :          0 : dpaa_eth_queue_portal_rx(struct qman_fq *fq,
     774                 :            :                          struct rte_mbuf **bufs,
     775                 :            :                          uint16_t nb_bufs)
     776                 :            : {
     777                 :            :         int ret;
     778                 :            : 
     779         [ #  # ]:          0 :         if (unlikely(!fq->qp_initialized)) {
     780                 :          0 :                 ret = rte_dpaa_portal_fq_init((void *)0, fq);
     781         [ #  # ]:          0 :                 if (ret) {
     782                 :          0 :                         DPAA_PMD_ERR("Failure in affining portal %d", ret);
     783                 :          0 :                         return 0;
     784                 :            :                 }
     785                 :          0 :                 fq->qp_initialized = 1;
     786                 :            :         }
     787                 :            : 
     788                 :          0 :         return qman_portal_poll_rx(nb_bufs, (void **)bufs, fq->qp, &fq->cb);
     789                 :            : }
     790                 :            : 
     791                 :            : enum qman_cb_dqrr_result
     792                 :          0 : dpaa_rx_cb_parallel(void *event,
     793                 :            :                     struct qman_portal *qm __always_unused,
     794                 :            :                     struct qman_fq *fq,
     795                 :            :                     const struct qm_dqrr_entry *dqrr,
     796                 :            :                     void **bufs)
     797                 :            : {
     798                 :            :         struct rte_mbuf *mbuf;
     799                 :            :         struct rte_event *ev = (struct rte_event *)event;
     800                 :            : 
     801                 :          0 :         mbuf = dpaa_eth_fd_to_mbuf(fq->dpaa_intf, &dqrr->fd);
     802                 :          0 :         ev->event_ptr = (void *)mbuf;
     803                 :          0 :         ev->flow_id = fq->ev.flow_id;
     804                 :          0 :         ev->sub_event_type = fq->ev.sub_event_type;
     805                 :          0 :         ev->event_type = RTE_EVENT_TYPE_ETHDEV;
     806                 :          0 :         ev->op = RTE_EVENT_OP_NEW;
     807                 :          0 :         ev->sched_type = fq->ev.sched_type;
     808                 :          0 :         ev->queue_id = fq->ev.queue_id;
     809                 :          0 :         ev->priority = fq->ev.priority;
     810                 :          0 :         ev->impl_opaque = (uint8_t)DPAA_INVALID_MBUF_SEQN;
     811                 :          0 :         *dpaa_seqn(mbuf) = DPAA_INVALID_MBUF_SEQN;
     812                 :          0 :         *bufs = mbuf;
     813                 :            : 
     814                 :          0 :         return qman_cb_dqrr_consume;
     815                 :            : }
     816                 :            : 
     817                 :            : enum qman_cb_dqrr_result
     818                 :          0 : dpaa_rx_cb_atomic(void *event,
     819                 :            :                   struct qman_portal *qm __always_unused,
     820                 :            :                   struct qman_fq *fq,
     821                 :            :                   const struct qm_dqrr_entry *dqrr,
     822                 :            :                   void **bufs)
     823                 :            : {
     824                 :            :         u8 index;
     825                 :            :         struct rte_mbuf *mbuf;
     826                 :            :         struct rte_event *ev = (struct rte_event *)event;
     827                 :            : 
     828                 :          0 :         mbuf = dpaa_eth_fd_to_mbuf(fq->dpaa_intf, &dqrr->fd);
     829                 :          0 :         ev->event_ptr = (void *)mbuf;
     830                 :          0 :         ev->flow_id = fq->ev.flow_id;
     831                 :          0 :         ev->sub_event_type = fq->ev.sub_event_type;
     832                 :          0 :         ev->event_type = RTE_EVENT_TYPE_ETHDEV;
     833                 :          0 :         ev->op = RTE_EVENT_OP_NEW;
     834                 :          0 :         ev->sched_type = fq->ev.sched_type;
     835                 :          0 :         ev->queue_id = fq->ev.queue_id;
     836                 :          0 :         ev->priority = fq->ev.priority;
     837                 :            : 
     838                 :            :         /* Save active dqrr entries */
     839                 :            :         index = DQRR_PTR2IDX(dqrr);
     840                 :          0 :         DPAA_PER_LCORE_DQRR_SIZE++;
     841                 :          0 :         DPAA_PER_LCORE_DQRR_HELD |= UINT64_C(1) << index;
     842                 :          0 :         DPAA_PER_LCORE_DQRR_MBUF(index) = mbuf;
     843                 :          0 :         ev->impl_opaque = index + 1;
     844                 :          0 :         *dpaa_seqn(mbuf) = (uint32_t)index + 1;
     845                 :          0 :         *bufs = mbuf;
     846                 :            : 
     847                 :          0 :         return qman_cb_dqrr_defer;
     848                 :            : }
     849                 :            : 
     850                 :            : #ifdef RTE_LIBRTE_DPAA_DEBUG_DRIVER
     851                 :            : static inline void
     852                 :            : dpaa_eth_err_queue(struct qman_fq *fq)
     853                 :            : {
     854                 :            :         struct rte_mbuf *mbuf;
     855                 :            :         struct qman_fq *debug_fq;
     856                 :            :         int ret, i;
     857                 :            :         struct qm_dqrr_entry *dq;
     858                 :            :         struct qm_fd *fd;
     859                 :            :         struct dpaa_if *dpaa_intf;
     860                 :            : 
     861                 :            :         dpaa_intf = fq->dpaa_intf;
     862                 :            :         if (fq != &dpaa_intf->rx_queues[0]) {
     863                 :            :                 /* Associate error queues to the first RXQ.*/
     864                 :            :                 return;
     865                 :            :         }
     866                 :            : 
     867                 :            :         if (dpaa_intf->cfg->fman_if->is_shared_mac) {
     868                 :            :                 /* Error queues of shared MAC are handled in kernel. */
     869                 :            :                 return;
     870                 :            :         }
     871                 :            : 
     872                 :            :         if (unlikely(!RTE_PER_LCORE(dpaa_io))) {
     873                 :            :                 ret = rte_dpaa_portal_init((void *)0);
     874                 :            :                 if (ret) {
     875                 :            :                         DPAA_PMD_ERR("Failure in affining portal");
     876                 :            :                         return;
     877                 :            :                 }
     878                 :            :         }
     879                 :            :         for (i = 0; i < DPAA_DEBUG_FQ_MAX_NUM; i++) {
     880                 :            :                 debug_fq = &dpaa_intf->debug_queues[i];
     881                 :            :                 ret = qman_set_vdq(debug_fq, 4, QM_VDQCR_EXACT);
     882                 :            :                 if (ret)
     883                 :            :                         return;
     884                 :            : 
     885                 :            :                 do {
     886                 :            :                         dq = qman_dequeue(debug_fq);
     887                 :            :                         if (!dq)
     888                 :            :                                 continue;
     889                 :            :                         fd = &dq->fd;
     890                 :            :                         if (i == DPAA_DEBUG_FQ_RX_ERROR)
     891                 :            :                                 DPAA_PMD_ERR("RX ERROR status: 0x%08x",
     892                 :            :                                         fd->status);
     893                 :            :                         else
     894                 :            :                                 DPAA_PMD_ERR("TX ERROR status: 0x%08x",
     895                 :            :                                         fd->status);
     896                 :            :                         dpaa_display_frame_info(fd, debug_fq->fqid,
     897                 :            :                                 i == DPAA_DEBUG_FQ_RX_ERROR);
     898                 :            : 
     899                 :            :                         mbuf = dpaa_eth_fd_to_mbuf(dpaa_intf, fd);
     900                 :            :                         rte_pktmbuf_free(mbuf);
     901                 :            :                         qman_dqrr_consume(debug_fq, dq);
     902                 :            :                 } while (debug_fq->flags & QMAN_FQ_STATE_VDQCR);
     903                 :            :         }
     904                 :            : }
     905                 :            : #endif
     906                 :            : 
     907                 :            : uint16_t
     908                 :          0 : dpaa_eth_queue_rx(void *q, struct rte_mbuf **bufs, uint16_t nb_bufs)
     909                 :            : {
     910                 :            :         struct qman_fq *fq = q;
     911                 :            :         struct qm_dqrr_entry *dq;
     912                 :            :         uint32_t num_rx = 0;
     913                 :            :         int num_rx_bufs, ret;
     914                 :            :         uint32_t vdqcr_flags = 0;
     915                 :            :         struct annotations_t *annot;
     916                 :          0 :         struct dpaa_if *dpaa_intf = fq->dpaa_intf;
     917                 :            : 
     918   [ #  #  #  # ]:          0 :         if (unlikely(rte_dpaa_bpid_info == NULL &&
     919                 :            :                                 rte_eal_process_type() == RTE_PROC_SECONDARY))
     920                 :          0 :                 rte_dpaa_bpid_info = fq->bp_array;
     921                 :            : 
     922                 :            : #ifdef RTE_LIBRTE_DPAA_DEBUG_DRIVER
     923                 :            :         dpaa_eth_err_queue(fq);
     924                 :            : #endif
     925                 :            : 
     926         [ #  # ]:          0 :         if (likely(fq->is_static))
     927                 :          0 :                 return dpaa_eth_queue_portal_rx(fq, bufs, nb_bufs);
     928                 :            : 
     929         [ #  # ]:          0 :         if (unlikely(!DPAA_PER_LCORE_PORTAL)) {
     930                 :          0 :                 ret = rte_dpaa_portal_init((void *)0);
     931         [ #  # ]:          0 :                 if (ret) {
     932                 :          0 :                         DPAA_PMD_ERR("Failure in affining portal");
     933                 :          0 :                         return 0;
     934                 :            :                 }
     935                 :            :         }
     936                 :            : 
     937                 :            :         /* Until request for four buffers, we provide exact number of buffers.
     938                 :            :          * Otherwise we do not set the QM_VDQCR_EXACT flag.
     939                 :            :          * Not setting QM_VDQCR_EXACT flag can provide two more buffers than
     940                 :            :          * requested, so we request two less in this case.
     941                 :            :          */
     942         [ #  # ]:          0 :         if (nb_bufs < 4) {
     943                 :            :                 vdqcr_flags = QM_VDQCR_EXACT;
     944                 :          0 :                 num_rx_bufs = nb_bufs;
     945                 :            :         } else {
     946                 :            :                 num_rx_bufs = nb_bufs > DPAA_MAX_DEQUEUE_NUM_FRAMES ?
     947         [ #  # ]:          0 :                         (DPAA_MAX_DEQUEUE_NUM_FRAMES - 2) : (nb_bufs - 2);
     948                 :            :         }
     949                 :          0 :         ret = qman_set_vdq(fq, num_rx_bufs, vdqcr_flags);
     950         [ #  # ]:          0 :         if (ret)
     951                 :            :                 return 0;
     952                 :            : 
     953                 :            :         do {
     954                 :          0 :                 dq = qman_dequeue(fq);
     955         [ #  # ]:          0 :                 if (!dq)
     956                 :          0 :                         continue;
     957                 :          0 :                 bufs[num_rx++] = dpaa_eth_fd_to_mbuf(dpaa_intf, &dq->fd);
     958                 :            :                 dpaa_display_frame_info(&dq->fd, fq->fqid, true);
     959         [ #  # ]:          0 :                 if (unlikely(dpaa_intf->ts_enable)) {
     960                 :          0 :                         annot = GET_ANNOTATIONS(bufs[num_rx - 1]->buf_addr);
     961         [ #  # ]:          0 :                         dpaa_intf->rx_timestamp = rte_be_to_cpu_64(annot->timestamp);
     962                 :            :                 }
     963                 :          0 :                 qman_dqrr_consume(fq, dq);
     964         [ #  # ]:          0 :         } while (fq->flags & QMAN_FQ_STATE_VDQCR);
     965                 :            : 
     966                 :          0 :         return num_rx;
     967                 :            : }
     968                 :            : 
     969                 :            : static int
     970                 :          0 : dpaa_eth_mbuf_to_sg_fd(struct rte_mbuf *mbuf,
     971                 :            :                 struct qm_fd *fd,
     972                 :            :                 struct dpaa_sw_buf_free *free_buf,
     973                 :            :                 uint32_t *free_count,
     974                 :            :                 uint32_t pkt_id)
     975                 :            : {
     976                 :            :         struct rte_mbuf *cur_seg = mbuf;
     977                 :            :         struct rte_mbuf *temp, *mi;
     978                 :            :         struct qm_sg_entry *sg_temp, *sgt;
     979                 :            :         int i = 0;
     980                 :            : 
     981                 :            :         DPAA_DP_LOG(DEBUG, "Creating SG FD to transmit");
     982                 :            : 
     983                 :          0 :         temp = rte_pktmbuf_alloc(dpaa_tx_sg_pool);
     984         [ #  # ]:          0 :         if (!temp) {
     985                 :          0 :                 DPAA_PMD_ERR("Failure in allocation of mbuf");
     986                 :          0 :                 return -1;
     987                 :            :         }
     988                 :          0 :         if (temp->buf_len < ((mbuf->nb_segs * sizeof(struct qm_sg_entry))
     989         [ #  # ]:          0 :                                 + temp->data_off)) {
     990                 :          0 :                 DPAA_PMD_ERR("Insufficient space in mbuf for SG entries");
     991                 :          0 :                 return -1;
     992                 :            :         }
     993                 :            : 
     994                 :            : #ifdef RTE_LIBRTE_MEMPOOL_DEBUG
     995                 :            :         rte_mempool_check_cookies(rte_mempool_from_obj((void *)temp),
     996                 :            :                         (void **)&temp, 1, 0);
     997                 :            : #endif
     998                 :          0 :         fd->cmd = 0;
     999                 :          0 :         fd->opaque_addr = 0;
    1000                 :            : 
    1001         [ #  # ]:          0 :         if (mbuf->ol_flags & DPAA_TX_CKSUM_OFFLOAD_MASK) {
    1002         [ #  # ]:          0 :                 if (!mbuf->packet_type) {
    1003                 :            :                         struct rte_net_hdr_lens hdr_lens;
    1004                 :            : 
    1005                 :          0 :                         mbuf->packet_type = rte_net_get_ptype(mbuf, &hdr_lens,
    1006                 :            :                                         RTE_PTYPE_L2_MASK | RTE_PTYPE_L3_MASK
    1007                 :            :                                         | RTE_PTYPE_L4_MASK);
    1008                 :          0 :                         mbuf->l2_len = hdr_lens.l2_len;
    1009                 :          0 :                         mbuf->l3_len = hdr_lens.l3_len;
    1010                 :            :                 }
    1011         [ #  # ]:          0 :                 if (temp->data_off < DEFAULT_TX_ICEOF
    1012                 :            :                         + sizeof(struct dpaa_eth_parse_results_t))
    1013                 :          0 :                         temp->data_off = DEFAULT_TX_ICEOF
    1014                 :            :                                 + sizeof(struct dpaa_eth_parse_results_t);
    1015                 :            :                 dcbz_64(temp->buf_addr);
    1016                 :          0 :                 dpaa_checksum_offload(mbuf, fd, temp->buf_addr);
    1017                 :            :         }
    1018                 :            : 
    1019                 :          0 :         sgt = temp->buf_addr + temp->data_off;
    1020                 :          0 :         fd->format = QM_FD_SG;
    1021                 :          0 :         fd->addr = temp->buf_iova;
    1022                 :          0 :         fd->offset = temp->data_off;
    1023                 :          0 :         fd->bpid = DPAA_MEMPOOL_TO_BPID(dpaa_tx_sg_pool);
    1024                 :          0 :         fd->length20 = mbuf->pkt_len;
    1025                 :            : 
    1026         [ #  # ]:          0 :         while (i < DPAA_SGT_MAX_ENTRIES) {
    1027                 :          0 :                 sg_temp = &sgt[i++];
    1028                 :          0 :                 sg_temp->opaque = 0;
    1029                 :          0 :                 sg_temp->val = 0;
    1030                 :          0 :                 sg_temp->addr = cur_seg->buf_iova;
    1031                 :          0 :                 sg_temp->offset = cur_seg->data_off;
    1032                 :          0 :                 sg_temp->length = cur_seg->data_len;
    1033         [ #  # ]:          0 :                 if (RTE_MBUF_DIRECT(cur_seg)) {
    1034         [ #  # ]:          0 :                         if (rte_mbuf_refcnt_read(cur_seg) > 1) {
    1035                 :            :                                 /*If refcnt > 1, invalid bpid is set to ensure
    1036                 :            :                                  * buffer is not freed by HW.
    1037                 :            :                                  */
    1038                 :          0 :                                 sg_temp->bpid = 0xff;
    1039                 :          0 :                                 rte_mbuf_refcnt_update(cur_seg, -1);
    1040                 :            :                         } else {
    1041                 :          0 :                                 sg_temp->bpid =
    1042                 :          0 :                                         DPAA_MEMPOOL_TO_BPID(cur_seg->pool);
    1043                 :            : #ifdef RTE_LIBRTE_MEMPOOL_DEBUG
    1044                 :            :                                 rte_mempool_check_cookies(rte_mempool_from_obj((void *)cur_seg),
    1045                 :            :                                         (void **)&cur_seg, 1, 0);
    1046                 :            : #endif
    1047                 :            :                         }
    1048         [ #  # ]:          0 :                 } else if (RTE_MBUF_HAS_EXTBUF(cur_seg)) {
    1049                 :          0 :                         free_buf[*free_count].seg = cur_seg;
    1050                 :          0 :                         free_buf[*free_count].pkt_id = pkt_id;
    1051                 :          0 :                         ++*free_count;
    1052                 :          0 :                         sg_temp->bpid = 0xff;
    1053                 :            :                 } else {
    1054                 :            :                         /* Get owner MBUF from indirect buffer */
    1055                 :            :                         mi = rte_mbuf_from_indirect(cur_seg);
    1056         [ #  # ]:          0 :                         if (rte_mbuf_refcnt_read(mi) > 1) {
    1057                 :            :                                 /*If refcnt > 1, invalid bpid is set to ensure
    1058                 :            :                                  * owner buffer is not freed by HW.
    1059                 :            :                                  */
    1060                 :          0 :                                 sg_temp->bpid = 0xff;
    1061                 :            :                         } else {
    1062                 :          0 :                                 sg_temp->bpid = DPAA_MEMPOOL_TO_BPID(mi->pool);
    1063                 :          0 :                                 rte_mbuf_refcnt_update(mi, 1);
    1064                 :            :                         }
    1065                 :          0 :                         free_buf[*free_count].seg = cur_seg;
    1066                 :          0 :                         free_buf[*free_count].pkt_id = pkt_id;
    1067                 :          0 :                         ++*free_count;
    1068                 :            :                 }
    1069                 :          0 :                 cur_seg = cur_seg->next;
    1070         [ #  # ]:          0 :                 if (cur_seg == NULL) {
    1071                 :          0 :                         sg_temp->final = 1;
    1072                 :          0 :                         cpu_to_hw_sg(sg_temp);
    1073                 :          0 :                         break;
    1074                 :            :                 }
    1075                 :          0 :                 cpu_to_hw_sg(sg_temp);
    1076                 :            :         }
    1077                 :            :         return 0;
    1078                 :            : }
    1079                 :            : 
    1080                 :            : /* Handle mbufs which are not segmented (non SG) */
    1081                 :            : static inline void
    1082                 :          0 : tx_on_dpaa_pool_unsegmented(struct rte_mbuf *mbuf,
    1083                 :            :                             struct dpaa_bp_info *bp_info,
    1084                 :            :                             struct qm_fd *fd_arr,
    1085                 :            :                             struct dpaa_sw_buf_free *buf_to_free,
    1086                 :            :                             uint32_t *free_count,
    1087                 :            :                             uint32_t pkt_id)
    1088                 :            : {
    1089                 :            :         struct rte_mbuf *mi = NULL;
    1090                 :            : 
    1091         [ #  # ]:          0 :         if (RTE_MBUF_DIRECT(mbuf)) {
    1092         [ #  # ]:          0 :                 if (rte_mbuf_refcnt_read(mbuf) > 1) {
    1093                 :            :                         /* In case of direct mbuf and mbuf being cloned,
    1094                 :            :                          * BMAN should _not_ release buffer.
    1095                 :            :                          */
    1096                 :          0 :                         DPAA_MBUF_TO_CONTIG_FD(mbuf, fd_arr, 0xff);
    1097                 :            :                         /* Buffer should be releasd by EAL */
    1098                 :          0 :                         rte_mbuf_refcnt_update(mbuf, -1);
    1099                 :            :                 } else {
    1100                 :            :                         /* In case of direct mbuf and no cloning, mbuf can be
    1101                 :            :                          * released by BMAN.
    1102                 :            :                          */
    1103                 :          0 :                         DPAA_MBUF_TO_CONTIG_FD(mbuf, fd_arr, bp_info->bpid);
    1104                 :            : #ifdef RTE_LIBRTE_MEMPOOL_DEBUG
    1105                 :            :                         rte_mempool_check_cookies(rte_mempool_from_obj((void *)mbuf),
    1106                 :            :                                 (void **)&mbuf, 1, 0);
    1107                 :            : #endif
    1108                 :            :                 }
    1109         [ #  # ]:          0 :         } else if (RTE_MBUF_HAS_EXTBUF(mbuf)) {
    1110                 :          0 :                 buf_to_free[*free_count].seg = mbuf;
    1111                 :          0 :                 buf_to_free[*free_count].pkt_id = pkt_id;
    1112                 :          0 :                 ++*free_count;
    1113         [ #  # ]:          0 :                 DPAA_MBUF_TO_CONTIG_FD(mbuf, fd_arr,
    1114                 :            :                                 bp_info ? bp_info->bpid : 0xff);
    1115                 :            :         } else {
    1116                 :            :                 /* This is data-containing core mbuf: 'mi' */
    1117                 :            :                 mi = rte_mbuf_from_indirect(mbuf);
    1118         [ #  # ]:          0 :                 if (rte_mbuf_refcnt_read(mi) > 1) {
    1119                 :            :                         /* In case of indirect mbuf, and mbuf being cloned,
    1120                 :            :                          * BMAN should _not_ release it and let EAL release
    1121                 :            :                          * it through pktmbuf_free below.
    1122                 :            :                          */
    1123                 :          0 :                         DPAA_MBUF_TO_CONTIG_FD(mbuf, fd_arr, 0xff);
    1124                 :            :                 } else {
    1125                 :            :                         /* In case of indirect mbuf, and no cloning, core mbuf
    1126                 :            :                          * should be released by BMAN.
    1127                 :            :                          * Increate refcnt of core mbuf so that when
    1128                 :            :                          * pktmbuf_free is called and mbuf is released, EAL
    1129                 :            :                          * doesn't try to release core mbuf which would have
    1130                 :            :                          * been released by BMAN.
    1131                 :            :                          */
    1132                 :          0 :                         rte_mbuf_refcnt_update(mi, 1);
    1133         [ #  # ]:          0 :                         DPAA_MBUF_TO_CONTIG_FD(mbuf, fd_arr,
    1134                 :            :                                                 bp_info ? bp_info->bpid : 0xff);
    1135                 :            :                 }
    1136                 :          0 :                 buf_to_free[*free_count].seg = mbuf;
    1137                 :          0 :                 buf_to_free[*free_count].pkt_id = pkt_id;
    1138                 :          0 :                 ++*free_count;
    1139                 :            :         }
    1140                 :            : 
    1141         [ #  # ]:          0 :         if (mbuf->ol_flags & DPAA_TX_CKSUM_OFFLOAD_MASK)
    1142                 :          0 :                 dpaa_unsegmented_checksum(mbuf, fd_arr);
    1143                 :          0 : }
    1144                 :            : 
    1145                 :            : /* Handle all mbufs on dpaa BMAN managed pool */
    1146                 :            : static inline uint16_t
    1147                 :          0 : tx_on_dpaa_pool(struct rte_mbuf *mbuf,
    1148                 :            :                 struct dpaa_bp_info *bp_info,
    1149                 :            :                 struct qm_fd *fd_arr,
    1150                 :            :                 struct dpaa_sw_buf_free *buf_to_free,
    1151                 :            :                 uint32_t *free_count,
    1152                 :            :                 uint32_t pkt_id)
    1153                 :            : {
    1154                 :            :         DPAA_DP_LOG(DEBUG, "BMAN offloaded buffer, mbuf: %p", mbuf);
    1155                 :            : 
    1156         [ #  # ]:          0 :         if (mbuf->nb_segs == 1) {
    1157                 :            :                 /* Case for non-segmented buffers */
    1158                 :          0 :                 tx_on_dpaa_pool_unsegmented(mbuf, bp_info, fd_arr,
    1159                 :            :                                 buf_to_free, free_count, pkt_id);
    1160         [ #  # ]:          0 :         } else if (mbuf->nb_segs > 1 &&
    1161                 :            :                    mbuf->nb_segs <= DPAA_SGT_MAX_ENTRIES) {
    1162         [ #  # ]:          0 :                 if (dpaa_eth_mbuf_to_sg_fd(mbuf, fd_arr, buf_to_free,
    1163                 :            :                                            free_count, pkt_id)) {
    1164                 :          0 :                         DPAA_PMD_DEBUG("Unable to create Scatter Gather FD");
    1165                 :          0 :                         return 1;
    1166                 :            :                 }
    1167                 :            :         } else {
    1168                 :          0 :                 DPAA_PMD_DEBUG("Number of Segments not supported");
    1169                 :          0 :                 return 1;
    1170                 :            :         }
    1171                 :            : 
    1172                 :            :         return 0;
    1173                 :            : }
    1174                 :            : 
    1175                 :            : /* Handle all mbufs on an external pool (non-dpaa) */
    1176                 :            : static inline struct rte_mbuf *
    1177                 :          0 : reallocate_mbuf(struct qman_fq *txq, struct rte_mbuf *mbuf)
    1178                 :            : {
    1179                 :          0 :         struct dpaa_if *dpaa_intf = txq->dpaa_intf;
    1180                 :          0 :         struct dpaa_bp_info *bp_info = dpaa_intf->bp_info;
    1181                 :          0 :         struct rte_mbuf *new_mbufs[DPAA_SGT_MAX_ENTRIES + 1] = {0};
    1182                 :            :         struct rte_mbuf *temp_mbuf;
    1183                 :            :         int num_new_segs, mbuf_greater, ret, extra_seg = 0, i = 0;
    1184                 :            :         uint64_t mbufs_size, bytes_to_copy, offset1 = 0, offset2 = 0;
    1185                 :            :         char *data;
    1186                 :            : 
    1187                 :            :         DPAA_DP_LOG(DEBUG, "Reallocating transmit buffer");
    1188                 :            : 
    1189                 :          0 :         mbufs_size = bp_info->size -
    1190                 :          0 :                 bp_info->meta_data_size - RTE_PKTMBUF_HEADROOM;
    1191                 :          0 :         extra_seg = !!(mbuf->pkt_len % mbufs_size);
    1192                 :          0 :         num_new_segs = (mbuf->pkt_len / mbufs_size) + extra_seg;
    1193                 :            : 
    1194                 :          0 :         ret = rte_pktmbuf_alloc_bulk(bp_info->mp, new_mbufs, num_new_segs);
    1195         [ #  # ]:          0 :         if (ret != 0) {
    1196                 :            :                 DPAA_DP_LOG(DEBUG, "Allocation for new buffers failed");
    1197                 :            :                 return NULL;
    1198                 :            :         }
    1199                 :            : 
    1200                 :            :         temp_mbuf = mbuf;
    1201                 :            : 
    1202         [ #  # ]:          0 :         while (temp_mbuf) {
    1203                 :            :                 /* If mbuf data is less than new mbuf remaining memory */
    1204         [ #  # ]:          0 :                 if ((temp_mbuf->data_len - offset1) < (mbufs_size - offset2)) {
    1205                 :            :                         bytes_to_copy = temp_mbuf->data_len - offset1;
    1206                 :            :                         mbuf_greater = -1;
    1207                 :            :                 /* If mbuf data is greater than new mbuf remaining memory */
    1208         [ #  # ]:          0 :                 } else if ((temp_mbuf->data_len - offset1) >
    1209                 :            :                            (mbufs_size - offset2)) {
    1210                 :            :                         bytes_to_copy = mbufs_size - offset2;
    1211                 :            :                         mbuf_greater = 1;
    1212                 :            :                 /* if mbuf data is equal to new mbuf remaining memory */
    1213                 :            :                 } else {
    1214                 :            :                         bytes_to_copy = temp_mbuf->data_len - offset1;
    1215                 :            :                         mbuf_greater = 0;
    1216                 :            :                 }
    1217                 :            : 
    1218                 :            :                 /* Copy the data */
    1219                 :          0 :                 data = rte_pktmbuf_append(new_mbufs[0], bytes_to_copy);
    1220                 :            : 
    1221         [ #  # ]:          0 :                 rte_memcpy((uint8_t *)data, rte_pktmbuf_mtod_offset(temp_mbuf,
    1222                 :            :                            void *, offset1), bytes_to_copy);
    1223                 :            : 
    1224                 :            :                 /* Set new offsets and the temp buffers */
    1225         [ #  # ]:          0 :                 if (mbuf_greater == -1) {
    1226                 :            :                         offset1 = 0;
    1227                 :          0 :                         offset2 += bytes_to_copy;
    1228                 :          0 :                         temp_mbuf = temp_mbuf->next;
    1229         [ #  # ]:          0 :                 } else if (mbuf_greater == 1) {
    1230                 :            :                         offset2 = 0;
    1231                 :          0 :                         offset1 += bytes_to_copy;
    1232                 :          0 :                         new_mbufs[i]->next = new_mbufs[i + 1];
    1233                 :          0 :                         new_mbufs[0]->nb_segs++;
    1234                 :            :                         i++;
    1235                 :            :                 } else {
    1236                 :            :                         offset1 = 0;
    1237                 :            :                         offset2 = 0;
    1238                 :          0 :                         temp_mbuf = temp_mbuf->next;
    1239                 :          0 :                         new_mbufs[i]->next = new_mbufs[i + 1];
    1240         [ #  # ]:          0 :                         if (new_mbufs[i + 1])
    1241                 :          0 :                                 new_mbufs[0]->nb_segs++;
    1242                 :            :                         i++;
    1243                 :            :                 }
    1244                 :            :         }
    1245                 :            : 
    1246                 :            :         /* Copy other required fields */
    1247                 :          0 :         new_mbufs[0]->ol_flags = mbuf->ol_flags;
    1248                 :          0 :         new_mbufs[0]->packet_type = mbuf->packet_type;
    1249                 :          0 :         new_mbufs[0]->tx_offload = mbuf->tx_offload;
    1250                 :            : 
    1251                 :          0 :         rte_pktmbuf_free(mbuf);
    1252                 :            : 
    1253                 :          0 :         return new_mbufs[0];
    1254                 :            : }
    1255                 :            : 
    1256                 :            : #ifdef RTE_LIBRTE_DPAA_ERRATA_LS1043_A010022
    1257                 :            : /* In case the data offset is not multiple of 16,
    1258                 :            :  * FMAN can stall because of an errata. So reallocate
    1259                 :            :  * the buffer in such case.
    1260                 :            :  */
    1261                 :            : static inline int
    1262                 :            : dpaa_eth_ls1043a_mbuf_realloc(struct rte_mbuf *mbuf)
    1263                 :            : {
    1264                 :            :         uint64_t len, offset;
    1265                 :            : 
    1266                 :            :         if (dpaa_soc_ver() != SVR_LS1043A_FAMILY)
    1267                 :            :                 return 0;
    1268                 :            : 
    1269                 :            :         while (mbuf) {
    1270                 :            :                 len = mbuf->data_len;
    1271                 :            :                 offset = mbuf->data_off;
    1272                 :            :                 if ((mbuf->next &&
    1273                 :            :                         !rte_is_aligned((void *)len, 16)) ||
    1274                 :            :                         !rte_is_aligned((void *)offset, 16)) {
    1275                 :            :                         DPAA_PMD_DEBUG("Errata condition hit");
    1276                 :            : 
    1277                 :            :                         return 1;
    1278                 :            :                 }
    1279                 :            :                 mbuf = mbuf->next;
    1280                 :            :         }
    1281                 :            :         return 0;
    1282                 :            : }
    1283                 :            : #endif
    1284                 :            : 
    1285                 :            : uint16_t
    1286                 :          0 : dpaa_eth_queue_tx(void *q, struct rte_mbuf **bufs, uint16_t nb_bufs)
    1287                 :            : {
    1288                 :            :         struct rte_mbuf *mbuf, *mi = NULL;
    1289                 :            :         struct rte_mempool *mp;
    1290                 :            :         struct dpaa_bp_info *bp_info;
    1291                 :            :         struct qm_fd fd_arr[DPAA_TX_BURST_SIZE];
    1292                 :            :         uint32_t frames_to_send, loop, sent = 0;
    1293                 :            :         uint16_t state;
    1294                 :            :         int ret, realloc_mbuf = 0;
    1295                 :          0 :         uint32_t seqn, index, flags[DPAA_TX_BURST_SIZE] = {0};
    1296                 :            :         struct dpaa_sw_buf_free buf_to_free[DPAA_MAX_SGS * DPAA_MAX_DEQUEUE_NUM_FRAMES];
    1297                 :          0 :         uint32_t free_count = 0;
    1298                 :            :         struct qman_fq *fq = q;
    1299                 :          0 :         struct dpaa_if *dpaa_intf = fq->dpaa_intf;
    1300                 :          0 :         struct qman_fq *fq_txconf = fq->tx_conf_queue;
    1301                 :            : 
    1302         [ #  # ]:          0 :         if (unlikely(!DPAA_PER_LCORE_PORTAL)) {
    1303                 :          0 :                 ret = rte_dpaa_portal_init((void *)0);
    1304         [ #  # ]:          0 :                 if (ret) {
    1305                 :          0 :                         DPAA_PMD_ERR("Failure in affining portal");
    1306                 :          0 :                         return 0;
    1307                 :            :                 }
    1308                 :            :         }
    1309                 :            : 
    1310                 :            :         DPAA_DP_LOG(DEBUG, "Transmitting %d buffers on queue: %p", nb_bufs, q);
    1311                 :            : 
    1312         [ #  # ]:          0 :         if (unlikely(dpaa_intf->ts_enable)) {
    1313                 :          0 :                 dpaa_intf->next_tx_conf_queue = fq_txconf;
    1314                 :          0 :                 dpaa_eth_tx_conf(fq_txconf);
    1315                 :            :         }
    1316                 :            : 
    1317         [ #  # ]:          0 :         while (nb_bufs) {
    1318                 :          0 :                 frames_to_send = (nb_bufs > DPAA_TX_BURST_SIZE) ?
    1319                 :          0 :                                 DPAA_TX_BURST_SIZE : nb_bufs;
    1320         [ #  # ]:          0 :                 for (loop = 0; loop < frames_to_send; loop++) {
    1321                 :          0 :                         mbuf = *(bufs++);
    1322                 :          0 :                         fd_arr[loop].cmd = 0;
    1323         [ #  # ]:          0 :                         if (unlikely(dpaa_intf->ts_enable)) {
    1324                 :          0 :                                 fd_arr[loop].cmd |= DPAA_FD_CMD_FCO |
    1325                 :          0 :                                         qman_fq_fqid(fq_txconf);
    1326                 :          0 :                                 fd_arr[loop].cmd |= DPAA_FD_CMD_RPD |
    1327                 :            :                                         DPAA_FD_CMD_UPD;
    1328                 :            :                         }
    1329                 :            : #ifdef RTE_LIBRTE_DPAA_ERRATA_LS1043_A010022
    1330                 :            :                         realloc_mbuf = dpaa_eth_ls1043a_mbuf_realloc(mbuf);
    1331                 :            : #endif
    1332                 :          0 :                         seqn = *dpaa_seqn(mbuf);
    1333         [ #  # ]:          0 :                         if (seqn != DPAA_INVALID_MBUF_SEQN) {
    1334                 :          0 :                                 index = seqn - 1;
    1335         [ #  # ]:          0 :                                 if (DPAA_PER_LCORE_DQRR_HELD & (UINT64_C(1) << index)) {
    1336                 :            :                                         flags[loop] =
    1337                 :          0 :                                            ((index & QM_EQCR_DCA_IDXMASK) << 8);
    1338                 :          0 :                                         flags[loop] |= QMAN_ENQUEUE_FLAG_DCA;
    1339                 :          0 :                                         DPAA_PER_LCORE_DQRR_SIZE--;
    1340                 :          0 :                                         DPAA_PER_LCORE_DQRR_HELD &= ~(UINT64_C(1) << index);
    1341                 :            :                                 }
    1342                 :            :                         }
    1343                 :            : 
    1344         [ #  # ]:          0 :                         if (likely(RTE_MBUF_DIRECT(mbuf))) {
    1345                 :          0 :                                 mp = mbuf->pool;
    1346                 :          0 :                                 bp_info = DPAA_MEMPOOL_TO_POOL_INFO(mp);
    1347   [ #  #  #  #  :          0 :                                 if (likely(mp->ops_index ==
                   #  # ]
    1348                 :            :                                                 bp_info->dpaa_ops_index &&
    1349                 :            :                                         mbuf->nb_segs == 1 &&
    1350                 :            :                                         realloc_mbuf == 0 &&
    1351                 :            :                                         rte_mbuf_refcnt_read(mbuf) == 1)) {
    1352                 :          0 :                                         DPAA_MBUF_TO_CONTIG_FD(mbuf,
    1353                 :            :                                                 &fd_arr[loop], bp_info->bpid);
    1354         [ #  # ]:          0 :                                         if (mbuf->ol_flags &
    1355                 :            :                                                 DPAA_TX_CKSUM_OFFLOAD_MASK)
    1356                 :          0 :                                                 dpaa_unsegmented_checksum(mbuf,
    1357                 :            :                                                         &fd_arr[loop]);
    1358                 :            : #ifdef RTE_LIBRTE_MEMPOOL_DEBUG
    1359                 :            :                                 rte_mempool_check_cookies(rte_mempool_from_obj((void *)mbuf),
    1360                 :            :                                                 (void **)&mbuf, 1, 0);
    1361                 :            : #endif
    1362                 :          0 :                                         continue;
    1363                 :            :                                 }
    1364                 :            :                         } else {
    1365                 :            :                                 mi = rte_mbuf_from_indirect(mbuf);
    1366                 :          0 :                                 mp = mi->pool;
    1367                 :            :                         }
    1368                 :            : 
    1369         [ #  # ]:          0 :                         if (unlikely(RTE_MBUF_HAS_EXTBUF(mbuf))) {
    1370                 :            :                                 bp_info = NULL;
    1371                 :          0 :                                 goto indirect_buf;
    1372                 :            :                         }
    1373                 :            : 
    1374                 :          0 :                         bp_info = DPAA_MEMPOOL_TO_POOL_INFO(mp);
    1375         [ #  # ]:          0 :                         if (unlikely(mp->ops_index != bp_info->dpaa_ops_index ||
    1376                 :            :                                      realloc_mbuf == 1)) {
    1377                 :            :                                 struct rte_mbuf *temp_mbuf;
    1378                 :            : 
    1379                 :          0 :                                 temp_mbuf = reallocate_mbuf(q, mbuf);
    1380         [ #  # ]:          0 :                                 if (!temp_mbuf) {
    1381                 :            :                                         /* Set frames_to_send & nb_bufs so
    1382                 :            :                                          * that packets are transmitted till
    1383                 :            :                                          * previous frame.
    1384                 :            :                                          */
    1385                 :            :                                         frames_to_send = loop;
    1386                 :          0 :                                         nb_bufs = loop;
    1387                 :          0 :                                         goto send_pkts;
    1388                 :            :                                 }
    1389                 :            :                                 mbuf = temp_mbuf;
    1390                 :            :                                 realloc_mbuf = 0;
    1391                 :            :                         }
    1392                 :          0 : indirect_buf:
    1393                 :          0 :                         state = tx_on_dpaa_pool(mbuf, bp_info,
    1394                 :            :                                                 &fd_arr[loop],
    1395                 :            :                                                 buf_to_free,
    1396                 :            :                                                 &free_count,
    1397                 :            :                                                 loop);
    1398         [ #  # ]:          0 :                         if (unlikely(state)) {
    1399                 :            :                                 /* Set frames_to_send & nb_bufs so
    1400                 :            :                                  * that packets are transmitted till
    1401                 :            :                                  * previous frame.
    1402                 :            :                                  */
    1403                 :            :                                 frames_to_send = loop;
    1404                 :          0 :                                 nb_bufs = loop;
    1405                 :          0 :                                 goto send_pkts;
    1406                 :            :                         }
    1407                 :            :                 }
    1408                 :            : 
    1409                 :          0 : send_pkts:
    1410                 :            :                 loop = 0;
    1411         [ #  # ]:          0 :                 while (loop < frames_to_send) {
    1412                 :          0 :                         loop += qman_enqueue_multi(q, &fd_arr[loop],
    1413                 :          0 :                                                    &flags[loop],
    1414                 :          0 :                                                    frames_to_send - loop);
    1415                 :            :                 }
    1416                 :          0 :                 nb_bufs -= frames_to_send;
    1417                 :          0 :                 sent += frames_to_send;
    1418                 :            :         }
    1419                 :            : 
    1420                 :            :         DPAA_DP_LOG(DEBUG, "Transmitted %d buffers on queue: %p", sent, q);
    1421                 :            : 
    1422         [ #  # ]:          0 :         for (loop = 0; loop < free_count; loop++) {
    1423         [ #  # ]:          0 :                 if (buf_to_free[loop].pkt_id < sent)
    1424         [ #  # ]:          0 :                         rte_pktmbuf_free_seg(buf_to_free[loop].seg);
    1425                 :            :         }
    1426                 :            : 
    1427                 :          0 :         return sent;
    1428                 :            : }
    1429                 :            : 
    1430                 :            : void
    1431                 :          0 : dpaa_eth_tx_conf(void *q)
    1432                 :            : {
    1433                 :            :         struct qman_fq *fq = q;
    1434                 :            :         struct qm_dqrr_entry *dq;
    1435                 :            :         int num_tx_conf, ret, dq_num;
    1436                 :            :         uint32_t vdqcr_flags = 0;
    1437                 :          0 :         struct dpaa_if *dpaa_intf = fq->dpaa_intf;
    1438                 :            :         struct qm_dqrr_entry *dqrr;
    1439                 :            :         struct dpaa_bp_info *bp_info;
    1440                 :            :         struct rte_mbuf *mbuf;
    1441                 :            :         void *ptr;
    1442                 :            :         struct annotations_t *annot;
    1443                 :            : 
    1444   [ #  #  #  # ]:          0 :         if (unlikely(rte_dpaa_bpid_info == NULL &&
    1445                 :            :                                 rte_eal_process_type() == RTE_PROC_SECONDARY))
    1446                 :          0 :                 rte_dpaa_bpid_info = fq->bp_array;
    1447                 :            : 
    1448         [ #  # ]:          0 :         if (unlikely(!DPAA_PER_LCORE_PORTAL)) {
    1449                 :          0 :                 ret = rte_dpaa_portal_init((void *)0);
    1450         [ #  # ]:          0 :                 if (ret) {
    1451                 :          0 :                         DPAA_PMD_ERR("Failure in affining portal");
    1452                 :          0 :                         return;
    1453                 :            :                 }
    1454                 :            :         }
    1455                 :            : 
    1456                 :            :         num_tx_conf = DPAA_MAX_DEQUEUE_NUM_FRAMES - 2;
    1457                 :            : 
    1458                 :            :         do {
    1459                 :            :                 dq_num = 0;
    1460                 :          0 :                 ret = qman_set_vdq(fq, num_tx_conf, vdqcr_flags);
    1461         [ #  # ]:          0 :                 if (ret)
    1462                 :            :                         return;
    1463                 :            :                 do {
    1464                 :          0 :                         dq = qman_dequeue(fq);
    1465         [ #  # ]:          0 :                         if (!dq)
    1466                 :          0 :                                 continue;
    1467                 :            :                         dqrr = dq;
    1468                 :          0 :                         dq_num++;
    1469                 :          0 :                         bp_info = DPAA_BPID_TO_POOL_INFO(dqrr->fd.bpid);
    1470                 :          0 :                         ptr = rte_dpaa_mem_ptov(qm_fd_addr(&dqrr->fd));
    1471                 :          0 :                         rte_prefetch0((void *)((uint8_t *)ptr
    1472                 :            :                                                 + DEFAULT_RX_ICEOF));
    1473                 :          0 :                         mbuf = (struct rte_mbuf *)
    1474                 :          0 :                                 ((char *)ptr - bp_info->meta_data_size);
    1475                 :            : 
    1476         [ #  # ]:          0 :                         if (mbuf->ol_flags & RTE_MBUF_F_TX_IEEE1588_TMST) {
    1477                 :          0 :                                 annot = GET_ANNOTATIONS(mbuf->buf_addr);
    1478         [ #  # ]:          0 :                                 dpaa_intf->tx_timestamp = rte_be_to_cpu_64(annot->timestamp);
    1479                 :            :                         }
    1480                 :            :                         dpaa_display_frame_info(&dq->fd, fq->fqid, true);
    1481                 :          0 :                         qman_dqrr_consume(fq, dq);
    1482                 :          0 :                         dpaa_free_mbuf(&dq->fd);
    1483         [ #  # ]:          0 :                 } while (fq->flags & QMAN_FQ_STATE_VDQCR);
    1484         [ #  # ]:          0 :         } while (dq_num == num_tx_conf);
    1485                 :            : }
    1486                 :            : 
    1487                 :            : uint16_t
    1488                 :          0 : dpaa_eth_queue_tx_slow(void *q, struct rte_mbuf **bufs, uint16_t nb_bufs)
    1489                 :            : {
    1490                 :          0 :         qman_ern_poll_free();
    1491                 :            : 
    1492                 :          0 :         return dpaa_eth_queue_tx(q, bufs, nb_bufs);
    1493                 :            : }
    1494                 :            : 
    1495                 :          0 : uint16_t dpaa_eth_tx_drop_all(void *q  __rte_unused,
    1496                 :            :                               struct rte_mbuf **bufs __rte_unused,
    1497                 :            :                 uint16_t nb_bufs __rte_unused)
    1498                 :            : {
    1499                 :            :         DPAA_DP_LOG(DEBUG, "Drop all packets");
    1500                 :            : 
    1501                 :            :         /* Drop all incoming packets. No need to free packets here
    1502                 :            :          * because the rte_eth f/w frees up the packets through tx_buffer
    1503                 :            :          * callback in case this functions returns count less than nb_bufs
    1504                 :            :          */
    1505                 :          0 :         return 0;
    1506                 :            : }

Generated by: LCOV version 1.14