aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/rtlwifi/rtl8192c
diff options
context:
space:
mode:
authorLarry Finger <Larry.Finger@lwfinger.net>2013-03-24 23:06:40 -0400
committerJohn W. Linville <linville@tuxdriver.com>2013-04-01 16:19:59 -0400
commit3a16b41240aa893b2c397ea3bd07d86e95e7694b (patch)
treec0019b42f5d0001b2b9cad6d166932cab947786b /drivers/net/wireless/rtlwifi/rtl8192c
parent4b04edc1a7ff1b7c337c3dac920b64865dbd7548 (diff)
rtlwifi: rtl8192c: rtl8192ce: Update to vendor driver of 2013.02.07
Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net> Cc: jcheung@suse.com Cc: machen@suse.com Cc: mmarek@suse.cz Cc: zhiyuan_yang@realsil.com.cn Cc: page_he@realsil.com.cn Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/rtlwifi/rtl8192c')
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c89
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192c/fw_common.c99
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192c/fw_common.h4
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}
1148EXPORT_SYMBOL(rtl92c_dm_init_rate_adaptive_mask); 1148EXPORT_SYMBOL(rtl92c_dm_init_rate_adaptive_mask);
1149 1149
1150static 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
1219static void rtl92c_dm_init_dynamic_bb_powersaving(struct ieee80211_hw *hw) 1150static 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
1654static void rtl92c_bt_ant_isolation(struct ieee80211_hw *hw) 1588static 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}
810EXPORT_SYMBOL(rtl92c_set_fw_joinbss_report_cmd); 812EXPORT_SYMBOL(rtl92c_set_fw_joinbss_report_cmd);
813
814static 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
821void 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}
907EXPORT_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);
95void rtl92c_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool b_dl_finished); 98void rtl92c_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool b_dl_finished);
96void rtl92c_set_fw_joinbss_report_cmd(struct ieee80211_hw *hw, u8 mstatus); 99void rtl92c_set_fw_joinbss_report_cmd(struct ieee80211_hw *hw, u8 mstatus);
97void usb_writeN_async(struct rtl_priv *rtlpriv, u32 addr, void *data, u16 len); 100void usb_writeN_async(struct rtl_priv *rtlpriv, u32 addr, void *data, u16 len);
101void rtl92c_set_p2p_ps_offload_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state);
98 102
99#endif 103#endif