- Merge aicom-network-fixes up to r36740
[reactos.git] / reactos / drivers / network / dd / ne2000 / ne2000 / main.c
index 44142e3..0959b00 100644 (file)
@@ -7,7 +7,6 @@
  * REVISIONS:
  *   CSH 27/08-2000 Created
  */
-#include <roscfg.h>
 #include <ne2000.h>
 #include <debug.h>
 
@@ -63,8 +62,7 @@ DRIVER_INFORMATION      DriverInfo = {0};
 NDIS_PHYSICAL_ADDRESS   HighestAcceptableMax = NDIS_PHYSICAL_ADDRESS_CONST(-1, -1);
 
 
-#if 0
-static BOOLEAN MiniportCheckForHang(
+static BOOLEAN STDCALL MiniportCheckForHang(
     IN  NDIS_HANDLE MiniportAdapterContext)
 /*
  * FUNCTION: Examines if an adapter has hung
@@ -78,7 +76,6 @@ static BOOLEAN MiniportCheckForHang(
 
     return FALSE;
 }
-#endif
 
 
 static VOID STDCALL MiniportDisableInterrupt(
@@ -121,6 +118,8 @@ static VOID STDCALL MiniportHalt(
 {
     PNIC_ADAPTER Adapter = (PNIC_ADAPTER)MiniportAdapterContext;
 
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
+
     NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
 #ifndef NOCARD
     /* Stop the NIC */
@@ -141,10 +140,13 @@ static VOID STDCALL MiniportHalt(
             0x20,
             Adapter->IOBase);
 
+    if (Adapter->ShutdownHandlerRegistered)
+        NdisMDeregisterAdapterShutdownHandler(Adapter->MiniportAdapterHandle);
+
     /* Remove adapter from global adapter list */
     if ((&Adapter->ListEntry)->Blink != NULL) {
         RemoveEntryList(&Adapter->ListEntry);
-       }
+    }
 
     /* Free adapter context area */
     NdisFreeMemory(Adapter, sizeof(NIC_ADAPTER), 0);
@@ -201,6 +203,14 @@ static VOID STDCALL MiQueryResources(
     }
 }
 
+VOID
+STDCALL
+MiniportShutdown(PVOID Context)
+{
+  #ifndef NOCARD
+    NICStop((PNIC_ADAPTER)Context);
+  #endif
+}
 
 static NDIS_STATUS STDCALL MiniportInitialize(
     OUT PNDIS_STATUS    OpenErrorStatus,
@@ -226,6 +236,8 @@ static NDIS_STATUS STDCALL MiniportInitialize(
     NDIS_STATUS Status;
     PNIC_ADAPTER Adapter;
 
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
+
     NDIS_DbgPrint(MAX_TRACE, ("Called (Adapter %X).\n", MiniportAdapterHandle));
 
     /* Search for 802.3 media which is the only one we support */
@@ -410,6 +422,12 @@ static NDIS_STATUS STDCALL MiniportInitialize(
     /* Start the NIC */
     NICStart(Adapter);
 #endif
+
+    /* Register the shutdown handler */
+    NdisMRegisterAdapterShutdownHandler(MiniportAdapterHandle, Adapter, MiniportShutdown);
+
+    Adapter->ShutdownHandlerRegistered = TRUE;
+
     /* Add adapter to the global adapter list */
     InsertTailList(&DriverInfo.AdapterListHead, &Adapter->ListEntry);
 
@@ -473,6 +491,8 @@ static NDIS_STATUS STDCALL MiniportQueryInformation(
     NDIS_MEDIUM Medium   = NdisMedium802_3;
     PNIC_ADAPTER Adapter = (PNIC_ADAPTER)MiniportAdapterContext;
 
+    ASSERT_IRQL_EQUAL(DISPATCH_LEVEL);
+
     NDIS_DbgPrint(MAX_TRACE, ("Called. Oid (0x%X).\n", Oid));
 
     Status   = NDIS_STATUS_SUCCESS;
@@ -639,6 +659,8 @@ static NDIS_STATUS STDCALL MiniportReset(
  *     Status of operation
  */
 {
+    ASSERT_IRQL_EQUAL(DISPATCH_LEVEL);
+
     NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
 
     return NDIS_STATUS_FAILURE;
@@ -662,13 +684,11 @@ static NDIS_STATUS STDCALL MiniportSend(
 {
     PNIC_ADAPTER Adapter = (PNIC_ADAPTER)MiniportAdapterContext;
 
+    ASSERT_IRQL_EQUAL(DISPATCH_LEVEL);
+
+#ifndef NOCARD
     NDIS_DbgPrint(MID_TRACE, ("Queueing packet.\n"));
 
-#ifdef NOCARD
-    NdisMSendComplete(Adapter->MiniportAdapterHandle,
-                      Packet,
-                      NDIS_STATUS_SUCCESS);
-#else
     /* Queue the packet on the transmit queue */
     RESERVED(Packet)->Next = NULL;
     if (Adapter->TXQueueHead == NULL) {
@@ -681,8 +701,11 @@ static NDIS_STATUS STDCALL MiniportSend(
 
     /* Transmit the packet */
     NICTransmit(Adapter);
-#endif
+
     return NDIS_STATUS_PENDING;
+#else
+    return NDIS_STATUS_SUCCESS;
+#endif
 }
 
 
@@ -711,6 +734,8 @@ static NDIS_STATUS STDCALL MiniportSetInformation(
     NDIS_STATUS Status   = NDIS_STATUS_SUCCESS;
     PNIC_ADAPTER Adapter = (PNIC_ADAPTER)MiniportAdapterContext;
 
+    ASSERT_IRQL_EQUAL(DISPATCH_LEVEL);
+
     NDIS_DbgPrint(MAX_TRACE, ("Called. Oid (0x%X).\n", Oid));
 
     switch (Oid) {
@@ -820,6 +845,8 @@ static NDIS_STATUS STDCALL MiniportTransferData(
     UINT RecvStop;
     PNIC_ADAPTER Adapter = (PNIC_ADAPTER)MiniportAdapterContext;
 
+    ASSERT_IRQL_EQUAL(DISPATCH_LEVEL);
+
     NDIS_DbgPrint(MAX_TRACE, ("Called. Packet (0x%X)  ByteOffset (0x%X)  BytesToTransfer (%d).\n",
         Packet, ByteOffset, BytesToTransfer));
 
@@ -904,7 +931,7 @@ DriverEntry(
     NdisZeroMemory(&Miniport, sizeof(Miniport));
     Miniport.MajorNdisVersion           = DRIVER_NDIS_MAJOR_VERSION;
     Miniport.MinorNdisVersion           = DRIVER_NDIS_MINOR_VERSION;
-    Miniport.CheckForHangHandler        = NULL; //MiniportCheckForHang;
+    Miniport.CheckForHangHandler        = MiniportCheckForHang;
     Miniport.DisableInterruptHandler    = MiniportDisableInterrupt;
     Miniport.EnableInterruptHandler     = MiniportEnableInterrupt;
     Miniport.HaltHandler                = MiniportHalt;
@@ -923,6 +950,11 @@ DriverEntry(
                            RegistryPath,
                            NULL);
 
+    if (!NdisWrapperHandle) {
+        NDIS_DbgPrint(MIN_TRACE, ("NdisMInitializeWrapper() failed\n"));
+        return STATUS_UNSUCCESSFUL;
+    }
+
     DriverInfo.NdisWrapperHandle = NdisWrapperHandle;
     DriverInfo.NdisMacHandle     = NULL;
     InitializeListHead(&DriverInfo.AdapterListHead);