]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EdkModulePkg/Bus/Pci/IdeBus/Dxe/idebus.c
fix a typo in a comment
[mirror_edk2.git] / EdkModulePkg / Bus / Pci / IdeBus / Dxe / idebus.c
index e5157dab70831fd838144e51e4c09b914ceff9f5..0e7d43eeb9a0475e0b2d3e603a3bb96809895217 100644 (file)
@@ -26,7 +26,7 @@ EFI_DRIVER_BINDING_PROTOCOL gIDEBusDriverBinding = {
   IDEBusDriverBindingSupported,\r
   IDEBusDriverBindingStart,\r
   IDEBusDriverBindingStop,\r
-  0x10,\r
+  0xa,\r
   NULL,\r
   NULL\r
 };\r
@@ -91,7 +91,7 @@ IDEBusDriverBindingSupported (
   }\r
  \r
   //\r
-  // Clsoe protocol, don't use device path protocol in the .Support() function\r
+  // Close protocol, don't use device path protocol in the .Support() function\r
   //\r
   gBS->CloseProtocol (\r
         Controller,\r
@@ -181,7 +181,6 @@ IDEBusDriverBindingStart (
   UINT16                            CommandBlockBaseAddr;\r
   UINT16                            ControlBlockBaseAddr;\r
   UINTN                             DataSize;\r
-  UINT32                            Attributes;\r
   IDE_BUS_DRIVER_PRIVATE_DATA       *IdeBusDriverPrivateData;\r
 \r
   //\r
@@ -190,7 +189,6 @@ IDEBusDriverBindingStart (
   EFI_IDE_CONTROLLER_INIT_PROTOCOL  *IdeInit;\r
   BOOLEAN                           EnumAll;\r
   BOOLEAN                           ChannelEnabled;\r
-  UINT8                             ChannelCount;\r
   UINT8                             MaxDevices;\r
   EFI_IDENTIFY_DATA                 IdentifyData;\r
   EFI_ATA_COLLECTIVE_MODE           *SupportedModes;\r
@@ -240,10 +238,9 @@ IDEBusDriverBindingStart (
   }\r
 \r
   //\r
-  // Save Enumall and ChannelCount. Step7.2\r
+  // Save Enumall. Step7.2\r
   //\r
   EnumAll       = IdeInit->EnumAll;\r
-  ChannelCount  = IdeInit->ChannelCount;\r
 \r
   //\r
   // Consume PCI I/O protocol. Note that the OpenProtocol with _GET_PROTOCOL\r
@@ -316,7 +313,7 @@ IDEBusDriverBindingStart (
   Status = gRT->GetVariable (\r
                   (CHAR16 *) L"Configuration",\r
                   &gEfiCallerIdGuid,\r
-                  &Attributes,\r
+                  NULL,\r
                   &DataSize,\r
                   &ConfigurationOptions\r
                   );\r
@@ -416,6 +413,12 @@ IDEBusDriverBindingStart (
               EfiIdeBusBeforeDevicePresenceDetection,\r
               IdeChannel\r
               );\r
+\r
+    //\r
+    // Prepare to detect IDE device of this channel\r
+    //\r
+    InitializeIDEChannelData ();\r
+\r
     //\r
     // -- 1st inner loop --- Master/Slave ------------  Step14\r
     //\r
@@ -448,8 +451,8 @@ IDEBusDriverBindingStart (
       ZeroMem (IdeBlkIoDevicePtr, sizeof (IDE_BLK_IO_DEV));\r
 \r
       IdeBlkIoDevicePtr->Signature  = IDE_BLK_IO_DEV_SIGNATURE;\r
-      IdeBlkIoDevicePtr->Channel    = IdeChannel;\r
-      IdeBlkIoDevicePtr->Device     = IdeDevice;\r
+      IdeBlkIoDevicePtr->Channel    = (EFI_IDE_CHANNEL) IdeChannel;\r
+      IdeBlkIoDevicePtr->Device     = (EFI_IDE_DEVICE) IdeDevice;\r
 \r
       //\r
       // initialize Block IO interface's Media pointer\r
@@ -487,6 +490,19 @@ IDEBusDriverBindingStart (
       IdeBlkIoDevicePtr->IdeBusDriverPrivateData = IdeBusDriverPrivateData;\r
       IdeBlkIoDevicePtr->IoPort->BusMasterBaseAddr = IdeRegsBaseAddr[IdeChannel].BusMasterBaseAddr;\r
 \r
+      //\r
+      // Report Status code: is about to detect IDE drive\r
+      //\r
+      REPORT_STATUS_CODE_EX (\r
+        EFI_PROGRESS_CODE,\r
+        (EFI_IO_BUS_ATA_ATAPI | EFI_P_PC_PRESENCE_DETECT),\r
+        0,\r
+        &gEfiCallerIdGuid,\r
+        NULL,\r
+        NULL,\r
+        0\r
+      );\r
+\r
       //\r
       // Discover device, now!\r
       //\r
@@ -522,7 +538,6 @@ IDEBusDriverBindingStart (
         // Submit identify data to IDE controller init driver\r
         //\r
         CopyMem (&IdentifyData, IdeBlkIoDevicePtr->pIdData, sizeof (IdentifyData));\r
-        // IdentifyData  = *IdeBlkIoDevicePtr->pIdData;\r
         IdeBusDriverPrivateData->DeviceFound[IdeChannel * 2 + IdeDevice] = TRUE;\r
         IdeInit->SubmitData (IdeInit, IdeChannel, IdeDevice, &IdentifyData);\r
       } else {\r
@@ -649,7 +664,7 @@ IDEBusDriverBindingStart (
       //\r
       // Record PIO mode used in private data\r
       //\r
-      IdeBlkIoDevicePtr->PioMode = SupportedModes->PioMode.Mode;\r
+      IdeBlkIoDevicePtr->PioMode = (ATA_PIO_MODE) SupportedModes->PioMode.Mode;\r
 \r
       //\r
       // Set IDE controller Timing Blocks in the PCI Configuration Space\r
@@ -696,6 +711,18 @@ IDEBusDriverBindingStart (
         (EFI_IO_BUS_ATA_ATAPI | EFI_P_PC_ENABLE),\r
         IdeBlkIoDevicePtr->DevicePath\r
         );\r
+      \r
+      //\r
+      // Create event to clear pending IDE interrupt\r
+      //\r
+      Status = gBS->CreateEvent (\r
+                      EFI_EVENT_SIGNAL_EXIT_BOOT_SERVICES,\r
+                      EFI_TPL_NOTIFY,\r
+                      ClearInterrupt,\r
+                      IdeBlkIoDevicePtr,\r
+                      &IdeBlkIoDevicePtr->ExitBootServiceEvent\r
+                      );\r
+\r
       //\r
       // end of 2nd inner loop ----\r
       //\r
@@ -1014,7 +1041,8 @@ IDEBlkIoReset (
   //\r
   // for ATA device, using ATA reset method\r
   //\r
-  if (IdeBlkIoDevice->Type == IdeHardDisk) {\r
+  if (IdeBlkIoDevice->Type == IdeHardDisk ||\r
+      IdeBlkIoDevice->Type == Ide48bitAddressingHardDisk) {\r
     return AtaSoftReset (IdeBlkIoDevice);\r
   }\r
 \r