- Merge aicom-network-fixes up to r36558
authorCameron Gutman <aicommander@gmail.com>
Sat, 27 Sep 2008 21:25:27 +0000 (21:25 +0000)
committerCameron Gutman <aicommander@gmail.com>
Sat, 27 Sep 2008 21:25:27 +0000 (21:25 +0000)
svn path=/trunk/; revision=36559

reactos/drivers/network/afd/afd/tdiconn.c
reactos/drivers/network/dd/ne2000/ne2000/8390.c
reactos/drivers/network/dd/ne2000/ne2000/main.c
reactos/drivers/network/ndis/include/miniport.h
reactos/drivers/network/ndis/ndis/miniport.c
reactos/drivers/network/ndis/ndis/protocol.c
reactos/drivers/network/tcpip/datalink/lan.c
reactos/lib/drivers/ip/network/ip.c

index b574020..cb12dac 100644 (file)
@@ -194,6 +194,8 @@ TdiBuildConnectionInfoPair
     ULONG TdiAddressSize;
     PTDI_CONNECTION_INFORMATION FromTdiConn, ToTdiConn;
 
+    if (!From) return STATUS_INVALID_PARAMETER;
+
     /* FIXME: Get from socket information */
     TdiAddressSize = TdiAddressSizeFromType(From->Address[0].AddressType);
     SizeOfEntry = TdiAddressSize + sizeof(TDI_CONNECTION_INFORMATION);
@@ -207,15 +209,10 @@ TdiBuildConnectionInfoPair
 
     RtlZeroMemory( LayoutFrame, 2 * SizeOfEntry );
 
-       FromTdiConn = (PTDI_CONNECTION_INFORMATION)LayoutFrame;
-       ToTdiConn = (PTDI_CONNECTION_INFORMATION)LayoutFrame + SizeOfEntry;
+    FromTdiConn = (PTDI_CONNECTION_INFORMATION)LayoutFrame;
+    ToTdiConn = (PTDI_CONNECTION_INFORMATION)LayoutFrame + SizeOfEntry;
 
-    if (From != NULL) {
-       TdiBuildConnectionInfoInPlace( FromTdiConn, From );
-    } else {
-       TdiBuildNullConnectionInfoInPlace( FromTdiConn,
-                                          From->Address[0].AddressType );
-    }
+    TdiBuildConnectionInfoInPlace( FromTdiConn, From );
 
     TdiBuildConnectionInfoInPlace( ToTdiConn, To );
 
index bfe9934..7e9d58e 100644 (file)
@@ -544,6 +544,8 @@ static VOID NICStartTransmit(
 
     NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
 
+    if (Adapter->TXCurrent < 0) return;
+
        //FrameStart = Adapter->TXStart + Adapter->TXCurrent * DRIVER_BLOCK_SIZE;
        //FrameStart = Adapter->TXStart;
        FrameStart = (UCHAR)(Adapter->TXStart + (UCHAR)(Adapter->TXCurrent * BUFFERS_PER_TX_BUF));
index c948665..0def256 100644 (file)
@@ -669,13 +669,9 @@ static NDIS_STATUS STDCALL MiniportSend(
 
     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) {
@@ -688,8 +684,11 @@ static NDIS_STATUS STDCALL MiniportSend(
 
     /* Transmit the packet */
     NICTransmit(Adapter);
-#endif
+
     return NDIS_STATUS_PENDING;
+#else
+    return NDIS_STATUS_SUCCESS;
+#endif
 }
 
 
index 3423e7e..8f090a5 100644 (file)
@@ -146,7 +146,7 @@ MiniDequeueWorkItem(
 
 NDIS_STATUS
 MiniDoRequest(
-    PNDIS_MINIPORT_BLOCK Adapter,
+    PLOGICAL_ADAPTER Adapter,
     PNDIS_REQUEST NdisRequest);
 
 BOOLEAN
index bf77c74..d05f7cb 100644 (file)
@@ -326,8 +326,10 @@ MiniRequestComplete(
             Request,
             Status);
     }
-    KeLowerIrql(OldIrql);
+    KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock);
     Adapter->MiniportBusy = FALSE;
+    KeReleaseSpinLockFromDpcLevel(&Adapter->NdisMiniportBlock.Lock);
+    KeLowerIrql(OldIrql);
 }
 
 VOID NTAPI
