168984b
From 4d1b08a69350d40e0aa14baba4797ef175295718 Mon Sep 17 00:00:00 2001
168984b
From: Peter Robinson <pbrobinson@gmail.com>
168984b
Date: Wed, 30 Mar 2016 12:40:54 +0100
168984b
Subject: [PATCH 1/2] net: dsa: mv88e6xxx: Introduce
168984b
 _mv88e6xxx_phy_page_{read,write}
168984b
168984b
Add versions of the phy_page_read and _write functions to
168984b
be used in a context where the SMI mutex is held.
168984b
168984b
Tested-by: Vivien Didelot <vivien.didelot@savoirfairelinux.com>
168984b
Reviewed-by: Vivien Didelot <vivien.didelot@savoirfairelinux.com>
168984b
Signed-off-by: Patrick Uiterwijk <patrick@puiterwijk.org>
168984b
---
168984b
 drivers/net/dsa/mv88e6xxx.c | 49 +++++++++++++++++++++++++++++++++------------
168984b
 1 file changed, 36 insertions(+), 13 deletions(-)
168984b
168984b
diff --git a/drivers/net/dsa/mv88e6xxx.c b/drivers/net/dsa/mv88e6xxx.c
168984b
index 512c8c0..3dcfe13 100644
168984b
--- a/drivers/net/dsa/mv88e6xxx.c
168984b
+++ b/drivers/net/dsa/mv88e6xxx.c
168984b
@@ -1929,6 +1929,38 @@ static void mv88e6xxx_bridge_work(struct work_struct *work)
168984b
 	}
168984b
 }
168984b
 
168984b
+static int _mv88e6xxx_phy_page_write(struct dsa_switch *ds, int port, int page,
168984b
+				     int reg, int val)
168984b
+{
168984b
+	int ret;
168984b
+
168984b
+	ret = _mv88e6xxx_phy_write_indirect(ds, port, 0x16, page);
168984b
+	if (ret < 0)
168984b
+		goto restore_page_0;
168984b
+
168984b
+	ret = _mv88e6xxx_phy_write_indirect(ds, port, reg, val);
168984b
+restore_page_0:
168984b
+	_mv88e6xxx_phy_write_indirect(ds, port, 0x16, 0x0);
168984b
+
168984b
+	return ret;
168984b
+}
168984b
+
168984b
+static int _mv88e6xxx_phy_page_read(struct dsa_switch *ds, int port, int page,
168984b
+				    int reg)
168984b
+{
168984b
+	int ret;
168984b
+
168984b
+	ret = _mv88e6xxx_phy_write_indirect(ds, port, 0x16, page);
168984b
+	if (ret < 0)
168984b
+		goto restore_page_0;
168984b
+
168984b
+	ret = _mv88e6xxx_phy_read_indirect(ds, port, reg);
168984b
+restore_page_0:
168984b
+	_mv88e6xxx_phy_write_indirect(ds, port, 0x16, 0x0);
168984b
+
168984b
+	return ret;
168984b
+}
168984b
+
168984b
 static int mv88e6xxx_setup_port(struct dsa_switch *ds, int port)
168984b
 {
168984b
 	struct mv88e6xxx_priv_state *ps = ds_to_priv(ds);
168984b
@@ -2383,13 +2415,9 @@ int mv88e6xxx_phy_page_read(struct dsa_switch *ds, int port, int page, int reg)
168984b
 	int ret;
168984b
 
168984b
 	mutex_lock(&ps->smi_mutex);
168984b
-	ret = _mv88e6xxx_phy_write_indirect(ds, port, 0x16, page);
168984b
-	if (ret < 0)
168984b
-		goto error;
168984b
-	ret = _mv88e6xxx_phy_read_indirect(ds, port, reg);
168984b
-error:
168984b
-	_mv88e6xxx_phy_write_indirect(ds, port, 0x16, 0x0);
168984b
+	ret = _mv88e6xxx_phy_page_read(ds, port, page, reg);
168984b
 	mutex_unlock(&ps->smi_mutex);
168984b
+
168984b
 	return ret;
168984b
 }
168984b
 
168984b
@@ -2400,14 +2428,9 @@ int mv88e6xxx_phy_page_write(struct dsa_switch *ds, int port, int page,
168984b
 	int ret;
168984b
 
168984b
 	mutex_lock(&ps->smi_mutex);
168984b
-	ret = _mv88e6xxx_phy_write_indirect(ds, port, 0x16, page);
168984b
-	if (ret < 0)
168984b
-		goto error;
168984b
-
168984b
-	ret = _mv88e6xxx_phy_write_indirect(ds, port, reg, val);
168984b
-error:
168984b
-	_mv88e6xxx_phy_write_indirect(ds, port, 0x16, 0x0);
168984b
+	ret = _mv88e6xxx_phy_page_write(ds, port, page, reg, val);
168984b
 	mutex_unlock(&ps->smi_mutex);
168984b
+
168984b
 	return ret;
168984b
 }
168984b
 
168984b
-- 
168984b
2.7.3
168984b