Lines Matching +full:master +full:- +full:stats

1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Handling of a master device, switching frames via its switch fabric CPU port
5 * Copyright (c) 2017 Savoir-faire Linux Inc.
15 #include "master.h"
21 struct dsa_port *cpu_dp = dev->dsa_ptr; in dsa_master_get_regs_len()
22 const struct ethtool_ops *ops = cpu_dp->orig_ethtool_ops; in dsa_master_get_regs_len()
23 struct dsa_switch *ds = cpu_dp->ds; in dsa_master_get_regs_len()
24 int port = cpu_dp->index; in dsa_master_get_regs_len()
28 if (ops->get_regs_len) { in dsa_master_get_regs_len()
29 len = ops->get_regs_len(dev); in dsa_master_get_regs_len()
38 if (ds->ops->get_regs_len) { in dsa_master_get_regs_len()
39 len = ds->ops->get_regs_len(ds, port); in dsa_master_get_regs_len()
51 struct dsa_port *cpu_dp = dev->dsa_ptr; in dsa_master_get_regs()
52 const struct ethtool_ops *ops = cpu_dp->orig_ethtool_ops; in dsa_master_get_regs()
53 struct dsa_switch *ds = cpu_dp->ds; in dsa_master_get_regs()
56 int port = cpu_dp->index; in dsa_master_get_regs()
59 if (ops->get_regs_len && ops->get_regs) { in dsa_master_get_regs()
60 len = ops->get_regs_len(dev); in dsa_master_get_regs()
63 regs->len = len; in dsa_master_get_regs()
64 ops->get_regs(dev, regs, data); in dsa_master_get_regs()
65 data += regs->len; in dsa_master_get_regs()
69 strscpy(cpu_info->driver, "dsa", sizeof(cpu_info->driver)); in dsa_master_get_regs()
74 if (ds->ops->get_regs_len && ds->ops->get_regs) { in dsa_master_get_regs()
75 len = ds->ops->get_regs_len(ds, port); in dsa_master_get_regs()
78 cpu_regs->len = len; in dsa_master_get_regs()
79 ds->ops->get_regs(ds, port, cpu_regs, data); in dsa_master_get_regs()
84 struct ethtool_stats *stats, in dsa_master_get_ethtool_stats() argument
87 struct dsa_port *cpu_dp = dev->dsa_ptr; in dsa_master_get_ethtool_stats()
88 const struct ethtool_ops *ops = cpu_dp->orig_ethtool_ops; in dsa_master_get_ethtool_stats()
89 struct dsa_switch *ds = cpu_dp->ds; in dsa_master_get_ethtool_stats()
90 int port = cpu_dp->index; in dsa_master_get_ethtool_stats()
93 if (ops->get_sset_count && ops->get_ethtool_stats) { in dsa_master_get_ethtool_stats()
94 count = ops->get_sset_count(dev, ETH_SS_STATS); in dsa_master_get_ethtool_stats()
95 ops->get_ethtool_stats(dev, stats, data); in dsa_master_get_ethtool_stats()
98 if (ds->ops->get_ethtool_stats) in dsa_master_get_ethtool_stats()
99 ds->ops->get_ethtool_stats(ds, port, data + count); in dsa_master_get_ethtool_stats()
103 struct ethtool_stats *stats, in dsa_master_get_ethtool_phy_stats() argument
106 struct dsa_port *cpu_dp = dev->dsa_ptr; in dsa_master_get_ethtool_phy_stats()
107 const struct ethtool_ops *ops = cpu_dp->orig_ethtool_ops; in dsa_master_get_ethtool_phy_stats()
108 struct dsa_switch *ds = cpu_dp->ds; in dsa_master_get_ethtool_phy_stats()
109 int port = cpu_dp->index; in dsa_master_get_ethtool_phy_stats()
112 if (dev->phydev && !ops->get_ethtool_phy_stats) { in dsa_master_get_ethtool_phy_stats()
113 count = phy_ethtool_get_sset_count(dev->phydev); in dsa_master_get_ethtool_phy_stats()
115 phy_ethtool_get_stats(dev->phydev, stats, data); in dsa_master_get_ethtool_phy_stats()
116 } else if (ops->get_sset_count && ops->get_ethtool_phy_stats) { in dsa_master_get_ethtool_phy_stats()
117 count = ops->get_sset_count(dev, ETH_SS_PHY_STATS); in dsa_master_get_ethtool_phy_stats()
118 ops->get_ethtool_phy_stats(dev, stats, data); in dsa_master_get_ethtool_phy_stats()
124 if (ds->ops->get_ethtool_phy_stats) in dsa_master_get_ethtool_phy_stats()
125 ds->ops->get_ethtool_phy_stats(ds, port, data + count); in dsa_master_get_ethtool_phy_stats()
130 struct dsa_port *cpu_dp = dev->dsa_ptr; in dsa_master_get_sset_count()
131 const struct ethtool_ops *ops = cpu_dp->orig_ethtool_ops; in dsa_master_get_sset_count()
132 struct dsa_switch *ds = cpu_dp->ds; in dsa_master_get_sset_count()
135 if (sset == ETH_SS_PHY_STATS && dev->phydev && in dsa_master_get_sset_count()
136 !ops->get_ethtool_phy_stats) in dsa_master_get_sset_count()
137 count = phy_ethtool_get_sset_count(dev->phydev); in dsa_master_get_sset_count()
138 else if (ops->get_sset_count) in dsa_master_get_sset_count()
139 count = ops->get_sset_count(dev, sset); in dsa_master_get_sset_count()
144 if (ds->ops->get_sset_count) in dsa_master_get_sset_count()
145 count += ds->ops->get_sset_count(ds, cpu_dp->index, sset); in dsa_master_get_sset_count()
153 struct dsa_port *cpu_dp = dev->dsa_ptr; in dsa_master_get_strings()
154 const struct ethtool_ops *ops = cpu_dp->orig_ethtool_ops; in dsa_master_get_strings()
155 struct dsa_switch *ds = cpu_dp->ds; in dsa_master_get_strings()
156 int port = cpu_dp->index; in dsa_master_get_strings()
163 /* We do not want to be NULL-terminated, since this is a prefix */ in dsa_master_get_strings()
164 pfx[sizeof(pfx) - 1] = '_'; in dsa_master_get_strings()
166 if (stringset == ETH_SS_PHY_STATS && dev->phydev && in dsa_master_get_strings()
167 !ops->get_ethtool_phy_stats) { in dsa_master_get_strings()
168 mcount = phy_ethtool_get_sset_count(dev->phydev); in dsa_master_get_strings()
172 phy_ethtool_get_strings(dev->phydev, data); in dsa_master_get_strings()
173 } else if (ops->get_sset_count && ops->get_strings) { in dsa_master_get_strings()
174 mcount = ops->get_sset_count(dev, stringset); in dsa_master_get_strings()
177 ops->get_strings(dev, stringset, data); in dsa_master_get_strings()
180 if (ds->ops->get_strings) { in dsa_master_get_strings()
186 ds->ops->get_strings(ds, port, stringset, ndata); in dsa_master_get_strings()
187 count = ds->ops->get_sset_count(ds, port, stringset); in dsa_master_get_strings()
192 ndata + i * len, len - sizeof(pfx)); in dsa_master_get_strings()
198 /* Deny PTP operations on master if there is at least one switch in the tree
205 struct dsa_port *cpu_dp = dev->dsa_ptr; in __dsa_master_hwtstamp_validate()
206 struct dsa_switch *ds = cpu_dp->ds; in __dsa_master_hwtstamp_validate()
210 dst = ds->dst; in __dsa_master_hwtstamp_validate()
212 list_for_each_entry(dp, &dst->ports, list) { in __dsa_master_hwtstamp_validate()
215 "HW timestamping not allowed on DSA master when switch supports the operation"); in __dsa_master_hwtstamp_validate()
216 return -EBUSY; in __dsa_master_hwtstamp_validate()
225 struct dsa_port *cpu_dp = dev->dsa_ptr; in dsa_master_ethtool_setup()
226 struct dsa_switch *ds = cpu_dp->ds; in dsa_master_ethtool_setup()
232 ops = devm_kzalloc(ds->dev, sizeof(*ops), GFP_KERNEL); in dsa_master_ethtool_setup()
234 return -ENOMEM; in dsa_master_ethtool_setup()
236 cpu_dp->orig_ethtool_ops = dev->ethtool_ops; in dsa_master_ethtool_setup()
237 if (cpu_dp->orig_ethtool_ops) in dsa_master_ethtool_setup()
238 memcpy(ops, cpu_dp->orig_ethtool_ops, sizeof(*ops)); in dsa_master_ethtool_setup()
240 ops->get_regs_len = dsa_master_get_regs_len; in dsa_master_ethtool_setup()
241 ops->get_regs = dsa_master_get_regs; in dsa_master_ethtool_setup()
242 ops->get_sset_count = dsa_master_get_sset_count; in dsa_master_ethtool_setup()
243 ops->get_ethtool_stats = dsa_master_get_ethtool_stats; in dsa_master_ethtool_setup()
244 ops->get_strings = dsa_master_get_strings; in dsa_master_ethtool_setup()
245 ops->get_ethtool_phy_stats = dsa_master_get_ethtool_phy_stats; in dsa_master_ethtool_setup()
247 dev->ethtool_ops = ops; in dsa_master_ethtool_setup()
254 struct dsa_port *cpu_dp = dev->dsa_ptr; in dsa_master_ethtool_teardown()
259 dev->ethtool_ops = cpu_dp->orig_ethtool_ops; in dsa_master_ethtool_teardown()
260 cpu_dp->orig_ethtool_ops = NULL; in dsa_master_ethtool_teardown()
263 /* Keep the master always promiscuous if the tagging protocol requires that
270 const struct dsa_device_ops *ops = dev->dsa_ptr->tag_ops; in dsa_master_set_promiscuity()
272 if ((dev->priv_flags & IFF_UNICAST_FLT) && !ops->promisc_on_master) in dsa_master_set_promiscuity()
284 struct dsa_port *cpu_dp = dev->dsa_ptr; in tagging_show()
287 dsa_tag_protocol_to_str(cpu_dp->tag_ops)); in tagging_show()
296 struct dsa_port *cpu_dp = dev->dsa_ptr; in tagging_store()
297 size_t len = end - buf; in tagging_store()
302 return -ENOPROTOOPT; in tagging_store()
306 return -ENOMEM; in tagging_store()
308 old_tag_ops = cpu_dp->tag_ops; in tagging_store()
321 err = dsa_tree_change_tag_proto(cpu_dp->ds->dst, new_tag_ops, in tagging_store()
361 const struct dsa_device_ops *tag_ops = cpu_dp->tag_ops; in dsa_master_setup()
362 struct dsa_switch *ds = cpu_dp->ds; in dsa_master_setup()
368 /* The DSA master must use SET_NETDEV_DEV for this to work. */ in dsa_master_setup()
370 consumer_link = device_link_add(ds->dev, dev->dev.parent, in dsa_master_setup()
375 dev_name(ds->dev)); in dsa_master_setup()
378 /* The switch driver may not implement ->port_change_mtu(), case in in dsa_master_setup()
379 * which dsa_slave_change_mtu() will not update the master MTU either, in dsa_master_setup()
393 dev->dsa_ptr = cpu_dp; in dsa_master_setup()
401 ret = sysfs_create_group(&dev->dev.kobj, &dsa_group); in dsa_master_setup()
410 dsa_master_set_promiscuity(dev, -1); in dsa_master_setup()
416 sysfs_remove_group(&dev->dev.kobj, &dsa_group); in dsa_master_teardown()
419 dsa_master_set_promiscuity(dev, -1); in dsa_master_teardown()
421 dev->dsa_ptr = NULL; in dsa_master_teardown()
459 /* Tear down a master if there isn't any other user port on it,