linux/tools/usb/hcd-tests.sh
<<
>>
Prefs
   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