Loading drivers/usb/dwc3/core.h +4 −0 Original line number Diff line number Diff line Loading @@ -572,6 +572,8 @@ struct dwc3_ep_events { #define DWC3_TRB_NUM 256 #define DWC3_FRAME_WRAP_AROUND_MASK (BIT(14) | BIT(15)) /** * struct dwc3_ep - device side endpoint representation * @endpoint: usb endpoint Loading @@ -593,6 +595,7 @@ struct dwc3_ep_events { * @number: endpoint number (1 - 15) * @type: set to bmAttributes & USB_ENDPOINT_XFERTYPE_MASK * @resource_index: Resource transfer index * @frame_number: set to the frame number we want this transfer to start (ISOC) * @interval: the interval on which the ISOC transfer is started * @allocated_requests: number of requests allocated * @queued_requests: number of requests queued for transfer Loading Loading @@ -651,6 +654,7 @@ struct dwc3_ep { u8 resource_index; u32 allocated_requests; u32 queued_requests; u32 frame_number; u32 interval; char name[20]; Loading drivers/usb/dwc3/gadget.c +16 −17 Original line number Diff line number Diff line Loading @@ -1441,10 +1441,9 @@ static int __dwc3_gadget_get_frame(struct dwc3 *dwc) return DWC3_DSTS_SOFFN(reg); } static void __dwc3_gadget_start_isoc(struct dwc3 *dwc, struct dwc3_ep *dep, u32 cur_uf) static void __dwc3_gadget_start_isoc(struct dwc3 *dwc, struct dwc3_ep *dep) { u32 uf; u16 uf, wraparound_bits; if (list_empty(&dep->pending_list)) { dev_info(dwc->dev, "%s: ran out of requests\n", Loading @@ -1453,11 +1452,17 @@ static void __dwc3_gadget_start_isoc(struct dwc3 *dwc, return; } /* * Schedule the first trb for one interval in the future or at * least 4 microframes. */ uf = cur_uf + max_t(u32, 4, dep->interval); wraparound_bits = dep->frame_number & DWC3_FRAME_WRAP_AROUND_MASK; uf = dep->frame_number & ~DWC3_FRAME_WRAP_AROUND_MASK; /* if frame wrapped-around update wrap-around bits to reflect that */ if (__dwc3_gadget_get_frame(dwc) < uf) wraparound_bits += BIT(14); uf = __dwc3_gadget_get_frame(dwc) + 2 * dep->interval; /* align uf to ep interval */ uf = (wraparound_bits | uf) & ~(dep->interval - 1); __dwc3_gadget_kick_transfer(dep, uf); } Loading @@ -1465,12 +1470,9 @@ static void __dwc3_gadget_start_isoc(struct dwc3 *dwc, static void dwc3_gadget_start_isoc(struct dwc3 *dwc, struct dwc3_ep *dep, const struct dwc3_event_depevt *event) { u32 cur_uf, mask; mask = ~(dep->interval - 1); cur_uf = event->parameters & mask; dep->frame_number = event->parameters; __dwc3_gadget_start_isoc(dwc, dep, cur_uf); __dwc3_gadget_start_isoc(dwc, dep); } static int __dwc3_gadget_ep_queue(struct dwc3_ep *dep, struct dwc3_request *req) Loading Loading @@ -1511,10 +1513,7 @@ static int __dwc3_gadget_ep_queue(struct dwc3_ep *dep, struct dwc3_request *req) dwc3_stop_active_transfer(dwc, dep->number, true); dep->flags = DWC3_EP_ENABLED; } else { u32 cur_uf; cur_uf = __dwc3_gadget_get_frame(dwc); __dwc3_gadget_start_isoc(dwc, dep, cur_uf); __dwc3_gadget_start_isoc(dwc, dep); dep->flags &= ~DWC3_EP_PENDING_REQUEST; } return 0; Loading Loading
drivers/usb/dwc3/core.h +4 −0 Original line number Diff line number Diff line Loading @@ -572,6 +572,8 @@ struct dwc3_ep_events { #define DWC3_TRB_NUM 256 #define DWC3_FRAME_WRAP_AROUND_MASK (BIT(14) | BIT(15)) /** * struct dwc3_ep - device side endpoint representation * @endpoint: usb endpoint Loading @@ -593,6 +595,7 @@ struct dwc3_ep_events { * @number: endpoint number (1 - 15) * @type: set to bmAttributes & USB_ENDPOINT_XFERTYPE_MASK * @resource_index: Resource transfer index * @frame_number: set to the frame number we want this transfer to start (ISOC) * @interval: the interval on which the ISOC transfer is started * @allocated_requests: number of requests allocated * @queued_requests: number of requests queued for transfer Loading Loading @@ -651,6 +654,7 @@ struct dwc3_ep { u8 resource_index; u32 allocated_requests; u32 queued_requests; u32 frame_number; u32 interval; char name[20]; Loading
drivers/usb/dwc3/gadget.c +16 −17 Original line number Diff line number Diff line Loading @@ -1441,10 +1441,9 @@ static int __dwc3_gadget_get_frame(struct dwc3 *dwc) return DWC3_DSTS_SOFFN(reg); } static void __dwc3_gadget_start_isoc(struct dwc3 *dwc, struct dwc3_ep *dep, u32 cur_uf) static void __dwc3_gadget_start_isoc(struct dwc3 *dwc, struct dwc3_ep *dep) { u32 uf; u16 uf, wraparound_bits; if (list_empty(&dep->pending_list)) { dev_info(dwc->dev, "%s: ran out of requests\n", Loading @@ -1453,11 +1452,17 @@ static void __dwc3_gadget_start_isoc(struct dwc3 *dwc, return; } /* * Schedule the first trb for one interval in the future or at * least 4 microframes. */ uf = cur_uf + max_t(u32, 4, dep->interval); wraparound_bits = dep->frame_number & DWC3_FRAME_WRAP_AROUND_MASK; uf = dep->frame_number & ~DWC3_FRAME_WRAP_AROUND_MASK; /* if frame wrapped-around update wrap-around bits to reflect that */ if (__dwc3_gadget_get_frame(dwc) < uf) wraparound_bits += BIT(14); uf = __dwc3_gadget_get_frame(dwc) + 2 * dep->interval; /* align uf to ep interval */ uf = (wraparound_bits | uf) & ~(dep->interval - 1); __dwc3_gadget_kick_transfer(dep, uf); } Loading @@ -1465,12 +1470,9 @@ static void __dwc3_gadget_start_isoc(struct dwc3 *dwc, static void dwc3_gadget_start_isoc(struct dwc3 *dwc, struct dwc3_ep *dep, const struct dwc3_event_depevt *event) { u32 cur_uf, mask; mask = ~(dep->interval - 1); cur_uf = event->parameters & mask; dep->frame_number = event->parameters; __dwc3_gadget_start_isoc(dwc, dep, cur_uf); __dwc3_gadget_start_isoc(dwc, dep); } static int __dwc3_gadget_ep_queue(struct dwc3_ep *dep, struct dwc3_request *req) Loading Loading @@ -1511,10 +1513,7 @@ static int __dwc3_gadget_ep_queue(struct dwc3_ep *dep, struct dwc3_request *req) dwc3_stop_active_transfer(dwc, dep->number, true); dep->flags = DWC3_EP_ENABLED; } else { u32 cur_uf; cur_uf = __dwc3_gadget_get_frame(dwc); __dwc3_gadget_start_isoc(dwc, dep, cur_uf); __dwc3_gadget_start_isoc(dwc, dep); dep->flags &= ~DWC3_EP_PENDING_REQUEST; } return 0; Loading