Thanks for the answer Isakov.
The code is this way now :

EFI_STATUS TestMain(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
{
 EFI_STATUS        Status = EFI_SUCCESS;
 EFI_ATA_PASS_THRU_PROTOCOL    *ataProtocol;
 UINT16         Port;
 UINT16         PortMultiplierPort;
 EFI_HANDLE *HandleBuffer = (EFI_HANDLE *) NULL;
 UINTN HandleCount = 0;
 UINTN HandleIndex = 0;
 Print(L"*****************\n");
 Print(L"*Ata*\n");
 Print(L"*****************\n");
 Status = gBS->LocateHandleBuffer(ByProtocol,
         &gEfiAtaPassThruProtocolGuid,
         NULL,
         &HandleCount,
         &HandleBuffer);
 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);
   Port = 0xFFFF;
   PortMultiplierPort = 0xFFFF;
   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");
      }
      else
      {
       Print(L"Status: %x\n", Status);
      }
     }
     else
     {
      Print(L"Status: %x\n", Status);
     }
   }while(!EFI_ERROR(Status));
  }
 }
 else
 {
  Print(L"Status: %x\n", Status);
 }
  return Status;
}


The prints are displaied on the following way:

*****************
*Ata*
*****************
gEfiAtaPassThruProtocolGuid HandleCount: 1
HandleIndex: 0
Status: E


The error happen because the the GetNextDevice does not find anything.
Any idea about the problem ?

As I said before, the code works correctly on a notebook with a sas hdd,
but don't work on a server with 2 sas hdds.

Thanks and Regards

PS.: should the command "dh -p AtaPassThru" return something in my case ?
This command doesn't return nothing. Neither on the server, where the code
does not work, nor on the notebook, where the code works.

Thanks everyone.
Rafael R. Machado


2012/10/18 Sergey Isakov <isakov...@bk.ru>

> No, Rafael.
> You must assign Port = 0xFFFF;  inside for() cycle, not outside.
>
> Type
> dh -b
>  to see all handles and their protocols
> Sergey
>
> On 18.10.2012, at 16:42, Rafael Machado <rafaelrodrigues.mach...@gmail.com>
> wrote:
>
> Thanks for the answers Feng and Isakov.
>
> On my first message I din't put my hole function here.
> The variables you mentioned were already declared and initialized this way:
>
>  EFI_STATUS        Status = EFI_SUCCESS;
>  EFI_ATA_PASS_THRU_PROTOCOL    *ataProtocol;
>  UINT16         Port;
>  UINT16         PortMultiplierPort;
>
>  EFI_HANDLE *HandleBuffer = (EFI_HANDLE *) NULL;
>
>  UINTN HandleCount = 0;
>  UINTN HandleIndex = 0;
>  Port = 0xFFFF;
>  PortMultiplierPort = 0xFFFF;
>
> I think probably the problem is what Feng told.
> I have two questions.
>
> First.
> I've searched for a command to  check all available protocols on a
> computer.
> I didn't find anything.
> Does any of you know if is there a command that do this kind of magic ?
> Some comand like:  shell:> list_all_available_protocols_on_this_computer
> (with a better name)
>
> Second.
> As Feng told, even if the shell main screen display the HDDs thare is a
> possibility of not having access to the ata_pass_thru_protocol. But how the
> HDDs are recognized by the system ?
>
> Thanks again everyone.
> Rafael R. Machado
>
>
>
>
>
>
> 2012/10/18 Sergey Isakov <isakov...@bk.ru>
>
>> Hi Rafael,
>>
>> Set
>> Port = 0xFFFF;
>> before
>> do {
>>
>> Regards,
>> Sergey
>>
>> On 18.10.2012, at 0:09, Rafael Machado <rafaelrodrigues.mach...@gmail.com>
>> wrote:
>>
>> 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
>>
>>
>> ------------------------------------------------------------------------------
>> Everyone hates slow websites. So do we.
>> Make your web apps faster with AppDynamics
>> Download AppDynamics Lite for free today:
>>
>> http://p.sf.net/sfu/appdyn_sfd2d_oct_______________________________________________
>> edk2-devel mailing list
>> edk2-devel@lists.sourceforge.net
>> https://lists.sourceforge.net/lists/listinfo/edk2-devel
>>
>>
>>
>>
>> ------------------------------------------------------------------------------
>> Everyone hates slow websites. So do we.
>> Make your web apps faster with AppDynamics
>> Download AppDynamics Lite for free today:
>> http://p.sf.net/sfu/appdyn_sfd2d_oct
>> _______________________________________________
>> edk2-devel mailing list
>> edk2-devel@lists.sourceforge.net
>> https://lists.sourceforge.net/lists/listinfo/edk2-devel
>>
>>
>
> ------------------------------------------------------------------------------
> Everyone hates slow websites. So do we.
> Make your web apps faster with AppDynamics
> Download AppDynamics Lite for free today:
>
> http://p.sf.net/sfu/appdyn_sfd2d_oct_______________________________________________
> edk2-devel mailing list
> edk2-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/edk2-devel
>
>
>
>
> ------------------------------------------------------------------------------
> Everyone hates slow websites. So do we.
> Make your web apps faster with AppDynamics
> Download AppDynamics Lite for free today:
> http://p.sf.net/sfu/appdyn_sfd2d_oct
> _______________________________________________
> edk2-devel mailing list
> edk2-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/edk2-devel
>
>
------------------------------------------------------------------------------
Everyone hates slow websites. So do we.
Make your web apps faster with AppDynamics
Download AppDynamics Lite for free today:
http://p.sf.net/sfu/appdyn_sfd2d_oct
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel

Reply via email to