1 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
2 /* Copyright(c) 2025 Realtek Corporation
3 */
4
5 #include <linux/usb.h>
6 #include "debug.h"
7 #include "mac.h"
8 #include "reg.h"
9 #include "txrx.h"
10 #include "usb.h"
11
12 static void rtw89_usb_read_port_complete(struct urb *urb);
13
rtw89_usb_vendorreq(struct rtw89_dev * rtwdev,u32 addr,void * data,u16 len,u8 reqtype)14 static void rtw89_usb_vendorreq(struct rtw89_dev *rtwdev, u32 addr,
15 void *data, u16 len, u8 reqtype)
16 {
17 struct rtw89_usb *rtwusb = rtw89_usb_priv(rtwdev);
18 struct usb_device *udev = rtwusb->udev;
19 unsigned int pipe;
20 u16 value, index;
21 int attempt, ret;
22
23 if (test_bit(RTW89_FLAG_UNPLUGGED, rtwdev->flags))
24 return;
25
26 value = u32_get_bits(addr, GENMASK(15, 0));
27 index = u32_get_bits(addr, GENMASK(23, 16));
28
29 for (attempt = 0; attempt < 10; attempt++) {
30 *rtwusb->vendor_req_buf = 0;
31
32 if (reqtype == RTW89_USB_VENQT_READ) {
33 pipe = usb_rcvctrlpipe(udev, 0);
34 } else { /* RTW89_USB_VENQT_WRITE */
35 pipe = usb_sndctrlpipe(udev, 0);
36
37 memcpy(rtwusb->vendor_req_buf, data, len);
38 }
39
40 ret = usb_control_msg(udev, pipe, RTW89_USB_VENQT, reqtype,
41 value, index, rtwusb->vendor_req_buf,
42 len, 500);
43
44 if (ret == len) { /* Success */
45 atomic_set(&rtwusb->continual_io_error, 0);
46
47 if (reqtype == RTW89_USB_VENQT_READ)
48 memcpy(data, rtwusb->vendor_req_buf, len);
49
50 break;
51 }
52
53 if (ret == -ESHUTDOWN || ret == -ENODEV)
54 set_bit(RTW89_FLAG_UNPLUGGED, rtwdev->flags);
55 else if (ret < 0)
56 rtw89_warn(rtwdev,
57 "usb %s%u 0x%x fail ret=%d value=0x%x attempt=%d\n",
58 reqtype == RTW89_USB_VENQT_READ ? "read" : "write",
59 len * 8, addr, ret,
60 le32_to_cpup(rtwusb->vendor_req_buf),
61 attempt);
62 else if (ret > 0 && reqtype == RTW89_USB_VENQT_READ)
63 memcpy(data, rtwusb->vendor_req_buf, len);
64
65 if (atomic_inc_return(&rtwusb->continual_io_error) > 4) {
66 set_bit(RTW89_FLAG_UNPLUGGED, rtwdev->flags);
67 break;
68 }
69 }
70 }
71
rtw89_usb_read_cmac(struct rtw89_dev * rtwdev,u32 addr)72 static u32 rtw89_usb_read_cmac(struct rtw89_dev *rtwdev, u32 addr)
73 {
74 u32 addr32, val32, shift;
75 __le32 data = 0;
76 int count;
77
78 addr32 = addr & ~0x3;
79 shift = (addr & 0x3) * 8;
80
81 for (count = 0; ; count++) {
82 rtw89_usb_vendorreq(rtwdev, addr32, &data, 4,
83 RTW89_USB_VENQT_READ);
84
85 val32 = le32_to_cpu(data);
86 if (val32 != RTW89_R32_DEAD)
87 break;
88
89 if (count >= MAC_REG_POOL_COUNT) {
90 rtw89_warn(rtwdev, "%s: addr %#x = %#x\n",
91 __func__, addr32, val32);
92 val32 = RTW89_R32_DEAD;
93 break;
94 }
95
96 rtw89_write32(rtwdev, R_AX_CK_EN, B_AX_CMAC_ALLCKEN);
97 }
98
99 return val32 >> shift;
100 }
101
rtw89_usb_ops_read8(struct rtw89_dev * rtwdev,u32 addr)102 static u8 rtw89_usb_ops_read8(struct rtw89_dev *rtwdev, u32 addr)
103 {
104 u8 data = 0;
105
106 if (ACCESS_CMAC(addr))
107 return rtw89_usb_read_cmac(rtwdev, addr);
108
109 rtw89_usb_vendorreq(rtwdev, addr, &data, 1, RTW89_USB_VENQT_READ);
110
111 return data;
112 }
113
rtw89_usb_ops_read16(struct rtw89_dev * rtwdev,u32 addr)114 static u16 rtw89_usb_ops_read16(struct rtw89_dev *rtwdev, u32 addr)
115 {
116 __le16 data = 0;
117
118 if (ACCESS_CMAC(addr))
119 return rtw89_usb_read_cmac(rtwdev, addr);
120
121 rtw89_usb_vendorreq(rtwdev, addr, &data, 2, RTW89_USB_VENQT_READ);
122
123 return le16_to_cpu(data);
124 }
125
rtw89_usb_ops_read32(struct rtw89_dev * rtwdev,u32 addr)126 static u32 rtw89_usb_ops_read32(struct rtw89_dev *rtwdev, u32 addr)
127 {
128 __le32 data = 0;
129
130 if (ACCESS_CMAC(addr))
131 return rtw89_usb_read_cmac(rtwdev, addr);
132
133 rtw89_usb_vendorreq(rtwdev, addr, &data, 4,
134 RTW89_USB_VENQT_READ);
135
136 return le32_to_cpu(data);
137 }
138
rtw89_usb_ops_write8(struct rtw89_dev * rtwdev,u32 addr,u8 val)139 static void rtw89_usb_ops_write8(struct rtw89_dev *rtwdev, u32 addr, u8 val)
140 {
141 u8 data = val;
142
143 rtw89_usb_vendorreq(rtwdev, addr, &data, 1, RTW89_USB_VENQT_WRITE);
144 }
145
rtw89_usb_ops_write16(struct rtw89_dev * rtwdev,u32 addr,u16 val)146 static void rtw89_usb_ops_write16(struct rtw89_dev *rtwdev, u32 addr, u16 val)
147 {
148 __le16 data = cpu_to_le16(val);
149
150 rtw89_usb_vendorreq(rtwdev, addr, &data, 2, RTW89_USB_VENQT_WRITE);
151 }
152
rtw89_usb_ops_write32(struct rtw89_dev * rtwdev,u32 addr,u32 val)153 static void rtw89_usb_ops_write32(struct rtw89_dev *rtwdev, u32 addr, u32 val)
154 {
155 __le32 data = cpu_to_le32(val);
156
157 rtw89_usb_vendorreq(rtwdev, addr, &data, 4, RTW89_USB_VENQT_WRITE);
158 }
159
160 static u32
rtw89_usb_ops_check_and_reclaim_tx_resource(struct rtw89_dev * rtwdev,u8 txch)161 rtw89_usb_ops_check_and_reclaim_tx_resource(struct rtw89_dev *rtwdev,
162 u8 txch)
163 {
164 if (txch == RTW89_TXCH_CH12)
165 return 1;
166
167 return 42; /* TODO some kind of calculation? */
168 }
169
rtw89_usb_get_bulkout_id(u8 ch_dma)170 static u8 rtw89_usb_get_bulkout_id(u8 ch_dma)
171 {
172 switch (ch_dma) {
173 case RTW89_DMA_ACH0:
174 return 3;
175 case RTW89_DMA_ACH1:
176 return 4;
177 case RTW89_DMA_ACH2:
178 return 5;
179 case RTW89_DMA_ACH3:
180 return 6;
181 default:
182 case RTW89_DMA_B0MG:
183 return 0;
184 case RTW89_DMA_B0HI:
185 return 1;
186 case RTW89_DMA_H2C:
187 return 2;
188 }
189 }
190
rtw89_usb_write_port_complete(struct urb * urb)191 static void rtw89_usb_write_port_complete(struct urb *urb)
192 {
193 struct rtw89_usb_tx_ctrl_block *txcb = urb->context;
194 struct rtw89_dev *rtwdev = txcb->rtwdev;
195 struct ieee80211_tx_info *info;
196 struct rtw89_txwd_body *txdesc;
197 struct sk_buff *skb;
198 u32 txdesc_size;
199
200 while (true) {
201 skb = skb_dequeue(&txcb->tx_ack_queue);
202 if (!skb)
203 break;
204
205 if (txcb->txch == RTW89_TXCH_CH12) {
206 dev_kfree_skb_any(skb);
207 continue;
208 }
209
210 txdesc = (struct rtw89_txwd_body *)skb->data;
211
212 txdesc_size = rtwdev->chip->txwd_body_size;
213 if (le32_get_bits(txdesc->dword0, RTW89_TXWD_BODY0_WD_INFO_EN))
214 txdesc_size += rtwdev->chip->txwd_info_size;
215
216 skb_pull(skb, txdesc_size);
217
218 info = IEEE80211_SKB_CB(skb);
219 ieee80211_tx_info_clear_status(info);
220
221 if (urb->status == 0) {
222 if (info->flags & IEEE80211_TX_CTL_NO_ACK)
223 info->flags |= IEEE80211_TX_STAT_NOACK_TRANSMITTED;
224 else
225 info->flags |= IEEE80211_TX_STAT_ACK;
226 }
227
228 ieee80211_tx_status_irqsafe(rtwdev->hw, skb);
229 }
230
231 switch (urb->status) {
232 case 0:
233 case -EPIPE:
234 case -EPROTO:
235 case -EINPROGRESS:
236 case -ENOENT:
237 case -ECONNRESET:
238 break;
239 default:
240 set_bit(RTW89_FLAG_UNPLUGGED, rtwdev->flags);
241 break;
242 }
243
244 kfree(txcb);
245 usb_free_urb(urb);
246 }
247
rtw89_usb_write_port(struct rtw89_dev * rtwdev,u8 ch_dma,void * data,int len,void * context)248 static int rtw89_usb_write_port(struct rtw89_dev *rtwdev, u8 ch_dma,
249 void *data, int len, void *context)
250 {
251 struct rtw89_usb *rtwusb = rtw89_usb_priv(rtwdev);
252 struct usb_device *usbd = rtwusb->udev;
253 struct urb *urb;
254 u8 bulkout_id = rtw89_usb_get_bulkout_id(ch_dma);
255 unsigned int pipe;
256 int ret;
257
258 if (test_bit(RTW89_FLAG_UNPLUGGED, rtwdev->flags))
259 return 0;
260
261 urb = usb_alloc_urb(0, GFP_ATOMIC);
262 if (!urb)
263 return -ENOMEM;
264
265 pipe = usb_sndbulkpipe(usbd, rtwusb->out_pipe[bulkout_id]);
266
267 usb_fill_bulk_urb(urb, usbd, pipe, data, len,
268 rtw89_usb_write_port_complete, context);
269 urb->transfer_flags |= URB_ZERO_PACKET;
270 ret = usb_submit_urb(urb, GFP_ATOMIC);
271
272 if (ret)
273 usb_free_urb(urb);
274
275 if (ret == -ENODEV)
276 set_bit(RTW89_FLAG_UNPLUGGED, rtwdev->flags);
277
278 return ret;
279 }
280
rtw89_usb_ops_tx_kick_off(struct rtw89_dev * rtwdev,u8 txch)281 static void rtw89_usb_ops_tx_kick_off(struct rtw89_dev *rtwdev, u8 txch)
282 {
283 struct rtw89_usb *rtwusb = rtw89_usb_priv(rtwdev);
284 struct rtw89_usb_tx_ctrl_block *txcb;
285 struct sk_buff *skb;
286 int ret;
287
288 while (true) {
289 skb = skb_dequeue(&rtwusb->tx_queue[txch]);
290 if (!skb)
291 break;
292
293 txcb = kmalloc(sizeof(*txcb), GFP_ATOMIC);
294 if (!txcb) {
295 dev_kfree_skb_any(skb);
296 continue;
297 }
298
299 txcb->rtwdev = rtwdev;
300 txcb->txch = txch;
301 skb_queue_head_init(&txcb->tx_ack_queue);
302
303 skb_queue_tail(&txcb->tx_ack_queue, skb);
304
305 ret = rtw89_usb_write_port(rtwdev, txch, skb->data, skb->len,
306 txcb);
307 if (ret) {
308 rtw89_err(rtwdev, "write port txch %d failed: %d\n",
309 txch, ret);
310
311 skb_dequeue(&txcb->tx_ack_queue);
312 kfree(txcb);
313 dev_kfree_skb_any(skb);
314 }
315 }
316 }
317
rtw89_usb_tx_write_fwcmd(struct rtw89_dev * rtwdev,struct rtw89_core_tx_request * tx_req)318 static int rtw89_usb_tx_write_fwcmd(struct rtw89_dev *rtwdev,
319 struct rtw89_core_tx_request *tx_req)
320 {
321 struct rtw89_tx_desc_info *desc_info = &tx_req->desc_info;
322 struct rtw89_usb *rtwusb = rtw89_usb_priv(rtwdev);
323 struct sk_buff *skb = tx_req->skb;
324 struct sk_buff *skb512;
325 u32 txdesc_size = rtwdev->chip->h2c_desc_size;
326 void *txdesc;
327
328 if (((desc_info->pkt_size + txdesc_size) % 512) == 0) {
329 rtw89_debug(rtwdev, RTW89_DBG_HCI, "avoiding multiple of 512\n");
330
331 skb512 = dev_alloc_skb(txdesc_size + desc_info->pkt_size +
332 RTW89_USB_MOD512_PADDING);
333 if (!skb512) {
334 rtw89_err(rtwdev, "%s: failed to allocate skb\n",
335 __func__);
336
337 return -ENOMEM;
338 }
339
340 skb_pull(skb512, txdesc_size);
341 skb_put_data(skb512, skb->data, skb->len);
342 skb_put_zero(skb512, RTW89_USB_MOD512_PADDING);
343
344 dev_kfree_skb_any(skb);
345 skb = skb512;
346 tx_req->skb = skb512;
347
348 desc_info->pkt_size += RTW89_USB_MOD512_PADDING;
349 }
350
351 txdesc = skb_push(skb, txdesc_size);
352 memset(txdesc, 0, txdesc_size);
353 rtw89_chip_fill_txdesc_fwcmd(rtwdev, desc_info, txdesc);
354
355 skb_queue_tail(&rtwusb->tx_queue[desc_info->ch_dma], skb);
356
357 return 0;
358 }
359
rtw89_usb_ops_tx_write(struct rtw89_dev * rtwdev,struct rtw89_core_tx_request * tx_req)360 static int rtw89_usb_ops_tx_write(struct rtw89_dev *rtwdev,
361 struct rtw89_core_tx_request *tx_req)
362 {
363 struct rtw89_tx_desc_info *desc_info = &tx_req->desc_info;
364 struct rtw89_usb *rtwusb = rtw89_usb_priv(rtwdev);
365 struct sk_buff *skb = tx_req->skb;
366 struct rtw89_txwd_body *txdesc;
367 u32 txdesc_size;
368
369 if ((desc_info->ch_dma == RTW89_TXCH_CH12 ||
370 tx_req->tx_type == RTW89_CORE_TX_TYPE_FWCMD) &&
371 (desc_info->ch_dma != RTW89_TXCH_CH12 ||
372 tx_req->tx_type != RTW89_CORE_TX_TYPE_FWCMD)) {
373 rtw89_err(rtwdev, "dma channel %d/TX type %d mismatch\n",
374 desc_info->ch_dma, tx_req->tx_type);
375 return -EINVAL;
376 }
377
378 if (desc_info->ch_dma == RTW89_TXCH_CH12)
379 return rtw89_usb_tx_write_fwcmd(rtwdev, tx_req);
380
381 txdesc_size = rtwdev->chip->txwd_body_size;
382 if (desc_info->en_wd_info)
383 txdesc_size += rtwdev->chip->txwd_info_size;
384
385 txdesc = skb_push(skb, txdesc_size);
386 memset(txdesc, 0, txdesc_size);
387 rtw89_chip_fill_txdesc(rtwdev, desc_info, txdesc);
388
389 le32p_replace_bits(&txdesc->dword0, 1, RTW89_TXWD_BODY0_STF_MODE);
390
391 skb_queue_tail(&rtwusb->tx_queue[desc_info->ch_dma], skb);
392
393 return 0;
394 }
395
rtw89_usb_rx_handler(struct work_struct * work)396 static void rtw89_usb_rx_handler(struct work_struct *work)
397 {
398 struct rtw89_usb *rtwusb = container_of(work, struct rtw89_usb, rx_work);
399 struct rtw89_dev *rtwdev = rtwusb->rtwdev;
400 struct rtw89_rx_desc_info desc_info;
401 struct sk_buff *rx_skb;
402 struct sk_buff *skb;
403 u32 pkt_offset;
404 int limit;
405
406 for (limit = 0; limit < 200; limit++) {
407 rx_skb = skb_dequeue(&rtwusb->rx_queue);
408 if (!rx_skb)
409 break;
410
411 if (skb_queue_len(&rtwusb->rx_queue) >= RTW89_USB_MAX_RXQ_LEN) {
412 rtw89_warn(rtwdev, "rx_queue overflow\n");
413 dev_kfree_skb_any(rx_skb);
414 continue;
415 }
416
417 memset(&desc_info, 0, sizeof(desc_info));
418 rtw89_chip_query_rxdesc(rtwdev, &desc_info, rx_skb->data, 0);
419
420 skb = rtw89_alloc_skb_for_rx(rtwdev, desc_info.pkt_size);
421 if (!skb) {
422 rtw89_debug(rtwdev, RTW89_DBG_HCI,
423 "failed to allocate RX skb of size %u\n",
424 desc_info.pkt_size);
425 continue;
426 }
427
428 pkt_offset = desc_info.offset + desc_info.rxd_len;
429
430 skb_put_data(skb, rx_skb->data + pkt_offset,
431 desc_info.pkt_size);
432
433 rtw89_core_rx(rtwdev, &desc_info, skb);
434
435 if (skb_queue_len(&rtwusb->rx_free_queue) >= RTW89_USB_RX_SKB_NUM)
436 dev_kfree_skb_any(rx_skb);
437 else
438 skb_queue_tail(&rtwusb->rx_free_queue, rx_skb);
439 }
440
441 if (limit == 200) {
442 rtw89_debug(rtwdev, RTW89_DBG_HCI,
443 "left %d rx skbs in the queue for later\n",
444 skb_queue_len(&rtwusb->rx_queue));
445 queue_work(rtwusb->rxwq, &rtwusb->rx_work);
446 }
447 }
448
rtw89_usb_rx_resubmit(struct rtw89_usb * rtwusb,struct rtw89_usb_rx_ctrl_block * rxcb,gfp_t gfp)449 static void rtw89_usb_rx_resubmit(struct rtw89_usb *rtwusb,
450 struct rtw89_usb_rx_ctrl_block *rxcb,
451 gfp_t gfp)
452 {
453 struct rtw89_dev *rtwdev = rtwusb->rtwdev;
454 struct sk_buff *rx_skb;
455 int ret;
456
457 rx_skb = skb_dequeue(&rtwusb->rx_free_queue);
458 if (!rx_skb)
459 rx_skb = alloc_skb(RTW89_USB_RECVBUF_SZ, gfp);
460
461 if (!rx_skb)
462 goto try_later;
463
464 skb_reset_tail_pointer(rx_skb);
465 rx_skb->len = 0;
466
467 rxcb->rx_skb = rx_skb;
468
469 usb_fill_bulk_urb(rxcb->rx_urb, rtwusb->udev,
470 usb_rcvbulkpipe(rtwusb->udev, rtwusb->in_pipe),
471 rxcb->rx_skb->data, RTW89_USB_RECVBUF_SZ,
472 rtw89_usb_read_port_complete, rxcb);
473
474 ret = usb_submit_urb(rxcb->rx_urb, gfp);
475 if (ret) {
476 skb_queue_tail(&rtwusb->rx_free_queue, rxcb->rx_skb);
477
478 if (ret == -ENODEV)
479 set_bit(RTW89_FLAG_UNPLUGGED, rtwdev->flags);
480 else
481 rtw89_err(rtwdev, "Err sending rx data urb %d\n", ret);
482
483 if (ret == -ENOMEM)
484 goto try_later;
485 }
486
487 return;
488
489 try_later:
490 rxcb->rx_skb = NULL;
491 queue_work(rtwusb->rxwq, &rtwusb->rx_urb_work);
492 }
493
rtw89_usb_rx_resubmit_work(struct work_struct * work)494 static void rtw89_usb_rx_resubmit_work(struct work_struct *work)
495 {
496 struct rtw89_usb *rtwusb = container_of(work, struct rtw89_usb, rx_urb_work);
497 struct rtw89_usb_rx_ctrl_block *rxcb;
498 int i;
499
500 for (i = 0; i < RTW89_USB_RXCB_NUM; i++) {
501 rxcb = &rtwusb->rx_cb[i];
502
503 if (!rxcb->rx_skb)
504 rtw89_usb_rx_resubmit(rtwusb, rxcb, GFP_ATOMIC);
505 }
506 }
507
rtw89_usb_read_port_complete(struct urb * urb)508 static void rtw89_usb_read_port_complete(struct urb *urb)
509 {
510 struct rtw89_usb_rx_ctrl_block *rxcb = urb->context;
511 struct rtw89_dev *rtwdev = rxcb->rtwdev;
512 struct rtw89_usb *rtwusb = rtw89_usb_priv(rtwdev);
513 struct sk_buff *skb = rxcb->rx_skb;
514
515 if (urb->status == 0) {
516 if (urb->actual_length > urb->transfer_buffer_length ||
517 urb->actual_length < sizeof(struct rtw89_rxdesc_short)) {
518 rtw89_err(rtwdev, "failed to get urb length: %d\n",
519 urb->actual_length);
520 skb_queue_tail(&rtwusb->rx_free_queue, skb);
521 } else {
522 skb_put(skb, urb->actual_length);
523 skb_queue_tail(&rtwusb->rx_queue, skb);
524 queue_work(rtwusb->rxwq, &rtwusb->rx_work);
525 }
526
527 rtw89_usb_rx_resubmit(rtwusb, rxcb, GFP_ATOMIC);
528 } else {
529 skb_queue_tail(&rtwusb->rx_free_queue, skb);
530
531 if (atomic_inc_return(&rtwusb->continual_io_error) > 4)
532 set_bit(RTW89_FLAG_UNPLUGGED, rtwdev->flags);
533
534 switch (urb->status) {
535 case -EINVAL:
536 case -EPIPE:
537 case -ENODEV:
538 case -ESHUTDOWN:
539 set_bit(RTW89_FLAG_UNPLUGGED, rtwdev->flags);
540 break;
541 case -EPROTO:
542 case -EILSEQ:
543 case -ETIME:
544 case -ECOMM:
545 case -EOVERFLOW:
546 case -ENOENT:
547 break;
548 case -EINPROGRESS:
549 rtw89_info(rtwdev, "URB is in progress\n");
550 break;
551 default:
552 rtw89_err(rtwdev, "%s status %d\n",
553 __func__, urb->status);
554 break;
555 }
556 }
557 }
558
rtw89_usb_cancel_rx_bufs(struct rtw89_usb * rtwusb)559 static void rtw89_usb_cancel_rx_bufs(struct rtw89_usb *rtwusb)
560 {
561 struct rtw89_usb_rx_ctrl_block *rxcb;
562 int i;
563
564 for (i = 0; i < RTW89_USB_RXCB_NUM; i++) {
565 rxcb = &rtwusb->rx_cb[i];
566 usb_kill_urb(rxcb->rx_urb);
567 }
568 }
569
rtw89_usb_free_rx_bufs(struct rtw89_usb * rtwusb)570 static void rtw89_usb_free_rx_bufs(struct rtw89_usb *rtwusb)
571 {
572 struct rtw89_usb_rx_ctrl_block *rxcb;
573 int i;
574
575 for (i = 0; i < RTW89_USB_RXCB_NUM; i++) {
576 rxcb = &rtwusb->rx_cb[i];
577 usb_free_urb(rxcb->rx_urb);
578 }
579 }
580
rtw89_usb_alloc_rx_bufs(struct rtw89_usb * rtwusb)581 static int rtw89_usb_alloc_rx_bufs(struct rtw89_usb *rtwusb)
582 {
583 struct rtw89_usb_rx_ctrl_block *rxcb;
584 int i;
585
586 for (i = 0; i < RTW89_USB_RXCB_NUM; i++) {
587 rxcb = &rtwusb->rx_cb[i];
588
589 rxcb->rtwdev = rtwusb->rtwdev;
590 rxcb->rx_urb = usb_alloc_urb(0, GFP_KERNEL);
591 if (!rxcb->rx_urb) {
592 rtw89_usb_free_rx_bufs(rtwusb);
593 return -ENOMEM;
594 }
595 }
596
597 return 0;
598 }
599
rtw89_usb_init_rx(struct rtw89_dev * rtwdev)600 static int rtw89_usb_init_rx(struct rtw89_dev *rtwdev)
601 {
602 struct rtw89_usb *rtwusb = rtw89_usb_priv(rtwdev);
603 struct sk_buff *rx_skb;
604 int i;
605
606 rtwusb->rxwq = alloc_workqueue("rtw89_usb: rx wq", WQ_BH, 0);
607 if (!rtwusb->rxwq) {
608 rtw89_err(rtwdev, "failed to create RX work queue\n");
609 return -ENOMEM;
610 }
611
612 skb_queue_head_init(&rtwusb->rx_queue);
613 skb_queue_head_init(&rtwusb->rx_free_queue);
614
615 INIT_WORK(&rtwusb->rx_work, rtw89_usb_rx_handler);
616 INIT_WORK(&rtwusb->rx_urb_work, rtw89_usb_rx_resubmit_work);
617
618 for (i = 0; i < RTW89_USB_RX_SKB_NUM; i++) {
619 rx_skb = alloc_skb(RTW89_USB_RECVBUF_SZ, GFP_KERNEL);
620 if (rx_skb)
621 skb_queue_tail(&rtwusb->rx_free_queue, rx_skb);
622 }
623
624 return 0;
625 }
626
rtw89_usb_deinit_rx(struct rtw89_dev * rtwdev)627 static void rtw89_usb_deinit_rx(struct rtw89_dev *rtwdev)
628 {
629 struct rtw89_usb *rtwusb = rtw89_usb_priv(rtwdev);
630
631 skb_queue_purge(&rtwusb->rx_queue);
632
633 destroy_workqueue(rtwusb->rxwq);
634
635 skb_queue_purge(&rtwusb->rx_free_queue);
636 }
637
rtw89_usb_start_rx(struct rtw89_dev * rtwdev)638 static void rtw89_usb_start_rx(struct rtw89_dev *rtwdev)
639 {
640 struct rtw89_usb *rtwusb = rtw89_usb_priv(rtwdev);
641 int i;
642
643 for (i = 0; i < RTW89_USB_RXCB_NUM; i++)
644 rtw89_usb_rx_resubmit(rtwusb, &rtwusb->rx_cb[i], GFP_KERNEL);
645 }
646
rtw89_usb_init_tx(struct rtw89_dev * rtwdev)647 static void rtw89_usb_init_tx(struct rtw89_dev *rtwdev)
648 {
649 struct rtw89_usb *rtwusb = rtw89_usb_priv(rtwdev);
650 int i;
651
652 for (i = 0; i < ARRAY_SIZE(rtwusb->tx_queue); i++)
653 skb_queue_head_init(&rtwusb->tx_queue[i]);
654 }
655
rtw89_usb_deinit_tx(struct rtw89_dev * rtwdev)656 static void rtw89_usb_deinit_tx(struct rtw89_dev *rtwdev)
657 {
658 struct rtw89_usb *rtwusb = rtw89_usb_priv(rtwdev);
659 int i;
660
661 for (i = 0; i < ARRAY_SIZE(rtwusb->tx_queue); i++) {
662 if (i == RTW89_TXCH_CH12)
663 skb_queue_purge(&rtwusb->tx_queue[i]);
664 else
665 ieee80211_purge_tx_queue(rtwdev->hw, &rtwusb->tx_queue[i]);
666 }
667 }
668
rtw89_usb_ops_reset(struct rtw89_dev * rtwdev)669 static void rtw89_usb_ops_reset(struct rtw89_dev *rtwdev)
670 {
671 /* TODO: anything to do here? */
672 }
673
rtw89_usb_ops_start(struct rtw89_dev * rtwdev)674 static int rtw89_usb_ops_start(struct rtw89_dev *rtwdev)
675 {
676 return 0; /* Nothing to do. */
677 }
678
rtw89_usb_ops_stop(struct rtw89_dev * rtwdev)679 static void rtw89_usb_ops_stop(struct rtw89_dev *rtwdev)
680 {
681 /* Nothing to do. */
682 }
683
rtw89_usb_ops_pause(struct rtw89_dev * rtwdev,bool pause)684 static void rtw89_usb_ops_pause(struct rtw89_dev *rtwdev, bool pause)
685 {
686 /* Nothing to do? */
687 }
688
rtw89_usb_ops_switch_mode(struct rtw89_dev * rtwdev,bool low_power)689 static void rtw89_usb_ops_switch_mode(struct rtw89_dev *rtwdev, bool low_power)
690 {
691 /* Nothing to do. */
692 }
693
rtw89_usb_ops_deinit(struct rtw89_dev * rtwdev)694 static int rtw89_usb_ops_deinit(struct rtw89_dev *rtwdev)
695 {
696 return 0; /* Nothing to do. */
697 }
698
rtw89_usb_ops_mac_pre_init(struct rtw89_dev * rtwdev)699 static int rtw89_usb_ops_mac_pre_init(struct rtw89_dev *rtwdev)
700 {
701 u32 val32;
702
703 rtw89_write32_set(rtwdev, R_AX_USB_HOST_REQUEST_2, B_AX_R_USBIO_MODE);
704
705 /* fix USB IO hang suggest by chihhanli@realtek.com */
706 rtw89_write32_clr(rtwdev, R_AX_USB_WLAN0_1,
707 B_AX_USBRX_RST | B_AX_USBTX_RST);
708
709 val32 = rtw89_read32(rtwdev, R_AX_HCI_FUNC_EN);
710 val32 &= ~(B_AX_HCI_RXDMA_EN | B_AX_HCI_TXDMA_EN);
711 rtw89_write32(rtwdev, R_AX_HCI_FUNC_EN, val32);
712
713 val32 |= B_AX_HCI_RXDMA_EN | B_AX_HCI_TXDMA_EN;
714 rtw89_write32(rtwdev, R_AX_HCI_FUNC_EN, val32);
715 /* fix USB TRX hang suggest by chihhanli@realtek.com */
716
717 return 0;
718 }
719
rtw89_usb_ops_mac_pre_deinit(struct rtw89_dev * rtwdev)720 static int rtw89_usb_ops_mac_pre_deinit(struct rtw89_dev *rtwdev)
721 {
722 return 0; /* Nothing to do. */
723 }
724
rtw89_usb_ops_mac_post_init(struct rtw89_dev * rtwdev)725 static int rtw89_usb_ops_mac_post_init(struct rtw89_dev *rtwdev)
726 {
727 struct rtw89_usb *rtwusb = rtw89_usb_priv(rtwdev);
728 enum usb_device_speed speed;
729 u32 ep;
730
731 rtw89_write32_clr(rtwdev, R_AX_USB3_MAC_NPI_CONFIG_INTF_0,
732 B_AX_SSPHY_LFPS_FILTER);
733
734 speed = rtwusb->udev->speed;
735
736 if (speed == USB_SPEED_SUPER)
737 rtw89_write8(rtwdev, R_AX_RXDMA_SETTING, USB3_BULKSIZE);
738 else if (speed == USB_SPEED_HIGH)
739 rtw89_write8(rtwdev, R_AX_RXDMA_SETTING, USB2_BULKSIZE);
740 else
741 rtw89_write8(rtwdev, R_AX_RXDMA_SETTING, USB11_BULKSIZE);
742
743 for (ep = 5; ep <= 12; ep++) {
744 if (ep == 8)
745 continue;
746
747 rtw89_write8_mask(rtwdev, R_AX_USB_ENDPOINT_0,
748 B_AX_EP_IDX, ep);
749 rtw89_write8(rtwdev, R_AX_USB_ENDPOINT_2 + 1, NUMP);
750 }
751
752 return 0;
753 }
754
rtw89_usb_ops_recalc_int_mit(struct rtw89_dev * rtwdev)755 static void rtw89_usb_ops_recalc_int_mit(struct rtw89_dev *rtwdev)
756 {
757 /* Nothing to do. */
758 }
759
rtw89_usb_ops_mac_lv1_rcvy(struct rtw89_dev * rtwdev,enum rtw89_lv1_rcvy_step step)760 static int rtw89_usb_ops_mac_lv1_rcvy(struct rtw89_dev *rtwdev,
761 enum rtw89_lv1_rcvy_step step)
762 {
763 u32 reg, mask;
764
765 switch (rtwdev->chip->chip_id) {
766 case RTL8851B:
767 case RTL8852A:
768 case RTL8852B:
769 reg = R_AX_USB_WLAN0_1;
770 mask = B_AX_USBRX_RST | B_AX_USBTX_RST;
771 break;
772 case RTL8852C:
773 reg = R_AX_USB_WLAN0_1_V1;
774 mask = B_AX_USBRX_RST_V1 | B_AX_USBTX_RST_V1;
775 break;
776 default:
777 rtw89_err(rtwdev, "%s: fix me\n", __func__);
778 return -EOPNOTSUPP;
779 }
780
781 switch (step) {
782 case RTW89_LV1_RCVY_STEP_1:
783 rtw89_write32_set(rtwdev, reg, mask);
784
785 msleep(30);
786 break;
787 case RTW89_LV1_RCVY_STEP_2:
788 rtw89_write32_clr(rtwdev, reg, mask);
789 break;
790 default:
791 return -EINVAL;
792 }
793
794 return 0;
795 }
796
rtw89_usb_ops_dump_err_status(struct rtw89_dev * rtwdev)797 static void rtw89_usb_ops_dump_err_status(struct rtw89_dev *rtwdev)
798 {
799 rtw89_warn(rtwdev, "%s TODO\n", __func__);
800 }
801
802 static const struct rtw89_hci_ops rtw89_usb_ops = {
803 .tx_write = rtw89_usb_ops_tx_write,
804 .tx_kick_off = rtw89_usb_ops_tx_kick_off,
805 .flush_queues = NULL, /* Not needed? */
806 .reset = rtw89_usb_ops_reset,
807 .start = rtw89_usb_ops_start,
808 .stop = rtw89_usb_ops_stop,
809 .pause = rtw89_usb_ops_pause,
810 .switch_mode = rtw89_usb_ops_switch_mode,
811 .recalc_int_mit = rtw89_usb_ops_recalc_int_mit,
812
813 .read8 = rtw89_usb_ops_read8,
814 .read16 = rtw89_usb_ops_read16,
815 .read32 = rtw89_usb_ops_read32,
816 .write8 = rtw89_usb_ops_write8,
817 .write16 = rtw89_usb_ops_write16,
818 .write32 = rtw89_usb_ops_write32,
819
820 .mac_pre_init = rtw89_usb_ops_mac_pre_init,
821 .mac_pre_deinit = rtw89_usb_ops_mac_pre_deinit,
822 .mac_post_init = rtw89_usb_ops_mac_post_init,
823 .deinit = rtw89_usb_ops_deinit,
824
825 .check_and_reclaim_tx_resource = rtw89_usb_ops_check_and_reclaim_tx_resource,
826 .mac_lv1_rcvy = rtw89_usb_ops_mac_lv1_rcvy,
827 .dump_err_status = rtw89_usb_ops_dump_err_status,
828 .napi_poll = NULL,
829
830 .recovery_start = NULL,
831 .recovery_complete = NULL,
832
833 .ctrl_txdma_ch = NULL,
834 .ctrl_txdma_fw_ch = NULL,
835 .ctrl_trxhci = NULL,
836 .poll_txdma_ch_idle = NULL,
837
838 .clr_idx_all = NULL,
839 .clear = NULL,
840 .disable_intr = NULL,
841 .enable_intr = NULL,
842 .rst_bdram = NULL,
843 };
844
rtw89_usb_parse(struct rtw89_dev * rtwdev,struct usb_interface * intf)845 static int rtw89_usb_parse(struct rtw89_dev *rtwdev,
846 struct usb_interface *intf)
847 {
848 struct usb_host_interface *host_interface = &intf->altsetting[0];
849 struct usb_interface_descriptor *intf_desc = &host_interface->desc;
850 struct rtw89_usb *rtwusb = rtw89_usb_priv(rtwdev);
851 struct usb_endpoint_descriptor *endpoint;
852 int num_out_pipes = 0;
853 u8 num;
854 int i;
855
856 if (intf_desc->bNumEndpoints > RTW89_MAX_ENDPOINT_NUM) {
857 rtw89_err(rtwdev, "found %d endpoints, expected %d max\n",
858 intf_desc->bNumEndpoints, RTW89_MAX_ENDPOINT_NUM);
859 return -EINVAL;
860 }
861
862 for (i = 0; i < intf_desc->bNumEndpoints; i++) {
863 endpoint = &host_interface->endpoint[i].desc;
864 num = usb_endpoint_num(endpoint);
865
866 if (usb_endpoint_dir_in(endpoint) &&
867 usb_endpoint_xfer_bulk(endpoint)) {
868 if (rtwusb->in_pipe) {
869 rtw89_err(rtwdev,
870 "found more than 1 bulk in endpoint\n");
871 return -EINVAL;
872 }
873
874 rtwusb->in_pipe = num;
875 }
876
877 if (usb_endpoint_dir_out(endpoint) &&
878 usb_endpoint_xfer_bulk(endpoint)) {
879 if (num_out_pipes >= RTW89_MAX_BULKOUT_NUM) {
880 rtw89_err(rtwdev,
881 "found more than %d bulk out endpoints\n",
882 RTW89_MAX_BULKOUT_NUM);
883 return -EINVAL;
884 }
885
886 rtwusb->out_pipe[num_out_pipes++] = num;
887 }
888 }
889
890 if (num_out_pipes < 1) {
891 rtw89_err(rtwdev, "no bulk out endpoints found\n");
892 return -EINVAL;
893 }
894
895 return 0;
896 }
897
rtw89_usb_intf_init(struct rtw89_dev * rtwdev,struct usb_interface * intf)898 static int rtw89_usb_intf_init(struct rtw89_dev *rtwdev,
899 struct usb_interface *intf)
900 {
901 struct rtw89_usb *rtwusb = rtw89_usb_priv(rtwdev);
902 int ret;
903
904 ret = rtw89_usb_parse(rtwdev, intf);
905 if (ret)
906 return ret;
907
908 rtwusb->vendor_req_buf = kmalloc(sizeof(*rtwusb->vendor_req_buf),
909 GFP_KERNEL);
910 if (!rtwusb->vendor_req_buf)
911 return -ENOMEM;
912
913 rtwusb->udev = usb_get_dev(interface_to_usbdev(intf));
914
915 usb_set_intfdata(intf, rtwdev->hw);
916
917 SET_IEEE80211_DEV(rtwdev->hw, &intf->dev);
918
919 return 0;
920 }
921
rtw89_usb_intf_deinit(struct rtw89_dev * rtwdev,struct usb_interface * intf)922 static void rtw89_usb_intf_deinit(struct rtw89_dev *rtwdev,
923 struct usb_interface *intf)
924 {
925 struct rtw89_usb *rtwusb = rtw89_usb_priv(rtwdev);
926
927 usb_put_dev(rtwusb->udev);
928 kfree(rtwusb->vendor_req_buf);
929 usb_set_intfdata(intf, NULL);
930 }
931
rtw89_usb_probe(struct usb_interface * intf,const struct usb_device_id * id)932 int rtw89_usb_probe(struct usb_interface *intf,
933 const struct usb_device_id *id)
934 {
935 const struct rtw89_driver_info *info;
936 struct rtw89_dev *rtwdev;
937 struct rtw89_usb *rtwusb;
938 int ret;
939
940 info = (const struct rtw89_driver_info *)id->driver_info;
941
942 rtwdev = rtw89_alloc_ieee80211_hw(&intf->dev,
943 sizeof(struct rtw89_usb),
944 info->chip, info->variant);
945 if (!rtwdev) {
946 dev_err(&intf->dev, "failed to allocate hw\n");
947 return -ENOMEM;
948 }
949
950 rtwusb = rtw89_usb_priv(rtwdev);
951 rtwusb->rtwdev = rtwdev;
952
953 rtwdev->hci.ops = &rtw89_usb_ops;
954 rtwdev->hci.type = RTW89_HCI_TYPE_USB;
955
956 ret = rtw89_usb_intf_init(rtwdev, intf);
957 if (ret) {
958 rtw89_err(rtwdev, "failed to initialise intf: %d\n", ret);
959 goto err_free_hw;
960 }
961
962 if (rtwusb->udev->speed == USB_SPEED_SUPER)
963 rtwdev->hci.dle_type = RTW89_HCI_DLE_TYPE_USB3;
964 else
965 rtwdev->hci.dle_type = RTW89_HCI_DLE_TYPE_USB2;
966
967 rtw89_usb_init_tx(rtwdev);
968
969 ret = rtw89_usb_alloc_rx_bufs(rtwusb);
970 if (ret)
971 goto err_intf_deinit;
972
973 ret = rtw89_usb_init_rx(rtwdev);
974 if (ret)
975 goto err_free_rx_bufs;
976
977 ret = rtw89_core_init(rtwdev);
978 if (ret) {
979 rtw89_err(rtwdev, "failed to initialise core: %d\n", ret);
980 goto err_deinit_rx;
981 }
982
983 ret = rtw89_chip_info_setup(rtwdev);
984 if (ret) {
985 rtw89_err(rtwdev, "failed to setup chip information\n");
986 goto err_core_deinit;
987 }
988
989 ret = rtw89_core_register(rtwdev);
990 if (ret) {
991 rtw89_err(rtwdev, "failed to register core\n");
992 goto err_core_deinit;
993 }
994
995 rtw89_usb_start_rx(rtwdev);
996
997 set_bit(RTW89_FLAG_PROBE_DONE, rtwdev->flags);
998
999 return 0;
1000
1001 err_core_deinit:
1002 rtw89_core_deinit(rtwdev);
1003 err_deinit_rx:
1004 rtw89_usb_deinit_rx(rtwdev);
1005 err_free_rx_bufs:
1006 rtw89_usb_free_rx_bufs(rtwusb);
1007 err_intf_deinit:
1008 rtw89_usb_intf_deinit(rtwdev, intf);
1009 err_free_hw:
1010 rtw89_free_ieee80211_hw(rtwdev);
1011
1012 return ret;
1013 }
1014 EXPORT_SYMBOL(rtw89_usb_probe);
1015
rtw89_usb_disconnect(struct usb_interface * intf)1016 void rtw89_usb_disconnect(struct usb_interface *intf)
1017 {
1018 struct ieee80211_hw *hw = usb_get_intfdata(intf);
1019 struct rtw89_dev *rtwdev;
1020 struct rtw89_usb *rtwusb;
1021
1022 if (!hw)
1023 return;
1024
1025 rtwdev = hw->priv;
1026 rtwusb = rtw89_usb_priv(rtwdev);
1027
1028 rtw89_usb_cancel_rx_bufs(rtwusb);
1029
1030 rtw89_core_unregister(rtwdev);
1031 rtw89_core_deinit(rtwdev);
1032 rtw89_usb_deinit_rx(rtwdev);
1033 rtw89_usb_free_rx_bufs(rtwusb);
1034 rtw89_usb_deinit_tx(rtwdev);
1035 rtw89_usb_intf_deinit(rtwdev, intf);
1036 rtw89_free_ieee80211_hw(rtwdev);
1037 }
1038 EXPORT_SYMBOL(rtw89_usb_disconnect);
1039
1040 MODULE_AUTHOR("Bitterblue Smith <rtl8821cerfe2@gmail.com>");
1041 MODULE_DESCRIPTION("Realtek USB 802.11ax wireless driver");
1042 MODULE_LICENSE("Dual BSD/GPL");
1043