xref: /linux/drivers/net/wireless/realtek/rtw89/usb.c (revision 8be4d31cb8aaeea27bde4b7ddb26e28a89062ebf)
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