Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

net: fman_memac: report structured ethtool counters

The FMan driver has support for 2 MACs: mEMAC (newer, present on
Layerscape and PowerPC T series) and dTSEC/TGEC (older, present on
PowerPC P series). I only have handy access to the mEMAC, and this adds
support for MAC counters for those platforms.

MAC counters are necessary for any kind of low-level debugging, and
currently there is no mechanism to dump them.

Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Link: https://patch.msgid.link/20251122115931.151719-1-vladimir.oltean@nxp.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

authored by

Vladimir Oltean and committed by
Jakub Kicinski
37a96c20 7241d80e

+146
+45
drivers/net/ethernet/freescale/dpaa/dpaa_ethtool.c
··· 467 467 return res; 468 468 } 469 469 470 + static void dpaa_get_pause_stats(struct net_device *net_dev, 471 + struct ethtool_pause_stats *s) 472 + { 473 + struct dpaa_priv *priv = netdev_priv(net_dev); 474 + struct mac_device *mac_dev = priv->mac_dev; 475 + 476 + if (mac_dev->get_pause_stats) 477 + mac_dev->get_pause_stats(mac_dev->fman_mac, s); 478 + } 479 + 480 + static void dpaa_get_rmon_stats(struct net_device *net_dev, 481 + struct ethtool_rmon_stats *s, 482 + const struct ethtool_rmon_hist_range **ranges) 483 + { 484 + struct dpaa_priv *priv = netdev_priv(net_dev); 485 + struct mac_device *mac_dev = priv->mac_dev; 486 + 487 + if (mac_dev->get_rmon_stats) 488 + mac_dev->get_rmon_stats(mac_dev->fman_mac, s, ranges); 489 + } 490 + 491 + static void dpaa_get_eth_ctrl_stats(struct net_device *net_dev, 492 + struct ethtool_eth_ctrl_stats *s) 493 + { 494 + struct dpaa_priv *priv = netdev_priv(net_dev); 495 + struct mac_device *mac_dev = priv->mac_dev; 496 + 497 + if (mac_dev->get_eth_ctrl_stats) 498 + mac_dev->get_eth_ctrl_stats(mac_dev->fman_mac, s); 499 + } 500 + 501 + static void dpaa_get_eth_mac_stats(struct net_device *net_dev, 502 + struct ethtool_eth_mac_stats *s) 503 + { 504 + struct dpaa_priv *priv = netdev_priv(net_dev); 505 + struct mac_device *mac_dev = priv->mac_dev; 506 + 507 + if (mac_dev->get_eth_mac_stats) 508 + mac_dev->get_eth_mac_stats(mac_dev->fman_mac, s); 509 + } 510 + 470 511 const struct ethtool_ops dpaa_ethtool_ops = { 471 512 .supported_coalesce_params = ETHTOOL_COALESCE_RX_USECS | 472 513 ETHTOOL_COALESCE_RX_MAX_FRAMES, ··· 528 487 .get_ts_info = dpaa_get_ts_info, 529 488 .get_coalesce = dpaa_get_coalesce, 530 489 .set_coalesce = dpaa_set_coalesce, 490 + .get_pause_stats = dpaa_get_pause_stats, 491 + .get_rmon_stats = dpaa_get_rmon_stats, 492 + .get_eth_ctrl_stats = dpaa_get_eth_ctrl_stats, 493 + .get_eth_mac_stats = dpaa_get_eth_mac_stats, 531 494 };
+87
drivers/net/ethernet/freescale/fman/fman_memac.c
··· 900 900 return 0; 901 901 } 902 902 903 + static u64 memac_read64(void __iomem *reg) 904 + { 905 + u32 low, high, tmp; 906 + 907 + do { 908 + high = ioread32be(reg + 4); 909 + low = ioread32be(reg); 910 + tmp = ioread32be(reg + 4); 911 + } while (high != tmp); 912 + 913 + return ((u64)high << 32) | low; 914 + } 915 + 916 + static void memac_get_pause_stats(struct fman_mac *memac, 917 + struct ethtool_pause_stats *s) 918 + { 919 + s->tx_pause_frames = memac_read64(&memac->regs->txpf_l); 920 + s->rx_pause_frames = memac_read64(&memac->regs->rxpf_l); 921 + } 922 + 923 + static const struct ethtool_rmon_hist_range memac_rmon_ranges[] = { 924 + { 64, 64 }, 925 + { 65, 127 }, 926 + { 128, 255 }, 927 + { 256, 511 }, 928 + { 512, 1023 }, 929 + { 1024, 1518 }, 930 + { 1519, 9600 }, 931 + {}, 932 + }; 933 + 934 + static void memac_get_rmon_stats(struct fman_mac *memac, 935 + struct ethtool_rmon_stats *s, 936 + const struct ethtool_rmon_hist_range **ranges) 937 + { 938 + s->undersize_pkts = memac_read64(&memac->regs->rund_l); 939 + s->oversize_pkts = memac_read64(&memac->regs->rovr_l); 940 + s->fragments = memac_read64(&memac->regs->rfrg_l); 941 + s->jabbers = memac_read64(&memac->regs->rjbr_l); 942 + 943 + s->hist[0] = memac_read64(&memac->regs->r64_l); 944 + s->hist[1] = memac_read64(&memac->regs->r127_l); 945 + s->hist[2] = memac_read64(&memac->regs->r255_l); 946 + s->hist[3] = memac_read64(&memac->regs->r511_l); 947 + s->hist[4] = memac_read64(&memac->regs->r1023_l); 948 + s->hist[5] = memac_read64(&memac->regs->r1518_l); 949 + s->hist[6] = memac_read64(&memac->regs->r1519x_l); 950 + 951 + s->hist_tx[0] = memac_read64(&memac->regs->t64_l); 952 + s->hist_tx[1] = memac_read64(&memac->regs->t127_l); 953 + s->hist_tx[2] = memac_read64(&memac->regs->t255_l); 954 + s->hist_tx[3] = memac_read64(&memac->regs->t511_l); 955 + s->hist_tx[4] = memac_read64(&memac->regs->t1023_l); 956 + s->hist_tx[5] = memac_read64(&memac->regs->t1518_l); 957 + s->hist_tx[6] = memac_read64(&memac->regs->t1519x_l); 958 + 959 + *ranges = memac_rmon_ranges; 960 + } 961 + 962 + static void memac_get_eth_ctrl_stats(struct fman_mac *memac, 963 + struct ethtool_eth_ctrl_stats *s) 964 + { 965 + s->MACControlFramesTransmitted = memac_read64(&memac->regs->tcnp_l); 966 + s->MACControlFramesReceived = memac_read64(&memac->regs->rcnp_l); 967 + } 968 + 969 + static void memac_get_eth_mac_stats(struct fman_mac *memac, 970 + struct ethtool_eth_mac_stats *s) 971 + { 972 + s->FramesTransmittedOK = memac_read64(&memac->regs->tfrm_l); 973 + s->FramesReceivedOK = memac_read64(&memac->regs->rfrm_l); 974 + s->FrameCheckSequenceErrors = memac_read64(&memac->regs->rfcs_l); 975 + s->AlignmentErrors = memac_read64(&memac->regs->raln_l); 976 + s->OctetsTransmittedOK = memac_read64(&memac->regs->teoct_l); 977 + s->FramesLostDueToIntMACXmitError = memac_read64(&memac->regs->terr_l); 978 + s->OctetsReceivedOK = memac_read64(&memac->regs->reoct_l); 979 + s->FramesLostDueToIntMACRcvError = memac_read64(&memac->regs->rdrntp_l); 980 + s->MulticastFramesXmittedOK = memac_read64(&memac->regs->tmca_l); 981 + s->BroadcastFramesXmittedOK = memac_read64(&memac->regs->tbca_l); 982 + s->MulticastFramesReceivedOK = memac_read64(&memac->regs->rmca_l); 983 + s->BroadcastFramesReceivedOK = memac_read64(&memac->regs->rbca_l); 984 + } 985 + 903 986 static int memac_init(struct fman_mac *memac) 904 987 { 905 988 struct memac_cfg *memac_drv_param; ··· 1175 1092 mac_dev->set_tstamp = memac_set_tstamp; 1176 1093 mac_dev->enable = memac_enable; 1177 1094 mac_dev->disable = memac_disable; 1095 + mac_dev->get_pause_stats = memac_get_pause_stats; 1096 + mac_dev->get_rmon_stats = memac_get_rmon_stats; 1097 + mac_dev->get_eth_ctrl_stats = memac_get_eth_ctrl_stats; 1098 + mac_dev->get_eth_mac_stats = memac_get_eth_mac_stats; 1178 1099 1179 1100 mac_dev->fman_mac = memac_config(mac_dev, params); 1180 1101 if (!mac_dev->fman_mac)
+14
drivers/net/ethernet/freescale/fman/mac.h
··· 16 16 #include "fman.h" 17 17 #include "fman_mac.h" 18 18 19 + struct ethtool_eth_ctrl_stats; 20 + struct ethtool_eth_mac_stats; 21 + struct ethtool_pause_stats; 22 + struct ethtool_rmon_stats; 23 + struct ethtool_rmon_hist_range; 19 24 struct fman_mac; 20 25 struct mac_priv_s; 21 26 ··· 51 46 enet_addr_t *eth_addr); 52 47 int (*remove_hash_mac_addr)(struct fman_mac *mac_dev, 53 48 enet_addr_t *eth_addr); 49 + void (*get_pause_stats)(struct fman_mac *memac, 50 + struct ethtool_pause_stats *s); 51 + void (*get_rmon_stats)(struct fman_mac *memac, 52 + struct ethtool_rmon_stats *s, 53 + const struct ethtool_rmon_hist_range **ranges); 54 + void (*get_eth_ctrl_stats)(struct fman_mac *memac, 55 + struct ethtool_eth_ctrl_stats *s); 56 + void (*get_eth_mac_stats)(struct fman_mac *memac, 57 + struct ethtool_eth_mac_stats *s); 54 58 55 59 void (*update_speed)(struct mac_device *mac_dev, int speed); 56 60