10464b80cd0339f1460005d5c6f0cb63dfce4e6e
[openwrt/openwrt.git] /
1 From fbb5e1b3637a720c83c91a7b1476ab0429bfc747 Mon Sep 17 00:00:00 2001
2 From: Bitterblue Smith <rtl8821cerfe2@gmail.com>
3 Date: Wed, 23 Oct 2024 17:09:47 +0300
4 Subject: [PATCH] wifi: rtw88: Let each driver control the power on/off process
5
6 RTL8821AU and RTL8812AU have to do some things differently, so let
7 them have full control.
8
9 The other chips use the same functions as before.
10
11 Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
12 Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
13 Link: https://patch.msgid.link/98ab839f-9100-44ae-9551-9af743a4aa3a@gmail.com
14 ---
15 drivers/net/wireless/realtek/rtw88/coex.c | 3 +++
16 drivers/net/wireless/realtek/rtw88/mac.c | 11 +++++++----
17 drivers/net/wireless/realtek/rtw88/mac.h | 3 +++
18 drivers/net/wireless/realtek/rtw88/main.c | 13 ++++++++-----
19 drivers/net/wireless/realtek/rtw88/main.h | 5 +++++
20 drivers/net/wireless/realtek/rtw88/rtw8703b.c | 2 ++
21 drivers/net/wireless/realtek/rtw88/rtw8723d.c | 2 ++
22 drivers/net/wireless/realtek/rtw88/rtw8821c.c | 2 ++
23 drivers/net/wireless/realtek/rtw88/rtw8822b.c | 2 ++
24 drivers/net/wireless/realtek/rtw88/rtw8822c.c | 2 ++
25 10 files changed, 36 insertions(+), 9 deletions(-)
26
27 --- a/drivers/net/wireless/realtek/rtw88/coex.c
28 +++ b/drivers/net/wireless/realtek/rtw88/coex.c
29 @@ -2753,16 +2753,19 @@ void rtw_coex_power_on_setting(struct rt
30 rtw_write8(rtwdev, 0xff1a, 0x0);
31 rtw_coex_set_gnt_debug(rtwdev);
32 }
33 +EXPORT_SYMBOL(rtw_coex_power_on_setting);
34
35 void rtw_coex_power_off_setting(struct rtw_dev *rtwdev)
36 {
37 rtw_write16(rtwdev, REG_WIFI_BT_INFO, BIT_BT_INT_EN);
38 }
39 +EXPORT_SYMBOL(rtw_coex_power_off_setting);
40
41 void rtw_coex_init_hw_config(struct rtw_dev *rtwdev, bool wifi_only)
42 {
43 __rtw_coex_init_hw_config(rtwdev, wifi_only);
44 }
45 +EXPORT_SYMBOL(rtw_coex_init_hw_config);
46
47 void rtw_coex_ips_notify(struct rtw_dev *rtwdev, u8 type)
48 {
49 --- a/drivers/net/wireless/realtek/rtw88/mac.c
50 +++ b/drivers/net/wireless/realtek/rtw88/mac.c
51 @@ -227,8 +227,8 @@ static int rtw_sub_pwr_seq_parser(struct
52 return 0;
53 }
54
55 -static int rtw_pwr_seq_parser(struct rtw_dev *rtwdev,
56 - const struct rtw_pwr_seq_cmd * const *cmd_seq)
57 +int rtw_pwr_seq_parser(struct rtw_dev *rtwdev,
58 + const struct rtw_pwr_seq_cmd * const *cmd_seq)
59 {
60 u8 cut_mask;
61 u8 intf_mask;
62 @@ -267,6 +267,7 @@ static int rtw_pwr_seq_parser(struct rtw
63
64 return 0;
65 }
66 +EXPORT_SYMBOL(rtw_pwr_seq_parser);
67
68 static int rtw_mac_power_switch(struct rtw_dev *rtwdev, bool pwr_on)
69 {
70 @@ -994,6 +995,7 @@ int rtw_download_firmware(struct rtw_dev
71
72 return 0;
73 }
74 +EXPORT_SYMBOL(rtw_download_firmware);
75
76 static u32 get_priority_queues(struct rtw_dev *rtwdev, u32 queues)
77 {
78 @@ -1127,7 +1129,7 @@ static int txdma_queue_mapping(struct rt
79 return 0;
80 }
81
82 -static int set_trx_fifo_info(struct rtw_dev *rtwdev)
83 +int rtw_set_trx_fifo_info(struct rtw_dev *rtwdev)
84 {
85 const struct rtw_chip_info *chip = rtwdev->chip;
86 struct rtw_fifo_conf *fifo = &rtwdev->fifo;
87 @@ -1179,6 +1181,7 @@ static int set_trx_fifo_info(struct rtw_
88
89 return 0;
90 }
91 +EXPORT_SYMBOL(rtw_set_trx_fifo_info);
92
93 static int __priority_queue_cfg(struct rtw_dev *rtwdev,
94 const struct rtw_page_table *pg_tbl,
95 @@ -1256,7 +1259,7 @@ static int priority_queue_cfg(struct rtw
96 u16 pubq_num;
97 int ret;
98
99 - ret = set_trx_fifo_info(rtwdev);
100 + ret = rtw_set_trx_fifo_info(rtwdev);
101 if (ret)
102 return ret;
103
104 --- a/drivers/net/wireless/realtek/rtw88/mac.h
105 +++ b/drivers/net/wireless/realtek/rtw88/mac.h
106 @@ -30,11 +30,14 @@
107
108 void rtw_set_channel_mac(struct rtw_dev *rtwdev, u8 channel, u8 bw,
109 u8 primary_ch_idx);
110 +int rtw_pwr_seq_parser(struct rtw_dev *rtwdev,
111 + const struct rtw_pwr_seq_cmd * const *cmd_seq);
112 int rtw_mac_power_on(struct rtw_dev *rtwdev);
113 void rtw_mac_power_off(struct rtw_dev *rtwdev);
114 int rtw_download_firmware(struct rtw_dev *rtwdev, struct rtw_fw_state *fw);
115 int rtw_mac_init(struct rtw_dev *rtwdev);
116 void rtw_mac_flush_queues(struct rtw_dev *rtwdev, u32 queues, bool drop);
117 +int rtw_set_trx_fifo_info(struct rtw_dev *rtwdev);
118 int rtw_ddma_to_fw_fifo(struct rtw_dev *rtwdev, u32 ocp_src, u32 size);
119
120 static inline void rtw_mac_flush_all_queues(struct rtw_dev *rtwdev, bool drop)
121 --- a/drivers/net/wireless/realtek/rtw88/main.c
122 +++ b/drivers/net/wireless/realtek/rtw88/main.c
123 @@ -1309,7 +1309,7 @@ void rtw_update_sta_info(struct rtw_dev
124 rtw_fw_send_ra_info(rtwdev, si, reset_ra_mask);
125 }
126
127 -static int rtw_wait_firmware_completion(struct rtw_dev *rtwdev)
128 +int rtw_wait_firmware_completion(struct rtw_dev *rtwdev)
129 {
130 const struct rtw_chip_info *chip = rtwdev->chip;
131 struct rtw_fw_state *fw;
132 @@ -1329,6 +1329,7 @@ static int rtw_wait_firmware_completion(
133
134 return ret;
135 }
136 +EXPORT_SYMBOL(rtw_wait_firmware_completion);
137
138 static enum rtw_lps_deep_mode rtw_update_lps_deep_mode(struct rtw_dev *rtwdev,
139 struct rtw_fw_state *fw)
140 @@ -1350,7 +1351,7 @@ static enum rtw_lps_deep_mode rtw_update
141 return LPS_DEEP_MODE_NONE;
142 }
143
144 -static int rtw_power_on(struct rtw_dev *rtwdev)
145 +int rtw_power_on(struct rtw_dev *rtwdev)
146 {
147 const struct rtw_chip_info *chip = rtwdev->chip;
148 struct rtw_fw_state *fw = &rtwdev->fw;
149 @@ -1413,6 +1414,7 @@ err_off:
150 err:
151 return ret;
152 }
153 +EXPORT_SYMBOL(rtw_power_on);
154
155 void rtw_core_fw_scan_notify(struct rtw_dev *rtwdev, bool start)
156 {
157 @@ -1485,7 +1487,7 @@ int rtw_core_start(struct rtw_dev *rtwde
158 {
159 int ret;
160
161 - ret = rtw_power_on(rtwdev);
162 + ret = rtwdev->chip->ops->power_on(rtwdev);
163 if (ret)
164 return ret;
165
166 @@ -1505,12 +1507,13 @@ int rtw_core_start(struct rtw_dev *rtwde
167 return 0;
168 }
169
170 -static void rtw_power_off(struct rtw_dev *rtwdev)
171 +void rtw_power_off(struct rtw_dev *rtwdev)
172 {
173 rtw_hci_stop(rtwdev);
174 rtw_coex_power_off_setting(rtwdev);
175 rtw_mac_power_off(rtwdev);
176 }
177 +EXPORT_SYMBOL(rtw_power_off);
178
179 void rtw_core_stop(struct rtw_dev *rtwdev)
180 {
181 @@ -1535,7 +1538,7 @@ void rtw_core_stop(struct rtw_dev *rtwde
182
183 mutex_lock(&rtwdev->mutex);
184
185 - rtw_power_off(rtwdev);
186 + rtwdev->chip->ops->power_off(rtwdev);
187 }
188
189 static void rtw_init_ht_cap(struct rtw_dev *rtwdev,
190 --- a/drivers/net/wireless/realtek/rtw88/main.h
191 +++ b/drivers/net/wireless/realtek/rtw88/main.h
192 @@ -843,6 +843,8 @@ struct rtw_regd {
193 };
194
195 struct rtw_chip_ops {
196 + int (*power_on)(struct rtw_dev *rtwdev);
197 + void (*power_off)(struct rtw_dev *rtwdev);
198 int (*mac_init)(struct rtw_dev *rtwdev);
199 int (*dump_fw_crash)(struct rtw_dev *rtwdev);
200 void (*shutdown)(struct rtw_dev *rtwdev);
201 @@ -2209,6 +2211,7 @@ void rtw_core_scan_start(struct rtw_dev
202 void rtw_core_scan_complete(struct rtw_dev *rtwdev, struct ieee80211_vif *vif,
203 bool hw_scan);
204 int rtw_core_start(struct rtw_dev *rtwdev);
205 +void rtw_power_off(struct rtw_dev *rtwdev);
206 void rtw_core_stop(struct rtw_dev *rtwdev);
207 int rtw_chip_info_setup(struct rtw_dev *rtwdev);
208 int rtw_core_init(struct rtw_dev *rtwdev);
209 @@ -2223,6 +2226,8 @@ int rtw_sta_add(struct rtw_dev *rtwdev,
210 void rtw_sta_remove(struct rtw_dev *rtwdev, struct ieee80211_sta *sta,
211 bool fw_exist);
212 void rtw_fw_recovery(struct rtw_dev *rtwdev);
213 +int rtw_wait_firmware_completion(struct rtw_dev *rtwdev);
214 +int rtw_power_on(struct rtw_dev *rtwdev);
215 void rtw_core_fw_scan_notify(struct rtw_dev *rtwdev, bool start);
216 int rtw_dump_fw(struct rtw_dev *rtwdev, const u32 ocp_src, u32 size,
217 u32 fwcd_item);
218 --- a/drivers/net/wireless/realtek/rtw88/rtw8703b.c
219 +++ b/drivers/net/wireless/realtek/rtw88/rtw8703b.c
220 @@ -1888,6 +1888,8 @@ static const struct coex_tdma_para tdma_
221 };
222
223 static const struct rtw_chip_ops rtw8703b_ops = {
224 + .power_on = rtw_power_on,
225 + .power_off = rtw_power_off,
226 .mac_init = rtw8723x_mac_init,
227 .dump_fw_crash = NULL,
228 .shutdown = NULL,
229 --- a/drivers/net/wireless/realtek/rtw88/rtw8723d.c
230 +++ b/drivers/net/wireless/realtek/rtw88/rtw8723d.c
231 @@ -1390,6 +1390,8 @@ static void rtw8723d_pwr_track(struct rt
232 }
233
234 static const struct rtw_chip_ops rtw8723d_ops = {
235 + .power_on = rtw_power_on,
236 + .power_off = rtw_power_off,
237 .phy_set_param = rtw8723d_phy_set_param,
238 .read_efuse = rtw8723x_read_efuse,
239 .query_phy_status = query_phy_status,
240 --- a/drivers/net/wireless/realtek/rtw88/rtw8821c.c
241 +++ b/drivers/net/wireless/realtek/rtw88/rtw8821c.c
242 @@ -1643,6 +1643,8 @@ static const struct rtw_prioq_addrs prio
243 };
244
245 static const struct rtw_chip_ops rtw8821c_ops = {
246 + .power_on = rtw_power_on,
247 + .power_off = rtw_power_off,
248 .phy_set_param = rtw8821c_phy_set_param,
249 .read_efuse = rtw8821c_read_efuse,
250 .query_phy_status = query_phy_status,
251 --- a/drivers/net/wireless/realtek/rtw88/rtw8822b.c
252 +++ b/drivers/net/wireless/realtek/rtw88/rtw8822b.c
253 @@ -2132,6 +2132,8 @@ static const struct rtw_prioq_addrs prio
254 };
255
256 static const struct rtw_chip_ops rtw8822b_ops = {
257 + .power_on = rtw_power_on,
258 + .power_off = rtw_power_off,
259 .phy_set_param = rtw8822b_phy_set_param,
260 .read_efuse = rtw8822b_read_efuse,
261 .query_phy_status = query_phy_status,
262 --- a/drivers/net/wireless/realtek/rtw88/rtw8822c.c
263 +++ b/drivers/net/wireless/realtek/rtw88/rtw8822c.c
264 @@ -4947,6 +4947,8 @@ static const struct rtw_prioq_addrs prio
265 };
266
267 static const struct rtw_chip_ops rtw8822c_ops = {
268 + .power_on = rtw_power_on,
269 + .power_off = rtw_power_off,
270 .phy_set_param = rtw8822c_phy_set_param,
271 .read_efuse = rtw8822c_read_efuse,
272 .query_phy_status = query_phy_status,