On Mon, 2 Jan 2012 12:05:02 +0200, Felipe Balbi <balbi@xxxxxx> 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, 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 ^^^ "enabled"? > 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. > > 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 | 20 +++++++++++++++++++- > 3 files changed, 21 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..61b2905 100644 > --- a/include/linux/usb/ch9.h > +++ b/include/linux/usb/ch9.h > @@ -605,8 +605,26 @@ 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(const 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; > +} > + > /* Bits 1:0 of bmAttributes if this is an isoc endpoint */ > #define USB_SS_MULT(p) (1 + ((p) & 0x3)) > > -- > 1.7.8.2 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-usb" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html > -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html