diff --git a/drivers/usb/usb_device.c b/drivers/usb/usb_device.c index 7fcb39b15..7dd3f6069 100644 --- a/drivers/usb/usb_device.c +++ b/drivers/usb/usb_device.c @@ -74,7 +74,6 @@ static void usb_core_get_desc(struct usb_handle *pdev, struct usb_setup_req *req case USB_DESC_TYPE_CONFIGURATION: pbuf = pdev->desc->get_config_desc(&len); - pbuf[1] = USB_DESC_TYPE_CONFIGURATION; break; case USB_DESC_TYPE_STRING: @@ -116,8 +115,11 @@ static void usb_core_get_desc(struct usb_handle *pdev, struct usb_setup_req *req break; case USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION: - pbuf = pdev->desc->get_config_desc(&len); - pbuf[1] = USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION; + if (pdev->desc->get_other_speed_config_desc == NULL) { + usb_core_ctl_error(pdev); + return; + } + pbuf = pdev->desc->get_other_speed_config_desc(&len); break; default: diff --git a/include/drivers/usb_device.h b/include/drivers/usb_device.h index e21e3155d..8fdb6ae13 100644 --- a/include/drivers/usb_device.h +++ b/include/drivers/usb_device.h @@ -166,6 +166,8 @@ struct usb_desc { uint8_t *(*get_usr_desc)(uint8_t index, uint16_t *length); uint8_t *(*get_config_desc)(uint16_t *length); uint8_t *(*get_device_qualifier_desc)(uint16_t *length); + /* optional: high speed capable device operating at its other speed */ + uint8_t *(*get_other_speed_config_desc)(uint16_t *length); }; /* USB Device handle structure */ diff --git a/plat/st/stm32mp1/stm32mp1_usb_dfu.c b/plat/st/stm32mp1/stm32mp1_usb_dfu.c index 051d43532..70fbba6db 100644 --- a/plat/st/stm32mp1/stm32mp1_usb_dfu.c +++ b/plat/st/stm32mp1/stm32mp1_usb_dfu.c @@ -338,6 +338,8 @@ static const struct usb_desc dfu_desc = { .get_usr_desc = stm32mp1_get_usr_desc, .get_config_desc = stm32mp1_get_config_desc, .get_device_qualifier_desc = stm32mp1_get_qualifier_desc, + /* only HS is supported, as ROM code */ + .get_other_speed_config_desc = NULL, }; static struct usb_handle usb_core_handle;