Merge tag 'for-5.2/io_uring-20190507' of git://git.kernel.dk/linux-block
[sfrench/cifs-2.6.git] / tools / usb / hcd-tests.sh
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 # vim: sw=4