- 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

svn path=/trunk/; revision=42152
This commit is contained in:
Cameron Gutman 2009-07-23 04:21:06 +00:00
parent 194297c386
commit dff406bfd7
4 changed files with 68 additions and 4 deletions

View file

@ -607,12 +607,18 @@ MiSyncMediaDetection(
{
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 @@ MiInitChip(
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 @@ MiSetMulticast(
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)

View file

@ -60,6 +60,8 @@ typedef struct _ADAPTER
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 @@ NDIS_MEDIA_STATE
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) */

View file

@ -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 */

View file

@ -173,7 +173,7 @@ MiniportQueryInformation(
case OID_GEN_LINK_SPEED:
{
GenericULONG = 100000; /* 10Mbps */
GenericULONG = Adapter->MediaSpeed * 10000;
break;
}