]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Bus/Pci/EhciDxe/Ehci.c
1. Added EFI_MEDIA_CHANGED and EFI_INVALID_PARAMETER returns in UsbMassReadBlocks().
[mirror_edk2.git] / MdeModulePkg / Bus / Pci / EhciDxe / Ehci.c
index 488c963952d7264c95f205ed8d983673293c6fad..e8fb1120b7736b1f680a27a9f73784b4f7086989 100644 (file)
@@ -81,7 +81,7 @@ EhcGetCapability (
   *PortNumber     = (UINT8) (Ehc->HcStructParams & HCSP_NPORTS);\r
   *Is64BitCapable = (UINT8) (Ehc->HcCapParams & HCCP_64BIT);\r
 \r
-  EHC_DEBUG (("EhcGetCapability: %d ports, 64 bit %d\n", *PortNumber, *Is64BitCapable));\r
+  DEBUG ((EFI_D_INFO, "EhcGetCapability: %d ports, 64 bit %d\n", *PortNumber, *Is64BitCapable));\r
 \r
   gBS->RestoreTPL (OldTpl);\r
   return EFI_SUCCESS;\r
@@ -133,7 +133,7 @@ EhcReset (
         goto ON_EXIT;\r
       }\r
     }\r
-    \r
+\r
     //\r
     // Clean up the asynchronous transfers, currently only\r
     // interrupt supports asynchronous operation.\r
@@ -161,7 +161,7 @@ EhcReset (
   }\r
 \r
 ON_EXIT:\r
-  EHC_DEBUG (("EhcReset: exit status %r\n", Status));\r
+  DEBUG ((EFI_D_INFO, "EhcReset: exit status %r\n", Status));\r
   gBS->RestoreTPL (OldTpl);\r
   return Status;\r
 }\r
@@ -206,7 +206,7 @@ EhcGetState (
 \r
   gBS->RestoreTPL (OldTpl);\r
 \r
-  EHC_DEBUG (("EhcGetState: current state %d\n", *State));\r
+  DEBUG ((EFI_D_INFO, "EhcGetState: current state %d\n", *State));\r
   return EFI_SUCCESS;\r
 }\r
 \r
