rsi_91x_usb.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778
  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. #include "rsi_hal.h"
  20. /**
  21. * rsi_usb_card_write() - This function writes to the USB Card.
  22. * @adapter: Pointer to the adapter structure.
  23. * @buf: Pointer to the buffer from where the data has to be taken.
  24. * @len: Length to be written.
  25. * @endpoint: Type of endpoint.
  26. *
  27. * Return: status: 0 on success, a negative error code on failure.
  28. */
  29. static int rsi_usb_card_write(struct rsi_hw *adapter,
  30. u8 *buf,
  31. u16 len,
  32. u8 endpoint)
  33. {
  34. struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev;
  35. int status;
  36. u8 *seg = dev->tx_buffer;
  37. int transfer;
  38. int ep = dev->bulkout_endpoint_addr[endpoint - 1];
  39. memset(seg, 0, len + RSI_USB_TX_HEAD_ROOM);
  40. memcpy(seg + RSI_USB_TX_HEAD_ROOM, buf, len);
  41. len += RSI_USB_TX_HEAD_ROOM;
  42. transfer = len;
  43. status = usb_bulk_msg(dev->usbdev,
  44. usb_sndbulkpipe(dev->usbdev, ep),
  45. (void *)seg,
  46. (int)len,
  47. &transfer,
  48. HZ * 5);
  49. if (status < 0) {
  50. rsi_dbg(ERR_ZONE,
  51. "Card write failed with error code :%10d\n", status);
  52. dev->write_fail = 1;
  53. }
  54. return status;
  55. }
  56. /**
  57. * rsi_write_multiple() - This function writes multiple bytes of information
  58. * to the USB card.
  59. * @adapter: Pointer to the adapter structure.
  60. * @addr: Address of the register.
  61. * @data: Pointer to the data that has to be written.
  62. * @count: Number of multiple bytes to be written.
  63. *
  64. * Return: 0 on success, a negative error code on failure.
  65. */
  66. static int rsi_write_multiple(struct rsi_hw *adapter,
  67. u8 endpoint,
  68. u8 *data,
  69. u32 count)
  70. {
  71. struct rsi_91x_usbdev *dev =
  72. (struct rsi_91x_usbdev *)adapter->rsi_dev;
  73. if (!adapter)
  74. return -ENODEV;
  75. if (endpoint == 0)
  76. return -EINVAL;
  77. if (dev->write_fail)
  78. return -ENETDOWN;
  79. return rsi_usb_card_write(adapter, data, count, endpoint);
  80. }
  81. /**
  82. * rsi_find_bulk_in_and_out_endpoints() - This function initializes the bulk
  83. * endpoints to the device.
  84. * @interface: Pointer to the USB interface structure.
  85. * @adapter: Pointer to the adapter structure.
  86. *
  87. * Return: ret_val: 0 on success, -ENOMEM on failure.
  88. */
  89. static int rsi_find_bulk_in_and_out_endpoints(struct usb_interface *interface,
  90. struct rsi_hw *adapter)
  91. {
  92. struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev;
  93. struct usb_host_interface *iface_desc;
  94. struct usb_endpoint_descriptor *endpoint;
  95. __le16 buffer_size;
  96. int ii, bep_found = 0;
  97. iface_desc = &(interface->altsetting[0]);
  98. for (ii = 0; ii < iface_desc->desc.bNumEndpoints; ++ii) {
  99. endpoint = &(iface_desc->endpoint[ii].desc);
  100. if ((!(dev->bulkin_endpoint_addr)) &&
  101. (endpoint->bEndpointAddress & USB_DIR_IN) &&
  102. ((endpoint->bmAttributes &
  103. USB_ENDPOINT_XFERTYPE_MASK) ==
  104. USB_ENDPOINT_XFER_BULK)) {
  105. buffer_size = endpoint->wMaxPacketSize;
  106. dev->bulkin_size = buffer_size;
  107. dev->bulkin_endpoint_addr =
  108. endpoint->bEndpointAddress;
  109. }
  110. if (!dev->bulkout_endpoint_addr[bep_found] &&
  111. !(endpoint->bEndpointAddress & USB_DIR_IN) &&
  112. ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) ==
  113. USB_ENDPOINT_XFER_BULK)) {
  114. dev->bulkout_endpoint_addr[bep_found] =
  115. endpoint->bEndpointAddress;
  116. buffer_size = endpoint->wMaxPacketSize;
  117. dev->bulkout_size[bep_found] = buffer_size;
  118. bep_found++;
  119. }
  120. if (bep_found >= MAX_BULK_EP)
  121. break;
  122. }
  123. if (!(dev->bulkin_endpoint_addr) &&
  124. (dev->bulkout_endpoint_addr[0]))
  125. return -EINVAL;
  126. return 0;
  127. }
  128. #define RSI_USB_REQ_OUT (USB_TYPE_VENDOR | USB_DIR_OUT | USB_RECIP_DEVICE)
  129. #define RSI_USB_REQ_IN (USB_TYPE_VENDOR | USB_DIR_IN | USB_RECIP_DEVICE)
  130. /* rsi_usb_reg_read() - This function reads data from given register address.
  131. * @usbdev: Pointer to the usb_device structure.
  132. * @reg: Address of the register to be read.
  133. * @value: Value to be read.
  134. * @len: length of data to be read.
  135. *
  136. * Return: status: 0 on success, a negative error code on failure.
  137. */
  138. static int rsi_usb_reg_read(struct usb_device *usbdev,
  139. u32 reg,
  140. u16 *value,
  141. u16 len)
  142. {
  143. u8 *buf;
  144. int status = -ENOMEM;
  145. buf = kmalloc(RSI_USB_CTRL_BUF_SIZE, GFP_KERNEL);
  146. if (!buf)
  147. return status;
  148. if (len > RSI_USB_CTRL_BUF_SIZE)
  149. return -EINVAL;
  150. status = usb_control_msg(usbdev,
  151. usb_rcvctrlpipe(usbdev, 0),
  152. USB_VENDOR_REGISTER_READ,
  153. RSI_USB_REQ_IN,
  154. ((reg & 0xffff0000) >> 16), (reg & 0xffff),
  155. (void *)buf,
  156. len,
  157. USB_CTRL_GET_TIMEOUT);
  158. *value = (buf[0] | (buf[1] << 8));
  159. if (status < 0) {
  160. rsi_dbg(ERR_ZONE,
  161. "%s: Reg read failed with error code :%d\n",
  162. __func__, status);
  163. }
  164. kfree(buf);
  165. return status;
  166. }
  167. /**
  168. * rsi_usb_reg_write() - This function writes the given data into the given
  169. * register address.
  170. * @usbdev: Pointer to the usb_device structure.
  171. * @reg: Address of the register.
  172. * @value: Value to write.
  173. * @len: Length of data to be written.
  174. *
  175. * Return: status: 0 on success, a negative error code on failure.
  176. */
  177. static int rsi_usb_reg_write(struct usb_device *usbdev,
  178. u32 reg,
  179. u16 value,
  180. u16 len)
  181. {
  182. u8 *usb_reg_buf;
  183. int status = -ENOMEM;
  184. usb_reg_buf = kmalloc(RSI_USB_CTRL_BUF_SIZE, GFP_KERNEL);
  185. if (!usb_reg_buf)
  186. return status;
  187. if (len > RSI_USB_CTRL_BUF_SIZE)
  188. return -EINVAL;
  189. usb_reg_buf[0] = (value & 0x00ff);
  190. usb_reg_buf[1] = (value & 0xff00) >> 8;
  191. usb_reg_buf[2] = 0x0;
  192. usb_reg_buf[3] = 0x0;
  193. status = usb_control_msg(usbdev,
  194. usb_sndctrlpipe(usbdev, 0),
  195. USB_VENDOR_REGISTER_WRITE,
  196. RSI_USB_REQ_OUT,
  197. ((reg & 0xffff0000) >> 16),
  198. (reg & 0xffff),
  199. (void *)usb_reg_buf,
  200. len,
  201. USB_CTRL_SET_TIMEOUT);
  202. if (status < 0) {
  203. rsi_dbg(ERR_ZONE,
  204. "%s: Reg write failed with error code :%d\n",
  205. __func__, status);
  206. }
  207. kfree(usb_reg_buf);
  208. return status;
  209. }
  210. /**
  211. * rsi_rx_done_handler() - This function is called when a packet is received
  212. * from USB stack. This is callback to recieve done.
  213. * @urb: Received URB.
  214. *
  215. * Return: None.
  216. */
  217. static void rsi_rx_done_handler(struct urb *urb)
  218. {
  219. struct rsi_hw *adapter = urb->context;
  220. struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev;
  221. if (urb->status)
  222. return;
  223. rsi_set_event(&dev->rx_thread.event);
  224. }
  225. /**
  226. * rsi_rx_urb_submit() - This function submits the given URB to the USB stack.
  227. * @adapter: Pointer to the adapter structure.
  228. *
  229. * Return: 0 on success, a negative error code on failure.
  230. */
  231. static int rsi_rx_urb_submit(struct rsi_hw *adapter)
  232. {
  233. struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev;
  234. struct urb *urb = dev->rx_usb_urb[0];
  235. int status;
  236. usb_fill_bulk_urb(urb,
  237. dev->usbdev,
  238. usb_rcvbulkpipe(dev->usbdev,
  239. dev->bulkin_endpoint_addr),
  240. urb->transfer_buffer,
  241. 3000,
  242. rsi_rx_done_handler,
  243. adapter);
  244. status = usb_submit_urb(urb, GFP_KERNEL);
  245. if (status)
  246. rsi_dbg(ERR_ZONE, "%s: Failed in urb submission\n", __func__);
  247. return status;
  248. }
  249. static int rsi_usb_read_register_multiple(struct rsi_hw *adapter, u32 addr,
  250. u8 *data, u16 count)
  251. {
  252. struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev;
  253. u8 *buf;
  254. u16 transfer;
  255. int status;
  256. if (!addr)
  257. return -EINVAL;
  258. buf = kzalloc(RSI_USB_BUF_SIZE, GFP_KERNEL);
  259. if (!buf)
  260. return -ENOMEM;
  261. while (count) {
  262. transfer = min_t(u16, count, RSI_USB_BUF_SIZE);
  263. status = usb_control_msg(dev->usbdev,
  264. usb_rcvctrlpipe(dev->usbdev, 0),
  265. USB_VENDOR_REGISTER_READ,
  266. RSI_USB_REQ_IN,
  267. ((addr & 0xffff0000) >> 16),
  268. (addr & 0xffff), (void *)buf,
  269. transfer, USB_CTRL_GET_TIMEOUT);
  270. if (status < 0) {
  271. rsi_dbg(ERR_ZONE,
  272. "Reg read failed with error code :%d\n",
  273. status);
  274. kfree(buf);
  275. return status;
  276. }
  277. memcpy(data, buf, transfer);
  278. count -= transfer;
  279. data += transfer;
  280. addr += transfer;
  281. }
  282. kfree(buf);
  283. return 0;
  284. }
  285. /**
  286. * rsi_usb_write_register_multiple() - This function writes multiple bytes of
  287. * information to multiple registers.
  288. * @adapter: Pointer to the adapter structure.
  289. * @addr: Address of the register.
  290. * @data: Pointer to the data that has to be written.
  291. * @count: Number of multiple bytes to be written on to the registers.
  292. *
  293. * Return: status: 0 on success, a negative error code on failure.
  294. */
  295. static int rsi_usb_write_register_multiple(struct rsi_hw *adapter, u32 addr,
  296. u8 *data, u16 count)
  297. {
  298. struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev;
  299. u8 *buf;
  300. u16 transfer;
  301. int status = 0;
  302. buf = kzalloc(RSI_USB_BUF_SIZE, GFP_KERNEL);
  303. if (!buf)
  304. return -ENOMEM;
  305. while (count) {
  306. transfer = min_t(u16, count, RSI_USB_BUF_SIZE);
  307. memcpy(buf, data, transfer);
  308. status = usb_control_msg(dev->usbdev,
  309. usb_sndctrlpipe(dev->usbdev, 0),
  310. USB_VENDOR_REGISTER_WRITE,
  311. RSI_USB_REQ_OUT,
  312. ((addr & 0xffff0000) >> 16),
  313. (addr & 0xffff),
  314. (void *)buf,
  315. transfer,
  316. USB_CTRL_SET_TIMEOUT);
  317. if (status < 0) {
  318. rsi_dbg(ERR_ZONE,
  319. "Reg write failed with error code :%d\n",
  320. status);
  321. kfree(buf);
  322. return status;
  323. }
  324. count -= transfer;
  325. data += transfer;
  326. addr += transfer;
  327. }
  328. kfree(buf);
  329. return 0;
  330. }
  331. /**
  332. *rsi_usb_host_intf_write_pkt() - This function writes the packet to the
  333. * USB card.
  334. * @adapter: Pointer to the adapter structure.
  335. * @pkt: Pointer to the data to be written on to the card.
  336. * @len: Length of the data to be written on to the card.
  337. *
  338. * Return: 0 on success, a negative error code on failure.
  339. */
  340. static int rsi_usb_host_intf_write_pkt(struct rsi_hw *adapter,
  341. u8 *pkt,
  342. u32 len)
  343. {
  344. u32 queueno = ((pkt[1] >> 4) & 0x7);
  345. u8 endpoint;
  346. endpoint = ((queueno == RSI_WIFI_MGMT_Q || queueno == RSI_WIFI_DATA_Q ||
  347. queueno == RSI_COEX_Q) ? WLAN_EP : BT_EP);
  348. return rsi_write_multiple(adapter,
  349. endpoint,
  350. (u8 *)pkt,
  351. len);
  352. }
  353. static int rsi_usb_master_reg_read(struct rsi_hw *adapter, u32 reg,
  354. u32 *value, u16 len)
  355. {
  356. struct usb_device *usbdev =
  357. ((struct rsi_91x_usbdev *)adapter->rsi_dev)->usbdev;
  358. u16 temp;
  359. int ret;
  360. ret = rsi_usb_reg_read(usbdev, reg, &temp, len);
  361. if (ret < 0)
  362. return ret;
  363. *value = temp;
  364. return 0;
  365. }
  366. static int rsi_usb_master_reg_write(struct rsi_hw *adapter,
  367. unsigned long reg,
  368. unsigned long value, u16 len)
  369. {
  370. struct usb_device *usbdev =
  371. ((struct rsi_91x_usbdev *)adapter->rsi_dev)->usbdev;
  372. return rsi_usb_reg_write(usbdev, reg, value, len);
  373. }
  374. static int rsi_usb_load_data_master_write(struct rsi_hw *adapter,
  375. u32 base_address,
  376. u32 instructions_sz, u16 block_size,
  377. u8 *ta_firmware)
  378. {
  379. u16 num_blocks;
  380. u32 cur_indx, i;
  381. u8 temp_buf[256];
  382. int status;
  383. num_blocks = instructions_sz / block_size;
  384. rsi_dbg(INFO_ZONE, "num_blocks: %d\n", num_blocks);
  385. for (cur_indx = 0, i = 0; i < num_blocks; i++, cur_indx += block_size) {
  386. memcpy(temp_buf, ta_firmware + cur_indx, block_size);
  387. status = rsi_usb_write_register_multiple(adapter, base_address,
  388. (u8 *)(temp_buf),
  389. block_size);
  390. if (status < 0)
  391. return status;
  392. rsi_dbg(INFO_ZONE, "%s: loading block: %d\n", __func__, i);
  393. base_address += block_size;
  394. }
  395. if (instructions_sz % block_size) {
  396. memset(temp_buf, 0, block_size);
  397. memcpy(temp_buf, ta_firmware + cur_indx,
  398. instructions_sz % block_size);
  399. status = rsi_usb_write_register_multiple
  400. (adapter, base_address,
  401. (u8 *)temp_buf,
  402. instructions_sz % block_size);
  403. if (status < 0)
  404. return status;
  405. rsi_dbg(INFO_ZONE,
  406. "Written Last Block in Address 0x%x Successfully\n",
  407. cur_indx);
  408. }
  409. return 0;
  410. }
  411. static struct rsi_host_intf_ops usb_host_intf_ops = {
  412. .write_pkt = rsi_usb_host_intf_write_pkt,
  413. .read_reg_multiple = rsi_usb_read_register_multiple,
  414. .write_reg_multiple = rsi_usb_write_register_multiple,
  415. .master_reg_read = rsi_usb_master_reg_read,
  416. .master_reg_write = rsi_usb_master_reg_write,
  417. .load_data_master_write = rsi_usb_load_data_master_write,
  418. };
  419. /**
  420. * rsi_deinit_usb_interface() - This function deinitializes the usb interface.
  421. * @adapter: Pointer to the adapter structure.
  422. *
  423. * Return: None.
  424. */
  425. static void rsi_deinit_usb_interface(struct rsi_hw *adapter)
  426. {
  427. struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev;
  428. rsi_kill_thread(&dev->rx_thread);
  429. usb_free_urb(dev->rx_usb_urb[0]);
  430. kfree(adapter->priv->rx_data_pkt);
  431. kfree(dev->tx_buffer);
  432. }
  433. /**
  434. * rsi_init_usb_interface() - This function initializes the usb interface.
  435. * @adapter: Pointer to the adapter structure.
  436. * @pfunction: Pointer to USB interface structure.
  437. *
  438. * Return: 0 on success, a negative error code on failure.
  439. */
  440. static int rsi_init_usb_interface(struct rsi_hw *adapter,
  441. struct usb_interface *pfunction)
  442. {
  443. struct rsi_91x_usbdev *rsi_dev;
  444. struct rsi_common *common = adapter->priv;
  445. int status;
  446. rsi_dev = kzalloc(sizeof(*rsi_dev), GFP_KERNEL);
  447. if (!rsi_dev)
  448. return -ENOMEM;
  449. adapter->rsi_dev = rsi_dev;
  450. rsi_dev->usbdev = interface_to_usbdev(pfunction);
  451. if (rsi_find_bulk_in_and_out_endpoints(pfunction, adapter))
  452. return -EINVAL;
  453. adapter->device = &pfunction->dev;
  454. usb_set_intfdata(pfunction, adapter);
  455. common->rx_data_pkt = kmalloc(2048, GFP_KERNEL);
  456. if (!common->rx_data_pkt) {
  457. rsi_dbg(ERR_ZONE, "%s: Failed to allocate memory\n",
  458. __func__);
  459. return -ENOMEM;
  460. }
  461. rsi_dev->tx_buffer = kmalloc(2048, GFP_KERNEL);
  462. if (!rsi_dev->tx_buffer) {
  463. status = -ENOMEM;
  464. goto fail_tx;
  465. }
  466. rsi_dev->rx_usb_urb[0] = usb_alloc_urb(0, GFP_KERNEL);
  467. if (!rsi_dev->rx_usb_urb[0]) {
  468. status = -ENOMEM;
  469. goto fail_rx;
  470. }
  471. rsi_dev->rx_usb_urb[0]->transfer_buffer = adapter->priv->rx_data_pkt;
  472. rsi_dev->tx_blk_size = 252;
  473. adapter->block_size = rsi_dev->tx_blk_size;
  474. /* Initializing function callbacks */
  475. adapter->rx_urb_submit = rsi_rx_urb_submit;
  476. adapter->check_hw_queue_status = rsi_usb_check_queue_status;
  477. adapter->determine_event_timeout = rsi_usb_event_timeout;
  478. adapter->rsi_host_intf = RSI_HOST_INTF_USB;
  479. adapter->host_intf_ops = &usb_host_intf_ops;
  480. rsi_init_event(&rsi_dev->rx_thread.event);
  481. status = rsi_create_kthread(common, &rsi_dev->rx_thread,
  482. rsi_usb_rx_thread, "RX-Thread");
  483. if (status) {
  484. rsi_dbg(ERR_ZONE, "%s: Unable to init rx thrd\n", __func__);
  485. goto fail_thread;
  486. }
  487. #ifdef CONFIG_RSI_DEBUGFS
  488. /* In USB, one less than the MAX_DEBUGFS_ENTRIES entries is required */
  489. adapter->num_debugfs_entries = (MAX_DEBUGFS_ENTRIES - 1);
  490. #endif
  491. rsi_dbg(INIT_ZONE, "%s: Enabled the interface\n", __func__);
  492. return 0;
  493. fail_thread:
  494. usb_free_urb(rsi_dev->rx_usb_urb[0]);
  495. fail_rx:
  496. kfree(rsi_dev->tx_buffer);
  497. fail_tx:
  498. kfree(common->rx_data_pkt);
  499. return status;
  500. }
  501. static int usb_ulp_read_write(struct rsi_hw *adapter, u16 addr, u32 data,
  502. u16 len_in_bits)
  503. {
  504. int ret;
  505. ret = rsi_usb_master_reg_write
  506. (adapter, RSI_GSPI_DATA_REG1,
  507. ((addr << 6) | ((data >> 16) & 0xffff)), 2);
  508. if (ret < 0)
  509. return ret;
  510. ret = rsi_usb_master_reg_write(adapter, RSI_GSPI_DATA_REG0,
  511. (data & 0xffff), 2);
  512. if (ret < 0)
  513. return ret;
  514. /* Initializing GSPI for ULP read/writes */
  515. rsi_usb_master_reg_write(adapter, RSI_GSPI_CTRL_REG0,
  516. RSI_GSPI_CTRL_REG0_VALUE, 2);
  517. ret = rsi_usb_master_reg_write(adapter, RSI_GSPI_CTRL_REG1,
  518. ((len_in_bits - 1) | RSI_GSPI_TRIG), 2);
  519. if (ret < 0)
  520. return ret;
  521. msleep(20);
  522. return 0;
  523. }
  524. static int rsi_reset_card(struct rsi_hw *adapter)
  525. {
  526. int ret;
  527. rsi_dbg(INFO_ZONE, "Resetting Card...\n");
  528. rsi_usb_master_reg_write(adapter, RSI_TA_HOLD_REG, 0xE, 4);
  529. /* This msleep will ensure Thread-Arch processor to go to hold
  530. * and any pending dma transfers to rf in device to finish.
  531. */
  532. msleep(100);
  533. ret = usb_ulp_read_write(adapter, RSI_WATCH_DOG_TIMER_1,
  534. RSI_ULP_WRITE_2, 32);
  535. if (ret < 0)
  536. goto fail;
  537. ret = usb_ulp_read_write(adapter, RSI_WATCH_DOG_TIMER_2,
  538. RSI_ULP_WRITE_0, 32);
  539. if (ret < 0)
  540. goto fail;
  541. ret = usb_ulp_read_write(adapter, RSI_WATCH_DOG_DELAY_TIMER_1,
  542. RSI_ULP_WRITE_50, 32);
  543. if (ret < 0)
  544. goto fail;
  545. ret = usb_ulp_read_write(adapter, RSI_WATCH_DOG_DELAY_TIMER_2,
  546. RSI_ULP_WRITE_0, 32);
  547. if (ret < 0)
  548. goto fail;
  549. ret = usb_ulp_read_write(adapter, RSI_WATCH_DOG_TIMER_ENABLE,
  550. RSI_ULP_TIMER_ENABLE, 32);
  551. if (ret < 0)
  552. goto fail;
  553. rsi_dbg(INFO_ZONE, "Reset card done\n");
  554. return ret;
  555. fail:
  556. rsi_dbg(ERR_ZONE, "Reset card failed\n");
  557. return ret;
  558. }
  559. /**
  560. * rsi_probe() - This function is called by kernel when the driver provided
  561. * Vendor and device IDs are matched. All the initialization
  562. * work is done here.
  563. * @pfunction: Pointer to the USB interface structure.
  564. * @id: Pointer to the usb_device_id structure.
  565. *
  566. * Return: 0 on success, a negative error code on failure.
  567. */
  568. static int rsi_probe(struct usb_interface *pfunction,
  569. const struct usb_device_id *id)
  570. {
  571. struct rsi_hw *adapter;
  572. struct rsi_91x_usbdev *dev;
  573. u16 fw_status;
  574. int status;
  575. rsi_dbg(INIT_ZONE, "%s: Init function called\n", __func__);
  576. adapter = rsi_91x_init();
  577. if (!adapter) {
  578. rsi_dbg(ERR_ZONE, "%s: Failed to init os intf ops\n",
  579. __func__);
  580. return -ENOMEM;
  581. }
  582. adapter->rsi_host_intf = RSI_HOST_INTF_USB;
  583. status = rsi_init_usb_interface(adapter, pfunction);
  584. if (status) {
  585. rsi_dbg(ERR_ZONE, "%s: Failed to init usb interface\n",
  586. __func__);
  587. goto err;
  588. }
  589. rsi_dbg(ERR_ZONE, "%s: Initialized os intf ops\n", __func__);
  590. dev = (struct rsi_91x_usbdev *)adapter->rsi_dev;
  591. status = rsi_usb_reg_read(dev->usbdev, FW_STATUS_REG, &fw_status, 2);
  592. if (status < 0)
  593. goto err1;
  594. else
  595. fw_status &= 1;
  596. if (!fw_status) {
  597. rsi_dbg(INIT_ZONE, "Loading firmware...\n");
  598. status = rsi_hal_device_init(adapter);
  599. if (status) {
  600. rsi_dbg(ERR_ZONE, "%s: Failed in device init\n",
  601. __func__);
  602. goto err1;
  603. }
  604. rsi_dbg(INIT_ZONE, "%s: Device Init Done\n", __func__);
  605. }
  606. status = rsi_rx_urb_submit(adapter);
  607. if (status)
  608. goto err1;
  609. return 0;
  610. err1:
  611. rsi_deinit_usb_interface(adapter);
  612. err:
  613. rsi_91x_deinit(adapter);
  614. rsi_dbg(ERR_ZONE, "%s: Failed in probe...Exiting\n", __func__);
  615. return status;
  616. }
  617. /**
  618. * rsi_disconnect() - This function performs the reverse of the probe function,
  619. * it deinitialize the driver structure.
  620. * @pfunction: Pointer to the USB interface structure.
  621. *
  622. * Return: None.
  623. */
  624. static void rsi_disconnect(struct usb_interface *pfunction)
  625. {
  626. struct rsi_hw *adapter = usb_get_intfdata(pfunction);
  627. if (!adapter)
  628. return;
  629. rsi_mac80211_detach(adapter);
  630. rsi_reset_card(adapter);
  631. rsi_deinit_usb_interface(adapter);
  632. rsi_91x_deinit(adapter);
  633. rsi_dbg(INFO_ZONE, "%s: Deinitialization completed\n", __func__);
  634. }
  635. #ifdef CONFIG_PM
  636. static int rsi_suspend(struct usb_interface *intf, pm_message_t message)
  637. {
  638. /* Not yet implemented */
  639. return -ENOSYS;
  640. }
  641. static int rsi_resume(struct usb_interface *intf)
  642. {
  643. /* Not yet implemented */
  644. return -ENOSYS;
  645. }
  646. #endif
  647. static const struct usb_device_id rsi_dev_table[] = {
  648. { USB_DEVICE(0x0303, 0x0100) },
  649. { USB_DEVICE(0x041B, 0x0301) },
  650. { USB_DEVICE(0x041B, 0x0201) },
  651. { USB_DEVICE(0x041B, 0x9330) },
  652. { USB_DEVICE(0x1618, 0x9113) },
  653. { /* Blank */},
  654. };
  655. static struct usb_driver rsi_driver = {
  656. .name = "RSI-USB WLAN",
  657. .probe = rsi_probe,
  658. .disconnect = rsi_disconnect,
  659. .id_table = rsi_dev_table,
  660. #ifdef CONFIG_PM
  661. .suspend = rsi_suspend,
  662. .resume = rsi_resume,
  663. #endif
  664. };
  665. module_usb_driver(rsi_driver);
  666. MODULE_AUTHOR("Redpine Signals Inc");
  667. MODULE_DESCRIPTION("Common USB layer for RSI drivers");
  668. MODULE_SUPPORTED_DEVICE("RSI-91x");
  669. MODULE_DEVICE_TABLE(usb, rsi_dev_table);
  670. MODULE_FIRMWARE(FIRMWARE_RSI9113);
  671. MODULE_VERSION("0.1");
  672. MODULE_LICENSE("Dual BSD/GPL");