Removed useless controller object.

svn path=/trunk/; revision=2657
This commit is contained in:
Eric Kohl 2002-02-27 22:50:31 +00:00
parent b764471786
commit e96e35d335

View file

@ -16,7 +16,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/* $Id: scsiport.c,v 1.5 2002/02/03 20:21:59 ekohl Exp $
/* $Id: scsiport.c,v 1.6 2002/02/27 22:50:31 ekohl Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
@ -41,6 +41,16 @@
/* TYPES *********************************************************************/
typedef enum _SCSI_PORT_TIMER_STATES
{
IDETimerIdle,
IDETimerCmdWait,
IDETimerResetWaitForBusyNegate,
IDETimerResetWaitForDrdyAssert
} SCSI_PORT_TIMER_STATES;
/*
* SCSI_PORT_DEVICE_EXTENSION
*
@ -55,6 +65,16 @@ typedef struct _SCSI_PORT_DEVICE_EXTENSION
ULONG MiniPortExtensionSize;
PORT_CONFIGURATION_INFORMATION PortConfig;
KSPIN_LOCK SpinLock;
PKINTERRUPT Interrupt;
PIRP CurrentIrp;
ULONG IrpFlags;
SCSI_PORT_TIMER_STATES TimerState;
LONG TimerCount;
BOOLEAN Initializing;
ULONG PortBusInfoSize;
PSCSI_ADAPTER_BUS_INFO PortBusInfo;
@ -75,49 +95,10 @@ typedef struct _SCSI_PORT_DEVICE_EXTENSION
* An enumeration containing the states in the timer DFA
*/
typedef enum _SCSI_PORT_TIMER_STATES
{
IDETimerIdle,
IDETimerCmdWait,
IDETimerResetWaitForBusyNegate,
IDETimerResetWaitForDrdyAssert
} SCSI_PORT_TIMER_STATES;
/*
* SCSI_PORT_CONTROLLER_EXTENSION
*
* DESCRIPTION
* Driver-defined structure used to hold miscellaneous controller information.
*
* ACCESS
* Allocated from NON-PAGED POOL
* Available at any IRQL
*/
typedef struct _SCSI_PORT_CONTROLLER_EXTENSION
{
KSPIN_LOCK SpinLock;
ULONG Number;
ULONG Vector;
BOOLEAN DMASupported;
BOOLEAN ControllerInterruptBug;
PKINTERRUPT Interrupt;
BOOLEAN OperationInProgress;
UCHAR DeviceStatus;
PSCSI_PORT_DEVICE_EXTENSION DeviceForOperation;
PIRP CurrentIrp;
ULONG Retries;
SCSI_PORT_TIMER_STATES TimerState;
LONG TimerCount;
PDEVICE_OBJECT PortDeviceObject;
PCONTROLLER_OBJECT ControllerObject;
} SCSI_PORT_CONTROLLER_EXTENSION, *PSCSI_PORT_CONTROLLER_EXTENSION;
#define IRP_FLAG_COMPLETE 0x00000001
#define IRP_FLAG_NEXT 0x00000002
/* GLOBALS *******************************************************************/
@ -156,6 +137,9 @@ ScsiPortCreatePortDevice(IN PDRIVER_OBJECT DriverObject,
IN PSCSI_PORT_DEVICE_EXTENSION PseudoDeviceExtension,
IN ULONG PortCount);
static VOID
ScsiPortInquire(PSCSI_PORT_DEVICE_EXTENSION DeviceExtension);
static BOOLEAN STDCALL
ScsiPortIsr(IN PKINTERRUPT Interrupt,
IN PVOID ServiceContext);
@ -170,9 +154,6 @@ static VOID STDCALL
ScsiPortIoTimer(PDEVICE_OBJECT DeviceObject,
PVOID Context);
static VOID
ScsiPortFinishOperation(PSCSI_PORT_CONTROLLER_EXTENSION ControllerExtension);
/* FUNCTIONS *****************************************************************/
@ -593,22 +574,31 @@ ScsiPortNotification(IN SCSI_NOTIFICATION_TYPE NotificationType,
IN PVOID HwDeviceExtension,
...)
{
PSCSI_PORT_DEVICE_EXTENSION DevExt;
PSCSI_PORT_CONTROLLER_EXTENSION ControllerExt;
PSCSI_PORT_DEVICE_EXTENSION DeviceExtension;
DPRINT1("ScsiPortNotification() called\n");
DevExt = (PSCSI_PORT_DEVICE_EXTENSION)((PUCHAR)HwDeviceExtension - sizeof(SCSI_PORT_DEVICE_EXTENSION));
ControllerExt = (PSCSI_PORT_CONTROLLER_EXTENSION)DevExt->ControllerObject->ControllerExtension;
DeviceExtension = CONTAINING_RECORD(HwDeviceExtension,
SCSI_PORT_DEVICE_EXTENSION,
MiniPortDeviceExtension);
DPRINT1("DeviceExtension %p\n", DeviceExtension);
DPRINT1("Initializing = %s\n", (DeviceExtension->Initializing)?"TRUE":"FALSE");
if (DeviceExtension->Initializing == TRUE)
return;
switch (NotificationType)
{
case RequestComplete:
IoCompleteRequest(ControllerExt->CurrentIrp, IO_NO_INCREMENT);
DPRINT1("Notify: RequestComplete\n");
DeviceExtension->IrpFlags |= IRP_FLAG_COMPLETE;
break;
case NextRequest:
IoStartNextPacket(DevExt->DeviceObject, FALSE);
DPRINT1("Notify: NextRequest\n");
DeviceExtension->IrpFlags |= IRP_FLAG_NEXT;
break;
default:
@ -716,11 +706,13 @@ ScsiPortDispatchScsi(IN PDEVICE_OBJECT DeviceObject,
ULONG DataSize = 0;
DPRINT("ScsiPortDispatchScsi()\n");
DPRINT1("ScsiPortDispatchScsi()\n");
DeviceExtension = DeviceObject->DeviceExtension;
Stack = IoGetCurrentIrpStackLocation(Irp);
DeviceExtension->IrpFlags = 0;
switch(Stack->Parameters.DeviceIoControl.IoControlCode)
{
case IOCTL_SCSI_EXECUTE_IN:
@ -767,14 +759,21 @@ ScsiPortDispatchScsi(IN PDEVICE_OBJECT DeviceObject,
switch (Srb->Cdb[0])
{
#if 0
case SCSIOP_INQUIRY:
case SCSIOP_READ_CAPACITY:
Status = DeviceExtension->HwStartIo(&DeviceExtension->MiniPortDeviceExtension,
Srb);
DeviceExtension->Initializing = TRUE;
if(DeviceExtension->HwStartIo(&DeviceExtension->MiniPortDeviceExtension,
Srb) == TRUE)
Status = STATUS_SUCCESS;
else
Status = STATUS_UNSUCCESSFUL;
DeviceExtension->Initializing = FALSE;
break;
#endif
default:
DPRINT1("Starting packet!\n");
IoStartPacket(DeviceObject, Irp, NULL, NULL);
DPRINT1("Returning STATUS_PENDING\n");
return(STATUS_PENDING);
@ -893,7 +892,7 @@ ScsiPortDeviceControl(IN PDEVICE_OBJECT DeviceObject,
PIO_STACK_LOCATION Stack;
PSCSI_PORT_DEVICE_EXTENSION DeviceExtension;
DPRINT("ScsiPortDeviceControl()\n");
DPRINT1("ScsiPortDeviceControl()\n");
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = 0;
@ -931,90 +930,14 @@ ScsiPortDeviceControl(IN PDEVICE_OBJECT DeviceObject,
case IOCTL_SCSI_GET_INQUIRY_DATA:
{
PSCSI_ADAPTER_BUS_INFO AdapterInfo;
PSCSI_INQUIRY_DATA UnitInfo, PrevUnit;
SCSI_REQUEST_BLOCK Srb;
ULONG Bus;
ULONG Target;
ULONG UnitCount;
ULONG DataSize;
BOOLEAN Result;
DPRINT(" IOCTL_SCSI_GET_INQUIRY_DATA\n");
DPRINT1(" IOCTL_SCSI_GET_INQUIRY_DATA\n");
/* Copy inquiry data to the port device extension */
if (DeviceExtension->PortBusInfo == NULL)
{
AdapterInfo =(PSCSI_ADAPTER_BUS_INFO)Irp->AssociatedIrp.SystemBuffer;
AdapterInfo->NumberOfBuses = DeviceExtension->PortConfig.NumberOfBuses;
memcpy(Irp->AssociatedIrp.SystemBuffer,
DeviceExtension->PortBusInfo,
DeviceExtension->PortBusInfoSize);
UnitInfo = (PSCSI_INQUIRY_DATA)
((PUCHAR)AdapterInfo + sizeof(SCSI_ADAPTER_BUS_INFO) +
(sizeof(SCSI_BUS_DATA) * (AdapterInfo->NumberOfBuses - 1)));
Srb.DataBuffer = ExAllocatePool(NonPagedPool, 256);
RtlZeroMemory(&Srb,
sizeof(SCSI_REQUEST_BLOCK));
Srb.Function = SRB_FUNCTION_EXECUTE_SCSI;
Srb.DataTransferLength = 256;
Srb.Cdb[0] = SCSIOP_INQUIRY;
for (Bus = 0; Bus < AdapterInfo->NumberOfBuses; Bus++)
{
Srb.PathId = Bus;
AdapterInfo->BusData[Bus].InitiatorBusId = 0; /* ? */
AdapterInfo->BusData[Bus].InquiryDataOffset =
(ULONG)((PUCHAR)UnitInfo - (PUCHAR)AdapterInfo);
PrevUnit = NULL;
UnitCount = 0;
for (Target = 0; Target < DeviceExtension->PortConfig.MaximumNumberOfTargets; Target++)
{
Srb.TargetId = Target;
Srb.Lun = 0;
Result = DeviceExtension->HwStartIo(&DeviceExtension->MiniPortDeviceExtension,
&Srb);
if (Result == TRUE)
{
UnitInfo->PathId = Bus;
UnitInfo->TargetId = Target;
UnitInfo->Lun = 0;
UnitInfo->InquiryDataLength = INQUIRYDATABUFFERSIZE;
memcpy(&UnitInfo->InquiryData,
Srb.DataBuffer,
INQUIRYDATABUFFERSIZE);
if (PrevUnit != NULL)
PrevUnit->NextInquiryDataOffset = (ULONG)((PUCHAR)UnitInfo-(PUCHAR)AdapterInfo);
PrevUnit = UnitInfo;
UnitInfo = (PSCSI_INQUIRY_DATA)((PUCHAR)UnitInfo + sizeof(SCSI_INQUIRY_DATA)+INQUIRYDATABUFFERSIZE-1);
UnitCount++;
}
}
AdapterInfo->BusData[Bus].NumberOfLogicalUnits = UnitCount;
}
DataSize = (ULONG)((PUCHAR)UnitInfo-(PUCHAR)AdapterInfo);
ExFreePool(Srb.DataBuffer);
/* copy inquiry data to the port driver's device extension */
DeviceExtension->PortBusInfoSize = DataSize;
DeviceExtension->PortBusInfo = ExAllocatePool(NonPagedPool,
DataSize);
memcpy(DeviceExtension->PortBusInfo,
AdapterInfo,
DataSize);
}
else
{
memcpy(Irp->AssociatedIrp.SystemBuffer,
DeviceExtension->PortBusInfo,
DeviceExtension->PortBusInfoSize);
}
DPRINT("BufferSize: %lu\n", DeviceExtension->PortBusInfoSize);
DPRINT1("BufferSize: %lu\n", DeviceExtension->PortBusInfoSize);
Irp->IoStatus.Information = DeviceExtension->PortBusInfoSize;
}
break;
@ -1079,19 +1002,30 @@ ScsiPortStartIo(IN PDEVICE_OBJECT DeviceObject,
Srb = IrpStack->Parameters.Scsi.Srb;
DPRINT("DeviceExtension %p\n", DeviceExtension);
DPRINT("DeviceExtension->ControllerObject %p\n", DeviceExtension->ControllerObject);
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = Srb->DataTransferLength;
IoMarkIrpPending(Irp);
KeRaiseIrql(DISPATCH_LEVEL,
&OldIrql);
IoAllocateController(DeviceExtension->ControllerObject,
DeviceObject,
ScsiPortAllocateController,
Irp);
KeLowerIrql(OldIrql);
DeviceExtension->CurrentIrp = Irp;
if (!KeSynchronizeExecution(DeviceExtension->Interrupt,
ScsiPortStartController,
DeviceExtension))
{
DPRINT1("Synchronization failed!\n");
Irp->IoStatus.Status = STATUS_NOT_SUPPORTED;
Irp->IoStatus.Information = 0;
IoCompleteRequest(Irp,
IO_NO_INCREMENT);
IoStartNextPacket(DeviceObject,
FALSE);
}
if (DeviceExtension->IrpFlags | IRP_FLAG_COMPLETE)
IoCompleteRequest(Irp, IO_NO_INCREMENT);
if (DeviceExtension->IrpFlags | IRP_FLAG_NEXT)
IoStartNextPacket(DeviceObject, FALSE);
}
break;
@ -1108,47 +1042,18 @@ ScsiPortStartIo(IN PDEVICE_OBJECT DeviceObject,
}
static IO_ALLOCATION_ACTION STDCALL
ScsiPortAllocateController(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN PVOID MapRegisterBase,
IN PVOID Context)
{
PSCSI_PORT_DEVICE_EXTENSION DeviceExtension;
PSCSI_PORT_CONTROLLER_EXTENSION ControllerExtension;
DPRINT("ScsiPortAllocateController() called\n");
DeviceExtension = (PSCSI_PORT_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
ControllerExtension = (PSCSI_PORT_CONTROLLER_EXTENSION)
DeviceExtension->ControllerObject->ControllerExtension;
ControllerExtension->CurrentIrp = Irp;
ControllerExtension->Retries = 0;
return(KeSynchronizeExecution(ControllerExtension->Interrupt,
ScsiPortStartController,
DeviceExtension) ? KeepObject :
DeallocateObject);
}
static BOOLEAN STDCALL
ScsiPortStartController(IN OUT PVOID Context)
{
PSCSI_PORT_DEVICE_EXTENSION DeviceExtension;
PSCSI_PORT_CONTROLLER_EXTENSION ControllerExtension;
PIO_STACK_LOCATION IrpStack;
PSCSI_REQUEST_BLOCK Srb;
DPRINT("ScsiPortStartController() called\n");
DPRINT1("ScsiPortStartController() called\n");
DeviceExtension = (PSCSI_PORT_DEVICE_EXTENSION) Context;
ControllerExtension = (PSCSI_PORT_CONTROLLER_EXTENSION)
DeviceExtension->ControllerObject->ControllerExtension;
ControllerExtension->OperationInProgress = TRUE;
ControllerExtension->DeviceForOperation = DeviceExtension;
DeviceExtension = (PSCSI_PORT_DEVICE_EXTENSION)Context;
IrpStack = IoGetCurrentIrpStackLocation(ControllerExtension->CurrentIrp);
IrpStack = IoGetCurrentIrpStackLocation(DeviceExtension->CurrentIrp);
Srb = IrpStack->Parameters.Scsi.Srb;
return(DeviceExtension->HwStartIo(&DeviceExtension->MiniPortDeviceExtension,
@ -1185,8 +1090,6 @@ ScsiPortCreatePortDevice(IN PDRIVER_OBJECT DriverObject,
IN PSCSI_PORT_DEVICE_EXTENSION PseudoDeviceExtension,
IN ULONG PortNumber)
{
PSCSI_PORT_CONTROLLER_EXTENSION ControllerExtension;
PCONTROLLER_OBJECT ControllerObject;
PSCSI_PORT_DEVICE_EXTENSION PortDeviceExtension;
PDEVICE_OBJECT PortDeviceObject;
WCHAR NameBuffer[80];
@ -1202,7 +1105,7 @@ ScsiPortCreatePortDevice(IN PDRIVER_OBJECT DriverObject,
KAFFINITY Affinity;
#endif
DPRINT("ScsiPortCreatePortDevice() called\n");
DPRINT1("ScsiPortCreatePortDevice() called\n");
#if 0
MappedIrq = HalGetInterruptVector(PseudoDeviceExtension->PortConfig.AdapterInterfaceType,
@ -1213,47 +1116,6 @@ ScsiPortCreatePortDevice(IN PDRIVER_OBJECT DriverObject,
&Affinity);
#endif
ControllerObject = IoCreateController(sizeof(SCSI_PORT_CONTROLLER_EXTENSION));
if (ControllerObject == NULL)
{
DbgPrint("Could not create controller object for port %d\n",
PortNumber);
return(STATUS_NO_SUCH_DEVICE);
}
/* Fill out Controller extension data */
ControllerExtension = (PSCSI_PORT_CONTROLLER_EXTENSION)
ControllerObject->ControllerExtension;
ControllerExtension->ControllerObject = ControllerObject;
ControllerExtension->Number = PortNumber;
ControllerExtension->Vector = PseudoDeviceExtension->PortConfig.BusInterruptVector;
ControllerExtension->DMASupported = FALSE;
ControllerExtension->ControllerInterruptBug = FALSE;
ControllerExtension->OperationInProgress = FALSE;
/* Initialize the spin lock in the controller extension */
KeInitializeSpinLock(&ControllerExtension->SpinLock);
/* Register an interrupt handler for this controller */
Status = IoConnectInterrupt(&ControllerExtension->Interrupt,
ScsiPortIsr,
ControllerExtension,
&ControllerExtension->SpinLock,
PseudoDeviceExtension->PortConfig.BusInterruptVector, // MappedIrq,
PseudoDeviceExtension->PortConfig.BusInterruptLevel, // Dirql,
15, //Dirql,
PseudoDeviceExtension->PortConfig.InterruptMode,
FALSE,
0xFFFF, //Affinity,
FALSE);
if (!NT_SUCCESS(Status))
{
DbgPrint("Could not Connect Interrupt %d\n",
ControllerExtension->Vector);
IoDeleteController (ControllerObject);
return(Status);
}
/* Create a unicode device name */
swprintf(NameBuffer,
L"\\Device\\ScsiPort%lu",
@ -1274,8 +1136,6 @@ ScsiPortCreatePortDevice(IN PDRIVER_OBJECT DriverObject,
if (!NT_SUCCESS(Status))
{
DbgPrint("IoCreateDevice call failed! (Status 0x%lX)\n", Status);
IoDisconnectInterrupt(ControllerExtension->Interrupt);
IoDeleteController(ControllerObject);
return(Status);
}
@ -1301,29 +1161,53 @@ ScsiPortCreatePortDevice(IN PDRIVER_OBJECT DriverObject,
PseudoDeviceExtension->PortConfig.AccessRanges,
AccessRangeSize);
/* Store pointers to controller object and port device object */
PortDeviceExtension->ControllerObject = ControllerObject;
PortDeviceExtension->DeviceObject = PortDeviceObject;
ControllerExtension->PortDeviceObject = PortDeviceObject;
/* Initialize the spin lock in the controller extension */
KeInitializeSpinLock(&PortDeviceExtension->SpinLock);
/* Register an interrupt handler for this device */
Status = IoConnectInterrupt(&PortDeviceExtension->Interrupt,
ScsiPortIsr,
PortDeviceExtension,
&PortDeviceExtension->SpinLock,
PortDeviceExtension->PortConfig.BusInterruptVector, // MappedIrq,
PortDeviceExtension->PortConfig.BusInterruptLevel, // Dirql,
15, //Dirql,
PortDeviceExtension->PortConfig.InterruptMode,
FALSE,
0xFFFF, //Affinity,
FALSE);
if (!NT_SUCCESS(Status))
{
DbgPrint("Could not Connect Interrupt %d\n",
PortDeviceExtension->PortConfig.BusInterruptVector);
return(Status);
}
/* Initialize the DPC object here */
IoInitializeDpcRequest(ControllerExtension->PortDeviceObject,
IoInitializeDpcRequest(PortDeviceExtension->DeviceObject,
ScsiPortDpcForIsr);
/*
* Initialize the controller timer here
* (since it has to be tied to a device)
*/
ControllerExtension->TimerState = IDETimerIdle;
ControllerExtension->TimerCount = 0;
IoInitializeTimer(ControllerExtension->PortDeviceObject,
PortDeviceExtension->TimerState = IDETimerIdle;
PortDeviceExtension->TimerCount = 0;
IoInitializeTimer(PortDeviceExtension->DeviceObject,
ScsiPortIoTimer,
ControllerExtension);
PortDeviceExtension);
/* Initialize inquiry data */
PortDeviceExtension->PortBusInfoSize = 0;
PortDeviceExtension->PortBusInfo = NULL;
DPRINT1("DeviceExtension %p\n", PortDeviceExtension);
ScsiPortInquire(PortDeviceExtension);
/* FIXME: Copy more configuration data? */
/* Create the dos device */
@ -1340,18 +1224,101 @@ ScsiPortCreatePortDevice(IN PDRIVER_OBJECT DriverObject,
}
static VOID
ScsiPortInquire(PSCSI_PORT_DEVICE_EXTENSION DeviceExtension)
{
PSCSI_ADAPTER_BUS_INFO AdapterInfo;
PSCSI_INQUIRY_DATA UnitInfo, PrevUnit;
SCSI_REQUEST_BLOCK Srb;
ULONG Bus;
ULONG Target;
ULONG UnitCount;
ULONG DataSize;
BOOLEAN Result;
DPRINT1("ScsiPortInquire() called\n");
DeviceExtension->Initializing = TRUE;
/* Copy inquiry data to the port device extension */
AdapterInfo =(PSCSI_ADAPTER_BUS_INFO)ExAllocatePool(NonPagedPool, 4096);
AdapterInfo->NumberOfBuses = DeviceExtension->PortConfig.NumberOfBuses;
UnitInfo = (PSCSI_INQUIRY_DATA)
((PUCHAR)AdapterInfo + sizeof(SCSI_ADAPTER_BUS_INFO) +
(sizeof(SCSI_BUS_DATA) * (AdapterInfo->NumberOfBuses - 1)));
Srb.DataBuffer = ExAllocatePool(NonPagedPool, 256);
RtlZeroMemory(&Srb,
sizeof(SCSI_REQUEST_BLOCK));
Srb.Function = SRB_FUNCTION_EXECUTE_SCSI;
Srb.DataTransferLength = 256;
Srb.Cdb[0] = SCSIOP_INQUIRY;
for (Bus = 0; Bus < AdapterInfo->NumberOfBuses; Bus++)
{
Srb.PathId = Bus;
AdapterInfo->BusData[Bus].InitiatorBusId = 0; /* ? */
AdapterInfo->BusData[Bus].InquiryDataOffset =
(ULONG)((PUCHAR)UnitInfo - (PUCHAR)AdapterInfo);
PrevUnit = NULL;
UnitCount = 0;
for (Target = 0; Target < DeviceExtension->PortConfig.MaximumNumberOfTargets; Target++)
{
Srb.TargetId = Target;
Srb.Lun = 0;
Result = DeviceExtension->HwStartIo(&DeviceExtension->MiniPortDeviceExtension,
&Srb);
if (Result == TRUE)
{
UnitInfo->PathId = Bus;
UnitInfo->TargetId = Target;
UnitInfo->Lun = 0;
UnitInfo->InquiryDataLength = INQUIRYDATABUFFERSIZE;
memcpy(&UnitInfo->InquiryData,
Srb.DataBuffer,
INQUIRYDATABUFFERSIZE);
if (PrevUnit != NULL)
PrevUnit->NextInquiryDataOffset = (ULONG)((PUCHAR)UnitInfo-(PUCHAR)AdapterInfo);
PrevUnit = UnitInfo;
UnitInfo = (PSCSI_INQUIRY_DATA)((PUCHAR)UnitInfo + sizeof(SCSI_INQUIRY_DATA)+INQUIRYDATABUFFERSIZE-1);
UnitCount++;
}
}
AdapterInfo->BusData[Bus].NumberOfLogicalUnits = UnitCount;
}
DataSize = (ULONG)((PUCHAR)UnitInfo-(PUCHAR)AdapterInfo);
ExFreePool(Srb.DataBuffer);
DeviceExtension->Initializing = FALSE;
/* copy inquiry data to the port driver's device extension */
DeviceExtension->PortBusInfoSize = DataSize;
DeviceExtension->PortBusInfo = ExAllocatePool(NonPagedPool,
DataSize);
memcpy(DeviceExtension->PortBusInfo,
AdapterInfo,
DataSize);
ExFreePool(AdapterInfo);
}
static BOOLEAN STDCALL
ScsiPortIsr(IN PKINTERRUPT Interrupt,
IN PVOID ServiceContext)
{
PSCSI_PORT_CONTROLLER_EXTENSION ControllerExtension;
PSCSI_PORT_DEVICE_EXTENSION DeviceExtension;
BOOLEAN Result;
DPRINT1("ScsiPortIsr() called!\n");
ControllerExtension = (PSCSI_PORT_CONTROLLER_EXTENSION)ServiceContext;
DeviceExtension = ControllerExtension->DeviceForOperation;
DeviceExtension = (PSCSI_PORT_DEVICE_EXTENSION)ServiceContext;
Result = DeviceExtension->HwInterrupt(&DeviceExtension->MiniPortDeviceExtension);
if (Result == FALSE)
@ -1359,9 +1326,9 @@ ScsiPortIsr(IN PKINTERRUPT Interrupt,
return(FALSE);
}
IoRequestDpc(ControllerExtension->PortDeviceObject,
ControllerExtension->CurrentIrp,
ControllerExtension);
IoRequestDpc(DeviceExtension->DeviceObject,
DeviceExtension->CurrentIrp,
DeviceExtension);
return(TRUE);
}
@ -1384,8 +1351,21 @@ ScsiPortDpcForIsr(IN PKDPC Dpc,
IN PIRP DpcIrp,
IN PVOID DpcContext)
{
PSCSI_PORT_DEVICE_EXTENSION DeviceExtension;
DPRINT1("ScsiPortDpcForIsr()\n");
ScsiPortFinishOperation((PSCSI_PORT_CONTROLLER_EXTENSION) DpcContext);
DeviceExtension = (PSCSI_PORT_DEVICE_EXTENSION)DpcContext;
DeviceExtension->CurrentIrp = NULL;
DpcIrp->IoStatus.Information = 0;
DpcIrp->IoStatus.Status = STATUS_SUCCESS;
IoCompleteRequest(DpcIrp,
IO_NO_INCREMENT);
IoStartNextPacket(DpcDeviceObject,
FALSE);
}
@ -1404,47 +1384,7 @@ static VOID STDCALL
ScsiPortIoTimer(PDEVICE_OBJECT DeviceObject,
PVOID Context)
{
DPRINT("ScsiPortIoTimer()\n");
}
static VOID
ScsiPortFinishOperation(PSCSI_PORT_CONTROLLER_EXTENSION ControllerExtension)
{
PSCSI_PORT_DEVICE_EXTENSION DeviceExtension;
PIRP Irp;
ULONG Operation;
DPRINT1("ScsiPortFinishOperation()\n");
DeviceExtension = ControllerExtension->DeviceForOperation;
Irp = ControllerExtension->CurrentIrp;
// Operation = DeviceExtension->Operation;
ControllerExtension->OperationInProgress = FALSE;
ControllerExtension->DeviceForOperation = NULL;
ControllerExtension->CurrentIrp = NULL;
/* Deallocate the controller */
IoFreeController(DeviceExtension->ControllerObject);
/* Issue completion of the current packet */
IoCompleteRequest(Irp,
IO_DISK_INCREMENT);
/* Start the next packet */
IoStartNextPacket(DeviceExtension->DeviceObject,
FALSE);
#if 0
/* Flush cache if necessary */
if (Operation == IRP_MJ_READ)
{
KeFlushIoBuffers(Irp->MdlAddress,
TRUE,
FALSE);
}
#endif
DPRINT1("ScsiPortIoTimer()\n");
}
/* EOF */