diff options
Diffstat (limited to 'drivers/net/dsa/microchip')
| -rw-r--r-- | drivers/net/dsa/microchip/ksz8795.c | 20 | ||||
| -rw-r--r-- | drivers/net/dsa/microchip/ksz9477.c | 31 | ||||
| -rw-r--r-- | drivers/net/dsa/microchip/ksz_common.c | 17 | ||||
| -rw-r--r-- | drivers/net/dsa/microchip/ksz_common.h | 3 | 
4 files changed, 52 insertions, 19 deletions
| diff --git a/drivers/net/dsa/microchip/ksz8795.c b/drivers/net/dsa/microchip/ksz8795.c index 8f1d15ea15d9..f5779e152377 100644 --- a/drivers/net/dsa/microchip/ksz8795.c +++ b/drivers/net/dsa/microchip/ksz8795.c @@ -932,11 +932,19 @@ static void ksz8795_port_setup(struct ksz_device *dev, int port, bool cpu_port)  	ksz_port_cfg(dev, port, P_PRIO_CTRL, PORT_802_1P_ENABLE, true);  	if (cpu_port) { +		if (!p->interface && dev->compat_interface) { +			dev_warn(dev->dev, +				 "Using legacy switch \"phy-mode\" property, because it is missing on port %d node. " +				 "Please update your device tree.\n", +				 port); +			p->interface = dev->compat_interface; +		} +  		/* Configure MII interface for proper network communication. */  		ksz_read8(dev, REG_PORT_5_CTRL_6, &data8);  		data8 &= ~PORT_INTERFACE_TYPE;  		data8 &= ~PORT_GMII_1GPS_MODE; -		switch (dev->interface) { +		switch (p->interface) {  		case PHY_INTERFACE_MODE_MII:  			p->phydev.speed = SPEED_100;  			break; @@ -952,11 +960,11 @@ static void ksz8795_port_setup(struct ksz_device *dev, int port, bool cpu_port)  		default:  			data8 &= ~PORT_RGMII_ID_IN_ENABLE;  			data8 &= ~PORT_RGMII_ID_OUT_ENABLE; -			if (dev->interface == PHY_INTERFACE_MODE_RGMII_ID || -			    dev->interface == PHY_INTERFACE_MODE_RGMII_RXID) +			if (p->interface == PHY_INTERFACE_MODE_RGMII_ID || +			    p->interface == PHY_INTERFACE_MODE_RGMII_RXID)  				data8 |= PORT_RGMII_ID_IN_ENABLE; -			if (dev->interface == PHY_INTERFACE_MODE_RGMII_ID || -			    dev->interface == PHY_INTERFACE_MODE_RGMII_TXID) +			if (p->interface == PHY_INTERFACE_MODE_RGMII_ID || +			    p->interface == PHY_INTERFACE_MODE_RGMII_TXID)  				data8 |= PORT_RGMII_ID_OUT_ENABLE;  			data8 |= PORT_GMII_1GPS_MODE;  			data8 |= PORT_INTERFACE_RGMII; @@ -1252,7 +1260,7 @@ static int ksz8795_switch_init(struct ksz_device *dev)  	}  	/* set the real number of ports */ -	dev->ds->num_ports = dev->port_cnt; +	dev->ds->num_ports = dev->port_cnt + 1;  	return 0;  } diff --git a/drivers/net/dsa/microchip/ksz9477.c b/drivers/net/dsa/microchip/ksz9477.c index dc999406ce86..2f5506ac7d19 100644 --- a/drivers/net/dsa/microchip/ksz9477.c +++ b/drivers/net/dsa/microchip/ksz9477.c @@ -1083,7 +1083,7 @@ static phy_interface_t ksz9477_get_interface(struct ksz_device *dev, int port)  		interface = PHY_INTERFACE_MODE_GMII;  		if (gbit)  			break; -		/* fall through */ +		fallthrough;  	case 0:  		interface = PHY_INTERFACE_MODE_MII;  		break; @@ -1208,7 +1208,7 @@ static void ksz9477_port_setup(struct ksz_device *dev, int port, bool cpu_port)  		/* configure MAC to 1G & RGMII mode */  		ksz_pread8(dev, port, REG_PORT_XMII_CTRL_1, &data8); -		switch (dev->interface) { +		switch (p->interface) {  		case PHY_INTERFACE_MODE_MII:  			ksz9477_set_xmii(dev, 0, &data8);  			ksz9477_set_gbit(dev, false, &data8); @@ -1229,11 +1229,11 @@ static void ksz9477_port_setup(struct ksz_device *dev, int port, bool cpu_port)  			ksz9477_set_gbit(dev, true, &data8);  			data8 &= ~PORT_RGMII_ID_IG_ENABLE;  			data8 &= ~PORT_RGMII_ID_EG_ENABLE; -			if (dev->interface == PHY_INTERFACE_MODE_RGMII_ID || -			    dev->interface == PHY_INTERFACE_MODE_RGMII_RXID) +			if (p->interface == PHY_INTERFACE_MODE_RGMII_ID || +			    p->interface == PHY_INTERFACE_MODE_RGMII_RXID)  				data8 |= PORT_RGMII_ID_IG_ENABLE; -			if (dev->interface == PHY_INTERFACE_MODE_RGMII_ID || -			    dev->interface == PHY_INTERFACE_MODE_RGMII_TXID) +			if (p->interface == PHY_INTERFACE_MODE_RGMII_ID || +			    p->interface == PHY_INTERFACE_MODE_RGMII_TXID)  				data8 |= PORT_RGMII_ID_EG_ENABLE;  			p->phydev.speed = SPEED_1000;  			break; @@ -1269,23 +1269,32 @@ static void ksz9477_config_cpu_port(struct dsa_switch *ds)  			dev->cpu_port = i;  			dev->host_mask = (1 << dev->cpu_port);  			dev->port_mask |= dev->host_mask; +			p = &dev->ports[i];  			/* Read from XMII register to determine host port  			 * interface.  If set specifically in device tree  			 * note the difference to help debugging.  			 */  			interface = ksz9477_get_interface(dev, i); -			if (!dev->interface) -				dev->interface = interface; -			if (interface && interface != dev->interface) +			if (!p->interface) { +				if (dev->compat_interface) { +					dev_warn(dev->dev, +						 "Using legacy switch \"phy-mode\" property, because it is missing on port %d node. " +						 "Please update your device tree.\n", +						 i); +					p->interface = dev->compat_interface; +				} else { +					p->interface = interface; +				} +			} +			if (interface && interface != p->interface)  				dev_info(dev->dev,  					 "use %s instead of %s\n", -					  phy_modes(dev->interface), +					  phy_modes(p->interface),  					  phy_modes(interface));  			/* enable cpu port */  			ksz9477_port_setup(dev, i, true); -			p = &dev->ports[dev->cpu_port];  			p->vid_member = dev->port_mask;  			p->on = 1;  		} diff --git a/drivers/net/dsa/microchip/ksz_common.c b/drivers/net/dsa/microchip/ksz_common.c index 8d53b12d40a8..c796d42730ba 100644 --- a/drivers/net/dsa/microchip/ksz_common.c +++ b/drivers/net/dsa/microchip/ksz_common.c @@ -387,7 +387,9 @@ EXPORT_SYMBOL(ksz_switch_alloc);  int ksz_switch_register(struct ksz_device *dev,  			const struct ksz_dev_ops *ops)  { +	struct device_node *port, *ports;  	phy_interface_t interface; +	unsigned int port_num;  	int ret;  	if (dev->pdata) @@ -421,10 +423,23 @@ int ksz_switch_register(struct ksz_device *dev,  	/* Host port interface will be self detected, or specifically set in  	 * device tree.  	 */ +	for (port_num = 0; port_num < dev->port_cnt; ++port_num) +		dev->ports[port_num].interface = PHY_INTERFACE_MODE_NA;  	if (dev->dev->of_node) {  		ret = of_get_phy_mode(dev->dev->of_node, &interface);  		if (ret == 0) -			dev->interface = interface; +			dev->compat_interface = interface; +		ports = of_get_child_by_name(dev->dev->of_node, "ports"); +		if (ports) +			for_each_available_child_of_node(ports, port) { +				if (of_property_read_u32(port, "reg", +							 &port_num)) +					continue; +				if (port_num >= dev->port_cnt) +					return -EINVAL; +				of_get_phy_mode(port, +						&dev->ports[port_num].interface); +			}  		dev->synclko_125 = of_property_read_bool(dev->dev->of_node,  							 "microchip,synclko-125");  	} diff --git a/drivers/net/dsa/microchip/ksz_common.h b/drivers/net/dsa/microchip/ksz_common.h index 206838160f49..cf866e48ff66 100644 --- a/drivers/net/dsa/microchip/ksz_common.h +++ b/drivers/net/dsa/microchip/ksz_common.h @@ -39,6 +39,7 @@ struct ksz_port {  	u32 freeze:1;			/* MIB counter freeze is enabled */  	struct ksz_port_mib mib; +	phy_interface_t interface;  };  struct ksz_device { @@ -72,7 +73,7 @@ struct ksz_device {  	int mib_cnt;  	int mib_port_cnt;  	int last_port;			/* ports after that not used */ -	phy_interface_t interface; +	phy_interface_t compat_interface;  	u32 regs_size;  	bool phy_errata_9477;  	bool synclko_125; |