summaryrefslogtreecommitdiffstats
path: root/libs/Network
diff options
context:
space:
mode:
authorEvan Lojewski <github@meklort.com>2020-02-29 09:27:22 -0700
committerGitHub <noreply@github.com>2020-02-29 09:27:22 -0700
commitd6577dec26661b219e8d85443bdeedac8e0ec9b8 (patch)
tree76eb4bf1be97b7ee7bc4fe5b2b61b6b016de24b7 /libs/Network
parent278bd0be064a643ea3574a2c291b6eefc7ced920 (diff)
downloadbcm5719-ortega-d6577dec26661b219e8d85443bdeedac8e0ec9b8.tar.gz
bcm5719-ortega-d6577dec26661b219e8d85443bdeedac8e0ec9b8.zip
ape: Improve handling of reconfiguration event to make the network link more robust. (#50)
Diffstat (limited to 'libs/Network')
-rw-r--r--libs/Network/include/Network.h9
-rw-r--r--libs/Network/ports.c29
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
{
OpenPOWER on IntegriCloud