}
else
{
+ NT_ASSERT(Srb->SrbStatus == SRB_STATUS_PENDING);
Srb->SrbStatus = SRB_STATUS_SUCCESS;
StorPortNotification(RequestComplete, AdapterExtension, Srb);
}
Srb->SrbStatus = DeviceReportLuns(AdapterExtension, Srb, cdb);
break;
case SCSIOP_READ_CAPACITY:
- case SCSIOP_READ_CAPACITY16:
Srb->SrbStatus = DeviceRequestCapacity(AdapterExtension, Srb, cdb);
break;
+ case SCSIOP_TEST_UNIT_READY:
+ Srb->SrbStatus = DeviceRequestComplete(AdapterExtension, Srb, cdb);
+ break;
case SCSIOP_READ:
//case SCSIOP_WRITE:
Srb->SrbStatus = DeviceRequestReadWrite(AdapterExtension, Srb, cdb);
break;
default:
AhciDebugPrint("\tOperationCode: %d\n", cdb->CDB10.OperationCode);
- Srb->SrbStatus = SRB_STATUS_BAD_FUNCTION;
+ Srb->SrbStatus = SRB_STATUS_INVALID_REQUEST;
break;
}
}
{
StorPortNotification(RequestComplete, AdapterExtension, Srb);
}
+ else
+ {
+ AhciProcessIO(AdapterExtension, Srb->PathId, Srb);
+ }
return TRUE;
}// -- AhciHwStartIo();
PortExtension->DeviceParams.RemovableDevice = 1;
}
- if (IdentifyDeviceData->CommandSetSupport.BigLba && IdentifyDeviceData->CommandSetActive.BigLba)
+ if ((IdentifyDeviceData->CommandSetSupport.BigLba) && (IdentifyDeviceData->CommandSetActive.BigLba))
{
PortExtension->DeviceParams.Lba48BitMode = 1;
}
__in PCDB Cdb
)
{
- ULONG64 SectorNo;
BOOLEAN IsReading;
+ ULONG64 StartOffset;
PAHCI_SRB_EXTENSION SrbExtension;
PAHCI_PORT_EXTENSION PortExtension;
ULONG DataTransferLength, BytesPerSector, SectorCount;
ROUND_UP(DataTransferLength, BytesPerSector);
SectorCount = DataTransferLength / BytesPerSector;
- SectorNo = AhciGetLba(Cdb);
+ StartOffset = AhciGetLba(Cdb, Srb->CdbLength);
IsReading = (Cdb->CDB10.OperationCode == SCSIOP_READ);
NT_ASSERT(SectorCount > 0);
}
SrbExtension->FeaturesLow = 0;
- SrbExtension->LBA0 = (SectorNo >> 0) & 0xFF;
- SrbExtension->LBA1 = (SectorNo >> 8) & 0xFF;
- SrbExtension->LBA2 = (SectorNo >> 16) & 0xFF;
+ SrbExtension->LBA0 = (StartOffset >> 0) & 0xFF;
+ SrbExtension->LBA1 = (StartOffset >> 8) & 0xFF;
+ SrbExtension->LBA2 = (StartOffset >> 16) & 0xFF;
SrbExtension->Device = (0xA0 | IDE_LBA_MODE);
SrbExtension->Flags |= ATA_FLAGS_48BIT_COMMAND;
SrbExtension->CommandReg = IDE_COMMAND_READ_DMA_EXT;
- SrbExtension->LBA3 = (SectorNo >> 24) & 0xFF;
- SrbExtension->LBA4 = (SectorNo >> 32) & 0xFF;
- SrbExtension->LBA5 = (SectorNo >> 40) & 0xFF;
+ SrbExtension->LBA3 = (StartOffset >> 24) & 0xFF;
+ SrbExtension->LBA4 = (StartOffset >> 32) & 0xFF;
+ SrbExtension->LBA5 = (StartOffset >> 40) & 0xFF;
}
else
{
SrbExtension->pSgl = (PLOCAL_SCATTER_GATHER_LIST)StorPortGetScatterGatherList(AdapterExtension, Srb);
- AhciProcessIO(AdapterExtension, Srb->PathId, Srb);
return SRB_STATUS_PENDING;
}// -- DeviceRequestReadWrite();
return SRB_STATUS_SUCCESS;
}// -- DeviceRequestCapacity();
+/**
+ * @name DeviceRequestComplete
+ * @implemented
+ *
+ * Handle UnHandled Requests
+ *
+ * @param AdapterExtension
+ * @param Srb
+ * @param Cdb
+ *
+ * @return
+ * return STOR status for DeviceRequestComplete
+ */
+UCHAR DeviceRequestComplete (
+ __in PAHCI_ADAPTER_EXTENSION AdapterExtension,
+ __in PSCSI_REQUEST_BLOCK Srb,
+ __in PCDB Cdb
+ )
+{
+ AhciDebugPrint("DeviceRequestComplete()\n");
+
+ UNREFERENCED_PARAMETER(AdapterExtension);
+ UNREFERENCED_PARAMETER(Cdb);
+
+ Srb->ScsiStatus = SCSISTAT_GOOD;
+
+ return SRB_STATUS_SUCCESS;
+}// -- DeviceRequestComplete();
+
/**
* @name DeviceReportLuns
* @implemented
SrbExtension->Sgl.List[0].Length = sizeof(IDENTIFY_DEVICE_DATA);
SrbExtension->pSgl = &SrbExtension->Sgl;
-
- AhciProcessIO(AdapterExtension, Srb->PathId, Srb);
return SRB_STATUS_PENDING;
}
else
return (PAHCI_SRB_EXTENSION)(SrbExtension + Offset);
}// -- PAHCI_SRB_EXTENSION();
-
+/**
+ * @name AhciGetLba
+ * @implemented
+ *
+ * Find the logical address of demand block from Cdb
+ *
+ * @param Srb
+ *
+ * @return
+ * return Logical Address of the block
+ *
+ */
__inline
ULONG64
AhciGetLba (
- __in PCDB Cdb
+ __in PCDB Cdb,
+ __in ULONG CdbLength
)
{
ULONG64 lba = 0;
NT_ASSERT(Cdb != NULL);
+ NT_ASSERT(CdbLength != 0);
- lba |= Cdb->CDB10.LogicalBlockByte3 << 0;
- lba |= Cdb->CDB10.LogicalBlockByte2 << 8;
- lba |= Cdb->CDB10.LogicalBlockByte1 << 16;
- lba |= Cdb->CDB10.LogicalBlockByte0 << 24;
+ if (CdbLength == 0x10)
+ {
+ REVERSE_BYTES_QUAD(&lba, Cdb->CDB16.LogicalBlock);
+ }
+ else
+ {
+ lba |= Cdb->CDB10.LogicalBlockByte3 << 0;
+ lba |= Cdb->CDB10.LogicalBlockByte2 << 8;
+ lba |= Cdb->CDB10.LogicalBlockByte1 << 16;
+ lba |= Cdb->CDB10.LogicalBlockByte0 << 24;
+ }
return lba;
}// -- AhciGetLba();
\ No newline at end of file