net: hns: add dsaf misc operation method
[deliverable/linux.git] / drivers / net / ethernet / hisilicon / hns / hns_dsaf_mac.c
index 611581fccf2a4eb1d569514d4c6613ebf54fee3e..2ebf14ad71988a77f0e67a9a156c7f07b0e50e9b 100644 (file)
@@ -15,7 +15,8 @@
 #include <linux/netdevice.h>
 #include <linux/of.h>
 #include <linux/of_address.h>
-#include <linux/phy_fixed.h>
+#include <linux/of_mdio.h>
+#include <linux/phy.h>
 #include <linux/platform_device.h>
 
 #include "hns_dsaf_main.h"
@@ -94,7 +95,7 @@ void hns_mac_get_link_status(struct hns_mac_cb *mac_cb, u32 *link_status)
        else
                *link_status = 0;
 
-       ret = hns_mac_get_sfp_prsnt(mac_cb, &sfp_prsnt);
+       ret = mac_cb->dsaf_dev->misc_op->get_sfp_prsnt(mac_cb, &sfp_prsnt);
        if (!ret)
                *link_status = *link_status && sfp_prsnt;
 
@@ -511,7 +512,7 @@ void hns_mac_stop(struct hns_mac_cb *mac_cb)
 
        mac_ctrl_drv->mac_en_flg = 0;
        mac_cb->link = 0;
-       cpld_led_reset(mac_cb);
+       mac_cb->dsaf_dev->misc_op->cpld_reset_led(mac_cb);
 }
 
 /**
@@ -645,7 +646,7 @@ free_mac_drv:
  */
 static int  hns_mac_get_info(struct hns_mac_cb *mac_cb)
 {
-       struct device_node *np = mac_cb->dev->of_node;
+       struct device_node *np;
        struct regmap *syscon;
        struct of_phandle_args cpld_args;
        u32 ret;
@@ -672,21 +673,34 @@ static int  hns_mac_get_info(struct hns_mac_cb *mac_cb)
         * from dsaf node
         */
        if (!mac_cb->fw_port) {
-               mac_cb->phy_node = of_parse_phandle(np, "phy-handle",
-                                                   mac_cb->mac_id);
-               if (mac_cb->phy_node)
+               np = of_parse_phandle(mac_cb->dev->of_node, "phy-handle",
+                                     mac_cb->mac_id);
+               mac_cb->phy_dev = of_phy_find_device(np);
+               if (mac_cb->phy_dev) {
+                       /* refcount is held by of_phy_find_device()
+                        * if the phy_dev is found
+                        */
+                       put_device(&mac_cb->phy_dev->mdio.dev);
+
                        dev_dbg(mac_cb->dev, "mac%d phy_node: %s\n",
-                               mac_cb->mac_id, mac_cb->phy_node->name);
+                               mac_cb->mac_id, np->name);
+               }
+
                return 0;
        }
+
        if (!is_of_node(mac_cb->fw_port))
                return -EINVAL;
+
        /* parse property from port subnode in dsaf */
-       mac_cb->phy_node = of_parse_phandle(to_of_node(mac_cb->fw_port),
-                                           "phy-handle", 0);
-       if (mac_cb->phy_node)
+       np = of_parse_phandle(to_of_node(mac_cb->fw_port), "phy-handle", 0);
+       mac_cb->phy_dev = of_phy_find_device(np);
+       if (mac_cb->phy_dev) {
+               put_device(&mac_cb->phy_dev->mdio.dev);
                dev_dbg(mac_cb->dev, "mac%d phy_node: %s\n",
-                       mac_cb->mac_id, mac_cb->phy_node->name);
+                       mac_cb->mac_id, np->name);
+               }
+
        syscon = syscon_node_to_regmap(
                        of_parse_phandle(to_of_node(mac_cb->fw_port),
                                         "serdes-syscon", 0));
@@ -790,7 +804,7 @@ int hns_mac_get_cfg(struct dsaf_device *dsaf_dev, struct hns_mac_cb *mac_cb)
        else
                mac_cb->mac_type = HNAE_PORT_DEBUG;
 
-       mac_cb->phy_if = hns_mac_get_phy_if(mac_cb);
+       mac_cb->phy_if = dsaf_dev->misc_op->get_phy_if(mac_cb);
 
        ret = hns_mac_get_mode(mac_cb->phy_if);
        if (ret < 0) {
@@ -805,7 +819,7 @@ int hns_mac_get_cfg(struct dsaf_device *dsaf_dev, struct hns_mac_cb *mac_cb)
        if (ret)
                return ret;
 
-       cpld_led_reset(mac_cb);
+       mac_cb->dsaf_dev->misc_op->cpld_reset_led(mac_cb);
        mac_cb->vaddr = hns_mac_get_vaddr(dsaf_dev, mac_cb, mac_mode_idx);
 
        return 0;
@@ -892,7 +906,7 @@ void hns_mac_uninit(struct dsaf_device *dsaf_dev)
        int max_port_num = hns_mac_get_max_port_num(dsaf_dev);
 
        for (i = 0; i < max_port_num; i++) {
-               cpld_led_reset(dsaf_dev->mac_cb[i]);
+               dsaf_dev->misc_op->cpld_reset_led(dsaf_dev->mac_cb[i]);
                dsaf_dev->mac_cb[i] = NULL;
        }
 }
@@ -975,7 +989,7 @@ void hns_set_led_opt(struct hns_mac_cb *mac_cb)
                nic_data = 0;
        mac_cb->txpkt_for_led = mac_cb->hw_stats.tx_good_pkts;
        mac_cb->rxpkt_for_led = mac_cb->hw_stats.rx_good_pkts;
-       hns_cpld_set_led(mac_cb, (int)mac_cb->link,
+       mac_cb->dsaf_dev->misc_op->cpld_set_led(mac_cb, (int)mac_cb->link,
                         mac_cb->speed, nic_data);
 }
 
@@ -985,5 +999,5 @@ int hns_cpld_led_set_id(struct hns_mac_cb *mac_cb,
        if (!mac_cb || !mac_cb->cpld_ctrl)
                return 0;
 
-       return cpld_set_led_id(mac_cb, status);
+       return mac_cb->dsaf_dev->misc_op->cpld_set_led_id(mac_cb, status);
 }
This page took 0.025958 seconds and 5 git commands to generate.