Re: [PATCH] usb: ch9: fix up MaxStreams helper

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

On Mon, Jan 02, 2012 at 12:02:55PM +0200, Felipe Balbi wrote:
> According to USB 3.0 Specification Table 9-22, if
> bmAttributes [4:0] are set to zero, it means "no
> streams supported", but the way this helper was
> defined on Linux, by commit 22ad1e7f (USB: Add
> parsing of SuperSpeed endpoint companion
> descriptor), we will *always* have one stream
> which might cause several problems.
> 
> For example on DWC3, we would tell the controller
> endpoint has streams enable and yet start transfers
> with Stream ID set to 0, which would goof up the host
> side.
> 
> While doing that, convert the macro to an inline
> function due to the different checks we now need.
> 
> Cc: stable@xxxxxxxxxxxxxxx
> Cc: Sarah Sharp <sarah.a.sharp@xxxxxxxxxxxxxxx>
> Signed-off-by: Felipe Balbi <balbi@xxxxxx>
> ---
> 
> this should be applied as far back as 2.6.35 (when the
> commit was first introduced), but of course the DWC3 part
> will only apply to 3.2-stable. You can safely ignore the
> DWC3 part for anything older than 3.2-stable and, hopefully,
> the patch should still apply.
> 
>  drivers/usb/dwc3/gadget.c |    3 +--
>  drivers/usb/host/xhci.c   |    3 +--
>  include/linux/usb/ch9.h   |   19 ++++++++++++++++++-
>  3 files changed, 20 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
> index 12975ac..76036d0 100644
> --- a/drivers/usb/dwc3/gadget.c
> +++ b/drivers/usb/dwc3/gadget.c
> @@ -234,8 +234,7 @@ static int dwc3_gadget_set_ep_config(struct dwc3 *dwc, struct dwc3_ep *dep,
>  	params.param1 = DWC3_DEPCFG_XFER_COMPLETE_EN
>  		| DWC3_DEPCFG_XFER_NOT_READY_EN;
>  
> -	if (comp_desc && USB_SS_MAX_STREAMS(comp_desc->bmAttributes)
> -			&& usb_endpoint_xfer_bulk(desc)) {
> +	if (usb_ss_max_streams(comp_desc) && usb_endpoint_xfer_bulk(desc)) {
>  		params.param1 |= DWC3_DEPCFG_STREAM_CAPABLE
>  			| DWC3_DEPCFG_STREAM_EVENT_EN;
>  		dep->stream_capable = true;
> diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
> index a1afb7c..b0d9ac6 100644
> --- a/drivers/usb/host/xhci.c
> +++ b/drivers/usb/host/xhci.c
> @@ -2796,8 +2796,7 @@ static int xhci_calculate_streams_and_bitmask(struct xhci_hcd *xhci,
>  		if (ret < 0)
>  			return ret;
>  
> -		max_streams = USB_SS_MAX_STREAMS(
> -				eps[i]->ss_ep_comp.bmAttributes);
> +		max_streams = usb_ss_max_streams(&eps[i]->ss_ep_comp);
>  		if (max_streams < (*num_streams - 1)) {
>  			xhci_dbg(xhci, "Ep 0x%x only supports %u stream IDs.\n",
>  					eps[i]->desc.bEndpointAddress,
> diff --git a/include/linux/usb/ch9.h b/include/linux/usb/ch9.h
> index d5da6c6..57af348 100644
> --- a/include/linux/usb/ch9.h
> +++ b/include/linux/usb/ch9.h
> @@ -605,8 +605,25 @@ struct usb_ss_ep_comp_descriptor {
>  } __attribute__ ((packed));
>  
>  #define USB_DT_SS_EP_COMP_SIZE		6
> +
>  /* Bits 4:0 of bmAttributes if this is a bulk endpoint */
> -#define USB_SS_MAX_STREAMS(p)		(1 << ((p) & 0x1f))
> +static inline int usb_ss_max_streams(struct usb_ss_ep_comp_descriptor *comp)
> +{
> +	int		max_streams;
> +
> +	if (!comp)
> +		return 0;
> +
> +	max_streams = comp->bmAttributes & 0x1f;
> +
> +	if (!max_streams)
> +		return 0;
> +
> +	max_streams = 1 << max_streams;
> +
> +	return max_streams;
> +}
> +

sorry, I sent the older version by mistake. Disregard this one

-- 
balbi

Attachment: signature.asc
Description: Digital signature


[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux