Merge 4.5-rc6 into usb-next
We want the USB fixes in here as well. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
@@ -619,6 +619,12 @@ void dwc2_force_dr_mode(struct dwc2_hsotg *hsotg)
|
||||
__func__, hsotg->dr_mode);
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* NOTE: This is required for some rockchip soc based
|
||||
* platforms.
|
||||
*/
|
||||
msleep(50);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@@ -1174,14 +1174,11 @@ static int dwc2_process_non_isoc_desc(struct dwc2_hsotg *hsotg,
|
||||
failed = dwc2_update_non_isoc_urb_state_ddma(hsotg, chan, qtd, dma_desc,
|
||||
halt_status, n_bytes,
|
||||
xfer_done);
|
||||
if (*xfer_done && urb->status != -EINPROGRESS)
|
||||
failed = 1;
|
||||
|
||||
if (failed) {
|
||||
if (failed || (*xfer_done && urb->status != -EINPROGRESS)) {
|
||||
dwc2_host_complete(hsotg, qtd, urb->status);
|
||||
dwc2_hcd_qtd_unlink_and_free(hsotg, qtd, qh);
|
||||
dev_vdbg(hsotg->dev, "failed=%1x xfer_done=%1x status=%08x\n",
|
||||
failed, *xfer_done, urb->status);
|
||||
dev_vdbg(hsotg->dev, "failed=%1x xfer_done=%1x\n",
|
||||
failed, *xfer_done);
|
||||
return failed;
|
||||
}
|
||||
|
||||
@@ -1236,21 +1233,23 @@ static void dwc2_complete_non_isoc_xfer_ddma(struct dwc2_hsotg *hsotg,
|
||||
|
||||
list_for_each_safe(qtd_item, qtd_tmp, &qh->qtd_list) {
|
||||
int i;
|
||||
int qtd_desc_count;
|
||||
|
||||
qtd = list_entry(qtd_item, struct dwc2_qtd, qtd_list_entry);
|
||||
xfer_done = 0;
|
||||
qtd_desc_count = qtd->n_desc;
|
||||
|
||||
for (i = 0; i < qtd->n_desc; i++) {
|
||||
for (i = 0; i < qtd_desc_count; i++) {
|
||||
if (dwc2_process_non_isoc_desc(hsotg, chan, chnum, qtd,
|
||||
desc_num, halt_status,
|
||||
&xfer_done)) {
|
||||
qtd = NULL;
|
||||
break;
|
||||
}
|
||||
&xfer_done))
|
||||
goto stop_scan;
|
||||
|
||||
desc_num++;
|
||||
}
|
||||
}
|
||||
|
||||
stop_scan:
|
||||
if (qh->ep_type != USB_ENDPOINT_XFER_CONTROL) {
|
||||
/*
|
||||
* Resetting the data toggle for bulk and interrupt endpoints
|
||||
@@ -1258,7 +1257,7 @@ static void dwc2_complete_non_isoc_xfer_ddma(struct dwc2_hsotg *hsotg,
|
||||
*/
|
||||
if (halt_status == DWC2_HC_XFER_STALL)
|
||||
qh->data_toggle = DWC2_HC_PID_DATA0;
|
||||
else if (qtd)
|
||||
else
|
||||
dwc2_hcd_save_data_toggle(hsotg, chan, chnum, qtd);
|
||||
}
|
||||
|
||||
|
@@ -525,11 +525,19 @@ void dwc2_hcd_save_data_toggle(struct dwc2_hsotg *hsotg,
|
||||
u32 pid = (hctsiz & TSIZ_SC_MC_PID_MASK) >> TSIZ_SC_MC_PID_SHIFT;
|
||||
|
||||
if (chan->ep_type != USB_ENDPOINT_XFER_CONTROL) {
|
||||
if (WARN(!chan || !chan->qh,
|
||||
"chan->qh must be specified for non-control eps\n"))
|
||||
return;
|
||||
|
||||
if (pid == TSIZ_SC_MC_PID_DATA0)
|
||||
chan->qh->data_toggle = DWC2_HC_PID_DATA0;
|
||||
else
|
||||
chan->qh->data_toggle = DWC2_HC_PID_DATA1;
|
||||
} else {
|
||||
if (WARN(!qtd,
|
||||
"qtd must be specified for control eps\n"))
|
||||
return;
|
||||
|
||||
if (pid == TSIZ_SC_MC_PID_DATA0)
|
||||
qtd->data_toggle = DWC2_HC_PID_DATA0;
|
||||
else
|
||||
|
Reference in New Issue
Block a user