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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * Copyright (c) 2001-2002 by David Brownell
  3.  * 
  4.  * This program is free software; you can redistribute it and/or modify it
  5.  * under the terms of the GNU General Public License as published by the
  6.  * Free Software Foundation; either version 2 of the License, or (at your
  7.  * option) any later version.
  8.  *
  9.  * This program is distributed in the hope that it will be useful, but
  10.  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  11.  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12.  * for more details.
  13.  *
  14.  * You should have received a copy of the GNU General Public License
  15.  * along with this program; if not, write to the Free Software Foundation,
  16.  * Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17.  */
  18. #ifndef __LINUX_EHCI_HCD_H
  19. #define __LINUX_EHCI_HCD_H
  20. /* definitions used for the EHCI driver */
  21. /* ehci_hcd->lock guards shared data against other CPUs:
  22.  *   ehci_hcd: async, reclaim, periodic (and shadow), ...
  23.  *   hcd_dev: ep[]
  24.  *   ehci_qh: qh_next, qtd_list
  25.  *   ehci_qtd: qtd_list
  26.  *
  27.  * Also, hold this lock when talking to HC registers or
  28.  * when updating hw_* fields in shared qh/qtd/... structures.
  29.  */
  30. #define EHCI_MAX_ROOT_PORTS 15 /* see HCS_N_PORTS */
  31. struct ehci_hcd { /* one per controller */
  32. spinlock_t lock;
  33. /* async schedule support */
  34. struct ehci_qh *async;
  35. struct ehci_qh *reclaim;
  36. int reclaim_ready;
  37. /* periodic schedule support */
  38. #define DEFAULT_I_TDPS 1024 /* some HCs can do less */
  39. unsigned periodic_size;
  40. u32 *periodic; /* hw periodic table */
  41. dma_addr_t periodic_dma;
  42. unsigned i_thresh; /* uframes HC might cache */
  43. union ehci_shadow *pshadow; /* mirror hw periodic table */
  44. int next_uframe; /* scan periodic, start here */
  45. unsigned periodic_urbs; /* how many urbs scheduled? */
  46. /* deferred work from IRQ, etc */
  47. struct tasklet_struct tasklet;
  48. /* per root hub port */
  49. unsigned long reset_done [EHCI_MAX_ROOT_PORTS];
  50. /* glue to PCI and HCD framework */
  51. struct usb_hcd hcd;
  52. struct ehci_caps *caps;
  53. struct ehci_regs *regs;
  54. u32 hcs_params; /* cached register copy */
  55. /* per-HC memory pools (could be per-PCI-bus, but ...) */
  56. struct pci_pool *qh_pool; /* qh per active urb */
  57. struct pci_pool *qtd_pool; /* one or more per qh */
  58. struct pci_pool *itd_pool; /* itd per iso urb */
  59. struct pci_pool *sitd_pool; /* sitd per split iso urb */
  60. };
  61. /* unwrap an HCD pointer to get an EHCI_HCD pointer */ 
  62. #define hcd_to_ehci(hcd_ptr) list_entry(hcd_ptr, struct ehci_hcd, hcd)
  63. /* NOTE:  urb->transfer_flags expected to not use this bit !!! */
  64. #define EHCI_STATE_UNLINK 0x8000 /* urb being unlinked */
  65. /*-------------------------------------------------------------------------*/
  66. /* EHCI register interface, corresponds to EHCI Revision 0.95 specification */
  67. /* Section 2.2 Host Controller Capability Registers */
  68. struct ehci_caps {
  69. u8 length; /* CAPLENGTH - size of this struct */
  70. u8 reserved;       /* offset 0x1 */
  71. u16 hci_version;    /* HCIVERSION - offset 0x2 */
  72. u32 hcs_params;     /* HCSPARAMS - offset 0x4 */
  73. #define HCS_DEBUG_PORT(p) (((p)>>20)&0xf) /* bits 23:20, debug port? */
  74. #define HCS_INDICATOR(p) ((p)&(1 << 16)) /* true: has port indicators */
  75. #define HCS_N_CC(p) (((p)>>12)&0xf) /* bits 15:12, #companion HCs */
  76. #define HCS_N_PCC(p) (((p)>>8)&0xf) /* bits 11:8, ports per CC */
  77. #define HCS_PORTROUTED(p) ((p)&(1 << 7)) /* true: port routing */ 
  78. #define HCS_PPC(p) ((p)&(1 << 4)) /* true: port power control */ 
  79. #define HCS_N_PORTS(p) (((p)>>0)&0xf) /* bits 3:0, ports on HC */
  80. u32 hcc_params;      /* HCCPARAMS - offset 0x8 */
  81. #define HCC_EXT_CAPS(p) (((p)>>8)&0xff) /* for pci extended caps */
  82. #define HCC_ISOC_CACHE(p)       ((p)&(1 << 7))  /* true: can cache isoc frame */
  83. #define HCC_ISOC_THRES(p)       (((p)>>4)&0x7)  /* bits 6:4, uframes cached */
  84. #define HCC_CANPARK(p) ((p)&(1 << 2))  /* true: can park on async qh */
  85. #define HCC_PGM_FRAMELISTLEN(p) ((p)&(1 << 1))  /* true: periodic_size changes*/
  86. #define HCC_64BIT_ADDR(p)       ((p)&(1))       /* true: can use 64-bit addr */
  87. u8 portroute [8];  /* nibbles for routing - offset 0xC */
  88. } __attribute__ ((packed));
  89. /* Section 2.3 Host Controller Operational Registers */
  90. struct ehci_regs {
  91. /* USBCMD: offset 0x00 */
  92. u32 command;
  93. /* 23:16 is r/w intr rate, in microframes; default "8" == 1/msec */
  94. #define CMD_PARK (1<<11) /* enable "park" on async qh */
  95. #define CMD_PARK_CNT(c) (((c)>>8)&3) /* how many transfers to park for */
  96. #define CMD_LRESET (1<<7) /* partial reset (no ports, etc) */
  97. #define CMD_IAAD (1<<6) /* "doorbell" interrupt async advance */
  98. #define CMD_ASE (1<<5) /* async schedule enable */
  99. #define CMD_PSE   (1<<4) /* periodic schedule enable */
  100. /* 3:2 is periodic frame list size */
  101. #define CMD_RESET (1<<1) /* reset HC not bus */
  102. #define CMD_RUN (1<<0) /* start/stop HC */
  103. /* USBSTS: offset 0x04 */
  104. u32 status;
  105. #define STS_ASS (1<<15) /* Async Schedule Status */
  106. #define STS_PSS (1<<14) /* Periodic Schedule Status */
  107. #define STS_RECL (1<<13) /* Reclamation */
  108. #define STS_HALT (1<<12) /* Not running (any reason) */
  109. /* some bits reserved */
  110. /* these STS_* flags are also intr_enable bits (USBINTR) */
  111. #define STS_IAA (1<<5) /* Interrupted on async advance */
  112. #define STS_FATAL (1<<4) /* such as some PCI access errors */
  113. #define STS_FLR (1<<3) /* frame list rolled over */
  114. #define STS_PCD (1<<2) /* port change detect */
  115. #define STS_ERR (1<<1) /* "error" completion (overflow, ...) */
  116. #define STS_INT (1<<0) /* "normal" completion (short, ...) */
  117. /* USBINTR: offset 0x08 */
  118. u32 intr_enable;
  119. /* FRINDEX: offset 0x0C */
  120. u32 frame_index; /* current microframe number */
  121. /* CTRLDSSEGMENT: offset 0x10 */
  122. u32 segment;  /* address bits 63:32 if needed */
  123. /* PERIODICLISTBASE: offset 0x14 */
  124. u32 frame_list;  /* points to periodic list */
  125. /* ASYNCICLISTADDR: offset 0x18 */
  126. u32 async_next; /* address of next async queue head */
  127. u32 reserved [9];
  128. /* CONFIGFLAG: offset 0x40 */
  129. u32 configured_flag;
  130. #define FLAG_CF (1<<0) /* true: we'll support "high speed" */
  131. /* PORTSC: offset 0x44 */
  132. u32 port_status [0]; /* up to N_PORTS */
  133. /* 31:23 reserved */
  134. #define PORT_WKOC_E (1<<22) /* wake on overcurrent (enable) */
  135. #define PORT_WKDISC_E (1<<21) /* wake on disconnect (enable) */
  136. #define PORT_WKCONN_E (1<<20) /* wake on connect (enable) */
  137. /* 19:16 for port testing */
  138. /* 15:14 for using port indicator leds (if HCS_INDICATOR allows) */
  139. #define PORT_OWNER (1<<13) /* true: companion hc owns this port */
  140. #define PORT_POWER (1<<12) /* true: has power (see PPC) */
  141. #define PORT_USB11(x) (((x)&(3<<10))==(1<<10)) /* USB 1.1 device */
  142. /* 11:10 for detecting lowspeed devices (reset vs release ownership) */
  143. /* 9 reserved */
  144. #define PORT_RESET (1<<8) /* reset port */
  145. #define PORT_SUSPEND (1<<7) /* suspend port */
  146. #define PORT_RESUME (1<<6) /* resume it */
  147. #define PORT_OCC (1<<5) /* over current change */
  148. #define PORT_OC (1<<4) /* over current active */
  149. #define PORT_PEC (1<<3) /* port enable change */
  150. #define PORT_PE (1<<2) /* port enable */
  151. #define PORT_CSC (1<<1) /* connect status change */
  152. #define PORT_CONNECT (1<<0) /* device connected */
  153. } __attribute__ ((packed));
  154. /*-------------------------------------------------------------------------*/
  155. #define QTD_NEXT(dma) cpu_to_le32((u32)dma)
  156. /*
  157.  * EHCI Specification 0.95 Section 3.5
  158.  * QTD: describe data transfer components (buffer, direction, ...) 
  159.  * See Fig 3-6 "Queue Element Transfer Descriptor Block Diagram".
  160.  *
  161.  * These are associated only with "QH" (Queue Head) structures,
  162.  * used with control, bulk, and interrupt transfers.
  163.  */
  164. struct ehci_qtd {
  165. /* first part defined by EHCI spec */
  166. u32 hw_next;   /* see EHCI 3.5.1 */
  167. u32 hw_alt_next;      /* see EHCI 3.5.2 */
  168. u32 hw_token;         /* see EHCI 3.5.3 */       
  169. #define QTD_TOGGLE (1 << 31) /* data toggle */
  170. #define QTD_LENGTH(tok) (((tok)>>16) & 0x7fff)
  171. #define QTD_IOC (1 << 15) /* interrupt on complete */
  172. #define QTD_CERR(tok) (((tok)>>10) & 0x3)
  173. #define QTD_PID(tok) (((tok)>>8) & 0x3)
  174. #define QTD_STS_ACTIVE (1 << 7) /* HC may execute this */
  175. #define QTD_STS_HALT (1 << 6) /* halted on error */
  176. #define QTD_STS_DBE (1 << 5) /* data buffer error (in HC) */
  177. #define QTD_STS_BABBLE (1 << 4) /* device was babbling (qtd halted) */
  178. #define QTD_STS_XACT (1 << 3) /* device gave illegal response */
  179. #define QTD_STS_MMF (1 << 2) /* incomplete split transaction */
  180. #define QTD_STS_STS (1 << 1) /* split transaction state */
  181. #define QTD_STS_PING (1 << 0) /* issue PING? */
  182. u32 hw_buf [5];        /* see EHCI 3.5.4 */
  183. u32 hw_buf_hi [5];        /* Appendix B */
  184. /* the rest is HCD-private */
  185. dma_addr_t qtd_dma; /* qtd address */
  186. struct list_head qtd_list; /* sw qtd list */
  187. /* dma same in urb's qtds, except 1st control qtd (setup buffer) */
  188. struct urb *urb; /* qtd's urb */
  189. dma_addr_t buf_dma; /* buffer address */
  190. size_t length; /* length of buffer */
  191. } __attribute__ ((aligned (32)));
  192. /*-------------------------------------------------------------------------*/
  193. /* type tag from {qh,itd,sitd,fstn}->hw_next */
  194. #define Q_NEXT_TYPE(dma) ((dma) & __constant_cpu_to_le32 (3 << 1))
  195. /* values for that type tag */
  196. #define Q_TYPE_ITD __constant_cpu_to_le32 (0 << 1)
  197. #define Q_TYPE_QH __constant_cpu_to_le32 (1 << 1)
  198. #define Q_TYPE_SITD  __constant_cpu_to_le32 (2 << 1)
  199. #define Q_TYPE_FSTN  __constant_cpu_to_le32 (3 << 1)
  200. /* next async queue entry, or pointer to interrupt/periodic QH */
  201. #define QH_NEXT(dma) (cpu_to_le32(((u32)dma)&~0x01f)|Q_TYPE_QH)
  202. /* for periodic/async schedules and qtd lists, mark end of list */
  203. #define EHCI_LIST_END __constant_cpu_to_le32(1) /* "null pointer" to hw */
  204. /*
  205.  * Entries in periodic shadow table are pointers to one of four kinds
  206.  * of data structure.  That's dictated by the hardware; a type tag is
  207.  * encoded in the low bits of the hardware's periodic schedule.  Use
  208.  * Q_NEXT_TYPE to get the tag.
  209.  *
  210.  * For entries in the async schedule, the type tag always says "qh".
  211.  */
  212. union ehci_shadow {
  213. struct ehci_qh  *qh; /* Q_TYPE_QH */
  214. struct ehci_itd *itd; /* Q_TYPE_ITD */
  215. struct ehci_sitd *sitd; /* Q_TYPE_SITD */
  216. struct ehci_fstn *fstn; /* Q_TYPE_FSTN */
  217. void *ptr;
  218. };
  219. /*-------------------------------------------------------------------------*/
  220. /*
  221.  * EHCI Specification 0.95 Section 3.6
  222.  * QH: describes control/bulk/interrupt endpoints
  223.  * See Fig 3-7 "Queue Head Structure Layout".
  224.  *
  225.  * These appear in both the async and (for interrupt) periodic schedules.
  226.  */
  227. struct ehci_qh {
  228. /* first part defined by EHCI spec */
  229. u32 hw_next;  /* see EHCI 3.6.1 */
  230. u32 hw_info1;        /* see EHCI 3.6.2 */
  231. #define QH_HEAD 0x00008000
  232. u32 hw_info2;        /* see EHCI 3.6.2 */
  233. u32 hw_current;  /* qtd list - see EHCI 3.6.4 */
  234. /* qtd overlay (hardware parts of a struct ehci_qtd) */
  235. u32 hw_qtd_next;
  236. u32 hw_alt_next;
  237. u32 hw_token;
  238. u32 hw_buf [5];
  239. u32 hw_buf_hi [5];
  240. /* the rest is HCD-private */
  241. dma_addr_t qh_dma; /* address of qh */
  242. union ehci_shadow qh_next; /* ptr to qh; or periodic */
  243. struct list_head qtd_list; /* sw qtd list */
  244. atomic_t refcount;
  245. unsigned short usecs; /* intr bandwidth */
  246. short qh_state;
  247. #define QH_STATE_LINKED 1 /* HC sees this */
  248. #define QH_STATE_UNLINK 2 /* HC may still see this */
  249. #define QH_STATE_IDLE 3 /* HC doesn't see this */
  250. #ifdef EHCI_SOFT_RETRIES
  251. int retries;
  252. #endif
  253. } __attribute__ ((aligned (32)));
  254. /*-------------------------------------------------------------------------*/
  255. /*
  256.  * EHCI Specification 0.95 Section 3.3
  257.  * Fig 3-4 "Isochronous Transaction Descriptor (iTD)"
  258.  *
  259.  * Schedule records for high speed iso xfers
  260.  */
  261. struct ehci_itd {
  262. /* first part defined by EHCI spec */
  263. u32 hw_next;           /* see EHCI 3.3.1 */
  264. u32 hw_transaction [8]; /* see EHCI 3.3.2 */
  265. #define EHCI_ISOC_ACTIVE        (1<<31)        /* activate transfer this slot */
  266. #define EHCI_ISOC_BUF_ERR       (1<<30)        /* Data buffer error */
  267. #define EHCI_ISOC_BABBLE        (1<<29)        /* babble detected */
  268. #define EHCI_ISOC_XACTERR       (1<<28)        /* XactErr - transaction error */
  269. #define EHCI_ITD_LENGTH(tok) (((tok)>>16) & 0x7fff)
  270. #define EHCI_ITD_IOC (1 << 15) /* interrupt on complete */
  271. u32 hw_bufp [7]; /* see EHCI 3.3.3 */ 
  272. u32 hw_bufp_hi [7]; /* Appendix B */
  273. /* the rest is HCD-private */
  274. dma_addr_t itd_dma; /* for this itd */
  275. union ehci_shadow itd_next; /* ptr to periodic q entry */
  276. struct urb *urb;
  277. struct list_head itd_list; /* list of urb frames' itds */
  278. dma_addr_t buf_dma; /* frame's buffer address */
  279. /* for now, only one hw_transaction per itd */
  280. u32 transaction;
  281. u16 index; /* in urb->iso_frame_desc */
  282. u16 uframe; /* in periodic schedule */
  283. u16 usecs;
  284. } __attribute__ ((aligned (32)));
  285. /*-------------------------------------------------------------------------*/
  286. /*
  287.  * EHCI Specification 0.95 Section 3.4 
  288.  * siTD, aka split-transaction isochronous Transfer Descriptor
  289.  *       ... describe low/full speed iso xfers through TT in hubs
  290.  * see Figure 3-5 "Split-transaction Isochronous Transaction Descriptor (siTD)
  291.  */
  292. struct ehci_sitd {
  293. /* first part defined by EHCI spec */
  294. u32 hw_next;
  295. /* uses bit field macros above - see EHCI 0.95 Table 3-8 */
  296. u32 hw_fullspeed_ep;  /* see EHCI table 3-9 */
  297. u32                     hw_uframe;        /* see EHCI table 3-10 */
  298.         u32                     hw_tx_results1;   /* see EHCI table 3-11 */
  299. u32                     hw_tx_results2;   /* see EHCI table 3-12 */
  300. u32                     hw_tx_results3;   /* see EHCI table 3-12 */
  301.         u32                     hw_backpointer;   /* see EHCI table 3-13 */
  302. u32 hw_buf_hi [2];   /* Appendix B */
  303. /* the rest is HCD-private */
  304. dma_addr_t sitd_dma;
  305. union ehci_shadow sitd_next; /* ptr to periodic q entry */
  306. struct urb *urb;
  307. dma_addr_t buf_dma; /* buffer address */
  308. } __attribute__ ((aligned (32)));
  309. /*-------------------------------------------------------------------------*/
  310. /*
  311.  * EHCI Specification 0.96 Section 3.7
  312.  * Periodic Frame Span Traversal Node (FSTN)
  313.  *
  314.  * Manages split interrupt transactions (using TT) that span frame boundaries
  315.  * into uframes 0/1; see 4.12.2.2.  In those uframes, a "save place" FSTN
  316.  * makes the HC jump (back) to a QH to scan for fs/ls QH completions until
  317.  * it hits a "restore" FSTN; then it returns to finish other uframe 0/1 work.
  318.  */
  319. struct ehci_fstn {
  320. u32 hw_next; /* any periodic q entry */
  321. u32 hw_prev; /* qh or EHCI_LIST_END */
  322. /* the rest is HCD-private */
  323. dma_addr_t fstn_dma;
  324. union ehci_shadow fstn_next; /* ptr to periodic q entry */
  325. } __attribute__ ((aligned (32)));
  326. #endif /* __LINUX_EHCI_HCD_H */