check status_change is not zero first

This commit is contained in:
hathach 2023-05-29 13:27:20 +07:00
parent 8ad024e51b
commit 5c428d35a6
No known key found for this signature in database
GPG Key ID: F5D50C6D51D17CBA
1 changed files with 18 additions and 24 deletions

View File

@ -327,51 +327,45 @@ static void connection_clear_conn_change_complete (tuh_xfer_t* xfer);
static void connection_port_reset_complete (tuh_xfer_t* xfer);
// callback as response of interrupt endpoint polling
bool hub_xfer_cb(uint8_t dev_addr, uint8_t ep_addr, xfer_result_t result, uint32_t xferred_bytes)
{
bool hub_xfer_cb(uint8_t dev_addr, uint8_t ep_addr, xfer_result_t result, uint32_t xferred_bytes) {
(void) xferred_bytes; // TODO can be more than 1 for hub with lots of ports
(void) ep_addr;
TU_ASSERT(result == XFER_RESULT_SUCCESS);
hub_interface_t* p_hub = get_itf(dev_addr);
TU_LOG2(" Hub Status Change = 0x%02X\r\n", p_hub->status_change);
uint8_t const status_change = p_hub->status_change;
TU_LOG2(" Hub Status Change = 0x%02X\r\n", status_change);
// Hub bit 0 is for the hub device events
if (tu_bit_test(p_hub->status_change, 0))
{
if (hub_port_get_status(dev_addr, 0, &p_hub->hub_status, hub_get_status_complete, 0) == false)
{
if ( status_change == 0 ) {
// The status change event was neither for the hub, nor for any of its ports.
// This shouldn't happen, but it does with some devices.
// Initiate the next interrupt poll here.
hub_edpt_status_xfer(dev_addr);
return true;
}
if (tu_bit_test(status_change, 0)) {
// Hub bit 0 is for the hub device events
if (hub_port_get_status(dev_addr, 0, &p_hub->hub_status, hub_get_status_complete, 0) == false) {
//Hub status control transfer failed, retry
hub_edpt_status_xfer(dev_addr);
}
}
else
{
else {
// Hub bits 1 to n are hub port events
for (uint8_t port=1; port <= p_hub->port_count; port++)
{
if ( tu_bit_test(p_hub->status_change, port) )
{
if (hub_port_get_status(dev_addr, port, &p_hub->port_status, hub_port_get_status_complete, 0) == false)
{
for (uint8_t port=1; port <= p_hub->port_count; port++) {
if ( tu_bit_test(status_change, port) ) {
if (hub_port_get_status(dev_addr, port, &p_hub->port_status, hub_port_get_status_complete, 0) == false) {
//Hub status control transfer failed, retry
hub_edpt_status_xfer(dev_addr);
}
break;
}
}
// The status change event was neither for the hub, nor for any of
// its ports. (For example `p_hub->status_change == 0`.) This
// shouldn't happen, but it does with some devices. Initiate the
// next interrupt poll here, because we've scheduled no other work
// whose completion can initiate it.
hub_edpt_status_xfer(dev_addr);
}
// NOTE: next status transfer is queued by usbh.c after handling this request
return true;
}