Skip to content

Commit 8f6a19c

Browse files
vladimirolteanPaolo Abeni
authored andcommitted
net: dsa: introduce dsa_port_get_master()
There is a desire to support for DSA masters in a LAG. That configuration is intended to work by simply enslaving the master to a bonding/team device. But the physical DSA master (the LAG slave) still has a dev->dsa_ptr, and that cpu_dp still corresponds to the physical CPU port. However, we would like to be able to retrieve the LAG that's the upper of the physical DSA master. In preparation for that, introduce a helper called dsa_port_get_master() that replaces all occurrences of the dp->cpu_dp->master pattern. The distinction between LAG and non-LAG will be made later within the helper itself. Signed-off-by: Vladimir Oltean <[email protected]> Reviewed-by: Florian Fainelli <[email protected]> Signed-off-by: Paolo Abeni <[email protected]>
1 parent db01868 commit 8f6a19c

File tree

10 files changed

+38
-34
lines changed

10 files changed

+38
-34
lines changed

drivers/net/dsa/bcm_sf2.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -983,7 +983,7 @@ static int bcm_sf2_sw_resume(struct dsa_switch *ds)
983983
static void bcm_sf2_sw_get_wol(struct dsa_switch *ds, int port,
984984
struct ethtool_wolinfo *wol)
985985
{
986-
struct net_device *p = dsa_to_port(ds, port)->cpu_dp->master;
986+
struct net_device *p = dsa_port_to_master(dsa_to_port(ds, port));
987987
struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds);
988988
struct ethtool_wolinfo pwol = { };
989989

