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
= MIN_TRACE
;
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 PE1000_ADAPTER Adapter
= (PE1000_ADAPTER
)MiniportAdapterContext
;
34 PSCATTER_GATHER_LIST sgList
= NDIS_PER_PACKET_INFO_FROM_PACKET(Packet
, ScatterGatherListPacketInfo
);
36 PHYSICAL_ADDRESS TransmitBuffer
;
39 ASSERT(sgList
!= NULL
);
40 ASSERT(sgList
->NumberOfElements
== 1);
41 ASSERT((sgList
->Elements
[0].Address
.LowPart
& 3) == 0);
42 ASSERT(sgList
->Elements
[0].Length
<= MAXIMUM_FRAME_SIZE
);
46 NDIS_DbgPrint(MIN_TRACE
, ("All TX descriptors are full\n"));
47 return NDIS_STATUS_RESOURCES
;
50 TransmitLength
= sgList
->Elements
[0].Length
;
51 TransmitBuffer
= sgList
->Elements
[0].Address
;
52 Adapter
->TransmitPackets
[Adapter
->CurrentTxDesc
] = Packet
;
54 Status
= NICTransmitPacket(Adapter
, TransmitBuffer
, TransmitLength
);
55 if (Status
!= NDIS_STATUS_SUCCESS
)
57 NDIS_DbgPrint(MIN_TRACE
, ("Transmit packet failed\n"));
61 return NDIS_STATUS_PENDING
;
67 IN NDIS_HANDLE MiniportAdapterContext
)
69 PE1000_ADAPTER Adapter
= (PE1000_ADAPTER
)MiniportAdapterContext
;
71 ASSERT(Adapter
!= NULL
);
73 /* First disable sending / receiving */
74 NICDisableTxRx(Adapter
);
76 /* Then unregister interrupts */
77 NICUnregisterInterrupts(Adapter
);
79 /* Finally, free other resources (Ports, IO ranges,...) */
80 NICReleaseIoResources(Adapter
);
82 /* Destroy the adapter context */
83 NdisFreeMemory(Adapter
, sizeof(*Adapter
), 0);
89 OUT PNDIS_STATUS OpenErrorStatus
,
90 OUT PUINT SelectedMediumIndex
,
91 IN PNDIS_MEDIUM MediumArray
,
92 IN UINT MediumArraySize
,
93 IN NDIS_HANDLE MiniportAdapterHandle
,
94 IN NDIS_HANDLE WrapperConfigurationContext
)
96 PE1000_ADAPTER Adapter
;
99 PNDIS_RESOURCE_LIST ResourceList
;
100 UINT ResourceListSize
;
101 PCI_COMMON_CONFIG PciConfig
;
103 /* Make sure the medium is supported */
104 for (i
= 0; i
< MediumArraySize
; i
++)
106 if (MediumArray
[i
] == NdisMedium802_3
)
108 *SelectedMediumIndex
= i
;
113 if (i
== MediumArraySize
)
115 NDIS_DbgPrint(MIN_TRACE
, ("802.3 medium was not found in the medium array\n"));
116 return NDIS_STATUS_UNSUPPORTED_MEDIA
;
119 /* Allocate our adapter context */
120 Status
= NdisAllocateMemoryWithTag((PVOID
*)&Adapter
,
123 if (Status
!= NDIS_STATUS_SUCCESS
)
125 NDIS_DbgPrint(MIN_TRACE
, ("Failed to allocate adapter context (0x%x)\n", Status
));
126 return NDIS_STATUS_RESOURCES
;
129 RtlZeroMemory(Adapter
, sizeof(*Adapter
));
130 Adapter
->AdapterHandle
= MiniportAdapterHandle
;
132 /* Notify NDIS of some characteristics of our NIC */
133 NdisMSetAttributesEx(MiniportAdapterHandle
,
136 NDIS_ATTRIBUTE_BUS_MASTER
,
139 NdisReadPciSlotInformation(Adapter
->AdapterHandle
,
141 FIELD_OFFSET(PCI_COMMON_CONFIG
, VendorID
),
142 &PciConfig
, sizeof(PciConfig
));
144 Adapter
->VendorID
= PciConfig
.VendorID
;
145 Adapter
->DeviceID
= PciConfig
.DeviceID
;
147 Adapter
->SubsystemID
= PciConfig
.u
.type0
.SubSystemID
;
148 Adapter
->SubsystemVendorID
= PciConfig
.u
.type0
.SubVendorID
;
151 if (!NICRecognizeHardware(Adapter
))
153 NDIS_DbgPrint(MIN_TRACE
, ("Hardware not recognized\n"));
154 Status
= NDIS_STATUS_UNSUPPORTED_MEDIA
;
159 /* Get our resources for IRQ and IO base information */
161 ResourceListSize
= 0;
162 NdisMQueryAdapterResources(&Status
,
163 WrapperConfigurationContext
,
166 if (Status
!= NDIS_STATUS_RESOURCES
)
168 NDIS_DbgPrint(MIN_TRACE
, ("Unexpected failure of NdisMQueryAdapterResources (0x%x)\n", Status
));
169 Status
= NDIS_STATUS_FAILURE
;
170 /* call NdisWriteErrorLogEntry */
174 Status
= NdisAllocateMemoryWithTag((PVOID
*)&ResourceList
,
177 if (Status
!= NDIS_STATUS_SUCCESS
)
179 NDIS_DbgPrint(MIN_TRACE
, ("Failed to allocate resource list (0x%x)\n", Status
));
180 /* call NdisWriteErrorLogEntry */
184 NdisMQueryAdapterResources(&Status
,
185 WrapperConfigurationContext
,
188 if (Status
!= NDIS_STATUS_SUCCESS
)
190 NDIS_DbgPrint(MIN_TRACE
, ("Unexpected failure of NdisMQueryAdapterResources (0x%x)\n", Status
));
191 /* call NdisWriteErrorLogEntry */
195 ASSERT(ResourceList
->Version
== 1);
196 ASSERT(ResourceList
->Revision
== 1);
198 Status
= NICInitializeAdapterResources(Adapter
, ResourceList
);
200 NdisFreeMemory(ResourceList
, ResourceListSize
, 0);
203 if (Status
!= NDIS_STATUS_SUCCESS
)
205 NDIS_DbgPrint(MIN_TRACE
, ("Adapter didn't receive enough resources\n"));
209 /* Allocate the DMA resources */
210 Status
= NdisMInitializeScatterGatherDma(MiniportAdapterHandle
,
211 FALSE
, // 64bit is supported but can be buggy
213 if (Status
!= NDIS_STATUS_SUCCESS
)
215 NDIS_DbgPrint(MIN_TRACE
, ("Unable to configure DMA\n"));
216 Status
= NDIS_STATUS_RESOURCES
;
220 Status
= NICAllocateIoResources(Adapter
);
221 if (Status
!= NDIS_STATUS_SUCCESS
)
223 NDIS_DbgPrint(MIN_TRACE
, ("Unable to allocate resources\n"));
224 Status
= NDIS_STATUS_RESOURCES
;
229 Status
= NICPowerOn(Adapter
);
230 if (Status
!= NDIS_STATUS_SUCCESS
)
232 NDIS_DbgPrint(MIN_TRACE
, ("Unable to power on NIC (0x%x)\n", Status
));
236 Status
= NICSoftReset(Adapter
);
237 if (Status
!= NDIS_STATUS_SUCCESS
)
239 NDIS_DbgPrint(MIN_TRACE
, ("Unable to reset the NIC (0x%x)\n", Status
));
243 Status
= NICGetPermanentMacAddress(Adapter
, Adapter
->PermanentMacAddress
);
244 if (Status
!= NDIS_STATUS_SUCCESS
)
246 NDIS_DbgPrint(MIN_TRACE
, ("Unable to get the fixed MAC address (0x%x)\n", Status
));
250 RtlCopyMemory(Adapter
->MulticastList
[0].MacAddress
, Adapter
->PermanentMacAddress
, IEEE_802_ADDR_LENGTH
);
252 NICUpdateMulticastList(Adapter
);
254 /* Update link state and speed */
255 NICUpdateLinkStatus(Adapter
);
257 /* We're ready to handle interrupts now */
258 Status
= NICRegisterInterrupts(Adapter
);
259 if (Status
!= NDIS_STATUS_SUCCESS
)
261 NDIS_DbgPrint(MIN_TRACE
, ("Unable to register interrupt (0x%x)\n", Status
));
265 /* Enable interrupts on the NIC */
266 Adapter
->InterruptMask
= DEFAULT_INTERRUPT_MASK
;
267 Status
= NICApplyInterruptMask(Adapter
);
268 if (Status
!= NDIS_STATUS_SUCCESS
)
270 NDIS_DbgPrint(MIN_TRACE
, ("Unable to apply interrupt mask (0x%x)\n", Status
));
274 /* Turn on TX and RX now */
275 Status
= NICEnableTxRx(Adapter
);
276 if (Status
!= NDIS_STATUS_SUCCESS
)
278 NDIS_DbgPrint(MIN_TRACE
, ("Unable to enable TX and RX (0x%x)\n", Status
));
282 return NDIS_STATUS_SUCCESS
;
285 if (ResourceList
!= NULL
)
287 NdisFreeMemory(ResourceList
, ResourceListSize
, 0);
291 MiniportHalt(Adapter
);
300 IN PDRIVER_OBJECT DriverObject
,
301 IN PUNICODE_STRING RegistryPath
)
303 NDIS_HANDLE WrapperHandle
;
304 NDIS_MINIPORT_CHARACTERISTICS Characteristics
= { 0 };
307 Characteristics
.MajorNdisVersion
= NDIS_MINIPORT_MAJOR_VERSION
;
308 Characteristics
.MinorNdisVersion
= NDIS_MINIPORT_MINOR_VERSION
;
309 Characteristics
.CheckForHangHandler
= NULL
;
310 Characteristics
.DisableInterruptHandler
= NULL
;
311 Characteristics
.EnableInterruptHandler
= NULL
;
312 Characteristics
.HaltHandler
= MiniportHalt
;
313 Characteristics
.HandleInterruptHandler
= MiniportHandleInterrupt
;
314 Characteristics
.InitializeHandler
= MiniportInitialize
;
315 Characteristics
.ISRHandler
= MiniportISR
;
316 Characteristics
.QueryInformationHandler
= MiniportQueryInformation
;
317 Characteristics
.ReconfigureHandler
= NULL
;
318 Characteristics
.ResetHandler
= MiniportReset
;
319 Characteristics
.SendHandler
= MiniportSend
;
320 Characteristics
.SetInformationHandler
= MiniportSetInformation
;
321 Characteristics
.TransferDataHandler
= NULL
;
322 Characteristics
.ReturnPacketHandler
= NULL
;
323 Characteristics
.SendPacketsHandler
= NULL
;
324 Characteristics
.AllocateCompleteHandler
= NULL
;
326 NdisMInitializeWrapper(&WrapperHandle
, DriverObject
, RegistryPath
, NULL
);
329 return NDIS_STATUS_FAILURE
;
332 Status
= NdisMRegisterMiniport(WrapperHandle
, &Characteristics
, sizeof(Characteristics
));
333 if (Status
!= NDIS_STATUS_SUCCESS
)
335 NdisTerminateWrapper(WrapperHandle
, 0);
336 return NDIS_STATUS_FAILURE
;
339 return NDIS_STATUS_SUCCESS
;