chipidea: udc: free pending TD at removal procedure
authorPeter Chen <[email protected]>
Tue, 10 Sep 2013 07:34:39 +0000 (15:34 +0800)
committerGreg Kroah-Hartman <[email protected]>
Thu, 26 Sep 2013 00:20:52 +0000 (17:20 -0700)
There is a pending TD which is not freed after request finishes,
we do this due to a controller bug. This TD needs to be freed when
the driver is removed. It prints below error message when unload
chipidea driver at current code:
"ci_hdrc ci_hdrc.0: dma_pool_destroy ci_hw_td, b0001000 busy"
It indicates the buffer at dma pool are still in use.

This commit will free the pending TD at driver's removal procedure,
it can fix the problem described above.

Signed-off-by: Peter Chen <[email protected]>
Signed-off-by: Greg Kroah-Hartman <[email protected]>
drivers/usb/chipidea/udc.c

index 6b4c2f2eb94649c7da6fc577b54598d53ebdfec4..4ef4edf2990fc43c34ae4a40ee9fc9705194bca9 100644 (file)
@@ -1600,6 +1600,8 @@ static void destroy_eps(struct ci_hdrc *ci)
        for (i = 0; i < ci->hw_ep_max; i++) {
                struct ci_hw_ep *hwep = &ci->ci_hw_ep[i];
 
+               if (hwep->pending_td)
+                       free_pending_td(hwep);
                dma_pool_free(ci->qh_pool, hwep->qh.ptr, hwep->qh.dma);
        }
 }