162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * This file is part of wl12xx
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (C) 2012 Texas Instruments. All rights reserved.
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#ifndef __WL12XX_SCAN_H__
962306a36Sopenharmony_ci#define __WL12XX_SCAN_H__
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#include "../wlcore/wlcore.h"
1262306a36Sopenharmony_ci#include "../wlcore/cmd.h"
1362306a36Sopenharmony_ci#include "../wlcore/scan.h"
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci#define WL12XX_MAX_CHANNELS_5GHZ 23
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_cistruct basic_scan_params {
1862306a36Sopenharmony_ci	/* Scan option flags (WL1271_SCAN_OPT_*) */
1962306a36Sopenharmony_ci	__le16 scan_options;
2062306a36Sopenharmony_ci	u8 role_id;
2162306a36Sopenharmony_ci	/* Number of scan channels in the list (maximum 30) */
2262306a36Sopenharmony_ci	u8 n_ch;
2362306a36Sopenharmony_ci	/* This field indicates the number of probe requests to send
2462306a36Sopenharmony_ci	   per channel for an active scan */
2562306a36Sopenharmony_ci	u8 n_probe_reqs;
2662306a36Sopenharmony_ci	u8 tid_trigger;
2762306a36Sopenharmony_ci	u8 ssid_len;
2862306a36Sopenharmony_ci	u8 use_ssid_list;
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci	/* Rate bit field for sending the probes */
3162306a36Sopenharmony_ci	__le32 tx_rate;
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_ci	u8 ssid[IEEE80211_MAX_SSID_LEN];
3462306a36Sopenharmony_ci	/* Band to scan */
3562306a36Sopenharmony_ci	u8 band;
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci	u8 scan_tag;
3862306a36Sopenharmony_ci	u8 padding2[2];
3962306a36Sopenharmony_ci} __packed;
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_cistruct basic_scan_channel_params {
4262306a36Sopenharmony_ci	/* Duration in TU to wait for frames on a channel for active scan */
4362306a36Sopenharmony_ci	__le32 min_duration;
4462306a36Sopenharmony_ci	__le32 max_duration;
4562306a36Sopenharmony_ci	__le32 bssid_lsb;
4662306a36Sopenharmony_ci	__le16 bssid_msb;
4762306a36Sopenharmony_ci	u8 early_termination;
4862306a36Sopenharmony_ci	u8 tx_power_att;
4962306a36Sopenharmony_ci	u8 channel;
5062306a36Sopenharmony_ci	/* FW internal use only! */
5162306a36Sopenharmony_ci	u8 dfs_candidate;
5262306a36Sopenharmony_ci	u8 activity_detected;
5362306a36Sopenharmony_ci	u8 pad;
5462306a36Sopenharmony_ci} __packed;
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_cistruct wl1271_cmd_scan {
5762306a36Sopenharmony_ci	struct wl1271_cmd_header header;
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci	struct basic_scan_params params;
6062306a36Sopenharmony_ci	struct basic_scan_channel_params channels[WL1271_SCAN_MAX_CHANNELS];
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ci	/* src mac address */
6362306a36Sopenharmony_ci	u8 addr[ETH_ALEN];
6462306a36Sopenharmony_ci	u8 padding[2];
6562306a36Sopenharmony_ci} __packed;
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_cistruct wl1271_cmd_sched_scan_config {
6862306a36Sopenharmony_ci	struct wl1271_cmd_header header;
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_ci	__le32 intervals[SCAN_MAX_CYCLE_INTERVALS];
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ci	s8 rssi_threshold; /* for filtering (in dBm) */
7362306a36Sopenharmony_ci	s8 snr_threshold;  /* for filtering (in dB) */
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ci	u8 cycles;       /* maximum number of scan cycles */
7662306a36Sopenharmony_ci	u8 report_after; /* report when this number of results are received */
7762306a36Sopenharmony_ci	u8 terminate;    /* stop scanning after reporting */
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_ci	u8 tag;
8062306a36Sopenharmony_ci	u8 bss_type; /* for filtering */
8162306a36Sopenharmony_ci	u8 filter_type;
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_ci	u8 ssid_len;     /* For SCAN_SSID_FILTER_SPECIFIC */
8462306a36Sopenharmony_ci	u8 ssid[IEEE80211_MAX_SSID_LEN];
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_ci	u8 n_probe_reqs; /* Number of probes requests per channel */
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_ci	u8 passive[SCAN_MAX_BANDS];
8962306a36Sopenharmony_ci	u8 active[SCAN_MAX_BANDS];
9062306a36Sopenharmony_ci
9162306a36Sopenharmony_ci	u8 dfs;
9262306a36Sopenharmony_ci
9362306a36Sopenharmony_ci	u8 n_pactive_ch; /* number of pactive (passive until fw detects energy)
9462306a36Sopenharmony_ci			    channels in BG band */
9562306a36Sopenharmony_ci	u8 role_id;
9662306a36Sopenharmony_ci	u8 padding[1];
9762306a36Sopenharmony_ci	struct conn_scan_ch_params channels_2[MAX_CHANNELS_2GHZ];
9862306a36Sopenharmony_ci	struct conn_scan_ch_params channels_5[WL12XX_MAX_CHANNELS_5GHZ];
9962306a36Sopenharmony_ci	struct conn_scan_ch_params channels_4[MAX_CHANNELS_4GHZ];
10062306a36Sopenharmony_ci} __packed;
10162306a36Sopenharmony_ci
10262306a36Sopenharmony_cistruct wl1271_cmd_sched_scan_start {
10362306a36Sopenharmony_ci	struct wl1271_cmd_header header;
10462306a36Sopenharmony_ci
10562306a36Sopenharmony_ci	u8 tag;
10662306a36Sopenharmony_ci	u8 role_id;
10762306a36Sopenharmony_ci	u8 padding[2];
10862306a36Sopenharmony_ci} __packed;
10962306a36Sopenharmony_ci
11062306a36Sopenharmony_cistruct wl1271_cmd_sched_scan_stop {
11162306a36Sopenharmony_ci	struct wl1271_cmd_header header;
11262306a36Sopenharmony_ci
11362306a36Sopenharmony_ci	u8 tag;
11462306a36Sopenharmony_ci	u8 role_id;
11562306a36Sopenharmony_ci	u8 padding[2];
11662306a36Sopenharmony_ci} __packed;
11762306a36Sopenharmony_ci
11862306a36Sopenharmony_ciint wl12xx_scan_start(struct wl1271 *wl, struct wl12xx_vif *wlvif,
11962306a36Sopenharmony_ci		      struct cfg80211_scan_request *req);
12062306a36Sopenharmony_ciint wl12xx_scan_stop(struct wl1271 *wl, struct wl12xx_vif *wlvif);
12162306a36Sopenharmony_civoid wl12xx_scan_completed(struct wl1271 *wl, struct wl12xx_vif *wlvif);
12262306a36Sopenharmony_ciint wl12xx_sched_scan_start(struct wl1271 *wl, struct wl12xx_vif  *wlvif,
12362306a36Sopenharmony_ci			    struct cfg80211_sched_scan_request *req,
12462306a36Sopenharmony_ci			    struct ieee80211_scan_ies *ies);
12562306a36Sopenharmony_civoid wl12xx_scan_sched_scan_stop(struct wl1271 *wl,  struct wl12xx_vif *wlvif);
12662306a36Sopenharmony_ci#endif
127