[if gte mso 9]>

Re: [edk2] Sata hdds ports not recognized

Subject: Re: [edk2] Sata hdds ports not recognized

From: "Tian, Feng" <feng.tian@intel.com>

To: "edk2-devel@lists.sourceforge.net" <edk2-devel@lists.sourceforge.net>

Date: 2012-10-18 11:03:20

1.       Even if you saw the HDD device path at UEFI shell/main screen, it doesn’t mean your bios produce ATA_PASS_THRU protocol.

 

2.    If ATA_PASS_THRU protocol is produced, you should pass 0xFFFF into GetNextPort() and 0xFFFF into GetNextDevice() to traverse all ATA devices.

Details please refer to UEFI spec 12.11 and AtaBus driver code in MdeModulePkg/Bus/Ata.

 

From: Rafael Machado [mailto:rafaelrodrigues.machado@gmail.com]
Sent: Thursday, October 18, 2012 04:09
To: edk2-devel
Subject: [edk2] Sata hdds ports not recognized

 

Hi everyone.

I'm having a problem with an sample code I've developed.

This code should display the ports and Multiports of the Sata hdds that are connected to the board.

The strange thing is that the HDD device paths are displayed at uefi main screen, but the following code does not return any port.

Another strange thig is that this code works correctly on a notebook.

The computer that it doesn't work is a server with 2 sata hdds connected to a backplane that is connected to the sata entries of the motherboard with AHCI mode enabled.

 

  Print(L"*****************\n");
 Print(L"*Ata Device Path*\n", HandleCount);
 Print(L"*****************\n");

 Status = gBS->LocateHandleBuffer(ByProtocol,
         &gEfiAtaPassThruProtocolGuid,
         NULL,
         &HandleCount,
         &HandleBuffer);


 // Checks if happen some error in the handle localization
 if (Status == EFI_SUCCESS)
 {

  Print(L"gEfiAtaPassThruProtocolGuid HandleCount: %d\n", HandleCount);

  // Loop to walk in the handles
  for (HandleIndex = 0; HandleIndex < HandleCount; HandleIndex ++)
  {
   Print(L"HandleIndex: %d\n", HandleIndex);

   Status = gBS->OpenProtocol(HandleBuffer[HandleIndex],
          &gEfiAtaPassThruProtocolGuid,
          (VOID **) &ataProtocol,
          ImageHandle,
          NULL,
          EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL);

   if(EFI_ERROR(Status))
   {
    Print(L"Status: %x\n", Status);
   }


   do {
     Status = ataProtocol->GetNextPort(ataProtocol,
             &Port);

     if(!EFI_ERROR(Status))
     {
      Status = ataProtocol->GetNextDevice(ataProtocol,
               Port,
               &PortMultiplierPort);

      if(!EFI_ERROR(Status))
      {
       Print(L"Port: %d\n",Port);
       Print(L"PortMultiplierPort: %d\n", PortMultiplierPort);
       Print(L"-----------------------------------\n");
      }
     }

   }while(!EFI_ERROR(Status));

  }
 }
 else
 {
  Print(L"Status: %x\n", Status);
 }

 

Any idea ?

Thanks everyone.

Rafael R. Machado