diff options
Diffstat (limited to 'drivers/net/wireless/rtlwifi/rtl8723ae/fw.c')
-rw-r--r-- | drivers/net/wireless/rtlwifi/rtl8723ae/fw.c | 97 |
1 files changed, 96 insertions, 1 deletions
diff --git a/drivers/net/wireless/rtlwifi/rtl8723ae/fw.c b/drivers/net/wireless/rtlwifi/rtl8723ae/fw.c index 35cb8f83eed4..dedfa1ed3e02 100644 --- a/drivers/net/wireless/rtlwifi/rtl8723ae/fw.c +++ b/drivers/net/wireless/rtlwifi/rtl8723ae/fw.c | |||
@@ -494,7 +494,9 @@ void rtl8723ae_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode) | |||
494 | RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, "FW LPS mode = %d\n", mode); | 494 | RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, "FW LPS mode = %d\n", mode); |
495 | 495 | ||
496 | SET_H2CCMD_PWRMODE_PARM_MODE(u1_h2c_set_pwrmode, mode); | 496 | SET_H2CCMD_PWRMODE_PARM_MODE(u1_h2c_set_pwrmode, mode); |
497 | SET_H2CCMD_PWRMODE_PARM_SMART_PS(u1_h2c_set_pwrmode, 1); | 497 | SET_H2CCMD_PWRMODE_PARM_SMART_PS(u1_h2c_set_pwrmode, |
498 | (rtlpriv->mac80211.p2p) ? | ||
499 | ppsc->smart_ps : 1); | ||
498 | SET_H2CCMD_PWRMODE_PARM_BCN_PASS_TIME(u1_h2c_set_pwrmode, | 500 | SET_H2CCMD_PWRMODE_PARM_BCN_PASS_TIME(u1_h2c_set_pwrmode, |
499 | ppsc->reg_max_lps_awakeintvl); | 501 | ppsc->reg_max_lps_awakeintvl); |
500 | 502 | ||
@@ -741,3 +743,96 @@ void rtl8723ae_set_fw_joinbss_report_cmd(struct ieee80211_hw *hw, u8 mstatus) | |||
741 | 743 | ||
742 | rtl8723ae_fill_h2c_cmd(hw, H2C_JOINBSSRPT, 1, u1_joinbssrpt_parm); | 744 | rtl8723ae_fill_h2c_cmd(hw, H2C_JOINBSSRPT, 1, u1_joinbssrpt_parm); |
743 | } | 745 | } |
746 | |||
747 | static void rtl8723e_set_p2p_ctw_period_cmd(struct ieee80211_hw *hw, | ||
748 | u8 ctwindow) | ||
749 | { | ||
750 | u8 u1_ctwindow_period[1] = {ctwindow}; | ||
751 | |||
752 | rtl8723ae_fill_h2c_cmd(hw, H2C_P2P_PS_CTW_CMD, 1, u1_ctwindow_period); | ||
753 | } | ||
754 | |||
755 | void rtl8723ae_set_p2p_ps_offload_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state) | ||
756 | { | ||
757 | struct rtl_priv *rtlpriv = rtl_priv(hw); | ||
758 | struct rtl_ps_ctl *rtlps = rtl_psc(rtl_priv(hw)); | ||
759 | struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); | ||
760 | struct rtl_p2p_ps_info *p2pinfo = &(rtlps->p2p_ps_info); | ||
761 | struct p2p_ps_offload_t *p2p_ps_offload = &rtlhal->p2p_ps_offload; | ||
762 | u8 i; | ||
763 | u16 ctwindow; | ||
764 | u32 start_time, tsf_low; | ||
765 | |||
766 | switch (p2p_ps_state) { | ||
767 | case P2P_PS_DISABLE: | ||
768 | RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_DISABLE\n"); | ||
769 | memset(p2p_ps_offload, 0, sizeof(struct p2p_ps_offload_t)); | ||
770 | break; | ||
771 | case P2P_PS_ENABLE: | ||
772 | RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_ENABLE\n"); | ||
773 | /* update CTWindow value. */ | ||
774 | if (p2pinfo->ctwindow > 0) { | ||
775 | p2p_ps_offload->ctwindow_en = 1; | ||
776 | ctwindow = p2pinfo->ctwindow; | ||
777 | rtl8723e_set_p2p_ctw_period_cmd(hw, ctwindow); | ||
778 | } | ||
779 | |||
780 | /* hw only support 2 set of NoA */ | ||
781 | for (i = 0; i < p2pinfo->noa_num; i++) { | ||
782 | /* To control the register setting for which NOA*/ | ||
783 | rtl_write_byte(rtlpriv, 0x5cf, (i << 4)); | ||
784 | if (i == 0) | ||
785 | p2p_ps_offload->noa0_en = 1; | ||
786 | else | ||
787 | p2p_ps_offload->noa1_en = 1; | ||
788 | |||
789 | /* config P2P NoA Descriptor Register */ | ||
790 | rtl_write_dword(rtlpriv, 0x5E0, | ||
791 | p2pinfo->noa_duration[i]); | ||
792 | rtl_write_dword(rtlpriv, 0x5E4, | ||
793 | p2pinfo->noa_interval[i]); | ||
794 | |||
795 | /*Get Current TSF value */ | ||
796 | tsf_low = rtl_read_dword(rtlpriv, REG_TSFTR); | ||
797 | |||
798 | start_time = p2pinfo->noa_start_time[i]; | ||
799 | if (p2pinfo->noa_count_type[i] != 1) { | ||
800 | while (start_time <= (tsf_low+(50*1024))) { | ||
801 | start_time += p2pinfo->noa_interval[i]; | ||
802 | if (p2pinfo->noa_count_type[i] != 255) | ||
803 | p2pinfo->noa_count_type[i]--; | ||
804 | } | ||
805 | } | ||
806 | rtl_write_dword(rtlpriv, 0x5E8, start_time); | ||
807 | rtl_write_dword(rtlpriv, 0x5EC, | ||
808 | p2pinfo->noa_count_type[i]); | ||
809 | } | ||
810 | if ((p2pinfo->opp_ps == 1) || (p2pinfo->noa_num > 0)) { | ||
811 | /* rst p2p circuit */ | ||
812 | rtl_write_byte(rtlpriv, REG_DUAL_TSF_RST, BIT(4)); | ||
813 | |||
814 | p2p_ps_offload->offload_en = 1; | ||
815 | |||
816 | if (P2P_ROLE_GO == rtlpriv->mac80211.p2p) { | ||
817 | p2p_ps_offload->role = 1; | ||
818 | p2p_ps_offload->allstasleep = 0; | ||
819 | } else { | ||
820 | p2p_ps_offload->role = 0; | ||
821 | } | ||
822 | p2p_ps_offload->discovery = 0; | ||
823 | } | ||
824 | break; | ||
825 | case P2P_PS_SCAN: | ||
826 | RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_SCAN\n"); | ||
827 | p2p_ps_offload->discovery = 1; | ||
828 | break; | ||
829 | case P2P_PS_SCAN_DONE: | ||
830 | RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_SCAN_DONE\n"); | ||
831 | p2p_ps_offload->discovery = 0; | ||
832 | p2pinfo->p2p_ps_state = P2P_PS_ENABLE; | ||
833 | break; | ||
834 | default: | ||
835 | break; | ||
836 | } | ||
837 | rtl8723ae_fill_h2c_cmd(hw, H2C_P2P_PS_OFFLOAD, 1, (u8 *)p2p_ps_offload); | ||
838 | } | ||