|
@@ -489,25 +489,71 @@ void rtl8821ae_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode)
|
|
|
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
|
|
u8 u1_h2c_set_pwrmode[H2C_8821AE_PWEMODE_LENGTH] = { 0 };
|
|
|
struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
|
|
|
- u8 rlbm, power_state = 0, byte5 = 0x40;
|
|
|
+ u8 rlbm, power_state = 0, byte5 = 0;
|
|
|
+ u8 awake_intvl; /* DTIM = (awake_intvl - 1) */
|
|
|
struct rtl_btc_ops *btc_ops = rtlpriv->btcoexist.btc_ops;
|
|
|
+ bool bt_ctrl_lps = (rtlpriv->cfg->ops->get_btc_status() ?
|
|
|
+ btc_ops->btc_is_bt_ctrl_lps(rtlpriv) : false);
|
|
|
|
|
|
- RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, "FW LPS mode = %d\n", mode);
|
|
|
+ RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG, "FW LPS mode = %d (coex:%d)\n",
|
|
|
+ mode, bt_ctrl_lps);
|
|
|
+
|
|
|
+ switch (mode) {
|
|
|
+ case FW_PS_MIN_MODE:
|
|
|
+ rlbm = 0;
|
|
|
+ awake_intvl = 2;
|
|
|
+ break;
|
|
|
+ case FW_PS_MAX_MODE:
|
|
|
+ rlbm = 1;
|
|
|
+ awake_intvl = 2;
|
|
|
+ break;
|
|
|
+ case FW_PS_DTIM_MODE:
|
|
|
+ rlbm = 2;
|
|
|
+ awake_intvl = ppsc->reg_max_lps_awakeintvl;
|
|
|
+ /* hw->conf.ps_dtim_period or mac->vif->bss_conf.dtim_period
|
|
|
+ * is only used in swlps.
|
|
|
+ */
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ rlbm = 2;
|
|
|
+ awake_intvl = 4;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (rtlpriv->mac80211.p2p) {
|
|
|
+ awake_intvl = 2;
|
|
|
+ rlbm = 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (mode == FW_PS_ACTIVE_MODE) {
|
|
|
+ byte5 = 0x40;
|
|
|
+ power_state = FW_PWR_STATE_ACTIVE;
|
|
|
+ } else {
|
|
|
+ if (bt_ctrl_lps) {
|
|
|
+ byte5 = btc_ops->btc_get_lps_val(rtlpriv);
|
|
|
+ power_state = btc_ops->btc_get_rpwm_val(rtlpriv);
|
|
|
+
|
|
|
+ if ((rlbm == 2) && (byte5 & BIT(4))) {
|
|
|
+ /* Keep awake interval to 1 to prevent from
|
|
|
+ * decreasing coex performance
|
|
|
+ */
|
|
|
+ awake_intvl = 2;
|
|
|
+ rlbm = 2;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ byte5 = 0x40;
|
|
|
+ power_state = FW_PWR_STATE_RF_OFF;
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
SET_H2CCMD_PWRMODE_PARM_MODE(u1_h2c_set_pwrmode, ((mode) ? 1 : 0));
|
|
|
- rlbm = 0;/*YJ,temp,120316. FW now not support RLBM=2.*/
|
|
|
SET_H2CCMD_PWRMODE_PARM_RLBM(u1_h2c_set_pwrmode, rlbm);
|
|
|
SET_H2CCMD_PWRMODE_PARM_SMART_PS(u1_h2c_set_pwrmode,
|
|
|
(rtlpriv->mac80211.p2p) ?
|
|
|
ppsc->smart_ps : 1);
|
|
|
SET_H2CCMD_PWRMODE_PARM_AWAKE_INTERVAL(u1_h2c_set_pwrmode,
|
|
|
- ppsc->reg_max_lps_awakeintvl);
|
|
|
+ awake_intvl);
|
|
|
SET_H2CCMD_PWRMODE_PARM_ALL_QUEUE_UAPSD(u1_h2c_set_pwrmode, 0);
|
|
|
- if (mode == FW_PS_ACTIVE_MODE)
|
|
|
- power_state |= FW_PWR_STATE_ACTIVE;
|
|
|
- else
|
|
|
- power_state |= FW_PWR_STATE_RF_OFF;
|
|
|
-
|
|
|
SET_H2CCMD_PWRMODE_PARM_PWR_STATE(u1_h2c_set_pwrmode, power_state);
|
|
|
SET_H2CCMD_PWRMODE_PARM_BYTE5(u1_h2c_set_pwrmode, byte5);
|
|
|
|