uhci.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:14k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. #ifndef __LINUX_UHCI_H
  2. #define __LINUX_UHCI_H
  3. #include <linux/list.h>
  4. #include <linux/usb.h>
  5. /*
  6.  * Universal Host Controller Interface data structures and defines
  7.  */
  8. /* Command register */
  9. #define USBCMD 0
  10. #define   USBCMD_RS 0x0001 /* Run/Stop */
  11. #define   USBCMD_HCRESET 0x0002 /* Host reset */
  12. #define   USBCMD_GRESET 0x0004 /* Global reset */
  13. #define   USBCMD_EGSM 0x0008 /* Global Suspend Mode */
  14. #define   USBCMD_FGR 0x0010 /* Force Global Resume */
  15. #define   USBCMD_SWDBG 0x0020 /* SW Debug mode */
  16. #define   USBCMD_CF 0x0040 /* Config Flag (sw only) */
  17. #define   USBCMD_MAXP 0x0080 /* Max Packet (0 = 32, 1 = 64) */
  18. /* Status register */
  19. #define USBSTS 2
  20. #define   USBSTS_USBINT 0x0001 /* Interrupt due to IOC */
  21. #define   USBSTS_ERROR 0x0002 /* Interrupt due to error */
  22. #define   USBSTS_RD 0x0004 /* Resume Detect */
  23. #define   USBSTS_HSE 0x0008 /* Host System Error - basically PCI problems */
  24. #define   USBSTS_HCPE 0x0010 /* Host Controller Process Error - the scripts were buggy */
  25. #define   USBSTS_HCH 0x0020 /* HC Halted */
  26. /* Interrupt enable register */
  27. #define USBINTR 4
  28. #define   USBINTR_TIMEOUT 0x0001 /* Timeout/CRC error enable */
  29. #define   USBINTR_RESUME 0x0002 /* Resume interrupt enable */
  30. #define   USBINTR_IOC 0x0004 /* Interrupt On Complete enable */
  31. #define   USBINTR_SP 0x0008 /* Short packet interrupt enable */
  32. #define USBFRNUM 6
  33. #define USBFLBASEADD 8
  34. #define USBSOF 12
  35. /* USB port status and control registers */
  36. #define USBPORTSC1 16
  37. #define USBPORTSC2 18
  38. #define   USBPORTSC_CCS 0x0001 /* Current Connect Status ("device present") */
  39. #define   USBPORTSC_CSC 0x0002 /* Connect Status Change */
  40. #define   USBPORTSC_PE 0x0004 /* Port Enable */
  41. #define   USBPORTSC_PEC 0x0008 /* Port Enable Change */
  42. #define   USBPORTSC_LS 0x0030 /* Line Status */
  43. #define   USBPORTSC_RD 0x0040 /* Resume Detect */
  44. #define   USBPORTSC_LSDA 0x0100 /* Low Speed Device Attached */
  45. #define   USBPORTSC_PR 0x0200 /* Port Reset */
  46. #define   USBPORTSC_SUSP 0x1000 /* Suspend */
  47. /* Legacy support register */
  48. #define USBLEGSUP 0xc0
  49. #define   USBLEGSUP_DEFAULT 0x2000 /* only PIRQ enable set */
  50. #define UHCI_NULL_DATA_SIZE 0x7FF /* for UHCI controller TD */
  51. #define UHCI_PTR_BITS 0x000F
  52. #define UHCI_PTR_TERM 0x0001
  53. #define UHCI_PTR_QH 0x0002
  54. #define UHCI_PTR_DEPTH 0x0004
  55. #define UHCI_NUMFRAMES 1024 /* in the frame list [array] */
  56. #define UHCI_MAX_SOF_NUMBER 2047 /* in an SOF packet */
  57. #define CAN_SCHEDULE_FRAMES 1000 /* how far future frames can be scheduled */
  58. struct uhci_frame_list {
  59. __u32 frame[UHCI_NUMFRAMES];
  60. void *frame_cpu[UHCI_NUMFRAMES];
  61. dma_addr_t dma_handle;
  62. };
  63. struct urb_priv;
  64. struct uhci_qh {
  65. /* Hardware fields */
  66. __u32 link; /* Next queue */
  67. __u32 element; /* Queue element pointer */
  68. /* Software fields */
  69. dma_addr_t dma_handle;
  70. struct usb_device *dev;
  71. struct urb_priv *urbp;
  72. struct list_head list; /* P: uhci->frame_list_lock */
  73. struct list_head remove_list; /* P: uhci->remove_list_lock */
  74. } __attribute__((aligned(16)));
  75. /*
  76.  * for TD <status>:
  77.  */
  78. #define TD_CTRL_SPD (1 << 29) /* Short Packet Detect */
  79. #define TD_CTRL_C_ERR_MASK (3 << 27) /* Error Counter bits */
  80. #define TD_CTRL_C_ERR_SHIFT 27
  81. #define TD_CTRL_LS (1 << 26) /* Low Speed Device */
  82. #define TD_CTRL_IOS (1 << 25) /* Isochronous Select */
  83. #define TD_CTRL_IOC (1 << 24) /* Interrupt on Complete */
  84. #define TD_CTRL_ACTIVE (1 << 23) /* TD Active */
  85. #define TD_CTRL_STALLED (1 << 22) /* TD Stalled */
  86. #define TD_CTRL_DBUFERR (1 << 21) /* Data Buffer Error */
  87. #define TD_CTRL_BABBLE (1 << 20) /* Babble Detected */
  88. #define TD_CTRL_NAK (1 << 19) /* NAK Received */
  89. #define TD_CTRL_CRCTIMEO (1 << 18) /* CRC/Time Out Error */
  90. #define TD_CTRL_BITSTUFF (1 << 17) /* Bit Stuff Error */
  91. #define TD_CTRL_ACTLEN_MASK 0x7FF /* actual length, encoded as n - 1 */
  92. #define TD_CTRL_ANY_ERROR (TD_CTRL_STALLED | TD_CTRL_DBUFERR | 
  93.  TD_CTRL_BABBLE | TD_CTRL_CRCTIME | TD_CTRL_BITSTUFF)
  94. #define uhci_status_bits(ctrl_sts) (ctrl_sts & 0xFE0000)
  95. #define uhci_actual_length(ctrl_sts) ((ctrl_sts + 1) & TD_CTRL_ACTLEN_MASK) /* 1-based */
  96. /*
  97.  * for TD <info>: (a.k.a. Token)
  98.  */
  99. #define TD_TOKEN_TOGGLE_SHIFT 19
  100. #define TD_TOKEN_TOGGLE (1 << 19)
  101. #define TD_TOKEN_PID_MASK 0xFF
  102. #define TD_TOKEN_EXPLEN_MASK 0x7FF /* expected length, encoded as n - 1 */
  103. #define uhci_maxlen(token) ((token) >> 21)
  104. #define uhci_expected_length(info) (((info >> 21) + 1) & TD_TOKEN_EXPLEN_MASK) /* 1-based */
  105. #define uhci_toggle(token) (((token) >> TD_TOKEN_TOGGLE_SHIFT) & 1)
  106. #define uhci_endpoint(token) (((token) >> 15) & 0xf)
  107. #define uhci_devaddr(token) (((token) >> 8) & 0x7f)
  108. #define uhci_devep(token) (((token) >> 8) & 0x7ff)
  109. #define uhci_packetid(token) ((token) & TD_TOKEN_PID_MASK)
  110. #define uhci_packetout(token) (uhci_packetid(token) != USB_PID_IN)
  111. #define uhci_packetin(token) (uhci_packetid(token) == USB_PID_IN)
  112. /*
  113.  * The documentation says "4 words for hardware, 4 words for software".
  114.  *
  115.  * That's silly, the hardware doesn't care. The hardware only cares that
  116.  * the hardware words are 16-byte aligned, and we can have any amount of
  117.  * sw space after the TD entry as far as I can tell.
  118.  *
  119.  * But let's just go with the documentation, at least for 32-bit machines.
  120.  * On 64-bit machines we probably want to take advantage of the fact that
  121.  * hw doesn't really care about the size of the sw-only area.
  122.  *
  123.  * Alas, not anymore, we have more than 4 words for software, woops.
  124.  * Everything still works tho, surprise! -jerdfelt
  125.  */
  126. struct uhci_td {
  127. /* Hardware fields */
  128. __u32 link;
  129. __u32 status;
  130. __u32 info;
  131. __u32 buffer;
  132. /* Software fields */
  133. dma_addr_t dma_handle;
  134. struct usb_device *dev;
  135. struct urb *urb;
  136. struct list_head list; /* P: urb->lock */
  137. int frame;
  138. struct list_head fl_list; /* P: uhci->frame_list_lock */
  139. } __attribute__((aligned(16)));
  140. /*
  141.  * There are various standard queues. We set up several different
  142.  * queues for each of the three basic queue types: interrupt,
  143.  * control, and bulk.
  144.  *
  145.  *  - There are various different interrupt latencies: ranging from
  146.  *    every other USB frame (2 ms apart) to every 256 USB frames (ie
  147.  *    256 ms apart). Make your choice according to how obnoxious you
  148.  *    want to be on the wire, vs how critical latency is for you.
  149.  *  - The control list is done every frame.
  150.  *  - There are 4 bulk lists, so that up to four devices can have a
  151.  *    bulk list of their own and when run concurrently all four lists
  152.  *    will be be serviced.
  153.  *
  154.  * This is a bit misleading, there are various interrupt latencies, but they
  155.  * vary a bit, interrupt2 isn't exactly 2ms, it can vary up to 4ms since the
  156.  * other queues can "override" it. interrupt4 can vary up to 8ms, etc. Minor
  157.  * problem
  158.  *
  159.  * In the case of the root hub, these QH's are just head's of qh's. Don't
  160.  * be scared, it kinda makes sense. Look at this wonderful picture care of
  161.  * Linus:
  162.  *
  163.  *  generic-  ->  dev1-  ->  generic-  ->  dev1-  ->  control-  ->  bulk- -> ...
  164.  *   iso-QH      iso-QH       irq-QH      irq-QH        QH           QH
  165.  *      |           |            |           |           |            |
  166.  *     End     dev1-iso-TD1     End     dev1-irq-TD1    ...          ... 
  167.  *                  |
  168.  *             dev1-iso-TD2
  169.  *                  |
  170.  *                ....
  171.  *
  172.  * This may vary a bit (the UHCI docs don't explicitly say you can put iso
  173.  * transfers in QH's and all of their pictures don't have that either) but
  174.  * other than that, that is what we're doing now
  175.  *
  176.  * And now we don't put Iso transfers in QH's, so we don't waste one on it
  177.  * --jerdfelt
  178.  *
  179.  * To keep with Linus' nomenclature, this is called the QH skeleton. These
  180.  * labels (below) are only signficant to the root hub's QH's
  181.  */
  182. #define UHCI_NUM_SKELTD 10
  183. #define skel_int1_td skeltd[0]
  184. #define skel_int2_td skeltd[1]
  185. #define skel_int4_td skeltd[2]
  186. #define skel_int8_td skeltd[3]
  187. #define skel_int16_td skeltd[4]
  188. #define skel_int32_td skeltd[5]
  189. #define skel_int64_td skeltd[6]
  190. #define skel_int128_td skeltd[7]
  191. #define skel_int256_td skeltd[8]
  192. #define skel_term_td skeltd[9] /* To work around PIIX UHCI bug */
  193. #define UHCI_NUM_SKELQH 4
  194. #define skel_ls_control_qh skelqh[0]
  195. #define skel_hs_control_qh skelqh[1]
  196. #define skel_bulk_qh skelqh[2]
  197. #define skel_term_qh skelqh[3]
  198. /*
  199.  * Search tree for determining where <interval> fits in the
  200.  * skelqh[] skeleton.
  201.  *
  202.  * An interrupt request should be placed into the slowest skelqh[]
  203.  * which meets the interval/period/frequency requirement.
  204.  * An interrupt request is allowed to be faster than <interval> but not slower.
  205.  *
  206.  * For a given <interval>, this function returns the appropriate/matching
  207.  * skelqh[] index value.
  208.  *
  209.  * NOTE: For UHCI, we don't really need int256_qh since the maximum interval
  210.  * is 255 ms.  However, we do need an int1_qh since 1 is a valid interval
  211.  * and we should meet that frequency when requested to do so.
  212.  * This will require some change(s) to the UHCI skeleton.
  213.  */
  214. static inline int __interval_to_skel(int interval)
  215. {
  216. if (interval < 16) {
  217. if (interval < 4) {
  218. if (interval < 2)
  219. return 0; /* int1 for 0-1 ms */
  220. return 1; /* int2 for 2-3 ms */
  221. }
  222. if (interval < 8)
  223. return 2; /* int4 for 4-7 ms */
  224. return 3; /* int8 for 8-15 ms */
  225. }
  226. if (interval < 64) {
  227. if (interval < 32)
  228. return 4; /* int16 for 16-31 ms */
  229. return 5; /* int32 for 32-63 ms */
  230. }
  231. if (interval < 128)
  232. return 6; /* int64 for 64-127 ms */
  233. return 7; /* int128 for 128-255 ms (Max.) */
  234. }
  235. struct virt_root_hub {
  236. struct usb_device *dev;
  237. int devnum; /* Address of Root Hub endpoint */
  238. struct urb *urb;
  239. void *int_addr;
  240. int send;
  241. int interval;
  242. int numports;
  243. int c_p_r[8];
  244. struct timer_list rh_int_timer;
  245. };
  246. /*
  247.  * This describes the full uhci information.
  248.  *
  249.  * Note how the "proper" USB information is just
  250.  * a subset of what the full implementation needs.
  251.  */
  252. struct uhci {
  253. struct pci_dev *dev;
  254. #ifdef CONFIG_PROC_FS
  255. /* procfs */
  256. int num;
  257. struct proc_dir_entry *proc_entry;
  258. #endif
  259. /* Grabbed from PCI */
  260. int irq;
  261. unsigned int io_addr;
  262. unsigned int io_size;
  263. struct pci_pool *qh_pool;
  264. struct pci_pool *td_pool;
  265. struct usb_bus *bus;
  266. struct uhci_td *skeltd[UHCI_NUM_SKELTD]; /* Skeleton TD's */
  267. struct uhci_qh *skelqh[UHCI_NUM_SKELQH]; /* Skeleton QH's */
  268. spinlock_t frame_list_lock;
  269. struct uhci_frame_list *fl; /* P: uhci->frame_list_lock */
  270. int fsbr; /* Full speed bandwidth reclamation */
  271. unsigned long fsbrtimeout; /* FSBR delay */
  272. int is_suspended;
  273. /* Main list of URB's currently controlled by this HC */
  274. spinlock_t urb_list_lock;
  275. struct list_head urb_list; /* P: uhci->urb_list_lock */
  276. /* List of QH's that are done, but waiting to be unlinked (race) */
  277. spinlock_t qh_remove_list_lock;
  278. struct list_head qh_remove_list; /* P: uhci->qh_remove_list_lock */
  279. /* List of asynchronously unlinked URB's */
  280. spinlock_t urb_remove_list_lock;
  281. struct list_head urb_remove_list; /* P: uhci->urb_remove_list_lock */
  282. /* List of URB's awaiting completion callback */
  283. spinlock_t complete_list_lock;
  284. struct list_head complete_list; /* P: uhci->complete_list_lock */
  285. struct virt_root_hub rh; /* private data of the virtual root hub */
  286. };
  287. struct urb_priv {
  288. struct urb *urb;
  289. struct usb_device *dev;
  290. dma_addr_t setup_packet_dma_handle;
  291. dma_addr_t transfer_buffer_dma_handle;
  292. struct uhci_qh *qh; /* QH for this URB */
  293. struct list_head td_list; /* P: urb->lock */
  294. int fsbr : 1; /* URB turned on FSBR */
  295. int fsbr_timeout : 1; /* URB timed out on FSBR */
  296. int queued : 1; /* QH was queued (not linked in) */
  297. int short_control_packet : 1; /* If we get a short packet during */
  298. /*  a control transfer, retrigger */
  299. /*  the status phase */
  300. int status; /* Final status */
  301. unsigned long inserttime; /* In jiffies */
  302. unsigned long fsbrtime; /* In jiffies */
  303. struct list_head queue_list; /* P: uhci->frame_list_lock */
  304. struct list_head complete_list; /* P: uhci->complete_list_lock */
  305. };
  306. /*
  307.  * Locking in uhci.c
  308.  *
  309.  * spinlocks are used extensively to protect the many lists and data
  310.  * structures we have. It's not that pretty, but it's necessary. We
  311.  * need to be done with all of the locks (except complete_list_lock) when
  312.  * we call urb->complete. I've tried to make it simple enough so I don't
  313.  * have to spend hours racking my brain trying to figure out if the
  314.  * locking is safe.
  315.  *
  316.  * Here's the safe locking order to prevent deadlocks:
  317.  *
  318.  * #1 uhci->urb_list_lock
  319.  * #2 urb->lock
  320.  * #3 uhci->urb_remove_list_lock, uhci->frame_list_lock, 
  321.  *   uhci->qh_remove_list_lock
  322.  * #4 uhci->complete_list_lock
  323.  *
  324.  * If you're going to grab 2 or more locks at once, ALWAYS grab the lock
  325.  * at the lowest level FIRST and NEVER grab locks at the same level at the
  326.  * same time.
  327.  * 
  328.  * So, if you need uhci->urb_list_lock, grab it before you grab urb->lock
  329.  */
  330. /* -------------------------------------------------------------------------
  331.    Virtual Root HUB
  332.    ------------------------------------------------------------------------- */
  333. /* destination of request */
  334. #define RH_DEVICE 0x00
  335. #define RH_INTERFACE 0x01
  336. #define RH_ENDPOINT 0x02
  337. #define RH_OTHER 0x03
  338. #define RH_CLASS 0x20
  339. #define RH_VENDOR 0x40
  340. /* Requests: bRequest << 8 | bmRequestType */
  341. #define RH_GET_STATUS 0x0080
  342. #define RH_CLEAR_FEATURE 0x0100
  343. #define RH_SET_FEATURE 0x0300
  344. #define RH_SET_ADDRESS 0x0500
  345. #define RH_GET_DESCRIPTOR 0x0680
  346. #define RH_SET_DESCRIPTOR 0x0700
  347. #define RH_GET_CONFIGURATION 0x0880
  348. #define RH_SET_CONFIGURATION 0x0900
  349. #define RH_GET_STATE 0x0280
  350. #define RH_GET_INTERFACE 0x0A80
  351. #define RH_SET_INTERFACE 0x0B00
  352. #define RH_SYNC_FRAME 0x0C80
  353. /* Our Vendor Specific Request */
  354. #define RH_SET_EP 0x2000
  355. /* Hub port features */
  356. #define RH_PORT_CONNECTION 0x00
  357. #define RH_PORT_ENABLE 0x01
  358. #define RH_PORT_SUSPEND 0x02
  359. #define RH_PORT_OVER_CURRENT 0x03
  360. #define RH_PORT_RESET 0x04
  361. #define RH_PORT_POWER 0x08
  362. #define RH_PORT_LOW_SPEED 0x09
  363. #define RH_C_PORT_CONNECTION 0x10
  364. #define RH_C_PORT_ENABLE 0x11
  365. #define RH_C_PORT_SUSPEND 0x12
  366. #define RH_C_PORT_OVER_CURRENT 0x13
  367. #define RH_C_PORT_RESET 0x14
  368. /* Hub features */
  369. #define RH_C_HUB_LOCAL_POWER 0x00
  370. #define RH_C_HUB_OVER_CURRENT 0x01
  371. #define RH_DEVICE_REMOTE_WAKEUP 0x00
  372. #define RH_ENDPOINT_STALL 0x01
  373. /* Our Vendor Specific feature */
  374. #define RH_REMOVE_EP 0x00
  375. #define RH_ACK 0x01
  376. #define RH_REQ_ERR -1
  377. #define RH_NACK 0x00
  378. #endif