summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRobert Hancock <robert.hancock@calian.com>2022-01-18 15:41:25 -0600
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2022-01-27 08:47:41 +0100
commit9f1a3c13342b4d96b9baa337ec5fb7d453828709 (patch)
treee7be7ded53d85682ef7f9c3ff2e424af10a833fd
parentf87f80d8afe6c300f58c58a70d5b1e6f5165f39d (diff)
downloadlinux-stable-9f1a3c13342b4d96b9baa337ec5fb7d453828709.tar.gz
linux-stable-9f1a3c13342b4d96b9baa337ec5fb7d453828709.tar.bz2
linux-stable-9f1a3c13342b4d96b9baa337ec5fb7d453828709.zip
net: axienet: Wait for PhyRstCmplt after core reset
commit b400c2f4f4c53c86594dd57098970d97d488bfde upstream. When resetting the device, wait for the PhyRstCmplt bit to be set in the interrupt status register before continuing initialization, to ensure that the core is actually ready. When using an external PHY, this also ensures we do not start trying to access the PHY while it is still in reset. The PHY reset is initiated by the core reset which is triggered just above, but remains asserted for 5ms after the core is reset according to the documentation. The MgtRdy bit could also be waited for, but unfortunately when using 7-series devices, the bit does not appear to work as documented (it seems to behave as some sort of link state indication and not just an indication the transceiver is ready) so it can't really be relied on for this purpose. Fixes: 8a3b7a252dca9 ("drivers/net/ethernet/xilinx: added Xilinx AXI Ethernet driver") Signed-off-by: Robert Hancock <robert.hancock@calian.com> Reviewed-by: Andrew Lunn <andrew@lunn.ch> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--drivers/net/ethernet/xilinx/xilinx_axienet_main.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/drivers/net/ethernet/xilinx/xilinx_axienet_main.c b/drivers/net/ethernet/xilinx/xilinx_axienet_main.c
index 46fcf3ec2caf..cc5399f9ee1e 100644
--- a/drivers/net/ethernet/xilinx/xilinx_axienet_main.c
+++ b/drivers/net/ethernet/xilinx/xilinx_axienet_main.c
@@ -278,6 +278,16 @@ static int axienet_dma_bd_init(struct net_device *ndev)
axienet_dma_out32(lp, XAXIDMA_TX_CR_OFFSET,
cr | XAXIDMA_CR_RUNSTOP_MASK);
+ /* Wait for PhyRstCmplt bit to be set, indicating the PHY reset has finished */
+ ret = read_poll_timeout(axienet_ior, value,
+ value & XAE_INT_PHYRSTCMPLT_MASK,
+ DELAY_OF_ONE_MILLISEC, 50000, false, lp,
+ XAE_IS_OFFSET);
+ if (ret) {
+ dev_err(lp->dev, "%s: timeout waiting for PhyRstCmplt\n", __func__);
+ return ret;
+ }
+
return 0;
out:
axienet_dma_bd_release(ndev);