2 * PROJECT: ReactOS Intel PRO/1000 Driver
3 * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4 * PURPOSE: Driver entrypoint
5 * COPYRIGHT: Copyright 2013 Cameron Gutman (cameron.gutman@reactos.org)
6 * Copyright 2018 Mark Jansen (mark.jansen@reactos.org)
13 ULONG DebugTraceLevel
= DEBUG_ULTRA
;
18 OUT PBOOLEAN AddressingReset
,
19 IN NDIS_HANDLE MiniportAdapterContext
)
21 *AddressingReset
= FALSE
;
22 UNIMPLEMENTED_DBGBREAK();
23 return NDIS_STATUS_FAILURE
;
29 IN NDIS_HANDLE MiniportAdapterContext
,
30 IN PNDIS_PACKET Packet
,
33 NDIS_DbgPrint(MAX_TRACE
, ("Called.\n"));
35 return NDIS_STATUS_FAILURE
;
41 IN NDIS_HANDLE MiniportAdapterContext
)
43 PE1000_ADAPTER Adapter
= (PE1000_ADAPTER
)MiniportAdapterContext
;
45 ASSERT(Adapter
!= NULL
);
47 /* First disable sending / receiving */
48 NICDisableTxRx(Adapter
);
50 /* Then unregister interrupts */
51 NICUnregisterInterrupts(Adapter
);
53 /* Finally, free other resources (Ports, IO ranges,...) */
54 NICReleaseIoResources(Adapter
);
56 /* Destroy the adapter context */
57 NdisFreeMemory(Adapter
, sizeof(*Adapter
), 0);
63 OUT PNDIS_STATUS OpenErrorStatus
,
64 OUT PUINT SelectedMediumIndex
,
65 IN PNDIS_MEDIUM MediumArray
,
66 IN UINT MediumArraySize
,
67 IN NDIS_HANDLE MiniportAdapterHandle
,
68 IN NDIS_HANDLE WrapperConfigurationContext
)
70 PE1000_ADAPTER Adapter
;
73 PNDIS_RESOURCE_LIST ResourceList
;
74 UINT ResourceListSize
;
75 PCI_COMMON_CONFIG PciConfig
;
78 /* Make sure the medium is supported */
79 for (i
= 0; i
< MediumArraySize
; i
++)
81 if (MediumArray
[i
] == NdisMedium802_3
)
83 *SelectedMediumIndex
= i
;
88 if (i
== MediumArraySize
)
90 NDIS_DbgPrint(MIN_TRACE
, ("802.3 medium was not found in the medium array\n"));
91 return NDIS_STATUS_UNSUPPORTED_MEDIA
;
94 /* Allocate our adapter context */
95 Status
= NdisAllocateMemoryWithTag((PVOID
*)&Adapter
,
98 if (Status
!= NDIS_STATUS_SUCCESS
)
100 NDIS_DbgPrint(MIN_TRACE
, ("Failed to allocate adapter context (0x%x)\n", Status
));
101 return NDIS_STATUS_RESOURCES
;
104 RtlZeroMemory(Adapter
, sizeof(*Adapter
));
105 Adapter
->AdapterHandle
= MiniportAdapterHandle
;
106 NdisAllocateSpinLock(&Adapter
->Lock
);
109 /* Notify NDIS of some characteristics of our NIC */
110 NdisMSetAttributesEx(MiniportAdapterHandle
,
113 NDIS_ATTRIBUTE_BUS_MASTER
,
116 NdisReadPciSlotInformation(Adapter
->AdapterHandle
,
118 FIELD_OFFSET(PCI_COMMON_CONFIG
, VendorID
),
119 &PciConfig
, sizeof(PciConfig
));
121 Adapter
->VendorID
= PciConfig
.VendorID
;
122 Adapter
->DeviceID
= PciConfig
.DeviceID
;
124 Adapter
->SubsystemID
= PciConfig
.u
.type0
.SubSystemID
;
125 Adapter
->SubsystemVendorID
= PciConfig
.u
.type0
.SubVendorID
;
128 if (!NICRecognizeHardware(Adapter
))
130 NDIS_DbgPrint(MIN_TRACE
, ("Hardware not recognized\n"));
131 Status
= NDIS_STATUS_UNSUPPORTED_MEDIA
;
136 /* Get our resources for IRQ and IO base information */
138 ResourceListSize
= 0;
139 NdisMQueryAdapterResources(&Status
,
140 WrapperConfigurationContext
,
143 if (Status
!= NDIS_STATUS_RESOURCES
)
145 NDIS_DbgPrint(MIN_TRACE
, ("Unexpected failure of NdisMQueryAdapterResources (0x%x)\n", Status
));
146 Status
= NDIS_STATUS_FAILURE
;
147 /* call NdisWriteErrorLogEntry */
151 Status
= NdisAllocateMemoryWithTag((PVOID
*)&ResourceList
,
154 if (Status
!= NDIS_STATUS_SUCCESS
)
156 NDIS_DbgPrint(MIN_TRACE
, ("Failed to allocate resource list (0x%x)\n", Status
));
157 /* call NdisWriteErrorLogEntry */
161 NdisMQueryAdapterResources(&Status
,
162 WrapperConfigurationContext
,
165 if (Status
!= NDIS_STATUS_SUCCESS
)
167 NDIS_DbgPrint(MIN_TRACE
, ("Unexpected failure of NdisMQueryAdapterResources (0x%x)\n", Status
));
168 /* call NdisWriteErrorLogEntry */
172 ASSERT(ResourceList
->Version
== 1);
173 ASSERT(ResourceList
->Revision
== 1);
175 Status
= NICInitializeAdapterResources(Adapter
, ResourceList
);
177 NdisFreeMemory(ResourceList
, ResourceListSize
, 0);
180 if (Status
!= NDIS_STATUS_SUCCESS
)
182 NDIS_DbgPrint(MIN_TRACE
, ("Adapter didn't receive enough resources\n"));
186 /* Allocate the DMA resources */
187 Status
= NdisMInitializeScatterGatherDma(MiniportAdapterHandle
,
190 if (Status
!= NDIS_STATUS_SUCCESS
)
192 NDIS_DbgPrint(MIN_TRACE
, ("Unable to configure DMA\n"));
193 Status
= NDIS_STATUS_RESOURCES
;
197 Status
= NICAllocateIoResources(Adapter
);
198 if (Status
!= NDIS_STATUS_SUCCESS
)
200 NDIS_DbgPrint(MIN_TRACE
, ("Unable to allocate resources\n"));
201 Status
= NDIS_STATUS_RESOURCES
;
206 Status
= NICPowerOn(Adapter
);
207 if (Status
!= NDIS_STATUS_SUCCESS
)
209 NDIS_DbgPrint(MIN_TRACE
, ("Unable to power on NIC (0x%x)\n", Status
));
213 Status
= NICSoftReset(Adapter
);
214 if (Status
!= NDIS_STATUS_SUCCESS
)
216 NDIS_DbgPrint(MIN_TRACE
, ("Unable to reset the NIC (0x%x)\n", Status
));
220 Status
= NICGetPermanentMacAddress(Adapter
, Adapter
->PermanentMacAddress
);
221 if (Status
!= NDIS_STATUS_SUCCESS
)
223 NDIS_DbgPrint(MIN_TRACE
, ("Unable to get the fixed MAC address (0x%x)\n", Status
));
227 RtlCopyMemory(Adapter
->CurrentMacAddress
, Adapter
->PermanentMacAddress
, IEEE_802_ADDR_LENGTH
);
229 /* Update link state and speed */
230 NICUpdateLinkStatus(Adapter
);
232 /* We're ready to handle interrupts now */
233 Status
= NICRegisterInterrupts(Adapter
);
234 if (Status
!= NDIS_STATUS_SUCCESS
)
236 NDIS_DbgPrint(MIN_TRACE
, ("Unable to register interrupt (0x%x)\n", Status
));
240 /* Enable interrupts on the NIC */
241 //Adapter->InterruptMask = DEFAULT_INTERRUPT_MASK;
242 Status
= NICApplyInterruptMask(Adapter
);
243 if (Status
!= NDIS_STATUS_SUCCESS
)
245 NDIS_DbgPrint(MIN_TRACE
, ("Unable to apply interrupt mask (0x%x)\n", Status
));
249 /* Turn on TX and RX now */
250 Status
= NICEnableTxRx(Adapter
);
251 if (Status
!= NDIS_STATUS_SUCCESS
)
253 NDIS_DbgPrint(MIN_TRACE
, ("Unable to enable TX and RX (0x%x)\n", Status
));
257 return NDIS_STATUS_SUCCESS
;
260 if (ResourceList
!= NULL
)
262 NdisFreeMemory(ResourceList
, ResourceListSize
, 0);
266 MiniportHalt(Adapter
);
275 IN PDRIVER_OBJECT DriverObject
,
276 IN PUNICODE_STRING RegistryPath
)
278 NDIS_HANDLE WrapperHandle
;
279 NDIS_MINIPORT_CHARACTERISTICS Characteristics
= { 0 };
282 Characteristics
.MajorNdisVersion
= NDIS_MINIPORT_MAJOR_VERSION
;
283 Characteristics
.MinorNdisVersion
= NDIS_MINIPORT_MINOR_VERSION
;
284 Characteristics
.CheckForHangHandler
= NULL
;
285 Characteristics
.DisableInterruptHandler
= NULL
;
286 Characteristics
.EnableInterruptHandler
= NULL
;
287 Characteristics
.HaltHandler
= MiniportHalt
;
288 Characteristics
.HandleInterruptHandler
= MiniportHandleInterrupt
;
289 Characteristics
.InitializeHandler
= MiniportInitialize
;
290 Characteristics
.ISRHandler
= MiniportISR
;
291 Characteristics
.QueryInformationHandler
= MiniportQueryInformation
;
292 Characteristics
.ReconfigureHandler
= NULL
;
293 Characteristics
.ResetHandler
= MiniportReset
;
294 Characteristics
.SendHandler
= MiniportSend
;
295 Characteristics
.SetInformationHandler
= MiniportSetInformation
;
296 Characteristics
.TransferDataHandler
= NULL
;
297 Characteristics
.ReturnPacketHandler
= NULL
;
298 Characteristics
.SendPacketsHandler
= NULL
;
299 Characteristics
.AllocateCompleteHandler
= NULL
;
301 NdisMInitializeWrapper(&WrapperHandle
, DriverObject
, RegistryPath
, NULL
);
304 return NDIS_STATUS_FAILURE
;
307 Status
= NdisMRegisterMiniport(WrapperHandle
, &Characteristics
, sizeof(Characteristics
));
308 if (Status
!= NDIS_STATUS_SUCCESS
)
310 NdisTerminateWrapper(WrapperHandle
, 0);
311 return NDIS_STATUS_FAILURE
;
314 return NDIS_STATUS_SUCCESS
;