|
@@ -696,6 +696,8 @@ hns_mac_register_phydev(struct mii_bus *mdio, struct hns_mac_cb *mac_cb,
|
|
|
rc = phy_device_register(phy);
|
|
|
if (rc) {
|
|
|
phy_device_free(phy);
|
|
|
+ dev_err(&mdio->dev, "registered phy fail at address %i\n",
|
|
|
+ addr);
|
|
|
return -ENODEV;
|
|
|
}
|
|
|
|
|
@@ -706,7 +708,7 @@ hns_mac_register_phydev(struct mii_bus *mdio, struct hns_mac_cb *mac_cb,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static void hns_mac_register_phy(struct hns_mac_cb *mac_cb)
|
|
|
+static int hns_mac_register_phy(struct hns_mac_cb *mac_cb)
|
|
|
{
|
|
|
struct acpi_reference_args args;
|
|
|
struct platform_device *pdev;
|
|
@@ -716,24 +718,39 @@ static void hns_mac_register_phy(struct hns_mac_cb *mac_cb)
|
|
|
|
|
|
/* Loop over the child nodes and register a phy_device for each one */
|
|
|
if (!to_acpi_device_node(mac_cb->fw_port))
|
|
|
- return;
|
|
|
+ return -ENODEV;
|
|
|
|
|
|
rc = acpi_node_get_property_reference(
|
|
|
mac_cb->fw_port, "mdio-node", 0, &args);
|
|
|
if (rc)
|
|
|
- return;
|
|
|
+ return rc;
|
|
|
|
|
|
addr = hns_mac_phy_parse_addr(mac_cb->dev, mac_cb->fw_port);
|
|
|
if (addr < 0)
|
|
|
- return;
|
|
|
+ return addr;
|
|
|
|
|
|
/* dev address in adev */
|
|
|
pdev = hns_dsaf_find_platform_device(acpi_fwnode_handle(args.adev));
|
|
|
+ if (!pdev) {
|
|
|
+ dev_err(mac_cb->dev, "mac%d mdio pdev is NULL\n",
|
|
|
+ mac_cb->mac_id);
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+
|
|
|
mii_bus = platform_get_drvdata(pdev);
|
|
|
+ if (!mii_bus) {
|
|
|
+ dev_err(mac_cb->dev,
|
|
|
+ "mac%d mdio is NULL, dsaf will probe again later\n",
|
|
|
+ mac_cb->mac_id);
|
|
|
+ return -EPROBE_DEFER;
|
|
|
+ }
|
|
|
+
|
|
|
rc = hns_mac_register_phydev(mii_bus, mac_cb, addr);
|
|
|
if (!rc)
|
|
|
dev_dbg(mac_cb->dev, "mac%d register phy addr:%d\n",
|
|
|
mac_cb->mac_id, addr);
|
|
|
+
|
|
|
+ return rc;
|
|
|
}
|
|
|
|
|
|
#define MAC_MEDIA_TYPE_MAX_LEN 16
|
|
@@ -754,7 +771,7 @@ static const struct {
|
|
|
*@np:device node
|
|
|
* return: 0 --success, negative --fail
|
|
|
*/
|
|
|
-static int hns_mac_get_info(struct hns_mac_cb *mac_cb)
|
|
|
+static int hns_mac_get_info(struct hns_mac_cb *mac_cb)
|
|
|
{
|
|
|
struct device_node *np;
|
|
|
struct regmap *syscon;
|
|
@@ -864,7 +881,15 @@ static int hns_mac_get_info(struct hns_mac_cb *mac_cb)
|
|
|
}
|
|
|
}
|
|
|
} else if (is_acpi_node(mac_cb->fw_port)) {
|
|
|
- hns_mac_register_phy(mac_cb);
|
|
|
+ ret = hns_mac_register_phy(mac_cb);
|
|
|
+ /*
|
|
|
+ * Mac can work well if there is phy or not.If the port don't
|
|
|
+ * connect with phy, the return value will be ignored. Only
|
|
|
+ * when there is phy but can't find mdio bus, the return value
|
|
|
+ * will be handled.
|
|
|
+ */
|
|
|
+ if (ret == -EPROBE_DEFER)
|
|
|
+ return ret;
|
|
|
} else {
|
|
|
dev_err(mac_cb->dev, "mac%d cannot find phy node\n",
|
|
|
mac_cb->mac_id);
|
|
@@ -1026,6 +1051,7 @@ int hns_mac_init(struct dsaf_device *dsaf_dev)
|
|
|
dsaf_dev->mac_cb[port_id] = mac_cb;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
/* init mac_cb for all port */
|
|
|
for (port_id = 0; port_id < max_port_num; port_id++) {
|
|
|
mac_cb = dsaf_dev->mac_cb[port_id];
|
|
@@ -1035,6 +1061,7 @@ int hns_mac_init(struct dsaf_device *dsaf_dev)
|
|
|
ret = hns_mac_get_cfg(dsaf_dev, mac_cb);
|
|
|
if (ret)
|
|
|
return ret;
|
|
|
+
|
|
|
ret = hns_mac_init_ex(mac_cb);
|
|
|
if (ret)
|
|
|
return ret;
|