usb.c 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368
  1. /*
  2. * Copyright (C) 2015 Jakub Kicinski <kubakici@wp.pl>
  3. *
  4. * This program is free software; you can redistribute it and/or modify
  5. * it under the terms of the GNU General Public License version 2
  6. * as published by the Free Software Foundation
  7. *
  8. * This program is distributed in the hope that it will be useful,
  9. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. * GNU General Public License for more details.
  12. */
  13. #include <linux/kernel.h>
  14. #include <linux/module.h>
  15. #include <linux/usb.h>
  16. #include "mt7601u.h"
  17. #include "usb.h"
  18. #include "trace.h"
  19. static struct usb_device_id mt7601u_device_table[] = {
  20. { USB_DEVICE(0x0b05, 0x17d3) },
  21. { USB_DEVICE(0x0e8d, 0x760a) },
  22. { USB_DEVICE(0x0e8d, 0x760b) },
  23. { USB_DEVICE(0x13d3, 0x3431) },
  24. { USB_DEVICE(0x13d3, 0x3434) },
  25. { USB_DEVICE(0x148f, 0x7601) },
  26. { USB_DEVICE(0x148f, 0x760a) },
  27. { USB_DEVICE(0x148f, 0x760b) },
  28. { USB_DEVICE(0x148f, 0x760c) },
  29. { USB_DEVICE(0x148f, 0x760d) },
  30. { USB_DEVICE(0x2001, 0x3d04) },
  31. { USB_DEVICE(0x2717, 0x4106) },
  32. { USB_DEVICE(0x2955, 0x0001) },
  33. { USB_DEVICE(0x2955, 0x1001) },
  34. { USB_DEVICE(0x2a5f, 0x1000) },
  35. { USB_DEVICE(0x7392, 0x7710) },
  36. { 0, }
  37. };
  38. bool mt7601u_usb_alloc_buf(struct mt7601u_dev *dev, size_t len,
  39. struct mt7601u_dma_buf *buf)
  40. {
  41. struct usb_device *usb_dev = mt7601u_to_usb_dev(dev);
  42. buf->len = len;
  43. buf->urb = usb_alloc_urb(0, GFP_KERNEL);
  44. buf->buf = usb_alloc_coherent(usb_dev, buf->len, GFP_KERNEL, &buf->dma);
  45. return !buf->urb || !buf->buf;
  46. }
  47. void mt7601u_usb_free_buf(struct mt7601u_dev *dev, struct mt7601u_dma_buf *buf)
  48. {
  49. struct usb_device *usb_dev = mt7601u_to_usb_dev(dev);
  50. usb_free_coherent(usb_dev, buf->len, buf->buf, buf->dma);
  51. usb_free_urb(buf->urb);
  52. }
  53. int mt7601u_usb_submit_buf(struct mt7601u_dev *dev, int dir, int ep_idx,
  54. struct mt7601u_dma_buf *buf, gfp_t gfp,
  55. usb_complete_t complete_fn, void *context)
  56. {
  57. struct usb_device *usb_dev = mt7601u_to_usb_dev(dev);
  58. unsigned pipe;
  59. int ret;
  60. if (dir == USB_DIR_IN)
  61. pipe = usb_rcvbulkpipe(usb_dev, dev->in_eps[ep_idx]);
  62. else
  63. pipe = usb_sndbulkpipe(usb_dev, dev->out_eps[ep_idx]);
  64. usb_fill_bulk_urb(buf->urb, usb_dev, pipe, buf->buf, buf->len,
  65. complete_fn, context);
  66. buf->urb->transfer_dma = buf->dma;
  67. buf->urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
  68. trace_mt_submit_urb(dev, buf->urb);
  69. ret = usb_submit_urb(buf->urb, gfp);
  70. if (ret)
  71. dev_err(dev->dev, "Error: submit URB dir:%d ep:%d failed:%d\n",
  72. dir, ep_idx, ret);
  73. return ret;
  74. }
  75. void mt7601u_complete_urb(struct urb *urb)
  76. {
  77. struct completion *cmpl = urb->context;
  78. complete(cmpl);
  79. }
  80. static int
  81. __mt7601u_vendor_request(struct mt7601u_dev *dev, const u8 req,
  82. const u8 direction, const u16 val, const u16 offset,
  83. void *buf, const size_t buflen)
  84. {
  85. int i, ret;
  86. struct usb_device *usb_dev = mt7601u_to_usb_dev(dev);
  87. const u8 req_type = direction | USB_TYPE_VENDOR | USB_RECIP_DEVICE;
  88. const unsigned int pipe = (direction == USB_DIR_IN) ?
  89. usb_rcvctrlpipe(usb_dev, 0) : usb_sndctrlpipe(usb_dev, 0);
  90. for (i = 0; i < MT_VEND_REQ_MAX_RETRY; i++) {
  91. ret = usb_control_msg(usb_dev, pipe, req, req_type,
  92. val, offset, buf, buflen,
  93. MT_VEND_REQ_TOUT_MS);
  94. trace_mt_vend_req(dev, pipe, req, req_type, val, offset,
  95. buf, buflen, ret);
  96. if (ret >= 0 || ret == -ENODEV)
  97. return ret;
  98. msleep(5);
  99. }
  100. dev_err(dev->dev, "Vendor request req:%02x off:%04x failed:%d\n",
  101. req, offset, ret);
  102. return ret;
  103. }
  104. int
  105. mt7601u_vendor_request(struct mt7601u_dev *dev, const u8 req,
  106. const u8 direction, const u16 val, const u16 offset,
  107. void *buf, const size_t buflen)
  108. {
  109. int ret;
  110. mutex_lock(&dev->vendor_req_mutex);
  111. ret = __mt7601u_vendor_request(dev, req, direction, val, offset,
  112. buf, buflen);
  113. if (ret == -ENODEV)
  114. set_bit(MT7601U_STATE_REMOVED, &dev->state);
  115. mutex_unlock(&dev->vendor_req_mutex);
  116. return ret;
  117. }
  118. void mt7601u_vendor_reset(struct mt7601u_dev *dev)
  119. {
  120. mt7601u_vendor_request(dev, MT_VEND_DEV_MODE, USB_DIR_OUT,
  121. MT_VEND_DEV_MODE_RESET, 0, NULL, 0);
  122. }
  123. u32 mt7601u_rr(struct mt7601u_dev *dev, u32 offset)
  124. {
  125. int ret;
  126. __le32 reg;
  127. u32 val;
  128. WARN_ONCE(offset > USHRT_MAX, "read high off:%08x", offset);
  129. ret = mt7601u_vendor_request(dev, MT_VEND_MULTI_READ, USB_DIR_IN,
  130. 0, offset, &reg, sizeof(reg));
  131. val = le32_to_cpu(reg);
  132. if (ret > 0 && ret != sizeof(reg)) {
  133. dev_err(dev->dev, "Error: wrong size read:%d off:%08x\n",
  134. ret, offset);
  135. val = ~0;
  136. }
  137. trace_reg_read(dev, offset, val);
  138. return val;
  139. }
  140. int mt7601u_vendor_single_wr(struct mt7601u_dev *dev, const u8 req,
  141. const u16 offset, const u32 val)
  142. {
  143. int ret;
  144. ret = mt7601u_vendor_request(dev, req, USB_DIR_OUT,
  145. val & 0xffff, offset, NULL, 0);
  146. if (ret)
  147. return ret;
  148. return mt7601u_vendor_request(dev, req, USB_DIR_OUT,
  149. val >> 16, offset + 2, NULL, 0);
  150. }
  151. void mt7601u_wr(struct mt7601u_dev *dev, u32 offset, u32 val)
  152. {
  153. WARN_ONCE(offset > USHRT_MAX, "write high off:%08x", offset);
  154. mt7601u_vendor_single_wr(dev, MT_VEND_WRITE, offset, val);
  155. trace_reg_write(dev, offset, val);
  156. }
  157. u32 mt7601u_rmw(struct mt7601u_dev *dev, u32 offset, u32 mask, u32 val)
  158. {
  159. val |= mt7601u_rr(dev, offset) & ~mask;
  160. mt7601u_wr(dev, offset, val);
  161. return val;
  162. }
  163. u32 mt7601u_rmc(struct mt7601u_dev *dev, u32 offset, u32 mask, u32 val)
  164. {
  165. u32 reg = mt7601u_rr(dev, offset);
  166. val |= reg & ~mask;
  167. if (reg != val)
  168. mt7601u_wr(dev, offset, val);
  169. return val;
  170. }
  171. void mt7601u_wr_copy(struct mt7601u_dev *dev, u32 offset,
  172. const void *data, int len)
  173. {
  174. WARN_ONCE(offset & 3, "unaligned write copy off:%08x", offset);
  175. WARN_ONCE(len & 3, "short write copy off:%08x", offset);
  176. mt7601u_burst_write_regs(dev, offset, data, len / 4);
  177. }
  178. void mt7601u_addr_wr(struct mt7601u_dev *dev, const u32 offset, const u8 *addr)
  179. {
  180. mt7601u_wr(dev, offset, get_unaligned_le32(addr));
  181. mt7601u_wr(dev, offset + 4, addr[4] | addr[5] << 8);
  182. }
  183. static int mt7601u_assign_pipes(struct usb_interface *usb_intf,
  184. struct mt7601u_dev *dev)
  185. {
  186. struct usb_endpoint_descriptor *ep_desc;
  187. struct usb_host_interface *intf_desc = usb_intf->cur_altsetting;
  188. unsigned i, ep_i = 0, ep_o = 0;
  189. BUILD_BUG_ON(sizeof(dev->in_eps) < __MT_EP_IN_MAX);
  190. BUILD_BUG_ON(sizeof(dev->out_eps) < __MT_EP_OUT_MAX);
  191. for (i = 0; i < intf_desc->desc.bNumEndpoints; i++) {
  192. ep_desc = &intf_desc->endpoint[i].desc;
  193. if (usb_endpoint_is_bulk_in(ep_desc) &&
  194. ep_i++ < __MT_EP_IN_MAX) {
  195. dev->in_eps[ep_i - 1] = usb_endpoint_num(ep_desc);
  196. dev->in_max_packet = usb_endpoint_maxp(ep_desc);
  197. /* Note: this is ignored by usb sub-system but vendor
  198. * code does it. We can drop this at some point.
  199. */
  200. dev->in_eps[ep_i - 1] |= USB_DIR_IN;
  201. } else if (usb_endpoint_is_bulk_out(ep_desc) &&
  202. ep_o++ < __MT_EP_OUT_MAX) {
  203. dev->out_eps[ep_o - 1] = usb_endpoint_num(ep_desc);
  204. dev->out_max_packet = usb_endpoint_maxp(ep_desc);
  205. }
  206. }
  207. if (ep_i != __MT_EP_IN_MAX || ep_o != __MT_EP_OUT_MAX) {
  208. dev_err(dev->dev, "Error: wrong pipe number in:%d out:%d\n",
  209. ep_i, ep_o);
  210. return -EINVAL;
  211. }
  212. return 0;
  213. }
  214. static int mt7601u_probe(struct usb_interface *usb_intf,
  215. const struct usb_device_id *id)
  216. {
  217. struct usb_device *usb_dev = interface_to_usbdev(usb_intf);
  218. struct mt7601u_dev *dev;
  219. u32 asic_rev, mac_rev;
  220. int ret;
  221. dev = mt7601u_alloc_device(&usb_intf->dev);
  222. if (!dev)
  223. return -ENOMEM;
  224. usb_dev = usb_get_dev(usb_dev);
  225. usb_reset_device(usb_dev);
  226. usb_set_intfdata(usb_intf, dev);
  227. ret = mt7601u_assign_pipes(usb_intf, dev);
  228. if (ret)
  229. goto err;
  230. ret = mt7601u_wait_asic_ready(dev);
  231. if (ret)
  232. goto err;
  233. asic_rev = mt7601u_rr(dev, MT_ASIC_VERSION);
  234. mac_rev = mt7601u_rr(dev, MT_MAC_CSR0);
  235. dev_info(dev->dev, "ASIC revision: %08x MAC revision: %08x\n",
  236. asic_rev, mac_rev);
  237. /* Note: vendor driver skips this check for MT7601U */
  238. if (!(mt7601u_rr(dev, MT_EFUSE_CTRL) & MT_EFUSE_CTRL_SEL))
  239. dev_warn(dev->dev, "Warning: eFUSE not present\n");
  240. ret = mt7601u_init_hardware(dev);
  241. if (ret)
  242. goto err;
  243. ret = mt7601u_register_device(dev);
  244. if (ret)
  245. goto err_hw;
  246. set_bit(MT7601U_STATE_INITIALIZED, &dev->state);
  247. return 0;
  248. err_hw:
  249. mt7601u_cleanup(dev);
  250. err:
  251. usb_set_intfdata(usb_intf, NULL);
  252. usb_put_dev(interface_to_usbdev(usb_intf));
  253. destroy_workqueue(dev->stat_wq);
  254. ieee80211_free_hw(dev->hw);
  255. return ret;
  256. }
  257. static void mt7601u_disconnect(struct usb_interface *usb_intf)
  258. {
  259. struct mt7601u_dev *dev = usb_get_intfdata(usb_intf);
  260. ieee80211_unregister_hw(dev->hw);
  261. mt7601u_cleanup(dev);
  262. usb_set_intfdata(usb_intf, NULL);
  263. usb_put_dev(interface_to_usbdev(usb_intf));
  264. destroy_workqueue(dev->stat_wq);
  265. ieee80211_free_hw(dev->hw);
  266. }
  267. static int mt7601u_suspend(struct usb_interface *usb_intf, pm_message_t state)
  268. {
  269. struct mt7601u_dev *dev = usb_get_intfdata(usb_intf);
  270. mt7601u_cleanup(dev);
  271. return 0;
  272. }
  273. static int mt7601u_resume(struct usb_interface *usb_intf)
  274. {
  275. struct mt7601u_dev *dev = usb_get_intfdata(usb_intf);
  276. int ret;
  277. ret = mt7601u_init_hardware(dev);
  278. if (ret)
  279. return ret;
  280. set_bit(MT7601U_STATE_INITIALIZED, &dev->state);
  281. return 0;
  282. }
  283. MODULE_DEVICE_TABLE(usb, mt7601u_device_table);
  284. /*(DEBLOBBED)*/
  285. MODULE_LICENSE("GPL");
  286. static struct usb_driver mt7601u_driver = {
  287. .name = KBUILD_MODNAME,
  288. .id_table = mt7601u_device_table,
  289. .probe = mt7601u_probe,
  290. .disconnect = mt7601u_disconnect,
  291. .suspend = mt7601u_suspend,
  292. .resume = mt7601u_resume,
  293. .reset_resume = mt7601u_resume,
  294. .soft_unbind = 1,
  295. .disable_hub_initiated_lpm = 1,
  296. };
  297. module_usb_driver(mt7601u_driver);