[ros-kernel] Ndid/Miniport.C - Function unimplemented

Filip Navara xnavara at volny.cz
Sat Jul 17 17:28:32 CEST 2004


Gge wrote:

> The Dlink DFE530TX ( VIA chipset) fails to initialize with fetnd5.sys 
> driver ( rename to pcnet.sys) as per debug messages below.
> The "Adapter Type"  parameter setup in registry is "5"
>
> Any suggestion ?

Try the attached patch. (Note: I know next to nothing about NDIS, so it 
can be plainly wrong, but I think it's worth trying. ;-)

Regards,
Filip
-------------- next part --------------
Index: ndis/ndis/protocol.c
===================================================================
--- ndis/ndis/protocol.c	(revision 1)
+++ ndis/ndis/protocol.c	(working copy)
@@ -321,53 +321,60 @@
    */
   if(Adapter->Miniport->Chars.SendPacketsHandler)
     {
-      /* TODO: support deserialized miniports by checking for attributes */
-      /* SendPackets is called at DISPATCH_LEVEL for all serialized miniports */
-      KeRaiseIrql(DISPATCH_LEVEL, &RaiseOldIrql);
+      if(Adapter->NdisMiniportBlock.Flags & NDIS_ATTRIBUTE_DESERIALIZE)
         {
           NDIS_DbgPrint(MAX_TRACE, ("Calling miniport's SendPackets handler\n"));
           (*Adapter->Miniport->Chars.SendPacketsHandler)(Adapter->NdisMiniportBlock.MiniportAdapterContext, &Packet, 1);
         }
-      KeLowerIrql(RaiseOldIrql);
-
-      /* XXX why the hell do we do this? */
-      NDIS_DbgPrint(MAX_TRACE, ("acquiring miniport block lock\n"));
-      KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &SpinOldIrql);
+      else
         {
-          if (Adapter->WorkQueueHead)
-            KeInsertQueueDpc(&Adapter->MiniportDpc, NULL, NULL);
+          /* SendPackets is called at DISPATCH_LEVEL for all serialized miniports */
+          KeRaiseIrql(DISPATCH_LEVEL, &RaiseOldIrql);
+            {
+              NDIS_DbgPrint(MAX_TRACE, ("Calling miniport's SendPackets handler\n"));
+              (*Adapter->Miniport->Chars.SendPacketsHandler)(Adapter->NdisMiniportBlock.MiniportAdapterContext, &Packet, 1);
+            }
+          KeLowerIrql(RaiseOldIrql);
         }
-      KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, SpinOldIrql);
 
-      NDIS_DbgPrint(MAX_TRACE, ("MiniportDpc queued; returning NDIS_STATUS_SCUCESS\n"));
-
       /* SendPackets handlers return void - they always "succeed" */
       NdisStatus = NDIS_STATUS_SUCCESS;
     }
   else
     {
-      /* Send handlers always run at DISPATCH_LEVEL so we raise here */
-      KeRaiseIrql(DISPATCH_LEVEL, &RaiseOldIrql);
+      /* XXX FIXME THIS IS WRONG */
+      /* uh oh... forgot why i thought that... */
+      if(Adapter->NdisMiniportBlock.Flags & NDIS_ATTRIBUTE_DESERIALIZE)
         {
-          /* XXX FIXME THIS IS WRONG */
-          /* uh oh... forgot why i thought that... */
+          NDIS_DbgPrint(MAX_TRACE, ("Calling miniport's Send handler\n"));
+          NdisStatus = (*Adapter->Miniport->Chars.u1.SendHandler)(Adapter->NdisMiniportBlock.MiniportAdapterContext, Packet, 0);
+          NDIS_DbgPrint(MAX_TRACE, ("back from miniport's send handler\n"));
+        }
+      else
+        {
+          /* Send handlers always run at DISPATCH_LEVEL so we raise here */
+          KeRaiseIrql(DISPATCH_LEVEL, &RaiseOldIrql);
 
           NDIS_DbgPrint(MAX_TRACE, ("Calling miniport's Send handler\n"));
           NdisStatus = (*Adapter->Miniport->Chars.u1.SendHandler)(Adapter->NdisMiniportBlock.MiniportAdapterContext, Packet, 0);
           NDIS_DbgPrint(MAX_TRACE, ("back from miniport's send handler\n"));
 
-          /* XXX why the hell do we do this? */
-          NDIS_DbgPrint(MAX_TRACE, ("acquiring miniport block lock\n"));
-          KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock);
-            {
-              if (Adapter->WorkQueueHead)
-                KeInsertQueueDpc(&Adapter->MiniportDpc, NULL, NULL);
-            }
-          KeReleaseSpinLockFromDpcLevel(&Adapter->NdisMiniportBlock.Lock);
+          KeLowerIrql(RaiseOldIrql);
         }
