Merge branch 'usb-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb-2.6
* 'usb-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb-2.6: (172 commits) USB: Add support for SuperSpeed isoc endpoints xhci: Clean up cycle bit math used during stalls. xhci: Fix cycle bit calculation during stall handling. xhci: Update internal dequeue pointers after stalls. USB: Disable auto-suspend for USB 3.0 hubs. USB: Remove bogus USB_PORT_STAT_SUPER_SPEED symbol. xhci: Return canceled URBs immediately when host is halted. xhci: Fixes for suspend/resume of shared HCDs. xhci: Fix re-init on power loss after resume. xhci: Make roothub functions deal with device removal. xhci: Limit roothub ports to 15 USB3 & 31 USB2 ports. xhci: Return a USB 3.0 hub descriptor for USB3 roothub. xhci: Register second xHCI roothub. xhci: Change xhci_find_slot_id_by_port() API. xhci: Refactor bus suspend state into a struct. xhci: Index with a port array instead of PORTSC addresses. USB: Set usb_hcd->state and flags for shared roothubs. usb: Make core allocate resources per PCI-device. usb: Store bus type in usb_hcd, not in driver flags. usb: Change usb_hcd->bandwidth_mutex to a pointer. ...
This commit is contained in:
13
tools/usb/Makefile
Normal file
13
tools/usb/Makefile
Normal file
@@ -0,0 +1,13 @@
|
||||
# Makefile for USB tools
|
||||
|
||||
CC = $(CROSS_COMPILE)gcc
|
||||
PTHREAD_LIBS = -lpthread
|
||||
WARNINGS = -Wall -Wextra
|
||||
CFLAGS = $(WARNINGS) -g $(PTHREAD_LIBS)
|
||||
|
||||
all: testusb ffs-test
|
||||
%: %.c
|
||||
$(CC) $(CFLAGS) -o $@ $^
|
||||
|
||||
clean:
|
||||
$(RM) testusb ffs-test
|
@@ -37,7 +37,7 @@
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <linux/usb/functionfs.h>
|
||||
#include "../../include/linux/usb/functionfs.h"
|
||||
|
||||
|
||||
/******************** Little Endian Handling ********************************/
|
||||
@@ -450,7 +450,7 @@ invalid:
|
||||
len, expected, *p);
|
||||
for (p = buf, len = 0; len < nbytes; ++p, ++len) {
|
||||
if (0 == (len % 32))
|
||||
fprintf(stderr, "%4d:", len);
|
||||
fprintf(stderr, "%4zd:", len);
|
||||
fprintf(stderr, " %02x", *p);
|
||||
if (31 == (len % 32))
|
||||
fprintf(stderr, "\n");
|
||||
|
275
tools/usb/hcd-tests.sh
Normal file
275
tools/usb/hcd-tests.sh
Normal file
@@ -0,0 +1,275 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# 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
|
||||
|
||||
# vim: sw=4
|
Reference in New Issue
Block a user