diff mbox series

[U-Boot,08/14] usb: xhci: Fix max packet size for full speed device endpoint 0

Message ID 1505742050-5697-9-git-send-email-bmeng.cn@gmail.com
State Accepted
Delegated to: Marek Vasut
Headers show
Series usb: xhci: Add interrupt transfer support and full speed device support | expand

Commit Message

Bin Meng Sept. 18, 2017, 1:40 p.m. UTC
In xhci_check_maxpacket(), the control endpoint 0 max packet size
is wrongly taken from the interface's endpoint descriptor. However
the default endpoint 0 does not come with an endpoint descriptor
hence is not included in the interface structure. Change to use
epmaxpacketin[0] instead.

The other bug in this routine is that when setting max packet size
to the xHC endpoint 0 context, it does not clear its previous value
at all before programming a new one.

Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
---

 drivers/usb/host/xhci.c | 8 +++-----
 1 file changed, 3 insertions(+), 5 deletions(-)

Comments

Stefan Roese Sept. 22, 2017, 5:02 a.m. UTC | #1
On 18.09.2017 15:40, Bin Meng wrote:
> In xhci_check_maxpacket(), the control endpoint 0 max packet size
> is wrongly taken from the interface's endpoint descriptor. However
> the default endpoint 0 does not come with an endpoint descriptor
> hence is not included in the interface structure. Change to use
> epmaxpacketin[0] instead.
> 
> The other bug in this routine is that when setting max packet size
> to the xHC endpoint 0 context, it does not clear its previous value
> at all before programming a new one.
> 
> Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
> ---
> 
>   drivers/usb/host/xhci.c | 8 +++-----
>   1 file changed, 3 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
> index 4b3d58d..ec82fa6 100644
> --- a/drivers/usb/host/xhci.c
> +++ b/drivers/usb/host/xhci.c
> @@ -546,16 +546,13 @@ int xhci_check_maxpacket(struct usb_device *udev)
>   	int max_packet_size;
>   	int hw_max_packet_size;
>   	int ret = 0;
> -	struct usb_interface *ifdesc;
> -
> -	ifdesc = &udev->config.if_desc[0];
>   
>   	out_ctx = ctrl->devs[slot_id]->out_ctx;
>   	xhci_inval_cache((uintptr_t)out_ctx->bytes, out_ctx->size);
>   
>   	ep_ctx = xhci_get_ep_ctx(ctrl, out_ctx, ep_index);
>   	hw_max_packet_size = MAX_PACKET_DECODED(le32_to_cpu(ep_ctx->ep_info2));
> -	max_packet_size = usb_endpoint_maxp(&ifdesc->ep_desc[0]);
> +	max_packet_size = udev->epmaxpacketin[0];
>   	if (hw_max_packet_size != max_packet_size) {
>   		debug("Max Packet Size for ep 0 changed.\n");
>   		debug("Max packet size in usb_device = %d\n", max_packet_size);
> @@ -567,7 +564,8 @@ int xhci_check_maxpacket(struct usb_device *udev)
>   				ctrl->devs[slot_id]->out_ctx, ep_index);
>   		in_ctx = ctrl->devs[slot_id]->in_ctx;
>   		ep_ctx = xhci_get_ep_ctx(ctrl, in_ctx, ep_index);
> -		ep_ctx->ep_info2 &= cpu_to_le32(~MAX_PACKET_MASK);
> +		ep_ctx->ep_info2 &= cpu_to_le32(~((0xffff & MAX_PACKET_MASK)
> +						<< MAX_PACKET_SHIFT));
>   		ep_ctx->ep_info2 |= cpu_to_le32(MAX_PACKET(max_packet_size));
>   
>   		/*
> 

Reviewed-by: Stefan Roese <sr@denx.de>
Tested-by: Stefan Roese <sr@denx.de>

Thanks,
Stefan
diff mbox series

Patch

diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
index 4b3d58d..ec82fa6 100644
--- a/drivers/usb/host/xhci.c
+++ b/drivers/usb/host/xhci.c
@@ -546,16 +546,13 @@  int xhci_check_maxpacket(struct usb_device *udev)
 	int max_packet_size;
 	int hw_max_packet_size;
 	int ret = 0;
-	struct usb_interface *ifdesc;
-
-	ifdesc = &udev->config.if_desc[0];
 
 	out_ctx = ctrl->devs[slot_id]->out_ctx;
 	xhci_inval_cache((uintptr_t)out_ctx->bytes, out_ctx->size);
 
 	ep_ctx = xhci_get_ep_ctx(ctrl, out_ctx, ep_index);
 	hw_max_packet_size = MAX_PACKET_DECODED(le32_to_cpu(ep_ctx->ep_info2));
-	max_packet_size = usb_endpoint_maxp(&ifdesc->ep_desc[0]);
+	max_packet_size = udev->epmaxpacketin[0];
 	if (hw_max_packet_size != max_packet_size) {
 		debug("Max Packet Size for ep 0 changed.\n");
 		debug("Max packet size in usb_device = %d\n", max_packet_size);
@@ -567,7 +564,8 @@  int xhci_check_maxpacket(struct usb_device *udev)
 				ctrl->devs[slot_id]->out_ctx, ep_index);
 		in_ctx = ctrl->devs[slot_id]->in_ctx;
 		ep_ctx = xhci_get_ep_ctx(ctrl, in_ctx, ep_index);
-		ep_ctx->ep_info2 &= cpu_to_le32(~MAX_PACKET_MASK);
+		ep_ctx->ep_info2 &= cpu_to_le32(~((0xffff & MAX_PACKET_MASK)
+						<< MAX_PACKET_SHIFT));
 		ep_ctx->ep_info2 |= cpu_to_le32(MAX_PACKET(max_packet_size));
 
 		/*