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 STDCALL
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
29 PLOGICAL_ADAPTER Adapter
= GET_LOGICAL_ADAPTER(DeferredContext
);
31 NDIS_DbgPrint(MAX_TRACE
, ("Called.\n"));
33 KeAcquireSpinLockAtDpcLevel(&Adapter
->NdisMiniportBlock
.Lock
);
34 WasBusy
= Adapter
->MiniportBusy
;
35 Adapter
->MiniportBusy
= TRUE
;
36 KeReleaseSpinLockFromDpcLevel(&Adapter
->NdisMiniportBlock
.Lock
);
38 /* Call the deferred interrupt service handler for this adapter */
39 (*Adapter
->Miniport
->Chars
.HandleInterruptHandler
)(
40 Adapter
->NdisMiniportBlock
.MiniportAdapterContext
);
42 KeAcquireSpinLockAtDpcLevel(&Adapter
->NdisMiniportBlock
.Lock
);
43 if ((!WasBusy
) && (Adapter
->WorkQueueHead
)) {
44 KeInsertQueueDpc(&Adapter
->MiniportDpc
, NULL
, NULL
);
46 Adapter
->MiniportBusy
= WasBusy
;
48 KeReleaseSpinLockFromDpcLevel(&Adapter
->NdisMiniportBlock
.Lock
);
50 NDIS_DbgPrint(MAX_TRACE
, ("Leaving.\n"));
54 BOOLEAN STDCALL
ServiceRoutine(
55 IN PKINTERRUPT Interrupt
,
56 IN PVOID ServiceContext
)
58 * FUNCTION: Interrupt service routine
60 * Interrupt = Pointer to interrupt object
61 * ServiceContext = Pointer to context information (LOGICAL_ADAPTER)
63 * TRUE if a miniport controlled device generated the interrupt
66 BOOLEAN InterruptRecognized
;
67 BOOLEAN QueueMiniportHandleInterrupt
;
68 PLOGICAL_ADAPTER Adapter
= GET_LOGICAL_ADAPTER(ServiceContext
);
70 NDIS_DbgPrint(MAX_TRACE
, ("Called. Adapter (0x%X)\n", Adapter
));
72 (*Adapter
->Miniport
->Chars
.ISRHandler
)(&InterruptRecognized
,
73 &QueueMiniportHandleInterrupt
,
74 Adapter
->NdisMiniportBlock
.MiniportAdapterContext
);
76 if (QueueMiniportHandleInterrupt
) {
77 NDIS_DbgPrint(MAX_TRACE
, ("Queueing DPC.\n"));
78 KeInsertQueueDpc(&Adapter
->NdisMiniportBlock
.Interrupt
->InterruptDpc
, NULL
, NULL
);
81 NDIS_DbgPrint(MAX_TRACE
, ("Leaving.\n"));
83 return InterruptRecognized
;
92 NdisCompleteDmaTransfer(
93 OUT PNDIS_STATUS Status
,
94 IN PNDIS_HANDLE NdisDmaHandle
,
95 IN PNDIS_BUFFER Buffer
,
98 IN BOOLEAN WriteToDevice
)
110 IN PNDIS_BUFFER Buffer
,
111 IN BOOLEAN WriteToDevice
)
122 NdisGetCacheFillSize(
136 NdisImmediateReadPortUchar(
137 IN NDIS_HANDLE WrapperConfigurationContext
,
141 *Data
= READ_PORT_UCHAR((PUCHAR
)Port
); // FIXME: What to do with WrapperConfigurationContext?
150 NdisImmediateReadPortUlong(
151 IN NDIS_HANDLE WrapperConfigurationContext
,
155 *Data
= READ_PORT_ULONG((PULONG
)Port
); // FIXME: What to do with WrapperConfigurationContext?
164 NdisImmediateReadPortUshort(
165 IN NDIS_HANDLE WrapperConfigurationContext
,
169 *Data
= READ_PORT_USHORT((PUSHORT
)Port
); // FIXME: What to do with WrapperConfigurationContext?
178 NdisImmediateWritePortUchar(
179 IN NDIS_HANDLE WrapperConfigurationContext
,
183 WRITE_PORT_UCHAR((PUCHAR
)Port
, Data
); // FIXME: What to do with WrapperConfigurationContext?
192 NdisImmediateWritePortUlong(
193 IN NDIS_HANDLE WrapperConfigurationContext
,
197 WRITE_PORT_ULONG((PULONG
)Port
, Data
); // FIXME: What to do with WrapperConfigurationContext?
206 NdisImmediateWritePortUshort(
207 IN NDIS_HANDLE WrapperConfigurationContext
,
211 WRITE_PORT_USHORT((PUSHORT
)Port
, Data
); // FIXME: What to do with WrapperConfigurationContext?
220 NdisMAllocateMapRegisters(
221 IN NDIS_HANDLE MiniportAdapterHandle
,
223 IN BOOLEAN Dma32BitAddresses
,
224 IN ULONG PhysicalMapRegistersNeeded
,
225 IN ULONG MaximumPhysicalMapping
)
229 return NDIS_STATUS_FAILURE
;
238 NdisMCompleteDmaTransfer(
239 OUT PNDIS_STATUS Status
,
240 IN PNDIS_HANDLE MiniportDmaHandle
,
241 IN PNDIS_BUFFER Buffer
,
244 IN BOOLEAN WriteToDevice
)
255 NdisMDeregisterDmaChannel(
256 IN PNDIS_HANDLE MiniportDmaHandle
)
267 NdisMDeregisterInterrupt(
268 IN PNDIS_MINIPORT_INTERRUPT Interrupt
)
270 * FUNCTION: Releases an interrupt vector
272 * Interrupt = Pointer to interrupt object
275 IoDisconnectInterrupt(Interrupt
->InterruptObject
);
284 NdisMDeregisterIoPortRange(
285 IN NDIS_HANDLE MiniportAdapterHandle
,
287 IN UINT NumberOfPorts
,
290 * FUNCTION: Releases a register mapping to I/O ports
292 * MiniportAdapterHandle = Specifies handle input to MiniportInitialize
293 * InitialPort = Bus-relative base port address of a range to be mapped
294 * NumberOfPorts = Specifies number of ports to be mapped
295 * PortOffset = Pointer to mapped base port address
298 NDIS_DbgPrint(MAX_TRACE
, ("Called.\n"));
309 NdisMFreeMapRegisters(
310 IN NDIS_HANDLE MiniportAdapterHandle
)
322 OUT PVOID
*VirtualAddress
,
323 IN NDIS_HANDLE MiniportAdapterHandle
,
324 IN NDIS_PHYSICAL_ADDRESS PhysicalAddress
,
329 return NDIS_STATUS_FAILURE
;
339 IN NDIS_HANDLE MiniportDmaHandle
)
352 NdisMRegisterDmaChannel(
353 OUT PNDIS_HANDLE MiniportDmaHandle
,
354 IN NDIS_HANDLE MiniportAdapterHandle
,
356 IN BOOLEAN Dma32BitAddresses
,
357 IN PNDIS_DMA_DESCRIPTION DmaDescription
,
358 IN ULONG MaximumLength
)
362 return NDIS_STATUS_FAILURE
;
371 NdisMRegisterInterrupt(
372 OUT PNDIS_MINIPORT_INTERRUPT Interrupt
,
373 IN NDIS_HANDLE MiniportAdapterHandle
,
374 IN UINT InterruptVector
,
375 IN UINT InterruptLevel
,
376 IN BOOLEAN RequestIsr
,
377 IN BOOLEAN SharedInterrupt
,
378 IN NDIS_INTERRUPT_MODE InterruptMode
)
380 * FUNCTION: Claims access to an interrupt vector
382 * Interrupt = Address of interrupt object to initialize
383 * MiniportAdapterHandle = Specifies handle input to MiniportInitialize
384 * InterruptVector = Specifies bus-relative vector to register
385 * InterruptLevel = Specifies bus-relative DIRQL vector for interrupt
386 * RequestIsr = TRUE if MiniportISR should always be called
387 * SharedInterrupt = TRUE if other devices may use the same interrupt
388 * InterruptMode = Specifies type of interrupt
390 * Status of operation
397 PLOGICAL_ADAPTER Adapter
= GET_LOGICAL_ADAPTER(MiniportAdapterHandle
);
399 NDIS_DbgPrint(MAX_TRACE
, ("Called. InterruptVector (0x%X) InterruptLevel (0x%X) "
400 "SharedInterrupt (%d) InterruptMode (0x%X)\n",
401 InterruptVector
, InterruptLevel
, SharedInterrupt
, InterruptMode
));
403 RtlZeroMemory(Interrupt
, sizeof(NDIS_MINIPORT_INTERRUPT
));
405 KeInitializeSpinLock(&Interrupt
->DpcCountLock
);
407 KeInitializeDpc(&Interrupt
->InterruptDpc
,
408 HandleDeferredProcessing
,
411 KeInitializeEvent(&Interrupt
->DpcsCompletedEvent
,
415 Interrupt
->SharedInterrupt
= SharedInterrupt
;
417 Adapter
->NdisMiniportBlock
.Interrupt
= Interrupt
;
419 MappedIRQ
= HalGetInterruptVector(Internal
, /* Adapter->AdapterType, */
426 NDIS_DbgPrint(MAX_TRACE
, ("Connecting to interrupt vector (0x%X) Affinity (0x%X).\n", MappedIRQ
, Affinity
));
428 Status
= IoConnectInterrupt(&Interrupt
->InterruptObject
,
431 &Interrupt
->DpcCountLock
,
440 NDIS_DbgPrint(MAX_TRACE
, ("Leaving. Status (0x%X).\n", Status
));
442 if (NT_SUCCESS(Status
))
443 return NDIS_STATUS_SUCCESS
;
445 if (Status
== STATUS_INSUFFICIENT_RESOURCES
) {
446 /* FIXME: Log error */
447 return NDIS_STATUS_RESOURCE_CONFLICT
;
450 return NDIS_STATUS_FAILURE
;
459 NdisMRegisterIoPortRange(
460 OUT PVOID
*PortOffset
,
461 IN NDIS_HANDLE MiniportAdapterHandle
,
463 IN UINT NumberOfPorts
)
465 * FUNCTION: Sets up driver access to device I/O ports
467 * PortOffset = Address of buffer to place mapped base port address
468 * MiniportAdapterHandle = Specifies handle input to MiniportInitialize
469 * InitialPort = Bus-relative base port address of a range to be mapped
470 * NumberOfPorts = Specifies number of ports to be mapped
472 * Status of operation
477 BOOLEAN ConflictDetected
;
478 PLOGICAL_ADAPTER Adapter
= GET_LOGICAL_ADAPTER(MiniportAdapterHandle
);
479 PMINIPORT_DRIVER Miniport
= Adapter
->Miniport
;
481 NDIS_DbgPrint(MAX_TRACE
, ("Called.\n"));
483 /* Non-PnP hardware. NT5 function */
484 Status
= IoReportResourceForDetection(Miniport
->DriverObject
,
491 return NDIS_STATUS_FAILURE
;
493 NDIS_DbgPrint(MAX_TRACE
, ("Called.\n"));
496 *PortOffset
= (PVOID
)InitialPort
;
498 return NDIS_STATUS_SUCCESS
;
508 NdisMSetupDmaTransfer(
509 OUT PNDIS_STATUS Status
,
510 IN PNDIS_HANDLE MiniportDmaHandle
,
511 IN PNDIS_BUFFER Buffer
,
514 IN BOOLEAN WriteToDevice
)
526 IN NDIS_HANDLE MiniportAdapterHandle
,
527 IN PVOID VirtualAddress
,