gintmsk_data_t gintmsk = {.d32 = 0 };
gintsts_data_t gintsts = {.d32 = 0 };
+ dwc_otg_disable_host_interrupts(core_if);
if (core_if->usb_mode != USB_MODE_NORMAL)
goto out;
hcd->fops->complete(hcd, qtd->urb->priv,
qtd->urb, -DWC_E_SHUTDOWN);
dwc_otg_hcd_qtd_remove_and_free(hcd, qtd, qh);
+ } else {
+ return;
}
}
int i;
dwc_hc_t *channel;
dwc_hc_t *channel_tmp;
+ dwc_irqflags_t flags;
hcd->flags.d32 = 0;
hcd->non_periodic_channels = 0;
hcd->periodic_channels = 0;
+ DWC_SPINLOCK_IRQSAVE(hcd->lock, &flags);
/*
* Put all channels in the free channel list and clean up channel
* states.
hc_list_entry);
dwc_otg_hc_cleanup(hcd->core_if, channel);
}
-
+ DWC_SPINUNLOCK_IRQRESTORE(hcd->lock, flags);
/* Initialize the DWC core for host mode operation. */
dwc_otg_core_host_init(hcd->core_if);
hc->qh->ping_state = 0;
}
} else if (!hc->xfer_started) {
+ if (!hc || !(hc->qh))
+ return -ENODEV;
dwc_otg_hc_start_transfer(hcd->core_if, hc);
hc->qh->ping_state = 0;
}
dwc_otg_hcd_urb_t *dwc_otg_urb, int32_t status)
{
struct urb *urb = (struct urb *)urb_handle;
+ if (!urb)
+ return 0;
#ifdef DEBUG
if (CHK_DEBUG_LEVEL(DBG_HCDV | DBG_HCD_URB)) {
DWC_PRINTF("%s: urb %p, device %d, ep %d %s, status=%d\n",
/* Free each QTD in the QTD list */
DWC_SPINLOCK_IRQSAVE(hcd->lock, &flags);
DWC_CIRCLEQ_FOREACH_SAFE(qtd, qtd_tmp, &qh->qtd_list, qtd_list_entry) {
- DWC_CIRCLEQ_REMOVE(&qh->qtd_list, qtd, qtd_list_entry);
- dwc_otg_hcd_qtd_free(qtd);
+ dwc_otg_hcd_qtd_remove_and_free(hcd, qtd, qh);
}
if (hcd->core_if->dma_desc_enable) {
struct dwc_otg_device *otg_dev = _pcd->otg_dev;
struct dwc_otg_platform_data *pldata = otg_dev->pldata;
- if (pldata->get_status(USB_STATUS_BVABLID)) {
+ if (pldata->get_status(USB_STATUS_BVABLID) &&
+ pldata->get_status(USB_STATUS_ID)) {
/* if usb not connect before ,then start connect */
if (_pcd->vbus_status == USB_BC_TYPE_DISCNT) {
printk("***************vbus detect*****************\n");
{
/* Turn off differential receiver in suspend mode */
writel(UOC_HIWORD_UPDATE(0, 1, 2),
- RK_GRF_VIRT + RK312X_GRF_USBPHY0_CON6);
+ RK_GRF_VIRT + RK312X_GRF_USBPHY0_CON6);
/* Set disconnect detection trigger point to 600mv */
- writel(UOC_HIWORD_UPDATE(1, 0xf, 11),
- RK_GRF_VIRT + RK312X_GRF_USBPHY0_CON7);
+ writel(UOC_HIWORD_UPDATE(0, 0xf, 11),
+ RK_GRF_VIRT + RK312X_GRF_USBPHY0_CON7);
/* other haredware init,include:
* DRV_VBUS GPIO init */
if (gpio_is_valid(control_usb->otg_gpios->gpio)) {