Lines Matching full:ocelot

2 /* Statistics for Ocelot switch family
11 #include "ocelot.h"
153 * and copied to ocelot->stats.
312 ocelot_get_stats_layout(struct ocelot *ocelot) in ocelot_get_stats_layout() argument
314 if (ocelot->mm_supported) in ocelot_get_stats_layout()
321 * Caller must hold &ocelot->stat_view_lock.
323 static int ocelot_port_update_stats(struct ocelot *ocelot, int port) in ocelot_port_update_stats() argument
329 ocelot_write(ocelot, SYS_STAT_CFG_STAT_VIEW(port), SYS_STAT_CFG); in ocelot_port_update_stats()
331 list_for_each_entry(region, &ocelot->stats_regions, node) { in ocelot_port_update_stats()
332 err = ocelot_bulk_read(ocelot, region->base, region->buf, in ocelot_port_update_stats()
341 /* Transfer the counters from region->buf to ocelot->stats.
342 * Caller must hold &ocelot->stat_view_lock and &ocelot->stats_lock.
344 static void ocelot_port_transfer_stats(struct ocelot *ocelot, int port) in ocelot_port_transfer_stats() argument
349 list_for_each_entry(region, &ocelot->stats_regions, node) { in ocelot_port_transfer_stats()
353 u64 *stat = &ocelot->stats[idx + j]; in ocelot_port_transfer_stats()
367 struct ocelot *ocelot = container_of(del_work, struct ocelot, in ocelot_check_stats_work() local
371 mutex_lock(&ocelot->stat_view_lock); in ocelot_check_stats_work()
373 for (port = 0; port < ocelot->num_phys_ports; port++) { in ocelot_check_stats_work()
374 err = ocelot_port_update_stats(ocelot, port); in ocelot_check_stats_work()
378 spin_lock(&ocelot->stats_lock); in ocelot_check_stats_work()
379 ocelot_port_transfer_stats(ocelot, port); in ocelot_check_stats_work()
380 spin_unlock(&ocelot->stats_lock); in ocelot_check_stats_work()
383 if (!err && ocelot->ops->update_stats) in ocelot_check_stats_work()
384 ocelot->ops->update_stats(ocelot); in ocelot_check_stats_work()
386 mutex_unlock(&ocelot->stat_view_lock); in ocelot_check_stats_work()
389 dev_err(ocelot->dev, "Error %d updating ethtool stats\n", err); in ocelot_check_stats_work()
391 queue_delayed_work(ocelot->stats_queue, &ocelot->stats_work, in ocelot_check_stats_work()
395 void ocelot_get_strings(struct ocelot *ocelot, int port, u32 sset, u8 *data) in ocelot_get_strings() argument
403 layout = ocelot_get_stats_layout(ocelot); in ocelot_get_strings()
415 /* Update ocelot->stats for the given port and run the given callback */
416 static void ocelot_port_stats_run(struct ocelot *ocelot, int port, void *priv, in ocelot_port_stats_run() argument
417 void (*cb)(struct ocelot *ocelot, int port, in ocelot_port_stats_run() argument
422 mutex_lock(&ocelot->stat_view_lock); in ocelot_port_stats_run()
424 err = ocelot_port_update_stats(ocelot, port); in ocelot_port_stats_run()
426 dev_err(ocelot->dev, "Failed to update port %d stats: %pe\n", in ocelot_port_stats_run()
431 spin_lock(&ocelot->stats_lock); in ocelot_port_stats_run()
433 ocelot_port_transfer_stats(ocelot, port); in ocelot_port_stats_run()
434 cb(ocelot, port, priv); in ocelot_port_stats_run()
436 spin_unlock(&ocelot->stats_lock); in ocelot_port_stats_run()
439 mutex_unlock(&ocelot->stat_view_lock); in ocelot_port_stats_run()
442 int ocelot_get_sset_count(struct ocelot *ocelot, int port, int sset) in ocelot_get_sset_count() argument
451 layout = ocelot_get_stats_layout(ocelot); in ocelot_get_sset_count()
461 static void ocelot_port_ethtool_stats_cb(struct ocelot *ocelot, int port, in ocelot_port_ethtool_stats_cb() argument
468 layout = ocelot_get_stats_layout(ocelot); in ocelot_port_ethtool_stats_cb()
477 *data++ = ocelot->stats[index]; in ocelot_port_ethtool_stats_cb()
481 void ocelot_get_ethtool_stats(struct ocelot *ocelot, int port, u64 *data) in ocelot_get_ethtool_stats() argument
483 ocelot_port_stats_run(ocelot, port, data, ocelot_port_ethtool_stats_cb); in ocelot_get_ethtool_stats()
487 static void ocelot_port_pause_stats_cb(struct ocelot *ocelot, int port, void *priv) in ocelot_port_pause_stats_cb() argument
489 u64 *s = &ocelot->stats[port * OCELOT_NUM_STATS]; in ocelot_port_pause_stats_cb()
496 static void ocelot_port_pmac_pause_stats_cb(struct ocelot *ocelot, int port, in ocelot_port_pmac_pause_stats_cb() argument
499 u64 *s = &ocelot->stats[port * OCELOT_NUM_STATS]; in ocelot_port_pmac_pause_stats_cb()
506 static void ocelot_port_mm_stats_cb(struct ocelot *ocelot, int port, in ocelot_port_mm_stats_cb() argument
509 u64 *s = &ocelot->stats[port * OCELOT_NUM_STATS]; in ocelot_port_mm_stats_cb()
520 void ocelot_port_get_pause_stats(struct ocelot *ocelot, int port, in ocelot_port_get_pause_stats() argument
527 ocelot_port_stats_run(ocelot, port, pause_stats, in ocelot_port_get_pause_stats()
531 if (ocelot->mm_supported) in ocelot_port_get_pause_stats()
532 ocelot_port_stats_run(ocelot, port, pause_stats, in ocelot_port_get_pause_stats()
536 dev = ocelot->ops->port_to_netdev(ocelot, port); in ocelot_port_get_pause_stats()
543 void ocelot_port_get_mm_stats(struct ocelot *ocelot, int port, in ocelot_port_get_mm_stats() argument
546 if (!ocelot->mm_supported) in ocelot_port_get_mm_stats()
549 ocelot_port_stats_run(ocelot, port, stats, ocelot_port_mm_stats_cb); in ocelot_port_get_mm_stats()
564 static void ocelot_port_rmon_stats_cb(struct ocelot *ocelot, int port, void *priv) in ocelot_port_rmon_stats_cb() argument
566 u64 *s = &ocelot->stats[port * OCELOT_NUM_STATS]; in ocelot_port_rmon_stats_cb()
591 static void ocelot_port_pmac_rmon_stats_cb(struct ocelot *ocelot, int port, in ocelot_port_pmac_rmon_stats_cb() argument
594 u64 *s = &ocelot->stats[port * OCELOT_NUM_STATS]; in ocelot_port_pmac_rmon_stats_cb()
619 void ocelot_port_get_rmon_stats(struct ocelot *ocelot, int port, in ocelot_port_get_rmon_stats() argument
629 ocelot_port_stats_run(ocelot, port, rmon_stats, in ocelot_port_get_rmon_stats()
633 if (ocelot->mm_supported) in ocelot_port_get_rmon_stats()
634 ocelot_port_stats_run(ocelot, port, rmon_stats, in ocelot_port_get_rmon_stats()
638 dev = ocelot->ops->port_to_netdev(ocelot, port); in ocelot_port_get_rmon_stats()
645 static void ocelot_port_ctrl_stats_cb(struct ocelot *ocelot, int port, void *priv) in ocelot_port_ctrl_stats_cb() argument
647 u64 *s = &ocelot->stats[port * OCELOT_NUM_STATS]; in ocelot_port_ctrl_stats_cb()
653 static void ocelot_port_pmac_ctrl_stats_cb(struct ocelot *ocelot, int port, in ocelot_port_pmac_ctrl_stats_cb() argument
656 u64 *s = &ocelot->stats[port * OCELOT_NUM_STATS]; in ocelot_port_pmac_ctrl_stats_cb()
662 void ocelot_port_get_eth_ctrl_stats(struct ocelot *ocelot, int port, in ocelot_port_get_eth_ctrl_stats() argument
669 ocelot_port_stats_run(ocelot, port, ctrl_stats, in ocelot_port_get_eth_ctrl_stats()
673 if (ocelot->mm_supported) in ocelot_port_get_eth_ctrl_stats()
674 ocelot_port_stats_run(ocelot, port, ctrl_stats, in ocelot_port_get_eth_ctrl_stats()
678 dev = ocelot->ops->port_to_netdev(ocelot, port); in ocelot_port_get_eth_ctrl_stats()
685 static void ocelot_port_mac_stats_cb(struct ocelot *ocelot, int port, void *priv) in ocelot_port_mac_stats_cb() argument
687 u64 *s = &ocelot->stats[port * OCELOT_NUM_STATS]; in ocelot_port_mac_stats_cb()
727 static void ocelot_port_pmac_mac_stats_cb(struct ocelot *ocelot, int port, in ocelot_port_pmac_mac_stats_cb() argument
730 u64 *s = &ocelot->stats[port * OCELOT_NUM_STATS]; in ocelot_port_pmac_mac_stats_cb()
761 void ocelot_port_get_eth_mac_stats(struct ocelot *ocelot, int port, in ocelot_port_get_eth_mac_stats() argument
768 ocelot_port_stats_run(ocelot, port, mac_stats, in ocelot_port_get_eth_mac_stats()
772 if (ocelot->mm_supported) in ocelot_port_get_eth_mac_stats()
773 ocelot_port_stats_run(ocelot, port, mac_stats, in ocelot_port_get_eth_mac_stats()
777 dev = ocelot->ops->port_to_netdev(ocelot, port); in ocelot_port_get_eth_mac_stats()
784 static void ocelot_port_phy_stats_cb(struct ocelot *ocelot, int port, void *priv) in ocelot_port_phy_stats_cb() argument
786 u64 *s = &ocelot->stats[port * OCELOT_NUM_STATS]; in ocelot_port_phy_stats_cb()
792 static void ocelot_port_pmac_phy_stats_cb(struct ocelot *ocelot, int port, in ocelot_port_pmac_phy_stats_cb() argument
795 u64 *s = &ocelot->stats[port * OCELOT_NUM_STATS]; in ocelot_port_pmac_phy_stats_cb()
801 void ocelot_port_get_eth_phy_stats(struct ocelot *ocelot, int port, in ocelot_port_get_eth_phy_stats() argument
808 ocelot_port_stats_run(ocelot, port, phy_stats, in ocelot_port_get_eth_phy_stats()
812 if (ocelot->mm_supported) in ocelot_port_get_eth_phy_stats()
813 ocelot_port_stats_run(ocelot, port, phy_stats, in ocelot_port_get_eth_phy_stats()
817 dev = ocelot->ops->port_to_netdev(ocelot, port); in ocelot_port_get_eth_phy_stats()
824 void ocelot_port_get_stats64(struct ocelot *ocelot, int port, in ocelot_port_get_stats64() argument
827 u64 *s = &ocelot->stats[port * OCELOT_NUM_STATS]; in ocelot_port_get_stats64()
829 spin_lock(&ocelot->stats_lock); in ocelot_port_get_stats64()
885 spin_unlock(&ocelot->stats_lock); in ocelot_port_get_stats64()
889 static int ocelot_prepare_stats_regions(struct ocelot *ocelot) in ocelot_prepare_stats_regions() argument
896 INIT_LIST_HEAD(&ocelot->stats_regions); in ocelot_prepare_stats_regions()
898 layout = ocelot_get_stats_layout(ocelot); in ocelot_prepare_stats_regions()
909 WARN(ocelot->map[SYS][last & REG_MASK] >= ocelot->map[SYS][layout[i].reg & REG_MASK], in ocelot_prepare_stats_regions()
911 last, ocelot->map[SYS][last & REG_MASK], in ocelot_prepare_stats_regions()
912 layout[i].reg, ocelot->map[SYS][layout[i].reg & REG_MASK]); in ocelot_prepare_stats_regions()
915 if (region && ocelot->map[SYS][layout[i].reg & REG_MASK] == in ocelot_prepare_stats_regions()
916 ocelot->map[SYS][last & REG_MASK] + 4) { in ocelot_prepare_stats_regions()
919 region = devm_kzalloc(ocelot->dev, sizeof(*region), in ocelot_prepare_stats_regions()
927 list_add_tail(&region->node, &ocelot->stats_regions); in ocelot_prepare_stats_regions()
933 list_for_each_entry(region, &ocelot->stats_regions, node) { in ocelot_prepare_stats_regions()
937 ocelot_reg_to_target_addr(ocelot, region->base, &target, in ocelot_prepare_stats_regions()
940 dev_dbg(ocelot->dev, in ocelot_prepare_stats_regions()
943 region->buf = devm_kcalloc(ocelot->dev, region->count, in ocelot_prepare_stats_regions()
952 int ocelot_stats_init(struct ocelot *ocelot) in ocelot_stats_init() argument
957 ocelot->stats = devm_kcalloc(ocelot->dev, in ocelot_stats_init()
958 ocelot->num_phys_ports * OCELOT_NUM_STATS, in ocelot_stats_init()
960 if (!ocelot->stats) in ocelot_stats_init()
964 dev_name(ocelot->dev)); in ocelot_stats_init()
965 ocelot->stats_queue = create_singlethread_workqueue(queue_name); in ocelot_stats_init()
966 if (!ocelot->stats_queue) in ocelot_stats_init()
969 spin_lock_init(&ocelot->stats_lock); in ocelot_stats_init()
970 mutex_init(&ocelot->stat_view_lock); in ocelot_stats_init()
972 ret = ocelot_prepare_stats_regions(ocelot); in ocelot_stats_init()
974 destroy_workqueue(ocelot->stats_queue); in ocelot_stats_init()
978 INIT_DELAYED_WORK(&ocelot->stats_work, ocelot_check_stats_work); in ocelot_stats_init()
979 queue_delayed_work(ocelot->stats_queue, &ocelot->stats_work, in ocelot_stats_init()
985 void ocelot_stats_deinit(struct ocelot *ocelot) in ocelot_stats_deinit() argument
987 cancel_delayed_work(&ocelot->stats_work); in ocelot_stats_deinit()
988 destroy_workqueue(ocelot->stats_queue); in ocelot_stats_deinit()