| 72 | } |
| 73 | |
| 74 | static __rte_always_inline int |
| 75 | ionic_tx(struct ionic_tx_qcq *txq, struct rte_mbuf *txm) |
| 76 | { |
| 77 | struct ionic_queue *q = &txq->qcq.q; |
| 78 | struct ionic_txq_desc *desc, *desc_base = q->base; |
| 79 | struct ionic_tx_stats *stats = &txq->stats; |
| 80 | void **info; |
| 81 | uint64_t ol_flags = txm->ol_flags; |
| 82 | uint64_t addr, cmd; |
| 83 | uint8_t opcode = IONIC_TXQ_DESC_OPCODE_CSUM_NONE; |
| 84 | uint8_t flags = 0; |
| 85 | |
| 86 | if (txm->nb_segs > 1) |
| 87 | return -EINVAL; |
| 88 | |
| 89 | desc = &desc_base[q->head_idx]; |
| 90 | info = &q->info[q->head_idx]; |
| 91 | |
| 92 | if ((ol_flags & RTE_MBUF_F_TX_IP_CKSUM) && |
| 93 | (txq->flags & IONIC_QCQ_F_CSUM_L3)) { |
| 94 | opcode = IONIC_TXQ_DESC_OPCODE_CSUM_HW; |
| 95 | flags |= IONIC_TXQ_DESC_FLAG_CSUM_L3; |
| 96 | } |
| 97 | |
| 98 | if (((ol_flags & RTE_MBUF_F_TX_TCP_CKSUM) && |
| 99 | (txq->flags & IONIC_QCQ_F_CSUM_TCP)) || |
| 100 | ((ol_flags & RTE_MBUF_F_TX_UDP_CKSUM) && |
| 101 | (txq->flags & IONIC_QCQ_F_CSUM_UDP))) { |
| 102 | opcode = IONIC_TXQ_DESC_OPCODE_CSUM_HW; |
| 103 | flags |= IONIC_TXQ_DESC_FLAG_CSUM_L4; |
| 104 | } |
| 105 | |
| 106 | if (opcode == IONIC_TXQ_DESC_OPCODE_CSUM_NONE) |
| 107 | stats->no_csum++; |
| 108 | |
| 109 | if (((ol_flags & RTE_MBUF_F_TX_OUTER_IP_CKSUM) || |
| 110 | (ol_flags & RTE_MBUF_F_TX_OUTER_UDP_CKSUM)) && |
| 111 | ((ol_flags & RTE_MBUF_F_TX_OUTER_IPV4) || |
| 112 | (ol_flags & RTE_MBUF_F_TX_OUTER_IPV6))) { |
| 113 | flags |= IONIC_TXQ_DESC_FLAG_ENCAP; |
| 114 | } |
| 115 | |
| 116 | if (ol_flags & RTE_MBUF_F_TX_VLAN) { |
| 117 | flags |= IONIC_TXQ_DESC_FLAG_VLAN; |
| 118 | desc->vlan_tci = rte_cpu_to_le_16(txm->vlan_tci); |
| 119 | } |
| 120 | |
| 121 | addr = rte_cpu_to_le_64(rte_mbuf_data_iova(txm)); |
| 122 | |
| 123 | cmd = encode_txq_desc_cmd(opcode, flags, 0, addr); |
| 124 | desc->cmd = rte_cpu_to_le_64(cmd); |
| 125 | desc->len = rte_cpu_to_le_16(txm->data_len); |
| 126 | |
| 127 | info[0] = txm; |
| 128 | |
| 129 | q->head_idx = Q_NEXT_TO_POST(q, 1); |
| 130 | |
| 131 | return 0; |
no test coverage detected