/** Send command SET_RELATIVE_ADDRESS to the device to set the device address. @param[in] Device A pointer to the SD_DEVICE instance. @param[out] Rca The relative device address to assign. @retval EFI_SUCCESS The request is executed successfully. @retval EFI_OUT_OF_RESOURCES The request could not be executed due to a lack of resources. @retval Others The request could not be executed successfully. **/ EFI_STATUS SdSetRca ( IN SD_DEVICE *Device, OUT UINT16 *Rca ) { EFI_STATUS Status; EFI_SD_MMC_PASS_THRU_PROTOCOL *PassThru; EFI_SD_MMC_COMMAND_BLOCK SdMmcCmdBlk; EFI_SD_MMC_STATUS_BLOCK SdMmcStatusBlk; EFI_SD_MMC_PASS_THRU_COMMAND_PACKET Packet; PassThru = Device->Private->PassThru; ZeroMem (&SdMmcCmdBlk, sizeof (SdMmcCmdBlk)); ZeroMem (&SdMmcStatusBlk, sizeof (SdMmcStatusBlk)); ZeroMem (&Packet, sizeof (Packet)); Packet.SdMmcCmdBlk = &SdMmcCmdBlk; Packet.SdMmcStatusBlk = &SdMmcStatusBlk; Packet.Timeout = SD_GENERIC_TIMEOUT; SdMmcCmdBlk.CommandIndex = SD_SET_RELATIVE_ADDR; SdMmcCmdBlk.CommandType = SdMmcCommandTypeBcr; SdMmcCmdBlk.ResponseType = SdMmcResponseTypeR6; Status = PassThru->PassThru (PassThru, Device->Slot, &Packet, NULL); if (!EFI_ERROR (Status)) { DEBUG ((EFI_D_INFO, "Set RCA succeeds with Resp0 = 0x%x\n", SdMmcStatusBlk.Resp0)); *Rca = (UINT16)(SdMmcStatusBlk.Resp0 >> 16); }