rsi_91x_usb.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579
  1. /**
  2. * Copyright (c) 2014 Redpine Signals Inc.
  3. *
  4. * Permission to use, copy, modify, and/or distribute this software for any
  5. * purpose with or without fee is hereby granted, provided that the above
  6. * copyright notice and this permission notice appear in all copies.
  7. *
  8. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  9. * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  10. * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
  11. * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  12. * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  13. * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  14. * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  15. *
  16. */
  17. #include <linux/module.h>
  18. #include "rsi_usb.h"
  19. /**
  20. * rsi_usb_card_write() - This function writes to the USB Card.
  21. * @adapter: Pointer to the adapter structure.
  22. * @buf: Pointer to the buffer from where the data has to be taken.
  23. * @len: Length to be written.
  24. * @endpoint: Type of endpoint.
  25. *
  26. * Return: status: 0 on success, a negative error code on failure.
  27. */
  28. static int rsi_usb_card_write(struct rsi_hw *adapter,
  29. void *buf,
  30. u16 len,
  31. u8 endpoint)
  32. {
  33. struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev;
  34. int status;
  35. s32 transfer;
  36. status = usb_bulk_msg(dev->usbdev,
  37. usb_sndbulkpipe(dev->usbdev,
  38. dev->bulkout_endpoint_addr[endpoint - 1]),
  39. buf,
  40. len,
  41. &transfer,
  42. HZ * 5);
  43. if (status < 0) {
  44. rsi_dbg(ERR_ZONE,
  45. "Card write failed with error code :%10d\n", status);
  46. dev->write_fail = 1;
  47. }
  48. return status;
  49. }
  50. /**
  51. * rsi_write_multiple() - This function writes multiple bytes of information
  52. * to the USB card.
  53. * @adapter: Pointer to the adapter structure.
  54. * @addr: Address of the register.
  55. * @data: Pointer to the data that has to be written.
  56. * @count: Number of multiple bytes to be written.
  57. *
  58. * Return: 0 on success, a negative error code on failure.
  59. */
  60. static int rsi_write_multiple(struct rsi_hw *adapter,
  61. u8 endpoint,
  62. u8 *data,
  63. u32 count)
  64. {
  65. struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev;
  66. u8 *seg = dev->tx_buffer;
  67. if (dev->write_fail)
  68. return 0;
  69. if (endpoint == MGMT_EP) {
  70. memset(seg, 0, RSI_USB_TX_HEAD_ROOM);
  71. memcpy(seg + RSI_USB_TX_HEAD_ROOM, data, count);
  72. } else {
  73. seg = ((u8 *)data - RSI_USB_TX_HEAD_ROOM);
  74. }
  75. return rsi_usb_card_write(adapter,
  76. seg,
  77. count + RSI_USB_TX_HEAD_ROOM,
  78. endpoint);
  79. }
  80. /**
  81. * rsi_find_bulk_in_and_out_endpoints() - This function initializes the bulk
  82. * endpoints to the device.
  83. * @interface: Pointer to the USB interface structure.
  84. * @adapter: Pointer to the adapter structure.
  85. *
  86. * Return: ret_val: 0 on success, -ENOMEM on failure.
  87. */
  88. static int rsi_find_bulk_in_and_out_endpoints(struct usb_interface *interface,
  89. struct rsi_hw *adapter)
  90. {
  91. struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev;
  92. struct usb_host_interface *iface_desc;
  93. struct usb_endpoint_descriptor *endpoint;
  94. __le16 buffer_size;
  95. int ii, bep_found = 0;
  96. iface_desc = &(interface->altsetting[0]);
  97. for (ii = 0; ii < iface_desc->desc.bNumEndpoints; ++ii) {
  98. endpoint = &(iface_desc->endpoint[ii].desc);
  99. if ((!(dev->bulkin_endpoint_addr)) &&
  100. (endpoint->bEndpointAddress & USB_DIR_IN) &&
  101. ((endpoint->bmAttributes &
  102. USB_ENDPOINT_XFERTYPE_MASK) ==
  103. USB_ENDPOINT_XFER_BULK)) {
  104. buffer_size = endpoint->wMaxPacketSize;
  105. dev->bulkin_size = buffer_size;
  106. dev->bulkin_endpoint_addr =
  107. endpoint->bEndpointAddress;
  108. }
  109. if (!dev->bulkout_endpoint_addr[bep_found] &&
  110. !(endpoint->bEndpointAddress & USB_DIR_IN) &&
  111. ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) ==
  112. USB_ENDPOINT_XFER_BULK)) {
  113. dev->bulkout_endpoint_addr[bep_found] =
  114. endpoint->bEndpointAddress;
  115. buffer_size = endpoint->wMaxPacketSize;
  116. dev->bulkout_size[bep_found] = buffer_size;
  117. bep_found++;
  118. }
  119. if (bep_found >= MAX_BULK_EP)
  120. break;
  121. }
  122. if (!(dev->bulkin_endpoint_addr) &&
  123. (dev->bulkout_endpoint_addr[0]))
  124. return -EINVAL;
  125. return 0;
  126. }
  127. /* rsi_usb_reg_read() - This function reads data from given register address.
  128. * @usbdev: Pointer to the usb_device structure.
  129. * @reg: Address of the register to be read.
  130. * @value: Value to be read.
  131. * @len: length of data to be read.
  132. *
  133. * Return: status: 0 on success, a negative error code on failure.
  134. */
  135. static int rsi_usb_reg_read(struct usb_device *usbdev,
  136. u32 reg,
  137. u16 *value,
  138. u16 len)
  139. {
  140. u8 *buf;
  141. int status = -ENOMEM;
  142. buf = kmalloc(0x04, GFP_KERNEL);
  143. if (!buf)
  144. return status;
  145. status = usb_control_msg(usbdev,
  146. usb_rcvctrlpipe(usbdev, 0),
  147. USB_VENDOR_REGISTER_READ,
  148. USB_TYPE_VENDOR,
  149. ((reg & 0xffff0000) >> 16), (reg & 0xffff),
  150. (void *)buf,
  151. len,
  152. HZ * 5);
  153. *value = (buf[0] | (buf[1] << 8));
  154. if (status < 0) {
  155. rsi_dbg(ERR_ZONE,
  156. "%s: Reg read failed with error code :%d\n",
  157. __func__, status);
  158. }
  159. kfree(buf);
  160. return status;
  161. }
  162. /**
  163. * rsi_usb_reg_write() - This function writes the given data into the given
  164. * register address.
  165. * @usbdev: Pointer to the usb_device structure.
  166. * @reg: Address of the register.
  167. * @value: Value to write.
  168. * @len: Length of data to be written.
  169. *
  170. * Return: status: 0 on success, a negative error code on failure.
  171. */
  172. static int rsi_usb_reg_write(struct usb_device *usbdev,
  173. u32 reg,
  174. u16 value,
  175. u16 len)
  176. {
  177. u8 *usb_reg_buf;
  178. int status = -ENOMEM;
  179. usb_reg_buf = kmalloc(0x04, GFP_KERNEL);
  180. if (!usb_reg_buf)
  181. return status;
  182. usb_reg_buf[0] = (value & 0x00ff);
  183. usb_reg_buf[1] = (value & 0xff00) >> 8;
  184. usb_reg_buf[2] = 0x0;
  185. usb_reg_buf[3] = 0x0;
  186. status = usb_control_msg(usbdev,
  187. usb_sndctrlpipe(usbdev, 0),
  188. USB_VENDOR_REGISTER_WRITE,
  189. USB_TYPE_VENDOR,
  190. ((reg & 0xffff0000) >> 16),
  191. (reg & 0xffff),
  192. (void *)usb_reg_buf,
  193. len,
  194. HZ * 5);
  195. if (status < 0) {
  196. rsi_dbg(ERR_ZONE,
  197. "%s: Reg write failed with error code :%d\n",
  198. __func__, status);
  199. }
  200. kfree(usb_reg_buf);
  201. return status;
  202. }
  203. /**
  204. * rsi_rx_done_handler() - This function is called when a packet is received
  205. * from USB stack. This is callback to recieve done.
  206. * @urb: Received URB.
  207. *
  208. * Return: None.
  209. */
  210. static void rsi_rx_done_handler(struct urb *urb)
  211. {
  212. struct rsi_hw *adapter = urb->context;
  213. struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev;
  214. if (urb->status)
  215. return;
  216. rsi_set_event(&dev->rx_thread.event);
  217. }
  218. /**
  219. * rsi_rx_urb_submit() - This function submits the given URB to the USB stack.
  220. * @adapter: Pointer to the adapter structure.
  221. *
  222. * Return: 0 on success, a negative error code on failure.
  223. */
  224. static int rsi_rx_urb_submit(struct rsi_hw *adapter)
  225. {
  226. struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev;
  227. struct urb *urb = dev->rx_usb_urb[0];
  228. int status;
  229. usb_fill_bulk_urb(urb,
  230. dev->usbdev,
  231. usb_rcvbulkpipe(dev->usbdev,
  232. dev->bulkin_endpoint_addr),
  233. urb->transfer_buffer,
  234. 3000,
  235. rsi_rx_done_handler,
  236. adapter);
  237. status = usb_submit_urb(urb, GFP_KERNEL);
  238. if (status)
  239. rsi_dbg(ERR_ZONE, "%s: Failed in urb submission\n", __func__);
  240. return status;
  241. }
  242. /**
  243. * rsi_usb_write_register_multiple() - This function writes multiple bytes of
  244. * information to multiple registers.
  245. * @adapter: Pointer to the adapter structure.
  246. * @addr: Address of the register.
  247. * @data: Pointer to the data that has to be written.
  248. * @count: Number of multiple bytes to be written on to the registers.
  249. *
  250. * Return: status: 0 on success, a negative error code on failure.
  251. */
  252. int rsi_usb_write_register_multiple(struct rsi_hw *adapter,
  253. u32 addr,
  254. u8 *data,
  255. u32 count)
  256. {
  257. struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev;
  258. u8 *buf;
  259. u8 transfer;
  260. int status = 0;
  261. buf = kzalloc(4096, GFP_KERNEL);
  262. if (!buf)
  263. return -ENOMEM;
  264. while (count) {
  265. transfer = (u8)(min_t(u32, count, 4096));
  266. memcpy(buf, data, transfer);
  267. status = usb_control_msg(dev->usbdev,
  268. usb_sndctrlpipe(dev->usbdev, 0),
  269. USB_VENDOR_REGISTER_WRITE,
  270. USB_TYPE_VENDOR,
  271. ((addr & 0xffff0000) >> 16),
  272. (addr & 0xffff),
  273. (void *)buf,
  274. transfer,
  275. HZ * 5);
  276. if (status < 0) {
  277. rsi_dbg(ERR_ZONE,
  278. "Reg write failed with error code :%d\n",
  279. status);
  280. } else {
  281. count -= transfer;
  282. data += transfer;
  283. addr += transfer;
  284. }
  285. }
  286. kfree(buf);
  287. return 0;
  288. }
  289. /**
  290. *rsi_usb_host_intf_write_pkt() - This function writes the packet to the
  291. * USB card.
  292. * @adapter: Pointer to the adapter structure.
  293. * @pkt: Pointer to the data to be written on to the card.
  294. * @len: Length of the data to be written on to the card.
  295. *
  296. * Return: 0 on success, a negative error code on failure.
  297. */
  298. static int rsi_usb_host_intf_write_pkt(struct rsi_hw *adapter,
  299. u8 *pkt,
  300. u32 len)
  301. {
  302. u32 queueno = ((pkt[1] >> 4) & 0xf);
  303. u8 endpoint;
  304. endpoint = ((queueno == RSI_WIFI_MGMT_Q) ? MGMT_EP : DATA_EP);
  305. return rsi_write_multiple(adapter,
  306. endpoint,
  307. (u8 *)pkt,
  308. len);
  309. }
  310. /**
  311. * rsi_deinit_usb_interface() - This function deinitializes the usb interface.
  312. * @adapter: Pointer to the adapter structure.
  313. *
  314. * Return: None.
  315. */
  316. static void rsi_deinit_usb_interface(struct rsi_hw *adapter)
  317. {
  318. struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev;
  319. rsi_kill_thread(&dev->rx_thread);
  320. usb_free_urb(dev->rx_usb_urb[0]);
  321. kfree(adapter->priv->rx_data_pkt);
  322. kfree(dev->tx_buffer);
  323. }
  324. /**
  325. * rsi_init_usb_interface() - This function initializes the usb interface.
  326. * @adapter: Pointer to the adapter structure.
  327. * @pfunction: Pointer to USB interface structure.
  328. *
  329. * Return: 0 on success, a negative error code on failure.
  330. */
  331. static int rsi_init_usb_interface(struct rsi_hw *adapter,
  332. struct usb_interface *pfunction)
  333. {
  334. struct rsi_91x_usbdev *rsi_dev;
  335. struct rsi_common *common = adapter->priv;
  336. int status;
  337. rsi_dev = kzalloc(sizeof(*rsi_dev), GFP_KERNEL);
  338. if (!rsi_dev)
  339. return -ENOMEM;
  340. adapter->rsi_dev = rsi_dev;
  341. rsi_dev->usbdev = interface_to_usbdev(pfunction);
  342. if (rsi_find_bulk_in_and_out_endpoints(pfunction, adapter))
  343. return -EINVAL;
  344. adapter->device = &pfunction->dev;
  345. usb_set_intfdata(pfunction, adapter);
  346. common->rx_data_pkt = kmalloc(2048, GFP_KERNEL);
  347. if (!common->rx_data_pkt) {
  348. rsi_dbg(ERR_ZONE, "%s: Failed to allocate memory\n",
  349. __func__);
  350. return -ENOMEM;
  351. }
  352. rsi_dev->tx_buffer = kmalloc(2048, GFP_KERNEL);
  353. if (!rsi_dev->tx_buffer) {
  354. status = -ENOMEM;
  355. goto fail_tx;
  356. }
  357. rsi_dev->rx_usb_urb[0] = usb_alloc_urb(0, GFP_KERNEL);
  358. if (!rsi_dev->rx_usb_urb[0]) {
  359. status = -ENOMEM;
  360. goto fail_rx;
  361. }
  362. rsi_dev->rx_usb_urb[0]->transfer_buffer = adapter->priv->rx_data_pkt;
  363. rsi_dev->tx_blk_size = 252;
  364. /* Initializing function callbacks */
  365. adapter->rx_urb_submit = rsi_rx_urb_submit;
  366. adapter->host_intf_write_pkt = rsi_usb_host_intf_write_pkt;
  367. adapter->check_hw_queue_status = rsi_usb_check_queue_status;
  368. adapter->determine_event_timeout = rsi_usb_event_timeout;
  369. rsi_init_event(&rsi_dev->rx_thread.event);
  370. status = rsi_create_kthread(common, &rsi_dev->rx_thread,
  371. rsi_usb_rx_thread, "RX-Thread");
  372. if (status) {
  373. rsi_dbg(ERR_ZONE, "%s: Unable to init rx thrd\n", __func__);
  374. goto fail_thread;
  375. }
  376. #ifdef CONFIG_RSI_DEBUGFS
  377. /* In USB, one less than the MAX_DEBUGFS_ENTRIES entries is required */
  378. adapter->num_debugfs_entries = (MAX_DEBUGFS_ENTRIES - 1);
  379. #endif
  380. rsi_dbg(INIT_ZONE, "%s: Enabled the interface\n", __func__);
  381. return 0;
  382. fail_thread:
  383. usb_free_urb(rsi_dev->rx_usb_urb[0]);
  384. fail_rx:
  385. kfree(rsi_dev->tx_buffer);
  386. fail_tx:
  387. kfree(common->rx_data_pkt);
  388. return status;
  389. }
  390. /**
  391. * rsi_probe() - This function is called by kernel when the driver provided
  392. * Vendor and device IDs are matched. All the initialization
  393. * work is done here.
  394. * @pfunction: Pointer to the USB interface structure.
  395. * @id: Pointer to the usb_device_id structure.
  396. *
  397. * Return: 0 on success, a negative error code on failure.
  398. */
  399. static int rsi_probe(struct usb_interface *pfunction,
  400. const struct usb_device_id *id)
  401. {
  402. struct rsi_hw *adapter;
  403. struct rsi_91x_usbdev *dev;
  404. u16 fw_status;
  405. int status;
  406. rsi_dbg(INIT_ZONE, "%s: Init function called\n", __func__);
  407. adapter = rsi_91x_init();
  408. if (!adapter) {
  409. rsi_dbg(ERR_ZONE, "%s: Failed to init os intf ops\n",
  410. __func__);
  411. return -ENOMEM;
  412. }
  413. status = rsi_init_usb_interface(adapter, pfunction);
  414. if (status) {
  415. rsi_dbg(ERR_ZONE, "%s: Failed to init usb interface\n",
  416. __func__);
  417. goto err;
  418. }
  419. rsi_dbg(ERR_ZONE, "%s: Initialized os intf ops\n", __func__);
  420. dev = (struct rsi_91x_usbdev *)adapter->rsi_dev;
  421. status = rsi_usb_reg_read(dev->usbdev, FW_STATUS_REG, &fw_status, 2);
  422. if (status)
  423. goto err1;
  424. else
  425. fw_status &= 1;
  426. if (!fw_status) {
  427. status = rsi_usb_device_init(adapter->priv);
  428. if (status) {
  429. rsi_dbg(ERR_ZONE, "%s: Failed in device init\n",
  430. __func__);
  431. goto err1;
  432. }
  433. status = rsi_usb_reg_write(dev->usbdev,
  434. USB_INTERNAL_REG_1,
  435. RSI_USB_READY_MAGIC_NUM, 1);
  436. if (status)
  437. goto err1;
  438. rsi_dbg(INIT_ZONE, "%s: Performed device init\n", __func__);
  439. }
  440. status = rsi_rx_urb_submit(adapter);
  441. if (status)
  442. goto err1;
  443. return 0;
  444. err1:
  445. rsi_deinit_usb_interface(adapter);
  446. err:
  447. rsi_91x_deinit(adapter);
  448. rsi_dbg(ERR_ZONE, "%s: Failed in probe...Exiting\n", __func__);
  449. return status;
  450. }
  451. /**
  452. * rsi_disconnect() - This function performs the reverse of the probe function,
  453. * it deintialize the driver structure.
  454. * @pfunction: Pointer to the USB interface structure.
  455. *
  456. * Return: None.
  457. */
  458. static void rsi_disconnect(struct usb_interface *pfunction)
  459. {
  460. struct rsi_hw *adapter = usb_get_intfdata(pfunction);
  461. if (!adapter)
  462. return;
  463. rsi_mac80211_detach(adapter);
  464. rsi_deinit_usb_interface(adapter);
  465. rsi_91x_deinit(adapter);
  466. rsi_dbg(INFO_ZONE, "%s: Deinitialization completed\n", __func__);
  467. }
  468. #ifdef CONFIG_PM
  469. static int rsi_suspend(struct usb_interface *intf, pm_message_t message)
  470. {
  471. /* Not yet implemented */
  472. return -ENOSYS;
  473. }
  474. static int rsi_resume(struct usb_interface *intf)
  475. {
  476. /* Not yet implemented */
  477. return -ENOSYS;
  478. }
  479. #endif
  480. static const struct usb_device_id rsi_dev_table[] = {
  481. { USB_DEVICE(0x0303, 0x0100) },
  482. { USB_DEVICE(0x041B, 0x0301) },
  483. { USB_DEVICE(0x041B, 0x0201) },
  484. { USB_DEVICE(0x041B, 0x9330) },
  485. { /* Blank */},
  486. };
  487. static struct usb_driver rsi_driver = {
  488. .name = "RSI-USB WLAN",
  489. .probe = rsi_probe,
  490. .disconnect = rsi_disconnect,
  491. .id_table = rsi_dev_table,
  492. #ifdef CONFIG_PM
  493. .suspend = rsi_suspend,
  494. .resume = rsi_resume,
  495. #endif
  496. };
  497. module_usb_driver(rsi_driver);
  498. MODULE_AUTHOR("Redpine Signals Inc");
  499. MODULE_DESCRIPTION("Common USB layer for RSI drivers");
  500. MODULE_SUPPORTED_DEVICE("RSI-91x");
  501. MODULE_DEVICE_TABLE(usb, rsi_dev_table);
  502. MODULE_FIRMWARE(FIRMWARE_RSI9113);
  503. MODULE_VERSION("0.1");
  504. MODULE_LICENSE("Dual BSD/GPL");