@@ -56,7 +56,7 @@ def get_interface(dev, interface, alternate=0):
56
56
VENDOR_TEST_CTRL_OUT_STATUS_DELAY = 8
57
57
VENDOR_TEST_CTRL_IN_SIZES = 9
58
58
VENDOR_TEST_CTRL_OUT_SIZES = 10
59
- VENDOR_TEST_READ_START = 11
59
+ VENDOR_TEST_RW_RESTART = 11
60
60
VENDOR_TEST_ABORT_BUFF_CHECK = 12
61
61
VENDOR_TEST_UNSUPPORTED_REQUEST = 32
62
62
@@ -984,7 +984,7 @@ def random_size_loopback_ep_test(ep_out, ep_in, failure, error, seconds, log, mi
984
984
time .sleep (0.01 )
985
985
986
986
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 ):
988
988
"""OUT/IN endpoint halt test.
989
989
990
990
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):
1003
1003
except usb .core .USBError as err :
1004
1004
raise_unconditionally (lineno (), 'Unable to get endpoint status ({!r}).' .format (err ))
1005
1005
1006
+ ep_to_halt = random .choice ([ep_out , ep_in ])
1007
+
1006
1008
def timer_handler ():
1007
1009
"""Halt an endpoint using a USB control request."""
1008
1010
try :
@@ -1044,17 +1046,19 @@ def timer_handler():
1044
1046
finally :
1045
1047
# Always wait for the Timer thread created above.
1046
1048
delayed_halt .join ()
1049
+ ep_out .clear_halt ()
1050
+ ep_in .clear_halt ()
1047
1051
raise_unconditionally (lineno (), 'Halting endpoint {0.bEndpointAddress:#04x}'
1048
1052
' during transmission did not raise USBError.'
1049
1053
.format (ep_to_halt ))
1050
1054
1051
1055
1052
- def request_endpoint_read_start (dev , ep ):
1056
+ def request_endpoint_loops_restart (dev ):
1053
1057
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 ,
1056
1060
'wValue' : 0 ,
1057
- 'wIndex' : ep . bEndpointAddress }
1061
+ 'wIndex' : 0 }
1058
1062
dev .ctrl_transfer (** ctrl_kwargs )
1059
1063
1060
1064
@@ -1149,35 +1153,26 @@ def ep_test_halt(dev, log, verbose=False):
1149
1153
1150
1154
bulk_out , bulk_in = find_ep_pair (intf , usb .ENDPOINT_TYPE_BULK )
1151
1155
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 )
1153
1156
1154
1157
if verbose :
1155
1158
log ('\t bulk_out {0.bEndpointAddress:#04x}, {0.wMaxPacketSize:02} B' .format (bulk_out ))
1156
1159
log ('\t bulk_in {0.bEndpointAddress:#04x}, {0.wMaxPacketSize:02} B' .format (bulk_in ))
1157
1160
log ('\t interrupt_out {0.bEndpointAddress:#04x}, {0.wMaxPacketSize:02} B' .format (interrupt_out ))
1158
1161
log ('\t interrupt_in {0.bEndpointAddress:#04x}, {0.wMaxPacketSize:02} B' .format (interrupt_in ))
1159
- log ('\t iso_out {0.bEndpointAddress:#04x}, {0.wMaxPacketSize:02} B' .format (iso_out ))
1160
- log ('\t iso_in {0.bEndpointAddress:#04x}, {0.wMaxPacketSize:02} B' .format (iso_in ))
1161
1162
1162
1163
if verbose :
1163
1164
log ('Testing endpoint halt at a random point of bulk transmission.' )
1164
1165
end_ts = time .time () + 1.0
1165
1166
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 )
1171
1169
1172
1170
if verbose :
1173
1171
log ('Testing endpoint halt at a random point of interrupt transmission.' )
1174
1172
end_ts = time .time () + 1.0
1175
1173
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 )
1181
1176
1182
1177
1183
1178
def ep_test_parallel_transfers (dev , log , verbose = False ):
@@ -1466,7 +1461,10 @@ def ep_test_data_toggle(dev, log, verbose=False):
1466
1461
# ClearFeature(ENDPOINT_HALT) request always results in the data toggle being reinitialized to DATA0.
1467
1462
# "
1468
1463
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 )
1470
1468
1471
1469
# 2.4 verify that host and USB device are still in sync with respect to data toggle
1472
1470
try :
0 commit comments