From 58f2ee34fa7b6fc04c41acff221d7e916467f7b9 Mon Sep 17 00:00:00 2001 From: Vegard Storheil Eriksen Date: Thu, 27 Apr 2017 17:07:13 +0200 Subject: [PATCH] usb: Ensure control events are handled in order Use EP0 OUT flow control to NAK OUT packets when we're not yet expecting any. This prevents the status OUT event from arriving while the control state machine is still expecting the data IN completion event. --- lib/usb/usb_control.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/usb/usb_control.c b/lib/usb/usb_control.c index 9d5884f3..5bd45a35 100644 --- a/lib/usb/usb_control.c +++ b/lib/usb/usb_control.c @@ -211,6 +211,8 @@ static void usb_control_setup_write(usbd_device *usbd_dev, } else { usbd_dev->control_state.state = LAST_DATA_OUT; } + + usbd_ep_nak_set(usbd_dev, 0, 0); } /* Do not appear to belong to the API, so are omitted from docs */ @@ -223,6 +225,8 @@ void _usbd_control_setup(usbd_device *usbd_dev, uint8_t ea) usbd_dev->control_state.complete = NULL; + usbd_ep_nak_set(usbd_dev, 0, 1); + if (usbd_ep_read_packet(usbd_dev, 0, req, 8) != 8) { stall_transaction(usbd_dev); return; @@ -294,6 +298,7 @@ void _usbd_control_in(usbd_device *usbd_dev, uint8_t ea) break; case LAST_DATA_IN: usbd_dev->control_state.state = STATUS_OUT; + usbd_ep_nak_set(usbd_dev, 0, 0); break; case STATUS_IN: if (usbd_dev->control_state.complete) {