From: Adham Abozaeid <adham.aboza...@microchip.com>

Add passive scan support to the driver by passing the scan type to the
HW and configure the HW scan time if configured by the cfg80211.

Signed-off-by: Adham Abozaeid <adham.aboza...@microchip.com>
---
 drivers/staging/wilc1000/host_interface.c      | 18 +++++++++++++++---
 drivers/staging/wilc1000/host_interface.h      |  1 -
 .../staging/wilc1000/wilc_wfi_cfgoperations.c  | 12 +++++++++---
 drivers/staging/wilc1000/wilc_wlan_if.h        |  2 +-
 4 files changed, 25 insertions(+), 8 deletions(-)

diff --git a/drivers/staging/wilc1000/host_interface.c 
b/drivers/staging/wilc1000/host_interface.c
index ed15bd1bcd56..13c9915358d0 100644
--- a/drivers/staging/wilc1000/host_interface.c
+++ b/drivers/staging/wilc1000/host_interface.c
@@ -6,7 +6,7 @@
 
 #include "wilc_wfi_netdevice.h"
 
-#define WILC_HIF_SCAN_TIMEOUT_MS                4000
+#define WILC_HIF_SCAN_TIMEOUT_MS                5000
 #define WILC_HIF_CONNECT_TIMEOUT_MS             9500
 
 #define WILC_FALSE_FRMWR_CHANNEL               100
@@ -237,7 +237,7 @@ int wilc_scan(struct wilc_vif *vif, u8 scan_source, u8 
scan_type,
        int result = 0;
        struct wid wid_list[5];
        u32 index = 0;
-       u32 i;
+       u32 i, scan_timeout;
        u8 *buffer;
        u8 valuesize = 0;
        u8 *search_ssid_vals = NULL;
@@ -293,6 +293,18 @@ int wilc_scan(struct wilc_vif *vif, u8 scan_source, u8 
scan_type,
        wid_list[index].val = (s8 *)&scan_type;
        index++;
 
+       if (scan_type == WILC_FW_PASSIVE_SCAN && request->duration) {
+               wid_list[index].id = WID_PASSIVE_SCAN_TIME;
+               wid_list[index].type = WID_SHORT;
+               wid_list[index].size = sizeof(u16);
+               wid_list[index].val = (s8 *)&request->duration;
+               index++;
+
+               scan_timeout = (request->duration * ch_list_len) + 500;
+       } else {
+               scan_timeout = WILC_HIF_SCAN_TIMEOUT_MS;
+       }
+
        wid_list[index].id = WID_SCAN_CHANNEL_LIST;
        wid_list[index].type = WID_BIN_DATA;
 
@@ -326,7 +338,7 @@ int wilc_scan(struct wilc_vif *vif, u8 scan_source, u8 
scan_type,
 
        hif_drv->scan_timer_vif = vif;
        mod_timer(&hif_drv->scan_timer,
-                 jiffies + msecs_to_jiffies(WILC_HIF_SCAN_TIMEOUT_MS));
+                 jiffies + msecs_to_jiffies(scan_timeout));
 
 error:
 
diff --git a/drivers/staging/wilc1000/host_interface.h 
b/drivers/staging/wilc1000/host_interface.h
index a907c6d33012..4fcc7a3c151d 100644
--- a/drivers/staging/wilc1000/host_interface.h
+++ b/drivers/staging/wilc1000/host_interface.h
@@ -115,7 +115,6 @@ struct wilc_rcvd_net_info {
        struct ieee80211_mgmt *mgmt;
 };
 
-
 struct wilc_user_scan_req {
        void (*scan_result)(enum scan_event evt,
                            struct wilc_rcvd_net_info *info, void *priv);
diff --git a/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c 
b/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c
index f6825727bf77..b0daa1136663 100644
--- a/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c
+++ b/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c
@@ -221,6 +221,7 @@ static int scan(struct wiphy *wiphy, struct 
cfg80211_scan_request *request)
        u32 i;
        int ret = 0;
        u8 scan_ch_list[WILC_MAX_NUM_SCANNED_CH];
+       u8 scan_type;
 
        if (request->n_channels > WILC_MAX_NUM_SCANNED_CH) {
                netdev_err(priv->dev, "Requested scanned channels over\n");
@@ -235,9 +236,14 @@ static int scan(struct wiphy *wiphy, struct 
cfg80211_scan_request *request)
                scan_ch_list[i] = ieee80211_frequency_to_channel(freq);
        }
 
-       ret = wilc_scan(vif, WILC_FW_USER_SCAN, WILC_FW_ACTIVE_SCAN,
-                       scan_ch_list, request->n_channels, cfg_scan_result,
-                       (void *)priv, request);
+       if (request->n_ssids)
+               scan_type = WILC_FW_ACTIVE_SCAN;
+       else
+               scan_type = WILC_FW_PASSIVE_SCAN;
+
+       ret = wilc_scan(vif, WILC_FW_USER_SCAN, scan_type, scan_ch_list,
+                       request->n_channels, cfg_scan_result, (void *)priv,
+                       request);
 
        if (ret) {
                priv->scan_req = NULL;
diff --git a/drivers/staging/wilc1000/wilc_wlan_if.h 
b/drivers/staging/wilc1000/wilc_wlan_if.h
index b15de36e32e0..b89d0e0f04cc 100644
--- a/drivers/staging/wilc1000/wilc_wlan_if.h
+++ b/drivers/staging/wilc1000/wilc_wlan_if.h
@@ -684,7 +684,7 @@ enum {
        WID_LONG_RETRY_LIMIT            = 0x1003,
        WID_BEACON_INTERVAL             = 0x1006,
        WID_MEMORY_ACCESS_16BIT         = 0x1008,
-
+       WID_PASSIVE_SCAN_TIME           = 0x100D,
        WID_JOIN_START_TIMEOUT          = 0x100F,
        WID_ASOC_TIMEOUT                = 0x1011,
        WID_11I_PROTOCOL_TIMEOUT        = 0x1012,
-- 
2.17.1

_______________________________________________
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

Reply via email to