Re: [PATCH wpan-next 01/20] net: mac802154: Allow the creation of coordinator interfaces
From: Alexander Aring <aahringo@redhat.com>
Date: 2022-09-03 19:40:55
Subsystem:
the rest · Maintainer:
Linus Torvalds
Hi, On Sat, Sep 3, 2022 at 3:10 PM Alexander Aring [off-list ref] wrote:
On Sat, Sep 3, 2022 at 3:07 PM Alexander Aring [off-list ref] wrote:quoted
Hi, On Sat, Sep 3, 2022 at 12:06 PM Miquel Raynal [off-list ref] wrote: ...quoted
On the Tx side, when sending eg. an association request or an association response, I must expect and wait for an ack. This is what I am struggling to do. How can I know that a frame which I just transmitted has been acked? Bonus points, how can I do that in such a way that it will work with other devices? (hints below)quoted
AACK will send a back if a frame with ack request bit was received.quoted
say in a commit) I have seen no further updates about it so I guess it's still not available. I don't see any other way to know if a frame's ack has been received or not reliably.You implemented it for the at86rf230 driver (the spi one which is what also atusb uses). You implemented the ctx->trac = IEEE802154_NO_ACK; which signals the upper layer that if the ack request bit is set, that there was no ack. But yea, there is a missing feature for atusb yet which requires firmware changes as well.:'(There is a sequence handling in tx done on atusb firmware and I think it should be pretty easy to add a byte for trac status.diff --git a/atusb/fw/mac.c b/atusb/fw/mac.c index 835002c..156bd95 100644 --- a/atusb/fw/mac.c +++ b/atusb/fw/mac.c@@ -116,7 +116,7 @@ static void receive_frame(void) static bool handle_irq(void) { - uint8_t irq; + uint8_t irq, data[2]; irq = reg_read(REG_IRQ_STATUS); if (!(irq & IRQ_TRX_END))@@ -124,7 +124,15 @@ static bool handle_irq(void) if (txing) { if (eps[1].state == EP_IDLE) { - usb_send(&eps[1], &this_seq, 1, tx_ack_done, NULL); + data[0] = tx_ack_done; + + spi_begin(); + spi_io(REG_TRX_STATE); + + data[1] = spi_recv(); + spi_end();data[1] = reg_read(REG_TRX_STATE) as seen above for REG_IRQ_STATUS would be better here...
after digging the code more, there is another queue case which we should handle, also correct using buffer parameter instead of the callback parameter which was stupid... However I think the direction is clear. Sorry for the spam.
diff --git a/atusb/fw/mac.c b/atusb/fw/mac.c
index 835002c..b52ba1a 100644
--- a/atusb/fw/mac.c
+++ b/atusb/fw/mac.c@@ -32,7 +32,7 @@ static uint8_t tx_buf[MAX_PSDU]; static uint8_t tx_size = 0; static bool txing = 0; static bool queued_tx_ack = 0; -static uint8_t next_seq, this_seq, queued_seq; +static uint8_t next_seq, this_seq, queued_seq, queued_tx_trac; /* ----- Receive buffer management ----------------------------------------- */
@@ -57,6 +57,7 @@ static void tx_ack_done(void *user); static void usb_next(void) { const uint8_t *buf; + uint8_t data[2]; if (rx_in != rx_out) { buf = rx_buf[rx_out];
@@ -65,7 +66,9 @@ static void usb_next(void) } if (queued_tx_ack) { - usb_send(&eps[1], &queued_seq, 1, tx_ack_done, NULL); + data[0] = queued_seq; + data[1] = queued_tx_trac; + usb_send(&eps[1], data, sizeof(data), tx_ack_done, NULL); queued_tx_ack = 0; } }
@@ -116,7 +119,7 @@ static void receive_frame(void) static bool handle_irq(void) { - uint8_t irq; + uint8_t irq, data[2]; irq = reg_read(REG_IRQ_STATUS); if (!(irq & IRQ_TRX_END))
@@ -124,10 +127,13 @@ static bool handle_irq(void) if (txing) { if (eps[1].state == EP_IDLE) { - usb_send(&eps[1], &this_seq, 1, tx_ack_done, NULL); + data[0] = this_seq; + data[1] = reg_read(REG_TRX_STATE); + usb_send(&eps[1], data, sizeof(data),
tx_ack_done, NULL);
} else {
queued_tx_ack = 1;
queued_seq = this_seq;
+ queued_tx_trac = reg_read(REG_TRX_STATE);
}
txing = 0;
return 1;