]>
Commit | Line | Data |
---|---|---|
dcd32332 SL |
1 | From 531de818fccb2b5064ee33e80b2058034541fe1a Mon Sep 17 00:00:00 2001 |
2 | From: Lukas Wunner <lukas@wunner.de> | |
3 | Date: Wed, 20 Mar 2019 15:02:00 +0100 | |
4 | Subject: net: ks8851: Set initial carrier state to down | |
5 | ||
6 | [ Upstream commit 9624bafa5f6418b9ca5b3f66d1f6a6a2e8bf6d4c ] | |
7 | ||
8 | The ks8851 chip's initial carrier state is down. A Link Change Interrupt | |
9 | is signaled once interrupts are enabled if the carrier is up. | |
10 | ||
11 | The ks8851 driver has it backwards by assuming that the initial carrier | |
12 | state is up. The state is therefore misrepresented if the interface is | |
13 | opened with no cable attached. Fix it. | |
14 | ||
15 | The Link Change interrupt is sometimes not signaled unless the P1MBSR | |
16 | register (which contains the Link Status bit) is read on ->ndo_open(). | |
17 | This might be a hardware erratum. Read the register by calling | |
18 | mii_check_link(), which has the desirable side effect of setting the | |
19 | carrier state to down if the cable was detached while the interface was | |
20 | closed. | |
21 | ||
22 | Signed-off-by: Lukas Wunner <lukas@wunner.de> | |
23 | Cc: Frank Pavlic <f.pavlic@kunbus.de> | |
24 | Cc: Ben Dooks <ben.dooks@codethink.co.uk> | |
25 | Cc: Tristram Ha <Tristram.Ha@microchip.com> | |
26 | Signed-off-by: David S. Miller <davem@davemloft.net> | |
27 | Signed-off-by: Sasha Levin (Microsoft) <sashal@kernel.org> | |
28 | --- | |
29 | drivers/net/ethernet/micrel/ks8851.c | 2 ++ | |
30 | 1 file changed, 2 insertions(+) | |
31 | ||
32 | diff --git a/drivers/net/ethernet/micrel/ks8851.c b/drivers/net/ethernet/micrel/ks8851.c | |
33 | index ff6cab4f6343..7377dca6eb57 100644 | |
34 | --- a/drivers/net/ethernet/micrel/ks8851.c | |
35 | +++ b/drivers/net/ethernet/micrel/ks8851.c | |
36 | @@ -870,6 +870,7 @@ static int ks8851_net_open(struct net_device *dev) | |
37 | netif_dbg(ks, ifup, ks->netdev, "network device up\n"); | |
38 | ||
39 | mutex_unlock(&ks->lock); | |
40 | + mii_check_link(&ks->mii); | |
41 | return 0; | |
42 | } | |
43 | ||
44 | @@ -1527,6 +1528,7 @@ static int ks8851_probe(struct spi_device *spi) | |
45 | ||
46 | spi_set_drvdata(spi, ks); | |
47 | ||
48 | + netif_carrier_off(ks->netdev); | |
49 | ndev->if_port = IF_PORT_100BASET; | |
50 | ndev->netdev_ops = &ks8851_netdev_ops; | |
51 | ndev->irq = spi->irq; | |
52 | -- | |
53 | 2.19.1 | |
54 |