mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2025-04-23 21:44:15 +00:00
fix(drivers/usb): add a optional ops get_other_speed_config_desc
Correctly handle USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION request in USB driver and support a different result than USB_DESC_TYPE_CONFIGURATION with the new optional ops get_other_speed_config_desc(). The support of this descriptor is optionnal and is only required when high-speed capable device which can operate at its other possible speed. This patch allows to remove the pbuf update in usb_core_get_desc() and solves an issue on USB re-enumeration on STM32MP15 platform as the result of get_config_desc() is a const array. This issue is not see on normal use-case, as the USB enumeration is only done in ROM code and TF-A reuse the same USB descritors. Signed-off-by: Patrick Delaunay <patrick.delaunay@foss.st.com> Change-Id: I8edcc1e45065ab4e45d48f4bc37b49120674fdb0
This commit is contained in:
parent
025f5ef201
commit
216c1223c2
3 changed files with 9 additions and 3 deletions
|
@ -74,7 +74,6 @@ static void usb_core_get_desc(struct usb_handle *pdev, struct usb_setup_req *req
|
||||||
|
|
||||||
case USB_DESC_TYPE_CONFIGURATION:
|
case USB_DESC_TYPE_CONFIGURATION:
|
||||||
pbuf = pdev->desc->get_config_desc(&len);
|
pbuf = pdev->desc->get_config_desc(&len);
|
||||||
pbuf[1] = USB_DESC_TYPE_CONFIGURATION;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case USB_DESC_TYPE_STRING:
|
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;
|
break;
|
||||||
|
|
||||||
case USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION:
|
case USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION:
|
||||||
pbuf = pdev->desc->get_config_desc(&len);
|
if (pdev->desc->get_other_speed_config_desc == NULL) {
|
||||||
pbuf[1] = USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION;
|
usb_core_ctl_error(pdev);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
pbuf = pdev->desc->get_other_speed_config_desc(&len);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -166,6 +166,8 @@ struct usb_desc {
|
||||||
uint8_t *(*get_usr_desc)(uint8_t index, uint16_t *length);
|
uint8_t *(*get_usr_desc)(uint8_t index, uint16_t *length);
|
||||||
uint8_t *(*get_config_desc)(uint16_t *length);
|
uint8_t *(*get_config_desc)(uint16_t *length);
|
||||||
uint8_t *(*get_device_qualifier_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 */
|
/* USB Device handle structure */
|
||||||
|
|
|
@ -338,6 +338,8 @@ static const struct usb_desc dfu_desc = {
|
||||||
.get_usr_desc = stm32mp1_get_usr_desc,
|
.get_usr_desc = stm32mp1_get_usr_desc,
|
||||||
.get_config_desc = stm32mp1_get_config_desc,
|
.get_config_desc = stm32mp1_get_config_desc,
|
||||||
.get_device_qualifier_desc = stm32mp1_get_qualifier_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;
|
static struct usb_handle usb_core_handle;
|
||||||
|
|
Loading…
Add table
Reference in a new issue