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)
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
22 NdisImmediateReadPciSlotInformation(
23 IN NDIS_HANDLE WrapperConfigurationContext
,
29 PNDIS_WRAPPER_CONTEXT WrapperContext
= (PNDIS_WRAPPER_CONTEXT
)WrapperConfigurationContext
;
30 /* Slot number is ignored. */
31 return HalGetBusDataByOffset(PCIConfiguration
, WrapperContext
->BusNumber
,
32 WrapperContext
->SlotNumber
, Buffer
, Offset
, Length
);
40 NdisImmediateWritePciSlotInformation(
41 IN NDIS_HANDLE WrapperConfigurationContext
,
47 PNDIS_WRAPPER_CONTEXT WrapperContext
= (PNDIS_WRAPPER_CONTEXT
)WrapperConfigurationContext
;
48 /* Slot number is ignored. */
49 return HalSetBusDataByOffset(PCIConfiguration
, WrapperContext
->BusNumber
,
50 WrapperContext
->SlotNumber
, Buffer
, Offset
, Length
);
58 NdisMPciAssignResources(
59 IN NDIS_HANDLE MiniportAdapterHandle
,
61 OUT PNDIS_RESOURCE_LIST
*AssignedResources
)
63 PLOGICAL_ADAPTER Adapter
= MiniportAdapterHandle
;
65 if (Adapter
->NdisMiniportBlock
.BusType
!= NdisInterfacePci
||
66 Adapter
->NdisMiniportBlock
.AllocatedResources
== NULL
)
68 NDIS_DbgPrint(MIN_TRACE
, ("Bad bus type or no resources\n"));
69 *AssignedResources
= NULL
;
70 return NDIS_STATUS_FAILURE
;
73 *AssignedResources
= &Adapter
->NdisMiniportBlock
.AllocatedResources
->List
[0].PartialResourceList
;
75 return NDIS_STATUS_SUCCESS
;
83 NdisPciAssignResources(
84 IN NDIS_HANDLE NdisMacHandle
,
85 IN NDIS_HANDLE NdisWrapperHandle
,
86 IN NDIS_HANDLE WrapperConfigurationContext
,
88 OUT PNDIS_RESOURCE_LIST
*AssignedResources
)
90 PNDIS_WRAPPER_CONTEXT WrapperContext
= (PNDIS_WRAPPER_CONTEXT
)WrapperConfigurationContext
;
91 PLOGICAL_ADAPTER Adapter
= WrapperContext
->DeviceObject
->DeviceExtension
;
93 return NdisMPciAssignResources(Adapter
,
103 NdisMQueryAdapterResources(
104 OUT PNDIS_STATUS Status
,
105 IN NDIS_HANDLE WrapperConfigurationContext
,
106 OUT PNDIS_RESOURCE_LIST ResourceList
,
107 IN OUT PUINT BufferSize
)
109 * FUNCTION: returns a nic's hardware resources
111 * Status: on return, contains the status of the operation
112 * WrapperConfigurationContext: handle input to MiniportInitialize
113 * ResourceList: on return, contains the list of resources for the nic
114 * BufferSize: size of ResourceList
116 * - Caller must allocate Status and ResourceList
117 * - Must be called at IRQL = PASSIVE_LEVEL;
120 PNDIS_WRAPPER_CONTEXT WrapperContext
= (PNDIS_WRAPPER_CONTEXT
)WrapperConfigurationContext
;
121 PLOGICAL_ADAPTER Adapter
= WrapperContext
->DeviceObject
->DeviceExtension
;
122 ULONG ResourceListSize
;
125 ASSERT((Status
&& ResourceList
) || (BufferSize
&& *BufferSize
== 0));
127 NDIS_DbgPrint(MAX_TRACE
, ("Called\n"));
129 if (Adapter
->NdisMiniportBlock
.AllocatedResources
== NULL
)
131 NDIS_DbgPrint(MIN_TRACE
, ("No allocated resources!\n"));
132 *Status
= NDIS_STATUS_FAILURE
;
137 FIELD_OFFSET(CM_PARTIAL_RESOURCE_LIST
, PartialDescriptors
) +
138 Adapter
->NdisMiniportBlock
.AllocatedResources
->List
[0].PartialResourceList
.Count
*
139 sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR
);
141 if (*BufferSize
>= ResourceListSize
)
143 RtlCopyMemory(ResourceList
,
144 &Adapter
->NdisMiniportBlock
.AllocatedResources
->List
[0].PartialResourceList
,
146 *BufferSize
= ResourceListSize
;
147 *Status
= NDIS_STATUS_SUCCESS
;
151 *BufferSize
= ResourceListSize
;
152 *Status
= NDIS_STATUS_RESOURCES
;
162 NdisQueryMapRegisterCount(
163 IN NDIS_INTERFACE_TYPE BusType
,
164 OUT PUINT MapRegisterCount
)
166 * On X86 (and all other current hardware), map registers aren't real hardware,
167 * and there is no real limit to the number that can be allocated.
168 * As such, we do what microsoft does on the x86 hals and return as follows
171 return NDIS_STATUS_NOT_SUPPORTED
;
180 NdisReadPciSlotInformation(
181 IN NDIS_HANDLE NdisAdapterHandle
,
187 PLOGICAL_ADAPTER Adapter
= NdisAdapterHandle
;
188 /* Slot number is ignored since W2K for all NDIS drivers. */
189 return HalGetBusDataByOffset(PCIConfiguration
,
190 Adapter
->NdisMiniportBlock
.BusNumber
, Adapter
->NdisMiniportBlock
.SlotNumber
,
191 Buffer
, Offset
, Length
);
199 NdisWritePciSlotInformation(
200 IN NDIS_HANDLE NdisAdapterHandle
,
206 PLOGICAL_ADAPTER Adapter
= NdisAdapterHandle
;
207 /* Slot number is ignored since W2K for all NDIS drivers. */
208 return HalSetBusDataByOffset(PCIConfiguration
,
209 Adapter
->NdisMiniportBlock
.BusNumber
, Adapter
->NdisMiniportBlock
.SlotNumber
,
210 Buffer
, Offset
, Length
);
219 NdisReadEisaSlotInformation(
220 OUT PNDIS_STATUS Status
,
221 IN NDIS_HANDLE WrapperConfigurationContext
,
222 OUT PUINT SlotNumber
,
223 OUT PNDIS_EISA_FUNCTION_INFORMATION EisaData
)
225 PNDIS_WRAPPER_CONTEXT Wrapper
= WrapperConfigurationContext
;
229 NDIS_DbgPrint(MAX_TRACE
, ("Called.\n"));
231 /* We are called only at PASSIVE_LEVEL */
232 Buffer
= ExAllocatePool(PagedPool
, sizeof(NDIS_EISA_FUNCTION_INFORMATION
));
234 NDIS_DbgPrint(MIN_TRACE
, ("Insufficient resources.\n"));
235 *Status
= NDIS_STATUS_RESOURCES
;
239 Ret
= HalGetBusData(EisaConfiguration
,
243 sizeof(NDIS_EISA_FUNCTION_INFORMATION
));
245 if (Ret
== 0 || Ret
== 2) {
246 NDIS_DbgPrint(MIN_TRACE
, ("HalGetBusData failed.\n"));
248 *Status
= NDIS_STATUS_FAILURE
;
252 *SlotNumber
= Wrapper
->SlotNumber
;
254 RtlCopyMemory(EisaData
, Buffer
, sizeof(NDIS_EISA_FUNCTION_INFORMATION
));
258 *Status
= NDIS_STATUS_SUCCESS
;
267 NdisReadPcmciaAttributeMemory(
268 IN NDIS_HANDLE NdisAdapterHandle
,
279 PLOGICAL_ADAPTER Adapter
= NdisAdapterHandle
;
281 NDIS_DbgPrint(MAX_TRACE
, ("Called.\n"));
283 return HalGetBusDataByOffset(PCMCIAConfiguration
,
284 Adapter
->NdisMiniportBlock
.BusNumber
,
285 Adapter
->NdisMiniportBlock
.SlotNumber
,
297 NdisWritePcmciaAttributeMemory(
298 IN NDIS_HANDLE NdisAdapterHandle
,
309 PLOGICAL_ADAPTER Adapter
= NdisAdapterHandle
;
311 NDIS_DbgPrint(MAX_TRACE
, ("Called.\n"));
313 return HalSetBusDataByOffset(PCMCIAConfiguration
,
314 Adapter
->NdisMiniportBlock
.BusNumber
,
315 Adapter
->NdisMiniportBlock
.SlotNumber
,
326 NdisOverrideBusNumber(
327 IN NDIS_HANDLE WrapperConfigurationContext
,
328 IN NDIS_HANDLE MiniportAdapterHandle OPTIONAL
,
337 PNDIS_WRAPPER_CONTEXT Wrapper
= WrapperConfigurationContext
;
338 PLOGICAL_ADAPTER Adapter
= MiniportAdapterHandle
;
340 NDIS_DbgPrint(MAX_TRACE
, ("Called.\n"));
342 Wrapper
->BusNumber
= BusNumber
;
345 Adapter
->NdisMiniportBlock
.BusNumber
= BusNumber
;