net: wireless: bcm4329: Force scan when driver is loaded
authorGreg Goldman <ggoldman@broadcom.com>
Thu, 5 Aug 2010 23:16:46 +0000 (16:16 -0700)
committerColin Cross <ccross@android.com>
Thu, 30 Sep 2010 00:49:43 +0000 (17:49 -0700)
Signed-off-by: Dmitry Shmidt <dimitrysh@google.com>
drivers/net/wireless/bcm4329/dhd_linux.c
drivers/net/wireless/bcm4329/wl_iw.c

index cce87ba890d50ba4506027b84277f210b6be2005..01a9d768a05498e0432e818b2615da7937709ff0 100644 (file)
@@ -2305,7 +2305,7 @@ dhd_net_attach(dhd_pub_t *dhdp, int ifidx)
               dhd->pub.mac.octet[0], dhd->pub.mac.octet[1], dhd->pub.mac.octet[2],
               dhd->pub.mac.octet[3], dhd->pub.mac.octet[4], dhd->pub.mac.octet[5]);
 
-#if defined(CONFIG_WIRELESS_EXT) && !defined(CSCAN)
+#if defined(CONFIG_WIRELESS_EXT)
 #ifdef SOFTAP
        if (ifidx == 0)
                /* Don't call for SOFTAP Interface in SOFTAP MODE */
