Root/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#
18TYPES='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
31declare -i COUNT BUFLEN
32
33COUNT=50000
34BUFLEN=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
40if [ "$DEVICE" = "" ]; then
41    echo "testing ALL recognized usbtest devices"
42    echo ""
43    TEST_ARGS="-a"
44else
45    TEST_ARGS=""
46fi
47
48do_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
57ARGS="$*"
58
59if [ "$ARGS" = "" ];
60then
61    ARGS="$TYPES"
62fi
63
64# FIXME use /sys/bus/usb/device/$THIS/bConfigurationValue to
65# check and change configs
66
67CONFIG=''
68
69check_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
85echo "TESTING: $ARGS"
86
87while : true
88do
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
273done
274
275# vim: sw=4
276

Archive Download this file



interactive