Hi, On Tue, Mar 26, 2013 at 05:58:42PM +0100, Michael Grzeschik wrote: > The implementation is derived from the fsl_udc_core code in > fsl_ep_enable and makes basic iso handling possible. > > Signed-off-by: Michael Grzeschik <m.grzeschik@xxxxxxxxxxxxxx> > Signed-off-by: Marc Kleine-Budde <mkl@xxxxxxxxxxxxxx> > --- > Changes since v4: > - rebased on the new alignment patch > - changed indention to tabs > - removed spare brakets > - added special handling for iso in ep_queue and ep_halt > - changed TODO list entry in core.c > Changes since v3: > - added QH_ISO_TRANS macro > - removed unused operations mentioned by Peter > Changes since v2: > - fixed usage of variable max > - reworked on writel/readl patches > Changes since v1: > - fixed coding style issues mentioned by Sergei > > drivers/usb/chipidea/core.c | 2 +- > drivers/usb/chipidea/udc.c | 15 ++++++++++++--- > drivers/usb/chipidea/udc.h | 1 + > 3 files changed, 14 insertions(+), 4 deletions(-) > > diff --git a/drivers/usb/chipidea/core.c b/drivers/usb/chipidea/core.c > index 47b8da2..82de38b 100644 > --- a/drivers/usb/chipidea/core.c > +++ b/drivers/usb/chipidea/core.c > @@ -43,7 +43,7 @@ > * > * TODO List > * - OTG > - * - Isochronous & Interrupt Traffic > + * - Interrupt Traffic > * - Handle requests which spawns into several TDs > * - GET_STATUS(device) - always reports 0 > * - Gadget API (majority of optional features) > diff --git a/drivers/usb/chipidea/udc.c b/drivers/usb/chipidea/udc.c > index 567ce89..cab349b 100644 > --- a/drivers/usb/chipidea/udc.c > +++ b/drivers/usb/chipidea/udc.c > @@ -1010,6 +1010,8 @@ static int ep_enable(struct usb_ep *ep, > unsigned long flags; > u32 val = 0; > > + unsigned short max; > + > if (ep == NULL || desc == NULL) > return -EINVAL; > > @@ -1026,19 +1028,19 @@ static int ep_enable(struct usb_ep *ep, > mEp->num = usb_endpoint_num(desc); > mEp->type = usb_endpoint_type(desc); > > - mEp->ep.maxpacket = usb_endpoint_maxp(desc); > + max = mEp->ep.maxpacket = usb_endpoint_maxp(desc); > > trace_ci_ep_enable(mEp, 0); > > if (mEp->type == USB_ENDPOINT_XFER_CONTROL) > val |= QH_IOS; > else if (mEp->type == USB_ENDPOINT_XFER_ISOC) > - val &= ~QH_MULT; > + val |= QH_ISO_TRANS(max) << __ffs(QH_MULT); > > if (mEp->num) > val |= QH_ZLT; > > - val |= (mEp->ep.maxpacket << __ffs(QH_MAX_PKT)) & QH_MAX_PKT; > + val |= (max << __ffs(QH_MAX_PKT)) & QH_MAX_PKT; > mEp->qh.ptr->cap = val; > > mEp->qh.ptr->td.next |= TD_TERMINATE; /* needed? */ > @@ -1182,6 +1184,10 @@ static int ep_queue(struct usb_ep *ep, struct usb_request *req, > } > } > > + if (usb_endpoint_xfer_isoc(mEp->ep.desc) > + && mReq->req.length > mEp->ep.maxpacket) > + return -EMSGSIZE; this HW really can't handle requests greater max packet size for isochronous ? please clarify what you're doing here and, possibly, add a comment. Other than that: Reviewed-by: Felipe Balbi <balbi@xxxxxx> -- balbi
Attachment:
signature.asc
Description: Digital signature