index d0b6f9fc9df87ca45f3dc81c224f8c03f1ba9b5b..a49c1eadebbe8ed18b531e838a412100b7442229 100644 (file)
@@ -948,7 +948,7 @@ wl_iw_set_band(
 
        if (g_onoff == G_WLAN_SET_ON) {
 
-               band = *(extra + strlen(BAND_SET_CMD) + 1) - '0';
+               band = htod32((uint)*(extra + strlen(BAND_SET_CMD) + 1) - '0');
 
                if ((band == WLC_BAND_AUTO) || (band == WLC_BAND_5G) || (band == WLC_BAND_2G)) {
 
@@ -959,10 +959,10 @@ wl_iw_set_band(
                                WL_TRACE(("%s: set band %d OK\n", __FUNCTION__, band));
                                goto exit;
                        }
-                       else  WL_ERROR(("%s: set band %d failed code %d\n", __FUNCTION__, \
+                       else WL_ERROR(("%s: set band %d failed code %d\n", __FUNCTION__, \
                                        band, error));
                }
-               else  WL_ERROR(("%s Incorrect band setting, ignored\n", __FUNCTION__));
+               else WL_ERROR(("%s Incorrect band setting %d, ignored\n", __FUNCTION__, band));
        }
 
        p += snprintf(p, MAX_WX_STRING, "FAIL");
@@ -1150,14 +1150,12 @@ wl_iw_control_wl_on(
 
        wl_iw_send_priv_event(dev, "START");
 
-#if !defined(CSCAN)
 #ifdef SOFTAP
        if (!ap_fw_loaded) {
                wl_iw_iscan_set_scan_broadcast_prep(dev, 0);
        }
 #else
        wl_iw_iscan_set_scan_broadcast_prep(dev, 0);
-#endif
 #endif
 
        WL_TRACE(("Exited %s \n", __FUNCTION__));
@@ -2256,6 +2254,7 @@ wl_iw_iscan_get(iscan_info_t *iscan)
        wl_iscan_results_t list;
        wl_scan_results_t *results;
        uint32 status;
+       int res;
 
        mutex_lock(&wl_cache_lock);
        if (iscan->list_cur) {
@@ -2290,20 +2289,25 @@ wl_iw_iscan_get(iscan_info_t *iscan)
 
        memset(&list, 0, sizeof(list));
        list.results.buflen = htod32(WLC_IW_ISCAN_MAXLEN);
-       (void) dev_iw_iovar_getbuf(
+       res = dev_iw_iovar_getbuf(
                iscan->dev,
                "iscanresults",
                &list,
                WL_ISCAN_RESULTS_FIXED_SIZE,
                buf->iscan_buf,
                WLC_IW_ISCAN_MAXLEN);
-       results->buflen = dtoh32(results->buflen);
-       results->version = dtoh32(results->version);
-       results->count = dtoh32(results->count);
-       WL_SCAN(("results->count = %d\n", results->count));
-
-       WL_SCAN(("results->buflen = %d\n", results->buflen));
-       status = dtoh32(list_buf->status);
+       if (res == 0) {
+               results->buflen = dtoh32(results->buflen);
+               results->version = dtoh32(results->version);
+               results->count = dtoh32(results->count);
+               WL_SCAN(("results->count = %d\n", results->count));
+
+               WL_SCAN(("results->buflen = %d\n", results->buflen));
+               status = dtoh32(list_buf->status);
+       } else {
+               WL_ERROR(("%s returns error %d\n", __FUNCTION__, res));
+               status = WL_SCAN_RESULTS_NO_MEM;
+       }
        mutex_unlock(&wl_cache_lock);
        return status;
 }
@@ -2328,10 +2332,8 @@ static void wl_iw_send_scan_complete(iscan_info_t *iscan)
        memset(&wrqu, 0, sizeof(wrqu));
 
        wireless_send_event(iscan->dev, SIOCGIWSCAN, &wrqu, NULL);
-#if !defined(CSCAN)
        if (g_first_broadcast_scan == BROADCAST_SCAN_FIRST_STARTED)
                g_first_broadcast_scan = BROADCAST_SCAN_FIRST_RESULT_READY;
-#endif
        WL_TRACE(("Send Event ISCAN complete\n"));
 #endif 
 }
@@ -2603,6 +2605,8 @@ wl_iw_add_bss_to_ss_cache(wl_scan_results_t *ss_list)
                }
                leaf = kmalloc(bi->length + WLC_IW_SS_CACHE_CTRL_FIELD_MAXLEN, GFP_KERNEL);
                if (!leaf) {
+                       WL_ERROR(("Memory alloc failure %d\n", \
+                               bi->length + WLC_IW_SS_CACHE_CTRL_FIELD_MAXLEN));
                        mutex_unlock(&wl_cache_lock);
                        return -ENOMEM;
                }
@@ -2765,7 +2769,6 @@ wl_iw_iscan_set_scan_broadcast_prep(struct net_device *dev, uint flag)
        wlc_ssid_t ssid;
        iscan_info_t *iscan = g_iscan;
 
-#if !defined(CSCAN)
        if (g_first_broadcast_scan == BROADCAST_SCAN_FIRST_IDLE) {
                g_first_broadcast_scan = BROADCAST_SCAN_FIRST_STARTED;
                WL_TRACE(("%s: First Brodcast scan was forced\n", __FUNCTION__));
@@ -2774,7 +2777,6 @@ wl_iw_iscan_set_scan_broadcast_prep(struct net_device *dev, uint flag)
                WL_TRACE(("%s: ignore ISCAN request first BS is not done yet\n", __FUNCTION__));
                return 0;
        }
-#endif
 
 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27))
        if (flag)
@@ -3355,14 +3357,12 @@ wl_iw_iscan_get_scan(
                return -EINVAL;
        }
 
-#if !defined(CSCAN)
        if (g_first_broadcast_scan < BROADCAST_SCAN_FIRST_RESULT_READY) {
                WL_TRACE(("%s %s: first ISCAN results are NOT ready yet \n", \
                         dev->name, __FUNCTION__));
                return -EAGAIN;
        }
-#endif
-       
+
        if ((!iscan) || (iscan->sysioc_pid < 0)) {
                WL_TRACE(("%ssysioc_pid\n", __FUNCTION__));
                return wl_iw_get_scan(dev, info, dwrq, extra);
@@ -3492,9 +3492,8 @@ wl_iw_iscan_get_scan(
        dwrq->length += merged_len;
        wl_iw_run_ss_cache_timer(0);
        wl_iw_run_ss_cache_timer(1);
-       
+#endif /* CSCAN */
        g_first_broadcast_scan = BROADCAST_SCAN_FIRST_RESULT_CONSUMED;
-#endif
 
        WL_TRACE(("%s return to WE %d bytes APs=%d\n", __FUNCTION__, dwrq->length, counter));
 
@@ -4967,6 +4966,12 @@ wl_iw_combined_scan_set(struct net_device *dev, wlc_ssid_t* ssids_local, int nss
        if ((!dev) && (!g_iscan) && (!iscan->iscan_ex_params_p)) {
                WL_ERROR(("%s error exit\n", __FUNCTION__));
                err = -1;
+               goto exit;
+       }
+
+       if (g_first_broadcast_scan < BROADCAST_SCAN_FIRST_RESULT_CONSUMED) {
+               WL_ERROR(("%s First ISCAN in progress : ignoring\n",  __FUNCTION__));
+               goto exit;
        }
 
        params_size += WL_SCAN_PARAMS_SSID_MAX * sizeof(wlc_ssid_t);
@@ -5137,7 +5142,6 @@ static int iwpriv_set_cscan(struct net_device *dev, struct iw_request_info *info
                get_parmeter_from_string(&str_ptr, GET_SCAN_TYPE, PTYPE_INTDEC, \
                                        &iscan->iscan_ex_params_p->params.scan_type, 1);
 
-               
                res = wl_iw_combined_scan_set(dev, ssids_local, nssid, nchan);
 
        } else {
@@ -5325,7 +5329,6 @@ wl_iw_set_cscan(
                        goto exit_proc;
                }
 
-               
                res = wl_iw_combined_scan_set(dev, ssids_local, nssid, nchan);
 
 exit_proc: