Re: [PATCH wpan-next 01/20] net: mac802154: Allow the creation of coordinator interfaces
From: Miquel Raynal <miquel.raynal@bootlin.com>
Date: 2022-09-05 03:16:26
Hi Alexander, aahringo@redhat.com wrote on Sat, 3 Sep 2022 15:40:35 -0400:
Hi, On Sat, Sep 3, 2022 at 3:10 PM Alexander Aring [off-list ref] wrote:quoted
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.
Don't be, your feedback is just super useful.
quoted hunk ↗ jump to hunk
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];
I don't know why, but defining data on the stack just does not work. Defining it above with the other static variables is okay. I won't fight more for "today" but if someone has an explanation I am all hears.
quoted hunk ↗ jump to hunk
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;
Thanks, Miquèl