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.
13 struct dsa_port *cpu_dp = dev->dsa_ptr; in dsa_master_get_regs_len()
14 const struct ethtool_ops *ops = cpu_dp->orig_ethtool_ops; in dsa_master_get_regs_len()
15 struct dsa_switch *ds = cpu_dp->ds; in dsa_master_get_regs_len()
16 int port = cpu_dp->index; in dsa_master_get_regs_len()
20 if (ops->get_regs_len) { in dsa_master_get_regs_len()
21 len = ops->get_regs_len(dev); in dsa_master_get_regs_len()
30 if (ds->ops->get_regs_len) { in dsa_master_get_regs_len()
31 len = ds->ops->get_regs_len(ds, port); in dsa_master_get_regs_len()
43 struct dsa_port *cpu_dp = dev->dsa_ptr; in dsa_master_get_regs()
44 const struct ethtool_ops *ops = cpu_dp->orig_ethtool_ops; in dsa_master_get_regs()
45 struct dsa_switch *ds = cpu_dp->ds; in dsa_master_get_regs()
48 int port = cpu_dp->index; in dsa_master_get_regs()
51 if (ops->get_regs_len && ops->get_regs) { in dsa_master_get_regs()
52 len = ops->get_regs_len(dev); in dsa_master_get_regs()
55 regs->len = len; in dsa_master_get_regs()
56 ops->get_regs(dev, regs, data); in dsa_master_get_regs()
57 data += regs->len; in dsa_master_get_regs()
61 strlcpy(cpu_info->driver, "dsa", sizeof(cpu_info->driver)); in dsa_master_get_regs()
66 if (ds->ops->get_regs_len && ds->ops->get_regs) { in dsa_master_get_regs()
67 len = ds->ops->get_regs_len(ds, port); in dsa_master_get_regs()
70 cpu_regs->len = len; in dsa_master_get_regs()
71 ds->ops->get_regs(ds, port, cpu_regs, data); in dsa_master_get_regs()
76 struct ethtool_stats *stats, in dsa_master_get_ethtool_stats() argument
79 struct dsa_port *cpu_dp = dev->dsa_ptr; in dsa_master_get_ethtool_stats()
80 const struct ethtool_ops *ops = cpu_dp->orig_ethtool_ops; in dsa_master_get_ethtool_stats()
81 struct dsa_switch *ds = cpu_dp->ds; in dsa_master_get_ethtool_stats()
82 int port = cpu_dp->index; in dsa_master_get_ethtool_stats()
85 if (ops->get_sset_count && ops->get_ethtool_stats) { in dsa_master_get_ethtool_stats()
86 count = ops->get_sset_count(dev, ETH_SS_STATS); in dsa_master_get_ethtool_stats()
87 ops->get_ethtool_stats(dev, stats, data); in dsa_master_get_ethtool_stats()
90 if (ds->ops->get_ethtool_stats) in dsa_master_get_ethtool_stats()
91 ds->ops->get_ethtool_stats(ds, port, data + count); in dsa_master_get_ethtool_stats()
95 struct ethtool_stats *stats, in dsa_master_get_ethtool_phy_stats() argument
98 struct dsa_port *cpu_dp = dev->dsa_ptr; in dsa_master_get_ethtool_phy_stats()
99 const struct ethtool_ops *ops = cpu_dp->orig_ethtool_ops; in dsa_master_get_ethtool_phy_stats()
100 struct dsa_switch *ds = cpu_dp->ds; in dsa_master_get_ethtool_phy_stats()
101 int port = cpu_dp->index; in dsa_master_get_ethtool_phy_stats()
104 if (dev->phydev && !ops->get_ethtool_phy_stats) { in dsa_master_get_ethtool_phy_stats()
105 count = phy_ethtool_get_sset_count(dev->phydev); in dsa_master_get_ethtool_phy_stats()
107 phy_ethtool_get_stats(dev->phydev, stats, data); in dsa_master_get_ethtool_phy_stats()
108 } else if (ops->get_sset_count && ops->get_ethtool_phy_stats) { in dsa_master_get_ethtool_phy_stats()
109 count = ops->get_sset_count(dev, ETH_SS_PHY_STATS); in dsa_master_get_ethtool_phy_stats()
110 ops->get_ethtool_phy_stats(dev, stats, data); in dsa_master_get_ethtool_phy_stats()
116 if (ds->ops->get_ethtool_phy_stats) in dsa_master_get_ethtool_phy_stats()
117 ds->ops->get_ethtool_phy_stats(ds, port, data + count); in dsa_master_get_ethtool_phy_stats()
122 struct dsa_port *cpu_dp = dev->dsa_ptr; in dsa_master_get_sset_count()
123 const struct ethtool_ops *ops = cpu_dp->orig_ethtool_ops; in dsa_master_get_sset_count()
124 struct dsa_switch *ds = cpu_dp->ds; in dsa_master_get_sset_count()
127 if (sset == ETH_SS_PHY_STATS && dev->phydev && in dsa_master_get_sset_count()
128 !ops->get_ethtool_phy_stats) in dsa_master_get_sset_count()
129 count = phy_ethtool_get_sset_count(dev->phydev); in dsa_master_get_sset_count()
130 else if (ops->get_sset_count) in dsa_master_get_sset_count()
131 count = ops->get_sset_count(dev, sset); in dsa_master_get_sset_count()
136 if (ds->ops->get_sset_count) in dsa_master_get_sset_count()
137 count += ds->ops->get_sset_count(ds, cpu_dp->index, sset); in dsa_master_get_sset_count()
145 struct dsa_port *cpu_dp = dev->dsa_ptr; in dsa_master_get_strings()
146 const struct ethtool_ops *ops = cpu_dp->orig_ethtool_ops; in dsa_master_get_strings()
147 struct dsa_switch *ds = cpu_dp->ds; in dsa_master_get_strings()
148 int port = cpu_dp->index; in dsa_master_get_strings()
155 /* We do not want to be NULL-terminated, since this is a prefix */ in dsa_master_get_strings()
156 pfx[sizeof(pfx) - 1] = '_'; in dsa_master_get_strings()
158 if (stringset == ETH_SS_PHY_STATS && dev->phydev && in dsa_master_get_strings()
159 !ops->get_ethtool_phy_stats) { in dsa_master_get_strings()
160 mcount = phy_ethtool_get_sset_count(dev->phydev); in dsa_master_get_strings()
164 phy_ethtool_get_strings(dev->phydev, data); in dsa_master_get_strings()
165 } else if (ops->get_sset_count && ops->get_strings) { in dsa_master_get_strings()
166 mcount = ops->get_sset_count(dev, stringset); in dsa_master_get_strings()
169 ops->get_strings(dev, stringset, data); in dsa_master_get_strings()
172 if (ds->ops->get_strings) { in dsa_master_get_strings()
178 ds->ops->get_strings(ds, port, stringset, ndata); in dsa_master_get_strings()
179 count = ds->ops->get_sset_count(ds, port, stringset); in dsa_master_get_strings()
184 ndata + i * len, len - sizeof(pfx)); in dsa_master_get_strings()
192 struct dsa_port *cpu_dp = dev->dsa_ptr; in dsa_master_ioctl()
193 struct dsa_switch *ds = cpu_dp->ds; in dsa_master_ioctl()
195 int err = -EOPNOTSUPP; in dsa_master_ioctl()
198 dst = ds->dst; in dsa_master_ioctl()
203 /* Deny PTP operations on master if there is at least one in dsa_master_ioctl()
206 list_for_each_entry(dp, &dst->ports, list) in dsa_master_ioctl()
207 if (dp->ds->ops->port_hwtstamp_get || in dsa_master_ioctl()
208 dp->ds->ops->port_hwtstamp_set) in dsa_master_ioctl()
209 return -EBUSY; in dsa_master_ioctl()
213 if (dev->netdev_ops->ndo_do_ioctl) in dsa_master_ioctl()
214 err = dev->netdev_ops->ndo_do_ioctl(dev, ifr, cmd); in dsa_master_ioctl()
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()
229 ops = devm_kzalloc(ds->dev, sizeof(*ops), GFP_KERNEL); in dsa_master_ethtool_setup()
231 return -ENOMEM; in dsa_master_ethtool_setup()
233 cpu_dp->orig_ethtool_ops = dev->ethtool_ops; in dsa_master_ethtool_setup()
234 if (cpu_dp->orig_ethtool_ops) in dsa_master_ethtool_setup()
235 memcpy(ops, cpu_dp->orig_ethtool_ops, sizeof(*ops)); in dsa_master_ethtool_setup()
237 ops->get_regs_len = dsa_master_get_regs_len; in dsa_master_ethtool_setup()
238 ops->get_regs = dsa_master_get_regs; in dsa_master_ethtool_setup()
239 ops->get_sset_count = dsa_master_get_sset_count; in dsa_master_ethtool_setup()
240 ops->get_ethtool_stats = dsa_master_get_ethtool_stats; in dsa_master_ethtool_setup()
241 ops->get_strings = dsa_master_get_strings; in dsa_master_ethtool_setup()
242 ops->get_ethtool_phy_stats = dsa_master_get_ethtool_phy_stats; in dsa_master_ethtool_setup()
244 dev->ethtool_ops = ops; in dsa_master_ethtool_setup()
251 struct dsa_port *cpu_dp = dev->dsa_ptr; in dsa_master_ethtool_teardown()
253 dev->ethtool_ops = cpu_dp->orig_ethtool_ops; in dsa_master_ethtool_teardown()
254 cpu_dp->orig_ethtool_ops = NULL; in dsa_master_ethtool_teardown()
260 dev->dsa_ptr->netdev_ops = ops; in dsa_netdev_ops_set()
265 const struct dsa_device_ops *ops = dev->dsa_ptr->tag_ops; in dsa_master_set_promiscuity()
267 if (!ops->promisc_on_master) in dsa_master_set_promiscuity()
279 struct dsa_port *cpu_dp = dev->dsa_ptr; in tagging_show()
282 dsa_tag_protocol_to_str(cpu_dp->tag_ops)); in tagging_show()
312 struct dsa_switch *ds = cpu_dp->ds; in dsa_master_setup()
316 /* The DSA master must use SET_NETDEV_DEV for this to work. */ in dsa_master_setup()
317 consumer_link = device_link_add(ds->dev, dev->dev.parent, in dsa_master_setup()
322 dev_name(ds->dev)); in dsa_master_setup()
325 ret = dev_set_mtu(dev, ETH_DATA_LEN + cpu_dp->tag_ops->overhead); in dsa_master_setup()
337 dev->dsa_ptr = cpu_dp; in dsa_master_setup()
338 lockdep_set_class(&dev->addr_list_lock, in dsa_master_setup()
349 ret = sysfs_create_group(&dev->dev.kobj, &dsa_group); in dsa_master_setup()
359 dsa_master_set_promiscuity(dev, -1); in dsa_master_setup()
365 sysfs_remove_group(&dev->dev.kobj, &dsa_group); in dsa_master_teardown()
369 dsa_master_set_promiscuity(dev, -1); in dsa_master_teardown()
371 dev->dsa_ptr = NULL; in dsa_master_teardown()