aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatias Elo <matias.elo@nokia.com>2023-10-25 15:15:31 +0300
committerMatias Elo <matias.elo@nokia.com>2023-11-06 08:55:30 +0200
commit5a741e7bce5962a6044a7ce086b1f9f2b9988ab7 (patch)
treed96333ce285f83116490166744b29a1c1f838e2f
parent5e653aa9896aa5d21ca2dfda48cf6e983eb0c8da (diff)
Port e2e487619 "linux-gen: packet: implement TX completion poll mode"
Port original commit from linux-generic. Signed-off-by: Matias Elo <matias.elo@nokia.com> Reviewed-by: Jere Leppänen <jere.leppanen@nokia.com>
-rw-r--r--platform/linux-dpdk/odp_packet.c29
1 files changed, 22 insertions, 7 deletions
diff --git a/platform/linux-dpdk/odp_packet.c b/platform/linux-dpdk/odp_packet.c
index a77b7f907..a61c4c34a 100644
--- a/platform/linux-dpdk/odp_packet.c
+++ b/platform/linux-dpdk/odp_packet.c
@@ -1766,8 +1766,26 @@ int odp_packet_tx_compl_request(odp_packet_t pkt, const odp_packet_tx_compl_opt_
{
odp_packet_hdr_t *pkt_hdr = packet_hdr(pkt);
- pkt_hdr->p.flags.tx_compl_ev = opt->mode == ODP_PACKET_TX_COMPL_EVENT ? 1 : 0;
- pkt_hdr->dst_queue = opt->queue;
+ switch (opt->mode) {
+ case ODP_PACKET_TX_COMPL_DISABLED:
+ pkt_hdr->p.flags.tx_compl_ev = 0;
+ pkt_hdr->p.flags.tx_compl_poll = 0;
+ break;
+ case ODP_PACKET_TX_COMPL_EVENT:
+ _ODP_ASSERT(opt->queue != ODP_QUEUE_INVALID);
+ pkt_hdr->p.flags.tx_compl_ev = 1;
+ pkt_hdr->p.flags.tx_compl_poll = 0;
+ pkt_hdr->dst_queue = opt->queue;
+ break;
+ case ODP_PACKET_TX_COMPL_POLL:
+ pkt_hdr->p.flags.tx_compl_ev = 0;
+ pkt_hdr->p.flags.tx_compl_poll = 1;
+ pkt_hdr->tx_compl_id = opt->compl_id;
+ break;
+ default:
+ _ODP_ERR("Bad TX completion mode: %i\n", opt->mode);
+ return -1;
+ }
return 0;
}
@@ -1776,7 +1794,7 @@ int odp_packet_has_tx_compl_request(odp_packet_t pkt)
{
odp_packet_hdr_t *pkt_hdr = packet_hdr(pkt);
- return pkt_hdr->p.flags.tx_compl_ev;
+ return pkt_hdr->p.flags.tx_compl_ev || pkt_hdr->p.flags.tx_compl_poll;
}
void odp_packet_tx_compl_free(odp_packet_tx_compl_t tx_compl)
@@ -1803,10 +1821,7 @@ void *odp_packet_tx_compl_user_ptr(odp_packet_tx_compl_t tx_compl)
int odp_packet_tx_compl_done(odp_pktio_t pktio, uint32_t compl_id)
{
- (void)pktio;
- (void)compl_id;
-
- return -1;
+ return odp_atomic_load_acq_u32(&get_pktio_entry(pktio)->tx_compl_status[compl_id]);
}
void odp_packet_free_ctrl_set(odp_packet_t pkt, odp_packet_free_ctrl_t ctrl)