Hi, On Sun, Sep 4, 2022 at 11:16 PM Miquel Raynal <miquel.raynal@xxxxxxxxxxx> wrote: > > Hi Alexander, > > aahringo@xxxxxxxxxx wrote on Sat, 3 Sep 2022 15:40:35 -0400: > > > Hi, > > > > On Sat, Sep 3, 2022 at 3:10 PM Alexander Aring <aahringo@xxxxxxxxxx> wrote: > > > > > > On Sat, Sep 3, 2022 at 3:07 PM Alexander Aring <aahringo@xxxxxxxxxx> wrote: > > > > > > > > Hi, > > > > > > > > On Sat, Sep 3, 2022 at 12:06 PM Miquel Raynal <miquel.raynal@xxxxxxxxxxx> wrote: > > > > ... > > > > > > > > > > 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) > > > > > > > > > > > AACK will send a back if a frame with ack request bit was received. > > > > > > > > > > > > > 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. > > > 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); This is also broken, see below. > > 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. I can explain it... following the usb_send() it will end in usb_io() and this is an asynchronous function to use somehow the USB IP core API of the mcu... it's wrong to use a stack variable here because it can be overwritten. I am sorry, I did not keep that in mind... - Alex