diff options
author | Vivien Didelot <vivien.didelot@savoirfairelinux.com> | 2015-11-01 12:33:55 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-11-01 15:56:11 -0500 |
commit | 76e398a6271285c1f361d66445a55cdcee5c1b4b (patch) | |
tree | dbda581bc4be2cc8906b3866815de574cb58ad63 /net/dsa/slave.c | |
parent | ea3803c193df18d8353d6c8d77034066a08c19f5 (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.c | 29 |
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 | ||
300 | static int dsa_slave_port_vlan_dump(struct net_device *dev, | 289 | static int dsa_slave_port_vlan_dump(struct net_device *dev, |