-      KeLowerIrql(RaiseOldIrql);
     }
 
+  /* XXX why the hell do we do this? */
+  NDIS_DbgPrint(MAX_TRACE, ("acquiring miniport block lock\n"));
+  KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &SpinOldIrql);
+    {
+      if (Adapter->WorkQueueHead)
+        {
+          KeInsertQueueDpc(&Adapter->MiniportDpc, NULL, NULL);
+          NDIS_DbgPrint(MAX_TRACE, ("MiniportDpc queued; returning NDIS_STATUS_SUCCESS\n"));
+        }
+    }
+  KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, SpinOldIrql);
+
   NDIS_DbgPrint(MAX_TRACE, ("returning 0x%x\n", NdisStatus));
   return NdisStatus;
 }
Index: ndis/ndis/miniport.c
===================================================================
--- ndis/ndis/miniport.c	(revision 1)
+++ ndis/ndis/miniport.c	(working copy)
@@ -1912,13 +1912,6 @@
 
   Adapter->NdisMiniportBlock.AdapterType = AdapterType;
   Adapter->AttributesSet = TRUE;
-
-  if(AttributeFlags & NDIS_ATTRIBUTE_DESERIALIZE)
-    {
-      NDIS_DbgPrint(MIN_TRACE, ("Deserialized miniport - UNIMPLEMENTED\n"));
-      /* XXX when this is implemented, be sure to fix ProSend() to not nail the irql up to dispatch_level */
-      ASSERT(0);
-    }
 }
 
 
Index: ndis/ndis/io.c
===================================================================
--- ndis/ndis/io.c	(revision 1)
+++ ndis/ndis/io.c	(working copy)
@@ -332,7 +332,7 @@
 
   /* only bus masters may call this routine */
   ASSERT(Adapter->NdisMiniportBlock.Flags & NDIS_ATTRIBUTE_BUS_MASTER);
-  if(!Adapter->NdisMiniportBlock.Flags & NDIS_ATTRIBUTE_BUS_MASTER)
+  if(!(Adapter->NdisMiniportBlock.Flags & NDIS_ATTRIBUTE_BUS_MASTER))
     return NDIS_STATUS_SUCCESS;
 
   DeviceObject = Adapter->NdisMiniportBlock.DeviceObject;
@@ -660,7 +660,7 @@
 
   /* only bus masters may call this routine */
   ASSERT(Adapter->NdisMiniportBlock.Flags & NDIS_ATTRIBUTE_BUS_MASTER);
-  if(!Adapter->NdisMiniportBlock.Flags & NDIS_ATTRIBUTE_BUS_MASTER)
+  if(!(Adapter->NdisMiniportBlock.Flags & NDIS_ATTRIBUTE_BUS_MASTER))
     return;
 
   MapRegistersPerBaseRegister = ((Adapter->NdisMiniportBlock.MaximumPhysicalMapping - 2) / PAGE_SIZE) + 2;


More information about the Ros-kernel mailing list