- 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; PADAPTER Adapter = (PADAPTER)SynchronizeContext;
NDIS_MEDIA_STATE MediaState = MiGetMediaState(Adapter); NDIS_MEDIA_STATE MediaState = MiGetMediaState(Adapter);
UINT MediaSpeed = MiGetMediaSpeed(Adapter);
BOOLEAN FullDuplex = MiGetMediaDuplex(Adapter);
DPRINT("Called\n"); DPRINT("Called\n");
DPRINT("MediaState: %d\n", MediaState); DPRINT("MediaState: %d\n", MediaState);
if (MediaState != Adapter->MediaState) if (MediaState != Adapter->MediaState ||
MediaSpeed != Adapter->MediaSpeed ||
FullDuplex != Adapter->FullDuplex)
{ {
Adapter->MediaState = MediaState; Adapter->MediaState = MediaState;
Adapter->MediaSpeed = MediaSpeed;
Adapter->FullDuplex = FullDuplex;
return TRUE; return TRUE;
} }
return FALSE; return FALSE;
@ -721,10 +727,29 @@ MiInitChip(
NdisRawWritePortUshort(Adapter->PortOffset + RAP, CSR0); NdisRawWritePortUshort(Adapter->PortOffset + RAP, CSR0);
NdisRawWritePortUshort(Adapter->PortOffset + RDP, CSR0_STRT|CSR0_INIT|CSR0_IENA); 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 + 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->MediaState = MiGetMediaState(Adapter);
Adapter->FullDuplex = MiGetMediaDuplex(Adapter);
Adapter->MediaSpeed = MiGetMediaSpeed(Adapter);
DPRINT("card started\n"); DPRINT("card started\n");
@ -1240,6 +1265,30 @@ MiSetMulticast(
return NDIS_STATUS_SUCCESS; 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 NDIS_MEDIA_STATE
NTAPI NTAPI
MiGetMediaState(PADAPTER Adapter) MiGetMediaState(PADAPTER Adapter)

View file

@ -60,6 +60,8 @@ typedef struct _ADAPTER
ULONG_PTR PortOffset; ULONG_PTR PortOffset;
NDIS_MINIPORT_INTERRUPT InterruptObject; NDIS_MINIPORT_INTERRUPT InterruptObject;
NDIS_MEDIA_STATE MediaState; NDIS_MEDIA_STATE MediaState;
UINT MediaSpeed;
BOOLEAN FullDuplex;
NDIS_MINIPORT_TIMER MediaDetectionTimer; NDIS_MINIPORT_TIMER MediaDetectionTimer;
ULONG CurrentReceiveDescriptorIndex; ULONG CurrentReceiveDescriptorIndex;
ULONG CurrentPacketFilter; ULONG CurrentPacketFilter;
@ -129,6 +131,14 @@ NDIS_MEDIA_STATE
NTAPI NTAPI
MiGetMediaState(PADAPTER Adapter); MiGetMediaState(PADAPTER Adapter);
UINT
NTAPI
MiGetMediaSpeed(PADAPTER Adapter);
BOOLEAN
NTAPI
MiGetMediaDuplex(PADAPTER Adapter);
/* operational constants */ /* operational constants */
#define NUMBER_OF_BUFFERS 0x20 #define NUMBER_OF_BUFFERS 0x20
#define LOG_NUMBER_OF_BUFFERS 5 /* log2(NUMBER_OF_BUFFERS) */ #define LOG_NUMBER_OF_BUFFERS 5 /* log2(NUMBER_OF_BUFFERS) */

View file

@ -250,6 +250,7 @@
#define BCR2_DXCVRCTL 0x20 /* dxcvr control */ #define BCR2_DXCVRCTL 0x20 /* dxcvr control */
#define BCR2_INTLEVEL 0x80 /* interrupt level/edge */ #define BCR2_INTLEVEL 0x80 /* interrupt level/edge */
#define BCR2_APROMWE 0x100 /* address prom write enable */ #define BCR2_APROMWE 0x100 /* address prom write enable */
#define BCR2_LEDPE 0x1000 /* LED programming enable */
#define BCR2_TMAULOOP 0x4000 /* t-mau transmit on loopback */ #define BCR2_TMAULOOP 0x4000 /* t-mau transmit on loopback */
/* BCR4 bits */ /* BCR4 bits */
@ -263,6 +264,7 @@
#define BCR4_PSE 0x80 /* pulse stretcher enable */ #define BCR4_PSE 0x80 /* pulse stretcher enable */
#define BCR4_FDLSE 0x100 /* full-duplex link status enable */ #define BCR4_FDLSE 0x100 /* full-duplex link status enable */
#define BCR4_MPSE 0x200 /* magic packet status enable */ #define BCR4_MPSE 0x200 /* magic packet status enable */
#define BCR4_E100 0x1000 /* link speed */
#define BCR4_LEDDIS 0x2000 /* led disable */ #define BCR4_LEDDIS 0x2000 /* led disable */
#define BCR4_LEDPOL 0x4000 /* led polarity */ #define BCR4_LEDPOL 0x4000 /* led polarity */
#define BCR4_LEDOUT 0x8000 /* led output pin value */ #define BCR4_LEDOUT 0x8000 /* led output pin value */
@ -278,6 +280,7 @@
#define BCR5_PSE 0x80 /* pulse stretcher enable */ #define BCR5_PSE 0x80 /* pulse stretcher enable */
#define BCR5_FDLSE 0x100 /* full-duplex link status enable */ #define BCR5_FDLSE 0x100 /* full-duplex link status enable */
#define BCR5_MPSE 0x200 /* magic packet status enable */ #define BCR5_MPSE 0x200 /* magic packet status enable */
#define BCR5_E100 0x1000 /* link speed */
#define BCR5_LEDDIS 0x2000 /* led disable */ #define BCR5_LEDDIS 0x2000 /* led disable */
#define BCR5_LEDPOL 0x4000 /* led polarity */ #define BCR5_LEDPOL 0x4000 /* led polarity */
#define BCR5_LEDOUT 0x8000 /* led output pin value */ #define BCR5_LEDOUT 0x8000 /* led output pin value */
@ -293,6 +296,7 @@
#define BCR6_PSE 0x80 /* pulse stretcher enable */ #define BCR6_PSE 0x80 /* pulse stretcher enable */
#define BCR6_FDLSE 0x100 /* full-duplex link status enable */ #define BCR6_FDLSE 0x100 /* full-duplex link status enable */
#define BCR6_MPSE 0x200 /* magic packet status enable */ #define BCR6_MPSE 0x200 /* magic packet status enable */
#define BCR6_E100 0x1000 /* link speed */
#define BCR6_LEDDIS 0x2000 /* led disable */ #define BCR6_LEDDIS 0x2000 /* led disable */
#define BCR6_LEDPOL 0x4000 /* led polarity */ #define BCR6_LEDPOL 0x4000 /* led polarity */
#define BCR6_LEDOUT 0x8000 /* led output pin value */ #define BCR6_LEDOUT 0x8000 /* led output pin value */
@ -308,6 +312,7 @@
#define BCR7_PSE 0x80 /* pulse stretcher enable */ #define BCR7_PSE 0x80 /* pulse stretcher enable */
#define BCR7_FDLSE 0x100 /* full-duplex link status enable */ #define BCR7_FDLSE 0x100 /* full-duplex link status enable */
#define BCR7_MPSE 0x200 /* magic packet status enable */ #define BCR7_MPSE 0x200 /* magic packet status enable */
#define BCR7_E100 0x1000 /* link speed */
#define BCR7_LEDDIS 0x2000 /* led disable */ #define BCR7_LEDDIS 0x2000 /* led disable */
#define BCR7_LEDPOL 0x4000 /* led polarity */ #define BCR7_LEDPOL 0x4000 /* led polarity */
#define BCR7_LEDOUT 0x8000 /* led output pin value */ #define BCR7_LEDOUT 0x8000 /* led output pin value */

View file

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