Lines Matching +full:ocelot +full:- +full:1
1 // SPDX-License-Identifier: (GPL-2.0 OR MIT)
2 /* Statistics for Ocelot switch family
11 #include "ocelot.h"
152 /* 32-bit counter checked for wraparound by ocelot_port_update_stats()
153 * and copied to ocelot->stats.
157 /* Same as above, except also exported to ethtool -S. Standard counters should
312 ocelot_get_stats_layout(struct ocelot *ocelot) in ocelot_get_stats_layout() argument
314 if (ocelot->mm_supported) in ocelot_get_stats_layout()
320 /* Read the counters from hardware and keep them in region->buf.
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()
333 region->count); 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()
350 unsigned int idx = port * OCELOT_NUM_STATS + region->first_stat; in ocelot_port_transfer_stats()
352 for (j = 0; j < region->count; j++) { in ocelot_port_transfer_stats()
353 u64 *stat = &ocelot->stats[idx + j]; in ocelot_port_transfer_stats()
354 u64 val = region->buf[j]; in ocelot_port_transfer_stats()
357 *stat += (u64)1 << 32; 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
449 return -EOPNOTSUPP; in ocelot_get_sset_count()
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()
492 pause_stats->tx_pause_frames = s[OCELOT_STAT_TX_PAUSE]; in ocelot_port_pause_stats_cb()
493 pause_stats->rx_pause_frames = s[OCELOT_STAT_RX_PAUSE]; 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()
502 pause_stats->tx_pause_frames = s[OCELOT_STAT_TX_PMAC_PAUSE]; in ocelot_port_pmac_pause_stats_cb()
503 pause_stats->rx_pause_frames = s[OCELOT_STAT_RX_PMAC_PAUSE]; 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()
512 stats->MACMergeFrameAssErrorCount = s[OCELOT_STAT_RX_ASSEMBLY_ERRS]; in ocelot_port_mm_stats_cb()
513 stats->MACMergeFrameSmdErrorCount = s[OCELOT_STAT_RX_SMD_ERRS]; in ocelot_port_mm_stats_cb()
514 stats->MACMergeFrameAssOkCount = s[OCELOT_STAT_RX_ASSEMBLY_OK]; in ocelot_port_mm_stats_cb()
515 stats->MACMergeFragCountRx = s[OCELOT_STAT_RX_MERGE_FRAGMENTS]; in ocelot_port_mm_stats_cb()
516 stats->MACMergeFragCountTx = s[OCELOT_STAT_TX_MERGE_FRAGMENTS]; in ocelot_port_mm_stats_cb()
517 stats->MACMergeHoldCount = s[OCELOT_STAT_TX_MM_HOLD]; 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
525 switch (pause_stats->src) { in ocelot_port_get_pause_stats()
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()
569 rmon_stats->undersize_pkts = s[OCELOT_STAT_RX_SHORTS]; in ocelot_port_rmon_stats_cb()
570 rmon_stats->oversize_pkts = s[OCELOT_STAT_RX_LONGS]; in ocelot_port_rmon_stats_cb()
571 rmon_stats->fragments = s[OCELOT_STAT_RX_FRAGMENTS]; in ocelot_port_rmon_stats_cb()
572 rmon_stats->jabbers = s[OCELOT_STAT_RX_JABBERS]; in ocelot_port_rmon_stats_cb()
574 rmon_stats->hist[0] = s[OCELOT_STAT_RX_64]; in ocelot_port_rmon_stats_cb()
575 rmon_stats->hist[1] = s[OCELOT_STAT_RX_65_127]; in ocelot_port_rmon_stats_cb()
576 rmon_stats->hist[2] = s[OCELOT_STAT_RX_128_255]; in ocelot_port_rmon_stats_cb()
577 rmon_stats->hist[3] = s[OCELOT_STAT_RX_256_511]; in ocelot_port_rmon_stats_cb()
578 rmon_stats->hist[4] = s[OCELOT_STAT_RX_512_1023]; in ocelot_port_rmon_stats_cb()
579 rmon_stats->hist[5] = s[OCELOT_STAT_RX_1024_1526]; in ocelot_port_rmon_stats_cb()
580 rmon_stats->hist[6] = s[OCELOT_STAT_RX_1527_MAX]; in ocelot_port_rmon_stats_cb()
582 rmon_stats->hist_tx[0] = s[OCELOT_STAT_TX_64]; in ocelot_port_rmon_stats_cb()
583 rmon_stats->hist_tx[1] = s[OCELOT_STAT_TX_65_127]; in ocelot_port_rmon_stats_cb()
584 rmon_stats->hist_tx[2] = s[OCELOT_STAT_TX_128_255]; in ocelot_port_rmon_stats_cb()
585 rmon_stats->hist_tx[3] = s[OCELOT_STAT_TX_256_511]; in ocelot_port_rmon_stats_cb()
586 rmon_stats->hist_tx[4] = s[OCELOT_STAT_TX_512_1023]; in ocelot_port_rmon_stats_cb()
587 rmon_stats->hist_tx[5] = s[OCELOT_STAT_TX_1024_1526]; in ocelot_port_rmon_stats_cb()
588 rmon_stats->hist_tx[6] = s[OCELOT_STAT_TX_1527_MAX]; 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()
597 rmon_stats->undersize_pkts = s[OCELOT_STAT_RX_PMAC_SHORTS]; in ocelot_port_pmac_rmon_stats_cb()
598 rmon_stats->oversize_pkts = s[OCELOT_STAT_RX_PMAC_LONGS]; in ocelot_port_pmac_rmon_stats_cb()
599 rmon_stats->fragments = s[OCELOT_STAT_RX_PMAC_FRAGMENTS]; in ocelot_port_pmac_rmon_stats_cb()
600 rmon_stats->jabbers = s[OCELOT_STAT_RX_PMAC_JABBERS]; in ocelot_port_pmac_rmon_stats_cb()
602 rmon_stats->hist[0] = s[OCELOT_STAT_RX_PMAC_64]; in ocelot_port_pmac_rmon_stats_cb()
603 rmon_stats->hist[1] = s[OCELOT_STAT_RX_PMAC_65_127]; in ocelot_port_pmac_rmon_stats_cb()
604 rmon_stats->hist[2] = s[OCELOT_STAT_RX_PMAC_128_255]; in ocelot_port_pmac_rmon_stats_cb()
605 rmon_stats->hist[3] = s[OCELOT_STAT_RX_PMAC_256_511]; in ocelot_port_pmac_rmon_stats_cb()
606 rmon_stats->hist[4] = s[OCELOT_STAT_RX_PMAC_512_1023]; in ocelot_port_pmac_rmon_stats_cb()
607 rmon_stats->hist[5] = s[OCELOT_STAT_RX_PMAC_1024_1526]; in ocelot_port_pmac_rmon_stats_cb()
608 rmon_stats->hist[6] = s[OCELOT_STAT_RX_PMAC_1527_MAX]; in ocelot_port_pmac_rmon_stats_cb()
610 rmon_stats->hist_tx[0] = s[OCELOT_STAT_TX_PMAC_64]; in ocelot_port_pmac_rmon_stats_cb()
611 rmon_stats->hist_tx[1] = s[OCELOT_STAT_TX_PMAC_65_127]; in ocelot_port_pmac_rmon_stats_cb()
612 rmon_stats->hist_tx[2] = s[OCELOT_STAT_TX_PMAC_128_255]; in ocelot_port_pmac_rmon_stats_cb()
613 rmon_stats->hist_tx[3] = s[OCELOT_STAT_TX_PMAC_256_511]; in ocelot_port_pmac_rmon_stats_cb()
614 rmon_stats->hist_tx[4] = s[OCELOT_STAT_TX_PMAC_512_1023]; in ocelot_port_pmac_rmon_stats_cb()
615 rmon_stats->hist_tx[5] = s[OCELOT_STAT_TX_PMAC_1024_1526]; in ocelot_port_pmac_rmon_stats_cb()
616 rmon_stats->hist_tx[6] = s[OCELOT_STAT_TX_PMAC_1527_MAX]; 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
627 switch (rmon_stats->src) { in ocelot_port_get_rmon_stats()
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()
650 ctrl_stats->MACControlFramesReceived = s[OCELOT_STAT_RX_CONTROL]; 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()
659 ctrl_stats->MACControlFramesReceived = s[OCELOT_STAT_RX_PMAC_CONTROL]; 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
667 switch (ctrl_stats->src) { in ocelot_port_get_eth_ctrl_stats()
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()
690 mac_stats->OctetsTransmittedOK = s[OCELOT_STAT_TX_OCTETS]; in ocelot_port_mac_stats_cb()
691 mac_stats->FramesTransmittedOK = s[OCELOT_STAT_TX_64] + in ocelot_port_mac_stats_cb()
698 mac_stats->OctetsReceivedOK = s[OCELOT_STAT_RX_OCTETS]; in ocelot_port_mac_stats_cb()
699 mac_stats->FramesReceivedOK = s[OCELOT_STAT_RX_GREEN_PRIO_0] + in ocelot_port_mac_stats_cb()
715 mac_stats->MulticastFramesXmittedOK = s[OCELOT_STAT_TX_MULTICAST]; in ocelot_port_mac_stats_cb()
716 mac_stats->BroadcastFramesXmittedOK = s[OCELOT_STAT_TX_BROADCAST]; in ocelot_port_mac_stats_cb()
717 mac_stats->MulticastFramesReceivedOK = s[OCELOT_STAT_RX_MULTICAST]; in ocelot_port_mac_stats_cb()
718 mac_stats->BroadcastFramesReceivedOK = s[OCELOT_STAT_RX_BROADCAST]; in ocelot_port_mac_stats_cb()
719 mac_stats->FrameTooLongErrors = s[OCELOT_STAT_RX_LONGS]; in ocelot_port_mac_stats_cb()
723 mac_stats->FrameCheckSequenceErrors = s[OCELOT_STAT_RX_CRC_ALIGN_ERRS]; in ocelot_port_mac_stats_cb()
724 mac_stats->AlignmentErrors = s[OCELOT_STAT_RX_CRC_ALIGN_ERRS]; 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()
733 mac_stats->OctetsTransmittedOK = s[OCELOT_STAT_TX_PMAC_OCTETS]; in ocelot_port_pmac_mac_stats_cb()
734 mac_stats->FramesTransmittedOK = s[OCELOT_STAT_TX_PMAC_64] + in ocelot_port_pmac_mac_stats_cb()
741 mac_stats->OctetsReceivedOK = s[OCELOT_STAT_RX_PMAC_OCTETS]; in ocelot_port_pmac_mac_stats_cb()
742 mac_stats->FramesReceivedOK = s[OCELOT_STAT_RX_PMAC_64] + in ocelot_port_pmac_mac_stats_cb()
749 mac_stats->MulticastFramesXmittedOK = s[OCELOT_STAT_TX_PMAC_MULTICAST]; in ocelot_port_pmac_mac_stats_cb()
750 mac_stats->BroadcastFramesXmittedOK = s[OCELOT_STAT_TX_PMAC_BROADCAST]; in ocelot_port_pmac_mac_stats_cb()
751 mac_stats->MulticastFramesReceivedOK = s[OCELOT_STAT_RX_PMAC_MULTICAST]; in ocelot_port_pmac_mac_stats_cb()
752 mac_stats->BroadcastFramesReceivedOK = s[OCELOT_STAT_RX_PMAC_BROADCAST]; in ocelot_port_pmac_mac_stats_cb()
753 mac_stats->FrameTooLongErrors = s[OCELOT_STAT_RX_PMAC_LONGS]; in ocelot_port_pmac_mac_stats_cb()
757 mac_stats->FrameCheckSequenceErrors = s[OCELOT_STAT_RX_PMAC_CRC_ALIGN_ERRS]; in ocelot_port_pmac_mac_stats_cb()
758 mac_stats->AlignmentErrors = s[OCELOT_STAT_RX_PMAC_CRC_ALIGN_ERRS]; 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
766 switch (mac_stats->src) { in ocelot_port_get_eth_mac_stats()
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()
789 phy_stats->SymbolErrorDuringCarrier = s[OCELOT_STAT_RX_SYM_ERRS]; 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()
798 phy_stats->SymbolErrorDuringCarrier = s[OCELOT_STAT_RX_PMAC_SYM_ERRS]; 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
806 switch (phy_stats->src) { in ocelot_port_get_eth_phy_stats()
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()
832 stats->rx_bytes = s[OCELOT_STAT_RX_OCTETS]; in ocelot_port_get_stats64()
833 stats->rx_packets = s[OCELOT_STAT_RX_SHORTS] + in ocelot_port_get_stats64()
844 stats->multicast = s[OCELOT_STAT_RX_MULTICAST]; in ocelot_port_get_stats64()
845 stats->rx_missed_errors = s[OCELOT_STAT_DROP_TAIL]; in ocelot_port_get_stats64()
846 stats->rx_dropped = s[OCELOT_STAT_RX_RED_PRIO_0] + in ocelot_port_get_stats64()
873 stats->tx_bytes = s[OCELOT_STAT_TX_OCTETS]; in ocelot_port_get_stats64()
874 stats->tx_packets = s[OCELOT_STAT_TX_64] + in ocelot_port_get_stats64()
881 stats->tx_dropped = s[OCELOT_STAT_TX_DROPS] + in ocelot_port_get_stats64()
883 stats->collisions = s[OCELOT_STAT_TX_COLLISION]; 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()
917 region->count++; in ocelot_prepare_stats_regions()
919 region = devm_kzalloc(ocelot->dev, sizeof(*region), in ocelot_prepare_stats_regions()
922 return -ENOMEM; in ocelot_prepare_stats_regions()
924 region->base = layout[i].reg; in ocelot_prepare_stats_regions()
925 region->first_stat = i; in ocelot_prepare_stats_regions()
926 region->count = 1; in ocelot_prepare_stats_regions()
927 list_add_tail(®ion->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()
942 region->count, addr / 4); in ocelot_prepare_stats_regions()
943 region->buf = devm_kcalloc(ocelot->dev, region->count, in ocelot_prepare_stats_regions()
944 sizeof(*region->buf), GFP_KERNEL); in ocelot_prepare_stats_regions()
945 if (!region->buf) in ocelot_prepare_stats_regions()
946 return -ENOMEM; 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()
961 return -ENOMEM; in ocelot_stats_init()
963 snprintf(queue_name, sizeof(queue_name), "%s-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()
967 return -ENOMEM; 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()