summaryrefslogtreecommitdiffstats
path: root/libs
diff options
context:
space:
mode:
authorEvan Lojewski <github@meklort.com>2020-07-19 20:17:43 -0600
committerGitHub <noreply@github.com>2020-07-19 20:17:43 -0600
commitffb8f12c25642fd3f5dfa8d878ac53f4ea2d914d (patch)
treee8496b42ac9af5b7519fd08b41f3c9d59fc6b6a5 /libs
parentae0d138e0af73f197e8e5c76bf378ce18a0394a6 (diff)
downloadbcm5719-ortega-ffb8f12c25642fd3f5dfa8d878ac53f4ea2d914d.tar.gz
bcm5719-ortega-ffb8f12c25642fd3f5dfa8d878ac53f4ea2d914d.zip
network: Always check registers during init and place them in a known state. (#95)
Diffstat (limited to 'libs')
-rw-r--r--libs/NCSI/ncsi.c8
-rw-r--r--libs/Network/include/Network.h4
-rw-r--r--libs/Network/ports.c82
3 files changed, 59 insertions, 35 deletions
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)
{
OpenPOWER on IntegriCloud