2 * OHCI HCD (Host Controller Driver) for USB.
4 * (C) Copyright 1999 Roman Weissgaerber <weissg@vienna.at>
5 * (C) Copyright 2000-2002 David Brownell <dbrownell@users.sourceforge.net>
7 * This file is licenced under the GPL.
10 /*-------------------------------------------------------------------------*/
13 * OHCI deals with three types of memory:
14 * - data used only by the HCD ... kmalloc is fine
15 * - async and periodic schedules, shared by HC and HCD ... these
16 * need to use dma_pool or dma_alloc_coherent
17 * - driver buffers, read/written by HC ... the hcd glue or the
18 * device driver provides us with dma addresses
20 * There's also "register" data, which is memory mapped.
21 * No memory seen by this driver (or any HCD) may be paged out.
24 /*-------------------------------------------------------------------------*/
26 static void admhc_hcd_init(struct admhcd
*ahcd
)
28 ahcd
->next_statechange
= jiffies
;
29 spin_lock_init(&ahcd
->lock
);
30 spin_lock_init(&ahcd
->dma_lock
);
33 /*-------------------------------------------------------------------------*/
35 static int admhc_mem_init(struct admhcd
*ahcd
)
37 ahcd
->td_cache
= dma_pool_create("admhc_td",
38 admhcd_to_hcd(ahcd
)->self
.controller
,
40 TD_ALIGN
, /* byte alignment */
41 0 /* no page-crossing issues */
46 ahcd
->ed_cache
= dma_pool_create("admhc_ed",
47 admhcd_to_hcd(ahcd
)->self
.controller
,
49 ED_ALIGN
, /* byte alignment */
50 0 /* no page-crossing issues */
58 dma_pool_destroy(ahcd
->td_cache
);
59 ahcd
->td_cache
= NULL
;
64 static void admhc_mem_cleanup(struct admhcd
*ahcd
)
67 dma_pool_destroy(ahcd
->td_cache
);
68 ahcd
->td_cache
= NULL
;
72 dma_pool_destroy(ahcd
->ed_cache
);
73 ahcd
->ed_cache
= NULL
;
77 /*-------------------------------------------------------------------------*/
80 static struct td
*td_alloc(struct admhcd
*ahcd
, gfp_t mem_flags
)
85 td
= dma_pool_alloc(ahcd
->td_cache
, mem_flags
, &dma
);
89 /* in case ahcd fetches it, make it look dead */
90 memset(td
, 0, sizeof *td
);
96 static void td_free(struct admhcd
*ahcd
, struct td
*td
)
98 dma_pool_free(ahcd
->td_cache
, td
, td
->td_dma
);
101 /*-------------------------------------------------------------------------*/
104 static struct ed
*ed_alloc(struct admhcd
*ahcd
, gfp_t mem_flags
)
109 ed
= dma_pool_alloc(ahcd
->ed_cache
, mem_flags
, &dma
);
113 memset(ed
, 0, sizeof(*ed
));
116 INIT_LIST_HEAD(&ed
->urb_pending
);
121 static void ed_free(struct admhcd
*ahcd
, struct ed
*ed
)
123 dma_pool_free(ahcd
->ed_cache
, ed
, ed
->dma
);
126 /*-------------------------------------------------------------------------*/
129 static void urb_priv_free(struct admhcd
*ahcd
, struct urb_priv
*urb_priv
)
133 for (i
= 0; i
< urb_priv
->td_cnt
; i
++)
135 td_free(ahcd
, urb_priv
->td
[i
]);
140 static struct urb_priv
*urb_priv_alloc(struct admhcd
*ahcd
, int num_tds
,
143 struct urb_priv
*priv
;
146 /* allocate the private part of the URB */
147 priv
= kzalloc(sizeof(*priv
) + sizeof(struct td
) * num_tds
, mem_flags
);
151 /* allocate the TDs (deferring hash chain updates) */
152 for (i
= 0; i
< num_tds
; i
++) {
153 priv
->td
[i
] = td_alloc(ahcd
, mem_flags
);
154 if (priv
->td
[i
] == NULL
)
156 priv
->td
[i
]->index
= i
;
159 INIT_LIST_HEAD(&priv
->pending
);
160 priv
->td_cnt
= num_tds
;
165 urb_priv_free(ahcd
, priv
);
This page took 0.042625 seconds and 5 git commands to generate.