dcdc154b6b16a7685ff17a2c21fb7bc9e442e7ff
[reactos.git] / reactos / drivers / net / ndis / ndis / io.c
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS NDIS library
4 * FILE: ndis/io.c
5 * PURPOSE: I/O related routines
6 * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net)
7 * REVISIONS:
8 * CSH 01/08-2000 Created
9 */
10 #include <ndissys.h>
11 #include <miniport.h>
12
13
14 VOID HandleDeferredProcessing(
15 IN PKDPC Dpc,
16 IN PVOID DeferredContext,
17 IN PVOID SystemArgument1,
18 IN PVOID SystemArgument2)
19 /*
20 * FUNCTION: Deferred interrupt processing routine
21 * ARGUMENTS:
22 * Dpc = Pointer to DPC object
23 * DeferredContext = Pointer to context information (LOGICAL_ADAPTER)
24 * SystemArgument1 = Unused
25 * SystemArgument2 = Unused
26 */
27 {
28 PLOGICAL_ADAPTER Adapter = GET_LOGICAL_ADAPTER(DeferredContext);
29
30 /* Call the deferred interrupt service handler for this adapter */
31 (*Adapter->Miniport->Chars.HandleInterruptHandler)(Adapter);
32 }
33
34
35 BOOLEAN ServiceRoutine(
36 IN PKINTERRUPT Interrupt,
37 IN PVOID ServiceContext)
38 /*
39 * FUNCTION: Interrupt service routine
40 * ARGUMENTS:
41 * Interrupt = Pointer to interrupt object
42 * ServiceContext = Pointer to context information (LOGICAL_ADAPTER)
43 * RETURNS
44 * TRUE if our device generated the interrupt
45 */
46 {
47 BOOLEAN InterruptRecognized;
48 BOOLEAN QueueMiniportHandleInterrupt;
49 PLOGICAL_ADAPTER Adapter = GET_LOGICAL_ADAPTER(ServiceContext);
50
51 /* FIXME: Support shared interrupts */
52
53 (*Adapter->Miniport->Chars.ISRHandler)(&InterruptRecognized,
54 &QueueMiniportHandleInterrupt, Adapter);
55
56 if (QueueMiniportHandleInterrupt) {
57 KeInsertQueueDpc(&Adapter->InterruptObject->InterruptDpc, NULL, NULL);
58 }
59
60 return TRUE;
61 }
62
63
64 VOID
65 EXPORT
66 NdisCompleteDmaTransfer(
67 OUT PNDIS_STATUS Status,
68 IN PNDIS_HANDLE NdisDmaHandle,
69 IN PNDIS_BUFFER Buffer,
70 IN ULONG Offset,
71 IN ULONG Length,
72 IN BOOLEAN WriteToDevice)
73 {
74 UNIMPLEMENTED
75 }
76
77
78 VOID
79 EXPORT
80 NdisFlushBuffer(
81 IN PNDIS_BUFFER Buffer,
82 IN BOOLEAN WriteToDevice)
83 {
84 UNIMPLEMENTED
85 }
86
87
88 ULONG
89 EXPORT
90 NdisGetCacheFillSize(
91 VOID)
92 {
93 UNIMPLEMENTED
94
95 return 0;
96 }
97
98
99 VOID
100 EXPORT
101 NdisImmediateReadPortUchar(
102 IN NDIS_HANDLE WrapperConfigurationContext,
103 IN ULONG Port,
104 OUT PUCHAR Data)
105 {
106 UNIMPLEMENTED
107 }
108
109
110 VOID
111 EXPORT
112 NdisImmediateReadPortUlong(
113 IN NDIS_HANDLE WrapperConfigurationContext,
114 IN ULONG Port,
115 OUT PULONG Data)
116 {
117 UNIMPLEMENTED
118 }
119
120
121 VOID
122 EXPORT
123 NdisImmediateReadPortUshort(
124 IN NDIS_HANDLE WrapperConfigurationContext,
125 IN ULONG Port,
126 OUT PUSHORT Data)
127 {
128 UNIMPLEMENTED
129 }
130
131
132 VOID
133 EXPORT
134 NdisImmediateWritePortUchar(
135 IN NDIS_HANDLE WrapperConfigurationContext,
136 IN ULONG Port,
137 IN UCHAR Data)
138 {
139 UNIMPLEMENTED
140 }
141
142
143 VOID
144 EXPORT
145 NdisImmediateWritePortUlong(
146 IN NDIS_HANDLE WrapperConfigurationContext,
147 IN ULONG Port,
148 IN ULONG Data)
149 {
150 UNIMPLEMENTED
151 }
152
153
154 VOID
155 EXPORT
156 NdisImmediateWritePortUshort(
157 IN NDIS_HANDLE WrapperConfigurationContext,
158 IN ULONG Port,
159 IN USHORT Data)
160 {
161 UNIMPLEMENTED
162 }
163
164
165 NDIS_STATUS
166 EXPORT
167 NdisMAllocateMapRegisters(
168 IN NDIS_HANDLE MiniportAdapterHandle,
169 IN UINT DmaChannel,
170 IN BOOLEAN Dma32BitAddresses,
171 IN ULONG PhysicalMapRegistersNeeded,
172 IN ULONG MaximumPhysicalMapping)
173 {
174 UNIMPLEMENTED
175
176 return NDIS_STATUS_FAILURE;
177 }
178
179
180 VOID
181 EXPORT
182 NdisMCompleteDmaTransfer(
183 OUT PNDIS_STATUS Status,
184 IN PNDIS_HANDLE MiniportDmaHandle,
185 IN PNDIS_BUFFER Buffer,
186 IN ULONG Offset,
187 IN ULONG Length,
188 IN BOOLEAN WriteToDevice)
189 {
190 UNIMPLEMENTED
191 }
192
193
194 VOID
195 EXPORT
196 NdisMDeregisterDmaChannel(
197 IN PNDIS_HANDLE MiniportDmaHandle)
198 {
199 UNIMPLEMENTED
200 }
201
202
203 VOID
204 EXPORT
205 NdisMDeregisterInterrupt(
206 IN PNDIS_MINIPORT_INTERRUPT Interrupt)
207 /*
208 * FUNCTION: Releases an interrupt vector
209 * ARGUMENTS:
210 * Interrupt = Pointer to interrupt object
211 */
212 {
213 IoDisconnectInterrupt(Interrupt->InterruptObject);
214 }
215
216
217 VOID
218 EXPORT
219 NdisMDeregisterIoPortRange(
220 IN NDIS_HANDLE MiniportAdapterHandle,
221 IN UINT InitialPort,
222 IN UINT NumberOfPorts,
223 IN PVOID PortOffset)
224 /*
225 * FUNCTION: Releases a register mapping to I/O ports
226 * ARGUMENTS:
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
231 */
232 {
233 UNIMPLEMENTED
234 }
235
236
237 VOID
238 EXPORT
239 NdisMFreeMapRegisters(
240 IN NDIS_HANDLE MiniportAdapterHandle)
241 {
242 UNIMPLEMENTED
243 }
244
245
246 NDIS_STATUS
247 EXPORT
248 NdisMMapIoSpace(
249 OUT PVOID *VirtualAddress,
250 IN NDIS_HANDLE MiniportAdapterHandle,
251 IN NDIS_PHYSICAL_ADDRESS PhysicalAddress,
252 IN UINT Length)
253 {
254 UNIMPLEMENTED
255
256 return NDIS_STATUS_FAILURE;
257 }
258
259
260 VOID
261 EXPORT
262 NdisMQueryInformationComplete(
263 IN NDIS_HANDLE MiniportAdapterHandle,
264 IN NDIS_STATUS Status)
265 {
266 UNIMPLEMENTED
267 }
268
269
270 ULONG
271 EXPORT
272 NdisMReadDmaCounter(
273 IN NDIS_HANDLE MiniportDmaHandle)
274 {
275 UNIMPLEMENTED
276
277 return 0;
278 }
279
280
281 NDIS_STATUS
282 EXPORT
283 NdisMRegisterDmaChannel(
284 OUT PNDIS_HANDLE MiniportDmaHandle,
285 IN NDIS_HANDLE MiniportAdapterHandle,
286 IN UINT DmaChannel,
287 IN BOOLEAN Dma32BitAddresses,
288 IN PNDIS_DMA_DESCRIPTION DmaDescription,
289 IN ULONG MaximumLength)
290 {
291 UNIMPLEMENTED
292
293 return NDIS_STATUS_FAILURE;
294 }
295
296
297 NDIS_STATUS
298 EXPORT
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)
307 /*
308 * FUNCTION: Claims access to an interrupt vector
309 * ARGUMENTS:
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
317 * RETURNS:
318 * Status of operation
319 */
320 {
321 NTSTATUS NtStatus;
322 ULONG MappedIRQ;
323 KIRQL DIrql;
324 KAFFINITY Affinity = 0xFFFFFFFF;
325 PLOGICAL_ADAPTER Adapter = GET_LOGICAL_ADAPTER(MiniportAdapterHandle);
326
327 RtlZeroMemory(Interrupt, sizeof(NDIS_MINIPORT_INTERRUPT));
328
329 KeInitializeSpinLock(&Interrupt->DpcCountLock);
330
331 KeInitializeDpc(&Interrupt->InterruptDpc, HandleDeferredProcessing, Adapter);
332
333 KeInitializeEvent(&Interrupt->DpcsCompletedEvent,
334 NotificationEvent, FALSE);
335
336 Interrupt->SharedInterrupt = SharedInterrupt;
337
338 Adapter->InterruptObject = Interrupt;
339
340 MappedIRQ = HalGetInterruptVector(Adapter->AdapterType, 0,
341 InterruptLevel, InterruptVector, &DIrql, &Affinity);
342
343 NtStatus = IoConnectInterrupt(&Interrupt->InterruptObject, ServiceRoutine, Adapter,
344 &Interrupt->DpcCountLock, MappedIRQ, DIrql, DIrql, InterruptMode,
345 SharedInterrupt, Affinity, FALSE);
346
347 return NDIS_STATUS_SUCCESS;
348 }
349
350
351 NDIS_STATUS
352 EXPORT
353 NdisMRegisterIoPortRange(
354 OUT PVOID *PortOffset,
355 IN NDIS_HANDLE MiniportAdapterHandle,
356 IN UINT InitialPort,
357 IN UINT NumberOfPorts)
358 /*
359 * FUNCTION: Sets up driver access to device I/O ports
360 * ARGUMENTS:
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
365 * RETURNS:
366 * Status of operation
367 */
368 {
369 #if 0
370 NTSTATUS NtStatus;
371 BOOLEAN ConflictDetected;
372 PLOGICAL_ADAPTER Adapter = GET_LOGICAL_ADAPTER(MiniportAdapterHandle);
373 PMINIPORT_DRIVER Miniport = Adapter->Miniport;
374
375 /* Non-PnP hardware. NT5 function */
376 NtStatus = IoReportResourceForDetection(
377 Miniport->DriverObject,
378 NULL,
379 0,
380 NULL,
381 NULL,
382 0,
383 &ConflictDetected);
384 return NDIS_STATUS_FAILURE;
385 #else
386 /* It's yours! */
387 *PortOffset = (PVOID)InitialPort;
388
389 return NDIS_STATUS_SUCCESS;
390 #endif
391 }
392
393
394 VOID
395 EXPORT
396 NdisMSetInformationComplete(
397 IN NDIS_HANDLE MiniportAdapterHandle,
398 IN NDIS_STATUS Status)
399 {
400 UNIMPLEMENTED
401 }
402
403
404 VOID
405 EXPORT
406 NdisMSetupDmaTransfer(
407 OUT PNDIS_STATUS Status,
408 IN PNDIS_HANDLE MiniportDmaHandle,
409 IN PNDIS_BUFFER Buffer,
410 IN ULONG Offset,
411 IN ULONG Length,
412 IN BOOLEAN WriteToDevice)
413 {
414 UNIMPLEMENTED
415 }
416
417
418 VOID
419 EXPORT
420 NdisMTransferDataComplete(
421 IN NDIS_HANDLE MiniportAdapterHandle,
422 IN PNDIS_PACKET Packet,
423 IN NDIS_STATUS Status,
424 IN UINT BytesTransferred)
425 {
426 UNIMPLEMENTED
427 }
428
429
430 VOID
431 EXPORT
432 NdisMUnmapIoSpace(
433 IN NDIS_HANDLE MiniportAdapterHandle,
434 IN PVOID VirtualAddress,
435 IN UINT Length)
436 {
437 UNIMPLEMENTED
438 }
439
440 /* EOF */