From: Wojciech Zajac Date: Tue, 24 Jun 2014 09:35:44 +0000 (+0200) Subject: Corrected invalid URBs handling X-Git-Tag: v3.3.0~180 X-Git-Url: http://zhaoyanbai.com/repos/?a=commitdiff_plain;h=6763c425bbf9ac8bcea73517a73f75b14b0e9962;p=minix.git Corrected invalid URBs handling --- diff --git a/drivers/usbd/hcd/hcd.c b/drivers/usbd/hcd/hcd.c index 20339c63e..56687c5b7 100755 --- a/drivers/usbd/hcd/hcd.c +++ b/drivers/usbd/hcd/hcd.c @@ -469,35 +469,45 @@ hcd_handle_urb(hcd_device_state * this_device, hcd_urb * urb) DEBUG_DUMP; - transfer_status = EXIT_FAILURE; - /* TODO: One device only */ USB_ASSERT(NULL != urb, "NULL URB given"); USB_ASSERT(this_device == urb->target_device, "Unknown device for URB"); - switch (urb->type) { - case HCD_TRANSFER_CONTROL: - transfer_status = hcd_control_urb(this_device, urb); - break; - - case HCD_TRANSFER_BULK: - case HCD_TRANSFER_INTERRUPT: - transfer_status = hcd_non_control_urb(this_device, urb); - break; - - case HCD_TRANSFER_ISOCHRONOUS: - /* TODO: ISO transfer */ - USB_MSG("ISO transfer not supported"); - break; + /* Only if URB parsing was completed... */ + if (EXIT_SUCCESS == urb->inout_status) { + + transfer_status = EXIT_FAILURE; + + /* ...check for URB to handle */ + switch (urb->type) { + case HCD_TRANSFER_CONTROL: + transfer_status = hcd_control_urb( + this_device, urb); + break; + + case HCD_TRANSFER_BULK: + case HCD_TRANSFER_INTERRUPT: + transfer_status = hcd_non_control_urb( + this_device, urb); + break; + + case HCD_TRANSFER_ISOCHRONOUS: + /* TODO: ISO transfer */ + USB_MSG("ISO transfer not supported"); + break; + + default: + USB_MSG("Invalid transfer type 0x%02X", + (int)urb->type); + break; + } - default: - USB_MSG("Invalid transfer type 0x%02X", (int)urb->type); - break; - } + /* In case of error, only dump message */ + if (EXIT_SUCCESS != transfer_status) + USB_MSG("USB transfer failed"); - /* In case of error, only dump message */ - if (EXIT_SUCCESS != transfer_status) - USB_MSG("USB transfer failed"); + } else + USB_MSG("Invalid URB supplied"); /* Call completion regardless of status */ hcd_completion_cb(urb);