Commit 209edf95 authored by Vladimir Oltean's avatar Vladimir Oltean Committed by David S. Miller

net: dsa: felix: call port mdb operations from ocelot

This adds the mdb hooks in felix and exports the mdb functions from
ocelot.
Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 471beb11
...@@ -59,6 +59,29 @@ static int felix_fdb_del(struct dsa_switch *ds, int port, ...@@ -59,6 +59,29 @@ static int felix_fdb_del(struct dsa_switch *ds, int port,
return ocelot_fdb_del(ocelot, port, addr, vid); return ocelot_fdb_del(ocelot, port, addr, vid);
} }
/* This callback needs to be present */
static int felix_mdb_prepare(struct dsa_switch *ds, int port,
const struct switchdev_obj_port_mdb *mdb)
{
return 0;
}
static void felix_mdb_add(struct dsa_switch *ds, int port,
const struct switchdev_obj_port_mdb *mdb)
{
struct ocelot *ocelot = ds->priv;
ocelot_port_mdb_add(ocelot, port, mdb);
}
static int felix_mdb_del(struct dsa_switch *ds, int port,
const struct switchdev_obj_port_mdb *mdb)
{
struct ocelot *ocelot = ds->priv;
return ocelot_port_mdb_del(ocelot, port, mdb);
}
static void felix_bridge_stp_state_set(struct dsa_switch *ds, int port, static void felix_bridge_stp_state_set(struct dsa_switch *ds, int port,
u8 state) u8 state)
{ {
...@@ -771,6 +794,9 @@ static const struct dsa_switch_ops felix_switch_ops = { ...@@ -771,6 +794,9 @@ static const struct dsa_switch_ops felix_switch_ops = {
.port_fdb_dump = felix_fdb_dump, .port_fdb_dump = felix_fdb_dump,
.port_fdb_add = felix_fdb_add, .port_fdb_add = felix_fdb_add,
.port_fdb_del = felix_fdb_del, .port_fdb_del = felix_fdb_del,
.port_mdb_prepare = felix_mdb_prepare,
.port_mdb_add = felix_mdb_add,
.port_mdb_del = felix_mdb_del,
.port_bridge_join = felix_bridge_join, .port_bridge_join = felix_bridge_join,
.port_bridge_leave = felix_bridge_leave, .port_bridge_leave = felix_bridge_leave,
.port_stp_state_set = felix_bridge_stp_state_set, .port_stp_state_set = felix_bridge_stp_state_set,
......
...@@ -944,16 +944,12 @@ static struct ocelot_multicast *ocelot_multicast_get(struct ocelot *ocelot, ...@@ -944,16 +944,12 @@ static struct ocelot_multicast *ocelot_multicast_get(struct ocelot *ocelot,
return NULL; return NULL;
} }
int ocelot_port_obj_add_mdb(struct net_device *dev, int ocelot_port_mdb_add(struct ocelot *ocelot, int port,
const struct switchdev_obj_port_mdb *mdb, const struct switchdev_obj_port_mdb *mdb)
struct switchdev_trans *trans)
{ {
struct ocelot_port_private *priv = netdev_priv(dev); struct ocelot_port *ocelot_port = ocelot->ports[port];
struct ocelot_port *ocelot_port = &priv->port;
struct ocelot *ocelot = ocelot_port->ocelot;
unsigned char addr[ETH_ALEN]; unsigned char addr[ETH_ALEN];
struct ocelot_multicast *mc; struct ocelot_multicast *mc;
int port = priv->chip_port;
u16 vid = mdb->vid; u16 vid = mdb->vid;
bool new = false; bool new = false;
...@@ -991,17 +987,14 @@ int ocelot_port_obj_add_mdb(struct net_device *dev, ...@@ -991,17 +987,14 @@ int ocelot_port_obj_add_mdb(struct net_device *dev,
return ocelot_mact_learn(ocelot, 0, addr, vid, ENTRYTYPE_MACv4); return ocelot_mact_learn(ocelot, 0, addr, vid, ENTRYTYPE_MACv4);
} }
EXPORT_SYMBOL(ocelot_port_obj_add_mdb); EXPORT_SYMBOL(ocelot_port_mdb_add);
int ocelot_port_obj_del_mdb(struct net_device *dev, int ocelot_port_mdb_del(struct ocelot *ocelot, int port,
const struct switchdev_obj_port_mdb *mdb) const struct switchdev_obj_port_mdb *mdb)
{ {
struct ocelot_port_private *priv = netdev_priv(dev); struct ocelot_port *ocelot_port = ocelot->ports[port];
struct ocelot_port *ocelot_port = &priv->port;
struct ocelot *ocelot = ocelot_port->ocelot;
unsigned char addr[ETH_ALEN]; unsigned char addr[ETH_ALEN];
struct ocelot_multicast *mc; struct ocelot_multicast *mc;
int port = priv->chip_port;
u16 vid = mdb->vid; u16 vid = mdb->vid;
if (port == ocelot->npi) if (port == ocelot->npi)
...@@ -1032,7 +1025,7 @@ int ocelot_port_obj_del_mdb(struct net_device *dev, ...@@ -1032,7 +1025,7 @@ int ocelot_port_obj_del_mdb(struct net_device *dev,
return ocelot_mact_learn(ocelot, 0, addr, vid, ENTRYTYPE_MACv4); return ocelot_mact_learn(ocelot, 0, addr, vid, ENTRYTYPE_MACv4);
} }
EXPORT_SYMBOL(ocelot_port_obj_del_mdb); EXPORT_SYMBOL(ocelot_port_mdb_del);
int ocelot_port_bridge_join(struct ocelot *ocelot, int port, int ocelot_port_bridge_join(struct ocelot *ocelot, int port,
struct net_device *bridge) struct net_device *bridge)
......
...@@ -97,11 +97,6 @@ int ocelot_port_lag_join(struct ocelot *ocelot, int port, ...@@ -97,11 +97,6 @@ int ocelot_port_lag_join(struct ocelot *ocelot, int port,
struct net_device *bond); struct net_device *bond);
void ocelot_port_lag_leave(struct ocelot *ocelot, int port, void ocelot_port_lag_leave(struct ocelot *ocelot, int port,
struct net_device *bond); struct net_device *bond);
int ocelot_port_obj_del_mdb(struct net_device *dev,
const struct switchdev_obj_port_mdb *mdb);
int ocelot_port_obj_add_mdb(struct net_device *dev,
const struct switchdev_obj_port_mdb *mdb,
struct switchdev_trans *trans);
u32 ocelot_port_readl(struct ocelot_port *port, u32 reg); u32 ocelot_port_readl(struct ocelot_port *port, u32 reg);
void ocelot_port_writel(struct ocelot_port *port, u32 val, u32 reg); void ocelot_port_writel(struct ocelot_port *port, u32 val, u32 reg);
......
...@@ -795,6 +795,32 @@ static int ocelot_port_vlan_del_vlan(struct net_device *dev, ...@@ -795,6 +795,32 @@ static int ocelot_port_vlan_del_vlan(struct net_device *dev,
return 0; return 0;
} }
static int ocelot_port_obj_add_mdb(struct net_device *dev,
const struct switchdev_obj_port_mdb *mdb,
struct switchdev_trans *trans)
{
struct ocelot_port_private *priv = netdev_priv(dev);
struct ocelot_port *ocelot_port = &priv->port;
struct ocelot *ocelot = ocelot_port->ocelot;
int port = priv->chip_port;
if (switchdev_trans_ph_prepare(trans))
return 0;
return ocelot_port_mdb_add(ocelot, port, mdb);
}
static int ocelot_port_obj_del_mdb(struct net_device *dev,
const struct switchdev_obj_port_mdb *mdb)
{
struct ocelot_port_private *priv = netdev_priv(dev);
struct ocelot_port *ocelot_port = &priv->port;
struct ocelot *ocelot = ocelot_port->ocelot;
int port = priv->chip_port;
return ocelot_port_mdb_del(ocelot, port, mdb);
}
static int ocelot_port_obj_add(struct net_device *dev, static int ocelot_port_obj_add(struct net_device *dev,
const struct switchdev_obj *obj, const struct switchdev_obj *obj,
struct switchdev_trans *trans, struct switchdev_trans *trans,
......
...@@ -641,5 +641,9 @@ int ocelot_cls_flower_destroy(struct ocelot *ocelot, int port, ...@@ -641,5 +641,9 @@ int ocelot_cls_flower_destroy(struct ocelot *ocelot, int port,
struct flow_cls_offload *f, bool ingress); struct flow_cls_offload *f, bool ingress);
int ocelot_cls_flower_stats(struct ocelot *ocelot, int port, int ocelot_cls_flower_stats(struct ocelot *ocelot, int port,
struct flow_cls_offload *f, bool ingress); struct flow_cls_offload *f, bool ingress);
int ocelot_port_mdb_add(struct ocelot *ocelot, int port,
const struct switchdev_obj_port_mdb *mdb);
int ocelot_port_mdb_del(struct ocelot *ocelot, int port,
const struct switchdev_obj_port_mdb *mdb);
#endif #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment