summaryrefslogtreecommitdiffstats
path: root/libs
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
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')
-rw-r--r--libs/NCSI/CMakeLists.txt6
-rw-r--r--libs/NCSI/include/NCSI.h7
-rw-r--r--libs/NCSI/ncsi.c39
-rw-r--r--libs/Network/include/Network.h9
-rw-r--r--libs/Network/ports.c29
5 files changed, 47 insertions, 43 deletions
diff --git a/libs/NCSI/CMakeLists.txt b/libs/NCSI/CMakeLists.txt
index 58b4f39..b169858 100644
--- a/libs/NCSI/CMakeLists.txt
+++ b/libs/NCSI/CMakeLists.txt
@@ -52,13 +52,15 @@ SET(SOURCES
# Host Simulation library
simulator_add_library(${PROJECT_NAME} STATIC ncsi.c)
-target_link_libraries(${PROJECT_NAME} PRIVATE simulator Network MII APE)
+target_link_libraries(${PROJECT_NAME} PRIVATE simulator MII APE)
+target_link_libraries(${PROJECT_NAME} PUBLIC Network)
target_include_directories(${PROJECT_NAME} PUBLIC ../../include)
target_include_directories(${PROJECT_NAME} PUBLIC include)
# ARM Library
arm_add_library(${PROJECT_NAME}-arm STATIC ${SOURCES})
-target_link_libraries(${PROJECT_NAME}-arm PRIVATE Network-arm MII-arm APE-arm printf-arm)
+target_link_libraries(${PROJECT_NAME}-arm PRIVATE MII-arm APE-arm printf-arm)
+target_link_libraries(${PROJECT_NAME}-arm PUBLIC Network-arm)
target_include_directories(${PROJECT_NAME}-arm PUBLIC ../../include)
target_include_directories(${PROJECT_NAME}-arm PUBLIC include)
diff --git a/libs/NCSI/include/NCSI.h b/libs/NCSI/include/NCSI.h
index fc1a557..9bb3bcd 100644
--- a/libs/NCSI/include/NCSI.h
+++ b/libs/NCSI/include/NCSI.h
@@ -47,6 +47,7 @@
#include <types.h>
#include <Ethernet.h>
+#include <Network.h>
void handleNCSIFrame(NetworkFrame_t* frame);
@@ -70,12 +71,6 @@ void NCSI_handlePassthrough(void);
void NCSI_init(void);
-
-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;
void NCSI_reload(reload_type_t reset_phy);
#endif /* NCSI_H */ \ No newline at end of file
diff --git a/libs/NCSI/ncsi.c b/libs/NCSI/ncsi.c
index 9be9f81..46f5be9 100644
--- a/libs/NCSI/ncsi.c
+++ b/libs/NCSI/ncsi.c
@@ -315,7 +315,7 @@ static void enableChannelHandler(NetworkFrame_t *frame)
debug("Enable Channel: %x\n", ch);
gPackageState.port[ch]->shm_channel->NcsiChannelInfo.bits.Enabled = true;
- Network_InitPort(gPackageState.port[ch]);
+ Network_InitPort(gPackageState.port[ch], AS_NEEDED);
sendNCSIResponse(frame->controlPacket.InstanceID, frame->controlPacket.ChannelID, frame->controlPacket.ControlPacketType,
NCSI_RESPONSE_CODE_COMMAND_COMPLETE, NCSI_REASON_CODE_NONE);
@@ -406,8 +406,6 @@ static void getLinkStatusHandler(NetworkFrame_t *frame)
uint32_t rx = port->shm_channel->NcsiChannelCtrlstatAllRx.r32;
uint32_t tx = port->shm_channel->NcsiChannelCtrlstatAllRx.r32;
- debug("Link Status [%d], TX %d, RX %d\n", frame->controlPacket.ChannelID, tx, rx);
-
Network_checkPortState(port);
APE_aquireLock();
@@ -416,6 +414,17 @@ static void getLinkStatusHandler(NetworkFrame_t *frame)
RegSHM_CHANNELNcsiChannelStatus_t linkStatus = port->shm_channel->NcsiChannelStatus;
+ debug("Link Status [%d] %s, TX %d, RX %d\n", frame->controlPacket.ChannelID, stat.bits.LinkStatus ? "up" : "down", tx, rx);
+
+ if (!stat.bits.LinkStatus)
+ {
+ if (!Network_isLinkUp(port))
+ {
+ printf("Resetting link.\n");
+ Network_resetLink(port);
+ }
+ }
+
linkStatus.bits.Linkup = stat.bits.LinkStatus;
linkStatus.bits.LinkStatus = stat.bits.AutoNegotiationHCD;
linkStatus.bits.AutonegotiationEnabled = 1;
@@ -691,29 +700,7 @@ void reloadChannel(int ch, reload_type_t reset_phy)
{
printf("[ch %d] Reusing MAC: 0x%02X%04X\n", ch, high, low);
- bool reset;
- switch (reset_phy)
- {
- case NEVER_RESET:
- reset = false;
- break;
- case AS_NEEDED:
- reset = !Network_isLinkUp(port);
- break;
- case ALWAYS_RESET:
- reset = true;
- break;
- }
-
- if (reset)
- {
- 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();
- }
-
- Network_InitPort(gPackageState.port[ch]);
+ Network_InitPort(gPackageState.port[ch], reset_phy);
}
}
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