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/s…
==============================================================================
--- 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/s…
==============================================================================
--- 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;