From a6db7d56ba808f07f14361443f540feeaef58675 Mon Sep 17 00:00:00 2001 From: Benjamin Valentin Date: Mon, 22 Jun 2020 00:22:35 +0200 Subject: [PATCH] drivers/at86rf215: fix CCA duration The standard CCA backoff period is 8 symbols and only differs for MR-O-QPSK where it is dependent on the chip rate. --- drivers/at86rf215/at86rf215_fsk.c | 3 ++- drivers/at86rf215/at86rf215_o-qpsk.c | 6 ++++-- drivers/at86rf215/at86rf215_ofdm.c | 5 +++-- drivers/at86rf215/include/at86rf215_internal.h | 6 ------ sys/include/net/ieee802154.h | 17 ++++++++++++++++- 5 files changed, 25 insertions(+), 12 deletions(-) diff --git a/drivers/at86rf215/at86rf215_fsk.c b/drivers/at86rf215/at86rf215_fsk.c index fb5b48a4ab..863c082bc8 100644 --- a/drivers/at86rf215/at86rf215_fsk.c +++ b/drivers/at86rf215/at86rf215_fsk.c @@ -423,7 +423,8 @@ static void _set_ack_timeout(at86rf215_t *dev, bool mord4, bool fec) static void _set_csma_backoff_period(at86rf215_t *dev) { - dev->csma_backoff_period = AT86RF215_BACKOFF_PERIOD_IN_SYMBOLS * FSK_SYMBOL_TIME_US; + dev->csma_backoff_period = IEEE802154_CCA_DURATION_IN_SYMBOLS * FSK_SYMBOL_TIME_US + + IEEE802154G_ATURNAROUNDTIME_US; DEBUG("[%s] CSMA BACKOFF: %"PRIu32" µs\n", "FSK", dev->csma_backoff_period); } diff --git a/drivers/at86rf215/at86rf215_o-qpsk.c b/drivers/at86rf215/at86rf215_o-qpsk.c index ca78acd8b1..88f3095c3f 100644 --- a/drivers/at86rf215/at86rf215_o-qpsk.c +++ b/drivers/at86rf215/at86rf215_o-qpsk.c @@ -314,13 +314,15 @@ static void _set_ack_timeout(at86rf215_t *dev, uint8_t chips, uint8_t mode) static inline void _set_csma_backoff_period(at86rf215_t *dev, uint8_t chips) { - dev->csma_backoff_period = AT86RF215_BACKOFF_PERIOD_IN_SYMBOLS * _get_symbol_duration_us(chips); + dev->csma_backoff_period = _get_cca_duration_syms(chips) * _get_symbol_duration_us(chips) + + IEEE802154G_ATURNAROUNDTIME_US; DEBUG("[%s] CSMA BACKOFF: %"PRIu32" µs\n", "O-QPSK", dev->csma_backoff_period); } static inline void _set_csma_backoff_period_legacy(at86rf215_t *dev) { - dev->csma_backoff_period = AT86RF215_BACKOFF_PERIOD_IN_SYMBOLS * LEGACY_QPSK_SYMBOL_TIME_US; + dev->csma_backoff_period = (IEEE802154_ATURNAROUNDTIME_IN_SYMBOLS + IEEE802154_CCA_DURATION_IN_SYMBOLS) + * LEGACY_QPSK_SYMBOL_TIME_US; DEBUG("[%s] CSMA BACKOFF: %"PRIu32" µs\n", "legacy O-QPSK", dev->csma_backoff_period); } diff --git a/drivers/at86rf215/at86rf215_ofdm.c b/drivers/at86rf215/at86rf215_ofdm.c index fdb101dde9..aaed4aed3f 100644 --- a/drivers/at86rf215/at86rf215_ofdm.c +++ b/drivers/at86rf215/at86rf215_ofdm.c @@ -268,8 +268,9 @@ int at86rf215_configure_OFDM(at86rf215_t *dev, uint8_t option, uint8_t scheme) at86rf215_reg_write(dev, dev->BBC->RG_OFDMPHRTX, scheme); - dev->csma_backoff_period = AT86RF215_BACKOFF_PERIOD_IN_SYMBOLS * - OFDM_SYMBOL_TIME_US; + dev->csma_backoff_period = IEEE802154G_ATURNAROUNDTIME_US + + IEEE802154_CCA_DURATION_IN_SYMBOLS + * OFDM_SYMBOL_TIME_US; DEBUG("[%s] CSMA BACKOFF: %" PRIu32 " µs\n", "OFDM", dev->csma_backoff_period); diff --git a/drivers/at86rf215/include/at86rf215_internal.h b/drivers/at86rf215/include/at86rf215_internal.h index 39f849dae7..da2e1f3ac9 100644 --- a/drivers/at86rf215/include/at86rf215_internal.h +++ b/drivers/at86rf215/include/at86rf215_internal.h @@ -43,12 +43,6 @@ extern "C" { /** Default energy detect threshold for CSMA (reset value) */ #define AT86RF215_EDT_DEFAULT (-84) /* dBm */ -/** - * This is used to calculate the csma backoff based on the bitrate. - */ -/** 20 symbols is the std period length */ -#define AT86RF215_BACKOFF_PERIOD_IN_SYMBOLS (20U) - /** * Default Parameters for 802.15.4 retransmissions & CSMA * @{ diff --git a/sys/include/net/ieee802154.h b/sys/include/net/ieee802154.h index 11bc3b1257..607daa84fe 100644 --- a/sys/include/net/ieee802154.h +++ b/sys/include/net/ieee802154.h @@ -111,7 +111,22 @@ extern "C" { * * 802.15.4g, Table 70 (p. 43) */ -#define IEEE802154G_ATURNAROUNDTIME_US (1 * US_PER_MS) +#define IEEE802154G_ATURNAROUNDTIME_US (1 * US_PER_MS) + +/** + * IEEE Std 802.15.4-2020 + * Table 11-1—PHY constants: The value is 12 for all other PHYs. + */ +#define IEEE802154_ATURNAROUNDTIME_IN_SYMBOLS (12) + +/** + * IEEE Std 802.15.4-2020 + * Table 11-1—PHY constants: For all other PHYs¹, the duration of + * 8 symbol periods. + * + * [1] all but MR-O-QPSK + */ +#define IEEE802154_CCA_DURATION_IN_SYMBOLS (8) /** * @brief 802.15.4 PHY modes