mirror of https://gitee.com/openkylin/linux.git
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>
This commit is contained in:
parent
e8b47b53a1
commit
726097d6d6
|
@ -19,7 +19,6 @@
|
||||||
#define MII_REGS_NUM 29
|
#define MII_REGS_NUM 29
|
||||||
|
|
||||||
struct swmii_regs {
|
struct swmii_regs {
|
||||||
u16 bmcr;
|
|
||||||
u16 bmsr;
|
u16 bmsr;
|
||||||
u16 lpa;
|
u16 lpa;
|
||||||
u16 lpagb;
|
u16 lpagb;
|
||||||
|
@ -40,16 +39,13 @@ enum {
|
||||||
*/
|
*/
|
||||||
static const struct swmii_regs speed[] = {
|
static const struct swmii_regs speed[] = {
|
||||||
[SWMII_SPEED_10] = {
|
[SWMII_SPEED_10] = {
|
||||||
.bmcr = BMCR_FULLDPLX,
|
|
||||||
.lpa = LPA_10FULL | LPA_10HALF,
|
.lpa = LPA_10FULL | LPA_10HALF,
|
||||||
},
|
},
|
||||||
[SWMII_SPEED_100] = {
|
[SWMII_SPEED_100] = {
|
||||||
.bmcr = BMCR_FULLDPLX | BMCR_SPEED100,
|
|
||||||
.bmsr = BMSR_100FULL | BMSR_100HALF,
|
.bmsr = BMSR_100FULL | BMSR_100HALF,
|
||||||
.lpa = LPA_100FULL | LPA_100HALF,
|
.lpa = LPA_100FULL | LPA_100HALF,
|
||||||
},
|
},
|
||||||
[SWMII_SPEED_1000] = {
|
[SWMII_SPEED_1000] = {
|
||||||
.bmcr = BMCR_FULLDPLX | BMCR_SPEED1000,
|
|
||||||
.bmsr = BMSR_ESTATEN,
|
.bmsr = BMSR_ESTATEN,
|
||||||
.lpagb = LPA_1000FULL | LPA_1000HALF,
|
.lpagb = LPA_1000FULL | LPA_1000HALF,
|
||||||
},
|
},
|
||||||
|
@ -57,13 +53,11 @@ static const struct swmii_regs speed[] = {
|
||||||
|
|
||||||
static const struct swmii_regs duplex[] = {
|
static const struct swmii_regs duplex[] = {
|
||||||
[SWMII_DUPLEX_HALF] = {
|
[SWMII_DUPLEX_HALF] = {
|
||||||
.bmcr = ~BMCR_FULLDPLX,
|
|
||||||
.bmsr = BMSR_ESTATEN | BMSR_100HALF,
|
.bmsr = BMSR_ESTATEN | BMSR_100HALF,
|
||||||
.lpa = LPA_10HALF | LPA_100HALF,
|
.lpa = LPA_10HALF | LPA_100HALF,
|
||||||
.lpagb = LPA_1000HALF,
|
.lpagb = LPA_1000HALF,
|
||||||
},
|
},
|
||||||
[SWMII_DUPLEX_FULL] = {
|
[SWMII_DUPLEX_FULL] = {
|
||||||
.bmcr = ~0,
|
|
||||||
.bmsr = BMSR_ESTATEN | BMSR_100FULL,
|
.bmsr = BMSR_ESTATEN | BMSR_100FULL,
|
||||||
.lpa = LPA_10FULL | LPA_100FULL,
|
.lpa = LPA_10FULL | LPA_100FULL,
|
||||||
.lpagb = LPA_1000FULL,
|
.lpagb = LPA_1000FULL,
|
||||||
|
@ -118,7 +112,6 @@ int swphy_read_reg(int reg, const struct fixed_phy_status *state)
|
||||||
{
|
{
|
||||||
int speed_index, duplex_index;
|
int speed_index, duplex_index;
|
||||||
u16 bmsr = BMSR_ANEGCAPABLE;
|
u16 bmsr = BMSR_ANEGCAPABLE;
|
||||||
u16 bmcr = 0;
|
|
||||||
u16 lpagb = 0;
|
u16 lpagb = 0;
|
||||||
u16 lpa = 0;
|
u16 lpa = 0;
|
||||||
|
|
||||||
|
@ -136,7 +129,6 @@ int swphy_read_reg(int reg, const struct fixed_phy_status *state)
|
||||||
if (state->link) {
|
if (state->link) {
|
||||||
bmsr |= BMSR_LSTATUS | BMSR_ANEGCOMPLETE;
|
bmsr |= BMSR_LSTATUS | BMSR_ANEGCOMPLETE;
|
||||||
|
|
||||||
bmcr |= speed[speed_index].bmcr & duplex[duplex_index].bmcr;
|
|
||||||
lpa |= speed[speed_index].lpa & duplex[duplex_index].lpa;
|
lpa |= speed[speed_index].lpa & duplex[duplex_index].lpa;
|
||||||
lpagb |= speed[speed_index].lpagb & duplex[duplex_index].lpagb;
|
lpagb |= speed[speed_index].lpagb & duplex[duplex_index].lpagb;
|
||||||
|
|
||||||
|
@ -149,7 +141,7 @@ int swphy_read_reg(int reg, const struct fixed_phy_status *state)
|
||||||
|
|
||||||
switch (reg) {
|
switch (reg) {
|
||||||
case MII_BMCR:
|
case MII_BMCR:
|
||||||
return bmcr;
|
return BMCR_ANENABLE;
|
||||||
case MII_BMSR:
|
case MII_BMSR:
|
||||||
return bmsr;
|
return bmsr;
|
||||||
case MII_PHYSID1:
|
case MII_PHYSID1:
|
||||||
|
|
Loading…
Reference in New Issue