[ros-diffs] [cgutman] 42152: - Implement link speed and duplex detection - Fix LED programming (we didn't set LEDPE so all our programming was ignored) - Add some other LED programming - Fixes bug 4703

cgutman at svn.reactos.org cgutman at svn.reactos.org
Thu Jul 23 14:56:46 CEST 2009


Author: cgutman
Date: Thu Jul 23 06:21:06 2009
New Revision: 42152

URL: http://svn.reactos.org/svn/reactos?rev=42152&view=rev
Log:
 - Implement link speed and duplex detection
 - Fix LED programming (we didn't set LEDPE so all our programming was ignored)
 - Add some other LED programming
 - Fixes bug 4703

Modified:
    trunk/reactos/drivers/network/dd/pcnet/pcnet.c
    trunk/reactos/drivers/network/dd/pcnet/pcnet.h
    trunk/reactos/drivers/network/dd/pcnet/pcnethw.h
    trunk/reactos/drivers/network/dd/pcnet/requests.c

Modified: trunk/reactos/drivers/network/dd/pcnet/pcnet.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/dd/pcnet/pcnet.c?rev=42152&r1=42151&r2=42152&view=diff
==============================================================================
--- trunk/reactos/drivers/network/dd/pcnet/pcnet.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/network/dd/pcnet/pcnet.c [iso-8859-1] Thu Jul 23 06:21:06 2009
@@ -607,12 +607,18 @@
 {
   PADAPTER Adapter = (PADAPTER)SynchronizeContext;
   NDIS_MEDIA_STATE MediaState = MiGetMediaState(Adapter);
+  UINT MediaSpeed = MiGetMediaSpeed(Adapter);
+  BOOLEAN FullDuplex = MiGetMediaDuplex(Adapter);
 
   DPRINT("Called\n");
   DPRINT("MediaState: %d\n", MediaState);
-  if (MediaState != Adapter->MediaState)
+  if (MediaState != Adapter->MediaState ||
+      MediaSpeed != Adapter->MediaSpeed ||
+      FullDuplex != Adapter->FullDuplex)
     {
       Adapter->MediaState = MediaState;
+      Adapter->MediaSpeed = MediaSpeed;
+      Adapter->FullDuplex = FullDuplex;
       return TRUE;
     }
   return FALSE;
@@ -721,10 +727,29 @@
   NdisRawWritePortUshort(Adapter->PortOffset + RAP, CSR0);
   NdisRawWritePortUshort(Adapter->PortOffset + RDP, CSR0_STRT|CSR0_INIT|CSR0_IENA);
 
-  /* detect the media state */
+  /* Allow LED programming */
+  NdisRawWritePortUshort(Adapter->PortOffset + RAP, BCR2);
+  NdisRawWritePortUshort(Adapter->PortOffset + BDP, BCR2_LEDPE);
+
+  /* LED0 is configured for link status (on = up, off = down) */
   NdisRawWritePortUshort(Adapter->PortOffset + RAP, BCR4);
-  NdisRawWritePortUshort(Adapter->PortOffset + BDP, BCR4_LNKSTE|BCR4_FDLSE);
+  NdisRawWritePortUshort(Adapter->PortOffset + BDP, BCR4_LNKSTE | BCR4_PSE);
+
+  /* LED1 is configured for link duplex (on = full, off = half) */
+  NdisRawWritePortUshort(Adapter->PortOffset + RAP, BCR5);
+  NdisRawWritePortUshort(Adapter->PortOffset + BDP, BCR5_FDLSE | BCR5_PSE);
+
+  /* LED2 is configured for link speed (on = 100M, off = 10M) */
+  NdisRawWritePortUshort(Adapter->PortOffset + RAP, BCR6);
+  NdisRawWritePortUshort(Adapter->PortOffset + BDP, BCR6_E100 | BCR6_PSE);
+
+  /* LED3 is configured for trasmit/receive activity */
+  NdisRawWritePortUshort(Adapter->PortOffset + RAP, BCR7);
+  NdisRawWritePortUshort(Adapter->PortOffset + BDP, BCR7_XMTE | BCR7_RCVE | BCR7_PSE);
+
   Adapter->MediaState = MiGetMediaState(Adapter);
+  Adapter->FullDuplex = MiGetMediaDuplex(Adapter);
+  Adapter->MediaSpeed = MiGetMediaSpeed(Adapter);
 
   DPRINT("card started\n");
 
@@ -1240,6 +1265,30 @@
   return NDIS_STATUS_SUCCESS;
 }
 
+BOOLEAN
+NTAPI
+MiGetMediaDuplex(PADAPTER Adapter)
+{
+  ULONG Data;
+
+  NdisRawWritePortUshort(Adapter->PortOffset + RAP, BCR5);
+  NdisRawReadPortUshort(Adapter->PortOffset + BDP, &Data);
+
+  return Data & BCR5_LEDOUT;
+}
+
+UINT
+NTAPI
+MiGetMediaSpeed(PADAPTER Adapter)
+{
+  ULONG Data;
+
+  NdisRawWritePortUshort(Adapter->PortOffset + RAP, BCR4);
+  NdisRawReadPortUshort(Adapter->PortOffset + BDP, &Data);
+
+  return Data & BCR6_LEDOUT ? 100 : 10;
+}
+
 NDIS_MEDIA_STATE
 NTAPI
 MiGetMediaState(PADAPTER Adapter)

Modified: trunk/reactos/drivers/network/dd/pcnet/pcnet.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/dd/pcnet/pcnet.h?rev=42152&r1=42151&r2=42152&view=diff
==============================================================================
--- trunk/reactos/drivers/network/dd/pcnet/pcnet.h [iso-8859-1] (original)
+++ trunk/reactos/drivers/network/dd/pcnet/pcnet.h [iso-8859-1] Thu Jul 23 06:21:06 2009
@@ -60,6 +60,8 @@
   ULONG_PTR PortOffset;
   NDIS_MINIPORT_INTERRUPT InterruptObject;
   NDIS_MEDIA_STATE MediaState;
+  UINT MediaSpeed;
+  BOOLEAN FullDuplex;
   NDIS_MINIPORT_TIMER MediaDetectionTimer;
   ULONG CurrentReceiveDescriptorIndex;
   ULONG CurrentPacketFilter;
@@ -129,6 +131,14 @@
 NTAPI
 MiGetMediaState(PADAPTER Adapter);
 
+UINT
+NTAPI
+MiGetMediaSpeed(PADAPTER Adapter);
+
+BOOLEAN
+NTAPI
+MiGetMediaDuplex(PADAPTER Adapter);
+
 /* operational constants */
 #define NUMBER_OF_BUFFERS     0x20
 #define LOG_NUMBER_OF_BUFFERS 5         /* log2(NUMBER_OF_BUFFERS) */

Modified: trunk/reactos/drivers/network/dd/pcnet/pcnethw.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/dd/pcnet/pcnethw.h?rev=42152&r1=42151&r2=42152&view=diff
==============================================================================
--- trunk/reactos/drivers/network/dd/pcnet/pcnethw.h [iso-8859-1] (original)
+++ trunk/reactos/drivers/network/dd/pcnet/pcnethw.h [iso-8859-1] Thu Jul 23 06:21:06 2009
@@ -250,6 +250,7 @@
 #define BCR2_DXCVRCTL  0x20     /* dxcvr control */
 #define BCR2_INTLEVEL  0x80     /* interrupt level/edge */
 #define BCR2_APROMWE   0x100    /* address prom write enable */
+#define BCR2_LEDPE     0x1000   /* LED programming enable */
 #define BCR2_TMAULOOP  0x4000   /* t-mau transmit on loopback */
 
 /* BCR4 bits */
@@ -263,6 +264,7 @@
 #define BCR4_PSE       0x80     /* pulse stretcher enable */
 #define BCR4_FDLSE     0x100    /* full-duplex link status enable */
 #define BCR4_MPSE      0x200    /* magic packet status enable */
+#define BCR4_E100      0x1000   /* link speed */
 #define BCR4_LEDDIS    0x2000   /* led disable */
 #define BCR4_LEDPOL    0x4000   /* led polarity */
 #define BCR4_LEDOUT    0x8000   /* led output pin value */
@@ -278,6 +280,7 @@
 #define BCR5_PSE       0x80     /* pulse stretcher enable */
 #define BCR5_FDLSE     0x100    /* full-duplex link status enable */
 #define BCR5_MPSE      0x200    /* magic packet status enable */
+#define BCR5_E100      0x1000   /* link speed */
 #define BCR5_LEDDIS    0x2000   /* led disable */
 #define BCR5_LEDPOL    0x4000   /* led polarity */
 #define BCR5_LEDOUT    0x8000   /* led output pin value */
@@ -293,6 +296,7 @@
 #define BCR6_PSE       0x80     /* pulse stretcher enable */
 #define BCR6_FDLSE     0x100    /* full-duplex link status enable */
 #define BCR6_MPSE      0x200    /* magic packet status enable */
+#define BCR6_E100      0x1000   /* link speed */
 #define BCR6_LEDDIS    0x2000   /* led disable */
 #define BCR6_LEDPOL    0x4000   /* led polarity */
 #define BCR6_LEDOUT    0x8000   /* led output pin value */
@@ -308,6 +312,7 @@
 #define BCR7_PSE       0x80     /* pulse stretcher enable */
 #define BCR7_FDLSE     0x100    /* full-duplex link status enable */
 #define BCR7_MPSE      0x200    /* magic packet status enable */
+#define BCR7_E100      0x1000   /* link speed */
 #define BCR7_LEDDIS    0x2000   /* led disable */
 #define BCR7_LEDPOL    0x4000   /* led polarity */
 #define BCR7_LEDOUT    0x8000   /* led output pin value */

Modified: trunk/reactos/drivers/network/dd/pcnet/requests.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/dd/pcnet/requests.c?rev=42152&r1=42151&r2=42152&view=diff
==============================================================================
--- trunk/reactos/drivers/network/dd/pcnet/requests.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/network/dd/pcnet/requests.c [iso-8859-1] Thu Jul 23 06:21:06 2009
@@ -173,7 +173,7 @@
 
     case OID_GEN_LINK_SPEED:
         {
-          GenericULONG = 100000;  /* 10Mbps */
+          GenericULONG = Adapter->MediaSpeed * 10000;
           break;
         }
 




More information about the Ros-diffs mailing list