Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

net: dsa: qca8k: fix kernel panic with legacy mdio mapping

When the mdio legacy mapping is used the mii_bus priv registered by DSA
refer to the dsa switch struct instead of the qca8k_priv struct and
causes a kernel panic. Create dedicated function when the internal
dedicated mdio driver is used to properly handle the 2 different
implementation.

Fixes: 759bafb8a322 ("net: dsa: qca8k: add support for internal phy and internal mdio")
Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Ansuel Smith and committed by
David S. Miller
ce062a0a 08dad2f4

+22 -8
+22 -8
drivers/net/dsa/qca8k.c
··· 643 643 } 644 644 645 645 static int 646 - qca8k_mdio_write(struct mii_bus *salve_bus, int phy, int regnum, u16 data) 646 + qca8k_mdio_write(struct mii_bus *bus, int phy, int regnum, u16 data) 647 647 { 648 - struct qca8k_priv *priv = salve_bus->priv; 649 - struct mii_bus *bus = priv->bus; 650 648 u16 r1, r2, page; 651 649 u32 val; 652 650 int ret; ··· 680 682 } 681 683 682 684 static int 683 - qca8k_mdio_read(struct mii_bus *salve_bus, int phy, int regnum) 685 + qca8k_mdio_read(struct mii_bus *bus, int phy, int regnum) 684 686 { 685 - struct qca8k_priv *priv = salve_bus->priv; 686 - struct mii_bus *bus = priv->bus; 687 687 u16 r1, r2, page; 688 688 u32 val; 689 689 int ret; ··· 720 724 ret = val & QCA8K_MDIO_MASTER_DATA_MASK; 721 725 722 726 return ret; 727 + } 728 + 729 + static int 730 + qca8k_internal_mdio_write(struct mii_bus *slave_bus, int phy, int regnum, u16 data) 731 + { 732 + struct qca8k_priv *priv = slave_bus->priv; 733 + struct mii_bus *bus = priv->bus; 734 + 735 + return qca8k_mdio_write(bus, phy, regnum, data); 736 + } 737 + 738 + static int 739 + qca8k_internal_mdio_read(struct mii_bus *slave_bus, int phy, int regnum) 740 + { 741 + struct qca8k_priv *priv = slave_bus->priv; 742 + struct mii_bus *bus = priv->bus; 743 + 744 + return qca8k_mdio_read(bus, phy, regnum); 723 745 } 724 746 725 747 static int ··· 789 775 790 776 bus->priv = (void *)priv; 791 777 bus->name = "qca8k slave mii"; 792 - bus->read = qca8k_mdio_read; 793 - bus->write = qca8k_mdio_write; 778 + bus->read = qca8k_internal_mdio_read; 779 + bus->write = qca8k_internal_mdio_write; 794 780 snprintf(bus->id, MII_BUS_ID_SIZE, "qca8k-%d", 795 781 ds->index); 796 782