Commit 3015c503 authored by Oleksij Rempel's avatar Oleksij Rempel Committed by David S. Miller

net: dsa: microchip: fix kernel oops on ksz8 switches

After driver refactoring we was running ksz9477 specific CPU port
configuration on ksz8 family which ended with kernel oops. So, make sure
we run this code only on ksz9477 compatible devices.

Tested on KSZ8873 and KSZ9477.

Fixes: da8cd085 ("net: dsa: microchip: add support for common phylink mac link up")
Signed-off-by: default avatarOleksij Rempel <o.rempel@pengutronix.de>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent c55f34b6
...@@ -170,6 +170,13 @@ static const struct ksz_dev_ops ksz8_dev_ops = { ...@@ -170,6 +170,13 @@ static const struct ksz_dev_ops ksz8_dev_ops = {
.exit = ksz8_switch_exit, .exit = ksz8_switch_exit,
}; };
static void ksz9477_phylink_mac_link_up(struct ksz_device *dev, int port,
unsigned int mode,
phy_interface_t interface,
struct phy_device *phydev, int speed,
int duplex, bool tx_pause,
bool rx_pause);
static const struct ksz_dev_ops ksz9477_dev_ops = { static const struct ksz_dev_ops ksz9477_dev_ops = {
.setup = ksz9477_setup, .setup = ksz9477_setup,
.get_port_addr = ksz9477_get_port_addr, .get_port_addr = ksz9477_get_port_addr,
...@@ -196,6 +203,7 @@ static const struct ksz_dev_ops ksz9477_dev_ops = { ...@@ -196,6 +203,7 @@ static const struct ksz_dev_ops ksz9477_dev_ops = {
.mdb_del = ksz9477_mdb_del, .mdb_del = ksz9477_mdb_del,
.change_mtu = ksz9477_change_mtu, .change_mtu = ksz9477_change_mtu,
.max_mtu = ksz9477_max_mtu, .max_mtu = ksz9477_max_mtu,
.phylink_mac_link_up = ksz9477_phylink_mac_link_up,
.config_cpu_port = ksz9477_config_cpu_port, .config_cpu_port = ksz9477_config_cpu_port,
.enable_stp_addr = ksz9477_enable_stp_addr, .enable_stp_addr = ksz9477_enable_stp_addr,
.reset = ksz9477_reset_switch, .reset = ksz9477_reset_switch,
...@@ -230,6 +238,7 @@ static const struct ksz_dev_ops lan937x_dev_ops = { ...@@ -230,6 +238,7 @@ static const struct ksz_dev_ops lan937x_dev_ops = {
.mdb_del = ksz9477_mdb_del, .mdb_del = ksz9477_mdb_del,
.change_mtu = lan937x_change_mtu, .change_mtu = lan937x_change_mtu,
.max_mtu = ksz9477_max_mtu, .max_mtu = ksz9477_max_mtu,
.phylink_mac_link_up = ksz9477_phylink_mac_link_up,
.config_cpu_port = lan937x_config_cpu_port, .config_cpu_port = lan937x_config_cpu_port,
.enable_stp_addr = ksz9477_enable_stp_addr, .enable_stp_addr = ksz9477_enable_stp_addr,
.reset = lan937x_reset_switch, .reset = lan937x_reset_switch,
...@@ -1656,13 +1665,13 @@ static void ksz_duplex_flowctrl(struct ksz_device *dev, int port, int duplex, ...@@ -1656,13 +1665,13 @@ static void ksz_duplex_flowctrl(struct ksz_device *dev, int port, int duplex,
ksz_prmw8(dev, port, regs[P_XMII_CTRL_0], mask, val); ksz_prmw8(dev, port, regs[P_XMII_CTRL_0], mask, val);
} }
static void ksz_phylink_mac_link_up(struct dsa_switch *ds, int port, static void ksz9477_phylink_mac_link_up(struct ksz_device *dev, int port,
unsigned int mode, unsigned int mode,
phy_interface_t interface, phy_interface_t interface,
struct phy_device *phydev, int speed, struct phy_device *phydev, int speed,
int duplex, bool tx_pause, bool rx_pause) int duplex, bool tx_pause,
bool rx_pause)
{ {
struct ksz_device *dev = ds->priv;
struct ksz_port *p; struct ksz_port *p;
p = &dev->ports[port]; p = &dev->ports[port];
...@@ -1676,6 +1685,15 @@ static void ksz_phylink_mac_link_up(struct dsa_switch *ds, int port, ...@@ -1676,6 +1685,15 @@ static void ksz_phylink_mac_link_up(struct dsa_switch *ds, int port,
ksz_port_set_xmii_speed(dev, port, speed); ksz_port_set_xmii_speed(dev, port, speed);
ksz_duplex_flowctrl(dev, port, duplex, tx_pause, rx_pause); ksz_duplex_flowctrl(dev, port, duplex, tx_pause, rx_pause);
}
static void ksz_phylink_mac_link_up(struct dsa_switch *ds, int port,
unsigned int mode,
phy_interface_t interface,
struct phy_device *phydev, int speed,
int duplex, bool tx_pause, bool rx_pause)
{
struct ksz_device *dev = ds->priv;
if (dev->dev_ops->phylink_mac_link_up) if (dev->dev_ops->phylink_mac_link_up)
dev->dev_ops->phylink_mac_link_up(dev, port, mode, interface, dev->dev_ops->phylink_mac_link_up(dev, port, mode, interface,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment