From 4421782b7fb49e160b1c18f2295e6cd1f0b00c04 Mon Sep 17 00:00:00 2001 From: Dean Camera Date: Wed, 5 Aug 2009 11:39:28 +0000 Subject: Make Control Endpoint stream transfers more reliable by adding in early aborts for unexpected new SETUP tokens, or unexpected status stage during control stream writes. Fix corruption in Device RNDIS demos TCP stack when too many connections attempted simultaneously, freezing the device when a page was re-fetched before the first connection was closed. Fix incorrect model compatibility information in the Host LowLevel demo overview text files. --- LUFA/Drivers/USB/LowLevel/Endpoint.c | 2 +- .../Template/Template_Endpoint_Control_R.c | 11 ++++-- .../Template/Template_Endpoint_Control_W.c | 44 +++++++++------------- 3 files changed, 26 insertions(+), 31 deletions(-) (limited to 'LUFA/Drivers') diff --git a/LUFA/Drivers/USB/LowLevel/Endpoint.c b/LUFA/Drivers/USB/LowLevel/Endpoint.c index e4d01404d..8b3922a4a 100644 --- a/LUFA/Drivers/USB/LowLevel/Endpoint.c +++ b/LUFA/Drivers/USB/LowLevel/Endpoint.c @@ -76,7 +76,7 @@ void Endpoint_ClearStatusStage(void) if (USB_ControlRequest.bmRequestType & REQDIR_DEVICETOHOST) { while (!(Endpoint_IsOUTReceived())) - { + { if (USB_DeviceState == DEVICE_STATE_Unattached) return; } diff --git a/LUFA/Drivers/USB/LowLevel/Template/Template_Endpoint_Control_R.c b/LUFA/Drivers/USB/LowLevel/Template/Template_Endpoint_Control_R.c index b85705c22..a2a0c3bd5 100644 --- a/LUFA/Drivers/USB/LowLevel/Template/Template_Endpoint_Control_R.c +++ b/LUFA/Drivers/USB/LowLevel/Template/Template_Endpoint_Control_R.c @@ -4,6 +4,12 @@ uint8_t TEMPLATE_FUNC_NAME (void* Buffer, uint16_t Length) while (Length) { + if (Endpoint_IsSETUPReceived()) + return ENDPOINT_RWCSTREAM_HostAborted; + + if (USB_DeviceState == DEVICE_STATE_Unattached) + return ENDPOINT_RWCSTREAM_DeviceDisconnected; + if (Endpoint_IsOUTReceived()) { while (Length && Endpoint_BytesInEndpoint()) @@ -13,10 +19,7 @@ uint8_t TEMPLATE_FUNC_NAME (void* Buffer, uint16_t Length) } Endpoint_ClearOUT(); - } - - if (USB_DeviceState == DEVICE_STATE_Unattached) - return ENDPOINT_RWCSTREAM_DeviceDisconnected; + } } while (!(Endpoint_IsINReady())) diff --git a/LUFA/Drivers/USB/LowLevel/Template/Template_Endpoint_Control_W.c b/LUFA/Drivers/USB/LowLevel/Template/Template_Endpoint_Control_W.c index 43a9f3d42..6c1445ee0 100644 --- a/LUFA/Drivers/USB/LowLevel/Template/Template_Endpoint_Control_W.c +++ b/LUFA/Drivers/USB/LowLevel/Template/Template_Endpoint_Control_W.c @@ -6,36 +6,28 @@ uint8_t TEMPLATE_FUNC_NAME (void* Buffer, uint16_t Length) if (Length > USB_ControlRequest.wLength) Length = USB_ControlRequest.wLength; - while (Length && !(Endpoint_IsOUTReceived())) + while (Length || LastPacketFull) { - while (!(Endpoint_IsINReady())) - { - if (USB_DeviceState == DEVICE_STATE_Unattached) - return ENDPOINT_RWCSTREAM_DeviceDisconnected; - } - - while (Length && (Endpoint_BytesInEndpoint() < USB_ControlEndpointSize)) - { - TEMPLATE_TRANSFER_BYTE(DataStream); - Length--; - } + if (Endpoint_IsSETUPReceived()) + return ENDPOINT_RWCSTREAM_HostAborted; + + if (Endpoint_IsOUTReceived()) + break; - LastPacketFull = (Endpoint_BytesInEndpoint() == USB_ControlEndpointSize); - Endpoint_ClearIN(); - } - - if (Endpoint_IsOUTReceived()) - return ENDPOINT_RWCSTREAM_HostAborted; - - if (LastPacketFull) - { - while (!(Endpoint_IsINReady())) + if (USB_DeviceState == DEVICE_STATE_Unattached) + return ENDPOINT_RWCSTREAM_DeviceDisconnected; + + if (Endpoint_IsINReady()) { - if (USB_DeviceState == DEVICE_STATE_Unattached) - return ENDPOINT_RWCSTREAM_DeviceDisconnected; + while (Length && (Endpoint_BytesInEndpoint() < USB_ControlEndpointSize)) + { + TEMPLATE_TRANSFER_BYTE(DataStream); + Length--; + } + + LastPacketFull = (Endpoint_BytesInEndpoint() == USB_ControlEndpointSize); + Endpoint_ClearIN(); } - - Endpoint_ClearIN(); } while (!(Endpoint_IsOUTReceived())) -- cgit v1.2.3