Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
drivers
usb
host
fhci-mem.c
Go to the documentation of this file.
1
/*
2
* Freescale QUICC Engine USB Host Controller Driver
3
*
4
* Copyright (c) Freescale Semicondutor, Inc. 2006.
5
* Shlomi Gridish <
[email protected]
>
6
* Jerry Huang <
[email protected]
>
7
* Copyright (c) Logic Product Development, Inc. 2007
8
* Peter Barada <
[email protected]
>
9
* Copyright (c) MontaVista Software, Inc. 2008.
10
* Anton Vorontsov <
[email protected]
>
11
*
12
* This program is free software; you can redistribute it and/or modify it
13
* under the terms of the GNU General Public License as published by the
14
* Free Software Foundation; either version 2 of the License, or (at your
15
* option) any later version.
16
*/
17
18
#include <linux/kernel.h>
19
#include <linux/types.h>
20
#include <
linux/delay.h
>
21
#include <linux/slab.h>
22
#include <linux/list.h>
23
#include <
linux/usb.h
>
24
#include <
linux/usb/hcd.h
>
25
#include "
fhci.h
"
26
27
static
void
init_td(
struct
td
*
td
)
28
{
29
memset
(td, 0,
sizeof
(*td));
30
INIT_LIST_HEAD(&td->
node
);
31
INIT_LIST_HEAD(&td->
frame_lh
);
32
}
33
34
static
void
init_ed(
struct
ed
*
ed
)
35
{
36
memset
(ed, 0,
sizeof
(*ed));
37
INIT_LIST_HEAD(&ed->
td_list
);
38
INIT_LIST_HEAD(&ed->
node
);
39
}
40
41
static
struct
td *get_empty_td(
struct
fhci_hcd
*fhci)
42
{
43
struct
td *
td
;
44
45
if
(!list_empty(&fhci->
empty_tds
)) {
46
td =
list_entry
(fhci->
empty_tds
.next,
struct
td,
node
);
47
list_del
(fhci->
empty_tds
.next);
48
}
else
{
49
td =
kmalloc
(
sizeof
(*td),
GFP_ATOMIC
);
50
if
(!td)
51
fhci_err
(fhci,
"No memory to allocate to TD\n"
);
52
else
53
init_td(td);
54
}
55
56
return
td
;
57
}
58
59
void
fhci_recycle_empty_td
(
struct
fhci_hcd
*fhci,
struct
td *td)
60
{
61
init_td(td);
62
list_add(&td->
node
, &fhci->
empty_tds
);
63
}
64
65
struct
ed *
fhci_get_empty_ed
(
struct
fhci_hcd
*fhci)
66
{
67
struct
ed *
ed
;
68
69
if
(!list_empty(&fhci->
empty_eds
)) {
70
ed =
list_entry
(fhci->
empty_eds
.next,
struct
ed,
node
);
71
list_del
(fhci->
empty_eds
.next);
72
}
else
{
73
ed =
kmalloc
(
sizeof
(*ed),
GFP_ATOMIC
);
74
if
(!ed)
75
fhci_err
(fhci,
"No memory to allocate to ED\n"
);
76
else
77
init_ed(ed);
78
}
79
80
return
ed
;
81
}
82
83
void
fhci_recycle_empty_ed
(
struct
fhci_hcd
*fhci,
struct
ed *ed)
84
{
85
init_ed(ed);
86
list_add(&ed->
node
, &fhci->
empty_eds
);
87
}
88
89
struct
td *
fhci_td_fill
(
struct
fhci_hcd
*fhci,
struct
urb
*
urb
,
90
struct
urb_priv
*
urb_priv
,
struct
ed *ed,
u16
index
,
91
enum
fhci_ta_type
type
,
int
toggle
,
u8
*
data
,
u32
len
,
92
u16
interval
,
u16
start_frame
,
bool
ioc
)
93
{
94
struct
td *td = get_empty_td(fhci);
95
96
if
(!td)
97
return
NULL
;
98
99
td->
urb
=
urb
;
100
td->
ed
=
ed
;
101
td->
type
=
type
;
102
td->
toggle
=
toggle
;
103
td->
data
=
data
;
104
td->
len
=
len
;
105
td->
iso_index
=
index
;
106
td->
interval
=
interval
;
107
td->
start_frame
=
start_frame
;
108
td->
ioc
=
ioc
;
109
td->
status
=
USB_TD_OK
;
110
111
urb_priv->
tds
[
index
] =
td
;
112
113
return
td
;
114
}
Generated on Thu Jan 10 2013 14:36:56 for Linux Kernel by
1.8.2