Commit | Line | Data |
---|---|---|
c17d936e | 1 | #!/bin/sh |
b2441318 | 2 | # SPDX-License-Identifier: GPL-2.0 |
c17d936e DB |
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 | |
bc0f23dc MF |
116 | |
117 | echo "test 21: control writes, unaligned" | |
118 | do_test -t 21 -c 100 -s 256 -v 1 | |
119 | ||
c17d936e DB |
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 | ||
bc0f23dc MF |
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 | ||
c17d936e DB |
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 | ||
bc0f23dc MF |
174 | COUNT=100 |
175 | echo "test 22: $COUNT transfers, non aligned" | |
176 | do_test -t 22 -g 8 -v 0 | |
177 | ||
c17d936e DB |
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 | ||
bc0f23dc MF |
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 | ||
c17d936e DB |
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 | ||
bc0f23dc MF |
227 | COUNT=100 |
228 | echo "test 23: $COUNT transfers, unaligned" | |
229 | do_test -t 23 -g 8 -v 0 | |
230 | ||
c17d936e DB |
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 |