aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/rtlwifi
diff options
context:
space:
mode:
authorLarry Finger <Larry.Finger@lwfinger.net>2013-03-24 23:06:39 -0400
committerJohn W. Linville <linville@tuxdriver.com>2013-04-01 16:19:59 -0400
commit4b04edc1a7ff1b7c337c3dac920b64865dbd7548 (patch)
treedf271ca40f6c4cc978e5e5fcd813ab88d4cb5065 /drivers/net/wireless/rtlwifi
parent2455c92c318182deda2f9789fd60792402ebc089 (diff)
rtlwifi: rtl8723ae: 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')
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8723ae/dm.c76
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8723ae/dm.h6
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8723ae/fw.c97
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8723ae/fw.h7
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8723ae/hw.c36
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8723ae/trx.c10
-rw-r--r--drivers/net/wireless/rtlwifi/wifi.h2
7 files changed, 226 insertions, 8 deletions
diff --git a/drivers/net/wireless/rtlwifi/rtl8723ae/dm.c b/drivers/net/wireless/rtlwifi/rtl8723ae/dm.c
index 12e2a3cb0701..f9b746753dbb 100644
--- a/drivers/net/wireless/rtlwifi/rtl8723ae/dm.c
+++ b/drivers/net/wireless/rtlwifi/rtl8723ae/dm.c
@@ -707,6 +707,77 @@ void rtl8723ae_dm_init_rate_adaptive_mask(struct ieee80211_hw *hw)
707 rtlpriv->dm.useramask = false; 707 rtlpriv->dm.useramask = false;
708} 708}
709 709
710static void rtl8723ae_dm_refresh_rate_adaptive_mask(struct ieee80211_hw *hw)
711{
712 struct rtl_priv *rtlpriv = rtl_priv(hw);
713 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
714 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
715 struct rate_adaptive *p_ra = &(rtlpriv->ra);
716 u32 low_rssithresh_for_ra, high_rssithresh_for_ra;
717 struct ieee80211_sta *sta = NULL;
718
719 if (is_hal_stop(rtlhal)) {
720 RT_TRACE(rtlpriv, COMP_RATE, DBG_LOUD,
721 " driver is going to unload\n");
722 return;
723 }
724
725 if (!rtlpriv->dm.useramask) {
726 RT_TRACE(rtlpriv, COMP_RATE, DBG_LOUD,
727 " driver does not control rate adaptive mask\n");
728 return;
729 }
730
731 if (mac->link_state == MAC80211_LINKED &&
732 mac->opmode == NL80211_IFTYPE_STATION) {
733 switch (p_ra->pre_ratr_state) {
734 case DM_RATR_STA_HIGH:
735 high_rssithresh_for_ra = 50;
736 low_rssithresh_for_ra = 20;
737 break;
738 case DM_RATR_STA_MIDDLE:
739 high_rssithresh_for_ra = 55;
740 low_rssithresh_for_ra = 20;
741 break;
742 case DM_RATR_STA_LOW:
743 high_rssithresh_for_ra = 50;
744 low_rssithresh_for_ra = 25;
745 break;
746 default:
747 high_rssithresh_for_ra = 50;
748 low_rssithresh_for_ra = 20;
749 break;
750 }
751
752 if (rtlpriv->dm.undec_sm_pwdb > high_rssithresh_for_ra)
753 p_ra->ratr_state = DM_RATR_STA_HIGH;
754 else if (rtlpriv->dm.undec_sm_pwdb > low_rssithresh_for_ra)
755 p_ra->ratr_state = DM_RATR_STA_MIDDLE;
756 else
757 p_ra->ratr_state = DM_RATR_STA_LOW;
758
759 if (p_ra->pre_ratr_state != p_ra->ratr_state) {
760 RT_TRACE(rtlpriv, COMP_RATE, DBG_LOUD,
761 "RSSI = %ld\n",
762 rtlpriv->dm.undec_sm_pwdb);
763 RT_TRACE(rtlpriv, COMP_RATE, DBG_LOUD,
764 "RSSI_LEVEL = %d\n", p_ra->ratr_state);
765 RT_TRACE(rtlpriv, COMP_RATE, DBG_LOUD,
766 "PreState = %d, CurState = %d\n",
767 p_ra->pre_ratr_state, p_ra->ratr_state);
768
769 rcu_read_lock();
770 sta = rtl_find_sta(hw, mac->bssid);
771 if (sta)
772 rtlpriv->cfg->ops->update_rate_tbl(hw, sta,
773 p_ra->ratr_state);
774 rcu_read_unlock();
775
776 p_ra->pre_ratr_state = p_ra->ratr_state;
777 }
778 }
779}
780
710static void rtl8723ae_dm_init_dynamic_bpowersaving(struct ieee80211_hw *hw) 781static void rtl8723ae_dm_init_dynamic_bpowersaving(struct ieee80211_hw *hw)
711{ 782{
712 struct rtl_priv *rtlpriv = rtl_priv(hw); 783 struct rtl_priv *rtlpriv = rtl_priv(hw);
@@ -853,6 +924,9 @@ void rtl8723ae_dm_watchdog(struct ieee80211_hw *hw)
853 rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_FWLPS_RF_ON, 924 rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_FWLPS_RF_ON,
854 (u8 *) (&fw_ps_awake)); 925 (u8 *) (&fw_ps_awake));
855 926
927 if (ppsc->p2p_ps_info.p2p_ps_mode)
928 fw_ps_awake = false;
929
856 if ((ppsc->rfpwr_state == ERFON) && 930 if ((ppsc->rfpwr_state == ERFON) &&
857 ((!fw_current_inpsmode) && fw_ps_awake) && 931 ((!fw_current_inpsmode) && fw_ps_awake) &&
858 (!ppsc->rfchange_inprogress)) { 932 (!ppsc->rfchange_inprogress)) {
@@ -861,7 +935,7 @@ void rtl8723ae_dm_watchdog(struct ieee80211_hw *hw)
861 rtl8723ae_dm_false_alarm_counter_statistics(hw); 935 rtl8723ae_dm_false_alarm_counter_statistics(hw);
862 rtl8723ae_dm_dynamic_bpowersaving(hw); 936 rtl8723ae_dm_dynamic_bpowersaving(hw);
863 rtl8723ae_dm_dynamic_txpower(hw); 937 rtl8723ae_dm_dynamic_txpower(hw);
864 /* rtl92c_dm_refresh_rate_adaptive_mask(hw); */ 938 rtl8723ae_dm_refresh_rate_adaptive_mask(hw);
865 rtl8723ae_dm_bt_coexist(hw); 939 rtl8723ae_dm_bt_coexist(hw);
866 rtl8723ae_dm_check_edca_turbo(hw); 940 rtl8723ae_dm_check_edca_turbo(hw);
867 } 941 }
diff --git a/drivers/net/wireless/rtlwifi/rtl8723ae/dm.h b/drivers/net/wireless/rtlwifi/rtl8723ae/dm.h
index 39d246196247..a372b0204456 100644
--- a/drivers/net/wireless/rtlwifi/rtl8723ae/dm.h
+++ b/drivers/net/wireless/rtlwifi/rtl8723ae/dm.h
@@ -55,7 +55,13 @@
55#define DM_DIG_BACKOFF_MIN -4 55#define DM_DIG_BACKOFF_MIN -4
56#define DM_DIG_BACKOFF_DEFAULT 10 56#define DM_DIG_BACKOFF_DEFAULT 10
57 57
58#define RXPATHSELECTION_SS_TH_LOW 30
59#define RXPATHSELECTION_DIFF_TH 18
60
58#define DM_RATR_STA_INIT 0 61#define DM_RATR_STA_INIT 0
62#define DM_RATR_STA_HIGH 1
63#define DM_RATR_STA_MIDDLE 2
64#define DM_RATR_STA_LOW 3
59 65
60#define TXHIGHPWRLEVEL_NORMAL 0 66#define TXHIGHPWRLEVEL_NORMAL 0
61#define TXHIGHPWRLEVEL_LEVEL1 1 67#define TXHIGHPWRLEVEL_LEVEL1 1
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
747static 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
755void 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}
diff --git a/drivers/net/wireless/rtlwifi/rtl8723ae/fw.h b/drivers/net/wireless/rtlwifi/rtl8723ae/fw.h
index 89994e16dc83..ed3b795e6980 100644
--- a/drivers/net/wireless/rtlwifi/rtl8723ae/fw.h
+++ b/drivers/net/wireless/rtlwifi/rtl8723ae/fw.h
@@ -70,8 +70,10 @@ enum rtl8192c_h2c_cmd {
70 H2C_SETPWRMODE = 1, 70 H2C_SETPWRMODE = 1,
71 H2C_JOINBSSRPT = 2, 71 H2C_JOINBSSRPT = 2,
72 H2C_RSVDPAGE = 3, 72 H2C_RSVDPAGE = 3,
73 H2C_RSSI_REPORT = 5, 73 H2C_RSSI_REPORT = 4,
74 H2C_RA_MASK = 6, 74 H2C_P2P_PS_CTW_CMD = 5,
75 H2C_P2P_PS_OFFLOAD = 6,
76 H2C_RA_MASK = 7,
75 MAX_H2CCMD 77 MAX_H2CCMD
76}; 78};
77 79
@@ -97,5 +99,6 @@ void rtl8723ae_firmware_selfreset(struct ieee80211_hw *hw);
97void rtl8723ae_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode); 99void rtl8723ae_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode);
98void rtl8723ae_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool b_dl_finished); 100void rtl8723ae_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool b_dl_finished);
99void rtl8723ae_set_fw_joinbss_report_cmd(struct ieee80211_hw *hw, u8 mstatus); 101void rtl8723ae_set_fw_joinbss_report_cmd(struct ieee80211_hw *hw, u8 mstatus);
102void rtl8723ae_set_p2p_ps_offload_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state);
100 103
101#endif 104#endif
diff --git a/drivers/net/wireless/rtlwifi/rtl8723ae/hw.c b/drivers/net/wireless/rtlwifi/rtl8723ae/hw.c
index 9a0c71c2e15e..178462261c6f 100644
--- a/drivers/net/wireless/rtlwifi/rtl8723ae/hw.c
+++ b/drivers/net/wireless/rtlwifi/rtl8723ae/hw.c
@@ -449,6 +449,9 @@ void rtl8723ae_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
449 rtl8723ae_set_fw_joinbss_report_cmd(hw, (*(u8 *) val)); 449 rtl8723ae_set_fw_joinbss_report_cmd(hw, (*(u8 *) val));
450 450
451 break; } 451 break; }
452 case HW_VAR_H2C_FW_P2P_PS_OFFLOAD:
453 rtl8723ae_set_p2p_ps_offload_cmd(hw, (*(u8 *)val));
454 break;
452 case HW_VAR_AID:{ 455 case HW_VAR_AID:{
453 u16 u2btmp; 456 u16 u2btmp;
454 u2btmp = rtl_read_word(rtlpriv, REG_BCN_PSR_RPT); 457 u2btmp = rtl_read_word(rtlpriv, REG_BCN_PSR_RPT);
@@ -474,6 +477,39 @@ void rtl8723ae_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
474 if (btype_ibss == true) 477 if (btype_ibss == true)
475 _rtl8723ae_resume_tx_beacon(hw); 478 _rtl8723ae_resume_tx_beacon(hw);
476 break; } 479 break; }
480 case HW_VAR_FW_LPS_ACTION: {
481 bool enter_fwlps = *((bool *)val);
482 u8 rpwm_val, fw_pwrmode;
483 bool fw_current_inps;
484
485 if (enter_fwlps) {
486 rpwm_val = 0x02; /* RF off */
487 fw_current_inps = true;
488 rtlpriv->cfg->ops->set_hw_reg(hw,
489 HW_VAR_FW_PSMODE_STATUS,
490 (u8 *)(&fw_current_inps));
491 rtlpriv->cfg->ops->set_hw_reg(hw,
492 HW_VAR_H2C_FW_PWRMODE,
493 (u8 *)(&ppsc->fwctrl_psmode));
494
495 rtlpriv->cfg->ops->set_hw_reg(hw,
496 HW_VAR_SET_RPWM,
497 (u8 *)(&rpwm_val));
498 } else {
499 rpwm_val = 0x0C; /* RF on */
500 fw_pwrmode = FW_PS_ACTIVE_MODE;
501 fw_current_inps = false;
502 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SET_RPWM,
503 (u8 *)(&rpwm_val));
504 rtlpriv->cfg->ops->set_hw_reg(hw,
505 HW_VAR_H2C_FW_PWRMODE,
506 (u8 *)(&fw_pwrmode));
507
508 rtlpriv->cfg->ops->set_hw_reg(hw,
509 HW_VAR_FW_PSMODE_STATUS,
510 (u8 *)(&fw_current_inps));
511 }
512 break; }
477 default: 513 default:
478 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 514 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
479 "switch case not processed\n"); 515 "switch case not processed\n");
diff --git a/drivers/net/wireless/rtlwifi/rtl8723ae/trx.c b/drivers/net/wireless/rtlwifi/rtl8723ae/trx.c
index ac081297db50..6c64365308d3 100644
--- a/drivers/net/wireless/rtlwifi/rtl8723ae/trx.c
+++ b/drivers/net/wireless/rtlwifi/rtl8723ae/trx.c
@@ -307,9 +307,6 @@ bool rtl8723ae_rx_query_desc(struct ieee80211_hw *hw,
307 rx_status->freq = hw->conf.channel->center_freq; 307 rx_status->freq = hw->conf.channel->center_freq;
308 rx_status->band = hw->conf.channel->band; 308 rx_status->band = hw->conf.channel->band;
309 309
310 hdr = (struct ieee80211_hdr *)(skb->data + status->rx_drvinfo_size
311 + status->rx_bufshift);
312
313 if (status->crc) 310 if (status->crc)
314 rx_status->flag |= RX_FLAG_FAILED_FCS_CRC; 311 rx_status->flag |= RX_FLAG_FAILED_FCS_CRC;
315 312
@@ -330,6 +327,13 @@ bool rtl8723ae_rx_query_desc(struct ieee80211_hw *hw,
330 * to decrypt it 327 * to decrypt it
331 */ 328 */
332 if (status->decrypted) { 329 if (status->decrypted) {
330 hdr = (struct ieee80211_hdr *)(skb->data +
331 status->rx_drvinfo_size + status->rx_bufshift);
332
333 if (!hdr) {
334 /* during testing, hdr could be NULL here */
335 return false;
336 }
333 if ((ieee80211_is_robust_mgmt_frame(hdr)) && 337 if ((ieee80211_is_robust_mgmt_frame(hdr)) &&
334 (ieee80211_has_protected(hdr->frame_control))) 338 (ieee80211_has_protected(hdr->frame_control)))
335 rx_status->flag &= ~RX_FLAG_DECRYPTED; 339 rx_status->flag &= ~RX_FLAG_DECRYPTED;
diff --git a/drivers/net/wireless/rtlwifi/wifi.h b/drivers/net/wireless/rtlwifi/wifi.h
index 528888d69d2f..7ec95cb1ee1b 100644
--- a/drivers/net/wireless/rtlwifi/wifi.h
+++ b/drivers/net/wireless/rtlwifi/wifi.h
@@ -1221,10 +1221,10 @@ struct rtl_hal {
1221 bool set_fwcmd_inprogress; 1221 bool set_fwcmd_inprogress;
1222 u8 current_fwcmd_io; 1222 u8 current_fwcmd_io;
1223 1223
1224 struct p2p_ps_offload_t p2p_ps_offload;
1224 bool fw_clk_change_in_progress; 1225 bool fw_clk_change_in_progress;
1225 bool allow_sw_to_change_hwclc; 1226 bool allow_sw_to_change_hwclc;
1226 u8 fw_ps_state; 1227 u8 fw_ps_state;
1227 struct p2p_ps_offload_t p2p_ps_offload;
1228 /**/ 1228 /**/
1229 bool driver_going2unload; 1229 bool driver_going2unload;
1230 1230