Skip to content

Commit f5a3f90

Browse files
jfischer-nofabiobaltieri
authored andcommitted
usb: device_next: respect bMaxPacketSize0 in control transfers
Only the device operating at high speed has bMaxPacketSize0 set to 64 bytes, the device operating at other speeds may have a different value. For full speed, use the value from the full speed descriptor. Signed-off-by: Johann Fischer <[email protected]>
1 parent 3d86360 commit f5a3f90

File tree

1 file changed

+14
-1
lines changed

1 file changed

+14
-1
lines changed

subsys/usb/device_next/usbd_endpoint.c

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,20 @@ static void usbd_ep_ctrl_set_zlp(struct usbd_context *const uds_ctx,
5959
struct net_buf *const buf)
6060
{
6161
struct usb_setup_packet *setup = usbd_get_setup_pkt(uds_ctx);
62+
struct usb_device_descriptor *desc = uds_ctx->fs_desc;
6263
size_t min_len = MIN(setup->wLength, buf->len);
64+
uint8_t mps0 = 0;
65+
66+
switch (usbd_bus_speed(uds_ctx)) {
67+
case USBD_SPEED_FS:
68+
mps0 = desc->bMaxPacketSize0;
69+
break;
70+
case USBD_SPEED_HS:
71+
mps0 = USB_CONTROL_EP_MPS;
72+
break;
73+
default:
74+
__ASSERT(false, "Cannot determine bMaxPacketSize0 (unsupported speed)");
75+
}
6376

6477
if (buf->len == 0) {
6578
return;
@@ -70,7 +83,7 @@ static void usbd_ep_ctrl_set_zlp(struct usbd_context *const uds_ctx,
7083
* last chunk is wMaxPacketSize long, to indicate the last
7184
* packet.
7285
*/
73-
if (setup->wLength > min_len && !(min_len % USB_CONTROL_EP_MPS)) {
86+
if (setup->wLength > min_len && !(min_len % mps0)) {
7487
/*
7588
* Transfer length is less as requested by wLength and
7689
* is multiple of wMaxPacketSize.

0 commit comments

Comments
 (0)