net: dsa: microchip: look for phy-mode in port nodes
Documentation/devicetree/bindings/net/dsa/dsa.txt says that the phy-mode property should be specified on port nodes. However, the microchip drivers read it from the switch node. Let the driver use the per-port property and fall back to the old location with a warning. Fix in-tree users. Signed-off-by: Helmut Grohne <helmut.grohne@intenta.de> Link: https://lore.kernel.org/netdev/20200617082235.GA1523@laureti-dev/ Acked-by: Alexandre Belloni <alexandre.belloni@bootlin.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
f612eb76f3
commit
edecfa98f6
@ -116,7 +116,6 @@
|
|||||||
switch0: ksz8563@0 {
|
switch0: ksz8563@0 {
|
||||||
compatible = "microchip,ksz8563";
|
compatible = "microchip,ksz8563";
|
||||||
reg = <0>;
|
reg = <0>;
|
||||||
phy-mode = "mii";
|
|
||||||
reset-gpios = <&pioA PIN_PD4 GPIO_ACTIVE_LOW>;
|
reset-gpios = <&pioA PIN_PD4 GPIO_ACTIVE_LOW>;
|
||||||
|
|
||||||
spi-max-frequency = <500000>;
|
spi-max-frequency = <500000>;
|
||||||
@ -140,6 +139,7 @@
|
|||||||
reg = <2>;
|
reg = <2>;
|
||||||
label = "cpu";
|
label = "cpu";
|
||||||
ethernet = <&macb0>;
|
ethernet = <&macb0>;
|
||||||
|
phy-mode = "mii";
|
||||||
fixed-link {
|
fixed-link {
|
||||||
speed = <100>;
|
speed = <100>;
|
||||||
full-duplex;
|
full-duplex;
|
||||||
|
@ -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);
|
ksz_port_cfg(dev, port, P_PRIO_CTRL, PORT_802_1P_ENABLE, true);
|
||||||
|
|
||||||
if (cpu_port) {
|
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. */
|
/* Configure MII interface for proper network communication. */
|
||||||
ksz_read8(dev, REG_PORT_5_CTRL_6, &data8);
|
ksz_read8(dev, REG_PORT_5_CTRL_6, &data8);
|
||||||
data8 &= ~PORT_INTERFACE_TYPE;
|
data8 &= ~PORT_INTERFACE_TYPE;
|
||||||
data8 &= ~PORT_GMII_1GPS_MODE;
|
data8 &= ~PORT_GMII_1GPS_MODE;
|
||||||
switch (dev->interface) {
|
switch (p->interface) {
|
||||||
case PHY_INTERFACE_MODE_MII:
|
case PHY_INTERFACE_MODE_MII:
|
||||||
p->phydev.speed = SPEED_100;
|
p->phydev.speed = SPEED_100;
|
||||||
break;
|
break;
|
||||||
@ -952,11 +960,11 @@ static void ksz8795_port_setup(struct ksz_device *dev, int port, bool cpu_port)
|
|||||||
default:
|
default:
|
||||||
data8 &= ~PORT_RGMII_ID_IN_ENABLE;
|
data8 &= ~PORT_RGMII_ID_IN_ENABLE;
|
||||||
data8 &= ~PORT_RGMII_ID_OUT_ENABLE;
|
data8 &= ~PORT_RGMII_ID_OUT_ENABLE;
|
||||||
if (dev->interface == PHY_INTERFACE_MODE_RGMII_ID ||
|
if (p->interface == PHY_INTERFACE_MODE_RGMII_ID ||
|
||||||
dev->interface == PHY_INTERFACE_MODE_RGMII_RXID)
|
p->interface == PHY_INTERFACE_MODE_RGMII_RXID)
|
||||||
data8 |= PORT_RGMII_ID_IN_ENABLE;
|
data8 |= PORT_RGMII_ID_IN_ENABLE;
|
||||||
if (dev->interface == PHY_INTERFACE_MODE_RGMII_ID ||
|
if (p->interface == PHY_INTERFACE_MODE_RGMII_ID ||
|
||||||
dev->interface == PHY_INTERFACE_MODE_RGMII_TXID)
|
p->interface == PHY_INTERFACE_MODE_RGMII_TXID)
|
||||||
data8 |= PORT_RGMII_ID_OUT_ENABLE;
|
data8 |= PORT_RGMII_ID_OUT_ENABLE;
|
||||||
data8 |= PORT_GMII_1GPS_MODE;
|
data8 |= PORT_GMII_1GPS_MODE;
|
||||||
data8 |= PORT_INTERFACE_RGMII;
|
data8 |= PORT_INTERFACE_RGMII;
|
||||||
|
@ -1208,7 +1208,7 @@ static void ksz9477_port_setup(struct ksz_device *dev, int port, bool cpu_port)
|
|||||||
|
|
||||||
/* configure MAC to 1G & RGMII mode */
|
/* configure MAC to 1G & RGMII mode */
|
||||||
ksz_pread8(dev, port, REG_PORT_XMII_CTRL_1, &data8);
|
ksz_pread8(dev, port, REG_PORT_XMII_CTRL_1, &data8);
|
||||||
switch (dev->interface) {
|
switch (p->interface) {
|
||||||
case PHY_INTERFACE_MODE_MII:
|
case PHY_INTERFACE_MODE_MII:
|
||||||
ksz9477_set_xmii(dev, 0, &data8);
|
ksz9477_set_xmii(dev, 0, &data8);
|
||||||
ksz9477_set_gbit(dev, false, &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);
|
ksz9477_set_gbit(dev, true, &data8);
|
||||||
data8 &= ~PORT_RGMII_ID_IG_ENABLE;
|
data8 &= ~PORT_RGMII_ID_IG_ENABLE;
|
||||||
data8 &= ~PORT_RGMII_ID_EG_ENABLE;
|
data8 &= ~PORT_RGMII_ID_EG_ENABLE;
|
||||||
if (dev->interface == PHY_INTERFACE_MODE_RGMII_ID ||
|
if (p->interface == PHY_INTERFACE_MODE_RGMII_ID ||
|
||||||
dev->interface == PHY_INTERFACE_MODE_RGMII_RXID)
|
p->interface == PHY_INTERFACE_MODE_RGMII_RXID)
|
||||||
data8 |= PORT_RGMII_ID_IG_ENABLE;
|
data8 |= PORT_RGMII_ID_IG_ENABLE;
|
||||||
if (dev->interface == PHY_INTERFACE_MODE_RGMII_ID ||
|
if (p->interface == PHY_INTERFACE_MODE_RGMII_ID ||
|
||||||
dev->interface == PHY_INTERFACE_MODE_RGMII_TXID)
|
p->interface == PHY_INTERFACE_MODE_RGMII_TXID)
|
||||||
data8 |= PORT_RGMII_ID_EG_ENABLE;
|
data8 |= PORT_RGMII_ID_EG_ENABLE;
|
||||||
p->phydev.speed = SPEED_1000;
|
p->phydev.speed = SPEED_1000;
|
||||||
break;
|
break;
|
||||||
@ -1269,23 +1269,32 @@ static void ksz9477_config_cpu_port(struct dsa_switch *ds)
|
|||||||
dev->cpu_port = i;
|
dev->cpu_port = i;
|
||||||
dev->host_mask = (1 << dev->cpu_port);
|
dev->host_mask = (1 << dev->cpu_port);
|
||||||
dev->port_mask |= dev->host_mask;
|
dev->port_mask |= dev->host_mask;
|
||||||
|
p = &dev->ports[i];
|
||||||
|
|
||||||
/* Read from XMII register to determine host port
|
/* Read from XMII register to determine host port
|
||||||
* interface. If set specifically in device tree
|
* interface. If set specifically in device tree
|
||||||
* note the difference to help debugging.
|
* note the difference to help debugging.
|
||||||
*/
|
*/
|
||||||
interface = ksz9477_get_interface(dev, i);
|
interface = ksz9477_get_interface(dev, i);
|
||||||
if (!dev->interface)
|
if (!p->interface) {
|
||||||
dev->interface = interface;
|
if (dev->compat_interface) {
|
||||||
if (interface && interface != dev->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,
|
dev_info(dev->dev,
|
||||||
"use %s instead of %s\n",
|
"use %s instead of %s\n",
|
||||||
phy_modes(dev->interface),
|
phy_modes(p->interface),
|
||||||
phy_modes(interface));
|
phy_modes(interface));
|
||||||
|
|
||||||
/* enable cpu port */
|
/* enable cpu port */
|
||||||
ksz9477_port_setup(dev, i, true);
|
ksz9477_port_setup(dev, i, true);
|
||||||
p = &dev->ports[dev->cpu_port];
|
|
||||||
p->vid_member = dev->port_mask;
|
p->vid_member = dev->port_mask;
|
||||||
p->on = 1;
|
p->on = 1;
|
||||||
}
|
}
|
||||||
|
@ -388,6 +388,8 @@ int ksz_switch_register(struct ksz_device *dev,
|
|||||||
const struct ksz_dev_ops *ops)
|
const struct ksz_dev_ops *ops)
|
||||||
{
|
{
|
||||||
phy_interface_t interface;
|
phy_interface_t interface;
|
||||||
|
struct device_node *port;
|
||||||
|
unsigned int port_num;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (dev->pdata)
|
if (dev->pdata)
|
||||||
@ -421,10 +423,19 @@ int ksz_switch_register(struct ksz_device *dev,
|
|||||||
/* Host port interface will be self detected, or specifically set in
|
/* Host port interface will be self detected, or specifically set in
|
||||||
* device tree.
|
* 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) {
|
if (dev->dev->of_node) {
|
||||||
ret = of_get_phy_mode(dev->dev->of_node, &interface);
|
ret = of_get_phy_mode(dev->dev->of_node, &interface);
|
||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
dev->interface = interface;
|
dev->compat_interface = interface;
|
||||||
|
for_each_available_child_of_node(dev->dev->of_node, 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,
|
dev->synclko_125 = of_property_read_bool(dev->dev->of_node,
|
||||||
"microchip,synclko-125");
|
"microchip,synclko-125");
|
||||||
}
|
}
|
||||||
|
@ -39,6 +39,7 @@ struct ksz_port {
|
|||||||
u32 freeze:1; /* MIB counter freeze is enabled */
|
u32 freeze:1; /* MIB counter freeze is enabled */
|
||||||
|
|
||||||
struct ksz_port_mib mib;
|
struct ksz_port_mib mib;
|
||||||
|
phy_interface_t interface;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ksz_device {
|
struct ksz_device {
|
||||||
@ -72,7 +73,7 @@ struct ksz_device {
|
|||||||
int mib_cnt;
|
int mib_cnt;
|
||||||
int mib_port_cnt;
|
int mib_port_cnt;
|
||||||
int last_port; /* ports after that not used */
|
int last_port; /* ports after that not used */
|
||||||
phy_interface_t interface;
|
phy_interface_t compat_interface;
|
||||||
u32 regs_size;
|
u32 regs_size;
|
||||||
bool phy_errata_9477;
|
bool phy_errata_9477;
|
||||||
bool synclko_125;
|
bool synclko_125;
|
||||||
|
Loading…
Reference in New Issue
Block a user