aboutsummaryrefslogtreecommitdiffstats
path: root/net/dsa/slave.c
diff options
context:
space:
mode:
authorVivien Didelot <vivien.didelot@savoirfairelinux.com>2015-11-01 12:33:55 -0500
committerDavid S. Miller <davem@davemloft.net>2015-11-01 15:56:11 -0500
commit76e398a6271285c1f361d66445a55cdcee5c1b4b (patch)
treedbda581bc4be2cc8906b3866815de574cb58ad63 /net/dsa/slave.c
parentea3803c193df18d8353d6c8d77034066a08c19f5 (diff)
net: dsa: use switchdev obj for VLAN add/del ops
Simplify DSA by pushing the switchdev objects for VLAN add and delete operations down to its drivers. Currently only mv88e6xxx is affected. Signed-off-by: Vivien Didelot <vivien.didelot@savoirfairelinux.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/dsa/slave.c')
-rw-r--r--net/dsa/slave.c29
1 files changed, 9 insertions, 20 deletions
diff --git a/net/dsa/slave.c b/net/dsa/slave.c
index 481754ee062a..7bc787b095c8 100644
--- a/net/dsa/slave.c
+++ b/net/dsa/slave.c
@@ -247,11 +247,10 @@ static int dsa_slave_port_vlan_add(struct net_device *dev,
247{ 247{
248 struct dsa_slave_priv *p = netdev_priv(dev); 248 struct dsa_slave_priv *p = netdev_priv(dev);
249 struct dsa_switch *ds = p->parent; 249 struct dsa_switch *ds = p->parent;
250 u16 vid;
251 int err; 250 int err;
252 251
253 if (switchdev_trans_ph_prepare(trans)) { 252 if (switchdev_trans_ph_prepare(trans)) {
254 if (!ds->drv->port_vlan_add || !ds->drv->port_pvid_set) 253 if (!ds->drv->port_vlan_prepare || !ds->drv->port_vlan_add)
255 return -EOPNOTSUPP; 254 return -EOPNOTSUPP;
256 255
257 /* If the requested port doesn't belong to the same bridge as 256 /* If the requested port doesn't belong to the same bridge as
@@ -262,16 +261,14 @@ static int dsa_slave_port_vlan_add(struct net_device *dev,
262 vlan->vid_end); 261 vlan->vid_end);
263 if (err) 262 if (err)
264 return err; 263 return err;
264
265 err = ds->drv->port_vlan_prepare(ds, p->port, vlan, trans);
266 if (err)
267 return err;
265 } else { 268 } else {
266 for (vid = vlan->vid_begin; vid <= vlan->vid_end; ++vid) { 269 err = ds->drv->port_vlan_add(ds, p->port, vlan, trans);
267 err = ds->drv->port_vlan_add(ds, p->port, vid, 270 if (err)
268 vlan->flags & 271 return err;
269 BRIDGE_VLAN_INFO_UNTAGGED);
270 if (!err && vlan->flags & BRIDGE_VLAN_INFO_PVID)
271 err = ds->drv->port_pvid_set(ds, p->port, vid);
272 if (err)
273 return err;
274 }
275 } 272 }
276 273
277 return 0; 274 return 0;
@@ -282,19 +279,11 @@ static int dsa_slave_port_vlan_del(struct net_device *dev,
282{ 279{
283 struct dsa_slave_priv *p = netdev_priv(dev); 280 struct dsa_slave_priv *p = netdev_priv(dev);
284 struct dsa_switch *ds = p->parent; 281 struct dsa_switch *ds = p->parent;
285 u16 vid;
286 int err;
287 282
288 if (!ds->drv->port_vlan_del) 283 if (!ds->drv->port_vlan_del)
289 return -EOPNOTSUPP; 284 return -EOPNOTSUPP;
290 285
291 for (vid = vlan->vid_begin; vid <= vlan->vid_end; ++vid) { 286 return ds->drv->port_vlan_del(ds, p->port, vlan);
292 err = ds->drv->port_vlan_del(ds, p->port, vid);
293 if (err)
294 return err;
295 }
296
297 return 0;
298} 287}
299 288
300static int dsa_slave_port_vlan_dump(struct net_device *dev, 289static int dsa_slave_port_vlan_dump(struct net_device *dev,