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