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 | ||
