| From 67977a057cfa6fe6a24743129b3091c11f1878ab Mon Sep 17 00:00:00 2001 |
| From: Lukas Wunner <lukas@wunner.de> |
| Date: Wed, 20 Mar 2019 15:02:00 +0100 |
| Subject: net: ks8851: Set initial carrier state to down |
| |
| [ Upstream commit 9624bafa5f6418b9ca5b3f66d1f6a6a2e8bf6d4c ] |
| |
| The ks8851 chip's initial carrier state is down. A Link Change Interrupt |
| is signaled once interrupts are enabled if the carrier is up. |
| |
| The ks8851 driver has it backwards by assuming that the initial carrier |
| state is up. The state is therefore misrepresented if the interface is |
| opened with no cable attached. Fix it. |
| |
| The Link Change interrupt is sometimes not signaled unless the P1MBSR |
| register (which contains the Link Status bit) is read on ->ndo_open(). |
| This might be a hardware erratum. Read the register by calling |
| mii_check_link(), which has the desirable side effect of setting the |
| carrier state to down if the cable was detached while the interface was |
| closed. |
| |
| Signed-off-by: Lukas Wunner <lukas@wunner.de> |
| Cc: Frank Pavlic <f.pavlic@kunbus.de> |
| Cc: Ben Dooks <ben.dooks@codethink.co.uk> |
| Cc: Tristram Ha <Tristram.Ha@microchip.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Sasha Levin (Microsoft) <sashal@kernel.org> |
| --- |
| drivers/net/ethernet/micrel/ks8851.c | 2 ++ |
| 1 file changed, 2 insertions(+) |
| |
| diff --git a/drivers/net/ethernet/micrel/ks8851.c b/drivers/net/ethernet/micrel/ks8851.c |
| index b8f20aa2b7ad..7ddaa7d88f1d 100644 |
| --- a/drivers/net/ethernet/micrel/ks8851.c |
| +++ b/drivers/net/ethernet/micrel/ks8851.c |
| @@ -849,6 +849,7 @@ static int ks8851_net_open(struct net_device *dev) |
| netif_dbg(ks, ifup, ks->netdev, "network device up\n"); |
| |
| mutex_unlock(&ks->lock); |
| + mii_check_link(&ks->mii); |
| return 0; |
| } |
| |
| @@ -1510,6 +1511,7 @@ static int ks8851_probe(struct spi_device *spi) |
| |
| spi_set_drvdata(spi, ks); |
| |
| + netif_carrier_off(ks->netdev); |
| ndev->if_port = IF_PORT_100BASET; |
| ndev->netdev_ops = &ks8851_netdev_ops; |
| ndev->irq = spi->irq; |
| -- |
| 2.19.1 |
| |