rk: restore file mode
[firefly-linux-kernel-4.4.55.git] / drivers / usb / dwc_otg_310 / dwc_otg_hcd.c
index 07845a23fc262a196f2da7c920cdc104fd42bff7..9df43cd1aba17ef10f45f45d01d03a8b790633f2 100755 (executable)
@@ -174,6 +174,8 @@ static void kill_urbs_in_qh_list(dwc_otg_hcd_t *hcd, dwc_list_link_t *qh_list)
                qh = DWC_LIST_ENTRY(qh_item, dwc_otg_qh_t, qh_list_entry);
                DWC_CIRCLEQ_FOREACH_SAFE(qtd, qtd_tmp,
                                         &qh->qtd_list, qtd_list_entry) {
+                       if (DWC_CIRCLEQ_EMPTY(&qh->qtd_list))
+                               return;
                        qtd = DWC_CIRCLEQ_FIRST(&qh->qtd_list);
                        if (qtd->urb != NULL) {
                                hcd->fops->complete(hcd, qtd->urb->priv,
@@ -478,24 +480,24 @@ void dwc_otg_hcd_stop(dwc_otg_hcd_t *hcd)
        pldata = hcd->core_if->otg_dev->pldata;
        DWC_DEBUGPL(DBG_HCD, "DWC OTG HCD STOP\n");
 
-       /*
-        * The root hub should be disconnected before this function is called.
-        * The disconnect will clear the QTD lists (via ..._hcd_urb_dequeue)
-        * and the QH lists (via ..._hcd_endpoint_disable).
-        */
-       DWC_SPINLOCK_IRQSAVE(hcd->lock, &flags);
-       kill_all_urbs(hcd);
-       DWC_SPINUNLOCK_IRQRESTORE(hcd->lock, flags);
-
        /*
         * Set status flags for the hub driver.
         */
        hcd->flags.b.port_connect_status_change = 1;
        hcd->flags.b.port_connect_status = 0;
 
+       /*
+        * The root hub should be disconnected before this function is called.
+        * The disconnect will clear the QTD lists (via ..._hcd_urb_dequeue)
+        * and the QH lists (via ..._hcd_endpoint_disable).
+        */
+       DWC_SPINLOCK_IRQSAVE(hcd->lock, &flags);
        /* Turn off all host-specific interrupts. */
        dwc_otg_disable_host_interrupts(hcd->core_if);
 
+       kill_all_urbs(hcd);
+       DWC_SPINUNLOCK_IRQRESTORE(hcd->lock, flags);
+
        /* Turn off the vbus power */
        DWC_PRINTF("PortPower off\n");
        hprt0.b.prtpwr = 0;
@@ -563,7 +565,7 @@ int dwc_otg_hcd_urb_dequeue(dwc_otg_hcd_t *hcd,
        dwc_otg_qtd_t *urb_qtd;
 
        urb_qtd = dwc_otg_urb->qtd;
-       if (((uint32_t) urb_qtd & 0xf0000000) == 0) {
+       if (!urb_qtd) {
                DWC_PRINTF("%s error: urb_qtd is %p dwc_otg_urb %p!!!\n",
                           __func__, urb_qtd, dwc_otg_urb);
                return 0;
@@ -1349,7 +1351,8 @@ static int queue_transaction(dwc_otg_hcd_t *hcd,
                             dwc_hc_t *hc, uint16_t fifo_dwords_avail)
 {
        int retval;
-
+       if (!hc || !(hc->qh))
+               return -ENODEV;
        if (hcd->core_if->dma_enable) {
                if (hcd->core_if->dma_desc_enable) {
                        if (!hc->xfer_started