Lines Matching refs:rtwdev
13 static int rtw_ips_pwr_up(struct rtw_dev *rtwdev) in rtw_ips_pwr_up() argument
17 ret = rtw_core_start(rtwdev); in rtw_ips_pwr_up()
19 rtw_err(rtwdev, "leave idle state failed\n"); in rtw_ips_pwr_up()
21 rtw_set_channel(rtwdev); in rtw_ips_pwr_up()
26 int rtw_enter_ips(struct rtw_dev *rtwdev) in rtw_enter_ips() argument
28 if (test_and_set_bit(RTW_FLAG_INACTIVE_PS, rtwdev->flags)) in rtw_enter_ips()
31 rtw_coex_ips_notify(rtwdev, COEX_IPS_ENTER); in rtw_enter_ips()
33 rtw_core_stop(rtwdev); in rtw_enter_ips()
34 rtw_hci_link_ps(rtwdev, true); in rtw_enter_ips()
42 struct rtw_dev *rtwdev = data; in rtw_restore_port_cfg_iter() local
46 rtw_vif_port_config(rtwdev, rtwvif, config); in rtw_restore_port_cfg_iter()
49 int rtw_leave_ips(struct rtw_dev *rtwdev) in rtw_leave_ips() argument
53 if (!test_and_clear_bit(RTW_FLAG_INACTIVE_PS, rtwdev->flags)) in rtw_leave_ips()
56 rtw_hci_link_ps(rtwdev, false); in rtw_leave_ips()
58 ret = rtw_ips_pwr_up(rtwdev); in rtw_leave_ips()
60 rtw_err(rtwdev, "failed to leave ips state\n"); in rtw_leave_ips()
64 rtw_iterate_vifs_atomic(rtwdev, rtw_restore_port_cfg_iter, rtwdev); in rtw_leave_ips()
66 rtw_coex_ips_notify(rtwdev, COEX_IPS_LEAVE); in rtw_leave_ips()
71 void rtw_power_mode_change(struct rtw_dev *rtwdev, bool enter) in rtw_power_mode_change() argument
76 request = rtw_read8(rtwdev, rtwdev->hci.rpwm_addr); in rtw_power_mode_change()
77 confirm = rtw_read8(rtwdev, rtwdev->hci.cpwm_addr); in rtw_power_mode_change()
83 if (rtw_get_lps_deep_mode(rtwdev) == LPS_DEEP_MODE_PG) in rtw_power_mode_change()
89 if (rtw_fw_feature_check(&rtwdev->fw, FW_FEATURE_TX_WAKE)) in rtw_power_mode_change()
92 rtw_write8(rtwdev, rtwdev->hci.rpwm_addr, request); in rtw_power_mode_change()
97 100, 15000, true, rtwdev, in rtw_power_mode_change()
98 rtwdev->hci.cpwm_addr); in rtw_power_mode_change()
113 static void __rtw_leave_lps_deep(struct rtw_dev *rtwdev) in __rtw_leave_lps_deep() argument
115 rtw_hci_deep_ps(rtwdev, false); in __rtw_leave_lps_deep()
118 static int __rtw_fw_leave_lps_check_reg(struct rtw_dev *rtwdev) in __rtw_fw_leave_lps_check_reg() argument
135 if (rtw_read32_mask(rtwdev, REG_TCR, BIT_PWRMGT_HWDATA_EN) == 0) in __rtw_fw_leave_lps_check_reg()
143 static int __rtw_fw_leave_lps_check_c2h(struct rtw_dev *rtwdev) in __rtw_fw_leave_lps_check_c2h() argument
145 if (wait_for_completion_timeout(&rtwdev->lps_leave_check, in __rtw_fw_leave_lps_check_c2h()
151 static void rtw_fw_leave_lps_check(struct rtw_dev *rtwdev) in rtw_fw_leave_lps_check() argument
156 if (test_bit(RTW_FLAG_WOWLAN, rtwdev->flags)) in rtw_fw_leave_lps_check()
157 fw = &rtwdev->wow_fw; in rtw_fw_leave_lps_check()
159 fw = &rtwdev->fw; in rtw_fw_leave_lps_check()
162 ret = __rtw_fw_leave_lps_check_c2h(rtwdev); in rtw_fw_leave_lps_check()
164 ret = __rtw_fw_leave_lps_check_reg(rtwdev); in rtw_fw_leave_lps_check()
167 rtw_write32_clr(rtwdev, REG_TCR, BIT_PWRMGT_HWDATA_EN); in rtw_fw_leave_lps_check()
168 rtw_warn(rtwdev, "firmware failed to leave lps state\n"); in rtw_fw_leave_lps_check()
172 static void rtw_fw_leave_lps_check_prepare(struct rtw_dev *rtwdev) in rtw_fw_leave_lps_check_prepare() argument
176 if (test_bit(RTW_FLAG_WOWLAN, rtwdev->flags)) in rtw_fw_leave_lps_check_prepare()
177 fw = &rtwdev->wow_fw; in rtw_fw_leave_lps_check_prepare()
179 fw = &rtwdev->fw; in rtw_fw_leave_lps_check_prepare()
182 reinit_completion(&rtwdev->lps_leave_check); in rtw_fw_leave_lps_check_prepare()
185 static void rtw_leave_lps_core(struct rtw_dev *rtwdev) in rtw_leave_lps_core() argument
187 struct rtw_lps_conf *conf = &rtwdev->lps_conf; in rtw_leave_lps_core()
194 rtw_hci_link_ps(rtwdev, false); in rtw_leave_lps_core()
195 rtw_fw_leave_lps_check_prepare(rtwdev); in rtw_leave_lps_core()
196 rtw_fw_set_pwr_mode(rtwdev); in rtw_leave_lps_core()
197 rtw_fw_leave_lps_check(rtwdev); in rtw_leave_lps_core()
199 clear_bit(RTW_FLAG_LEISURE_PS, rtwdev->flags); in rtw_leave_lps_core()
201 rtw_coex_lps_notify(rtwdev, COEX_LPS_DISABLE); in rtw_leave_lps_core()
204 enum rtw_lps_deep_mode rtw_get_lps_deep_mode(struct rtw_dev *rtwdev) in rtw_get_lps_deep_mode() argument
206 if (test_bit(RTW_FLAG_WOWLAN, rtwdev->flags)) in rtw_get_lps_deep_mode()
207 return rtwdev->lps_conf.wow_deep_mode; in rtw_get_lps_deep_mode()
209 return rtwdev->lps_conf.deep_mode; in rtw_get_lps_deep_mode()
212 static void __rtw_enter_lps_deep(struct rtw_dev *rtwdev) in __rtw_enter_lps_deep() argument
214 if (rtw_get_lps_deep_mode(rtwdev) == LPS_DEEP_MODE_NONE) in __rtw_enter_lps_deep()
217 if (!test_bit(RTW_FLAG_LEISURE_PS, rtwdev->flags)) { in __rtw_enter_lps_deep()
218 rtw_dbg(rtwdev, RTW_DBG_PS, in __rtw_enter_lps_deep()
223 if (rtw_get_lps_deep_mode(rtwdev) == LPS_DEEP_MODE_PG) in __rtw_enter_lps_deep()
224 rtw_fw_set_pg_info(rtwdev); in __rtw_enter_lps_deep()
226 rtw_hci_deep_ps(rtwdev, true); in __rtw_enter_lps_deep()
229 static void rtw_enter_lps_core(struct rtw_dev *rtwdev) in rtw_enter_lps_core() argument
231 struct rtw_lps_conf *conf = &rtwdev->lps_conf; in rtw_enter_lps_core()
238 rtw_coex_lps_notify(rtwdev, COEX_LPS_ENABLE); in rtw_enter_lps_core()
240 rtw_fw_set_pwr_mode(rtwdev); in rtw_enter_lps_core()
241 rtw_hci_link_ps(rtwdev, true); in rtw_enter_lps_core()
243 set_bit(RTW_FLAG_LEISURE_PS, rtwdev->flags); in rtw_enter_lps_core()
246 static void __rtw_enter_lps(struct rtw_dev *rtwdev, u8 port_id) in __rtw_enter_lps() argument
248 struct rtw_lps_conf *conf = &rtwdev->lps_conf; in __rtw_enter_lps()
250 if (test_bit(RTW_FLAG_LEISURE_PS, rtwdev->flags)) in __rtw_enter_lps()
256 rtw_enter_lps_core(rtwdev); in __rtw_enter_lps()
259 static void __rtw_leave_lps(struct rtw_dev *rtwdev) in __rtw_leave_lps() argument
261 struct rtw_lps_conf *conf = &rtwdev->lps_conf; in __rtw_leave_lps()
263 if (test_and_clear_bit(RTW_FLAG_LEISURE_PS_DEEP, rtwdev->flags)) { in __rtw_leave_lps()
264 rtw_dbg(rtwdev, RTW_DBG_PS, in __rtw_leave_lps()
266 __rtw_leave_lps_deep(rtwdev); in __rtw_leave_lps()
269 if (!test_bit(RTW_FLAG_LEISURE_PS, rtwdev->flags)) in __rtw_leave_lps()
274 rtw_leave_lps_core(rtwdev); in __rtw_leave_lps()
277 void rtw_enter_lps(struct rtw_dev *rtwdev, u8 port_id) in rtw_enter_lps() argument
279 lockdep_assert_held(&rtwdev->mutex); in rtw_enter_lps()
281 if (rtwdev->coex.stat.wl_force_lps_ctrl) in rtw_enter_lps()
284 __rtw_enter_lps(rtwdev, port_id); in rtw_enter_lps()
285 __rtw_enter_lps_deep(rtwdev); in rtw_enter_lps()
288 void rtw_leave_lps(struct rtw_dev *rtwdev) in rtw_leave_lps() argument
290 lockdep_assert_held(&rtwdev->mutex); in rtw_leave_lps()
292 __rtw_leave_lps_deep(rtwdev); in rtw_leave_lps()
293 __rtw_leave_lps(rtwdev); in rtw_leave_lps()
296 void rtw_leave_lps_deep(struct rtw_dev *rtwdev) in rtw_leave_lps_deep() argument
298 lockdep_assert_held(&rtwdev->mutex); in rtw_leave_lps_deep()
300 __rtw_leave_lps_deep(rtwdev); in rtw_leave_lps_deep()