staging: wilc1000: add passive scan support

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.abozaeid@microchip.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Adham Abozaeid 2019-06-20 19:54:55 +00:00 committed by Greg Kroah-Hartman
parent b43f6a60e2
commit f5a3cb90b8
4 changed files with 25 additions and 8 deletions

View File

@ -6,7 +6,7 @@
#include "wilc_wfi_netdevice.h" #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_HIF_CONNECT_TIMEOUT_MS 9500
#define WILC_FALSE_FRMWR_CHANNEL 100 #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; int result = 0;
struct wid wid_list[5]; struct wid wid_list[5];
u32 index = 0; u32 index = 0;
u32 i; u32 i, scan_timeout;
u8 *buffer; u8 *buffer;
u8 valuesize = 0; u8 valuesize = 0;
u8 *search_ssid_vals = NULL; 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; wid_list[index].val = (s8 *)&scan_type;
index++; 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].id = WID_SCAN_CHANNEL_LIST;
wid_list[index].type = WID_BIN_DATA; 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; hif_drv->scan_timer_vif = vif;
mod_timer(&hif_drv->scan_timer, mod_timer(&hif_drv->scan_timer,
jiffies + msecs_to_jiffies(WILC_HIF_SCAN_TIMEOUT_MS)); jiffies + msecs_to_jiffies(scan_timeout));
error: error:

View File

@ -115,7 +115,6 @@ struct wilc_rcvd_net_info {
struct ieee80211_mgmt *mgmt; struct ieee80211_mgmt *mgmt;
}; };
struct wilc_user_scan_req { struct wilc_user_scan_req {
void (*scan_result)(enum scan_event evt, void (*scan_result)(enum scan_event evt,
struct wilc_rcvd_net_info *info, void *priv); struct wilc_rcvd_net_info *info, void *priv);

View File

@ -221,6 +221,7 @@ static int scan(struct wiphy *wiphy, struct cfg80211_scan_request *request)
u32 i; u32 i;
int ret = 0; int ret = 0;
u8 scan_ch_list[WILC_MAX_NUM_SCANNED_CH]; u8 scan_ch_list[WILC_MAX_NUM_SCANNED_CH];
u8 scan_type;
if (request->n_channels > WILC_MAX_NUM_SCANNED_CH) { if (request->n_channels > WILC_MAX_NUM_SCANNED_CH) {
netdev_err(priv->dev, "Requested scanned channels over\n"); 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); scan_ch_list[i] = ieee80211_frequency_to_channel(freq);
} }
ret = wilc_scan(vif, WILC_FW_USER_SCAN, WILC_FW_ACTIVE_SCAN, if (request->n_ssids)
scan_ch_list, request->n_channels, cfg_scan_result, scan_type = WILC_FW_ACTIVE_SCAN;
(void *)priv, request); 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) { if (ret) {
priv->scan_req = NULL; priv->scan_req = NULL;

View File

@ -684,7 +684,7 @@ enum {
WID_LONG_RETRY_LIMIT = 0x1003, WID_LONG_RETRY_LIMIT = 0x1003,
WID_BEACON_INTERVAL = 0x1006, WID_BEACON_INTERVAL = 0x1006,
WID_MEMORY_ACCESS_16BIT = 0x1008, WID_MEMORY_ACCESS_16BIT = 0x1008,
WID_PASSIVE_SCAN_TIME = 0x100D,
WID_JOIN_START_TIMEOUT = 0x100F, WID_JOIN_START_TIMEOUT = 0x100F,
WID_ASOC_TIMEOUT = 0x1011, WID_ASOC_TIMEOUT = 0x1011,
WID_11I_PROTOCOL_TIMEOUT = 0x1012, WID_11I_PROTOCOL_TIMEOUT = 0x1012,