diff options
Diffstat (limited to 'drivers/net/wireless/rtlwifi/rtl8192c/fw_common.c')
-rw-r--r-- | drivers/net/wireless/rtlwifi/rtl8192c/fw_common.c | 99 |
1 files changed, 98 insertions, 1 deletions
diff --git a/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.c b/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.c index 883f23ae9519..04a41628ceed 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.c +++ b/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.c | |||
@@ -552,7 +552,9 @@ void rtl92c_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode) | |||
552 | RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, "FW LPS mode = %d\n", mode); | 552 | RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, "FW LPS mode = %d\n", mode); |
553 | 553 | ||
554 | SET_H2CCMD_PWRMODE_PARM_MODE(u1_h2c_set_pwrmode, mode); | 554 | SET_H2CCMD_PWRMODE_PARM_MODE(u1_h2c_set_pwrmode, mode); |
555 | SET_H2CCMD_PWRMODE_PARM_SMART_PS(u1_h2c_set_pwrmode, 1); | 555 | SET_H2CCMD_PWRMODE_PARM_SMART_PS(u1_h2c_set_pwrmode, |
556 | (rtlpriv->mac80211.p2p) ? | ||
557 | ppsc->smart_ps : 1); | ||
556 | SET_H2CCMD_PWRMODE_PARM_BCN_PASS_TIME(u1_h2c_set_pwrmode, | 558 | SET_H2CCMD_PWRMODE_PARM_BCN_PASS_TIME(u1_h2c_set_pwrmode, |
557 | ppsc->reg_max_lps_awakeintvl); | 559 | ppsc->reg_max_lps_awakeintvl); |
558 | 560 | ||
@@ -808,3 +810,98 @@ void rtl92c_set_fw_joinbss_report_cmd(struct ieee80211_hw *hw, u8 mstatus) | |||
808 | rtl92c_fill_h2c_cmd(hw, H2C_JOINBSSRPT, 1, u1_joinbssrpt_parm); | 810 | rtl92c_fill_h2c_cmd(hw, H2C_JOINBSSRPT, 1, u1_joinbssrpt_parm); |
809 | } | 811 | } |
810 | EXPORT_SYMBOL(rtl92c_set_fw_joinbss_report_cmd); | 812 | EXPORT_SYMBOL(rtl92c_set_fw_joinbss_report_cmd); |
813 | |||
814 | static void rtl92c_set_p2p_ctw_period_cmd(struct ieee80211_hw *hw, u8 ctwindow) | ||
815 | { | ||
816 | u8 u1_ctwindow_period[1] = {ctwindow}; | ||
817 | |||
818 | rtl92c_fill_h2c_cmd(hw, H2C_P2P_PS_CTW_CMD, 1, u1_ctwindow_period); | ||
819 | } | ||
820 | |||
821 | void rtl92c_set_p2p_ps_offload_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state) | ||
822 | { | ||
823 | struct rtl_priv *rtlpriv = rtl_priv(hw); | ||
824 | struct rtl_ps_ctl *rtlps = rtl_psc(rtl_priv(hw)); | ||
825 | struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); | ||
826 | struct rtl_p2p_ps_info *p2pinfo = &(rtlps->p2p_ps_info); | ||
827 | struct p2p_ps_offload_t *p2p_ps_offload = &rtlhal->p2p_ps_offload; | ||
828 | u8 i; | ||
829 | u16 ctwindow; | ||
830 | u32 start_time, tsf_low; | ||
831 | |||
832 | switch (p2p_ps_state) { | ||
833 | case P2P_PS_DISABLE: | ||
834 | RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_DISABLE\n"); | ||
835 | memset(p2p_ps_offload, 0, sizeof(struct p2p_ps_offload_t)); | ||
836 | break; | ||
837 | case P2P_PS_ENABLE: | ||
838 | RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_ENABLE\n"); | ||
839 | /* update CTWindow value. */ | ||
840 | if (p2pinfo->ctwindow > 0) { | ||
841 | p2p_ps_offload->ctwindow_en = 1; | ||
842 | ctwindow = p2pinfo->ctwindow; | ||
843 | rtl92c_set_p2p_ctw_period_cmd(hw, ctwindow); | ||
844 | } | ||
845 | /* hw only support 2 set of NoA */ | ||
846 | for (i = 0; i < p2pinfo->noa_num; i++) { | ||
847 | /* To control the register setting for which NOA*/ | ||
848 | rtl_write_byte(rtlpriv, 0x5cf, (i << 4)); | ||
849 | if (i == 0) | ||
850 | p2p_ps_offload->noa0_en = 1; | ||
851 | else | ||
852 | p2p_ps_offload->noa1_en = 1; | ||
853 | |||
854 | /* config P2P NoA Descriptor Register */ | ||
855 | rtl_write_dword(rtlpriv, 0x5E0, | ||
856 | p2pinfo->noa_duration[i]); | ||
857 | rtl_write_dword(rtlpriv, 0x5E4, | ||
858 | p2pinfo->noa_interval[i]); | ||
859 | |||
860 | /*Get Current TSF value */ | ||
861 | tsf_low = rtl_read_dword(rtlpriv, REG_TSFTR); | ||
862 | |||
863 | start_time = p2pinfo->noa_start_time[i]; | ||
864 | if (p2pinfo->noa_count_type[i] != 1) { | ||
865 | while (start_time <= (tsf_low+(50*1024))) { | ||
866 | start_time += p2pinfo->noa_interval[i]; | ||
867 | if (p2pinfo->noa_count_type[i] != 255) | ||
868 | p2pinfo->noa_count_type[i]--; | ||
869 | } | ||
870 | } | ||
871 | rtl_write_dword(rtlpriv, 0x5E8, start_time); | ||
872 | rtl_write_dword(rtlpriv, 0x5EC, | ||
873 | p2pinfo->noa_count_type[i]); | ||
874 | } | ||
875 | |||
876 | if ((p2pinfo->opp_ps == 1) || (p2pinfo->noa_num > 0)) { | ||
877 | /* rst p2p circuit */ | ||
878 | rtl_write_byte(rtlpriv, REG_DUAL_TSF_RST, BIT(4)); | ||
879 | |||
880 | p2p_ps_offload->offload_en = 1; | ||
881 | |||
882 | if (P2P_ROLE_GO == rtlpriv->mac80211.p2p) { | ||
883 | p2p_ps_offload->role = 1; | ||
884 | p2p_ps_offload->allstasleep = 0; | ||
885 | } else { | ||
886 | p2p_ps_offload->role = 0; | ||
887 | } | ||
888 | |||
889 | p2p_ps_offload->discovery = 0; | ||
890 | } | ||
891 | break; | ||
892 | case P2P_PS_SCAN: | ||
893 | RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_SCAN\n"); | ||
894 | p2p_ps_offload->discovery = 1; | ||
895 | break; | ||
896 | case P2P_PS_SCAN_DONE: | ||
897 | RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_SCAN_DONE\n"); | ||
898 | p2p_ps_offload->discovery = 0; | ||
899 | p2pinfo->p2p_ps_state = P2P_PS_ENABLE; | ||
900 | break; | ||
901 | default: | ||
902 | break; | ||
903 | } | ||
904 | |||
905 | rtl92c_fill_h2c_cmd(hw, H2C_P2P_PS_OFFLOAD, 1, (u8 *)p2p_ps_offload); | ||
906 | } | ||
907 | EXPORT_SYMBOL_GPL(rtl92c_set_p2p_ps_offload_cmd); | ||