Skip to content

Commit bd3c09a

Browse files
c1728p90xc0170
authored andcommitted
Always call xfer done if there is a data stage
Call callback_request_xfer_done regardless of if the current transfer is aborted if complete_request is called with a buffer to send or fill. This makes memory management much easier. This patch also adds an aborted parameter to callback_request_xfer_done so the code can check if the transfer was aborted.
1 parent cbfb929 commit bd3c09a

File tree

4 files changed

+20
-6
lines changed

4 files changed

+20
-6
lines changed

TESTS/usb_device/basic/USBTester.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,8 +108,13 @@ void USBTester::callback_request(const setup_packet_t *setup)
108108

109109
}
110110

111-
void USBTester::callback_request_xfer_done(const setup_packet_t *setup)
111+
void USBTester::callback_request_xfer_done(const setup_packet_t *setup, bool aborted)
112112
{
113+
if (aborted) {
114+
complete_request_xfer_done(false);
115+
return;
116+
}
117+
113118
bool result = false;
114119
if (setup->bmRequestType.Type == VENDOR_TYPE) {
115120
switch (setup->bRequest) {

TESTS/usb_device/basic/USBTester.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ class USBTester: public USBDevice {
7979

8080
virtual void callback_state_change(DeviceState new_state);
8181
virtual void callback_request(const setup_packet_t *setup);
82-
virtual void callback_request_xfer_done(const setup_packet_t *setup);
82+
virtual void callback_request_xfer_done(const setup_packet_t *setup, bool aborted);
8383
virtual void callback_set_configuration(uint8_t configuration);
8484
virtual void callback_set_interface(uint16_t interface, uint8_t alternate);
8585
virtual void epbulk_out_callback(usb_ep_t endpoint);

usb/device/USBDevice/USBDevice.cpp

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,8 @@ bool USBDevice::_control_out()
218218
if (_transfer.notify) {
219219
/* Notify class layer. */
220220
_transfer.notify = false;
221-
callback_request_xfer_done(&_transfer.setup);
221+
_transfer.user_callback = true;
222+
callback_request_xfer_done(&_transfer.setup, false);
222223
} else {
223224
complete_request_xfer_done(true);
224225
}
@@ -279,7 +280,7 @@ bool USBDevice::_control_in()
279280
/* Notify class layer. */
280281
_transfer.notify = false;
281282
_transfer.user_callback = true;
282-
callback_request_xfer_done(&_transfer.setup);
283+
callback_request_xfer_done(&_transfer.setup, false);
283284
} else {
284285
complete_request_xfer_done(true);
285286
}
@@ -639,7 +640,12 @@ void USBDevice::complete_request(RequestResult direction, uint8_t *data, uint32_
639640

640641
_transfer.user_callback = false;
641642
if (_abort_control) {
642-
_control_abort();
643+
if ((direction == Receive) || (direction == Send)) {
644+
_transfer.user_callback = true;
645+
callback_request_xfer_done(&_transfer.setup, true);
646+
} else {
647+
_control_abort();
648+
}
643649
unlock();
644650
return;
645651
}

usb/device/USBDevice/USBDevice.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -394,9 +394,12 @@ class USBDevice: public USBPhyEvents {
394394
* The function complete_request_xfer_done must be always be called
395395
* in response to this callback.
396396
*
397+
* @param setup Setup packet of the current request
398+
* @param aborted false if the operation was aborted, true otherwise
399+
*
397400
* Warning: Called in ISR context
398401
*/
399-
virtual void callback_request_xfer_done(const setup_packet_t *setup) = 0;
402+
virtual void callback_request_xfer_done(const setup_packet_t *setup, bool aborted) = 0;
400403

401404
/**
402405
* Called to complete the data stage of a callback request

0 commit comments

Comments
 (0)