From e51f406055049ecdf214ecfd0ac9885e124557b9 Mon Sep 17 00:00:00 2001 From: Aman Priyadarshi Date: Mon, 25 Jul 2016 19:50:09 +0000 Subject: [PATCH] Handled SCSIOP_MODE_SENSE, Fixes made to maxLba count. FileSystem detection is still not working :/ svn path=/branches/GSoC_2016/AHCI/; revision=71999 --- drivers/storage/storahci/storahci.c | 54 +++++++++++++++++++++++++++-- drivers/storage/storahci/storahci.h | 6 ++++ 2 files changed, 58 insertions(+), 2 deletions(-) diff --git a/drivers/storage/storahci/storahci.c b/drivers/storage/storahci/storahci.c index c556c917b74..2d0da6e55a7 100644 --- a/drivers/storage/storahci/storahci.c +++ b/drivers/storage/storahci/storahci.c @@ -845,6 +845,9 @@ AhciHwStartIo ( case SCSIOP_TEST_UNIT_READY: Srb->SrbStatus = DeviceRequestComplete(AdapterExtension, Srb, cdb); break; + case SCSIOP_MODE_SENSE: + Srb->SrbStatus = DeviceRequestSense(AdapterExtension, Srb, cdb); + break; case SCSIOP_READ: //case SCSIOP_WRITE: Srb->SrbStatus = DeviceRequestReadWrite(AdapterExtension, Srb, cdb); @@ -1687,6 +1690,54 @@ InquiryCompletion ( return; }// -- InquiryCompletion(); +/** + * @name DeviceRequestSense + * @implemented + * + * Handle SCSIOP_MODE_SENSE OperationCode + * + * @param AdapterExtension + * @param Srb + * @param Cdb + * + * @return + * return STOR status for DeviceRequestSense + */ +UCHAR DeviceRequestSense ( + __in PAHCI_ADAPTER_EXTENSION AdapterExtension, + __in PSCSI_REQUEST_BLOCK Srb, + __in PCDB Cdb + ) +{ + PMODE_PARAMETER_HEADER ModeHeader; + + AhciDebugPrint("DeviceRequestSense()\n"); + + UNREFERENCED_PARAMETER(AdapterExtension); + + NT_ASSERT(IsPortValid(AdapterExtension, Srb->PathId)); + NT_ASSERT(Cdb->CDB10.OperationCode == SCSIOP_MODE_SENSE); + + ModeHeader = (PMODE_PARAMETER_HEADER)Srb->DataBuffer; + + NT_ASSERT(ModeHeader != NULL); + + AhciZeroMemory((PCHAR)ModeHeader, Srb->DataTransferLength); + + ModeHeader->ModeDataLength = sizeof(MODE_PARAMETER_HEADER); + ModeHeader->MediumType = 0; + ModeHeader->DeviceSpecificParameter = MODE_DSP_WRITE_PROTECT; + ModeHeader->BlockDescriptorLength = 0; + + if (Cdb->MODE_SENSE.PageCode == MODE_SENSE_CURRENT_VALUES) + { + ModeHeader->ModeDataLength = sizeof(MODE_PARAMETER_HEADER) + sizeof(MODE_PARAMETER_BLOCK); + ModeHeader->BlockDescriptorLength = sizeof(MODE_PARAMETER_BLOCK); + } + + return SRB_STATUS_SUCCESS; +}// -- DeviceRequestSense(); + /** * @name DeviceRequestReadWrite * @implemented @@ -1817,9 +1868,8 @@ UCHAR DeviceRequestCapacity ( { ReadCapacity = (PREAD_CAPACITY_DATA)Srb->DataBuffer; - BytesPerLogicalSector = PortExtension->DeviceParams.BytesPerLogicalSector; - MaxLba = (ULONG)PortExtension->DeviceParams.MaxLba.QuadPart; + MaxLba = (ULONG)PortExtension->DeviceParams.MaxLba.QuadPart - 1; // I trust you windows :D NT_ASSERT(Srb->DataTransferLength >= sizeof(READ_CAPACITY_DATA)); diff --git a/drivers/storage/storahci/storahci.h b/drivers/storage/storahci/storahci.h index 4ff90dddc47..20f2e57b1a0 100644 --- a/drivers/storage/storahci/storahci.h +++ b/drivers/storage/storahci/storahci.h @@ -591,6 +591,12 @@ IsPortValid ( __in ULONG pathId ); +UCHAR DeviceRequestSense ( + __in PAHCI_ADAPTER_EXTENSION AdapterExtension, + __in PSCSI_REQUEST_BLOCK Srb, + __in PCDB Cdb + ); + UCHAR DeviceRequestReadWrite ( __in PAHCI_ADAPTER_EXTENSION AdapterExtension, __in PSCSI_REQUEST_BLOCK Srb,