diff options
author | erictian <erictian@6f19259b-4bc3-4df7-8a09-765794883524> | 2011-08-25 05:13:22 +0000 |
---|---|---|
committer | erictian <erictian@6f19259b-4bc3-4df7-8a09-765794883524> | 2011-08-25 05:13:22 +0000 |
commit | c4b8c2d807b17641b73863d3636069cf26dc5c69 (patch) | |
tree | 05edb51ccd5314e9259e20025a36e8d08c96387b /MdeModulePkg | |
parent | ef949581ea3c622f42ad83337fd2625faa77c17f (diff) | |
download | edk2-c4b8c2d807b17641b73863d3636069cf26dc5c69.zip edk2-c4b8c2d807b17641b73863d3636069cf26dc5c69.tar.gz edk2-c4b8c2d807b17641b73863d3636069cf26dc5c69.tar.bz2 |
Error handling refinement at UsbIoResetPort() to avoid device state machine getting corrupted when the device disconnect happens
Signed-off-by: erictian
Reviewed-by: niruiyu
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@12204 6f19259b-4bc3-4df7-8a09-765794883524
Diffstat (limited to 'MdeModulePkg')
-rw-r--r-- | MdeModulePkg/Bus/Usb/UsbBusDxe/UsbBus.c | 22 |
1 files changed, 10 insertions, 12 deletions
diff --git a/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbBus.c b/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbBus.c index b592913..c3a9c73 100644 --- a/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbBus.c +++ b/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbBus.c @@ -818,7 +818,6 @@ UsbIoPortReset ( USB_INTERFACE *UsbIf;
USB_INTERFACE *HubIf;
USB_DEVICE *Dev;
- UINT8 Address;
EFI_TPL OldTpl;
EFI_STATUS Status;
@@ -843,27 +842,26 @@ UsbIoPortReset ( }
//
- // Reset the device to its current address. The device now has a
- // address of ZERO, so need to set Dev->Address to zero first for
- // host to communicate with the device
+ // Reset the device to its current address. The device now has an address
+ // of ZERO after port reset, so need to set Dev->Address to the device again for
+ // host to communicate with it.
//
- Address = Dev->Address;
- Dev->Address = 0;
- Status = UsbSetAddress (Dev, Address);
+ Status = UsbSetAddress (Dev, Dev->Address);
gBS->Stall (USB_SET_DEVICE_ADDRESS_STALL);
if (EFI_ERROR (Status)) {
+ //
+ // It may fail due to device disconnection or other reasons.
+ //
DEBUG (( EFI_D_ERROR, "UsbIoPortReset: failed to set address for device %d - %r\n",
- Address, Status));
+ Dev->Address, Status));
goto ON_EXIT;
}
- Dev->Address = Address;
+ DEBUG (( EFI_D_INFO, "UsbIoPortReset: device is now ADDRESSED at %d\n", Dev->Address));
- DEBUG (( EFI_D_INFO, "UsbIoPortReset: device is now ADDRESSED at %d\n", Address));
-
//
// Reset the current active configure, after this device
// is in CONFIGURED state.
@@ -873,7 +871,7 @@ UsbIoPortReset ( if (EFI_ERROR (Status)) {
DEBUG (( EFI_D_ERROR, "UsbIoPortReset: failed to set configure for device %d - %r\n",
- Address, Status));
+ Dev->Address, Status));
}
}
|