/*
|
* Copyright (c) 2015 South Silicon Valley Microelectronics Inc.
|
* Copyright (c) 2015 iComm Corporation
|
*
|
* This program is free software: you can redistribute it and/or modify
|
* it under the terms of the GNU General Public License as published by
|
* the Free Software Foundation, either version 3 of the License, or
|
* (at your option) any later version.
|
* This program is distributed in the hope that it will be useful, but
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
* See the GNU General Public License for more details.
|
* You should have received a copy of the GNU General Public License
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
*/
|
|
#ifndef _SSV6200_COMMON_H_
|
#define _SSV6200_COMMON_H_
|
#define FW_VERSION_REG ADR_TX_SEG
|
#define M_ENG_CPU 0x00
|
#define M_ENG_HWHCI 0x01
|
#define M_ENG_EMPTY 0x02
|
#define M_ENG_ENCRYPT 0x03
|
#define M_ENG_MACRX 0x04
|
#define M_ENG_MIC 0x05
|
#define M_ENG_TX_EDCA0 0x06
|
#define M_ENG_TX_EDCA1 0x07
|
#define M_ENG_TX_EDCA2 0x08
|
#define M_ENG_TX_EDCA3 0x09
|
#define M_ENG_TX_MNG 0x0A
|
#define M_ENG_ENCRYPT_SEC 0x0B
|
#define M_ENG_MIC_SEC 0x0C
|
#define M_ENG_RESERVED_1 0x0D
|
#define M_ENG_RESERVED_2 0x0E
|
#define M_ENG_TRASH_CAN 0x0F
|
#define M_ENG_MAX (M_ENG_TRASH_CAN+1)
|
#define M_CPU_HWENG 0x00
|
#define M_CPU_TXL34CS 0x01
|
#define M_CPU_RXL34CS 0x02
|
#define M_CPU_DEFRAG 0x03
|
#define M_CPU_EDCATX 0x04
|
#define M_CPU_RXDATA 0x05
|
#define M_CPU_RXMGMT 0x06
|
#define M_CPU_RXCTRL 0x07
|
#define M_CPU_FRAG 0x08
|
#define M_CPU_TXTPUT 0x09
|
#ifndef ID_TRAP_SW_TXTPUT
|
#define ID_TRAP_SW_TXTPUT 50
|
#endif
|
#define M0_TXREQ 0
|
#define M1_TXREQ 1
|
#define M2_TXREQ 2
|
#define M0_RXEVENT 3
|
#define M2_RXEVENT 4
|
#define HOST_CMD 5
|
#define HOST_EVENT 6
|
#define TEST_CMD 7
|
#define SSV6XXX_RX_DESC_LEN \
|
(sizeof(struct ssv6200_rx_desc) + \
|
sizeof(struct ssv6200_rxphy_info))
|
#define SSV6XXX_TX_DESC_LEN \
|
(sizeof(struct ssv6200_tx_desc) + 0)
|
#define TXPB_OFFSET 80
|
#define RXPB_OFFSET 80
|
#define SSV6200_TX_PKT_RSVD_SETTING 0x3
|
#define SSV6200_TX_PKT_RSVD SSV6200_TX_PKT_RSVD_SETTING*16
|
#define SSV6200_ALLOC_RSVD TXPB_OFFSET+SSV6200_TX_PKT_RSVD
|
#define SSV62XX_TX_MAX_RATES 3
|
|
enum ssv6xxx_sr_bhvr {
|
SUSPEND_RESUME_0,
|
SUSPEND_RESUME_1,
|
SUSPEND_RESUME_MAX
|
};
|
|
enum ssv6xxx_reboot_bhvr {
|
SSV_SYS_REBOOT = 1,
|
SSV_SYS_HALF,
|
SSV_SYS_POWER_OFF
|
};
|
|
struct fw_rc_retry_params {
|
u32 count:4;
|
u32 drate:6;
|
u32 crate:6;
|
u32 rts_cts_nav:16;
|
u32 frame_consume_time:10;
|
u32 dl_length:12;
|
u32 RSVD:10;
|
} __attribute__((packed));
|
struct ssv6200_tx_desc
|
{
|
u32 len:16;
|
u32 c_type:3;
|
u32 f80211:1;
|
u32 qos:1;
|
u32 ht:1;
|
u32 use_4addr:1;
|
u32 RSVD_0:3;
|
u32 bc_que:1;
|
u32 security:1;
|
u32 more_data:1;
|
u32 stype_b5b4:2;
|
u32 extra_info:1;
|
u32 fCmd;
|
u32 hdr_offset:8;
|
u32 frag:1;
|
u32 unicast:1;
|
u32 hdr_len:6;
|
u32 tx_report:1;
|
u32 tx_burst:1;
|
u32 ack_policy:2;
|
u32 aggregation:1;
|
u32 RSVD_1:3;
|
u32 do_rts_cts:2;
|
u32 reason:6;
|
u32 payload_offset:8;
|
u32 RSVD_4:7;
|
u32 RSVD_2:1;
|
u32 fCmdIdx:3;
|
u32 wsid:4;
|
u32 txq_idx:3;
|
u32 TxF_ID:6;
|
u32 rts_cts_nav:16;
|
u32 frame_consume_time:10;
|
u32 crate_idx:6;
|
u32 drate_idx:6;
|
u32 dl_length:12;
|
u32 RSVD_3:14;
|
u32 RESERVED[8];
|
struct fw_rc_retry_params rc_params[SSV62XX_TX_MAX_RATES];
|
};
|
struct ssv6200_rx_desc
|
{
|
u32 len:16;
|
u32 c_type:3;
|
u32 f80211:1;
|
u32 qos:1;
|
u32 ht:1;
|
u32 use_4addr:1;
|
u32 l3cs_err:1;
|
u32 l4cs_err:1;
|
u32 align2:1;
|
u32 RSVD_0:2;
|
u32 psm:1;
|
u32 stype_b5b4:2;
|
u32 extra_info:1;
|
u32 edca0_used:4;
|
u32 edca1_used:5;
|
u32 edca2_used:5;
|
u32 edca3_used:5;
|
u32 mng_used:4;
|
u32 tx_page_used:9;
|
u32 hdr_offset:8;
|
u32 frag:1;
|
u32 unicast:1;
|
u32 hdr_len:6;
|
u32 RxResult:8;
|
u32 wildcard_bssid:1;
|
u32 RSVD_1:1;
|
u32 reason:6;
|
u32 payload_offset:8;
|
u32 tx_id_used:8;
|
u32 fCmdIdx:3;
|
u32 wsid:4;
|
u32 RSVD_3:3;
|
u32 rate_idx:6;
|
};
|
struct ssv6200_rxphy_info {
|
u32 len:16;
|
u32 rsvd0:16;
|
u32 mode:3;
|
u32 ch_bw:3;
|
u32 preamble:1;
|
u32 ht_short_gi:1;
|
u32 rate:7;
|
u32 rsvd1:1;
|
u32 smoothing:1;
|
u32 no_sounding:1;
|
u32 aggregate:1;
|
u32 stbc:2;
|
u32 fec:1;
|
u32 n_ess:2;
|
u32 rsvd2:8;
|
u32 l_length:12;
|
u32 l_rate:3;
|
u32 rsvd3:17;
|
u32 rsvd4;
|
u32 rpci:8;
|
u32 snr:8;
|
u32 service:16;
|
};
|
struct ssv6200_rxphy_info_padding {
|
u32 rpci:8;
|
u32 snr:8;
|
u32 RSVD:16;
|
};
|
struct ssv6200_txphy_info {
|
u32 rsvd[7];
|
};
|
#ifdef CONFIG_P2P_NOA
|
struct ssv6xxx_p2p_noa_param {
|
u32 duration;
|
u32 interval;
|
u32 start_time;
|
u32 enable:8;
|
u32 count:8;
|
u8 addr[6];
|
u8 vif_id;
|
}__attribute__((packed));
|
#endif
|
typedef struct cfg_host_cmd {
|
u32 len:16;
|
u32 c_type:3;
|
u32 RSVD0:5;
|
u32 h_cmd:8;
|
u32 cmd_seq_no;
|
union {
|
u32 dummy;
|
u8 dat8[0];
|
u16 dat16[0];
|
u32 dat32[0];
|
};
|
} HDR_HostCmd;
|
#define HOST_CMD_HDR_LEN ((size_t)(((HDR_HostCmd *)100)->dat8)-100U)
|
struct sdio_rxtput_cfg {
|
u32 size_per_frame;
|
u32 total_frames;
|
};
|
typedef enum{
|
SSV6XXX_HOST_CMD_START = 0 ,
|
SSV6XXX_HOST_CMD_LOG ,
|
SSV6XXX_HOST_CMD_PS ,
|
SSV6XXX_HOST_CMD_INIT_CALI ,
|
SSV6XXX_HOST_CMD_RX_TPUT ,
|
SSV6XXX_HOST_CMD_TX_TPUT ,
|
SSV6XXX_HOST_CMD_WATCHDOG_START,
|
SSV6XXX_HOST_CMD_WATCHDOG_STOP,
|
#ifdef FW_WSID_WATCH_LIST
|
SSV6XXX_HOST_CMD_WSID_OP ,
|
#endif
|
#ifdef CONFIG_P2P_NOA
|
SSV6XXX_HOST_CMD_SET_NOA ,
|
#endif
|
SSV6XXX_HOST_SOC_CMD_MAXID ,
|
}ssv6xxx_host_cmd_id;
|
#define SSV_NUM_HW_STA 2
|
typedef struct cfg_host_event {
|
u32 len:16;
|
u32 c_type:3;
|
u32 RSVD0:5;
|
u32 h_event:8;
|
u32 evt_seq_no;
|
u8 dat[0];
|
} HDR_HostEvent;
|
typedef enum{
|
#ifdef USE_CMD_RESP
|
SOC_EVT_CMD_RESP ,
|
SOC_EVT_SCAN_RESULT ,
|
SOC_EVT_DEAUTH ,
|
#else
|
SOC_EVT_GET_REG_RESP ,
|
#endif
|
SOC_EVT_NO_BA ,
|
SOC_EVT_RC_MPDU_REPORT ,
|
SOC_EVT_RC_AMPDU_REPORT ,
|
SOC_EVT_LOG ,
|
#ifdef CONFIG_P2P_NOA
|
SOC_EVT_NOA ,
|
#endif
|
SOC_EVT_USER_END ,
|
SOC_EVT_SDIO_TEST_COMMAND ,
|
SOC_EVT_RESET_HOST ,
|
SOC_EVT_SDIO_TXTPUT_RESULT ,
|
SOC_EVT_WATCHDOG_TRIGGER ,
|
SOC_EVT_TXLOOPBK_RESULT ,
|
SOC_EVT_MAXID ,
|
} ssv6xxx_soc_event;
|
#ifdef CONFIG_P2P_NOA
|
typedef enum{
|
SSV6XXX_NOA_START = 0 ,
|
SSV6XXX_NOA_STOP ,
|
}ssv6xxx_host_noa_event;
|
struct ssv62xx_noa_evt {
|
u8 evt_id;
|
u8 vif;
|
} __attribute__((packed));
|
#endif
|
typedef enum{
|
SSV6XXX_RC_COUNTER_CLEAR = 1 ,
|
SSV6XXX_RC_REPORT ,
|
}ssv6xxx_host_rate_control_event;
|
#define MAX_AGGR_NUM (24)
|
struct ssv62xx_tx_rate {
|
s8 data_rate;
|
u8 count;
|
} __attribute__((packed));
|
struct ampdu_ba_notify_data {
|
u8 wsid;
|
struct ssv62xx_tx_rate tried_rates[SSV62XX_TX_MAX_RATES];
|
u16 seq_no[MAX_AGGR_NUM];
|
} __attribute__((packed));
|
struct firmware_rate_control_report_data{
|
u8 wsid;
|
struct ssv62xx_tx_rate rates[SSV62XX_TX_MAX_RATES];
|
u16 ampdu_len;
|
u16 ampdu_ack_len;
|
int ack_signal;
|
} __attribute__((packed));
|
#define RC_RETRY_PARAM_OFFSET ((sizeof(struct fw_rc_retry_params))*SSV62XX_TX_MAX_RATES)
|
#define SSV_RC_RATE_MAX 39
|
#ifdef FW_WSID_WATCH_LIST
|
enum SSV6XXX_WSID_OPS
|
{
|
SSV6XXX_WSID_OPS_ADD,
|
SSV6XXX_WSID_OPS_DEL,
|
SSV6XXX_WSID_OPS_RESETALL,
|
SSV6XXX_WSID_OPS_ENABLE_CAPS,
|
SSV6XXX_WSID_OPS_DISABLE_CAPS,
|
SSV6XXX_WSID_OPS_HWWSID_PAIRWISE_SET_TYPE,
|
SSV6XXX_WSID_OPS_HWWSID_GROUP_SET_TYPE,
|
SSV6XXX_WSID_OPS_MAX
|
};
|
enum SSV6XXX_WSID_SEC
|
{
|
SSV6XXX_WSID_SEC_NONE = 0,
|
SSV6XXX_WSID_SEC_PAIRWISE = 1<<0,
|
SSV6XXX_WSID_SEC_GROUP = 1<<1,
|
};
|
enum SSV6XXX_WSID_SEC_TYPE
|
{
|
SSV6XXX_WSID_SEC_SW,
|
SSV6XXX_WSID_SEC_HW,
|
SSV6XXX_WSID_SEC_TYPE_MAX
|
};
|
enum SSV6XXX_RETURN_STATE
|
{
|
SSV6XXX_STATE_OK,
|
SSV6XXX_STATE_NG,
|
SSV6XXX_STATE_MAX
|
};
|
struct ssv6xxx_wsid_params
|
{
|
u8 cmd;
|
u8 wsid_idx;
|
u8 target_wsid[6];
|
u8 hw_security;
|
};
|
#endif
|
struct ssv6xxx_iqk_cfg {
|
u32 cfg_xtal:8;
|
u32 cfg_pa:8;
|
u32 cfg_pabias_ctrl:8;
|
u32 cfg_pacascode_ctrl:8;
|
u32 cfg_tssi_trgt:8;
|
u32 cfg_tssi_div:8;
|
u32 cfg_def_tx_scale_11b:8;
|
u32 cfg_def_tx_scale_11b_p0d5:8;
|
u32 cfg_def_tx_scale_11g:8;
|
u32 cfg_def_tx_scale_11g_p0d5:8;
|
u32 cmd_sel;
|
union {
|
u32 fx_sel;
|
u32 argv;
|
};
|
u32 phy_tbl_size;
|
u32 rf_tbl_size;
|
};
|
#define PHY_SETTING_SIZE sizeof(phy_setting)
|
#ifdef CONFIG_SSV_CABRIO_E
|
struct ssv6xxx_ch_cfg {
|
u32 reg_addr;
|
u32 ch1_12_value;
|
u32 ch13_14_value;
|
};
|
#define IQK_CFG_LEN (sizeof(struct ssv6xxx_iqk_cfg))
|
#define RF_SETTING_SIZE (sizeof(asic_rf_setting))
|
#endif
|
#define MAX_PHY_SETTING_TABLE_SIZE 1920
|
#define MAX_RF_SETTING_TABLE_SIZE 512
|
typedef enum {
|
SSV6XXX_VOLT_DCDC_CONVERT = 0,
|
SSV6XXX_VOLT_LDO_CONVERT,
|
} ssv6xxx_cfg_volt;
|
typedef enum {
|
SSV6XXX_VOLT_33V = 0,
|
SSV6XXX_VOLT_42V,
|
} ssv6xxx_cfg_volt_value;
|
typedef enum {
|
SSV6XXX_IQK_CFG_XTAL_26M = 0,
|
SSV6XXX_IQK_CFG_XTAL_40M,
|
SSV6XXX_IQK_CFG_XTAL_24M,
|
SSV6XXX_IQK_CFG_XTAL_MAX,
|
} ssv6xxx_iqk_cfg_xtal;
|
typedef enum {
|
SSV6XXX_IQK_CFG_PA_DEF = 0,
|
SSV6XXX_IQK_CFG_PA_LI_MPB,
|
SSV6XXX_IQK_CFG_PA_LI_EVB,
|
SSV6XXX_IQK_CFG_PA_HP,
|
} ssv6xxx_iqk_cfg_pa;
|
typedef enum {
|
SSV6XXX_IQK_CMD_INIT_CALI = 0,
|
SSV6XXX_IQK_CMD_RTBL_LOAD,
|
SSV6XXX_IQK_CMD_RTBL_LOAD_DEF,
|
SSV6XXX_IQK_CMD_RTBL_RESET,
|
SSV6XXX_IQK_CMD_RTBL_SET,
|
SSV6XXX_IQK_CMD_RTBL_EXPORT,
|
SSV6XXX_IQK_CMD_TK_EVM,
|
SSV6XXX_IQK_CMD_TK_TONE,
|
SSV6XXX_IQK_CMD_TK_CHCH,
|
} ssv6xxx_iqk_cmd_sel;
|
#define SSV6XXX_IQK_TEMPERATURE 0x00000004
|
#define SSV6XXX_IQK_RXDC 0x00000008
|
#define SSV6XXX_IQK_RXRC 0x00000010
|
#define SSV6XXX_IQK_TXDC 0x00000020
|
#define SSV6XXX_IQK_TXIQ 0x00000040
|
#define SSV6XXX_IQK_RXIQ 0x00000080
|
#define SSV6XXX_IQK_TSSI 0x00000100
|
#define SSV6XXX_IQK_PAPD 0x00000200
|
typedef struct ssv_cabrio_reg_st {
|
u32 address;
|
u32 data;
|
} ssv_cabrio_reg;
|
typedef enum __PBuf_Type_E {
|
NOTYPE_BUF = 0,
|
TX_BUF = 1,
|
RX_BUF = 2
|
} PBuf_Type_E;
|
struct SKB_info_st
|
{
|
struct ieee80211_sta *sta;
|
u16 mpdu_retry_counter;
|
unsigned long aggr_timestamp;
|
u16 ampdu_tx_status;
|
u16 ampdu_tx_final_retry_count;
|
u16 lowest_rate;
|
struct fw_rc_retry_params rates[SSV62XX_TX_MAX_RATES];
|
#ifdef CONFIG_DEBUG_SKB_TIMESTAMP
|
ktime_t timestamp;
|
#endif
|
#ifdef MULTI_THREAD_ENCRYPT
|
volatile u8 crypt_st;
|
#endif
|
};
|
typedef struct SKB_info_st SKB_info;
|
typedef struct SKB_info_st *p_SKB_info;
|
#define SSV_SKB_info_size (sizeof(struct SKB_info_st))
|
#ifdef MULTI_THREAD_ENCRYPT
|
enum ssv_pkt_crypt_status
|
{
|
PKT_CRYPT_ST_DEC_PRE,
|
PKT_CRYPT_ST_ENC_PRE,
|
PKT_CRYPT_ST_DEC_DONE,
|
PKT_CRYPT_ST_ENC_DONE,
|
PKT_CRYPT_ST_FAIL,
|
PKT_CRYPT_ST_NOT_SUPPORT
|
};
|
#endif
|
#ifdef CONFIG_DEBUG_SKB_TIMESTAMP
|
#define SKB_DURATION_TIMEOUT_MS 100
|
enum ssv_debug_skb_timestamp
|
{
|
SKB_DURATION_STAGE_TX_ENQ,
|
SKB_DURATION_STAGE_TO_SDIO,
|
SKB_DURATION_STAGE_IN_HWQ,
|
SKB_DURATION_STAGE_END
|
};
|
#endif
|
#define SSV6051Q_P1 0x00000000
|
#define SSV6051Q_P2 0x70000000
|
#define SSV6051Z 0x71000000
|
#define SSV6051Q 0x73000000
|
#define SSV6051P 0x75000000
|
#ifdef CONFIG_SSV_CABRIO_E
|
struct ssv6xxx_tx_loopback {
|
u32 reg;
|
u32 val;
|
u32 restore_val;
|
u8 restore;
|
u8 delay_ms;
|
};
|
#endif
|
#endif
|