294 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2/* Copyright(c) 2009-2010 Realtek Corporation.*/3 4#ifndef __RTL8821AE__FW__H__5#define __RTL8821AE__FW__H__6#include "def.h"7 8#define FW_8821AE_SIZE 0x80009#define FW_8821AE_START_ADDRESS 0x100010#define FW_8821AE_END_ADDRESS 0x5FFF11#define FW_8821AE_PAGE_SIZE 409612#define FW_8821AE_POLLING_DELAY 513#define FW_8821AE_POLLING_TIMEOUT_COUNT 600014 15#define IS_FW_HEADER_EXIST_8812(_pfwhdr) \16 ((le16_to_cpu(_pfwhdr->signature) & 0xFFF0) == 0x9500)17 18#define IS_FW_HEADER_EXIST_8821(_pfwhdr) \19 ((le16_to_cpu(_pfwhdr->signature) & 0xFFF0) == 0x2100)20 21#define USE_OLD_WOWLAN_DEBUG_FW 022 23#define H2C_8821AE_RSVDPAGE_LOC_LEN 524#define H2C_8821AE_PWEMODE_LENGTH 725#define H2C_8821AE_JOINBSSRPT_LENGTH 126#define H2C_8821AE_AP_OFFLOAD_LENGTH 327#define H2C_8821AE_WOWLAN_LENGTH 328#define H2C_8821AE_KEEP_ALIVE_CTRL_LENGTH 329#if (USE_OLD_WOWLAN_DEBUG_FW == 0)30#define H2C_8821AE_REMOTE_WAKE_CTRL_LEN 131#else32#define H2C_8821AE_REMOTE_WAKE_CTRL_LEN 333#endif34#define H2C_8821AE_AOAC_GLOBAL_INFO_LEN 235#define H2C_8821AE_AOAC_RSVDPAGE_LOC_LEN 736#define H2C_8821AE_DISCONNECT_DECISION_CTRL_LEN 337 38/* Fw PS state for RPWM.39*BIT[2:0] = HW state40 41*BIT[3] = Protocol PS state,421: register active state ,430: register sleep state44 45*BIT[4] = sub-state46*/47#define FW_PS_GO_ON BIT(0)48#define FW_PS_TX_NULL BIT(1)49#define FW_PS_RF_ON BIT(2)50#define FW_PS_REGISTER_ACTIVE BIT(3)51 52#define FW_PS_DPS BIT(0)53#define FW_PS_LCLK (FW_PS_DPS)54#define FW_PS_RF_OFF BIT(1)55#define FW_PS_ALL_ON BIT(2)56#define FW_PS_ST_ACTIVE BIT(3)57#define FW_PS_ISR_ENABLE BIT(4)58#define FW_PS_IMR_ENABLE BIT(5)59 60#define FW_PS_ACK BIT(6)61#define FW_PS_TOGGLE BIT(7)62 63 /* 8821AE RPWM value*/64 /* BIT[0] = 1: 32k, 0: 40M*/65 /* 32k*/66#define FW_PS_CLOCK_OFF BIT(0)67/*40M*/68#define FW_PS_CLOCK_ON 069 70#define FW_PS_STATE_MASK (0x0F)71#define FW_PS_STATE_HW_MASK (0x07)72/*ISR_ENABLE, IMR_ENABLE, and PS mode should be inherited.*/73#define FW_PS_STATE_INT_MASK (0x3F)74 75#define FW_PS_STATE(x) (FW_PS_STATE_MASK & (x))76#define FW_PS_STATE_HW(x) (FW_PS_STATE_HW_MASK & (x))77#define FW_PS_STATE_INT(x) (FW_PS_STATE_INT_MASK & (x))78#define FW_PS_ISR_VAL(x) ((x) & 0x70)79#define FW_PS_IMR_MASK(x) ((x) & 0xDF)80#define FW_PS_KEEP_IMR(x) ((x) & 0x20)81 82#define FW_PS_STATE_S0 (FW_PS_DPS)83#define FW_PS_STATE_S1 (FW_PS_LCLK)84#define FW_PS_STATE_S2 (FW_PS_RF_OFF)85#define FW_PS_STATE_S3 (FW_PS_ALL_ON)86#define FW_PS_STATE_S4 ((FW_PS_ST_ACTIVE) | (FW_PS_ALL_ON))87 /* ((FW_PS_RF_ON) | (FW_PS_REGISTER_ACTIVE))*/88#define FW_PS_STATE_ALL_ON_8821AE (FW_PS_CLOCK_ON)89 /* (FW_PS_RF_ON)*/90#define FW_PS_STATE_RF_ON_8821AE (FW_PS_CLOCK_ON)91 /* 0x0*/92#define FW_PS_STATE_RF_OFF_8821AE (FW_PS_CLOCK_ON)93 /* (FW_PS_STATE_RF_OFF)*/94#define FW_PS_STATE_RF_OFF_LOW_PWR_8821AE (FW_PS_CLOCK_OFF)95 96#define FW_PS_STATE_ALL_ON_92C (FW_PS_STATE_S4)97#define FW_PS_STATE_RF_ON_92C (FW_PS_STATE_S3)98#define FW_PS_STATE_RF_OFF_92C (FW_PS_STATE_S2)99#define FW_PS_STATE_RF_OFF_LOW_PWR_92C (FW_PS_STATE_S1)100 101/* For 8821AE H2C PwrMode Cmd ID 5.*/102#define FW_PWR_STATE_ACTIVE ((FW_PS_RF_ON) | (FW_PS_REGISTER_ACTIVE))103#define FW_PWR_STATE_RF_OFF 0104 105#define FW_PS_IS_ACK(x) ((x) & FW_PS_ACK)106#define FW_PS_IS_CLK_ON(x) ((x) & (FW_PS_RF_OFF | FW_PS_ALL_ON))107#define FW_PS_IS_RF_ON(x) ((x) & (FW_PS_ALL_ON))108#define FW_PS_IS_ACTIVE(x) ((x) & (FW_PS_ST_ACTIVE))109#define FW_PS_IS_CPWM_INT(x) ((x) & 0x40)110 111#define FW_CLR_PS_STATE(x) ((x) = ((x) & (0xF0)))112 113#define IS_IN_LOW_POWER_STATE_8821AE(__state) \114 (FW_PS_STATE(__state) == FW_PS_CLOCK_OFF)115 116#define FW_PWR_STATE_ACTIVE ((FW_PS_RF_ON) | (FW_PS_REGISTER_ACTIVE))117#define FW_PWR_STATE_RF_OFF 0118 119enum rtl8821a_h2c_cmd {120 H2C_8821AE_RSVDPAGE = 0,121 H2C_8821AE_MSRRPT = 1,122 H2C_8821AE_SCAN = 2,123 H2C_8821AE_KEEP_ALIVE_CTRL = 3,124 H2C_8821AE_DISCONNECT_DECISION = 4,125 H2C_8821AE_INIT_OFFLOAD = 6,126 H2C_8821AE_AP_OFFLOAD = 8,127 H2C_8821AE_BCN_RSVDPAGE = 9,128 H2C_8821AE_PROBERSP_RSVDPAGE = 10,129 130 H2C_8821AE_SETPWRMODE = 0x20,131 H2C_8821AE_PS_TUNING_PARA = 0x21,132 H2C_8821AE_PS_TUNING_PARA2 = 0x22,133 H2C_8821AE_PS_LPS_PARA = 0x23,134 H2C_8821AE_P2P_PS_OFFLOAD = 024,135 136 H2C_8821AE_WO_WLAN = 0x80,137 H2C_8821AE_REMOTE_WAKE_CTRL = 0x81,138 H2C_8821AE_AOAC_GLOBAL_INFO = 0x82,139 H2C_8821AE_AOAC_RSVDPAGE = 0x83,140 141 H2C_RSSI_21AE_REPORT = 0x42,142 H2C_8821AE_RA_MASK = 0x40,143 H2C_8821AE_SELECTIVE_SUSPEND_ROF_CMD,144 H2C_8821AE_P2P_PS_MODE,145 H2C_8821AE_PSD_RESULT,146 /*Not defined CTW CMD for P2P yet*/147 H2C_8821AE_P2P_PS_CTW_CMD,148 MAX_8821AE_H2CCMD149};150 151#define pagenum_128(_len) (u32)(((_len)>>7) + ((_len)&0x7F ? 1 : 0))152 153#define SET_8812_H2CCMD_WOWLAN_FUNC_ENABLE(__cmd, __value) \154 u8p_replace_bits(__cmd, __value, BIT(0))155#define SET_8812_H2CCMD_WOWLAN_PATTERN_MATCH_ENABLE(__cmd, __value) \156 u8p_replace_bits(__cmd, __value, BIT(1))157#define SET_8812_H2CCMD_WOWLAN_MAGIC_PKT_ENABLE(__cmd, __value) \158 u8p_replace_bits(__cmd, __value, BIT(2))159#define SET_8812_H2CCMD_WOWLAN_UNICAST_PKT_ENABLE(__cmd, __value) \160 u8p_replace_bits(__cmd, __value, BIT(3))161#define SET_8812_H2CCMD_WOWLAN_ALL_PKT_DROP(__cmd, __value) \162 u8p_replace_bits(__cmd, __value, BIT(4))163#define SET_8812_H2CCMD_WOWLAN_GPIO_ACTIVE(__cmd, __value) \164 u8p_replace_bits(__cmd, __value, BIT(5))165#define SET_8812_H2CCMD_WOWLAN_REKEY_WAKE_UP(__cmd, __value) \166 u8p_replace_bits(__cmd, __value, BIT(6))167#define SET_8812_H2CCMD_WOWLAN_DISCONNECT_WAKE_UP(__cmd, __value) \168 u8p_replace_bits(__cmd, __value, BIT(7))169#define SET_8812_H2CCMD_WOWLAN_GPIONUM(__cmd, __value) \170 *(u8 *)(__cmd + 1) = __value171#define SET_8812_H2CCMD_WOWLAN_GPIO_DURATION(__cmd, __value) \172 *(u8 *)(__cmd + 2) = __value173 174#define SET_H2CCMD_PWRMODE_PARM_MODE(__ph2ccmd, __val) \175 *(u8 *)__ph2ccmd = __val176#define SET_H2CCMD_PWRMODE_PARM_RLBM(__cmd, __value) \177 u8p_replace_bits(__cmd + 1, __value, GENMASK(3, 0))178#define SET_H2CCMD_PWRMODE_PARM_SMART_PS(__cmd, __value) \179 u8p_replace_bits(__cmd + 1, __value, GENMASK(7, 4))180#define SET_H2CCMD_PWRMODE_PARM_AWAKE_INTERVAL(__cmd, __value) \181 *(u8 *)(__cmd + 2) = __value182#define SET_H2CCMD_PWRMODE_PARM_ALL_QUEUE_UAPSD(__cmd, __value) \183 *(u8 *)(__cmd + 3) = __value184#define SET_H2CCMD_PWRMODE_PARM_PWR_STATE(__cmd, __value) \185 *(u8 *)(__cmd + 4) = __value186#define SET_H2CCMD_PWRMODE_PARM_BYTE5(__cmd, __value) \187 *(u8 *)(__cmd + 5) = __value188 189#define SET_H2CCMD_RSVDPAGE_LOC_PSPOLL(__ph2ccmd, __val) \190 *(u8 *)(__ph2ccmd + 1) = __val191#define SET_H2CCMD_RSVDPAGE_LOC_NULL_DATA(__ph2ccmd, __val) \192 *(u8 *)(__ph2ccmd + 2) = __val193#define SET_H2CCMD_RSVDPAGE_LOC_QOS_NULL_DATA(__ph2ccmd, __val) \194 *(u8 *)(__ph2ccmd + 3) = __val195#define SET_H2CCMD_RSVDPAGE_LOC_BT_QOS_NULL_DATA(__ph2ccmd, __val) \196 *(u8 *)(__ph2ccmd + 4) = __val197 198/* _MEDIA_STATUS_RPT_PARM_CMD1 */199#define SET_H2CCMD_MSRRPT_PARM_OPMODE(__cmd, __value) \200 u8p_replace_bits(__cmd + 1, __value, BIT(0))201#define SET_H2CCMD_MSRRPT_PARM_MACID_IND(__cmd, __value) \202 u8p_replace_bits(__cmd + 1, __value, BIT(1))203 204/* AP_OFFLOAD */205#define SET_H2CCMD_AP_OFFLOAD_ON(__cmd, __value) \206 *(u8 *)__cmd = __value207#define SET_H2CCMD_AP_OFFLOAD_HIDDEN(__cmd, __value) \208 *(u8 *)(__cmd + 1) = __value209#define SET_H2CCMD_AP_OFFLOAD_DENYANY(__cmd, __value) \210 *(u8 *)(__cmd + 2) = __value211#define SET_H2CCMD_AP_OFFLOAD_WAKEUP_EVT_RPT(__cmd, __value) \212 *(u8 *)(__cmd + 3) = __value213 214/* Keep Alive Control*/215#define SET_8812_H2CCMD_KEEP_ALIVE_ENABLE(__cmd, __value) \216 u8p_replace_bits(__cmd, __value, BIT(0))217#define SET_8812_H2CCMD_KEEP_ALIVE_ACCPEPT_USER_DEFINED(__cmd, __value) \218 u8p_replace_bits(__cmd, __value, BIT(1))219#define SET_8812_H2CCMD_KEEP_ALIVE_PERIOD(__cmd, __value) \220 *(u8 *)(__cmd + 1) = __value221 222/*REMOTE_WAKE_CTRL */223#define SET_8812_H2CCMD_REMOTE_WAKECTRL_ENABLE(__cmd, __value) \224 u8p_replace_bits(__cmd, __value, BIT(0))225#define SET_8812_H2CCMD_REMOTE_WAKE_CTRL_ARP_OFFLOAD_EN(__cmd, __value)\226 u8p_replace_bits(__cmd, __value, BIT(1))227#define SET_8812_H2CCMD_REMOTE_WAKE_CTRL_NDP_OFFLOAD_EN(__cmd, __value)\228 u8p_replace_bits(__cmd, __value, BIT(2))229#define SET_8812_H2CCMD_REMOTE_WAKE_CTRL_GTK_OFFLOAD_EN(__cmd, __value)\230 u8p_replace_bits(__cmd, __value, BIT(3))231#define SET_8812_H2CCMD_REMOTE_WAKE_CTRL_REALWOWV2_EN(__cmd, __value)\232 u8p_replace_bits(__cmd, __value, BIT(6))233 234/* GTK_OFFLOAD */235#define SET_8812_H2CCMD_AOAC_GLOBAL_INFO_PAIRWISE_ENC_ALG(__cmd, __value)\236 *(u8 *)__cmd = __value237#define SET_8812_H2CCMD_AOAC_GLOBAL_INFO_GROUP_ENC_ALG(__cmd, __value) \238 *(u8 *)(__cmd + 1) = __value239 240/* AOAC_RSVDPAGE_LOC */241#define SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_REMOTE_WAKE_CTRL_INFO(__cmd, __value) \242 *(u8 *)__cmd = __value243#define SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_ARP_RSP(__cmd, __value) \244 *(u8 *)(__cmd + 1) = __value245#define SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_NEIGHBOR_ADV(__cmd, __value)\246 *(u8 *)(__cmd + 2) = __value247#define SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_GTK_RSP(__cmd, __value) \248 *(u8 *)(__cmd + 3) = __value249#define SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_GTK_INFO(__cmd, __value) \250 *(u8 *)(__cmd + 4) = __value251#define SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_GTK_EXT_MEM(__cmd, __value) \252 *(u8 *)(__cmd + 5) = __value253 254/* Disconnect_Decision_Control */255#define SET_8812_H2CCMD_DISCONNECT_DECISION_CTRL_ENABLE(__cmd, __value) \256 u8p_replace_bits(__cmd, __value, BIT(0))257#define SET_8812_H2CCMD_DISCONNECT_DECISION_CTRL_USER_SETTING(__cmd, __value)\258 u8p_replace_bits(__cmd, __value, BIT(1))259#define SET_8812_H2CCMD_DISCONNECT_DECISION_CTRL_CHECK_PERIOD(__cmd, __value)\260 *(u8 *)(__cmd + 1) = __value261#define SET_8812_H2CCMD_DISCONNECT_DECISION_CTRL_TRYPKT_NUM(__cmd, __value)\262 *(u8 *)(__cmd + 2) = __value263 264int rtl8821ae_download_fw(struct ieee80211_hw *hw, bool buse_wake_on_wlan_fw);265#if (USE_SPECIFIC_FW_TO_SUPPORT_WOWLAN == 1)266void rtl8821ae_set_fw_related_for_wowlan(struct ieee80211_hw *hw,267 bool used_wowlan_fw);268 269#endif270void rtl8821ae_fill_h2c_cmd(struct ieee80211_hw *hw, u8 element_id,271 u32 cmd_len, u8 *cmdbuffer);272void rtl8821ae_firmware_selfreset(struct ieee80211_hw *hw);273void rtl8821ae_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode);274void rtl8821ae_set_fw_media_status_rpt_cmd(struct ieee80211_hw *hw,275 u8 mstatus);276void rtl8821ae_set_fw_ap_off_load_cmd(struct ieee80211_hw *hw,277 u8 ap_offload_enable);278void rtl8821ae_set_fw_rsvdpagepkt(struct ieee80211_hw *hw,279 bool b_dl_finished, bool dl_whole_packet);280void rtl8812ae_set_fw_rsvdpagepkt(struct ieee80211_hw *hw,281 bool b_dl_finished, bool dl_whole_packet);282void rtl8821ae_set_p2p_ps_offload_cmd(struct ieee80211_hw *hw,283 u8 p2p_ps_state);284void rtl8821ae_set_fw_wowlan_mode(struct ieee80211_hw *hw, bool func_en);285void rtl8821ae_set_fw_remote_wake_ctrl_cmd(struct ieee80211_hw *hw,286 u8 enable);287void rtl8821ae_set_fw_keep_alive_cmd(struct ieee80211_hw *hw, bool func_en);288void rtl8821ae_set_fw_disconnect_decision_ctrl_cmd(struct ieee80211_hw *hw,289 bool enabled);290void rtl8821ae_set_fw_global_info_cmd(struct ieee80211_hw *hw);291void rtl8821ae_c2h_ra_report_handler(struct ieee80211_hw *hw,292 u8 *cmd_buf, u8 cmd_len);293#endif294