From 2fba08cf422e64a21bd729043c8d536454a85d01 Mon Sep 17 00:00:00 2001 From: Martin Ling Date: Tue, 29 Mar 2022 23:40:08 +0100 Subject: [PATCH] Reset endpoint specified in request, not the one it arrived on. --- firmware/common/usb.c | 2 +- firmware/common/usb.h | 4 ++++ firmware/common/usb_standard_request.c | 5 ++++- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/firmware/common/usb.c b/firmware/common/usb.c index 0a36af42..6cbb3296 100644 --- a/firmware/common/usb.c +++ b/firmware/common/usb.c @@ -44,7 +44,7 @@ usb_queue_head_t* usb_queue_head( return &usb_qh[USB_QH_INDEX(endpoint_address)]; } -static usb_endpoint_t* usb_endpoint_from_address( +usb_endpoint_t* usb_endpoint_from_address( const uint_fast8_t endpoint_address ) { return (usb_endpoint_t*)usb_queue_head(endpoint_address)->_reserved_0; diff --git a/firmware/common/usb.h b/firmware/common/usb.h index dcc2d876..69190517 100644 --- a/firmware/common/usb.h +++ b/firmware/common/usb.h @@ -58,6 +58,10 @@ void usb_set_address_deferred( const uint_fast8_t address ); +usb_endpoint_t* usb_endpoint_from_address( + const uint_fast8_t endpoint_address +); + void usb_endpoint_init( const usb_endpoint_t* const endpoint ); diff --git a/firmware/common/usb_standard_request.c b/firmware/common/usb_standard_request.c index 7444368b..b9e1e9fd 100644 --- a/firmware/common/usb_standard_request.c +++ b/firmware/common/usb_standard_request.c @@ -369,9 +369,12 @@ static usb_request_status_t usb_standard_request_get_status( static usb_request_status_t usb_standard_request_clear_feature_setup( usb_endpoint_t* const endpoint) { + switch (endpoint->setup.value) { case USB_FEATURE_SELECTOR_ENDPOINT_HALT: - usb_endpoint_reset_data_toggle(endpoint); + usb_endpoint_reset_data_toggle( + usb_endpoint_from_address(endpoint->setup.index) + ); return USB_REQUEST_STATUS_OK; default: return USB_REQUEST_STATUS_STALL;