\r
Usb Bus Driver Binding and Bus IO Protocol.\r
\r
-Copyright (c) 2004 - 2013, Intel Corporation. All rights reserved.<BR>\r
-This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution. The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
\r
USB_ENDPOINT_DESC *EpDesc;\r
EFI_TPL OldTpl;\r
EFI_STATUS Status;\r
+ UINTN RequestedDataLength;\r
\r
if (UsbStatus == NULL) {\r
return EFI_INVALID_PARAMETER;\r
UsbIf = USB_INTERFACE_FROM_USBIO (This);\r
Dev = UsbIf->Device;\r
\r
+ RequestedDataLength = DataLength;\r
Status = UsbHcControlTransfer (\r
Dev->Bus,\r
Dev->Address,\r
&Dev->Translator,\r
UsbStatus\r
);\r
+ //\r
+ // If the request completed sucessfully and the Direction of the request is\r
+ // EfiUsbDataIn or EfiUsbDataOut, then make sure the actual number of bytes\r
+ // transfered is the same as the number of bytes requested. If a different\r
+ // number of bytes were transfered, then return EFI_DEVICE_ERROR.\r
+ //\r
+ if (!EFI_ERROR (Status)) {\r
+ if (Direction != EfiUsbNoData && DataLength != RequestedDataLength) {\r
+ Status = EFI_DEVICE_ERROR;\r
+ goto ON_EXIT;\r
+ }\r
+ }\r
\r
if (EFI_ERROR (Status) || (*UsbStatus != EFI_USB_NOERROR)) {\r
//\r
Dev->Address = DevAddress;\r
\r
gBS->Stall (USB_SET_DEVICE_ADDRESS_STALL);\r
- \r
+\r
if (EFI_ERROR (Status)) {\r
//\r
// It may fail due to device disconnection or other reasons.\r
}\r
}\r
\r
- UsbHcReset (UsbBus, EFI_USB_HC_RESET_GLOBAL);\r
- UsbHcSetState (UsbBus, EfiUsbHcStateOperational);\r
-\r
//\r
// Install an EFI_USB_BUS_PROTOCOL to host controller to identify it.\r
//\r
RootIf->Signature = USB_INTERFACE_SIGNATURE;\r
RootIf->Device = RootHub;\r
RootIf->DevicePath = UsbBus->DevicePath;\r
- \r
+\r
//\r
// Report Status Code here since we will enumerate the USB devices\r
//\r
(EFI_IO_BUS_USB | EFI_IOB_PC_DETECT),\r
UsbBus->DevicePath\r
);\r
- \r
+\r
Status = mUsbRootHubApi.Init (RootIf);\r
\r
if (EFI_ERROR (Status)) {\r
//\r
if (RemainingDevicePath != NULL) {\r
//\r
- // Check if RemainingDevicePath is the End of Device Path Node, \r
+ // Check if RemainingDevicePath is the End of Device Path Node,\r
// if yes, go on checking other conditions\r
//\r
if (!IsDevicePathEnd (RemainingDevicePath)) {\r
// check its validation\r
//\r
DevicePathNode.DevPath = RemainingDevicePath;\r
- \r
+\r
if ((DevicePathNode.DevPath->Type != MESSAGING_DEVICE_PATH) ||\r
(DevicePathNode.DevPath->SubType != MSG_USB_DP &&\r
DevicePathNode.DevPath->SubType != MSG_USB_CLASS_DP\r
&& DevicePathNode.DevPath->SubType != MSG_USB_WWID_DP\r
)) {\r
- \r
+\r
return EFI_UNSUPPORTED;\r
}\r
}\r
if (Status == EFI_ALREADY_STARTED) {\r
return EFI_SUCCESS;\r
}\r
- \r
+\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
Controller\r
);\r
}\r
- \r
+\r
//\r
// Open the EFI Device Path protocol needed to perform the supported test\r
//\r
//\r
// If RemainingDevicePath is the End of Device Path Node,\r
// skip enumerate any device and return EFI_SUCESSS\r
- // \r
+ //\r
return EFI_SUCCESS;\r
}\r
}\r