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>
This commit is contained in:
parent
86cf5829a4
commit
0bad09c7fa
|
@ -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;
|
|||
#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)
|
|||
{
|
||||
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,
|
|||
|
||||
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)
|
|||
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)
|
|||
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…
Reference in a new issue