hcd-tests.sh (6217B)
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# 19TYPES='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 32declare -i COUNT BUFLEN 33 34COUNT=50000 35BUFLEN=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 41if [ "$DEVICE" = "" ]; then 42 echo "testing ALL recognized usbtest devices" 43 echo "" 44 TEST_ARGS="-a" 45else 46 TEST_ARGS="" 47fi 48 49do_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 58ARGS="$*" 59 60if [ "$ARGS" = "" ]; 61then 62 ARGS="$TYPES" 63fi 64 65# FIXME use /sys/bus/usb/device/$THIS/bConfigurationValue to 66# check and change configs 67 68CONFIG='' 69 70check_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 86echo "TESTING: $ARGS" 87 88while : true 89do 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 274done