From: Jeremy Linton <jeremy.linton@arm.com>
To: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Cc: "edk2-devel@lists.01.org" <edk2-devel@lists.01.org>,
Leif Lindholm <leif.lindholm@linaro.org>,
Ryan Harkin <ryan.harkin@linaro.org>,
linaro-uefi <linaro-uefi@lists.linaro.org>,
Steve Capper <Steve.Capper@arm.com>
Subject: Re: [PATCH v3 3/7] EmbeddedPkg: SiI3132: Add ScsiProtocol callbacks
Date: Thu, 2 Mar 2017 19:05:46 -0600 [thread overview]
Message-ID: <ced00c50-193f-27d9-0dea-22c964b634f9@arm.com> (raw)
In-Reply-To: <CAKv+Gu-fL1=HxmWMNbsVTaTp9Ue36zVpSDy-7cKKB0=v4YdoYg@mail.gmail.com>
Hi,
On 02/24/2017 11:08 AM, Ard Biesheuvel wrote:
> On 23 February 2017 at 22:33, Jeremy Linton <jeremy.linton@arm.com> wrote:
>> Create a new module that adds the callbacks to support
>> the EFI SCSI pass-through protocol. These callbacks
>> wrap around the existing ATA pass-through callbacks.
>> In particular the SCSI command submission routine takes
>> the SCSI command and wraps it with an SATA FIS and
>> sets the protocol to ATAPI. It then forwards the FIS to
>> a new routine we will break out of the ATA pass-through
>> callback that manages the FIS submission to the adapter.
>>
>> Contributed-under: TianoCore Contribution Agreement 1.0
>> Signed-off-by: Jeremy Linton <jeremy.linton@arm.com>
>> ---
>> .../Drivers/SataSiI3132Dxe/SiI3132ScsiPassThru.c | 431 +++++++++++++++++++++
>> 1 file changed, 431 insertions(+)
>> create mode 100644 EmbeddedPkg/Drivers/SataSiI3132Dxe/SiI3132ScsiPassThru.c
>>
>> diff --git a/EmbeddedPkg/Drivers/SataSiI3132Dxe/SiI3132ScsiPassThru.c b/EmbeddedPkg/Drivers/SataSiI3132Dxe/SiI3132ScsiPassThru.c
>> new file mode 100644
>> index 0000000..6858426
>> --- /dev/null
>> +++ b/EmbeddedPkg/Drivers/SataSiI3132Dxe/SiI3132ScsiPassThru.c
>> @@ -0,0 +1,431 @@
>> +/** @file
>> +* ATAPI support for the Silicon Image I3132
>> +*
>> +* Copyright (c) 2016, ARM Limited. All rights reserved.
>> +*
>
> 2017?
>
>> +* This program and the accompanying materials
>> +* are licensed and made available under the terms and conditions of the BSD License
>> +* which accompanies this distribution. The full text of the license may be found at
>> +* http://opensource.org/licenses/bsd-license.php
>> +*
>> +* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
>> +* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
>> +*
>> +**/
>> +
>> +
>> +#include "SataSiI3132.h"
>> +
>> +#include <IndustryStandard/Atapi.h>
>> +#include <IndustryStandard/Scsi.h>
>> +#include <Library/MemoryAllocationLib.h>
>> +
>
> STATIC?
>
>> +EFI_STATUS
>> +SiI3132IDiscoverAtapi (
>> + IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
>> + IN INT32 Port
>> + )
>> +{
>> + SATA_SI3132_INSTANCE *SataInstance;
>> + SATA_SI3132_PORT *SataPort;
>> + EFI_ATA_PASS_THRU_COMMAND_PACKET Packet;
>> + ATA_IDENTIFY_DATA *Data;
>> + EFI_STATUS Status;
>> + EFI_ATA_STATUS_BLOCK *Asb;
>> + EFI_ATA_COMMAND_BLOCK *Acb;
>> +
>> + SataInstance = INSTANCE_FROM_SCSIPASSTHRU_THIS (This);
>> + SataPort = &SataInstance->Ports[Port];
>> +
>> + Asb=AllocateAlignedPages (EFI_SIZE_TO_PAGES (sizeof (EFI_ATA_STATUS_BLOCK)), EFI_PAGE_SIZE);
>> + Acb=AllocateAlignedPages (EFI_SIZE_TO_PAGES (sizeof (EFI_ATA_COMMAND_BLOCK)), EFI_PAGE_SIZE);
>> + Data=AllocateAlignedPages (EFI_SIZE_TO_PAGES (sizeof (ATA_IDENTIFY_DATA)), EFI_PAGE_SIZE);
>
> Apologies if I did not spot this the first time around, but page
> allocations are always page aligned so no point in using the 'aligned'
> flavor here
>
> And please use spaces before and after =
I'm sort of blind to most low level code formatting after many years
staring at dozens of formats. Anyway, I though the updated patch checker
had caught all of them. I just did a global search to find and fix them.
>
>> + ZeroMem (Acb, sizeof (EFI_ATA_COMMAND_BLOCK));
>> + Acb->AtaCommand = ATA_CMD_IDENTIFY_DEVICE;
>> + Acb->AtaDeviceHead = (UINT8) (BIT7 | BIT6 | BIT5 );
>> +
>> + ZeroMem (&Packet, sizeof (EFI_ATA_PASS_THRU_COMMAND_PACKET));
>> + Packet.Acb=Acb;
>> + Packet.Asb=Asb;
>
> Same here
>
>> + Packet.InDataBuffer = Data;
>> + Packet.InTransferLength = sizeof (ATA_IDENTIFY_DATA);
>> + Packet.Protocol = EFI_ATA_PASS_THRU_PROTOCOL_PIO_DATA_IN;
>> + Packet.Length = EFI_ATA_PASS_THRU_LENGTH_BYTES | EFI_ATA_PASS_THRU_LENGTH_SECTOR_COUNT;
>> +
>> + Status = SiI3132AtaPassThruCommand (SataInstance, SataPort, 0, &Packet, NULL);
>> + if (EFI_ERROR (Status)) {
>> + DEBUG ((DEBUG_WARN, "SiI ATAPI IDENTIFY DEVICE FAILURE %d\n", Status));
>> + }
>> + else
>> + {
>
> } else {
>
>> + Data->ModelName[39]=0;
>> + }
>> +
>> + FreeAlignedPages (Data, EFI_SIZE_TO_PAGES (sizeof (ATA_IDENTIFY_DATA)));
>> + FreeAlignedPages (Acb, EFI_SIZE_TO_PAGES (sizeof (EFI_ATA_COMMAND_BLOCK)));
>> + FreeAlignedPages (Asb, EFI_SIZE_TO_PAGES (sizeof (EFI_ATA_STATUS_BLOCK)));
>> +
>> + return Status;
>> +}
>> +
>
> STATIC?
>
>> +EFI_STATUS
>> +SiI3132ScsiPassRead (
>> + IN SATA_SI3132_INSTANCE *SataInstance,
>> + IN SATA_SI3132_PORT *SataPort,
>> + IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet)
>> +{
>> + EFI_STATUS Status;
>> + EFI_PCI_IO_PROTOCOL *PciIo;
>> + VOID* PciAllocMapping;
>> + EFI_PHYSICAL_ADDRESS PhysBuffer;
>> + UINTN InDataBufferLength;
>> + VOID *AtaSense;
>> + BOOLEAN RequestSense;
>> +
>> + Status = EFI_SUCCESS;
>> + PciIo = SataInstance->PciIo;
>> + PciAllocMapping = NULL;
>> + InDataBufferLength = Packet->InTransferLength;
>> + AtaSense = AllocateAlignedPages (EFI_SIZE_TO_PAGES (sizeof (EFI_ATA_STATUS_BLOCK)),
>
> AllocatePages()
>
>> + EFI_PAGE_SIZE);;
>
> Double ;;
>
>> + RequestSense = FALSE;
>> +
>> + DEBUG ((DEBUG_VERBOSE, "SiI3132ScsiPassRead() CDB[0]:%X len=%d\n",
>> + ((UINT8*)Packet->Cdb)[0], Packet->InTransferLength));
>> +
>> + if (AtaSense) {
>> + if (Packet->InTransferLength) {
>
> != 0 and != NULL are more idiomatic for EDK2
>
>> + Status = PciIo->Map (SataInstance->PciIo, EfiPciIoOperationBusMasterRead,
>> + Packet->InDataBuffer, &InDataBufferLength,
>> + &PhysBuffer, &PciAllocMapping);
>> +
>> + if (EFI_ERROR (Status)) {
>> + DEBUG ((DEBUG_ERROR, "SiI map() failure %d\n", Status));
>> + return Status;
>> + }
>> + } else {
>> + PhysBuffer=0;
>
> Spaces
>
>> + }
>> + do {
>> + // SI "The host driver must populate the area normaly used for the first SGE
>> + // with the desired ATAPI command". AKA, put the SCSI CDB itself (not the address)
>> + // in the 12 bytes comprising the SGE[0].
>> + ZeroMem (&SataPort->HostPRB->Sge[0], sizeof (SATA_SI3132_SGE));
>> + CopyMem (&SataPort->HostPRB->Sge[0], (UINT8*)Packet->Cdb, Packet->CdbLength);
>> +
>> + // The SGE for the data buffer
>> + SataPort->HostPRB->Sge[1].DataAddressLow = (UINT64)PhysBuffer;
>> + SataPort->HostPRB->Sge[1].DataAddressHigh = ((UINT64)(PhysBuffer) >> 32);
>> + SataPort->HostPRB->Sge[1].Attributes = SGE_TRM;
>> + SataPort->HostPRB->Sge[1].DataCount = Packet->InTransferLength;
>> +
>> + // Create the ATA FIS
>> + SataPort->HostPRB->Control = (Packet->InTransferLength ? PRB_CTRL_PKT_READ:0);
>
> Fine to use () with a ternary but not in this way. Also, spaces around :
>
>> + SataPort->HostPRB->ProtocolOverride = 0;
>> +
>> + // This is an ATA PACKET command, which encapuslates the ATAPI(sorta SCSI) command
>> + SataPort->HostPRB->Fis.FisType = SII_FIS_REGISTER_H2D; // Register - Host to Device FIS
>> + SataPort->HostPRB->Fis.Control = SII_FIS_CONTROL_CMD; // Is a command
>> + SataPort->HostPRB->Fis.Command = ATA_CMD_PACKET;
>> + SataPort->HostPRB->Fis.Features = 1;
>> + SataPort->HostPRB->Fis.Fis[0] = 0;
>> + SataPort->HostPRB->Fis.Fis[1] = (UINT8) (((UINT64)PhysBuffer) & 0x00ff);
>> + SataPort->HostPRB->Fis.Fis[2] = (UINT8) (((UINT64)PhysBuffer) >> 8);
>> + SataPort->HostPRB->Fis.Fis[3] = 0x40;
>> +
>> + // Issue this as an ATA command
>> + Status = SiI3132IssueCommand (SataPort, PciIo, Packet->Timeout, AtaSense);
>> +
>> + if (RequestSense) {
>> + // If we were trying to send a request sense in response to a failure
>> + // Check conditions are a normal part of SCSI operation, its expected
>> + // that most devices will do a 6/2900 (reset) and 2/2800 (media change)
>> + // at startup.
>> + UINT8 *sense;
>> +
>
> Sense
I've removed the whole print the error sense block.
>
>> + sense = (UINT8 *)Packet->SenseData;
>> + RequestSense=FALSE;
>
> Spaces
>
>> + Packet->InTransferLength = 0;
>> + Packet->HostAdapterStatus = EFI_EXT_SCSI_STATUS_HOST_ADAPTER_OK;
>> + Packet->TargetStatus = EFI_EXT_SCSI_STATUS_TARGET_CHECK_CONDITION;
>> + if ((Packet->SenseDataLength > 13) &&
>
> What's a '13' ?
>
>> + (sense[0] & EFI_SCSI_REQUEST_SENSE_ERROR)) {
>> + DEBUG ((DEBUG_INFO, "SiI3132ScsiPassRead() Key %X ASC(Q) %02X%02X\n",
>> + EFI_SCSI_SK_VALUE (sense[2]), sense[12], sense[13]));
>> + }
>> + Status = EFI_SUCCESS;
>> + } else if (!EFI_ERROR (Status)) {
>> + Packet->HostAdapterStatus = EFI_EXT_SCSI_STATUS_HOST_ADAPTER_OK;
>> + Packet->TargetStatus = EFI_EXT_SCSI_STATUS_TARGET_GOOD;
>> + ZeroMem (Packet->SenseData, Packet->SenseDataLength);
>> + Packet->SenseDataLength = 0;
>> + } else if (Status == EFI_TIMEOUT) {
>> + SiI3132HwResetPort (SataPort);
>> + Packet->HostAdapterStatus = EFI_EXT_SCSI_STATUS_HOST_ADAPTER_OTHER;
>> + Packet->SenseDataLength = 0;
>> + Packet->InTransferLength = 0;
>> + } else {
>> + // Assume for now, that if we didn't succeed that it was a check condition.
>> + // ATAPI can't autosense on SiI, so lets emulate it with an explicit
>> + // request sense into the sense buffer.
>> + Packet->HostAdapterStatus = EFI_EXT_SCSI_STATUS_HOST_ADAPTER_OTHER;
>> + if ((RequestSense == FALSE) && (Packet->SenseDataLength)) {
>> + if (Packet->SenseDataLength >= SI_MAX_SENSE) {
>> + Packet->SenseDataLength = SI_MAX_SENSE - 1;
>> + }
>> + Packet->CdbLength = 6; //Request Sense is a 6 byte CDB
>> + ZeroMem (Packet->Cdb, SI_MAX_CDB);
>> + ((char*)Packet->Cdb)[0] = EFI_SCSI_OP_REQUEST_SENSE;
>> + ((char*)Packet->Cdb)[4] = Packet->SenseDataLength;
>> +
>> + ZeroMem (SataPort->HostPRB, sizeof (SATA_SI3132_PRB));
>> + if (PciAllocMapping) {
>> + PciIo->Unmap (PciIo, PciAllocMapping);
>> + }
>> +
>> + Packet->InTransferLength = Packet->SenseDataLength;
>> + InDataBufferLength = Packet->SenseDataLength;
>> + Status = PciIo->Map (SataInstance->PciIo, EfiPciIoOperationBusMasterRead,
>> + Packet->SenseData, &InDataBufferLength, &PhysBuffer, &PciAllocMapping);
>> + if (EFI_ERROR (Status)) {
>> + DEBUG ((DEBUG_ERROR, "SiI map() sense failure %d\n", Status));
>> + Packet->SenseDataLength = 0;
>> + } else {
>> + // Everything seems ok, lets issue a SCSI sense
>> + RequestSense = TRUE;
>> + }
>> + }
>> + }
>> + } while (RequestSense);
>> +
>> + if (PciAllocMapping) {
>> + PciIo->Unmap (PciIo, PciAllocMapping);
>> + }
>> + } else {
>> + DEBUG ((DEBUG_ERROR, "SCSI PassThru Unable to allocate sense buffer\n"));
>> + Status = EFI_OUT_OF_RESOURCES;
>> + }
>> + return Status;
>> +}
>> +
>> +EFI_STATUS
>> +SiI3132ScsiPassThru (
>> + IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
>> + IN UINT8 *Target,
>> + IN UINT64 Lun,
>> + IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet,
>> + IN EFI_EVENT Event OPTIONAL
>> + )
>> +{
>> + EFI_STATUS Status;
>> + SATA_SI3132_INSTANCE *SataInstance;
>> + SATA_SI3132_PORT *SataPort;
>> +
>> + Status = EFI_SUCCESS;
>> + SataInstance = INSTANCE_FROM_SCSIPASSTHRU_THIS (This);
>> + SataPort = &SataInstance->Ports[Target[0]];
>> + ZeroMem (SataPort->HostPRB, sizeof (SATA_SI3132_PRB));
>> +
>> + switch (Packet->DataDirection) {
>> + case EFI_EXT_SCSI_DATA_DIRECTION_READ:
>> + Status = SiI3132ScsiPassRead (SataInstance,SataPort, Packet);
>> + break;
>> + case EFI_EXT_SCSI_DATA_DIRECTION_WRITE:
>> + // TODO, fill this in if we ever want to connect something
>> + // besides a simple CDROM/DVDROM
>
> I think this is fine for now
>
>> + default:
>> + DEBUG ((DEBUG_ERROR, "SCSI PassThru Unsupported direction\n"));
>> + }
>> +
>> + return Status;
>> +}
>> +
>> +UINT8 mScsiId[TARGET_MAX_BYTES] = {
>
> STATIC?
>
>> + 0xFF, 0xFF, 0xFF, 0xFF,
>> + 0xFF, 0xFF, 0xFF, 0xFF,
>> + 0xFF, 0xFF, 0xFF, 0xFF,
>> + 0xFF, 0xFF, 0xFF, 0xFF
>> +};
>> +
>> +// With ATA, there are potentially three levels of addressing: port, portmultiplier, lun
>> +// although I'm not sure there are any actual multilun devices anymore (cd autoloaders/etc)
>> +// on ATA the common disk/cdroms generally are single lun devices. So, lets skip the LUN
>> +// scanning/addressing. Futher, the standard ATAPI spec doesn't support lun's.
>> +EFI_STATUS
>> +SiI3132GetNextTargetLun (
>> + IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
>> + IN OUT UINT8 **Target,
>> + IN OUT UINT64 *Lun
>> + )
>> +{
>> + EFI_STATUS Status;
>> + SATA_SI3132_INSTANCE *SataInstance;
>> + UINT8 *Target8;
>> +
>> + Status = EFI_NOT_FOUND;
>> + SataInstance = INSTANCE_FROM_SCSIPASSTHRU_THIS (This);
>> + DEBUG ((DEBUG_INFO, "SCSI GetNextTargetLun L:%d\n",*Lun));
>> + if (!SataInstance) {
>> + DEBUG ((DEBUG_ERROR, "SCSI GetNextTargetLun no instance\n",Lun));
>> + return EFI_INVALID_PARAMETER;
>> + }
>> +
>> + if (Target == NULL || Lun == NULL) {
>> + return EFI_INVALID_PARAMETER;
>> + }
>> + if (*Target == NULL) {
>> + return EFI_INVALID_PARAMETER;
>> + }
>> +
>> + if (*Lun > 0) {
>> + DEBUG ((DEBUG_ERROR, "SCSI GetNextTargetLun Only supports lun0 at the moment\n",Lun));
>> + return EFI_INVALID_PARAMETER;
>> + }
>> +
>> + Target8 = *Target;
>> +
>> + // look for first device
>> + if (CompareMem (Target8, mScsiId, TARGET_MAX_BYTES) == 0) {
>> + BOOLEAN Found;
>> + INT32 Index;
>> +
>> + Found = FALSE;
>> + Target8 = *Target;
>> + for (Index = 0; ((Index < SATA_SII3132_MAXPORT) && (!Found)); Index++) {
>> + SATA_SI3132_PORT *SataPort;
>> + LIST_ENTRY *List;
>> + INT32 Multiplier;
>> +
>> + SataPort = &(SataInstance->Ports[Index]);
>> + List = SataPort->Devices.ForwardLink;
>> + Multiplier = 0;
>> + while ((List != &SataPort->Devices) && (!Found)) {
>> + SATA_SI3132_DEVICE* SataDevice;
>
> Please move this to the top
>
>> +
>> + SataDevice = (SATA_SI3132_DEVICE*)List;
>> + if (SataDevice->Atapi) {
>> + Found = TRUE;
>> + Target8[0] = Index;
>> + Target8[1] = Multiplier; //the device on this port (for port multipliers)
>> + DEBUG ((DEBUG_INFO, "SCSI GetNextTargetLun found device at %d %d\n",Index,Multiplier));
>> + SiI3132IDiscoverAtapi (This, Index);
>> +
>> + Status = EFI_SUCCESS;
>> + break;
>> + }
>> + List = List->ForwardLink;
>> + Multiplier++;
>> + }
>> + }
>> + } else {
>> + //todo find the next device,
>
> What does this mean? In what way does this limit the current functionality?
I think my original plan was to scan LUNs there but that is sort of
pointless as it actually violates the spec AFAIK.
>
>> + }
>> +
>> + return Status;
>> +}
>> +
>> +EFI_STATUS
>> +SiI3132GetNextTargetLun2 (
>> + IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
>> + IN UINT8 *Target,
>> + IN UINT64 Lun,
>> + IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath
>> + )
>> +{
>> + EFI_STATUS Status;
>> +
>> + Status = EFI_SUCCESS;
>> + DEBUG ((DEBUG_INFO, "SCSI GetNextTargetLun2\n"));
>> + return Status;
>> +}
>> +
>
> This has an OUT parameter, and you are returning success. This means
> the caller may try to dereference the pointer in *DevicePath,
> potentially causing a crash
I think this is a dead function at this point (see next item).
>
>> +EFI_STATUS
>> +SiI3132ScsiBuildDevicePath (
>> + IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
>> + IN UINT8 *Target,
>> + IN UINT64 Lun,
>> + IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath
>> + )
>> +{
>> + SATA_SI3132_INSTANCE *SataInstance;
>> +
>> + SataInstance = INSTANCE_FROM_SCSIPASSTHRU_THIS (This);
>> + DEBUG ((DEBUG_INFO, "SCSI BuildDevicePath T:%d L:%d\n",*Target,Lun));
>> +
>> + if (Lun<1) {
>> + return SiI3132BuildDevicePath (&SataInstance->AtaPassThruProtocol, Target[0], Target[1], DevicePath);
>> + }
>> + return EFI_NOT_FOUND;
>> +}
>> +
>> +EFI_STATUS
>> +SiI3132GetTargetLun (
>> + IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
>> + IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
>> + OUT UINT8 **Target,
>> + OUT UINT64 *Lun
>> + )
>> +{
>> + EFI_STATUS Status;
>> +
>> + Status = EFI_SUCCESS;
>> + DEBUG ((DEBUG_INFO, "SCSI GetNextTarget T:%d L:%d\n",*Target,Lun));
>> + return Status;
>> +}
>> +
>
> Same here
This sent me digging up the spec, because I actually thought those were
basically IN/OUT parameters and it says that I should actually be
verifying they are !=NULL before writing into them. So, I should tweak
that too. Oddly, it should probably be resetting the target/lun to 0.
This likely is a real bug if more than one ATAPI device is connected.
>
>> +// So normally we would want to do a ATA port reset here (which is generally
>> +// frowned on with modern SCSI transports (sas, fc, etc) unless all the
>> +// attached devices are in an error state). But the EFI SCSI protocol isn't
>> +// specific enough to specify a device for which we want to reset the port.
>> +// This means we are basically stuck simulating it by resetting all the ports
>> +// which is bad karma. So lets just claim its unsupported and if we discover
>> +// that port resets are needed as part of the target/lun reset then consider
>> +// doing it automatically as part of that path.
>> +EFI_STATUS
>> +SiI3132ResetChannel (
>> + IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This
>> + )
>> +{
>> + EFI_STATUS Status;
>> + Status = EFI_UNSUPPORTED;
>> +
>> + DEBUG ((DEBUG_ERROR, "SCSI ResetChannel\n"));
>> + return Status;
>> +}
>> +
>> +// Just do a device reset here, in the future if we find out that is insufficient
>> +// try to just reset the SATA port the device is attached to as well.
>> +EFI_STATUS
>> +SiI3132ResetTargetLun (
>> + IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
>> + IN UINT8 *Target,
>> + IN UINT64 Lun
>> + )
>> +{
>> + EFI_STATUS Status;
>> + SATA_SI3132_INSTANCE *SataInstance;
>> +
>> + Status = EFI_NOT_FOUND;
>> + SataInstance = INSTANCE_FROM_SCSIPASSTHRU_THIS (This);
>> +
>> + DEBUG ((DEBUG_ERROR, "SCSI ResetTargetLun\n"));
>> +
>> + if (Lun<1) {
>> + Status = SiI3132ResetDevice (&SataInstance->AtaPassThruProtocol,
>> + Target[0], Target[1]);
>> + }
>> + return Status;
>> +}
>> +
>> +EFI_STATUS
>> +SiI3132GetNextTarget (
>> + IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
>> + IN OUT UINT8 **Target
>> + )
>> +{
>> + EFI_STATUS Status;
>> +
>> + Status = EFI_SUCCESS;
>> + DEBUG ((DEBUG_VERBOSE, "SCSI GetNextTarget\n"));
>> + return Status;
>> +}
>> --
>> 2.9.3
>>
next prev parent reply other threads:[~2017-03-03 1:06 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-02-23 22:33 [PATCH v3 0/7] ATAPI support on SiI SATA adapter Jeremy Linton
2017-02-23 22:33 ` [PATCH v3 1/7] EmbeddedPkg: SiI3132: Note that ARM is using this Dxe Jeremy Linton
2017-02-23 22:33 ` [PATCH v3 2/7] MdePkg IndustryStandard/Scsi.h: Add sense code macro Jeremy Linton
2017-02-24 6:42 ` Tian, Feng
2017-02-24 18:23 ` Jeremy Linton
2017-02-23 22:33 ` [PATCH v3 3/7] EmbeddedPkg: SiI3132: Add ScsiProtocol callbacks Jeremy Linton
2017-02-24 17:08 ` Ard Biesheuvel
2017-03-03 1:05 ` Jeremy Linton [this message]
2017-02-23 22:33 ` [PATCH v3 4/7] EmbeddedPkg: SiI3132: Add SCSI protocol support to header Jeremy Linton
2017-02-24 17:09 ` Ard Biesheuvel
2017-02-23 22:33 ` [PATCH v3 5/7] EmbeddedPkg: SiI3132: Break out FIS command submission Jeremy Linton
2017-02-23 22:33 ` [PATCH v3 6/7] EmbeddedPkg: SiI3132: Cleanup device node creation Jeremy Linton
2017-02-23 22:33 ` [PATCH v3 7/7] EmbeddedPkg: SiI3132: Enable SCSI pass-through protocol Jeremy Linton
2017-02-23 22:33 ` [PATCH] Platforms/ARM/Juno: Add " Jeremy Linton
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ced00c50-193f-27d9-0dea-22c964b634f9@arm.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox