aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/dsa/mv88e6xxx.c49
1 files changed, 36 insertions, 13 deletions
diff --git a/drivers/net/dsa/mv88e6xxx.c b/drivers/net/dsa/mv88e6xxx.c
index fa086e09d6b7..86a202975c02 100644
--- a/drivers/net/dsa/mv88e6xxx.c
+++ b/drivers/net/dsa/mv88e6xxx.c
@@ -2264,6 +2264,38 @@ static void mv88e6xxx_bridge_work(struct work_struct *work)
2264 mutex_unlock(&ps->smi_mutex); 2264 mutex_unlock(&ps->smi_mutex);
2265} 2265}
2266 2266
2267static int _mv88e6xxx_phy_page_write(struct dsa_switch *ds, int port, int page,
2268 int reg, int val)
2269{
2270 int ret;
2271
2272 ret = _mv88e6xxx_phy_write_indirect(ds, port, 0x16, page);
2273 if (ret < 0)
2274 goto restore_page_0;
2275
2276 ret = _mv88e6xxx_phy_write_indirect(ds, port, reg, val);
2277restore_page_0:
2278 _mv88e6xxx_phy_write_indirect(ds, port, 0x16, 0x0);
2279
2280 return ret;
2281}
2282
2283static int _mv88e6xxx_phy_page_read(struct dsa_switch *ds, int port, int page,
2284 int reg)
2285{
2286 int ret;
2287
2288 ret = _mv88e6xxx_phy_write_indirect(ds, port, 0x16, page);
2289 if (ret < 0)
2290 goto restore_page_0;
2291
2292 ret = _mv88e6xxx_phy_read_indirect(ds, port, reg);
2293restore_page_0:
2294 _mv88e6xxx_phy_write_indirect(ds, port, 0x16, 0x0);
2295
2296 return ret;
2297}
2298
2267static int mv88e6xxx_setup_port(struct dsa_switch *ds, int port) 2299static int mv88e6xxx_setup_port(struct dsa_switch *ds, int port)
2268{ 2300{
2269 struct mv88e6xxx_priv_state *ps = ds_to_priv(ds); 2301 struct mv88e6xxx_priv_state *ps = ds_to_priv(ds);
@@ -2714,13 +2746,9 @@ int mv88e6xxx_phy_page_read(struct dsa_switch *ds, int port, int page, int reg)
2714 int ret; 2746 int ret;
2715 2747
2716 mutex_lock(&ps->smi_mutex); 2748 mutex_lock(&ps->smi_mutex);
2717 ret = _mv88e6xxx_phy_write_indirect(ds, port, 0x16, page); 2749 ret = _mv88e6xxx_phy_page_read(ds, port, page, reg);
2718 if (ret < 0)
2719 goto error;
2720 ret = _mv88e6xxx_phy_read_indirect(ds, port, reg);
2721error:
2722 _mv88e6xxx_phy_write_indirect(ds, port, 0x16, 0x0);
2723 mutex_unlock(&ps->smi_mutex); 2750 mutex_unlock(&ps->smi_mutex);
2751
2724 return ret; 2752 return ret;
2725} 2753}
2726 2754
@@ -2731,14 +2759,9 @@ int mv88e6xxx_phy_page_write(struct dsa_switch *ds, int port, int page,
2731 int ret; 2759 int ret;
2732 2760
2733 mutex_lock(&ps->smi_mutex); 2761 mutex_lock(&ps->smi_mutex);
2734 ret = _mv88e6xxx_phy_write_indirect(ds, port, 0x16, page); 2762 ret = _mv88e6xxx_phy_page_write(ds, port, page, reg, val);
2735 if (ret < 0)
2736 goto error;
2737
2738 ret = _mv88e6xxx_phy_write_indirect(ds, port, reg, val);
2739error:
2740 _mv88e6xxx_phy_write_indirect(ds, port, 0x16, 0x0);
2741 mutex_unlock(&ps->smi_mutex); 2763 mutex_unlock(&ps->smi_mutex);
2764
2742 return ret; 2765 return ret;
2743} 2766}
2744 2767