summaryrefslogtreecommitdiffstats
path: root/libs/Network/ports.c
diff options
context:
space:
mode:
Diffstat (limited to 'libs/Network/ports.c')
-rw-r--r--libs/Network/ports.c82
1 files changed, 55 insertions, 27 deletions
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