1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2025-12-29 16:31:18 +01:00

drivers/kw41zrf: make TX/RX IRQs read only

This brings the implementation in sync with the API.
This commit is contained in:
Marian Buschsieweke 2021-02-26 11:14:54 +01:00
parent fba104c2ce
commit 134f323fb1
No known key found for this signature in database
GPG Key ID: 61F64C6599B1539F
4 changed files with 10 additions and 87 deletions

View File

@ -33,10 +33,6 @@ extern "C" {
#define KW41ZRF_OPT_CSMA (0x01u) /**< use CSMA/CA algorithm for sending */
#define KW41ZRF_OPT_PROMISCUOUS (0x02u) /**< promiscuous mode active */
#define KW41ZRF_OPT_PRELOADING (0x04u) /**< preloading enabled */
#define KW41ZRF_OPT_TELL_TX_START (0x08u) /**< notify MAC layer on TX start */
#define KW41ZRF_OPT_TELL_TX_END (0x10u) /**< notify MAC layer on TX finished */
#define KW41ZRF_OPT_TELL_RX_START (0x20u) /**< notify MAC layer on RX start */
#define KW41ZRF_OPT_TELL_RX_END (0x40u) /**< notify MAC layer on RX finished */
#define KW41ZRF_OPT_AUTOACK (0x80u) /**< automatic sending of ACKs */
#define KW41ZRF_OPT_ACK_PENDING (0x81u) /**< set pending bit on auto ACKs */
/** @} */

View File

@ -96,6 +96,9 @@ int kw41zrf_init(kw41zrf_t *dev, kw41zrf_cb_t cb)
/* Allow radio interrupts */
kw41zrf_unmask_irqs();
DEBUG("[kw41zrf] enabling RX start IRQs\n");
bit_clear32(&ZLL->PHY_CTRL, ZLL_PHY_CTRL_RX_WMRK_MSK_SHIFT);
DEBUG("[kw41zrf] init finished\n");
return 0;

View File

@ -195,7 +195,6 @@ void kw41zrf_set_option(kw41zrf_t *dev, uint8_t option, uint8_t state)
case KW41ZRF_OPT_PROMISCUOUS:
case KW41ZRF_OPT_AUTOACK:
case KW41ZRF_OPT_ACK_PENDING:
case KW41ZRF_OPT_TELL_RX_START:
LOG_ERROR("[kw41zrf] Attempt to modify option %04x while radio is sleeping\n",
(unsigned) option);
assert(0);
@ -234,22 +233,6 @@ void kw41zrf_set_option(kw41zrf_t *dev, uint8_t option, uint8_t state)
bit_set32(&ZLL->SAM_TABLE, ZLL_SAM_TABLE_ACK_FRM_PND_SHIFT);
break;
case KW41ZRF_OPT_TELL_RX_START:
DEBUG("[kw41zrf] enable: TELL_RX_START\n");
bit_clear32(&ZLL->PHY_CTRL, ZLL_PHY_CTRL_RX_WMRK_MSK_SHIFT);
break;
case KW41ZRF_OPT_TELL_RX_END:
DEBUG("[kw41zrf] enable: TELL_RX_END\n");
break;
case KW41ZRF_OPT_TELL_TX_END:
DEBUG("[kw41zrf] enable: TELL_TX_END\n");
break;
case KW41ZRF_OPT_TELL_TX_START:
DEBUG("[kw41zrf] enable: TELL_TX_START (ignored)\n");
default:
/* do nothing */
break;
@ -280,21 +263,6 @@ void kw41zrf_set_option(kw41zrf_t *dev, uint8_t option, uint8_t state)
bit_clear32(&ZLL->SAM_TABLE, ZLL_SAM_TABLE_ACK_FRM_PND_SHIFT);
break;
case KW41ZRF_OPT_TELL_RX_START:
DEBUG("[kw41zrf] disable: TELL_RX_START\n");
bit_set32(&ZLL->PHY_CTRL, ZLL_PHY_CTRL_RX_WMRK_MSK_SHIFT);
break;
case KW41ZRF_OPT_TELL_RX_END:
DEBUG("[kw41zrf] disable: TELL_RX_END\n");
break;
case KW41ZRF_OPT_TELL_TX_END:
DEBUG("[kw41zrf] disable: TELL_TX_END\n");
break;
case KW41ZRF_OPT_TELL_TX_START:
DEBUG("[kw41zrf] disable: TELL_TX_START (ignored)\n");
default:
/* do nothing */
break;

View File

@ -457,27 +457,11 @@ int kw41zrf_netdev_get(netdev_t *netdev, netopt_t opt, void *value, size_t len)
return sizeof(netopt_enable_t);
case NETOPT_RX_START_IRQ:
assert(len >= sizeof(netopt_enable_t));
*((netopt_enable_t *)value) =
!!(dev->flags & KW41ZRF_OPT_TELL_RX_START);
return sizeof(netopt_enable_t);
case NETOPT_RX_END_IRQ:
assert(len >= sizeof(netopt_enable_t));
*((netopt_enable_t *)value) =
!!(dev->flags & KW41ZRF_OPT_TELL_RX_END);
return sizeof(netopt_enable_t);
case NETOPT_TX_START_IRQ:
assert(len >= sizeof(netopt_enable_t));
*((netopt_enable_t *)value) =
!!(dev->flags & KW41ZRF_OPT_TELL_TX_START);
return sizeof(netopt_enable_t);
case NETOPT_TX_END_IRQ:
assert(len >= sizeof(netopt_enable_t));
*((netopt_enable_t *)value) =
!!(dev->flags & KW41ZRF_OPT_TELL_TX_END);
*((netopt_enable_t *)value) = NETOPT_ENABLE;
return sizeof(netopt_enable_t);
case NETOPT_CSMA:
@ -661,27 +645,6 @@ static int kw41zrf_netdev_set(netdev_t *netdev, netopt_t opt, const void *value,
res = sizeof(const netopt_enable_t);
break;
case NETOPT_RX_END_IRQ:
assert(len <= sizeof(const netopt_enable_t));
kw41zrf_set_option(dev, KW41ZRF_OPT_TELL_RX_END,
*((const netopt_enable_t *)value));
res = sizeof(const netopt_enable_t);
break;
case NETOPT_TX_START_IRQ:
assert(len <= sizeof(const netopt_enable_t));
kw41zrf_set_option(dev, KW41ZRF_OPT_TELL_TX_START,
*((const netopt_enable_t *)value));
res = sizeof(const netopt_enable_t);
break;
case NETOPT_TX_END_IRQ:
assert(len <= sizeof(const netopt_enable_t));
kw41zrf_set_option(dev, KW41ZRF_OPT_TELL_TX_END,
*((const netopt_enable_t *)value));
res = sizeof(const netopt_enable_t);
break;
case NETOPT_CSMA_RETRIES:
assert(len <= sizeof(uint8_t));
dev->csma_max_backoffs = *((const uint8_t*)value);
@ -765,13 +728,6 @@ static int kw41zrf_netdev_set(netdev_t *netdev, netopt_t opt, const void *value,
res = sizeof(const netopt_enable_t);
break;
case NETOPT_RX_START_IRQ:
assert(len <= sizeof(const netopt_enable_t));
kw41zrf_set_option(dev, KW41ZRF_OPT_TELL_RX_START,
*((const netopt_enable_t *)value));
res = sizeof(const netopt_enable_t);
break;
case NETOPT_CSMA:
assert(len <= sizeof(const netopt_enable_t));
kw41zrf_set_option(dev, KW41ZRF_OPT_CSMA,
@ -931,7 +887,7 @@ static uint32_t _isr_event_seq_t_ccairq(kw41zrf_t *dev, uint32_t irqsts)
kw41zrf_abort_sequence(dev);
kw41zrf_set_sequence(dev, dev->idle_seq);
if (dev->flags & KW41ZRF_OPT_TELL_TX_END) {
if (dev->netdev.netdev.event_callback) {
dev->netdev.netdev.event_callback(&dev->netdev.netdev, NETDEV_EVENT_TX_MEDIUM_BUSY);
LOG_INFO("[kw41zrf] dropping frame after %u backoffs\n",
dev->csma_num_backoffs);
@ -945,7 +901,7 @@ static uint32_t _isr_event_seq_t_ccairq(kw41zrf_t *dev, uint32_t irqsts)
ZLL_LQI_AND_RSSI_CCA1_ED_FNL_SHIFT),
dev->csma_num_backoffs
);
if (dev->flags & KW41ZRF_OPT_TELL_TX_START) {
if (dev->netdev.netdev.event_callback) {
/* TX will start automatically after CCA check succeeded */
dev->netdev.netdev.event_callback(&dev->netdev.netdev, NETDEV_EVENT_TX_STARTED);
}
@ -962,7 +918,7 @@ static uint32_t _isr_event_seq_r(kw41zrf_t *dev, uint32_t irqsts)
if (irqsts & ZLL_IRQSTS_RXWTRMRKIRQ_MASK) {
DEBUG("[kw41zrf] RXWTRMRKIRQ (R)\n");
handled_irqs |= ZLL_IRQSTS_RXWTRMRKIRQ_MASK;
if (dev->flags & KW41ZRF_OPT_TELL_RX_START) {
if (dev->netdev.netdev.event_callback) {
dev->netdev.netdev.event_callback(&dev->netdev.netdev, NETDEV_EVENT_RX_STARTED);
}
}
@ -1017,7 +973,7 @@ static uint32_t _isr_event_seq_r(kw41zrf_t *dev, uint32_t irqsts)
/* Block XCVSEQ_RECEIVE until netdev->recv has been called */
dev->recv_blocked = 1;
kw41zrf_set_sequence(dev, dev->idle_seq);
if (dev->flags & KW41ZRF_OPT_TELL_RX_END) {
if (dev->netdev.netdev.event_callback) {
dev->netdev.netdev.event_callback(&dev->netdev.netdev, NETDEV_EVENT_RX_COMPLETE);
}
return handled_irqs;
@ -1045,7 +1001,7 @@ static uint32_t _isr_event_seq_t(kw41zrf_t *dev, uint32_t irqsts)
DEBUG("[kw41zrf] SEQIRQ (T)\n");
handled_irqs |= ZLL_IRQSTS_SEQIRQ_MASK;
if (dev->flags & KW41ZRF_OPT_TELL_TX_END) {
if (dev->netdev.netdev.event_callback) {
dev->netdev.netdev.event_callback(&dev->netdev.netdev, NETDEV_EVENT_TX_COMPLETE);
}
KW41ZRF_LED_TX_OFF;
@ -1126,7 +1082,7 @@ static uint32_t _isr_event_seq_tr(kw41zrf_t *dev, uint32_t irqsts)
assert(!kw41zrf_is_dsm());
kw41zrf_set_sequence(dev, dev->idle_seq);
if (dev->flags & KW41ZRF_OPT_TELL_TX_END) {
if (dev->netdev.netdev.event_callback) {
if (seq_ctrl_sts & ZLL_SEQ_CTRL_STS_TC3_ABORTED_MASK) {
LOG_DEBUG("[kw41zrf] RXACK timeout (TR)\n");
dev->netdev.netdev.event_callback(&dev->netdev.netdev, NETDEV_EVENT_TX_NOACK);