X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=MdeModulePkg%2FBus%2FUsb%2FUsbBusDxe%2FUsbUtility.c;h=4441466d8071fddecb939990288c845bf27f3c9f;hb=87000d77082339be464d07855d9fc194c6b4e8a6;hp=3badf896c65b7884cf4a9651772ffd74af99e347;hpb=9e58aa1d3c8f519d1d7eb3be8df57cd8ce2f5688;p=mirror_edk2.git diff --git a/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbUtility.c b/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbUtility.c index 3badf896c6..4441466d80 100644 --- a/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbUtility.c +++ b/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbUtility.c @@ -1,24 +1,9 @@ /** @file -Copyright (c) 2007, Intel Corporation -All rights reserved. This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - - Module Name: - - UsbUtility.c - - Abstract: - - Wrapper function for usb host controller interface - - Revision History + Wrapper function for usb host controller interface. +Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.
+SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -30,13 +15,15 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. // Use a shor form Usb class Device Path, which could match any usb device, in WantedUsbIoDPList to indicate all Usb devices // are wanted Usb devices // -STATIC USB_CLASS_FORMAT_DEVICE_PATH mAllUsbClassDevicePath = { +USB_CLASS_FORMAT_DEVICE_PATH mAllUsbClassDevicePath = { { { MESSAGING_DEVICE_PATH, MSG_USB_CLASS_DP, - (UINT8) (sizeof (USB_CLASS_DEVICE_PATH)), - (UINT8) ((sizeof (USB_CLASS_DEVICE_PATH)) >> 8) + { + (UINT8) (sizeof (USB_CLASS_DEVICE_PATH)), + (UINT8) ((sizeof (USB_CLASS_DEVICE_PATH)) >> 8) + } }, 0xffff, // VendorId 0xffff, // ProductId @@ -48,21 +35,23 @@ STATIC USB_CLASS_FORMAT_DEVICE_PATH mAllUsbClassDevicePath = { { END_DEVICE_PATH_TYPE, END_ENTIRE_DEVICE_PATH_SUBTYPE, - END_DEVICE_PATH_LENGTH, - 0 + { + END_DEVICE_PATH_LENGTH, + 0 + } } }; /** - Get the capability of the host controller + Get the capability of the host controller. - @param UsbBus The usb driver - @param MaxSpeed The maximum speed this host controller supports - @param NumOfPort The number of the root hub port - @param Is64BitCapable Whether this controller support 64 bit addressing + @param UsbBus The usb driver. + @param MaxSpeed The maximum speed this host controller supports. + @param NumOfPort The number of the root hub port. + @param Is64BitCapable Whether this controller support 64 bit addressing. - @retval EFI_SUCCESS The host controller capability is returned + @retval EFI_SUCCESS The host controller capability is returned. @retval Others Failed to retrieve the host controller capability. **/ @@ -95,98 +84,23 @@ UsbHcGetCapability ( } -/** - Reset the host controller - - @param UsbBus The usb bus driver - @param Attributes The reset type, only global reset is used by this driver - - @return GC_TODO: add return values - -**/ -EFI_STATUS -UsbHcReset ( - IN USB_BUS *UsbBus, - IN UINT16 Attributes - ) -{ - EFI_STATUS Status; - - if (UsbBus->Usb2Hc != NULL) { - Status = UsbBus->Usb2Hc->Reset (UsbBus->Usb2Hc, Attributes); - } else { - Status = UsbBus->UsbHc->Reset (UsbBus->UsbHc, Attributes); - } - - return Status; -} - - -/** - Get the current operation state of the host controller - - @param UsbBus The USB bus driver - @param State The host controller operation state - - @retval EFI_SUCCESS The operation state is returned in State - @retval Others Failed to get the host controller state -**/ -EFI_STATUS -UsbHcGetState ( - IN USB_BUS *UsbBus, - OUT EFI_USB_HC_STATE *State - ) -{ - EFI_STATUS Status; - if (UsbBus->Usb2Hc != NULL) { - Status = UsbBus->Usb2Hc->GetState (UsbBus->Usb2Hc, State); - } else { - Status = UsbBus->UsbHc->GetState (UsbBus->UsbHc, State); - } - return Status; -} -/** - Set the host controller operation state - @param UsbBus The USB bus driver - @param State The state to set - - @retval EFI_SUCCESS The host controller is now working at State - @retval Others Failed to set operation state - -**/ -EFI_STATUS -UsbHcSetState ( - IN USB_BUS *UsbBus, - IN EFI_USB_HC_STATE State - ) -{ - EFI_STATUS Status; - - if (UsbBus->Usb2Hc != NULL) { - Status = UsbBus->Usb2Hc->SetState (UsbBus->Usb2Hc, State); - } else { - Status = UsbBus->UsbHc->SetState (UsbBus->UsbHc, State); - } - - return Status; -} /** - Get the root hub port state + Get the root hub port state. - @param UsbBus The USB bus driver - @param PortIndex The index of port - @param PortStatus The variable to save port state + @param UsbBus The USB bus driver. + @param PortIndex The index of port. + @param PortStatus The variable to save port state. - @retval EFI_SUCCESS The root port state is returned in - @retval Others Failed to get the root hub port state + @retval EFI_SUCCESS The root port state is returned in. + @retval Others Failed to get the root hub port state. **/ EFI_STATUS @@ -209,14 +123,14 @@ UsbHcGetRootHubPortStatus ( /** - Set the root hub port feature + Set the root hub port feature. - @param UsbBus The USB bus driver - @param PortIndex The port index - @param Feature The port feature to set + @param UsbBus The USB bus driver. + @param PortIndex The port index. + @param Feature The port feature to set. - @retval EFI_SUCCESS The port feature is set - @retval Others Failed to set port feature + @retval EFI_SUCCESS The port feature is set. + @retval Others Failed to set port feature. **/ EFI_STATUS @@ -240,14 +154,14 @@ UsbHcSetRootHubPortFeature ( /** - Clear the root hub port feature + Clear the root hub port feature. - @param UsbBus The USB bus driver - @param PortIndex The port index - @param Feature The port feature to clear + @param UsbBus The USB bus driver. + @param PortIndex The port index. + @param Feature The port feature to clear. - @retval EFI_SUCCESS The port feature is clear - @retval Others Failed to clear port feature + @retval EFI_SUCCESS The port feature is clear. + @retval Others Failed to clear port feature. **/ EFI_STATUS @@ -270,22 +184,22 @@ UsbHcClearRootHubPortFeature ( /** - Execute a control transfer to the device - - @param UsbBus The USB bus driver - @param DevAddr The device address - @param DevSpeed The device speed - @param MaxPacket Maximum packet size of endpoint 0 - @param Request The control transfer request - @param Direction The direction of data stage - @param Data The buffer holding data - @param DataLength The length of the data - @param TimeOut Timeout (in ms) to wait until timeout - @param Translator The transaction translator for low/full speed device - @param UsbResult The result of transfer - - @retval EFI_SUCCESS The control transfer finished without error - @retval Others The control transfer failed, reason returned in UsbReslt + Execute a control transfer to the device. + + @param UsbBus The USB bus driver. + @param DevAddr The device address. + @param DevSpeed The device speed. + @param MaxPacket Maximum packet size of endpoint 0. + @param Request The control transfer request. + @param Direction The direction of data stage. + @param Data The buffer holding data. + @param DataLength The length of the data. + @param TimeOut Timeout (in ms) to wait until timeout. + @param Translator The transaction translator for low/full speed device. + @param UsbResult The result of transfer. + + @retval EFI_SUCCESS The control transfer finished without error. + @retval Others The control transfer failed, reason returned in UsbReslt. **/ EFI_STATUS @@ -342,25 +256,25 @@ UsbHcControlTransfer ( /** - Execute a bulk transfer to the device's endpoint + Execute a bulk transfer to the device's endpoint. - @param UsbBus The USB bus driver - @param DevAddr The target device address + @param UsbBus The USB bus driver. + @param DevAddr The target device address. @param EpAddr The target endpoint address, with direction encoded in - bit 7 - @param DevSpeed The device's speed - @param MaxPacket The endpoint's max packet size - @param BufferNum The number of data buffer - @param Data Array of pointers to data buffer - @param DataLength The length of data buffer + bit 7. + @param DevSpeed The device's speed. + @param MaxPacket The endpoint's max packet size. + @param BufferNum The number of data buffer. + @param Data Array of pointers to data buffer. + @param DataLength The length of data buffer. @param DataToggle On input, the initial data toggle to use, also return the next toggle on output. - @param TimeOut The time to wait until timeout - @param Translator The transaction translator for low/full speed device - @param UsbResult The result of USB execution + @param TimeOut The time to wait until timeout. + @param Translator The transaction translator for low/full speed device. + @param UsbResult The result of USB execution. - @retval EFI_SUCCESS The bulk transfer is finished without error - @retval Others Failed to execute bulk transfer, result in UsbResult + @retval EFI_SUCCESS The bulk transfer is finished without error. + @retval Others Failed to execute bulk transfer, result in UsbResult. **/ EFI_STATUS @@ -415,25 +329,25 @@ UsbHcBulkTransfer ( /** - Queue or cancel an asynchronous interrupt transfer + Queue or cancel an asynchronous interrupt transfer. - @param UsbBus The USB bus driver - @param DevAddr The target device address + @param UsbBus The USB bus driver. + @param DevAddr The target device address. @param EpAddr The target endpoint address, with direction encoded in - bit 7 - @param DevSpeed The device's speed - @param MaxPacket The endpoint's max packet size + bit 7. + @param DevSpeed The device's speed. + @param MaxPacket The endpoint's max packet size. @param IsNewTransfer Whether this is a new request. If not, cancel the old - request - @param DataToggle Data toggle to use on input, next toggle on output - @param PollingInterval The interval to poll the interrupt transfer (in ms) - @param DataLength The length of periodical data receive - @param Translator The transaction translator for low/full speed device - @param Callback Function to call when data is received - @param Context The context to the callback + request. + @param DataToggle Data toggle to use on input, next toggle on output. + @param PollingInterval The interval to poll the interrupt transfer (in ms). + @param DataLength The length of periodical data receive. + @param Translator The transaction translator for low/full speed device. + @param Callback Function to call when data is received. + @param Context The context to the callback. - @retval EFI_SUCCESS The asynchronous transfer is queued - @retval Others Failed to queue the transfer + @retval EFI_SUCCESS The asynchronous transfer is queued. + @retval Others Failed to queue the transfer. **/ EFI_STATUS @@ -493,24 +407,24 @@ UsbHcAsyncInterruptTransfer ( /** - Execute a synchronous interrupt transfer to the target endpoint + Execute a synchronous interrupt transfer to the target endpoint. - @param UsbBus The USB bus driver - @param DevAddr The target device address + @param UsbBus The USB bus driver. + @param DevAddr The target device address. @param EpAddr The target endpoint address, with direction encoded in - bit 7 - @param DevSpeed The device's speed - @param MaxPacket The endpoint's max packet size - @param Data Pointer to data buffer - @param DataLength The length of data buffer + bit 7. + @param DevSpeed The device's speed. + @param MaxPacket The endpoint's max packet size. + @param Data Pointer to data buffer. + @param DataLength The length of data buffer. @param DataToggle On input, the initial data toggle to use, also return the next toggle on output. - @param TimeOut The time to wait until timeout - @param Translator The transaction translator for low/full speed device - @param UsbResult The result of USB execution + @param TimeOut The time to wait until timeout. + @param Translator The transaction translator for low/full speed device. + @param UsbResult The result of USB execution. - @retval EFI_SUCCESS The synchronous interrupt transfer is OK - @retval Others Failed to execute the synchronous interrupt transfer + @retval EFI_SUCCESS The synchronous interrupt transfer is OK. + @retval Others Failed to execute the synchronous interrupt transfer. **/ EFI_STATUS @@ -565,87 +479,19 @@ UsbHcSyncInterruptTransfer ( } -/** - Execute a synchronous Isochronous USB transfer - - @param UsbBus The USB bus driver - @param DevAddr The target device address - @param EpAddr The target endpoint address, with direction encoded in - bit 7 - @param DevSpeed The device's speed - @param MaxPacket The endpoint's max packet size - @param BufferNum The number of data buffer - @param Data Array of pointers to data buffer - @param DataLength The length of data buffer - @param Translator The transaction translator for low/full speed device - @param UsbResult The result of USB execution - - @retval EFI_UNSUPPORTED The isochronous transfer isn't supported now - -**/ -EFI_STATUS -UsbHcIsochronousTransfer ( - IN USB_BUS *UsbBus, - IN UINT8 DevAddr, - IN UINT8 EpAddr, - IN UINT8 DevSpeed, - IN UINTN MaxPacket, - IN UINT8 BufferNum, - IN OUT VOID *Data[EFI_USB_MAX_ISO_BUFFER_NUM], - IN UINTN DataLength, - IN EFI_USB2_HC_TRANSACTION_TRANSLATOR *Translator, - OUT UINT32 *UsbResult - ) -{ - return EFI_UNSUPPORTED; -} -/** - Queue an asynchronous isochronous transfer - @param UsbBus The USB bus driver - @param DevAddr The target device address - @param EpAddr The target endpoint address, with direction encoded in - bit 7 - @param DevSpeed The device's speed - @param MaxPacket The endpoint's max packet size - @param BufferNum The number of data buffer - @param Data Array of pointers to data buffer - @param DataLength The length of data buffer - @param Translator The transaction translator for low/full speed device - @param Callback The function to call when data is transferred - @param Context The context to the callback function - - @retval EFI_UNSUPPORTED The asynchronous isochronous transfer isn't supported -**/ -EFI_STATUS -UsbHcAsyncIsochronousTransfer ( - IN USB_BUS *UsbBus, - IN UINT8 DevAddr, - IN UINT8 EpAddr, - IN UINT8 DevSpeed, - IN UINTN MaxPacket, - IN UINT8 BufferNum, - IN OUT VOID *Data[EFI_USB_MAX_ISO_BUFFER_NUM], - IN UINTN DataLength, - IN EFI_USB2_HC_TRANSACTION_TRANSLATOR *Translator, - IN EFI_ASYNC_USB_TRANSFER_CALLBACK Callback, - IN VOID *Context - ) -{ - return EFI_UNSUPPORTED; -} /** - Open the USB host controller protocol BY_CHILD + Open the USB host controller protocol BY_CHILD. - @param Bus The USB bus driver - @param Child The child handle + @param Bus The USB bus driver. + @param Child The child handle. - @return The open protocol return + @return The open protocol return. **/ EFI_STATUS @@ -684,12 +530,10 @@ UsbOpenHostProtoByChild ( /** - Close the USB host controller protocol BY_CHILD + Close the USB host controller protocol BY_CHILD. - @param Bus The USB bus driver - @param Child The child handle - - @return None + @param Bus The USB bus driver. + @param Child The child handle. **/ VOID @@ -717,13 +561,12 @@ UsbCloseHostProtoByChild ( } - /** return the current TPL, copied from the EDKII glue lib. - VOID + @param VOID. - @return Current TPL + @return Current TPL. **/ EFI_TPL @@ -740,11 +583,11 @@ UsbGetCurrentTpl ( } /** - Create a new device path which only contain the first Usb part of the DevicePath + Create a new device path which only contain the first Usb part of the DevicePath. - @param DevicePath A full device path which contain the usb nodes + @param DevicePath A full device path which contain the usb nodes. - @return A new device path which only contain the Usb part of the DevicePath + @return A new device path which only contain the Usb part of the DevicePath. **/ EFI_DEVICE_PATH_PROTOCOL * @@ -762,7 +605,7 @@ GetUsbDPFromFullDP ( // Get the Usb part first Begin node in full device path // UsbDevicePathBeginPtr = DevicePath; - while ( (!EfiIsDevicePathEnd (UsbDevicePathBeginPtr))&& + while ( (!IsDevicePathEnd (UsbDevicePathBeginPtr))&& ((UsbDevicePathBeginPtr->Type != MESSAGING_DEVICE_PATH) || (UsbDevicePathBeginPtr->SubType != MSG_USB_DP && UsbDevicePathBeginPtr->SubType != MSG_USB_CLASS_DP @@ -776,7 +619,7 @@ GetUsbDPFromFullDP ( // Get the Usb part first End node in full device path // UsbDevicePathEndPtr = UsbDevicePathBeginPtr; - while ((!EfiIsDevicePathEnd (UsbDevicePathEndPtr))&& + while ((!IsDevicePathEnd (UsbDevicePathEndPtr))&& (UsbDevicePathEndPtr->Type == MESSAGING_DEVICE_PATH) && (UsbDevicePathEndPtr->SubType == MSG_USB_DP || UsbDevicePathEndPtr->SubType == MSG_USB_CLASS_DP @@ -812,11 +655,11 @@ GetUsbDPFromFullDP ( /** Check whether a usb device path is in a DEVICE_PATH_LIST_ITEM list. - @param UsbDP a usb device path of DEVICE_PATH_LIST_ITEM - @parem UsbIoDPList a DEVICE_PATH_LIST_ITEM list + @param UsbDP a usb device path of DEVICE_PATH_LIST_ITEM. + @param UsbIoDPList a DEVICE_PATH_LIST_ITEM list. - @retval TRUE there is a DEVICE_PATH_LIST_ITEM in UsbIoDPList which contains the passed in UsbDP - @retval FALSE there is no DEVICE_PATH_LIST_ITEM in UsbIoDPList which contains the passed in UsbDP + @retval TRUE there is a DEVICE_PATH_LIST_ITEM in UsbIoDPList which contains the passed in UsbDP. + @retval FALSE there is no DEVICE_PATH_LIST_ITEM in UsbIoDPList which contains the passed in UsbDP. **/ BOOLEAN @@ -863,11 +706,11 @@ SearchUsbDPInList ( /** Add a usb device path into the DEVICE_PATH_LIST_ITEM list. - @param UsbDP a usb device path of DEVICE_PATH_LIST_ITEM - @param UsbIoDPList a DEVICE_PATH_LIST_ITEM list + @param UsbDP a usb device path of DEVICE_PATH_LIST_ITEM. + @param UsbIoDPList a DEVICE_PATH_LIST_ITEM list. - @retval EFI_INVALID_PARAMETER - @retval EFI_SUCCESS + @retval EFI_INVALID_PARAMETER If parameters are invalid, return this value. + @retval EFI_SUCCESS If Add operation is successful, return this value. **/ EFI_STATUS @@ -905,13 +748,13 @@ AddUsbDPToList ( /** Check whether usb device, whose interface is UsbIf, matches the usb class which indicated by - UsbClassDevicePathPtr whose is a short form usb class device path + UsbClassDevicePathPtr whose is a short form usb class device path. - @param UsbClassDevicePathPtr a short form usb class device path - @param UsbIf a usb device interface + @param UsbClassDevicePathPtr a short form usb class device path. + @param UsbIf a usb device interface. - @retval TRUE the usb device match the usb class - @retval FALSE the usb device does not match the usb class + @retval TRUE the usb device match the usb class. + @retval FALSE the usb device does not match the usb class. **/ BOOLEAN @@ -933,6 +776,7 @@ MatchUsbClass ( } IfDesc = UsbIf->IfDesc; + ASSERT (IfDesc->ActiveIndex < USB_MAX_INTERFACE_SETTING); ActIfDesc = &(IfDesc->Settings[IfDesc->ActiveIndex]->Desc); DevDesc = &(UsbIf->Device->DevDesc->Desc); @@ -940,7 +784,7 @@ MatchUsbClass ( // If connect class policy, determine whether to create device handle by the five fields // in class device path node. // - // In addtion, hub interface is always matched for this policy. + // In addition, hub interface is always matched for this policy. // if ((ActIfDesc->InterfaceClass == USB_HUB_CLASS_CODE) && (ActIfDesc->InterfaceSubClass == USB_HUB_SUBCLASS_CODE)) { @@ -954,12 +798,9 @@ MatchUsbClass ( (UsbClassDevicePathPtr->ProductId == 0xffff || UsbClassDevicePathPtr->ProductId == DevDesc->IdProduct)) { // - // If class or subclass or protocol is 0, the counterparts in interface should be checked. + // If Class in Device Descriptor is set to 0, the counterparts in interface should be checked. // - if (DevDesc->DeviceClass == 0 && - DevDesc->DeviceSubClass == 0 && - DevDesc->DeviceProtocol == 0) { - + if (DevDesc->DeviceClass == 0) { if ((UsbClassDevicePathPtr->DeviceClass == ActIfDesc->InterfaceClass || UsbClassDevicePathPtr->DeviceClass == 0xff) && (UsbClassDevicePathPtr->DeviceSubClass == ActIfDesc->InterfaceSubClass || @@ -969,7 +810,7 @@ MatchUsbClass ( return TRUE; } - } else if ((UsbClassDevicePathPtr->DeviceClass != DevDesc->DeviceClass || + } else if ((UsbClassDevicePathPtr->DeviceClass == DevDesc->DeviceClass || UsbClassDevicePathPtr->DeviceClass == 0xff) && (UsbClassDevicePathPtr->DeviceSubClass == DevDesc->DeviceSubClass || UsbClassDevicePathPtr->DeviceSubClass == 0xff) && @@ -985,16 +826,15 @@ MatchUsbClass ( /** Check whether usb device, whose interface is UsbIf, matches the usb WWID requirement which indicated by - UsbWWIDDevicePathPtr whose is a short form usb WWID device path + UsbWWIDDevicePathPtr whose is a short form usb WWID device path. - @param UsbClassDevicePathPtr a short form usb WWID device path - @param UsbIf a usb device interface + @param UsbWWIDDevicePathPtr a short form usb WWID device path. + @param UsbIf a usb device interface. - @retval TRUE the usb device match the usb WWID requirement - @retval FALSE the usb device does not match the usb WWID requirement + @retval TRUE the usb device match the usb WWID requirement. + @retval FALSE the usb device does not match the usb WWID requirement. **/ -STATIC BOOLEAN MatchUsbWwid ( IN USB_WWID_DEVICE_PATH *UsbWWIDDevicePathPtr, @@ -1005,7 +845,10 @@ MatchUsbWwid ( EFI_USB_INTERFACE_DESCRIPTOR *ActIfDesc; EFI_USB_DEVICE_DESCRIPTOR *DevDesc; EFI_USB_STRING_DESCRIPTOR *StrDesc; - UINT16 *SnString; + UINT16 Index; + CHAR16 *CompareStr; + UINTN CompareLen; + UINTN Length; if ((UsbWWIDDevicePathPtr->Header.Type != MESSAGING_DEVICE_PATH) || (UsbWWIDDevicePathPtr->Header.SubType != MSG_USB_WWID_DP )){ @@ -1014,41 +857,69 @@ MatchUsbWwid ( } IfDesc = UsbIf->IfDesc; + ASSERT (IfDesc->ActiveIndex < USB_MAX_INTERFACE_SETTING); ActIfDesc = &(IfDesc->Settings[IfDesc->ActiveIndex]->Desc); DevDesc = &(UsbIf->Device->DevDesc->Desc); - StrDesc = UsbGetOneString (UsbIf->Device, DevDesc->StrSerialNumber, USB_US_LAND_ID); - SnString = (UINT16 *) ((UINT8 *)UsbWWIDDevicePathPtr + 10); // - //In addtion, hub interface is always matched for this policy. + // In addition, Hub interface is always matched for this policy. // if ((ActIfDesc->InterfaceClass == USB_HUB_CLASS_CODE) && (ActIfDesc->InterfaceSubClass == USB_HUB_SUBCLASS_CODE)) { return TRUE; } + + // + // Check Vendor Id, Product Id and Interface Number. // - // If connect wwid policy, determine the objective device by the serial number of - // device descriptor. - // Get serial number index from device descriptor, then get serial number by index - // and land id, compare the serial number with wwid device path node at last + if ((DevDesc->IdVendor != UsbWWIDDevicePathPtr->VendorId) || + (DevDesc->IdProduct != UsbWWIDDevicePathPtr->ProductId) || + (ActIfDesc->InterfaceNumber != UsbWWIDDevicePathPtr->InterfaceNumber)) { + return FALSE; + } + // - // BugBug: only check serial number here, should check Interface Number, Device Vendor Id, Device Product Id in later version + // Check SerialNumber. // - if (StrDesc != NULL && !StrnCmp (StrDesc->String, SnString, StrDesc->Length)) { + if (DevDesc->StrSerialNumber == 0) { + return FALSE; + } - return TRUE; + // + // Serial number in USB WWID device path is the last 64-or-less UTF-16 characters. + // + CompareStr = (CHAR16 *) (UINTN) (UsbWWIDDevicePathPtr + 1); + CompareLen = (DevicePathNodeLength (UsbWWIDDevicePathPtr) - sizeof (USB_WWID_DEVICE_PATH)) / sizeof (CHAR16); + if (CompareStr[CompareLen - 1] == L'\0') { + CompareLen--; + } + + // + // Compare serial number in each supported language. + // + for (Index = 0; Index < UsbIf->Device->TotalLangId; Index++) { + StrDesc = UsbGetOneString (UsbIf->Device, DevDesc->StrSerialNumber, UsbIf->Device->LangId[Index]); + if (StrDesc == NULL) { + continue; + } + + Length = (StrDesc->Length - 2) / sizeof (CHAR16); + if ((Length >= CompareLen) && + (CompareMem (StrDesc->String + Length - CompareLen, CompareStr, CompareLen * sizeof (CHAR16)) == 0)) { + return TRUE; + } } return FALSE; } /** - Free a DEVICE_PATH_LIST_ITEM list + Free a DEVICE_PATH_LIST_ITEM list. - @param UsbIoDPList a DEVICE_PATH_LIST_ITEM list pointer + @param UsbIoDPList a DEVICE_PATH_LIST_ITEM list pointer. - @retval EFI_INVALID_PARAMETER - @retval EFI_SUCCESS + @retval EFI_INVALID_PARAMETER If parameters are invalid, return this value. + @retval EFI_SUCCESS If free operation is successful, return this value. **/ EFI_STATUS @@ -1090,14 +961,13 @@ UsbBusFreeUsbDPList ( /** Store a wanted usb child device info (its Usb part of device path) which is indicated by - RemainingDevicePath in a Usb bus which is indicated by UsbBusId + RemainingDevicePath in a Usb bus which is indicated by UsbBusId. - @param UsbBusId Point to EFI_USB_BUS_PROTOCOL interface - @param RemainingDevicePath The remaining device patch + @param UsbBusId Point to EFI_USB_BUS_PROTOCOL interface. + @param RemainingDevicePath The remaining device patch. - @retval EFI_SUCCESS - @retval EFI_INVALID_PARAMETER - @retval EFI_OUT_OF_RESOURCES + @retval EFI_SUCCESS Add operation is successful. + @retval EFI_INVALID_PARAMETER The parameters are invalid. **/ EFI_STATUS @@ -1114,7 +984,7 @@ UsbBusAddWantedUsbIoDP ( // // Check whether remaining device path is valid // - if (RemainingDevicePath != NULL) { + if (RemainingDevicePath != NULL && !IsDevicePathEnd (RemainingDevicePath)) { if ((RemainingDevicePath->Type != MESSAGING_DEVICE_PATH) || (RemainingDevicePath->SubType != MSG_USB_DP && RemainingDevicePath->SubType != MSG_USB_CLASS_DP @@ -1132,36 +1002,42 @@ UsbBusAddWantedUsbIoDP ( if (RemainingDevicePath == NULL) { // - // RemainingDevicePath== NULL means all Usb devices in this bus are wanted. + // RemainingDevicePath == NULL means all Usb devices in this bus are wanted. // Here use a Usb class Device Path in WantedUsbIoDPList to indicate all Usb devices // are wanted Usb devices // Status = UsbBusFreeUsbDPList (&Bus->WantedUsbIoDPList); ASSERT (!EFI_ERROR (Status)); DevicePathPtr = DuplicateDevicePath ((EFI_DEVICE_PATH_PROTOCOL *) &mAllUsbClassDevicePath); - } else { + } else if (!IsDevicePathEnd (RemainingDevicePath)) { // + // If RemainingDevicePath isn't the End of Device Path Node, // Create new Usb device path according to the usb part in remaining device path // DevicePathPtr = GetUsbDPFromFullDP (RemainingDevicePath); + } else { + // + // If RemainingDevicePath is the End of Device Path Node, + // skip enumerate any device and return EFI_SUCCESS + // + return EFI_SUCCESS; } ASSERT (DevicePathPtr != NULL); Status = AddUsbDPToList (DevicePathPtr, &Bus->WantedUsbIoDPList); ASSERT (!EFI_ERROR (Status)); - gBS->FreePool (DevicePathPtr); + FreePool (DevicePathPtr); return EFI_SUCCESS; } /** - Check whether a usb child device is the wanted device in a bus + Check whether a usb child device is the wanted device in a bus. - @param Bus The Usb bus's private data pointer - @param UsbIf The usb child device inferface + @param Bus The Usb bus's private data pointer. + @param UsbIf The usb child device interface. - @retval EFI_SUCCESS - @retval EFI_INVALID_PARAMETER - @retval EFI_OUT_OF_RESOURCES + @retval True If a usb child device is the wanted device in a bus. + @retval False If a usb child device is *NOT* the wanted device in a bus. **/ BOOLEAN @@ -1260,14 +1136,13 @@ UsbBusIsWantedUsbIO ( } /** - Recursively connnect every wanted usb child device to ensure they all fully connected. - Check all the child Usb IO handles in this bus, recursively connecte if it is wanted usb child device + Recursively connect every wanted usb child device to ensure they all fully connected. + Check all the child Usb IO handles in this bus, recursively connecte if it is wanted usb child device. - @param UsbBusId point to EFI_USB_BUS_PROTOCOL interface + @param UsbBusId Point to EFI_USB_BUS_PROTOCOL interface. - @retval EFI_SUCCESS - @retval EFI_INVALID_PARAMETER - @retval EFI_OUT_OF_RESOURCES + @retval EFI_SUCCESS Connect is done successfully. + @retval EFI_INVALID_PARAMETER The parameter is invalid. **/ EFI_STATUS @@ -1337,14 +1212,15 @@ UsbBusRecursivelyConnectWantedUsbIo ( // // Recursively connect the wanted Usb Io handle // - DEBUG ((EFI_D_INFO, "UsbConnectDriver: TPL before connect is %d\n", UsbGetCurrentTpl ())); + DEBUG ((DEBUG_INFO, "UsbBusRecursivelyConnectWantedUsbIo: TPL before connect is %d\n", (UINT32)UsbGetCurrentTpl ())); Status = gBS->ConnectController (UsbIf->Handle, NULL, NULL, TRUE); UsbIf->IsManaged = (BOOLEAN)!EFI_ERROR (Status); - DEBUG ((EFI_D_INFO, "UsbConnectDriver: TPL after connect is %d\n", UsbGetCurrentTpl())); + DEBUG ((DEBUG_INFO, "UsbBusRecursivelyConnectWantedUsbIo: TPL after connect is %d\n", (UINT32)UsbGetCurrentTpl())); } } } + FreePool (UsbIoBuffer); + return EFI_SUCCESS; } -