Flush bulk endpoints from USB ISR on mode change request.
The previous change moved this flush from the vendor request handler to the transceiver_shutdown() function which runs outside ISR context. However, without this flush in the ISR, the firmware can sometimes end up stuck in TX or RX mode after a request to go IDLE. It's still not clear how this happens, but keeping the flush in the USB ISR fixes it, and as soon as a mode change is requested we know we are going to be flushing anyway, so there is no harm to do so here. This commit does not remove the flush in transceiver_shutdown(), because it is possible that the ISR will return just before the transceiver loop queues a new transfer. Rather than try to avoid that race, we can just flush again later.
This commit is contained in:
@ -251,6 +251,9 @@ volatile transceiver_request_t transceiver_request = {
|
||||
// Must be called from an atomic context (normally USB ISR)
|
||||
void request_transceiver_mode(transceiver_mode_t mode)
|
||||
{
|
||||
usb_endpoint_flush(&usb_endpoint_bulk_in);
|
||||
usb_endpoint_flush(&usb_endpoint_bulk_out);
|
||||
|
||||
transceiver_request.mode = mode;
|
||||
transceiver_request.seq++;
|
||||
}
|
||||
|
Reference in New Issue
Block a user