mirror of
https://github.com/reactos/reactos.git
synced 2025-08-04 03:55:41 +00:00
- 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:
parent
194297c386
commit
dff406bfd7
4 changed files with 68 additions and 4 deletions
|
@ -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)
|
||||||
|
|
|
@ -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) */
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -173,7 +173,7 @@ MiniportQueryInformation(
|
||||||
|
|
||||||
case OID_GEN_LINK_SPEED:
|
case OID_GEN_LINK_SPEED:
|
||||||
{
|
{
|
||||||
GenericULONG = 100000; /* 10Mbps */
|
GenericULONG = Adapter->MediaSpeed * 10000;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue