MiniportTimer

VOID
  MiniportTimer(
       IN PVOID SystemSpecific1,
       IN PVOID FunctionContext,
       IN PVOID SystemSpecific2,
       IN PVOID SystemSpecific3
       );

MiniportTimer is a required function if a driver’s NIC does not generate interrupts. Otherwise, one or more MiniportTimer functions are optional.

Parameters

SystemSpecific1

Points to a system-specific variable, which is opaque to MiniportTimer and reserved for system use.

FunctionContext

Specifies the context pointer passed to NdisMInitializeTimer when MiniportInitialize set up the associated timer object.

SystemSpecific2

Points to a system-specific value that is reserved for system use.

SystemSpecific3

Points to a system-specific value that is reserved for system use.

Comments

The driver of a NIC that does not generate interrupts must have a MiniportTimer function to poll the state of the NIC. After such a driver’s MiniportInitialize function sets up the driver-allocated timer object with NdisMInitializeTimer, a call to NdisMSetPeriodicTimer causes the MiniportTimer function associated with the timer object to be run repeatedly and automatically at the interval specified by MillisecondsPeriod. Such a polling MiniportTimer function monitors the state of the NIC to determine when to make indications, when to complete pending sends, and so forth. In effect, such a polling MiniportTimer function has the same functionality as the MiniportHandleInterrupt function in the driver of a NIC that does generate interrupts.

By contrast, calling NdisMSetTimer causes the MiniportTimer function associated with the timer object to be run once when the given MillisecondsToDelay expires. Such a MiniportTimer function usually performs some driver-determined action if a particular operation times out.

If either type of MiniportTimer function shares resources with other driver functions, the driver should synchronize access to those resources with a spin lock.

Any NIC driver or intermediate driver can have more than one MiniportTimer function at the discretion of the driver writer. Each such MiniportTimer function must be associated with a driver-allocated and initialized timer object.

A call to NdisMCancelTimer cancels execution of a nonpolling MiniportTimer function, provided that the interval passed in the immediately preceding call to NdisMSetTimer has not yet expired. After a call to NdisMSetPeriodicTimer, a call to NdisMSetTimer or NdisMCancelTimer with the same timer object disables a polling MiniportTimer function: either the MiniportTimer function runs once, or it is canceled.

The MiniportHalt function of any driver with a MiniportTimer function should call NdisMCancelTimer to ensure that the MiniportTimer function does not attempt to access resources that MiniportHalt has already released. 

By default, MiniportTimer runs at IRQL DISPATCH_LEVEL.

See Also

MiniportHalt, MiniportInitialize, NdisAcquireSpinLock, NdisAllocateSpinLock, NdisDprAcquireSpinLock, NdisMCancelTimer, NdisMInitializeTimer, NdisMSetPeriodicTimer, NdisMSetTimer