Re: [PATCH v3 4/5] usb: chipidea: cleanup dma_pool if udc_start() fails

2012-09-06 Thread Richard Zhao
On Wed, Sep 05, 2012 at 10:11:52AM +0200, Marc Kleine-Budde wrote:
 If udc_start() fails the qh_pool dma-pool cannot be closed because
 it's still in use. This patch factors out the dma_pool_free() loop
 into destroy_eps() and calls it in the error path of udc_start(),
 too.
 
 Cc: Richard Zhao richard.z...@freescale.com
 Signed-off-by: Marc Kleine-Budde m...@pengutronix.de
Reviewed-by: Richard Zhao richard.z...@freescale.com

 ---
  drivers/usb/chipidea/udc.c |   23 +++
  1 file changed, 15 insertions(+), 8 deletions(-)
 
 diff --git a/drivers/usb/chipidea/udc.c b/drivers/usb/chipidea/udc.c
 index 3a755e5..2d8b609 100644
 --- a/drivers/usb/chipidea/udc.c
 +++ b/drivers/usb/chipidea/udc.c
 @@ -1503,6 +1503,17 @@ static int init_eps(struct ci13xxx *ci)
   return retval;
  }
  
 +static void destroy_eps(struct ci13xxx *ci)
 +{
 + int i;
 +
 + for (i = 0; i  ci-hw_ep_max; i++) {
 + struct ci13xxx_ep *mEp = ci-ci13xxx_ep[i];
 +
 + dma_pool_free(ci-qh_pool, mEp-qh.ptr, mEp-qh.dma);
 + }
 +}
 +
  /**
   * ci13xxx_start: register a gadget driver
   * @gadget: our gadget
 @@ -1710,7 +1721,7 @@ static int udc_start(struct ci13xxx *ci)
   if (ci-platdata-flags  CI13XXX_REQUIRE_TRANSCEIVER) {
   if (ci-transceiver == NULL) {
   retval = -ENODEV;
 - goto free_pools;
 + goto destroy_eps;
   }
   }
  
 @@ -1761,6 +1772,8 @@ unreg_device:
  put_transceiver:
   if (!IS_ERR_OR_NULL(ci-transceiver)  ci-global_phy)
   usb_put_phy(ci-transceiver);
 +destroy_eps:
 + destroy_eps(ci);
  free_pools:
   dma_pool_destroy(ci-td_pool);
  free_qh_pool:
 @@ -1775,18 +1788,12 @@ free_qh_pool:
   */
  static void udc_stop(struct ci13xxx *ci)
  {
 - int i;
 -
   if (ci == NULL)
   return;
  
   usb_del_gadget_udc(ci-gadget);
  
 - for (i = 0; i  ci-hw_ep_max; i++) {
 - struct ci13xxx_ep *mEp = ci-ci13xxx_ep[i];
 -
 - dma_pool_free(ci-qh_pool, mEp-qh.ptr, mEp-qh.dma);
 - }
 + destroy_eps(ci);
  
   dma_pool_destroy(ci-td_pool);
   dma_pool_destroy(ci-qh_pool);
 -- 
 1.7.10.4
 
 

--
To unsubscribe from this list: send the line unsubscribe linux-usb in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v3 4/5] usb: chipidea: cleanup dma_pool if udc_start() fails

2012-09-06 Thread Alexander Shishkin
Marc Kleine-Budde m...@pengutronix.de writes:

 If udc_start() fails the qh_pool dma-pool cannot be closed because
 it's still in use. This patch factors out the dma_pool_free() loop
 into destroy_eps() and calls it in the error path of udc_start(),
 too.

 Cc: Richard Zhao richard.z...@freescale.com
 Signed-off-by: Marc Kleine-Budde m...@pengutronix.de