@@ -262,9 +262,9 @@ EhcSetState (
 \r
     //\r
     // Software must not write a one to this field unless the host controller\r
-    // is in the Halted state. Doing so will yield undefined results. \r
+    // is in the Halted state. Doing so will yield undefined results.\r
     // refers to Spec[EHCI1.0-2.3.1]\r
-    // \r
+    //\r
     if (!EHC_REG_BIT_IS_SET (Ehc, EHC_USBSTS_OFFSET, USBSTS_HALT)) {\r
       Status = EFI_DEVICE_ERROR;\r
       break;\r
@@ -281,7 +281,7 @@ EhcSetState (
     Status = EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  EHC_DEBUG (("EhcSetState: exit status %r\n", Status));\r
+  DEBUG ((EFI_D_INFO, "EhcSetState: exit status %r\n", Status));\r
   gBS->RestoreTPL (OldTpl);\r
   return Status;\r
 }\r
@@ -450,11 +450,11 @@ EhcSetRootHubPortFeature (
       Status = EhcRunHC (Ehc, EHC_GENERIC_TIMEOUT);\r
 \r
       if (EFI_ERROR (Status)) {\r
-        EHC_DEBUG (("EhcSetRootHubPortFeature :failed to start HC - %r\n", Status));\r
+        DEBUG ((EFI_D_INFO, "EhcSetRootHubPortFeature :failed to start HC - %r\n", Status));\r
         break;\r
       }\r
     }\r
-    \r
+\r
     //\r
     // Set one to PortReset bit must also set zero to PortEnable bit\r
     //\r
@@ -480,7 +480,7 @@ EhcSetRootHubPortFeature (
   }\r
 \r
 ON_EXIT:\r
-  EHC_DEBUG (("EhcSetRootHubPortFeature: exit status %r\n", Status));\r
+  DEBUG ((EFI_D_INFO, "EhcSetRootHubPortFeature: exit status %r\n", Status));\r
 \r
   gBS->RestoreTPL (OldTpl);\r
   return Status;\r
@@ -608,7 +608,7 @@ EhcClearRootHubPortFeature (
   }\r
 \r
 ON_EXIT:\r
-  EHC_DEBUG (("EhcClearRootHubPortFeature: exit status %r\n", Status));\r
+  DEBUG ((EFI_D_INFO, "EhcClearRootHubPortFeature: exit status %r\n", Status));\r
   gBS->RestoreTPL (OldTpl);\r
   return Status;\r
 }\r
@@ -700,7 +700,7 @@ EhcControlTransfer (
   *TransferResult = EFI_USB_ERR_SYSTEM;\r
 \r
   if (EhcIsHalt (Ehc) || EhcIsSysError (Ehc)) {\r
-    EHC_ERROR (("EhcControlTransfer: HC halted at entrance\n"));\r
+    DEBUG ((EFI_D_ERROR, "EhcControlTransfer: HC halted at entrance\n"));\r
 \r
     EhcAckAllInterrupt (Ehc);\r
     goto ON_EXIT;\r
@@ -736,7 +736,7 @@ EhcControlTransfer (
           );\r
 \r
   if (Urb == NULL) {\r
-    EHC_ERROR (("EhcControlTransfer: failed to create URB"));\r
+    DEBUG ((EFI_D_ERROR, "EhcControlTransfer: failed to create URB"));\r
 \r
     Status = EFI_OUT_OF_RESOURCES;\r
     goto ON_EXIT;\r
@@ -765,7 +765,7 @@ ON_EXIT:
   gBS->RestoreTPL (OldTpl);\r
 \r
   if (EFI_ERROR (Status)) {\r
-    EHC_ERROR (("EhcControlTransfer: error - %r, transfer - %x\n", Status, *TransferResult));\r
+    DEBUG ((EFI_D_ERROR, "EhcControlTransfer: error - %r, transfer - %x\n", Status, *TransferResult));\r
   }\r
 \r
   return Status;\r
@@ -851,7 +851,7 @@ EhcBulkTransfer (
   Status          = EFI_DEVICE_ERROR;\r
 \r
   if (EhcIsHalt (Ehc) || EhcIsSysError (Ehc)) {\r
-    EHC_ERROR (("EhcBulkTransfer: HC is halted\n"));\r
+    DEBUG ((EFI_D_ERROR, "EhcBulkTransfer: HC is halted\n"));\r
 \r
     EhcAckAllInterrupt (Ehc);\r
     goto ON_EXIT;\r
@@ -881,7 +881,7 @@ EhcBulkTransfer (
           );\r
 \r
   if (Urb == NULL) {\r
-    EHC_ERROR (("EhcBulkTransfer: failed to create URB\n"));\r
+    DEBUG ((EFI_D_ERROR, "EhcBulkTransfer: failed to create URB\n"));\r
 \r
     Status = EFI_OUT_OF_RESOURCES;\r
     goto ON_EXIT;\r
@@ -907,7 +907,7 @@ ON_EXIT:
   gBS->RestoreTPL (OldTpl);\r
 \r
   if (EFI_ERROR (Status)) {\r
-    EHC_ERROR (("EhcBulkTransfer: error - %r, transfer - %x\n", Status, *TransferResult));\r
+    DEBUG ((EFI_D_ERROR, "EhcBulkTransfer: error - %r, transfer - %x\n", Status, *TransferResult));\r
   }\r
 \r
   return Status;\r
@@ -998,14 +998,14 @@ EhcAsyncInterruptTransfer (
   if (!IsNewTransfer) {\r
     Status = EhciDelAsyncIntTransfer (Ehc, DeviceAddress, EndPointAddress, DataToggle);\r
 \r
-    EHC_DEBUG (("EhcAsyncInterruptTransfer: remove old transfer - %r\n", Status));\r
+    DEBUG ((EFI_D_INFO, "EhcAsyncInterruptTransfer: remove old transfer - %r\n", Status));\r
     goto ON_EXIT;\r
   }\r
 \r
   Status = EFI_SUCCESS;\r
 \r
   if (EhcIsHalt (Ehc) || EhcIsSysError (Ehc)) {\r
-    EHC_ERROR (("EhcAsyncInterruptTransfer: HC is halt\n"));\r
+    DEBUG ((EFI_D_ERROR, "EhcAsyncInterruptTransfer: HC is halt\n"));\r
     EhcAckAllInterrupt (Ehc);\r
 \r
     Status = EFI_DEVICE_ERROR;\r
@@ -1017,7 +1017,7 @@ EhcAsyncInterruptTransfer (
   Data = AllocatePool (DataLength);\r
 \r
   if (Data == NULL) {\r
-    EHC_ERROR (("EhcAsyncInterruptTransfer: failed to allocate buffer\n"));\r
+    DEBUG ((EFI_D_ERROR, "EhcAsyncInterruptTransfer: failed to allocate buffer\n"));\r
 \r
     Status = EFI_OUT_OF_RESOURCES;\r
     goto ON_EXIT;\r
@@ -1041,7 +1041,7 @@ EhcAsyncInterruptTransfer (
           );\r
 \r
   if (Urb == NULL) {\r
-    EHC_ERROR (("EhcAsyncInterruptTransfer: failed to create URB\n"));\r
+    DEBUG ((EFI_D_ERROR, "EhcAsyncInterruptTransfer: failed to create URB\n"));\r
 \r
     gBS->FreePool (Data);\r
     Status = EFI_OUT_OF_RESOURCES;\r
@@ -1141,7 +1141,7 @@ EhcSyncInterruptTransfer (
   Status          = EFI_DEVICE_ERROR;\r
 \r
   if (EhcIsHalt (Ehc) || EhcIsSysError (Ehc)) {\r
-    EHC_ERROR (("EhcSyncInterruptTransfer: HC is halt\n"));\r
+    DEBUG ((EFI_D_ERROR, "EhcSyncInterruptTransfer: HC is halt\n"));\r
 \r
     EhcAckAllInterrupt (Ehc);\r
     goto ON_EXIT;\r
@@ -1167,7 +1167,7 @@ EhcSyncInterruptTransfer (
           );\r
 \r
   if (Urb == NULL) {\r
-    EHC_ERROR (("EhcSyncInterruptTransfer: failed to create URB\n"));\r
+    DEBUG ((EFI_D_ERROR, "EhcSyncInterruptTransfer: failed to create URB\n"));\r
 \r
     Status = EFI_OUT_OF_RESOURCES;\r
     goto ON_EXIT;\r
@@ -1190,7 +1190,7 @@ ON_EXIT:
   gBS->RestoreTPL (OldTpl);\r
 \r
   if (EFI_ERROR (Status)) {\r
-    EHC_ERROR (("EhcSyncInterruptTransfer: error - %r, transfer - %x\n", Status, *TransferResult));\r
+    DEBUG ((EFI_D_ERROR, "EhcSyncInterruptTransfer: error - %r, transfer - %x\n", Status, *TransferResult));\r
   }\r
 \r
   return Status;\r
@@ -1395,7 +1395,8 @@ ON_EXIT:
 /**\r
   Create and initialize a USB2_HC_DEV\r
 \r
-  @param  PciIo                The PciIo on this device\r
+  @param  PciIo                  The PciIo on this device\r
+  @param  OriginalPciAttributes  Original PCI attributes\r
 \r
   @return The allocated and initialized USB2_HC_DEV structure\r
   @return if created, otherwise NULL.\r
@@ -1404,7 +1405,8 @@ ON_EXIT:
 STATIC\r
 USB2_HC_DEV *\r
 EhcCreateUsb2Hc (\r
-  IN EFI_PCI_IO_PROTOCOL  *PciIo\r
+  IN EFI_PCI_IO_PROTOCOL  *PciIo,\r
+  IN UINT64               OriginalPciAttributes\r
   )\r
 {\r
   USB2_HC_DEV             *Ehc;\r
@@ -1437,7 +1439,8 @@ EhcCreateUsb2Hc (
   Ehc->Usb2Hc.MajorRevision             = 0x1;\r
   Ehc->Usb2Hc.MinorRevision             = 0x1;\r
 \r
-  Ehc->PciIo = PciIo;\r
+  Ehc->PciIo                 = PciIo;\r
+  Ehc->OriginalPciAttributes = OriginalPciAttributes;\r
 \r
   InitializeListHead (&Ehc->AsyncIntTransfers);\r
 \r
@@ -1445,7 +1448,7 @@ EhcCreateUsb2Hc (
   Ehc->HcCapParams    = EhcReadCapRegister (Ehc, EHC_HCCPARAMS_OFFSET);\r
   Ehc->CapLen         = EhcReadCapRegister (Ehc, EHC_CAPLENGTH_OFFSET) & 0x0FF;\r
 \r
-  EHC_DEBUG (("EhcCreateUsb2Hc: capability length %d\n", Ehc->CapLen));\r
+  DEBUG ((EFI_D_INFO, "EhcCreateUsb2Hc: capability length %d\n", Ehc->CapLen));\r
 \r
   //\r
   // Create AsyncRequest Polling Timer\r
@@ -1492,6 +1495,8 @@ EhcDriverBindingStart (
   USB2_HC_DEV             *Ehc;\r
   EFI_PCI_IO_PROTOCOL     *PciIo;\r
   UINT64                  Supports;\r
+  UINT64                  OriginalPciAttributes;\r
+  BOOLEAN                 PciAttributesSaved;\r
 \r
   //\r
   // Open the PciIo Protocol, then enable the USB host controller\r
@@ -1506,10 +1511,26 @@ EhcDriverBindingStart (
                   );\r
 \r
   if (EFI_ERROR (Status)) {\r
-    EHC_ERROR (("EhcDriverBindingStart: failed to open PCI_IO\n"));\r
+    DEBUG ((EFI_D_ERROR, "EhcDriverBindingStart: failed to open PCI_IO\n"));\r
     return EFI_DEVICE_ERROR;\r
   }\r
 \r
+  PciAttributesSaved = FALSE;\r
+  //\r
+  // Save original PCI attributes\r
+  //\r
+  Status = PciIo->Attributes (\r
+                    PciIo,\r
+                    EfiPciIoAttributeOperationGet,\r
+                    0,\r
+                    &OriginalPciAttributes\r
+                    );\r
+\r
+  if (EFI_ERROR (Status)) {\r
+    goto CLOSE_PCIIO;\r
+  }\r
+  PciAttributesSaved = TRUE;\r
+\r
   Status = PciIo->Attributes (\r
                     PciIo,\r
                     EfiPciIoAttributeOperationSupported,\r
@@ -1527,17 +1548,17 @@ EhcDriverBindingStart (
   }\r
 \r
   if (EFI_ERROR (Status)) {\r
-    EHC_ERROR (("EhcDriverBindingStart: failed to enable controller\n"));\r
+    DEBUG ((EFI_D_ERROR, "EhcDriverBindingStart: failed to enable controller\n"));\r
     goto CLOSE_PCIIO;\r
   }\r
 \r
   //\r
   // Create then install USB2_HC_PROTOCOL\r
   //\r
-  Ehc = EhcCreateUsb2Hc (PciIo);\r
+  Ehc = EhcCreateUsb2Hc (PciIo, OriginalPciAttributes);\r
 \r
   if (Ehc == NULL) {\r
-    EHC_ERROR (("EhcDriverBindingStart: failed to create USB2_HC\n"));\r
+    DEBUG ((EFI_D_ERROR, "EhcDriverBindingStart: failed to create USB2_HC\n"));\r
 \r
     Status = EFI_OUT_OF_RESOURCES;\r
     goto CLOSE_PCIIO;\r
@@ -1551,7 +1572,7 @@ EhcDriverBindingStart (
                   );\r
 \r
   if (EFI_ERROR (Status)) {\r
-    EHC_ERROR (("EhcDriverBindingStart: failed to install USB2_HC Protocol\n"));\r
+    DEBUG ((EFI_D_ERROR, "EhcDriverBindingStart: failed to install USB2_HC Protocol\n"));\r
     goto FREE_POOL;\r
   }\r
 \r
@@ -1564,7 +1585,7 @@ EhcDriverBindingStart (
   Status = EhcInitHC (Ehc);\r
 \r
   if (EFI_ERROR (Status)) {\r
-    EHC_ERROR (("EhcDriverBindingStart: failed to init host controller\n"));\r
+    DEBUG ((EFI_D_ERROR, "EhcDriverBindingStart: failed to init host controller\n"));\r
     goto UNINSTALL_USBHC;\r
   }\r
 \r
@@ -1574,7 +1595,7 @@ EhcDriverBindingStart (
   Status = gBS->SetTimer (Ehc->PollTimer, TimerPeriodic, EHC_ASYNC_POLL_INTERVAL);\r
 \r
   if (EFI_ERROR (Status)) {\r
-    EHC_ERROR (("EhcDriverBindingStart: failed to start async interrupt monitor\n"));\r
+    DEBUG ((EFI_D_ERROR, "EhcDriverBindingStart: failed to start async interrupt monitor\n"));\r
 \r
     EhcHaltHC (Ehc, EHC_GENERIC_TIMEOUT);\r
     goto UNINSTALL_USBHC;\r
@@ -1600,7 +1621,7 @@ EhcDriverBindingStart (
     );\r
 \r
 \r
-  EHC_DEBUG (("EhcDriverBindingStart: EHCI started for controller @ %x\n", Controller));\r
+  DEBUG ((EFI_D_INFO, "EhcDriverBindingStart: EHCI started for controller @ %x\n", Controller));\r
   return EFI_SUCCESS;\r
 \r
 UNINSTALL_USBHC:\r
@@ -1616,6 +1637,18 @@ FREE_POOL:
   gBS->FreePool (Ehc);\r
 \r
 CLOSE_PCIIO:\r
+  if (PciAttributesSaved == TRUE) {\r
+    //\r
+    // Restore original PCI attributes\r
+    //\r
+    PciIo->Attributes (\r
+                    PciIo,\r
+                    EfiPciIoAttributeOperationSet,\r
+                    OriginalPciAttributes,\r
+                    NULL\r
+                    );\r
+  }\r
+\r
   gBS->CloseProtocol (\r
          Controller,\r
          &gEfiPciIoProtocolGuid,\r
@@ -1653,7 +1686,6 @@ EhcDriverBindingStop (
   EFI_USB2_HC_PROTOCOL  *Usb2Hc;\r
   EFI_PCI_IO_PROTOCOL   *PciIo;\r
   USB2_HC_DEV           *Ehc;\r
-  UINT64                Supports;\r
 \r
   //\r
   // Test whether the Controller handler passed in is a valid\r
@@ -1704,23 +1736,14 @@ EhcDriverBindingStop (
   }\r
 \r
   //\r
-  // Disable the USB Host Controller\r
+  // Restore original PCI attributes\r
   //\r
-  Status = PciIo->Attributes (\r
-                    PciIo,\r
-                    EfiPciIoAttributeOperationSupported,\r
-                    0,\r
-                    &Supports\r
-                    );\r
-  if (!EFI_ERROR (Status)) {\r
-    Supports &= EFI_PCI_DEVICE_ENABLE;\r
-    Status = PciIo->Attributes (\r
-                      PciIo,\r
-                      EfiPciIoAttributeOperationDisable,\r
-                      Supports,\r
-                      NULL\r
-                      );\r
-  }\r
+  PciIo->Attributes (\r
+                  PciIo,\r
+                  EfiPciIoAttributeOperationSet,\r
+                  Ehc->OriginalPciAttributes,\r
+                  NULL\r
+                  );\r
 \r
   gBS->CloseProtocol (\r
          Controller,\r
@@ -1729,7 +1752,8 @@ EhcDriverBindingStop (
          Controller\r
          );\r
 \r
-  gBS->FreePool (Ehc);\r
+  FreePool (Ehc);\r
+\r
   return EFI_SUCCESS;\r
 }\r
 \r