From nobody Sat Sep 26 01:39:50 2026 Received: from mail-pl1-f175.google.com (mail-pl1-f175.google.com [209.85.214.175]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id F2BD33C4544 for ; Sun, 6 Sep 2026 13:14:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788700472; cv=none; b=Vr8O2Kt8xQUzVIoUhdeuQ97uprMZqQkYKsiavE1yF9Veqpk4N+uNSt1od5oZLwO2Ek6q8GKwacCyszokumcGsDSjUHJx1vT9WyvTB3RKukcTvdbdOicJNOyhxhhcZDX5zHcFVPCc8vZUpPfWFzIo6cbnCJpF0bzBTlhVrMj9e3U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788700472; c=relaxed/simple; bh=5Ue5J4wvdwmg3xCmIKxESOSyEdVbksmLLx4XYpOlFq0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=nHca5iWCtN4oq7gzmJ5C8TtpVdZ4iPRh0VnvHaIeMGuJGnwpVaZOjTSrveNUHdixegqQ1cI5sMwACzjnUIAkJSHty4WtHs/n6c9hNPH+nzOqixho1p87ic0uPmuSgZ13/o6MmmQ+Sygn10nH4NS8O34IFxlL7hrBQoiUo6r+fXY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=KBNqjHhx; arc=none smtp.client-ip=209.85.214.175 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="KBNqjHhx" Received: by mail-pl1-f175.google.com with SMTP id d9443c01a7336-2d560775ca2so18384645ad.1 for ; Sun, 06 Sep 2026 06:14:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788700470; x=1789305270; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=iXCbtCROcfidG6D2f2XjEN8/M12v+19c6nPqKarGz8g=; b=KBNqjHhxGt+RD7EzHoV6yW1UEE3JMZHefpyfaF0c16ag0iCER5Ix5DMwk4XoXg24af RVslOEQL48d9gPwXCeB5MHnhzsnFjy5ROVtIahPhCMxZWSEDUUjXbxMmOftYAxQoIaVy A4TxWxh/VVP39nXZWpS9jWUm8h4hjaMiXR17yvZ0pL6N/xq2QAVaq6ehT4jIWsb6WDbQ /9LvbcWh0dPOjddk4CLXVSUZoKlSVcsCUxvBZapVfD430awDLfnf/50STmqVhexa/7Hw rfkA4BLfv7jUfpA2udAvraoNVKXPCyvIaJ0yG7ctQYki9bb9cACy5KbO6PUGU8K4CUvZ 85Lg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788700470; x=1789305270; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=iXCbtCROcfidG6D2f2XjEN8/M12v+19c6nPqKarGz8g=; b=THEpj9pT44moR472pxEygccIsIC1Q1dqIEq9BRnln68sSGjlLKZGNks3eea92f/pNi mTp1CHp6KcPgAkayYcPlt81m9ptQJ6yE+hiMmDSYCwFUW0sb/QZgFqB8dJdHIU4/5qXq vJjDtutQNDDi57m4z/kprWUMuwx4yMwTojLG9HmNH+OPjoWLi9uMgvghwA1IAlNyHMpU wRf/D2ULP8lvsbKGpf6yYywOmk6fUhCyF6fXPRrFILEDZxBi+04Z/KMEMpburkIF4UCq /e5qHKaq7e4Dq40vIQ1QJrejLCDVdbeaLu/JCzUW15UtxSuCbbffKG9YcRD6inoatIZB UTug== X-Forwarded-Encrypted: i=1; AKwUvBxJbJB/bQEbl+18MArhlTRUlSZ+AB8XkrfI79KPpVe08wnZfFmuOR78nlVkI7AED3jEqnokINLvvIJclsA=@vger.kernel.org X-Gm-Message-State: AFuF++n82La9xcUE0GDpUKiLxVySUybkW6pcnaFXTX9axvxJkC4bJff0 /2TScgMF0KsJNzGttNglWfw13ATLWzfEmZryfmNU4tBeLyN0RTBLgv+R X-Gm-Gg: AYBFou2M/TOlh5NaHsLy5jgtKXidy8mHR2Hlw9ZwtTLIEZIB/y/vTm9K9L5bvcM6h8o V4NIqcNo1Yn2CRZdgH5Ae3SBik0+jTAqumXxFg+muRVTtcoDu33TLIbBawF8oP5Xex/RRV8AmTd z183voj5LyLkp5h4/+tOVPIooKkpwezQqpB6bwS49XN1IdVCDqiNBGZnvBzhRQfxlLgFGG0k5vw hDMJqhaCAZpJ0iFygdxN+Gx8JL6dUwV1fXiAw0JQdxsV7s4ljO+5Kp9PBdRlHfaZM8t/qRZW14e o+6I7JdTo01Ev5H7eDJW1UHY97rKcoe9Hf25yNEoZeS1rCeDJPndfiN4zDbgS/MiVr8m5pEhf/N Oj9UEVdnhSRY6QQdt6AQGMBo4CZQ8sIRD9ZfDNcoMFP8wlU6klEsdamgPPrZ5GnZ/oRfpiPKYHk KcojyhEgh2yiIjzQ4ZppAEOSM7FosQRFninTe7awHCYSGMAfkxdf3B1cJUvTJNTTkBTgsKqU9KU 40DFlOlncAmXQ== X-Received: by 2002:a17:903:40c9:b0:2d6:f6ba:263d with SMTP id d9443c01a7336-2db124b451cmr242694065ad.7.1788700470234; Sun, 06 Sep 2026 06:14:30 -0700 (PDT) Received: from d.home.yangfl.dn42 ([2a09:bac1:76a0:d30::4d0:7b]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2db1495b2f8sm32259965ad.21.2026.09.06.06.14.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 06 Sep 2026 06:14:29 -0700 (PDT) From: David Yang To: netdev@vger.kernel.org Cc: David Yang , Andrew Lunn , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Russell King , linux-kernel@vger.kernel.org Subject: [PATCH net-next v3 1/6] net: dsa: motorcomm: Rename MIB stuffs Date: Sun, 6 Sep 2026 21:14:06 +0800 Message-ID: <20260906131414.2683362-2-mmyangfl@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260906131414.2683362-1-mmyangfl@gmail.com> References: <20260906131414.2683362-1-mmyangfl@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Rename them in preparation of major MIB refactor. Signed-off-by: David Yang --- drivers/net/dsa/motorcomm/chip.c | 32 ++++++++++++++++---------------- drivers/net/dsa/motorcomm/chip.h | 4 ++-- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/drivers/net/dsa/motorcomm/chip.c b/drivers/net/dsa/motorcomm/c= hip.c index d663af010f43..ad5fe1ccb1d7 100644 --- a/drivers/net/dsa/motorcomm/chip.c +++ b/drivers/net/dsa/motorcomm/chip.c @@ -545,11 +545,11 @@ yt921x_mbus_ext_init(struct yt921x_priv *priv, struct= device_node *mnp) } =20 /* Read and handle overflow of 32bit MIBs. MIB buffer must be zeroed befor= e. */ -static int yt921x_read_mib(struct yt921x_priv *priv, int port) +static int yt921x_mib_read(struct yt921x_priv *priv, int port) { struct yt921x_port *pp =3D &priv->ports[port]; struct device *dev =3D to_device(priv); - struct yt921x_mib *mib =3D &pp->mib; + struct yt921x_mib_stats *mib =3D &pp->mib; int res =3D 0; =20 /* Reading of yt921x_port::mib is not protected by a lock and it's vain @@ -604,7 +604,7 @@ static int yt921x_read_mib(struct yt921x_priv *priv, in= t port) return res; } =20 -static void yt921x_poll_mib(struct work_struct *work) +static void yt921x_mib_poll(struct work_struct *work) { struct yt921x_port *pp =3D container_of_const(work, struct yt921x_port, mib_read.work); @@ -615,7 +615,7 @@ static void yt921x_poll_mib(struct work_struct *work) int res; =20 mutex_lock(&priv->reg_lock); - res =3D yt921x_read_mib(priv, port); + res =3D yt921x_mib_read(priv, port); mutex_unlock(&priv->reg_lock); if (res) delay *=3D 4; @@ -643,11 +643,11 @@ yt921x_dsa_get_ethtool_stats(struct dsa_switch *ds, i= nt port, uint64_t *data) { struct yt921x_priv *priv =3D to_yt921x_priv(ds); struct yt921x_port *pp =3D &priv->ports[port]; - struct yt921x_mib *mib =3D &pp->mib; + struct yt921x_mib_stats *mib =3D &pp->mib; size_t j; =20 mutex_lock(&priv->reg_lock); - yt921x_read_mib(priv, port); + yt921x_mib_read(priv, port); mutex_unlock(&priv->reg_lock); =20 j =3D 0; @@ -685,10 +685,10 @@ yt921x_dsa_get_eth_mac_stats(struct dsa_switch *ds, i= nt port, { struct yt921x_priv *priv =3D to_yt921x_priv(ds); struct yt921x_port *pp =3D &priv->ports[port]; - struct yt921x_mib *mib =3D &pp->mib; + struct yt921x_mib_stats *mib =3D &pp->mib; =20 mutex_lock(&priv->reg_lock); - yt921x_read_mib(priv, port); + yt921x_mib_read(priv, port); mutex_unlock(&priv->reg_lock); =20 mac_stats->FramesTransmittedOK =3D pp->tx_frames; @@ -721,10 +721,10 @@ yt921x_dsa_get_eth_ctrl_stats(struct dsa_switch *ds, = int port, { struct yt921x_priv *priv =3D to_yt921x_priv(ds); struct yt921x_port *pp =3D &priv->ports[port]; - struct yt921x_mib *mib =3D &pp->mib; + struct yt921x_mib_stats *mib =3D &pp->mib; =20 mutex_lock(&priv->reg_lock); - yt921x_read_mib(priv, port); + yt921x_mib_read(priv, port); mutex_unlock(&priv->reg_lock); =20 ctrl_stats->MACControlFramesTransmitted =3D mib->tx_pause; @@ -750,10 +750,10 @@ yt921x_dsa_get_rmon_stats(struct dsa_switch *ds, int = port, { struct yt921x_priv *priv =3D to_yt921x_priv(ds); struct yt921x_port *pp =3D &priv->ports[port]; - struct yt921x_mib *mib =3D &pp->mib; + struct yt921x_mib_stats *mib =3D &pp->mib; =20 mutex_lock(&priv->reg_lock); - yt921x_read_mib(priv, port); + yt921x_mib_read(priv, port); mutex_unlock(&priv->reg_lock); =20 *ranges =3D yt921x_rmon_ranges; @@ -786,7 +786,7 @@ yt921x_dsa_get_stats64(struct dsa_switch *ds, int port, { struct yt921x_priv *priv =3D to_yt921x_priv(ds); struct yt921x_port *pp =3D &priv->ports[port]; - struct yt921x_mib *mib =3D &pp->mib; + struct yt921x_mib_stats *mib =3D &pp->mib; =20 stats->rx_length_errors =3D mib->rx_undersize_errors + mib->rx_fragment_errors; @@ -822,10 +822,10 @@ yt921x_dsa_get_pause_stats(struct dsa_switch *ds, int= port, { struct yt921x_priv *priv =3D to_yt921x_priv(ds); struct yt921x_port *pp =3D &priv->ports[port]; - struct yt921x_mib *mib =3D &pp->mib; + struct yt921x_mib_stats *mib =3D &pp->mib; =20 mutex_lock(&priv->reg_lock); - yt921x_read_mib(priv, port); + yt921x_mib_read(priv, port); mutex_unlock(&priv->reg_lock); =20 pause_stats->tx_pause_frames =3D mib->tx_pause; @@ -4749,7 +4749,7 @@ static int yt921x_mdio_probe(struct mdio_device *mdio= dev) struct yt921x_port *pp =3D &priv->ports[i]; =20 pp->index =3D i; - INIT_DELAYED_WORK(&pp->mib_read, yt921x_poll_mib); + INIT_DELAYED_WORK(&pp->mib_read, yt921x_mib_poll); } =20 ds =3D &priv->ds; diff --git a/drivers/net/dsa/motorcomm/chip.h b/drivers/net/dsa/motorcomm/c= hip.h index 83cd454955dd..805febb48683 100644 --- a/drivers/net/dsa/motorcomm/chip.h +++ b/drivers/net/dsa/motorcomm/chip.h @@ -861,7 +861,7 @@ enum yt921x_fdb_entry_status { #define yt921x_port_is_internal(port) ((port) < 8) #define yt921x_port_is_external(port) ((port) =3D=3D 8 || (port) =3D=3D 9) =20 -struct yt921x_mib { +struct yt921x_mib_stats { u64 rx_broadcast; u64 rx_pause; u64 rx_multicast; @@ -940,7 +940,7 @@ struct yt921x_port { bool isolated; =20 struct delayed_work mib_read; - struct yt921x_mib mib; + struct yt921x_mib_stats mib; u64 rx_frames; u64 tx_frames; =20 --=20 2.53.0 From nobody Sat Sep 26 01:39:50 2026 Received: from mail-pl1-f173.google.com (mail-pl1-f173.google.com [209.85.214.173]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8DB552F39B5 for ; Sun, 6 Sep 2026 13:14:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788700476; cv=none; b=Ww4CnmAqkhIDPOdrkQIMYjxsZUZhySHEi7f/DVGhCi+brzyZbTKv8OdEFJEJuBh7h6NlcrfT/jGfXbQpQsJfhTHPaACA5jsgaJu8bRLcZmJnYZQ5t9dJqI+ys9sUlG3y2kJmpI4xPrN6JKR5+no86f8KPSoQ5FYdayTg9WO/f8E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788700476; c=relaxed/simple; bh=mDuuG8QPs0tjtvTNVEV6Zqj47CC19id0dGC8TfD7gcc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=BdwdrC2tQtSnhV2IVqa4jsO6Dl1Jplz7LUBrPNGquNISt5jKK/5dkbOfEvQHkCbfi2viVJNdthvTUfg1C9GNKYt9JEw0ba0vfIvVLS3G2yapYTBKn5uc8JbeF1f3kOjfqKzGXEJ7ExwnvvjsyDePz46nST/QH6FHyUBKt87A8FU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=QV7Tzuy6; arc=none smtp.client-ip=209.85.214.173 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="QV7Tzuy6" Received: by mail-pl1-f173.google.com with SMTP id d9443c01a7336-2d9004f39d3so32365505ad.2 for ; Sun, 06 Sep 2026 06:14:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788700474; x=1789305274; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=sLOlJMtfrETY3822qdYZg30BkO/eK1Yw5q64p9t9ZVs=; b=QV7Tzuy60FoChJJ62iepWrpjhwPpMH4+FicgT78eA1iLSgnKoQGs+oXjS5j0LPWqw5 ygMiLg39sg/WFK184LvFf3jhYeE8kp3RXOf1nJfsMaeI/H8jVhNyw9JTec5dpRV+weu4 Ot056gllaykn7SsmCK4Wll0y8rfQoyC7fKS22qBDMDqfS0Z14iKgGJOAzAQoQierPCyz FNHtZfEWSGT6fNYeYjM1+ZBI1aIdsMi8lM35GTyRSwCCGi98BVm5Pf01uDI0KT6w8/Of PjbajZerHolRNkzENmKgVlWPkX4qCtloGJVj/bIFDw2EOHMC0hWPoqfQIw+qdpS4RVPO k7qg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788700474; x=1789305274; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=sLOlJMtfrETY3822qdYZg30BkO/eK1Yw5q64p9t9ZVs=; b=b0leKlCqHZVLYALPrBcHYBlL1tImMBHwpaEBYO0/ySXrcCimA6C7RAgHzgXrR5Qd6x qL66SOYt5RCYfDETVa4B6V32WeC1LQqsbTZnVylTjnicQnzNrPTx3zbuT4OkJyMgj8DF lYER/lXhyMGPz2PYc8O777cl+Zxb+Nu1bvXeATPXdbHlo9UzTBMbe7Z6ZMF8FY0dNJXE 4uc9bmg2sB9AgNOuqxVW7w5uLTndg7C1Fy4Vmy180cSgTlxKiUpyBEPAObdH6tNHGuhE jHFQ2KoJidr0HBwbRse30hkLnnyYB9Dhb83Z+eHkCTd5AomWWd7JkbfYbV1dhjVkVpUw CcTg== X-Forwarded-Encrypted: i=1; AKwUvBzZxNc6Qx7kz74BG2A7fuPZx8NkabgdjaOQ82JUZxqujUDNjvupOCeZafw4FAVzpyF+Gb0nUui8OOKl9wA=@vger.kernel.org X-Gm-Message-State: AFuF++mgw+BGJ7elBKxDFz+Zr23AtXJwHm/hi9oFR+cHMWYR1XmI+9TO Z/0uS+WJ/uTGAYJGinbV6wURFmtimxOGvwYi8Vkf1/kr3bovp0nFNLh/ X-Gm-Gg: AYBFou061HBFC145dpAyP5vUJkc6XLTFWp5xekZ3vem687jX96i2qa49qTQY4/iEKIo 8V/Y1BnUVUH6REEUEnOoYjbHtmFuG24QJlLhFTWc8X+Ba/JpHK+YwjCTxdQlYF5I2c55gat5msc VzAA523Aza+n2l380VJdxOqfvtyxpgc396vbbtA9V3oJN3hkTnBBcTpQUkwL8r4SowX5EEsLMBb cyt4IZI433OZdic/v+CIxBkHvL6wqtHpOaawZwyR8g9aW/HcQTpBf422CKqgbm5+k6QYI6L0ge6 ceNjxb+nWrwd8S8w4mHTMuf057kaQifArKxM92e4VPYw2p5rmAPLxnh87f3POzyRMpJPDCmvNRa HgslToOLkfcKrqV/XjMqnwJlGab0ANp4JNFiTxYYPrh66PjYp4sGxSGUetrvqMDSd34nU+k5EXz L22ZGEQZ6JBuvDSm2d3dwqOcRM/KO/W+NJDlF8yiNs2flgjWmlVLG+xuqwxqCcNvA5rkeAGxi6S Xhz1LsQUh0Pyw== X-Received: by 2002:a17:902:fd86:b0:2d6:3c2f:6a5 with SMTP id d9443c01a7336-2db125a342dmr262172625ad.14.1788700473767; Sun, 06 Sep 2026 06:14:33 -0700 (PDT) Received: from d.home.yangfl.dn42 ([2a09:bac1:76a0:d30::4d0:7b]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2db1495b2f8sm32259965ad.21.2026.09.06.06.14.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 06 Sep 2026 06:14:33 -0700 (PDT) From: David Yang To: netdev@vger.kernel.org Cc: David Yang , Andrew Lunn , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Russell King , linux-kernel@vger.kernel.org Subject: [PATCH net-next v3 2/6] net: dsa: motorcomm: Split MIB buffers Date: Sun, 6 Sep 2026 21:14:07 +0800 Message-ID: <20260906131414.2683362-3-mmyangfl@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260906131414.2683362-1-mmyangfl@gmail.com> References: <20260906131414.2683362-1-mmyangfl@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" With MIB improvement introduced later, struct yt921x_priv will be over 20k which is not very good for a single kmalloc(). Dynamically allocate the MIB structures to reduce the size of struct yt921x_priv, and do not waste memory on dummy ports. Signed-off-by: David Yang --- drivers/net/dsa/motorcomm/chip.c | 112 +++++++++++++++++++++++-------- drivers/net/dsa/motorcomm/chip.h | 16 +++-- 2 files changed, 96 insertions(+), 32 deletions(-) diff --git a/drivers/net/dsa/motorcomm/chip.c b/drivers/net/dsa/motorcomm/c= hip.c index ad5fe1ccb1d7..95041a2fb0ec 100644 --- a/drivers/net/dsa/motorcomm/chip.c +++ b/drivers/net/dsa/motorcomm/chip.c @@ -549,9 +549,12 @@ static int yt921x_mib_read(struct yt921x_priv *priv, i= nt port) { struct yt921x_port *pp =3D &priv->ports[port]; struct device *dev =3D to_device(priv); - struct yt921x_mib_stats *mib =3D &pp->mib; + struct yt921x_mib *pm =3D pp->mib; + struct yt921x_mib_stats *mib; int res =3D 0; =20 + mib =3D &pm->stats; + /* Reading of yt921x_port::mib is not protected by a lock and it's vain * to keep its consistency, since we have to read registers one by one * and there is no way to make a snapshot of MIB stats. @@ -589,11 +592,11 @@ static int yt921x_mib_read(struct yt921x_priv *priv, = int port) WRITE_ONCE(*valp, val); } =20 - pp->rx_frames =3D mib->rx_64byte + mib->rx_65_127byte + + pm->rx_frames =3D mib->rx_64byte + mib->rx_65_127byte + mib->rx_128_255byte + mib->rx_256_511byte + mib->rx_512_1023byte + mib->rx_1024_1518byte + mib->rx_jumbo; - pp->tx_frames =3D mib->tx_64byte + mib->tx_65_127byte + + pm->tx_frames =3D mib->tx_64byte + mib->tx_65_127byte + mib->tx_128_255byte + mib->tx_256_511byte + mib->tx_512_1023byte + mib->tx_1024_1518byte + mib->tx_jumbo; @@ -606,10 +609,11 @@ static int yt921x_mib_read(struct yt921x_priv *priv, = int port) =20 static void yt921x_mib_poll(struct work_struct *work) { - struct yt921x_port *pp =3D container_of_const(work, struct yt921x_port, - mib_read.work); - struct yt921x_priv *priv =3D (void *)(pp - pp->index) - - offsetof(struct yt921x_priv, ports); + struct yt921x_mib *pm =3D container_of_const(work, struct yt921x_mib, + work.work); + struct yt921x_port *pp =3D pm->port; + struct yt921x_priv *priv =3D container_of_const(pp, struct yt921x_priv, + ports[pp->index]); unsigned long delay =3D YT921X_STATS_INTERVAL_JIFFIES; int port =3D pp->index; int res; @@ -620,7 +624,7 @@ static void yt921x_mib_poll(struct work_struct *work) if (res) delay *=3D 4; =20 - schedule_delayed_work(&pp->mib_read, delay); + schedule_delayed_work(&pm->work, delay); } =20 static void @@ -643,9 +647,14 @@ yt921x_dsa_get_ethtool_stats(struct dsa_switch *ds, in= t port, uint64_t *data) { struct yt921x_priv *priv =3D to_yt921x_priv(ds); struct yt921x_port *pp =3D &priv->ports[port]; - struct yt921x_mib_stats *mib =3D &pp->mib; + struct yt921x_mib *pm =3D pp->mib; + struct yt921x_mib_stats *mib; size_t j; =20 + if (!pm) + return; + mib =3D &pm->stats; + mutex_lock(&priv->reg_lock); yt921x_mib_read(priv, port); mutex_unlock(&priv->reg_lock); @@ -685,16 +694,21 @@ yt921x_dsa_get_eth_mac_stats(struct dsa_switch *ds, i= nt port, { struct yt921x_priv *priv =3D to_yt921x_priv(ds); struct yt921x_port *pp =3D &priv->ports[port]; - struct yt921x_mib_stats *mib =3D &pp->mib; + struct yt921x_mib *pm =3D pp->mib; + struct yt921x_mib_stats *mib; + + if (!pm) + return; + mib =3D &pm->stats; =20 mutex_lock(&priv->reg_lock); yt921x_mib_read(priv, port); mutex_unlock(&priv->reg_lock); =20 - mac_stats->FramesTransmittedOK =3D pp->tx_frames; + mac_stats->FramesTransmittedOK =3D pm->tx_frames; mac_stats->SingleCollisionFrames =3D mib->tx_single_collisions; mac_stats->MultipleCollisionFrames =3D mib->tx_multiple_collisions; - mac_stats->FramesReceivedOK =3D pp->rx_frames; + mac_stats->FramesReceivedOK =3D pm->rx_frames; mac_stats->FrameCheckSequenceErrors =3D mib->rx_crc_errors; mac_stats->AlignmentErrors =3D mib->rx_alignment_errors; mac_stats->OctetsTransmittedOK =3D mib->tx_good_bytes; @@ -721,7 +735,12 @@ yt921x_dsa_get_eth_ctrl_stats(struct dsa_switch *ds, i= nt port, { struct yt921x_priv *priv =3D to_yt921x_priv(ds); struct yt921x_port *pp =3D &priv->ports[port]; - struct yt921x_mib_stats *mib =3D &pp->mib; + struct yt921x_mib *pm =3D pp->mib; + struct yt921x_mib_stats *mib; + + if (!pm) + return; + mib =3D &pm->stats; =20 mutex_lock(&priv->reg_lock); yt921x_mib_read(priv, port); @@ -750,7 +769,12 @@ yt921x_dsa_get_rmon_stats(struct dsa_switch *ds, int p= ort, { struct yt921x_priv *priv =3D to_yt921x_priv(ds); struct yt921x_port *pp =3D &priv->ports[port]; - struct yt921x_mib_stats *mib =3D &pp->mib; + struct yt921x_mib *pm =3D pp->mib; + struct yt921x_mib_stats *mib; + + if (!pm) + return; + mib =3D &pm->stats; =20 mutex_lock(&priv->reg_lock); yt921x_mib_read(priv, port); @@ -786,7 +810,12 @@ yt921x_dsa_get_stats64(struct dsa_switch *ds, int port, { struct yt921x_priv *priv =3D to_yt921x_priv(ds); struct yt921x_port *pp =3D &priv->ports[port]; - struct yt921x_mib_stats *mib =3D &pp->mib; + struct yt921x_mib *pm =3D pp->mib; + struct yt921x_mib_stats *mib; + + if (!pm) + return; + mib =3D &pm->stats; =20 stats->rx_length_errors =3D mib->rx_undersize_errors + mib->rx_fragment_errors; @@ -802,8 +831,8 @@ yt921x_dsa_get_stats64(struct dsa_switch *ds, int port, /* stats->tx_heartbeat_errors */ stats->tx_window_errors =3D mib->tx_late_collisions; =20 - stats->rx_packets =3D pp->rx_frames; - stats->tx_packets =3D pp->tx_frames; + stats->rx_packets =3D pm->rx_frames; + stats->tx_packets =3D pm->tx_frames; stats->rx_bytes =3D mib->rx_good_bytes - ETH_FCS_LEN * stats->rx_packets; stats->tx_bytes =3D mib->tx_good_bytes - ETH_FCS_LEN * stats->tx_packets; stats->rx_errors =3D stats->rx_length_errors + stats->rx_over_errors + @@ -822,7 +851,12 @@ yt921x_dsa_get_pause_stats(struct dsa_switch *ds, int = port, { struct yt921x_priv *priv =3D to_yt921x_priv(ds); struct yt921x_port *pp =3D &priv->ports[port]; - struct yt921x_mib_stats *mib =3D &pp->mib; + struct yt921x_mib *pm =3D pp->mib; + struct yt921x_mib_stats *mib; + + if (!pm) + return; + mib =3D &pm->stats; =20 mutex_lock(&priv->reg_lock); yt921x_mib_read(priv, port); @@ -3953,11 +3987,14 @@ yt921x_phylink_mac_link_down(struct phylink_config = *config, unsigned int mode, { struct dsa_port *dp =3D dsa_phylink_to_port(config); struct yt921x_priv *priv =3D to_yt921x_priv(dp->ds); + struct yt921x_mib *pm; int port =3D dp->index; int res; =20 /* No need to sync; port control block is hold until device remove */ - cancel_delayed_work(&priv->ports[port].mib_read); + pm =3D priv->ports[port].mib; + if (pm) + cancel_delayed_work(&pm->work); =20 mutex_lock(&priv->reg_lock); res =3D yt921x_port_down(priv, port); @@ -3976,6 +4013,7 @@ yt921x_phylink_mac_link_up(struct phylink_config *con= fig, { struct dsa_port *dp =3D dsa_phylink_to_port(config); struct yt921x_priv *priv =3D to_yt921x_priv(dp->ds); + struct yt921x_mib *pm; int port =3D dp->index; int res; =20 @@ -3988,7 +4026,9 @@ yt921x_phylink_mac_link_up(struct phylink_config *con= fig, dev_err(dp->ds->dev, "Failed to %s port %d: %i\n", "bring up", port, res); =20 - schedule_delayed_work(&priv->ports[port].mib_read, 0); + pm =3D priv->ports[port].mib; + if (pm) + schedule_delayed_work(&pm->work, 0); } =20 static void @@ -4108,11 +4148,35 @@ yt921x_dsa_get_tag_protocol(struct dsa_switch *ds, = int port, return DSA_TAG_PROTO_YT921X; } =20 +static void yt921x_dsa_port_teardown(struct dsa_switch *ds, int port) +{ + struct yt921x_priv *priv =3D to_yt921x_priv(ds); + struct yt921x_port *pp =3D &priv->ports[port]; + struct yt921x_mib *pm =3D pp->mib; + + if (pm) + disable_delayed_work_sync(&pm->work); +} + static int yt921x_dsa_port_setup(struct dsa_switch *ds, int port) { struct yt921x_priv *priv =3D to_yt921x_priv(ds); + struct yt921x_port *pp =3D &priv->ports[port]; + struct device *dev =3D to_device(priv); + struct yt921x_mib *pm =3D pp->mib; int res; =20 + if (!pm && (BIT(port) & (priv->info->internal_mask | + priv->info->external_mask))) { + pm =3D devm_kzalloc(dev, sizeof(*pm), GFP_KERNEL); + if (!pm) + return -ENOMEM; + pp->mib =3D pm; + + pm->port =3D pp; + INIT_DELAYED_WORK(&pm->work, yt921x_mib_poll); + } + mutex_lock(&priv->reg_lock); res =3D yt921x_port_setup(priv, port); mutex_unlock(&priv->reg_lock); @@ -4667,6 +4731,7 @@ static const struct dsa_switch_ops yt921x_dsa_switch_= ops =3D { /* port */ .get_tag_protocol =3D yt921x_dsa_get_tag_protocol, .phylink_get_caps =3D yt921x_dsa_phylink_get_caps, + .port_teardown =3D yt921x_dsa_port_teardown, .port_setup =3D yt921x_dsa_port_setup, #if IS_ENABLED(CONFIG_DCB) /* dscp */ @@ -4696,12 +4761,6 @@ static void yt921x_mdio_remove(struct mdio_device *m= diodev) if (!priv) return; =20 - for (size_t i =3D ARRAY_SIZE(priv->ports); i-- > 0; ) { - struct yt921x_port *pp =3D &priv->ports[i]; - - disable_delayed_work_sync(&pp->mib_read); - } - dsa_unregister_switch(&priv->ds); =20 for (unsigned int i =3D 0; i < ARRAY_SIZE(priv->acl_blks); i++) { @@ -4749,7 +4808,6 @@ static int yt921x_mdio_probe(struct mdio_device *mdio= dev) struct yt921x_port *pp =3D &priv->ports[i]; =20 pp->index =3D i; - INIT_DELAYED_WORK(&pp->mib_read, yt921x_mib_poll); } =20 ds =3D &priv->ds; diff --git a/drivers/net/dsa/motorcomm/chip.h b/drivers/net/dsa/motorcomm/c= hip.h index 805febb48683..5bf2d3409f4b 100644 --- a/drivers/net/dsa/motorcomm/chip.h +++ b/drivers/net/dsa/motorcomm/chip.h @@ -913,6 +913,15 @@ struct yt921x_mib_stats { u64 tx_oam; }; =20 +struct yt921x_mib { + struct yt921x_port *port; + + struct delayed_work work; + struct yt921x_mib_stats stats; + u64 rx_frames; + u64 tx_frames; +}; + struct yt921x_acl_entry { u32 key[2]; u32 mask[2]; @@ -939,11 +948,6 @@ struct yt921x_port { bool hairpin; bool isolated; =20 - struct delayed_work mib_read; - struct yt921x_mib_stats mib; - u64 rx_frames; - u64 tx_frames; - #if IS_ENABLED(CONFIG_NET_DSA_YT921X_LEDS) unsigned char led_duty; unsigned short led_cycle; @@ -953,6 +957,8 @@ struct yt921x_port { =20 struct yt921x_led *leds[YT921X_LED_GROUP_NUM]; #endif + + struct yt921x_mib *mib; }; =20 struct yt921x_reg_ops { --=20 2.53.0 From nobody Sat Sep 26 01:39:50 2026 Received: from mail-pl1-f171.google.com (mail-pl1-f171.google.com [209.85.214.171]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1C22E3C3792 for ; Sun, 6 Sep 2026 13:14:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788700480; cv=none; b=mMfivf1sNlCDSFxH/9hMD0/ly0uzRbhNy8HnRRQXv8o6JfnjiU+Qe8qw/atNnRy/tKkOR2UOOV9YR79Eh0aTR0eRsXEpvy9ibRmObLdqPhNEYlHeMs4FXpWREX0asY1pvLdM6aVdgbtqfCidD81HpBsJYiJD0zOBxVbPzino2vE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788700480; c=relaxed/simple; bh=1GCu02nEr7Bx2CNHOn51hBohSkOMXEQIQvXhlR2tILY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=gfSSW/di3eY1lQPdWSHfRRMXEi8Xb0V92G6AJwRg62RkjoEt0/Iemac1CxUA2WK9MPyzCAMWkqIO0TZYkbPbJAvq0O+Ep+RR9qRIrzuj4JrvW6JxOqNYqg7P+JRPxO0fMep7D8H1MlGd5D3ScA7bfMvQLQJyrM5zVvQTkM31sfo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=FI8ASfUS; arc=none smtp.client-ip=209.85.214.171 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="FI8ASfUS" Received: by mail-pl1-f171.google.com with SMTP id d9443c01a7336-2d71d1cc8b2so20745825ad.1 for ; Sun, 06 Sep 2026 06:14:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788700477; x=1789305277; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=zybn3YPyZnkRtNbjuK4q+xG8lkY8mYjCZfRgcAjyZmA=; b=FI8ASfUSO45JuztmqTl4MLNKGEeQHoUPy/2xqCi6CjgDA/Iy7l6K4aAXZgAWoyRZGm wNlKP6fnBUu+kMkb5bLEezqFiThtLHI+x1GxZPijTpMRwZ35n5OzijEmUG0Mw250/oTT SlWRjM5+AtoADn6WY6U/IHNkdPLJei6HtWMB3mJpGAuP133PZvXiUmuUU4l9jmICxIxr EUoqDWuvWoyNbHx4389P1K7yhZUTRRRcxX3MDQsBsz98yk93zTXEUIlYyZr6SFBqBGLa Cq94/qCY6xiXEAIrQSlE2H9fvS3p4TH9cKk8iGdYv8s/g0Zgf9PzjFmrTCl7ti3Ecvsd 0Lag== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788700477; x=1789305277; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=zybn3YPyZnkRtNbjuK4q+xG8lkY8mYjCZfRgcAjyZmA=; b=WYDI9d8lPt4V9BlzI3wFK2zqDkwt1mv7A2LWeu5C51DQwBguEhiVaJYM0fHrUQoEEq OP/RqiO8ro1npb0OWkqrJfgT3J+izLE4nkjx9nlB//WUM4HyZs+H/ZMyfI8GUUuJKu/2 psWHfu+ASmcE7yi9TNmCL9O3rulF5riYkjUZokHY+fexrq6kDlh9PpjVv64Evj8ei8l/ FkZJEVVZB4Xtq7ZTgxQTZtsOZDk19rbukn1qKBlo9mIN6qYU8ia9QflIgbiBXB1Xhc0u G2+FbncY1UQZYvqS53xUB3mEnzAtHCwdvOjlZuruqmbhC6CAhPBK0C/XRzsrMWk7IDqt RnmQ== X-Forwarded-Encrypted: i=1; AKwUvBz5SIg+addZi7+PRBedBjCGsly4490vyCn8aPZNUyrzfL9zNRN6B7Bli9VcpsIFc1y0lwas/X8/VPWjVf4=@vger.kernel.org X-Gm-Message-State: AFuF++nk5ORyVGN4GAZgokLZVkzh2OM1oNCljHYq0ty40XnNojqnyXjr fjs23OJOtommwYo8EuJVuk7gDSFws1AkpuEHnmD7oiyzg80Ws3uuoxKY X-Gm-Gg: AYBFou2aQtRb2UpfUOvkGE3X+fzcbU0ROw/B01i76usqNwvcGwVp4c3XfJ11BHKnkKn nuqzJQneaRyoUks0GCBpS7Y9MzoBhfmxyTsQQKAl5Q8F9XWCAxWfzHpYaeluEROmIvtSsYeftEo EKBh5p9Epld2Mk8U8z15nHSB7TNgtOHSo0z7ht4xv+b7C5GJoomPqlGbGU4bc+ZajWkS4m4Rcwe rxJRU9lE97DdrslyFC2NAZ/rZYlj3foMcCMj1SmDO1MbiyPKlSqgmuP55uocqUQXRjgmmS1h8mo rFvTNwadOQKNfGXq9IG/FQsqstQIog29VGuj16qw2BdhBB382+mkB3Sy1t6pqMf8OmePpyQHa/h RXQmRoOZMrtY26Srmjrxh+ZdwUF26HmNsWLmCV+xCMOnYhuhDvgI1QHyY3z9nneqcCnADRfAfPh v+MoJZmmFuQzShP2XMKSgDilNy3LffVObC8KnloqsRGbA8x2874ZzQ80XR6aSinzIqJLHz30BQs 5dU5eYcwMHEHH4= X-Received: by 2002:a17:902:930a:b0:2d6:e074:9cad with SMTP id d9443c01a7336-2db1236f4femr177476445ad.6.1788700477048; Sun, 06 Sep 2026 06:14:37 -0700 (PDT) Received: from d.home.yangfl.dn42 ([2a09:bac1:76a0:d30::4d0:7b]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2db1495b2f8sm32259965ad.21.2026.09.06.06.14.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 06 Sep 2026 06:14:36 -0700 (PDT) From: David Yang To: netdev@vger.kernel.org Cc: David Yang , Andrew Lunn , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Russell King , linux-kernel@vger.kernel.org Subject: [PATCH net-next v3 3/6] net: dsa: motorcomm: Split MIB module Date: Sun, 6 Sep 2026 21:14:08 +0800 Message-ID: <20260906131414.2683362-4-mmyangfl@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260906131414.2683362-1-mmyangfl@gmail.com> References: <20260906131414.2683362-1-mmyangfl@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" yt922x is going to use a different MIB scheme, split it to reduce the length of chip.c. Signed-off-by: David Yang --- drivers/net/dsa/motorcomm/Makefile | 1 + drivers/net/dsa/motorcomm/chip.c | 398 +--------------------------- drivers/net/dsa/motorcomm/chip.h | 124 --------- drivers/net/dsa/motorcomm/mib.c | 408 +++++++++++++++++++++++++++++ drivers/net/dsa/motorcomm/mib.h | 159 +++++++++++ 5 files changed, 569 insertions(+), 521 deletions(-) create mode 100644 drivers/net/dsa/motorcomm/mib.c create mode 100644 drivers/net/dsa/motorcomm/mib.h diff --git a/drivers/net/dsa/motorcomm/Makefile b/drivers/net/dsa/motorcomm= /Makefile index aeb12cb91f93..5c2d34ec05fc 100644 --- a/drivers/net/dsa/motorcomm/Makefile +++ b/drivers/net/dsa/motorcomm/Makefile @@ -2,4 +2,5 @@ obj-$(CONFIG_NET_DSA_YT921X) +=3D yt921x.o yt921x-objs :=3D chip.o yt921x-$(CONFIG_NET_DSA_YT921X_LEDS) +=3D leds.o +yt921x-objs +=3D mib.o yt921x-objs +=3D smi.o diff --git a/drivers/net/dsa/motorcomm/chip.c b/drivers/net/dsa/motorcomm/c= hip.c index 95041a2fb0ec..e9730b9f8c62 100644 --- a/drivers/net/dsa/motorcomm/chip.c +++ b/drivers/net/dsa/motorcomm/chip.c @@ -27,75 +27,9 @@ =20 #include "chip.h" #include "leds.h" +#include "mib.h" #include "smi.h" =20 -struct yt921x_mib_desc { - unsigned int size; - unsigned int offset; - const char *name; -}; - -#define MIB_DESC(_size, _offset, _name) \ - {_size, _offset, _name} - -/* Must agree with yt921x_mib - * - * Unstructured fields (name !=3D NULL) will appear in get_ethtool_stats(), - * structured go to their *_stats() methods, but we need their sizes and o= ffsets - * to perform 32bit MIB overflow wraparound. - */ -static const struct yt921x_mib_desc yt921x_mib_descs[] =3D { - MIB_DESC(1, YT921X_MIB_DATA_RX_BROADCAST, NULL), - MIB_DESC(1, YT921X_MIB_DATA_RX_PAUSE, NULL), - MIB_DESC(1, YT921X_MIB_DATA_RX_MULTICAST, NULL), - MIB_DESC(1, YT921X_MIB_DATA_RX_CRC_ERR, NULL), - - MIB_DESC(1, YT921X_MIB_DATA_RX_ALIGN_ERR, NULL), - MIB_DESC(1, YT921X_MIB_DATA_RX_UNDERSIZE_ERR, NULL), - MIB_DESC(1, YT921X_MIB_DATA_RX_FRAG_ERR, NULL), - MIB_DESC(1, YT921X_MIB_DATA_RX_PKT_SZ_64, NULL), - - MIB_DESC(1, YT921X_MIB_DATA_RX_PKT_SZ_65_TO_127, NULL), - MIB_DESC(1, YT921X_MIB_DATA_RX_PKT_SZ_128_TO_255, NULL), - MIB_DESC(1, YT921X_MIB_DATA_RX_PKT_SZ_256_TO_511, NULL), - MIB_DESC(1, YT921X_MIB_DATA_RX_PKT_SZ_512_TO_1023, NULL), - - MIB_DESC(1, YT921X_MIB_DATA_RX_PKT_SZ_1024_TO_1518, NULL), - MIB_DESC(1, YT921X_MIB_DATA_RX_PKT_SZ_1519_TO_MAX, NULL), - MIB_DESC(2, YT921X_MIB_DATA_RX_GOOD_BYTES, NULL), - - MIB_DESC(2, YT921X_MIB_DATA_RX_BAD_BYTES, "RxBadBytes"), - MIB_DESC(1, YT921X_MIB_DATA_RX_OVERSIZE_ERR, NULL), - - MIB_DESC(1, YT921X_MIB_DATA_RX_DROPPED, NULL), - MIB_DESC(1, YT921X_MIB_DATA_TX_BROADCAST, NULL), - MIB_DESC(1, YT921X_MIB_DATA_TX_PAUSE, NULL), - MIB_DESC(1, YT921X_MIB_DATA_TX_MULTICAST, NULL), - - MIB_DESC(1, YT921X_MIB_DATA_TX_UNDERSIZE_ERR, NULL), - MIB_DESC(1, YT921X_MIB_DATA_TX_PKT_SZ_64, NULL), - MIB_DESC(1, YT921X_MIB_DATA_TX_PKT_SZ_65_TO_127, NULL), - MIB_DESC(1, YT921X_MIB_DATA_TX_PKT_SZ_128_TO_255, NULL), - - MIB_DESC(1, YT921X_MIB_DATA_TX_PKT_SZ_256_TO_511, NULL), - MIB_DESC(1, YT921X_MIB_DATA_TX_PKT_SZ_512_TO_1023, NULL), - MIB_DESC(1, YT921X_MIB_DATA_TX_PKT_SZ_1024_TO_1518, NULL), - MIB_DESC(1, YT921X_MIB_DATA_TX_PKT_SZ_1519_TO_MAX, NULL), - - MIB_DESC(2, YT921X_MIB_DATA_TX_GOOD_BYTES, NULL), - MIB_DESC(1, YT921X_MIB_DATA_TX_COLLISION, NULL), - - MIB_DESC(1, YT921X_MIB_DATA_TX_EXCESSIVE_COLLISION, NULL), - MIB_DESC(1, YT921X_MIB_DATA_TX_MULTIPLE_COLLISION, NULL), - MIB_DESC(1, YT921X_MIB_DATA_TX_SINGLE_COLLISION, NULL), - MIB_DESC(1, YT921X_MIB_DATA_TX_PKT, NULL), - - MIB_DESC(1, YT921X_MIB_DATA_TX_DEFERRED, NULL), - MIB_DESC(1, YT921X_MIB_DATA_TX_LATE_COLLISION, NULL), - MIB_DESC(1, YT921X_MIB_DATA_RX_OAM, "RxOAM"), - MIB_DESC(1, YT921X_MIB_DATA_TX_OAM, "TxOAM"), -}; - struct yt921x_info { const char *name; u16 major; @@ -154,14 +88,6 @@ static const struct yt921x_info yt921x_infos[] =3D { =20 #define YT921X_VID_UNWARE 4095 =20 -/* The interval should be small enough to avoid overflow of 32bit MIBs. - * - * Until we can read MIBs from stats64 call directly (i.e. sleep - * there), we have to poll stats more frequently then it is actually neede= d. - * For overflow protection, normally, 100 sec interval should have been OK. - */ -#define YT921X_STATS_INTERVAL_JIFFIES (3 * HZ) - struct yt921x_reg_mdio { struct mii_bus *bus; int addr; @@ -544,328 +470,6 @@ yt921x_mbus_ext_init(struct yt921x_priv *priv, struct= device_node *mnp) return 0; } =20 -/* Read and handle overflow of 32bit MIBs. MIB buffer must be zeroed befor= e. */ -static int yt921x_mib_read(struct yt921x_priv *priv, int port) -{ - struct yt921x_port *pp =3D &priv->ports[port]; - struct device *dev =3D to_device(priv); - struct yt921x_mib *pm =3D pp->mib; - struct yt921x_mib_stats *mib; - int res =3D 0; - - mib =3D &pm->stats; - - /* Reading of yt921x_port::mib is not protected by a lock and it's vain - * to keep its consistency, since we have to read registers one by one - * and there is no way to make a snapshot of MIB stats. - * - * Writing (by this function only) is and should be protected by - * reg_lock. - */ - - for (size_t i =3D 0; i < ARRAY_SIZE(yt921x_mib_descs); i++) { - const struct yt921x_mib_desc *desc =3D &yt921x_mib_descs[i]; - u32 reg =3D YT921X_MIBn_DATA0(port) + desc->offset; - u64 *valp =3D &((u64 *)mib)[i]; - u32 val0; - u64 val; - - res =3D yt921x_reg_read(priv, reg, &val0); - if (res) - break; - - if (desc->size <=3D 1) { - u64 old_val =3D *valp; - - val =3D (old_val & ~(u64)U32_MAX) | val0; - if (val < old_val) - val +=3D 1ull << 32; - } else { - u32 val1; - - res =3D yt921x_reg_read(priv, reg + 4, &val1); - if (res) - break; - val =3D ((u64)val1 << 32) | val0; - } - - WRITE_ONCE(*valp, val); - } - - pm->rx_frames =3D mib->rx_64byte + mib->rx_65_127byte + - mib->rx_128_255byte + mib->rx_256_511byte + - mib->rx_512_1023byte + mib->rx_1024_1518byte + - mib->rx_jumbo; - pm->tx_frames =3D mib->tx_64byte + mib->tx_65_127byte + - mib->tx_128_255byte + mib->tx_256_511byte + - mib->tx_512_1023byte + mib->tx_1024_1518byte + - mib->tx_jumbo; - - if (res) - dev_err(dev, "Failed to %s port %d: %i\n", "read stats for", - port, res); - return res; -} - -static void yt921x_mib_poll(struct work_struct *work) -{ - struct yt921x_mib *pm =3D container_of_const(work, struct yt921x_mib, - work.work); - struct yt921x_port *pp =3D pm->port; - struct yt921x_priv *priv =3D container_of_const(pp, struct yt921x_priv, - ports[pp->index]); - unsigned long delay =3D YT921X_STATS_INTERVAL_JIFFIES; - int port =3D pp->index; - int res; - - mutex_lock(&priv->reg_lock); - res =3D yt921x_mib_read(priv, port); - mutex_unlock(&priv->reg_lock); - if (res) - delay *=3D 4; - - schedule_delayed_work(&pm->work, delay); -} - -static void -yt921x_dsa_get_strings(struct dsa_switch *ds, int port, u32 stringset, - uint8_t *data) -{ - if (stringset !=3D ETH_SS_STATS) - return; - - for (size_t i =3D 0; i < ARRAY_SIZE(yt921x_mib_descs); i++) { - const struct yt921x_mib_desc *desc =3D &yt921x_mib_descs[i]; - - if (desc->name) - ethtool_puts(&data, desc->name); - } -} - -static void -yt921x_dsa_get_ethtool_stats(struct dsa_switch *ds, int port, uint64_t *da= ta) -{ - struct yt921x_priv *priv =3D to_yt921x_priv(ds); - struct yt921x_port *pp =3D &priv->ports[port]; - struct yt921x_mib *pm =3D pp->mib; - struct yt921x_mib_stats *mib; - size_t j; - - if (!pm) - return; - mib =3D &pm->stats; - - mutex_lock(&priv->reg_lock); - yt921x_mib_read(priv, port); - mutex_unlock(&priv->reg_lock); - - j =3D 0; - for (size_t i =3D 0; i < ARRAY_SIZE(yt921x_mib_descs); i++) { - const struct yt921x_mib_desc *desc =3D &yt921x_mib_descs[i]; - - if (!desc->name) - continue; - - data[j] =3D ((u64 *)mib)[i]; - j++; - } -} - -static int yt921x_dsa_get_sset_count(struct dsa_switch *ds, int port, int = sset) -{ - int cnt =3D 0; - - if (sset !=3D ETH_SS_STATS) - return 0; - - for (size_t i =3D 0; i < ARRAY_SIZE(yt921x_mib_descs); i++) { - const struct yt921x_mib_desc *desc =3D &yt921x_mib_descs[i]; - - if (desc->name) - cnt++; - } - - return cnt; -} - -static void -yt921x_dsa_get_eth_mac_stats(struct dsa_switch *ds, int port, - struct ethtool_eth_mac_stats *mac_stats) -{ - struct yt921x_priv *priv =3D to_yt921x_priv(ds); - struct yt921x_port *pp =3D &priv->ports[port]; - struct yt921x_mib *pm =3D pp->mib; - struct yt921x_mib_stats *mib; - - if (!pm) - return; - mib =3D &pm->stats; - - mutex_lock(&priv->reg_lock); - yt921x_mib_read(priv, port); - mutex_unlock(&priv->reg_lock); - - mac_stats->FramesTransmittedOK =3D pm->tx_frames; - mac_stats->SingleCollisionFrames =3D mib->tx_single_collisions; - mac_stats->MultipleCollisionFrames =3D mib->tx_multiple_collisions; - mac_stats->FramesReceivedOK =3D pm->rx_frames; - mac_stats->FrameCheckSequenceErrors =3D mib->rx_crc_errors; - mac_stats->AlignmentErrors =3D mib->rx_alignment_errors; - mac_stats->OctetsTransmittedOK =3D mib->tx_good_bytes; - mac_stats->FramesWithDeferredXmissions =3D mib->tx_deferred; - mac_stats->LateCollisions =3D mib->tx_late_collisions; - mac_stats->FramesAbortedDueToXSColls =3D mib->tx_aborted_errors; - /* mac_stats->FramesLostDueToIntMACXmitError */ - /* mac_stats->CarrierSenseErrors */ - mac_stats->OctetsReceivedOK =3D mib->rx_good_bytes; - /* mac_stats->FramesLostDueToIntMACRcvError */ - mac_stats->MulticastFramesXmittedOK =3D mib->tx_multicast; - mac_stats->BroadcastFramesXmittedOK =3D mib->tx_broadcast; - /* mac_stats->FramesWithExcessiveDeferral */ - mac_stats->MulticastFramesReceivedOK =3D mib->rx_multicast; - mac_stats->BroadcastFramesReceivedOK =3D mib->rx_broadcast; - /* mac_stats->InRangeLengthErrors */ - /* mac_stats->OutOfRangeLengthField */ - mac_stats->FrameTooLongErrors =3D mib->rx_oversize_errors; -} - -static void -yt921x_dsa_get_eth_ctrl_stats(struct dsa_switch *ds, int port, - struct ethtool_eth_ctrl_stats *ctrl_stats) -{ - struct yt921x_priv *priv =3D to_yt921x_priv(ds); - struct yt921x_port *pp =3D &priv->ports[port]; - struct yt921x_mib *pm =3D pp->mib; - struct yt921x_mib_stats *mib; - - if (!pm) - return; - mib =3D &pm->stats; - - mutex_lock(&priv->reg_lock); - yt921x_mib_read(priv, port); - mutex_unlock(&priv->reg_lock); - - ctrl_stats->MACControlFramesTransmitted =3D mib->tx_pause; - ctrl_stats->MACControlFramesReceived =3D mib->rx_pause; - /* ctrl_stats->UnsupportedOpcodesReceived */ -} - -static const struct ethtool_rmon_hist_range yt921x_rmon_ranges[] =3D { - { 0, 64 }, - { 65, 127 }, - { 128, 255 }, - { 256, 511 }, - { 512, 1023 }, - { 1024, 1518 }, - { 1519, YT921X_FRAME_SIZE_MAX }, - {} -}; - -static void -yt921x_dsa_get_rmon_stats(struct dsa_switch *ds, int port, - struct ethtool_rmon_stats *rmon_stats, - const struct ethtool_rmon_hist_range **ranges) -{ - struct yt921x_priv *priv =3D to_yt921x_priv(ds); - struct yt921x_port *pp =3D &priv->ports[port]; - struct yt921x_mib *pm =3D pp->mib; - struct yt921x_mib_stats *mib; - - if (!pm) - return; - mib =3D &pm->stats; - - mutex_lock(&priv->reg_lock); - yt921x_mib_read(priv, port); - mutex_unlock(&priv->reg_lock); - - *ranges =3D yt921x_rmon_ranges; - - rmon_stats->undersize_pkts =3D mib->rx_undersize_errors; - rmon_stats->oversize_pkts =3D mib->rx_oversize_errors; - rmon_stats->fragments =3D mib->rx_alignment_errors; - /* rmon_stats->jabbers */ - - rmon_stats->hist[0] =3D mib->rx_64byte; - rmon_stats->hist[1] =3D mib->rx_65_127byte; - rmon_stats->hist[2] =3D mib->rx_128_255byte; - rmon_stats->hist[3] =3D mib->rx_256_511byte; - rmon_stats->hist[4] =3D mib->rx_512_1023byte; - rmon_stats->hist[5] =3D mib->rx_1024_1518byte; - rmon_stats->hist[6] =3D mib->rx_jumbo; - - rmon_stats->hist_tx[0] =3D mib->tx_64byte; - rmon_stats->hist_tx[1] =3D mib->tx_65_127byte; - rmon_stats->hist_tx[2] =3D mib->tx_128_255byte; - rmon_stats->hist_tx[3] =3D mib->tx_256_511byte; - rmon_stats->hist_tx[4] =3D mib->tx_512_1023byte; - rmon_stats->hist_tx[5] =3D mib->tx_1024_1518byte; - rmon_stats->hist_tx[6] =3D mib->tx_jumbo; -} - -static void -yt921x_dsa_get_stats64(struct dsa_switch *ds, int port, - struct rtnl_link_stats64 *stats) -{ - struct yt921x_priv *priv =3D to_yt921x_priv(ds); - struct yt921x_port *pp =3D &priv->ports[port]; - struct yt921x_mib *pm =3D pp->mib; - struct yt921x_mib_stats *mib; - - if (!pm) - return; - mib =3D &pm->stats; - - stats->rx_length_errors =3D mib->rx_undersize_errors + - mib->rx_fragment_errors; - stats->rx_over_errors =3D mib->rx_oversize_errors; - stats->rx_crc_errors =3D mib->rx_crc_errors; - stats->rx_frame_errors =3D mib->rx_alignment_errors; - /* stats->rx_fifo_errors */ - /* stats->rx_missed_errors */ - - stats->tx_aborted_errors =3D mib->tx_aborted_errors; - /* stats->tx_carrier_errors */ - stats->tx_fifo_errors =3D mib->tx_undersize_errors; - /* stats->tx_heartbeat_errors */ - stats->tx_window_errors =3D mib->tx_late_collisions; - - stats->rx_packets =3D pm->rx_frames; - stats->tx_packets =3D pm->tx_frames; - stats->rx_bytes =3D mib->rx_good_bytes - ETH_FCS_LEN * stats->rx_packets; - stats->tx_bytes =3D mib->tx_good_bytes - ETH_FCS_LEN * stats->tx_packets; - stats->rx_errors =3D stats->rx_length_errors + stats->rx_over_errors + - stats->rx_crc_errors + stats->rx_frame_errors; - stats->tx_errors =3D stats->tx_aborted_errors + stats->tx_fifo_errors + - stats->tx_window_errors; - stats->rx_dropped =3D mib->rx_dropped; - /* stats->tx_dropped */ - stats->multicast =3D mib->rx_multicast; - stats->collisions =3D mib->tx_collisions; -} - -static void -yt921x_dsa_get_pause_stats(struct dsa_switch *ds, int port, - struct ethtool_pause_stats *pause_stats) -{ - struct yt921x_priv *priv =3D to_yt921x_priv(ds); - struct yt921x_port *pp =3D &priv->ports[port]; - struct yt921x_mib *pm =3D pp->mib; - struct yt921x_mib_stats *mib; - - if (!pm) - return; - mib =3D &pm->stats; - - mutex_lock(&priv->reg_lock); - yt921x_mib_read(priv, port); - mutex_unlock(&priv->reg_lock); - - pause_stats->tx_pause_frames =3D mib->tx_pause; - pause_stats->rx_pause_frames =3D mib->rx_pause; -} - static int yt921x_set_eee(struct yt921x_priv *priv, int port, struct ethtool_keee *e) { diff --git a/drivers/net/dsa/motorcomm/chip.h b/drivers/net/dsa/motorcomm/c= hip.h index 5bf2d3409f4b..ce63865bb905 100644 --- a/drivers/net/dsa/motorcomm/chip.h +++ b/drivers/net/dsa/motorcomm/chip.h @@ -167,69 +167,6 @@ #define YT921X_EEE_CTRL 0xb0000 #define YT921X_EEE_CTRL_ENn(port) BIT(port) =20 -#define YT921X_MIB_CTRL 0xc0004 -#define YT921X_MIB_CTRL_CLEAN BIT(30) -#define YT921X_MIB_CTRL_PORT_M GENMASK(6, 3) -#define YT921X_MIB_CTRL_PORT(x) FIELD_PREP(YT921X_MIB_CTRL_PORT_M, (x)) -#define YT921X_MIB_CTRL_ONE_PORT BIT(1) -#define YT921X_MIB_CTRL_ALL_PORT BIT(0) -#define YT921X_MIBn_DATA0(port) (0xc0100 + 0x100 * (port)) -#define YT921X_MIBn_DATAm(port, x) (YT921X_MIBn_DATA0(port) + 4 * (x)) -#define YT921X_MIB_DATA_RX_BROADCAST 0x00 -#define YT921X_MIB_DATA_RX_PAUSE 0x04 -#define YT921X_MIB_DATA_RX_MULTICAST 0x08 -#define YT921X_MIB_DATA_RX_CRC_ERR 0x0c - -#define YT921X_MIB_DATA_RX_ALIGN_ERR 0x10 -#define YT921X_MIB_DATA_RX_UNDERSIZE_ERR 0x14 -#define YT921X_MIB_DATA_RX_FRAG_ERR 0x18 -#define YT921X_MIB_DATA_RX_PKT_SZ_64 0x1c - -#define YT921X_MIB_DATA_RX_PKT_SZ_65_TO_127 0x20 -#define YT921X_MIB_DATA_RX_PKT_SZ_128_TO_255 0x24 -#define YT921X_MIB_DATA_RX_PKT_SZ_256_TO_511 0x28 -#define YT921X_MIB_DATA_RX_PKT_SZ_512_TO_1023 0x2c - -#define YT921X_MIB_DATA_RX_PKT_SZ_1024_TO_1518 0x30 -#define YT921X_MIB_DATA_RX_PKT_SZ_1519_TO_MAX 0x34 -/* 0x38: unused */ -#define YT921X_MIB_DATA_RX_GOOD_BYTES 0x3c - -/* 0x40: 64 bytes */ -#define YT921X_MIB_DATA_RX_BAD_BYTES 0x44 -/* 0x48: 64 bytes */ -#define YT921X_MIB_DATA_RX_OVERSIZE_ERR 0x4c - -#define YT921X_MIB_DATA_RX_DROPPED 0x50 -#define YT921X_MIB_DATA_TX_BROADCAST 0x54 -#define YT921X_MIB_DATA_TX_PAUSE 0x58 -#define YT921X_MIB_DATA_TX_MULTICAST 0x5c - -#define YT921X_MIB_DATA_TX_UNDERSIZE_ERR 0x60 -#define YT921X_MIB_DATA_TX_PKT_SZ_64 0x64 -#define YT921X_MIB_DATA_TX_PKT_SZ_65_TO_127 0x68 -#define YT921X_MIB_DATA_TX_PKT_SZ_128_TO_255 0x6c - -#define YT921X_MIB_DATA_TX_PKT_SZ_256_TO_511 0x70 -#define YT921X_MIB_DATA_TX_PKT_SZ_512_TO_1023 0x74 -#define YT921X_MIB_DATA_TX_PKT_SZ_1024_TO_1518 0x78 -#define YT921X_MIB_DATA_TX_PKT_SZ_1519_TO_MAX 0x7c - -/* 0x80: unused */ -#define YT921X_MIB_DATA_TX_GOOD_BYTES 0x84 -/* 0x88: 64 bytes */ -#define YT921X_MIB_DATA_TX_COLLISION 0x8c - -#define YT921X_MIB_DATA_TX_EXCESSIVE_COLLISION 0x90 -#define YT921X_MIB_DATA_TX_MULTIPLE_COLLISION 0x94 -#define YT921X_MIB_DATA_TX_SINGLE_COLLISION 0x98 -#define YT921X_MIB_DATA_TX_PKT 0x9c - -#define YT921X_MIB_DATA_TX_DEFERRED 0xa0 -#define YT921X_MIB_DATA_TX_LATE_COLLISION 0xa4 -#define YT921X_MIB_DATA_RX_OAM 0xa8 -#define YT921X_MIB_DATA_TX_OAM 0xac - #define YT921X_EDATA_CTRL 0xe0000 #define YT921X_EDATA_CTRL_ADDR_M GENMASK(15, 8) #define YT921X_EDATA_CTRL_ADDR(x) FIELD_PREP(YT921X_EDATA_CTRL_ADDR_M,= (x)) @@ -861,67 +798,6 @@ enum yt921x_fdb_entry_status { #define yt921x_port_is_internal(port) ((port) < 8) #define yt921x_port_is_external(port) ((port) =3D=3D 8 || (port) =3D=3D 9) =20 -struct yt921x_mib_stats { - u64 rx_broadcast; - u64 rx_pause; - u64 rx_multicast; - u64 rx_crc_errors; - - u64 rx_alignment_errors; - u64 rx_undersize_errors; - u64 rx_fragment_errors; - u64 rx_64byte; - - u64 rx_65_127byte; - u64 rx_128_255byte; - u64 rx_256_511byte; - u64 rx_512_1023byte; - - u64 rx_1024_1518byte; - u64 rx_jumbo; - u64 rx_good_bytes; - - u64 rx_bad_bytes; - u64 rx_oversize_errors; - - u64 rx_dropped; - u64 tx_broadcast; - u64 tx_pause; - u64 tx_multicast; - - u64 tx_undersize_errors; - u64 tx_64byte; - u64 tx_65_127byte; - u64 tx_128_255byte; - - u64 tx_256_511byte; - u64 tx_512_1023byte; - u64 tx_1024_1518byte; - u64 tx_jumbo; - - u64 tx_good_bytes; - u64 tx_collisions; - - u64 tx_aborted_errors; - u64 tx_multiple_collisions; - u64 tx_single_collisions; - u64 tx_good; - - u64 tx_deferred; - u64 tx_late_collisions; - u64 rx_oam; - u64 tx_oam; -}; - -struct yt921x_mib { - struct yt921x_port *port; - - struct delayed_work work; - struct yt921x_mib_stats stats; - u64 rx_frames; - u64 tx_frames; -}; - struct yt921x_acl_entry { u32 key[2]; u32 mask[2]; diff --git a/drivers/net/dsa/motorcomm/mib.c b/drivers/net/dsa/motorcomm/mi= b.c new file mode 100644 index 000000000000..b1296f224cf6 --- /dev/null +++ b/drivers/net/dsa/motorcomm/mib.c @@ -0,0 +1,408 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Copyright (c) 2026 David Yang + */ + +#include "chip.h" +#include "mib.h" +#include "smi.h" + +struct yt921x_mib_desc { + unsigned int size; + unsigned int offset; + const char *name; +}; + +#define MIB_DESC(_size, _offset, _name) \ + {_size, _offset, _name} + +/* Must agree with yt921x_mib + * + * Unstructured fields (name !=3D NULL) will appear in get_ethtool_stats(), + * structured go to their *_stats() methods, but we need their sizes and o= ffsets + * to perform 32bit MIB overflow wraparound. + */ +static const struct yt921x_mib_desc yt921x_mib_descs[] =3D { + MIB_DESC(1, YT921X_MIB_DATA_RX_BROADCAST, NULL), + MIB_DESC(1, YT921X_MIB_DATA_RX_PAUSE, NULL), + MIB_DESC(1, YT921X_MIB_DATA_RX_MULTICAST, NULL), + MIB_DESC(1, YT921X_MIB_DATA_RX_CRC_ERR, NULL), + + MIB_DESC(1, YT921X_MIB_DATA_RX_ALIGN_ERR, NULL), + MIB_DESC(1, YT921X_MIB_DATA_RX_UNDERSIZE_ERR, NULL), + MIB_DESC(1, YT921X_MIB_DATA_RX_FRAG_ERR, NULL), + MIB_DESC(1, YT921X_MIB_DATA_RX_PKT_SZ_64, NULL), + + MIB_DESC(1, YT921X_MIB_DATA_RX_PKT_SZ_65_TO_127, NULL), + MIB_DESC(1, YT921X_MIB_DATA_RX_PKT_SZ_128_TO_255, NULL), + MIB_DESC(1, YT921X_MIB_DATA_RX_PKT_SZ_256_TO_511, NULL), + MIB_DESC(1, YT921X_MIB_DATA_RX_PKT_SZ_512_TO_1023, NULL), + + MIB_DESC(1, YT921X_MIB_DATA_RX_PKT_SZ_1024_TO_1518, NULL), + MIB_DESC(1, YT921X_MIB_DATA_RX_PKT_SZ_1519_TO_MAX, NULL), + MIB_DESC(2, YT921X_MIB_DATA_RX_GOOD_BYTES, NULL), + + MIB_DESC(2, YT921X_MIB_DATA_RX_BAD_BYTES, "RxBadBytes"), + MIB_DESC(1, YT921X_MIB_DATA_RX_OVERSIZE_ERR, NULL), + + MIB_DESC(1, YT921X_MIB_DATA_RX_DROPPED, NULL), + MIB_DESC(1, YT921X_MIB_DATA_TX_BROADCAST, NULL), + MIB_DESC(1, YT921X_MIB_DATA_TX_PAUSE, NULL), + MIB_DESC(1, YT921X_MIB_DATA_TX_MULTICAST, NULL), + + MIB_DESC(1, YT921X_MIB_DATA_TX_UNDERSIZE_ERR, NULL), + MIB_DESC(1, YT921X_MIB_DATA_TX_PKT_SZ_64, NULL), + MIB_DESC(1, YT921X_MIB_DATA_TX_PKT_SZ_65_TO_127, NULL), + MIB_DESC(1, YT921X_MIB_DATA_TX_PKT_SZ_128_TO_255, NULL), + + MIB_DESC(1, YT921X_MIB_DATA_TX_PKT_SZ_256_TO_511, NULL), + MIB_DESC(1, YT921X_MIB_DATA_TX_PKT_SZ_512_TO_1023, NULL), + MIB_DESC(1, YT921X_MIB_DATA_TX_PKT_SZ_1024_TO_1518, NULL), + MIB_DESC(1, YT921X_MIB_DATA_TX_PKT_SZ_1519_TO_MAX, NULL), + + MIB_DESC(2, YT921X_MIB_DATA_TX_GOOD_BYTES, NULL), + MIB_DESC(1, YT921X_MIB_DATA_TX_COLLISION, NULL), + + MIB_DESC(1, YT921X_MIB_DATA_TX_EXCESSIVE_COLLISION, NULL), + MIB_DESC(1, YT921X_MIB_DATA_TX_MULTIPLE_COLLISION, NULL), + MIB_DESC(1, YT921X_MIB_DATA_TX_SINGLE_COLLISION, NULL), + MIB_DESC(1, YT921X_MIB_DATA_TX_PKT, NULL), + + MIB_DESC(1, YT921X_MIB_DATA_TX_DEFERRED, NULL), + MIB_DESC(1, YT921X_MIB_DATA_TX_LATE_COLLISION, NULL), + MIB_DESC(1, YT921X_MIB_DATA_RX_OAM, "RxOAM"), + MIB_DESC(1, YT921X_MIB_DATA_TX_OAM, "TxOAM"), +}; + +/* The interval should be small enough to avoid overflow of 32bit MIBs. + * + * Until we can read MIBs from stats64 call directly (i.e. sleep + * there), we have to poll stats more frequently then it is actually neede= d. + * For overflow protection, normally, 100 sec interval should have been OK. + */ +#define YT921X_STATS_INTERVAL_JIFFIES (3 * HZ) + +#define to_yt921x_priv(_ds) container_of_const(_ds, struct yt921x_priv, ds) +#define to_device(priv) ((priv)->ds.dev) + +/* Read and handle overflow of 32bit MIBs. MIB buffer must be zeroed befor= e. */ +static int yt921x_mib_read(struct yt921x_priv *priv, int port) +{ + struct yt921x_port *pp =3D &priv->ports[port]; + struct device *dev =3D to_device(priv); + struct yt921x_mib *pm =3D pp->mib; + struct yt921x_mib_stats *mib; + int res =3D 0; + + mib =3D &pm->stats; + + /* Reading of yt921x_port::mib is not protected by a lock and it's vain + * to keep its consistency, since we have to read registers one by one + * and there is no way to make a snapshot of MIB stats. + * + * Writing (by this function only) is and should be protected by + * reg_lock. + */ + + for (size_t i =3D 0; i < ARRAY_SIZE(yt921x_mib_descs); i++) { + const struct yt921x_mib_desc *desc =3D &yt921x_mib_descs[i]; + u32 reg =3D YT921X_MIBn_DATA0(port) + desc->offset; + u64 *valp =3D &((u64 *)mib)[i]; + u32 val0; + u64 val; + + res =3D yt921x_reg_read(priv, reg, &val0); + if (res) + break; + + if (desc->size <=3D 1) { + u64 old_val =3D *valp; + + val =3D (old_val & ~(u64)U32_MAX) | val0; + if (val < old_val) + val +=3D 1ull << 32; + } else { + u32 val1; + + res =3D yt921x_reg_read(priv, reg + 4, &val1); + if (res) + break; + val =3D ((u64)val1 << 32) | val0; + } + + WRITE_ONCE(*valp, val); + } + + pm->rx_frames =3D mib->rx_64byte + mib->rx_65_127byte + + mib->rx_128_255byte + mib->rx_256_511byte + + mib->rx_512_1023byte + mib->rx_1024_1518byte + + mib->rx_jumbo; + pm->tx_frames =3D mib->tx_64byte + mib->tx_65_127byte + + mib->tx_128_255byte + mib->tx_256_511byte + + mib->tx_512_1023byte + mib->tx_1024_1518byte + + mib->tx_jumbo; + + if (res) + dev_err(dev, "Failed to %s port %d: %i\n", "read stats for", + port, res); + return res; +} + +void yt921x_mib_poll(struct work_struct *work) +{ + struct yt921x_mib *pm =3D container_of_const(work, struct yt921x_mib, + work.work); + struct yt921x_port *pp =3D pm->port; + struct yt921x_priv *priv =3D container_of_const(pp, struct yt921x_priv, + ports[pp->index]); + unsigned long delay =3D YT921X_STATS_INTERVAL_JIFFIES; + int port =3D pp->index; + int res; + + mutex_lock(&priv->reg_lock); + res =3D yt921x_mib_read(priv, port); + mutex_unlock(&priv->reg_lock); + if (res) + delay *=3D 4; + + schedule_delayed_work(&pm->work, delay); +} + +void +yt921x_dsa_get_strings(struct dsa_switch *ds, int port, u32 stringset, + uint8_t *data) +{ + if (stringset !=3D ETH_SS_STATS) + return; + + for (size_t i =3D 0; i < ARRAY_SIZE(yt921x_mib_descs); i++) { + const struct yt921x_mib_desc *desc =3D &yt921x_mib_descs[i]; + + if (desc->name) + ethtool_puts(&data, desc->name); + } +} + +void +yt921x_dsa_get_ethtool_stats(struct dsa_switch *ds, int port, uint64_t *da= ta) +{ + struct yt921x_priv *priv =3D to_yt921x_priv(ds); + struct yt921x_port *pp =3D &priv->ports[port]; + struct yt921x_mib *pm =3D pp->mib; + struct yt921x_mib_stats *mib; + size_t j; + + if (!pm) + return; + mib =3D &pm->stats; + + mutex_lock(&priv->reg_lock); + yt921x_mib_read(priv, port); + mutex_unlock(&priv->reg_lock); + + j =3D 0; + for (size_t i =3D 0; i < ARRAY_SIZE(yt921x_mib_descs); i++) { + const struct yt921x_mib_desc *desc =3D &yt921x_mib_descs[i]; + + if (!desc->name) + continue; + + data[j] =3D ((u64 *)mib)[i]; + j++; + } +} + +int yt921x_dsa_get_sset_count(struct dsa_switch *ds, int port, int sset) +{ + int cnt =3D 0; + + if (sset !=3D ETH_SS_STATS) + return 0; + + for (size_t i =3D 0; i < ARRAY_SIZE(yt921x_mib_descs); i++) { + const struct yt921x_mib_desc *desc =3D &yt921x_mib_descs[i]; + + if (desc->name) + cnt++; + } + + return cnt; +} + +void +yt921x_dsa_get_eth_mac_stats(struct dsa_switch *ds, int port, + struct ethtool_eth_mac_stats *mac_stats) +{ + struct yt921x_priv *priv =3D to_yt921x_priv(ds); + struct yt921x_port *pp =3D &priv->ports[port]; + struct yt921x_mib *pm =3D pp->mib; + struct yt921x_mib_stats *mib; + + if (!pm) + return; + mib =3D &pm->stats; + + mutex_lock(&priv->reg_lock); + yt921x_mib_read(priv, port); + mutex_unlock(&priv->reg_lock); + + mac_stats->FramesTransmittedOK =3D pm->tx_frames; + mac_stats->SingleCollisionFrames =3D mib->tx_single_collisions; + mac_stats->MultipleCollisionFrames =3D mib->tx_multiple_collisions; + mac_stats->FramesReceivedOK =3D pm->rx_frames; + mac_stats->FrameCheckSequenceErrors =3D mib->rx_crc_errors; + mac_stats->AlignmentErrors =3D mib->rx_alignment_errors; + mac_stats->OctetsTransmittedOK =3D mib->tx_good_bytes; + mac_stats->FramesWithDeferredXmissions =3D mib->tx_deferred; + mac_stats->LateCollisions =3D mib->tx_late_collisions; + mac_stats->FramesAbortedDueToXSColls =3D mib->tx_aborted_errors; + /* mac_stats->FramesLostDueToIntMACXmitError */ + /* mac_stats->CarrierSenseErrors */ + mac_stats->OctetsReceivedOK =3D mib->rx_good_bytes; + /* mac_stats->FramesLostDueToIntMACRcvError */ + mac_stats->MulticastFramesXmittedOK =3D mib->tx_multicast; + mac_stats->BroadcastFramesXmittedOK =3D mib->tx_broadcast; + /* mac_stats->FramesWithExcessiveDeferral */ + mac_stats->MulticastFramesReceivedOK =3D mib->rx_multicast; + mac_stats->BroadcastFramesReceivedOK =3D mib->rx_broadcast; + /* mac_stats->InRangeLengthErrors */ + /* mac_stats->OutOfRangeLengthField */ + mac_stats->FrameTooLongErrors =3D mib->rx_oversize_errors; +} + +void +yt921x_dsa_get_eth_ctrl_stats(struct dsa_switch *ds, int port, + struct ethtool_eth_ctrl_stats *ctrl_stats) +{ + struct yt921x_priv *priv =3D to_yt921x_priv(ds); + struct yt921x_port *pp =3D &priv->ports[port]; + struct yt921x_mib *pm =3D pp->mib; + struct yt921x_mib_stats *mib; + + if (!pm) + return; + mib =3D &pm->stats; + + mutex_lock(&priv->reg_lock); + yt921x_mib_read(priv, port); + mutex_unlock(&priv->reg_lock); + + ctrl_stats->MACControlFramesTransmitted =3D mib->tx_pause; + ctrl_stats->MACControlFramesReceived =3D mib->rx_pause; + /* ctrl_stats->UnsupportedOpcodesReceived */ +} + +static const struct ethtool_rmon_hist_range yt921x_rmon_ranges[] =3D { + { 0, 64 }, + { 65, 127 }, + { 128, 255 }, + { 256, 511 }, + { 512, 1023 }, + { 1024, 1518 }, + { 1519, YT921X_FRAME_SIZE_MAX }, + {} +}; + +void +yt921x_dsa_get_rmon_stats(struct dsa_switch *ds, int port, + struct ethtool_rmon_stats *rmon_stats, + const struct ethtool_rmon_hist_range **ranges) +{ + struct yt921x_priv *priv =3D to_yt921x_priv(ds); + struct yt921x_port *pp =3D &priv->ports[port]; + struct yt921x_mib *pm =3D pp->mib; + struct yt921x_mib_stats *mib; + + if (!pm) + return; + mib =3D &pm->stats; + + mutex_lock(&priv->reg_lock); + yt921x_mib_read(priv, port); + mutex_unlock(&priv->reg_lock); + + *ranges =3D yt921x_rmon_ranges; + + rmon_stats->undersize_pkts =3D mib->rx_undersize_errors; + rmon_stats->oversize_pkts =3D mib->rx_oversize_errors; + rmon_stats->fragments =3D mib->rx_alignment_errors; + /* rmon_stats->jabbers */ + + rmon_stats->hist[0] =3D mib->rx_64byte; + rmon_stats->hist[1] =3D mib->rx_65_127byte; + rmon_stats->hist[2] =3D mib->rx_128_255byte; + rmon_stats->hist[3] =3D mib->rx_256_511byte; + rmon_stats->hist[4] =3D mib->rx_512_1023byte; + rmon_stats->hist[5] =3D mib->rx_1024_1518byte; + rmon_stats->hist[6] =3D mib->rx_jumbo; + + rmon_stats->hist_tx[0] =3D mib->tx_64byte; + rmon_stats->hist_tx[1] =3D mib->tx_65_127byte; + rmon_stats->hist_tx[2] =3D mib->tx_128_255byte; + rmon_stats->hist_tx[3] =3D mib->tx_256_511byte; + rmon_stats->hist_tx[4] =3D mib->tx_512_1023byte; + rmon_stats->hist_tx[5] =3D mib->tx_1024_1518byte; + rmon_stats->hist_tx[6] =3D mib->tx_jumbo; +} + +void +yt921x_dsa_get_stats64(struct dsa_switch *ds, int port, + struct rtnl_link_stats64 *stats) +{ + struct yt921x_priv *priv =3D to_yt921x_priv(ds); + struct yt921x_port *pp =3D &priv->ports[port]; + struct yt921x_mib *pm =3D pp->mib; + struct yt921x_mib_stats *mib; + + if (!pm) + return; + mib =3D &pm->stats; + + stats->rx_length_errors =3D mib->rx_undersize_errors + + mib->rx_fragment_errors; + stats->rx_over_errors =3D mib->rx_oversize_errors; + stats->rx_crc_errors =3D mib->rx_crc_errors; + stats->rx_frame_errors =3D mib->rx_alignment_errors; + /* stats->rx_fifo_errors */ + /* stats->rx_missed_errors */ + + stats->tx_aborted_errors =3D mib->tx_aborted_errors; + /* stats->tx_carrier_errors */ + stats->tx_fifo_errors =3D mib->tx_undersize_errors; + /* stats->tx_heartbeat_errors */ + stats->tx_window_errors =3D mib->tx_late_collisions; + + stats->rx_packets =3D pm->rx_frames; + stats->tx_packets =3D pm->tx_frames; + stats->rx_bytes =3D mib->rx_good_bytes - ETH_FCS_LEN * stats->rx_packets; + stats->tx_bytes =3D mib->tx_good_bytes - ETH_FCS_LEN * stats->tx_packets; + stats->rx_errors =3D stats->rx_length_errors + stats->rx_over_errors + + stats->rx_crc_errors + stats->rx_frame_errors; + stats->tx_errors =3D stats->tx_aborted_errors + stats->tx_fifo_errors + + stats->tx_window_errors; + stats->rx_dropped =3D mib->rx_dropped; + /* stats->tx_dropped */ + stats->multicast =3D mib->rx_multicast; + stats->collisions =3D mib->tx_collisions; +} + +void +yt921x_dsa_get_pause_stats(struct dsa_switch *ds, int port, + struct ethtool_pause_stats *pause_stats) +{ + struct yt921x_priv *priv =3D to_yt921x_priv(ds); + struct yt921x_port *pp =3D &priv->ports[port]; + struct yt921x_mib *pm =3D pp->mib; + struct yt921x_mib_stats *mib; + + if (!pm) + return; + mib =3D &pm->stats; + + mutex_lock(&priv->reg_lock); + yt921x_mib_read(priv, port); + mutex_unlock(&priv->reg_lock); + + pause_stats->tx_pause_frames =3D mib->tx_pause; + pause_stats->rx_pause_frames =3D mib->rx_pause; +} diff --git a/drivers/net/dsa/motorcomm/mib.h b/drivers/net/dsa/motorcomm/mi= b.h new file mode 100644 index 000000000000..cfad0665baae --- /dev/null +++ b/drivers/net/dsa/motorcomm/mib.h @@ -0,0 +1,159 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Copyright (c) 2026 David Yang + */ + +#ifndef _YT_MIB_H +#define _YT_MIB_H + +#include + +#define YT921X_MIB_CTRL 0xc0004 +#define YT921X_MIB_CTRL_CLEAN BIT(30) +#define YT921X_MIB_CTRL_PORT_M GENMASK(6, 3) +#define YT921X_MIB_CTRL_PORT(x) FIELD_PREP(YT921X_MIB_CTRL_PORT_M, (x)) +#define YT921X_MIB_CTRL_ONE_PORT BIT(1) +#define YT921X_MIB_CTRL_ALL_PORT BIT(0) +#define YT921X_MIBn_DATA0(port) (0xc0100 + 0x100 * (port)) +#define YT921X_MIBn_DATAm(port, x) (YT921X_MIBn_DATA0(port) + 4 * (x)) +#define YT921X_MIB_DATA_RX_BROADCAST 0x00 +#define YT921X_MIB_DATA_RX_PAUSE 0x04 +#define YT921X_MIB_DATA_RX_MULTICAST 0x08 +#define YT921X_MIB_DATA_RX_CRC_ERR 0x0c + +#define YT921X_MIB_DATA_RX_ALIGN_ERR 0x10 +#define YT921X_MIB_DATA_RX_UNDERSIZE_ERR 0x14 +#define YT921X_MIB_DATA_RX_FRAG_ERR 0x18 +#define YT921X_MIB_DATA_RX_PKT_SZ_64 0x1c + +#define YT921X_MIB_DATA_RX_PKT_SZ_65_TO_127 0x20 +#define YT921X_MIB_DATA_RX_PKT_SZ_128_TO_255 0x24 +#define YT921X_MIB_DATA_RX_PKT_SZ_256_TO_511 0x28 +#define YT921X_MIB_DATA_RX_PKT_SZ_512_TO_1023 0x2c + +#define YT921X_MIB_DATA_RX_PKT_SZ_1024_TO_1518 0x30 +#define YT921X_MIB_DATA_RX_PKT_SZ_1519_TO_MAX 0x34 +/* 0x38: unused */ +#define YT921X_MIB_DATA_RX_GOOD_BYTES 0x3c + +/* 0x40: 64 bytes */ +#define YT921X_MIB_DATA_RX_BAD_BYTES 0x44 +/* 0x48: 64 bytes */ +#define YT921X_MIB_DATA_RX_OVERSIZE_ERR 0x4c + +#define YT921X_MIB_DATA_RX_DROPPED 0x50 +#define YT921X_MIB_DATA_TX_BROADCAST 0x54 +#define YT921X_MIB_DATA_TX_PAUSE 0x58 +#define YT921X_MIB_DATA_TX_MULTICAST 0x5c + +#define YT921X_MIB_DATA_TX_UNDERSIZE_ERR 0x60 +#define YT921X_MIB_DATA_TX_PKT_SZ_64 0x64 +#define YT921X_MIB_DATA_TX_PKT_SZ_65_TO_127 0x68 +#define YT921X_MIB_DATA_TX_PKT_SZ_128_TO_255 0x6c + +#define YT921X_MIB_DATA_TX_PKT_SZ_256_TO_511 0x70 +#define YT921X_MIB_DATA_TX_PKT_SZ_512_TO_1023 0x74 +#define YT921X_MIB_DATA_TX_PKT_SZ_1024_TO_1518 0x78 +#define YT921X_MIB_DATA_TX_PKT_SZ_1519_TO_MAX 0x7c + +/* 0x80: unused */ +#define YT921X_MIB_DATA_TX_GOOD_BYTES 0x84 +/* 0x88: 64 bytes */ +#define YT921X_MIB_DATA_TX_COLLISION 0x8c + +#define YT921X_MIB_DATA_TX_EXCESSIVE_COLLISION 0x90 +#define YT921X_MIB_DATA_TX_MULTIPLE_COLLISION 0x94 +#define YT921X_MIB_DATA_TX_SINGLE_COLLISION 0x98 +#define YT921X_MIB_DATA_TX_PKT 0x9c + +#define YT921X_MIB_DATA_TX_DEFERRED 0xa0 +#define YT921X_MIB_DATA_TX_LATE_COLLISION 0xa4 +#define YT921X_MIB_DATA_RX_OAM 0xa8 +#define YT921X_MIB_DATA_TX_OAM 0xac + +struct yt921x_mib_stats { + u64 rx_broadcast; + u64 rx_pause; + u64 rx_multicast; + u64 rx_crc_errors; + + u64 rx_alignment_errors; + u64 rx_undersize_errors; + u64 rx_fragment_errors; + u64 rx_64byte; + + u64 rx_65_127byte; + u64 rx_128_255byte; + u64 rx_256_511byte; + u64 rx_512_1023byte; + + u64 rx_1024_1518byte; + u64 rx_jumbo; + u64 rx_good_bytes; + + u64 rx_bad_bytes; + u64 rx_oversize_errors; + + u64 rx_dropped; + u64 tx_broadcast; + u64 tx_pause; + u64 tx_multicast; + + u64 tx_undersize_errors; + u64 tx_64byte; + u64 tx_65_127byte; + u64 tx_128_255byte; + + u64 tx_256_511byte; + u64 tx_512_1023byte; + u64 tx_1024_1518byte; + u64 tx_jumbo; + + u64 tx_good_bytes; + u64 tx_collisions; + + u64 tx_aborted_errors; + u64 tx_multiple_collisions; + u64 tx_single_collisions; + u64 tx_good; + + u64 tx_deferred; + u64 tx_late_collisions; + u64 rx_oam; + u64 tx_oam; +}; + +struct yt921x_mib { + struct yt921x_port *port; + + struct delayed_work work; + struct yt921x_mib_stats stats; + u64 rx_frames; + u64 tx_frames; +}; + +void yt921x_mib_poll(struct work_struct *work); +void +yt921x_dsa_get_strings(struct dsa_switch *ds, int port, u32 stringset, + uint8_t *data); +void +yt921x_dsa_get_ethtool_stats(struct dsa_switch *ds, int port, uint64_t *da= ta); +int yt921x_dsa_get_sset_count(struct dsa_switch *ds, int port, int sset); +void +yt921x_dsa_get_eth_mac_stats(struct dsa_switch *ds, int port, + struct ethtool_eth_mac_stats *mac_stats); +void +yt921x_dsa_get_eth_ctrl_stats(struct dsa_switch *ds, int port, + struct ethtool_eth_ctrl_stats *ctrl_stats); +void +yt921x_dsa_get_rmon_stats(struct dsa_switch *ds, int port, + struct ethtool_rmon_stats *rmon_stats, + const struct ethtool_rmon_hist_range **ranges); +void +yt921x_dsa_get_stats64(struct dsa_switch *ds, int port, + struct rtnl_link_stats64 *stats); +void +yt921x_dsa_get_pause_stats(struct dsa_switch *ds, int port, + struct ethtool_pause_stats *pause_stats); + +#endif --=20 2.53.0 From nobody Sat Sep 26 01:39:50 2026 Received: from mail-pl1-f175.google.com (mail-pl1-f175.google.com [209.85.214.175]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 44FDE3CF95A for ; Sun, 6 Sep 2026 13:14:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788700483; cv=none; b=dbDWsoVDFLGNdVnYZovUKQSsJrWgXrlkswFpvjW+Z1dFPZsP7BP0kosTXx42is8ARxxGdETJurO7DIlKJSThxUhTYSDpi9VPpC2gkP+8KbDMmiqoNrHkI70IbXU0DUYrFnPWObqhbiYsZ26TkVbl7ZzLbmA+teoe2RddTJhvEmM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788700483; c=relaxed/simple; bh=3/1JZMbTWgfSzun6AalSqiQUykhAqGZcOfOW789r6CE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=I6uNaNdMyoEKViebFt2NiGJ/ZOrTsRTZ5gkINlV/+PYfZNj+FNj10fQvAAezdNtvIQbeGGyTvH5h8D1TxklToJMRjp+MPlB2etze1olK+HoN1W1zYQzPUT5+aQQ1GDd7AJP3Wv+dVOXlQL2whsV0SifYjmNN3c0S78Q6QeDUT3s= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=qpK44EZ+; arc=none smtp.client-ip=209.85.214.175 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="qpK44EZ+" Received: by mail-pl1-f175.google.com with SMTP id d9443c01a7336-2d5cad1a6baso22621855ad.3 for ; Sun, 06 Sep 2026 06:14:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788700480; x=1789305280; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=91ueGDtOnVPC2I4VVf41azWOjMFfy242Vqh8cgagWKs=; b=qpK44EZ+44ROWHmsYXQLQtm3ENnskGq9bXYTMiSdxB5LvtJr1YMgKG1ttSKIHi6gls PuEt+h0VII3yyULKPy3SdWa5+Cs4yj/E5czOEIQs/g06+aZV8WtgMdFWT3BvHMKNmCIL S4vjkZl6R52QgTzK4gTtSLUsqqQce/GfKK9zHhQfUgag1odtF1oBUM4Qd1eubFQQesJx wPibYdvteIwIGcq6fsX4wwhCUiKpE9Pwi96rDHF43xz5qhAHEUXVpLTrjoZxDLrhHywQ qURmxGP0vZFBs41LFRChgs5vR1X3ZN1cqZ5HaY+ynCqXxUbgJqgjxwmc4eoPX32IjYES l2Lg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788700480; x=1789305280; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=91ueGDtOnVPC2I4VVf41azWOjMFfy242Vqh8cgagWKs=; b=nkLwYT/LsQOBrz4V9h/k8z/Lo04q1ZgtZeZ6Bn9hoM+uxVGIJnwHffJWwd9jHHRP8k 63lADjsQrRc06X4qxkgYckJeh8BYlxiGffZZg/rhwxjvClo8arUGPQCRf+yrW0Q5dwdz F3Pk+Spz4/gPTwFPIY4F7BL1svw84DfKth8WeDUDuJbj5HjOdKfVvr+djT6sv+r5bPcb lsxX51v4d/kVzNhy5eYC/nrvS4+hwLtwtYWVXIYt7IFHujMLAOhPSz0pY1wCOV4UfPDN /cY1/yvQR/jQi9kGhMs5yBGpzxPIcZRbiGE9wgFNIC+ROoMTzS+w44yfhljUbhe4oKbV DR9g== X-Forwarded-Encrypted: i=1; AKwUvByFqNiiewOgn2nGdzB3cPNZNxY8YEZiU4adGBI9ia2X9xoQP2UvlBcYa6ZGvXQUbe5Ck+mQxLVBf23sZ/A=@vger.kernel.org X-Gm-Message-State: AFuF++kt1UIKCYQoCEXsaNANNRAnbQZQ6Y1P67ZKmLQMr1hMtGZs86Zb fykb2/ncK+BG/6RfVAPmmJFW9nWCsOw0xrW1ML/EIi7ij0MsoAUJwmGZSx8CvgCX X-Gm-Gg: AYBFou0eO5W37Ev7xj3QGWn+zlzoRRchnXom+gD0qck8DoNf6jkr9PNjqPMGJQwhg11 fsXwV/B3MZkBrjv0+msjDMhMxlyWVHFw7jdhXCEIyFWybHq5zX72gXb5M6za6LFpr8Nnul/1v41 zLNQcUMcWc3wH4RK9YcfDs8OS9DE9xr68+ocj5PVYpLzVFpxEyLQ+3Coe0qGftypx6xAEXZg+K3 6iBoVSBj1CoejlZiAvwiuUKB6SEW4Dj/WwBosj7RbLIzHGlqzl9v71rpaqnOAVmRbvEY6g8E9hg dGOt5Xya5ZYeXXlIuJQ9hONbXb+qDwyUE/JYi+q5HA1nQe7W4pmWTtFriKGY9x5qIlRjaonnNxa LXYOQCn7mHqihIkY2OxddU1ydRhQKnshmbh+HQupBLf9xZiXheqqLW/PYEt/9GjRj2QCyxG9U04 Qlkh/rpM1fjz90TTNPp739YHU1TxSRa5B6FpQfXf2GIXjLv2sO8wSeofmXb85BiUfqeB3YHKIJK 9vhYEW2MiFYMg== X-Received: by 2002:a17:903:46cd:b0:2ca:1479:d9dc with SMTP id d9443c01a7336-2db125c332fmr296916955ad.12.1788700480431; Sun, 06 Sep 2026 06:14:40 -0700 (PDT) Received: from d.home.yangfl.dn42 ([2a09:bac1:76a0:d30::4d0:7b]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2db1495b2f8sm32259965ad.21.2026.09.06.06.14.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 06 Sep 2026 06:14:39 -0700 (PDT) From: David Yang To: netdev@vger.kernel.org Cc: David Yang , Andrew Lunn , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Russell King , linux-kernel@vger.kernel.org Subject: [PATCH net-next v3 4/6] net: dsa: motorcomm: Use u64_stats_t for MIB stats Date: Sun, 6 Sep 2026 21:14:09 +0800 Message-ID: <20260906131414.2683362-5-mmyangfl@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260906131414.2683362-1-mmyangfl@gmail.com> References: <20260906131414.2683362-1-mmyangfl@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" 64-bit variables might not be atomic on 32-bit architectures, and could lead to load/store tearing. This is a verbatim change that replace every u64 statistics into u64_stats_t. u64_stats_sync will be equipped in the next commit. Signed-off-by: David Yang --- drivers/net/dsa/motorcomm/mib.c | 152 ++++++++++++++++---------------- drivers/net/dsa/motorcomm/mib.h | 104 +++++++++++----------- 2 files changed, 131 insertions(+), 125 deletions(-) diff --git a/drivers/net/dsa/motorcomm/mib.c b/drivers/net/dsa/motorcomm/mi= b.c index b1296f224cf6..f5d39d22215d 100644 --- a/drivers/net/dsa/motorcomm/mib.c +++ b/drivers/net/dsa/motorcomm/mib.c @@ -92,22 +92,16 @@ static int yt921x_mib_read(struct yt921x_priv *priv, in= t port) struct device *dev =3D to_device(priv); struct yt921x_mib *pm =3D pp->mib; struct yt921x_mib_stats *mib; + u64 rx_frames; + u64 tx_frames; int res =3D 0; =20 mib =3D &pm->stats; =20 - /* Reading of yt921x_port::mib is not protected by a lock and it's vain - * to keep its consistency, since we have to read registers one by one - * and there is no way to make a snapshot of MIB stats. - * - * Writing (by this function only) is and should be protected by - * reg_lock. - */ - for (size_t i =3D 0; i < ARRAY_SIZE(yt921x_mib_descs); i++) { const struct yt921x_mib_desc *desc =3D &yt921x_mib_descs[i]; u32 reg =3D YT921X_MIBn_DATA0(port) + desc->offset; - u64 *valp =3D &((u64 *)mib)[i]; + u64_stats_t *valp =3D &((u64_stats_t *)mib)[i]; u32 val0; u64 val; =20 @@ -116,7 +110,7 @@ static int yt921x_mib_read(struct yt921x_priv *priv, in= t port) break; =20 if (desc->size <=3D 1) { - u64 old_val =3D *valp; + u64 old_val =3D u64_stats_read(valp); =20 val =3D (old_val & ~(u64)U32_MAX) | val0; if (val < old_val) @@ -130,17 +124,25 @@ static int yt921x_mib_read(struct yt921x_priv *priv, = int port) val =3D ((u64)val1 << 32) | val0; } =20 - WRITE_ONCE(*valp, val); + u64_stats_set(valp, val); } =20 - pm->rx_frames =3D mib->rx_64byte + mib->rx_65_127byte + - mib->rx_128_255byte + mib->rx_256_511byte + - mib->rx_512_1023byte + mib->rx_1024_1518byte + - mib->rx_jumbo; - pm->tx_frames =3D mib->tx_64byte + mib->tx_65_127byte + - mib->tx_128_255byte + mib->tx_256_511byte + - mib->tx_512_1023byte + mib->tx_1024_1518byte + - mib->tx_jumbo; + rx_frames =3D u64_stats_read(&mib->rx_64byte) + + u64_stats_read(&mib->rx_65_127byte) + + u64_stats_read(&mib->rx_128_255byte) + + u64_stats_read(&mib->rx_256_511byte) + + u64_stats_read(&mib->rx_512_1023byte) + + u64_stats_read(&mib->rx_1024_1518byte) + + u64_stats_read(&mib->rx_jumbo); + tx_frames =3D u64_stats_read(&mib->tx_64byte) + + u64_stats_read(&mib->tx_65_127byte) + + u64_stats_read(&mib->tx_128_255byte) + + u64_stats_read(&mib->tx_256_511byte) + + u64_stats_read(&mib->tx_512_1023byte) + + u64_stats_read(&mib->tx_1024_1518byte) + + u64_stats_read(&mib->tx_jumbo); + u64_stats_set(&pm->rx_frames, rx_frames); + u64_stats_set(&pm->tx_frames, tx_frames); =20 if (res) dev_err(dev, "Failed to %s port %d: %i\n", "read stats for", @@ -207,7 +209,7 @@ yt921x_dsa_get_ethtool_stats(struct dsa_switch *ds, int= port, uint64_t *data) if (!desc->name) continue; =20 - data[j] =3D ((u64 *)mib)[i]; + data[j] =3D u64_stats_read(&((u64_stats_t *)mib)[i]); j++; } } @@ -246,28 +248,28 @@ yt921x_dsa_get_eth_mac_stats(struct dsa_switch *ds, i= nt port, yt921x_mib_read(priv, port); mutex_unlock(&priv->reg_lock); =20 - mac_stats->FramesTransmittedOK =3D pm->tx_frames; - mac_stats->SingleCollisionFrames =3D mib->tx_single_collisions; - mac_stats->MultipleCollisionFrames =3D mib->tx_multiple_collisions; - mac_stats->FramesReceivedOK =3D pm->rx_frames; - mac_stats->FrameCheckSequenceErrors =3D mib->rx_crc_errors; - mac_stats->AlignmentErrors =3D mib->rx_alignment_errors; - mac_stats->OctetsTransmittedOK =3D mib->tx_good_bytes; - mac_stats->FramesWithDeferredXmissions =3D mib->tx_deferred; - mac_stats->LateCollisions =3D mib->tx_late_collisions; - mac_stats->FramesAbortedDueToXSColls =3D mib->tx_aborted_errors; + mac_stats->FramesTransmittedOK =3D u64_stats_read(&pm->tx_frames); + mac_stats->SingleCollisionFrames =3D u64_stats_read(&mib->tx_single_colli= sions); + mac_stats->MultipleCollisionFrames =3D u64_stats_read(&mib->tx_multiple_c= ollisions); + mac_stats->FramesReceivedOK =3D u64_stats_read(&pm->rx_frames); + mac_stats->FrameCheckSequenceErrors =3D u64_stats_read(&mib->rx_crc_error= s); + mac_stats->AlignmentErrors =3D u64_stats_read(&mib->rx_alignment_errors); + mac_stats->OctetsTransmittedOK =3D u64_stats_read(&mib->tx_good_bytes); + mac_stats->FramesWithDeferredXmissions =3D u64_stats_read(&mib->tx_deferr= ed); + mac_stats->LateCollisions =3D u64_stats_read(&mib->tx_late_collisions); + mac_stats->FramesAbortedDueToXSColls =3D u64_stats_read(&mib->tx_aborted_= errors); /* mac_stats->FramesLostDueToIntMACXmitError */ /* mac_stats->CarrierSenseErrors */ - mac_stats->OctetsReceivedOK =3D mib->rx_good_bytes; + mac_stats->OctetsReceivedOK =3D u64_stats_read(&mib->rx_good_bytes); /* mac_stats->FramesLostDueToIntMACRcvError */ - mac_stats->MulticastFramesXmittedOK =3D mib->tx_multicast; - mac_stats->BroadcastFramesXmittedOK =3D mib->tx_broadcast; + mac_stats->MulticastFramesXmittedOK =3D u64_stats_read(&mib->tx_multicast= ); + mac_stats->BroadcastFramesXmittedOK =3D u64_stats_read(&mib->tx_broadcast= ); /* mac_stats->FramesWithExcessiveDeferral */ - mac_stats->MulticastFramesReceivedOK =3D mib->rx_multicast; - mac_stats->BroadcastFramesReceivedOK =3D mib->rx_broadcast; + mac_stats->MulticastFramesReceivedOK =3D u64_stats_read(&mib->rx_multicas= t); + mac_stats->BroadcastFramesReceivedOK =3D u64_stats_read(&mib->rx_broadcas= t); /* mac_stats->InRangeLengthErrors */ /* mac_stats->OutOfRangeLengthField */ - mac_stats->FrameTooLongErrors =3D mib->rx_oversize_errors; + mac_stats->FrameTooLongErrors =3D u64_stats_read(&mib->rx_oversize_errors= ); } =20 void @@ -287,8 +289,8 @@ yt921x_dsa_get_eth_ctrl_stats(struct dsa_switch *ds, in= t port, yt921x_mib_read(priv, port); mutex_unlock(&priv->reg_lock); =20 - ctrl_stats->MACControlFramesTransmitted =3D mib->tx_pause; - ctrl_stats->MACControlFramesReceived =3D mib->rx_pause; + ctrl_stats->MACControlFramesTransmitted =3D u64_stats_read(&mib->tx_pause= ); + ctrl_stats->MACControlFramesReceived =3D u64_stats_read(&mib->rx_pause); /* ctrl_stats->UnsupportedOpcodesReceived */ } =20 @@ -323,26 +325,26 @@ yt921x_dsa_get_rmon_stats(struct dsa_switch *ds, int = port, =20 *ranges =3D yt921x_rmon_ranges; =20 - rmon_stats->undersize_pkts =3D mib->rx_undersize_errors; - rmon_stats->oversize_pkts =3D mib->rx_oversize_errors; - rmon_stats->fragments =3D mib->rx_alignment_errors; + rmon_stats->undersize_pkts =3D u64_stats_read(&mib->rx_undersize_errors); + rmon_stats->oversize_pkts =3D u64_stats_read(&mib->rx_oversize_errors); + rmon_stats->fragments =3D u64_stats_read(&mib->rx_alignment_errors); /* rmon_stats->jabbers */ =20 - rmon_stats->hist[0] =3D mib->rx_64byte; - rmon_stats->hist[1] =3D mib->rx_65_127byte; - rmon_stats->hist[2] =3D mib->rx_128_255byte; - rmon_stats->hist[3] =3D mib->rx_256_511byte; - rmon_stats->hist[4] =3D mib->rx_512_1023byte; - rmon_stats->hist[5] =3D mib->rx_1024_1518byte; - rmon_stats->hist[6] =3D mib->rx_jumbo; - - rmon_stats->hist_tx[0] =3D mib->tx_64byte; - rmon_stats->hist_tx[1] =3D mib->tx_65_127byte; - rmon_stats->hist_tx[2] =3D mib->tx_128_255byte; - rmon_stats->hist_tx[3] =3D mib->tx_256_511byte; - rmon_stats->hist_tx[4] =3D mib->tx_512_1023byte; - rmon_stats->hist_tx[5] =3D mib->tx_1024_1518byte; - rmon_stats->hist_tx[6] =3D mib->tx_jumbo; + rmon_stats->hist[0] =3D u64_stats_read(&mib->rx_64byte); + rmon_stats->hist[1] =3D u64_stats_read(&mib->rx_65_127byte); + rmon_stats->hist[2] =3D u64_stats_read(&mib->rx_128_255byte); + rmon_stats->hist[3] =3D u64_stats_read(&mib->rx_256_511byte); + rmon_stats->hist[4] =3D u64_stats_read(&mib->rx_512_1023byte); + rmon_stats->hist[5] =3D u64_stats_read(&mib->rx_1024_1518byte); + rmon_stats->hist[6] =3D u64_stats_read(&mib->rx_jumbo); + + rmon_stats->hist_tx[0] =3D u64_stats_read(&mib->tx_64byte); + rmon_stats->hist_tx[1] =3D u64_stats_read(&mib->tx_65_127byte); + rmon_stats->hist_tx[2] =3D u64_stats_read(&mib->tx_128_255byte); + rmon_stats->hist_tx[3] =3D u64_stats_read(&mib->tx_256_511byte); + rmon_stats->hist_tx[4] =3D u64_stats_read(&mib->tx_512_1023byte); + rmon_stats->hist_tx[5] =3D u64_stats_read(&mib->tx_1024_1518byte); + rmon_stats->hist_tx[6] =3D u64_stats_read(&mib->tx_jumbo); } =20 void @@ -358,32 +360,34 @@ yt921x_dsa_get_stats64(struct dsa_switch *ds, int por= t, return; mib =3D &pm->stats; =20 - stats->rx_length_errors =3D mib->rx_undersize_errors + - mib->rx_fragment_errors; - stats->rx_over_errors =3D mib->rx_oversize_errors; - stats->rx_crc_errors =3D mib->rx_crc_errors; - stats->rx_frame_errors =3D mib->rx_alignment_errors; + stats->rx_length_errors =3D u64_stats_read(&mib->rx_undersize_errors) + + u64_stats_read(&mib->rx_fragment_errors); + stats->rx_over_errors =3D u64_stats_read(&mib->rx_oversize_errors); + stats->rx_crc_errors =3D u64_stats_read(&mib->rx_crc_errors); + stats->rx_frame_errors =3D u64_stats_read(&mib->rx_alignment_errors); /* stats->rx_fifo_errors */ /* stats->rx_missed_errors */ =20 - stats->tx_aborted_errors =3D mib->tx_aborted_errors; + stats->tx_aborted_errors =3D u64_stats_read(&mib->tx_aborted_errors); /* stats->tx_carrier_errors */ - stats->tx_fifo_errors =3D mib->tx_undersize_errors; + stats->tx_fifo_errors =3D u64_stats_read(&mib->tx_undersize_errors); /* stats->tx_heartbeat_errors */ - stats->tx_window_errors =3D mib->tx_late_collisions; - - stats->rx_packets =3D pm->rx_frames; - stats->tx_packets =3D pm->tx_frames; - stats->rx_bytes =3D mib->rx_good_bytes - ETH_FCS_LEN * stats->rx_packets; - stats->tx_bytes =3D mib->tx_good_bytes - ETH_FCS_LEN * stats->tx_packets; + stats->tx_window_errors =3D u64_stats_read(&mib->tx_late_collisions); + + stats->rx_packets =3D u64_stats_read(&pm->rx_frames); + stats->tx_packets =3D u64_stats_read(&pm->tx_frames); + stats->rx_bytes =3D u64_stats_read(&mib->rx_good_bytes) - + ETH_FCS_LEN * stats->rx_packets; + stats->tx_bytes =3D u64_stats_read(&mib->tx_good_bytes) - + ETH_FCS_LEN * stats->tx_packets; stats->rx_errors =3D stats->rx_length_errors + stats->rx_over_errors + stats->rx_crc_errors + stats->rx_frame_errors; stats->tx_errors =3D stats->tx_aborted_errors + stats->tx_fifo_errors + stats->tx_window_errors; - stats->rx_dropped =3D mib->rx_dropped; + stats->rx_dropped =3D u64_stats_read(&mib->rx_dropped); /* stats->tx_dropped */ - stats->multicast =3D mib->rx_multicast; - stats->collisions =3D mib->tx_collisions; + stats->multicast =3D u64_stats_read(&mib->rx_multicast); + stats->collisions =3D u64_stats_read(&mib->tx_collisions); } =20 void @@ -403,6 +407,6 @@ yt921x_dsa_get_pause_stats(struct dsa_switch *ds, int p= ort, yt921x_mib_read(priv, port); mutex_unlock(&priv->reg_lock); =20 - pause_stats->tx_pause_frames =3D mib->tx_pause; - pause_stats->rx_pause_frames =3D mib->rx_pause; + pause_stats->tx_pause_frames =3D u64_stats_read(&mib->tx_pause); + pause_stats->rx_pause_frames =3D u64_stats_read(&mib->rx_pause); } diff --git a/drivers/net/dsa/motorcomm/mib.h b/drivers/net/dsa/motorcomm/mi= b.h index cfad0665baae..d84ae2f449ac 100644 --- a/drivers/net/dsa/motorcomm/mib.h +++ b/drivers/net/dsa/motorcomm/mib.h @@ -6,6 +6,8 @@ #ifndef _YT_MIB_H #define _YT_MIB_H =20 +#include + #include =20 #define YT921X_MIB_CTRL 0xc0004 @@ -72,55 +74,55 @@ #define YT921X_MIB_DATA_TX_OAM 0xac =20 struct yt921x_mib_stats { - u64 rx_broadcast; - u64 rx_pause; - u64 rx_multicast; - u64 rx_crc_errors; - - u64 rx_alignment_errors; - u64 rx_undersize_errors; - u64 rx_fragment_errors; - u64 rx_64byte; - - u64 rx_65_127byte; - u64 rx_128_255byte; - u64 rx_256_511byte; - u64 rx_512_1023byte; - - u64 rx_1024_1518byte; - u64 rx_jumbo; - u64 rx_good_bytes; - - u64 rx_bad_bytes; - u64 rx_oversize_errors; - - u64 rx_dropped; - u64 tx_broadcast; - u64 tx_pause; - u64 tx_multicast; - - u64 tx_undersize_errors; - u64 tx_64byte; - u64 tx_65_127byte; - u64 tx_128_255byte; - - u64 tx_256_511byte; - u64 tx_512_1023byte; - u64 tx_1024_1518byte; - u64 tx_jumbo; - - u64 tx_good_bytes; - u64 tx_collisions; - - u64 tx_aborted_errors; - u64 tx_multiple_collisions; - u64 tx_single_collisions; - u64 tx_good; - - u64 tx_deferred; - u64 tx_late_collisions; - u64 rx_oam; - u64 tx_oam; + u64_stats_t rx_broadcast; + u64_stats_t rx_pause; + u64_stats_t rx_multicast; + u64_stats_t rx_crc_errors; + + u64_stats_t rx_alignment_errors; + u64_stats_t rx_undersize_errors; + u64_stats_t rx_fragment_errors; + u64_stats_t rx_64byte; + + u64_stats_t rx_65_127byte; + u64_stats_t rx_128_255byte; + u64_stats_t rx_256_511byte; + u64_stats_t rx_512_1023byte; + + u64_stats_t rx_1024_1518byte; + u64_stats_t rx_jumbo; + u64_stats_t rx_good_bytes; + + u64_stats_t rx_bad_bytes; + u64_stats_t rx_oversize_errors; + + u64_stats_t rx_dropped; + u64_stats_t tx_broadcast; + u64_stats_t tx_pause; + u64_stats_t tx_multicast; + + u64_stats_t tx_undersize_errors; + u64_stats_t tx_64byte; + u64_stats_t tx_65_127byte; + u64_stats_t tx_128_255byte; + + u64_stats_t tx_256_511byte; + u64_stats_t tx_512_1023byte; + u64_stats_t tx_1024_1518byte; + u64_stats_t tx_jumbo; + + u64_stats_t tx_good_bytes; + u64_stats_t tx_collisions; + + u64_stats_t tx_aborted_errors; + u64_stats_t tx_multiple_collisions; + u64_stats_t tx_single_collisions; + u64_stats_t tx_good; + + u64_stats_t tx_deferred; + u64_stats_t tx_late_collisions; + u64_stats_t rx_oam; + u64_stats_t tx_oam; }; =20 struct yt921x_mib { @@ -128,8 +130,8 @@ struct yt921x_mib { =20 struct delayed_work work; struct yt921x_mib_stats stats; - u64 rx_frames; - u64 tx_frames; + u64_stats_t rx_frames; + u64_stats_t tx_frames; }; =20 void yt921x_mib_poll(struct work_struct *work); --=20 2.53.0 From nobody Sat Sep 26 01:39:50 2026 Received: from mail-pl1-f174.google.com (mail-pl1-f174.google.com [209.85.214.174]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A103026FA60 for ; Sun, 6 Sep 2026 13:14:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788700487; cv=none; b=EeT+B/1w7Tx3GhCKnMMhth77UGpt5CCpZa6FiMi3C+e0lsbuDFhS0WAyFP9uehJ3gde17AKsLfwDMU8HOVflDQdjTLPWm28PYK3BMxTV2Ejpp1AtIPy7gkcTICaND9qSiLEjyKZbvuEH4L5puq/RzFu87WeCo1LB9EayFKwvc64= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788700487; c=relaxed/simple; bh=9Jb8n7vDY4dJwr6pHHqajfSV1mPdB7IBVsl7iVfr27s=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=u6+8IxoXK7oS3R57FcIXkXscGSGr3w7ZeRy3j8R4hoOsk54handBGQlhkozDSg+Hx5jBds2GTF4ZaQX+7Yz9hYca2j2ttwAYnz73IUa0DINvUu05tEsra6gLxwO+r+WB893Kp5PWg9iPqvp2H7tnfcGr6G5TKWiBAm3pALntVXM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=oO5Yogiw; arc=none smtp.client-ip=209.85.214.174 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="oO5Yogiw" Received: by mail-pl1-f174.google.com with SMTP id d9443c01a7336-2cfbbdfa60bso23086095ad.3 for ; Sun, 06 Sep 2026 06:14:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788700485; x=1789305285; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=i6gElCsnArSbZd6G/RahklGwF6i5infvyLxA5U9uKzQ=; b=oO5YogiwPvMS8Og8MSaeJnz3qg9fkujmRYOSp0WoyKGaopvWhaoPMGU+yxTvPNKLED CBIEwEjXLQQdkjInwQOm5DoBai9V33R1NFUkknM/8S6Gi81+zDAhsT1BcMKAz3b5LmFo XIB9XHO3NV1YVomwqX+qudQUjGcOGEM4D8O+8YmThh+b81TJNU3qBdaZJKBUXfYCMwFB i4LRNeuGrRBPI/4hfOfPP39itwmlNEZHUOKHRkzQ0XZQ3P+DQ2FZMmnSA8t1qQz7u7H0 1Z49rLrHM7yUyk2Ml8oKr+UaFWy/IG7njSmXGjvOcBsBxYA6sXByyL2/g90QzppAA5aU kNVw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788700485; x=1789305285; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=i6gElCsnArSbZd6G/RahklGwF6i5infvyLxA5U9uKzQ=; b=WkvwsimxYflNnf0osuJrEkdbue4avkK4I9B2NZ3qAKuVzO53jhpSkD8htie+gaUkC9 ICIvYiIP8jx9AEFZ/5VU0GF6iIb7m0x1a9SqAfQmEJflvEAaaXfZ0Gq8EJay5Jf2gLZn N568QBGUKljLvatHGmZffHdJfpg/n1fOeUl4XbC20X/6HZ+pNjTX5PXi6pk6SKoXz69H 1iyuPSe/KYNRhjCHTurS6+SKucf2Ce4p3c01k93CvQEoHArJAzUCrVygaZMKdaiiYJid wORert9eOpslf5BdFH48MX4SEIFEZ4+jBtGH+fO52PFmCDvrN/4JxPxospLcU0euQWJ9 K7UQ== X-Forwarded-Encrypted: i=1; AKwUvBxtPRImiBwI9excvzNm08t221k8CiIjI/TRJTca6cPjK9ztoBz9FZDHChVHWS0zrmphmi02W7Gqc/05opQ=@vger.kernel.org X-Gm-Message-State: AFuF++lvE1W1vzUnbiPyNfaLREJkdVZ0T0le7Hvx0THrLmVLodkVrQP6 0BJojLatDsgjiWQhPkCW/qvnYwqUZZs4OUsVtgVwaG2s0JkNRHgzLtIO X-Gm-Gg: AYBFou0nyjQa68l4KvpAfkDKIoZSrkzcVjlcEt8Wm05HzNiclLrg9RIoZ4TFvreAjVQ vZRzM82I95bqlvIcThfg6s1x/mqQlty9nzEQIkjTcYAZvaQb27dOvMfpHSdopkvbgj8NGv43smp 5A/6ZkaiuFkG7fDgYI78+DC2BZjQTGlm2QAFpvgdliBh/3TadFzFXRn1JeO2cUZ1h7CrBgy73/r qidmGqux801qg2WbmB8HJ6GvGlV4IZ7mKc9Ry1byB1Jo8Sl4LeohtyaindP0OMq9lDjMsm1AD1T 80xoPd5YZ+6DAq47/VrEl3nV8/vjODpB8Ubq+SfJq6glBmJqc6QN5ZFDk/MmKGK2IUHHy2eoouy GC+Pi9odr0pqQWhbHr/Q6VM/W7+7/mlLKR4DX7ytArjXf5I4pY0ZsTvcQqOEju2JoBpbqyZhaHx H+S3GHN2RyYNHINMTJg9ezMxV9evOnUfK1+6NI4z3FImkdqp23lZnQ/eNSmZpDv09U0lCiGDn5Z ZJkrKWizvdk2w== X-Received: by 2002:a17:902:d586:b0:2cf:b68a:340 with SMTP id d9443c01a7336-2db125f0cf2mr252283275ad.10.1788700484824; Sun, 06 Sep 2026 06:14:44 -0700 (PDT) Received: from d.home.yangfl.dn42 ([2a09:bac1:76a0:d30::4d0:7b]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2db1495b2f8sm32259965ad.21.2026.09.06.06.14.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 06 Sep 2026 06:14:44 -0700 (PDT) From: David Yang To: netdev@vger.kernel.org Cc: David Yang , Andrew Lunn , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Russell King , linux-kernel@vger.kernel.org Subject: [PATCH net-next v3 5/6] net: dsa: motorcomm: Fix MIB synchronization Date: Sun, 6 Sep 2026 21:14:10 +0800 Message-ID: <20260906131414.2683362-6-mmyangfl@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260906131414.2683362-1-mmyangfl@gmail.com> References: <20260906131414.2683362-1-mmyangfl@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The previous MIB sync was based on the false assumption that 64-bit variables are always atomic. To fix that: * .get_stats64() uses u64_stats_sync, together with u64_stats_t; * others take the free mutex lock if possible. To minimize time of the write side of u64_stats_sync, a per-port buffer is used so that all the stat can be written back altogether after IO operations. Signed-off-by: David Yang --- drivers/net/dsa/motorcomm/chip.c | 2 + drivers/net/dsa/motorcomm/mib.c | 90 +++++++++++++++++++------------- drivers/net/dsa/motorcomm/mib.h | 6 +++ 3 files changed, 63 insertions(+), 35 deletions(-) diff --git a/drivers/net/dsa/motorcomm/chip.c b/drivers/net/dsa/motorcomm/c= hip.c index e9730b9f8c62..392bf44d409e 100644 --- a/drivers/net/dsa/motorcomm/chip.c +++ b/drivers/net/dsa/motorcomm/chip.c @@ -19,6 +19,7 @@ #include #include #include +#include =20 #include #include @@ -3778,6 +3779,7 @@ static int yt921x_dsa_port_setup(struct dsa_switch *d= s, int port) pp->mib =3D pm; =20 pm->port =3D pp; + u64_stats_init(&pm->syncp); INIT_DELAYED_WORK(&pm->work, yt921x_mib_poll); } =20 diff --git a/drivers/net/dsa/motorcomm/mib.c b/drivers/net/dsa/motorcomm/mi= b.c index f5d39d22215d..8601d25fe988 100644 --- a/drivers/net/dsa/motorcomm/mib.c +++ b/drivers/net/dsa/motorcomm/mib.c @@ -92,6 +92,7 @@ static int yt921x_mib_read(struct yt921x_priv *priv, int = port) struct device *dev =3D to_device(priv); struct yt921x_mib *pm =3D pp->mib; struct yt921x_mib_stats *mib; + u64 *buf =3D pm->data; u64 rx_frames; u64 tx_frames; int res =3D 0; @@ -101,7 +102,6 @@ static int yt921x_mib_read(struct yt921x_priv *priv, in= t port) for (size_t i =3D 0; i < ARRAY_SIZE(yt921x_mib_descs); i++) { const struct yt921x_mib_desc *desc =3D &yt921x_mib_descs[i]; u32 reg =3D YT921X_MIBn_DATA0(port) + desc->offset; - u64_stats_t *valp =3D &((u64_stats_t *)mib)[i]; u32 val0; u64 val; =20 @@ -110,7 +110,7 @@ static int yt921x_mib_read(struct yt921x_priv *priv, in= t port) break; =20 if (desc->size <=3D 1) { - u64 old_val =3D u64_stats_read(valp); + u64 old_val =3D buf[i]; =20 val =3D (old_val & ~(u64)U32_MAX) | val0; if (val < old_val) @@ -124,9 +124,12 @@ static int yt921x_mib_read(struct yt921x_priv *priv, i= nt port) val =3D ((u64)val1 << 32) | val0; } =20 - u64_stats_set(valp, val); + buf[i] =3D val; } =20 + u64_stats_update_begin(&pm->syncp); + for (size_t i =3D 0; i < ARRAY_SIZE(yt921x_mib_descs); i++) + u64_stats_set(&((u64_stats_t *)mib)[i], buf[i]); rx_frames =3D u64_stats_read(&mib->rx_64byte) + u64_stats_read(&mib->rx_65_127byte) + u64_stats_read(&mib->rx_128_255byte) + @@ -143,6 +146,7 @@ static int yt921x_mib_read(struct yt921x_priv *priv, in= t port) u64_stats_read(&mib->tx_jumbo); u64_stats_set(&pm->rx_frames, rx_frames); u64_stats_set(&pm->tx_frames, tx_frames); + u64_stats_update_end(&pm->syncp); =20 if (res) dev_err(dev, "Failed to %s port %d: %i\n", "read stats for", @@ -191,16 +195,16 @@ yt921x_dsa_get_ethtool_stats(struct dsa_switch *ds, i= nt port, uint64_t *data) struct yt921x_priv *priv =3D to_yt921x_priv(ds); struct yt921x_port *pp =3D &priv->ports[port]; struct yt921x_mib *pm =3D pp->mib; - struct yt921x_mib_stats *mib; + u64 *buf; size_t j; =20 if (!pm) return; - mib =3D &pm->stats; + buf =3D pm->data; =20 mutex_lock(&priv->reg_lock); + yt921x_mib_read(priv, port); - mutex_unlock(&priv->reg_lock); =20 j =3D 0; for (size_t i =3D 0; i < ARRAY_SIZE(yt921x_mib_descs); i++) { @@ -209,9 +213,11 @@ yt921x_dsa_get_ethtool_stats(struct dsa_switch *ds, in= t port, uint64_t *data) if (!desc->name) continue; =20 - data[j] =3D u64_stats_read(&((u64_stats_t *)mib)[i]); + data[j] =3D buf[i]; j++; } + + mutex_unlock(&priv->reg_lock); } =20 int yt921x_dsa_get_sset_count(struct dsa_switch *ds, int port, int sset) @@ -245,8 +251,8 @@ yt921x_dsa_get_eth_mac_stats(struct dsa_switch *ds, int= port, mib =3D &pm->stats; =20 mutex_lock(&priv->reg_lock); + yt921x_mib_read(priv, port); - mutex_unlock(&priv->reg_lock); =20 mac_stats->FramesTransmittedOK =3D u64_stats_read(&pm->tx_frames); mac_stats->SingleCollisionFrames =3D u64_stats_read(&mib->tx_single_colli= sions); @@ -270,6 +276,8 @@ yt921x_dsa_get_eth_mac_stats(struct dsa_switch *ds, int= port, /* mac_stats->InRangeLengthErrors */ /* mac_stats->OutOfRangeLengthField */ mac_stats->FrameTooLongErrors =3D u64_stats_read(&mib->rx_oversize_errors= ); + + mutex_unlock(&priv->reg_lock); } =20 void @@ -286,12 +294,14 @@ yt921x_dsa_get_eth_ctrl_stats(struct dsa_switch *ds, = int port, mib =3D &pm->stats; =20 mutex_lock(&priv->reg_lock); + yt921x_mib_read(priv, port); - mutex_unlock(&priv->reg_lock); =20 ctrl_stats->MACControlFramesTransmitted =3D u64_stats_read(&mib->tx_pause= ); ctrl_stats->MACControlFramesReceived =3D u64_stats_read(&mib->rx_pause); /* ctrl_stats->UnsupportedOpcodesReceived */ + + mutex_unlock(&priv->reg_lock); } =20 static const struct ethtool_rmon_hist_range yt921x_rmon_ranges[] =3D { @@ -320,8 +330,8 @@ yt921x_dsa_get_rmon_stats(struct dsa_switch *ds, int po= rt, mib =3D &pm->stats; =20 mutex_lock(&priv->reg_lock); + yt921x_mib_read(priv, port); - mutex_unlock(&priv->reg_lock); =20 *ranges =3D yt921x_rmon_ranges; =20 @@ -345,6 +355,8 @@ yt921x_dsa_get_rmon_stats(struct dsa_switch *ds, int po= rt, rmon_stats->hist_tx[4] =3D u64_stats_read(&mib->tx_512_1023byte); rmon_stats->hist_tx[5] =3D u64_stats_read(&mib->tx_1024_1518byte); rmon_stats->hist_tx[6] =3D u64_stats_read(&mib->tx_jumbo); + + mutex_unlock(&priv->reg_lock); } =20 void @@ -355,39 +367,45 @@ yt921x_dsa_get_stats64(struct dsa_switch *ds, int por= t, struct yt921x_port *pp =3D &priv->ports[port]; struct yt921x_mib *pm =3D pp->mib; struct yt921x_mib_stats *mib; + unsigned int start; =20 if (!pm) return; mib =3D &pm->stats; =20 - stats->rx_length_errors =3D u64_stats_read(&mib->rx_undersize_errors) + - u64_stats_read(&mib->rx_fragment_errors); - stats->rx_over_errors =3D u64_stats_read(&mib->rx_oversize_errors); - stats->rx_crc_errors =3D u64_stats_read(&mib->rx_crc_errors); - stats->rx_frame_errors =3D u64_stats_read(&mib->rx_alignment_errors); - /* stats->rx_fifo_errors */ - /* stats->rx_missed_errors */ - - stats->tx_aborted_errors =3D u64_stats_read(&mib->tx_aborted_errors); - /* stats->tx_carrier_errors */ - stats->tx_fifo_errors =3D u64_stats_read(&mib->tx_undersize_errors); - /* stats->tx_heartbeat_errors */ - stats->tx_window_errors =3D u64_stats_read(&mib->tx_late_collisions); - - stats->rx_packets =3D u64_stats_read(&pm->rx_frames); - stats->tx_packets =3D u64_stats_read(&pm->tx_frames); - stats->rx_bytes =3D u64_stats_read(&mib->rx_good_bytes) - - ETH_FCS_LEN * stats->rx_packets; - stats->tx_bytes =3D u64_stats_read(&mib->tx_good_bytes) - - ETH_FCS_LEN * stats->tx_packets; + do { + start =3D u64_stats_fetch_begin(&pm->syncp); + + stats->rx_length_errors =3D u64_stats_read(&mib->rx_undersize_errors) + + u64_stats_read(&mib->rx_fragment_errors); + stats->rx_over_errors =3D u64_stats_read(&mib->rx_oversize_errors); + stats->rx_crc_errors =3D u64_stats_read(&mib->rx_crc_errors); + stats->rx_frame_errors =3D u64_stats_read(&mib->rx_alignment_errors); + /* stats->rx_fifo_errors */ + /* stats->rx_missed_errors */ + + stats->tx_aborted_errors =3D u64_stats_read(&mib->tx_aborted_errors); + /* stats->tx_carrier_errors */ + stats->tx_fifo_errors =3D u64_stats_read(&mib->tx_undersize_errors); + /* stats->tx_heartbeat_errors */ + stats->tx_window_errors =3D u64_stats_read(&mib->tx_late_collisions); + + stats->rx_packets =3D u64_stats_read(&pm->rx_frames); + stats->tx_packets =3D u64_stats_read(&pm->tx_frames); + stats->rx_bytes =3D u64_stats_read(&mib->rx_good_bytes) - + ETH_FCS_LEN * stats->rx_packets; + stats->tx_bytes =3D u64_stats_read(&mib->tx_good_bytes) - + ETH_FCS_LEN * stats->tx_packets; + stats->rx_dropped =3D u64_stats_read(&mib->rx_dropped); + /* stats->tx_dropped */ + stats->multicast =3D u64_stats_read(&mib->rx_multicast); + stats->collisions =3D u64_stats_read(&mib->tx_collisions); + } while (u64_stats_fetch_retry(&pm->syncp, start)); + stats->rx_errors =3D stats->rx_length_errors + stats->rx_over_errors + stats->rx_crc_errors + stats->rx_frame_errors; stats->tx_errors =3D stats->tx_aborted_errors + stats->tx_fifo_errors + stats->tx_window_errors; - stats->rx_dropped =3D u64_stats_read(&mib->rx_dropped); - /* stats->tx_dropped */ - stats->multicast =3D u64_stats_read(&mib->rx_multicast); - stats->collisions =3D u64_stats_read(&mib->tx_collisions); } =20 void @@ -404,9 +422,11 @@ yt921x_dsa_get_pause_stats(struct dsa_switch *ds, int = port, mib =3D &pm->stats; =20 mutex_lock(&priv->reg_lock); + yt921x_mib_read(priv, port); - mutex_unlock(&priv->reg_lock); =20 pause_stats->tx_pause_frames =3D u64_stats_read(&mib->tx_pause); pause_stats->rx_pause_frames =3D u64_stats_read(&mib->rx_pause); + + mutex_unlock(&priv->reg_lock); } diff --git a/drivers/net/dsa/motorcomm/mib.h b/drivers/net/dsa/motorcomm/mi= b.h index d84ae2f449ac..33992a5f9bdc 100644 --- a/drivers/net/dsa/motorcomm/mib.h +++ b/drivers/net/dsa/motorcomm/mib.h @@ -125,13 +125,19 @@ struct yt921x_mib_stats { u64_stats_t tx_oam; }; =20 +#define YT921X_MIB_NUM (sizeof(struct yt921x_mib_stats) / sizeof(u64_stats= _t)) + struct yt921x_mib { struct yt921x_port *port; =20 struct delayed_work work; + struct u64_stats_sync syncp; + /* protected by syncp OR priv->reg_lock */ struct yt921x_mib_stats stats; u64_stats_t rx_frames; u64_stats_t tx_frames; + /* protected by priv->reg_lock */ + u64 data[YT921X_MIB_NUM]; }; =20 void yt921x_mib_poll(struct work_struct *work); --=20 2.53.0 From nobody Sat Sep 26 01:39:50 2026 Received: from mail-pl1-f174.google.com (mail-pl1-f174.google.com [209.85.214.174]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 683DB3CCFB4 for ; Sun, 6 Sep 2026 13:14:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788700490; cv=none; b=JU0PQF6XN2jwNZKGccsI9LkRZqg7ZBIVHkoHWazfYhmaUakn5yn6VrPEqP0QHw+TKD8lkCjc+HoaQXz4vI5jX1pmQ5gHTeyNWOOVZOKfxhxUdmrDOlgaiD+kAnYXaPAXmJ0E8e49eNB3uOPCiaj6KeHTp+NmhK6eM2voOV7q4R0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788700490; c=relaxed/simple; bh=2uov7MjSgw7uaYly/JryV0QXvkNQbSYg+0flUoG78R4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=E8GTAYkFbLDshKu15/WhAC9m2WvmQ9V1qQYbCJr7lRq67xZjOwv6JPT/ozA5h4oFyd2x94Q5bAac88D330v6bf7FBtSUR1BoQu4C9DImlgQo2JEzplqTXkUWEVZlljp1jfdP0uH0YBwxUfw1H7jrCMjTke0IxzcL8zQOnN8mbVE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=R5iZAn2r; arc=none smtp.client-ip=209.85.214.174 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="R5iZAn2r" Received: by mail-pl1-f174.google.com with SMTP id d9443c01a7336-2d6fe26ef1cso26168225ad.2 for ; Sun, 06 Sep 2026 06:14:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788700488; x=1789305288; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=U+C0aiSr3C6LpsbjgLZ1pgIoaspgg1L4h/eAlXTaaGs=; b=R5iZAn2r1KQXzFFkDU55C+3kKflCF+vPTBdU40QhxQ99ojwYBUgGnfEdeKleDAVP4S nV3ZlDCMaowD/axuo6B8QMet/mZUJzcOItDkD0IWgcq5ROQDzUTli0tlg8f+eY4UiVgW FYgsr6CsZgLG3N+4whFEoG8t7rc/fcpkLB64oi0+aB6RsgxT3FIA0Picra7SjByWQf6+ dyjnSYMWFZ2ZLhK2CzfWYZwsE1eJlcpqdlKKzzS8CkIMDK0M5T1ihDwQETBaBaOvtXUm tyB9rrswb2Raq8l97PiOyX8vJXBwsVVTLCfh6LOjkV5CV+GS6m7SA9+OciYYYJlx2Q8f vMkg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788700488; x=1789305288; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=U+C0aiSr3C6LpsbjgLZ1pgIoaspgg1L4h/eAlXTaaGs=; b=K68XTInJw0JPviN6PD5q6luwJhqD5+MoxumnXOYN1wiaKjwmfUcORXIpwS3CoOc7UQ CYX77/cIJRUM05oU5h+FZ1RtWQthN3JbYXV4+n4tZmAKsMJguKQleByc1bbaO1Zx8WFO wqAnMGHvGvLos6djJLuhFAOVvsqMHVpd+oQyERdokJMM4YUrxw6YV43cfE48KVEU4JKc phJqkewWDwE92q6kmy6XmhUgqvRn+BSob4zeoF4Qn1maFcTW0/PHWCjkuQcj80dAOTb7 ZAoSNifcCedv0eKP2TP+tU5vAo5Kc2rlUapiVcNnNeKfQjcvMUeD1te9rH+RWL1FSJ4z g9oQ== X-Forwarded-Encrypted: i=1; AKwUvBzjiM194AeD9/nXWLEL12NilKorGXvyEJSBfpEZniJvlsjk+fSqhEZ0b1Uk9LTsaiNtvdmSEXIveHomNBQ=@vger.kernel.org X-Gm-Message-State: AFuF++nRSR5ZwRg/Ryz1SFKCnKXNLU9+On22t7IiwVXYheQsQ2Pt9Dzw /UR/F85qOg4MCvUvsTD5WPiA+0mExXjf7o4oiEk1HqWUEWeiQ7AW1H0H X-Gm-Gg: AYBFou208BHQexp5O8Tb69ktGFu+GMyAoJFhJG9LhEam/3PwGYqkr9yWtn6j8ED/KDs vYn8wHdoFP48k0wINQQgG7ktzMt3Zvk4Zq0tNX5th+K6mgyzTrPDfz+L/WT4avwsQpgCNYzQ4UL BoybGw3UTi753kWZZ7I/7MzTeTmbHwsOr60ou/+4PvZ0tzJUTuQfPfg67VB+OazWNT66IZF4Jv5 iIm/KjNTvaqeSkevCgHSQJbUvOOXJHuVVWv07+mn0heKaZOdvHr0fSlF16z4OQmKW1xQ8ZtFZY9 pW1ZZWddJZN2MH6jVzSDo6I37nit2E9OzajJvaPJD587h6JBrfyWEp0EO/p8lLM3ksy1vxhkU4P O9gnt5twpuxnwBIkNolHe/agHwZZcTrgs+KvjmI2LpYgkgePOJLkM7zGg3rqYHwzXk6gYttqgS8 XxVBQ0HN4uT10uXYtGgwVNv0YX8Sntzj8WUbrqdOrOer3d8tGfBg9X1idn8Qm0SR+00aKkKeNF4 sKn/D4madLu0w== X-Received: by 2002:a17:902:e951:b0:2d8:d4ce:7e3b with SMTP id d9443c01a7336-2db126289bbmr244806075ad.16.1788700487761; Sun, 06 Sep 2026 06:14:47 -0700 (PDT) Received: from d.home.yangfl.dn42 ([2a09:bac1:76a0:d30::4d0:7b]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2db1495b2f8sm32259965ad.21.2026.09.06.06.14.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 06 Sep 2026 06:14:47 -0700 (PDT) From: David Yang To: netdev@vger.kernel.org Cc: David Yang , Andrew Lunn , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Russell King , linux-kernel@vger.kernel.org Subject: [PATCH net-next v3 6/6] net: dsa: motorcomm: Use safe 64-bit counter reader Date: Sun, 6 Sep 2026 21:14:11 +0800 Message-ID: <20260906131414.2683362-7-mmyangfl@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260906131414.2683362-1-mmyangfl@gmail.com> References: <20260906131414.2683362-1-mmyangfl@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" 64-bit counter registers are read as two separate 32-bit transactions. If the low word wraps from about 0xffffffff to a small value while the high word increments between the two transactions, the recombined value becomes ((new_high << 32) | old_low), producing a spurious ~4 GiB jump. Use a safe counter reader for this. Signed-off-by: David Yang --- drivers/net/dsa/motorcomm/mib.c | 21 +++++++++------------ drivers/net/dsa/motorcomm/smi.c | 30 ++++++++++++++++++++++++++++++ drivers/net/dsa/motorcomm/smi.h | 2 ++ 3 files changed, 41 insertions(+), 12 deletions(-) diff --git a/drivers/net/dsa/motorcomm/mib.c b/drivers/net/dsa/motorcomm/mi= b.c index 8601d25fe988..cfae2977a77b 100644 --- a/drivers/net/dsa/motorcomm/mib.c +++ b/drivers/net/dsa/motorcomm/mib.c @@ -102,29 +102,26 @@ static int yt921x_mib_read(struct yt921x_priv *priv, = int port) for (size_t i =3D 0; i < ARRAY_SIZE(yt921x_mib_descs); i++) { const struct yt921x_mib_desc *desc =3D &yt921x_mib_descs[i]; u32 reg =3D YT921X_MIBn_DATA0(port) + desc->offset; - u32 val0; - u64 val; - - res =3D yt921x_reg_read(priv, reg, &val0); - if (res) - break; =20 if (desc->size <=3D 1) { u64 old_val =3D buf[i]; + u32 val0; + u64 val; + + res =3D yt921x_reg_read(priv, reg, &val0); + if (res) + break; =20 val =3D (old_val & ~(u64)U32_MAX) | val0; if (val < old_val) val +=3D 1ull << 32; - } else { - u32 val1; =20 - res =3D yt921x_reg_read(priv, reg + 4, &val1); + buf[i] =3D val; + } else { + res =3D yt921x_counter_read(priv, reg, &buf[i]); if (res) break; - val =3D ((u64)val1 << 32) | val0; } - - buf[i] =3D val; } =20 u64_stats_update_begin(&pm->syncp); diff --git a/drivers/net/dsa/motorcomm/smi.c b/drivers/net/dsa/motorcomm/sm= i.c index bf3adfd64165..27086602997b 100644 --- a/drivers/net/dsa/motorcomm/smi.c +++ b/drivers/net/dsa/motorcomm/smi.c @@ -63,6 +63,36 @@ int yt921x_reg_update_bits(struct yt921x_priv *priv, u32= reg, u32 mask, u32 val) return yt921x_reg_write(priv, reg, u); } =20 +/* Reliably read a 64bit counter */ +int yt921x_counter_read(struct yt921x_priv *priv, u32 reg, u64 *valp) +{ + u32 old_lo; + int res; + u32 hi; + u32 lo; + + res =3D yt921x_reg_read(priv, reg, &old_lo); + if (res) + return res; + + for (int i =3D 0; i < 16; i++) { + res =3D yt921x_reg_read(priv, reg + 4, &hi); + if (res) + return res; + res =3D yt921x_reg_read(priv, reg, &lo); + if (res) + return res; + + if (lo >=3D old_lo) { + *valp =3D ((u64)hi << 32) | lo; + return 0; + } + old_lo =3D lo; + } + + return -ETIMEDOUT; +} + static int yt921x_regs_read(struct yt921x_priv *priv, u32 reg, u32 *vals, unsigned int num_regs) diff --git a/drivers/net/dsa/motorcomm/smi.h b/drivers/net/dsa/motorcomm/sm= i.h index 212e20f71d80..d34240548af7 100644 --- a/drivers/net/dsa/motorcomm/smi.h +++ b/drivers/net/dsa/motorcomm/smi.h @@ -35,6 +35,8 @@ yt921x_reg_toggle_bits(struct yt921x_priv *priv, u32 reg,= u32 mask, bool set) return yt921x_reg_update_bits(priv, reg, mask, !set ? 0 : mask); } =20 +int yt921x_counter_read(struct yt921x_priv *priv, u32 reg, u64 *valp); + /* Some multi-word registers, like VLANn_CTRL, should be treated as a sing= le * long register. More specifically, writes to parts of its words won't be= come * visible, until the last word is written. --=20 2.53.0