diff options
Diffstat (limited to 'drivers/net/wireless/rtlwifi/rtl8192c')
-rw-r--r-- | drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c | 89 | ||||
-rw-r--r-- | drivers/net/wireless/rtlwifi/rtl8192c/fw_common.c | 99 | ||||
-rw-r--r-- | drivers/net/wireless/rtlwifi/rtl8192c/fw_common.h | 4 |
3 files changed, 116 insertions, 76 deletions
diff --git a/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c b/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c index b793a659a465..b0b9f905848e 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c +++ b/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c | |||
@@ -1147,75 +1147,6 @@ void rtl92c_dm_init_rate_adaptive_mask(struct ieee80211_hw *hw) | |||
1147 | } | 1147 | } |
1148 | EXPORT_SYMBOL(rtl92c_dm_init_rate_adaptive_mask); | 1148 | EXPORT_SYMBOL(rtl92c_dm_init_rate_adaptive_mask); |
1149 | 1149 | ||
1150 | static void rtl92c_dm_refresh_rate_adaptive_mask(struct ieee80211_hw *hw) | ||
1151 | { | ||
1152 | struct rtl_priv *rtlpriv = rtl_priv(hw); | ||
1153 | struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); | ||
1154 | struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); | ||
1155 | struct rate_adaptive *p_ra = &(rtlpriv->ra); | ||
1156 | u32 low_rssi_thresh, high_rssi_thresh; | ||
1157 | struct ieee80211_sta *sta = NULL; | ||
1158 | |||
1159 | if (is_hal_stop(rtlhal)) { | ||
1160 | RT_TRACE(rtlpriv, COMP_RATE, DBG_LOUD, | ||
1161 | "<---- driver is going to unload\n"); | ||
1162 | return; | ||
1163 | } | ||
1164 | |||
1165 | if (!rtlpriv->dm.useramask) { | ||
1166 | RT_TRACE(rtlpriv, COMP_RATE, DBG_LOUD, | ||
1167 | "<---- driver does not control rate adaptive mask\n"); | ||
1168 | return; | ||
1169 | } | ||
1170 | |||
1171 | if (mac->link_state == MAC80211_LINKED && | ||
1172 | mac->opmode == NL80211_IFTYPE_STATION) { | ||
1173 | switch (p_ra->pre_ratr_state) { | ||
1174 | case DM_RATR_STA_HIGH: | ||
1175 | high_rssi_thresh = 50; | ||
1176 | low_rssi_thresh = 20; | ||
1177 | break; | ||
1178 | case DM_RATR_STA_MIDDLE: | ||
1179 | high_rssi_thresh = 55; | ||
1180 | low_rssi_thresh = 20; | ||
1181 | break; | ||
1182 | case DM_RATR_STA_LOW: | ||
1183 | high_rssi_thresh = 50; | ||
1184 | low_rssi_thresh = 25; | ||
1185 | break; | ||
1186 | default: | ||
1187 | high_rssi_thresh = 50; | ||
1188 | low_rssi_thresh = 20; | ||
1189 | break; | ||
1190 | } | ||
1191 | |||
1192 | if (rtlpriv->dm.undec_sm_pwdb > (long)high_rssi_thresh) | ||
1193 | p_ra->ratr_state = DM_RATR_STA_HIGH; | ||
1194 | else if (rtlpriv->dm.undec_sm_pwdb > (long)low_rssi_thresh) | ||
1195 | p_ra->ratr_state = DM_RATR_STA_MIDDLE; | ||
1196 | else | ||
1197 | p_ra->ratr_state = DM_RATR_STA_LOW; | ||
1198 | |||
1199 | if (p_ra->pre_ratr_state != p_ra->ratr_state) { | ||
1200 | RT_TRACE(rtlpriv, COMP_RATE, DBG_LOUD, "RSSI = %ld\n", | ||
1201 | rtlpriv->dm.undec_sm_pwdb); | ||
1202 | RT_TRACE(rtlpriv, COMP_RATE, DBG_LOUD, | ||
1203 | "RSSI_LEVEL = %d\n", p_ra->ratr_state); | ||
1204 | RT_TRACE(rtlpriv, COMP_RATE, DBG_LOUD, | ||
1205 | "PreState = %d, CurState = %d\n", | ||
1206 | p_ra->pre_ratr_state, p_ra->ratr_state); | ||
1207 | |||
1208 | rcu_read_lock(); | ||
1209 | sta = ieee80211_find_sta(mac->vif, mac->bssid); | ||
1210 | rtlpriv->cfg->ops->update_rate_tbl(hw, sta, | ||
1211 | p_ra->ratr_state); | ||
1212 | |||
1213 | p_ra->pre_ratr_state = p_ra->ratr_state; | ||
1214 | rcu_read_unlock(); | ||
1215 | } | ||
1216 | } | ||
1217 | } | ||
1218 | |||
1219 | static void rtl92c_dm_init_dynamic_bb_powersaving(struct ieee80211_hw *hw) | 1150 | static void rtl92c_dm_init_dynamic_bb_powersaving(struct ieee80211_hw *hw) |
1220 | { | 1151 | { |
1221 | struct rtl_priv *rtlpriv = rtl_priv(hw); | 1152 | struct rtl_priv *rtlpriv = rtl_priv(hw); |
@@ -1437,6 +1368,9 @@ void rtl92c_dm_watchdog(struct ieee80211_hw *hw) | |||
1437 | rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_FWLPS_RF_ON, | 1368 | rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_FWLPS_RF_ON, |
1438 | (u8 *) (&fw_ps_awake)); | 1369 | (u8 *) (&fw_ps_awake)); |
1439 | 1370 | ||
1371 | if (ppsc->p2p_ps_info.p2p_ps_mode) | ||
1372 | fw_ps_awake = false; | ||
1373 | |||
1440 | if ((ppsc->rfpwr_state == ERFON) && ((!fw_current_inpsmode) && | 1374 | if ((ppsc->rfpwr_state == ERFON) && ((!fw_current_inpsmode) && |
1441 | fw_ps_awake) | 1375 | fw_ps_awake) |
1442 | && (!ppsc->rfchange_inprogress)) { | 1376 | && (!ppsc->rfchange_inprogress)) { |
@@ -1446,7 +1380,7 @@ void rtl92c_dm_watchdog(struct ieee80211_hw *hw) | |||
1446 | rtl92c_dm_dynamic_bb_powersaving(hw); | 1380 | rtl92c_dm_dynamic_bb_powersaving(hw); |
1447 | rtl92c_dm_dynamic_txpower(hw); | 1381 | rtl92c_dm_dynamic_txpower(hw); |
1448 | rtl92c_dm_check_txpower_tracking(hw); | 1382 | rtl92c_dm_check_txpower_tracking(hw); |
1449 | rtl92c_dm_refresh_rate_adaptive_mask(hw); | 1383 | /* rtl92c_dm_refresh_rate_adaptive_mask(hw); */ |
1450 | rtl92c_dm_bt_coexist(hw); | 1384 | rtl92c_dm_bt_coexist(hw); |
1451 | rtl92c_dm_check_edca_turbo(hw); | 1385 | rtl92c_dm_check_edca_turbo(hw); |
1452 | } | 1386 | } |
@@ -1651,7 +1585,7 @@ static void rtl92c_bt_set_normal(struct ieee80211_hw *hw) | |||
1651 | } | 1585 | } |
1652 | } | 1586 | } |
1653 | 1587 | ||
1654 | static void rtl92c_bt_ant_isolation(struct ieee80211_hw *hw) | 1588 | static void rtl92c_bt_ant_isolation(struct ieee80211_hw *hw, u8 tmp1byte) |
1655 | { | 1589 | { |
1656 | struct rtl_priv *rtlpriv = rtl_priv(hw); | 1590 | struct rtl_priv *rtlpriv = rtl_priv(hw); |
1657 | struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw); | 1591 | struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw); |
@@ -1673,9 +1607,9 @@ static void rtl92c_bt_ant_isolation(struct ieee80211_hw *hw) | |||
1673 | BT_RSSI_STATE_SPECIAL_LOW)) { | 1607 | BT_RSSI_STATE_SPECIAL_LOW)) { |
1674 | rtl_write_byte(rtlpriv, REG_GPIO_MUXCFG, 0xa0); | 1608 | rtl_write_byte(rtlpriv, REG_GPIO_MUXCFG, 0xa0); |
1675 | } else if (rtlpcipriv->bt_coexist.bt_service == BT_PAN) { | 1609 | } else if (rtlpcipriv->bt_coexist.bt_service == BT_PAN) { |
1676 | rtl_write_byte(rtlpriv, REG_GPIO_MUXCFG, 0x00); | 1610 | rtl_write_byte(rtlpriv, REG_GPIO_MUXCFG, tmp1byte); |
1677 | } else { | 1611 | } else { |
1678 | rtl_write_byte(rtlpriv, REG_GPIO_MUXCFG, 0x00); | 1612 | rtl_write_byte(rtlpriv, REG_GPIO_MUXCFG, tmp1byte); |
1679 | } | 1613 | } |
1680 | } | 1614 | } |
1681 | 1615 | ||
@@ -1726,12 +1660,17 @@ static void rtl92c_check_bt_change(struct ieee80211_hw *hw) | |||
1726 | { | 1660 | { |
1727 | struct rtl_priv *rtlpriv = rtl_priv(hw); | 1661 | struct rtl_priv *rtlpriv = rtl_priv(hw); |
1728 | struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw); | 1662 | struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw); |
1663 | struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); | ||
1664 | u8 tmp1byte = 0; | ||
1729 | 1665 | ||
1666 | if (IS_81xxC_VENDOR_UMC_B_CUT(rtlhal->version) && | ||
1667 | rtlpcipriv->bt_coexist.bt_coexistence) | ||
1668 | tmp1byte |= BIT(5); | ||
1730 | if (rtlpcipriv->bt_coexist.bt_cur_state) { | 1669 | if (rtlpcipriv->bt_coexist.bt_cur_state) { |
1731 | if (rtlpcipriv->bt_coexist.bt_ant_isolation) | 1670 | if (rtlpcipriv->bt_coexist.bt_ant_isolation) |
1732 | rtl92c_bt_ant_isolation(hw); | 1671 | rtl92c_bt_ant_isolation(hw, tmp1byte); |
1733 | } else { | 1672 | } else { |
1734 | rtl_write_byte(rtlpriv, REG_GPIO_MUXCFG, 0x00); | 1673 | rtl_write_byte(rtlpriv, REG_GPIO_MUXCFG, tmp1byte); |
1735 | rtlpriv->cfg->ops->set_rfreg(hw, RF90_PATH_A, 0x1e, 0xf0, | 1674 | rtlpriv->cfg->ops->set_rfreg(hw, RF90_PATH_A, 0x1e, 0xf0, |
1736 | rtlpcipriv->bt_coexist.bt_rfreg_origin_1e); | 1675 | rtlpcipriv->bt_coexist.bt_rfreg_origin_1e); |
1737 | 1676 | ||
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); | ||
diff --git a/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.h b/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.h index 780ea5b1e24c..15b2055e6212 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.h +++ b/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.h | |||
@@ -67,6 +67,9 @@ enum rtl8192c_h2c_cmd { | |||
67 | H2C_RSVDPAGE = 3, | 67 | H2C_RSVDPAGE = 3, |
68 | H2C_RSSI_REPORT = 5, | 68 | H2C_RSSI_REPORT = 5, |
69 | H2C_RA_MASK = 6, | 69 | H2C_RA_MASK = 6, |
70 | H2C_MACID_PS_MODE = 7, | ||
71 | H2C_P2P_PS_OFFLOAD = 8, | ||
72 | H2C_P2P_PS_CTW_CMD = 32, | ||
70 | MAX_H2CCMD | 73 | MAX_H2CCMD |
71 | }; | 74 | }; |
72 | 75 | ||
@@ -95,5 +98,6 @@ void rtl92c_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode); | |||
95 | void rtl92c_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool b_dl_finished); | 98 | void rtl92c_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool b_dl_finished); |
96 | void rtl92c_set_fw_joinbss_report_cmd(struct ieee80211_hw *hw, u8 mstatus); | 99 | void rtl92c_set_fw_joinbss_report_cmd(struct ieee80211_hw *hw, u8 mstatus); |
97 | void usb_writeN_async(struct rtl_priv *rtlpriv, u32 addr, void *data, u16 len); | 100 | void usb_writeN_async(struct rtl_priv *rtlpriv, u32 addr, void *data, u16 len); |
101 | void rtl92c_set_p2p_ps_offload_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state); | ||
98 | 102 | ||
99 | #endif | 103 | #endif |