diff options
Diffstat (limited to 'MdeModulePkg/Bus')
-rw-r--r-- | MdeModulePkg/Bus/Pci/EhciDxe/Ehci.c | 40 | ||||
-rw-r--r-- | MdeModulePkg/Bus/Pci/UhciDxe/Uhci.c | 28 | ||||
-rw-r--r-- | MdeModulePkg/Bus/Pci/UndiRuntimeDxe/Init.c | 16 |
3 files changed, 66 insertions, 18 deletions
diff --git a/MdeModulePkg/Bus/Pci/EhciDxe/Ehci.c b/MdeModulePkg/Bus/Pci/EhciDxe/Ehci.c index 07a690edce..488c963952 100644 --- a/MdeModulePkg/Bus/Pci/EhciDxe/Ehci.c +++ b/MdeModulePkg/Bus/Pci/EhciDxe/Ehci.c @@ -1491,6 +1491,7 @@ EhcDriverBindingStart ( EFI_STATUS Status;
USB2_HC_DEV *Ehc;
EFI_PCI_IO_PROTOCOL *PciIo;
+ UINT64 Supports;
//
// Open the PciIo Protocol, then enable the USB host controller
@@ -1511,10 +1512,19 @@ EhcDriverBindingStart ( Status = PciIo->Attributes (
PciIo,
- EfiPciIoAttributeOperationEnable,
- EFI_PCI_DEVICE_ENABLE,
- NULL
+ EfiPciIoAttributeOperationSupported,
+ 0,
+ &Supports
);
+ if (!EFI_ERROR (Status)) {
+ Supports &= EFI_PCI_DEVICE_ENABLE;
+ Status = PciIo->Attributes (
+ PciIo,
+ EfiPciIoAttributeOperationEnable,
+ Supports,
+ NULL
+ );
+ }
if (EFI_ERROR (Status)) {
EHC_ERROR (("EhcDriverBindingStart: failed to enable controller\n"));
@@ -1643,6 +1653,7 @@ EhcDriverBindingStop ( EFI_USB2_HC_PROTOCOL *Usb2Hc;
EFI_PCI_IO_PROTOCOL *PciIo;
USB2_HC_DEV *Ehc;
+ UINT64 Supports;
//
// Test whether the Controller handler passed in is a valid
@@ -1695,12 +1706,21 @@ EhcDriverBindingStop ( //
// Disable the USB Host Controller
//
- PciIo->Attributes (
- PciIo,
- EfiPciIoAttributeOperationDisable,
- EFI_PCI_DEVICE_ENABLE,
- NULL
- );
+ Status = PciIo->Attributes (
+ PciIo,
+ EfiPciIoAttributeOperationSupported,
+ 0,
+ &Supports
+ );
+ if (!EFI_ERROR (Status)) {
+ Supports &= EFI_PCI_DEVICE_ENABLE;
+ Status = PciIo->Attributes (
+ PciIo,
+ EfiPciIoAttributeOperationDisable,
+ Supports,
+ NULL
+ );
+ }
gBS->CloseProtocol (
Controller,
@@ -1710,7 +1730,7 @@ EhcDriverBindingStop ( );
gBS->FreePool (Ehc);
- return Status;
+ return EFI_SUCCESS;
}
EFI_DRIVER_BINDING_PROTOCOL
diff --git a/MdeModulePkg/Bus/Pci/UhciDxe/Uhci.c b/MdeModulePkg/Bus/Pci/UhciDxe/Uhci.c index 00108b87e2..36ce1bd4fe 100644 --- a/MdeModulePkg/Bus/Pci/UhciDxe/Uhci.c +++ b/MdeModulePkg/Bus/Pci/UhciDxe/Uhci.c @@ -2068,6 +2068,7 @@ UhciCleanDevUp ( )
{
USB_HC_DEV *Uhc;
+ UINT64 Supports;
//
// Uninstall the USB_HC and USB_HC2 protocol, then disable the controller
@@ -2089,11 +2090,18 @@ UhciCleanDevUp ( UhciFreeAllAsyncReq (Uhc);
UhciDestoryFrameList (Uhc);
-
+
+ Uhc->PciIo->Attributes (
+ Uhc->PciIo,
+ EfiPciIoAttributeOperationSupported,
+ 0,
+ &Supports
+ );
+ Supports &= EFI_PCI_DEVICE_ENABLE;
Uhc->PciIo->Attributes (
Uhc->PciIo,
EfiPciIoAttributeOperationDisable,
- EFI_PCI_DEVICE_ENABLE,
+ Supports,
NULL
);
@@ -2126,6 +2134,7 @@ UhciDriverBindingStart ( EFI_STATUS Status;
EFI_PCI_IO_PROTOCOL *PciIo;
USB_HC_DEV *Uhc;
+ UINT64 Supports;
//
// Open PCIIO, then enable the EHC device and turn off emulation
@@ -2148,10 +2157,19 @@ UhciDriverBindingStart ( Status = PciIo->Attributes (
PciIo,
- EfiPciIoAttributeOperationEnable,
- EFI_PCI_DEVICE_ENABLE,
- NULL
+ EfiPciIoAttributeOperationSupported,
+ 0,
+ &Supports
);
+ if (!EFI_ERROR (Status)) {
+ Supports &= EFI_PCI_DEVICE_ENABLE;
+ Status = PciIo->Attributes (
+ PciIo,
+ EfiPciIoAttributeOperationEnable,
+ Supports,
+ NULL
+ );
+ }
if (EFI_ERROR (Status)) {
goto CLOSE_PCIIO;
diff --git a/MdeModulePkg/Bus/Pci/UndiRuntimeDxe/Init.c b/MdeModulePkg/Bus/Pci/UndiRuntimeDxe/Init.c index 8315bc41d0..784bf5560e 100644 --- a/MdeModulePkg/Bus/Pci/UndiRuntimeDxe/Init.c +++ b/MdeModulePkg/Bus/Pci/UndiRuntimeDxe/Init.c @@ -287,6 +287,7 @@ Returns: UINT8 *TmpPxePointer;
EFI_PCI_IO_PROTOCOL *PciIoFncs;
UINTN Len;
+ UINT64 Supports;
Status = gBS->OpenProtocol (
Controller,
@@ -380,10 +381,19 @@ Returns: Status = PciIoFncs->Attributes (
PciIoFncs,
- EfiPciIoAttributeOperationEnable,
- EFI_PCI_DEVICE_ENABLE | EFI_PCI_IO_ATTRIBUTE_MEMORY | EFI_PCI_IO_ATTRIBUTE_IO | EFI_PCI_IO_ATTRIBUTE_BUS_MASTER,
- NULL
+ EfiPciIoAttributeOperationSupported,
+ 0,
+ &Supports
);
+ if (!EFI_ERROR (Status)) {
+ Supports &= EFI_PCI_DEVICE_ENABLE;
+ Status = PciIoFncs->Attributes (
+ PciIoFncs,
+ EfiPciIoAttributeOperationEnable,
+ Supports,
+ NULL
+ );
+ }
//
// Read all the registers from device's PCI Configuration space
//
|