mirror of
https://github.com/torvalds/linux.git
synced 2026-09-11 20:13:02 +02:00
net: ks8851: Fix receiver error in 100BASE-TX mode following software power-down
KSZ8851 errata sheet DS80000716D-page 4 Module 3 [1] states that,
when issuing a software power-down (PMECR[1:0] = 10) followed by a
power-on (PMECR[1:0] = 00), the receiver circuit can fail to start
properly preventing communication. The Transmitter will still send
data, but no data will be received.
The errata sheet also includes a workaround, which states that,
it is recommended that the software power-down feature not be used.
Implement that workaround and drop the entry into software power-down
mode. The ks8851_write_mac_addr() calls entry into normal power-on
mode at the very beginning of the function, therefore dropping the
second call to enter software power-down mode is sufficient here.
The ks8851_net_stop() can only be called after ks8851_net_start()
was already called, and ks8851_net_start() also makes the MAC enter
normal power-on mode, therefore it is also fine to drop the call to
enter software power-down mode from ks8851_net_stop().
This will lead to a slight increase in power consumption, but it also
fixes a sporadic reliability problem on at least KSZ8851-16MLL, which
is where the problem was reported and this fix was tested.
[1] https://ww1.microchip.com/downloads/en/DeviceDoc/80000716D.pdf
Fixes: 3ba81f3ece ("net: Micrel KS8851 SPI network driver")
Reviewed-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Marek Vasut <marex@nabladev.com>
Link: https://patch.msgid.link/20260905130327.203851-1-marex@nabladev.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
59fb389ad6
commit
66ef5adb75
|
|
@ -143,9 +143,6 @@ static int ks8851_write_mac_addr(struct net_device *dev)
|
|||
ks8851_wrreg16(ks, KS_MAR(i), val);
|
||||
}
|
||||
|
||||
if (!netif_running(dev))
|
||||
ks8851_set_powermode(ks, PMECR_PM_SOFTDOWN);
|
||||
|
||||
ks8851_unlock(ks);
|
||||
|
||||
return 0;
|
||||
|
|
@ -478,8 +475,7 @@ static int ks8851_net_open(struct net_device *dev)
|
|||
* @dev: The device being closed.
|
||||
*
|
||||
* Called to close down a network device which has been active. Cancel any
|
||||
* work, shutdown the RX and TX process and then place the chip into a low
|
||||
* power state whilst it is not being used.
|
||||
* work and shutdown the RX and TX process.
|
||||
*/
|
||||
static int ks8851_net_stop(struct net_device *dev)
|
||||
{
|
||||
|
|
@ -506,8 +502,6 @@ static int ks8851_net_stop(struct net_device *dev)
|
|||
/* shutdown TX process */
|
||||
ks8851_wrreg16(ks, KS_TXCR, 0x0000);
|
||||
|
||||
/* set powermode to soft power down to save power */
|
||||
ks8851_set_powermode(ks, PMECR_PM_SOFTDOWN);
|
||||
ks8851_unlock(ks);
|
||||
|
||||
/* ensure any queued tx buffers are dumped */
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user