net: wireless: bcm4329: Fix memory leak in case of dhd_bus_init() failure
authorDmitry Shmidt <dimitrysh@google.com>
Fri, 3 Dec 2010 22:52:13 +0000 (14:52 -0800)
committerDmitry Shmidt <dimitrysh@google.com>
Fri, 3 Dec 2010 23:31:35 +0000 (15:31 -0800)
Signed-off-by: Dmitry Shmidt <dimitrysh@google.com>
drivers/net/wireless/bcm4329/dhd_sdio.c

index 7aaec0ac29da013ff422327f64a45a40be0dd0c9..ac46ca91eaebf0cdffba20cd4023d2293f771336 100644 (file)
@@ -438,7 +438,7 @@ static bool dhdsdio_probe_attach(dhd_bus_t *bus, osl_t *osh, void *sdh,
                                  void * regsva, uint16  devid);
 static bool dhdsdio_probe_malloc(dhd_bus_t *bus, osl_t *osh, void *sdh);
 static bool dhdsdio_probe_init(dhd_bus_t *bus, osl_t *osh, void *sdh);
-static void dhdsdio_release_dongle(dhd_bus_t *bus, osl_t *osh);
+static void dhdsdio_release_dongle(dhd_bus_t *bus, osl_t *osh, int reset_flag);
 
 static uint process_nvram_vars(char *varbuf, uint len);
 
@@ -5301,7 +5301,7 @@ dhdsdio_release(dhd_bus_t *bus, osl_t *osh)
 
                if (bus->dhd) {
 
-                       dhdsdio_release_dongle(bus, osh);
+                       dhdsdio_release_dongle(bus, osh, TRUE);
 
                        dhd_detach(bus->dhd);
                        bus->dhd = NULL;
@@ -5345,11 +5345,11 @@ dhdsdio_release_malloc(dhd_bus_t *bus, osl_t *osh)
 
 
 static void
-dhdsdio_release_dongle(dhd_bus_t *bus, osl_t *osh)
+dhdsdio_release_dongle(dhd_bus_t *bus, osl_t *osh, int reset_flag)
 {
        DHD_TRACE(("%s: Enter\n", __FUNCTION__));
 
-       if (bus->dhd && bus->dhd->dongle_reset)
+       if ((bus->dhd && bus->dhd->dongle_reset) && reset_flag)
                return;
 
        if (bus->sih) {
@@ -5811,7 +5811,7 @@ dhd_bus_devreset(dhd_pub_t *dhdp, uint8 flag)
                        dhd_bus_stop(bus, FALSE);
 
                        /* Clean tx/rx buffer pointers, detach from the dongle */
-                       dhdsdio_release_dongle(bus, bus->dhd->osh);
+                       dhdsdio_release_dongle(bus, bus->dhd->osh, TRUE);
 
                        bus->dhd->dongle_reset = TRUE;
                        bus->dhd->up = FALSE;
@@ -5859,7 +5859,7 @@ dhd_bus_devreset(dhd_pub_t *dhdp, uint8 flag)
                                                DHD_TRACE(("%s: WLAN ON DONE\n", __FUNCTION__));
                                        } else {
                                                dhd_bus_stop(bus, FALSE);
-                                               dhdsdio_release_dongle(bus, bus->dhd->osh);
+                                               dhdsdio_release_dongle(bus, bus->dhd->osh, FALSE);
                                        }
                                } else
                                        bcmerror = BCME_SDIO_ERROR;