18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: ISC */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * Copyright (C) 2016 Lorenzo Bianconi <lorenzo.bianconi83@gmail.com>
48c2ecf20Sopenharmony_ci */
58c2ecf20Sopenharmony_ci
68c2ecf20Sopenharmony_ci#ifndef __MT76x02_DFS_H
78c2ecf20Sopenharmony_ci#define __MT76x02_DFS_H
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_ci#include <linux/types.h>
108c2ecf20Sopenharmony_ci#include <linux/nl80211.h>
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_ci#define MT_DFS_GP_INTERVAL		(10 << 4) /* 64 us unit */
138c2ecf20Sopenharmony_ci#define MT_DFS_NUM_ENGINES		4
148c2ecf20Sopenharmony_ci
158c2ecf20Sopenharmony_ci/* bbp params */
168c2ecf20Sopenharmony_ci#define MT_DFS_SYM_ROUND		0
178c2ecf20Sopenharmony_ci#define MT_DFS_DELTA_DELAY		2
188c2ecf20Sopenharmony_ci#define MT_DFS_VGA_MASK			0
198c2ecf20Sopenharmony_ci#define MT_DFS_PWR_GAIN_OFFSET		3
208c2ecf20Sopenharmony_ci#define MT_DFS_PWR_DOWN_TIME		0xf
218c2ecf20Sopenharmony_ci#define MT_DFS_RX_PE_MASK		0xff
228c2ecf20Sopenharmony_ci#define MT_DFS_PKT_END_MASK		0
238c2ecf20Sopenharmony_ci#define MT_DFS_CH_EN			0xf
248c2ecf20Sopenharmony_ci
258c2ecf20Sopenharmony_ci/* sw detector params */
268c2ecf20Sopenharmony_ci#define MT_DFS_EVENT_LOOP		64
278c2ecf20Sopenharmony_ci#define MT_DFS_SW_TIMEOUT		(HZ / 20)
288c2ecf20Sopenharmony_ci#define MT_DFS_EVENT_WINDOW		(HZ / 5)
298c2ecf20Sopenharmony_ci#define MT_DFS_SEQUENCE_WINDOW		(200 * (1 << 20))
308c2ecf20Sopenharmony_ci#define MT_DFS_EVENT_TIME_MARGIN	2000
318c2ecf20Sopenharmony_ci#define MT_DFS_PRI_MARGIN		4
328c2ecf20Sopenharmony_ci#define MT_DFS_SEQUENCE_TH		6
338c2ecf20Sopenharmony_ci
348c2ecf20Sopenharmony_ci#define MT_DFS_FCC_MAX_PRI		((28570 << 1) + 1000)
358c2ecf20Sopenharmony_ci#define MT_DFS_FCC_MIN_PRI		(3000 - 2)
368c2ecf20Sopenharmony_ci#define MT_DFS_JP_MAX_PRI		((80000 << 1) + 1000)
378c2ecf20Sopenharmony_ci#define MT_DFS_JP_MIN_PRI		(28500 - 2)
388c2ecf20Sopenharmony_ci#define MT_DFS_ETSI_MAX_PRI		(133333 + 125000 + 117647 + 1000)
398c2ecf20Sopenharmony_ci#define MT_DFS_ETSI_MIN_PRI		(4500 - 20)
408c2ecf20Sopenharmony_ci
418c2ecf20Sopenharmony_cistruct mt76x02_radar_specs {
428c2ecf20Sopenharmony_ci	u8 mode;
438c2ecf20Sopenharmony_ci	u16 avg_len;
448c2ecf20Sopenharmony_ci	u16 e_low;
458c2ecf20Sopenharmony_ci	u16 e_high;
468c2ecf20Sopenharmony_ci	u16 w_low;
478c2ecf20Sopenharmony_ci	u16 w_high;
488c2ecf20Sopenharmony_ci	u16 w_margin;
498c2ecf20Sopenharmony_ci	u32 t_low;
508c2ecf20Sopenharmony_ci	u32 t_high;
518c2ecf20Sopenharmony_ci	u16 t_margin;
528c2ecf20Sopenharmony_ci	u32 b_low;
538c2ecf20Sopenharmony_ci	u32 b_high;
548c2ecf20Sopenharmony_ci	u32 event_expiration;
558c2ecf20Sopenharmony_ci	u16 pwr_jmp;
568c2ecf20Sopenharmony_ci};
578c2ecf20Sopenharmony_ci
588c2ecf20Sopenharmony_ci#define MT_DFS_CHECK_EVENT(x)		((x) != GENMASK(31, 0))
598c2ecf20Sopenharmony_ci#define MT_DFS_EVENT_ENGINE(x)		(((x) & BIT(31)) ? 2 : 0)
608c2ecf20Sopenharmony_ci#define MT_DFS_EVENT_TIMESTAMP(x)	((x) & GENMASK(21, 0))
618c2ecf20Sopenharmony_ci#define MT_DFS_EVENT_WIDTH(x)		((x) & GENMASK(11, 0))
628c2ecf20Sopenharmony_cistruct mt76x02_dfs_event {
638c2ecf20Sopenharmony_ci	unsigned long fetch_ts;
648c2ecf20Sopenharmony_ci	u32 ts;
658c2ecf20Sopenharmony_ci	u16 width;
668c2ecf20Sopenharmony_ci	u8 engine;
678c2ecf20Sopenharmony_ci};
688c2ecf20Sopenharmony_ci
698c2ecf20Sopenharmony_ci#define MT_DFS_EVENT_BUFLEN		256
708c2ecf20Sopenharmony_cistruct mt76x02_dfs_event_rb {
718c2ecf20Sopenharmony_ci	struct mt76x02_dfs_event data[MT_DFS_EVENT_BUFLEN];
728c2ecf20Sopenharmony_ci	int h_rb, t_rb;
738c2ecf20Sopenharmony_ci};
748c2ecf20Sopenharmony_ci
758c2ecf20Sopenharmony_cistruct mt76x02_dfs_sequence {
768c2ecf20Sopenharmony_ci	struct list_head head;
778c2ecf20Sopenharmony_ci	u32 first_ts;
788c2ecf20Sopenharmony_ci	u32 last_ts;
798c2ecf20Sopenharmony_ci	u32 pri;
808c2ecf20Sopenharmony_ci	u16 count;
818c2ecf20Sopenharmony_ci	u8 engine;
828c2ecf20Sopenharmony_ci};
838c2ecf20Sopenharmony_ci
848c2ecf20Sopenharmony_cistruct mt76x02_dfs_hw_pulse {
858c2ecf20Sopenharmony_ci	u8 engine;
868c2ecf20Sopenharmony_ci	u32 period;
878c2ecf20Sopenharmony_ci	u32 w1;
888c2ecf20Sopenharmony_ci	u32 w2;
898c2ecf20Sopenharmony_ci	u32 burst;
908c2ecf20Sopenharmony_ci};
918c2ecf20Sopenharmony_ci
928c2ecf20Sopenharmony_cistruct mt76x02_dfs_sw_detector_params {
938c2ecf20Sopenharmony_ci	u32 min_pri;
948c2ecf20Sopenharmony_ci	u32 max_pri;
958c2ecf20Sopenharmony_ci	u32 pri_margin;
968c2ecf20Sopenharmony_ci};
978c2ecf20Sopenharmony_ci
988c2ecf20Sopenharmony_cistruct mt76x02_dfs_engine_stats {
998c2ecf20Sopenharmony_ci	u32 hw_pattern;
1008c2ecf20Sopenharmony_ci	u32 hw_pulse_discarded;
1018c2ecf20Sopenharmony_ci	u32 sw_pattern;
1028c2ecf20Sopenharmony_ci};
1038c2ecf20Sopenharmony_ci
1048c2ecf20Sopenharmony_cistruct mt76x02_dfs_seq_stats {
1058c2ecf20Sopenharmony_ci	u32 seq_pool_len;
1068c2ecf20Sopenharmony_ci	u32 seq_len;
1078c2ecf20Sopenharmony_ci};
1088c2ecf20Sopenharmony_ci
1098c2ecf20Sopenharmony_cistruct mt76x02_dfs_pattern_detector {
1108c2ecf20Sopenharmony_ci	u8 chirp_pulse_cnt;
1118c2ecf20Sopenharmony_ci	u32 chirp_pulse_ts;
1128c2ecf20Sopenharmony_ci
1138c2ecf20Sopenharmony_ci	struct mt76x02_dfs_sw_detector_params sw_dpd_params;
1148c2ecf20Sopenharmony_ci	struct mt76x02_dfs_event_rb event_rb[2];
1158c2ecf20Sopenharmony_ci
1168c2ecf20Sopenharmony_ci	struct list_head sequences;
1178c2ecf20Sopenharmony_ci	struct list_head seq_pool;
1188c2ecf20Sopenharmony_ci	struct mt76x02_dfs_seq_stats seq_stats;
1198c2ecf20Sopenharmony_ci
1208c2ecf20Sopenharmony_ci	unsigned long last_sw_check;
1218c2ecf20Sopenharmony_ci	u32 last_event_ts;
1228c2ecf20Sopenharmony_ci
1238c2ecf20Sopenharmony_ci	struct mt76x02_dfs_engine_stats stats[MT_DFS_NUM_ENGINES];
1248c2ecf20Sopenharmony_ci	struct tasklet_struct dfs_tasklet;
1258c2ecf20Sopenharmony_ci};
1268c2ecf20Sopenharmony_ci
1278c2ecf20Sopenharmony_civoid mt76x02_dfs_init_params(struct mt76x02_dev *dev);
1288c2ecf20Sopenharmony_civoid mt76x02_dfs_init_detector(struct mt76x02_dev *dev);
1298c2ecf20Sopenharmony_civoid mt76x02_regd_notifier(struct wiphy *wiphy,
1308c2ecf20Sopenharmony_ci			   struct regulatory_request *request);
1318c2ecf20Sopenharmony_civoid mt76x02_phy_dfs_adjust_agc(struct mt76x02_dev *dev);
1328c2ecf20Sopenharmony_ci#endif /* __MT76x02_DFS_H */
133