1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Handling of a conduit device, switching frames via its switch fabric CPU port
5 * Copyright (c) 2017 Savoir-faire Linux Inc.
6 * Vivien Didelot <vivien.didelot@savoirfairelinux.com>
9 #include <linux/ethtool.h>
10 #include <linux/netdevice.h>
11 #include <linux/netlink.h>
19 static int dsa_conduit_get_regs_len(struct net_device
*dev
)
21 struct dsa_port
*cpu_dp
= dev
->dsa_ptr
;
22 const struct ethtool_ops
*ops
= cpu_dp
->orig_ethtool_ops
;
23 struct dsa_switch
*ds
= cpu_dp
->ds
;
24 int port
= cpu_dp
->index
;
28 if (ops
->get_regs_len
) {
29 len
= ops
->get_regs_len(dev
);
35 ret
+= sizeof(struct ethtool_drvinfo
);
36 ret
+= sizeof(struct ethtool_regs
);
38 if (ds
->ops
->get_regs_len
) {
39 len
= ds
->ops
->get_regs_len(ds
, port
);
48 static void dsa_conduit_get_regs(struct net_device
*dev
,
49 struct ethtool_regs
*regs
, void *data
)
51 struct dsa_port
*cpu_dp
= dev
->dsa_ptr
;
52 const struct ethtool_ops
*ops
= cpu_dp
->orig_ethtool_ops
;
53 struct dsa_switch
*ds
= cpu_dp
->ds
;
54 struct ethtool_drvinfo
*cpu_info
;
55 struct ethtool_regs
*cpu_regs
;
56 int port
= cpu_dp
->index
;
59 if (ops
->get_regs_len
&& ops
->get_regs
) {
60 len
= ops
->get_regs_len(dev
);
64 ops
->get_regs(dev
, regs
, data
);
68 cpu_info
= (struct ethtool_drvinfo
*)data
;
69 strscpy(cpu_info
->driver
, "dsa", sizeof(cpu_info
->driver
));
70 data
+= sizeof(*cpu_info
);
71 cpu_regs
= (struct ethtool_regs
*)data
;
72 data
+= sizeof(*cpu_regs
);
74 if (ds
->ops
->get_regs_len
&& ds
->ops
->get_regs
) {
75 len
= ds
->ops
->get_regs_len(ds
, port
);
79 ds
->ops
->get_regs(ds
, port
, cpu_regs
, data
);
83 static void dsa_conduit_get_ethtool_stats(struct net_device
*dev
,
84 struct ethtool_stats
*stats
,
87 struct dsa_port
*cpu_dp
= dev
->dsa_ptr
;
88 const struct ethtool_ops
*ops
= cpu_dp
->orig_ethtool_ops
;
89 struct dsa_switch
*ds
= cpu_dp
->ds
;
90 int port
= cpu_dp
->index
;
93 if (ops
->get_sset_count
&& ops
->get_ethtool_stats
) {
94 count
= ops
->get_sset_count(dev
, ETH_SS_STATS
);
95 ops
->get_ethtool_stats(dev
, stats
, data
);
98 if (ds
->ops
->get_ethtool_stats
)
99 ds
->ops
->get_ethtool_stats(ds
, port
, data
+ count
);
102 static void dsa_conduit_get_ethtool_phy_stats(struct net_device
*dev
,
103 struct ethtool_stats
*stats
,
106 struct dsa_port
*cpu_dp
= dev
->dsa_ptr
;
107 const struct ethtool_ops
*ops
= cpu_dp
->orig_ethtool_ops
;
108 struct dsa_switch
*ds
= cpu_dp
->ds
;
109 int port
= cpu_dp
->index
;
112 if (dev
->phydev
&& !ops
->get_ethtool_phy_stats
) {
113 count
= phy_ethtool_get_sset_count(dev
->phydev
);
115 phy_ethtool_get_stats(dev
->phydev
, stats
, data
);
116 } else if (ops
->get_sset_count
&& ops
->get_ethtool_phy_stats
) {
117 count
= ops
->get_sset_count(dev
, ETH_SS_PHY_STATS
);
118 ops
->get_ethtool_phy_stats(dev
, stats
, data
);
124 if (ds
->ops
->get_ethtool_phy_stats
)
125 ds
->ops
->get_ethtool_phy_stats(ds
, port
, data
+ count
);
128 static int dsa_conduit_get_sset_count(struct net_device
*dev
, int sset
)
130 struct dsa_port
*cpu_dp
= dev
->dsa_ptr
;
131 const struct ethtool_ops
*ops
= cpu_dp
->orig_ethtool_ops
;
132 struct dsa_switch
*ds
= cpu_dp
->ds
;
135 if (sset
== ETH_SS_PHY_STATS
&& dev
->phydev
&&
136 !ops
->get_ethtool_phy_stats
)
137 count
= phy_ethtool_get_sset_count(dev
->phydev
);
138 else if (ops
->get_sset_count
)
139 count
= ops
->get_sset_count(dev
, sset
);
144 if (ds
->ops
->get_sset_count
)
145 count
+= ds
->ops
->get_sset_count(ds
, cpu_dp
->index
, sset
);
150 static void dsa_conduit_get_strings(struct net_device
*dev
, uint32_t stringset
,
153 struct dsa_port
*cpu_dp
= dev
->dsa_ptr
;
154 const struct ethtool_ops
*ops
= cpu_dp
->orig_ethtool_ops
;
155 struct dsa_switch
*ds
= cpu_dp
->ds
;
156 int port
= cpu_dp
->index
;
157 int len
= ETH_GSTRING_LEN
;
158 int mcount
= 0, count
, i
;
162 snprintf(pfx
, sizeof(pfx
), "p%.2d", port
);
163 /* We do not want to be NULL-terminated, since this is a prefix */
164 pfx
[sizeof(pfx
) - 1] = '_';
166 if (stringset
== ETH_SS_PHY_STATS
&& dev
->phydev
&&
167 !ops
->get_ethtool_phy_stats
) {
168 mcount
= phy_ethtool_get_sset_count(dev
->phydev
);
172 phy_ethtool_get_strings(dev
->phydev
, data
);
173 } else if (ops
->get_sset_count
&& ops
->get_strings
) {
174 mcount
= ops
->get_sset_count(dev
, stringset
);
177 ops
->get_strings(dev
, stringset
, data
);
180 if (ds
->ops
->get_strings
) {
181 ndata
= data
+ mcount
* len
;
182 /* This function copies ETH_GSTRINGS_LEN bytes, we will mangle
183 * the output after to prepend our CPU port prefix we
184 * constructed earlier
186 ds
->ops
->get_strings(ds
, port
, stringset
, ndata
);
187 count
= ds
->ops
->get_sset_count(ds
, port
, stringset
);
190 for (i
= 0; i
< count
; i
++) {
191 memmove(ndata
+ (i
* len
+ sizeof(pfx
)),
192 ndata
+ i
* len
, len
- sizeof(pfx
));
193 memcpy(ndata
+ i
* len
, pfx
, sizeof(pfx
));
198 /* Deny PTP operations on conduit if there is at least one switch in the tree
199 * that is PTP capable.
201 int __dsa_conduit_hwtstamp_validate(struct net_device
*dev
,
202 const struct kernel_hwtstamp_config
*config
,
203 struct netlink_ext_ack
*extack
)
205 struct dsa_port
*cpu_dp
= dev
->dsa_ptr
;
206 struct dsa_switch
*ds
= cpu_dp
->ds
;
207 struct dsa_switch_tree
*dst
;
212 list_for_each_entry(dp
, &dst
->ports
, list
) {
213 if (dsa_port_supports_hwtstamp(dp
)) {
214 NL_SET_ERR_MSG(extack
,
215 "HW timestamping not allowed on DSA conduit when switch supports the operation");
223 static int dsa_conduit_ethtool_setup(struct net_device
*dev
)
225 struct dsa_port
*cpu_dp
= dev
->dsa_ptr
;
226 struct dsa_switch
*ds
= cpu_dp
->ds
;
227 struct ethtool_ops
*ops
;
229 if (netif_is_lag_master(dev
))
232 ops
= devm_kzalloc(ds
->dev
, sizeof(*ops
), GFP_KERNEL
);
236 cpu_dp
->orig_ethtool_ops
= dev
->ethtool_ops
;
237 if (cpu_dp
->orig_ethtool_ops
)
238 memcpy(ops
, cpu_dp
->orig_ethtool_ops
, sizeof(*ops
));
240 ops
->get_regs_len
= dsa_conduit_get_regs_len
;
241 ops
->get_regs
= dsa_conduit_get_regs
;
242 ops
->get_sset_count
= dsa_conduit_get_sset_count
;
243 ops
->get_ethtool_stats
= dsa_conduit_get_ethtool_stats
;
244 ops
->get_strings
= dsa_conduit_get_strings
;
245 ops
->get_ethtool_phy_stats
= dsa_conduit_get_ethtool_phy_stats
;
247 dev
->ethtool_ops
= ops
;
252 static void dsa_conduit_ethtool_teardown(struct net_device
*dev
)
254 struct dsa_port
*cpu_dp
= dev
->dsa_ptr
;
256 if (netif_is_lag_master(dev
))
259 dev
->ethtool_ops
= cpu_dp
->orig_ethtool_ops
;
260 cpu_dp
->orig_ethtool_ops
= NULL
;
263 /* Keep the conduit always promiscuous if the tagging protocol requires that
264 * (garbles MAC DA) or if it doesn't support unicast filtering, case in which
265 * it would revert to promiscuous mode as soon as we call dev_uc_add() on it
268 static void dsa_conduit_set_promiscuity(struct net_device
*dev
, int inc
)
270 const struct dsa_device_ops
*ops
= dev
->dsa_ptr
->tag_ops
;
272 if ((dev
->priv_flags
& IFF_UNICAST_FLT
) && !ops
->promisc_on_conduit
)
277 dev_set_promiscuity(dev
, inc
);
280 static ssize_t
tagging_show(struct device
*d
, struct device_attribute
*attr
,
283 struct net_device
*dev
= to_net_dev(d
);
284 struct dsa_port
*cpu_dp
= dev
->dsa_ptr
;
286 return sysfs_emit(buf
, "%s\n",
287 dsa_tag_protocol_to_str(cpu_dp
->tag_ops
));
290 static ssize_t
tagging_store(struct device
*d
, struct device_attribute
*attr
,
291 const char *buf
, size_t count
)
293 const struct dsa_device_ops
*new_tag_ops
, *old_tag_ops
;
294 const char *end
= strchrnul(buf
, '\n'), *name
;
295 struct net_device
*dev
= to_net_dev(d
);
296 struct dsa_port
*cpu_dp
= dev
->dsa_ptr
;
297 size_t len
= end
- buf
;
300 /* Empty string passed */
304 name
= kstrndup(buf
, len
, GFP_KERNEL
);
308 old_tag_ops
= cpu_dp
->tag_ops
;
309 new_tag_ops
= dsa_tag_driver_get_by_name(name
);
311 /* Bad tagger name? */
312 if (IS_ERR(new_tag_ops
))
313 return PTR_ERR(new_tag_ops
);
315 if (new_tag_ops
== old_tag_ops
)
316 /* Drop the temporarily held duplicate reference, since
317 * the DSA switch tree uses this tagger.
321 err
= dsa_tree_change_tag_proto(cpu_dp
->ds
->dst
, new_tag_ops
,
324 /* On failure the old tagger is restored, so we don't need the
325 * driver for the new one.
327 dsa_tag_driver_put(new_tag_ops
);
331 /* On success we no longer need the module for the old tagging protocol
334 dsa_tag_driver_put(old_tag_ops
);
337 static DEVICE_ATTR_RW(tagging
);
339 static struct attribute
*dsa_user_attrs
[] = {
340 &dev_attr_tagging
.attr
,
344 static const struct attribute_group dsa_group
= {
346 .attrs
= dsa_user_attrs
,
349 static void dsa_conduit_reset_mtu(struct net_device
*dev
)
353 err
= dev_set_mtu(dev
, ETH_DATA_LEN
);
356 "Unable to reset MTU to exclude DSA overheads\n");
359 int dsa_conduit_setup(struct net_device
*dev
, struct dsa_port
*cpu_dp
)
361 const struct dsa_device_ops
*tag_ops
= cpu_dp
->tag_ops
;
362 struct dsa_switch
*ds
= cpu_dp
->ds
;
363 struct device_link
*consumer_link
;
366 mtu
= ETH_DATA_LEN
+ dsa_tag_protocol_overhead(tag_ops
);
368 /* The DSA conduit must use SET_NETDEV_DEV for this to work. */
369 if (!netif_is_lag_master(dev
)) {
370 consumer_link
= device_link_add(ds
->dev
, dev
->dev
.parent
,
371 DL_FLAG_AUTOREMOVE_CONSUMER
);
374 "Failed to create a device link to DSA switch %s\n",
378 /* The switch driver may not implement ->port_change_mtu(), case in
379 * which dsa_user_change_mtu() will not update the conduit MTU either,
380 * so we need to do that here.
382 ret
= dev_set_mtu(dev
, mtu
);
384 netdev_warn(dev
, "error %d setting MTU to %d to include DSA overhead\n",
387 /* If we use a tagging format that doesn't have an ethertype
388 * field, make sure that all packets from this point on get
389 * sent to the tag format's receive function.
393 dev
->dsa_ptr
= cpu_dp
;
395 dsa_conduit_set_promiscuity(dev
, 1);
397 ret
= dsa_conduit_ethtool_setup(dev
);
399 goto out_err_reset_promisc
;
401 ret
= sysfs_create_group(&dev
->dev
.kobj
, &dsa_group
);
403 goto out_err_ethtool_teardown
;
407 out_err_ethtool_teardown
:
408 dsa_conduit_ethtool_teardown(dev
);
409 out_err_reset_promisc
:
410 dsa_conduit_set_promiscuity(dev
, -1);
414 void dsa_conduit_teardown(struct net_device
*dev
)
416 sysfs_remove_group(&dev
->dev
.kobj
, &dsa_group
);
417 dsa_conduit_ethtool_teardown(dev
);
418 dsa_conduit_reset_mtu(dev
);
419 dsa_conduit_set_promiscuity(dev
, -1);
423 /* If we used a tagging format that doesn't have an ethertype
424 * field, make sure that all packets from this point get sent
425 * without the tag and go through the regular receive path.
430 int dsa_conduit_lag_setup(struct net_device
*lag_dev
, struct dsa_port
*cpu_dp
,
431 struct netdev_lag_upper_info
*uinfo
,
432 struct netlink_ext_ack
*extack
)
434 bool conduit_setup
= false;
437 if (!netdev_uses_dsa(lag_dev
)) {
438 err
= dsa_conduit_setup(lag_dev
, cpu_dp
);
442 conduit_setup
= true;
445 err
= dsa_port_lag_join(cpu_dp
, lag_dev
, uinfo
, extack
);
447 NL_SET_ERR_MSG_WEAK_MOD(extack
, "CPU port failed to join LAG");
448 goto out_conduit_teardown
;
453 out_conduit_teardown
:
455 dsa_conduit_teardown(lag_dev
);
459 /* Tear down a conduit if there isn't any other user port on it,
460 * optionally also destroying LAG information.
462 void dsa_conduit_lag_teardown(struct net_device
*lag_dev
,
463 struct dsa_port
*cpu_dp
)
465 struct net_device
*upper
;
466 struct list_head
*iter
;
468 dsa_port_lag_leave(cpu_dp
, lag_dev
);
470 netdev_for_each_upper_dev_rcu(lag_dev
, upper
, iter
)
471 if (dsa_user_dev_check(upper
))
474 dsa_conduit_teardown(lag_dev
);