diff options
author | Tuomas Taipale <tuomas.taipale@nokia.com> | 2023-07-27 09:18:16 +0000 |
---|---|---|
committer | Matias Elo <matias.elo@nokia.com> | 2023-09-13 13:08:50 +0300 |
commit | e2e487619cbd17a8587ed0da7b21316a1ef9242a (patch) | |
tree | d39266d2ec7fcdf89b6aa475434bde21f954b0f0 | |
parent | 4cf41a56e960fa1d81459f9f2520df02629a06fa (diff) |
linux-gen: packet: implement TX completion poll mode
Modify existing TX completion request logic to support the new poll mode
and implement `odp_packet_tx_compl_done()`.
Signed-off-by: Tuomas Taipale <tuomas.taipale@nokia.com>
Reviewed-by: Matias Elo <matias.elo@nokia.com>
-rw-r--r-- | platform/linux-generic/odp_packet.c | 29 |
1 files changed, 22 insertions, 7 deletions
diff --git a/platform/linux-generic/odp_packet.c b/platform/linux-generic/odp_packet.c index f6f936b29..96fcd928a 100644 --- a/platform/linux-generic/odp_packet.c +++ b/platform/linux-generic/odp_packet.c @@ -2218,8 +2218,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; } @@ -2228,7 +2246,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) @@ -2255,10 +2273,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) |