Commit 5c99f04f authored by Larry Finger's avatar Larry Finger Committed by John W. Linville

rtlwifi: rtl8723be: Update driver to match Realtek release of 06/28/14

This patch updates the driver to match the latest Realtek release, and
it is an important step in getting the internal code source at Realtek to match
the code in the kernel. The primary reason for this is to make it easier for
Realtek to maintain the kernel source without requiring an intermediate like me.

In this process of merging the two source repositories, there are a lot
of changes in both, and this commit is rather large.
Signed-off-by: default avatarLarry Finger <Larry.Finger@lwfinger.net>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 0529c6b8
...@@ -125,7 +125,7 @@ static void _rtl92ce_query_rxphystatus(struct ieee80211_hw *hw, ...@@ -125,7 +125,7 @@ static void _rtl92ce_query_rxphystatus(struct ieee80211_hw *hw,
u32 rssi, total_rssi = 0; u32 rssi, total_rssi = 0;
bool is_cck_rate; bool is_cck_rate;
is_cck_rate = RX_HAL_IS_CCK_RATE(pdesc); is_cck_rate = RX_HAL_IS_CCK_RATE(pdesc->rxmcs);
pstats->packet_matchbssid = packet_match_bssid; pstats->packet_matchbssid = packet_match_bssid;
pstats->packet_toself = packet_toself; pstats->packet_toself = packet_toself;
pstats->is_cck = is_cck_rate; pstats->is_cck = is_cck_rate;
...@@ -361,7 +361,7 @@ bool rtl92ce_rx_query_desc(struct ieee80211_hw *hw, ...@@ -361,7 +361,7 @@ bool rtl92ce_rx_query_desc(struct ieee80211_hw *hw,
stats->rx_is40Mhzpacket = (bool) GET_RX_DESC_BW(pdesc); stats->rx_is40Mhzpacket = (bool) GET_RX_DESC_BW(pdesc);
stats->is_ht = (bool)GET_RX_DESC_RXHT(pdesc); stats->is_ht = (bool)GET_RX_DESC_RXHT(pdesc);
stats->is_cck = RX_HAL_IS_CCK_RATE(pdesc); stats->is_cck = RX_HAL_IS_CCK_RATE(pdesc->rxmcs);
rx_status->freq = hw->conf.chandef.chan->center_freq; rx_status->freq = hw->conf.chandef.chan->center_freq;
rx_status->band = hw->conf.chandef.chan->band; rx_status->band = hw->conf.chandef.chan->band;
......
...@@ -786,7 +786,7 @@ static void _rtl92c_query_rxphystatus(struct ieee80211_hw *hw, ...@@ -786,7 +786,7 @@ static void _rtl92c_query_rxphystatus(struct ieee80211_hw *hw,
bool is_cck_rate; bool is_cck_rate;
u8 *pdesc = (u8 *)p_desc; u8 *pdesc = (u8 *)p_desc;
is_cck_rate = RX_HAL_IS_CCK_RATE(p_desc); is_cck_rate = RX_HAL_IS_CCK_RATE(p_desc->rxmcs);
pstats->packet_matchbssid = packet_match_bssid; pstats->packet_matchbssid = packet_match_bssid;
pstats->packet_toself = packet_toself; pstats->packet_toself = packet_toself;
pstats->packet_beacon = packet_beacon; pstats->packet_beacon = packet_beacon;
......
...@@ -127,7 +127,7 @@ static void _rtl92de_query_rxphystatus(struct ieee80211_hw *hw, ...@@ -127,7 +127,7 @@ static void _rtl92de_query_rxphystatus(struct ieee80211_hw *hw,
u32 rssi, total_rssi = 0; u32 rssi, total_rssi = 0;
bool is_cck_rate; bool is_cck_rate;
is_cck_rate = RX_HAL_IS_CCK_RATE(pdesc); is_cck_rate = RX_HAL_IS_CCK_RATE(pdesc->rxmcs);
pstats->packet_matchbssid = packet_match_bssid; pstats->packet_matchbssid = packet_match_bssid;
pstats->packet_toself = packet_toself; pstats->packet_toself = packet_toself;
pstats->packet_beacon = packet_beacon; pstats->packet_beacon = packet_beacon;
......
...@@ -34,7 +34,6 @@ ...@@ -34,7 +34,6 @@
#define FW_8192C_END_ADDRESS 0x3FFF #define FW_8192C_END_ADDRESS 0x3FFF
#define FW_8192C_PAGE_SIZE 4096 #define FW_8192C_PAGE_SIZE 4096
#define FW_8192C_POLLING_DELAY 5 #define FW_8192C_POLLING_DELAY 5
#define FW_8192C_POLLING_TIMEOUT_COUNT 1000
#define IS_FW_HEADER_EXIST(_pfwhdr) \ #define IS_FW_HEADER_EXIST(_pfwhdr) \
((_pfwhdr->signature&0xFFFF) == 0x2300 ||\ ((_pfwhdr->signature&0xFFFF) == 0x2300 ||\
......
...@@ -963,7 +963,7 @@ int rtl8723e_hw_init(struct ieee80211_hw *hw) ...@@ -963,7 +963,7 @@ int rtl8723e_hw_init(struct ieee80211_hw *hw)
goto exit; goto exit;
} }
err = rtl8723_download_fw(hw, false, FW_8192C_POLLING_TIMEOUT_COUNT); err = rtl8723_download_fw(hw, false, FW_8723A_POLLING_TIMEOUT_COUNT);
if (err) { if (err) {
RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING, RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
"Failed to download FW. Init HW without FW now..\n"); "Failed to download FW. Init HW without FW now..\n");
......
...@@ -1157,16 +1157,6 @@ static bool _rtl8723e_phy_simularity_compare(struct ieee80211_hw *hw, ...@@ -1157,16 +1157,6 @@ static bool _rtl8723e_phy_simularity_compare(struct ieee80211_hw *hw,
} }
static void rtl8723_phy_save_adda_registers(struct ieee80211_hw *hw,
u32 *addareg, u32 *addabackup,
u32 registernum)
{
u32 i;
for (i = 0; i < registernum; i++)
addabackup[i] = rtl_get_bbreg(hw, addareg[i], MASKDWORD);
}
static void _rtl8723e_phy_iq_calibrate(struct ieee80211_hw *hw, static void _rtl8723e_phy_iq_calibrate(struct ieee80211_hw *hw,
long result[][8], u8 t, bool is2t) long result[][8], u8 t, bool is2t)
{ {
...@@ -1192,7 +1182,7 @@ static void _rtl8723e_phy_iq_calibrate(struct ieee80211_hw *hw, ...@@ -1192,7 +1182,7 @@ static void _rtl8723e_phy_iq_calibrate(struct ieee80211_hw *hw,
if (t == 0) { if (t == 0) {
bbvalue = rtl_get_bbreg(hw, 0x800, MASKDWORD); bbvalue = rtl_get_bbreg(hw, 0x800, MASKDWORD);
rtl8723_phy_save_adda_registers(hw, adda_reg, rtl8723_save_adda_registers(hw, adda_reg,
rtlphy->adda_backup, 16); rtlphy->adda_backup, 16);
rtl8723_phy_save_mac_registers(hw, iqk_mac_reg, rtl8723_phy_save_mac_registers(hw, iqk_mac_reg,
rtlphy->iqk_mac_backup); rtlphy->iqk_mac_backup);
...@@ -1472,7 +1462,7 @@ void rtl8723e_phy_iq_calibrate(struct ieee80211_hw *hw, bool b_recovery) ...@@ -1472,7 +1462,7 @@ void rtl8723e_phy_iq_calibrate(struct ieee80211_hw *hw, bool b_recovery)
rtl8723_phy_path_a_fill_iqk_matrix(hw, b_patha_ok, result, rtl8723_phy_path_a_fill_iqk_matrix(hw, b_patha_ok, result,
final_candidate, final_candidate,
(reg_ea4 == 0)); (reg_ea4 == 0));
rtl8723_phy_save_adda_registers(hw, iqk_bb_reg, rtl8723_save_adda_registers(hw, iqk_bb_reg,
rtlphy->iqk_bb_backup, 10); rtlphy->iqk_bb_backup, 10);
} }
......
...@@ -463,7 +463,7 @@ bool rtl8723e_rx_query_desc(struct ieee80211_hw *hw, ...@@ -463,7 +463,7 @@ bool rtl8723e_rx_query_desc(struct ieee80211_hw *hw,
status->rx_is40Mhzpacket = (bool)GET_RX_DESC_BW(pdesc); status->rx_is40Mhzpacket = (bool)GET_RX_DESC_BW(pdesc);
status->is_ht = (bool)GET_RX_DESC_RXHT(pdesc); status->is_ht = (bool)GET_RX_DESC_RXHT(pdesc);
status->is_cck = RTL8723E_RX_HAL_IS_CCK_RATE(status->rate); status->is_cck = RX_HAL_IS_CCK_RATE(status->rate);
rx_status->freq = hw->conf.chandef.chan->center_freq; rx_status->freq = hw->conf.chandef.chan->center_freq;
rx_status->band = hw->conf.chandef.chan->band; rx_status->band = hw->conf.chandef.chan->band;
......
...@@ -26,158 +26,24 @@ ...@@ -26,158 +26,24 @@
#ifndef __RTL8723BE_DEF_H__ #ifndef __RTL8723BE_DEF_H__
#define __RTL8723BE_DEF_H__ #define __RTL8723BE_DEF_H__
#define HAL_RETRY_LIMIT_INFRA 48
#define HAL_RETRY_LIMIT_AP_ADHOC 7
#define RESET_DELAY_8185 20
#define RT_IBSS_INT_MASKS (IMR_BCNINT | IMR_TBDOK | IMR_TBDER)
#define RT_AC_INT_MASKS (IMR_VIDOK | IMR_VODOK | IMR_BEDOK|IMR_BKDOK)
#define NUM_OF_FIRMWARE_QUEUE 10
#define NUM_OF_PAGES_IN_FW 0x100
#define NUM_OF_PAGE_IN_FW_QUEUE_BK 0x07
#define NUM_OF_PAGE_IN_FW_QUEUE_BE 0x07
#define NUM_OF_PAGE_IN_FW_QUEUE_VI 0x07
#define NUM_OF_PAGE_IN_FW_QUEUE_VO 0x07
#define NUM_OF_PAGE_IN_FW_QUEUE_HCCA 0x0
#define NUM_OF_PAGE_IN_FW_QUEUE_CMD 0x0
#define NUM_OF_PAGE_IN_FW_QUEUE_MGNT 0x02
#define NUM_OF_PAGE_IN_FW_QUEUE_HIGH 0x02
#define NUM_OF_PAGE_IN_FW_QUEUE_BCN 0x2
#define NUM_OF_PAGE_IN_FW_QUEUE_PUB 0xA1
#define NUM_OF_PAGE_IN_FW_QUEUE_BK_DTM 0x026
#define NUM_OF_PAGE_IN_FW_QUEUE_BE_DTM 0x048
#define NUM_OF_PAGE_IN_FW_QUEUE_VI_DTM 0x048
#define NUM_OF_PAGE_IN_FW_QUEUE_VO_DTM 0x026
#define NUM_OF_PAGE_IN_FW_QUEUE_PUB_DTM 0x00
#define MAX_LINES_HWCONFIG_TXT 1000
#define MAX_BYTES_LINE_HWCONFIG_TXT 256
#define SW_THREE_WIRE 0
#define HW_THREE_WIRE 2
#define BT_DEMO_BOARD 0
#define BT_QA_BOARD 1
#define BT_FPGA 2
#define HAL_PRIME_CHNL_OFFSET_DONT_CARE 0 #define HAL_PRIME_CHNL_OFFSET_DONT_CARE 0
#define HAL_PRIME_CHNL_OFFSET_LOWER 1 #define HAL_PRIME_CHNL_OFFSET_LOWER 1
#define HAL_PRIME_CHNL_OFFSET_UPPER 2 #define HAL_PRIME_CHNL_OFFSET_UPPER 2
#define MAX_H2C_QUEUE_NUM 10
#define RX_MPDU_QUEUE 0 #define RX_MPDU_QUEUE 0
#define RX_CMD_QUEUE 1
#define RX_MAX_QUEUE 2
#define AC2QUEUEID(_AC) (_AC)
#define C2H_RX_CMD_HDR_LEN 8
#define GET_C2H_CMD_CMD_LEN(__prxhdr) \
LE_BITS_TO_4BYTE((__prxhdr), 0, 16)
#define GET_C2H_CMD_ELEMENT_ID(__prxhdr) \
LE_BITS_TO_4BYTE((__prxhdr), 16, 8)
#define GET_C2H_CMD_CMD_SEQ(__prxhdr) \
LE_BITS_TO_4BYTE((__prxhdr), 24, 7)
#define GET_C2H_CMD_CONTINUE(__prxhdr) \
LE_BITS_TO_4BYTE((__prxhdr), 31, 1)
#define GET_C2H_CMD_CONTENT(__prxhdr) \
((u8 *)(__prxhdr) + C2H_RX_CMD_HDR_LEN)
#define GET_C2H_CMD_FEEDBACK_ELEMENT_ID(__pcmdfbhdr) \
LE_BITS_TO_4BYTE((__pcmdfbhdr), 0, 8)
#define GET_C2H_CMD_FEEDBACK_CCX_LEN(__pcmdfbhdr) \
LE_BITS_TO_4BYTE((__pcmdfbhdr), 8, 8)
#define GET_C2H_CMD_FEEDBACK_CCX_CMD_CNT(__pcmdfbhdr) \
LE_BITS_TO_4BYTE((__pcmdfbhdr), 16, 16)
#define GET_C2H_CMD_FEEDBACK_CCX_MAC_ID(__pcmdfbhdr) \
LE_BITS_TO_4BYTE(((__pcmdfbhdr) + 4), 0, 5)
#define GET_C2H_CMD_FEEDBACK_CCX_VALID(__pcmdfbhdr) \
LE_BITS_TO_4BYTE(((__pcmdfbhdr) + 4), 7, 1)
#define GET_C2H_CMD_FEEDBACK_CCX_RETRY_CNT(__pcmdfbhdr) \
LE_BITS_TO_4BYTE(((__pcmdfbhdr) + 4), 8, 5)
#define GET_C2H_CMD_FEEDBACK_CCX_TOK(__pcmdfbhdr) \
LE_BITS_TO_4BYTE(((__pcmdfbhdr) + 4), 15, 1)
#define GET_C2H_CMD_FEEDBACK_CCX_QSEL(__pcmdfbhdr) \
LE_BITS_TO_4BYTE(((__pcmdfbhdr) + 4), 16, 4)
#define GET_C2H_CMD_FEEDBACK_CCX_SEQ(__pcmdfbhdr) \
LE_BITS_TO_4BYTE(((__pcmdfbhdr) + 4), 20, 12)
#define CHIP_BONDING_IDENTIFIER(_value) (((_value)>>22)&0x3)
#define CHIP_BONDING_92C_1T2R 0x1
#define CHIP_8723 BIT(0)
#define CHIP_8723B (BIT(1) | BIT(2)) #define CHIP_8723B (BIT(1) | BIT(2))
#define NORMAL_CHIP BIT(3) #define NORMAL_CHIP BIT(3)
#define RF_TYPE_1T1R (~(BIT(4) | BIT(5) | BIT(6))) #define CHIP_VENDOR_SMIC BIT(8)
#define RF_TYPE_1T2R BIT(4) /* Currently only for RTL8723B */
#define RF_TYPE_2T2R BIT(5) #define EXT_VENDOR_ID (BIT(18) | BIT(19))
#define CHIP_VENDOR_UMC BIT(7)
#define B_CUT_VERSION BIT(12)
#define C_CUT_VERSION BIT(13)
#define D_CUT_VERSION ((BIT(12) | BIT(13)))
#define E_CUT_VERSION BIT(14)
#define RF_RL_ID (BIT(31) | BIT(30) | BIT(29) | BIT(28))
/* MASK */
#define IC_TYPE_MASK (BIT(0) | BIT(1) | BIT(2))
#define CHIP_TYPE_MASK BIT(3)
#define RF_TYPE_MASK (BIT(4) | BIT(5) | BIT(6))
#define MANUFACTUER_MASK BIT(7)
#define ROM_VERSION_MASK (BIT(11) | BIT(10) | BIT(9) | BIT(8))
#define CUT_VERSION_MASK (BIT(15) | BIT(14) | BIT(13) | BIT(12))
/* Get element */
#define GET_CVID_IC_TYPE(version) ((version) & IC_TYPE_MASK)
#define GET_CVID_CHIP_TYPE(version) ((version) & CHIP_TYPE_MASK)
#define GET_CVID_RF_TYPE(version) ((version) & RF_TYPE_MASK)
#define GET_CVID_MANUFACTUER(version) ((version) & MANUFACTUER_MASK)
#define GET_CVID_ROM_VERSION(version) ((version) & ROM_VERSION_MASK)
#define GET_CVID_CUT_VERSION(version) ((version) & CUT_VERSION_MASK)
#define IS_92C_SERIAL(version) ((IS_81XXC(version) && IS_2T2R(version)) ?\
true : false)
#define IS_81XXC(version) ((GET_CVID_IC_TYPE(version) == 0) ?\
true : false)
#define IS_8723_SERIES(version) ((GET_CVID_IC_TYPE(version) == CHIP_8723) ?\
true : false)
#define IS_1T1R(version) ((GET_CVID_RF_TYPE(version)) ? false : true)
#define IS_1T2R(version) ((GET_CVID_RF_TYPE(version) == RF_TYPE_1T2R)\
? true : false)
#define IS_2T2R(version) ((GET_CVID_RF_TYPE(version) == RF_TYPE_2T2R)\
? true : false)
enum rf_optype {
RF_OP_BY_SW_3WIRE = 0,
RF_OP_BY_FW,
RF_OP_MAX
};
enum rf_power_state {
RF_ON,
RF_OFF,
RF_SLEEP,
RF_SHUT_DOWN,
};
enum power_save_mode {
POWER_SAVE_MODE_ACTIVE,
POWER_SAVE_MODE_SAVE,
};
enum power_polocy_config { enum rx_packet_type {
POWERCFG_MAX_POWER_SAVINGS, NORMAL_RX,
POWERCFG_GLOBAL_POWER_SAVINGS, TX_REPORT1,
POWERCFG_LOCAL_POWER_SAVINGS, TX_REPORT2,
POWERCFG_LENOVO, HIS_REPORT,
}; C2H_PACKET,
enum interface_select_pci {
INTF_SEL1_MINICARD = 0,
INTF_SEL0_PCIE = 1,
INTF_SEL2_RSV = 2,
INTF_SEL3_RSV = 3,
}; };
enum rtl_desc_qsel { enum rtl_desc_qsel {
...@@ -222,27 +88,5 @@ enum rtl_desc8723e_rate { ...@@ -222,27 +88,5 @@ enum rtl_desc8723e_rate {
DESC92C_RATEMCS13 = 0x19, DESC92C_RATEMCS13 = 0x19,
DESC92C_RATEMCS14 = 0x1a, DESC92C_RATEMCS14 = 0x1a,
DESC92C_RATEMCS15 = 0x1b, DESC92C_RATEMCS15 = 0x1b,
DESC92C_RATEMCS15_SG = 0x1c,
DESC92C_RATEMCS32 = 0x20,
}; };
enum rx_packet_type {
NORMAL_RX,
TX_REPORT1,
TX_REPORT2,
HIS_REPORT,
};
struct phy_sts_cck_8723e_t {
u8 adc_pwdb_X[4];
u8 sq_rpt;
u8 cck_agc_rpt;
};
struct h2c_cmd_8723e {
u8 element_id;
u32 cmd_len;
u8 *p_cmdbuffer;
};
#endif #endif
This diff is collapsed.
...@@ -202,6 +202,7 @@ ...@@ -202,6 +202,7 @@
#define DM_DIG_BACKOFF_MIN -4 #define DM_DIG_BACKOFF_MIN -4
#define DM_DIG_BACKOFF_DEFAULT 10 #define DM_DIG_BACKOFF_DEFAULT 10
#define RXPATHSELECTION_SS_TH_LOW 30
#define RXPATHSELECTION_DIFF_TH 18 #define RXPATHSELECTION_DIFF_TH 18
#define DM_RATR_STA_INIT 0 #define DM_RATR_STA_INIT 0
...@@ -212,6 +213,8 @@ ...@@ -212,6 +213,8 @@
#define CTS2SELF_THVAL 30 #define CTS2SELF_THVAL 30
#define REGC38_TH 20 #define REGC38_TH 20
#define WAIOTTHVAL 25
#define TXHIGHPWRLEVEL_NORMAL 0 #define TXHIGHPWRLEVEL_NORMAL 0
#define TXHIGHPWRLEVEL_LEVEL1 1 #define TXHIGHPWRLEVEL_LEVEL1 1
#define TXHIGHPWRLEVEL_LEVEL2 2 #define TXHIGHPWRLEVEL_LEVEL2 2
...@@ -231,22 +234,6 @@ ...@@ -231,22 +234,6 @@
#define CFO_THRESHOLD_XTAL 10 /* kHz */ #define CFO_THRESHOLD_XTAL 10 /* kHz */
#define CFO_THRESHOLD_ATC 80 /* kHz */ #define CFO_THRESHOLD_ATC 80 /* kHz */
enum FAT_STATE {
FAT_NORMAL_STATE = 0,
FAT_TRAINING_STATE = 1,
};
enum tag_dynamic_init_gain_operation_type_definition {
DIG_TYPE_THRESH_HIGH = 0,
DIG_TYPE_THRESH_LOW = 1,
DIG_TYPE_BACKOFF = 2,
DIG_TYPE_RX_GAIN_MIN = 3,
DIG_TYPE_RX_GAIN_MAX = 4,
DIG_TYPE_ENABLE = 5,
DIG_TYPE_DISABLE = 6,
DIG_OP_TYPE_MAX
};
enum dm_1r_cca_e { enum dm_1r_cca_e {
CCA_1R = 0, CCA_1R = 0,
CCA_2R = 1, CCA_2R = 1,
...@@ -292,12 +279,17 @@ enum pwr_track_control_method { ...@@ -292,12 +279,17 @@ enum pwr_track_control_method {
#define BT_RSSI_STATE_SPECIAL_LOW BIT_OFFSET_LEN_MASK_32(2, 1) #define BT_RSSI_STATE_SPECIAL_LOW BIT_OFFSET_LEN_MASK_32(2, 1)
#define BT_RSSI_STATE_BG_EDCA_LOW BIT_OFFSET_LEN_MASK_32(3, 1) #define BT_RSSI_STATE_BG_EDCA_LOW BIT_OFFSET_LEN_MASK_32(3, 1)
#define BT_RSSI_STATE_TXPOWER_LOW BIT_OFFSET_LEN_MASK_32(4, 1) #define BT_RSSI_STATE_TXPOWER_LOW BIT_OFFSET_LEN_MASK_32(4, 1)
#define GET_UNDECORATED_AVERAGE_RSSI(_priv) \
((((struct rtl_priv *)(_priv))->mac80211.opmode == \
NL80211_IFTYPE_ADHOC) ? \
(((struct rtl_priv *)(_priv))->dm.entry_min_undecoratedsmoothed_pwdb) :\
(((struct rtl_priv *)(_priv))->dm.undecorated_smoothed_pwdb))
void rtl8723be_dm_set_tx_ant_by_tx_info(struct ieee80211_hw *hw, u8 *pdesc, void rtl8723be_dm_set_tx_ant_by_tx_info(struct ieee80211_hw *hw, u8 *pdesc,
u32 mac_id); u32 mac_id);
void rtl8723be_dm_ant_sel_statistics(struct ieee80211_hw *hw, u8 antsel_tr_mux, void rtl8723be_dm_ant_sel_statistics(struct ieee80211_hw *hw, u8 antsel_tr_mux,
u32 mac_id, u32 rx_pwdb_all); u32 mac_id, u32 rx_pwdb_all);
void rtl8723be_dm_fast_antenna_trainning_callback(unsigned long data); void rtl8723be_dm_fast_antenna_training_callback(unsigned long data);
void rtl8723be_dm_init(struct ieee80211_hw *hw); void rtl8723be_dm_init(struct ieee80211_hw *hw);
void rtl8723be_dm_watchdog(struct ieee80211_hw *hw); void rtl8723be_dm_watchdog(struct ieee80211_hw *hw);
void rtl8723be_dm_write_dig(struct ieee80211_hw *hw, u8 current_igi); void rtl8723be_dm_write_dig(struct ieee80211_hw *hw, u8 current_igi);
...@@ -305,6 +297,4 @@ void rtl8723be_dm_check_txpower_tracking(struct ieee80211_hw *hw); ...@@ -305,6 +297,4 @@ void rtl8723be_dm_check_txpower_tracking(struct ieee80211_hw *hw);
void rtl8723be_dm_init_rate_adaptive_mask(struct ieee80211_hw *hw); void rtl8723be_dm_init_rate_adaptive_mask(struct ieee80211_hw *hw);
void rtl8723be_dm_txpower_track_adjust(struct ieee80211_hw *hw, u8 type, void rtl8723be_dm_txpower_track_adjust(struct ieee80211_hw *hw, u8 type,
u8 *pdirection, u32 *poutwrite_val); u8 *pdirection, u32 *poutwrite_val);
void rtl8723be_dm_init_edca_turbo(struct ieee80211_hw *hw);
#endif #endif
This diff is collapsed.
...@@ -30,50 +30,23 @@ ...@@ -30,50 +30,23 @@
#define FW_8192C_END_ADDRESS 0x5FFF #define FW_8192C_END_ADDRESS 0x5FFF
#define FW_8192C_PAGE_SIZE 4096 #define FW_8192C_PAGE_SIZE 4096
#define FW_8192C_POLLING_DELAY 5 #define FW_8192C_POLLING_DELAY 5
#define FW_8192C_POLLING_TIMEOUT_COUNT 6000
#define IS_FW_HEADER_EXIST(_pfwhdr) \
((_pfwhdr->signature&0xFFF0) == 0x5300)
#define USE_OLD_WOWLAN_DEBUG_FW 0 #define USE_OLD_WOWLAN_DEBUG_FW 0
#define H2C_8723BE_RSVDPAGE_LOC_LEN 5 #define H2C_PWEMODE_LENGTH 5
#define H2C_8723BE_PWEMODE_LENGTH 5
#define H2C_8723BE_JOINBSSRPT_LENGTH 1
#define H2C_8723BE_AP_OFFLOAD_LENGTH 3
#define H2C_8723BE_WOWLAN_LENGTH 3
#define H2C_8723BE_KEEP_ALIVE_CTRL_LENGTH 3
#if (USE_OLD_WOWLAN_DEBUG_FW == 0)
#define H2C_8723BE_REMOTE_WAKE_CTRL_LEN 1
#else
#define H2C_8723BE_REMOTE_WAKE_CTRL_LEN 3
#endif
#define H2C_8723BE_AOAC_GLOBAL_INFO_LEN 2
#define H2C_8723BE_AOAC_RSVDPAGE_LOC_LEN 7
/* Fw PS state for RPWM. /* Fw PS state for RPWM.
*BIT[2:0] = HW state *BIT[2:0] = HW state
*BIT[3] = Protocol PS state, 1: register active state , 0: register sleep state *BIT[3] = Protocol PS state, 1: register active state , 0: register sleep state
*BIT[4] = sub-state *BIT[4] = sub-state
*/ */
#define FW_PS_GO_ON BIT(0)
#define FW_PS_TX_NULL BIT(1)
#define FW_PS_RF_ON BIT(2) #define FW_PS_RF_ON BIT(2)
#define FW_PS_REGISTER_ACTIVE BIT(3) #define FW_PS_REGISTER_ACTIVE BIT(3)
#define FW_PS_DPS BIT(0)
#define FW_PS_LCLK (FW_PS_DPS)
#define FW_PS_RF_OFF BIT(1)
#define FW_PS_ALL_ON BIT(2)
#define FW_PS_ST_ACTIVE BIT(3)
#define FW_PS_ISR_ENABLE BIT(4)
#define FW_PS_IMR_ENABLE BIT(5)
#define FW_PS_ACK BIT(6) #define FW_PS_ACK BIT(6)
#define FW_PS_TOGGLE BIT(7) #define FW_PS_TOGGLE BIT(7)
/* 88E RPWM value*/ /* 8723BE RPWM value*/
/* BIT[0] = 1: 32k, 0: 40M*/ /* BIT[0] = 1: 32k, 0: 40M*/
#define FW_PS_CLOCK_OFF BIT(0) /* 32k*/ #define FW_PS_CLOCK_OFF BIT(0) /* 32k*/
#define FW_PS_CLOCK_ON 0 /*40M*/ #define FW_PS_CLOCK_ON 0 /*40M*/
...@@ -84,74 +57,60 @@ ...@@ -84,74 +57,60 @@
#define FW_PS_STATE_INT_MASK (0x3F) #define FW_PS_STATE_INT_MASK (0x3F)
#define FW_PS_STATE(x) (FW_PS_STATE_MASK & (x)) #define FW_PS_STATE(x) (FW_PS_STATE_MASK & (x))
#define FW_PS_STATE_HW(x) (FW_PS_STATE_HW_MASK & (x))
#define FW_PS_STATE_INT(x) (FW_PS_STATE_INT_MASK & (x))
#define FW_PS_ISR_VAL(x) ((x) & 0x70)
#define FW_PS_IMR_MASK(x) ((x) & 0xDF)
#define FW_PS_KEEP_IMR(x) ((x) & 0x20)
#define FW_PS_STATE_S0 (FW_PS_DPS)
#define FW_PS_STATE_S1 (FW_PS_LCLK)
#define FW_PS_STATE_S2 (FW_PS_RF_OFF)
#define FW_PS_STATE_S3 (FW_PS_ALL_ON)
#define FW_PS_STATE_S4 ((FW_PS_ST_ACTIVE) | (FW_PS_ALL_ON))
/* ((FW_PS_RF_ON) | (FW_PS_REGISTER_ACTIVE))*/ /* ((FW_PS_RF_ON) | (FW_PS_REGISTER_ACTIVE))*/
#define FW_PS_STATE_ALL_ON_88E (FW_PS_CLOCK_ON) #define FW_PS_STATE_ALL_ON (FW_PS_CLOCK_ON)
/* (FW_PS_RF_ON)*/ /* (FW_PS_RF_ON)*/
#define FW_PS_STATE_RF_ON_88E (FW_PS_CLOCK_ON) #define FW_PS_STATE_RF_ON (FW_PS_CLOCK_ON)
/* 0x0*/ /* 0x0*/
#define FW_PS_STATE_RF_OFF_88E (FW_PS_CLOCK_ON) #define FW_PS_STATE_RF_OFF (FW_PS_CLOCK_ON)
/* (FW_PS_STATE_RF_OFF)*/ /* (FW_PS_STATE_RF_OFF)*/
#define FW_PS_STATE_RF_OFF_LOW_PWR_88E (FW_PS_CLOCK_OFF) #define FW_PS_STATE_RF_OFF_LOW_PWR (FW_PS_CLOCK_OFF)
#define FW_PS_STATE_ALL_ON_92C (FW_PS_STATE_S4)
#define FW_PS_STATE_RF_ON_92C (FW_PS_STATE_S3)
#define FW_PS_STATE_RF_OFF_92C (FW_PS_STATE_S2)
#define FW_PS_STATE_RF_OFF_LOW_PWR_92C (FW_PS_STATE_S1)
/* For 8723BE H2C PwrMode Cmd ID 5.*/
/* For 88E H2C PwrMode Cmd ID 5.*/
#define FW_PWR_STATE_ACTIVE ((FW_PS_RF_ON) | (FW_PS_REGISTER_ACTIVE)) #define FW_PWR_STATE_ACTIVE ((FW_PS_RF_ON) | (FW_PS_REGISTER_ACTIVE))
#define FW_PWR_STATE_RF_OFF 0 #define FW_PWR_STATE_RF_OFF 0
#define FW_PS_IS_ACK(x) ((x) & FW_PS_ACK) #define FW_PS_IS_ACK(x) ((x) & FW_PS_ACK)
#define FW_PS_IS_CLK_ON(x) ((x) & (FW_PS_RF_OFF | FW_PS_ALL_ON))
#define FW_PS_IS_RF_ON(x) ((x) & (FW_PS_ALL_ON))
#define FW_PS_IS_ACTIVE(x) ((x) & (FW_PS_ST_ACTIVE))
#define FW_PS_IS_CPWM_INT(x) ((x) & 0x40)
#define FW_CLR_PS_STATE(x) ((x) = ((x) & (0xF0)))
#define IS_IN_LOW_POWER_STATE_88E(fwpsstate) \ #define IS_IN_LOW_POWER_STATE(__fwpsstate) \
(FW_PS_STATE(fwpsstate) == FW_PS_CLOCK_OFF) (FW_PS_STATE(__fwpsstate) == FW_PS_CLOCK_OFF)
#define FW_PWR_STATE_ACTIVE ((FW_PS_RF_ON) | (FW_PS_REGISTER_ACTIVE)) #define FW_PWR_STATE_ACTIVE ((FW_PS_RF_ON) | (FW_PS_REGISTER_ACTIVE))
#define FW_PWR_STATE_RF_OFF 0 #define FW_PWR_STATE_RF_OFF 0
#define pagenum_128(_len) (u32)(((_len)>>7) + ((_len)&0x7F ? 1 : 0)) enum rtl8723b_h2c_cmd {
H2C_8723B_RSVDPAGE = 0,
H2C_8723B_MSRRPT = 1,
H2C_8723B_SCAN = 2,
H2C_8723B_KEEP_ALIVE_CTRL = 3,
H2C_8723B_DISCONNECT_DECISION = 4,
H2C_8723B_BCN_RSVDPAGE = 9,
H2C_8723B_PROBERSP_RSVDPAGE = 10,
H2C_8723B_SETPWRMODE = 0x20,
H2C_8723B_PS_LPS_PARA = 0x23,
H2C_8723B_P2P_PS_OFFLOAD = 0x24,
H2C_8723B_RA_MASK = 0x40,
H2C_RSSIBE_REPORT = 0x42,
/*Not defined CTW CMD for P2P yet*/
H2C_8723B_P2P_PS_CTW_CMD,
MAX_8723B_H2CCMD
};
enum rtl8723b_c2h_evt {
C2H_8723B_DBG = 0,
C2H_8723B_LB = 1,
C2H_8723B_TXBF = 2,
C2H_8723B_TX_REPORT = 3,
C2H_8723B_BT_INFO = 9,
C2H_8723B_BT_MP = 11,
MAX_8723B_C2HEVENT
};
#define SET_88E_H2CCMD_WOWLAN_FUNC_ENABLE(__ph2ccmd, __val) \ #define pagenum_128(_len) (u32)(((_len)>>7) + ((_len)&0x7F ? 1 : 0))
SET_BITS_TO_LE_1BYTE(__ph2ccmd, 0, 1, __val)
#define SET_88E_H2CCMD_WOWLAN_PATTERN_MATCH_ENABLE(__ph2ccmd, __val) \
SET_BITS_TO_LE_1BYTE(__ph2ccmd, 1, 1, __val)
#define SET_88E_H2CCMD_WOWLAN_MAGIC_PKT_ENABLE(__ph2ccmd, __val) \
SET_BITS_TO_LE_1BYTE(__ph2ccmd, 2, 1, __val)
#define SET_88E_H2CCMD_WOWLAN_UNICAST_PKT_ENABLE(__ph2ccmd, __val) \
SET_BITS_TO_LE_1BYTE(__ph2ccmd, 3, 1, __val)
#define SET_88E_H2CCMD_WOWLAN_ALL_PKT_DROP(__ph2ccmd, __val) \
SET_BITS_TO_LE_1BYTE(__ph2ccmd, 4, 1, __val)
#define SET_88E_H2CCMD_WOWLAN_GPIO_ACTIVE(__ph2ccmd, __val) \
SET_BITS_TO_LE_1BYTE(__ph2ccmd, 5, 1, __val)
#define SET_88E_H2CCMD_WOWLAN_REKEY_WAKE_UP(__ph2ccmd, __val) \
SET_BITS_TO_LE_1BYTE(__ph2ccmd, 6, 1, __val)
#define SET_88E_H2CCMD_WOWLAN_DISCONNECT_WAKE_UP(__ph2ccmd, __val) \
SET_BITS_TO_LE_1BYTE(__ph2ccmd, 7, 1, __val)
#define SET_88E_H2CCMD_WOWLAN_GPIONUM(__ph2ccmd, __val) \
SET_BITS_TO_LE_1BYTE((__ph2ccmd)+1, 0, 8, __val)
#define SET_88E_H2CCMD_WOWLAN_GPIO_DURATION(__ph2ccmd, __val) \
SET_BITS_TO_LE_1BYTE((__ph2ccmd)+2, 0, 8, __val)
#define SET_H2CCMD_PWRMODE_PARM_MODE(__ph2ccmd, __val) \ #define SET_H2CCMD_PWRMODE_PARM_MODE(__ph2ccmd, __val) \
...@@ -169,8 +128,11 @@ ...@@ -169,8 +128,11 @@
#define GET_88E_H2CCMD_PWRMODE_PARM_MODE(__ph2ccmd) \ #define GET_88E_H2CCMD_PWRMODE_PARM_MODE(__ph2ccmd) \
LE_BITS_TO_1BYTE(__ph2ccmd, 0, 8) LE_BITS_TO_1BYTE(__ph2ccmd, 0, 8)
#define SET_H2CCMD_JOINBSSRPT_PARM_OPMODE(__ph2ccmd, __val) \ #define SET_H2CCMD_MSRRPT_PARM_OPMODE(__ph2ccmd, __val) \
SET_BITS_TO_LE_1BYTE(__ph2ccmd, 0, 8, __val) SET_BITS_TO_LE_1BYTE(__ph2ccmd, 0, 1, __val)
#define SET_H2CCMD_MSRRPT_PARM_MACID_IND(__ph2ccmd, __val) \
SET_BITS_TO_LE_1BYTE(__ph2ccmd, 1, 1, __val)
#define SET_H2CCMD_RSVDPAGE_LOC_PROBE_RSP(__ph2ccmd, __val) \ #define SET_H2CCMD_RSVDPAGE_LOC_PROBE_RSP(__ph2ccmd, __val) \
SET_BITS_TO_LE_1BYTE(__ph2ccmd, 0, 8, __val) SET_BITS_TO_LE_1BYTE(__ph2ccmd, 0, 8, __val)
#define SET_H2CCMD_RSVDPAGE_LOC_PSPOLL(__ph2ccmd, __val) \ #define SET_H2CCMD_RSVDPAGE_LOC_PSPOLL(__ph2ccmd, __val) \
...@@ -178,71 +140,13 @@ ...@@ -178,71 +140,13 @@
#define SET_H2CCMD_RSVDPAGE_LOC_NULL_DATA(__ph2ccmd, __val) \ #define SET_H2CCMD_RSVDPAGE_LOC_NULL_DATA(__ph2ccmd, __val) \
SET_BITS_TO_LE_1BYTE((__ph2ccmd)+2, 0, 8, __val) SET_BITS_TO_LE_1BYTE((__ph2ccmd)+2, 0, 8, __val)
/* AP_OFFLOAD */
#define SET_H2CCMD_AP_OFFLOAD_ON(__ph2ccmd, __val) \
SET_BITS_TO_LE_1BYTE(__ph2ccmd, 0, 8, __val)
#define SET_H2CCMD_AP_OFFLOAD_HIDDEN(__ph2ccmd, __val) \
SET_BITS_TO_LE_1BYTE((__ph2ccmd)+1, 0, 8, __val)
#define SET_H2CCMD_AP_OFFLOAD_DENYANY(__ph2ccmd, __val) \
SET_BITS_TO_LE_1BYTE((__ph2ccmd)+2, 0, 8, __val)
#define SET_H2CCMD_AP_OFFLOAD_WAKEUP_EVT_RPT(__ph2ccmd, __val) \
SET_BITS_TO_LE_1BYTE((__ph2ccmd)+3, 0, 8, __val)
/* Keep Alive Control*/
#define SET_88E_H2CCMD_KEEP_ALIVE_ENABLE(__ph2ccmd, __val) \
SET_BITS_TO_LE_1BYTE(__ph2ccmd, 0, 1, __val)
#define SET_88E_H2CCMD_KEEP_ALIVE_ACCPEPT_USER_DEFINED(__ph2ccmd, __val)\
SET_BITS_TO_LE_1BYTE(__ph2ccmd, 1, 1, __val)
#define SET_88E_H2CCMD_KEEP_ALIVE_PERIOD(__ph2ccmd, __val) \
SET_BITS_TO_LE_1BYTE((__ph2ccmd)+1, 0, 8, __val)
/*REMOTE_WAKE_CTRL */
#define SET_88E_H2CCMD_REMOTE_WAKE_CTRL_EN(__ph2ccmd, __val) \
SET_BITS_TO_LE_1BYTE(__ph2ccmd, 0, 1, __val)
#if (USE_OLD_WOWLAN_DEBUG_FW == 0)
#define SET_88E_H2CCMD_REMOTE_WAKE_CTRL_ARP_OFFLOAD_EN(__ph2ccmd, __val)\
SET_BITS_TO_LE_1BYTE(__ph2ccmd, 1, 1, __val)
#define SET_88E_H2CCMD_REMOTE_WAKE_CTRL_NDP_OFFLOAD_EN(__ph2ccmd, __val)\
SET_BITS_TO_LE_1BYTE(__ph2ccmd, 2, 1, __val)
#define SET_88E_H2CCMD_REMOTE_WAKE_CTRL_GTK_OFFLOAD_EN(__ph2ccmd, __val)\
SET_BITS_TO_LE_1BYTE(__ph2ccmd, 3, 1, __val)
#else
#define SET_88E_H2CCMD_REMOTE_WAKE_CTRL_PAIRWISE_ENC_ALG(__ph2ccmd, __val)\
SET_BITS_TO_LE_1BYTE((__ph2ccmd)+1, 0, 8, __val)
#define SET_88E_H2CCMD_REMOTE_WAKE_CTRL_GROUP_ENC_ALG(__ph2ccmd, __val) \
SET_BITS_TO_LE_1BYTE((__ph2ccmd)+2, 0, 8, __val)
#endif
/* GTK_OFFLOAD */
#define SET_88E_H2CCMD_AOAC_GLOBAL_INFO_PAIRWISE_ENC_ALG(__ph2ccmd, __val)\
SET_BITS_TO_LE_1BYTE(__ph2ccmd, 0, 8, __val)
#define SET_88E_H2CCMD_AOAC_GLOBAL_INFO_GROUP_ENC_ALG(__ph2ccmd, __val) \
SET_BITS_TO_LE_1BYTE((__ph2ccmd)+1, 0, 8, __val)
/* AOAC_RSVDPAGE_LOC */
#define SET_88E_H2CCMD_AOAC_RSVDPAGE_LOC_REM_WAKE_CTRL_INFO(__ph2ccmd, __val)\
SET_BITS_TO_LE_1BYTE((__ph2ccmd), 0, 8, __val)
#define SET_88E_H2CCMD_AOAC_RSVDPAGE_LOC_ARP_RSP(__ph2ccmd, __val) \
SET_BITS_TO_LE_1BYTE((__ph2ccmd)+1, 0, 8, __val)
#define SET_88E_H2CCMD_AOAC_RSVDPAGE_LOC_NEIGHBOR_ADV(__ph2ccmd, __val) \
SET_BITS_TO_LE_1BYTE((__ph2ccmd)+2, 0, 8, __val)
#define SET_88E_H2CCMD_AOAC_RSVDPAGE_LOC_GTK_RSP(__ph2ccmd, __val) \
SET_BITS_TO_LE_1BYTE((__ph2ccmd)+3, 0, 8, __val)
#define SET_88E_H2CCMD_AOAC_RSVDPAGE_LOC_GTK_INFO(__ph2ccmd, __val) \
SET_BITS_TO_LE_1BYTE((__ph2ccmd)+4, 0, 8, __val)
void rtl8723be_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode);
void rtl8723be_set_fw_ap_off_load_cmd(struct ieee80211_hw *hw,
u8 ap_offload_enable);
void rtl8723be_fill_h2c_cmd(struct ieee80211_hw *hw, u8 element_id, void rtl8723be_fill_h2c_cmd(struct ieee80211_hw *hw, u8 element_id,
u32 cmd_len, u8 *p_cmdbuffer); u32 cmd_len, u8 *p_cmdbuffer);
void rtl8723be_firmware_selfreset(struct ieee80211_hw *hw); void rtl8723be_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode);
void rtl8723be_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, void rtl8723be_set_fw_media_status_rpt_cmd(struct ieee80211_hw *hw, u8 mstatus);
bool dl_finished); void rtl8723be_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool b_dl_finished);
void rtl8723be_set_fw_joinbss_report_cmd(struct ieee80211_hw *hw, u8 mstatus); void rtl8723be_set_p2p_ps_offload_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state);
int rtl8723be_download_fw(struct ieee80211_hw *hw, void rtl8723be_c2h_packet_handler(struct ieee80211_hw *hw, u8 *buffer, u8 len);
bool buse_wake_on_wlan_fw);
void rtl8723be_set_p2p_ps_offload_cmd(struct ieee80211_hw *hw,
u8 p2p_ps_state);
#endif #endif
This diff is collapsed.
...@@ -59,4 +59,5 @@ void rtl8723be_bt_reg_init(struct ieee80211_hw *hw); ...@@ -59,4 +59,5 @@ void rtl8723be_bt_reg_init(struct ieee80211_hw *hw);
void rtl8723be_bt_hw_init(struct ieee80211_hw *hw); void rtl8723be_bt_hw_init(struct ieee80211_hw *hw);
void rtl8723be_suspend(struct ieee80211_hw *hw); void rtl8723be_suspend(struct ieee80211_hw *hw);
void rtl8723be_resume(struct ieee80211_hw *hw); void rtl8723be_resume(struct ieee80211_hw *hw);
#endif #endif
...@@ -42,7 +42,7 @@ void rtl8723be_sw_led_on(struct ieee80211_hw *hw, struct rtl_led *pled) ...@@ -42,7 +42,7 @@ void rtl8723be_sw_led_on(struct ieee80211_hw *hw, struct rtl_led *pled)
struct rtl_priv *rtlpriv = rtl_priv(hw); struct rtl_priv *rtlpriv = rtl_priv(hw);
RT_TRACE(rtlpriv, COMP_LED, DBG_LOUD, RT_TRACE(rtlpriv, COMP_LED, DBG_LOUD,
"LedAddr:%X ledpin =%d\n", REG_LEDCFG2, pled->ledpin); "LedAddr:%X ledpin=%d\n", REG_LEDCFG2, pled->ledpin);
switch (pled->ledpin) { switch (pled->ledpin) {
case LED_PIN_GPIO0: case LED_PIN_GPIO0:
...@@ -71,7 +71,7 @@ void rtl8723be_sw_led_off(struct ieee80211_hw *hw, struct rtl_led *pled) ...@@ -71,7 +71,7 @@ void rtl8723be_sw_led_off(struct ieee80211_hw *hw, struct rtl_led *pled)
u8 ledcfg; u8 ledcfg;
RT_TRACE(rtlpriv, COMP_LED, DBG_LOUD, RT_TRACE(rtlpriv, COMP_LED, DBG_LOUD,
"LedAddr:%X ledpin =%d\n", REG_LEDCFG2, pled->ledpin); "LedAddr:%X ledpin=%d\n", REG_LEDCFG2, pled->ledpin);
ledcfg = rtl_read_byte(rtlpriv, REG_LEDCFG2); ledcfg = rtl_read_byte(rtlpriv, REG_LEDCFG2);
...@@ -100,7 +100,7 @@ void rtl8723be_sw_led_off(struct ieee80211_hw *hw, struct rtl_led *pled) ...@@ -100,7 +100,7 @@ void rtl8723be_sw_led_off(struct ieee80211_hw *hw, struct rtl_led *pled)
break; break;
default: default:
RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
"switch case not processed\n"); "switch case not process\n");
break; break;
} }
pled->ledon = false; pled->ledon = false;
......
...@@ -26,10 +26,14 @@ ...@@ -26,10 +26,14 @@
#ifndef __RTL8723BE_PHY_H__ #ifndef __RTL8723BE_PHY_H__
#define __RTL8723BE_PHY_H__ #define __RTL8723BE_PHY_H__
/*It must always set to 4, otherwise read efuse table secquence will be wrong.*/ /* MAX_TX_COUNT must always set to 4, otherwise read efuse table sequence
* will be wrong.
*/
#define MAX_TX_COUNT 4 #define MAX_TX_COUNT 4
#define TX_1S 0 #define TX_1S 0
#define TX_2S 1 #define TX_2S 1
#define TX_3S 2
#define TX_4S 3
#define MAX_POWER_INDEX 0x3F #define MAX_POWER_INDEX 0x3F
...@@ -42,6 +46,8 @@ ...@@ -42,6 +46,8 @@
#define RT_CANNOT_IO(hw) false #define RT_CANNOT_IO(hw) false
#define HIGHPOWER_RADIOA_ARRAYLEN 22 #define HIGHPOWER_RADIOA_ARRAYLEN 22
#define TARGET_CHNL_NUM_2G_5G 59
#define IQK_ADDA_REG_NUM 16 #define IQK_ADDA_REG_NUM 16
#define IQK_BB_REG_NUM 9 #define IQK_BB_REG_NUM 9
#define MAX_TOLERANCE 5 #define MAX_TOLERANCE 5
...@@ -83,104 +89,19 @@ ...@@ -83,104 +89,19 @@
#define RTL92C_MAX_PATH_NUM 2 #define RTL92C_MAX_PATH_NUM 2
enum hw90_block_e {
HW90_BLOCK_MAC = 0,
HW90_BLOCK_PHY0 = 1,
HW90_BLOCK_PHY1 = 2,
HW90_BLOCK_RF = 3,
HW90_BLOCK_MAXIMUM = 4,
};
enum baseband_config_type { enum baseband_config_type {
BASEBAND_CONFIG_PHY_REG = 0, BASEBAND_CONFIG_PHY_REG = 0,
BASEBAND_CONFIG_AGC_TAB = 1, BASEBAND_CONFIG_AGC_TAB = 1,
}; };
enum ra_offset_area { enum ant_div_type {
RA_OFFSET_LEGACY_OFDM1,
RA_OFFSET_LEGACY_OFDM2,
RA_OFFSET_HT_OFDM1,
RA_OFFSET_HT_OFDM2,
RA_OFFSET_HT_OFDM3,
RA_OFFSET_HT_OFDM4,
RA_OFFSET_HT_CCK,
};
enum antenna_path {
ANTENNA_NONE,
ANTENNA_D,
ANTENNA_C,
ANTENNA_CD,
ANTENNA_B,
ANTENNA_BD,
ANTENNA_BC,
ANTENNA_BCD,
ANTENNA_A,
ANTENNA_AD,
ANTENNA_AC,
ANTENNA_ACD,
ANTENNA_AB,
ANTENNA_ABD,
ANTENNA_ABC,
ANTENNA_ABCD
};
struct r_antenna_select_ofdm {
u32 r_tx_antenna:4;
u32 r_ant_l:4;
u32 r_ant_non_ht:4;
u32 r_ant_ht1:4;
u32 r_ant_ht2:4;
u32 r_ant_ht_s1:4;
u32 r_ant_non_ht_s1:4;
u32 ofdm_txsc:2;
u32 reserved:2;
};
struct r_antenna_select_cck {
u8 r_cckrx_enable_2:2;
u8 r_cckrx_enable:2;
u8 r_ccktx_enable:4;
};
struct efuse_contents {
u8 mac_addr[ETH_ALEN];
u8 cck_tx_power_idx[6];
u8 ht40_1s_tx_power_idx[6];
u8 ht40_2s_tx_power_idx_diff[3];
u8 ht20_tx_power_idx_diff[3];
u8 ofdm_tx_power_idx_diff[3];
u8 ht40_max_power_offset[3];
u8 ht20_max_power_offset[3];
u8 channel_plan;
u8 thermal_meter;
u8 rf_option[5];
u8 version;
u8 oem_id;
u8 regulatory;
};
struct tx_power_struct {
u8 cck[RTL92C_MAX_PATH_NUM][CHANNEL_MAX_NUMBER];
u8 ht40_1s[RTL92C_MAX_PATH_NUM][CHANNEL_MAX_NUMBER];
u8 ht40_2s[RTL92C_MAX_PATH_NUM][CHANNEL_MAX_NUMBER];
u8 ht20_diff[RTL92C_MAX_PATH_NUM][CHANNEL_MAX_NUMBER];
u8 legacy_ht_diff[RTL92C_MAX_PATH_NUM][CHANNEL_MAX_NUMBER];
u8 legacy_ht_txpowerdiff;
u8 groupht20[RTL92C_MAX_PATH_NUM][CHANNEL_MAX_NUMBER];
u8 groupht40[RTL92C_MAX_PATH_NUM][CHANNEL_MAX_NUMBER];
u8 pwrgroup_cnt;
u32 mcs_original_offset[4][16];
};
enum _ANT_DIV_TYPE {
NO_ANTDIV = 0xFF, NO_ANTDIV = 0xFF,
CG_TRX_HW_ANTDIV = 0x01, CG_TRX_HW_ANTDIV = 0x01,
CGCS_RX_HW_ANTDIV = 0x02, CGCS_RX_HW_ANTDIV = 0x02,
FIXED_HW_ANTDIV = 0x03, FIXED_HW_ANTDIV = 0x03,
CG_TRX_SMART_ANTDIV = 0x04, CG_TRX_SMART_ANTDIV = 0x04,
CGCS_RX_SW_ANTDIV = 0x05, CGCS_RX_SW_ANTDIV = 0x05,
}; };
u32 rtl8723be_phy_query_rf_reg(struct ieee80211_hw *hw, u32 rtl8723be_phy_query_rf_reg(struct ieee80211_hw *hw,
...@@ -206,7 +127,6 @@ void rtl8723be_phy_sw_chnl_callback(struct ieee80211_hw *hw); ...@@ -206,7 +127,6 @@ void rtl8723be_phy_sw_chnl_callback(struct ieee80211_hw *hw);
u8 rtl8723be_phy_sw_chnl(struct ieee80211_hw *hw); u8 rtl8723be_phy_sw_chnl(struct ieee80211_hw *hw);
void rtl8723be_phy_iq_calibrate(struct ieee80211_hw *hw, void rtl8723be_phy_iq_calibrate(struct ieee80211_hw *hw,
bool b_recovery); bool b_recovery);
void rtl23b_phy_ap_calibrate(struct ieee80211_hw *hw, char delta);
void rtl8723be_phy_lc_calibrate(struct ieee80211_hw *hw); void rtl8723be_phy_lc_calibrate(struct ieee80211_hw *hw);
void rtl8723be_phy_set_rfpath_switch(struct ieee80211_hw *hw, bool bmain); void rtl8723be_phy_set_rfpath_switch(struct ieee80211_hw *hw, bool bmain);
bool rtl8723be_phy_config_rf_with_headerfile(struct ieee80211_hw *hw, bool rtl8723be_phy_config_rf_with_headerfile(struct ieee80211_hw *hw,
......
...@@ -78,11 +78,11 @@ ...@@ -78,11 +78,11 @@
#define REG_WOL_EVENT 0x0081 #define REG_WOL_EVENT 0x0081
#define REG_MCUTSTCFG 0x0084 #define REG_MCUTSTCFG 0x0084
#define REG_HIMR 0x00B0 #define REG_HIMR 0x00B0
#define REG_HISR 0x00B4 #define REG_HISR 0x00B4
#define REG_HIMRE 0x00B8 #define REG_HIMRE 0x00B8
#define REG_HISRE 0x00BC #define REG_HISRE 0x00BC
#define REG_PMC_DBG_CTRL2 0x00CC
#define REG_EFUSE_ACCESS 0x00CF #define REG_EFUSE_ACCESS 0x00CF
...@@ -95,7 +95,8 @@ ...@@ -95,7 +95,8 @@
#define REG_HPON_FSM 0x00EC #define REG_HPON_FSM 0x00EC
#define REG_SYS_CFG 0x00F0 #define REG_SYS_CFG 0x00F0
#define REG_GPIO_OUTSTS 0x00F4 #define REG_GPIO_OUTSTS 0x00F4
#define REG_SYS_CFG1 0x00F0 #define REG_MAC_PHY_CTRL_NORMAL 0x00F8
#define REG_SYS_CFG1 0x00FC
#define REG_ROM_VERSION 0x00FD #define REG_ROM_VERSION 0x00FD
#define REG_CR 0x0100 #define REG_CR 0x0100
...@@ -170,8 +171,14 @@ ...@@ -170,8 +171,14 @@
#define REG_BKQ_DESA 0x0338 #define REG_BKQ_DESA 0x0338
#define REG_RX_DESA 0x0340 #define REG_RX_DESA 0x0340
#define REG_DBI 0x0348 #define REG_DBI_WDATA 0x0348
#define REG_MDIO 0x0354 #define REG_DBI_RDATA 0x034C
#define REG_DBI_CTRL 0x0350
#define REG_DBI_ADDR 0x0350
#define REG_DBI_FLAG 0x0352
#define REG_MDIO_WDATA 0x0354
#define REG_MDIO_RDATA 0x0356
#define REG_MDIO_CTL 0x0358
#define REG_DBG_SEL 0x0360 #define REG_DBG_SEL 0x0360
#define REG_PCIE_HRPWM 0x0361 #define REG_PCIE_HRPWM 0x0361
#define REG_PCIE_HCPWM 0x0363 #define REG_PCIE_HCPWM 0x0363
...@@ -180,7 +187,6 @@ ...@@ -180,7 +187,6 @@
#define REG_UART_TX_DESA 0x0370 #define REG_UART_TX_DESA 0x0370
#define REG_UART_RX_DESA 0x0378 #define REG_UART_RX_DESA 0x0378
#define REG_HDAQ_DESA_NODEF 0x0000 #define REG_HDAQ_DESA_NODEF 0x0000
#define REG_CMDQ_DESA_NODEF 0x0000 #define REG_CMDQ_DESA_NODEF 0x0000
...@@ -193,7 +199,6 @@ ...@@ -193,7 +199,6 @@
#define REG_BCNQ_INFORMATION 0x0418 #define REG_BCNQ_INFORMATION 0x0418
#define REG_TXPKT_EMPTY 0x041A #define REG_TXPKT_EMPTY 0x041A
#define REG_CPU_MGQ_INFORMATION 0x041C #define REG_CPU_MGQ_INFORMATION 0x041C
#define REG_FWHW_TXQ_CTRL 0x0420 #define REG_FWHW_TXQ_CTRL 0x0420
#define REG_HWSEQ_CTRL 0x0423 #define REG_HWSEQ_CTRL 0x0423
...@@ -207,9 +212,7 @@ ...@@ -207,9 +212,7 @@
#define REG_RARFRC 0x0438 #define REG_RARFRC 0x0438
#define REG_RRSR 0x0440 #define REG_RRSR 0x0440
#define REG_ARFR0 0x0444 #define REG_ARFR0 0x0444
#define REG_ARFR1 0x0448 #define REG_ARFR1 0x044C
#define REG_ARFR2 0x044C
#define REG_ARFR3 0x0450
#define REG_AMPDU_MAX_TIME 0x0456 #define REG_AMPDU_MAX_TIME 0x0456
#define REG_AGGLEN_LMT 0x0458 #define REG_AGGLEN_LMT 0x0458
#define REG_AMPDU_MIN_SPACE 0x045C #define REG_AMPDU_MIN_SPACE 0x045C
...@@ -223,7 +226,10 @@ ...@@ -223,7 +226,10 @@
#define REG_POWER_STAGE2 0x04B8 #define REG_POWER_STAGE2 0x04B8
#define REG_PKT_LIFE_TIME 0x04C0 #define REG_PKT_LIFE_TIME 0x04C0
#define REG_STBC_SETTING 0x04C4 #define REG_STBC_SETTING 0x04C4
#define REG_HT_SINGLE_AMPDU 0x04C7
#define REG_PROT_MODE_CTRL 0x04C8 #define REG_PROT_MODE_CTRL 0x04C8
#define REG_MAX_AGGR_NUM 0x04CA
#define REG_BAR_MODE_CTRL 0x04CC #define REG_BAR_MODE_CTRL 0x04CC
#define REG_RA_TRY_RATE_AGG_LMT 0x04CF #define REG_RA_TRY_RATE_AGG_LMT 0x04CF
#define REG_EARLY_MODE_CONTROL 0x04D0 #define REG_EARLY_MODE_CONTROL 0x04D0
...@@ -303,6 +309,7 @@ ...@@ -303,6 +309,7 @@
#define REG_EIFS 0x0642 #define REG_EIFS 0x0642
#define REG_NAV_CTRL 0x0650 #define REG_NAV_CTRL 0x0650
#define REG_NAV_UPPER 0x0652
#define REG_BACAMCMD 0x0654 #define REG_BACAMCMD 0x0654
#define REG_BACAMCONTENT 0x0658 #define REG_BACAMCONTENT 0x0658
#define REG_LBDLY 0x0660 #define REG_LBDLY 0x0660
...@@ -401,7 +408,6 @@ ...@@ -401,7 +408,6 @@
#define HSIMR_GPIO9_INT_EN BIT(25) #define HSIMR_GPIO9_INT_EN BIT(25)
/* 8723/8188E Host System Interrupt Status Register (offset 0x5C, 32 byte) */ /* 8723/8188E Host System Interrupt Status Register (offset 0x5C, 32 byte) */
#define HSISR_GPIO12_0_INT BIT(0) #define HSISR_GPIO12_0_INT BIT(0)
#define HSISR_SPS_OCP_INT BIT(5) #define HSISR_SPS_OCP_INT BIT(5)
#define HSISR_RON_INT_EN BIT(6) #define HSISR_RON_INT_EN BIT(6)
...@@ -412,7 +418,6 @@ ...@@ -412,7 +418,6 @@
#define MSR_ADHOC 0x01 #define MSR_ADHOC 0x01
#define MSR_INFRA 0x02 #define MSR_INFRA 0x02
#define MSR_AP 0x03 #define MSR_AP 0x03
#define MSR_MASK 0x03
#define RRSR_RSC_OFFSET 21 #define RRSR_RSC_OFFSET 21
#define RRSR_SHORT_OFFSET 23 #define RRSR_SHORT_OFFSET 23
...@@ -542,7 +547,8 @@ ...@@ -542,7 +547,8 @@
/********************************************* /*********************************************
* 8723BE IMR/ISR bits * 8723BE IMR/ISR bits
**********************************************/ *********************************************
*/
#define IMR_DISABLED 0x0 #define IMR_DISABLED 0x0
/* IMR DW0(0x0060-0063) Bit 0-31 */ /* IMR DW0(0x0060-0063) Bit 0-31 */
#define IMR_TXCCK BIT(30) /* TXRPT interrupt when #define IMR_TXCCK BIT(30) /* TXRPT interrupt when
...@@ -644,7 +650,7 @@ ...@@ -644,7 +650,7 @@
#define RF_OPTION1 0x79 #define RF_OPTION1 0x79
#define RF_OPTION2 0x7A #define RF_OPTION2 0x7A
#define RF_OPTION3 0x7B #define RF_OPTION3 0x7B
#define RF_OPTION4 0xC3 #define EEPROM_RF_BT_SETTING_8723B 0xC3
#define EEPROM_DEFAULT_PID 0x1234 #define EEPROM_DEFAULT_PID 0x1234
#define EEPROM_DEFAULT_VID 0x5678 #define EEPROM_DEFAULT_VID 0x5678
...@@ -678,14 +684,11 @@ ...@@ -678,14 +684,11 @@
#define EEPROM_CLK 0x06 #define EEPROM_CLK 0x06
#define EEPROM_TESTR 0x08 #define EEPROM_TESTR 0x08
#define EEPROM_TXPOWERCCK 0x10 #define EEPROM_TXPOWERCCK 0x10
#define EEPROM_TXPOWERHT40_1S 0x16 #define EEPROM_TXPOWERHT40_1S 0x16
#define EEPROM_TXPOWERHT20DIFF 0x1B #define EEPROM_TXPOWERHT20DIFF 0x1B
#define EEPROM_TXPOWER_OFDMDIFF 0x1B #define EEPROM_TXPOWER_OFDMDIFF 0x1B
#define EEPROM_TX_PWR_INX 0x10 #define EEPROM_TX_PWR_INX 0x10
#define EEPROM_CHANNELPLAN 0xB8 #define EEPROM_CHANNELPLAN 0xB8
...@@ -1385,7 +1388,6 @@ ...@@ -1385,7 +1388,6 @@
#define RCCK0_FACOUNTERUPPER 0xa58 #define RCCK0_FACOUNTERUPPER 0xa58
#define RCCK0_CCA_CNT 0xa60 #define RCCK0_CCA_CNT 0xa60
/* PageB(0xB00) */ /* PageB(0xB00) */
#define RPDP_ANTA 0xb00 #define RPDP_ANTA 0xb00
#define RPDP_ANTA_4 0xb04 #define RPDP_ANTA_4 0xb04
...@@ -1399,7 +1401,7 @@ ...@@ -1399,7 +1401,7 @@
#define RPDP_ANTA_24 0xb24 #define RPDP_ANTA_24 0xb24
#define RCONFIG_PMPD_ANTA 0xb28 #define RCONFIG_PMPD_ANTA 0xb28
#define CONFIG_RAM64X16 0xb2c #define RCONFIG_ram64x16 0xb2c
#define RBNDA 0xb30 #define RBNDA 0xb30
#define RHSSIPAR 0xb34 #define RHSSIPAR 0xb34
...@@ -1494,7 +1496,6 @@ ...@@ -1494,7 +1496,6 @@
#define ROFDM0_FRAMESYNC 0xcf0 #define ROFDM0_FRAMESYNC 0xcf0
#define ROFDM0_DFSREPORT 0xcf4 #define ROFDM0_DFSREPORT 0xcf4
#define ROFDM1_LSTF 0xd00 #define ROFDM1_LSTF 0xd00
#define ROFDM1_TRXPATHENABLE 0xd04 #define ROFDM1_TRXPATHENABLE 0xd04
...@@ -2243,6 +2244,22 @@ ...@@ -2243,6 +2244,22 @@
#define BWORD1 0xc #define BWORD1 0xc
#define BWORD 0xf #define BWORD 0xf
#define MASKBYTE0 0xff
#define MASKBYTE1 0xff00
#define MASKBYTE2 0xff0000
#define MASKBYTE3 0xff000000
#define MASKHWORD 0xffff0000
#define MASKLWORD 0x0000ffff
#define MASKDWORD 0xffffffff
#define MASK12BITS 0xfff
#define MASKH4BITS 0xf0000000
#define MASKOFDM_D 0xffc00000
#define MASKCCK 0x3f3f3f3f
#define MASK4BITS 0x0f
#define MASK20BITS 0xfffff
#define RFREG_OFFSET_MASK 0xfffff
#define BENABLE 0x1 #define BENABLE 0x1
#define BDISABLE 0x0 #define BDISABLE 0x0
......
...@@ -51,7 +51,7 @@ void rtl8723be_phy_rf6052_set_bandwidth(struct ieee80211_hw *hw, u8 bandwidth) ...@@ -51,7 +51,7 @@ void rtl8723be_phy_rf6052_set_bandwidth(struct ieee80211_hw *hw, u8 bandwidth)
rtlphy->rfreg_chnlval[0]); rtlphy->rfreg_chnlval[0]);
break; break;
default: default:
RT_TRACE(rtlpriv, COMP_INIT, DBG_EMERG, RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
"unknown bandwidth: %#X\n", bandwidth); "unknown bandwidth: %#X\n", bandwidth);
break; break;
} }
...@@ -93,18 +93,20 @@ void rtl8723be_phy_rf6052_set_cck_txpower(struct ieee80211_hw *hw, ...@@ -93,18 +93,20 @@ void rtl8723be_phy_rf6052_set_cck_txpower(struct ieee80211_hw *hw,
(ppowerlevel[idx1] << 16) | (ppowerlevel[idx1] << 16) |
(ppowerlevel[idx1] << 24); (ppowerlevel[idx1] << 24);
} }
if (rtlefuse->eeprom_regulatory == 0) { if (rtlefuse->eeprom_regulatory == 0) {
tmpval = tmpval =
(rtlphy->mcs_offset[0][6]) + (rtlphy->mcs_txpwrlevel_origoffset[0][6]) +
(rtlphy->mcs_offset[0][7] << 8); (rtlphy->mcs_txpwrlevel_origoffset[0][7] << 8);
tx_agc[RF90_PATH_A] += tmpval; tx_agc[RF90_PATH_A] += tmpval;
tmpval = (rtlphy->mcs_offset[0][14]) + tmpval = (rtlphy->mcs_txpwrlevel_origoffset[0][14]) +
(rtlphy->mcs_offset[0][15] << (rtlphy->mcs_txpwrlevel_origoffset[0][15] <<
24); 24);
tx_agc[RF90_PATH_B] += tmpval; tx_agc[RF90_PATH_B] += tmpval;
} }
} }
for (idx1 = RF90_PATH_A; idx1 <= RF90_PATH_B; idx1++) { for (idx1 = RF90_PATH_A; idx1 <= RF90_PATH_B; idx1++) {
ptr = (u8 *)(&(tx_agc[idx1])); ptr = (u8 *)(&(tx_agc[idx1]));
for (idx2 = 0; idx2 < 4; idx2++) { for (idx2 = 0; idx2 < 4; idx2++) {
...@@ -124,29 +126,31 @@ void rtl8723be_phy_rf6052_set_cck_txpower(struct ieee80211_hw *hw, ...@@ -124,29 +126,31 @@ void rtl8723be_phy_rf6052_set_cck_txpower(struct ieee80211_hw *hw,
tmpval = tx_agc[RF90_PATH_A] & 0xff; tmpval = tx_agc[RF90_PATH_A] & 0xff;
rtl_set_bbreg(hw, RTXAGC_A_CCK1_MCS32, MASKBYTE1, tmpval); rtl_set_bbreg(hw, RTXAGC_A_CCK1_MCS32, MASKBYTE1, tmpval);
RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
"CCK PWR 1M (rf-A) = 0x%x (reg 0x%x)\n", tmpval, "CCK PWR 1M (rf-A) = 0x%x (reg 0x%x)\n", tmpval,
RTXAGC_A_CCK1_MCS32); RTXAGC_A_CCK1_MCS32);
tmpval = tx_agc[RF90_PATH_A] >> 8; tmpval = tx_agc[RF90_PATH_A] >> 8;
/*tmpval = tmpval & 0xff00ffff;*/
rtl_set_bbreg(hw, RTXAGC_B_CCK11_A_CCK2_11, 0xffffff00, tmpval); rtl_set_bbreg(hw, RTXAGC_B_CCK11_A_CCK2_11, 0xffffff00, tmpval);
RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
"CCK PWR 2~11M (rf-A) = 0x%x (reg 0x%x)\n", tmpval, "CCK PWR 2~11M (rf-A) = 0x%x (reg 0x%x)\n", tmpval,
RTXAGC_B_CCK11_A_CCK2_11); RTXAGC_B_CCK11_A_CCK2_11);
tmpval = tx_agc[RF90_PATH_B] >> 24; tmpval = tx_agc[RF90_PATH_B] >> 24;
rtl_set_bbreg(hw, RTXAGC_B_CCK11_A_CCK2_11, MASKBYTE0, tmpval); rtl_set_bbreg(hw, RTXAGC_B_CCK11_A_CCK2_11, MASKBYTE0, tmpval);
RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
"CCK PWR 11M (rf-B) = 0x%x (reg 0x%x)\n", tmpval, "CCK PWR 11M (rf-B) = 0x%x (reg 0x%x)\n", tmpval,
RTXAGC_B_CCK11_A_CCK2_11); RTXAGC_B_CCK11_A_CCK2_11);
tmpval = tx_agc[RF90_PATH_B] & 0x00ffffff; tmpval = tx_agc[RF90_PATH_B] & 0x00ffffff;
rtl_set_bbreg(hw, RTXAGC_B_CCK1_55_MCS32, 0xffffff00, tmpval); rtl_set_bbreg(hw, RTXAGC_B_CCK1_55_MCS32, 0xffffff00, tmpval);
RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
"CCK PWR 1~5.5M (rf-B) = 0x%x (reg 0x%x)\n", tmpval, "CCK PWR 1~5.5M (rf-B) = 0x%x (reg 0x%x)\n", tmpval,
RTXAGC_B_CCK1_55_MCS32); RTXAGC_B_CCK1_55_MCS32);
} }
...@@ -169,7 +173,7 @@ static void rtl8723be_phy_get_power_base(struct ieee80211_hw *hw, ...@@ -169,7 +173,7 @@ static void rtl8723be_phy_get_power_base(struct ieee80211_hw *hw,
powerbase0 = (powerbase0 << 24) | (powerbase0 << 16) | powerbase0 = (powerbase0 << 24) | (powerbase0 << 16) |
(powerbase0 << 8) | powerbase0; (powerbase0 << 8) | powerbase0;
*(ofdmbase + i) = powerbase0; *(ofdmbase + i) = powerbase0;
RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
" [OFDM power base index rf(%c) = 0x%x]\n", " [OFDM power base index rf(%c) = 0x%x]\n",
((i == 0) ? 'A' : 'B'), *(ofdmbase + i)); ((i == 0) ? 'A' : 'B'), *(ofdmbase + i));
} }
...@@ -179,27 +183,30 @@ static void rtl8723be_phy_get_power_base(struct ieee80211_hw *hw, ...@@ -179,27 +183,30 @@ static void rtl8723be_phy_get_power_base(struct ieee80211_hw *hw,
powerlevel[i] = ppowerlevel_bw20[i]; powerlevel[i] = ppowerlevel_bw20[i];
else else
powerlevel[i] = ppowerlevel_bw40[i]; powerlevel[i] = ppowerlevel_bw40[i];
powerbase1 = powerlevel[i]; powerbase1 = powerlevel[i];
powerbase1 = (powerbase1 << 24) | (powerbase1 << 16) | powerbase1 = (powerbase1 << 24) | (powerbase1 << 16) |
(powerbase1 << 8) | powerbase1; (powerbase1 << 8) | powerbase1;
*(mcsbase + i) = powerbase1; *(mcsbase + i) = powerbase1;
RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
" [MCS power base index rf(%c) = 0x%x]\n", " [MCS power base index rf(%c) = 0x%x]\n",
((i == 0) ? 'A' : 'B'), *(mcsbase + i)); ((i == 0) ? 'A' : 'B'), *(mcsbase + i));
} }
} }
static void txpwr_by_regulatory(struct ieee80211_hw *hw, u8 channel, u8 index, static void _rtl8723be_get_txpower_writeval_by_regulatory(
u32 *powerbase0, u32 *powerbase1, struct ieee80211_hw *hw,
u8 channel, u8 index,
u32 *powerbase0,
u32 *powerbase1,
u32 *p_outwriteval) u32 *p_outwriteval)
{ {
struct rtl_priv *rtlpriv = rtl_priv(hw); struct rtl_priv *rtlpriv = rtl_priv(hw);
struct rtl_phy *rtlphy = &(rtlpriv->phy); struct rtl_phy *rtlphy = &(rtlpriv->phy);
struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
u8 i, chnlgroup = 0, pwr_diff_limit[4]; u8 i, chnlgroup = 0, pwr_diff_limit[4], pwr_diff = 0, customer_pwr_diff;
u8 pwr_diff = 0, customer_pwr_diff;
u32 writeval, customer_limit, rf; u32 writeval, customer_limit, rf;
for (rf = 0; rf < 2; rf++) { for (rf = 0; rf < 2; rf++) {
...@@ -208,12 +215,12 @@ static void txpwr_by_regulatory(struct ieee80211_hw *hw, u8 channel, u8 index, ...@@ -208,12 +215,12 @@ static void txpwr_by_regulatory(struct ieee80211_hw *hw, u8 channel, u8 index,
chnlgroup = 0; chnlgroup = 0;
writeval = writeval =
rtlphy->mcs_offset[chnlgroup][index + (rf ? 8 : 0)] rtlphy->mcs_txpwrlevel_origoffset[chnlgroup][index +
(rf ? 8 : 0)]
+ ((index < 2) ? powerbase0[rf] : powerbase1[rf]); + ((index < 2) ? powerbase0[rf] : powerbase1[rf]);
RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
"RTK better performance, " "RTK better performance, writeval(%c) = 0x%x\n",
"writeval(%c) = 0x%x\n",
((rf == 0) ? 'A' : 'B'), writeval); ((rf == 0) ? 'A' : 'B'), writeval);
break; break;
case 1: case 1:
...@@ -233,14 +240,15 @@ static void txpwr_by_regulatory(struct ieee80211_hw *hw, u8 channel, u8 index, ...@@ -233,14 +240,15 @@ static void txpwr_by_regulatory(struct ieee80211_hw *hw, u8 channel, u8 index,
else if (channel == 14) else if (channel == 14)
chnlgroup = 5; chnlgroup = 5;
} }
writeval = rtlphy->mcs_offset[chnlgroup]
writeval =
rtlphy->mcs_txpwrlevel_origoffset[chnlgroup]
[index + (rf ? 8 : 0)] + ((index < 2) ? [index + (rf ? 8 : 0)] + ((index < 2) ?
powerbase0[rf] : powerbase0[rf] :
powerbase1[rf]); powerbase1[rf]);
RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
"Realtek regulatory, 20MHz, " "Realtek regulatory, 20MHz, writeval(%c) = 0x%x\n",
"writeval(%c) = 0x%x\n",
((rf == 0) ? 'A' : 'B'), writeval); ((rf == 0) ? 'A' : 'B'), writeval);
break; break;
...@@ -248,28 +256,25 @@ static void txpwr_by_regulatory(struct ieee80211_hw *hw, u8 channel, u8 index, ...@@ -248,28 +256,25 @@ static void txpwr_by_regulatory(struct ieee80211_hw *hw, u8 channel, u8 index,
writeval = writeval =
((index < 2) ? powerbase0[rf] : powerbase1[rf]); ((index < 2) ? powerbase0[rf] : powerbase1[rf]);
RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
"Better regulatory, " "Better regulatory, writeval(%c) = 0x%x\n",
"writeval(%c) = 0x%x\n",
((rf == 0) ? 'A' : 'B'), writeval); ((rf == 0) ? 'A' : 'B'), writeval);
break; break;
case 3: case 3:
chnlgroup = 0; chnlgroup = 0;
if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40) { if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40) {
RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
"customer's limit, 40MHz " "customer's limit, 40MHz rf(%c) = 0x%x\n",
"rf(%c) = 0x%x\n",
((rf == 0) ? 'A' : 'B'), ((rf == 0) ? 'A' : 'B'),
rtlefuse->pwrgroup_ht40[rf] rtlefuse->pwrgroup_ht40
[channel-1]); [rf][channel - 1]);
} else { } else {
RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
"customer's limit, 20MHz " "customer's limit, 20MHz rf(%c) = 0x%x\n",
"rf(%c) = 0x%x\n",
((rf == 0) ? 'A' : 'B'), ((rf == 0) ? 'A' : 'B'),
rtlefuse->pwrgroup_ht20[rf] rtlefuse->pwrgroup_ht20
[channel-1]); [rf][channel - 1]);
} }
if (index < 2) if (index < 2)
...@@ -294,7 +299,7 @@ static void txpwr_by_regulatory(struct ieee80211_hw *hw, u8 channel, u8 index, ...@@ -294,7 +299,7 @@ static void txpwr_by_regulatory(struct ieee80211_hw *hw, u8 channel, u8 index,
for (i = 0; i < 4; i++) { for (i = 0; i < 4; i++) {
pwr_diff_limit[i] = pwr_diff_limit[i] =
(u8)((rtlphy->mcs_offset (u8)((rtlphy->mcs_txpwrlevel_origoffset
[chnlgroup][index + (rf ? 8 : 0)] & [chnlgroup][index + (rf ? 8 : 0)] &
(0x7f << (i * 8))) >> (i * 8)); (0x7f << (i * 8))) >> (i * 8));
...@@ -307,7 +312,7 @@ static void txpwr_by_regulatory(struct ieee80211_hw *hw, u8 channel, u8 index, ...@@ -307,7 +312,7 @@ static void txpwr_by_regulatory(struct ieee80211_hw *hw, u8 channel, u8 index,
(pwr_diff_limit[1] << 8) | (pwr_diff_limit[1] << 8) |
(pwr_diff_limit[0]); (pwr_diff_limit[0]);
RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
"Customer's limit rf(%c) = 0x%x\n", "Customer's limit rf(%c) = 0x%x\n",
((rf == 0) ? 'A' : 'B'), customer_limit); ((rf == 0) ? 'A' : 'B'), customer_limit);
...@@ -315,20 +320,19 @@ static void txpwr_by_regulatory(struct ieee80211_hw *hw, u8 channel, u8 index, ...@@ -315,20 +320,19 @@ static void txpwr_by_regulatory(struct ieee80211_hw *hw, u8 channel, u8 index,
powerbase0[rf] : powerbase0[rf] :
powerbase1[rf]); powerbase1[rf]);
RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
"Customer, writeval rf(%c)= 0x%x\n", "Customer, writeval rf(%c)= 0x%x\n",
((rf == 0) ? 'A' : 'B'), writeval); ((rf == 0) ? 'A' : 'B'), writeval);
break; break;
default: default:
chnlgroup = 0; chnlgroup = 0;
writeval = writeval =
rtlphy->mcs_offset[chnlgroup] rtlphy->mcs_txpwrlevel_origoffset[chnlgroup]
[index + (rf ? 8 : 0)] [index + (rf ? 8 : 0)]
+ ((index < 2) ? powerbase0[rf] : powerbase1[rf]); + ((index < 2) ? powerbase0[rf] : powerbase1[rf]);
RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
"RTK better performance, writeval " "RTK better performance, writeval rf(%c) = 0x%x\n",
"rf(%c) = 0x%x\n",
((rf == 0) ? 'A' : 'B'), writeval); ((rf == 0) ? 'A' : 'B'), writeval);
break; break;
} }
...@@ -343,7 +347,7 @@ static void txpwr_by_regulatory(struct ieee80211_hw *hw, u8 channel, u8 index, ...@@ -343,7 +347,7 @@ static void txpwr_by_regulatory(struct ieee80211_hw *hw, u8 channel, u8 index,
} }
static void _rtl8723be_write_ofdm_power_reg(struct ieee80211_hw *hw, static void _rtl8723be_write_ofdm_power_reg(struct ieee80211_hw *hw,
u8 index, u32 *value) u8 index, u32 *pvalue)
{ {
struct rtl_priv *rtlpriv = rtl_priv(hw); struct rtl_priv *rtlpriv = rtl_priv(hw);
u16 regoffset_a[6] = { u16 regoffset_a[6] = {
...@@ -361,9 +365,9 @@ static void _rtl8723be_write_ofdm_power_reg(struct ieee80211_hw *hw, ...@@ -361,9 +365,9 @@ static void _rtl8723be_write_ofdm_power_reg(struct ieee80211_hw *hw,
u16 regoffset; u16 regoffset;
for (rf = 0; rf < 2; rf++) { for (rf = 0; rf < 2; rf++) {
writeval = value[rf]; writeval = pvalue[rf];
for (i = 0; i < 4; i++) { for (i = 0; i < 4; i++) {
pwr_val[i] = (u8) ((writeval & (0x7f << pwr_val[i] = (u8)((writeval & (0x7f <<
(i * 8))) >> (i * 8)); (i * 8))) >> (i * 8));
if (pwr_val[i] > RF6052_MAX_TX_PWR) if (pwr_val[i] > RF6052_MAX_TX_PWR)
...@@ -378,7 +382,7 @@ static void _rtl8723be_write_ofdm_power_reg(struct ieee80211_hw *hw, ...@@ -378,7 +382,7 @@ static void _rtl8723be_write_ofdm_power_reg(struct ieee80211_hw *hw,
regoffset = regoffset_b[index]; regoffset = regoffset_b[index];
rtl_set_bbreg(hw, regoffset, MASKDWORD, writeval); rtl_set_bbreg(hw, regoffset, MASKDWORD, writeval);
RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
"Set 0x%x = %08x\n", regoffset, writeval); "Set 0x%x = %08x\n", regoffset, writeval);
} }
} }
...@@ -400,8 +404,11 @@ void rtl8723be_phy_rf6052_set_ofdm_txpower(struct ieee80211_hw *hw, ...@@ -400,8 +404,11 @@ void rtl8723be_phy_rf6052_set_ofdm_txpower(struct ieee80211_hw *hw,
rtl8723be_dm_txpower_track_adjust(hw, 1, &direction, &pwrtrac_value); rtl8723be_dm_txpower_track_adjust(hw, 1, &direction, &pwrtrac_value);
for (index = 0; index < 6; index++) { for (index = 0; index < 6; index++) {
txpwr_by_regulatory(hw, channel, index, &powerbase0[0], _rtl8723be_get_txpower_writeval_by_regulatory(hw,
&powerbase1[0], &writeval[0]); channel, index,
&powerbase0[0],
&powerbase1[0],
&writeval[0]);
if (direction == 1) { if (direction == 1) {
writeval[0] += pwrtrac_value; writeval[0] += pwrtrac_value;
writeval[1] += pwrtrac_value; writeval[1] += pwrtrac_value;
...@@ -424,16 +431,17 @@ bool rtl8723be_phy_rf6052_config(struct ieee80211_hw *hw) ...@@ -424,16 +431,17 @@ bool rtl8723be_phy_rf6052_config(struct ieee80211_hw *hw)
rtlphy->num_total_rfpath = 2; rtlphy->num_total_rfpath = 2;
return _rtl8723be_phy_rf6052_config_parafile(hw); return _rtl8723be_phy_rf6052_config_parafile(hw);
} }
static bool _rtl8723be_phy_rf6052_config_parafile(struct ieee80211_hw *hw) static bool _rtl8723be_phy_rf6052_config_parafile(struct ieee80211_hw *hw)
{ {
struct rtl_priv *rtlpriv = rtl_priv(hw); struct rtl_priv *rtlpriv = rtl_priv(hw);
struct rtl_phy *rtlphy = &(rtlpriv->phy); struct rtl_phy *rtlphy = &(rtlpriv->phy);
struct bb_reg_def *pphyreg;
u32 u4_regvalue = 0; u32 u4_regvalue = 0;
u8 rfpath; u8 rfpath;
bool rtstatus = true; bool rtstatus = true;
struct bb_reg_def *pphyreg;
for (rfpath = 0; rfpath < rtlphy->num_total_rfpath; rfpath++) { for (rfpath = 0; rfpath < rtlphy->num_total_rfpath; rfpath++) {
pphyreg = &rtlphy->phyreg_def[rfpath]; pphyreg = &rtlphy->phyreg_def[rfpath];
......
...@@ -31,6 +31,7 @@ ...@@ -31,6 +31,7 @@
#include "phy.h" #include "phy.h"
#include "../rtl8723com/phy_common.h" #include "../rtl8723com/phy_common.h"
#include "dm.h" #include "dm.h"
#include "../rtl8723com/dm_common.h"
#include "hw.h" #include "hw.h"
#include "fw.h" #include "fw.h"
#include "../rtl8723com/fw_common.h" #include "../rtl8723com/fw_common.h"
...@@ -101,6 +102,8 @@ int rtl8723be_init_sw_vars(struct ieee80211_hw *hw) ...@@ -101,6 +102,8 @@ int rtl8723be_init_sw_vars(struct ieee80211_hw *hw)
rtlpriv->dm.thermalvalue = 0; rtlpriv->dm.thermalvalue = 0;
rtlpci->transmit_config = CFENDFORM | BIT(15) | BIT(24) | BIT(25); rtlpci->transmit_config = CFENDFORM | BIT(15) | BIT(24) | BIT(25);
rtlpriv->phy.lck_inprogress = false;
mac->ht_enable = true; mac->ht_enable = true;
/* compatible 5G band 88ce just 2.4G band & smsp */ /* compatible 5G band 88ce just 2.4G band & smsp */
...@@ -137,12 +140,19 @@ int rtl8723be_init_sw_vars(struct ieee80211_hw *hw) ...@@ -137,12 +140,19 @@ int rtl8723be_init_sw_vars(struct ieee80211_hw *hw)
rtlpci->irq_mask[1] = (u32)(IMR_RXFOVW | 0); rtlpci->irq_mask[1] = (u32)(IMR_RXFOVW | 0);
rtlpci->sys_irq_mask = (u32)(HSIMR_PDN_INT_EN |
HSIMR_RON_INT_EN |
0);
/* for debug level */ /* for debug level */
rtlpriv->dbg.global_debuglevel = rtlpriv->cfg->mod_params->debug; rtlpriv->dbg.global_debuglevel = rtlpriv->cfg->mod_params->debug;
/* for LPS & IPS */ /* for LPS & IPS */
rtlpriv->psc.inactiveps = rtlpriv->cfg->mod_params->inactiveps; rtlpriv->psc.inactiveps = rtlpriv->cfg->mod_params->inactiveps;
rtlpriv->psc.swctrl_lps = rtlpriv->cfg->mod_params->swctrl_lps; rtlpriv->psc.swctrl_lps = rtlpriv->cfg->mod_params->swctrl_lps;
rtlpriv->psc.fwctrl_lps = rtlpriv->cfg->mod_params->fwctrl_lps; rtlpriv->psc.fwctrl_lps = rtlpriv->cfg->mod_params->fwctrl_lps;
rtlpci->msi_support = rtlpriv->cfg->mod_params->msi_support;
if (rtlpriv->cfg->mod_params->disable_watchdog)
pr_info("watchdog disabled\n");
rtlpriv->psc.reg_fwctrl_lps = 3; rtlpriv->psc.reg_fwctrl_lps = 3;
rtlpriv->psc.reg_max_lps_awakeintvl = 5; rtlpriv->psc.reg_max_lps_awakeintvl = 5;
/* for ASPM, you can close aspm through /* for ASPM, you can close aspm through
...@@ -157,6 +167,11 @@ int rtl8723be_init_sw_vars(struct ieee80211_hw *hw) ...@@ -157,6 +167,11 @@ int rtl8723be_init_sw_vars(struct ieee80211_hw *hw)
else if (rtlpriv->psc.reg_fwctrl_lps == 3) else if (rtlpriv->psc.reg_fwctrl_lps == 3)
rtlpriv->psc.fwctrl_psmode = FW_PS_DTIM_MODE; rtlpriv->psc.fwctrl_psmode = FW_PS_DTIM_MODE;
/*low power: Disable 32k */
rtlpriv->psc.low_power_enable = false;
rtlpriv->rtlhal.earlymode_enable = false;
/* for firmware buf */ /* for firmware buf */
rtlpriv->rtlhal.pfirmware = vzalloc(0x8000); rtlpriv->rtlhal.pfirmware = vzalloc(0x8000);
if (!rtlpriv->rtlhal.pfirmware) { if (!rtlpriv->rtlhal.pfirmware) {
...@@ -182,8 +197,6 @@ void rtl8723be_deinit_sw_vars(struct ieee80211_hw *hw) ...@@ -182,8 +197,6 @@ void rtl8723be_deinit_sw_vars(struct ieee80211_hw *hw)
{ {
struct rtl_priv *rtlpriv = rtl_priv(hw); struct rtl_priv *rtlpriv = rtl_priv(hw);
if (rtlpriv->cfg->ops->get_btc_status())
rtlpriv->btcoexist.btc_ops->btc_halt_notify();
if (rtlpriv->rtlhal.pfirmware) { if (rtlpriv->rtlhal.pfirmware) {
vfree(rtlpriv->rtlhal.pfirmware); vfree(rtlpriv->rtlhal.pfirmware);
rtlpriv->rtlhal.pfirmware = NULL; rtlpriv->rtlhal.pfirmware = NULL;
...@@ -245,6 +258,7 @@ static struct rtl_hal_ops rtl8723be_hal_ops = { ...@@ -245,6 +258,7 @@ static struct rtl_hal_ops rtl8723be_hal_ops = {
.set_rfreg = rtl8723be_phy_set_rf_reg, .set_rfreg = rtl8723be_phy_set_rf_reg,
.fill_h2c_cmd = rtl8723be_fill_h2c_cmd, .fill_h2c_cmd = rtl8723be_fill_h2c_cmd,
.get_btc_status = rtl8723be_get_btc_status, .get_btc_status = rtl8723be_get_btc_status,
.rx_command_packet = rtl8723be_rx_command_packet,
.is_fw_header = is_fw_header, .is_fw_header = is_fw_header,
}; };
...@@ -253,8 +267,6 @@ static struct rtl_mod_params rtl8723be_mod_params = { ...@@ -253,8 +267,6 @@ static struct rtl_mod_params rtl8723be_mod_params = {
.inactiveps = true, .inactiveps = true,
.swctrl_lps = false, .swctrl_lps = false,
.fwctrl_lps = true, .fwctrl_lps = true,
.msi_support = false,
.debug = DBG_EMERG,
}; };
static struct rtl_hal_cfg rtl8723be_hal_cfg = { static struct rtl_hal_cfg rtl8723be_hal_cfg = {
...@@ -272,6 +284,9 @@ static struct rtl_hal_cfg rtl8723be_hal_cfg = { ...@@ -272,6 +284,9 @@ static struct rtl_hal_cfg rtl8723be_hal_cfg = {
.maps[MAC_RCR_ACRC32] = ACRC32, .maps[MAC_RCR_ACRC32] = ACRC32,
.maps[MAC_RCR_ACF] = ACF, .maps[MAC_RCR_ACF] = ACF,
.maps[MAC_RCR_AAP] = AAP, .maps[MAC_RCR_AAP] = AAP,
.maps[MAC_HIMR] = REG_HIMR,
.maps[MAC_HIMRE] = REG_HIMRE,
.maps[MAC_HSISR] = REG_HSISR,
.maps[EFUSE_ACCESS] = REG_EFUSE_ACCESS, .maps[EFUSE_ACCESS] = REG_EFUSE_ACCESS,
...@@ -305,6 +320,7 @@ static struct rtl_hal_cfg rtl8723be_hal_cfg = { ...@@ -305,6 +320,7 @@ static struct rtl_hal_cfg rtl8723be_hal_cfg = {
.maps[RTL_IMR_BCNDMAINT3] = IMR_BCNDMAINT3, .maps[RTL_IMR_BCNDMAINT3] = IMR_BCNDMAINT3,
.maps[RTL_IMR_BCNDMAINT2] = IMR_BCNDMAINT2, .maps[RTL_IMR_BCNDMAINT2] = IMR_BCNDMAINT2,
.maps[RTL_IMR_BCNDMAINT1] = IMR_BCNDMAINT1, .maps[RTL_IMR_BCNDMAINT1] = IMR_BCNDMAINT1,
/* .maps[RTL_IMR_BCNDOK8] = IMR_BCNDOK8, */ /*need check*/
.maps[RTL_IMR_BCNDOK7] = IMR_BCNDOK7, .maps[RTL_IMR_BCNDOK7] = IMR_BCNDOK7,
.maps[RTL_IMR_BCNDOK6] = IMR_BCNDOK6, .maps[RTL_IMR_BCNDOK6] = IMR_BCNDOK6,
.maps[RTL_IMR_BCNDOK5] = IMR_BCNDOK5, .maps[RTL_IMR_BCNDOK5] = IMR_BCNDOK5,
...@@ -312,6 +328,8 @@ static struct rtl_hal_cfg rtl8723be_hal_cfg = { ...@@ -312,6 +328,8 @@ static struct rtl_hal_cfg rtl8723be_hal_cfg = {
.maps[RTL_IMR_BCNDOK3] = IMR_BCNDOK3, .maps[RTL_IMR_BCNDOK3] = IMR_BCNDOK3,
.maps[RTL_IMR_BCNDOK2] = IMR_BCNDOK2, .maps[RTL_IMR_BCNDOK2] = IMR_BCNDOK2,
.maps[RTL_IMR_BCNDOK1] = IMR_BCNDOK1, .maps[RTL_IMR_BCNDOK1] = IMR_BCNDOK1,
/* .maps[RTL_IMR_TIMEOUT2] = IMR_TIMEOUT2,*/
/* .maps[RTL_IMR_TIMEOUT1] = IMR_TIMEOUT1,*/
.maps[RTL_IMR_TXFOVW] = IMR_TXFOVW, .maps[RTL_IMR_TXFOVW] = IMR_TXFOVW,
.maps[RTL_IMR_PSTIMEOUT] = IMR_PSTIMEOUT, .maps[RTL_IMR_PSTIMEOUT] = IMR_PSTIMEOUT,
...@@ -329,6 +347,7 @@ static struct rtl_hal_cfg rtl8723be_hal_cfg = { ...@@ -329,6 +347,7 @@ static struct rtl_hal_cfg rtl8723be_hal_cfg = {
.maps[RTL_IMR_VIDOK] = IMR_VIDOK, .maps[RTL_IMR_VIDOK] = IMR_VIDOK,
.maps[RTL_IMR_VODOK] = IMR_VODOK, .maps[RTL_IMR_VODOK] = IMR_VODOK,
.maps[RTL_IMR_ROK] = IMR_ROK, .maps[RTL_IMR_ROK] = IMR_ROK,
.maps[RTL_IMR_HSISR_IND] = IMR_HSISR_IND_ON_INT,
.maps[RTL_IBSS_INT_MASKS] = (IMR_BCNDMAINT0 | IMR_TBDOK | IMR_TBDER), .maps[RTL_IBSS_INT_MASKS] = (IMR_BCNDMAINT0 | IMR_TBDOK | IMR_TBDER),
.maps[RTL_RC_CCK_RATE1M] = DESC92C_RATE1M, .maps[RTL_RC_CCK_RATE1M] = DESC92C_RATE1M,
...@@ -348,12 +367,12 @@ static struct rtl_hal_cfg rtl8723be_hal_cfg = { ...@@ -348,12 +367,12 @@ static struct rtl_hal_cfg rtl8723be_hal_cfg = {
.maps[RTL_RC_HT_RATEMCS15] = DESC92C_RATEMCS15, .maps[RTL_RC_HT_RATEMCS15] = DESC92C_RATEMCS15,
}; };
static const struct pci_device_id rtl8723be_pci_id[] = { static struct pci_device_id rtl8723be_pci_ids[] = {
{RTL_PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0xb723, rtl8723be_hal_cfg)}, {RTL_PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0xB723, rtl8723be_hal_cfg)},
{}, {},
}; };
MODULE_DEVICE_TABLE(pci, rtl8723be_pci_id); MODULE_DEVICE_TABLE(pci, rtl8723be_pci_ids);
MODULE_AUTHOR("PageHe <page_he@realsil.com.cn>"); MODULE_AUTHOR("PageHe <page_he@realsil.com.cn>");
MODULE_AUTHOR("Realtek WlanFAE <wlanfae@realtek.com>"); MODULE_AUTHOR("Realtek WlanFAE <wlanfae@realtek.com>");
...@@ -366,21 +385,22 @@ module_param_named(debug, rtl8723be_mod_params.debug, int, 0444); ...@@ -366,21 +385,22 @@ module_param_named(debug, rtl8723be_mod_params.debug, int, 0444);
module_param_named(ips, rtl8723be_mod_params.inactiveps, bool, 0444); module_param_named(ips, rtl8723be_mod_params.inactiveps, bool, 0444);
module_param_named(swlps, rtl8723be_mod_params.swctrl_lps, bool, 0444); module_param_named(swlps, rtl8723be_mod_params.swctrl_lps, bool, 0444);
module_param_named(fwlps, rtl8723be_mod_params.fwctrl_lps, bool, 0444); module_param_named(fwlps, rtl8723be_mod_params.fwctrl_lps, bool, 0444);
module_param_named(msi, rtl8723be_mod_params.msi_support, bool, 0444); module_param_named(disable_watchdog, rtl8723be_mod_params.disable_watchdog,
bool, 0444);
MODULE_PARM_DESC(swenc, "using hardware crypto (default 0 [hardware])\n"); MODULE_PARM_DESC(swenc, "using hardware crypto (default 0 [hardware])\n");
MODULE_PARM_DESC(ips, "using no link power save (default 1 is open)\n"); MODULE_PARM_DESC(ips, "using no link power save (default 1 is open)\n");
MODULE_PARM_DESC(fwlps, "using linked fw control power save (default 1 is open)\n"); MODULE_PARM_DESC(fwlps, "using linked fw control power save (default 1 is open)\n");
MODULE_PARM_DESC(msi, "Set to 1 to use MSI interrupts mode (default 0)\n"); MODULE_PARM_DESC(msi, "Set to 1 to use MSI interrupts mode (default 0)\n");
MODULE_PARM_DESC(debug, "Set debug level (0-5) (default 0)"); MODULE_PARM_DESC(debug, "Set debug level (0-5) (default 0)");
MODULE_PARM_DESC(disable_watchdog, "Set to 1 to disable the watchdog (default 0)\n");
static SIMPLE_DEV_PM_OPS(rtlwifi_pm_ops, rtl_pci_suspend, rtl_pci_resume); static SIMPLE_DEV_PM_OPS(rtlwifi_pm_ops, rtl_pci_suspend, rtl_pci_resume);
static struct pci_driver rtl8723be_driver = { static struct pci_driver rtl8723be_driver = {
.name = KBUILD_MODNAME, .name = KBUILD_MODNAME,
.id_table = rtl8723be_pci_id, .id_table = rtl8723be_pci_ids,
.probe = rtl_pci_probe, .probe = rtl_pci_probe,
.remove = rtl_pci_disconnect, .remove = rtl_pci_disconnect,
.driver.pm = &rtlwifi_pm_ops, .driver.pm = &rtlwifi_pm_ops,
}; };
......
...@@ -73,7 +73,7 @@ u32 RTL8723BEPHY_REG_1TARRAY[] = { ...@@ -73,7 +73,7 @@ u32 RTL8723BEPHY_REG_1TARRAY[] = {
0x90C, 0x81121111, 0x90C, 0x81121111,
0x910, 0x00000002, 0x910, 0x00000002,
0x914, 0x00000201, 0x914, 0x00000201,
0x948, 0x00000000, 0x948, 0x00000280,
0xA00, 0x00D047C8, 0xA00, 0x00D047C8,
0xA04, 0x80FF000C, 0xA04, 0x80FF000C,
0xA08, 0x8C838300, 0xA08, 0x8C838300,
...@@ -221,6 +221,7 @@ u32 RTL8723BEPHY_REG_1TARRAY[] = { ...@@ -221,6 +221,7 @@ u32 RTL8723BEPHY_REG_1TARRAY[] = {
0xF00, 0x00000300, 0xF00, 0x00000300,
0x820, 0x01000100, 0x820, 0x01000100,
0x800, 0x83040000, 0x800, 0x83040000,
}; };
u32 RTL8723BEPHY_REG_ARRAY_PG[] = { u32 RTL8723BEPHY_REG_ARRAY_PG[] = {
...@@ -336,11 +337,13 @@ u32 RTL8723BE_RADIOA_1TARRAY[] = { ...@@ -336,11 +337,13 @@ u32 RTL8723BE_RADIOA_1TARRAY[] = {
0x0A4, 0x00048D80, 0x0A4, 0x00048D80,
0x0A5, 0x00068000, 0x0A5, 0x00068000,
0x000, 0x00033D80, 0x000, 0x00033D80,
}; };
u32 RTL8723BEMAC_1T_ARRAY[] = { u32 RTL8723BEMAC_1T_ARRAY[] = {
0x02F, 0x00000030, 0x02F, 0x00000030,
0x035, 0x00000000, 0x035, 0x00000000,
0x067, 0x00000020,
0x428, 0x0000000A, 0x428, 0x0000000A,
0x429, 0x00000010, 0x429, 0x00000010,
0x430, 0x00000000, 0x430, 0x00000000,
...@@ -436,6 +439,7 @@ u32 RTL8723BEMAC_1T_ARRAY[] = { ...@@ -436,6 +439,7 @@ u32 RTL8723BEMAC_1T_ARRAY[] = {
0x709, 0x00000043, 0x709, 0x00000043,
0x70A, 0x00000065, 0x70A, 0x00000065,
0x70B, 0x00000087, 0x70B, 0x00000087,
}; };
u32 RTL8723BEAGCTAB_1TARRAY[] = { u32 RTL8723BEAGCTAB_1TARRAY[] = {
...@@ -569,4 +573,5 @@ u32 RTL8723BEAGCTAB_1TARRAY[] = { ...@@ -569,4 +573,5 @@ u32 RTL8723BEAGCTAB_1TARRAY[] = {
0xC78, 0x007F0001, 0xC78, 0x007F0001,
0xC50, 0x69553422, 0xC50, 0x69553422,
0xC50, 0x69553420, 0xC50, 0x69553420,
}; };
...@@ -35,7 +35,7 @@ extern u32 RTL8723BEPHY_REG_1TARRAY[]; ...@@ -35,7 +35,7 @@ extern u32 RTL8723BEPHY_REG_1TARRAY[];
extern u32 RTL8723BEPHY_REG_ARRAY_PG[]; extern u32 RTL8723BEPHY_REG_ARRAY_PG[];
#define RTL8723BE_RADIOA_1TARRAYLEN 206 #define RTL8723BE_RADIOA_1TARRAYLEN 206
extern u32 RTL8723BE_RADIOA_1TARRAY[]; extern u32 RTL8723BE_RADIOA_1TARRAY[];
#define RTL8723BEMAC_1T_ARRAYLEN 194 #define RTL8723BEMAC_1T_ARRAYLEN 196
extern u32 RTL8723BEMAC_1T_ARRAY[]; extern u32 RTL8723BEMAC_1T_ARRAY[];
#define RTL8723BEAGCTAB_1TARRAYLEN 260 #define RTL8723BEAGCTAB_1TARRAYLEN 260
extern u32 RTL8723BEAGCTAB_1TARRAY[]; extern u32 RTL8723BEAGCTAB_1TARRAY[];
......
...@@ -415,21 +415,25 @@ struct phy_status_rpt { ...@@ -415,21 +415,25 @@ struct phy_status_rpt {
} __packed; } __packed;
struct rx_fwinfo_8723be { struct rx_fwinfo_8723be {
u8 gain_trsw[4]; u8 gain_trsw[2];
u16 chl_num:10;
u16 sub_chnl:4;
u16 r_rfmod:2;
u8 pwdb_all; u8 pwdb_all;
u8 cfosho[4]; u8 cfosho[4];
u8 cfotail[4]; u8 cfotail[4];
char rxevm[2]; char rxevm[2];
char rxsnr[4]; char rxsnr[2];
u8 pcts_msk_rpt[2];
u8 pdsnr[2]; u8 pdsnr[2];
u8 csi_current[2]; u8 csi_current[2];
u8 csi_target[2]; u8 rx_gain_c;
u8 rx_gain_d;
u8 sigevm; u8 sigevm;
u8 max_ex_pwr; u8 resvd_0;
u8 ex_intf_flag:1; u8 antidx_anta:3;
u8 sgi_en:1; u8 antidx_antb:3;
u8 rxsc:2; u8 resvd_1:2;
u8 reserve:4;
} __packed; } __packed;
struct tx_desc_8723be { struct tx_desc_8723be {
...@@ -597,21 +601,25 @@ struct rx_desc_8723be { ...@@ -597,21 +601,25 @@ struct rx_desc_8723be {
} __packed; } __packed;
void rtl8723be_tx_fill_desc(struct ieee80211_hw *hw, void rtl8723be_tx_fill_desc(struct ieee80211_hw *hw,
struct ieee80211_hdr *hdr, u8 *pdesc, struct ieee80211_hdr *hdr,
u8 *pbd_desc_tx, struct ieee80211_tx_info *info, u8 *pdesc_tx, u8 *txbd,
struct ieee80211_tx_info *info,
struct ieee80211_sta *sta, struct sk_buff *skb, struct ieee80211_sta *sta, struct sk_buff *skb,
u8 hw_queue, struct rtl_tcb_desc *ptcb_desc); u8 hw_queue, struct rtl_tcb_desc *ptcb_desc);
bool rtl8723be_rx_query_desc(struct ieee80211_hw *hw, bool rtl8723be_rx_query_desc(struct ieee80211_hw *hw,
struct rtl_stats *status, struct rtl_stats *status,
struct ieee80211_rx_status *rx_status, struct ieee80211_rx_status *rx_status,
u8 *pdesc, struct sk_buff *skb); u8 *pdesc, struct sk_buff *skb);
void rtl8723be_set_desc(struct ieee80211_hw *hw, u8 *pdesc, bool istx, void rtl8723be_set_desc(struct ieee80211_hw *hw, u8 *pdesc,
u8 desc_name, u8 *val); bool istx, u8 desc_name, u8 *val);
u32 rtl8723be_get_desc(u8 *pdesc, bool istx, u8 desc_name); u32 rtl8723be_get_desc(u8 *pdesc, bool istx, u8 desc_name);
bool rtl8723be_is_tx_desc_closed(struct ieee80211_hw *hw, bool rtl8723be_is_tx_desc_closed(struct ieee80211_hw *hw,
u8 hw_queue, u16 index); u8 hw_queue, u16 index);
void rtl8723be_tx_polling(struct ieee80211_hw *hw, u8 hw_queue); void rtl8723be_tx_polling(struct ieee80211_hw *hw, u8 hw_queue);
void rtl8723be_tx_fill_cmddesc(struct ieee80211_hw *hw, u8 *pdesc, void rtl8723be_tx_fill_cmddesc(struct ieee80211_hw *hw, u8 *pdesc,
bool b_firstseg, bool b_lastseg, bool firstseg, bool lastseg,
struct sk_buff *skb);
u32 rtl8723be_rx_command_packet(struct ieee80211_hw *hw,
struct rtl_stats status,
struct sk_buff *skb); struct sk_buff *skb);
#endif #endif
...@@ -267,7 +267,7 @@ int rtl8723_download_fw(struct ieee80211_hw *hw, ...@@ -267,7 +267,7 @@ int rtl8723_download_fw(struct ieee80211_hw *hw,
pfwdata = rtlhal->pfirmware; pfwdata = rtlhal->pfirmware;
fwsize = rtlhal->fwsize; fwsize = rtlhal->fwsize;
if (rtlhal->hw_type == HARDWARE_TYPE_RTL8723AE) if (!is_8723be)
max_page = 6; max_page = 6;
else else
max_page = 8; max_page = 8;
...@@ -275,10 +275,10 @@ int rtl8723_download_fw(struct ieee80211_hw *hw, ...@@ -275,10 +275,10 @@ int rtl8723_download_fw(struct ieee80211_hw *hw,
RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD,
"Firmware Version(%d), Signature(%#x), Size(%d)\n", "Firmware Version(%d), Signature(%#x), Size(%d)\n",
pfwheader->version, pfwheader->signature, pfwheader->version, pfwheader->signature,
(int)sizeof(struct rtl92c_firmware_header)); (int)sizeof(struct rtl8723e_firmware_header));
pfwdata = pfwdata + sizeof(struct rtl92c_firmware_header); pfwdata = pfwdata + sizeof(struct rtl8723e_firmware_header);
fwsize = fwsize - sizeof(struct rtl92c_firmware_header); fwsize = fwsize - sizeof(struct rtl8723e_firmware_header);
} }
if (rtl_read_byte(rtlpriv, REG_MCUFWDL)&BIT(7)) { if (rtl_read_byte(rtlpriv, REG_MCUFWDL)&BIT(7)) {
......
...@@ -30,7 +30,8 @@ ...@@ -30,7 +30,8 @@
#define REG_MCUFWDL 0x0080 #define REG_MCUFWDL 0x0080
#define FW_8192C_START_ADDRESS 0x1000 #define FW_8192C_START_ADDRESS 0x1000
#define FW_8192C_PAGE_SIZE 4096 #define FW_8192C_PAGE_SIZE 4096
#define FW_8723A_POLLING_TIMEOUT_COUNT 6000 #define FW_8723A_POLLING_TIMEOUT_COUNT 1000
#define FW_8723B_POLLING_TIMEOUT_COUNT 6000
#define FW_8192C_POLLING_DELAY 5 #define FW_8192C_POLLING_DELAY 5
#define MCUFWDL_RDY BIT(1) #define MCUFWDL_RDY BIT(1)
...@@ -99,25 +100,6 @@ enum rtl8723be_cmd { ...@@ -99,25 +100,6 @@ enum rtl8723be_cmd {
MAX_8723BE_H2CCMD MAX_8723BE_H2CCMD
}; };
struct rtl92c_firmware_header {
u16 signature;
u8 category;
u8 function;
u16 version;
u8 subversion;
u8 rsvd1;
u8 month;
u8 date;
u8 hour;
u8 minute;
u16 ramcodesize;
u16 rsvd2;
u32 svnindex;
u32 rsvd3;
u32 rsvd4;
u32 rsvd5;
};
void rtl8723ae_firmware_selfreset(struct ieee80211_hw *hw); void rtl8723ae_firmware_selfreset(struct ieee80211_hw *hw);
void rtl8723be_firmware_selfreset(struct ieee80211_hw *hw); void rtl8723be_firmware_selfreset(struct ieee80211_hw *hw);
void rtl8723_enable_fw_download(struct ieee80211_hw *hw, bool enable); void rtl8723_enable_fw_download(struct ieee80211_hw *hw, bool enable);
......
...@@ -96,7 +96,7 @@ u32 rtl8723_phy_rf_serial_read(struct ieee80211_hw *hw, ...@@ -96,7 +96,7 @@ u32 rtl8723_phy_rf_serial_read(struct ieee80211_hw *hw,
u8 rfpi_enable = 0; u8 rfpi_enable = 0;
u32 retvalue; u32 retvalue;
offset &= 0x3f; offset &= 0xff;
newoffset = offset; newoffset = offset;
if (RT_CANNOT_IO(hw)) { if (RT_CANNOT_IO(hw)) {
RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "return all one\n"); RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "return all one\n");
...@@ -150,7 +150,7 @@ void rtl8723_phy_rf_serial_write(struct ieee80211_hw *hw, ...@@ -150,7 +150,7 @@ void rtl8723_phy_rf_serial_write(struct ieee80211_hw *hw,
RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "stop\n"); RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "stop\n");
return; return;
} }
offset &= 0x3f; offset &= 0xff;
newoffset = offset; newoffset = offset;
data_and_addr = ((newoffset << 20) | (data & 0x000fffff)) & 0x0fffffff; data_and_addr = ((newoffset << 20) | (data & 0x000fffff)) & 0x0fffffff;
rtl_set_bbreg(hw, pphyreg->rf3wire_offset, MASKDWORD, data_and_addr); rtl_set_bbreg(hw, pphyreg->rf3wire_offset, MASKDWORD, data_and_addr);
...@@ -390,9 +390,11 @@ EXPORT_SYMBOL_GPL(rtl8723_phy_reload_mac_registers); ...@@ -390,9 +390,11 @@ EXPORT_SYMBOL_GPL(rtl8723_phy_reload_mac_registers);
void rtl8723_phy_path_adda_on(struct ieee80211_hw *hw, u32 *addareg, void rtl8723_phy_path_adda_on(struct ieee80211_hw *hw, u32 *addareg,
bool is_patha_on, bool is2t) bool is_patha_on, bool is2t)
{ {
struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
u32 pathon; u32 pathon;
u32 i; u32 i;
if (rtlhal->hw_type == HARDWARE_TYPE_RTL8723AE) {
pathon = is_patha_on ? 0x04db25a4 : 0x0b1b25a4; pathon = is_patha_on ? 0x04db25a4 : 0x0b1b25a4;
if (!is2t) { if (!is2t) {
pathon = 0x0bdb25a0; pathon = 0x0bdb25a0;
...@@ -400,6 +402,11 @@ void rtl8723_phy_path_adda_on(struct ieee80211_hw *hw, u32 *addareg, ...@@ -400,6 +402,11 @@ void rtl8723_phy_path_adda_on(struct ieee80211_hw *hw, u32 *addareg,
} else { } else {
rtl_set_bbreg(hw, addareg[0], MASKDWORD, pathon); rtl_set_bbreg(hw, addareg[0], MASKDWORD, pathon);
} }
} else {
/* rtl8723be */
pathon = 0x01c00014;
rtl_set_bbreg(hw, addareg[0], MASKDWORD, pathon);
}
for (i = 1; i < IQK_ADDA_REG_NUM; i++) for (i = 1; i < IQK_ADDA_REG_NUM; i++)
rtl_set_bbreg(hw, addareg[i], MASKDWORD, pathon); rtl_set_bbreg(hw, addareg[i], MASKDWORD, pathon);
......
...@@ -48,7 +48,9 @@ static void _rtl8821ae_return_beacon_queue_skb(struct ieee80211_hw *hw) ...@@ -48,7 +48,9 @@ static void _rtl8821ae_return_beacon_queue_skb(struct ieee80211_hw *hw)
struct rtl_priv *rtlpriv = rtl_priv(hw); struct rtl_priv *rtlpriv = rtl_priv(hw);
struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
struct rtl8192_tx_ring *ring = &rtlpci->tx_ring[BEACON_QUEUE]; struct rtl8192_tx_ring *ring = &rtlpci->tx_ring[BEACON_QUEUE];
unsigned long flags;
spin_lock_irqsave(&rtlpriv->locks.irq_th_lock, flags);
while (skb_queue_len(&ring->queue)) { while (skb_queue_len(&ring->queue)) {
struct rtl_tx_desc *entry = &ring->desc[ring->idx]; struct rtl_tx_desc *entry = &ring->desc[ring->idx];
struct sk_buff *skb = __skb_dequeue(&ring->queue); struct sk_buff *skb = __skb_dequeue(&ring->queue);
...@@ -60,6 +62,7 @@ static void _rtl8821ae_return_beacon_queue_skb(struct ieee80211_hw *hw) ...@@ -60,6 +62,7 @@ static void _rtl8821ae_return_beacon_queue_skb(struct ieee80211_hw *hw)
kfree_skb(skb); kfree_skb(skb);
ring->idx = (ring->idx + 1) % ring->entries; ring->idx = (ring->idx + 1) % ring->entries;
} }
spin_unlock_irqrestore(&rtlpriv->locks.irq_th_lock, flags);
} }
static void _rtl8821ae_set_bcn_ctrl_reg(struct ieee80211_hw *hw, static void _rtl8821ae_set_bcn_ctrl_reg(struct ieee80211_hw *hw,
......
...@@ -330,13 +330,7 @@ enum hardware_type { ...@@ -330,13 +330,7 @@ enum hardware_type {
#define IS_HARDWARE_TYPE_8723(rtlhal) \ #define IS_HARDWARE_TYPE_8723(rtlhal) \
(IS_HARDWARE_TYPE_8723E(rtlhal) || IS_HARDWARE_TYPE_8723U(rtlhal)) (IS_HARDWARE_TYPE_8723E(rtlhal) || IS_HARDWARE_TYPE_8723U(rtlhal))
#define RX_HAL_IS_CCK_RATE(_pdesc)\ #define RX_HAL_IS_CCK_RATE(rxmcs) \
(_pdesc->rxmcs == DESC92_RATE1M || \
_pdesc->rxmcs == DESC92_RATE2M || \
_pdesc->rxmcs == DESC92_RATE5_5M || \
_pdesc->rxmcs == DESC92_RATE11M)
#define RTL8723E_RX_HAL_IS_CCK_RATE(rxmcs) \
((rxmcs) == DESC92_RATE1M || \ ((rxmcs) == DESC92_RATE1M || \
(rxmcs) == DESC92_RATE2M || \ (rxmcs) == DESC92_RATE2M || \
(rxmcs) == DESC92_RATE5_5M || \ (rxmcs) == DESC92_RATE5_5M || \
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment