Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1245863 > unrolled thread

[PATCH net-next 0/6] net: dsa: implement port_fdb_dump in drivers

Started byVivien Didelot <vivien.didelot@savoirfairelinux.com>
First post2015-10-13 17:50 +0200
Last post2015-10-13 18:20 +0200
Articles 6 — 1 participant

Back to article view | Back to linux.kernel


Contents

  [PATCH net-next 0/6] net: dsa: implement port_fdb_dump in drivers Vivien Didelot <vivien.didelot@savoirfairelinux.com> - 2015-10-13 17:50 +0200
    [PATCH net-next 5/6] net: dsa: mv88e6xxx: remove port_fdb_getnext Vivien Didelot <vivien.didelot@savoirfairelinux.com> - 2015-10-13 17:50 +0200
    [PATCH net-next 2/6] net: dsa: mv88e6xxx: write MAC outside of ATU Get Next code Vivien Didelot <vivien.didelot@savoirfairelinux.com> - 2015-10-13 17:50 +0200
    [PATCH net-next 3/6] net: dsa: add port_fdb_dump function Vivien Didelot <vivien.didelot@savoirfairelinux.com> - 2015-10-13 17:50 +0200
    [PATCH net-next 1/6] net: dsa: mv88e6xxx: write VID outside of VTU Get Next code Vivien Didelot <vivien.didelot@savoirfairelinux.com> - 2015-10-13 17:50 +0200
    Re: [PATCH net-next 0/6] net: dsa: implement port_fdb_dump in drivers Vivien Didelot <vivien.didelot@savoirfairelinux.com> - 2015-10-13 18:20 +0200

#1245863 — [PATCH net-next 0/6] net: dsa: implement port_fdb_dump in drivers

FromVivien Didelot <vivien.didelot@savoirfairelinux.com>
Date2015-10-13 17:50 +0200
Subject[PATCH net-next 0/6] net: dsa: implement port_fdb_dump in drivers
Message-ID<qj9ZU-2xR-23@gated-at.bofh.it>
Not all switch chips provide a Get Next kind of operation to dump FDB entries.
It is preferred to let the driver handle the dump operation the way it works
best for the chip. Thus, drop port_fdb_getnext and implement the port_fdb_dump
operation in DSA, which pushes the switchdev FDB dump callback down to the
drivers. mv88e6xxx is the only driver affected and is updated accordingly.

Vivien Didelot (6):
  net: dsa: mv88e6xxx: write VID outside of VTU Get Next code
  net: dsa: mv88e6xxx: write MAC outside of ATU Get Next code
  net: dsa: add port_fdb_dump function
  net: dsa: mv88e6xxx: implement port_fdb_dump
  net: dsa: mv88e6xxx: remove port_fdb_getnext
  net: dsa: remove port_fdb_getnext

 drivers/net/dsa/mv88e6171.c |   2 +-
 drivers/net/dsa/mv88e6352.c |   2 +-
 drivers/net/dsa/mv88e6xxx.c | 140 ++++++++++++++++++++++++--------------------
 drivers/net/dsa/mv88e6xxx.h |   5 +-
 include/net/dsa.h           |   8 ++-
 net/dsa/slave.c             |  26 +-------
 6 files changed, 90 insertions(+), 93 deletions(-)

-- 
2.6.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [next] | [standalone]


#1245864 — [PATCH net-next 5/6] net: dsa: mv88e6xxx: remove port_fdb_getnext

FromVivien Didelot <vivien.didelot@savoirfairelinux.com>
Date2015-10-13 17:50 +0200
Subject[PATCH net-next 5/6] net: dsa: mv88e6xxx: remove port_fdb_getnext
Message-ID<qj9ZU-2xR-29@gated-at.bofh.it>
In reply to#1245863
Now that port_fdb_dump is implemented and even simpler, get rid of
port_fdb_getnext.

Signed-off-by: Vivien Didelot <vivien.didelot@savoirfairelinux.com>
---
 drivers/net/dsa/mv88e6171.c |  1 -
 drivers/net/dsa/mv88e6352.c |  1 -
 drivers/net/dsa/mv88e6xxx.c | 73 ---------------------------------------------
 drivers/net/dsa/mv88e6xxx.h |  2 --
 4 files changed, 77 deletions(-)

diff --git a/drivers/net/dsa/mv88e6171.c b/drivers/net/dsa/mv88e6171.c
index 489deb8..2c8eb6f 100644
--- a/drivers/net/dsa/mv88e6171.c
+++ b/drivers/net/dsa/mv88e6171.c
@@ -122,7 +122,6 @@ struct dsa_switch_driver mv88e6171_switch_driver = {
 	.port_fdb_prepare	= mv88e6xxx_port_fdb_prepare,
 	.port_fdb_add		= mv88e6xxx_port_fdb_add,
 	.port_fdb_del		= mv88e6xxx_port_fdb_del,
-	.port_fdb_getnext	= mv88e6xxx_port_fdb_getnext,
 	.port_fdb_dump		= mv88e6xxx_port_fdb_dump,
 };
 
diff --git a/drivers/net/dsa/mv88e6352.c b/drivers/net/dsa/mv88e6352.c
index 6b8fd24..cbf4dd8 100644
--- a/drivers/net/dsa/mv88e6352.c
+++ b/drivers/net/dsa/mv88e6352.c
@@ -349,7 +349,6 @@ struct dsa_switch_driver mv88e6352_switch_driver = {
 	.port_fdb_prepare	= mv88e6xxx_port_fdb_prepare,
 	.port_fdb_add		= mv88e6xxx_port_fdb_add,
 	.port_fdb_del		= mv88e6xxx_port_fdb_del,
-	.port_fdb_getnext	= mv88e6xxx_port_fdb_getnext,
 	.port_fdb_dump		= mv88e6xxx_port_fdb_dump,
 };
 
diff --git a/drivers/net/dsa/mv88e6xxx.c b/drivers/net/dsa/mv88e6xxx.c
index 41e630a..5657f5b 100644
--- a/drivers/net/dsa/mv88e6xxx.c
+++ b/drivers/net/dsa/mv88e6xxx.c
@@ -1559,33 +1559,6 @@ unlock:
 	return err;
 }
 
-static int _mv88e6xxx_port_vtu_getnext(struct dsa_switch *ds, int port, u16 vid,
-				       struct mv88e6xxx_vtu_stu_entry *entry)
-{
-	int err;
-
-	do {
-		if (vid == 4095)
-			return -ENOENT;
-
-		err = _mv88e6xxx_vtu_vid_write(ds, vid);
-		if (err)
-			return err;
-
-		err = _mv88e6xxx_vtu_getnext(ds, entry);
-		if (err)
-			return err;
-
-		if (!entry->valid)
-			return -ENOENT;
-
-		vid = entry->vid;
-	} while (entry->data[port] != GLOBAL_VTU_DATA_MEMBER_TAG_TAGGED &&
-		 entry->data[port] != GLOBAL_VTU_DATA_MEMBER_TAG_UNTAGGED);
-
-	return 0;
-}
-
 int mv88e6xxx_vlan_getnext(struct dsa_switch *ds, u16 *vid,
 			   unsigned long *ports, unsigned long *untagged)
 {
@@ -1864,52 +1837,6 @@ unlock:
 	return err;
 }
 
-/* get next entry for port */
-int mv88e6xxx_port_fdb_getnext(struct dsa_switch *ds, int port,
-			       unsigned char *addr, u16 *vid, bool *is_static)
-{
-	struct mv88e6xxx_priv_state *ps = ds_to_priv(ds);
-	struct mv88e6xxx_atu_entry next;
-	u16 fid = *vid; /* We use one FID per VLAN */
-	int ret;
-
-	mutex_lock(&ps->smi_mutex);
-
-	do {
-		if (is_broadcast_ether_addr(addr)) {
-			struct mv88e6xxx_vtu_stu_entry vtu;
-
-			ret = _mv88e6xxx_port_vtu_getnext(ds, port, *vid, &vtu);
-			if (ret < 0)
-				goto unlock;
-
-			*vid = vtu.vid;
-			fid = vtu.fid;
-		}
-
-		ret = _mv88e6xxx_atu_mac_write(ds, addr);
-		if (ret < 0)
-			goto unlock;
-
-		ret = _mv88e6xxx_atu_getnext(ds, fid, &next);
-		if (ret < 0)
-			goto unlock;
-
-		ether_addr_copy(addr, next.mac);
-
-		if (next.state == GLOBAL_ATU_DATA_STATE_UNUSED)
-			continue;
-	} while (next.trunk || (next.portv_trunkid & BIT(port)) == 0);
-
-	*is_static = next.state == (is_multicast_ether_addr(addr) ?
-				    GLOBAL_ATU_DATA_STATE_MC_STATIC :
-				    GLOBAL_ATU_DATA_STATE_UC_STATIC);
-unlock:
-	mutex_unlock(&ps->smi_mutex);
-
-	return ret;
-}
-
 static void mv88e6xxx_bridge_work(struct work_struct *work)
 {
 	struct mv88e6xxx_priv_state *ps;
diff --git a/drivers/net/dsa/mv88e6xxx.h b/drivers/net/dsa/mv88e6xxx.h
index 08e0fbb..c921427 100644
--- a/drivers/net/dsa/mv88e6xxx.h
+++ b/drivers/net/dsa/mv88e6xxx.h
@@ -479,8 +479,6 @@ int mv88e6xxx_port_fdb_add(struct dsa_switch *ds, int port,
 			   struct switchdev_trans *trans);
 int mv88e6xxx_port_fdb_del(struct dsa_switch *ds, int port,
 			   const struct switchdev_obj_port_fdb *fdb);
-int mv88e6xxx_port_fdb_getnext(struct dsa_switch *ds, int port,
-			       unsigned char *addr, u16 *vid, bool *is_static);
 int mv88e6xxx_port_fdb_dump(struct dsa_switch *ds, int port,
 			    struct switchdev_obj_port_fdb *fdb,
 			    switchdev_obj_dump_cb_t *cb);
-- 
2.6.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [prev] | [next] | [standalone]


#1245866 — [PATCH net-next 2/6] net: dsa: mv88e6xxx: write MAC outside of ATU Get Next code

FromVivien Didelot <vivien.didelot@savoirfairelinux.com>
Date2015-10-13 17:50 +0200
Subject[PATCH net-next 2/6] net: dsa: mv88e6xxx: write MAC outside of ATU Get Next code
Message-ID<qj9ZV-2xR-41@gated-at.bofh.it>
In reply to#1245863
There is no need to write the MAC address before every Get Next
operation, since ATU MAC registers are not cleared between calls.

Move the _mv88e6xxx_atu_mac_write call outside of _mv88e6xxx_atu_getnext
so future code could call ATU Get Next multiple times and save a few
register access.
---
 drivers/net/dsa/mv88e6xxx.c | 11 +++++------
 1 file changed, 5 insertions(+), 6 deletions(-)

diff --git a/drivers/net/dsa/mv88e6xxx.c b/drivers/net/dsa/mv88e6xxx.c
index 1edefe0..b4e97c1 100644
--- a/drivers/net/dsa/mv88e6xxx.c
+++ b/drivers/net/dsa/mv88e6xxx.c
@@ -1751,7 +1751,6 @@ int mv88e6xxx_port_fdb_del(struct dsa_switch *ds, int port,
 }
 
 static int _mv88e6xxx_atu_getnext(struct dsa_switch *ds, u16 fid,
-				  const unsigned char *addr,
 				  struct mv88e6xxx_atu_entry *entry)
 {
 	struct mv88e6xxx_atu_entry next = { 0 };
@@ -1763,10 +1762,6 @@ static int _mv88e6xxx_atu_getnext(struct dsa_switch *ds, u16 fid,
 	if (ret < 0)
 		return ret;
 
-	ret = _mv88e6xxx_atu_mac_write(ds, addr);
-	if (ret < 0)
-		return ret;
-
 	ret = _mv88e6xxx_reg_write(ds, REG_GLOBAL, GLOBAL_ATU_FID, fid);
 	if (ret < 0)
 		return ret;
@@ -1827,7 +1822,11 @@ int mv88e6xxx_port_fdb_getnext(struct dsa_switch *ds, int port,
 			fid = vtu.fid;
 		}
 
-		ret = _mv88e6xxx_atu_getnext(ds, fid, addr, &next);
+		ret = _mv88e6xxx_atu_mac_write(ds, addr);
+		if (ret < 0)
+			goto unlock;
+
+		ret = _mv88e6xxx_atu_getnext(ds, fid, &next);
 		if (ret < 0)
 			goto unlock;
 
-- 
2.6.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [prev] | [next] | [standalone]


#1245867 — [PATCH net-next 3/6] net: dsa: add port_fdb_dump function

FromVivien Didelot <vivien.didelot@savoirfairelinux.com>
Date2015-10-13 17:50 +0200
Subject[PATCH net-next 3/6] net: dsa: add port_fdb_dump function
Message-ID<qj9ZV-2xR-51@gated-at.bofh.it>
In reply to#1245863
Not all switch chips support a Get Next operation to iterate on its FDB.
So add a more simple port_fdb_dump function for them.

Signed-off-by: Vivien Didelot <vivien.didelot@savoirfairelinux.com>
---
 include/net/dsa.h | 5 +++++
 net/dsa/slave.c   | 3 +++
 2 files changed, 8 insertions(+)

diff --git a/include/net/dsa.h b/include/net/dsa.h
index e005886..c5c48c5 100644
--- a/include/net/dsa.h
+++ b/include/net/dsa.h
@@ -198,7 +198,9 @@ static inline u8 dsa_upstream_port(struct dsa_switch *ds)
 }
 
 struct switchdev_trans;
+struct switchdev_obj;
 struct switchdev_obj_port_fdb;
+typedef int switchdev_obj_dump_cb_t(struct switchdev_obj *obj);
 
 struct dsa_switch_driver {
 	struct list_head	list;
@@ -330,6 +332,9 @@ struct dsa_switch_driver {
 	int	(*port_fdb_getnext)(struct dsa_switch *ds, int port,
 				    unsigned char *addr, u16 *vid,
 				    bool *is_static);
+	int	(*port_fdb_dump)(struct dsa_switch *ds, int port,
+				 struct switchdev_obj_port_fdb *fdb,
+				 switchdev_obj_dump_cb_t *cb);
 };
 
 void register_switch_driver(struct dsa_switch_driver *type);
diff --git a/net/dsa/slave.c b/net/dsa/slave.c
index 43d7342..a4e3416 100644
--- a/net/dsa/slave.c
+++ b/net/dsa/slave.c
@@ -382,6 +382,9 @@ static int dsa_slave_port_fdb_dump(struct net_device *dev,
 	u16 vid = 0;
 	int ret;
 
+	if (ds->drv->port_fdb_dump)
+		return ds->drv->port_fdb_dump(ds, p->port, fdb, cb);
+
 	if (!ds->drv->port_fdb_getnext)
 		return -EOPNOTSUPP;
 
-- 
2.6.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [prev] | [next] | [standalone]


#1245869 — [PATCH net-next 1/6] net: dsa: mv88e6xxx: write VID outside of VTU Get Next code

FromVivien Didelot <vivien.didelot@savoirfairelinux.com>
Date2015-10-13 17:50 +0200
Subject[PATCH net-next 1/6] net: dsa: mv88e6xxx: write VID outside of VTU Get Next code
Message-ID<qj9ZV-2xR-57@gated-at.bofh.it>
In reply to#1245863
There is no need to write the VLAN ID before every Get Next operation,
since the VTU VID register is not cleared between calls.

Move the VID write call in a _mv88e6xxx_vtu_vid_write function outside
of _mv88e6xxx_vtu_getnext so future code could call VTU Get Next
multiple times and save a few register accesses.

Signed-off-by: Vivien Didelot <vivien.didelot@savoirfairelinux.com>
---
 drivers/net/dsa/mv88e6xxx.c | 45 ++++++++++++++++++++++++++++++++++-----------
 1 file changed, 34 insertions(+), 11 deletions(-)

diff --git a/drivers/net/dsa/mv88e6xxx.c b/drivers/net/dsa/mv88e6xxx.c
index 63736f9..1edefe0 100644
--- a/drivers/net/dsa/mv88e6xxx.c
+++ b/drivers/net/dsa/mv88e6xxx.c
@@ -1259,7 +1259,13 @@ static int _mv88e6xxx_vtu_stu_data_write(struct dsa_switch *ds,
 	return 0;
 }
 
-static int _mv88e6xxx_vtu_getnext(struct dsa_switch *ds, u16 vid,
+static int _mv88e6xxx_vtu_vid_write(struct dsa_switch *ds, u16 vid)
+{
+	return _mv88e6xxx_reg_write(ds, REG_GLOBAL, GLOBAL_VTU_VID,
+				    vid & GLOBAL_VTU_VID_MASK);
+}
+
+static int _mv88e6xxx_vtu_getnext(struct dsa_switch *ds,
 				  struct mv88e6xxx_vtu_stu_entry *entry)
 {
 	struct mv88e6xxx_vtu_stu_entry next = { 0 };
@@ -1269,11 +1275,6 @@ static int _mv88e6xxx_vtu_getnext(struct dsa_switch *ds, u16 vid,
 	if (ret < 0)
 		return ret;
 
-	ret = _mv88e6xxx_reg_write(ds, REG_GLOBAL, GLOBAL_VTU_VID,
-				   vid & GLOBAL_VTU_VID_MASK);
-	if (ret < 0)
-		return ret;
-
 	ret = _mv88e6xxx_vtu_cmd(ds, GLOBAL_VTU_OP_VTU_GET_NEXT);
 	if (ret < 0)
 		return ret;
@@ -1485,7 +1486,12 @@ int mv88e6xxx_port_vlan_add(struct dsa_switch *ds, int port, u16 vid,
 	int err;
 
 	mutex_lock(&ps->smi_mutex);
-	err = _mv88e6xxx_vtu_getnext(ds, vid - 1, &vlan);
+
+	err = _mv88e6xxx_vtu_vid_write(ds, vid - 1);
+	if (err)
+		return err;
+
+	err = _mv88e6xxx_vtu_getnext(ds, &vlan);
 	if (err)
 		goto unlock;
 
@@ -1514,7 +1520,11 @@ int mv88e6xxx_port_vlan_del(struct dsa_switch *ds, int port, u16 vid)
 
 	mutex_lock(&ps->smi_mutex);
 
-	err = _mv88e6xxx_vtu_getnext(ds, vid - 1, &vlan);
+	err = _mv88e6xxx_vtu_vid_write(ds, vid - 1);
+	if (err)
+		return err;
+
+	err = _mv88e6xxx_vtu_getnext(ds, &vlan);
 	if (err)
 		goto unlock;
 
@@ -1558,7 +1568,11 @@ static int _mv88e6xxx_port_vtu_getnext(struct dsa_switch *ds, int port, u16 vid,
 		if (vid == 4095)
 			return -ENOENT;
 
-		err = _mv88e6xxx_vtu_getnext(ds, vid, entry);
+		err = _mv88e6xxx_vtu_vid_write(ds, vid);
+		if (err)
+			return err;
+
+		err = _mv88e6xxx_vtu_getnext(ds, entry);
 		if (err)
 			return err;
 
@@ -1584,7 +1598,12 @@ int mv88e6xxx_vlan_getnext(struct dsa_switch *ds, u16 *vid,
 		return -ENOENT;
 
 	mutex_lock(&ps->smi_mutex);
-	err = _mv88e6xxx_vtu_getnext(ds, *vid, &next);
+	err = _mv88e6xxx_vtu_vid_write(ds, *vid);
+	if (err)
+		goto unlock;
+
+	err = _mv88e6xxx_vtu_getnext(ds, &next);
+unlock:
 	mutex_unlock(&ps->smi_mutex);
 
 	if (err)
@@ -2274,10 +2293,14 @@ static int mv88e6xxx_vtu_show(struct seq_file *s, void *p)
 
 	mutex_lock(&ps->smi_mutex);
 
+	ret = _mv88e6xxx_vtu_vid_write(ds, vid);
+	if (ret < 0)
+		goto unlock;
+
 	do {
 		struct mv88e6xxx_vtu_stu_entry next = { 0 };
 
-		ret = _mv88e6xxx_vtu_getnext(ds, vid, &next);
+		ret = _mv88e6xxx_vtu_getnext(ds, &next);
 		if (ret < 0)
 			goto unlock;
 
-- 
2.6.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [prev] | [next] | [standalone]


#1245884

FromVivien Didelot <vivien.didelot@savoirfairelinux.com>
Date2015-10-13 18:20 +0200
Message-ID<qjasV-3kA-15@gated-at.bofh.it>
In reply to#1245863
On Oct. Tuesday 13 (42) 11:42 AM, Vivien Didelot wrote:
> Not all switch chips provide a Get Next kind of operation to dump FDB entries.
> It is preferred to let the driver handle the dump operation the way it works
> best for the chip. Thus, drop port_fdb_getnext and implement the port_fdb_dump
> operation in DSA, which pushes the switchdev FDB dump callback down to the
> drivers. mv88e6xxx is the only driver affected and is updated accordingly.
> 
> Vivien Didelot (6):
>   net: dsa: mv88e6xxx: write VID outside of VTU Get Next code
>   net: dsa: mv88e6xxx: write MAC outside of ATU Get Next code
>   net: dsa: add port_fdb_dump function
>   net: dsa: mv88e6xxx: implement port_fdb_dump
>   net: dsa: mv88e6xxx: remove port_fdb_getnext
>   net: dsa: remove port_fdb_getnext
> 
>  drivers/net/dsa/mv88e6171.c |   2 +-
>  drivers/net/dsa/mv88e6352.c |   2 +-
>  drivers/net/dsa/mv88e6xxx.c | 140 ++++++++++++++++++++++++--------------------
>  drivers/net/dsa/mv88e6xxx.h |   5 +-
>  include/net/dsa.h           |   8 ++-
>  net/dsa/slave.c             |  26 +-------
>  6 files changed, 90 insertions(+), 93 deletions(-)

I mispaste a few "return err" instead of "goto unlock" which skips a few
mutex_unlock() in mv88e6xxx.c. I'm sending a respin right away, please
ignore this v1.

Sorry,
-v
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web