usb.c 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384
  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 const 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. int mt7601u_vendor_request(struct mt7601u_dev *dev, const u8 req,
  81. const u8 direction, const u16 val, const u16 offset,
  82. void *buf, const size_t buflen)
  83. {
  84. int i, ret;
  85. struct usb_device *usb_dev = mt7601u_to_usb_dev(dev);
  86. const u8 req_type = direction | USB_TYPE_VENDOR | USB_RECIP_DEVICE;
  87. const unsigned int pipe = (direction == USB_DIR_IN) ?
  88. usb_rcvctrlpipe(usb_dev, 0) : usb_sndctrlpipe(usb_dev, 0);
  89. for (i = 0; i < MT_VEND_REQ_MAX_RETRY; i++) {
  90. ret = usb_control_msg(usb_dev, pipe, req, req_type,
  91. val, offset, buf, buflen,
  92. MT_VEND_REQ_TOUT_MS);
  93. trace_mt_vend_req(dev, pipe, req, req_type, val, offset,
  94. buf, buflen, ret);
  95. if (ret == -ENODEV)
  96. set_bit(MT7601U_STATE_REMOVED, &dev->state);
  97. if (ret >= 0 || ret == -ENODEV)
  98. return ret;
  99. msleep(5);
  100. }
  101. dev_err(dev->dev, "Vendor request req:%02x off:%04x failed:%d\n",
  102. req, offset, ret);
  103. return ret;
  104. }
  105. void mt7601u_vendor_reset(struct mt7601u_dev *dev)
  106. {
  107. mt7601u_vendor_request(dev, MT_VEND_DEV_MODE, USB_DIR_OUT,
  108. MT_VEND_DEV_MODE_RESET, 0, NULL, 0);
  109. }
  110. /* should be called with vendor_req_mutex held */
  111. static u32 __mt7601u_rr(struct mt7601u_dev *dev, u32 offset)
  112. {
  113. int ret;
  114. u32 val = ~0;
  115. WARN_ONCE(offset > USHRT_MAX, "read high off:%08x", offset);
  116. ret = mt7601u_vendor_request(dev, MT_VEND_MULTI_READ, USB_DIR_IN,
  117. 0, offset, dev->vend_buf, MT_VEND_BUF);
  118. if (ret == MT_VEND_BUF)
  119. val = get_unaligned_le32(dev->vend_buf);
  120. else if (ret > 0)
  121. dev_err(dev->dev, "Error: wrong size read:%d off:%08x\n",
  122. ret, offset);
  123. trace_reg_read(dev, offset, val);
  124. return val;
  125. }
  126. u32 mt7601u_rr(struct mt7601u_dev *dev, u32 offset)
  127. {
  128. u32 ret;
  129. mutex_lock(&dev->vendor_req_mutex);
  130. ret = __mt7601u_rr(dev, offset);
  131. mutex_unlock(&dev->vendor_req_mutex);
  132. return ret;
  133. }
  134. /* should be called with vendor_req_mutex held */
  135. static int __mt7601u_vendor_single_wr(struct mt7601u_dev *dev, const u8 req,
  136. const u16 offset, const u32 val)
  137. {
  138. int ret = mt7601u_vendor_request(dev, req, USB_DIR_OUT,
  139. val & 0xffff, offset, NULL, 0);
  140. if (!ret)
  141. ret = mt7601u_vendor_request(dev, req, USB_DIR_OUT,
  142. val >> 16, offset + 2, NULL, 0);
  143. trace_reg_write(dev, offset, val);
  144. return ret;
  145. }
  146. int mt7601u_vendor_single_wr(struct mt7601u_dev *dev, const u8 req,
  147. const u16 offset, const u32 val)
  148. {
  149. int ret;
  150. mutex_lock(&dev->vendor_req_mutex);
  151. ret = __mt7601u_vendor_single_wr(dev, req, offset, val);
  152. mutex_unlock(&dev->vendor_req_mutex);
  153. return ret;
  154. }
  155. void mt7601u_wr(struct mt7601u_dev *dev, u32 offset, u32 val)
  156. {
  157. WARN_ONCE(offset > USHRT_MAX, "write high off:%08x", offset);
  158. mt7601u_vendor_single_wr(dev, MT_VEND_WRITE, offset, val);
  159. }
  160. u32 mt7601u_rmw(struct mt7601u_dev *dev, u32 offset, u32 mask, u32 val)
  161. {
  162. mutex_lock(&dev->vendor_req_mutex);
  163. val |= __mt7601u_rr(dev, offset) & ~mask;
  164. __mt7601u_vendor_single_wr(dev, MT_VEND_WRITE, offset, val);
  165. mutex_unlock(&dev->vendor_req_mutex);
  166. return val;
  167. }
  168. u32 mt7601u_rmc(struct mt7601u_dev *dev, u32 offset, u32 mask, u32 val)
  169. {
  170. u32 reg;
  171. mutex_lock(&dev->vendor_req_mutex);
  172. reg = __mt7601u_rr(dev, offset);
  173. val |= reg & ~mask;
  174. if (reg != val)
  175. __mt7601u_vendor_single_wr(dev, MT_VEND_WRITE,
  176. offset, val);
  177. mutex_unlock(&dev->vendor_req_mutex);
  178. return val;
  179. }
  180. void mt7601u_wr_copy(struct mt7601u_dev *dev, u32 offset,
  181. const void *data, int len)
  182. {
  183. WARN_ONCE(offset & 3, "unaligned write copy off:%08x", offset);
  184. WARN_ONCE(len & 3, "short write copy off:%08x", offset);
  185. mt7601u_burst_write_regs(dev, offset, data, len / 4);
  186. }
  187. void mt7601u_addr_wr(struct mt7601u_dev *dev, const u32 offset, const u8 *addr)
  188. {
  189. mt7601u_wr(dev, offset, get_unaligned_le32(addr));
  190. mt7601u_wr(dev, offset + 4, addr[4] | addr[5] << 8);
  191. }
  192. static int mt7601u_assign_pipes(struct usb_interface *usb_intf,
  193. struct mt7601u_dev *dev)
  194. {
  195. struct usb_endpoint_descriptor *ep_desc;
  196. struct usb_host_interface *intf_desc = usb_intf->cur_altsetting;
  197. unsigned i, ep_i = 0, ep_o = 0;
  198. BUILD_BUG_ON(sizeof(dev->in_eps) < __MT_EP_IN_MAX);
  199. BUILD_BUG_ON(sizeof(dev->out_eps) < __MT_EP_OUT_MAX);
  200. for (i = 0; i < intf_desc->desc.bNumEndpoints; i++) {
  201. ep_desc = &intf_desc->endpoint[i].desc;
  202. if (usb_endpoint_is_bulk_in(ep_desc) &&
  203. ep_i++ < __MT_EP_IN_MAX) {
  204. dev->in_eps[ep_i - 1] = usb_endpoint_num(ep_desc);
  205. dev->in_max_packet = usb_endpoint_maxp(ep_desc);
  206. /* Note: this is ignored by usb sub-system but vendor
  207. * code does it. We can drop this at some point.
  208. */
  209. dev->in_eps[ep_i - 1] |= USB_DIR_IN;
  210. } else if (usb_endpoint_is_bulk_out(ep_desc) &&
  211. ep_o++ < __MT_EP_OUT_MAX) {
  212. dev->out_eps[ep_o - 1] = usb_endpoint_num(ep_desc);
  213. dev->out_max_packet = usb_endpoint_maxp(ep_desc);
  214. }
  215. }
  216. if (ep_i != __MT_EP_IN_MAX || ep_o != __MT_EP_OUT_MAX) {
  217. dev_err(dev->dev, "Error: wrong pipe number in:%d out:%d\n",
  218. ep_i, ep_o);
  219. return -EINVAL;
  220. }
  221. return 0;
  222. }
  223. static int mt7601u_probe(struct usb_interface *usb_intf,
  224. const struct usb_device_id *id)
  225. {
  226. struct usb_device *usb_dev = interface_to_usbdev(usb_intf);
  227. struct mt7601u_dev *dev;
  228. u32 asic_rev, mac_rev;
  229. int ret;
  230. dev = mt7601u_alloc_device(&usb_intf->dev);
  231. if (!dev)
  232. return -ENOMEM;
  233. usb_dev = usb_get_dev(usb_dev);
  234. usb_reset_device(usb_dev);
  235. usb_set_intfdata(usb_intf, dev);
  236. dev->vend_buf = devm_kmalloc(dev->dev, MT_VEND_BUF, GFP_KERNEL);
  237. if (!dev->vend_buf) {
  238. ret = -ENOMEM;
  239. goto err;
  240. }
  241. ret = mt7601u_assign_pipes(usb_intf, dev);
  242. if (ret)
  243. goto err;
  244. ret = mt7601u_wait_asic_ready(dev);
  245. if (ret)
  246. goto err;
  247. asic_rev = mt7601u_rr(dev, MT_ASIC_VERSION);
  248. mac_rev = mt7601u_rr(dev, MT_MAC_CSR0);
  249. dev_info(dev->dev, "ASIC revision: %08x MAC revision: %08x\n",
  250. asic_rev, mac_rev);
  251. /* Note: vendor driver skips this check for MT7601U */
  252. if (!(mt7601u_rr(dev, MT_EFUSE_CTRL) & MT_EFUSE_CTRL_SEL))
  253. dev_warn(dev->dev, "Warning: eFUSE not present\n");
  254. ret = mt7601u_init_hardware(dev);
  255. if (ret)
  256. goto err;
  257. ret = mt7601u_register_device(dev);
  258. if (ret)
  259. goto err_hw;
  260. set_bit(MT7601U_STATE_INITIALIZED, &dev->state);
  261. return 0;
  262. err_hw:
  263. mt7601u_cleanup(dev);
  264. err:
  265. usb_set_intfdata(usb_intf, NULL);
  266. usb_put_dev(interface_to_usbdev(usb_intf));
  267. destroy_workqueue(dev->stat_wq);
  268. ieee80211_free_hw(dev->hw);
  269. return ret;
  270. }
  271. static void mt7601u_disconnect(struct usb_interface *usb_intf)
  272. {
  273. struct mt7601u_dev *dev = usb_get_intfdata(usb_intf);
  274. ieee80211_unregister_hw(dev->hw);
  275. mt7601u_cleanup(dev);
  276. usb_set_intfdata(usb_intf, NULL);
  277. usb_put_dev(interface_to_usbdev(usb_intf));
  278. destroy_workqueue(dev->stat_wq);
  279. ieee80211_free_hw(dev->hw);
  280. }
  281. static int mt7601u_suspend(struct usb_interface *usb_intf, pm_message_t state)
  282. {
  283. struct mt7601u_dev *dev = usb_get_intfdata(usb_intf);
  284. mt7601u_cleanup(dev);
  285. return 0;
  286. }
  287. static int mt7601u_resume(struct usb_interface *usb_intf)
  288. {
  289. struct mt7601u_dev *dev = usb_get_intfdata(usb_intf);
  290. int ret;
  291. ret = mt7601u_init_hardware(dev);
  292. if (ret)
  293. return ret;
  294. set_bit(MT7601U_STATE_INITIALIZED, &dev->state);
  295. return 0;
  296. }
  297. MODULE_DEVICE_TABLE(usb, mt7601u_device_table);
  298. MODULE_FIRMWARE(MT7601U_FIRMWARE);
  299. MODULE_LICENSE("GPL");
  300. static struct usb_driver mt7601u_driver = {
  301. .name = KBUILD_MODNAME,
  302. .id_table = mt7601u_device_table,
  303. .probe = mt7601u_probe,
  304. .disconnect = mt7601u_disconnect,
  305. .suspend = mt7601u_suspend,
  306. .resume = mt7601u_resume,
  307. .reset_resume = mt7601u_resume,
  308. .soft_unbind = 1,
  309. .disable_hub_initiated_lpm = 1,
  310. };
  311. module_usb_driver(mt7601u_driver);