xref: /linux/drivers/net/wireless/mediatek/mt76/usb.c (revision 91ec2035134982b98fab0609a9fd8480e8217dc1)
1 // SPDX-License-Identifier: BSD-3-Clause-Clear
2 /*
3  * Copyright (C) 2018 Lorenzo Bianconi <lorenzo.bianconi83@gmail.com>
4  */
5 
6 #include <linux/module.h>
7 #include "mt76.h"
8 #include "usb_trace.h"
9 #include "dma.h"
10 
11 #define MT_VEND_REQ_MAX_RETRY	10
12 #define MT_VEND_REQ_TOUT_MS	300
13 
14 static bool disable_usb_sg;
15 module_param_named(disable_usb_sg, disable_usb_sg, bool, 0644);
16 MODULE_PARM_DESC(disable_usb_sg, "Disable usb scatter-gather support");
17 
__mt76u_vendor_request(struct mt76_dev * dev,u8 req,u8 req_type,u16 val,u16 offset,void * buf,size_t len)18 int __mt76u_vendor_request(struct mt76_dev *dev, u8 req, u8 req_type,
19 			   u16 val, u16 offset, void *buf, size_t len)
20 {
21 	struct usb_interface *uintf = to_usb_interface(dev->dev);
22 	struct usb_device *udev = interface_to_usbdev(uintf);
23 	unsigned int pipe;
24 	int i, ret;
25 
26 	lockdep_assert_held(&dev->usb.usb_ctrl_mtx);
27 
28 	pipe = (req_type & USB_DIR_IN) ? usb_rcvctrlpipe(udev, 0)
29 				       : usb_sndctrlpipe(udev, 0);
30 	for (i = 0; i < MT_VEND_REQ_MAX_RETRY; i++) {
31 		if (test_bit(MT76_REMOVED, &dev->phy.state))
32 			return -EIO;
33 		if (dev->usb.ctrl_timeout && atomic_read(&dev->bus_hung))
34 			return -EIO;
35 
36 		ret = usb_control_msg(udev, pipe, req, req_type, val,
37 				      offset, buf, len, MT_VEND_REQ_TOUT_MS);
38 		if (ret == -ENODEV || ret == -EPROTO)
39 			set_bit(MT76_REMOVED, &dev->phy.state);
40 		if (ret >= 0 || ret == -ENODEV || ret == -EPROTO)
41 			return ret;
42 		usleep_range(5000, 10000);
43 	}
44 
45 	dev_err(dev->dev, "vendor request req:%02x off:%04x failed:%d\n",
46 		req, offset, ret);
47 
48 	if (dev->usb.ctrl_timeout) {
49 		atomic_set(&dev->bus_hung, true);
50 		dev_err(dev->dev, "vendor request req:%02x off:%04x timed out, marking bus hung\n",
51 			req, offset);
52 		dev->usb.ctrl_timeout(dev, ret);
53 		return ret;
54 	}
55 
56 	return ret;
57 }
58 EXPORT_SYMBOL_GPL(__mt76u_vendor_request);
59 
mt76u_vendor_request(struct mt76_dev * dev,u8 req,u8 req_type,u16 val,u16 offset,void * buf,size_t len)60 int mt76u_vendor_request(struct mt76_dev *dev, u8 req,
61 			 u8 req_type, u16 val, u16 offset,
62 			 void *buf, size_t len)
63 {
64 	int ret;
65 
66 	mutex_lock(&dev->usb.usb_ctrl_mtx);
67 	ret = __mt76u_vendor_request(dev, req, req_type,
68 				     val, offset, buf, len);
69 	trace_usb_reg_wr(dev, offset, val);
70 	mutex_unlock(&dev->usb.usb_ctrl_mtx);
71 
72 	return ret;
73 }
74 EXPORT_SYMBOL_GPL(mt76u_vendor_request);
75 
___mt76u_rr(struct mt76_dev * dev,u8 req,u8 req_type,u32 addr)76 u32 ___mt76u_rr(struct mt76_dev *dev, u8 req, u8 req_type, u32 addr)
77 {
78 	struct mt76_usb *usb = &dev->usb;
79 	u32 data = ~0;
80 	int ret;
81 
82 	ret = __mt76u_vendor_request(dev, req, req_type, addr >> 16,
83 				     addr, usb->data, sizeof(__le32));
84 	if (ret == sizeof(__le32))
85 		data = get_unaligned_le32(usb->data);
86 	trace_usb_reg_rr(dev, addr, data);
87 
88 	return data;
89 }
90 EXPORT_SYMBOL_GPL(___mt76u_rr);
91 
__mt76u_rr(struct mt76_dev * dev,u32 addr)92 static u32 __mt76u_rr(struct mt76_dev *dev, u32 addr)
93 {
94 	u8 req;
95 
96 	switch (addr & MT_VEND_TYPE_MASK) {
97 	case MT_VEND_TYPE_EEPROM:
98 		req = MT_VEND_READ_EEPROM;
99 		break;
100 	case MT_VEND_TYPE_CFG:
101 		req = MT_VEND_READ_CFG;
102 		break;
103 	default:
104 		req = MT_VEND_MULTI_READ;
105 		break;
106 	}
107 
108 	return ___mt76u_rr(dev, req, USB_DIR_IN | USB_TYPE_VENDOR,
109 			   addr & ~MT_VEND_TYPE_MASK);
110 }
111 
mt76u_rr(struct mt76_dev * dev,u32 addr)112 static u32 mt76u_rr(struct mt76_dev *dev, u32 addr)
113 {
114 	u32 ret;
115 
116 	mutex_lock(&dev->usb.usb_ctrl_mtx);
117 	ret = __mt76u_rr(dev, addr);
118 	mutex_unlock(&dev->usb.usb_ctrl_mtx);
119 
120 	return ret;
121 }
122 
___mt76u_wr(struct mt76_dev * dev,u8 req,u8 req_type,u32 addr,u32 val)123 void ___mt76u_wr(struct mt76_dev *dev, u8 req, u8 req_type,
124 		 u32 addr, u32 val)
125 {
126 	struct mt76_usb *usb = &dev->usb;
127 
128 	put_unaligned_le32(val, usb->data);
129 	__mt76u_vendor_request(dev, req, req_type, addr >> 16,
130 			       addr, usb->data, sizeof(__le32));
131 	trace_usb_reg_wr(dev, addr, val);
132 }
133 EXPORT_SYMBOL_GPL(___mt76u_wr);
134 
__mt76u_wr(struct mt76_dev * dev,u32 addr,u32 val)135 static void __mt76u_wr(struct mt76_dev *dev, u32 addr, u32 val)
136 {
137 	u8 req;
138 
139 	switch (addr & MT_VEND_TYPE_MASK) {
140 	case MT_VEND_TYPE_CFG:
141 		req = MT_VEND_WRITE_CFG;
142 		break;
143 	default:
144 		req = MT_VEND_MULTI_WRITE;
145 		break;
146 	}
147 	___mt76u_wr(dev, req, USB_DIR_OUT | USB_TYPE_VENDOR,
148 		    addr & ~MT_VEND_TYPE_MASK, val);
149 }
150 
mt76u_wr(struct mt76_dev * dev,u32 addr,u32 val)151 static void mt76u_wr(struct mt76_dev *dev, u32 addr, u32 val)
152 {
153 	mutex_lock(&dev->usb.usb_ctrl_mtx);
154 	__mt76u_wr(dev, addr, val);
155 	mutex_unlock(&dev->usb.usb_ctrl_mtx);
156 }
157 
mt76u_rmw(struct mt76_dev * dev,u32 addr,u32 mask,u32 val)158 static u32 mt76u_rmw(struct mt76_dev *dev, u32 addr,
159 		     u32 mask, u32 val)
160 {
161 	mutex_lock(&dev->usb.usb_ctrl_mtx);
162 	val |= __mt76u_rr(dev, addr) & ~mask;
163 	__mt76u_wr(dev, addr, val);
164 	mutex_unlock(&dev->usb.usb_ctrl_mtx);
165 
166 	return val;
167 }
168 
mt76u_copy(struct mt76_dev * dev,u32 offset,const void * data,int len)169 static void mt76u_copy(struct mt76_dev *dev, u32 offset,
170 		       const void *data, int len)
171 {
172 	struct mt76_usb *usb = &dev->usb;
173 	const u8 *val = data;
174 	int ret;
175 	int current_batch_size;
176 	int i = 0;
177 
178 	/* Assure that always a multiple of 4 bytes are copied,
179 	 * otherwise beacons can be corrupted.
180 	 * See: "mt76: round up length on mt76_wr_copy"
181 	 * Commit 850e8f6fbd5d0003b0
182 	 */
183 	len = round_up(len, 4);
184 
185 	mutex_lock(&usb->usb_ctrl_mtx);
186 	while (i < len) {
187 		current_batch_size = min_t(int, usb->data_len, len - i);
188 		memcpy(usb->data, val + i, current_batch_size);
189 		ret = __mt76u_vendor_request(dev, MT_VEND_MULTI_WRITE,
190 					     USB_DIR_OUT | USB_TYPE_VENDOR,
191 					     0, offset + i, usb->data,
192 					     current_batch_size);
193 		if (ret < 0)
194 			break;
195 
196 		i += current_batch_size;
197 	}
198 	mutex_unlock(&usb->usb_ctrl_mtx);
199 }
200 
mt76u_read_copy(struct mt76_dev * dev,u32 offset,void * data,int len)201 void mt76u_read_copy(struct mt76_dev *dev, u32 offset,
202 		     void *data, int len)
203 {
204 	struct mt76_usb *usb = &dev->usb;
205 	int i = 0, batch_len, ret;
206 	u8 *val = data;
207 
208 	len = round_up(len, 4);
209 	mutex_lock(&usb->usb_ctrl_mtx);
210 	while (i < len) {
211 		batch_len = min_t(int, usb->data_len, len - i);
212 		ret = __mt76u_vendor_request(dev, MT_VEND_READ_EXT,
213 					     USB_DIR_IN | USB_TYPE_VENDOR,
214 					     (offset + i) >> 16, offset + i,
215 					     usb->data, batch_len);
216 		if (ret < 0)
217 			break;
218 
219 		memcpy(val + i, usb->data, batch_len);
220 		i += batch_len;
221 	}
222 	mutex_unlock(&usb->usb_ctrl_mtx);
223 }
224 EXPORT_SYMBOL_GPL(mt76u_read_copy);
225 
mt76u_single_wr(struct mt76_dev * dev,const u8 req,const u16 offset,const u32 val)226 void mt76u_single_wr(struct mt76_dev *dev, const u8 req,
227 		     const u16 offset, const u32 val)
228 {
229 	mutex_lock(&dev->usb.usb_ctrl_mtx);
230 	__mt76u_vendor_request(dev, req,
231 			       USB_DIR_OUT | USB_TYPE_VENDOR,
232 			       val & 0xffff, offset, NULL, 0);
233 	__mt76u_vendor_request(dev, req,
234 			       USB_DIR_OUT | USB_TYPE_VENDOR,
235 			       val >> 16, offset + 2, NULL, 0);
236 	mutex_unlock(&dev->usb.usb_ctrl_mtx);
237 }
238 EXPORT_SYMBOL_GPL(mt76u_single_wr);
239 
240 static int
mt76u_req_wr_rp(struct mt76_dev * dev,u32 base,const struct mt76_reg_pair * data,int len)241 mt76u_req_wr_rp(struct mt76_dev *dev, u32 base,
242 		const struct mt76_reg_pair *data, int len)
243 {
244 	struct mt76_usb *usb = &dev->usb;
245 
246 	mutex_lock(&usb->usb_ctrl_mtx);
247 	while (len > 0) {
248 		__mt76u_wr(dev, base + data->reg, data->value);
249 		len--;
250 		data++;
251 	}
252 	mutex_unlock(&usb->usb_ctrl_mtx);
253 
254 	return 0;
255 }
256 
257 static int
mt76u_wr_rp(struct mt76_dev * dev,u32 base,const struct mt76_reg_pair * data,int n)258 mt76u_wr_rp(struct mt76_dev *dev, u32 base,
259 	    const struct mt76_reg_pair *data, int n)
260 {
261 	if (test_bit(MT76_STATE_MCU_RUNNING, &dev->phy.state))
262 		return dev->mcu_ops->mcu_wr_rp(dev, base, data, n);
263 	else
264 		return mt76u_req_wr_rp(dev, base, data, n);
265 }
266 
267 static int
mt76u_req_rd_rp(struct mt76_dev * dev,u32 base,struct mt76_reg_pair * data,int len)268 mt76u_req_rd_rp(struct mt76_dev *dev, u32 base, struct mt76_reg_pair *data,
269 		int len)
270 {
271 	struct mt76_usb *usb = &dev->usb;
272 
273 	mutex_lock(&usb->usb_ctrl_mtx);
274 	while (len > 0) {
275 		data->value = __mt76u_rr(dev, base + data->reg);
276 		len--;
277 		data++;
278 	}
279 	mutex_unlock(&usb->usb_ctrl_mtx);
280 
281 	return 0;
282 }
283 
284 static int
mt76u_rd_rp(struct mt76_dev * dev,u32 base,struct mt76_reg_pair * data,int n)285 mt76u_rd_rp(struct mt76_dev *dev, u32 base,
286 	    struct mt76_reg_pair *data, int n)
287 {
288 	if (test_bit(MT76_STATE_MCU_RUNNING, &dev->phy.state))
289 		return dev->mcu_ops->mcu_rd_rp(dev, base, data, n);
290 	else
291 		return mt76u_req_rd_rp(dev, base, data, n);
292 }
293 
mt76u_check_sg(struct mt76_dev * dev)294 static bool mt76u_check_sg(struct mt76_dev *dev)
295 {
296 	struct usb_interface *uintf = to_usb_interface(dev->dev);
297 	struct usb_device *udev = interface_to_usbdev(uintf);
298 
299 	return (!disable_usb_sg && udev->bus->sg_tablesize > 0 &&
300 		udev->bus->no_sg_constraint);
301 }
302 
303 static int
mt76u_set_endpoints(struct usb_interface * intf,struct mt76_usb * usb)304 mt76u_set_endpoints(struct usb_interface *intf,
305 		    struct mt76_usb *usb)
306 {
307 	struct usb_host_interface *intf_desc = intf->cur_altsetting;
308 	struct usb_endpoint_descriptor *ep_desc;
309 	int i, in_ep = 0, out_ep = 0;
310 
311 	for (i = 0; i < intf_desc->desc.bNumEndpoints; i++) {
312 		ep_desc = &intf_desc->endpoint[i].desc;
313 
314 		if (usb_endpoint_is_bulk_in(ep_desc) &&
315 		    in_ep < __MT_EP_IN_MAX) {
316 			usb->in_ep[in_ep] = usb_endpoint_num(ep_desc);
317 			in_ep++;
318 		} else if (usb_endpoint_is_bulk_out(ep_desc) &&
319 			   out_ep < __MT_EP_OUT_MAX) {
320 			usb->out_ep[out_ep] = usb_endpoint_num(ep_desc);
321 			out_ep++;
322 		}
323 	}
324 
325 	if (in_ep != __MT_EP_IN_MAX || out_ep != __MT_EP_OUT_MAX)
326 		return -EINVAL;
327 	return 0;
328 }
329 
330 static int
mt76u_fill_rx_sg(struct mt76_dev * dev,struct mt76_queue * q,struct urb * urb,int nsgs)331 mt76u_fill_rx_sg(struct mt76_dev *dev, struct mt76_queue *q, struct urb *urb,
332 		 int nsgs)
333 {
334 	int i;
335 
336 	for (i = 0; i < nsgs; i++) {
337 		void *data;
338 		int offset;
339 
340 		data = mt76_get_page_pool_buf(q, &offset, q->buf_size);
341 		if (!data)
342 			break;
343 
344 		sg_set_page(&urb->sg[i], virt_to_head_page(data), q->buf_size,
345 			    offset);
346 	}
347 
348 	if (i < nsgs) {
349 		int j;
350 
351 		for (j = nsgs; j < urb->num_sgs; j++)
352 			mt76_put_page_pool_buf(sg_virt(&urb->sg[j]), false);
353 		urb->num_sgs = i;
354 	}
355 
356 	urb->num_sgs = max_t(int, i, urb->num_sgs);
357 	urb->transfer_buffer_length = urb->num_sgs * q->buf_size;
358 	sg_init_marker(urb->sg, urb->num_sgs);
359 
360 	return i ? : -ENOMEM;
361 }
362 
363 static int
mt76u_refill_rx(struct mt76_dev * dev,struct mt76_queue * q,struct urb * urb,int nsgs)364 mt76u_refill_rx(struct mt76_dev *dev, struct mt76_queue *q,
365 		struct urb *urb, int nsgs)
366 {
367 	enum mt76_rxq_id qid = q - &dev->q_rx[MT_RXQ_MAIN];
368 	int offset;
369 
370 	if (qid == MT_RXQ_MAIN && dev->usb.sg_en)
371 		return mt76u_fill_rx_sg(dev, q, urb, nsgs);
372 
373 	urb->transfer_buffer_length = q->buf_size;
374 	urb->transfer_buffer = mt76_get_page_pool_buf(q, &offset, q->buf_size);
375 
376 	return urb->transfer_buffer ? 0 : -ENOMEM;
377 }
378 
379 static int
mt76u_urb_alloc(struct mt76_dev * dev,struct mt76_queue_entry * e,int sg_max_size)380 mt76u_urb_alloc(struct mt76_dev *dev, struct mt76_queue_entry *e,
381 		int sg_max_size)
382 {
383 	unsigned int size = sizeof(struct urb);
384 
385 	if (dev->usb.sg_en)
386 		size += sg_max_size * sizeof(struct scatterlist);
387 
388 	e->urb = kzalloc(size, GFP_KERNEL);
389 	if (!e->urb)
390 		return -ENOMEM;
391 
392 	usb_init_urb(e->urb);
393 
394 	if (dev->usb.sg_en && sg_max_size > 0)
395 		e->urb->sg = (struct scatterlist *)(e->urb + 1);
396 
397 	return 0;
398 }
399 
400 static int
mt76u_rx_urb_alloc(struct mt76_dev * dev,struct mt76_queue * q,struct mt76_queue_entry * e)401 mt76u_rx_urb_alloc(struct mt76_dev *dev, struct mt76_queue *q,
402 		   struct mt76_queue_entry *e)
403 {
404 	enum mt76_rxq_id qid = q - &dev->q_rx[MT_RXQ_MAIN];
405 	int err, sg_size;
406 
407 	sg_size = qid == MT_RXQ_MAIN ? MT_RX_SG_MAX_SIZE : 0;
408 	err = mt76u_urb_alloc(dev, e, sg_size);
409 	if (err)
410 		return err;
411 
412 	return mt76u_refill_rx(dev, q, e->urb, sg_size);
413 }
414 
mt76u_urb_free(struct urb * urb)415 static void mt76u_urb_free(struct urb *urb)
416 {
417 	int i;
418 
419 	for (i = 0; i < urb->num_sgs; i++)
420 		mt76_put_page_pool_buf(sg_virt(&urb->sg[i]), false);
421 
422 	if (urb->transfer_buffer)
423 		mt76_put_page_pool_buf(urb->transfer_buffer, false);
424 
425 	usb_free_urb(urb);
426 }
427 
428 static void
mt76u_fill_bulk_urb(struct mt76_dev * dev,int dir,int index,struct urb * urb,usb_complete_t complete_fn,void * context)429 mt76u_fill_bulk_urb(struct mt76_dev *dev, int dir, int index,
430 		    struct urb *urb, usb_complete_t complete_fn,
431 		    void *context)
432 {
433 	struct usb_interface *uintf = to_usb_interface(dev->dev);
434 	struct usb_device *udev = interface_to_usbdev(uintf);
435 	unsigned int pipe;
436 
437 	if (dir == USB_DIR_IN)
438 		pipe = usb_rcvbulkpipe(udev, dev->usb.in_ep[index]);
439 	else
440 		pipe = usb_sndbulkpipe(udev, dev->usb.out_ep[index]);
441 
442 	urb->dev = udev;
443 	urb->pipe = pipe;
444 	urb->complete = complete_fn;
445 	urb->context = context;
446 }
447 
448 static struct urb *
mt76u_get_next_rx_entry(struct mt76_queue * q)449 mt76u_get_next_rx_entry(struct mt76_queue *q)
450 {
451 	struct urb *urb = NULL;
452 	unsigned long flags;
453 
454 	spin_lock_irqsave(&q->lock, flags);
455 	if (q->queued > 0) {
456 		urb = q->entry[q->tail].urb;
457 		q->tail = (q->tail + 1) % q->ndesc;
458 		q->queued--;
459 	}
460 	spin_unlock_irqrestore(&q->lock, flags);
461 
462 	return urb;
463 }
464 
465 static int
mt76u_get_rx_entry_len(struct mt76_dev * dev,u8 * data,u32 data_len)466 mt76u_get_rx_entry_len(struct mt76_dev *dev, u8 *data,
467 		       u32 data_len)
468 {
469 	u16 dma_len, min_len;
470 
471 	dma_len = get_unaligned_le16(data);
472 	if (dev->drv->drv_flags & MT_DRV_RX_DMA_HDR)
473 		return dma_len;
474 
475 	min_len = MT_DMA_HDR_LEN + MT_RX_RXWI_LEN + MT_FCE_INFO_LEN;
476 	if (data_len < min_len || !dma_len ||
477 	    dma_len + MT_DMA_HDR_LEN > data_len ||
478 	    (dma_len & 0x3))
479 		return -EINVAL;
480 	return dma_len;
481 }
482 
483 static struct sk_buff *
mt76u_build_rx_skb(struct mt76_dev * dev,void * data,int len,int buf_size)484 mt76u_build_rx_skb(struct mt76_dev *dev, void *data,
485 		   int len, int buf_size)
486 {
487 	int head_room, drv_flags = dev->drv->drv_flags;
488 	struct sk_buff *skb;
489 
490 	head_room = drv_flags & MT_DRV_RX_DMA_HDR ? 0 : MT_DMA_HDR_LEN;
491 	if (SKB_WITH_OVERHEAD(buf_size) < head_room + len) {
492 		struct page *page;
493 
494 		/* slow path, not enough space for data and
495 		 * skb_shared_info
496 		 */
497 		skb = alloc_skb(MT_SKB_HEAD_LEN, GFP_ATOMIC);
498 		if (!skb)
499 			return NULL;
500 
501 		skb_put_data(skb, data + head_room, MT_SKB_HEAD_LEN);
502 		data += head_room + MT_SKB_HEAD_LEN;
503 		page = virt_to_head_page(data);
504 		skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags,
505 				page, data - page_address(page),
506 				len - MT_SKB_HEAD_LEN, buf_size);
507 
508 		return skb;
509 	}
510 
511 	/* fast path */
512 	skb = build_skb(data, buf_size);
513 	if (!skb)
514 		return NULL;
515 
516 	skb_reserve(skb, head_room);
517 	__skb_put(skb, len);
518 
519 	return skb;
520 }
521 
522 static int
mt76u_process_rx_entry(struct mt76_dev * dev,struct urb * urb,int buf_size)523 mt76u_process_rx_entry(struct mt76_dev *dev, struct urb *urb,
524 		       int buf_size)
525 {
526 	u8 *data = urb->num_sgs ? sg_virt(&urb->sg[0]) : urb->transfer_buffer;
527 	int data_len = urb->num_sgs ? urb->sg[0].length : urb->actual_length;
528 	int len, nsgs = 1, head_room, drv_flags = dev->drv->drv_flags;
529 	struct sk_buff *skb;
530 
531 	if (!test_bit(MT76_STATE_INITIALIZED, &dev->phy.state))
532 		return 0;
533 
534 	len = mt76u_get_rx_entry_len(dev, data, urb->actual_length);
535 	if (len < 0)
536 		return 0;
537 
538 	head_room = drv_flags & MT_DRV_RX_DMA_HDR ? 0 : MT_DMA_HDR_LEN;
539 	data_len = min_t(int, len, data_len - head_room);
540 
541 	if (len == data_len &&
542 	    dev->drv->rx_check && !dev->drv->rx_check(dev, data, data_len))
543 		return 0;
544 
545 	skb = mt76u_build_rx_skb(dev, data, data_len, buf_size);
546 	if (!skb)
547 		return 0;
548 
549 	len -= data_len;
550 	while (len > 0 && nsgs < urb->num_sgs) {
551 		data_len = min_t(int, len, urb->sg[nsgs].length);
552 		skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags,
553 				sg_page(&urb->sg[nsgs]),
554 				urb->sg[nsgs].offset, data_len,
555 				buf_size);
556 		len -= data_len;
557 		nsgs++;
558 	}
559 
560 	skb_mark_for_recycle(skb);
561 	dev->drv->rx_skb(dev, MT_RXQ_MAIN, skb, NULL);
562 
563 	return nsgs;
564 }
565 
mt76u_complete_rx(struct urb * urb)566 static void mt76u_complete_rx(struct urb *urb)
567 {
568 	struct mt76_dev *dev = dev_get_drvdata(&urb->dev->dev);
569 	struct mt76_queue *q = urb->context;
570 	unsigned long flags;
571 
572 	trace_rx_urb(dev, urb);
573 
574 	switch (urb->status) {
575 	case -ECONNRESET:
576 	case -ESHUTDOWN:
577 	case -ENOENT:
578 	case -EPROTO:
579 		return;
580 	default:
581 		dev_err_ratelimited(dev->dev, "rx urb failed: %d\n",
582 				    urb->status);
583 		fallthrough;
584 	case 0:
585 		break;
586 	}
587 
588 	spin_lock_irqsave(&q->lock, flags);
589 	if (WARN_ONCE(q->entry[q->head].urb != urb, "rx urb mismatch"))
590 		goto out;
591 
592 	q->head = (q->head + 1) % q->ndesc;
593 	q->queued++;
594 
595 	if (q == &dev->q_rx[MT_RXQ_MAIN])
596 		napi_schedule(&dev->napi[MT_RXQ_MAIN]);
597 	else
598 		mt76_worker_schedule(&dev->usb.rx_worker);
599 out:
600 	spin_unlock_irqrestore(&q->lock, flags);
601 }
602 
603 static int
mt76u_submit_rx_buf(struct mt76_dev * dev,enum mt76_rxq_id qid,struct urb * urb)604 mt76u_submit_rx_buf(struct mt76_dev *dev, enum mt76_rxq_id qid,
605 		    struct urb *urb)
606 {
607 	int ep = qid == MT_RXQ_MAIN ? MT_EP_IN_PKT_RX : MT_EP_IN_CMD_RESP;
608 
609 	mt76u_fill_bulk_urb(dev, USB_DIR_IN, ep, urb,
610 			    mt76u_complete_rx, &dev->q_rx[qid]);
611 	trace_submit_urb(dev, urb);
612 
613 	return usb_submit_urb(urb, GFP_ATOMIC);
614 }
615 
616 static void
mt76u_process_rx_queue(struct mt76_dev * dev,struct mt76_queue * q)617 mt76u_process_rx_queue(struct mt76_dev *dev, struct mt76_queue *q)
618 {
619 	int qid = q - &dev->q_rx[MT_RXQ_MAIN];
620 	struct urb *urb;
621 	int err, count;
622 
623 	while (true) {
624 		urb = mt76u_get_next_rx_entry(q);
625 		if (!urb)
626 			break;
627 
628 		count = mt76u_process_rx_entry(dev, urb, q->buf_size);
629 		if (count > 0) {
630 			err = mt76u_refill_rx(dev, q, urb, count);
631 			if (err < 0)
632 				break;
633 		}
634 		mt76u_submit_rx_buf(dev, qid, urb);
635 	}
636 }
637 
638 /* Threaded NAPI poll for the MAIN RX queue: drain URBs, build skbs, resubmit,
639  * then deliver through napi_gro_receive() and let napi_complete() flush GRO.
640  */
mt76u_napi_poll(struct napi_struct * napi,int budget)641 static int mt76u_napi_poll(struct napi_struct *napi, int budget)
642 {
643 	struct mt76_dev *dev = mt76_priv(napi->dev);
644 
645 	rcu_read_lock();
646 	mt76u_process_rx_queue(dev, &dev->q_rx[MT_RXQ_MAIN]);
647 	mt76_rx_poll_complete(dev, MT_RXQ_MAIN, napi);
648 	rcu_read_unlock();
649 
650 	napi_complete(napi);
651 
652 	return 0;
653 }
654 
mt76u_rx_worker(struct mt76_worker * w)655 static void mt76u_rx_worker(struct mt76_worker *w)
656 {
657 	struct mt76_usb *usb = container_of(w, struct mt76_usb, rx_worker);
658 	struct mt76_dev *dev = container_of(usb, struct mt76_dev, usb);
659 	int i;
660 
661 	rcu_read_lock();
662 	mt76_for_each_q_rx(dev, i) {
663 		/* MT_RXQ_MAIN is serviced by the threaded NAPI poll */
664 		if (i == MT_RXQ_MAIN)
665 			continue;
666 
667 		mt76u_process_rx_queue(dev, &dev->q_rx[i]);
668 	}
669 	rcu_read_unlock();
670 }
671 
672 static int
mt76u_submit_rx_buffers(struct mt76_dev * dev,enum mt76_rxq_id qid)673 mt76u_submit_rx_buffers(struct mt76_dev *dev, enum mt76_rxq_id qid)
674 {
675 	struct mt76_queue *q = &dev->q_rx[qid];
676 	unsigned long flags;
677 	int i, err = 0;
678 
679 	spin_lock_irqsave(&q->lock, flags);
680 	for (i = 0; i < q->ndesc; i++) {
681 		err = mt76u_submit_rx_buf(dev, qid, q->entry[i].urb);
682 		if (err < 0)
683 			break;
684 	}
685 	q->head = q->tail = 0;
686 	q->queued = 0;
687 	spin_unlock_irqrestore(&q->lock, flags);
688 
689 	return err;
690 }
691 
692 static int
mt76u_alloc_rx_queue(struct mt76_dev * dev,enum mt76_rxq_id qid)693 mt76u_alloc_rx_queue(struct mt76_dev *dev, enum mt76_rxq_id qid)
694 {
695 	struct mt76_queue *q = &dev->q_rx[qid];
696 	int i, err;
697 
698 	err = mt76_create_page_pool(dev, q);
699 	if (err)
700 		return err;
701 
702 	spin_lock_init(&q->lock);
703 	q->entry = devm_kcalloc(dev->dev,
704 				MT_NUM_RX_ENTRIES, sizeof(*q->entry),
705 				GFP_KERNEL);
706 	if (!q->entry)
707 		return -ENOMEM;
708 
709 	q->ndesc = MT_NUM_RX_ENTRIES;
710 	q->buf_size = PAGE_SIZE;
711 
712 	for (i = 0; i < q->ndesc; i++) {
713 		err = mt76u_rx_urb_alloc(dev, q, &q->entry[i]);
714 		if (err < 0)
715 			return err;
716 	}
717 
718 	return mt76u_submit_rx_buffers(dev, qid);
719 }
720 
mt76u_alloc_mcu_queue(struct mt76_dev * dev)721 int mt76u_alloc_mcu_queue(struct mt76_dev *dev)
722 {
723 	return mt76u_alloc_rx_queue(dev, MT_RXQ_MCU);
724 }
725 EXPORT_SYMBOL_GPL(mt76u_alloc_mcu_queue);
726 
727 static void
mt76u_free_rx_queue(struct mt76_dev * dev,struct mt76_queue * q)728 mt76u_free_rx_queue(struct mt76_dev *dev, struct mt76_queue *q)
729 {
730 	int i;
731 
732 	for (i = 0; i < q->ndesc; i++) {
733 		if (!q->entry[i].urb)
734 			continue;
735 
736 		mt76u_urb_free(q->entry[i].urb);
737 		q->entry[i].urb = NULL;
738 	}
739 	page_pool_destroy(q->page_pool);
740 	q->page_pool = NULL;
741 }
742 
mt76u_free_rx(struct mt76_dev * dev)743 static void mt76u_free_rx(struct mt76_dev *dev)
744 {
745 	int i;
746 
747 	mt76_worker_teardown(&dev->usb.rx_worker);
748 
749 	mt76_for_each_q_rx(dev, i)
750 		mt76u_free_rx_queue(dev, &dev->q_rx[i]);
751 }
752 
mt76u_stop_rx(struct mt76_dev * dev)753 void mt76u_stop_rx(struct mt76_dev *dev)
754 {
755 	int i;
756 
757 	mt76_worker_disable(&dev->usb.rx_worker);
758 
759 	mt76_for_each_q_rx(dev, i) {
760 		struct mt76_queue *q = &dev->q_rx[i];
761 		int j;
762 
763 		for (j = 0; j < q->ndesc; j++)
764 			usb_poison_urb(q->entry[j].urb);
765 	}
766 
767 	/* The MAIN queue napi stays enabled for the device lifetime. The URBs
768 	 * are now poisoned, so mt76u_complete_rx() can no longer reschedule it;
769 	 * just drain any in-flight poll before the caller frees or resets.
770 	 */
771 	if (dev->napi_dev)
772 		napi_synchronize(&dev->napi[MT_RXQ_MAIN]);
773 }
774 EXPORT_SYMBOL_GPL(mt76u_stop_rx);
775 
mt76u_resume_rx(struct mt76_dev * dev)776 int mt76u_resume_rx(struct mt76_dev *dev)
777 {
778 	int i;
779 
780 	mt76_for_each_q_rx(dev, i) {
781 		struct mt76_queue *q = &dev->q_rx[i];
782 		int err, j;
783 
784 		for (j = 0; j < q->ndesc; j++)
785 			usb_unpoison_urb(q->entry[j].urb);
786 
787 		err = mt76u_submit_rx_buffers(dev, i);
788 		if (err < 0)
789 			return err;
790 	}
791 
792 	mt76_worker_enable(&dev->usb.rx_worker);
793 
794 	return 0;
795 }
796 EXPORT_SYMBOL_GPL(mt76u_resume_rx);
797 
mt76u_status_worker(struct mt76_worker * w)798 static void mt76u_status_worker(struct mt76_worker *w)
799 {
800 	struct mt76_usb *usb = container_of(w, struct mt76_usb, status_worker);
801 	struct mt76_dev *dev = container_of(usb, struct mt76_dev, usb);
802 	struct mt76_queue_entry entry;
803 	struct mt76_queue *q;
804 	int i;
805 
806 	if (!test_bit(MT76_STATE_RUNNING, &dev->phy.state))
807 		return;
808 
809 	for (i = 0; i <= MT_TXQ_PSD; i++) {
810 		q = dev->phy.q_tx[i];
811 		if (!q)
812 			continue;
813 
814 		while (q->queued > 0) {
815 			if (!q->entry[q->tail].done)
816 				break;
817 
818 			entry = q->entry[q->tail];
819 			q->entry[q->tail].done = false;
820 
821 			mt76_queue_tx_complete(dev, q, &entry);
822 		}
823 
824 		if (!q->queued)
825 			wake_up(&dev->tx_wait);
826 
827 		mt76_worker_schedule(&dev->tx_worker);
828 	}
829 
830 	if (dev->drv->tx_status_data &&
831 	    !test_and_set_bit(MT76_READING_STATS, &dev->phy.state))
832 		queue_work(dev->wq, &dev->usb.stat_work);
833 }
834 
mt76u_tx_status_data(struct work_struct * work)835 static void mt76u_tx_status_data(struct work_struct *work)
836 {
837 	struct mt76_usb *usb;
838 	struct mt76_dev *dev;
839 	u8 update = 1;
840 	u16 count = 0;
841 
842 	usb = container_of(work, struct mt76_usb, stat_work);
843 	dev = container_of(usb, struct mt76_dev, usb);
844 
845 	while (true) {
846 		if (test_bit(MT76_REMOVED, &dev->phy.state))
847 			break;
848 
849 		if (!dev->drv->tx_status_data(dev, &update))
850 			break;
851 		count++;
852 	}
853 
854 	if (count && test_bit(MT76_STATE_RUNNING, &dev->phy.state))
855 		queue_work(dev->wq, &usb->stat_work);
856 	else
857 		clear_bit(MT76_READING_STATS, &dev->phy.state);
858 }
859 
mt76u_complete_tx(struct urb * urb)860 static void mt76u_complete_tx(struct urb *urb)
861 {
862 	struct mt76_dev *dev = dev_get_drvdata(&urb->dev->dev);
863 	struct mt76_queue_entry *e = urb->context;
864 
865 	if (mt76u_urb_error(urb))
866 		dev_err(dev->dev, "tx urb failed: %d\n", urb->status);
867 	e->done = true;
868 
869 	mt76_worker_schedule(&dev->usb.status_worker);
870 }
871 
872 static int
mt76u_tx_setup_buffers(struct mt76_dev * dev,struct sk_buff * skb,struct urb * urb)873 mt76u_tx_setup_buffers(struct mt76_dev *dev, struct sk_buff *skb,
874 		       struct urb *urb)
875 {
876 	urb->transfer_buffer_length = skb->len;
877 
878 	if (!dev->usb.sg_en) {
879 		urb->transfer_buffer = skb->data;
880 		return 0;
881 	}
882 
883 	sg_init_table(urb->sg, MT_TX_SG_MAX_SIZE);
884 	urb->num_sgs = skb_to_sgvec(skb, urb->sg, 0, skb->len);
885 	if (!urb->num_sgs)
886 		return -ENOMEM;
887 
888 	return urb->num_sgs;
889 }
890 
891 static int
mt76u_tx_queue_skb(struct mt76_phy * phy,struct mt76_queue * q,enum mt76_txq_id qid,struct sk_buff * skb,struct mt76_wcid * wcid,struct ieee80211_sta * sta)892 mt76u_tx_queue_skb(struct mt76_phy *phy, struct mt76_queue *q,
893 		   enum mt76_txq_id qid, struct sk_buff *skb,
894 		   struct mt76_wcid *wcid, struct ieee80211_sta *sta)
895 {
896 	struct mt76_tx_info tx_info = {
897 		.skb = skb,
898 	};
899 	struct mt76_dev *dev = phy->dev;
900 	u16 idx = q->head;
901 	int err;
902 
903 	if (q->queued == q->ndesc)
904 		return -ENOSPC;
905 
906 	skb->prev = skb->next = NULL;
907 	err = dev->drv->tx_prepare_skb(dev, NULL, qid, wcid, sta, &tx_info);
908 	if (err < 0)
909 		return err;
910 
911 	err = mt76u_tx_setup_buffers(dev, tx_info.skb, q->entry[idx].urb);
912 	if (err < 0)
913 		return err;
914 
915 	mt76u_fill_bulk_urb(dev, USB_DIR_OUT, q->ep, q->entry[idx].urb,
916 			    mt76u_complete_tx, &q->entry[idx]);
917 
918 	q->head = (q->head + 1) % q->ndesc;
919 	q->entry[idx].skb = tx_info.skb;
920 	q->entry[idx].wcid = 0xffff;
921 	q->queued++;
922 
923 	return idx;
924 }
925 
mt76u_tx_kick(struct mt76_dev * dev,struct mt76_queue * q)926 static void mt76u_tx_kick(struct mt76_dev *dev, struct mt76_queue *q)
927 {
928 	struct urb *urb;
929 	int err;
930 
931 	while (q->first != q->head) {
932 		urb = q->entry[q->first].urb;
933 
934 		trace_submit_urb(dev, urb);
935 		err = usb_submit_urb(urb, GFP_ATOMIC);
936 		if (err < 0) {
937 			if (err == -ENODEV)
938 				set_bit(MT76_REMOVED, &dev->phy.state);
939 			else
940 				dev_err(dev->dev, "tx urb submit failed:%d\n",
941 					err);
942 			break;
943 		}
944 		q->first = (q->first + 1) % q->ndesc;
945 	}
946 }
947 
948 static void
mt76u_ac_to_hwq(struct mt76_dev * dev,struct mt76_queue * q,u8 qid)949 mt76u_ac_to_hwq(struct mt76_dev *dev, struct mt76_queue *q, u8 qid)
950 {
951 	u8 ac = qid < IEEE80211_NUM_ACS ? qid : IEEE80211_AC_BE;
952 
953 	switch (mt76_chip(dev)) {
954 	case 0x7663: {
955 		static const u8 lmac_queue_map[] = {
956 			/* ac to lmac mapping */
957 			[IEEE80211_AC_BK] = 0,
958 			[IEEE80211_AC_BE] = 1,
959 			[IEEE80211_AC_VI] = 2,
960 			[IEEE80211_AC_VO] = 4,
961 		};
962 
963 		q->hw_idx = lmac_queue_map[ac];
964 		q->ep = q->hw_idx + 1;
965 		break;
966 	}
967 	case 0x6639:
968 	case 0x7902:
969 	case 0x7961:
970 	case 0x7925:
971 		q->hw_idx = mt76_ac_to_hwq(ac);
972 		q->ep = qid == MT_TXQ_PSD ? MT_EP_OUT_HCCA : q->hw_idx + 1;
973 		break;
974 	default:
975 		q->hw_idx = mt76_ac_to_hwq(ac);
976 		q->ep = q->hw_idx + 1;
977 		break;
978 	}
979 }
980 
mt76u_alloc_tx(struct mt76_dev * dev)981 static int mt76u_alloc_tx(struct mt76_dev *dev)
982 {
983 	int i;
984 
985 	for (i = 0; i <= MT_TXQ_PSD; i++) {
986 		struct mt76_queue *q;
987 		int j, err;
988 
989 		q = devm_kzalloc(dev->dev, sizeof(*q), GFP_KERNEL);
990 		if (!q)
991 			return -ENOMEM;
992 
993 		spin_lock_init(&q->lock);
994 		mt76u_ac_to_hwq(dev, q, i);
995 		dev->phy.q_tx[i] = q;
996 
997 		q->entry = devm_kcalloc(dev->dev,
998 					MT_NUM_TX_ENTRIES, sizeof(*q->entry),
999 					GFP_KERNEL);
1000 		if (!q->entry)
1001 			return -ENOMEM;
1002 
1003 		q->ndesc = MT_NUM_TX_ENTRIES;
1004 		for (j = 0; j < q->ndesc; j++) {
1005 			err = mt76u_urb_alloc(dev, &q->entry[j],
1006 					      MT_TX_SG_MAX_SIZE);
1007 			if (err < 0)
1008 				return err;
1009 		}
1010 	}
1011 	return 0;
1012 }
1013 
mt76u_free_tx(struct mt76_dev * dev)1014 static void mt76u_free_tx(struct mt76_dev *dev)
1015 {
1016 	int i;
1017 
1018 	mt76_worker_teardown(&dev->usb.status_worker);
1019 
1020 	for (i = 0; i <= MT_TXQ_PSD; i++) {
1021 		struct mt76_queue *q;
1022 		int j;
1023 
1024 		q = dev->phy.q_tx[i];
1025 		if (!q)
1026 			continue;
1027 
1028 		for (j = 0; j < q->ndesc; j++) {
1029 			usb_free_urb(q->entry[j].urb);
1030 			q->entry[j].urb = NULL;
1031 		}
1032 	}
1033 }
1034 
mt76u_stop_tx(struct mt76_dev * dev)1035 void mt76u_stop_tx(struct mt76_dev *dev)
1036 {
1037 	int ret;
1038 
1039 	mt76_worker_disable(&dev->usb.status_worker);
1040 
1041 	ret = wait_event_timeout(dev->tx_wait, !mt76_has_tx_pending(&dev->phy),
1042 				 HZ / 5);
1043 	if (!ret) {
1044 		struct mt76_queue_entry entry;
1045 		struct mt76_queue *q;
1046 		int i, j;
1047 
1048 		dev_err(dev->dev, "timed out waiting for pending tx\n");
1049 
1050 		for (i = 0; i <= MT_TXQ_PSD; i++) {
1051 			q = dev->phy.q_tx[i];
1052 			if (!q)
1053 				continue;
1054 
1055 			for (j = 0; j < q->ndesc; j++)
1056 				usb_kill_urb(q->entry[j].urb);
1057 		}
1058 
1059 		mt76_worker_disable(&dev->tx_worker);
1060 
1061 		/* On device removal we maight queue skb's, but mt76u_tx_kick()
1062 		 * will fail to submit urb, cleanup those skb's manually.
1063 		 */
1064 		for (i = 0; i <= MT_TXQ_PSD; i++) {
1065 			q = dev->phy.q_tx[i];
1066 			if (!q)
1067 				continue;
1068 
1069 			while (q->queued > 0) {
1070 				entry = q->entry[q->tail];
1071 				q->entry[q->tail].done = false;
1072 				mt76_queue_tx_complete(dev, q, &entry);
1073 			}
1074 		}
1075 
1076 		mt76_worker_enable(&dev->tx_worker);
1077 	}
1078 
1079 	cancel_work_sync(&dev->usb.stat_work);
1080 	clear_bit(MT76_READING_STATS, &dev->phy.state);
1081 
1082 	mt76_worker_enable(&dev->usb.status_worker);
1083 
1084 	mt76_tx_status_check(dev, true);
1085 }
1086 EXPORT_SYMBOL_GPL(mt76u_stop_tx);
1087 
mt76u_queues_deinit(struct mt76_dev * dev)1088 void mt76u_queues_deinit(struct mt76_dev *dev)
1089 {
1090 	mt76u_stop_rx(dev);
1091 	mt76u_stop_tx(dev);
1092 
1093 	if (dev->napi_dev) {
1094 		napi_disable(&dev->napi[MT_RXQ_MAIN]);
1095 		netif_napi_del(&dev->napi[MT_RXQ_MAIN]);
1096 		free_netdev(dev->napi_dev);
1097 		dev->napi_dev = NULL;
1098 	}
1099 
1100 	mt76u_free_rx(dev);
1101 	mt76u_free_tx(dev);
1102 }
1103 EXPORT_SYMBOL_GPL(mt76u_queues_deinit);
1104 
mt76u_alloc_queues(struct mt76_dev * dev)1105 int mt76u_alloc_queues(struct mt76_dev *dev)
1106 {
1107 	int err;
1108 
1109 	err = mt76u_alloc_rx_queue(dev, MT_RXQ_MAIN);
1110 	if (err < 0)
1111 		return err;
1112 
1113 	return mt76u_alloc_tx(dev);
1114 }
1115 EXPORT_SYMBOL_GPL(mt76u_alloc_queues);
1116 
1117 static const struct mt76_queue_ops usb_queue_ops = {
1118 	.tx_queue_skb = mt76u_tx_queue_skb,
1119 	.kick = mt76u_tx_kick,
1120 };
1121 
__mt76u_init(struct mt76_dev * dev,struct usb_interface * intf,struct mt76_bus_ops * ops)1122 int __mt76u_init(struct mt76_dev *dev, struct usb_interface *intf,
1123 		 struct mt76_bus_ops *ops)
1124 {
1125 	struct usb_device *udev = interface_to_usbdev(intf);
1126 	struct mt76_usb *usb = &dev->usb;
1127 	struct mt76_dev **priv;
1128 	int err;
1129 
1130 	INIT_WORK(&usb->stat_work, mt76u_tx_status_data);
1131 
1132 	usb->data_len = usb_maxpacket(udev, usb_sndctrlpipe(udev, 0));
1133 	if (usb->data_len < 32)
1134 		usb->data_len = 32;
1135 
1136 	usb->data = devm_kmalloc(dev->dev, usb->data_len, GFP_KERNEL);
1137 	if (!usb->data)
1138 		return -ENOMEM;
1139 
1140 	mutex_init(&usb->usb_ctrl_mtx);
1141 	dev->bus = ops;
1142 	dev->queue_ops = &usb_queue_ops;
1143 
1144 	dev_set_drvdata(&udev->dev, dev);
1145 
1146 	usb->sg_en = mt76u_check_sg(dev);
1147 
1148 	err = mt76u_set_endpoints(intf, usb);
1149 	if (err < 0)
1150 		return err;
1151 
1152 	err = mt76_worker_setup(dev->hw, &usb->rx_worker, mt76u_rx_worker,
1153 				"usb-rx");
1154 	if (err)
1155 		return err;
1156 
1157 	err = mt76_worker_setup(dev->hw, &usb->status_worker,
1158 				mt76u_status_worker, "usb-status");
1159 	if (err)
1160 		return err;
1161 
1162 	sched_set_fifo_low(usb->rx_worker.task);
1163 	sched_set_fifo_low(usb->status_worker.task);
1164 
1165 	/* threaded NAPI on a dummy netdev (reusing mt76_dev's napi_dev/napi[])
1166 	 * services the MAIN RX queue and gives the RX path GRO
1167 	 */
1168 	dev->napi_dev = alloc_netdev_dummy(sizeof(struct mt76_dev *));
1169 	if (!dev->napi_dev)
1170 		return -ENOMEM;
1171 
1172 	priv = netdev_priv(dev->napi_dev);
1173 	*priv = dev;
1174 	strscpy(dev->napi_dev->name, "mt76u-rx", sizeof(dev->napi_dev->name));
1175 	dev->napi_dev->threaded = 1;
1176 	netif_napi_add(dev->napi_dev, &dev->napi[MT_RXQ_MAIN], mt76u_napi_poll);
1177 	napi_enable(&dev->napi[MT_RXQ_MAIN]);
1178 
1179 	return 0;
1180 }
1181 EXPORT_SYMBOL_GPL(__mt76u_init);
1182 
mt76u_init(struct mt76_dev * dev,struct usb_interface * intf)1183 int mt76u_init(struct mt76_dev *dev, struct usb_interface *intf)
1184 {
1185 	static struct mt76_bus_ops bus_ops = {
1186 		.rr = mt76u_rr,
1187 		.wr = mt76u_wr,
1188 		.rmw = mt76u_rmw,
1189 		.read_copy = mt76u_read_copy,
1190 		.write_copy = mt76u_copy,
1191 		.wr_rp = mt76u_wr_rp,
1192 		.rd_rp = mt76u_rd_rp,
1193 		.type = MT76_BUS_USB,
1194 	};
1195 
1196 	return __mt76u_init(dev, intf, &bus_ops);
1197 }
1198 EXPORT_SYMBOL_GPL(mt76u_init);
1199 
1200 MODULE_AUTHOR("Lorenzo Bianconi <lorenzo.bianconi83@gmail.com>");
1201 MODULE_DESCRIPTION("MediaTek MT76x USB helpers");
1202 MODULE_LICENSE("Dual BSD/GPL");
1203