staging: dwc2: fix dwc2_hcd_qtd_add()
[firefly-linux-kernel-4.4.55.git] / drivers / staging / dwc2 / hcd_queue.c
index b36f783dd3e9e50a00ec828935c211d720b92c07..5461e3b86ae941df3231daf5b1508da3f722c682 100644 (file)
@@ -197,6 +197,9 @@ static struct dwc2_qh *dwc2_hcd_qh_create(struct dwc2_hsotg *hsotg,
 {
        struct dwc2_qh *qh;
 
+       if (!urb->priv)
+               return NULL;
+
        /* Allocate memory */
        qh = kzalloc(sizeof(*qh), mem_flags);
        if (!qh)
@@ -638,7 +641,7 @@ int dwc2_hcd_qtd_add(struct dwc2_hsotg *hsotg, struct dwc2_qtd *qtd,
        struct dwc2_hcd_urb *urb = qtd->urb;
        unsigned long flags;
        int allocated = 0;
-       int retval = 0;
+       int retval;
 
        /*
         * Get the QH which holds the QTD-list to insert to. Create QH if it
@@ -652,8 +655,19 @@ int dwc2_hcd_qtd_add(struct dwc2_hsotg *hsotg, struct dwc2_qtd *qtd,
        }
 
        spin_lock_irqsave(&hsotg->lock, flags);
+
        retval = dwc2_hcd_qh_add(hsotg, *qh);
-       if (retval && allocated) {
+       if (retval)
+               goto fail;
+
+       qtd->qh = *qh;
+       list_add_tail(&qtd->qtd_list_entry, &(*qh)->qtd_list);
+       spin_unlock_irqrestore(&hsotg->lock, flags);
+
+       return 0;
+
+fail:
+       if (allocated) {
                struct dwc2_qtd *qtd2, *qtd2_tmp;
                struct dwc2_qh *qh_tmp = *qh;
 
@@ -668,8 +682,6 @@ int dwc2_hcd_qtd_add(struct dwc2_hsotg *hsotg, struct dwc2_qtd *qtd,
                spin_unlock_irqrestore(&hsotg->lock, flags);
                dwc2_hcd_qh_free(hsotg, qh_tmp);
        } else {
-               qtd->qh = *qh;
-               list_add_tail(&qtd->qtd_list_entry, &(*qh)->qtd_list);
                spin_unlock_irqrestore(&hsotg->lock, flags);
        }