1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun /* Copyright(c) 2009-2014 Realtek Corporation.*/ 3*4882a593Smuzhiyun 4*4882a593Smuzhiyun #ifndef __RTL92E__FW__H__ 5*4882a593Smuzhiyun #define __RTL92E__FW__H__ 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun #define FW_8192C_SIZE 0x8000 8*4882a593Smuzhiyun #define FW_8192C_START_ADDRESS 0x1000 9*4882a593Smuzhiyun #define FW_8192C_END_ADDRESS 0x5FFF 10*4882a593Smuzhiyun #define FW_8192C_PAGE_SIZE 4096 11*4882a593Smuzhiyun #define FW_8192C_POLLING_DELAY 5 12*4882a593Smuzhiyun #define FW_8192C_POLLING_TIMEOUT_COUNT 3000 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun #define IS_FW_HEADER_EXIST(_pfwhdr) \ 15*4882a593Smuzhiyun ((le16_to_cpu(_pfwhdr->signature) & 0xFFF0) == 0x92E0) 16*4882a593Smuzhiyun #define USE_OLD_WOWLAN_DEBUG_FW 0 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun #define H2C_92E_RSVDPAGE_LOC_LEN 5 19*4882a593Smuzhiyun #define H2C_92E_PWEMODE_LENGTH 7 20*4882a593Smuzhiyun #define H2C_92E_JOINBSSRPT_LENGTH 1 21*4882a593Smuzhiyun #define H2C_92E_AP_OFFLOAD_LENGTH 3 22*4882a593Smuzhiyun #define H2C_92E_WOWLAN_LENGTH 3 23*4882a593Smuzhiyun #define H2C_92E_KEEP_ALIVE_CTRL_LENGTH 3 24*4882a593Smuzhiyun #if (USE_OLD_WOWLAN_DEBUG_FW == 0) 25*4882a593Smuzhiyun #define H2C_92E_REMOTE_WAKE_CTRL_LEN 1 26*4882a593Smuzhiyun #else 27*4882a593Smuzhiyun #define H2C_92E_REMOTE_WAKE_CTRL_LEN 3 28*4882a593Smuzhiyun #endif 29*4882a593Smuzhiyun #define H2C_92E_AOAC_GLOBAL_INFO_LEN 2 30*4882a593Smuzhiyun #define H2C_92E_AOAC_RSVDPAGE_LOC_LEN 7 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun /* Fw PS state for RPWM. 33*4882a593Smuzhiyun *BIT[2:0] = HW state 34*4882a593Smuzhiyun *BIT[3] = Protocol PS state, 1: register active state, 0: register sleep state 35*4882a593Smuzhiyun *BIT[4] = sub-state 36*4882a593Smuzhiyun */ 37*4882a593Smuzhiyun #define FW_PS_RF_ON BIT(2) 38*4882a593Smuzhiyun #define FW_PS_REGISTER_ACTIVE BIT(3) 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun #define FW_PS_ACK BIT(6) 41*4882a593Smuzhiyun #define FW_PS_TOGGLE BIT(7) 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun /* 92E RPWM value*/ 44*4882a593Smuzhiyun /* BIT[0] = 1: 32k, 0: 40M*/ 45*4882a593Smuzhiyun #define FW_PS_CLOCK_OFF BIT(0) /* 32k */ 46*4882a593Smuzhiyun #define FW_PS_CLOCK_ON 0 /* 40M */ 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun #define FW_PS_STATE_MASK (0x0F) 49*4882a593Smuzhiyun #define FW_PS_STATE_HW_MASK (0x07) 50*4882a593Smuzhiyun #define FW_PS_STATE_INT_MASK (0x3F) 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun #define FW_PS_STATE(x) (FW_PS_STATE_MASK & (x)) 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun #define FW_PS_STATE_ALL_ON_92E (FW_PS_CLOCK_ON) 55*4882a593Smuzhiyun #define FW_PS_STATE_RF_ON_92E (FW_PS_CLOCK_ON) 56*4882a593Smuzhiyun #define FW_PS_STATE_RF_OFF_92E (FW_PS_CLOCK_ON) 57*4882a593Smuzhiyun #define FW_PS_STATE_RF_OFF_LOW_PWR (FW_PS_CLOCK_OFF) 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun /* For 92E H2C PwrMode Cmd ID 5.*/ 60*4882a593Smuzhiyun #define FW_PWR_STATE_ACTIVE ((FW_PS_RF_ON) | (FW_PS_REGISTER_ACTIVE)) 61*4882a593Smuzhiyun #define FW_PWR_STATE_RF_OFF 0 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun #define FW_PS_IS_ACK(x) ((x) & FW_PS_ACK) 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun #define IS_IN_LOW_POWER_STATE_92E(__state) \ 66*4882a593Smuzhiyun (FW_PS_STATE(__state) == FW_PS_CLOCK_OFF) 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun #define FW_PWR_STATE_ACTIVE ((FW_PS_RF_ON) | (FW_PS_REGISTER_ACTIVE)) 69*4882a593Smuzhiyun #define FW_PWR_STATE_RF_OFF 0 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun enum rtl8192e_h2c_cmd { 72*4882a593Smuzhiyun H2C_92E_RSVDPAGE = 0, 73*4882a593Smuzhiyun H2C_92E_MSRRPT = 1, 74*4882a593Smuzhiyun H2C_92E_SCAN = 2, 75*4882a593Smuzhiyun H2C_92E_KEEP_ALIVE_CTRL = 3, 76*4882a593Smuzhiyun H2C_92E_DISCONNECT_DECISION = 4, 77*4882a593Smuzhiyun #if (USE_OLD_WOWLAN_DEBUG_FW == 1) 78*4882a593Smuzhiyun H2C_92E_WO_WLAN = 5, 79*4882a593Smuzhiyun #endif 80*4882a593Smuzhiyun H2C_92E_INIT_OFFLOAD = 6, 81*4882a593Smuzhiyun #if (USE_OLD_WOWLAN_DEBUG_FW == 1) 82*4882a593Smuzhiyun H2C_92E_REMOTE_WAKE_CTRL = 7, 83*4882a593Smuzhiyun #endif 84*4882a593Smuzhiyun H2C_92E_AP_OFFLOAD = 8, 85*4882a593Smuzhiyun H2C_92E_BCN_RSVDPAGE = 9, 86*4882a593Smuzhiyun H2C_92E_PROBERSP_RSVDPAGE = 10, 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun H2C_92E_SETPWRMODE = 0x20, 89*4882a593Smuzhiyun H2C_92E_PS_TUNING_PARA = 0x21, 90*4882a593Smuzhiyun H2C_92E_PS_TUNING_PARA2 = 0x22, 91*4882a593Smuzhiyun H2C_92E_PS_LPS_PARA = 0x23, 92*4882a593Smuzhiyun H2C_92E_P2P_PS_OFFLOAD = 024, 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun #if (USE_OLD_WOWLAN_DEBUG_FW == 0) 95*4882a593Smuzhiyun H2C_92E_WO_WLAN = 0x80, 96*4882a593Smuzhiyun H2C_92E_REMOTE_WAKE_CTRL = 0x81, 97*4882a593Smuzhiyun H2C_92E_AOAC_GLOBAL_INFO = 0x82, 98*4882a593Smuzhiyun H2C_92E_AOAC_RSVDPAGE = 0x83, 99*4882a593Smuzhiyun #endif 100*4882a593Smuzhiyun H2C_92E_RA_MASK = 0x40, 101*4882a593Smuzhiyun H2C_92E_RSSI_REPORT = 0x42, 102*4882a593Smuzhiyun H2C_92E_SELECTIVE_SUSPEND_ROF_CMD, 103*4882a593Smuzhiyun H2C_92E_P2P_PS_MODE, 104*4882a593Smuzhiyun H2C_92E_PSD_RESULT, 105*4882a593Smuzhiyun /*Not defined CTW CMD for P2P yet*/ 106*4882a593Smuzhiyun H2C_92E_P2P_PS_CTW_CMD, 107*4882a593Smuzhiyun MAX_92E_H2CCMD 108*4882a593Smuzhiyun }; 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun #define pagenum_128(_len) \ 111*4882a593Smuzhiyun (u32)(((_len) >> 7) + ((_len) & 0x7F ? 1 : 0)) 112*4882a593Smuzhiyun 113*4882a593Smuzhiyun #define SET_H2CCMD_PWRMODE_PARM_MODE(__ph2ccmd, __val) \ 114*4882a593Smuzhiyun *(u8 *)__ph2ccmd = __val; 115*4882a593Smuzhiyun #define SET_H2CCMD_PWRMODE_PARM_RLBM(__cmd, __val) \ 116*4882a593Smuzhiyun u8p_replace_bits(__cmd + 1, __val, GENMASK(3, 0)) 117*4882a593Smuzhiyun #define SET_H2CCMD_PWRMODE_PARM_SMART_PS(__cmd, __val) \ 118*4882a593Smuzhiyun u8p_replace_bits(__cmd + 1, __val, GENMASK(7, 4)) 119*4882a593Smuzhiyun #define SET_H2CCMD_PWRMODE_PARM_AWAKE_INTERVAL(__cmd, __val) \ 120*4882a593Smuzhiyun *(u8 *)(__cmd + 2) = __val; 121*4882a593Smuzhiyun #define SET_H2CCMD_PWRMODE_PARM_ALL_QUEUE_UAPSD(__cmd, __val) \ 122*4882a593Smuzhiyun *(u8 *)(__cmd + 3) = __val; 123*4882a593Smuzhiyun #define SET_H2CCMD_PWRMODE_PARM_PWR_STATE(__cmd, __val) \ 124*4882a593Smuzhiyun *(u8 *)(__cmd + 4) = __val; 125*4882a593Smuzhiyun #define SET_H2CCMD_PWRMODE_PARM_BYTE5(__cmd, __val) \ 126*4882a593Smuzhiyun *(u8 *)(__cmd + 5) = __val; 127*4882a593Smuzhiyun 128*4882a593Smuzhiyun #define SET_H2CCMD_RSVDPAGE_LOC_PROBE_RSP(__ph2ccmd, __val) \ 129*4882a593Smuzhiyun *(u8 *)__ph2ccmd = __val; 130*4882a593Smuzhiyun #define SET_H2CCMD_RSVDPAGE_LOC_PSPOLL(__ph2ccmd, __val) \ 131*4882a593Smuzhiyun *(u8 *)(__ph2ccmd + 1) = __val; 132*4882a593Smuzhiyun #define SET_H2CCMD_RSVDPAGE_LOC_NULL_DATA(__ph2ccmd, __val) \ 133*4882a593Smuzhiyun *(u8 *)(__ph2ccmd + 2) = __val; 134*4882a593Smuzhiyun #define SET_H2CCMD_RSVDPAGE_LOC_QOS_NULL_DATA(__ph2ccmd, __val) \ 135*4882a593Smuzhiyun *(u8 *)(__ph2ccmd + 3) = __val; 136*4882a593Smuzhiyun #define SET_H2CCMD_RSVDPAGE_LOC_BT_QOS_NULL_DATA(__ph2ccmd, __val) \ 137*4882a593Smuzhiyun *(u8 *)(__ph2ccmd + 4) = __val; 138*4882a593Smuzhiyun 139*4882a593Smuzhiyun /* _MEDIA_STATUS_RPT_PARM_CMD1 */ 140*4882a593Smuzhiyun #define SET_H2CCMD_MSRRPT_PARM_OPMODE(__cmd, __val) \ 141*4882a593Smuzhiyun u8p_replace_bits(__cmd, __val, BIT(0)) 142*4882a593Smuzhiyun #define SET_H2CCMD_MSRRPT_PARM_MACID_IND(__cmd, __val) \ 143*4882a593Smuzhiyun u8p_replace_bits(__cmd, __val, BIT(1)) 144*4882a593Smuzhiyun #define SET_H2CCMD_MSRRPT_PARM_MACID(__cmd, __val) \ 145*4882a593Smuzhiyun *(u8 *)(__ph2ccmd + 1) = __val; 146*4882a593Smuzhiyun #define SET_H2CCMD_MSRRPT_PARM_MACID_END(__cmd, __val) \ 147*4882a593Smuzhiyun *(u8 *)(__ph2ccmd + 2) = __val; 148*4882a593Smuzhiyun 149*4882a593Smuzhiyun int rtl92ee_download_fw(struct ieee80211_hw *hw, bool buse_wake_on_wlan_fw); 150*4882a593Smuzhiyun void rtl92ee_fill_h2c_cmd(struct ieee80211_hw *hw, u8 element_id, 151*4882a593Smuzhiyun u32 cmd_len, u8 *cmdbuffer); 152*4882a593Smuzhiyun void rtl92ee_firmware_selfreset(struct ieee80211_hw *hw); 153*4882a593Smuzhiyun void rtl92ee_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode); 154*4882a593Smuzhiyun void rtl92ee_set_fw_media_status_rpt_cmd(struct ieee80211_hw *hw, u8 mstatus); 155*4882a593Smuzhiyun void rtl92ee_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool b_dl_finished); 156*4882a593Smuzhiyun void rtl92ee_set_p2p_ps_offload_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state); 157*4882a593Smuzhiyun void rtl92ee_c2h_ra_report_handler(struct ieee80211_hw *hw, 158*4882a593Smuzhiyun u8 *cmd_buf, u8 cmd_len); 159*4882a593Smuzhiyun #endif 160