• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
2 /* Copyright(c) 2018-2019  Realtek Corporation
3  */
4 
5 #include <linux/module.h>
6 #include <linux/usb.h>
7 #include <linux/mutex.h>
8 #include "main.h"
9 #include "debug.h"
10 #include "reg.h"
11 #include "tx.h"
12 #include "rx.h"
13 #include "fw.h"
14 #include "ps.h"
15 #include "usb.h"
16 
17 static bool rtw_switch_usb_mode = true;
18 module_param_named(switch_usb_mode, rtw_switch_usb_mode, bool, 0644);
19 MODULE_PARM_DESC(switch_usb_mode,
20 		 "Set to N to disable switching to USB 3 mode to avoid potential interference in the 2.4 GHz band (default: Y)");
21 
22 #define RTW_USB_MAX_RXQ_LEN	512
23 
24 struct rtw_usb_txcb {
25 	struct rtw_dev *rtwdev;
26 	struct sk_buff_head tx_ack_queue;
27 };
28 
rtw_usb_fill_tx_checksum(struct rtw_usb * rtwusb,struct sk_buff * skb,int agg_num)29 static void rtw_usb_fill_tx_checksum(struct rtw_usb *rtwusb,
30 				     struct sk_buff *skb, int agg_num)
31 {
32 	struct rtw_tx_desc *tx_desc = (struct rtw_tx_desc *)skb->data;
33 	struct rtw_dev *rtwdev = rtwusb->rtwdev;
34 	struct rtw_tx_pkt_info pkt_info;
35 
36 	le32p_replace_bits(&tx_desc->w7, agg_num, RTW_TX_DESC_W7_DMA_TXAGG_NUM);
37 	pkt_info.pkt_offset = le32_get_bits(tx_desc->w1, RTW_TX_DESC_W1_PKT_OFFSET);
38 	rtw_tx_fill_txdesc_checksum(rtwdev, &pkt_info, skb->data);
39 }
40 
rtw_usb_reg_sec(struct rtw_dev * rtwdev,u32 addr,__le32 * data)41 static void rtw_usb_reg_sec(struct rtw_dev *rtwdev, u32 addr, __le32 *data)
42 {
43 	struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev);
44 	struct usb_device *udev = rtwusb->udev;
45 	bool reg_on_section = false;
46 	u16 t_reg = 0x4e0;
47 	u8 t_len = 1;
48 	int status;
49 
50 	/* There are three sections:
51 	 * 1. on (0x00~0xFF; 0x1000~0x10FF): this section is always powered on
52 	 * 2. off (< 0xFE00, excluding "on" section): this section could be
53 	 *    powered off
54 	 * 3. local (>= 0xFE00): usb specific registers section
55 	 */
56 	if (addr <= 0xff || (addr >= 0x1000 && addr <= 0x10ff))
57 		reg_on_section = true;
58 
59 	if (!reg_on_section)
60 		return;
61 
62 	status = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
63 				 RTW_USB_CMD_REQ, RTW_USB_CMD_WRITE,
64 				 t_reg, 0, data, t_len, 500);
65 
66 	if (status != t_len && status != -ENODEV)
67 		rtw_err(rtwdev, "%s: reg 0x%x, usb write %u fail, status: %d\n",
68 			__func__, t_reg, t_len, status);
69 }
70 
rtw_usb_read(struct rtw_dev * rtwdev,u32 addr,u16 len)71 static u32 rtw_usb_read(struct rtw_dev *rtwdev, u32 addr, u16 len)
72 {
73 	struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev);
74 	struct usb_device *udev = rtwusb->udev;
75 	__le32 *data;
76 	unsigned long flags;
77 	int idx, ret;
78 	static int count;
79 
80 	spin_lock_irqsave(&rtwusb->usb_lock, flags);
81 
82 	idx = rtwusb->usb_data_index;
83 	rtwusb->usb_data_index = (idx + 1) & (RTW_USB_MAX_RXTX_COUNT - 1);
84 
85 	spin_unlock_irqrestore(&rtwusb->usb_lock, flags);
86 
87 	data = &rtwusb->usb_data[idx];
88 
89 	ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
90 			      RTW_USB_CMD_REQ, RTW_USB_CMD_READ, addr,
91 			      RTW_USB_VENQT_CMD_IDX, data, len, 1000);
92 	if (ret < 0 && ret != -ENODEV && count++ < 4)
93 		rtw_err(rtwdev, "read register 0x%x failed with %d\n",
94 			addr, ret);
95 
96 	if (rtwdev->chip->id == RTW_CHIP_TYPE_8822C ||
97 	    rtwdev->chip->id == RTW_CHIP_TYPE_8822B ||
98 	    rtwdev->chip->id == RTW_CHIP_TYPE_8821C)
99 		rtw_usb_reg_sec(rtwdev, addr, data);
100 
101 	return le32_to_cpu(*data);
102 }
103 
rtw_usb_read8(struct rtw_dev * rtwdev,u32 addr)104 static u8 rtw_usb_read8(struct rtw_dev *rtwdev, u32 addr)
105 {
106 	return (u8)rtw_usb_read(rtwdev, addr, 1);
107 }
108 
rtw_usb_read16(struct rtw_dev * rtwdev,u32 addr)109 static u16 rtw_usb_read16(struct rtw_dev *rtwdev, u32 addr)
110 {
111 	return (u16)rtw_usb_read(rtwdev, addr, 2);
112 }
113 
rtw_usb_read32(struct rtw_dev * rtwdev,u32 addr)114 static u32 rtw_usb_read32(struct rtw_dev *rtwdev, u32 addr)
115 {
116 	return (u32)rtw_usb_read(rtwdev, addr, 4);
117 }
118 
rtw_usb_write(struct rtw_dev * rtwdev,u32 addr,u32 val,int len)119 static void rtw_usb_write(struct rtw_dev *rtwdev, u32 addr, u32 val, int len)
120 {
121 	struct rtw_usb *rtwusb = (struct rtw_usb *)rtwdev->priv;
122 	struct usb_device *udev = rtwusb->udev;
123 	unsigned long flags;
124 	__le32 *data;
125 	int idx, ret;
126 	static int count;
127 
128 	spin_lock_irqsave(&rtwusb->usb_lock, flags);
129 
130 	idx = rtwusb->usb_data_index;
131 	rtwusb->usb_data_index = (idx + 1) & (RTW_USB_MAX_RXTX_COUNT - 1);
132 
133 	spin_unlock_irqrestore(&rtwusb->usb_lock, flags);
134 
135 	data = &rtwusb->usb_data[idx];
136 
137 	*data = cpu_to_le32(val);
138 
139 	ret = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
140 			      RTW_USB_CMD_REQ, RTW_USB_CMD_WRITE,
141 			      addr, 0, data, len, 500);
142 	if (ret < 0 && ret != -ENODEV && count++ < 4)
143 		rtw_err(rtwdev, "write register 0x%x failed with %d\n",
144 			addr, ret);
145 
146 	if (rtwdev->chip->id == RTW_CHIP_TYPE_8822C ||
147 	    rtwdev->chip->id == RTW_CHIP_TYPE_8822B ||
148 	    rtwdev->chip->id == RTW_CHIP_TYPE_8821C)
149 		rtw_usb_reg_sec(rtwdev, addr, data);
150 }
151 
rtw_usb_write8(struct rtw_dev * rtwdev,u32 addr,u8 val)152 static void rtw_usb_write8(struct rtw_dev *rtwdev, u32 addr, u8 val)
153 {
154 	rtw_usb_write(rtwdev, addr, val, 1);
155 }
156 
rtw_usb_write16(struct rtw_dev * rtwdev,u32 addr,u16 val)157 static void rtw_usb_write16(struct rtw_dev *rtwdev, u32 addr, u16 val)
158 {
159 	rtw_usb_write(rtwdev, addr, val, 2);
160 }
161 
rtw_usb_write32(struct rtw_dev * rtwdev,u32 addr,u32 val)162 static void rtw_usb_write32(struct rtw_dev *rtwdev, u32 addr, u32 val)
163 {
164 	rtw_usb_write(rtwdev, addr, val, 4);
165 }
166 
rtw_usb_write_firmware_page(struct rtw_dev * rtwdev,u32 page,const u8 * data,u32 size)167 static void rtw_usb_write_firmware_page(struct rtw_dev *rtwdev, u32 page,
168 					const u8 *data, u32 size)
169 {
170 	struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev);
171 	struct usb_device *udev = rtwusb->udev;
172 	u32 addr = FW_START_ADDR_LEGACY;
173 	u8 *data_dup, *buf;
174 	u32 n, block_size;
175 	int ret;
176 
177 	switch (rtwdev->chip->id) {
178 	case RTW_CHIP_TYPE_8723D:
179 		block_size = 254;
180 		break;
181 	default:
182 		block_size = 196;
183 		break;
184 	}
185 
186 	data_dup = kmemdup(data, size, GFP_KERNEL);
187 	if (!data_dup)
188 		return;
189 
190 	buf = data_dup;
191 
192 	rtw_write32_mask(rtwdev, REG_MCUFW_CTRL, BIT_ROM_PGE, page);
193 
194 	while (size > 0) {
195 		if (size >= block_size)
196 			n = block_size;
197 		else if (size >= 8)
198 			n = 8;
199 		else
200 			n = 1;
201 
202 		ret = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
203 				      RTW_USB_CMD_REQ, RTW_USB_CMD_WRITE,
204 				      addr, 0, buf, n, 500);
205 		if (ret != n) {
206 			if (ret != -ENODEV)
207 				rtw_err(rtwdev,
208 					"write 0x%x len %d failed: %d\n",
209 					addr, n, ret);
210 			break;
211 		}
212 
213 		addr += n;
214 		buf += n;
215 		size -= n;
216 	}
217 
218 	kfree(data_dup);
219 }
220 
dma_mapping_to_ep(enum rtw_dma_mapping dma_mapping)221 static int dma_mapping_to_ep(enum rtw_dma_mapping dma_mapping)
222 {
223 	switch (dma_mapping) {
224 	case RTW_DMA_MAPPING_HIGH:
225 		return 0;
226 	case RTW_DMA_MAPPING_NORMAL:
227 		return 1;
228 	case RTW_DMA_MAPPING_LOW:
229 		return 2;
230 	case RTW_DMA_MAPPING_EXTRA:
231 		return 3;
232 	default:
233 		return -EINVAL;
234 	}
235 }
236 
rtw_usb_parse(struct rtw_dev * rtwdev,struct usb_interface * interface)237 static int rtw_usb_parse(struct rtw_dev *rtwdev,
238 			 struct usb_interface *interface)
239 {
240 	struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev);
241 	struct usb_host_interface *host_interface = &interface->altsetting[0];
242 	struct usb_interface_descriptor *interface_desc = &host_interface->desc;
243 	struct usb_endpoint_descriptor *endpoint;
244 	int num_out_pipes = 0;
245 	int i;
246 	u8 num;
247 	const struct rtw_chip_info *chip = rtwdev->chip;
248 	const struct rtw_rqpn *rqpn;
249 
250 	for (i = 0; i < interface_desc->bNumEndpoints; i++) {
251 		endpoint = &host_interface->endpoint[i].desc;
252 		num = usb_endpoint_num(endpoint);
253 
254 		if (usb_endpoint_dir_in(endpoint) &&
255 		    usb_endpoint_xfer_bulk(endpoint)) {
256 			if (rtwusb->pipe_in) {
257 				rtw_err(rtwdev, "IN pipes overflow\n");
258 				return -EINVAL;
259 			}
260 
261 			rtwusb->pipe_in = num;
262 		}
263 
264 		if (usb_endpoint_dir_in(endpoint) &&
265 		    usb_endpoint_xfer_int(endpoint)) {
266 			if (rtwusb->pipe_interrupt) {
267 				rtw_err(rtwdev, "INT pipes overflow\n");
268 				return -EINVAL;
269 			}
270 
271 			rtwusb->pipe_interrupt = num;
272 		}
273 
274 		if (usb_endpoint_dir_out(endpoint) &&
275 		    usb_endpoint_xfer_bulk(endpoint)) {
276 			if (num_out_pipes >= ARRAY_SIZE(rtwusb->out_ep)) {
277 				rtw_err(rtwdev, "OUT pipes overflow\n");
278 				return -EINVAL;
279 			}
280 
281 			rtwusb->out_ep[num_out_pipes++] = num;
282 		}
283 	}
284 
285 	rtwdev->hci.bulkout_num = num_out_pipes;
286 
287 	if (num_out_pipes < 1 || num_out_pipes > 4) {
288 		rtw_err(rtwdev, "invalid number of endpoints %d\n", num_out_pipes);
289 		return -EINVAL;
290 	}
291 
292 	rqpn = &chip->rqpn_table[num_out_pipes];
293 
294 	rtwusb->qsel_to_ep[TX_DESC_QSEL_TID0] = dma_mapping_to_ep(rqpn->dma_map_be);
295 	rtwusb->qsel_to_ep[TX_DESC_QSEL_TID1] = dma_mapping_to_ep(rqpn->dma_map_bk);
296 	rtwusb->qsel_to_ep[TX_DESC_QSEL_TID2] = dma_mapping_to_ep(rqpn->dma_map_bk);
297 	rtwusb->qsel_to_ep[TX_DESC_QSEL_TID3] = dma_mapping_to_ep(rqpn->dma_map_be);
298 	rtwusb->qsel_to_ep[TX_DESC_QSEL_TID4] = dma_mapping_to_ep(rqpn->dma_map_vi);
299 	rtwusb->qsel_to_ep[TX_DESC_QSEL_TID5] = dma_mapping_to_ep(rqpn->dma_map_vi);
300 	rtwusb->qsel_to_ep[TX_DESC_QSEL_TID6] = dma_mapping_to_ep(rqpn->dma_map_vo);
301 	rtwusb->qsel_to_ep[TX_DESC_QSEL_TID7] = dma_mapping_to_ep(rqpn->dma_map_vo);
302 	rtwusb->qsel_to_ep[TX_DESC_QSEL_TID8] = -EINVAL;
303 	rtwusb->qsel_to_ep[TX_DESC_QSEL_TID9] = -EINVAL;
304 	rtwusb->qsel_to_ep[TX_DESC_QSEL_TID10] = -EINVAL;
305 	rtwusb->qsel_to_ep[TX_DESC_QSEL_TID11] = -EINVAL;
306 	rtwusb->qsel_to_ep[TX_DESC_QSEL_TID12] = -EINVAL;
307 	rtwusb->qsel_to_ep[TX_DESC_QSEL_TID13] = -EINVAL;
308 	rtwusb->qsel_to_ep[TX_DESC_QSEL_TID14] = -EINVAL;
309 	rtwusb->qsel_to_ep[TX_DESC_QSEL_TID15] = -EINVAL;
310 	rtwusb->qsel_to_ep[TX_DESC_QSEL_BEACON] = dma_mapping_to_ep(rqpn->dma_map_hi);
311 	rtwusb->qsel_to_ep[TX_DESC_QSEL_HIGH] = dma_mapping_to_ep(rqpn->dma_map_hi);
312 	rtwusb->qsel_to_ep[TX_DESC_QSEL_MGMT] = dma_mapping_to_ep(rqpn->dma_map_mg);
313 	rtwusb->qsel_to_ep[TX_DESC_QSEL_H2C] = dma_mapping_to_ep(rqpn->dma_map_hi);
314 
315 	return 0;
316 }
317 
rtw_usb_write_port_tx_complete(struct urb * urb)318 static void rtw_usb_write_port_tx_complete(struct urb *urb)
319 {
320 	struct rtw_usb_txcb *txcb = urb->context;
321 	struct rtw_dev *rtwdev = txcb->rtwdev;
322 	struct ieee80211_hw *hw = rtwdev->hw;
323 
324 	while (true) {
325 		struct sk_buff *skb = skb_dequeue(&txcb->tx_ack_queue);
326 		struct ieee80211_tx_info *info;
327 		struct rtw_usb_tx_data *tx_data;
328 
329 		if (!skb)
330 			break;
331 
332 		info = IEEE80211_SKB_CB(skb);
333 		tx_data = rtw_usb_get_tx_data(skb);
334 
335 		skb_pull(skb, rtwdev->chip->tx_pkt_desc_sz);
336 
337 		/* enqueue to wait for tx report */
338 		if (info->flags & IEEE80211_TX_CTL_REQ_TX_STATUS) {
339 			rtw_tx_report_enqueue(rtwdev, skb, tx_data->sn);
340 			continue;
341 		}
342 
343 		/* always ACK for others, then they won't be marked as drop */
344 		ieee80211_tx_info_clear_status(info);
345 		if (info->flags & IEEE80211_TX_CTL_NO_ACK)
346 			info->flags |= IEEE80211_TX_STAT_NOACK_TRANSMITTED;
347 		else
348 			info->flags |= IEEE80211_TX_STAT_ACK;
349 
350 		ieee80211_tx_status_irqsafe(hw, skb);
351 	}
352 
353 	kfree(txcb);
354 }
355 
qsel_to_ep(struct rtw_usb * rtwusb,unsigned int qsel)356 static int qsel_to_ep(struct rtw_usb *rtwusb, unsigned int qsel)
357 {
358 	if (qsel >= ARRAY_SIZE(rtwusb->qsel_to_ep))
359 		return -EINVAL;
360 
361 	return rtwusb->qsel_to_ep[qsel];
362 }
363 
rtw_usb_write_port(struct rtw_dev * rtwdev,u8 qsel,struct sk_buff * skb,usb_complete_t cb,void * context)364 static int rtw_usb_write_port(struct rtw_dev *rtwdev, u8 qsel, struct sk_buff *skb,
365 			      usb_complete_t cb, void *context)
366 {
367 	struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev);
368 	struct usb_device *usbd = rtwusb->udev;
369 	struct urb *urb;
370 	unsigned int pipe;
371 	int ret;
372 	int ep = qsel_to_ep(rtwusb, qsel);
373 
374 	if (ep < 0)
375 		return ep;
376 
377 	pipe = usb_sndbulkpipe(usbd, rtwusb->out_ep[ep]);
378 	urb = usb_alloc_urb(0, GFP_ATOMIC);
379 	if (!urb)
380 		return -ENOMEM;
381 
382 	usb_fill_bulk_urb(urb, usbd, pipe, skb->data, skb->len, cb, context);
383 	urb->transfer_flags |= URB_ZERO_PACKET;
384 	ret = usb_submit_urb(urb, GFP_ATOMIC);
385 
386 	usb_free_urb(urb);
387 
388 	return ret;
389 }
390 
rtw_usb_tx_agg_skb(struct rtw_usb * rtwusb,struct sk_buff_head * list)391 static bool rtw_usb_tx_agg_skb(struct rtw_usb *rtwusb, struct sk_buff_head *list)
392 {
393 	struct rtw_dev *rtwdev = rtwusb->rtwdev;
394 	struct rtw_tx_desc *tx_desc;
395 	struct rtw_usb_txcb *txcb;
396 	struct sk_buff *skb_head;
397 	struct sk_buff *skb_iter;
398 	int agg_num = 0;
399 	unsigned int align_next = 0;
400 	u8 qsel;
401 
402 	if (skb_queue_empty(list))
403 		return false;
404 
405 	txcb = kmalloc(sizeof(*txcb), GFP_ATOMIC);
406 	if (!txcb)
407 		return false;
408 
409 	txcb->rtwdev = rtwdev;
410 	skb_queue_head_init(&txcb->tx_ack_queue);
411 
412 	skb_iter = skb_dequeue(list);
413 
414 	if (skb_queue_empty(list)) {
415 		skb_head = skb_iter;
416 		goto queue;
417 	}
418 
419 	skb_head = dev_alloc_skb(RTW_USB_MAX_XMITBUF_SZ);
420 	if (!skb_head) {
421 		skb_head = skb_iter;
422 		goto queue;
423 	}
424 
425 	while (skb_iter) {
426 		unsigned long flags;
427 
428 		skb_put(skb_head, align_next);
429 		skb_put_data(skb_head, skb_iter->data, skb_iter->len);
430 
431 		align_next = ALIGN(skb_iter->len, 8) - skb_iter->len;
432 
433 		agg_num++;
434 
435 		skb_queue_tail(&txcb->tx_ack_queue, skb_iter);
436 
437 		spin_lock_irqsave(&list->lock, flags);
438 
439 		skb_iter = skb_peek(list);
440 
441 		if (skb_iter &&
442 		    skb_iter->len + skb_head->len <= RTW_USB_MAX_XMITBUF_SZ &&
443 		    agg_num < rtwdev->chip->usb_tx_agg_desc_num)
444 			__skb_unlink(skb_iter, list);
445 		else
446 			skb_iter = NULL;
447 		spin_unlock_irqrestore(&list->lock, flags);
448 	}
449 
450 	if (agg_num > 1)
451 		rtw_usb_fill_tx_checksum(rtwusb, skb_head, agg_num);
452 
453 queue:
454 	skb_queue_tail(&txcb->tx_ack_queue, skb_head);
455 	tx_desc = (struct rtw_tx_desc *)skb_head->data;
456 	qsel = le32_get_bits(tx_desc->w1, RTW_TX_DESC_W1_QSEL);
457 
458 	rtw_usb_write_port(rtwdev, qsel, skb_head, rtw_usb_write_port_tx_complete, txcb);
459 
460 	return true;
461 }
462 
rtw_usb_tx_handler(struct work_struct * work)463 static void rtw_usb_tx_handler(struct work_struct *work)
464 {
465 	struct rtw_usb *rtwusb = container_of(work, struct rtw_usb, tx_work);
466 	int i, limit;
467 
468 	for (i = ARRAY_SIZE(rtwusb->tx_queue) - 1; i >= 0; i--) {
469 		for (limit = 0; limit < 200; limit++) {
470 			struct sk_buff_head *list = &rtwusb->tx_queue[i];
471 
472 			if (!rtw_usb_tx_agg_skb(rtwusb, list))
473 				break;
474 		}
475 	}
476 }
477 
rtw_usb_tx_queue_purge(struct rtw_usb * rtwusb)478 static void rtw_usb_tx_queue_purge(struct rtw_usb *rtwusb)
479 {
480 	struct rtw_dev *rtwdev = rtwusb->rtwdev;
481 	int i;
482 
483 	for (i = 0; i < ARRAY_SIZE(rtwusb->tx_queue); i++)
484 		ieee80211_purge_tx_queue(rtwdev->hw, &rtwusb->tx_queue[i]);
485 }
486 
rtw_usb_write_port_complete(struct urb * urb)487 static void rtw_usb_write_port_complete(struct urb *urb)
488 {
489 	struct sk_buff *skb = urb->context;
490 
491 	dev_kfree_skb_any(skb);
492 }
493 
rtw_usb_write_data(struct rtw_dev * rtwdev,struct rtw_tx_pkt_info * pkt_info,u8 * buf)494 static int rtw_usb_write_data(struct rtw_dev *rtwdev,
495 			      struct rtw_tx_pkt_info *pkt_info,
496 			      u8 *buf)
497 {
498 	const struct rtw_chip_info *chip = rtwdev->chip;
499 	struct sk_buff *skb;
500 	unsigned int size;
501 	u8 qsel;
502 	int ret = 0;
503 
504 	size = pkt_info->tx_pkt_size;
505 	qsel = pkt_info->qsel;
506 
507 	skb = dev_alloc_skb(chip->tx_pkt_desc_sz + size);
508 	if (unlikely(!skb))
509 		return -ENOMEM;
510 
511 	skb_reserve(skb, chip->tx_pkt_desc_sz);
512 	skb_put_data(skb, buf, size);
513 	skb_push(skb, chip->tx_pkt_desc_sz);
514 	memset(skb->data, 0, chip->tx_pkt_desc_sz);
515 	rtw_tx_fill_tx_desc(pkt_info, skb);
516 	rtw_tx_fill_txdesc_checksum(rtwdev, pkt_info, skb->data);
517 
518 	ret = rtw_usb_write_port(rtwdev, qsel, skb,
519 				 rtw_usb_write_port_complete, skb);
520 	if (unlikely(ret))
521 		rtw_err(rtwdev, "failed to do USB write, ret=%d\n", ret);
522 
523 	return ret;
524 }
525 
rtw_usb_write_data_rsvd_page(struct rtw_dev * rtwdev,u8 * buf,u32 size)526 static int rtw_usb_write_data_rsvd_page(struct rtw_dev *rtwdev, u8 *buf,
527 					u32 size)
528 {
529 	const struct rtw_chip_info *chip = rtwdev->chip;
530 	struct rtw_tx_pkt_info pkt_info = {0};
531 
532 	pkt_info.tx_pkt_size = size;
533 	pkt_info.qsel = TX_DESC_QSEL_BEACON;
534 	pkt_info.offset = chip->tx_pkt_desc_sz;
535 
536 	return rtw_usb_write_data(rtwdev, &pkt_info, buf);
537 }
538 
rtw_usb_write_data_h2c(struct rtw_dev * rtwdev,u8 * buf,u32 size)539 static int rtw_usb_write_data_h2c(struct rtw_dev *rtwdev, u8 *buf, u32 size)
540 {
541 	struct rtw_tx_pkt_info pkt_info = {0};
542 
543 	pkt_info.tx_pkt_size = size;
544 	pkt_info.qsel = TX_DESC_QSEL_H2C;
545 
546 	return rtw_usb_write_data(rtwdev, &pkt_info, buf);
547 }
548 
rtw_usb_tx_queue_mapping_to_qsel(struct sk_buff * skb)549 static u8 rtw_usb_tx_queue_mapping_to_qsel(struct sk_buff *skb)
550 {
551 	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
552 	__le16 fc = hdr->frame_control;
553 	u8 qsel;
554 
555 	if (unlikely(ieee80211_is_mgmt(fc) || ieee80211_is_ctl(fc)))
556 		qsel = TX_DESC_QSEL_MGMT;
557 	else if (is_broadcast_ether_addr(hdr->addr1) ||
558 		 is_multicast_ether_addr(hdr->addr1))
559 		qsel = TX_DESC_QSEL_HIGH;
560 	else if (skb_get_queue_mapping(skb) <= IEEE80211_AC_BK)
561 		qsel = skb->priority;
562 	else
563 		qsel = TX_DESC_QSEL_BEACON;
564 
565 	return qsel;
566 }
567 
rtw_usb_tx_write(struct rtw_dev * rtwdev,struct rtw_tx_pkt_info * pkt_info,struct sk_buff * skb)568 static int rtw_usb_tx_write(struct rtw_dev *rtwdev,
569 			    struct rtw_tx_pkt_info *pkt_info,
570 			    struct sk_buff *skb)
571 {
572 	struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev);
573 	const struct rtw_chip_info *chip = rtwdev->chip;
574 	struct rtw_usb_tx_data *tx_data;
575 	u8 *pkt_desc;
576 	int ep;
577 
578 	pkt_info->qsel = rtw_usb_tx_queue_mapping_to_qsel(skb);
579 	pkt_desc = skb_push(skb, chip->tx_pkt_desc_sz);
580 	memset(pkt_desc, 0, chip->tx_pkt_desc_sz);
581 	ep = qsel_to_ep(rtwusb, pkt_info->qsel);
582 	rtw_tx_fill_tx_desc(pkt_info, skb);
583 	rtw_tx_fill_txdesc_checksum(rtwdev, pkt_info, skb->data);
584 	tx_data = rtw_usb_get_tx_data(skb);
585 	tx_data->sn = pkt_info->sn;
586 
587 	skb_queue_tail(&rtwusb->tx_queue[ep], skb);
588 
589 	return 0;
590 }
591 
rtw_usb_tx_kick_off(struct rtw_dev * rtwdev)592 static void rtw_usb_tx_kick_off(struct rtw_dev *rtwdev)
593 {
594 	struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev);
595 
596 	queue_work(rtwusb->txwq, &rtwusb->tx_work);
597 }
598 
rtw_usb_rx_handler(struct work_struct * work)599 static void rtw_usb_rx_handler(struct work_struct *work)
600 {
601 	struct rtw_usb *rtwusb = container_of(work, struct rtw_usb, rx_work);
602 	struct rtw_dev *rtwdev = rtwusb->rtwdev;
603 	const struct rtw_chip_info *chip = rtwdev->chip;
604 	u32 pkt_desc_sz = chip->rx_pkt_desc_sz;
605 	struct ieee80211_rx_status rx_status;
606 	u32 pkt_offset, next_pkt, urb_len;
607 	struct rtw_rx_pkt_stat pkt_stat;
608 	struct sk_buff *next_skb;
609 	struct sk_buff *skb;
610 	u8 *rx_desc;
611 	int limit;
612 
613 	for (limit = 0; limit < 200; limit++) {
614 		skb = skb_dequeue(&rtwusb->rx_queue);
615 		if (!skb)
616 			break;
617 
618 		if (skb_queue_len(&rtwusb->rx_queue) >= RTW_USB_MAX_RXQ_LEN) {
619 			dev_dbg_ratelimited(rtwdev->dev, "failed to get rx_queue, overflow\n");
620 			dev_kfree_skb_any(skb);
621 			continue;
622 		}
623 
624 		urb_len = skb->len;
625 
626 		do {
627 			rx_desc = skb->data;
628 			chip->ops->query_rx_desc(rtwdev, rx_desc, &pkt_stat,
629 						 &rx_status);
630 			pkt_offset = pkt_desc_sz + pkt_stat.drv_info_sz +
631 				     pkt_stat.shift;
632 
633 			next_pkt = round_up(pkt_stat.pkt_len + pkt_offset, 8);
634 
635 			if (urb_len >= next_pkt + pkt_desc_sz)
636 				next_skb = skb_clone(skb, GFP_KERNEL);
637 			else
638 				next_skb = NULL;
639 
640 			if (pkt_stat.is_c2h) {
641 				skb_trim(skb, pkt_stat.pkt_len + pkt_offset);
642 				rtw_fw_c2h_cmd_rx_irqsafe(rtwdev, pkt_offset, skb);
643 			} else {
644 				skb_pull(skb, pkt_offset);
645 				skb_trim(skb, pkt_stat.pkt_len);
646 				rtw_update_rx_freq_for_invalid(rtwdev, skb,
647 							       &rx_status,
648 							       &pkt_stat);
649 				rtw_rx_stats(rtwdev, pkt_stat.vif, skb);
650 				memcpy(skb->cb, &rx_status, sizeof(rx_status));
651 				ieee80211_rx_irqsafe(rtwdev->hw, skb);
652 			}
653 
654 			skb = next_skb;
655 			if (skb)
656 				skb_pull(skb, next_pkt);
657 
658 			urb_len -= next_pkt;
659 		} while (skb);
660 	}
661 }
662 
663 static void rtw_usb_read_port_complete(struct urb *urb);
664 
rtw_usb_rx_resubmit(struct rtw_usb * rtwusb,struct rx_usb_ctrl_block * rxcb)665 static void rtw_usb_rx_resubmit(struct rtw_usb *rtwusb, struct rx_usb_ctrl_block *rxcb)
666 {
667 	struct rtw_dev *rtwdev = rtwusb->rtwdev;
668 	int error;
669 
670 	rxcb->rx_skb = alloc_skb(RTW_USB_MAX_RECVBUF_SZ, GFP_ATOMIC);
671 	if (!rxcb->rx_skb)
672 		return;
673 
674 	usb_fill_bulk_urb(rxcb->rx_urb, rtwusb->udev,
675 			  usb_rcvbulkpipe(rtwusb->udev, rtwusb->pipe_in),
676 			  rxcb->rx_skb->data, RTW_USB_MAX_RECVBUF_SZ,
677 			  rtw_usb_read_port_complete, rxcb);
678 
679 	error = usb_submit_urb(rxcb->rx_urb, GFP_ATOMIC);
680 	if (error) {
681 		kfree_skb(rxcb->rx_skb);
682 		if (error != -ENODEV)
683 			rtw_err(rtwdev, "Err sending rx data urb %d\n",
684 				error);
685 	}
686 }
687 
rtw_usb_read_port_complete(struct urb * urb)688 static void rtw_usb_read_port_complete(struct urb *urb)
689 {
690 	struct rx_usb_ctrl_block *rxcb = urb->context;
691 	struct rtw_dev *rtwdev = rxcb->rtwdev;
692 	struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev);
693 	struct sk_buff *skb = rxcb->rx_skb;
694 
695 	if (urb->status == 0) {
696 		if (urb->actual_length >= RTW_USB_MAX_RECVBUF_SZ ||
697 		    urb->actual_length < 24) {
698 			rtw_err(rtwdev, "failed to get urb length:%d\n",
699 				urb->actual_length);
700 			if (skb)
701 				dev_kfree_skb_any(skb);
702 		} else {
703 			skb_put(skb, urb->actual_length);
704 			skb_queue_tail(&rtwusb->rx_queue, skb);
705 			queue_work(rtwusb->rxwq, &rtwusb->rx_work);
706 		}
707 		rtw_usb_rx_resubmit(rtwusb, rxcb);
708 	} else {
709 		switch (urb->status) {
710 		case -EINVAL:
711 		case -EPIPE:
712 		case -ENODEV:
713 		case -ESHUTDOWN:
714 		case -ENOENT:
715 		case -EPROTO:
716 		case -EILSEQ:
717 		case -ETIME:
718 		case -ECOMM:
719 		case -EOVERFLOW:
720 		case -EINPROGRESS:
721 			break;
722 		default:
723 			rtw_err(rtwdev, "status %d\n", urb->status);
724 			break;
725 		}
726 		if (skb)
727 			dev_kfree_skb_any(skb);
728 	}
729 }
730 
rtw_usb_cancel_rx_bufs(struct rtw_usb * rtwusb)731 static void rtw_usb_cancel_rx_bufs(struct rtw_usb *rtwusb)
732 {
733 	struct rx_usb_ctrl_block *rxcb;
734 	int i;
735 
736 	for (i = 0; i < RTW_USB_RXCB_NUM; i++) {
737 		rxcb = &rtwusb->rx_cb[i];
738 		usb_kill_urb(rxcb->rx_urb);
739 	}
740 }
741 
rtw_usb_free_rx_bufs(struct rtw_usb * rtwusb)742 static void rtw_usb_free_rx_bufs(struct rtw_usb *rtwusb)
743 {
744 	struct rx_usb_ctrl_block *rxcb;
745 	int i;
746 
747 	for (i = 0; i < RTW_USB_RXCB_NUM; i++) {
748 		rxcb = &rtwusb->rx_cb[i];
749 		usb_kill_urb(rxcb->rx_urb);
750 		usb_free_urb(rxcb->rx_urb);
751 	}
752 }
753 
rtw_usb_alloc_rx_bufs(struct rtw_usb * rtwusb)754 static int rtw_usb_alloc_rx_bufs(struct rtw_usb *rtwusb)
755 {
756 	int i;
757 
758 	for (i = 0; i < RTW_USB_RXCB_NUM; i++) {
759 		struct rx_usb_ctrl_block *rxcb = &rtwusb->rx_cb[i];
760 
761 		rxcb->rtwdev = rtwusb->rtwdev;
762 		rxcb->rx_urb = usb_alloc_urb(0, GFP_KERNEL);
763 		if (!rxcb->rx_urb)
764 			goto err;
765 	}
766 
767 	return 0;
768 err:
769 	rtw_usb_free_rx_bufs(rtwusb);
770 	return -ENOMEM;
771 }
772 
rtw_usb_setup(struct rtw_dev * rtwdev)773 static int rtw_usb_setup(struct rtw_dev *rtwdev)
774 {
775 	/* empty function for rtw_hci_ops */
776 	return 0;
777 }
778 
rtw_usb_start(struct rtw_dev * rtwdev)779 static int rtw_usb_start(struct rtw_dev *rtwdev)
780 {
781 	return 0;
782 }
783 
rtw_usb_stop(struct rtw_dev * rtwdev)784 static void rtw_usb_stop(struct rtw_dev *rtwdev)
785 {
786 }
787 
rtw_usb_deep_ps(struct rtw_dev * rtwdev,bool enter)788 static void rtw_usb_deep_ps(struct rtw_dev *rtwdev, bool enter)
789 {
790 	/* empty function for rtw_hci_ops */
791 }
792 
rtw_usb_link_ps(struct rtw_dev * rtwdev,bool enter)793 static void rtw_usb_link_ps(struct rtw_dev *rtwdev, bool enter)
794 {
795 	/* empty function for rtw_hci_ops */
796 }
797 
rtw_usb_init_burst_pkt_len(struct rtw_dev * rtwdev)798 static void rtw_usb_init_burst_pkt_len(struct rtw_dev *rtwdev)
799 {
800 	struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev);
801 	enum usb_device_speed speed = rtwusb->udev->speed;
802 	u8 rxdma, burst_size;
803 
804 	rxdma = BIT_DMA_BURST_CNT | BIT_DMA_MODE;
805 
806 	if (speed == USB_SPEED_SUPER)
807 		burst_size = BIT_DMA_BURST_SIZE_1024;
808 	else if (speed == USB_SPEED_HIGH)
809 		burst_size = BIT_DMA_BURST_SIZE_512;
810 	else
811 		burst_size = BIT_DMA_BURST_SIZE_64;
812 
813 	u8p_replace_bits(&rxdma, burst_size, BIT_DMA_BURST_SIZE);
814 
815 	rtw_write8(rtwdev, REG_RXDMA_MODE, rxdma);
816 	rtw_write16_set(rtwdev, REG_TXDMA_OFFSET_CHK, BIT_DROP_DATA_EN);
817 }
818 
rtw_usb_interface_cfg(struct rtw_dev * rtwdev)819 static void rtw_usb_interface_cfg(struct rtw_dev *rtwdev)
820 {
821 	rtw_usb_init_burst_pkt_len(rtwdev);
822 }
823 
rtw_usb_dynamic_rx_agg_v1(struct rtw_dev * rtwdev,bool enable)824 static void rtw_usb_dynamic_rx_agg_v1(struct rtw_dev *rtwdev, bool enable)
825 {
826 	u8 size, timeout;
827 	u16 val16;
828 
829 	rtw_write8_set(rtwdev, REG_TXDMA_PQ_MAP, BIT_RXDMA_AGG_EN);
830 	rtw_write8_clr(rtwdev, REG_RXDMA_AGG_PG_TH + 3, BIT(7));
831 
832 	if (enable) {
833 		size = 0x5;
834 		timeout = 0x20;
835 	} else {
836 		size = 0x0;
837 		timeout = 0x1;
838 	}
839 	val16 = u16_encode_bits(size, BIT_RXDMA_AGG_PG_TH) |
840 		u16_encode_bits(timeout, BIT_DMA_AGG_TO_V1);
841 
842 	rtw_write16(rtwdev, REG_RXDMA_AGG_PG_TH, val16);
843 }
844 
rtw_usb_dynamic_rx_agg(struct rtw_dev * rtwdev,bool enable)845 static void rtw_usb_dynamic_rx_agg(struct rtw_dev *rtwdev, bool enable)
846 {
847 	switch (rtwdev->chip->id) {
848 	case RTW_CHIP_TYPE_8822C:
849 	case RTW_CHIP_TYPE_8822B:
850 	case RTW_CHIP_TYPE_8821C:
851 		rtw_usb_dynamic_rx_agg_v1(rtwdev, enable);
852 		break;
853 	case RTW_CHIP_TYPE_8723D:
854 		/* Doesn't like aggregation. */
855 		break;
856 	case RTW_CHIP_TYPE_8703B:
857 		/* Likely not found in USB devices. */
858 		break;
859 	}
860 }
861 
862 static struct rtw_hci_ops rtw_usb_ops = {
863 	.tx_write = rtw_usb_tx_write,
864 	.tx_kick_off = rtw_usb_tx_kick_off,
865 	.setup = rtw_usb_setup,
866 	.start = rtw_usb_start,
867 	.stop = rtw_usb_stop,
868 	.deep_ps = rtw_usb_deep_ps,
869 	.link_ps = rtw_usb_link_ps,
870 	.interface_cfg = rtw_usb_interface_cfg,
871 	.dynamic_rx_agg = rtw_usb_dynamic_rx_agg,
872 	.write_firmware_page = rtw_usb_write_firmware_page,
873 
874 	.write8  = rtw_usb_write8,
875 	.write16 = rtw_usb_write16,
876 	.write32 = rtw_usb_write32,
877 	.read8	= rtw_usb_read8,
878 	.read16 = rtw_usb_read16,
879 	.read32 = rtw_usb_read32,
880 
881 	.write_data_rsvd_page = rtw_usb_write_data_rsvd_page,
882 	.write_data_h2c = rtw_usb_write_data_h2c,
883 };
884 
rtw_usb_init_rx(struct rtw_dev * rtwdev)885 static int rtw_usb_init_rx(struct rtw_dev *rtwdev)
886 {
887 	struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev);
888 
889 	rtwusb->rxwq = create_singlethread_workqueue("rtw88_usb: rx wq");
890 	if (!rtwusb->rxwq) {
891 		rtw_err(rtwdev, "failed to create RX work queue\n");
892 		return -ENOMEM;
893 	}
894 
895 	skb_queue_head_init(&rtwusb->rx_queue);
896 
897 	INIT_WORK(&rtwusb->rx_work, rtw_usb_rx_handler);
898 
899 	return 0;
900 }
901 
rtw_usb_setup_rx(struct rtw_dev * rtwdev)902 static void rtw_usb_setup_rx(struct rtw_dev *rtwdev)
903 {
904 	struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev);
905 	int i;
906 
907 	for (i = 0; i < RTW_USB_RXCB_NUM; i++) {
908 		struct rx_usb_ctrl_block *rxcb = &rtwusb->rx_cb[i];
909 
910 		rtw_usb_rx_resubmit(rtwusb, rxcb);
911 	}
912 }
913 
rtw_usb_deinit_rx(struct rtw_dev * rtwdev)914 static void rtw_usb_deinit_rx(struct rtw_dev *rtwdev)
915 {
916 	struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev);
917 
918 	skb_queue_purge(&rtwusb->rx_queue);
919 
920 	flush_workqueue(rtwusb->rxwq);
921 	destroy_workqueue(rtwusb->rxwq);
922 }
923 
rtw_usb_init_tx(struct rtw_dev * rtwdev)924 static int rtw_usb_init_tx(struct rtw_dev *rtwdev)
925 {
926 	struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev);
927 	int i;
928 
929 	rtwusb->txwq = create_singlethread_workqueue("rtw88_usb: tx wq");
930 	if (!rtwusb->txwq) {
931 		rtw_err(rtwdev, "failed to create TX work queue\n");
932 		return -ENOMEM;
933 	}
934 
935 	for (i = 0; i < ARRAY_SIZE(rtwusb->tx_queue); i++)
936 		skb_queue_head_init(&rtwusb->tx_queue[i]);
937 
938 	INIT_WORK(&rtwusb->tx_work, rtw_usb_tx_handler);
939 
940 	return 0;
941 }
942 
rtw_usb_deinit_tx(struct rtw_dev * rtwdev)943 static void rtw_usb_deinit_tx(struct rtw_dev *rtwdev)
944 {
945 	struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev);
946 
947 	flush_workqueue(rtwusb->txwq);
948 	destroy_workqueue(rtwusb->txwq);
949 	rtw_usb_tx_queue_purge(rtwusb);
950 }
951 
rtw_usb_intf_init(struct rtw_dev * rtwdev,struct usb_interface * intf)952 static int rtw_usb_intf_init(struct rtw_dev *rtwdev,
953 			     struct usb_interface *intf)
954 {
955 	struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev);
956 	struct usb_device *udev = usb_get_dev(interface_to_usbdev(intf));
957 	int ret;
958 
959 	rtwusb->udev = udev;
960 	ret = rtw_usb_parse(rtwdev, intf);
961 	if (ret)
962 		return ret;
963 
964 	rtwusb->usb_data = kcalloc(RTW_USB_MAX_RXTX_COUNT, sizeof(u32),
965 				   GFP_KERNEL);
966 	if (!rtwusb->usb_data)
967 		return -ENOMEM;
968 
969 	usb_set_intfdata(intf, rtwdev->hw);
970 
971 	SET_IEEE80211_DEV(rtwdev->hw, &intf->dev);
972 	spin_lock_init(&rtwusb->usb_lock);
973 
974 	return 0;
975 }
976 
rtw_usb_intf_deinit(struct rtw_dev * rtwdev,struct usb_interface * intf)977 static void rtw_usb_intf_deinit(struct rtw_dev *rtwdev,
978 				struct usb_interface *intf)
979 {
980 	struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev);
981 
982 	usb_put_dev(rtwusb->udev);
983 	kfree(rtwusb->usb_data);
984 	usb_set_intfdata(intf, NULL);
985 }
986 
rtw_usb_switch_mode_new(struct rtw_dev * rtwdev)987 static int rtw_usb_switch_mode_new(struct rtw_dev *rtwdev)
988 {
989 	enum usb_device_speed cur_speed;
990 	u8 id = rtwdev->chip->id;
991 	bool can_switch;
992 	u32 pad_ctrl2;
993 
994 	if (rtw_read8(rtwdev, REG_SYS_CFG2 + 3) == 0x20)
995 		cur_speed = USB_SPEED_SUPER;
996 	else
997 		cur_speed = USB_SPEED_HIGH;
998 
999 	if (cur_speed == USB_SPEED_SUPER)
1000 		return 0;
1001 
1002 	pad_ctrl2 = rtw_read32(rtwdev, REG_PAD_CTRL2);
1003 
1004 	can_switch = !!(pad_ctrl2 & (BIT_MASK_USB23_SW_MODE_V1 |
1005 				     BIT_USB3_USB2_TRANSITION));
1006 
1007 	if (!can_switch) {
1008 		rtw_dbg(rtwdev, RTW_DBG_USB,
1009 			"Switching to USB 3 mode unsupported by the chip\n");
1010 		return 0;
1011 	}
1012 
1013 	/* At this point cur_speed is USB_SPEED_HIGH. If we already tried
1014 	 * to switch don't try again - it's a USB 2 port.
1015 	 */
1016 	if (u32_get_bits(pad_ctrl2, BIT_MASK_USB23_SW_MODE_V1) == BIT_USB_MODE_U3)
1017 		return 0;
1018 
1019 	/* Enable IO wrapper timeout */
1020 	if (id == RTW_CHIP_TYPE_8822B || id == RTW_CHIP_TYPE_8821C)
1021 		rtw_write8_clr(rtwdev, REG_SW_MDIO + 3, BIT(0));
1022 
1023 	u32p_replace_bits(&pad_ctrl2, BIT_USB_MODE_U3, BIT_MASK_USB23_SW_MODE_V1);
1024 	pad_ctrl2 |= BIT_RSM_EN_V1;
1025 
1026 	rtw_write32(rtwdev, REG_PAD_CTRL2, pad_ctrl2);
1027 	rtw_write8(rtwdev, REG_PAD_CTRL2 + 1, 4);
1028 
1029 	rtw_write16_set(rtwdev, REG_SYS_PW_CTRL, BIT_APFM_OFFMAC);
1030 	usleep_range(1000, 1001);
1031 	rtw_write32_set(rtwdev, REG_PAD_CTRL2, BIT_NO_PDN_CHIPOFF_V1);
1032 
1033 	return 1;
1034 }
1035 
rtw_usb_switch_mode(struct rtw_dev * rtwdev)1036 static int rtw_usb_switch_mode(struct rtw_dev *rtwdev)
1037 {
1038 	u8 id = rtwdev->chip->id;
1039 
1040 	if (id != RTW_CHIP_TYPE_8822C && id != RTW_CHIP_TYPE_8822B)
1041 		return 0;
1042 
1043 	if (!rtwdev->efuse.usb_mode_switch) {
1044 		rtw_dbg(rtwdev, RTW_DBG_USB,
1045 			"Switching to USB 3 mode disabled by chip's efuse\n");
1046 		return 0;
1047 	}
1048 
1049 	if (!rtw_switch_usb_mode) {
1050 		rtw_dbg(rtwdev, RTW_DBG_USB,
1051 			"Switching to USB 3 mode disabled by module parameter\n");
1052 		return 0;
1053 	}
1054 
1055 	return rtw_usb_switch_mode_new(rtwdev);
1056 }
1057 
rtw_usb_probe(struct usb_interface * intf,const struct usb_device_id * id)1058 int rtw_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
1059 {
1060 	struct rtw_dev *rtwdev;
1061 	struct ieee80211_hw *hw;
1062 	struct rtw_usb *rtwusb;
1063 	int drv_data_size;
1064 	int ret;
1065 
1066 	drv_data_size = sizeof(struct rtw_dev) + sizeof(struct rtw_usb);
1067 	hw = ieee80211_alloc_hw(drv_data_size, &rtw_ops);
1068 	if (!hw)
1069 		return -ENOMEM;
1070 
1071 	rtwdev = hw->priv;
1072 	rtwdev->hw = hw;
1073 	rtwdev->dev = &intf->dev;
1074 	rtwdev->chip = (struct rtw_chip_info *)id->driver_info;
1075 	rtwdev->hci.ops = &rtw_usb_ops;
1076 	rtwdev->hci.type = RTW_HCI_TYPE_USB;
1077 
1078 	rtwusb = rtw_get_usb_priv(rtwdev);
1079 	rtwusb->rtwdev = rtwdev;
1080 
1081 	ret = rtw_usb_alloc_rx_bufs(rtwusb);
1082 	if (ret)
1083 		goto err_release_hw;
1084 
1085 	ret = rtw_core_init(rtwdev);
1086 	if (ret)
1087 		goto err_free_rx_bufs;
1088 
1089 	ret = rtw_usb_intf_init(rtwdev, intf);
1090 	if (ret) {
1091 		rtw_err(rtwdev, "failed to init USB interface\n");
1092 		goto err_deinit_core;
1093 	}
1094 
1095 	ret = rtw_usb_init_tx(rtwdev);
1096 	if (ret) {
1097 		rtw_err(rtwdev, "failed to init USB TX\n");
1098 		goto err_destroy_usb;
1099 	}
1100 
1101 	ret = rtw_usb_init_rx(rtwdev);
1102 	if (ret) {
1103 		rtw_err(rtwdev, "failed to init USB RX\n");
1104 		goto err_destroy_txwq;
1105 	}
1106 
1107 	ret = rtw_chip_info_setup(rtwdev);
1108 	if (ret) {
1109 		rtw_err(rtwdev, "failed to setup chip information\n");
1110 		goto err_destroy_rxwq;
1111 	}
1112 
1113 	ret = rtw_usb_switch_mode(rtwdev);
1114 	if (ret) {
1115 		/* Not a fail, but we do need to skip rtw_register_hw. */
1116 		rtw_dbg(rtwdev, RTW_DBG_USB, "switching to USB 3 mode\n");
1117 		ret = 0;
1118 		goto err_destroy_rxwq;
1119 	}
1120 
1121 	ret = rtw_register_hw(rtwdev, rtwdev->hw);
1122 	if (ret) {
1123 		rtw_err(rtwdev, "failed to register hw\n");
1124 		goto err_destroy_rxwq;
1125 	}
1126 
1127 	rtw_usb_setup_rx(rtwdev);
1128 
1129 	return 0;
1130 
1131 err_destroy_rxwq:
1132 	rtw_usb_deinit_rx(rtwdev);
1133 
1134 err_destroy_txwq:
1135 	rtw_usb_deinit_tx(rtwdev);
1136 
1137 err_destroy_usb:
1138 	rtw_usb_intf_deinit(rtwdev, intf);
1139 
1140 err_deinit_core:
1141 	rtw_core_deinit(rtwdev);
1142 
1143 err_free_rx_bufs:
1144 	rtw_usb_free_rx_bufs(rtwusb);
1145 
1146 err_release_hw:
1147 	ieee80211_free_hw(hw);
1148 
1149 	return ret;
1150 }
1151 EXPORT_SYMBOL(rtw_usb_probe);
1152 
rtw_usb_disconnect(struct usb_interface * intf)1153 void rtw_usb_disconnect(struct usb_interface *intf)
1154 {
1155 	struct ieee80211_hw *hw = usb_get_intfdata(intf);
1156 	struct rtw_dev *rtwdev;
1157 	struct rtw_usb *rtwusb;
1158 
1159 	if (!hw)
1160 		return;
1161 
1162 	rtwdev = hw->priv;
1163 	rtwusb = rtw_get_usb_priv(rtwdev);
1164 
1165 	rtw_usb_cancel_rx_bufs(rtwusb);
1166 
1167 	rtw_unregister_hw(rtwdev, hw);
1168 	rtw_usb_deinit_tx(rtwdev);
1169 	rtw_usb_deinit_rx(rtwdev);
1170 
1171 	if (rtwusb->udev->state != USB_STATE_NOTATTACHED)
1172 		usb_reset_device(rtwusb->udev);
1173 
1174 	rtw_usb_free_rx_bufs(rtwusb);
1175 
1176 	rtw_usb_intf_deinit(rtwdev, intf);
1177 	rtw_core_deinit(rtwdev);
1178 	ieee80211_free_hw(hw);
1179 }
1180 EXPORT_SYMBOL(rtw_usb_disconnect);
1181 
1182 MODULE_AUTHOR("Realtek Corporation");
1183 MODULE_DESCRIPTION("Realtek USB 802.11ac wireless driver");
1184 MODULE_LICENSE("Dual BSD/GPL");
1185