Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/tools/usb/hcd-tests.sh
26278 views
1
#!/bin/sh
2
# SPDX-License-Identifier: GPL-2.0
3
#
4
# test types can be passed on the command line:
5
#
6
# - control: any device can do this
7
# - out, in: out needs 'bulk sink' firmware, in needs 'bulk src'
8
# - iso-out, iso-in: out needs 'iso sink' firmware, in needs 'iso src'
9
# - halt: needs bulk sink+src, tests halt set/clear from host
10
# - unlink: needs bulk sink and/or src, test HCD unlink processing
11
# - loop: needs firmware that will buffer N transfers
12
#
13
# run it for hours, days, weeks.
14
#
15
16
#
17
# this default provides a steady test load for a bulk device
18
#
19
TYPES='control out in'
20
#TYPES='control out in halt'
21
22
#
23
# to test HCD code
24
#
25
# - include unlink tests
26
# - add some ${RANDOM}ness
27
# - connect several devices concurrently (same HC)
28
# - keep HC's IRQ lines busy with unrelated traffic (IDE, net, ...)
29
# - add other concurrent system loads
30
#
31
32
declare -i COUNT BUFLEN
33
34
COUNT=50000
35
BUFLEN=2048
36
37
# NOTE: the 'in' and 'out' cases are usually bulk, but can be
38
# set up to use interrupt transfers by 'usbtest' module options
39
40
41
if [ "$DEVICE" = "" ]; then
42
echo "testing ALL recognized usbtest devices"
43
echo ""
44
TEST_ARGS="-a"
45
else
46
TEST_ARGS=""
47
fi
48
49
do_test ()
50
{
51
if ! ./testusb $TEST_ARGS -s $BUFLEN -c $COUNT $* 2>/dev/null
52
then
53
echo "FAIL"
54
exit 1
55
fi
56
}
57
58
ARGS="$*"
59
60
if [ "$ARGS" = "" ];
61
then
62
ARGS="$TYPES"
63
fi
64
65
# FIXME use /sys/bus/usb/device/$THIS/bConfigurationValue to
66
# check and change configs
67
68
CONFIG=''
69
70
check_config ()
71
{
72
if [ "$CONFIG" = "" ]; then
73
CONFIG=$1
74
echo "assuming $CONFIG configuration"
75
return
76
fi
77
if [ "$CONFIG" = $1 ]; then
78
return
79
fi
80
81
echo "** device must be in $1 config, but it's $CONFIG instead"
82
exit 1
83
}
84
85
86
echo "TESTING: $ARGS"
87
88
while : true
89
do
90
echo $(date)
91
92
for TYPE in $ARGS
93
do
94
# restore defaults
95
COUNT=5000
96
BUFLEN=2048
97
98
# FIXME automatically multiply COUNT by 10 when
99
# /sys/bus/usb/device/$THIS/speed == "480"
100
101
# COUNT=50000
102
103
case $TYPE in
104
control)
105
# any device, in any configuration, can use this.
106
echo '** Control test cases:'
107
108
echo "test 9: ch9 postconfig"
109
do_test -t 9 -c 5000
110
echo "test 10: control queueing"
111
do_test -t 10 -c 5000
112
113
# this relies on some vendor-specific commands
114
echo "test 14: control writes"
115
do_test -t 14 -c 15000 -s 256 -v 1
116
117
echo "test 21: control writes, unaligned"
118
do_test -t 21 -c 100 -s 256 -v 1
119
120
;;
121
122
out)
123
check_config sink-src
124
echo '** Host Write (OUT) test cases:'
125
126
echo "test 1: $COUNT transfers, same size"
127
do_test -t 1
128
echo "test 3: $COUNT transfers, variable/short size"
129
do_test -t 3 -v 421
130
131
COUNT=100
132
echo "test 17: $COUNT transfers, unaligned DMA map by core"
133
do_test -t 17
134
135
echo "test 19: $COUNT transfers, unaligned DMA map by usb_alloc_coherent"
136
do_test -t 19
137
138
COUNT=2000
139
echo "test 5: $COUNT scatterlists, same size entries"
140
do_test -t 5
141
142
# try to trigger short OUT processing bugs
143
echo "test 7a: $COUNT scatterlists, variable size/short entries"
144
do_test -t 7 -v 579
145
BUFLEN=4096
146
echo "test 7b: $COUNT scatterlists, variable size/bigger entries"
147
do_test -t 7 -v 41
148
BUFLEN=64
149
echo "test 7c: $COUNT scatterlists, variable size/micro entries"
150
do_test -t 7 -v 63
151
;;
152
153
iso-out)
154
check_config sink-src
155
echo '** Host ISOCHRONOUS Write (OUT) test cases:'
156
157
# at peak iso transfer rates:
158
# - usb 2.0 high bandwidth, this is one frame.
159
# - usb 1.1, it's twenty-four frames.
160
BUFLEN=24500
161
162
COUNT=1000
163
164
# COUNT=10000
165
166
echo "test 15: $COUNT transfers, same size"
167
# do_test -t 15 -g 3 -v 0
168
BUFLEN=32768
169
do_test -t 15 -g 8 -v 0
170
171
# FIXME it'd make sense to have an iso OUT test issuing
172
# short writes on more packets than the last one
173
174
COUNT=100
175
echo "test 22: $COUNT transfers, non aligned"
176
do_test -t 22 -g 8 -v 0
177
178
;;
179
180
in)
181
check_config sink-src
182
echo '** Host Read (IN) test cases:'
183
184
# NOTE: these "variable size" reads are just multiples
185
# of 512 bytes, no EOVERFLOW testing is done yet
186
187
echo "test 2: $COUNT transfers, same size"
188
do_test -t 2
189
echo "test 4: $COUNT transfers, variable size"
190
do_test -t 4
191
192
COUNT=100
193
echo "test 18: $COUNT transfers, unaligned DMA map by core"
194
do_test -t 18
195
196
echo "test 20: $COUNT transfers, unaligned DMA map by usb_alloc_coherent"
197
do_test -t 20
198
199
COUNT=2000
200
echo "test 6: $COUNT scatterlists, same size entries"
201
do_test -t 6
202
echo "test 8: $COUNT scatterlists, variable size entries"
203
do_test -t 8
204
;;
205
206
iso-in)
207
check_config sink-src
208
echo '** Host ISOCHRONOUS Read (IN) test cases:'
209
210
# at peak iso transfer rates:
211
# - usb 2.0 high bandwidth, this is one frame.
212
# - usb 1.1, it's twenty-four frames.
213
BUFLEN=24500
214
215
COUNT=1000
216
217
# COUNT=10000
218
219
echo "test 16: $COUNT transfers, same size"
220
# do_test -t 16 -g 3 -v 0
221
BUFLEN=32768
222
do_test -t 16 -g 8 -v 0
223
224
# FIXME since iso expects faults, it'd make sense
225
# to have an iso IN test issuing short reads ...
226
227
COUNT=100
228
echo "test 23: $COUNT transfers, unaligned"
229
do_test -t 23 -g 8 -v 0
230
231
;;
232
233
halt)
234
# NOTE: sometimes hardware doesn't cooperate well with halting
235
# endpoints from the host side. so long as mass-storage class
236
# firmware can halt them from the device, don't worry much if
237
# you can't make this test work on your device.
238
COUNT=2000
239
echo "test 13: $COUNT halt set/clear"
240
do_test -t 13
241
;;
242
243
unlink)
244
COUNT=2000
245
echo "test 11: $COUNT read unlinks"
246
do_test -t 11
247
248
echo "test 12: $COUNT write unlinks"
249
do_test -t 12
250
;;
251
252
loop)
253
# defaults need too much buffering for ez-usb devices
254
BUFLEN=2048
255
COUNT=32
256
257
# modprobe g_zero qlen=$COUNT buflen=$BUFLEN loopdefault
258
check_config loopback
259
260
# FIXME someone needs to write and merge a version of this
261
262
echo "write $COUNT buffers of $BUFLEN bytes, read them back"
263
264
echo "write $COUNT variable size buffers, read them back"
265
266
;;
267
268
*)
269
echo "Don't understand test type $TYPE"
270
exit 1;
271
esac
272
echo ''
273
done
274
done
275
276