linux/drivers/net/wireless/wl12xx/scan.h
<<
>>
Prefs
   1/*
   2 * This file is part of wl1271
   3 *
   4 * Copyright (C) 2009-2010 Nokia Corporation
   5 *
   6 * Contact: Luciano Coelho <luciano.coelho@nokia.com>
   7 *
   8 * This program is free software; you can redistribute it and/or
   9 * modify it under the terms of the GNU General Public License
  10 * version 2 as published by the Free Software Foundation.
  11 *
  12 * This program is distributed in the hope that it will be useful, but
  13 * WITHOUT ANY WARRANTY; without even the implied warranty of
  14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  15 * General Public License for more details.
  16 *
  17 * You should have received a copy of the GNU General Public License
  18 * along with this program; if not, write to the Free Software
  19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
  20 * 02110-1301 USA
  21 *
  22 */
  23
  24#ifndef __SCAN_H__
  25#define __SCAN_H__
  26
  27#include "wl12xx.h"
  28
  29int wl1271_scan(struct wl1271 *wl, const u8 *ssid, size_t ssid_len,
  30                struct cfg80211_scan_request *req);
  31int wl1271_scan_stop(struct wl1271 *wl);
  32int wl1271_scan_build_probe_req(struct wl1271 *wl,
  33                                const u8 *ssid, size_t ssid_len,
  34                                const u8 *ie, size_t ie_len, u8 band);
  35void wl1271_scan_stm(struct wl1271 *wl);
  36void wl1271_scan_complete_work(struct work_struct *work);
  37int wl1271_scan_sched_scan_config(struct wl1271 *wl,
  38                                     struct cfg80211_sched_scan_request *req,
  39                                     struct ieee80211_sched_scan_ies *ies);
  40int wl1271_scan_sched_scan_start(struct wl1271 *wl);
  41void wl1271_scan_sched_scan_stop(struct wl1271 *wl);
  42void wl1271_scan_sched_scan_results(struct wl1271 *wl);
  43
  44#define WL1271_SCAN_MAX_CHANNELS       24
  45#define WL1271_SCAN_DEFAULT_TAG        1
  46#define WL1271_SCAN_CURRENT_TX_PWR     0
  47#define WL1271_SCAN_OPT_ACTIVE         0
  48#define WL1271_SCAN_OPT_PASSIVE        1
  49#define WL1271_SCAN_OPT_TRIGGERED_SCAN 2
  50#define WL1271_SCAN_OPT_PRIORITY_HIGH  4
  51/* scan even if we fail to enter psm */
  52#define WL1271_SCAN_OPT_FORCE          8
  53#define WL1271_SCAN_BAND_2_4_GHZ 0
  54#define WL1271_SCAN_BAND_5_GHZ 1
  55
  56#define WL1271_SCAN_TIMEOUT    10000 /* msec */
  57
  58enum {
  59        WL1271_SCAN_STATE_IDLE,
  60        WL1271_SCAN_STATE_2GHZ_ACTIVE,
  61        WL1271_SCAN_STATE_2GHZ_PASSIVE,
  62        WL1271_SCAN_STATE_5GHZ_ACTIVE,
  63        WL1271_SCAN_STATE_5GHZ_PASSIVE,
  64        WL1271_SCAN_STATE_DONE
  65};
  66
  67struct basic_scan_params {
  68        /* Scan option flags (WL1271_SCAN_OPT_*) */
  69        __le16 scan_options;
  70        u8 role_id;
  71        /* Number of scan channels in the list (maximum 30) */
  72        u8 n_ch;
  73        /* This field indicates the number of probe requests to send
  74           per channel for an active scan */
  75        u8 n_probe_reqs;
  76        u8 tid_trigger;
  77        u8 ssid_len;
  78        u8 use_ssid_list;
  79
  80        /* Rate bit field for sending the probes */
  81        __le32 tx_rate;
  82
  83        u8 ssid[IEEE80211_MAX_SSID_LEN];
  84        /* Band to scan */
  85        u8 band;
  86
  87        u8 scan_tag;
  88        u8 padding2[2];
  89} __packed;
  90
  91struct basic_scan_channel_params {
  92        /* Duration in TU to wait for frames on a channel for active scan */
  93        __le32 min_duration;
  94        __le32 max_duration;
  95        __le32 bssid_lsb;
  96        __le16 bssid_msb;
  97        u8 early_termination;
  98        u8 tx_power_att;
  99        u8 channel;
 100        /* FW internal use only! */
 101        u8 dfs_candidate;
 102        u8 activity_detected;
 103        u8 pad;
 104} __packed;
 105
 106struct wl1271_cmd_scan {
 107        struct wl1271_cmd_header header;
 108
 109        struct basic_scan_params params;
 110        struct basic_scan_channel_params channels[WL1271_SCAN_MAX_CHANNELS];
 111
 112        /* src mac address */
 113        u8 addr[ETH_ALEN];
 114        u8 padding[2];
 115} __packed;
 116
 117struct wl1271_cmd_trigger_scan_to {
 118        struct wl1271_cmd_header header;
 119
 120        __le32 timeout;
 121} __packed;
 122
 123#define MAX_CHANNELS_2GHZ       14
 124#define MAX_CHANNELS_5GHZ       23
 125#define MAX_CHANNELS_4GHZ       4
 126
 127#define SCAN_MAX_CYCLE_INTERVALS 16
 128#define SCAN_MAX_BANDS 3
 129
 130enum {
 131        SCAN_SSID_FILTER_ANY      = 0,
 132        SCAN_SSID_FILTER_SPECIFIC = 1,
 133        SCAN_SSID_FILTER_LIST     = 2,
 134        SCAN_SSID_FILTER_DISABLED = 3
 135};
 136
 137enum {
 138        SCAN_BSS_TYPE_INDEPENDENT,
 139        SCAN_BSS_TYPE_INFRASTRUCTURE,
 140        SCAN_BSS_TYPE_ANY,
 141};
 142
 143#define SCAN_CHANNEL_FLAGS_DFS          BIT(0)
 144#define SCAN_CHANNEL_FLAGS_DFS_ENABLED  BIT(1)
 145
 146struct conn_scan_ch_params {
 147        __le16 min_duration;
 148        __le16 max_duration;
 149        __le16 passive_duration;
 150
 151        u8  channel;
 152        u8  tx_power_att;
 153
 154        /* bit 0: DFS channel; bit 1: DFS enabled */
 155        u8  flags;
 156
 157        u8  padding[3];
 158} __packed;
 159
 160struct wl1271_cmd_sched_scan_config {
 161        struct wl1271_cmd_header header;
 162
 163        __le32 intervals[SCAN_MAX_CYCLE_INTERVALS];
 164
 165        s8 rssi_threshold; /* for filtering (in dBm) */
 166        s8 snr_threshold;  /* for filtering (in dB) */
 167
 168        u8 cycles;       /* maximum number of scan cycles */
 169        u8 report_after; /* report when this number of results are received */
 170        u8 terminate;    /* stop scanning after reporting */
 171
 172        u8 tag;
 173        u8 bss_type; /* for filtering */
 174        u8 filter_type;
 175
 176        u8 ssid_len;     /* For SCAN_SSID_FILTER_SPECIFIC */
 177        u8 ssid[IEEE80211_MAX_SSID_LEN];
 178
 179        u8 n_probe_reqs; /* Number of probes requests per channel */
 180
 181        u8 passive[SCAN_MAX_BANDS];
 182        u8 active[SCAN_MAX_BANDS];
 183
 184        u8 dfs;
 185
 186        u8 padding[3];
 187
 188        struct conn_scan_ch_params channels_2[MAX_CHANNELS_2GHZ];
 189        struct conn_scan_ch_params channels_5[MAX_CHANNELS_5GHZ];
 190        struct conn_scan_ch_params channels_4[MAX_CHANNELS_4GHZ];
 191} __packed;
 192
 193
 194#define SCHED_SCAN_MAX_SSIDS 16
 195
 196enum {
 197        SCAN_SSID_TYPE_PUBLIC = 0,
 198        SCAN_SSID_TYPE_HIDDEN = 1,
 199};
 200
 201struct wl1271_ssid {
 202        u8 type;
 203        u8 len;
 204        u8 ssid[IEEE80211_MAX_SSID_LEN];
 205        /* u8 padding[2]; */
 206} __packed;
 207
 208struct wl1271_cmd_sched_scan_ssid_list {
 209        struct wl1271_cmd_header header;
 210
 211        u8 n_ssids;
 212        struct wl1271_ssid ssids[SCHED_SCAN_MAX_SSIDS];
 213        u8 padding[3];
 214} __packed;
 215
 216struct wl1271_cmd_sched_scan_start {
 217        struct wl1271_cmd_header header;
 218
 219        u8 tag;
 220        u8 padding[3];
 221} __packed;
 222
 223struct wl1271_cmd_sched_scan_stop {
 224        struct wl1271_cmd_header header;
 225
 226        u8 tag;
 227        u8 padding[3];
 228} __packed;
 229
 230
 231#endif /* __WL1271_SCAN_H__ */
 232