@@ -357,8 +359,10 @@ MiniSendComplete(
         AdapterBinding->NdisOpenBlock.ProtocolBindingContext,
         Packet,
         Status);
-    KeLowerIrql(OldIrql);
+    KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock);
     Adapter->MiniportBusy = FALSE;
+    KeReleaseSpinLockFromDpcLevel(&Adapter->NdisMiniportBlock.Lock);
+    KeLowerIrql(OldIrql);
 }
 
 
@@ -392,8 +396,10 @@ MiniTransferDataComplete(
         AdapterBinding->NdisOpenBlock.ProtocolBindingContext,
         Packet,
         Status);
-    KeLowerIrql(OldIrql);
+    KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock);
     Adapter->MiniportBusy = FALSE;
+    KeReleaseSpinLockFromDpcLevel(&Adapter->NdisMiniportBlock.Lock);
+    KeLowerIrql(OldIrql);
 }
 
 \f
@@ -619,14 +625,18 @@ MiniReset(
  *     Status of the operation
  */
 {
-   NDIS_STATUS Status = NDIS_STATUS_FAILURE;
+   NDIS_STATUS Status;
    KIRQL OldIrql;
 
-   /* FIXME: What should we return if there isn't a reset handler? */
+   if (Adapter->MiniportBusy) {
+       KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &OldIrql);
+       MiniQueueWorkItem(Adapter, NdisWorkItemResetRequested, NULL);
+       KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql);
+       return NDIS_STATUS_PENDING;
+   }
 
    KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
