forked from Minki/linux
633e271326
Split sched scan IEs to band specific and not band specific blocks. Common IEs blocks may be sent to the FW once per command, instead of per band. This allows optimization of size of the command, which may be required by some drivers (eg. iwlmvm with newer firmware version). As this changes the mac80211 API, update all drivers to use the new version correctly, even if they don't (yet) make use of the split data. Signed-off-by: David Spinadel <david.spinadel@intel.com> Reviewed-by: Alexander Bondar <alexander.bondar@intel.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
141 lines
3.7 KiB
C
141 lines
3.7 KiB
C
/*
|
|
* This file is part of wl12xx
|
|
*
|
|
* Copyright (C) 2012 Texas Instruments. All rights reserved.
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* version 2 as published by the Free Software Foundation.
|
|
*
|
|
* This program is distributed in the hope that it will be useful, but
|
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
|
|
* 02110-1301 USA
|
|
*
|
|
*/
|
|
|
|
#ifndef __WL12XX_SCAN_H__
|
|
#define __WL12XX_SCAN_H__
|
|
|
|
#include "../wlcore/wlcore.h"
|
|
#include "../wlcore/cmd.h"
|
|
#include "../wlcore/scan.h"
|
|
|
|
#define WL12XX_MAX_CHANNELS_5GHZ 23
|
|
|
|
struct basic_scan_params {
|
|
/* Scan option flags (WL1271_SCAN_OPT_*) */
|
|
__le16 scan_options;
|
|
u8 role_id;
|
|
/* Number of scan channels in the list (maximum 30) */
|
|
u8 n_ch;
|
|
/* This field indicates the number of probe requests to send
|
|
per channel for an active scan */
|
|
u8 n_probe_reqs;
|
|
u8 tid_trigger;
|
|
u8 ssid_len;
|
|
u8 use_ssid_list;
|
|
|
|
/* Rate bit field for sending the probes */
|
|
__le32 tx_rate;
|
|
|
|
u8 ssid[IEEE80211_MAX_SSID_LEN];
|
|
/* Band to scan */
|
|
u8 band;
|
|
|
|
u8 scan_tag;
|
|
u8 padding2[2];
|
|
} __packed;
|
|
|
|
struct basic_scan_channel_params {
|
|
/* Duration in TU to wait for frames on a channel for active scan */
|
|
__le32 min_duration;
|
|
__le32 max_duration;
|
|
__le32 bssid_lsb;
|
|
__le16 bssid_msb;
|
|
u8 early_termination;
|
|
u8 tx_power_att;
|
|
u8 channel;
|
|
/* FW internal use only! */
|
|
u8 dfs_candidate;
|
|
u8 activity_detected;
|
|
u8 pad;
|
|
} __packed;
|
|
|
|
struct wl1271_cmd_scan {
|
|
struct wl1271_cmd_header header;
|
|
|
|
struct basic_scan_params params;
|
|
struct basic_scan_channel_params channels[WL1271_SCAN_MAX_CHANNELS];
|
|
|
|
/* src mac address */
|
|
u8 addr[ETH_ALEN];
|
|
u8 padding[2];
|
|
} __packed;
|
|
|
|
struct wl1271_cmd_sched_scan_config {
|
|
struct wl1271_cmd_header header;
|
|
|
|
__le32 intervals[SCAN_MAX_CYCLE_INTERVALS];
|
|
|
|
s8 rssi_threshold; /* for filtering (in dBm) */
|
|
s8 snr_threshold; /* for filtering (in dB) */
|
|
|
|
u8 cycles; /* maximum number of scan cycles */
|
|
u8 report_after; /* report when this number of results are received */
|
|
u8 terminate; /* stop scanning after reporting */
|
|
|
|
u8 tag;
|
|
u8 bss_type; /* for filtering */
|
|
u8 filter_type;
|
|
|
|
u8 ssid_len; /* For SCAN_SSID_FILTER_SPECIFIC */
|
|
u8 ssid[IEEE80211_MAX_SSID_LEN];
|
|
|
|
u8 n_probe_reqs; /* Number of probes requests per channel */
|
|
|
|
u8 passive[SCAN_MAX_BANDS];
|
|
u8 active[SCAN_MAX_BANDS];
|
|
|
|
u8 dfs;
|
|
|
|
u8 n_pactive_ch; /* number of pactive (passive until fw detects energy)
|
|
channels in BG band */
|
|
u8 role_id;
|
|
u8 padding[1];
|
|
struct conn_scan_ch_params channels_2[MAX_CHANNELS_2GHZ];
|
|
struct conn_scan_ch_params channels_5[WL12XX_MAX_CHANNELS_5GHZ];
|
|
struct conn_scan_ch_params channels_4[MAX_CHANNELS_4GHZ];
|
|
} __packed;
|
|
|
|
struct wl1271_cmd_sched_scan_start {
|
|
struct wl1271_cmd_header header;
|
|
|
|
u8 tag;
|
|
u8 role_id;
|
|
u8 padding[2];
|
|
} __packed;
|
|
|
|
struct wl1271_cmd_sched_scan_stop {
|
|
struct wl1271_cmd_header header;
|
|
|
|
u8 tag;
|
|
u8 role_id;
|
|
u8 padding[2];
|
|
} __packed;
|
|
|
|
int wl12xx_scan_start(struct wl1271 *wl, struct wl12xx_vif *wlvif,
|
|
struct cfg80211_scan_request *req);
|
|
int wl12xx_scan_stop(struct wl1271 *wl, struct wl12xx_vif *wlvif);
|
|
void wl12xx_scan_completed(struct wl1271 *wl, struct wl12xx_vif *wlvif);
|
|
int wl12xx_sched_scan_start(struct wl1271 *wl, struct wl12xx_vif *wlvif,
|
|
struct cfg80211_sched_scan_request *req,
|
|
struct ieee80211_scan_ies *ies);
|
|
void wl12xx_scan_sched_scan_stop(struct wl1271 *wl, struct wl12xx_vif *wlvif);
|
|
#endif
|