Browse Source

drivers: ieee802154: nrf5: support raw mode

When CONFIG_IEEE802154_RAW_MODE is set there is no network interface
that could provide pointer to the device the interface is running on top
of. The current implementation of nRF5 ieee802154 driver implicitly
assumes that such an interface is always present, which leads to crashes
when raw mode is enabled.

This commit adds support for IEEE802154_RAW_MODE in nRF5 ieee802154
driver by latching pointer to the ieee802154 device on initialization if
needed so that it doesn't have to be retrieved using the network
interface in run-time.

Signed-off-by: Jędrzej Ciupis <jedrzej.ciupis@nordicsemi.no>
pull/65669/head
Jędrzej Ciupis 2 years ago committed by Carles Cufí
parent
commit
0bad09c7fa
  1. 21
      drivers/ieee802154/ieee802154_nrf5.c

21
drivers/ieee802154/ieee802154_nrf5.c

@ -57,6 +57,9 @@ struct nrf5_802154_config { @@ -57,6 +57,9 @@ struct nrf5_802154_config {
};
static struct nrf5_802154_data nrf5_data;
#if defined(CONFIG_IEEE802154_RAW_MODE)
static const struct device *nrf5_dev;
#endif
#define DRX_SLOT_RX 0 /* Delayed reception window ID */
@ -95,6 +98,15 @@ static struct nrf5_802154_data nrf5_data; @@ -95,6 +98,15 @@ static struct nrf5_802154_data nrf5_data;
#define IEEE802154_NRF5_VENDOR_OUI (uint32_t)0xF4CE36
#endif
static inline const struct device *nrf5_get_device(void)
{
#if defined(CONFIG_IEEE802154_RAW_MODE)
return nrf5_dev;
#else
return net_if_get_device(nrf5_data.iface);
#endif
}
static void nrf5_get_eui64(uint8_t *mac)
{
uint64_t factoryAddress;
@ -726,6 +738,9 @@ static int nrf5_init(const struct device *dev) @@ -726,6 +738,9 @@ static int nrf5_init(const struct device *dev)
{
const struct nrf5_802154_config *nrf5_radio_cfg = NRF5_802154_CFG(dev);
struct nrf5_802154_data *nrf5_radio = NRF5_802154_DATA(dev);
#if defined(CONFIG_IEEE802154_RAW_MODE)
nrf5_dev = dev;
#endif
k_fifo_init(&nrf5_radio->rx_fifo);
k_sem_init(&nrf5_radio->tx_wait, 0, 1);
@ -1046,7 +1061,7 @@ void nrf_802154_received_timestamp_raw(uint8_t *data, int8_t power, uint8_t lqi, @@ -1046,7 +1061,7 @@ void nrf_802154_received_timestamp_raw(uint8_t *data, int8_t power, uint8_t lqi,
void nrf_802154_receive_failed(nrf_802154_rx_error_t error, uint32_t id)
{
const struct device *dev = net_if_get_device(nrf5_data.iface);
const struct device *dev = nrf5_get_device();
#if defined(CONFIG_IEEE802154_CSL_ENDPOINT)
if (id == DRX_SLOT_RX) {
@ -1165,7 +1180,7 @@ void nrf_802154_energy_detected(const nrf_802154_energy_detected_t *result) @@ -1165,7 +1180,7 @@ void nrf_802154_energy_detected(const nrf_802154_energy_detected_t *result)
energy_scan_done_cb_t callback = nrf5_data.energy_scan_done;
nrf5_data.energy_scan_done = NULL;
callback(net_if_get_device(nrf5_data.iface), result->ed_dbm);
callback(nrf5_get_device(), result->ed_dbm);
}
}
@ -1175,7 +1190,7 @@ void nrf_802154_energy_detection_failed(nrf_802154_ed_error_t error) @@ -1175,7 +1190,7 @@ void nrf_802154_energy_detection_failed(nrf_802154_ed_error_t error)
energy_scan_done_cb_t callback = nrf5_data.energy_scan_done;
nrf5_data.energy_scan_done = NULL;
callback(net_if_get_device(nrf5_data.iface), SHRT_MAX);
callback(nrf5_get_device(), SHRT_MAX);
}
}

Loading…
Cancel
Save