slave.c (b7a9e0da2d1c954b7c38217a29e002528b90d174) slave.c (ffb68fc58e9640762be891f9aebe4f5aac615ab3)
1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * net/dsa/slave.c - Slave device handling
4 * Copyright (c) 2008-2009 Marvell Semiconductor
5 */
6
7#include <linux/list.h>
8#include <linux/etherdevice.h>

--- 312 unchanged lines hidden (view full) ---

321 if (vid == vlan->vid)
322 return -EBUSY;
323 }
324
325 return 0;
326}
327
328static int dsa_slave_vlan_add(struct net_device *dev,
1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * net/dsa/slave.c - Slave device handling
4 * Copyright (c) 2008-2009 Marvell Semiconductor
5 */
6
7#include <linux/list.h>
8#include <linux/etherdevice.h>

--- 312 unchanged lines hidden (view full) ---

321 if (vid == vlan->vid)
322 return -EBUSY;
323 }
324
325 return 0;
326}
327
328static int dsa_slave_vlan_add(struct net_device *dev,
329 const struct switchdev_obj *obj,
330 struct switchdev_trans *trans)
329 const struct switchdev_obj *obj)
331{
332 struct net_device *master = dsa_slave_to_master(dev);
333 struct dsa_port *dp = dsa_slave_to_port(dev);
334 struct switchdev_obj_port_vlan vlan;
335 int err;
336
337 if (obj->orig_dev != dev)
338 return -EOPNOTSUPP;
339
340 if (dsa_port_skip_vlan_configuration(dp))
341 return 0;
342
343 vlan = *SWITCHDEV_OBJ_PORT_VLAN(obj);
344
345 /* Deny adding a bridge VLAN when there is already an 802.1Q upper with
346 * the same VID.
347 */
330{
331 struct net_device *master = dsa_slave_to_master(dev);
332 struct dsa_port *dp = dsa_slave_to_port(dev);
333 struct switchdev_obj_port_vlan vlan;
334 int err;
335
336 if (obj->orig_dev != dev)
337 return -EOPNOTSUPP;
338
339 if (dsa_port_skip_vlan_configuration(dp))
340 return 0;
341
342 vlan = *SWITCHDEV_OBJ_PORT_VLAN(obj);
343
344 /* Deny adding a bridge VLAN when there is already an 802.1Q upper with
345 * the same VID.
346 */
348 if (trans->ph_prepare && br_vlan_enabled(dp->bridge_dev)) {
347 if (br_vlan_enabled(dp->bridge_dev)) {
349 rcu_read_lock();
350 err = dsa_slave_vlan_check_for_8021q_uppers(dev, &vlan);
351 rcu_read_unlock();
352 if (err)
353 return err;
354 }
355
348 rcu_read_lock();
349 err = dsa_slave_vlan_check_for_8021q_uppers(dev, &vlan);
350 rcu_read_unlock();
351 if (err)
352 return err;
353 }
354
356 err = dsa_port_vlan_add(dp, &vlan, trans);
355 err = dsa_port_vlan_add(dp, &vlan);
357 if (err)
358 return err;
359
360 /* We need the dedicated CPU port to be a member of the VLAN as well.
361 * Even though drivers often handle CPU membership in special ways,
362 * it doesn't make sense to program a PVID, so clear this flag.
363 */
364 vlan.flags &= ~BRIDGE_VLAN_INFO_PVID;
365
356 if (err)
357 return err;
358
359 /* We need the dedicated CPU port to be a member of the VLAN as well.
360 * Even though drivers often handle CPU membership in special ways,
361 * it doesn't make sense to program a PVID, so clear this flag.
362 */
363 vlan.flags &= ~BRIDGE_VLAN_INFO_PVID;
364
366 err = dsa_port_vlan_add(dp->cpu_dp, &vlan, trans);
365 err = dsa_port_vlan_add(dp->cpu_dp, &vlan);
367 if (err)
368 return err;
369
370 return vlan_vid_add(master, htons(ETH_P_8021Q), vlan.vid);
371}
372
373static int dsa_slave_port_obj_add(struct net_device *dev,
374 const struct switchdev_obj *obj,
366 if (err)
367 return err;
368
369 return vlan_vid_add(master, htons(ETH_P_8021Q), vlan.vid);
370}
371
372static int dsa_slave_port_obj_add(struct net_device *dev,
373 const struct switchdev_obj *obj,
375 struct switchdev_trans *trans,
376 struct netlink_ext_ack *extack)
377{
378 struct dsa_port *dp = dsa_slave_to_port(dev);
379 int err;
380
381 /* For the prepare phase, ensure the full set of changes is feasable in
382 * one go in order to signal a failure properly. If an operation is not
383 * supported, return -EOPNOTSUPP.
384 */
385
386 switch (obj->id) {
387 case SWITCHDEV_OBJ_ID_PORT_MDB:
388 if (obj->orig_dev != dev)
389 return -EOPNOTSUPP;
374 struct netlink_ext_ack *extack)
375{
376 struct dsa_port *dp = dsa_slave_to_port(dev);
377 int err;
378
379 /* For the prepare phase, ensure the full set of changes is feasable in
380 * one go in order to signal a failure properly. If an operation is not
381 * supported, return -EOPNOTSUPP.
382 */
383
384 switch (obj->id) {
385 case SWITCHDEV_OBJ_ID_PORT_MDB:
386 if (obj->orig_dev != dev)
387 return -EOPNOTSUPP;
390 err = dsa_port_mdb_add(dp, SWITCHDEV_OBJ_PORT_MDB(obj), trans);
388 err = dsa_port_mdb_add(dp, SWITCHDEV_OBJ_PORT_MDB(obj));
391 break;
392 case SWITCHDEV_OBJ_ID_HOST_MDB:
393 /* DSA can directly translate this to a normal MDB add,
394 * but on the CPU port.
395 */
389 break;
390 case SWITCHDEV_OBJ_ID_HOST_MDB:
391 /* DSA can directly translate this to a normal MDB add,
392 * but on the CPU port.
393 */
396 err = dsa_port_mdb_add(dp->cpu_dp, SWITCHDEV_OBJ_PORT_MDB(obj),
397 trans);
394 err = dsa_port_mdb_add(dp->cpu_dp, SWITCHDEV_OBJ_PORT_MDB(obj));
398 break;
399 case SWITCHDEV_OBJ_ID_PORT_VLAN:
395 break;
396 case SWITCHDEV_OBJ_ID_PORT_VLAN:
400 err = dsa_slave_vlan_add(dev, obj, trans);
397 err = dsa_slave_vlan_add(dev, obj);
401 break;
402 default:
403 err = -EOPNOTSUPP;
404 break;
405 }
406
407 return err;
408}

--- 872 unchanged lines hidden (view full) ---

1281 struct net_device *master = dsa_slave_to_master(dev);
1282 struct dsa_port *dp = dsa_slave_to_port(dev);
1283 struct switchdev_obj_port_vlan vlan = {
1284 .obj.id = SWITCHDEV_OBJ_ID_PORT_VLAN,
1285 .vid = vid,
1286 /* This API only allows programming tagged, non-PVID VIDs */
1287 .flags = 0,
1288 };
398 break;
399 default:
400 err = -EOPNOTSUPP;
401 break;
402 }
403
404 return err;
405}

