Lines Matching refs:ocelot

15 static int ocelot_port_update_stats(struct ocelot *ocelot, int port)  in ocelot_port_update_stats()  argument
21 ocelot_write(ocelot, SYS_STAT_CFG_STAT_VIEW(port), SYS_STAT_CFG); in ocelot_port_update_stats()
23 list_for_each_entry(region, &ocelot->stats_regions, node) { in ocelot_port_update_stats()
24 err = ocelot_bulk_read(ocelot, region->base, region->buf, in ocelot_port_update_stats()
36 static void ocelot_port_transfer_stats(struct ocelot *ocelot, int port) in ocelot_port_transfer_stats() argument
42 list_for_each_entry(region, &ocelot->stats_regions, node) { in ocelot_port_transfer_stats()
44 u64 *stat = &ocelot->stats[idx + j]; in ocelot_port_transfer_stats()
60 struct ocelot *ocelot = container_of(del_work, struct ocelot, in ocelot_check_stats_work() local
64 mutex_lock(&ocelot->stat_view_lock); in ocelot_check_stats_work()
66 for (port = 0; port < ocelot->num_phys_ports; port++) { in ocelot_check_stats_work()
67 err = ocelot_port_update_stats(ocelot, port); in ocelot_check_stats_work()
71 spin_lock(&ocelot->stats_lock); in ocelot_check_stats_work()
72 ocelot_port_transfer_stats(ocelot, port); in ocelot_check_stats_work()
73 spin_unlock(&ocelot->stats_lock); in ocelot_check_stats_work()
76 if (!err && ocelot->ops->update_stats) in ocelot_check_stats_work()
77 ocelot->ops->update_stats(ocelot); in ocelot_check_stats_work()
79 mutex_unlock(&ocelot->stat_view_lock); in ocelot_check_stats_work()
82 dev_err(ocelot->dev, "Error %d updating ethtool stats\n", err); in ocelot_check_stats_work()
84 queue_delayed_work(ocelot->stats_queue, &ocelot->stats_work, in ocelot_check_stats_work()
88 void ocelot_get_strings(struct ocelot *ocelot, int port, u32 sset, u8 *data) in ocelot_get_strings() argument
96 if (ocelot->stats_layout[i].name[0] == '\0') in ocelot_get_strings()
99 memcpy(data + i * ETH_GSTRING_LEN, ocelot->stats_layout[i].name, in ocelot_get_strings()
106 static void ocelot_port_stats_run(struct ocelot *ocelot, int port, void *priv, in ocelot_port_stats_run() argument
107 void (*cb)(struct ocelot *ocelot, int port, in ocelot_port_stats_run() argument
112 mutex_lock(&ocelot->stat_view_lock); in ocelot_port_stats_run()
114 err = ocelot_port_update_stats(ocelot, port); in ocelot_port_stats_run()
116 dev_err(ocelot->dev, "Failed to update port %d stats: %pe\n", in ocelot_port_stats_run()
121 spin_lock(&ocelot->stats_lock); in ocelot_port_stats_run()
123 ocelot_port_transfer_stats(ocelot, port); in ocelot_port_stats_run()
124 cb(ocelot, port, priv); in ocelot_port_stats_run()
126 spin_unlock(&ocelot->stats_lock); in ocelot_port_stats_run()
129 mutex_unlock(&ocelot->stat_view_lock); in ocelot_port_stats_run()
132 int ocelot_get_sset_count(struct ocelot *ocelot, int port, int sset) in ocelot_get_sset_count() argument
140 if (ocelot->stats_layout[i].name[0] != '\0') in ocelot_get_sset_count()
147 static void ocelot_port_ethtool_stats_cb(struct ocelot *ocelot, int port, in ocelot_port_ethtool_stats_cb() argument
157 if (ocelot->stats_layout[i].name[0] == '\0') in ocelot_port_ethtool_stats_cb()
160 *data++ = ocelot->stats[index]; in ocelot_port_ethtool_stats_cb()
164 void ocelot_get_ethtool_stats(struct ocelot *ocelot, int port, u64 *data) in ocelot_get_ethtool_stats() argument
166 ocelot_port_stats_run(ocelot, port, data, ocelot_port_ethtool_stats_cb); in ocelot_get_ethtool_stats()
170 static void ocelot_port_pause_stats_cb(struct ocelot *ocelot, int port, void *priv) in ocelot_port_pause_stats_cb() argument
172 u64 *s = &ocelot->stats[port * OCELOT_NUM_STATS]; in ocelot_port_pause_stats_cb()
179 void ocelot_port_get_pause_stats(struct ocelot *ocelot, int port, in ocelot_port_get_pause_stats() argument
182 ocelot_port_stats_run(ocelot, port, pause_stats, in ocelot_port_get_pause_stats()
198 static void ocelot_port_rmon_stats_cb(struct ocelot *ocelot, int port, void *priv) in ocelot_port_rmon_stats_cb() argument
200 u64 *s = &ocelot->stats[port * OCELOT_NUM_STATS]; in ocelot_port_rmon_stats_cb()
225 void ocelot_port_get_rmon_stats(struct ocelot *ocelot, int port, in ocelot_port_get_rmon_stats() argument
231 ocelot_port_stats_run(ocelot, port, rmon_stats, in ocelot_port_get_rmon_stats()
236 static void ocelot_port_ctrl_stats_cb(struct ocelot *ocelot, int port, void *priv) in ocelot_port_ctrl_stats_cb() argument
238 u64 *s = &ocelot->stats[port * OCELOT_NUM_STATS]; in ocelot_port_ctrl_stats_cb()
244 void ocelot_port_get_eth_ctrl_stats(struct ocelot *ocelot, int port, in ocelot_port_get_eth_ctrl_stats() argument
247 ocelot_port_stats_run(ocelot, port, ctrl_stats, in ocelot_port_get_eth_ctrl_stats()
252 static void ocelot_port_mac_stats_cb(struct ocelot *ocelot, int port, void *priv) in ocelot_port_mac_stats_cb() argument
254 u64 *s = &ocelot->stats[port * OCELOT_NUM_STATS]; in ocelot_port_mac_stats_cb()
294 void ocelot_port_get_eth_mac_stats(struct ocelot *ocelot, int port, in ocelot_port_get_eth_mac_stats() argument
297 ocelot_port_stats_run(ocelot, port, mac_stats, in ocelot_port_get_eth_mac_stats()
302 static void ocelot_port_phy_stats_cb(struct ocelot *ocelot, int port, void *priv) in ocelot_port_phy_stats_cb() argument
304 u64 *s = &ocelot->stats[port * OCELOT_NUM_STATS]; in ocelot_port_phy_stats_cb()
310 void ocelot_port_get_eth_phy_stats(struct ocelot *ocelot, int port, in ocelot_port_get_eth_phy_stats() argument
313 ocelot_port_stats_run(ocelot, port, phy_stats, in ocelot_port_get_eth_phy_stats()
318 void ocelot_port_get_stats64(struct ocelot *ocelot, int port, in ocelot_port_get_stats64() argument
321 u64 *s = &ocelot->stats[port * OCELOT_NUM_STATS]; in ocelot_port_get_stats64()
323 spin_lock(&ocelot->stats_lock); in ocelot_port_get_stats64()
379 spin_unlock(&ocelot->stats_lock); in ocelot_port_get_stats64()
383 static int ocelot_prepare_stats_regions(struct ocelot *ocelot) in ocelot_prepare_stats_regions() argument
389 INIT_LIST_HEAD(&ocelot->stats_regions); in ocelot_prepare_stats_regions()
392 if (!ocelot->stats_layout[i].reg) in ocelot_prepare_stats_regions()
395 if (region && ocelot->stats_layout[i].reg == last + 4) { in ocelot_prepare_stats_regions()
398 region = devm_kzalloc(ocelot->dev, sizeof(*region), in ocelot_prepare_stats_regions()
403 region->base = ocelot->stats_layout[i].reg; in ocelot_prepare_stats_regions()
405 list_add_tail(&region->node, &ocelot->stats_regions); in ocelot_prepare_stats_regions()
408 last = ocelot->stats_layout[i].reg; in ocelot_prepare_stats_regions()
411 list_for_each_entry(region, &ocelot->stats_regions, node) { in ocelot_prepare_stats_regions()
412 region->buf = devm_kcalloc(ocelot->dev, region->count, in ocelot_prepare_stats_regions()
421 int ocelot_stats_init(struct ocelot *ocelot) in ocelot_stats_init() argument
426 ocelot->stats = devm_kcalloc(ocelot->dev, in ocelot_stats_init()
427 ocelot->num_phys_ports * OCELOT_NUM_STATS, in ocelot_stats_init()
429 if (!ocelot->stats) in ocelot_stats_init()
433 dev_name(ocelot->dev)); in ocelot_stats_init()
434 ocelot->stats_queue = create_singlethread_workqueue(queue_name); in ocelot_stats_init()
435 if (!ocelot->stats_queue) in ocelot_stats_init()
438 spin_lock_init(&ocelot->stats_lock); in ocelot_stats_init()
439 mutex_init(&ocelot->stat_view_lock); in ocelot_stats_init()
441 ret = ocelot_prepare_stats_regions(ocelot); in ocelot_stats_init()
443 destroy_workqueue(ocelot->stats_queue); in ocelot_stats_init()
447 INIT_DELAYED_WORK(&ocelot->stats_work, ocelot_check_stats_work); in ocelot_stats_init()
448 queue_delayed_work(ocelot->stats_queue, &ocelot->stats_work, in ocelot_stats_init()
454 void ocelot_stats_deinit(struct ocelot *ocelot) in ocelot_stats_deinit() argument
456 cancel_delayed_work(&ocelot->stats_work); in ocelot_stats_deinit()
457 destroy_workqueue(ocelot->stats_queue); in ocelot_stats_deinit()