* [PATCH net-next 1/6] net: dsa: mv88e6xxx: write VID outside of VTU Get Next code
2015-10-13 15:42 [PATCH net-next 0/6] net: dsa: implement port_fdb_dump in drivers Vivien Didelot
@ 2015-10-13 15:42 ` Vivien Didelot
2015-10-13 15:42 ` [PATCH net-next 2/6] net: dsa: mv88e6xxx: write MAC outside of ATU " Vivien Didelot
` (5 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Vivien Didelot @ 2015-10-13 15:42 UTC (permalink / raw)
To: netdev
Cc: linux-kernel, kernel, David S. Miller, Scott Feldman, Jiri Pirko,
Florian Fainelli, Andrew Lunn, Vivien Didelot
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
^ permalink raw reply [flat|nested] 8+ messages in thread* [PATCH net-next 2/6] net: dsa: mv88e6xxx: write MAC outside of ATU Get Next code
2015-10-13 15:42 [PATCH net-next 0/6] net: dsa: implement port_fdb_dump in drivers Vivien Didelot
2015-10-13 15:42 ` [PATCH net-next 1/6] net: dsa: mv88e6xxx: write VID outside of VTU Get Next code Vivien Didelot
@ 2015-10-13 15:42 ` Vivien Didelot
2015-10-13 15:43 ` [PATCH net-next 3/6] net: dsa: add port_fdb_dump function Vivien Didelot
` (4 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Vivien Didelot @ 2015-10-13 15:42 UTC (permalink / raw)
To: netdev
Cc: linux-kernel, kernel, David S. Miller, Scott Feldman, Jiri Pirko,
Florian Fainelli, Andrew Lunn, Vivien Didelot
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
^ permalink raw reply [flat|nested] 8+ messages in thread* [PATCH net-next 3/6] net: dsa: add port_fdb_dump function
2015-10-13 15:42 [PATCH net-next 0/6] net: dsa: implement port_fdb_dump in drivers Vivien Didelot
2015-10-13 15:42 ` [PATCH net-next 1/6] net: dsa: mv88e6xxx: write VID outside of VTU Get Next code Vivien Didelot
2015-10-13 15:42 ` [PATCH net-next 2/6] net: dsa: mv88e6xxx: write MAC outside of ATU " Vivien Didelot
@ 2015-10-13 15:43 ` Vivien Didelot
2015-10-13 15:43 ` [PATCH net-next 4/6] net: dsa: mv88e6xxx: implement port_fdb_dump Vivien Didelot
` (3 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Vivien Didelot @ 2015-10-13 15:43 UTC (permalink / raw)
To: netdev
Cc: linux-kernel, kernel, David S. Miller, Scott Feldman, Jiri Pirko,
Florian Fainelli, Andrew Lunn, Vivien Didelot
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
^ permalink raw reply [flat|nested] 8+ messages in thread* [PATCH net-next 4/6] net: dsa: mv88e6xxx: implement port_fdb_dump
2015-10-13 15:42 [PATCH net-next 0/6] net: dsa: implement port_fdb_dump in drivers Vivien Didelot
` (2 preceding siblings ...)
2015-10-13 15:43 ` [PATCH net-next 3/6] net: dsa: add port_fdb_dump function Vivien Didelot
@ 2015-10-13 15:43 ` Vivien Didelot
2015-10-13 15:43 ` [PATCH net-next 5/6] net: dsa: mv88e6xxx: remove port_fdb_getnext Vivien Didelot
` (2 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Vivien Didelot @ 2015-10-13 15:43 UTC (permalink / raw)
To: netdev
Cc: linux-kernel, kernel, David S. Miller, Scott Feldman, Jiri Pirko,
Florian Fainelli, Andrew Lunn, Vivien Didelot
Implement the port_fdb_dump DSA operation.
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 | 65 +++++++++++++++++++++++++++++++++++++++++++++
drivers/net/dsa/mv88e6xxx.h | 3 +++
4 files changed, 70 insertions(+)
diff --git a/drivers/net/dsa/mv88e6171.c b/drivers/net/dsa/mv88e6171.c
index dfca352..489deb8 100644
--- a/drivers/net/dsa/mv88e6171.c
+++ b/drivers/net/dsa/mv88e6171.c
@@ -123,6 +123,7 @@ struct dsa_switch_driver mv88e6171_switch_driver = {
.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,
};
MODULE_ALIAS("platform:mv88e6171");
diff --git a/drivers/net/dsa/mv88e6352.c b/drivers/net/dsa/mv88e6352.c
index 796fdcb..6b8fd24 100644
--- a/drivers/net/dsa/mv88e6352.c
+++ b/drivers/net/dsa/mv88e6352.c
@@ -350,6 +350,7 @@ struct dsa_switch_driver mv88e6352_switch_driver = {
.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,
};
MODULE_ALIAS("platform:mv88e6172");
diff --git a/drivers/net/dsa/mv88e6xxx.c b/drivers/net/dsa/mv88e6xxx.c
index b4e97c1..41e630a 100644
--- a/drivers/net/dsa/mv88e6xxx.c
+++ b/drivers/net/dsa/mv88e6xxx.c
@@ -1799,6 +1799,71 @@ static int _mv88e6xxx_atu_getnext(struct dsa_switch *ds, u16 fid,
return 0;
}
+int mv88e6xxx_port_fdb_dump(struct dsa_switch *ds, int port,
+ struct switchdev_obj_port_fdb *fdb,
+ switchdev_obj_dump_cb_t *cb)
+{
+ struct mv88e6xxx_priv_state *ps = ds_to_priv(ds);
+ struct mv88e6xxx_vtu_stu_entry vlan = {
+ .vid = GLOBAL_VTU_VID_MASK, /* all ones */
+ };
+ int err;
+
+ mutex_lock(&ps->smi_mutex);
+
+ err = _mv88e6xxx_vtu_vid_write(ds, vlan.vid);
+ if (err)
+ goto unlock;
+
+ do {
+ struct mv88e6xxx_atu_entry addr = {
+ .mac = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
+ };
+
+ err = _mv88e6xxx_vtu_getnext(ds, &vlan);
+ if (err)
+ break;
+
+ if (!vlan.valid)
+ break;
+
+ err = _mv88e6xxx_atu_mac_write(ds, addr.mac);
+ if (err)
+ return err;
+
+ do {
+ err = _mv88e6xxx_atu_getnext(ds, vlan.fid, &addr);
+ if (err)
+ break;
+
+ if (addr.state == GLOBAL_ATU_DATA_STATE_UNUSED)
+ break;
+
+ if (!addr.trunk && addr.portv_trunkid & BIT(port)) {
+ bool is_static = addr.state ==
+ (is_multicast_ether_addr(addr.mac) ?
+ GLOBAL_ATU_DATA_STATE_MC_STATIC :
+ GLOBAL_ATU_DATA_STATE_UC_STATIC);
+
+ fdb->vid = vlan.vid;
+ fdb->addr = addr.mac;
+ fdb->ndm_state = is_static ? NUD_NOARP :
+ NUD_REACHABLE;
+
+ err = cb(&fdb->obj);
+ if (err)
+ goto unlock;
+ }
+ } while (!is_broadcast_ether_addr(addr.mac));
+
+ } while (vlan.vid < GLOBAL_VTU_VID_MASK);
+
+unlock:
+ mutex_unlock(&ps->smi_mutex);
+
+ 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)
diff --git a/drivers/net/dsa/mv88e6xxx.h b/drivers/net/dsa/mv88e6xxx.h
index ba94f17..08e0fbb 100644
--- a/drivers/net/dsa/mv88e6xxx.h
+++ b/drivers/net/dsa/mv88e6xxx.h
@@ -481,6 +481,9 @@ 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);
int mv88e6xxx_phy_page_read(struct dsa_switch *ds, int port, int page, int reg);
int mv88e6xxx_phy_page_write(struct dsa_switch *ds, int port, int page,
int reg, int val);
--
2.6.1
^ permalink raw reply [flat|nested] 8+ messages in thread* [PATCH net-next 5/6] net: dsa: mv88e6xxx: remove port_fdb_getnext
2015-10-13 15:42 [PATCH net-next 0/6] net: dsa: implement port_fdb_dump in drivers Vivien Didelot
` (3 preceding siblings ...)
2015-10-13 15:43 ` [PATCH net-next 4/6] net: dsa: mv88e6xxx: implement port_fdb_dump Vivien Didelot
@ 2015-10-13 15:43 ` Vivien Didelot
2015-10-13 15:43 ` [PATCH net-next 6/6] net: dsa: " Vivien Didelot
2015-10-13 16:18 ` [PATCH net-next 0/6] net: dsa: implement port_fdb_dump in drivers Vivien Didelot
6 siblings, 0 replies; 8+ messages in thread
From: Vivien Didelot @ 2015-10-13 15:43 UTC (permalink / raw)
To: netdev
Cc: linux-kernel, kernel, David S. Miller, Scott Feldman, Jiri Pirko,
Florian Fainelli, Andrew Lunn, Vivien Didelot
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
^ permalink raw reply [flat|nested] 8+ messages in thread* [PATCH net-next 6/6] net: dsa: remove port_fdb_getnext
2015-10-13 15:42 [PATCH net-next 0/6] net: dsa: implement port_fdb_dump in drivers Vivien Didelot
` (4 preceding siblings ...)
2015-10-13 15:43 ` [PATCH net-next 5/6] net: dsa: mv88e6xxx: remove port_fdb_getnext Vivien Didelot
@ 2015-10-13 15:43 ` Vivien Didelot
2015-10-13 16:18 ` [PATCH net-next 0/6] net: dsa: implement port_fdb_dump in drivers Vivien Didelot
6 siblings, 0 replies; 8+ messages in thread
From: Vivien Didelot @ 2015-10-13 15:43 UTC (permalink / raw)
To: netdev
Cc: linux-kernel, kernel, David S. Miller, Scott Feldman, Jiri Pirko,
Florian Fainelli, Andrew Lunn, Vivien Didelot
No driver implements port_fdb_getnext anymore, and port_fdb_dump is
preferred anyway, so remove this function from DSA.
Signed-off-by: Vivien Didelot <vivien.didelot@savoirfairelinux.com>
---
include/net/dsa.h | 3 ---
net/dsa/slave.c | 25 +------------------------
2 files changed, 1 insertion(+), 27 deletions(-)
diff --git a/include/net/dsa.h b/include/net/dsa.h
index c5c48c5..d8ab2f9 100644
--- a/include/net/dsa.h
+++ b/include/net/dsa.h
@@ -329,9 +329,6 @@ struct dsa_switch_driver {
struct switchdev_trans *trans);
int (*port_fdb_del)(struct dsa_switch *ds, int port,
const struct switchdev_obj_port_fdb *fdb);
- 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);
diff --git a/net/dsa/slave.c b/net/dsa/slave.c
index a4e3416..5908893 100644
--- a/net/dsa/slave.c
+++ b/net/dsa/slave.c
@@ -378,34 +378,11 @@ static int dsa_slave_port_fdb_dump(struct net_device *dev,
{
struct dsa_slave_priv *p = netdev_priv(dev);
struct dsa_switch *ds = p->parent;
- unsigned char addr[ETH_ALEN] = { 0 };
- 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;
-
- for (;;) {
- bool is_static;
-
- ret = ds->drv->port_fdb_getnext(ds, p->port, addr, &vid,
- &is_static);
- if (ret < 0)
- break;
-
- fdb->addr = addr;
- fdb->vid = vid;
- fdb->ndm_state = is_static ? NUD_NOARP : NUD_REACHABLE;
-
- ret = cb(&fdb->obj);
- if (ret < 0)
- break;
- }
-
- return ret == -ENOENT ? 0 : ret;
+ return -EOPNOTSUPP;
}
static int dsa_slave_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
--
2.6.1
^ permalink raw reply [flat|nested] 8+ messages in thread* Re: [PATCH net-next 0/6] net: dsa: implement port_fdb_dump in drivers
2015-10-13 15:42 [PATCH net-next 0/6] net: dsa: implement port_fdb_dump in drivers Vivien Didelot
` (5 preceding siblings ...)
2015-10-13 15:43 ` [PATCH net-next 6/6] net: dsa: " Vivien Didelot
@ 2015-10-13 16:18 ` Vivien Didelot
6 siblings, 0 replies; 8+ messages in thread
From: Vivien Didelot @ 2015-10-13 16:18 UTC (permalink / raw)
To: netdev
Cc: linux-kernel, kernel, David S. Miller, Scott Feldman, Jiri Pirko,
Florian Fainelli, Andrew Lunn
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
^ permalink raw reply [flat|nested] 8+ messages in thread