From ffb8f12c25642fd3f5dfa8d878ac53f4ea2d914d Mon Sep 17 00:00:00 2001 From: Evan Lojewski Date: Sun, 19 Jul 2020 20:17:43 -0600 Subject: network: Always check registers during init and place them in a known state. (#95) --- libs/NCSI/ncsi.c | 8 ++--- libs/Network/include/Network.h | 4 +-- libs/Network/ports.c | 82 ++++++++++++++++++++++++++++-------------- 3 files changed, 59 insertions(+), 35 deletions(-) (limited to 'libs') diff --git a/libs/NCSI/ncsi.c b/libs/NCSI/ncsi.c index c54eb72..88f603d 100644 --- a/libs/NCSI/ncsi.c +++ b/libs/NCSI/ncsi.c @@ -523,7 +523,6 @@ static void setMACAddressHandler(NetworkFrame_t *frame) { int ch = frame->controlPacket.ChannelID & CHANNEL_ID_MASK; NetworkPort_t *port = gPackageState.port[ch]; - // port->shm_channel->NcsiChannelInfo.bits.Enabled = false; debug("Set MAC: channel %x\n", ch); debug(" MAC: 0x%04x%04x%04x\n", frame->setMACAddr.MAC54, frame->setMACAddr.MAC32, frame->setMACAddr.MAC10); @@ -700,12 +699,9 @@ void reloadChannel(int ch, reload_type_t reset_phy) uint16_t high = port->shm_channel->NcsiChannelMac0High.r32; Network_SetMACAddr(port, high, low, /* TBD */ 0, 1); - if (gPackageState.port[ch]->shm_channel->NcsiChannelInfo.bits.Enabled) - { - printf("[ch %d] Reusing MAC: 0x%02X%04X\n", ch, high, low); + printf("[ch %d] Reusing MAC: 0x%02X%04X\n", ch, high, low); - Network_InitPort(gPackageState.port[ch], reset_phy); - } + Network_InitPort(gPackageState.port[ch], reset_phy); } void NCSI_TxPacket(uint32_t *packet, uint32_t packet_len) diff --git a/libs/Network/include/Network.h b/libs/Network/include/Network.h index ab621d6..0b65755 100644 --- a/libs/Network/include/Network.h +++ b/libs/Network/include/Network.h @@ -105,8 +105,8 @@ NetworkPort_t *Network_getPort(int i); void Network_InitPort(NetworkPort_t *port, reload_type_t force_reset); -void Network_resetTX(NetworkPort_t *port); -void Network_resetRX(NetworkPort_t *port); +void Network_resetTX(NetworkPort_t *port, reload_type_t reset_phy); +void Network_resetRX(NetworkPort_t *port, reload_type_t reset_phy); void Network_checkPortState(NetworkPort_t *port); bool Network_updatePortState(NetworkPort_t *port); diff --git a/libs/Network/ports.c b/libs/Network/ports.c index 59d384e..0d14ce8 100644 --- a/libs/Network/ports.c +++ b/libs/Network/ports.c @@ -810,30 +810,40 @@ void Network_InitFilters(NetworkPort_t *port) #endif } -void Network_resetTX(NetworkPort_t *port) +void Network_resetTX(NetworkPort_t *port, reload_type_t reset_phy) { // Enable TX - RegAPETxToNetPoolModeStatus_t txMode; - txMode.r32 = 0; - txMode.bits.Reset = 1; - *(port->tx_mode) = txMode; - - txMode.bits.Reset = 0; - txMode.bits.Enable = 1; - *(port->tx_mode) = txMode; + RegAPETxToNetPoolModeStatus_t txMode = *port->tx_mode; + if ((ALWAYS_RESET == reset_phy) || txMode.bits.Error) + { + txMode.bits.Reset = 1; + *(port->tx_mode) = txMode; + } + + if (!txMode.bits.Enable) + { + txMode.bits.Reset = 0; + txMode.bits.Enable = 1; + *(port->tx_mode) = txMode; + } } -void Network_resetRX(NetworkPort_t *port) +void Network_resetRX(NetworkPort_t *port, reload_type_t reset_phy) { - // Enable RX - RegAPERxPoolModeStatus_t rxMode; - rxMode.r32 = 0; - rxMode.bits.Reset = 1; - *(port->rx_mode) = rxMode; - - rxMode.bits.Reset = 0; - rxMode.bits.Enable = 1; - *(port->rx_mode) = rxMode; + RegAPERxPoolModeStatus_t rxMode = *port->rx_mode; + if ((ALWAYS_RESET == reset_phy) || rxMode.bits.Error) + { + // Enable RX + rxMode.bits.Reset = 1; + *(port->rx_mode) = rxMode; + } + + if (!rxMode.bits.Enable) + { + rxMode.bits.Reset = 0; + rxMode.bits.Enable = 1; + *(port->rx_mode) = rxMode; + } } void Network_InitPort(NetworkPort_t *port, reload_type_t reset_phy) @@ -852,8 +862,8 @@ void Network_InitPort(NetworkPort_t *port, reload_type_t reset_phy) Network_InitFilters(port); - Network_resetTX(port); - Network_resetRX(port); + Network_resetTX(port, reset_phy); + Network_resetRX(port, reset_phy); APE.Mode.r32 |= port->APEModeEnable.r32; APE.Mode2.r32 |= port->APEMode2Enable.r32; @@ -865,14 +875,20 @@ void Network_InitPort(NetworkPort_t *port, reload_type_t reset_phy) macMode = port->device->ReceiveMacMode; macMode.bits.Enable = 1; macMode.bits.APEPromiscuousMode = 1; // When set, allows APE to RX without having to reset the network configuration after a power off - port->device->ReceiveMacMode = macMode; + if (port->device->ReceiveMacMode.r32 != macMode.r32) + { + port->device->ReceiveMacMode = macMode; + } // Enable RX/TX RegDEVICETransmitMacMode_t txMacMode; txMacMode = port->device->TransmitMacMode; txMacMode.bits.EnableTDE = 1; // txMacMode.bits.EnableFlowControl = 1; - port->device->TransmitMacMode = txMacMode; + if (port->device->TransmitMacMode.r32 != txMacMode.r32) + { + port->device->TransmitMacMode = txMacMode; + } RegDEVICEEeeMode_t eeeMode; eeeMode = port->device->EeeMode; @@ -881,14 +897,20 @@ void Network_InitPort(NetworkPort_t *port, reload_type_t reset_phy) eeeMode.bits.SendIndexDetectionEnable = 1; eeeMode.bits.TXLPIEnable = 1; eeeMode.bits.RXLPIEnable = 1; - port->device->EeeMode = eeeMode; + if (port->device->EeeMode.r32 != eeeMode.r32) + { + port->device->EeeMode = eeeMode; + } RegDEVICEBufferManagerMode_t bmm; bmm.r32 = 0; bmm.bits.Enable = 1; bmm.bits.AttentionEnable = 1; bmm.bits.ResetRXMBUFPointer = 1; - port->device->BufferManagerMode = bmm; + if (port->device->BufferManagerMode.r32 != bmm.r32) + { + port->device->BufferManagerMode = bmm; + } RegDEVICEEmacMode_t emacMode; emacMode = port->device->EmacMode; @@ -901,7 +923,10 @@ void Network_InitPort(NetworkPort_t *port, reload_type_t reset_phy) emacMode.bits.KeepFrameInWOL = 1; emacMode.bits.MACLoopbackModeControl = 0; - port->device->EmacMode = emacMode; + if (port->device->EmacMode.r32 != emacMode.r32) + { + port->device->EmacMode = emacMode; + } RegDEVICETransmitMacLengths_t txMacLengths; txMacLengths = port->device->TransmitMacLengths; @@ -919,7 +944,10 @@ void Network_InitPort(NetworkPort_t *port, reload_type_t reset_phy) cmm.bits.LinkIdlePowerModeEnable = 1; cmm.bits.LinkAwarePowerModeEnable = 1; cmm.bits.LinkSpeedPowerModeEnable = 1; - port->device->CpmuControl = cmm; + if (port->device->CpmuControl.r32 != cmm.r32) + { + port->device->CpmuControl = cmm; + } if (port->device->EmacMode.bits.EnableFHDE || port->device->EmacMode.bits.EnableRDE) { -- cgit v1.2.1