[PATCH v2 3/6] usb: musb: Introduce musb_qh_free() helper function
From: Matwey V. Kornilov
Date: Fri Jun 14 2019 - 13:28:26 EST
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 <matwey@xxxxxxxxxx>
---
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