OSDN Git Service

net: wireless: bcmdhd: Fix crash on dhdsdio_probe_attach() failure
authorDmitry Shmidt <dimitrysh@google.com>
Mon, 30 Jan 2012 23:43:31 +0000 (15:43 -0800)
committerDmitry Shmidt <dimitrysh@google.com>
Tue, 31 Jan 2012 21:31:37 +0000 (13:31 -0800)
Signed-off-by: Dmitry Shmidt <dimitrysh@google.com>
drivers/net/wireless/bcmdhd/dhd_linux.c
drivers/net/wireless/bcmdhd/dhd_sdio.c

index f3c98a1..95f3a91 100644 (file)
@@ -2345,7 +2345,12 @@ dhd_open(struct net_device *net)
         * We keep WEXT's wl_control_wl_start to provide backward compatibility
         * This should be removed in the future
         */
-       wl_control_wl_start(net);
+       ret = wl_control_wl_start(net);
+       if (ret != 0) {
+               DHD_ERROR(("%s: failed with code %d\n", __FUNCTION__, ret));
+               ret = -1;
+               goto exit;
+       }
 #endif
 
        ifidx = dhd_net2idx(dhd, net);
@@ -2367,8 +2372,14 @@ dhd_open(struct net_device *net)
                atomic_set(&dhd->pend_8021x_cnt, 0);
 #if defined(WL_CFG80211)
                DHD_ERROR(("\n%s\n", dhd_version));
-               if (!dhd_download_fw_on_driverload)
-                       wl_android_wifi_on(net);
+               if (!dhd_download_fw_on_driverload) {
+                       ret = wl_android_wifi_on(net);
+                       if (ret != 0) {
+                               DHD_ERROR(("%s: failed with code %d\n", __FUNCTION__, ret));
+                               ret = -1;
+                               goto exit;
+                       }
+               }
 #endif /* defined(WL_CFG80211) */
 
                if (dhd->pub.busstate != DHD_BUS_DATA) {
index ff5a75e..d782316 100644 (file)
@@ -2785,6 +2785,9 @@ dhdsdio_download_state(dhd_bus_t *bus, bool enter)
        uint retries;
        int bcmerror = 0;
 
+       if (!bus->sih)
+               return BCME_ERROR;
+
        /* To enter download state, disable ARM and reset SOCRAM.
         * To exit download state, simply reset ARM (default is RAM boot).
         */
@@ -5555,8 +5558,10 @@ dhdsdio_probe_attach(struct dhd_bus *bus, osl_t *osh, void *sdh, void *regsva,
        return TRUE;
 
 fail:
-       if (bus->sih != NULL)
+       if (bus->sih != NULL) {
                si_detach(bus->sih);
+               bus->sih = NULL;
+       }
        return FALSE;
 }
 
@@ -5789,6 +5794,7 @@ dhdsdio_release_dongle(dhd_bus_t *bus, osl_t *osh, bool dongle_isolation, bool r
                        dhdsdio_clkctl(bus, CLK_NONE, FALSE);
                }
                si_detach(bus->sih);
+               bus->sih = NULL;
                if (bus->vars && bus->varsz)
                        MFREE(osh, bus->vars, bus->varsz);
                bus->vars = NULL;