Commit 142bd33f authored by Vardan Mikayelyan's avatar Vardan Mikayelyan Committed by Felipe Balbi

usb: dwc2: gadget: Corrected interval calculation

Calculate the interval according to the USB 2.0 specification section
9.6.6.
Tested-by: default avatarJohn Keeping <john@metanate.com>
Signed-off-by: default avatarVardan Mikayelyan <mvardan@synopsys.com>
Signed-off-by: default avatarJohn Youn <johnyoun@synopsys.com>
Signed-off-by: default avatarFelipe Balbi <felipe.balbi@linux.intel.com>
parent 92d1635d
...@@ -166,7 +166,7 @@ struct dwc2_hsotg_req; ...@@ -166,7 +166,7 @@ struct dwc2_hsotg_req;
* means that it is sending data to the Host. * means that it is sending data to the Host.
* @index: The index for the endpoint registers. * @index: The index for the endpoint registers.
* @mc: Multi Count - number of transactions per microframe * @mc: Multi Count - number of transactions per microframe
* @interval - Interval for periodic endpoints * @interval - Interval for periodic endpoints, in frames or microframes.
* @name: The name array passed to the USB core. * @name: The name array passed to the USB core.
* @halted: Set if the endpoint has been halted. * @halted: Set if the endpoint has been halted.
* @periodic: Set if this is a periodic ep, such as Interrupt * @periodic: Set if this is a periodic ep, such as Interrupt
......
...@@ -2693,16 +2693,13 @@ static int dwc2_hsotg_ep_enable(struct usb_ep *ep, ...@@ -2693,16 +2693,13 @@ static int dwc2_hsotg_ep_enable(struct usb_ep *ep,
hs_ep->periodic = 0; hs_ep->periodic = 0;
hs_ep->halted = 0; hs_ep->halted = 0;
hs_ep->interval = desc->bInterval; hs_ep->interval = desc->bInterval;
hs_ep->has_correct_parity = 0;
if (hs_ep->interval > 1 && hs_ep->mc > 1)
dev_err(hsotg->dev, "MC > 1 when interval is not 1\n");
switch (desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) { switch (desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) {
case USB_ENDPOINT_XFER_ISOC: case USB_ENDPOINT_XFER_ISOC:
epctrl |= DXEPCTL_EPTYPE_ISO; epctrl |= DXEPCTL_EPTYPE_ISO;
epctrl |= DXEPCTL_SETEVENFR; epctrl |= DXEPCTL_SETEVENFR;
hs_ep->isochronous = 1; hs_ep->isochronous = 1;
hs_ep->interval = 1 << (desc->bInterval - 1);
if (dir_in) if (dir_in)
hs_ep->periodic = 1; hs_ep->periodic = 1;
break; break;
...@@ -2715,6 +2712,9 @@ static int dwc2_hsotg_ep_enable(struct usb_ep *ep, ...@@ -2715,6 +2712,9 @@ static int dwc2_hsotg_ep_enable(struct usb_ep *ep,
if (dir_in) if (dir_in)
hs_ep->periodic = 1; hs_ep->periodic = 1;
if (hsotg->gadget.speed == USB_SPEED_HIGH)
hs_ep->interval = 1 << (desc->bInterval - 1);
epctrl |= DXEPCTL_EPTYPE_INTERRUPT; epctrl |= DXEPCTL_EPTYPE_INTERRUPT;
break; break;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment