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