diff options
Diffstat (limited to 'libs')
-rw-r--r-- | libs/NCSI/CMakeLists.txt | 6 | ||||
-rw-r--r-- | libs/NCSI/include/NCSI.h | 7 | ||||
-rw-r--r-- | libs/NCSI/ncsi.c | 39 | ||||
-rw-r--r-- | libs/Network/include/Network.h | 9 | ||||
-rw-r--r-- | libs/Network/ports.c | 29 |
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 { |