From 6eee9f9daf8aa3260e868291c5e32f1b8eee0d70 Mon Sep 17 00:00:00 2001 From: Atharva Kulkarni Date: Fri, 21 Apr 2023 16:14:31 +0530 Subject: [PATCH] [SCSIPORT] Flush and Free Map Registers (#5190) - Flush Map registers once the DMA completes - Free Map registers once the DMA completes - Add support for SGL allocated from NonPagedPool Test: Force Allocations of SGL from Non Paged Pool and ensure OS boots and functions properly Test Logs: SpiAdapterControlFORCING ALLOCATION FROM SGPOOL SpiAdapterControlFORCING ALLOCATION FROM SGPOOL SpiAdapterControlFORCING ALLOCATION FROM SGPOOL SpiAdapterControlFORCING ALLOCATION FROM SGPOOL SpiAdapterControlFORCING ALLOCATION FROM SGPOOL SpiAdapterControlFORCING ALLOCATION FROM SGPOOL DHCPCSVC: Adapter Name: [{7cd69ac0-dabb-410a-b927-cb3961d174da}] (dynamic) SpiAdapterControlFORCING ALLOCATION FROM SGPOOL WARNING: HalCalculateScatterGatherListSize at hal\halx86\generic\dma.c:1168 is UNIMPLEMENTED! SpiAdapterControlFORCING ALLOCATION FROM SGPOOL SpiAdapterControlFORCING ALLOCATION FROM SGPOO --- drivers/storage/port/scsiport/scsi.c | 34 +++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/drivers/storage/port/scsiport/scsi.c b/drivers/storage/port/scsiport/scsi.c index 056e2bb8328..42efbeca821 100644 --- a/drivers/storage/port/scsiport/scsi.c +++ b/drivers/storage/port/scsiport/scsi.c @@ -653,7 +653,6 @@ SpiProcessCompletedRequest( PSCSI_PORT_LUN_EXTENSION LunExtension; LONG Result; PIRP Irp; - //ULONG SequenceNumber; Srb = SrbInfo->Srb; Irp = Srb->OriginalRequest; @@ -681,10 +680,25 @@ SpiProcessCompletedRequest( } /* Flush adapter if needed */ - if (SrbInfo->BaseOfMapRegister) + if (SrbInfo->BaseOfMapRegister && SrbInfo->ScatterGather) { - /* TODO: Implement */ - ASSERT(FALSE); + ULONG transferLen = 0; + BOOLEAN isWrite = !!(Srb->SrbFlags & SRB_FLAGS_DATA_OUT); + ULONG i; + + for (i = 0; + i < SrbInfo->NumberOfMapRegisters && transferLen < Srb->DataTransferLength; + i++) + { + transferLen += SrbInfo->ScatterGather[i].Length; + } + + IoFlushAdapterBuffers(DeviceExtension->AdapterObject, + Irp->MdlAddress, + SrbInfo->BaseOfMapRegister, + Srb->DataBuffer, + transferLen, + isWrite); } /* Clear the request */ @@ -718,8 +732,16 @@ SpiProcessCompletedRequest( /* Scatter/gather */ if (Srb->SrbFlags & SRB_FLAGS_SGLIST_FROM_POOL) { - /* TODO: Implement */ - ASSERT(FALSE); + ExFreePoolWithTag(SrbInfo->ScatterGather, TAG_SCSIPORT); + SrbInfo->ScatterGather = NULL; + } + + /* Free Map Registers */ + if (SrbInfo->NumberOfMapRegisters) + { + IoFreeMapRegisters(DeviceExtension->AdapterObject, + SrbInfo->BaseOfMapRegister, + SrbInfo->NumberOfMapRegisters); } /* Acquire spinlock (we're freeing SrbExtension) */