-   if (Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.ResetHandler)
-       Status = (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.ResetHandler)(
+   Status = (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.ResetHandler)(
             Adapter->NdisMiniportBlock.MiniportAdapterContext,
             AddressingReset);
    KeLowerIrql(OldIrql);
@@ -763,7 +773,7 @@ MiniDequeueWorkItem(
 \f
 NDIS_STATUS
 MiniDoRequest(
-    PNDIS_MINIPORT_BLOCK Adapter,
+    PLOGICAL_ADAPTER Adapter,
     PNDIS_REQUEST NdisRequest)
 /*
  * FUNCTION: Sends a request to a miniport
@@ -778,14 +788,14 @@ MiniDoRequest(
     KIRQL OldIrql;
     NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n"));
 
-    Adapter->MediaRequest = NdisRequest;
+    Adapter->NdisMiniportBlock.MediaRequest = NdisRequest;
 
     KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
     switch (NdisRequest->RequestType)
     {
     case NdisRequestQueryInformation:
-        Status = (*Adapter->DriverHandle->MiniportCharacteristics.QueryInformationHandler)(
-            Adapter->MiniportAdapterContext,
+        Status = (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.QueryInformationHandler)(
+            Adapter->NdisMiniportBlock.MiniportAdapterContext,
             NdisRequest->DATA.QUERY_INFORMATION.Oid,
             NdisRequest->DATA.QUERY_INFORMATION.InformationBuffer,
             NdisRequest->DATA.QUERY_INFORMATION.InformationBufferLength,
@@ -794,8 +804,8 @@ MiniDoRequest(
         break;
 
     case NdisRequestSetInformation:
-        Status = (*Adapter->DriverHandle->MiniportCharacteristics.SetInformationHandler)(
-            Adapter->MiniportAdapterContext,
+        Status = (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.SetInformationHandler)(
+            Adapter->NdisMiniportBlock.MiniportAdapterContext,
             NdisRequest->DATA.SET_INFORMATION.Oid,
             NdisRequest->DATA.SET_INFORMATION.InformationBuffer,
             NdisRequest->DATA.SET_INFORMATION.InformationBufferLength,
@@ -807,6 +817,12 @@ MiniDoRequest(
         Status = NDIS_STATUS_FAILURE;
     }
 
+    if (Status == NDIS_STATUS_PENDING) {
+        KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock);
+        Adapter->MiniportBusy = TRUE;
+        KeReleaseSpinLockFromDpcLevel(&Adapter->NdisMiniportBlock.Lock);
+    }
+
     KeLowerIrql(OldIrql);
     return Status;
 }
@@ -829,8 +845,10 @@ NdisMQueryInformationComplete(
     KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
     if( Adapter->NdisMiniportBlock.QueryCompleteHandler )
        (Adapter->NdisMiniportBlock.QueryCompleteHandler)(MiniportAdapterHandle, Status);
-    KeLowerIrql(OldIrql);
+    KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock);
     Adapter->MiniportBusy = FALSE;
+    KeReleaseSpinLockFromDpcLevel(&Adapter->NdisMiniportBlock.Lock);
+    KeLowerIrql(OldIrql);
 }
 
 VOID NTAPI MiniportWorker(IN PVOID WorkItem)
@@ -841,6 +859,7 @@ VOID NTAPI MiniportWorker(IN PVOID WorkItem)
   NDIS_STATUS NdisStatus;
   PVOID WorkItemContext;
   NDIS_WORK_ITEM_TYPE WorkItemType;
+  BOOLEAN AddressingReset;
 
   KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &OldIrql);
 
@@ -938,6 +957,16 @@ VOID NTAPI MiniportWorker(IN PVOID WorkItem)
             break;
 
           case NdisWorkItemResetRequested:
+            KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
+            NdisStatus = (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.ResetHandler)(
+                          Adapter->NdisMiniportBlock.MiniportAdapterContext,
+                          &AddressingReset);
+            KeLowerIrql(OldIrql);
+
+            if (NdisStatus == NDIS_STATUS_PENDING)
+                break;
+
+            MiniResetComplete(Adapter, NdisStatus, AddressingReset);
             break;
 
           case NdisWorkItemResetInProgress:
@@ -947,7 +976,7 @@ VOID NTAPI MiniportWorker(IN PVOID WorkItem)
             break;
 
           case NdisWorkItemRequest:
-            NdisStatus = MiniDoRequest(&Adapter->NdisMiniportBlock, (PNDIS_REQUEST)WorkItemContext);
+            NdisStatus = MiniDoRequest(Adapter, (PNDIS_REQUEST)WorkItemContext);
 
             if (NdisStatus == NDIS_STATUS_PENDING)
               break;
@@ -976,8 +1005,11 @@ VOID NTAPI MiniportWorker(IN PVOID WorkItem)
         }
     }
 
-  if( NdisStatus != NDIS_STATUS_PENDING )
-      Adapter->MiniportBusy = FALSE; 
+  if( NdisStatus != NDIS_STATUS_PENDING ) {
+      KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &OldIrql);
+      Adapter->MiniportBusy = FALSE;
+      KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql);
+  }
 
   ExFreePool(WorkItem);
 }
@@ -1004,6 +1036,7 @@ VOID NTAPI MiniportDpc(
   NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n"));
 
   NdisWorkItem = ExAllocatePool(NonPagedPool, sizeof(NDIS_WORK_ITEM));
+  if (!NdisWorkItem) return;
 
   WorkItem = (PWORK_QUEUE_ITEM)NdisWorkItem->WrapperReserved;
 
@@ -1496,7 +1529,7 @@ NdisIPnPStartDevice(
 
   if (Stack->Parameters.StartDevice.AllocatedResourcesTranslated != NULL)
     {
-      ResourceCount = Stack->Parameters.StartDevice.AllocatedResources->List[0].
+      ResourceCount = Stack->Parameters.StartDevice.AllocatedResourcesTranslated->List[0].
                       PartialResourceList.Count;
       ResourceListSize =
         FIELD_OFFSET(CM_RESOURCE_LIST, List[0].PartialResourceList.
@@ -2108,8 +2141,10 @@ NdisMSetInformationComplete(
   ASSERT(Adapter);
   KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
   (Adapter->NdisMiniportBlock.SetCompleteHandler)(MiniportAdapterHandle, Status);
-  KeLowerIrql(OldIrql);
+  KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock);
   Adapter->MiniportBusy = FALSE;
+  KeReleaseSpinLockFromDpcLevel(&Adapter->NdisMiniportBlock.Lock);
+  KeLowerIrql(OldIrql);
 }
 
 \f
index fdb804f..7ea8dc4 100644 (file)
@@ -43,6 +43,8 @@ NdisCompleteBindAdapter(
 {
   PROTOCOL_BINDING *Protocol = (PROTOCOL_BINDING *)BindAdapterContext;
 
+  if (!NT_SUCCESS(Status)) return;
+
   /* Put protocol binding struct on global list */
   ExInterlockedInsertTailList(&ProtocolListHead, &Protocol->ListEntry, &ProtocolListLock);
 }
@@ -119,8 +121,6 @@ ProRequest(
  */
 {
   KIRQL OldIrql;
-  BOOLEAN QueueWorkItem = FALSE;
-  NDIS_STATUS NdisStatus;
   PADAPTER_BINDING AdapterBinding;
   PLOGICAL_ADAPTER Adapter;
   PNDIS_REQUEST_MAC_BLOCK MacBlock = (PNDIS_REQUEST_MAC_BLOCK)NdisRequest->MacReserved;
@@ -141,26 +141,15 @@ ProRequest(
   NDIS_DbgPrint(MAX_TRACE, ("acquiring miniport block lock\n"));
   KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &OldIrql);
     {
-      if(Adapter->MiniportBusy)
-        QueueWorkItem = TRUE;
-    }
-
-  /* MiniQueueWorkItem must be called at IRQL >= DISPATCH_LEVEL */
-  if (QueueWorkItem)
-    {
-      MiniQueueWorkItem(Adapter, NdisWorkItemRequest, (PVOID)NdisRequest);
-      KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql);
-      return NDIS_STATUS_PENDING;
+      if (Adapter->MiniportBusy) {
+          MiniQueueWorkItem(Adapter, NdisWorkItemRequest, (PVOID)NdisRequest);
+          KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql);
+          return NDIS_STATUS_PENDING;
+      }
     }
-
   KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql);
 
