Skip to content

Commit e978ba8

Browse files
authored
Merge pull request #9373 from fkjagodzinski/test_update-usb-basic
Tests: USB: Fix endpoint halt test
2 parents ab4f5e3 + 36eb2c7 commit e978ba8

File tree

3 files changed

+128
-138
lines changed

3 files changed

+128
-138
lines changed

TESTS/host_tests/pyusb_basic.py

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ def get_interface(dev, interface, alternate=0):
5656
VENDOR_TEST_CTRL_OUT_STATUS_DELAY = 8
5757
VENDOR_TEST_CTRL_IN_SIZES = 9
5858
VENDOR_TEST_CTRL_OUT_SIZES = 10
59-
VENDOR_TEST_READ_START = 11
59+
VENDOR_TEST_RW_RESTART = 11
6060
VENDOR_TEST_ABORT_BUFF_CHECK = 12
6161
VENDOR_TEST_UNSUPPORTED_REQUEST = 32
6262

@@ -984,7 +984,7 @@ def random_size_loopback_ep_test(ep_out, ep_in, failure, error, seconds, log, mi
984984
time.sleep(0.01)
985985

986986

987-
def halt_ep_test(dev, ep_out, ep_in, ep_to_halt, log):
987+
def halt_ep_test(dev, ep_out, ep_in, log):
988988
"""OUT/IN endpoint halt test.
989989
990990
Verify that halting an endpoint at a random point of OUT or IN transfer
@@ -1003,6 +1003,8 @@ def halt_ep_test(dev, ep_out, ep_in, ep_to_halt, log):
10031003
except usb.core.USBError as err:
10041004
raise_unconditionally(lineno(), 'Unable to get endpoint status ({!r}).'.format(err))
10051005

1006+
ep_to_halt = random.choice([ep_out, ep_in])
1007+
10061008
def timer_handler():
10071009
"""Halt an endpoint using a USB control request."""
10081010
try:
@@ -1044,17 +1046,19 @@ def timer_handler():
10441046
finally:
10451047
# Always wait for the Timer thread created above.
10461048
delayed_halt.join()
1049+
ep_out.clear_halt()
1050+
ep_in.clear_halt()
10471051
raise_unconditionally(lineno(), 'Halting endpoint {0.bEndpointAddress:#04x}'
10481052
' during transmission did not raise USBError.'
10491053
.format(ep_to_halt))
10501054

10511055

1052-
def request_endpoint_read_start(dev, ep):
1056+
def request_endpoint_loops_restart(dev):
10531057
ctrl_kwargs = {
1054-
'bmRequestType': build_request_type(CTRL_OUT, CTRL_TYPE_VENDOR, CTRL_RECIPIENT_ENDPOINT),
1055-
'bRequest': VENDOR_TEST_READ_START,
1058+
'bmRequestType': build_request_type(CTRL_OUT, CTRL_TYPE_VENDOR, CTRL_RECIPIENT_DEVICE),
1059+
'bRequest': VENDOR_TEST_RW_RESTART,
10561060
'wValue': 0,
1057-
'wIndex': ep.bEndpointAddress}
1061+
'wIndex': 0}
10581062
dev.ctrl_transfer(**ctrl_kwargs)
10591063

10601064

@@ -1149,35 +1153,26 @@ def ep_test_halt(dev, log, verbose=False):
11491153

11501154
bulk_out, bulk_in = find_ep_pair(intf, usb.ENDPOINT_TYPE_BULK)
11511155
interrupt_out, interrupt_in = find_ep_pair(intf, usb.ENDPOINT_TYPE_INTERRUPT)
1152-
iso_out, iso_in = find_ep_pair(intf, usb.ENDPOINT_TYPE_ISOCHRONOUS)
11531156

11541157
if verbose:
11551158
log('\tbulk_out {0.bEndpointAddress:#04x}, {0.wMaxPacketSize:02} B'.format(bulk_out))
11561159
log('\tbulk_in {0.bEndpointAddress:#04x}, {0.wMaxPacketSize:02} B'.format(bulk_in))
11571160
log('\tinterrupt_out {0.bEndpointAddress:#04x}, {0.wMaxPacketSize:02} B'.format(interrupt_out))
11581161
log('\tinterrupt_in {0.bEndpointAddress:#04x}, {0.wMaxPacketSize:02} B'.format(interrupt_in))
1159-
log('\tiso_out {0.bEndpointAddress:#04x}, {0.wMaxPacketSize:02} B'.format(iso_out))
1160-
log('\tiso_in {0.bEndpointAddress:#04x}, {0.wMaxPacketSize:02} B'.format(iso_in))
11611162

11621163
if verbose:
11631164
log('Testing endpoint halt at a random point of bulk transmission.')
11641165
end_ts = time.time() + 1.0
11651166
while time.time() < end_ts:
1166-
halt_ep_test(dev, bulk_out, bulk_in, bulk_out, log)
1167-
bulk_out.clear_halt()
1168-
request_endpoint_read_start(dev, bulk_out)
1169-
halt_ep_test(dev, bulk_out, bulk_in, bulk_in, log)
1170-
bulk_in.clear_halt()
1167+
halt_ep_test(dev, bulk_out, bulk_in, log)
1168+
request_endpoint_loops_restart(dev)
11711169

11721170
if verbose:
11731171
log('Testing endpoint halt at a random point of interrupt transmission.')
11741172
end_ts = time.time() + 1.0
11751173
while time.time() < end_ts:
1176-
halt_ep_test(dev, interrupt_out, interrupt_in, interrupt_out, log)
1177-
interrupt_out.clear_halt()
1178-
request_endpoint_read_start(dev, interrupt_out)
1179-
halt_ep_test(dev, interrupt_out, interrupt_in, interrupt_in, log)
1180-
interrupt_in.clear_halt()
1174+
halt_ep_test(dev, interrupt_out, interrupt_in, log)
1175+
request_endpoint_loops_restart(dev)
11811176

11821177

11831178
def ep_test_parallel_transfers(dev, log, verbose=False):
@@ -1466,7 +1461,10 @@ def ep_test_data_toggle(dev, log, verbose=False):
14661461
# ClearFeature(ENDPOINT_HALT) request always results in the data toggle being reinitialized to DATA0.
14671462
# "
14681463
bulk_out.clear_halt()
1469-
# request_endpoint_read_start(dev, bulk_out)
1464+
# The ClearFeature(ENDPOINT_HALT) terminates a pending read operation on the device end.
1465+
# Use a custom vendor request to restart reading on the OUT endpoint.
1466+
# This does not impact the state of the data toggle bit.
1467+
request_endpoint_loops_restart(dev)
14701468

14711469
# 2.4 verify that host and USB device are still in sync with respect to data toggle
14721470
try:

0 commit comments

Comments
 (0)