@@ -1007,7 +1007,7 @@ static void bcm_sf2_sw_get_wol(struct dsa_switch *ds, int port,
10071007
static int bcm_sf2_sw_set_wol(struct dsa_switch *ds, int port,
10081008
struct ethtool_wolinfo *wol)
10091009
{
1010-
struct net_device *p = dsa_to_port(ds, port)->cpu_dp->master;
1010+
struct net_device *p = dsa_port_to_master(dsa_to_port(ds, port));
10111011
struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds);
10121012
s8 cpu_port = dsa_to_port(ds, port)->cpu_dp->index;
10131013
struct ethtool_wolinfo pwol = { };

drivers/net/dsa/bcm_sf2_cfp.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1102,7 +1102,7 @@ static int bcm_sf2_cfp_rule_get_all(struct bcm_sf2_priv *priv,
11021102
int bcm_sf2_get_rxnfc(struct dsa_switch *ds, int port,
11031103
struct ethtool_rxnfc *nfc, u32 *rule_locs)
11041104
{
1105-
struct net_device *p = dsa_to_port(ds, port)->cpu_dp->master;
1105+
struct net_device *p = dsa_port_to_master(dsa_to_port(ds, port));
11061106
struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds);
11071107
int ret = 0;
11081108

@@ -1145,7 +1145,7 @@ int bcm_sf2_get_rxnfc(struct dsa_switch *ds, int port,
11451145
int bcm_sf2_set_rxnfc(struct dsa_switch *ds, int port,
11461146
struct ethtool_rxnfc *nfc)
11471147
{
1148-
struct net_device *p = dsa_to_port(ds, port)->cpu_dp->master;
1148+
struct net_device *p = dsa_port_to_master(dsa_to_port(ds, port));
11491149
struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds);
11501150
int ret = 0;
11511151

drivers/net/dsa/lan9303-core.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1092,7 +1092,7 @@ static int lan9303_port_enable(struct dsa_switch *ds, int port,
10921092
if (!dsa_port_is_user(dp))
10931093
return 0;
10941094

1095-
vlan_vid_add(dp->cpu_dp->master, htons(ETH_P_8021Q), port);
1095+
vlan_vid_add(dsa_port_to_master(dp), htons(ETH_P_8021Q), port);
10961096

10971097
return lan9303_enable_processing_port(chip, port);
10981098
}
@@ -1105,7 +1105,7 @@ static void lan9303_port_disable(struct dsa_switch *ds, int port)
11051105
if (!dsa_port_is_user(dp))
11061106
return;
11071107

1108-
vlan_vid_del(dp->cpu_dp->master, htons(ETH_P_8021Q), port);
1108+
vlan_vid_del(dsa_port_to_master(dp), htons(ETH_P_8021Q), port);
11091109

11101110
lan9303_disable_processing_port(chip, port);
11111111
lan9303_phy_write(ds, chip->phy_addr_base + port, MII_BMCR, BMCR_PDOWN);

drivers/net/ethernet/mediatek/mtk_ppe_offload.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ mtk_flow_get_dsa_port(struct net_device **dev)
173173
if (dp->cpu_dp->tag_ops->proto != DSA_TAG_PROTO_MTK)
174174
return -ENODEV;
175175

176-
*dev = dp->cpu_dp->master;
176+
*dev = dsa_port_to_master(dp);
177177

178178
return dp->index;
179179
#else

include/net/dsa.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -718,6 +718,11 @@ static inline bool dsa_port_offloads_lag(struct dsa_port *dp,
718718
return dsa_port_lag_dev_get(dp) == lag->dev;
719719
}
720720

721+
static inline struct net_device *dsa_port_to_master(const struct dsa_port *dp)
722+
{
723+
return dp->cpu_dp->master;
724+
}
725+
721726
static inline
722727
struct net_device *dsa_port_to_bridge_port(const struct dsa_port *dp)
723728
{

net/dsa/dsa2.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1263,11 +1263,11 @@ int dsa_tree_change_tag_proto(struct dsa_switch_tree *dst,
12631263
* attempts to change the tagging protocol. If we ever lift the IFF_UP
12641264
* restriction, there needs to be another mutex which serializes this.
12651265
*/
1266-
list_for_each_entry(dp, &dst->ports, list) {
1267-
if (dsa_port_is_cpu(dp) && (dp->master->flags & IFF_UP))
1266+
dsa_tree_for_each_user_port(dp, dst) {
1267+
if (dsa_port_to_master(dp)->flags & IFF_UP)
12681268
goto out_unlock;
12691269

1270-
if (dsa_port_is_user(dp) && (dp->slave->flags & IFF_UP))
1270+
if (dp->slave->flags & IFF_UP)
12711271
goto out_unlock;
12721272
}
12731273

@@ -1797,7 +1797,7 @@ void dsa_switch_shutdown(struct dsa_switch *ds)
17971797
rtnl_lock();
17981798

17991799
dsa_switch_for_each_user_port(dp, ds) {
1800-
master = dp->cpu_dp->master;
1800+
master = dsa_port_to_master(dp);
18011801
slave_dev = dp->slave;
18021802

18031803
netdev_upper_dev_unlink(master, slave_dev);

net/dsa/dsa_priv.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -322,7 +322,7 @@ dsa_slave_to_master(const struct net_device *dev)
322322
{
323323
struct dsa_port *dp = dsa_slave_to_port(dev);
324324

325-
return dp->cpu_dp->master;
325+
return dsa_port_to_master(dp);
326326
}
327327

328328
/* If under a bridge with vlan_filtering=0, make sure to send pvid-tagged

net/dsa/port.c

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1026,7 +1026,7 @@ int dsa_port_standalone_host_fdb_add(struct dsa_port *dp,
10261026
int dsa_port_bridge_host_fdb_add(struct dsa_port *dp,
10271027
const unsigned char *addr, u16 vid)
10281028
{
1029-
struct dsa_port *cpu_dp = dp->cpu_dp;
1029+
struct net_device *master = dsa_port_to_master(dp);
10301030
struct dsa_db db = {
10311031
.type = DSA_DB_BRIDGE,
10321032
.bridge = *dp->bridge,
@@ -1037,8 +1037,8 @@ int dsa_port_bridge_host_fdb_add(struct dsa_port *dp,
10371037
* requires rtnl_lock(), since we can't guarantee that is held here,
10381038
* and we can't take it either.
10391039
*/
1040-
if (cpu_dp->master->priv_flags & IFF_UNICAST_FLT) {
1041-
err = dev_uc_add(cpu_dp->master, addr);
1040+
if (master->priv_flags & IFF_UNICAST_FLT) {
1041+
err = dev_uc_add(master, addr);
10421042
if (err)
10431043
return err;
10441044
}
@@ -1077,15 +1077,15 @@ int dsa_port_standalone_host_fdb_del(struct dsa_port *dp,
10771077
int dsa_port_bridge_host_fdb_del(struct dsa_port *dp,
10781078
const unsigned char *addr, u16 vid)
10791079
{
1080-
struct dsa_port *cpu_dp = dp->cpu_dp;
1080+
struct net_device *master = dsa_port_to_master(dp);
10811081
struct dsa_db db = {
10821082
.type = DSA_DB_BRIDGE,
10831083
.bridge = *dp->bridge,
10841084
};
10851085
int err;
10861086

1087-
if (cpu_dp->master->priv_flags & IFF_UNICAST_FLT) {
1088-
err = dev_uc_del(cpu_dp->master, addr);
1087+
if (master->priv_flags & IFF_UNICAST_FLT) {
1088+
err = dev_uc_del(master, addr);
10891089
if (err)
10901090
return err;
10911091
}
@@ -1208,14 +1208,14 @@ int dsa_port_standalone_host_mdb_add(const struct dsa_port *dp,
12081208
int dsa_port_bridge_host_mdb_add(const struct dsa_port *dp,
12091209
const struct switchdev_obj_port_mdb *mdb)
12101210
{
1211-
struct dsa_port *cpu_dp = dp->cpu_dp;
1211+
struct net_device *master = dsa_port_to_master(dp);
12121212
struct dsa_db db = {
12131213
.type = DSA_DB_BRIDGE,
12141214
.bridge = *dp->bridge,
12151215
};
12161216
int err;
12171217

1218-
err = dev_mc_add(cpu_dp->master, mdb->addr);
1218+
err = dev_mc_add(master, mdb->addr);
12191219
if (err)
12201220
return err;
12211221

@@ -1252,14 +1252,14 @@ int dsa_port_standalone_host_mdb_del(const struct dsa_port *dp,
12521252
int dsa_port_bridge_host_mdb_del(const struct dsa_port *dp,
12531253
const struct switchdev_obj_port_mdb *mdb)
12541254
{
1255-
struct dsa_port *cpu_dp = dp->cpu_dp;
1255+
struct net_device *master = dsa_port_to_master(dp);
12561256
struct dsa_db db = {
12571257
.type = DSA_DB_BRIDGE,
12581258
.bridge = *dp->bridge,
12591259
};
12601260
int err;
12611261

1262-
err = dev_mc_del(cpu_dp->master, mdb->addr);
1262+
err = dev_mc_del(master, mdb->addr);
12631263
if (err)
12641264
return err;
12651265

@@ -1294,38 +1294,38 @@ int dsa_port_host_vlan_add(struct dsa_port *dp,
12941294
const struct switchdev_obj_port_vlan *vlan,
12951295
struct netlink_ext_ack *extack)
12961296
{
1297+
struct net_device *master = dsa_port_to_master(dp);
12971298
struct dsa_notifier_vlan_info info = {
12981299
.dp = dp,
12991300
.vlan = vlan,
13001301
.extack = extack,
13011302
};
1302-
struct dsa_port *cpu_dp = dp->cpu_dp;
13031303
int err;
13041304

13051305
err = dsa_port_notify(dp, DSA_NOTIFIER_HOST_VLAN_ADD, &info);
13061306
if (err && err != -EOPNOTSUPP)
13071307
return err;
13081308

1309-
vlan_vid_add(cpu_dp->master, htons(ETH_P_8021Q), vlan->vid);
1309+
vlan_vid_add(master, htons(ETH_P_8021Q), vlan->vid);
13101310

13111311
return err;
13121312
}
13131313

13141314
int dsa_port_host_vlan_del(struct dsa_port *dp,
13151315
const struct switchdev_obj_port_vlan *vlan)
13161316
{
1317+
struct net_device *master = dsa_port_to_master(dp);
13171318
struct dsa_notifier_vlan_info info = {
13181319
.dp = dp,
13191320
.vlan = vlan,
13201321
};
1321-
struct dsa_port *cpu_dp = dp->cpu_dp;
13221322
int err;
13231323

13241324
err = dsa_port_notify(dp, DSA_NOTIFIER_HOST_VLAN_DEL, &info);
13251325
if (err && err != -EOPNOTSUPP)
13261326
return err;
13271327

1328-
vlan_vid_del(cpu_dp->master, htons(ETH_P_8021Q), vlan->vid);
1328+
vlan_vid_del(master, htons(ETH_P_8021Q), vlan->vid);
13291329

13301330
return err;
13311331
}

net/dsa/slave.c

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1503,8 +1503,7 @@ static int dsa_slave_setup_tc_block(struct net_device *dev,
15031503
static int dsa_slave_setup_ft_block(struct dsa_switch *ds, int port,
15041504
void *type_data)
15051505
{
1506-
struct dsa_port *cpu_dp = dsa_to_port(ds, port)->cpu_dp;
1507-
struct net_device *master = cpu_dp->master;
1506+
struct net_device *master = dsa_port_to_master(dsa_to_port(ds, port));
15081507

15091508
if (!master->netdev_ops->ndo_setup_tc)
15101509
return -EOPNOTSUPP;
@@ -2147,13 +2146,14 @@ static int dsa_slave_fill_forward_path(struct net_device_path_ctx *ctx,
21472146
struct net_device_path *path)
21482147
{
21492148
struct dsa_port *dp = dsa_slave_to_port(ctx->dev);
2149+
struct net_device *master = dsa_port_to_master(dp);
21502150
struct dsa_port *cpu_dp = dp->cpu_dp;
21512151

21522152
path->dev = ctx->dev;
21532153
path->type = DEV_PATH_DSA;
21542154
path->dsa.proto = cpu_dp->tag_ops->proto;
21552155
path->dsa.port = dp->index;
2156-
ctx->dev = cpu_dp->master;
2156+
ctx->dev = master;
21572157

21582158
return 0;
21592159
}
@@ -2271,9 +2271,9 @@ static int dsa_slave_phy_setup(struct net_device *slave_dev)
22712271
void dsa_slave_setup_tagger(struct net_device *slave)
22722272
{
22732273
struct dsa_port *dp = dsa_slave_to_port(slave);
2274+
struct net_device *master = dsa_port_to_master(dp);
22742275
struct dsa_slave_priv *p = netdev_priv(slave);
22752276
const struct dsa_port *cpu_dp = dp->cpu_dp;
2276-
struct net_device *master = cpu_dp->master;
22772277
const struct dsa_switch *ds = dp->ds;
22782278

22792279
slave->needed_headroom = cpu_dp->tag_ops->needed_headroom;
@@ -2330,8 +2330,7 @@ int dsa_slave_resume(struct net_device *slave_dev)
23302330

23312331
int dsa_slave_create(struct dsa_port *port)
23322332
{
2333-
const struct dsa_port *cpu_dp = port->cpu_dp;
2334-
struct net_device *master = cpu_dp->master;
2333+
struct net_device *master = dsa_port_to_master(port);
23352334
struct dsa_switch *ds = port->ds;
23362335
const char *name = port->name;
23372336
struct net_device *slave_dev;

net/dsa/tag_8021q.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -330,7 +330,7 @@ static int dsa_tag_8021q_port_setup(struct dsa_switch *ds, int port)
330330
if (!dsa_port_is_user(dp))
331331
return 0;
332332

333-
master = dp->cpu_dp->master;
333+
master = dsa_port_to_master(dp);
334334

335335
err = dsa_port_tag_8021q_vlan_add(dp, vid, false);
336336
if (err) {
@@ -359,7 +359,7 @@ static void dsa_tag_8021q_port_teardown(struct dsa_switch *ds, int port)
359359
if (!dsa_port_is_user(dp))
360360
return;
361361

362-
master = dp->cpu_dp->master;
362+
master = dsa_port_to_master(dp);
363363

364364
dsa_port_tag_8021q_vlan_del(dp, vid, false);
365365

0 commit comments

Comments
 (0)