hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
kernel/drivers/net/wireless/realtek/rtlwifi/ps.c
....@@ -1,27 +1,5 @@
1
-/******************************************************************************
2
- *
3
- * Copyright(c) 2009-2012 Realtek Corporation.
4
- *
5
- * This program is free software; you can redistribute it and/or modify it
6
- * under the terms of version 2 of the GNU General Public License as
7
- * published by the Free Software Foundation.
8
- *
9
- * This program is distributed in the hope that it will be useful, but WITHOUT
10
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12
- * more details.
13
- *
14
- * The full GNU General Public License is included in this distribution in the
15
- * file called LICENSE.
16
- *
17
- * Contact Information:
18
- * wlanfae <wlanfae@realtek.com>
19
- * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20
- * Hsinchu 300, Taiwan.
21
- *
22
- * Larry Finger <Larry.Finger@lwfinger.net>
23
- *
24
- *****************************************************************************/
1
+// SPDX-License-Identifier: GPL-2.0
2
+/* Copyright(c) 2009-2012 Realtek Corporation.*/
253
264 #include "wifi.h"
275 #include "base.h"
....@@ -41,8 +19,8 @@
4119 rtlpriv->intf_ops->reset_trx_ring(hw);
4220
4321 if (is_hal_stop(rtlhal))
44
- RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
45
- "Driver is already down!\n");
22
+ rtl_dbg(rtlpriv, COMP_ERR, DBG_WARNING,
23
+ "Driver is already down!\n");
4624
4725 /*<2> Enable Adapter */
4826 if (rtlpriv->cfg->ops->hw_init(hw))
....@@ -90,7 +68,6 @@
9068 {
9169 struct rtl_priv *rtlpriv = rtl_priv(hw);
9270 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
93
- enum rf_pwrstate rtstate;
9471 bool actionallowed = false;
9572 u16 rfwait_cnt = 0;
9673
....@@ -103,9 +80,9 @@
10380 if (ppsc->rfchange_inprogress) {
10481 spin_unlock(&rtlpriv->locks.rf_ps_lock);
10582
106
- RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
107
- "RF Change in progress! Wait to set..state_toset(%d).\n",
108
- state_toset);
83
+ rtl_dbg(rtlpriv, COMP_ERR, DBG_WARNING,
84
+ "RF Change in progress! Wait to set..state_toset(%d).\n",
85
+ state_toset);
10986
11087 /* Set RF after the previous action is done. */
11188 while (ppsc->rfchange_inprogress) {
....@@ -123,8 +100,6 @@
123100 break;
124101 }
125102 }
126
-
127
- rtstate = ppsc->rfpwr_state;
128103
129104 switch (state_toset) {
130105 case ERFON:
....@@ -183,8 +158,7 @@
183158 if (ppsc->inactive_pwrstate == ERFON &&
184159 rtlhal->interface == INTF_PCI) {
185160 if ((ppsc->reg_rfps_level & RT_RF_OFF_LEVL_ASPM) &&
186
- RT_IN_PS_LEVEL(ppsc, RT_PS_LEVEL_ASPM) &&
187
- rtlhal->interface == INTF_PCI) {
161
+ RT_IN_PS_LEVEL(ppsc, RT_PS_LEVEL_ASPM)) {
188162 rtlpriv->intf_ops->disable_aspm(hw);
189163 RT_CLEAR_PS_LEVEL(ppsc, RT_PS_LEVEL_ASPM);
190164 }
....@@ -205,10 +179,10 @@
205179 ppsc->swrf_processing = false;
206180 }
207181
208
-void rtl_ips_nic_off_wq_callback(void *data)
182
+void rtl_ips_nic_off_wq_callback(struct work_struct *work)
209183 {
210
- struct rtl_works *rtlworks =
211
- container_of_dwork_rtl(data, struct rtl_works, ips_nic_off_wq);
184
+ struct rtl_works *rtlworks = container_of(work, struct rtl_works,
185
+ ips_nic_off_wq.work);
212186 struct ieee80211_hw *hw = rtlworks->hw;
213187 struct rtl_priv *rtlpriv = rtl_priv(hw);
214188 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
....@@ -217,8 +191,8 @@
217191 enum rf_pwrstate rtstate;
218192
219193 if (mac->opmode != NL80211_IFTYPE_STATION) {
220
- RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
221
- "not station return\n");
194
+ rtl_dbg(rtlpriv, COMP_ERR, DBG_WARNING,
195
+ "not station return\n");
222196 return;
223197 }
224198
....@@ -254,8 +228,8 @@
254228 !ppsc->swrf_processing &&
255229 (mac->link_state == MAC80211_NOLINK) &&
256230 !mac->act_scanning) {
257
- RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
258
- "IPSEnter(): Turn off RF\n");
231
+ rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
232
+ "IPSEnter(): Turn off RF\n");
259233
260234 ppsc->inactive_pwrstate = ERFOFF;
261235 ppsc->in_powersavemode = true;
....@@ -333,8 +307,8 @@
333307 ppsc->last_delaylps_stamp_jiffies);
334308
335309 if (ps_timediff < 2000) {
336
- RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
337
- "Delay enter Fw LPS for DHCP, ARP, or EAPOL exchanging state\n");
310
+ rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD,
311
+ "Delay enter Fw LPS for DHCP, ARP, or EAPOL exchanging state\n");
338312 return false;
339313 }
340314
....@@ -379,9 +353,9 @@
379353
380354 if ((ppsc->fwctrl_lps) && ppsc->report_linked) {
381355 if (ppsc->dot11_psmode == EACTIVE) {
382
- RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
383
- "FW LPS leave ps_mode:%x\n",
384
- FW_PS_ACTIVE_MODE);
356
+ rtl_dbg(rtlpriv, COMP_RF, DBG_DMESG,
357
+ "FW LPS leave ps_mode:%x\n",
358
+ FW_PS_ACTIVE_MODE);
385359 enter_fwlps = false;
386360 ppsc->pwr_mode = FW_PS_ACTIVE_MODE;
387361 ppsc->smart_ps = 0;
....@@ -394,9 +368,9 @@
394368 rtlpriv->btcoexist.btc_ops->btc_lps_notify(rtlpriv, rt_psmode);
395369 } else {
396370 if (rtl_get_fwlps_doze(hw)) {
397
- RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
398
- "FW LPS enter ps_mode:%x\n",
399
- ppsc->fwctrl_psmode);
371
+ rtl_dbg(rtlpriv, COMP_RF, DBG_DMESG,
372
+ "FW LPS enter ps_mode:%x\n",
373
+ ppsc->fwctrl_psmode);
400374 if (rtlpriv->cfg->ops->get_btc_status())
401375 rtlpriv->btcoexist.btc_ops->btc_lps_notify(rtlpriv, rt_psmode);
402376 enter_fwlps = true;
....@@ -446,8 +420,8 @@
446420 * bt_ccoexist may ask to enter lps.
447421 * In normal case, this constraint move to rtl_lps_set_psmode().
448422 */
449
- RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
450
- "Enter 802.11 power save mode...\n");
423
+ rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD,
424
+ "Enter 802.11 power save mode...\n");
451425 rtl_lps_set_psmode(hw, EAUTOPS);
452426
453427 mutex_unlock(&rtlpriv->locks.lps_mutex);
....@@ -475,8 +449,8 @@
475449 RT_CLEAR_PS_LEVEL(ppsc, RT_PS_LEVEL_ASPM);
476450 }
477451
478
- RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
479
- "Busy Traffic,Leave 802.11 power save..\n");
452
+ rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD,
453
+ "Busy Traffic,Leave 802.11 power save..\n");
480454
481455 rtl_lps_set_psmode(hw, EACTIVE);
482456 }
....@@ -560,8 +534,8 @@
560534 queue_delayed_work(rtlpriv->works.rtl_wq,
561535 &rtlpriv->works.ps_work, MSECS(5));
562536 } else {
563
- RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG,
564
- "u_bufferd: %x, m_buffered: %x\n", u_buffed, m_buffed);
537
+ rtl_dbg(rtlpriv, COMP_POWER, DBG_DMESG,
538
+ "u_bufferd: %x, m_buffered: %x\n", u_buffed, m_buffed);
565539 }
566540 }
567541 EXPORT_SYMBOL_GPL(rtl_swlps_beacon);
....@@ -588,10 +562,10 @@
588562 mutex_unlock(&rtlpriv->locks.lps_mutex);
589563 }
590564
591
-void rtl_swlps_rfon_wq_callback(void *data)
565
+void rtl_swlps_rfon_wq_callback(struct work_struct *work)
592566 {
593
- struct rtl_works *rtlworks =
594
- container_of_dwork_rtl(data, struct rtl_works, ps_rfon_wq);
567
+ struct rtl_works *rtlworks = container_of(work, struct rtl_works,
568
+ ps_rfon_wq.work);
595569 struct ieee80211_hw *hw = rtlworks->hw;
596570
597571 rtl_swlps_rf_awake(hw);
....@@ -656,9 +630,9 @@
656630 /* this print should always be dtim_conter = 0 &
657631 * sleep = dtim_period, that meaons, we should
658632 * awake before every dtim */
659
- RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG,
660
- "dtim_counter:%x will sleep :%d beacon_intv\n",
661
- rtlpriv->psc.dtim_counter, sleep_intv);
633
+ rtl_dbg(rtlpriv, COMP_POWER, DBG_DMESG,
634
+ "dtim_counter:%x will sleep :%d beacon_intv\n",
635
+ rtlpriv->psc.dtim_counter, sleep_intv);
662636
663637 /* we tested that 40ms is enough for sw & hw sw delay */
664638 queue_delayed_work(rtlpriv->works.rtl_wq, &rtlpriv->works.ps_rfon_wq,
....@@ -679,33 +653,32 @@
679653 }
680654 EXPORT_SYMBOL_GPL(rtl_lps_change_work_callback);
681655
682
-void rtl_lps_enter(struct ieee80211_hw *hw)
656
+void rtl_lps_enter(struct ieee80211_hw *hw, bool may_block)
683657 {
684658 struct rtl_priv *rtlpriv = rtl_priv(hw);
685659
686
- if (!in_interrupt())
660
+ if (may_block)
687661 return rtl_lps_enter_core(hw);
688662 rtlpriv->enter_ps = true;
689663 schedule_work(&rtlpriv->works.lps_change_work);
690664 }
691665 EXPORT_SYMBOL_GPL(rtl_lps_enter);
692666
693
-void rtl_lps_leave(struct ieee80211_hw *hw)
667
+void rtl_lps_leave(struct ieee80211_hw *hw, bool may_block)
694668 {
695669 struct rtl_priv *rtlpriv = rtl_priv(hw);
696670
697
- if (!in_interrupt())
671
+ if (may_block)
698672 return rtl_lps_leave_core(hw);
699673 rtlpriv->enter_ps = false;
700674 schedule_work(&rtlpriv->works.lps_change_work);
701675 }
702676 EXPORT_SYMBOL_GPL(rtl_lps_leave);
703677
704
-void rtl_swlps_wq_callback(void *data)
678
+void rtl_swlps_wq_callback(struct work_struct *work)
705679 {
706
- struct rtl_works *rtlworks = container_of_dwork_rtl(data,
707
- struct rtl_works,
708
- ps_work);
680
+ struct rtl_works *rtlworks = container_of(work, struct rtl_works,
681
+ ps_work.work);
709682 struct ieee80211_hw *hw = rtlworks->hw;
710683 struct rtl_priv *rtlpriv = rtl_priv(hw);
711684 bool ps = false;
....@@ -740,6 +713,7 @@
740713 static u8 p2p_oui_ie_type[4] = {0x50, 0x6f, 0x9a, 0x09};
741714 u8 noa_num, index , i, noa_index = 0;
742715 bool find_p2p_ie = false , find_p2p_ps_ie = false;
716
+
743717 pos = (u8 *)mgmt->u.beacon.variable;
744718 end = data + len;
745719 ie = NULL;
....@@ -762,16 +736,16 @@
762736 find_p2p_ie = true;
763737 /*to find noa ie*/
764738 while (ie + 1 < end) {
765
- noa_len = READEF2BYTE((__le16 *)&ie[1]);
739
+ noa_len = le16_to_cpu(*((__le16 *)&ie[1]));
766740 if (ie + 3 + ie[1] > end)
767741 return;
768742
769743 if (ie[0] == 12) {
770744 find_p2p_ps_ie = true;
771745 if ((noa_len - 2) % 13 != 0) {
772
- RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
773
- "P2P notice of absence: invalid length.%d\n",
774
- noa_len);
746
+ rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
747
+ "P2P notice of absence: invalid length.%d\n",
748
+ noa_len);
775749 return;
776750 } else {
777751 noa_num = (noa_len - 2) / 13;
....@@ -782,8 +756,8 @@
782756 noa_index = ie[3];
783757 if (rtlpriv->psc.p2p_ps_info.p2p_ps_mode ==
784758 P2P_PS_NONE || noa_index != p2pinfo->noa_index) {
785
- RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD,
786
- "update NOA ie.\n");
759
+ rtl_dbg(rtlpriv, COMP_FW, DBG_LOUD,
760
+ "update NOA ie.\n");
787761 p2pinfo->noa_index = noa_index;
788762 p2pinfo->opp_ps = (ie[4] >> 7);
789763 p2pinfo->ctwindow = ie[4] & 0x7F;
....@@ -791,16 +765,16 @@
791765 index = 5;
792766 for (i = 0; i < noa_num; i++) {
793767 p2pinfo->noa_count_type[i] =
794
- READEF1BYTE(ie+index);
768
+ *(u8 *)(ie + index);
795769 index += 1;
796770 p2pinfo->noa_duration[i] =
797
- READEF4BYTE((__le32 *)ie+index);
771
+ le32_to_cpu(*(__le32 *)(ie + index));
798772 index += 4;
799773 p2pinfo->noa_interval[i] =
800
- READEF4BYTE((__le32 *)ie+index);
774
+ le32_to_cpu(*(__le32 *)(ie + index));
801775 index += 4;
802776 p2pinfo->noa_start_time[i] =
803
- READEF4BYTE((__le32 *)ie+index);
777
+ le32_to_cpu(*(__le32 *)(ie + index));
804778 index += 4;
805779 }
806780
....@@ -854,21 +828,21 @@
854828 if (ie == NULL)
855829 return;
856830
857
- RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "action frame find P2P IE.\n");
831
+ rtl_dbg(rtlpriv, COMP_FW, DBG_LOUD, "action frame find P2P IE.\n");
858832 /*to find noa ie*/
859833 while (ie + 1 < end) {
860
- noa_len = READEF2BYTE((__le16 *)&ie[1]);
834
+ noa_len = le16_to_cpu(*(__le16 *)&ie[1]);
861835 if (ie + 3 + ie[1] > end)
862836 return;
863837
864838 if (ie[0] == 12) {
865
- RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "find NOA IE.\n");
839
+ rtl_dbg(rtlpriv, COMP_FW, DBG_LOUD, "find NOA IE.\n");
866840 RT_PRINT_DATA(rtlpriv, COMP_FW, DBG_LOUD, "noa ie ",
867841 ie, noa_len);
868842 if ((noa_len - 2) % 13 != 0) {
869
- RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD,
870
- "P2P notice of absence: invalid length.%d\n",
871
- noa_len);
843
+ rtl_dbg(rtlpriv, COMP_FW, DBG_LOUD,
844
+ "P2P notice of absence: invalid length.%d\n",
845
+ noa_len);
872846 return;
873847 } else {
874848 noa_num = (noa_len - 2) / 13;
....@@ -886,16 +860,16 @@
886860 index = 5;
887861 for (i = 0; i < noa_num; i++) {
888862 p2pinfo->noa_count_type[i] =
889
- READEF1BYTE(ie+index);
863
+ *(u8 *)(ie + index);
890864 index += 1;
891865 p2pinfo->noa_duration[i] =
892
- READEF4BYTE((__le32 *)ie+index);
866
+ le32_to_cpu(*(__le32 *)(ie + index));
893867 index += 4;
894868 p2pinfo->noa_interval[i] =
895
- READEF4BYTE((__le32 *)ie+index);
869
+ le32_to_cpu(*(__le32 *)(ie + index));
896870 index += 4;
897871 p2pinfo->noa_start_time[i] =
898
- READEF4BYTE((__le32 *)ie+index);
872
+ le32_to_cpu(*(__le32 *)(ie + index));
899873 index += 4;
900874 }
901875
....@@ -926,7 +900,7 @@
926900 struct rtl_ps_ctl *rtlps = rtl_psc(rtl_priv(hw));
927901 struct rtl_p2p_ps_info *p2pinfo = &(rtlpriv->psc.p2p_ps_info);
928902
929
- RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, " p2p state %x\n" , p2p_ps_state);
903
+ rtl_dbg(rtlpriv, COMP_FW, DBG_LOUD, " p2p state %x\n", p2p_ps_state);
930904 switch (p2p_ps_state) {
931905 case P2P_PS_DISABLE:
932906 p2pinfo->p2p_ps_state = p2p_ps_state;
....@@ -978,18 +952,18 @@
978952 default:
979953 break;
980954 }
981
- RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD,
982
- "ctwindow %x oppps %x\n",
983
- p2pinfo->ctwindow , p2pinfo->opp_ps);
984
- RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD,
985
- "count %x duration %x index %x interval %x start time %x noa num %x\n",
986
- p2pinfo->noa_count_type[0],
987
- p2pinfo->noa_duration[0],
988
- p2pinfo->noa_index,
989
- p2pinfo->noa_interval[0],
990
- p2pinfo->noa_start_time[0],
991
- p2pinfo->noa_num);
992
- RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "end\n");
955
+ rtl_dbg(rtlpriv, COMP_FW, DBG_LOUD,
956
+ "ctwindow %x oppps %x\n",
957
+ p2pinfo->ctwindow, p2pinfo->opp_ps);
958
+ rtl_dbg(rtlpriv, COMP_FW, DBG_LOUD,
959
+ "count %x duration %x index %x interval %x start time %x noa num %x\n",
960
+ p2pinfo->noa_count_type[0],
961
+ p2pinfo->noa_duration[0],
962
+ p2pinfo->noa_index,
963
+ p2pinfo->noa_interval[0],
964
+ p2pinfo->noa_start_time[0],
965
+ p2pinfo->noa_num);
966
+ rtl_dbg(rtlpriv, COMP_FW, DBG_LOUD, "end\n");
993967 }
994968
995969 void rtl_p2p_info(struct ieee80211_hw *hw, void *data, unsigned int len)