ReactOS 0.4.17-dev-573-g8315b8c
hardware.c
Go to the documentation of this file.
1/*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS NDIS library
4 * FILE: ndis/hardware.c
5 * PURPOSE: Hardware related routines
6 * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net)
7 * Vizzini (vizzini@plasmic.com)
8 * REVISIONS:
9 * CSH 01/08-2000 Created
10 * 25 Aug 2003 Vizzini - NDIS4/5 and PnP additions
11 * 3 Oct 2003 Vizzini - formatting and minor bugfixes
12 *
13 */
14
15#include "ndissys.h"
16#include <wdmguid.h>
17
20 IN PLOGICAL_ADAPTER Adapter)
21{
24 PIRP Irp;
26 PIO_STACK_LOCATION IrpStack;
27
28 if (Adapter->BusInterfaceQueried)
29 return (Adapter->BusInterface.GetBusData != NULL) ? STATUS_SUCCESS : STATUS_NOT_SUPPORTED;
30
31 Adapter->BusInterfaceQueried = TRUE;
32
34
36 Adapter->NdisMiniportBlock.NextDeviceObject,
37 NULL,
38 0,
39 NULL,
40 &Event,
42 if (Irp == NULL)
44
46 IrpStack->MajorFunction = IRP_MJ_PNP;
48 IrpStack->Parameters.QueryInterface.InterfaceType = &GUID_BUS_INTERFACE_STANDARD;
49 IrpStack->Parameters.QueryInterface.Size = sizeof(Adapter->BusInterface);
51 IrpStack->Parameters.QueryInterface.Interface = (PINTERFACE)&Adapter->BusInterface;
52 IrpStack->Parameters.QueryInterface.InterfaceSpecificData = NULL;
53
54 Irp->IoStatus.Status = STATUS_NOT_SUPPORTED;
55
56 Status = IoCallDriver(Adapter->NdisMiniportBlock.NextDeviceObject, Irp);
58 {
61 }
62
63 if (!NT_SUCCESS(Status))
64 RtlZeroMemory(&Adapter->BusInterface, sizeof(Adapter->BusInterface));
65
66 return Status;
67}
68
69/*
70 * @implemented
71 */
80{
82 /* Slot number is ignored. */
83 return HalGetBusDataByOffset(PCIConfiguration, WrapperContext->BusNumber,
84 WrapperContext->SlotNumber, Buffer, Offset, Length);
85}
86
87/*
88 * @implemented
89 */
98{
100 /* Slot number is ignored. */
101 return HalSetBusDataByOffset(PCIConfiguration, WrapperContext->BusNumber,
102 WrapperContext->SlotNumber, Buffer, Offset, Length);
103}
104
105/*
106 * @implemented
107 */
109EXPORT
113 OUT PNDIS_RESOURCE_LIST *AssignedResources)
114{
116
118 Adapter->NdisMiniportBlock.AllocatedResources == NULL)
119 {
120 NDIS_DbgPrint(MIN_TRACE, ("Bad bus type or no resources\n"));
121 *AssignedResources = NULL;
122 return NDIS_STATUS_FAILURE;
123 }
124
125 *AssignedResources = &Adapter->NdisMiniportBlock.AllocatedResources->List[0].PartialResourceList;
126
127 return NDIS_STATUS_SUCCESS;
128}
129
130/*
131 * @implemented
132 */
134EXPORT
136 IN NDIS_HANDLE NdisMacHandle,
137 IN NDIS_HANDLE NdisWrapperHandle,
140 OUT PNDIS_RESOURCE_LIST *AssignedResources)
141{
143 PLOGICAL_ADAPTER Adapter = WrapperContext->DeviceObject->DeviceExtension;
144
145 return NdisMPciAssignResources(Adapter,
147 AssignedResources);
148}
149
150/*
151 * @implemented
152 */
153VOID
154EXPORT
160/*
161 * FUNCTION: returns a nic's hardware resources
162 * ARGUMENTS:
163 * Status: on return, contains the status of the operation
164 * WrapperConfigurationContext: handle input to MiniportInitialize
165 * ResourceList: on return, contains the list of resources for the nic
166 * BufferSize: size of ResourceList
167 * NOTES:
168 * - Caller must allocate Status and ResourceList
169 * - Must be called at IRQL = PASSIVE_LEVEL;
170 */
171{
173 PLOGICAL_ADAPTER Adapter = WrapperContext->DeviceObject->DeviceExtension;
174 ULONG ResourceListSize;
175
176 PAGED_CODE();
177 ASSERT((Status && ResourceList) || (BufferSize && *BufferSize == 0));
178
179 NDIS_DbgPrint(MAX_TRACE, ("Called\n"));
180
181 if (Adapter->NdisMiniportBlock.AllocatedResources == NULL)
182 {
183 NDIS_DbgPrint(MIN_TRACE, ("No allocated resources!\n"));
185 return;
186 }
187
188 ResourceListSize =
189 FIELD_OFFSET(CM_PARTIAL_RESOURCE_LIST, PartialDescriptors) +
190 Adapter->NdisMiniportBlock.AllocatedResources->List[0].PartialResourceList.Count *
192
193 if (*BufferSize >= ResourceListSize)
194 {
196 &Adapter->NdisMiniportBlock.AllocatedResources->List[0].PartialResourceList,
197 ResourceListSize);
198 *BufferSize = ResourceListSize;
200 }
201 else
202 {
203 *BufferSize = ResourceListSize;
205 }
206}
207
208
209/*
210 * @implemented
211 */
213EXPORT
217/*
218 * On X86 (and all other current hardware), map registers aren't real hardware,
219 * and there is no real limit to the number that can be allocated.
220 * As such, we do what microsoft does on the x86 hals and return as follows
221 */
222{
224}
225
226
227/*
228 * @implemented
229 */
230ULONG
231EXPORT
233 IN NDIS_HANDLE NdisAdapterHandle,
238{
239 PLOGICAL_ADAPTER Adapter = NdisAdapterHandle;
240
241 /* Slot number is ignored since W2K for all NDIS drivers. */
242 if (Adapter->BusInterface.GetBusData != NULL)
243 {
247 Buffer,
248 Offset,
249 Length);
250 NDIS_DbgPrint(MAX_TRACE, ("NdisReadPciSlotInformation: Using bus interface, read %u bytes\n", Result));
251 return Result;
252 }
253
254 /* Fall back to HAL functions ONLY if bus interface is not available */
256 Adapter->NdisMiniportBlock.BusNumber, Adapter->NdisMiniportBlock.SlotNumber,
258}
259
260/*
261 * @implemented
262 */
263ULONG
264EXPORT
266 IN NDIS_HANDLE NdisAdapterHandle,
271{
272 PLOGICAL_ADAPTER Adapter = NdisAdapterHandle;
273
274 /* Slot number is ignored since W2K for all NDIS drivers. */
275 if (Adapter->BusInterface.SetBusData != NULL)
276 {
280 Buffer,
281 Offset,
282 Length);
283 NDIS_DbgPrint(MAX_TRACE, ("NdisWritePciSlotInformation: Using bus interface, wrote %u bytes\n", Result));
284 return Result;
285 }
286
287 /* Fall back to HAL functions ONLY if bus interface is not available */
289 Adapter->NdisMiniportBlock.BusNumber, Adapter->NdisMiniportBlock.SlotNumber,
291}
292
293
294/*
295 * @implemented
296 */
297VOID
298EXPORT
304{
306 ULONG Ret;
308
309 NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
310
311 /* We are called only at PASSIVE_LEVEL */
313 if (!Buffer) {
314 NDIS_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
316 return;
317 }
318
320 Wrapper->BusNumber,
321 Wrapper->SlotNumber,
322 Buffer,
324
325 if (Ret == 0 || Ret == 2) {
326 NDIS_DbgPrint(MIN_TRACE, ("HalGetBusData failed.\n"));
329 return;
330 }
331
332 *SlotNumber = Wrapper->SlotNumber;
333
335
337
339}
340
341
342/*
343 * @implemented
344 */
345ULONG
346EXPORT
348 IN NDIS_HANDLE NdisAdapterHandle,
352/*
353 * FUNCTION:
354 * ARGUMENTS:
355 * NOTES:
356 * NDIS 5.0
357 */
358{
359 PLOGICAL_ADAPTER Adapter = NdisAdapterHandle;
360
361 NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
362
365 Adapter->NdisMiniportBlock.SlotNumber,
366 Buffer,
367 Offset,
368 Length);
369}
370
371
372/*
373 * @implemented
374 */
375ULONG
376EXPORT
378 IN NDIS_HANDLE NdisAdapterHandle,
382/*
383 * FUNCTION:
384 * ARGUMENTS:
385 * NOTES:
386 * NDIS 5.0
387 */
388{
389 PLOGICAL_ADAPTER Adapter = NdisAdapterHandle;
390
391 NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
392
395 Adapter->NdisMiniportBlock.SlotNumber,
396 Buffer,
397 Offset,
398 Length);
399}
400
401/*
402 * @implemented
403 */
404VOID
405EXPORT
410/*
411 * FUNCTION:
412 * ARGUMENTS:
413 * NOTES:
414 * NDIS 4.0
415 */
416{
419
420 NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
421
422 Wrapper->BusNumber = BusNumber;
423
424 if (Adapter)
426}
427
428/* EOF */
#define PAGED_CODE()
LONG NTSTATUS
Definition: precomp.h:26
#define MIN_TRACE
Definition: debug.h:14
#define MAX_TRACE
Definition: debug.h:16
#define IRP_MJ_PNP
Definition: cdrw_usr.h:52
Definition: bufpool.h:45
_In_ PIRP Irp
Definition: csq.h:116
#define STATUS_NOT_SUPPORTED
Definition: d3dkmdt.h:48
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
#define NDIS_DbgPrint(_t_, _x_)
Definition: debug.h:40
struct _NDIS_WRAPPER_CONTEXT * PNDIS_WRAPPER_CONTEXT
ULONG EXPORT NdisReadPcmciaAttributeMemory(IN NDIS_HANDLE NdisAdapterHandle, IN ULONG Offset, IN PVOID Buffer, IN ULONG Length)
Definition: hardware.c:347
ULONG EXPORT NdisReadPciSlotInformation(IN NDIS_HANDLE NdisAdapterHandle, IN ULONG SlotNumber, IN ULONG Offset, IN PVOID Buffer, IN ULONG Length)
Definition: hardware.c:232
ULONG EXPORT NdisWritePciSlotInformation(IN NDIS_HANDLE NdisAdapterHandle, IN ULONG SlotNumber, IN ULONG Offset, IN PVOID Buffer, IN ULONG Length)
Definition: hardware.c:265
ULONG EXPORT NdisWritePcmciaAttributeMemory(IN NDIS_HANDLE NdisAdapterHandle, IN ULONG Offset, IN PVOID Buffer, IN ULONG Length)
Definition: hardware.c:377
ULONG EXPORT NdisImmediateReadPciSlotInformation(IN NDIS_HANDLE WrapperConfigurationContext, IN ULONG SlotNumber, IN ULONG Offset, IN PVOID Buffer, IN ULONG Length)
Definition: hardware.c:74
NTSTATUS NdisQueryPciBusInterface(IN PLOGICAL_ADAPTER Adapter)
Definition: hardware.c:19
VOID EXPORT NdisMQueryAdapterResources(OUT PNDIS_STATUS Status, IN NDIS_HANDLE WrapperConfigurationContext, OUT PNDIS_RESOURCE_LIST ResourceList, IN OUT PUINT BufferSize)
Definition: hardware.c:155
VOID EXPORT NdisReadEisaSlotInformation(OUT PNDIS_STATUS Status, IN NDIS_HANDLE WrapperConfigurationContext, OUT PUINT SlotNumber, OUT PNDIS_EISA_FUNCTION_INFORMATION EisaData)
Definition: hardware.c:299
NDIS_STATUS EXPORT NdisQueryMapRegisterCount(IN NDIS_INTERFACE_TYPE BusType, OUT PUINT MapRegisterCount)
Definition: hardware.c:214
ULONG EXPORT NdisImmediateWritePciSlotInformation(IN NDIS_HANDLE WrapperConfigurationContext, IN ULONG SlotNumber, IN ULONG Offset, IN PVOID Buffer, IN ULONG Length)
Definition: hardware.c:92
NDIS_STATUS EXPORT NdisMPciAssignResources(IN NDIS_HANDLE MiniportAdapterHandle, IN ULONG SlotNumber, OUT PNDIS_RESOURCE_LIST *AssignedResources)
Definition: hardware.c:110
NDIS_STATUS EXPORT NdisPciAssignResources(IN NDIS_HANDLE NdisMacHandle, IN NDIS_HANDLE NdisWrapperHandle, IN NDIS_HANDLE WrapperConfigurationContext, IN ULONG SlotNumber, OUT PNDIS_RESOURCE_LIST *AssignedResources)
Definition: hardware.c:135
VOID EXPORT NdisOverrideBusNumber(IN NDIS_HANDLE WrapperConfigurationContext, IN NDIS_HANDLE MiniportAdapterHandle OPTIONAL, IN ULONG BusNumber)
Definition: hardware.c:406
NTHALAPI ULONG NTAPI HalGetBusData(BUS_DATA_TYPE, ULONG, ULONG, PVOID, ULONG)
#define KeWaitForSingleObject(pEvt, foo, a, b, c)
Definition: env_spec_w32.h:478
#define KeInitializeEvent(pEvt, foo, foo2)
Definition: env_spec_w32.h:477
#define ExFreePool(addr)
Definition: env_spec_w32.h:352
#define PagedPool
Definition: env_spec_w32.h:308
#define ExAllocatePool(type, size)
Definition: fbtusb.h:44
Status
Definition: gdiplustypes.h:24
ULONG NTAPI HalSetBusDataByOffset(IN BUS_DATA_TYPE BusDataType, IN ULONG BusNumber, IN ULONG SlotNumber, IN PVOID Buffer, IN ULONG Offset, IN ULONG Length)
Definition: bus.c:123
ULONG NTAPI HalGetBusDataByOffset(IN BUS_DATA_TYPE BusDataType, IN ULONG BusNumber, IN ULONG SlotNumber, IN PVOID Buffer, IN ULONG Offset, IN ULONG Length)
Definition: bus.c:73
#define ASSERT(a)
Definition: mode.c:44
unsigned int * PUINT
Definition: ndis.h:50
#define NDIS_STATUS_NOT_SUPPORTED
Definition: ndis.h:479
enum _NDIS_INTERFACE_TYPE NDIS_INTERFACE_TYPE
#define NDIS_STATUS_FAILURE
Definition: ndis.h:465
#define NDIS_STATUS_SUCCESS
Definition: ndis.h:346
@ NdisInterfacePci
Definition: ndis.h:905
_Must_inspect_result_ _Out_ PNDIS_STATUS _Out_ PNDIS_HANDLE _In_ NDIS_HANDLE WrapperConfigurationContext
Definition: ndis.h:3946
_In_ NDIS_HANDLE MiniportAdapterHandle
Definition: ndis.h:4668
* PNDIS_STATUS
Definition: ndis.h:45
#define NDIS_STATUS_RESOURCES
Definition: ndis.h:466
#define KernelMode
Definition: asm.h:38
int NDIS_STATUS
Definition: ntddndis.h:496
_In_ ULONG _In_ ULONG Offset
Definition: ntddpcm.h:101
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:102
@ NotificationEvent
static OUT PIO_STATUS_BLOCK IoStatusBlock
Definition: pipe.c:100
PIRP NTAPI IoBuildSynchronousFsdRequest(IN ULONG MajorFunction, IN PDEVICE_OBJECT DeviceObject, IN PVOID Buffer, IN ULONG Length, IN PLARGE_INTEGER StartingOffset, IN PKEVENT Event, IN PIO_STATUS_BLOCK IoStatusBlock)
Definition: irp.c:1069
#define IoCallDriver
Definition: irp.c:1225
_In_ ULONG BusNumber
Definition: pciidex.h:65
struct _CM_PARTIAL_RESOURCE_DESCRIPTOR CM_PARTIAL_RESOURCE_DESCRIPTOR
@ EisaConfiguration
Definition: miniport.h:90
@ PCMCIAConfiguration
Definition: miniport.h:96
@ PCIConfiguration
Definition: miniport.h:93
struct _INTERFACE * PINTERFACE
#define STATUS_SUCCESS
Definition: shellext.h:65
PULONG MinorVersion OPTIONAL
Definition: CrossNt.h:68
PGET_SET_DEVICE_DATA SetBusData
Definition: iotypes.h:915
PGET_SET_DEVICE_DATA GetBusData
Definition: iotypes.h:916
PVOID DeviceExtension
Definition: env_spec_w32.h:418
union _IO_STACK_LOCATION::@1709 Parameters
struct _IO_STACK_LOCATION::@4481::@4507 QueryInterface
BUS_INTERFACE_STANDARD BusInterface
Definition: miniport.h:99
NDIS_MINIPORT_BLOCK NdisMiniportBlock
Definition: miniport.h:89
NDIS_INTERFACE_TYPE BusType
Definition: ndis.h:2550
PDEVICE_OBJECT DeviceObject
Definition: miniport.h:79
#define STATUS_PENDING
Definition: telnetd.h:14
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
#define IN
Definition: typedefs.h:39
uint32_t ULONG
Definition: typedefs.h:59
#define OUT
Definition: typedefs.h:40
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
_In_ WDFDMATRANSACTION _Out_opt_ ULONG * MapRegisterCount
_In_ WDFMEMORY _Out_opt_ size_t * BufferSize
Definition: wdfmemory.h:254
_Must_inspect_result_ _In_ WDFIORESREQLIST _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFIORESLIST * ResourceList
Definition: wdfresource.h:309
_In_ WDFIORESREQLIST _In_ ULONG SlotNumber
Definition: wdfresource.h:68
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
Definition: wsk.h:409
_In_opt_ PUNICODE_STRING _In_ PDRIVER_OBJECT _In_ PDEVICE_OBJECT _In_ INTERFACE_TYPE BusType
Definition: halfuncs.h:159
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetNextIrpStackLocation(_In_ PIRP Irp)
Definition: iofuncs.h:2695
#define PCI_BUS_INTERFACE_STANDARD_VERSION
Definition: iotypes.h:5339
#define PCI_WHICHSPACE_CONFIG
Definition: iotypes.h:3646
#define IRP_MN_QUERY_INTERFACE
@ Executive
Definition: ketypes.h:467