PageRenderTime 27ms CodeModel.GetById 32ms RepoModel.GetById 1ms app.codeStats 0ms

/src/os/linux/rt_usb_util.c

https://gitlab.com/shinvdu/mt7601u
C | 681 lines | 290 code | 87 blank | 304 comment | 5 complexity | 7e88c7761603c087d1c62b37bc67c1c0 MD5 | raw file
  1. /****************************************************************************
  2. Module Name:
  3. rt_usb_util.c
  4. Abstract:
  5. Any utility is used in UTIL module for USB function.
  6. Revision History:
  7. Who When What
  8. --------- ---------- ----------------------------------------------
  9. ***************************************************************************/
  10. #define RTMP_MODULE_OS
  11. #define RTMP_MODULE_OS_UTIL
  12. #include "rtmp_comm.h"
  13. #include "rtmp_osabl.h"
  14. #include "rt_os_util.h"
  15. #ifdef RTMP_MAC_USB
  16. #ifdef OS_ABL_SUPPORT
  17. MODULE_LICENSE("GPL");
  18. #endif /* OS_ABL_SUPPORT */
  19. #if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
  20. /*
  21. ========================================================================
  22. Routine Description:
  23. Dump URB information.
  24. Arguments:
  25. purb_org - the URB
  26. Return Value:
  27. None
  28. Note:
  29. ========================================================================
  30. */
  31. void dump_urb(VOID *purb_org)
  32. {
  33. struct urb *purb = (struct urb *)purb_org;
  34. printk("urb :0x%08lx\n", (unsigned long)purb);
  35. printk("\tdev :0x%08lx\n", (unsigned long)purb->dev);
  36. printk("\t\tdev->state :0x%d\n", purb->dev->state);
  37. printk("\tpipe :0x%08x\n", purb->pipe);
  38. printk("\tstatus :%d\n", purb->status);
  39. printk("\ttransfer_flags :0x%08x\n", purb->transfer_flags);
  40. printk("\ttransfer_buffer :0x%08lx\n", (unsigned long)purb->transfer_buffer);
  41. printk("\ttransfer_buffer_length:%d\n", purb->transfer_buffer_length);
  42. printk("\tactual_length :%d\n", purb->actual_length);
  43. printk("\tsetup_packet :0x%08lx\n", (unsigned long)purb->setup_packet);
  44. printk("\tstart_frame :%d\n", purb->start_frame);
  45. printk("\tnumber_of_packets :%d\n", purb->number_of_packets);
  46. printk("\tinterval :%d\n", purb->interval);
  47. printk("\terror_count :%d\n", purb->error_count);
  48. printk("\tcontext :0x%08lx\n", (unsigned long)purb->context);
  49. printk("\tcomplete :0x%08lx\n\n", (unsigned long)purb->complete);
  50. }
  51. #else
  52. void dump_urb(VOID *purb_org)
  53. {
  54. return;
  55. }
  56. #endif /* LINUX_VERSION_CODE */
  57. #ifdef CONFIG_STA_SUPPORT
  58. #ifdef CONFIG_PM
  59. /*
  60. void rausb_autopm_put_interface( void *intf)
  61. {
  62. usb_autopm_put_interface((struct usb_interface *)intf);
  63. }
  64. int rausb_autopm_get_interface( void *intf)
  65. {
  66. return usb_autopm_get_interface((struct usb_interface *)intf);
  67. }
  68. */
  69. /*
  70. ========================================================================
  71. Routine Description:
  72. RTMP_Usb_AutoPM_Put_Interface
  73. Arguments:
  74. Return Value:
  75. Note:
  76. ========================================================================
  77. */
  78. int rausb_autopm_put_interface (
  79. IN VOID *intfsrc)
  80. {
  81. INT pm_usage_cnt;
  82. struct usb_interface *intf =(struct usb_interface *)intfsrc;
  83. usb_autopm_put_interface(intf);
  84. return 0;
  85. }
  86. EXPORT_SYMBOL(rausb_autopm_put_interface);
  87. /*
  88. ========================================================================
  89. Routine Description:
  90. RTMP_Usb_AutoPM_Get_Interface
  91. Arguments:
  92. Return Value: (-1) error (resume fail ) 1 success ( resume success) 2 (do nothing)
  93. Note:
  94. ========================================================================
  95. */
  96. int rausb_autopm_get_interface (
  97. IN VOID *intfsrc)
  98. {
  99. INT pm_usage_cnt;
  100. struct usb_interface *intf =(struct usb_interface *)intfsrc;
  101. usb_autopm_get_interface(intf);
  102. }
  103. EXPORT_SYMBOL(rausb_autopm_get_interface);
  104. #endif /* CONFIG_PM */
  105. #endif /* CONFIG_STA_SUPPORT */
  106. #ifdef OS_ABL_SUPPORT
  107. /*
  108. ========================================================================
  109. Routine Description:
  110. Register a USB driver.
  111. Arguments:
  112. new_driver - the driver
  113. Return Value:
  114. 0 - successfully
  115. Otherwise - fail
  116. Note:
  117. ========================================================================
  118. */
  119. int rausb_register(VOID * new_driver)
  120. {
  121. return usb_register((struct usb_driver *)new_driver);
  122. }
  123. EXPORT_SYMBOL(rausb_register);
  124. /*
  125. ========================================================================
  126. Routine Description:
  127. De-Register a USB driver.
  128. Arguments:
  129. new_driver - the driver
  130. Return Value:
  131. None
  132. Note:
  133. ========================================================================
  134. */
  135. void rausb_deregister(VOID * driver)
  136. {
  137. usb_deregister((struct usb_driver *)driver);
  138. }
  139. EXPORT_SYMBOL(rausb_deregister);
  140. /*
  141. ========================================================================
  142. Routine Description:
  143. Create a new urb for a USB driver to use.
  144. Arguments:
  145. iso_packets - number of iso packets for this urb
  146. Return Value:
  147. the URB
  148. Note:
  149. ========================================================================
  150. */
  151. struct urb *rausb_alloc_urb(int iso_packets)
  152. {
  153. #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
  154. return usb_alloc_urb(iso_packets, GFP_ATOMIC);
  155. #else
  156. return usb_alloc_urb(iso_packets);
  157. #endif /* LINUX_VERSION_CODE */
  158. }
  159. EXPORT_SYMBOL(rausb_alloc_urb);
  160. /*
  161. ========================================================================
  162. Routine Description:
  163. Free the memory used by a urb.
  164. Arguments:
  165. urb - the URB
  166. Return Value:
  167. None
  168. Note:
  169. ========================================================================
  170. */
  171. void rausb_free_urb(VOID *urb)
  172. {
  173. usb_free_urb((struct urb *)urb);
  174. }
  175. EXPORT_SYMBOL(rausb_free_urb);
  176. #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
  177. /*
  178. ========================================================================
  179. Routine Description:
  180. Release a use of the usb device structure.
  181. Arguments:
  182. dev - the USB device
  183. Return Value:
  184. None
  185. Note:
  186. ========================================================================
  187. */
  188. void rausb_put_dev(VOID *dev)
  189. {
  190. usb_put_dev((struct usb_device *)dev);
  191. }
  192. EXPORT_SYMBOL(rausb_put_dev);
  193. /*
  194. ========================================================================
  195. Routine Description:
  196. Increments the reference count of the usb device structure.
  197. Arguments:
  198. dev - the USB device
  199. Return Value:
  200. the device with the incremented reference counter
  201. Note:
  202. ========================================================================
  203. */
  204. struct usb_device *rausb_get_dev(VOID *dev)
  205. {
  206. return usb_get_dev((struct usb_device *)dev);
  207. }
  208. EXPORT_SYMBOL(rausb_get_dev);
  209. #endif /* LINUX_VERSION_CODE */
  210. /*
  211. ========================================================================
  212. Routine Description:
  213. Issue an asynchronous transfer request for an endpoint.
  214. Arguments:
  215. urb - the URB
  216. Return Value:
  217. 0 - successfully
  218. Otherwise - fail
  219. Note:
  220. ========================================================================
  221. */
  222. int rausb_submit_urb(VOID *urb)
  223. {
  224. #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
  225. return usb_submit_urb((struct urb *)urb, GFP_ATOMIC);
  226. #else
  227. return usb_submit_urb((struct urb *)urb);
  228. #endif /* LINUX_VERSION_CODE */
  229. }
  230. EXPORT_SYMBOL(rausb_submit_urb);
  231. /*
  232. ========================================================================
  233. Routine Description:
  234. Allocate dma-consistent buffer.
  235. Arguments:
  236. dev - the USB device
  237. size - buffer size
  238. dma - used to return DMA address of buffer
  239. Return Value:
  240. a buffer that may be used to perform DMA to the specified device
  241. Note:
  242. ========================================================================
  243. */
  244. void *rausb_buffer_alloc(VOID *dev,
  245. size_t size,
  246. ra_dma_addr_t *dma)
  247. {
  248. #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
  249. dma_addr_t DmaAddr = (dma_addr_t)(*dma);
  250. void *buf;
  251. #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35)
  252. buf = usb_alloc_coherent(dev, size, GFP_ATOMIC, &DmaAddr);
  253. #else
  254. buf = usb_buffer_alloc(dev, size, GFP_ATOMIC, &DmaAddr);
  255. #endif
  256. *dma = (ra_dma_addr_t)DmaAddr;
  257. return buf;
  258. #else
  259. return kmalloc(size, GFP_ATOMIC);
  260. #endif
  261. }
  262. EXPORT_SYMBOL(rausb_buffer_alloc);
  263. /*
  264. ========================================================================
  265. Routine Description:
  266. Free memory allocated with usb_buffer_alloc.
  267. Arguments:
  268. dev - the USB device
  269. size - buffer size
  270. addr - CPU address of buffer
  271. dma - used to return DMA address of buffer
  272. Return Value:
  273. None
  274. Note:
  275. ========================================================================
  276. */
  277. void rausb_buffer_free(VOID *dev,
  278. size_t size,
  279. void *addr,
  280. ra_dma_addr_t dma)
  281. {
  282. #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
  283. dma_addr_t DmaAddr = (dma_addr_t)(dma);
  284. #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35)
  285. usb_free_coherent(dev, size, addr, DmaAddr);
  286. #else
  287. usb_buffer_free(dev, size, addr, DmaAddr);
  288. #endif
  289. #else
  290. kfree(addr);
  291. #endif
  292. }
  293. EXPORT_SYMBOL(rausb_buffer_free);
  294. /*
  295. ========================================================================
  296. Routine Description:
  297. Send a control message to a device.
  298. Arguments:
  299. dev - the USB device
  300. Return Value:
  301. 0 - successfully
  302. Otherwise - fail
  303. Note:
  304. ========================================================================
  305. */
  306. int rausb_control_msg(VOID *dev,
  307. unsigned int pipe,
  308. __u8 request,
  309. __u8 requesttype,
  310. __u16 value,
  311. __u16 index,
  312. void *data,
  313. __u16 size,
  314. int timeout)
  315. {
  316. int ret;
  317. ret = usb_control_msg((struct usb_device *)dev, pipe, request, requesttype, value, index,
  318. data, size, timeout);
  319. if (ret == -ENODEV)
  320. return RTMP_USB_CONTROL_MSG_ENODEV;
  321. if (ret < 0)
  322. return RTMP_USB_CONTROL_MSG_FAIL;
  323. return ret;
  324. }
  325. EXPORT_SYMBOL(rausb_control_msg);
  326. unsigned int rausb_sndctrlpipe(VOID *dev, ULONG address)
  327. {
  328. return usb_sndctrlpipe(dev, address);
  329. }
  330. EXPORT_SYMBOL(rausb_sndctrlpipe);
  331. unsigned int rausb_rcvctrlpipe(VOID *dev, ULONG address)
  332. {
  333. return usb_rcvctrlpipe(dev, address);
  334. }
  335. EXPORT_SYMBOL(rausb_rcvctrlpipe);
  336. /*
  337. ========================================================================
  338. Routine Description:
  339. Cancel a transfer request and wait for it to finish.
  340. Arguments:
  341. urb - the URB
  342. Return Value:
  343. None
  344. Note:
  345. ========================================================================
  346. */
  347. void rausb_kill_urb(VOID *urb)
  348. {
  349. #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,7)
  350. usb_kill_urb((struct urb *)urb);
  351. #else
  352. usb_unlink_urb((struct urb *)urb);
  353. #endif /* LINUX_VERSION_CODE */
  354. }
  355. EXPORT_SYMBOL(rausb_kill_urb);
  356. #endif /* OS_ABL_SUPPORT */
  357. VOID RtmpOsUsbEmptyUrbCheck(
  358. IN VOID **ppWait,
  359. IN NDIS_SPIN_LOCK *pBulkInLock,
  360. IN UCHAR *pPendingRx)
  361. {
  362. UINT32 i = 0;
  363. DECLARE_WAIT_QUEUE_HEAD(unlink_wakeup);
  364. DECLARE_WAITQUEUE(wait, current);
  365. /* ensure there are no more active urbs. */
  366. add_wait_queue (&unlink_wakeup, &wait);
  367. *ppWait = &unlink_wakeup;
  368. /* maybe wait for deletions to finish. */
  369. i = 0;
  370. /*while((i < 25) && atomic_read(&pAd->PendingRx) > 0) */
  371. while(i < 25)
  372. {
  373. /* unsigned long IrqFlags; */
  374. RTMP_SEM_LOCK(pBulkInLock);
  375. if (*pPendingRx == 0)
  376. {
  377. RTMP_SEM_UNLOCK(pBulkInLock);
  378. break;
  379. }
  380. RTMP_SEM_UNLOCK(pBulkInLock);
  381. #if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,9)
  382. msleep(UNLINK_TIMEOUT_MS); /*Time in millisecond */
  383. #else
  384. RTMPusecDelay(UNLINK_TIMEOUT_MS*1000); /*Time in microsecond */
  385. #endif
  386. i++;
  387. }
  388. *ppWait = NULL;
  389. remove_wait_queue (&unlink_wakeup, &wait);
  390. }
  391. VOID RtmpOsUsbInitHTTxDesc(
  392. IN VOID *pUrbSrc,
  393. IN VOID *pUsb_Dev,
  394. IN UINT BulkOutEpAddr,
  395. IN PUCHAR pSrc,
  396. IN ULONG BulkOutSize,
  397. IN USB_COMPLETE_HANDLER Func,
  398. IN VOID *pTxContext,
  399. IN ra_dma_addr_t TransferDma)
  400. {
  401. PURB pUrb = (PURB)pUrbSrc;
  402. dma_addr_t DmaAddr = (dma_addr_t)(TransferDma);
  403. ASSERT(pUrb);
  404. /*Initialize a tx bulk urb */
  405. RTUSB_FILL_HTTX_BULK_URB(pUrb,
  406. pUsb_Dev,
  407. BulkOutEpAddr,
  408. pSrc,
  409. BulkOutSize,
  410. (usb_complete_t)Func,
  411. pTxContext,
  412. DmaAddr);
  413. }
  414. VOID RtmpOsUsbInitRxDesc(
  415. IN VOID *pUrbSrc,
  416. IN VOID *pUsb_Dev,
  417. IN UINT BulkInEpAddr,
  418. IN UCHAR *pTransferBuffer,
  419. IN UINT32 BufSize,
  420. IN USB_COMPLETE_HANDLER Func,
  421. IN VOID *pRxContext,
  422. IN ra_dma_addr_t TransferDma)
  423. {
  424. PURB pUrb = (PURB)pUrbSrc;
  425. dma_addr_t DmaAddr = (dma_addr_t)(TransferDma);
  426. ASSERT(pUrb);
  427. /*Initialize a rx bulk urb */
  428. RTUSB_FILL_RX_BULK_URB(pUrb,
  429. pUsb_Dev,
  430. BulkInEpAddr,
  431. pTransferBuffer,
  432. BufSize,
  433. (usb_complete_t)Func,
  434. pRxContext,
  435. DmaAddr);
  436. }
  437. VOID *RtmpOsUsbContextGet(
  438. IN VOID *pUrb)
  439. {
  440. return ((purbb_t)pUrb)->rtusb_urb_context;
  441. }
  442. NTSTATUS RtmpOsUsbStatusGet(
  443. IN VOID *pUrb)
  444. {
  445. return ((purbb_t)pUrb)->rtusb_urb_status;
  446. }
  447. VOID RtmpOsUsbDmaMapping(
  448. IN VOID *pUrb)
  449. {
  450. RTUSB_URB_DMA_MAPPING(((purbb_t)pUrb));
  451. }
  452. /*
  453. ========================================================================
  454. Routine Description:
  455. Get the data pointer from the URB.
  456. Arguments:
  457. pUrb - USB URB
  458. Return Value:
  459. the data pointer
  460. Note:
  461. ========================================================================
  462. */
  463. VOID *RtmpOsUsbUrbDataGet(
  464. IN VOID *pUrb)
  465. {
  466. return RTMP_USB_URB_DATA_GET(pUrb);
  467. }
  468. /*
  469. ========================================================================
  470. Routine Description:
  471. Get the status from the URB.
  472. Arguments:
  473. pUrb - USB URB
  474. Return Value:
  475. the status
  476. Note:
  477. ========================================================================
  478. */
  479. NTSTATUS RtmpOsUsbUrbStatusGet(
  480. IN VOID *pUrb)
  481. {
  482. return RTMP_USB_URB_STATUS_GET(pUrb);
  483. }
  484. /*
  485. ========================================================================
  486. Routine Description:
  487. Get the data length from the URB.
  488. Arguments:
  489. pUrb - USB URB
  490. Return Value:
  491. the data length
  492. Note:
  493. ========================================================================
  494. */
  495. ULONG RtmpOsUsbUrbLenGet(
  496. IN VOID *pUrb)
  497. {
  498. return RTMP_USB_URB_LEN_GET(pUrb);
  499. }
  500. /*
  501. ========================================================================
  502. Routine Description:
  503. Get USB Vendor ID.
  504. Arguments:
  505. pUsbDev - the usb device
  506. Return Value:
  507. the name
  508. Note:
  509. ========================================================================
  510. */
  511. UINT32 RtmpOsGetUsbDevVendorID(IN VOID *pUsbDev) {
  512. return ((struct usb_device *) pUsbDev)->descriptor.idVendor;
  513. }
  514. /*
  515. ========================================================================
  516. Routine Description:
  517. Get USB Product ID.
  518. Arguments:
  519. pUsbDev - the usb device
  520. Return Value:
  521. the name
  522. Note:
  523. ========================================================================
  524. */
  525. UINT32 RtmpOsGetUsbDevProductID(IN VOID *pUsbDev) {
  526. return ((struct usb_device *) pUsbDev)->descriptor.idProduct;
  527. }
  528. #endif /* RTMP_MAC_USB */