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