diff options
-rw-r--r-- | drivers/net/dsa/mv88e6xxx.c | 49 |
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 | ||
2267 | static 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); | ||
2277 | restore_page_0: | ||
2278 | _mv88e6xxx_phy_write_indirect(ds, port, 0x16, 0x0); | ||
2279 | |||
2280 | return ret; | ||
2281 | } | ||
2282 | |||
2283 | static 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); | ||
2293 | restore_page_0: | ||
2294 | _mv88e6xxx_phy_write_indirect(ds, port, 0x16, 0x0); | ||
2295 | |||
2296 | return ret; | ||
2297 | } | ||
2298 | |||
2267 | static int mv88e6xxx_setup_port(struct dsa_switch *ds, int port) | 2299 | static 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); | ||
2721 | error: | ||
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); | ||
2739 | error: | ||
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 | ||