diff options
Diffstat (limited to 'libs/Network')
-rw-r--r-- | libs/Network/include/Network.h | 9 | ||||
-rw-r--r-- | libs/Network/ports.c | 29 |
2 files changed, 29 insertions, 9 deletions
diff --git a/libs/Network/include/Network.h b/libs/Network/include/Network.h index b90e96e..9b51526 100644 --- a/libs/Network/include/Network.h +++ b/libs/Network/include/Network.h @@ -95,12 +95,18 @@ typedef union } bits; } network_control_t; +typedef enum { + NEVER_RESET, /* Host up, do not reset the PHY */ + AS_NEEDED, /* Reset the phy if no link */ + ALWAYS_RESET /* Host was just turned off, reset phy */ +} reload_type_t; + extern NetworkPort_t gPort0; extern NetworkPort_t gPort1; extern NetworkPort_t gPort2; extern NetworkPort_t gPort3; -void Network_InitPort(NetworkPort_t *port); +void Network_InitPort(NetworkPort_t *port, reload_type_t force_reset); void Network_resetTX(NetworkPort_t *port); void Network_resetRX(NetworkPort_t *port); @@ -109,6 +115,7 @@ void Network_checkPortState(NetworkPort_t *port); bool Network_updatePortState(NetworkPort_t *port); bool Network_isLinkUp(NetworkPort_t *port); +void Network_resetLink(NetworkPort_t *port); uint32_t Network_TX_numBlocksNeeded(uint32_t frame_size); diff --git a/libs/Network/ports.c b/libs/Network/ports.c index 2308308..4f1ca67 100644 --- a/libs/Network/ports.c +++ b/libs/Network/ports.c @@ -800,12 +800,19 @@ void Network_resetRX(NetworkPort_t *port) *(port->rx_mode) = rxMode; } -void Network_InitPort(NetworkPort_t *port) +void Network_InitPort(NetworkPort_t *port, reload_type_t reset_phy) { RegMIIStatus_t stat; RegMIIIeeeExtendedStatus_t ext_stat; RegSHM_CHANNELNcsiChannelStatus_t linkStatus; - uint8_t phy; + uint8_t phy = MII_getPhy(port->device); + + if ((ALWAYS_RESET == reset_phy) || (AS_NEEDED == reset_phy && !Network_isLinkUp(port))) + { + APE_aquireLock(); + MII_writeRegister(port->device, phy, (mii_reg_t)REG_MII_CONTROL, MII_CONTROL_RESET_MASK); + APE_releaseLock(); + } Network_InitFilters(port); @@ -884,8 +891,6 @@ void Network_InitPort(NetworkPort_t *port) port->device->GrcModeControl.bits.HostStackUp = 1; // Enable packet RX - phy = MII_getPhy(port->device); - APE_aquireLock(); Network_updatePortState(port); @@ -1015,6 +1020,14 @@ bool Network_updatePortState(NetworkPort_t *port) return updated; } +void Network_resetLink(NetworkPort_t *port) +{ + uint8_t phy = MII_getPhy(port->device); + APE_aquireLock(); + MII_writeRegister(port->device, phy, (mii_reg_t)REG_MII_CONTROL, MII_CONTROL_RESET_MASK); + APE_releaseLock(); +} + bool Network_isLinkUp(NetworkPort_t *port) { uint8_t phy = MII_getPhy(port->device); @@ -1025,16 +1038,16 @@ bool Network_isLinkUp(NetworkPort_t *port) control.r16 = MII_readRegister(port->device, phy, (mii_reg_t)REG_MII_CONTROL); if (control.bits.RestartAutonegotiation) { - // Renegotiating, link not yet up. - linkup = false; + // Renegotiating, link not yet up, but in progress + linkup = true; } else { status.r16 = MII_readRegister(port->device, phy, (mii_reg_t)REG_MII_AUXILIARY_STATUS_SUMMARY); if (control.bits.AutoNegotiationEnable && !status.bits.AutoNegotiationComplete) { - // Renegotiating, link not yet up. - linkup = false; + // Renegotiating, link not yet up, but in progress + linkup = true; } else { |