2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS NDIS library
5 * PURPOSE: I/O related routines
6 * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net)
8 * CSH 01/08-2000 Created
14 VOID
HandleDeferredProcessing(
16 IN PVOID DeferredContext
,
17 IN PVOID SystemArgument1
,
18 IN PVOID SystemArgument2
)
20 * FUNCTION: Deferred interrupt processing routine
22 * Dpc = Pointer to DPC object
23 * DeferredContext = Pointer to context information (LOGICAL_ADAPTER)
24 * SystemArgument1 = Unused
25 * SystemArgument2 = Unused
28 PLOGICAL_ADAPTER Adapter
= GET_LOGICAL_ADAPTER(DeferredContext
);
30 /* Call the deferred interrupt service handler for this adapter */
31 (*Adapter
->Miniport
->Chars
.HandleInterruptHandler
)(Adapter
);
35 BOOLEAN
ServiceRoutine(
36 IN PKINTERRUPT Interrupt
,
37 IN PVOID ServiceContext
)
39 * FUNCTION: Interrupt service routine
41 * Interrupt = Pointer to interrupt object
42 * ServiceContext = Pointer to context information (LOGICAL_ADAPTER)
44 * TRUE if our device generated the interrupt
47 BOOLEAN InterruptRecognized
;
48 BOOLEAN QueueMiniportHandleInterrupt
;
49 PLOGICAL_ADAPTER Adapter
= GET_LOGICAL_ADAPTER(ServiceContext
);
51 /* FIXME: Support shared interrupts */
53 (*Adapter
->Miniport
->Chars
.ISRHandler
)(&InterruptRecognized
,
54 &QueueMiniportHandleInterrupt
, Adapter
);
56 if (QueueMiniportHandleInterrupt
) {
57 KeInsertQueueDpc(&Adapter
->InterruptObject
->InterruptDpc
, NULL
, NULL
);
66 NdisCompleteDmaTransfer(
67 OUT PNDIS_STATUS Status
,
68 IN PNDIS_HANDLE NdisDmaHandle
,
69 IN PNDIS_BUFFER Buffer
,
72 IN BOOLEAN WriteToDevice
)
81 IN PNDIS_BUFFER Buffer
,
82 IN BOOLEAN WriteToDevice
)
101 NdisImmediateReadPortUchar(
102 IN NDIS_HANDLE WrapperConfigurationContext
,
112 NdisImmediateReadPortUlong(
113 IN NDIS_HANDLE WrapperConfigurationContext
,
123 NdisImmediateReadPortUshort(
124 IN NDIS_HANDLE WrapperConfigurationContext
,
134 NdisImmediateWritePortUchar(
135 IN NDIS_HANDLE WrapperConfigurationContext
,
145 NdisImmediateWritePortUlong(
146 IN NDIS_HANDLE WrapperConfigurationContext
,
156 NdisImmediateWritePortUshort(
157 IN NDIS_HANDLE WrapperConfigurationContext
,
167 NdisMAllocateMapRegisters(
168 IN NDIS_HANDLE MiniportAdapterHandle
,
170 IN BOOLEAN Dma32BitAddresses
,
171 IN ULONG PhysicalMapRegistersNeeded
,
172 IN ULONG MaximumPhysicalMapping
)
176 return NDIS_STATUS_FAILURE
;
182 NdisMCompleteDmaTransfer(
183 OUT PNDIS_STATUS Status
,
184 IN PNDIS_HANDLE MiniportDmaHandle
,
185 IN PNDIS_BUFFER Buffer
,
188 IN BOOLEAN WriteToDevice
)
196 NdisMDeregisterDmaChannel(
197 IN PNDIS_HANDLE MiniportDmaHandle
)
205 NdisMDeregisterInterrupt(
206 IN PNDIS_MINIPORT_INTERRUPT Interrupt
)
208 * FUNCTION: Releases an interrupt vector
210 * Interrupt = Pointer to interrupt object
213 IoDisconnectInterrupt(Interrupt
->InterruptObject
);
219 NdisMDeregisterIoPortRange(
220 IN NDIS_HANDLE MiniportAdapterHandle
,
222 IN UINT NumberOfPorts
,
225 * FUNCTION: Releases a register mapping to I/O ports
227 * MiniportAdapterHandle = Specifies handle input to MiniportInitialize
228 * InitialPort = Bus-relative base port address of a range to be mapped
229 * NumberOfPorts = Specifies number of ports to be mapped
230 * PortOffset = Pointer to mapped base port address
239 NdisMFreeMapRegisters(
240 IN NDIS_HANDLE MiniportAdapterHandle
)
249 OUT PVOID
*VirtualAddress
,
250 IN NDIS_HANDLE MiniportAdapterHandle
,
251 IN NDIS_PHYSICAL_ADDRESS PhysicalAddress
,
256 return NDIS_STATUS_FAILURE
;
262 NdisMQueryInformationComplete(
263 IN NDIS_HANDLE MiniportAdapterHandle
,
264 IN NDIS_STATUS Status
)
273 IN NDIS_HANDLE MiniportDmaHandle
)
283 NdisMRegisterDmaChannel(
284 OUT PNDIS_HANDLE MiniportDmaHandle
,
285 IN NDIS_HANDLE MiniportAdapterHandle
,
287 IN BOOLEAN Dma32BitAddresses
,
288 IN PNDIS_DMA_DESCRIPTION DmaDescription
,
289 IN ULONG MaximumLength
)
293 return NDIS_STATUS_FAILURE
;
299 NdisMRegisterInterrupt(
300 OUT PNDIS_MINIPORT_INTERRUPT Interrupt
,
301 IN NDIS_HANDLE MiniportAdapterHandle
,
302 IN UINT InterruptVector
,
303 IN UINT InterruptLevel
,
304 IN BOOLEAN RequestIsr
,
305 IN BOOLEAN SharedInterrupt
,
306 IN NDIS_INTERRUPT_MODE InterruptMode
)
308 * FUNCTION: Claims access to an interrupt vector
310 * Interrupt = Address of interrupt object to initialize
311 * MiniportAdapterHandle = Specifies handle input to MiniportInitialize
312 * InterruptVector = Specifies bus-relative vector to register
313 * InterruptLevel = Specifies bus-relative DIRQL vector for interrupt
314 * RequestIsr = TRUE if MiniportISR should always be called
315 * SharedInterrupt = TRUE if other devices may use tha same interrupt
316 * InterruptMode = Specifies type of interrupt
318 * Status of operation
324 KAFFINITY Affinity
= 0xFFFFFFFF;
325 PLOGICAL_ADAPTER Adapter
= GET_LOGICAL_ADAPTER(MiniportAdapterHandle
);
327 RtlZeroMemory(Interrupt
, sizeof(NDIS_MINIPORT_INTERRUPT
));
329 KeInitializeSpinLock(&Interrupt
->DpcCountLock
);
331 KeInitializeDpc(&Interrupt
->InterruptDpc
, HandleDeferredProcessing
, Adapter
);
333 KeInitializeEvent(&Interrupt
->DpcsCompletedEvent
,
334 NotificationEvent
, FALSE
);
336 Interrupt
->SharedInterrupt
= SharedInterrupt
;
338 Adapter
->InterruptObject
= Interrupt
;
340 MappedIRQ
= HalGetInterruptVector(Adapter
->AdapterType
, 0,
341 InterruptLevel
, InterruptVector
, &DIrql
, &Affinity
);
343 NtStatus
= IoConnectInterrupt(&Interrupt
->InterruptObject
, ServiceRoutine
, Adapter
,
344 &Interrupt
->DpcCountLock
, MappedIRQ
, DIrql
, DIrql
, InterruptMode
,
345 SharedInterrupt
, Affinity
, FALSE
);
347 return NDIS_STATUS_SUCCESS
;
353 NdisMRegisterIoPortRange(
354 OUT PVOID
*PortOffset
,
355 IN NDIS_HANDLE MiniportAdapterHandle
,
357 IN UINT NumberOfPorts
)
359 * FUNCTION: Sets up driver access to device I/O ports
361 * PortOffset = Address of buffer to place mapped base port address
362 * MiniportAdapterHandle = Specifies handle input to MiniportInitialize
363 * InitialPort = Bus-relative base port address of a range to be mapped
364 * NumberOfPorts = Specifies number of ports to be mapped
366 * Status of operation
371 BOOLEAN ConflictDetected
;
372 PLOGICAL_ADAPTER Adapter
= GET_LOGICAL_ADAPTER(MiniportAdapterHandle
);
373 PMINIPORT_DRIVER Miniport
= Adapter
->Miniport
;
375 /* Non-PnP hardware. NT5 function */
376 NtStatus
= IoReportResourceForDetection(
377 Miniport
->DriverObject
,
384 return NDIS_STATUS_FAILURE
;
387 *PortOffset
= (PVOID
)InitialPort
;
389 return NDIS_STATUS_SUCCESS
;
396 NdisMSetInformationComplete(
397 IN NDIS_HANDLE MiniportAdapterHandle
,
398 IN NDIS_STATUS Status
)
406 NdisMSetupDmaTransfer(
407 OUT PNDIS_STATUS Status
,
408 IN PNDIS_HANDLE MiniportDmaHandle
,
409 IN PNDIS_BUFFER Buffer
,
412 IN BOOLEAN WriteToDevice
)
420 NdisMTransferDataComplete(
421 IN NDIS_HANDLE MiniportAdapterHandle
,
422 IN PNDIS_PACKET Packet
,
423 IN NDIS_STATUS Status
,
424 IN UINT BytesTransferred
)
433 IN NDIS_HANDLE MiniportAdapterHandle
,
434 IN PVOID VirtualAddress
,