aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHeiner Kallweit <hkallweit1@gmail.com>2019-02-24 11:41:47 -0500
committerDavid S. Miller <davem@davemloft.net>2019-02-25 01:28:15 -0500
commit726097d6d6d8e928c62f459305d74856f7cab155 (patch)
tree23b25e830d552589391e6423cc50e6f1da5da544
parente8b47b53a172e74dd9907eb7810f02a1d09fb29b (diff)
net: phy: improve auto-neg emulation in swphy
Auto-neg emulation currently doesn't set bit BMCR_ANENABLE in BMCR, add this. Users will ignore speed and duplex settings in BMCR because we're emulating auto-neg, therefore we can remove related code. See also following discussion [0]. [0] https://marc.info/?t=155041784900002&r=1&w=2 Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com> Tested-by: Andrew Lunn <andrew@lunn.ch> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/phy/swphy.c10
1 files changed, 1 insertions, 9 deletions
diff --git a/drivers/net/phy/swphy.c b/drivers/net/phy/swphy.c
index b9743569e431..dad22481d9c1 100644
--- a/drivers/net/phy/swphy.c
+++ b/drivers/net/phy/swphy.c
@@ -19,7 +19,6 @@
19#define MII_REGS_NUM 29 19#define MII_REGS_NUM 29
20 20
21struct swmii_regs { 21struct swmii_regs {
22 u16 bmcr;
23 u16 bmsr; 22 u16 bmsr;
24 u16 lpa; 23 u16 lpa;
25 u16 lpagb; 24 u16 lpagb;
@@ -40,16 +39,13 @@ enum {
40 */ 39 */
41static const struct swmii_regs speed[] = { 40static const struct swmii_regs speed[] = {
42 [SWMII_SPEED_10] = { 41 [SWMII_SPEED_10] = {
43 .bmcr = BMCR_FULLDPLX,
44 .lpa = LPA_10FULL | LPA_10HALF, 42 .lpa = LPA_10FULL | LPA_10HALF,
45 }, 43 },
46 [SWMII_SPEED_100] = { 44 [SWMII_SPEED_100] = {
47 .bmcr = BMCR_FULLDPLX | BMCR_SPEED100,
48 .bmsr = BMSR_100FULL | BMSR_100HALF, 45 .bmsr = BMSR_100FULL | BMSR_100HALF,
49 .lpa = LPA_100FULL | LPA_100HALF, 46 .lpa = LPA_100FULL | LPA_100HALF,
50 }, 47 },
51 [SWMII_SPEED_1000] = { 48 [SWMII_SPEED_1000] = {
52 .bmcr = BMCR_FULLDPLX | BMCR_SPEED1000,
53 .bmsr = BMSR_ESTATEN, 49 .bmsr = BMSR_ESTATEN,
54 .lpagb = LPA_1000FULL | LPA_1000HALF, 50 .lpagb = LPA_1000FULL | LPA_1000HALF,
55 }, 51 },
@@ -57,13 +53,11 @@ static const struct swmii_regs speed[] = {
57 53
58static const struct swmii_regs duplex[] = { 54static const struct swmii_regs duplex[] = {
59 [SWMII_DUPLEX_HALF] = { 55 [SWMII_DUPLEX_HALF] = {
60 .bmcr = ~BMCR_FULLDPLX,
61 .bmsr = BMSR_ESTATEN | BMSR_100HALF, 56 .bmsr = BMSR_ESTATEN | BMSR_100HALF,
62 .lpa = LPA_10HALF | LPA_100HALF, 57 .lpa = LPA_10HALF | LPA_100HALF,
63 .lpagb = LPA_1000HALF, 58 .lpagb = LPA_1000HALF,
64 }, 59 },
65 [SWMII_DUPLEX_FULL] = { 60 [SWMII_DUPLEX_FULL] = {
66 .bmcr = ~0,
67 .bmsr = BMSR_ESTATEN | BMSR_100FULL, 61 .bmsr = BMSR_ESTATEN | BMSR_100FULL,
68 .lpa = LPA_10FULL | LPA_100FULL, 62 .lpa = LPA_10FULL | LPA_100FULL,
69 .lpagb = LPA_1000FULL, 63 .lpagb = LPA_1000FULL,
@@ -118,7 +112,6 @@ int swphy_read_reg(int reg, const struct fixed_phy_status *state)
118{ 112{
119 int speed_index, duplex_index; 113 int speed_index, duplex_index;
120 u16 bmsr = BMSR_ANEGCAPABLE; 114 u16 bmsr = BMSR_ANEGCAPABLE;
121 u16 bmcr = 0;
122 u16 lpagb = 0; 115 u16 lpagb = 0;
123 u16 lpa = 0; 116 u16 lpa = 0;
124 117
@@ -136,7 +129,6 @@ int swphy_read_reg(int reg, const struct fixed_phy_status *state)
136 if (state->link) { 129 if (state->link) {
137 bmsr |= BMSR_LSTATUS | BMSR_ANEGCOMPLETE; 130 bmsr |= BMSR_LSTATUS | BMSR_ANEGCOMPLETE;
138 131
139 bmcr |= speed[speed_index].bmcr & duplex[duplex_index].bmcr;
140 lpa |= speed[speed_index].lpa & duplex[duplex_index].lpa; 132 lpa |= speed[speed_index].lpa & duplex[duplex_index].lpa;
141 lpagb |= speed[speed_index].lpagb & duplex[duplex_index].lpagb; 133 lpagb |= speed[speed_index].lpagb & duplex[duplex_index].lpagb;
142 134
@@ -149,7 +141,7 @@ int swphy_read_reg(int reg, const struct fixed_phy_status *state)
149 141
150 switch (reg) { 142 switch (reg) {
151 case MII_BMCR: 143 case MII_BMCR:
152 return bmcr; 144 return BMCR_ANENABLE;
153 case MII_BMSR: 145 case MII_BMSR:
154 return bmsr; 146 return bmsr;
155 case MII_PHYSID1: 147 case MII_PHYSID1: