1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * Copyright (C) 2015 Jakub Kicinski <kubakici@wp.pl>
4*4882a593Smuzhiyun */
5*4882a593Smuzhiyun
6*4882a593Smuzhiyun #ifndef __MT7601U_USB_H
7*4882a593Smuzhiyun #define __MT7601U_USB_H
8*4882a593Smuzhiyun
9*4882a593Smuzhiyun #include "mt7601u.h"
10*4882a593Smuzhiyun
11*4882a593Smuzhiyun #define MT7601U_FIRMWARE "mt7601u.bin"
12*4882a593Smuzhiyun
13*4882a593Smuzhiyun #define MT_VEND_REQ_MAX_RETRY 10
14*4882a593Smuzhiyun #define MT_VEND_REQ_TOUT_MS 300
15*4882a593Smuzhiyun
16*4882a593Smuzhiyun #define MT_VEND_DEV_MODE_RESET 1
17*4882a593Smuzhiyun
18*4882a593Smuzhiyun #define MT_VEND_BUF sizeof(__le32)
19*4882a593Smuzhiyun
20*4882a593Smuzhiyun enum mt_vendor_req {
21*4882a593Smuzhiyun MT_VEND_DEV_MODE = 1,
22*4882a593Smuzhiyun MT_VEND_WRITE = 2,
23*4882a593Smuzhiyun MT_VEND_MULTI_READ = 7,
24*4882a593Smuzhiyun MT_VEND_WRITE_FCE = 0x42,
25*4882a593Smuzhiyun };
26*4882a593Smuzhiyun
27*4882a593Smuzhiyun enum mt_usb_ep_in {
28*4882a593Smuzhiyun MT_EP_IN_PKT_RX,
29*4882a593Smuzhiyun MT_EP_IN_CMD_RESP,
30*4882a593Smuzhiyun __MT_EP_IN_MAX,
31*4882a593Smuzhiyun };
32*4882a593Smuzhiyun
33*4882a593Smuzhiyun enum mt_usb_ep_out {
34*4882a593Smuzhiyun MT_EP_OUT_INBAND_CMD,
35*4882a593Smuzhiyun MT_EP_OUT_AC_BK,
36*4882a593Smuzhiyun MT_EP_OUT_AC_BE,
37*4882a593Smuzhiyun MT_EP_OUT_AC_VI,
38*4882a593Smuzhiyun MT_EP_OUT_AC_VO,
39*4882a593Smuzhiyun MT_EP_OUT_HCCA,
40*4882a593Smuzhiyun __MT_EP_OUT_MAX,
41*4882a593Smuzhiyun };
42*4882a593Smuzhiyun
mt7601u_to_usb_dev(struct mt7601u_dev * mt7601u)43*4882a593Smuzhiyun static inline struct usb_device *mt7601u_to_usb_dev(struct mt7601u_dev *mt7601u)
44*4882a593Smuzhiyun {
45*4882a593Smuzhiyun return interface_to_usbdev(to_usb_interface(mt7601u->dev));
46*4882a593Smuzhiyun }
47*4882a593Smuzhiyun
mt7601u_urb_has_error(struct urb * urb)48*4882a593Smuzhiyun static inline bool mt7601u_urb_has_error(struct urb *urb)
49*4882a593Smuzhiyun {
50*4882a593Smuzhiyun return urb->status &&
51*4882a593Smuzhiyun urb->status != -ENOENT &&
52*4882a593Smuzhiyun urb->status != -ECONNRESET &&
53*4882a593Smuzhiyun urb->status != -ESHUTDOWN;
54*4882a593Smuzhiyun }
55*4882a593Smuzhiyun
56*4882a593Smuzhiyun bool mt7601u_usb_alloc_buf(struct mt7601u_dev *dev, size_t len,
57*4882a593Smuzhiyun struct mt7601u_dma_buf *buf);
58*4882a593Smuzhiyun void mt7601u_usb_free_buf(struct mt7601u_dev *dev, struct mt7601u_dma_buf *buf);
59*4882a593Smuzhiyun int mt7601u_usb_submit_buf(struct mt7601u_dev *dev, int dir, int ep_idx,
60*4882a593Smuzhiyun struct mt7601u_dma_buf *buf, gfp_t gfp,
61*4882a593Smuzhiyun usb_complete_t complete_fn, void *context);
62*4882a593Smuzhiyun void mt7601u_complete_urb(struct urb *urb);
63*4882a593Smuzhiyun
64*4882a593Smuzhiyun int mt7601u_vendor_request(struct mt7601u_dev *dev, const u8 req,
65*4882a593Smuzhiyun const u8 direction, const u16 val, const u16 offset,
66*4882a593Smuzhiyun void *buf, const size_t buflen);
67*4882a593Smuzhiyun void mt7601u_vendor_reset(struct mt7601u_dev *dev);
68*4882a593Smuzhiyun int mt7601u_vendor_single_wr(struct mt7601u_dev *dev, const u8 req,
69*4882a593Smuzhiyun const u16 offset, const u32 val);
70*4882a593Smuzhiyun
71*4882a593Smuzhiyun #endif
72