Reduce the following similar snippets by using musb_qh_free().

    qh->hep->hcpriv = NULL;
    list_del(&qh->ring);
    kfree(qh);

Signed-off-by: Matwey V. Kornilov <mat...@sai.msu.ru>
---
 drivers/usb/musb/musb_host.c | 66 +++++++++++++++++++++-----------------------
 1 file changed, 32 insertions(+), 34 deletions(-)

diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c
index 37aa9f6155d9..5d23c950a21b 100644
--- a/drivers/usb/musb/musb_host.c
+++ b/drivers/usb/musb/musb_host.c
@@ -85,6 +85,21 @@ static bool musb_qh_empty(struct musb_qh *qh)
        return list_empty(&qh->hep->urb_list);
 }
 
+static void musb_qh_unlink_hep(struct musb_qh *qh)
+{
+       if (!qh->hep)
+               return;
+
+       qh->hep->hcpriv = NULL;
+}
+
+static void musb_qh_free(struct musb_qh *qh)
+{
+       musb_qh_unlink_hep(qh);
+       list_del(&qh->ring);
+       kfree(qh);
+}
+
 /*
  * Clear TX fifo. Needed to avoid BABBLE errors.
  */
@@ -348,7 +363,7 @@ static void musb_advance_schedule(struct musb *musb, struct 
urb *urb,
         * invalidate qh as soon as list_empty(&hep->urb_list)
         */
        if (musb_qh_empty(qh)) {
-               struct list_head        *head;
+               struct list_head        *head = NULL;
                struct dma_controller   *dma = musb->dma_controller;
 
                if (is_in) {
@@ -367,34 +382,22 @@ static void musb_advance_schedule(struct musb *musb, 
struct urb *urb,
 
                /* Clobber old pointers to this qh */
                musb_ep_set_qh(ep, is_in, NULL);
-               qh->hep->hcpriv = NULL;
 
-               switch (qh->type) {
+               /* USB_ENDPOINT_XFER_CONTROL and USB_ENDPOINT_XFER_BULK: fifo
+                * policy for these lists, except that NAKing should rotate
+                * a qh to the end (for fairness).
+                * USB_ENDPOINT_XFER_ISOC and USB_ENDPOINT_XFER_INT: this is
+                * where periodic bandwidth should be de-allocated if it's
+                * tracked and allocated; and where we'd update the schedule
+                * tree...
+                */
+               if (qh->mux == 1
+                   && (qh->type == USB_ENDPOINT_XFER_CONTROL || qh->type == 
USB_ENDPOINT_XFER_BULK))
+                       head = qh->ring.prev;
 
-               case USB_ENDPOINT_XFER_CONTROL:
-               case USB_ENDPOINT_XFER_BULK:
-                       /* fifo policy for these lists, except that NAKing
-                        * should rotate a qh to the end (for fairness).
-                        */
-                       if (qh->mux == 1) {
-                               head = qh->ring.prev;
-                               list_del(&qh->ring);
-                               kfree(qh);
-                               qh = first_qh(head);
-                               break;
-                       }
-                       /* fall through */
+               musb_qh_free(qh);
 
-               case USB_ENDPOINT_XFER_ISOC:
-               case USB_ENDPOINT_XFER_INT:
-                       /* this is where periodic bandwidth should be
-                        * de-allocated if it's tracked and allocated;
-                        * and where we'd update the schedule tree...
-                        */
-                       kfree(qh);
-                       qh = NULL;
-                       break;
-               }
+               qh = head ? first_qh(head) : NULL;
        }
 
        if (qh != NULL && qh->is_ready) {
@@ -2435,11 +2438,8 @@ static int musb_urb_dequeue(struct usb_hcd *hcd, struct 
urb *urb, int status)
                /* If nothing else (usually musb_giveback) is using it
                 * and its URB list has emptied, recycle this qh.
                 */
-               if (ready && musb_qh_empty(qh)) {
-                       qh->hep->hcpriv = NULL;
-                       list_del(&qh->ring);
-                       kfree(qh);
-               }
+               if (ready && musb_qh_empty(qh))
+                       musb_qh_free(qh);
        } else
                ret = musb_cleanup_urb(urb, qh);
 done:
@@ -2493,9 +2493,7 @@ musb_h_disable(struct usb_hcd *hcd, struct 
usb_host_endpoint *hep)
                while (!musb_qh_empty(qh))
                        musb_giveback(musb, next_urb(qh), -ESHUTDOWN);
 
-               hep->hcpriv = NULL;
-               list_del(&qh->ring);
-               kfree(qh);
+               musb_qh_free(qh);
        }
 exit:
        spin_unlock_irqrestore(&musb->lock, flags);
-- 
2.16.4

Reply via email to