14
14
#include <linux/mmc/sdio_ids.h>
15
15
#include <linux/mmc/sdio_func.h>
16
16
17
+ #include "../sdio.h"
17
18
#include "mt7615.h"
18
- #include "sdio.h"
19
19
#include "mac.h"
20
20
#include "mcu.h"
21
21
@@ -24,200 +24,19 @@ static const struct sdio_device_id mt7663s_table[] = {
24
24
{ } /* Terminating entry */
25
25
};
26
26
27
- static u32 mt7663s_read_whisr (struct mt76_dev * dev )
27
+ static void mt7663s_txrx_worker (struct mt76_worker * w )
28
28
{
29
- return sdio_readl (dev -> sdio .func , MCR_WHISR , NULL );
30
- }
31
-
32
- u32 mt7663s_read_pcr (struct mt7615_dev * dev )
33
- {
34
- struct mt76_sdio * sdio = & dev -> mt76 .sdio ;
35
-
36
- return sdio_readl (sdio -> func , MCR_WHLPCR , NULL );
37
- }
38
-
39
- static u32 mt7663s_read_mailbox (struct mt76_dev * dev , u32 offset )
40
- {
41
- struct sdio_func * func = dev -> sdio .func ;
42
- u32 val = ~0 , status ;
43
- int err ;
44
-
45
- sdio_claim_host (func );
46
-
47
- sdio_writel (func , offset , MCR_H2DSM0R , & err );
48
- if (err < 0 ) {
49
- dev_err (dev -> dev , "failed setting address [err=%d]\n" , err );
50
- goto out ;
51
- }
52
-
53
- sdio_writel (func , H2D_SW_INT_READ , MCR_WSICR , & err );
54
- if (err < 0 ) {
55
- dev_err (dev -> dev , "failed setting read mode [err=%d]\n" , err );
56
- goto out ;
57
- }
58
-
59
- err = readx_poll_timeout (mt7663s_read_whisr , dev , status ,
60
- status & H2D_SW_INT_READ , 0 , 1000000 );
61
- if (err < 0 ) {
62
- dev_err (dev -> dev , "query whisr timeout\n" );
63
- goto out ;
64
- }
65
-
66
- sdio_writel (func , H2D_SW_INT_READ , MCR_WHISR , & err );
67
- if (err < 0 ) {
68
- dev_err (dev -> dev , "failed setting read mode [err=%d]\n" , err );
69
- goto out ;
70
- }
71
-
72
- val = sdio_readl (func , MCR_H2DSM0R , & err );
73
- if (err < 0 ) {
74
- dev_err (dev -> dev , "failed reading h2dsm0r [err=%d]\n" , err );
75
- goto out ;
76
- }
77
-
78
- if (val != offset ) {
79
- dev_err (dev -> dev , "register mismatch\n" );
80
- val = ~0 ;
81
- goto out ;
82
- }
83
-
84
- val = sdio_readl (func , MCR_D2HRM1R , & err );
85
- if (err < 0 )
86
- dev_err (dev -> dev , "failed reading d2hrm1r [err=%d]\n" , err );
87
-
88
- out :
89
- sdio_release_host (func );
90
-
91
- return val ;
92
- }
93
-
94
- static void mt7663s_write_mailbox (struct mt76_dev * dev , u32 offset , u32 val )
95
- {
96
- struct sdio_func * func = dev -> sdio .func ;
97
- u32 status ;
98
- int err ;
99
-
100
- sdio_claim_host (func );
101
-
102
- sdio_writel (func , offset , MCR_H2DSM0R , & err );
103
- if (err < 0 ) {
104
- dev_err (dev -> dev , "failed setting address [err=%d]\n" , err );
105
- goto out ;
106
- }
107
-
108
- sdio_writel (func , val , MCR_H2DSM1R , & err );
109
- if (err < 0 ) {
110
- dev_err (dev -> dev ,
111
- "failed setting write value [err=%d]\n" , err );
112
- goto out ;
113
- }
114
-
115
- sdio_writel (func , H2D_SW_INT_WRITE , MCR_WSICR , & err );
116
- if (err < 0 ) {
117
- dev_err (dev -> dev , "failed setting write mode [err=%d]\n" , err );
118
- goto out ;
119
- }
120
-
121
- err = readx_poll_timeout (mt7663s_read_whisr , dev , status ,
122
- status & H2D_SW_INT_WRITE , 0 , 1000000 );
123
- if (err < 0 ) {
124
- dev_err (dev -> dev , "query whisr timeout\n" );
125
- goto out ;
126
- }
127
-
128
- sdio_writel (func , H2D_SW_INT_WRITE , MCR_WHISR , & err );
129
- if (err < 0 ) {
130
- dev_err (dev -> dev , "failed setting write mode [err=%d]\n" , err );
131
- goto out ;
132
- }
133
-
134
- val = sdio_readl (func , MCR_H2DSM0R , & err );
135
- if (err < 0 ) {
136
- dev_err (dev -> dev , "failed reading h2dsm0r [err=%d]\n" , err );
137
- goto out ;
138
- }
139
-
140
- if (val != offset )
141
- dev_err (dev -> dev , "register mismatch\n" );
142
-
143
- out :
144
- sdio_release_host (func );
145
- }
146
-
147
- static u32 mt7663s_rr (struct mt76_dev * dev , u32 offset )
148
- {
149
- if (test_bit (MT76_STATE_MCU_RUNNING , & dev -> phy .state ))
150
- return dev -> mcu_ops -> mcu_rr (dev , offset );
151
- else
152
- return mt7663s_read_mailbox (dev , offset );
153
- }
154
-
155
- static void mt7663s_wr (struct mt76_dev * dev , u32 offset , u32 val )
156
- {
157
- if (test_bit (MT76_STATE_MCU_RUNNING , & dev -> phy .state ))
158
- dev -> mcu_ops -> mcu_wr (dev , offset , val );
159
- else
160
- mt7663s_write_mailbox (dev , offset , val );
161
- }
162
-
163
- static u32 mt7663s_rmw (struct mt76_dev * dev , u32 offset , u32 mask , u32 val )
164
- {
165
- val |= mt7663s_rr (dev , offset ) & ~mask ;
166
- mt7663s_wr (dev , offset , val );
167
-
168
- return val ;
169
- }
170
-
171
- static void mt7663s_write_copy (struct mt76_dev * dev , u32 offset ,
172
- const void * data , int len )
173
- {
174
- const u32 * val = data ;
175
- int i ;
176
-
177
- for (i = 0 ; i < len / sizeof (u32 ); i ++ ) {
178
- mt7663s_wr (dev , offset , val [i ]);
179
- offset += sizeof (u32 );
180
- }
181
- }
182
-
183
- static void mt7663s_read_copy (struct mt76_dev * dev , u32 offset ,
184
- void * data , int len )
185
- {
186
- u32 * val = data ;
187
- int i ;
188
-
189
- for (i = 0 ; i < len / sizeof (u32 ); i ++ ) {
190
- val [i ] = mt7663s_rr (dev , offset );
191
- offset += sizeof (u32 );
192
- }
193
- }
29
+ struct mt76_sdio * sdio = container_of (w , struct mt76_sdio ,
30
+ txrx_worker );
31
+ struct mt76_dev * mdev = container_of (sdio , struct mt76_dev , sdio );
32
+ struct mt7615_dev * dev = container_of (mdev , struct mt7615_dev , mt76 );
194
33
195
- static int mt7663s_wr_rp (struct mt76_dev * dev , u32 base ,
196
- const struct mt76_reg_pair * data ,
197
- int len )
198
- {
199
- int i ;
200
-
201
- for (i = 0 ; i < len ; i ++ ) {
202
- mt7663s_wr (dev , data -> reg , data -> value );
203
- data ++ ;
204
- }
205
-
206
- return 0 ;
207
- }
208
-
209
- static int mt7663s_rd_rp (struct mt76_dev * dev , u32 base ,
210
- struct mt76_reg_pair * data ,
211
- int len )
212
- {
213
- int i ;
214
-
215
- for (i = 0 ; i < len ; i ++ ) {
216
- data -> value = mt7663s_rr (dev , data -> reg );
217
- data ++ ;
34
+ if (!mt76_connac_pm_ref (& dev -> mphy , & dev -> pm )) {
35
+ queue_work (mdev -> wq , & dev -> pm .wake_work );
36
+ return ;
218
37
}
219
-
220
- return 0 ;
38
+ mt76s_txrx_worker ( sdio );
39
+ mt76_connac_pm_unref ( & dev -> mphy , & dev -> pm ) ;
221
40
}
222
41
223
42
static void mt7663s_init_work (struct work_struct * work )
@@ -231,66 +50,6 @@ static void mt7663s_init_work(struct work_struct *work)
231
50
mt7615_init_work (dev );
232
51
}
233
52
234
- static int mt7663s_hw_init (struct mt7615_dev * dev , struct sdio_func * func )
235
- {
236
- u32 status , ctrl ;
237
- int ret ;
238
-
239
- sdio_claim_host (func );
240
-
241
- ret = sdio_enable_func (func );
242
- if (ret < 0 )
243
- goto release ;
244
-
245
- /* Get ownership from the device */
246
- sdio_writel (func , WHLPCR_INT_EN_CLR | WHLPCR_FW_OWN_REQ_CLR ,
247
- MCR_WHLPCR , & ret );
248
- if (ret < 0 )
249
- goto disable_func ;
250
-
251
- ret = readx_poll_timeout (mt7663s_read_pcr , dev , status ,
252
- status & WHLPCR_IS_DRIVER_OWN , 2000 , 1000000 );
253
- if (ret < 0 ) {
254
- dev_err (dev -> mt76 .dev , "Cannot get ownership from device" );
255
- goto disable_func ;
256
- }
257
-
258
- ret = sdio_set_block_size (func , 512 );
259
- if (ret < 0 )
260
- goto disable_func ;
261
-
262
- /* Enable interrupt */
263
- sdio_writel (func , WHLPCR_INT_EN_SET , MCR_WHLPCR , & ret );
264
- if (ret < 0 )
265
- goto disable_func ;
266
-
267
- ctrl = WHIER_RX0_DONE_INT_EN | WHIER_TX_DONE_INT_EN ;
268
- sdio_writel (func , ctrl , MCR_WHIER , & ret );
269
- if (ret < 0 )
270
- goto disable_func ;
271
-
272
- /* set WHISR as read clear and Rx aggregation number as 16 */
273
- ctrl = FIELD_PREP (MAX_HIF_RX_LEN_NUM , 16 );
274
- sdio_writel (func , ctrl , MCR_WHCR , & ret );
275
- if (ret < 0 )
276
- goto disable_func ;
277
-
278
- ret = sdio_claim_irq (func , mt7663s_sdio_irq );
279
- if (ret < 0 )
280
- goto disable_func ;
281
-
282
- sdio_release_host (func );
283
-
284
- return 0 ;
285
-
286
- disable_func :
287
- sdio_disable_func (func );
288
- release :
289
- sdio_release_host (func );
290
-
291
- return ret ;
292
- }
293
-
294
53
static int mt7663s_probe (struct sdio_func * func ,
295
54
const struct sdio_device_id * id )
296
55
{
@@ -307,13 +66,13 @@ static int mt7663s_probe(struct sdio_func *func,
307
66
.update_survey = mt7615_update_channel ,
308
67
};
309
68
static const struct mt76_bus_ops mt7663s_ops = {
310
- .rr = mt7663s_rr ,
311
- .rmw = mt7663s_rmw ,
312
- .wr = mt7663s_wr ,
313
- .write_copy = mt7663s_write_copy ,
314
- .read_copy = mt7663s_read_copy ,
315
- .wr_rp = mt7663s_wr_rp ,
316
- .rd_rp = mt7663s_rd_rp ,
69
+ .rr = mt76s_rr ,
70
+ .rmw = mt76s_rmw ,
71
+ .wr = mt76s_wr ,
72
+ .write_copy = mt76s_write_copy ,
73
+ .read_copy = mt76s_read_copy ,
74
+ .wr_rp = mt76s_wr_rp ,
75
+ .rd_rp = mt76s_rd_rp ,
317
76
.type = MT76_BUS_SDIO ,
318
77
};
319
78
struct ieee80211_ops * ops ;
@@ -341,7 +100,7 @@ static int mt7663s_probe(struct sdio_func *func,
341
100
if (ret < 0 )
342
101
goto error ;
343
102
344
- ret = mt7663s_hw_init ( dev , func );
103
+ ret = mt76s_hw_init ( mdev , func );
345
104
if (ret )
346
105
goto error ;
347
106
0 commit comments