diff --git a/br-ext-chip-hisilicon/board/hi3516cv100/kernel/patches/24_hieth_autoprobe.patch b/br-ext-chip-hisilicon/board/hi3516cv100/kernel/patches/24_hieth_autoprobe.patch new file mode 100644 index 00000000..29176e50 --- /dev/null +++ b/br-ext-chip-hisilicon/board/hi3516cv100/kernel/patches/24_hieth_autoprobe.patch @@ -0,0 +1,82 @@ +--- a/drivers/net/hieth-sf/net.c ++++ b/drivers/net/hieth-sf/net.c +@@ -674,7 +674,7 @@ + .ndo_get_stats = hieth_net_get_stats, + }; + +-static int hieth_platdev_probe_port(struct platform_device *pdev, int port) ++static int hieth_platdev_probe_port(struct platform_device *pdev, int port, int hieth_mdio_if_u, int hieth_mdio_if_d, int hieth_phyaddr_u, int hieth_phyaddr_d) + { + int ret = -1; + struct net_device *netdev = NULL; +@@ -685,6 +685,11 @@ + ret = -ENODEV; + goto _error_exit; + } ++ ++ printk(KERN_INFO "PHY probing %s hieth_mdio_if_u=%d, hieth_mdio_if_d=%d," ++ " hieth_phyaddr_u=%d, hieth_phyaddr_d=%d\n", ++ UP_PORT ? "UP_PORT" : "DOWN_PORT", hieth_mdio_if_u, ++ hieth_mdio_if_d, hieth_phyaddr_u, hieth_phyaddr_d); + + netdev = alloc_etherdev(sizeof(*ld)); + if (netdev == NULL) { +@@ -816,7 +821,7 @@ + return 0; + } + +-static void phy_quirk(struct hieth_mdio_local *mdio, int phyaddr) ++static void phy_quirk(struct hieth_mdio_local *mdio, int phyaddr, int hieth_mdio_if_u) + { + unsigned long phy_id; + unsigned short id1, id2; +@@ -860,6 +865,28 @@ + } + } + ++static struct { ++ int up; ++ int down; ++} trial_table[] = { ++ { 1, 0 }, ++ { 1, 2 }, ++ { 0, 2 }, ++}; ++ ++static void bruteforce_hieth(struct platform_device *pdev) { ++ int i; ++ ++ for (i = 0; i < sizeof(trial_table) / sizeof(trial_table[0]); i++) { ++ if (!hieth_platdev_probe_port(pdev, UP_PORT, hieth_mdio_if_u, ++ hieth_mdio_if_d, trial_table[i].up, trial_table[i].down)) { ++ printk(KERN_INFO "PHY auto probing success, using u/d %d/%d\n", ++ trial_table[i].up, trial_table[i].down); ++ break; ++ } ++ } ++} ++ + static int hieth_plat_driver_probe(struct platform_device *pdev) + { + int ret = -1; +@@ -877,13 +904,12 @@ + + hieth_verify_flow_ctrl_args(); + +- hieth_platdev_probe_port(pdev, UP_PORT); +-#ifdef CONFIG_HIETH_DOWNPORT_EN +- hieth_platdev_probe_port(pdev, DOWN_PORT); +-#endif +- +- phy_quirk(&hieth_mdio_local_device, hieth_phyaddr_u); +- phy_quirk(&hieth_mdio_local_device, hieth_phyaddr_d); ++ if (hieth_platdev_probe_port(pdev, UP_PORT, hieth_mdio_if_u, hieth_mdio_if_d, hieth_phyaddr_u, hieth_phyaddr_d)) ++ if (hieth_platdev_probe_port(pdev, DOWN_PORT, hieth_mdio_if_u, hieth_mdio_if_d, hieth_phyaddr_u, hieth_phyaddr_d)) ++ bruteforce_hieth(pdev); ++ ++ phy_quirk(&hieth_mdio_local_device, hieth_phyaddr_u, hieth_mdio_if_u); ++ phy_quirk(&hieth_mdio_local_device, hieth_phyaddr_d, hieth_mdio_if_u); + + if (hieth_devs_save[UP_PORT]) + ndev = hieth_devs_save[UP_PORT]; +