Abort the current USB transfer when stalling

It is undefined behavior if stalling and unstalling clears an ongoing
transfer. Abort any ongoing transfers explicitly when stalling and
unstalling so the behavior is consistent across devices.
pull/9768/head
Russ Butler 2018-06-21 10:19:40 -05:00
parent c76d80e36e
commit dbe41c3659
2 changed files with 15 additions and 0 deletions

View File

@ -1151,6 +1151,10 @@ void USBDevice::endpoint_stall(usb_ep_t endpoint)
info->flags |= ENDPOINT_STALLED;
_phy->endpoint_stall(endpoint);
if (info->pending) {
endpoint_abort(endpoint);
}
unlock();
}
@ -1172,6 +1176,10 @@ void USBDevice::endpoint_unstall(usb_ep_t endpoint)
return;
}
if (info->pending) {
endpoint_abort(endpoint);
}
info->flags &= ~ENDPOINT_STALLED;
_phy->endpoint_unstall(endpoint);

View File

@ -178,6 +178,9 @@ public:
/**
* Stall an endpoint
*
* If there is an ongoing transfer on this endpoint then it will
* be aborted.
*
* @param endpoint Endpoint to stall
* @note You cannot stall endpoint 0 with this function
* @note This endpoint must already have been setup with endpoint_add
@ -187,6 +190,10 @@ public:
/**
* Unstall an endpoint
*
* Unstalling an endpoint resets data toggle back to DATA0.
* Additionally, if there is an ongoing transfer on this endpoint
* it will be aborted.
*
* @param endpoint Endpoint to unstall
* @note This endpoint must already have been setup with endpoint_add
*/