Browse Source

usb: device_next: keep loopback function transfers going

Do not report canceled transfers as an error and continue the transfers
regardless of the previous transfer status.

Signed-off-by: Johann Fischer <johann.fischer@nordicsemi.no>
pull/87538/head
Johann Fischer 4 months ago committed by Benjamin Cabé
parent
commit
87caef4389
  1. 43
      subsys/usb/device_next/class/loopback.c

43
subsys/usb/device_next/class/loopback.c

@ -157,49 +157,42 @@ static int lb_request_handler(struct usbd_class_data *const c_data,
{ {
struct udc_buf_info *bi = (struct udc_buf_info *)net_buf_user_data(buf); struct udc_buf_info *bi = (struct udc_buf_info *)net_buf_user_data(buf);
struct lb_data *data = usbd_class_get_private(c_data); struct lb_data *data = usbd_class_get_private(c_data);
const size_t len = buf->len;
LOG_DBG("Transfer finished %s -> ep 0x%02x, len %u, err %d", const uint8_t ep = bi->ep;
c_data->name, bi->ep, buf->len, err); int ret = 0;
if (bi->ep == lb_get_bulk_out(c_data)) { if (bi->ep == lb_get_bulk_out(c_data)) {
atomic_clear_bit(&data->state, LB_FUNCTION_OUT_ENGAGED); atomic_clear_bit(&data->state, LB_FUNCTION_OUT_ENGAGED);
if (err == 0) {
memcpy(lb_buf, buf->data, MIN(sizeof(lb_buf), buf->len));
}
} }
if (bi->ep == lb_get_bulk_in(c_data)) { if (bi->ep == lb_get_bulk_in(c_data)) {
atomic_clear_bit(&data->state, LB_FUNCTION_IN_ENGAGED); atomic_clear_bit(&data->state, LB_FUNCTION_IN_ENGAGED);
} }
if (err) { net_buf_unref(buf);
if (err == -ECONNABORTED) { if (err == -ECONNABORTED) {
LOG_INF("request ep 0x%02x, len %u cancelled", LOG_INF("Transfer ep 0x%02x, len %u cancelled", ep, len);
bi->ep, buf->len); } else if (err != 0) {
} else { LOG_ERR("Transfer ep 0x%02x, len %u failed", ep, len);
LOG_ERR("request ep 0x%02x, len %u failed", ret = err;
bi->ep, buf->len); } else {
} LOG_DBG("Transfer ep 0x%02x, len %u finished", ep, len);
net_buf_unref(buf);
return err;
} }
if (bi->ep == lb_get_bulk_out(c_data)) { if (!atomic_test_bit(&data->state, LB_FUNCTION_BULK_MANUAL)) {
memcpy(lb_buf, buf->data, MIN(sizeof(lb_buf), buf->len)); if (ep == lb_get_bulk_out(c_data)) {
net_buf_unref(buf);
if (!atomic_test_bit(&data->state, LB_FUNCTION_BULK_MANUAL)) {
lb_submit_bulk_out(c_data); lb_submit_bulk_out(c_data);
} }
}
if (bi->ep == lb_get_bulk_in(c_data)) { if (ep == lb_get_bulk_in(c_data)) {
bi->ep = lb_get_bulk_out(c_data);
net_buf_unref(buf);
if (!atomic_test_bit(&data->state, LB_FUNCTION_BULK_MANUAL)) {
lb_submit_bulk_in(c_data); lb_submit_bulk_in(c_data);
} }
} }
return 0; return ret;
} }
static void lb_update(struct usbd_class_data *c_data, static void lb_update(struct usbd_class_data *c_data,

Loading…
Cancel
Save