-  NdisStatus = MiniDoRequest(&Adapter->NdisMiniportBlock, NdisRequest);
-
-  if( NdisStatus == NDIS_STATUS_PENDING )
-      Adapter->MiniportBusy = TRUE;
-
-  return NdisStatus;
+  return MiniDoRequest(Adapter, NdisRequest);
 }
 
 \f
index 9a026bc..930b6ba 100644 (file)
@@ -485,16 +485,9 @@ NDIS_STATUS STDCALL ProtocolReceive(
     }
     else
     {
-       if (NdisStatus == NDIS_STATUS_SUCCESS)
-        {
-            NdisTransferData(&NdisStatus, Adapter->NdisHandle,
-                             MacReceiveContext, 0, PacketSize,
-                            NdisPacket, &BytesTransferred);
-        }
-        else
-        {
-            BytesTransferred = 0;
-        }
+        NdisTransferData(&NdisStatus, Adapter->NdisHandle,
+                         MacReceiveContext, 0, PacketSize,
+                        NdisPacket, &BytesTransferred);
     }
     TI_DbgPrint(DEBUG_DATALINK, ("Calling complete\n"));
 
index 4daf364..d49f15d 100644 (file)
@@ -242,12 +242,14 @@ VOID IPAddInterfaceRoute( PIP_INTERFACE IF ) {
                        NUD_PERMANENT);
     if (!NCE) {
        TI_DbgPrint(MIN_TRACE, ("Could not create NCE.\n"));
+        return;
     }
 
     AddrWidenAddress( &NetworkAddress, &IF->Unicast, &IF->Netmask );
 
     if (!RouterAddRoute(&NetworkAddress, &IF->Netmask, NCE, 1)) {
        TI_DbgPrint(MIN_TRACE, ("Could not add route due to insufficient resources.\n"));
+        return;
     }
 
     /* Allow TCP to hang some configuration on this interface */
@@ -352,10 +354,10 @@ VOID IPRegisterProtocol(
  *     To unregister a protocol handler, call this function with Handler = NULL
  */
 {
-#ifdef DBG
-    if (ProtocolNumber >= IP_PROTOCOL_TABLE_SIZE)
+    if (ProtocolNumber >= IP_PROTOCOL_TABLE_SIZE) {
         TI_DbgPrint(MIN_TRACE, ("Protocol number is out of range (%d).\n", ProtocolNumber));
-#endif
+        return;
+    }
 
     ProtocolTable[ProtocolNumber] = Handler;
 }