diff options
| -rw-r--r-- | drivers/net/dsa/mv88e6xxx/port.c | 24 | 
1 files changed, 16 insertions, 8 deletions
| diff --git a/drivers/net/dsa/mv88e6xxx/port.c b/drivers/net/dsa/mv88e6xxx/port.c index dce84a2a65c7..c44b2822e4dd 100644 --- a/drivers/net/dsa/mv88e6xxx/port.c +++ b/drivers/net/dsa/mv88e6xxx/port.c @@ -427,18 +427,22 @@ int mv88e6390x_port_set_cmode(struct mv88e6xxx_chip *chip, int port,  		return 0;  	lane = mv88e6390x_serdes_get_lane(chip, port); -	if (lane < 0) +	if (lane < 0 && lane != -ENODEV)  		return lane; -	if (chip->ports[port].serdes_irq) { -		err = mv88e6390_serdes_irq_disable(chip, port, lane); +	if (lane >= 0) { +		if (chip->ports[port].serdes_irq) { +			err = mv88e6390_serdes_irq_disable(chip, port, lane); +			if (err) +				return err; +		} + +		err = mv88e6390x_serdes_power(chip, port, false);  		if (err)  			return err;  	} -	err = mv88e6390x_serdes_power(chip, port, false); -	if (err) -		return err; +	chip->ports[port].cmode = 0;  	if (cmode) {  		err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_STS, ®); @@ -452,6 +456,12 @@ int mv88e6390x_port_set_cmode(struct mv88e6xxx_chip *chip, int port,  		if (err)  			return err; +		chip->ports[port].cmode = cmode; + +		lane = mv88e6390x_serdes_get_lane(chip, port); +		if (lane < 0) +			return lane; +  		err = mv88e6390x_serdes_power(chip, port, true);  		if (err)  			return err; @@ -463,8 +473,6 @@ int mv88e6390x_port_set_cmode(struct mv88e6xxx_chip *chip, int port,  		}  	} -	chip->ports[port].cmode = cmode; -  	return 0;  } | 
