Fix sending in data that is a multiple of the max packet size.

This commit is contained in:
Jacob Young 2021-04-13 15:36:05 -04:00
commit 397ab473a9

View file

@ -819,6 +819,7 @@ DECLARE_CALLBACK(get_object);
DECLARE_CALLBACK(send_object_info);
DECLARE_CALLBACK(send_object_container);
DECLARE_CALLBACK(send_object);
DECLARE_CALLBACK(zlp_data_in);
DECLARE_CALLBACK(final_data_in);
DECLARE_CALLBACK(response);
DECLARE_CALLBACK(event);
@ -955,33 +956,6 @@ static usb_error_t schedule_ok_response(
params, param_count, global);
}
static usb_error_t schedule_data_in_response(
usb_endpoint_t endpoint,
const void *data,
size_t data_size,
mtp_global_t *global) {
usb_error_t error;
global->transaction.container.length.size =
sizeof(mtp_container_t) +
data_size;
global->transaction.container.type =
MTP_BT_DATA;
error = usb_ScheduleBulkTransfer(
endpoint = get_endpoint(
endpoint, MTP_EP_DATA_IN),
&global->transaction,
sizeof(mtp_container_t),
NULL,
global);
if (error) return error;
return usb_ScheduleBulkTransfer(
endpoint,
(void *)data,
data_size,
final_data_in_complete,
global);
}
static usb_error_t schedule_data_in(
usb_endpoint_t endpoint,
size_t data_size,
@ -1001,6 +975,27 @@ static usb_error_t schedule_data_in(
global);
}
static usb_error_t schedule_data_in_response(
usb_endpoint_t endpoint,
const void *data,
size_t data_size,
mtp_global_t *global) {
usb_error_t error = schedule_data_in(
endpoint, data_size, NULL, global);
if (error == USB_SUCCESS)
error = usb_ScheduleBulkTransfer(
get_endpoint(endpoint,
MTP_EP_DATA_IN),
(void *)data,
data_size,
data_size &&
!(data_size % MTP_MAX_BULK_PKT_SZ)
? zlp_data_in_complete
: final_data_in_complete,
global);
return error;
}
static usb_error_t status_error(
usb_transfer_status_t status) {
printf("transfer status = %02X\n", status);
@ -2144,6 +2139,18 @@ DEFINE_CALLBACK(send_object) {
endpoint, response, NULL, 0, global);
}
DEFINE_CALLBACK(zlp_data_in) {
(void)transferred;
if (status != USB_TRANSFER_COMPLETED)
return status_error(status);
if (global->reset)
return schedule_command(endpoint, global);
return usb_ScheduleBulkTransfer(
endpoint, NULL, 0,
final_data_in_complete,
global);
}
DEFINE_CALLBACK(final_data_in) {
(void)transferred;
if (status != USB_TRANSFER_COMPLETED)