Add PHY autoprobe for Hi3516Cv100, thx @widgetii

pull/168/head
Dmitry Ermakov 2022-01-15 13:41:21 +03:00
parent faf4c2e791
commit 4ee9d068b4
1 changed files with 82 additions and 0 deletions

View File

@ -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];