drivers: ieee802154: add option to retransmit a frame

Use the nrf_802154_retransmit_csma_ca_raw and
nrf_802154_retransmit_at_raw API to retry the frame transmission
after a failed attempt.

The retry must be performed only in response to
a nrf_802154_transmit_failed event.

Signed-off-by: Rafał Kuźnia <rafal.kuznia@nordicsemi.no>
This commit is contained in:
Rafał Kuźnia 2021-05-26 15:30:37 +02:00 committed by Jukka Rissanen
commit 9070190bc6

View file

@ -433,11 +433,19 @@ static bool nrf5_tx_at(struct net_pkt *pkt, bool cca)
uint32_t tx_at = net_pkt_txtime(pkt) / NSEC_PER_USEC;
bool ret;
ret = nrf_802154_transmit_raw_at(nrf5_data.tx_psdu,
cca,
tx_at - TXTIME_OFFSET_US,
TXTIME_OFFSET_US,
nrf_802154_channel_get());
if (net_pkt_ieee802154_frame_retry(pkt) == false) {
ret = nrf_802154_transmit_raw_at(nrf5_data.tx_psdu,
cca,
tx_at - TXTIME_OFFSET_US,
TXTIME_OFFSET_US,
nrf_802154_channel_get());
} else {
ret = nrf_802154_retransmit_raw_at(nrf5_data.tx_psdu,
cca,
tx_at - TXTIME_OFFSET_US,
TXTIME_OFFSET_US,
nrf_802154_channel_get());
}
if (nrf5_data.event_handler) {
LOG_WRN("TX_STARTED event will be triggered without delay");
}
@ -445,6 +453,15 @@ static bool nrf5_tx_at(struct net_pkt *pkt, bool cca)
}
#endif /* CONFIG_NET_PKT_TXTIME */
static void nrf5_tx_csma_ca(struct net_pkt *pkt, uint8_t *payload)
{
if (net_pkt_ieee802154_frame_retry(pkt) == false) {
nrf_802154_transmit_csma_ca_raw(payload);
} else {
nrf_802154_retransmit_csma_ca_raw(payload);
}
}
static int nrf5_tx(const struct device *dev,
enum ieee802154_tx_mode mode,
struct net_pkt *pkt,
@ -471,7 +488,7 @@ static int nrf5_tx(const struct device *dev,
ret = nrf_802154_transmit_raw(nrf5_radio->tx_psdu, true);
break;
case IEEE802154_TX_MODE_CSMA_CA:
nrf_802154_transmit_csma_ca_raw(nrf5_radio->tx_psdu);
nrf5_tx_csma_ca(pkt, nrf5_radio->tx_psdu);
break;
/* This function cannot be used in the serialized version yet. */
#if defined(CONFIG_NET_PKT_TXTIME) && !defined(CONFIG_NRF_802154_SER_HOST)