1 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
2 /* Copyright(c) 2018-2019 Realtek Corporation
12 static int rtw_ips_pwr_up(struct rtw_dev *rtwdev)
16 ret = rtw_core_start(rtwdev);
18 rtw_err(rtwdev, "leave idle state failed\n");
20 rtw_set_channel(rtwdev);
21 clear_bit(RTW_FLAG_INACTIVE_PS, rtwdev->flags);
26 int rtw_enter_ips(struct rtw_dev *rtwdev)
28 set_bit(RTW_FLAG_INACTIVE_PS, rtwdev->flags);
30 rtw_coex_ips_notify(rtwdev, COEX_IPS_ENTER);
32 rtw_core_stop(rtwdev);
37 static void rtw_restore_port_cfg_iter(void *data, u8 *mac,
38 struct ieee80211_vif *vif)
40 struct rtw_dev *rtwdev = data;
41 struct rtw_vif *rtwvif = (struct rtw_vif *)vif->drv_priv;
44 rtw_vif_port_config(rtwdev, rtwvif, config);
47 int rtw_leave_ips(struct rtw_dev *rtwdev)
51 ret = rtw_ips_pwr_up(rtwdev);
53 rtw_err(rtwdev, "failed to leave ips state\n");
57 rtw_iterate_vifs_atomic(rtwdev, rtw_restore_port_cfg_iter, rtwdev);
59 rtw_coex_ips_notify(rtwdev, COEX_IPS_LEAVE);
64 static void rtw_leave_lps_core(struct rtw_dev *rtwdev)
66 struct rtw_lps_conf *conf = &rtwdev->lps_conf;
68 conf->state = RTW_ALL_ON;
69 conf->awake_interval = 1;
73 rtw_fw_set_pwr_mode(rtwdev);
74 clear_bit(RTW_FLAG_LEISURE_PS, rtwdev->flags);
76 rtw_coex_lps_notify(rtwdev, COEX_LPS_DISABLE);
79 static void rtw_enter_lps_core(struct rtw_dev *rtwdev)
81 struct rtw_lps_conf *conf = &rtwdev->lps_conf;
83 conf->state = RTW_RF_OFF;
84 conf->awake_interval = 1;
88 rtw_coex_lps_notify(rtwdev, COEX_LPS_ENABLE);
90 rtw_fw_set_pwr_mode(rtwdev);
91 set_bit(RTW_FLAG_LEISURE_PS, rtwdev->flags);
94 bool rtw_in_lps(struct rtw_dev *rtwdev)
96 return test_bit(RTW_FLAG_LEISURE_PS, rtwdev->flags);
99 void rtw_enter_lps(struct rtw_dev *rtwdev, u8 port_id)
101 struct rtw_lps_conf *conf = &rtwdev->lps_conf;
103 if (test_bit(RTW_FLAG_LEISURE_PS, rtwdev->flags))
106 conf->mode = RTW_MODE_LPS;
107 conf->port_id = port_id;
109 rtw_enter_lps_core(rtwdev);
112 void rtw_leave_lps(struct rtw_dev *rtwdev)
114 struct rtw_lps_conf *conf = &rtwdev->lps_conf;
116 if (!test_bit(RTW_FLAG_LEISURE_PS, rtwdev->flags))
119 conf->mode = RTW_MODE_ACTIVE;
121 rtw_leave_lps_core(rtwdev);