--- 872 unchanged lines hidden (view full) ---

1278 struct net_device *master = dsa_slave_to_master(dev);
1279 struct dsa_port *dp = dsa_slave_to_port(dev);
1280 struct switchdev_obj_port_vlan vlan = {
1281 .obj.id = SWITCHDEV_OBJ_ID_PORT_VLAN,
1282 .vid = vid,
1283 /* This API only allows programming tagged, non-PVID VIDs */
1284 .flags = 0,
1285 };
1289 struct switchdev_trans trans;
1290 int ret;
1291
1292 /* User port... */
1286 int ret;
1287
1288 /* User port... */
1293 trans.ph_prepare = true;
1294 ret = dsa_port_vlan_add(dp, &vlan, &trans);
1289 ret = dsa_port_vlan_add(dp, &vlan);
1295 if (ret)
1296 return ret;
1297
1290 if (ret)
1291 return ret;
1292
1298 trans.ph_prepare = false;
1299 ret = dsa_port_vlan_add(dp, &vlan, &trans);
1300 if (ret)
1301 return ret;
1302
1303 /* And CPU port... */
1293 /* And CPU port... */
1304 trans.ph_prepare = true;
1305 ret = dsa_port_vlan_add(dp->cpu_dp, &vlan, &trans);
1294 ret = dsa_port_vlan_add(dp->cpu_dp, &vlan);
1306 if (ret)
1307 return ret;
1308
1295 if (ret)
1296 return ret;
1297
1309 trans.ph_prepare = false;
1310 ret = dsa_port_vlan_add(dp->cpu_dp, &vlan, &trans);
1311 if (ret)
1312 return ret;
1313
1314 return vlan_vid_add(master, proto, vid);
1315}
1316
1317static int dsa_slave_vlan_rx_kill_vid(struct net_device *dev, __be16 proto,
1318 u16 vid)
1319{
1320 struct net_device *master = dsa_slave_to_master(dev);
1321 struct dsa_port *dp = dsa_slave_to_port(dev);

--- 950 unchanged lines hidden ---
1298 return vlan_vid_add(master, proto, vid);
1299}
1300
1301static int dsa_slave_vlan_rx_kill_vid(struct net_device *dev, __be16 proto,
1302 u16 vid)
1303{
1304 struct net_device *master = dsa_slave_to_master(dev);
1305 struct dsa_port *dp = dsa_slave_to_port(dev);

--- 950 unchanged lines hidden ---