blob: 975668aaa2406d8b083d84e1020d1edf03478dda [file] [log] [blame]
/*
* Copyright (c) 2009-2012 Quantenna Communications, Inc.
* All rights reserved.
*/
#ifndef __RADAR_H__
#define __RADAR_H__
#include <qtn/registers.h>
#include <qtn/shared_params.h>
#include <linux/spinlock.h>
#define MIN_PULSE_SEP (5) /* 5 usec is minimum pulse separation */
/* Anything less is merged */
/* Radar registers */
#define QT4_GLBL_BASE_ADDR (0xe6000000)
#define QT4_TD_0_BASE_ADDR (0xe6090000)
#define QT4_TD_1_BASE_ADDR (0xe6091000)
#define QT4_RADAR_TH1_ADDR (QT4_TD_1_BASE_ADDR + 0x4e0)
#define QT4_RADAR_TH2_ADDR (QT4_TD_1_BASE_ADDR + 0x4e4)
#define QT4_RADAR_M_ADDR (QT4_TD_1_BASE_ADDR + 0x4c8)
#define QT4_RADAR_N_ADDR (QT4_TD_1_BASE_ADDR + 0x4cc)
#define QT4_RADAR_DOWNSAMPLE_3_0_ADDR (QT4_TD_1_BASE_ADDR + 0x4bc)
#define QT4_RADAR_NUMDELAY_3_0_ADDR (QT4_TD_1_BASE_ADDR + 0x4d0)
#define QT4_RADAR_TAGMODE_ADDR (QT4_TD_1_BASE_ADDR + 0x4dc)
#define QT4_RADAR_MINWIDTH_ADDR (QT4_TD_1_BASE_ADDR + 0x4c4)
#define QT4_RADAR_MAXWIDTH_ADDR (QT4_TD_1_BASE_ADDR + 0x4c0)
#define QT4_RADAR_RX_EXTENSION_AFTER_ADDR (QT4_GLBL_BASE_ADDR + 0x0e0)
#define REG_RADAR_RX_EXTENSION_AFTER_DEFAULT (0x00ff)
#define QT4_RADAR_RX_EXTENSION_BEFORE_ADDR (QT4_TD_1_BASE_ADDR + 0x568)
#define REG_RADAR_RX_EXTENSION_BEFORE_DEFAULT (0x00ff)
#define QT4_RADAR_RX_IN_PROG_EN_ADDR (QT4_TD_1_BASE_ADDR + 0x4d4)
#define REG_RADAR_RX_IN_PROG_EN_DEFAULT (0x1)
#define QT4_RADAR_SPRAM_IN_PROG_EN_ADDR (QT4_TD_1_BASE_ADDR + 0x560)
#define REG_RADAR_SPRAM_IN_PROG_EN_DEFAULT (0x0) /*(0x1) */
#define QT4_RADAR_INTR_EN_ADDR (QT4_TD_1_BASE_ADDR + 0X524)
#define QT4_RADAR_CNT_L (QT4_TD_1_BASE_ADDR + 0x518)
#define QT4_RADAR_PTR_L (QT4_TD_1_BASE_ADDR + 0x51c)
#define QT4_RADAR_PTR_H (QT4_TD_1_BASE_ADDR + 0x520)
#define QT4_RADAR_MEM_L (0xe6401000)
#define QT4_RADAR_MEM_H (0xe6401400)
#define ZC_OVERFLOW_ADDR_OFFSET (64) /* 4096 % (21 * 4) */
#define ZC_ADDR_MASK (0x7FF)
#define RADAR_ZC_MEM_SHIFT (2)
#define RADAR_ZC_MASK_1 (0x000000FF)
#define RADAR_ZC_MASK_2 (0x0000FF00)
#define RADAR_ZC_MASK_3 (0x00FF0000)
#define RADAR_ZC_MASK_4 (0xFF000000)
#define RADAR_ZERO_CROSS_MEM_DEPTH (896)
#define RADAR_ZERO_CROSS_MEM_PULSE_DEPTH (48) /* floor(1024 / 21) */
#define RADAR_ZERO_CROSS_PROC_PULSE_DEPTH (49) /* ceil(1024 / 21) */
#define RADAR_ZERO_CROSS_MEM_VALID_DEPTH (42) /* floor(896 / 21) */
#define PULSE_MEM_INC_STEP (0x4)
#define RADAR_PULSE_MEM_DEPTH (256)
#define QT4_RADAR_MAXWR (QT4_TD_1_BASE_ADDR + 0x514)
#define QT4_RADAR_ZWIN (QT4_TD_1_BASE_ADDR + 0x510)
#define QT4_RADAR_ZC_ADR (0xe6400000)
#define QT4_RADAR_ZC_ADR_INVLD (0xe6400e00)
#define QT4_RADAR_ZC_ADR_END (0xe6401000)
#define QT_BB_TD_RADAR_ZC_MAX_DEPTH (0x1000)
#define QT4_RADAR_CUR_CHMEM_ADR (QT4_TD_1_BASE_ADDR + 0x530)
#define QT4_RADAR_NEW_MODE (QT4_TD_1_BASE_ADDR + 0x564)
#define QT_RADAR_NEW_MODE_DEFAULT (0x1)
#define QT4_RADAR_NEW_MODE_MEM_L_PTR (QT4_TD_1_BASE_ADDR + 0x570)
#define QT4_RADAR_NEW_MODE_START_PTR (QT4_TD_1_BASE_ADDR + 0x56c)
#define FIFO_SIZE (RADAR_PULSE_MEM_DEPTH)
#define RADAR_TAG_BIT (0x08000000)
#define TH1_MAX (0x7ffffff)
#define TH1_DEFAULT (0x34000)
#define TH2_DEFAULT (0x8000)
#define DSAMPLE_DEFAULT (5)
#define NDELAY_DEFAULT (5)
#define RXINPROGEN_DEFAULT (0x1)
#define RADAR_IIR_HPF_ORDER_DEFAULT (10)
#define RADAR_IIR_LPF_SHIFT_DEFAULT (0)
#define RADAR_GAIN_NORM_DEFAULT (0x82)
#define RADAR_GAIN_NORM_TARGET_GAIN_HWVAL (0x23)
#define RADAR_GAIN_NORM_TARGET_GAIN_DEFAULT (0x19)
#define QT4_RADAR_IIR_HPF_ORDER (QT4_TD_1_BASE_ADDR + 0x540)
#define QT4_RADAR_IIR_LPF_SHIFT (QT4_TD_1_BASE_ADDR + 0x504)
#define QT4_RADAR_GAIN_NORM_ADDR (QT4_TD_1_BASE_ADDR + 0x508)
#define QT4_RADAR_GAIN_NORM_TARGET_GAIN_ADDR (QT4_TD_1_BASE_ADDR + 0x534)
#define QT4_RADAR_AGC_IN_PROG_ADDR (QT4_TD_1_BASE_ADDR + 0x4d8)
#define QT4_RADAR_TIMER_REC_EN_ADDR (QT4_TD_0_BASE_ADDR + 0x530)
#define TIMER_REC_EN_ADDR_MASK (0x80000000)
#define RADAR_AGC_IN_PROG_DEFAULT (0x0)
#define QT4_RADAR_DC_LUT_ADDR (QT4_TD_1_BASE_ADDR + 0x558)
#define RADAR_DC_LUT_DEFAULT (0x0)
#define WIN_PER_PULSE (28)
#define ZC_PER_PULSE (4 * WIN_PER_PULSE)
#define ZC_TO_READ_PER_POLLING (18)
#define MAX_PROC_PULSE_WRITE (64)
#define MAX_PROC_ZC_WRITE (16)
#define MAX_ZC_BAD_STATE_CTR (2)
#define MAX_PULSE_CNT_TO_RESET (1)
#define MAX_POLLING_CNT_BEFORE_RESET (100)
#define ABS_MAX_POLLING_CNT_BEFORE_RESET (160)
#define QT4_RADAR_NUM_OF_PULSES_B4_INT (QT4_TD_1_BASE_ADDR + 0x4c8)
#define QT4_RADAR_CLEAR_INT_STATUS (QT4_GLBL_BASE_ADDR + 0x320)
#define CLEAR_INT_STATUS_REG_RADAR_VAL (0x2)
#define RADAR_PROC_SIZE (8192)
#define RADAR_FH_PRI (3330)
#define RADAR_MAX_POW_TRACK (1)
#define RADAR_MAX_POW_MASK (0xf8000000)
#define MAX_RADAR_PULSE_READ_CNT (128)
#define MAX_RADAR_PULSE_READ_CNT_MASK (0x7F)
#define QT4_RADAR_IIR_A1 (QT4_TD_1_BASE_ADDR + 0x4e8)
#define QT4_RADAR_IIR_A2 (QT4_TD_1_BASE_ADDR + 0x4ec)
#define QT4_RADAR_IIR_A3 (QT4_TD_1_BASE_ADDR + 0x4f0)
#define QT4_RADAR_IIR_B0 (QT4_TD_1_BASE_ADDR + 0x4f4)
#define QT4_RADAR_IIR_B1 (QT4_TD_1_BASE_ADDR + 0x4f8)
#define QT4_RADAR_IIR_B2 (QT4_TD_1_BASE_ADDR + 0x4fc)
#define QT4_RADAR_IIR_B3 (QT4_TD_1_BASE_ADDR + 0x500)
/*#define RADAR_IIR_A1_40 0x3015
#define RADAR_IIR_A2_40 0xc92
#define RADAR_IIR_A3_40 0x3c55
#define RADAR_IIR_B0_40 0x20
#define RADAR_IIR_B1_40 0x5f
#define RADAR_IIR_B2_40 0x5f
#define RADAR_IIR_B3_40 0x20
#define RADAR_IIR_A1_80 0x39eb
#define RADAR_IIR_A2_80 0x59e
#define RADAR_IIR_A3_80 0x3e54
#define RADAR_IIR_B0_80 0xbc
#define RADAR_IIR_B1_80 0x233
#define RADAR_IIR_B2_80 0x233
#define RADAR_IIR_B3_80 0xbc // cover 80% of bw [-32,32] for 80MHz, [-16, 16] for 40MHz*/
#define RADAR_IIR_A1_40 0x33ec
#define RADAR_IIR_A2_40 0x929
#define RADAR_IIR_A3_40 0x3d4d
#define RADAR_IIR_B0_40 0x4c
#define RADAR_IIR_B1_40 0xe5
#define RADAR_IIR_B2_40 0xe5
#define RADAR_IIR_B3_40 0x4c
#define RADAR_IIR_A1_80 0x3F7E
#define RADAR_IIR_A2_80 0x421
#define RADAR_IIR_A3_80 0x3F0F
#define RADAR_IIR_B0_80 0x156
#define RADAR_IIR_B1_80 0x401
#define RADAR_IIR_B2_80 0x401
#define RADAR_IIR_B3_80 0x156 //cover 100% bw [-40, 40] for 80MHz, [-20, 20] for 40MHz
#define QT4_RADAR_TX_EXT (QT4_TD_1_BASE_ADDR + 0x53c)
#define QT4_RADAR_TX_EXT_VALUE 0x140 // unit is 0.00625us
#define QT3_RADAR_TH1_ADDR (0xe6090520)
#define QT3_RADAR_TH2_ADDR (0xe6090524)
#define QT3_RADAR_M_ADDR (0xe6090508)
#define QT3_RADAR_N_ADDR (0xe609050c)
#define QT3_RADAR_DOWNSAMPLE_3_0_ADDR (0xe60904fc)
#define QT3_RADAR_NUMDELAY_3_0_ADDR (0xe6090510)
#define QT3_RADAR_TAGMODE_ADDR (0xe609051c)
#define QT3_RADAR_MINWIDTH_ADDR (0xe6090504)
#define QT3_RADAR_MAXWIDTH_ADDR (0xe6090500)
#define QT3_RADAR_RX_EXTENSION_AFTER_ADDR (0xe60000e0)
#define QT3_RADAR_RX_EXTENSION_BEFORE_ADDR (0xe60905a8)
#define QT3_RADAR_RX_IN_PROG_EN_ADDR (0xe6090514)
#define QT3_RADAR_SPRAM_IN_PROG_EN_ADDR (0xe60905a0)
#define QT3_RADAR_INTR_EN_ADDR (0xe6090564)
#define QT3_RADAR_CNT_L (0xe6090558)
#define QT3_RADAR_PTR_L (0xe609055c)
#define QT3_RADAR_PTR_H (0xe6090560)
#define QT3_RADAR_MEM_L (0xe6401000)
#define QT3_RADAR_MEM_H (0xe6401400)
#define QT3_RADAR_MAXWR (0xe6090554)
#define QT3_RADAR_ZWIN (0xe6090550)
#define QT3_RADAR_ZC_ADR (0xe6400000)
#define QT3_RADAR_ZC_ADR_INVLD (0xe6400e00)
#define QT3_RADAR_ZC_ADR_END (0xe6401000)
#define QT3_RADAR_CUR_CHMEM_ADR (0xe6090570)
#define QT3_RADAR_NEW_MODE (0xe60905a4)
#define QT3_RADAR_NEW_MODE_MEM_L_PTR (0xe60905b0)
#define QT3_RADAR_NEW_MODE_START_PTR (0xe60905ac)
#define QT3_RADAR_IIR_HPF_ORDER (0xe6090580)
#define QT3_RADAR_IIR_LPF_SHIFT (0xe6090544)
#define QT3_RADAR_GAIN_NORM_ADDR (0xe6090548)
#define QT3_RADAR_GAIN_NORM_TARGET_GAIN_ADDR (0xe6090574)
#define QT3_RADAR_AGC_IN_PROG_ADDR (0xe6090518)
#define QT3_RADAR_TIMER_REC_EN_ADDR (0xe60905f4)
#define QT3_RADAR_DC_LUT_ADDR (0xe6090598)
#define QT3_RADAR_NUM_OF_PULSES_B4_INT (0xe6090508)
#define QT3_RADAR_CLEAR_INT_STATUS (0xe6000320)
#define QT3_TD_0_BASE_ADDR (0xe6090000)
#define QT3_RADAR_IIR_A1 (QT3_TD_0_BASE_ADDR + 0x528)
#define QT3_RADAR_IIR_A2 (QT3_TD_0_BASE_ADDR + 0x52c)
#define QT3_RADAR_IIR_A3 (QT3_TD_0_BASE_ADDR + 0x530)
#define QT3_RADAR_IIR_B0 (QT3_TD_0_BASE_ADDR + 0x534)
#define QT3_RADAR_IIR_B1 (QT3_TD_0_BASE_ADDR + 0x538)
#define QT3_RADAR_IIR_B2 (QT3_TD_0_BASE_ADDR + 0x53c)
#define QT3_RADAR_IIR_B3 (QT3_TD_0_BASE_ADDR + 0x540)
#define QT3_RADAR_TX_EXT (QT3_TD_0_BASE_ADDR + 0x57c)
#define QT3_RADAR_TX_EXT_VALUE 0x00
# define QT_RADAR(x) QT4_RADAR_##x
typedef struct {
u32 base[2];
u32 ptr;
u32 bb_base;
int irq;
u32 flags;
u32 n_irq;
u32 poll_freq;
u32 th1; /* threshold 1 */
u32 th2; /* threshold 2 */
u32 flush; /* timer wrap */
u32 irq_en;
spinlock_t lock;
u32 chip; /* chipID */
u32 radar_en;
void (*callback)(void);
bool (*radar_is_dfs_chan)(uint8_t wifi_chan);
bool (*radar_is_dfs_weather_chan)(uint8_t wifi_chan);
void *radar_stats_send_arg;
void (*radar_stats_send)(void *data,
int (*pulse_copy_iter)(void *dest, void *src, int pulse_indx),
void *pulse_buf, int num_pulses);
/*
* Fields for pulse history maintenance.
* - all fields set to 0 during initialization
* - at each polling, ph_buf[ph_idx] is updated with a new pulse count and then ph_idx is
* changed to next (ring)
* - at each polling, ph_sum is updated
*/
#define RADAR_PH_BUFLEN 20 /* The radar pulse history buffer length */
#define RADAR_PH_BUFLEN_LSR 240 /* The LSR pulse history buffer length */
#define RADAR_TIMER_BAD 9 /* Wait time in the bad state */
#define RADAR_TIMER_BAD_MAX 24 /* Wait time when a rejection happens */
#define RADAR_TIMER_STEP_DETECT 2 /* Radar timer step in the bad state when the detected radars match */
#define RADAR_PS_TIMER_MAX 20
#define RADAR_MIN_DETECT_PULSE_CNT 14 /* If number of pulses in a window are bigger than RADAR_MIN_DETECT_PULSE_CNT, there should be a valid detection */
u16 ph_buf[RADAR_PH_BUFLEN_LSR]; /* pulse count hisotry buffer (ring) */
u16 ph_idx; /* where in 'ph_buf' to write a new pulse count */
u32 ph_sum; /* sum of all pulse counts in 'ph_buf' */
u16 ph_idx_LSR; /* where in 'ph_buf' to write a new pulse count */
u32 ph_sum_LSR; /* sum of all pulse counts in 'ph_buf' */
unsigned last_rej_w; /* Width of the last radar detection */
unsigned last_rej_pri[3]; /* PRI of the last radar detection */
bool curr_radar_state; /* Current state of the radar logic; true -> good state, and false -> bad state */
int bad_state_timer; /* Current time at the bad state */
bool bad_state_detection; /* Has there been any radar detections in the bad state? */
unsigned poll_cnt_after_reset;
unsigned pulse_timer_reset_time;
unsigned pulse_timer_reset_cnt;
u8 wifi_channel;
uint32_t bw;
} radar_cb_t;
#define RADAR_OCAC_BEGIN BIT(1)
#define RADAR_OCAC_END BIT(0)
#define RADAR_OCAC_PTS_SIZE 10
struct radar_fifo_pt_s {
uint8_t ocac_status;
uint32_t fifo_pt;
};
/*
* Shared by QDRV and RADAR
*/
struct radar_ocac_info_s {
spinlock_t lock;
bool ocac_enabled;
uint8_t ocac_scan_chan;
struct radar_fifo_pt_s ocac_radar_pts[RADAR_OCAC_PTS_SIZE];
uint8_t array_ps; /* array is ocac_radar_pts */
bool weather_channel_yes; /*0: not weather channel, 1: weather channel */
};
#define DFS_RQMT_UNKNOWN 0
#define DFS_RQMT_EU 1
#define DFS_RQMT_US 2
#define DFS_RQMT_JP 3
#define DFS_RQMT_AU 4
#define DFS_RQMT_BR 5
#define DFS_RQMT_CL 6
int radar_register(void (*dfs_mark_callback)(void));
int radar_register_is_dfs_chan(
bool (*qdrv_radar_is_dfs_chan)(uint8_t wifi_chan));
int radar_register_is_dfs_weather_chan(
bool (*qdrv_radar_is_dfs_weather_chan)(uint8_t wifi_chan));
void radar_disable(void);
void radar_enable(void);
bool radar_start(const char *region);
void radar_stop(void);
int radar_register_statcb(void (*stats_send)(void *data,
int (*pulse_copy_iter)(void *dest, void *src, int pulse_indx),
void *pulse_buf, int num_pulses),
void *stats_send_arg);
unsigned dfs_rqmt_code(const char *region);
void radar_set_shared_params(struct shared_params *p_params);
int radar_set_chan(uint8_t chan);
uint8_t radar_get_chan(void);
bool sta_dfs_is_region_required(void);
void qdrv_sta_dfs_enable(int sta_dfs_enable);
void qdrv_cac_instant_completed(void);
struct radar_ocac_info_s *radar_ocac_info_addr_get(void);
void radar_record_buffer_pt(uint32_t *pt);
bool radar_get_status(void);
void radar_set_bw(uint32_t bw);
#endif /* __RADAR_H__ */