Author: ekohl Date: Wed Sep 8 10:39:37 2010 New Revision: 48723
URL: http://svn.reactos.org/svn/reactos?rev=48723&view=rev Log: [SCSIPORT] Implement RequestTimerCall-Notification. This is used by uniata.
Modified: trunk/reactos/drivers/storage/scsiport/scsiport.c trunk/reactos/drivers/storage/scsiport/scsiport_int.h
Modified: trunk/reactos/drivers/storage/scsiport/scsiport.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/storage/scsiport/sc... ============================================================================== --- trunk/reactos/drivers/storage/scsiport/scsiport.c [iso-8859-1] (original) +++ trunk/reactos/drivers/storage/scsiport/scsiport.c [iso-8859-1] Wed Sep 8 10:39:37 2010 @@ -1994,7 +1994,10 @@ break;
case RequestTimerCall: - DPRINT1("UNIMPLEMENTED SCSI Notification called: RequestTimerCall!\n"); + DPRINT("Notify: RequestTimerCall\n"); + DeviceExtension->InterruptData.Flags |= SCSI_PORT_TIMER_NEEDED; + DeviceExtension->InterruptData.HwScsiTimer = (PHW_TIMER)va_arg(ap, PHW_TIMER); + DeviceExtension->InterruptData.MiniportTimerValue = (ULONG)va_arg(ap, ULONG); break;
case BusChangeDetected: @@ -4802,6 +4805,7 @@ PSCSI_PORT_LUN_EXTENSION LunExtension; BOOLEAN NeedToStartIo; PSCSI_REQUEST_BLOCK_INFO SrbInfo; + LARGE_INTEGER TimerValue;
DPRINT("ScsiPortDpcForIsr(Dpc %p DpcDeviceObject %p DpcIrp %p DpcContext %p)\n", Dpc, DpcDeviceObject, DpcIrp, DpcContext); @@ -4842,10 +4846,26 @@ }
/* Check if timer is needed */ - if (InterruptData.Flags & SCIS_PORT_TIMER_NEEDED) - { - /* TODO: Implement */ - ASSERT(FALSE); + if (InterruptData.Flags & SCSI_PORT_TIMER_NEEDED) + { + /* Save the timer routine */ + DeviceExtension->HwScsiTimer = InterruptData.HwScsiTimer; + + if (InterruptData.MiniportTimerValue == 0) + { + /* Cancel the timer */ + KeCancelTimer(&DeviceExtension->MiniportTimer); + } + else + { + /* Convert timer value */ + TimerValue.QuadPart = Int32x32To64(InterruptData.MiniportTimerValue, -10); + + /* Set the timer */ + KeSetTimer(&DeviceExtension->MiniportTimer, + TimerValue, + &DeviceExtension->MiniportTimerDpc); + } }
/* If it's ready for the next request */ @@ -5599,8 +5619,31 @@ IN PVOID SystemArgument1, IN PVOID SystemArgument2) { - DPRINT1("Miniport timer DPC\n"); - ASSERT(FALSE); + PSCSI_PORT_DEVICE_EXTENSION DeviceExtension; + + DPRINT("Miniport timer DPC\n"); + + DeviceExtension = ((PDEVICE_OBJECT)DeviceObject)->DeviceExtension; + + /* Acquire the spinlock */ + KeAcquireSpinLockAtDpcLevel(&DeviceExtension->SpinLock); + + /* Call the timer routine */ + if (DeviceExtension->HwScsiTimer != NULL) + { + DeviceExtension->HwScsiTimer(&DeviceExtension->MiniPortDeviceExtension); + } + + /* Release the spinlock */ + KeReleaseSpinLockFromDpcLevel(&DeviceExtension->SpinLock); + + if (DeviceExtension->InterruptData.Flags & SCSI_PORT_NOTIFICATION_NEEDED) + { + ScsiPortDpcForIsr(NULL, + DeviceExtension->DeviceObject, + NULL, + NULL); + } }
static NTSTATUS
Modified: trunk/reactos/drivers/storage/scsiport/scsiport_int.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/storage/scsiport/sc... ============================================================================== --- trunk/reactos/drivers/storage/scsiport/scsiport_int.h [iso-8859-1] (original) +++ trunk/reactos/drivers/storage/scsiport/scsiport_int.h [iso-8859-1] Wed Sep 8 10:39:37 2010 @@ -36,7 +36,7 @@ #define SCSI_PORT_DISABLE_INT_REQUESET 0x2000 #define SCSI_PORT_DISABLE_INTERRUPTS 0x4000 #define SCSI_PORT_ENABLE_INT_REQUEST 0x8000 -#define SCIS_PORT_TIMER_NEEDED 0x10000 +#define SCSI_PORT_TIMER_NEEDED 0x10000
/* LUN Extension flags*/ #define LUNEX_FROZEN_QUEUE 0x0001 @@ -182,6 +182,8 @@ PSCSI_REQUEST_BLOCK_INFO CompletedRequests; /* Linked list of Srb info data */ PSCSI_PORT_LUN_EXTENSION CompletedAbort; PSCSI_PORT_LUN_EXTENSION ReadyLun; + PHW_TIMER HwScsiTimer; + ULONG MiniportTimerValue; } SCSI_PORT_INTERRUPT_DATA, *PSCSI_PORT_INTERRUPT_DATA;
@@ -257,6 +259,7 @@ PHW_INTERRUPT HwInterrupt; PHW_RESET_BUS HwResetBus; PHW_DMA_STARTED HwDmaStarted; + PHW_TIMER HwScsiTimer;
PSCSI_REQUEST_BLOCK OriginalSrb; SCSI_REQUEST_BLOCK InternalSrb;