leon: add SDK patches from buildroot-2022.02-1.2/5.10.175
[openwrt/staging/wigyori.git] / target / linux / leon / patches-5.15 / 0013-greth-Do-not-reset-GRETH-when-EDCL-is-active.patch
1 From 4c6fe52c1f496e3e170e745efe179b5bda97ed4b Mon Sep 17 00:00:00 2001
2 From: Andreas Larsson <andreas@gaisler.com>
3 Date: Wed, 20 Sep 2017 14:34:30 +0200
4 Subject: [PATCH 13/32] greth: Do not reset GRETH when EDCL is active
5
6 "Active" is defined as the EDCL available, EDCL not disabled and kernel
7 module parameter greth_edcl is not set to 0.
8
9 Signed-off-by: Andreas Larsson <andreas@gaisler.com>
10 ---
11 drivers/net/ethernet/aeroflex/greth.c | 43 ++++++++++++++++-----------
12 drivers/net/ethernet/aeroflex/greth.h | 4 +++
13 2 files changed, 30 insertions(+), 17 deletions(-)
14
15 diff --git a/drivers/net/ethernet/aeroflex/greth.c b/drivers/net/ethernet/aeroflex/greth.c
16 index 0d56cb4f5dd9..e8dbdba69c9f 100644
17 --- a/drivers/net/ethernet/aeroflex/greth.c
18 +++ b/drivers/net/ethernet/aeroflex/greth.c
19 @@ -1318,7 +1318,7 @@ static int greth_mdio_init(struct greth_private *greth)
20 phy_start(ndev->phydev);
21
22 /* If Ethernet debug link is used make autoneg happen right away */
23 - if (greth->edcl && greth_edcl == 1) {
24 + if (greth->edcl) {
25 phy_start_aneg(ndev->phydev);
26 timeout = jiffies + 6*HZ;
27 while (!phy_aneg_done(ndev->phydev) &&
28 @@ -1382,20 +1382,27 @@ static int greth_of_probe(struct platform_device *ofdev)
29 dev_set_drvdata(greth->dev, dev);
30 SET_NETDEV_DEV(dev, greth->dev);
31
32 - if (netif_msg_probe(greth))
33 - dev_dbg(greth->dev, "resetting controller.\n");
34 -
35 - /* Reset the controller. */
36 - GRETH_REGSAVE(regs->control, GRETH_RESET);
37 + /* Check if we have EDCL that is not disabled */
38 + tmp = GRETH_REGLOAD(regs->control);
39 + greth->have_edcl = !!(tmp & GRETH_CTRL_EA);
40 + greth->edcl = greth->have_edcl && !(tmp & GRETH_CTRL_ED) && greth_edcl;
41
42 - /* Wait for MAC to reset itself */
43 - timeout = jiffies + HZ/100;
44 - while (GRETH_REGLOAD(regs->control) & GRETH_RESET) {
45 - if (time_after(jiffies, timeout)) {
46 - err = -EIO;
47 - if (netif_msg_probe(greth))
48 - dev_err(greth->dev, "timeout when waiting for reset.\n");
49 - goto error2;
50 + if (!greth->edcl) {
51 + if (netif_msg_probe(greth))
52 + dev_dbg(greth->dev, "resetting controller.\n");
53 +
54 + /* Reset the controller. */
55 + GRETH_REGSAVE(regs->control, GRETH_RESET);
56 +
57 + /* Wait for MAC to reset itself */
58 + timeout = jiffies + HZ/100;
59 + while (GRETH_REGLOAD(regs->control) & GRETH_RESET) {
60 + if (time_after(jiffies, timeout)) {
61 + err = -EIO;
62 + if (netif_msg_probe(greth))
63 + dev_err(greth->dev, "timeout when waiting for reset.\n");
64 + goto error2;
65 + }
66 }
67 }
68
69 @@ -1409,13 +1416,15 @@ static int greth_of_probe(struct platform_device *ofdev)
70 /* Check for multicast capability */
71 greth->multicast = (tmp >> 25) & 1;
72
73 - greth->edcl = (tmp >> 31) & 1;
74 -
75 /* If we have EDCL we disable the EDCL speed-duplex FSM so
76 * it doesn't interfere with the software */
77 - if (greth->edcl != 0)
78 + if (greth->have_edcl)
79 GRETH_REGORIN(regs->control, GRETH_CTRL_DISDUPLEX);
80
81 + /* Disable EDCL if it should not be used */
82 + if (greth->have_edcl && !greth->edcl)
83 + GRETH_REGORIN(regs->control, GRETH_CTRL_ED);
84 +
85 /* Check if MAC can handle MDIO interrupts */
86 greth->mdio_int_en = (tmp >> 26) & 1;
87
88 diff --git a/drivers/net/ethernet/aeroflex/greth.h b/drivers/net/ethernet/aeroflex/greth.h
89 index a1e04c9e932e..589dee5647db 100644
90 --- a/drivers/net/ethernet/aeroflex/greth.h
91 +++ b/drivers/net/ethernet/aeroflex/greth.h
92 @@ -16,6 +16,9 @@
93 #define GRETH_CTRL_PSTATIEN 0x400
94 #define GRETH_CTRL_MCEN 0x800
95 #define GRETH_CTRL_DISDUPLEX 0x1000
96 +#define GRETH_CTRL_ED 0x4000
97 +#define GRETH_CTRL_EA 0x80000000
98 +
99 #define GRETH_STATUS_PHYSTAT 0x100
100
101 #define GRETH_BD_EN 0x800
102 @@ -135,6 +138,7 @@ struct greth_private {
103 u8 multicast;
104 u8 gbit_mac;
105 u8 mdio_int_en;
106 + u8 have_edcl;
107 u8 edcl;
108 };
109
110 --
111 2.34.1
112