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 --- |