usb-ohci.h
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:18k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * URB OHCI HCD (Host Controller Driver) for USB.
  3.  * 
  4.  * (C) Copyright 1999 Roman Weissgaerber <weissg@vienna.at>
  5.  * (C) Copyright 2000-2001 David Brownell <dbrownell@users.sourceforge.net>
  6.  * 
  7.  * usb-ohci.h
  8.  */
  9. #ifndef USB_OCHI_H
  10. #define USB_OHCI_H
  11.  
  12. #ifndef OHCI_HW_DRIVER
  13. static int cc_to_error[16] = { 
  14. /* mapping of the OHCI CC status to error codes */ 
  15. /* No  Error  */               USB_ST_NOERROR,
  16. /* CRC Error  */               USB_ST_CRC,
  17. /* Bit Stuff  */               USB_ST_BITSTUFF,
  18. /* Data Togg  */               USB_ST_CRC,
  19. /* Stall      */               USB_ST_STALL,
  20. /* DevNotResp */               USB_ST_NORESPONSE,
  21. /* PIDCheck   */               USB_ST_BITSTUFF,
  22. /* UnExpPID   */               USB_ST_BITSTUFF,
  23. /* DataOver   */               USB_ST_DATAOVERRUN,
  24. /* DataUnder  */               USB_ST_DATAUNDERRUN,
  25. /* reservd    */               USB_ST_NORESPONSE,
  26. /* reservd    */               USB_ST_NORESPONSE,
  27. /* BufferOver */               USB_ST_BUFFEROVERRUN,
  28. /* BuffUnder  */               USB_ST_BUFFERUNDERRUN,
  29. /* Not Access */               USB_ST_NORESPONSE,
  30. /* Not Access */               USB_ST_NORESPONSE 
  31. };
  32. #endif
  33. #include <linux/config.h>
  34. /* ED States */
  35. #define ED_NEW  0x00
  36. #define ED_UNLINK  0x01
  37. #define ED_OPER 0x02
  38. #define ED_DEL 0x04
  39. #define ED_URB_DEL   0x08
  40. /* usb_ohci_ed */
  41. struct ed {
  42. __u32 hwINFO;       
  43. __u32 hwTailP;
  44. __u32 hwHeadP;
  45. __u32 hwNextED;
  46. struct ed * ed_prev;  
  47. __u8 int_period;
  48. __u8 int_branch;
  49. __u8 int_load; 
  50. __u8 int_interval;
  51. __u8 state;
  52. __u8 type; 
  53. __u16 last_iso;
  54. struct ed * ed_rm_list;
  55. dma_addr_t dma;
  56. __u32 unused[3];
  57. } __attribute((aligned(16)));
  58. typedef struct ed ed_t;
  59.  
  60. /* TD info field */
  61. #define TD_CC       0xf0000000
  62. #define TD_CC_GET(td_p) ((td_p >>28) & 0x0f)
  63. #define TD_CC_SET(td_p, cc) (td_p) = ((td_p) & 0x0fffffff) | (((cc) & 0x0f) << 28)
  64. #define TD_EC       0x0C000000
  65. #define TD_T        0x03000000
  66. #define TD_T_DATA0  0x02000000
  67. #define TD_T_DATA1  0x03000000
  68. #define TD_T_TOGGLE 0x00000000
  69. #define TD_R        0x00040000
  70. #define TD_DI       0x00E00000
  71. #define TD_DI_SET(X) (((X) & 0x07)<< 21)
  72. #define TD_DP       0x00180000
  73. #define TD_DP_SETUP 0x00000000
  74. #define TD_DP_IN    0x00100000
  75. #define TD_DP_OUT   0x00080000
  76. #define TD_ISO     0x00010000
  77. #define TD_DEL      0x00020000
  78. /* CC Codes */
  79. #define TD_CC_NOERROR      0x00
  80. #define TD_CC_CRC          0x01
  81. #define TD_CC_BITSTUFFING  0x02
  82. #define TD_CC_DATATOGGLEM  0x03
  83. #define TD_CC_STALL        0x04
  84. #define TD_DEVNOTRESP      0x05
  85. #define TD_PIDCHECKFAIL    0x06
  86. #define TD_UNEXPECTEDPID   0x07
  87. #define TD_DATAOVERRUN     0x08
  88. #define TD_DATAUNDERRUN    0x09
  89. #define TD_BUFFEROVERRUN   0x0C
  90. #define TD_BUFFERUNDERRUN  0x0D
  91. #define TD_NOTACCESSED     0x0F
  92. #define MAXPSW 1
  93. struct td {
  94. __u32 hwINFO;
  95.    __u32 hwCBP; /* Current Buffer Pointer */
  96.    __u32 hwNextTD; /* Next TD Pointer */
  97.    __u32 hwBE; /* Memory Buffer End Pointer */
  98.    __u16 hwPSW[MAXPSW];
  99.    __u8 unused;
  100.    __u8 index;
  101.    struct ed * ed;
  102.    struct td * next_dl_td;
  103.    urb_t * urb;
  104. dma_addr_t td_dma;
  105. dma_addr_t data_dma;
  106. __u32 unused2[2];
  107. } __attribute((aligned(32))); /* normally 16, iso needs 32 */
  108. typedef struct td td_t;
  109. #define OHCI_ED_SKIP (1 << 14)
  110. /*
  111.  * The HCCA (Host Controller Communications Area) is a 256 byte
  112.  * structure defined in the OHCI spec. that the host controller is
  113.  * told the base address of.  It must be 256-byte aligned.
  114.  */
  115.  
  116. #define NUM_INTS 32 /* part of the OHCI standard */
  117. struct ohci_hcca {
  118. __u32 int_table[NUM_INTS]; /* Interrupt ED table */
  119. __u16 frame_no; /* current frame number */
  120. __u16 pad1; /* set to 0 on each frame_no change */
  121. __u32 done_head; /* info returned for an interrupt */
  122. u8 reserved_for_hc[116];
  123. } __attribute((aligned(256)));
  124.   
  125. /*
  126.  * Maximum number of root hub ports.  
  127.  */
  128. #define MAX_ROOT_PORTS 15 /* maximum OHCI root hub ports */
  129. /*
  130.  * This is the structure of the OHCI controller's memory mapped I/O
  131.  * region.  This is Memory Mapped I/O.  You must use the readl() and
  132.  * writel() macros defined in asm/io.h to access these!!
  133.  */
  134. struct ohci_regs {
  135. /* control and status registers */
  136. __u32 revision;
  137. __u32 control;
  138. __u32 cmdstatus;
  139. __u32 intrstatus;
  140. __u32 intrenable;
  141. __u32 intrdisable;
  142. /* memory pointers */
  143. __u32 hcca;
  144. __u32 ed_periodcurrent;
  145. __u32 ed_controlhead;
  146. __u32 ed_controlcurrent;
  147. __u32 ed_bulkhead;
  148. __u32 ed_bulkcurrent;
  149. __u32 donehead;
  150. /* frame counters */
  151. __u32 fminterval;
  152. __u32 fmremaining;
  153. __u32 fmnumber;
  154. __u32 periodicstart;
  155. __u32 lsthresh;
  156. /* Root hub ports */
  157. struct ohci_roothub_regs {
  158. __u32 a;
  159. __u32 b;
  160. __u32 status;
  161. __u32 portstatus[MAX_ROOT_PORTS];
  162. } roothub;
  163. } __attribute((aligned(32)));
  164. /* OHCI CONTROL AND STATUS REGISTER MASKS */
  165. /*
  166.  * HcControl (control) register masks
  167.  */
  168. #define OHCI_CTRL_CBSR (3 << 0) /* control/bulk service ratio */
  169. #define OHCI_CTRL_PLE (1 << 2) /* periodic list enable */
  170. #define OHCI_CTRL_IE (1 << 3) /* isochronous enable */
  171. #define OHCI_CTRL_CLE (1 << 4) /* control list enable */
  172. #define OHCI_CTRL_BLE (1 << 5) /* bulk list enable */
  173. #define OHCI_CTRL_HCFS (3 << 6) /* host controller functional state */
  174. #define OHCI_CTRL_IR (1 << 8) /* interrupt routing */
  175. #define OHCI_CTRL_RWC (1 << 9) /* remote wakeup connected */
  176. #define OHCI_CTRL_RWE (1 << 10) /* remote wakeup enable */
  177. /* pre-shifted values for HCFS */
  178. # define OHCI_USB_RESET (0 << 6)
  179. # define OHCI_USB_RESUME (1 << 6)
  180. # define OHCI_USB_OPER (2 << 6)
  181. # define OHCI_USB_SUSPEND (3 << 6)
  182. /*
  183.  * HcCommandStatus (cmdstatus) register masks
  184.  */
  185. #define OHCI_HCR (1 << 0) /* host controller reset */
  186. #define OHCI_CLF   (1 << 1) /* control list filled */
  187. #define OHCI_BLF   (1 << 2) /* bulk list filled */
  188. #define OHCI_OCR   (1 << 3) /* ownership change request */
  189. #define OHCI_SOC   (3 << 16) /* scheduling overrun count */
  190. /*
  191.  * masks used with interrupt registers:
  192.  * HcInterruptStatus (intrstatus)
  193.  * HcInterruptEnable (intrenable)
  194.  * HcInterruptDisable (intrdisable)
  195.  */
  196. #define OHCI_INTR_SO (1 << 0) /* scheduling overrun */
  197. #define OHCI_INTR_WDH (1 << 1) /* writeback of done_head */
  198. #define OHCI_INTR_SF (1 << 2) /* start frame */
  199. #define OHCI_INTR_RD (1 << 3) /* resume detect */
  200. #define OHCI_INTR_UE (1 << 4) /* unrecoverable error */
  201. #define OHCI_INTR_FNO (1 << 5) /* frame number overflow */
  202. #define OHCI_INTR_RHSC (1 << 6) /* root hub status change */
  203. #define OHCI_INTR_OC (1 << 30) /* ownership change */
  204. #define OHCI_INTR_MIE (1 << 31) /* master interrupt enable */
  205. /* Virtual Root HUB */
  206. struct virt_root_hub {
  207. int devnum; /* Address of Root Hub endpoint */ 
  208. void * urb;
  209. void * int_addr;
  210. int send;
  211. int interval;
  212. struct timer_list rh_int_timer;
  213. };
  214. /* USB HUB CONSTANTS (not OHCI-specific; see hub.h) */
  215.  
  216. /* destination of request */
  217. #define RH_INTERFACE               0x01
  218. #define RH_ENDPOINT                0x02
  219. #define RH_OTHER                   0x03
  220. #define RH_CLASS                   0x20
  221. #define RH_VENDOR                  0x40
  222. /* Requests: bRequest << 8 | bmRequestType */
  223. #define RH_GET_STATUS           0x0080
  224. #define RH_CLEAR_FEATURE        0x0100
  225. #define RH_SET_FEATURE          0x0300
  226. #define RH_SET_ADDRESS 0x0500
  227. #define RH_GET_DESCRIPTOR 0x0680
  228. #define RH_SET_DESCRIPTOR       0x0700
  229. #define RH_GET_CONFIGURATION 0x0880
  230. #define RH_SET_CONFIGURATION 0x0900
  231. #define RH_GET_STATE            0x0280
  232. #define RH_GET_INTERFACE        0x0A80
  233. #define RH_SET_INTERFACE        0x0B00
  234. #define RH_SYNC_FRAME           0x0C80
  235. /* Our Vendor Specific Request */
  236. #define RH_SET_EP               0x2000
  237. /* Hub port features */
  238. #define RH_PORT_CONNECTION         0x00
  239. #define RH_PORT_ENABLE             0x01
  240. #define RH_PORT_SUSPEND            0x02
  241. #define RH_PORT_OVER_CURRENT       0x03
  242. #define RH_PORT_RESET              0x04
  243. #define RH_PORT_POWER              0x08
  244. #define RH_PORT_LOW_SPEED          0x09
  245. #define RH_C_PORT_CONNECTION       0x10
  246. #define RH_C_PORT_ENABLE           0x11
  247. #define RH_C_PORT_SUSPEND          0x12
  248. #define RH_C_PORT_OVER_CURRENT     0x13
  249. #define RH_C_PORT_RESET            0x14  
  250. /* Hub features */
  251. #define RH_C_HUB_LOCAL_POWER       0x00
  252. #define RH_C_HUB_OVER_CURRENT      0x01
  253. #define RH_DEVICE_REMOTE_WAKEUP    0x00
  254. #define RH_ENDPOINT_STALL          0x01
  255. #define RH_ACK                     0x01
  256. #define RH_REQ_ERR                 -1
  257. #define RH_NACK                    0x00
  258. /* OHCI ROOT HUB REGISTER MASKS */
  259.  
  260. /* roothub.portstatus [i] bits */
  261. #define RH_PS_CCS            0x00000001    /* current connect status */
  262. #define RH_PS_PES            0x00000002    /* port enable status*/
  263. #define RH_PS_PSS            0x00000004    /* port suspend status */
  264. #define RH_PS_POCI           0x00000008    /* port over current indicator */
  265. #define RH_PS_PRS            0x00000010   /* port reset status */
  266. #define RH_PS_PPS            0x00000100    /* port power status */
  267. #define RH_PS_LSDA           0x00000200     /* low speed device attached */
  268. #define RH_PS_CSC            0x00010000  /* connect status change */
  269. #define RH_PS_PESC           0x00020000    /* port enable status change */
  270. #define RH_PS_PSSC           0x00040000     /* port suspend status change */
  271. #define RH_PS_OCIC           0x00080000     /* over current indicator change */
  272. #define RH_PS_PRSC           0x00100000    /* port reset status change */
  273. /* roothub.status bits */
  274. #define RH_HS_LPS      0x00000001 /* local power status */
  275. #define RH_HS_OCI      0x00000002 /* over current indicator */
  276. #define RH_HS_DRWE      0x00008000 /* device remote wakeup enable */
  277. #define RH_HS_LPSC      0x00010000 /* local power status change */
  278. #define RH_HS_OCIC      0x00020000 /* over current indicator change */
  279. #define RH_HS_CRWE      0x80000000 /* clear remote wakeup enable */
  280. /* roothub.b masks */
  281. #define RH_B_DR 0x0000ffff /* device removable flags */
  282. #define RH_B_PPCM 0xffff0000 /* port power control mask */
  283. /* roothub.a masks */
  284. #define RH_A_NDP (0xff << 0) /* number of downstream ports */
  285. #define RH_A_PSM (1 << 8) /* power switching mode */
  286. #define RH_A_NPS (1 << 9) /* no power switching */
  287. #define RH_A_DT (1 << 10) /* device type (mbz) */
  288. #define RH_A_OCPM (1 << 11) /* over current protection mode */
  289. #define RH_A_NOCP (1 << 12) /* no over current protection */
  290. #define RH_A_POTPGT (0xff << 24) /* power on to power good time */
  291. /* urb */
  292. typedef struct 
  293. {
  294. ed_t * ed;
  295. __u16 length; // number of tds associated with this request
  296. __u16 td_cnt; // number of tds already serviced
  297. int   state;
  298. wait_queue_head_t * wait;
  299. td_t * td[0]; // list pointer to all corresponding TDs associated with this request
  300. } urb_priv_t;
  301. #define URB_DEL 1
  302. /* Hash struct used for TD/ED hashing */
  303. struct hash_t {
  304. void *virt;
  305. dma_addr_t dma;
  306. struct hash_t *next; // chaining for collision cases
  307. };
  308. /* List of TD/ED hash entries */
  309. struct hash_list_t {
  310. struct hash_t *head;
  311. struct hash_t *tail;
  312. };
  313. #define TD_HASH_SIZE    64    /* power'o'two */
  314. #define ED_HASH_SIZE    64    /* power'o'two */
  315. #define TD_HASH_FUNC(td_dma) ((td_dma ^ (td_dma >> 5)) % TD_HASH_SIZE)
  316. #define ED_HASH_FUNC(ed_dma) ((ed_dma ^ (ed_dma >> 5)) % ED_HASH_SIZE)
  317. /*
  318.  * This is the full ohci controller description
  319.  *
  320.  * Note how the "proper" USB information is just
  321.  * a subset of what the full implementation needs. (Linus)
  322.  */
  323. typedef struct ohci {
  324. struct ohci_hcca *hcca; /* hcca */
  325. dma_addr_t hcca_dma;
  326. int irq;
  327. int disabled; /* e.g. got a UE, we're hung */
  328. int sleeping;
  329. atomic_t resume_count; /* defending against multiple resumes */
  330. unsigned long flags; /* for HC bugs */
  331. #define OHCI_QUIRK_AMD756 0x01 /* erratum #4 */
  332. struct ohci_regs * regs; /* OHCI controller's memory */
  333. struct list_head ohci_hcd_list; /* list of all ohci_hcd */
  334. struct ohci * next;  // chain of ohci device contexts
  335. struct list_head timeout_list;
  336. // struct list_head urb_list;  // list of all pending urbs
  337. // spinlock_t urb_list_lock;  // lock to keep consistency 
  338.   
  339. int ohci_int_load[32]; /* load of the 32 Interrupt Chains (for load balancing)*/
  340. ed_t * ed_rm_list[2];     /* lists of all endpoints to be removed */
  341. ed_t * ed_bulktail;       /* last endpoint of bulk list */
  342. ed_t * ed_controltail;    /* last endpoint of control list */
  343.   ed_t * ed_isotail;        /* last endpoint of iso list */
  344. int intrstatus;
  345. __u32 hc_control; /* copy of the hc control reg */
  346. struct usb_bus * bus;    
  347. struct usb_device * dev[128];
  348. struct virt_root_hub rh;
  349. /* PCI device handle, settings, ... */
  350. struct pci_dev *ohci_dev;
  351. const char *slot_name;
  352. u8 pci_latency;
  353. struct pci_pool *td_cache;
  354. struct pci_pool *dev_cache;
  355. struct hash_list_t td_hash[TD_HASH_SIZE];
  356. struct hash_list_t ed_hash[ED_HASH_SIZE];
  357. } ohci_t;
  358. #define NUM_EDS 32 /* num of preallocated endpoint descriptors */
  359. struct ohci_device {
  360. ed_t  ed[NUM_EDS];
  361. dma_addr_t dma;
  362. int ed_cnt;
  363. wait_queue_head_t * wait;
  364. };
  365. // #define ohci_to_usb(ohci) ((ohci)->usb)
  366. #define usb_to_ohci(usb) ((struct ohci_device *)(usb)->hcpriv)
  367. #ifndef OHCI_HW_DRIVER
  368. /* hcd */
  369. /* endpoint */
  370. static int ep_link(ohci_t * ohci, ed_t * edi);
  371. static int ep_unlink(ohci_t * ohci, ed_t * ed);
  372. static ed_t * ep_add_ed(struct usb_device * usb_dev, unsigned int pipe, int interval, int load, int mem_flags);
  373. static void ep_rm_ed(struct usb_device * usb_dev, ed_t * ed);
  374. /* td */
  375. static void td_fill(ohci_t * ohci, unsigned int info, dma_addr_t data, int len, urb_t * urb, int index);
  376. static void td_submit_urb(urb_t * urb);
  377. /* root hub */
  378. static int rh_submit_urb(urb_t * urb);
  379. static int rh_unlink_urb(urb_t * urb);
  380. static int rh_init_int_timer(urb_t * urb);
  381. /*-------------------------------------------------------------------------*/
  382. #define ALLOC_FLAGS (in_interrupt () ? GFP_ATOMIC : GFP_KERNEL)
  383. #ifdef DEBUG
  384. # define OHCI_MEM_FLAGS SLAB_POISON
  385. #else
  386. # define OHCI_MEM_FLAGS 0
  387. #endif
  388.  
  389. #ifndef CONFIG_PCI
  390. //# error "usb-ohci currently requires PCI-based controllers"
  391. /* to support non-PCI OHCIs, you need custom bus/mem/... glue */
  392. #endif
  393. /* Recover a TD/ED using its collision chain */
  394. static inline void *
  395. dma_to_ed_td (struct hash_list_t * entry, dma_addr_t dma)
  396. {
  397. struct hash_t * scan = entry->head;
  398. while (scan && scan->dma != dma)
  399. scan = scan->next;
  400. if (!scan)
  401. BUG();
  402. return scan->virt;
  403. }
  404. static inline struct ed *
  405. dma_to_ed (struct ohci * hc, dma_addr_t ed_dma)
  406. {
  407. return (struct ed *) dma_to_ed_td(&(hc->ed_hash[ED_HASH_FUNC(ed_dma)]),
  408.       ed_dma);
  409. }
  410. static inline struct td *
  411. dma_to_td (struct ohci * hc, dma_addr_t td_dma)
  412. {
  413. return (struct td *) dma_to_ed_td(&(hc->td_hash[TD_HASH_FUNC(td_dma)]),
  414.       td_dma);
  415. }
  416. /* Add a hash entry for a TD/ED; return true on success */
  417. static inline int
  418. hash_add_ed_td(struct hash_list_t * entry, void * virt, dma_addr_t dma)
  419. {
  420. struct hash_t * scan;
  421. scan = (struct hash_t *)kmalloc(sizeof(struct hash_t), ALLOC_FLAGS);
  422. if (!scan)
  423. return 0;
  424. if (!entry->tail) {
  425. entry->head = entry->tail = scan;
  426. } else {
  427. entry->tail->next = scan;
  428. entry->tail = scan;
  429. }
  430. scan->virt = virt;
  431. scan->dma = dma;
  432. scan->next = NULL;
  433. return 1;
  434. }
  435. static inline int
  436. hash_add_ed (struct ohci * hc, struct ed * ed)
  437. {
  438. return hash_add_ed_td (&(hc->ed_hash[ED_HASH_FUNC(ed->dma)]),
  439. ed, ed->dma);
  440. }
  441. static inline int
  442. hash_add_td (struct ohci * hc, struct td * td)
  443. {
  444. return hash_add_ed_td (&(hc->td_hash[TD_HASH_FUNC(td->td_dma)]),
  445. td, td->td_dma);
  446. }
  447. static inline void
  448. hash_free_ed_td (struct hash_list_t * entry, void * virt)
  449. {
  450. struct hash_t *scan, *prev;
  451. scan = prev = entry->head;
  452. // Find and unlink hash entry
  453. while (scan && scan->virt != virt) {
  454. prev = scan;
  455. scan = scan->next;
  456. }
  457. if (scan) {
  458. if (scan == entry->head) {
  459. if (entry->head == entry->tail)
  460. entry->head = entry->tail = NULL;
  461. else
  462. entry->head = scan->next;
  463. } else if (scan == entry->tail) {
  464. entry->tail = prev;
  465. prev->next = NULL;
  466. } else
  467. prev->next = scan->next;
  468. kfree(scan);
  469. }
  470. }
  471. static inline void
  472. hash_free_ed (struct ohci * hc, struct ed * ed)
  473. {
  474. hash_free_ed_td (&(hc->ed_hash[ED_HASH_FUNC(ed->dma)]), ed);
  475. }
  476. static inline void
  477. hash_free_td (struct ohci * hc, struct td * td)
  478. {
  479. hash_free_ed_td (&(hc->td_hash[TD_HASH_FUNC(td->td_dma)]), td);
  480. }
  481. static int ohci_mem_init (struct ohci *ohci)
  482. {
  483. ohci->td_cache = pci_pool_create ("ohci_td", ohci->ohci_dev,
  484. sizeof (struct td),
  485. 32 /* byte alignment */,
  486. 0 /* no page-crossing issues */,
  487. GFP_KERNEL | OHCI_MEM_FLAGS);
  488. if (!ohci->td_cache)
  489. return -ENOMEM;
  490. ohci->dev_cache = pci_pool_create ("ohci_dev", ohci->ohci_dev,
  491. sizeof (struct ohci_device),
  492. 16 /* byte alignment */,
  493. 0 /* no page-crossing issues */,
  494. GFP_KERNEL | OHCI_MEM_FLAGS);
  495. if (!ohci->dev_cache)
  496. return -ENOMEM;
  497. return 0;
  498. }
  499. static void ohci_mem_cleanup (struct ohci *ohci)
  500. {
  501. if (ohci->td_cache) {
  502. printk(__FUNCTION__"(%d)n", __LINE__);
  503. pci_pool_destroy (ohci->td_cache);
  504. printk(__FUNCTION__"(%d)n", __LINE__);
  505. ohci->td_cache = 0;
  506. }
  507. if (ohci->dev_cache) {
  508. printk(__FUNCTION__"(%d)n", __LINE__);
  509. pci_pool_destroy (ohci->dev_cache);
  510. printk(__FUNCTION__"(%d)n", __LINE__);
  511. ohci->dev_cache = 0;
  512. }
  513. }
  514. /* TDs ... */
  515. static inline struct td *
  516. td_alloc (struct ohci *hc, int mem_flags)
  517. {
  518. dma_addr_t dma;
  519. struct td *td;
  520. td = pci_pool_alloc (hc->td_cache, mem_flags, &dma);
  521. if (td) {
  522. td->td_dma = dma;
  523. /* hash it for later reverse mapping */
  524. if (!hash_add_td (hc, td)) {
  525. pci_pool_free (hc->td_cache, td, dma);
  526. return NULL;
  527. }
  528. }
  529. return td;
  530. }
  531. static inline void
  532. td_free (struct ohci *hc, struct td *td)
  533. {
  534. hash_free_td (hc, td);
  535. pci_pool_free (hc->td_cache, td, td->td_dma);
  536. }
  537. /* DEV + EDs ... only the EDs need to be consistent */
  538. static inline struct ohci_device *
  539. dev_alloc (struct ohci *hc, int mem_flags)
  540. {
  541. dma_addr_t dma;
  542. struct ohci_device *dev;
  543. int i, offset;
  544. dev = pci_pool_alloc (hc->dev_cache, mem_flags, &dma);
  545. if (dev) {
  546. memset (dev, 0, sizeof (*dev));
  547. dev->dma = dma;
  548. offset = ((char *)&dev->ed) - ((char *)dev);
  549. for (i = 0; i < NUM_EDS; i++, offset += sizeof dev->ed [0])
  550. dev->ed [i].dma = dma + offset;
  551. /* add to hashtable if used */
  552. }
  553. return dev;
  554. }
  555. static inline void
  556. dev_free (struct ohci *hc, struct ohci_device *dev)
  557. {
  558. pci_pool_free (hc->dev_cache, dev, dev->dma);
  559. }
  560. #endif // not OHCI_HW_DRIVER
  561. #endif // USB_OHCI_H