162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * This file is part of wl18xx
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (C) 2012 Texas Instruments. All rights reserved.
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#ifndef __WL18XX_SCAN_H__
962306a36Sopenharmony_ci#define __WL18XX_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_cistruct tracking_ch_params {
1662306a36Sopenharmony_ci	struct conn_scan_ch_params channel;
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci	__le32 bssid_lsb;
1962306a36Sopenharmony_ci	__le16 bssid_msb;
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci	u8 padding[2];
2262306a36Sopenharmony_ci} __packed;
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci/* probe request rate */
2562306a36Sopenharmony_cienum
2662306a36Sopenharmony_ci{
2762306a36Sopenharmony_ci	WL18XX_SCAN_RATE_1	= 0,
2862306a36Sopenharmony_ci	WL18XX_SCAN_RATE_5_5	= 1,
2962306a36Sopenharmony_ci	WL18XX_SCAN_RATE_6	= 2,
3062306a36Sopenharmony_ci};
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci#define WL18XX_MAX_CHANNELS_5GHZ 32
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_cistruct wl18xx_cmd_scan_params {
3562306a36Sopenharmony_ci	struct wl1271_cmd_header header;
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci	u8 role_id;
3862306a36Sopenharmony_ci	u8 scan_type;
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci	s8 rssi_threshold; /* for filtering (in dBm) */
4162306a36Sopenharmony_ci	s8 snr_threshold;  /* for filtering (in dB) */
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ci	u8 bss_type;	   /* for filtering */
4462306a36Sopenharmony_ci	u8 ssid_from_list; /* use ssid from configured ssid list */
4562306a36Sopenharmony_ci	u8 filter;	   /* forward only results with matching ssids */
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci	/*
4862306a36Sopenharmony_ci	 * add broadcast ssid in addition to the configured ssids.
4962306a36Sopenharmony_ci	 * the driver should add dummy entry for it (?).
5062306a36Sopenharmony_ci	 */
5162306a36Sopenharmony_ci	u8 add_broadcast;
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci	u8 urgency;
5462306a36Sopenharmony_ci	u8 protect;	 /* ??? */
5562306a36Sopenharmony_ci	u8 n_probe_reqs;    /* Number of probes requests per channel */
5662306a36Sopenharmony_ci	u8 terminate_after; /* early terminate scan operation */
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ci	u8 passive[SCAN_MAX_BANDS]; /* number of passive scan channels */
5962306a36Sopenharmony_ci	u8 active[SCAN_MAX_BANDS];  /* number of active scan channels */
6062306a36Sopenharmony_ci	u8 dfs;		   /* number of dfs channels in 5ghz */
6162306a36Sopenharmony_ci	u8 passive_active; /* number of passive before active channels 2.4ghz */
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ci	__le16 short_cycles_msec;
6462306a36Sopenharmony_ci	__le16 long_cycles_msec;
6562306a36Sopenharmony_ci	u8 short_cycles_count;
6662306a36Sopenharmony_ci	u8 total_cycles; /* 0 - infinite */
6762306a36Sopenharmony_ci	u8 padding[2];
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ci	union {
7062306a36Sopenharmony_ci		struct {
7162306a36Sopenharmony_ci			struct conn_scan_ch_params channels_2[MAX_CHANNELS_2GHZ];
7262306a36Sopenharmony_ci			struct conn_scan_ch_params channels_5[WL18XX_MAX_CHANNELS_5GHZ];
7362306a36Sopenharmony_ci			struct conn_scan_ch_params channels_4[MAX_CHANNELS_4GHZ];
7462306a36Sopenharmony_ci		};
7562306a36Sopenharmony_ci		struct tracking_ch_params channels_tracking[WL1271_SCAN_MAX_CHANNELS];
7662306a36Sopenharmony_ci	} ;
7762306a36Sopenharmony_ci
7862306a36Sopenharmony_ci	u8 ssid[IEEE80211_MAX_SSID_LEN];
7962306a36Sopenharmony_ci	u8 ssid_len;	 /* For SCAN_SSID_FILTER_SPECIFIC */
8062306a36Sopenharmony_ci	u8 tag;
8162306a36Sopenharmony_ci	u8 rate;
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_ci	/* send SCAN_REPORT_EVENT in periodic scans after each cycle
8462306a36Sopenharmony_ci	* if number of results >= report_threshold. Must be 0 for
8562306a36Sopenharmony_ci	* non periodic scans
8662306a36Sopenharmony_ci	*/
8762306a36Sopenharmony_ci	u8 report_threshold;
8862306a36Sopenharmony_ci
8962306a36Sopenharmony_ci	/* Should periodic scan stop after a report event was created.
9062306a36Sopenharmony_ci	* Must be 0 for non periodic scans.
9162306a36Sopenharmony_ci	*/
9262306a36Sopenharmony_ci	u8 terminate_on_report;
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_ci	u8 padding1[3];
9562306a36Sopenharmony_ci} __packed;
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_cistruct wl18xx_cmd_scan_stop {
9862306a36Sopenharmony_ci	struct wl1271_cmd_header header;
9962306a36Sopenharmony_ci
10062306a36Sopenharmony_ci	u8 role_id;
10162306a36Sopenharmony_ci	u8 scan_type;
10262306a36Sopenharmony_ci	u8 padding[2];
10362306a36Sopenharmony_ci} __packed;
10462306a36Sopenharmony_ci
10562306a36Sopenharmony_ciint wl18xx_scan_start(struct wl1271 *wl, struct wl12xx_vif *wlvif,
10662306a36Sopenharmony_ci		      struct cfg80211_scan_request *req);
10762306a36Sopenharmony_ciint wl18xx_scan_stop(struct wl1271 *wl, struct wl12xx_vif *wlvif);
10862306a36Sopenharmony_civoid wl18xx_scan_completed(struct wl1271 *wl, struct wl12xx_vif *wlvif);
10962306a36Sopenharmony_ciint wl18xx_sched_scan_start(struct wl1271 *wl, struct wl12xx_vif *wlvif,
11062306a36Sopenharmony_ci			    struct cfg80211_sched_scan_request *req,
11162306a36Sopenharmony_ci			    struct ieee80211_scan_ies *ies);
11262306a36Sopenharmony_civoid wl18xx_scan_sched_scan_stop(struct wl1271 *wl, struct wl12xx_vif *wlvif);
11362306a36Sopenharmony_ci#endif
114