Acked-by: Alexander Shishkin alexander.shish...@linux.intel.com

 ---
  drivers/usb/chipidea/udc.c |   23 +++
  1 file changed, 15 insertions(+), 8 deletions(-)

 diff --git a/drivers/usb/chipidea/udc.c b/drivers/usb/chipidea/udc.c
 index 3a755e5..2d8b609 100644
 --- a/drivers/usb/chipidea/udc.c
 +++ b/drivers/usb/chipidea/udc.c
 @@ -1503,6 +1503,17 @@ static int init_eps(struct ci13xxx *ci)
   return retval;
  }
  
 +static void destroy_eps(struct ci13xxx *ci)
 +{
 + int i;
 +
 + for (i = 0; i  ci-hw_ep_max; i++) {
 + struct ci13xxx_ep *mEp = ci-ci13xxx_ep[i];
 +
 + dma_pool_free(ci-qh_pool, mEp-qh.ptr, mEp-qh.dma);
 + }
 +}
 +
  /**
   * ci13xxx_start: register a gadget driver
   * @gadget: our gadget
 @@ -1710,7 +1721,7 @@ static int udc_start(struct ci13xxx *ci)
   if (ci-platdata-flags  CI13XXX_REQUIRE_TRANSCEIVER) {
   if (ci-transceiver == NULL) {
   retval = -ENODEV;
 - goto free_pools;
 + goto destroy_eps;
   }
   }
  
 @@ -1761,6 +1772,8 @@ unreg_device:
  put_transceiver:
   if (!IS_ERR_OR_NULL(ci-transceiver)  ci-global_phy)
   usb_put_phy(ci-transceiver);
 +destroy_eps:
 + destroy_eps(ci);
  free_pools:
   dma_pool_destroy(ci-td_pool);
  free_qh_pool:
 @@ -1775,18 +1788,12 @@ free_qh_pool:
   */
  static void udc_stop(struct ci13xxx *ci)
  {
 - int i;
 -
   if (ci == NULL)
   return;
  
   usb_del_gadget_udc(ci-gadget);
  
 - for (i = 0; i  ci-hw_ep_max; i++) {
 - struct ci13xxx_ep *mEp = ci-ci13xxx_ep[i];
 -
 - dma_pool_free(ci-qh_pool, mEp-qh.ptr, mEp-qh.dma);
 - }
 + destroy_eps(ci);
  
   dma_pool_destroy(ci-td_pool);
   dma_pool_destroy(ci-qh_pool);
 -- 
 1.7.10.4
--
To unsubscribe from this list: send the line unsubscribe linux-usb in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v3 4/5] usb: chipidea: cleanup dma_pool if udc_start() fails

2012-09-05 Thread Marc Kleine-Budde
If udc_start() fails the qh_pool dma-pool cannot be closed because
it's still in use. This patch factors out the dma_pool_free() loop
into destroy_eps() and calls it in the error path of udc_start(),
too.

Cc: Richard Zhao richard.z...@freescale.com
Signed-off-by: Marc Kleine-Budde m...@pengutronix.de
---
 drivers/usb/chipidea/udc.c |   23 +++
 1 file changed, 15 insertions(+), 8 deletions(-)

diff --git a/drivers/usb/chipidea/udc.c b/drivers/usb/chipidea/udc.c
index 3a755e5..2d8b609 100644
--- a/drivers/usb/chipidea/udc.c
+++ b/drivers/usb/chipidea/udc.c
@@ -1503,6 +1503,17 @@ static int init_eps(struct ci13xxx *ci)
return retval;
 }
 
+static void destroy_eps(struct ci13xxx *ci)
+{
+   int i;
+
+   for (i = 0; i  ci-hw_ep_max; i++) {
+   struct ci13xxx_ep *mEp = ci-ci13xxx_ep[i];
+
+   dma_pool_free(ci-qh_pool, mEp-qh.ptr, mEp-qh.dma);
+   }
+}
+
 /**
  * ci13xxx_start: register a gadget driver
  * @gadget: our gadget
@@ -1710,7 +1721,7 @@ static int udc_start(struct ci13xxx *ci)
if (ci-platdata-flags  CI13XXX_REQUIRE_TRANSCEIVER) {
if (ci-transceiver == NULL) {
retval = -ENODEV;
-   goto free_pools;
+   goto destroy_eps;
}
}
 
@@ -1761,6 +1772,8 @@ unreg_device:
 put_transceiver:
if (!IS_ERR_OR_NULL(ci-transceiver)  ci-global_phy)
usb_put_phy(ci-transceiver);
+destroy_eps:
+   destroy_eps(ci);
 free_pools:
dma_pool_destroy(ci-td_pool);
 free_qh_pool:
@@ -1775,18 +1788,12 @@ free_qh_pool:
  */
 static void udc_stop(struct ci13xxx *ci)
 {
-   int i;
-
if (ci == NULL)
return;
 
usb_del_gadget_udc(ci-gadget);
 
-   for (i = 0; i  ci-hw_ep_max; i++) {
-   struct ci13xxx_ep *mEp = ci-ci13xxx_ep[i];
-
-   dma_pool_free(ci-qh_pool, mEp-qh.ptr, mEp-qh.dma);
-   }
+   destroy_eps(ci);
 
dma_pool_destroy(ci-td_pool);
dma_pool_destroy(ci-qh_pool);
-- 
1.7.10.4

--
To unsubscribe from this list: send the line unsubscribe linux-usb in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html