diff --git a/drivers/ieee802154/ieee802154_nrf5.c b/drivers/ieee802154/ieee802154_nrf5.c index 06c5e873cb0..966081358dc 100644 --- a/drivers/ieee802154/ieee802154_nrf5.c +++ b/drivers/ieee802154/ieee802154_nrf5.c @@ -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)