mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
274 lines
6.1 KiB
274 lines
6.1 KiB
#!/bin/sh |
|
# SPDX-License-Identifier: GPL-2.0 |
|
# |
|
# test types can be passed on the command line: |
|
# |
|
# - control: any device can do this |
|
# - out, in: out needs 'bulk sink' firmware, in needs 'bulk src' |
|
# - iso-out, iso-in: out needs 'iso sink' firmware, in needs 'iso src' |
|
# - halt: needs bulk sink+src, tests halt set/clear from host |
|
# - unlink: needs bulk sink and/or src, test HCD unlink processing |
|
# - loop: needs firmware that will buffer N transfers |
|
# |
|
# run it for hours, days, weeks. |
|
# |
|
|
|
# |
|
# this default provides a steady test load for a bulk device |
|
# |
|
TYPES='control out in' |
|
#TYPES='control out in halt' |
|
|
|
# |
|
# to test HCD code |
|
# |
|
# - include unlink tests |
|
# - add some ${RANDOM}ness |
|
# - connect several devices concurrently (same HC) |
|
# - keep HC's IRQ lines busy with unrelated traffic (IDE, net, ...) |
|
# - add other concurrent system loads |
|
# |
|
|
|
declare -i COUNT BUFLEN |
|
|
|
COUNT=50000 |
|
BUFLEN=2048 |
|
|
|
# NOTE: the 'in' and 'out' cases are usually bulk, but can be |
|
# set up to use interrupt transfers by 'usbtest' module options |
|
|
|
|
|
if [ "$DEVICE" = "" ]; then |
|
echo "testing ALL recognized usbtest devices" |
|
echo "" |
|
TEST_ARGS="-a" |
|
else |
|
TEST_ARGS="" |
|
fi |
|
|
|
do_test () |
|
{ |
|
if ! ./testusb $TEST_ARGS -s $BUFLEN -c $COUNT $* 2>/dev/null |
|
then |
|
echo "FAIL" |
|
exit 1 |
|
fi |
|
} |
|
|
|
ARGS="$*" |
|
|
|
if [ "$ARGS" = "" ]; |
|
then |
|
ARGS="$TYPES" |
|
fi |
|
|
|
# FIXME use /sys/bus/usb/device/$THIS/bConfigurationValue to |
|
# check and change configs |
|
|
|
CONFIG='' |
|
|
|
check_config () |
|
{ |
|
if [ "$CONFIG" = "" ]; then |
|
CONFIG=$1 |
|
echo "assuming $CONFIG configuration" |
|
return |
|
fi |
|
if [ "$CONFIG" = $1 ]; then |
|
return |
|
fi |
|
|
|
echo "** device must be in $1 config, but it's $CONFIG instead" |
|
exit 1 |
|
} |
|
|
|
|
|
echo "TESTING: $ARGS" |
|
|
|
while : true |
|
do |
|
echo $(date) |
|
|
|
for TYPE in $ARGS |
|
do |
|
# restore defaults |
|
COUNT=5000 |
|
BUFLEN=2048 |
|
|
|
# FIXME automatically multiply COUNT by 10 when |
|
# /sys/bus/usb/device/$THIS/speed == "480" |
|
|
|
# COUNT=50000 |
|
|
|
case $TYPE in |
|
control) |
|
# any device, in any configuration, can use this. |
|
echo '** Control test cases:' |
|
|
|
echo "test 9: ch9 postconfig" |
|
do_test -t 9 -c 5000 |
|
echo "test 10: control queueing" |
|
do_test -t 10 -c 5000 |
|
|
|
# this relies on some vendor-specific commands |
|
echo "test 14: control writes" |
|
do_test -t 14 -c 15000 -s 256 -v 1 |
|
|
|
echo "test 21: control writes, unaligned" |
|
do_test -t 21 -c 100 -s 256 -v 1 |
|
|
|
;; |
|
|
|
out) |
|
check_config sink-src |
|
echo '** Host Write (OUT) test cases:' |
|
|
|
echo "test 1: $COUNT transfers, same size" |
|
do_test -t 1 |
|
echo "test 3: $COUNT transfers, variable/short size" |
|
do_test -t 3 -v 421 |
|
|
|
COUNT=100 |
|
echo "test 17: $COUNT transfers, unaligned DMA map by core" |
|
do_test -t 17 |
|
|
|
echo "test 19: $COUNT transfers, unaligned DMA map by usb_alloc_coherent" |
|
do_test -t 19 |
|
|
|
COUNT=2000 |
|
echo "test 5: $COUNT scatterlists, same size entries" |
|
do_test -t 5 |
|
|
|
# try to trigger short OUT processing bugs |
|
echo "test 7a: $COUNT scatterlists, variable size/short entries" |
|
do_test -t 7 -v 579 |
|
BUFLEN=4096 |
|
echo "test 7b: $COUNT scatterlists, variable size/bigger entries" |
|
do_test -t 7 -v 41 |
|
BUFLEN=64 |
|
echo "test 7c: $COUNT scatterlists, variable size/micro entries" |
|
do_test -t 7 -v 63 |
|
;; |
|
|
|
iso-out) |
|
check_config sink-src |
|
echo '** Host ISOCHRONOUS Write (OUT) test cases:' |
|
|
|
# at peak iso transfer rates: |
|
# - usb 2.0 high bandwidth, this is one frame. |
|
# - usb 1.1, it's twenty-four frames. |
|
BUFLEN=24500 |
|
|
|
COUNT=1000 |
|
|
|
# COUNT=10000 |
|
|
|
echo "test 15: $COUNT transfers, same size" |
|
# do_test -t 15 -g 3 -v 0 |
|
BUFLEN=32768 |
|
do_test -t 15 -g 8 -v 0 |
|
|
|
# FIXME it'd make sense to have an iso OUT test issuing |
|
# short writes on more packets than the last one |
|
|
|
COUNT=100 |
|
echo "test 22: $COUNT transfers, non aligned" |
|
do_test -t 22 -g 8 -v 0 |
|
|
|
;; |
|
|
|
in) |
|
check_config sink-src |
|
echo '** Host Read (IN) test cases:' |
|
|
|
# NOTE: these "variable size" reads are just multiples |
|
# of 512 bytes, no EOVERFLOW testing is done yet |
|
|
|
echo "test 2: $COUNT transfers, same size" |
|
do_test -t 2 |
|
echo "test 4: $COUNT transfers, variable size" |
|
do_test -t 4 |
|
|
|
COUNT=100 |
|
echo "test 18: $COUNT transfers, unaligned DMA map by core" |
|
do_test -t 18 |
|
|
|
echo "test 20: $COUNT transfers, unaligned DMA map by usb_alloc_coherent" |
|
do_test -t 20 |
|
|
|
COUNT=2000 |
|
echo "test 6: $COUNT scatterlists, same size entries" |
|
do_test -t 6 |
|
echo "test 8: $COUNT scatterlists, variable size entries" |
|
do_test -t 8 |
|
;; |
|
|
|
iso-in) |
|
check_config sink-src |
|
echo '** Host ISOCHRONOUS Read (IN) test cases:' |
|
|
|
# at peak iso transfer rates: |
|
# - usb 2.0 high bandwidth, this is one frame. |
|
# - usb 1.1, it's twenty-four frames. |
|
BUFLEN=24500 |
|
|
|
COUNT=1000 |
|
|
|
# COUNT=10000 |
|
|
|
echo "test 16: $COUNT transfers, same size" |
|
# do_test -t 16 -g 3 -v 0 |
|
BUFLEN=32768 |
|
do_test -t 16 -g 8 -v 0 |
|
|
|
# FIXME since iso expects faults, it'd make sense |
|
# to have an iso IN test issuing short reads ... |
|
|
|
COUNT=100 |
|
echo "test 23: $COUNT transfers, unaligned" |
|
do_test -t 23 -g 8 -v 0 |
|
|
|
;; |
|
|
|
halt) |
|
# NOTE: sometimes hardware doesn't cooperate well with halting |
|
# endpoints from the host side. so long as mass-storage class |
|
# firmware can halt them from the device, don't worry much if |
|
# you can't make this test work on your device. |
|
COUNT=2000 |
|
echo "test 13: $COUNT halt set/clear" |
|
do_test -t 13 |
|
;; |
|
|
|
unlink) |
|
COUNT=2000 |
|
echo "test 11: $COUNT read unlinks" |
|
do_test -t 11 |
|
|
|
echo "test 12: $COUNT write unlinks" |
|
do_test -t 12 |
|
;; |
|
|
|
loop) |
|
# defaults need too much buffering for ez-usb devices |
|
BUFLEN=2048 |
|
COUNT=32 |
|
|
|
# modprobe g_zero qlen=$COUNT buflen=$BUFLEN loopdefault |
|
check_config loopback |
|
|
|
# FIXME someone needs to write and merge a version of this |
|
|
|
echo "write $COUNT buffers of $BUFLEN bytes, read them back" |
|
|
|
echo "write $COUNT variable size buffers, read them back" |
|
|
|
;; |
|
|
|
*) |
|
echo "Don't understand test type $TYPE" |
|
exit 1; |
|
esac |
|
echo '' |
|
done |
|
done
|
|
|