From nobody Thu Sep 24 18:40:14 2026 Received: from mail-pj2-f13.google.com (mail-pj2-f13.google.com [74.125.227.141]) (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 2A10B4477EA for ; Mon, 21 Sep 2026 20:31:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.227.141 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790022687; cv=none; b=nJZhetBevJ0Q38X9KWoO+ojER1lPRpn5a41A8n4YypwOav1Eln8HfmVmBGu947ZcGbEaH1pQ1qI0O64Ps/+8HdutS09GYJYVWDlB/UAtI6Fr4pgIBC1BtKUM5Oq4+KTEhYC5KtqnQGNlyQxcqk7OL1QyvcD/78yOSXx7ROnU5bc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790022687; c=relaxed/simple; bh=Hfn/RFfA59PXEqWm88i0jT6Irs15cdflbyXalU9LxMI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=nhQf8/bzttnX8grwMa2b63YCUrXjgi0fN7it3fIeK1RFAFeAakQG9pIqSnKjTeRO/Xkn6PR8Kr9ZWNPhELc62oI/tv1Q7MkdhGbRFqfI0w3O2b7BcsED18GHyD9aRWEsewylUJj63IxyOfu61hKWv40Y7loA0xLHF7+yP3243Gk= 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=U1FGusiW; arc=none smtp.client-ip=74.125.227.141 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="U1FGusiW" Received: by mail-pj2-f13.google.com with SMTP id 98e67ed59e1d1-396ccb1a98fso3109906a91.1 for ; Mon, 21 Sep 2026 13:31:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1790022685; x=1790627485; 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=X5HDWmpx6LncuH8zbt4GsN7mum7FN5BQZYEBCPrt/7w=; b=U1FGusiWbl34A41xmVjEU3r/ysZfm+2S0LtTv1d8AozvQGsPZS9dK5Fp5ZOokEauSZ WEDJaXCi8J7fdWJCvI1nyR1BjsPNgh5+XsCqLQB/MA86aJm7l4fO4L0g9EW4rQPKB3+9 oFkU8cjZrJYjs+UeNsR0UJ+es4OcsYnVTe7gq6ABHUkHAgaCIawUbs8r6ZVkcLqSVjnp 8ExxtZv1LPWBGPhY2vuightI67MIlXfcQfLYpLXoeWWUwNJv1cgKx+DBdHKHIJ1emdJz NlDZoHzVEWfVLpH2RWCHg7TP/vhxHXZEempEShu/pf8a4uFNWKl8oAHAh/xbc1tr/Wh7 sbCQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1790022685; x=1790627485; 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=X5HDWmpx6LncuH8zbt4GsN7mum7FN5BQZYEBCPrt/7w=; b=uqoFMNRvsFWjSRt78AYNvcYU4VTj6Pte6eWBdBr6qi9nCBsvfkp/aPZ4r29zUTv3cK Zdclh/Aa5m3mG2wo760ynCvgSeg1a/ocnCBTwGvJL+SkalxfO2lNOIJK1tDPH8lkKrF/ b2cG/JTBvuYc1xCihjgIWQWc1P7eLQ9w50AbuM9diQ8UYh3/9dyW8bQw16LiZygAiUa7 4+eS4TIH9nAUFhmFiES7LigrVr5x44hIGeCydRWp4mwPdYw3N7CTpjzRSn0aAnwQEbnF aqrdnJejELkuL8GmslhUAkolVBLCEpqoaAwz4fkXZDHpd944XQot+OITxZAgd7jInG2D SlCA== X-Forwarded-Encrypted: i=1; AKwUvBzhTzRSEXtKJHaNarGFVNSl/wubfPJsPBMdUEzOdOIAiv4qdD9zEdlHXtG+2tVcDyi86Y0cHmtsWpyesV8=@vger.kernel.org X-Gm-Message-State: AFuF++m12djvOCI/mpSdux4L1QHuubQ6BvxTSmSseLQUAw19Ge37B9Nt q74sp5lq1KLAxDdJ3n9xB5agVQa9yfQXdAE7LRkV3F/wYwHu2cU4fpZq X-Gm-Gg: AYBFou2nSAqUcIckdked1dQVtNnfSURmIIL/Xv98a442oFi2DssSwE9ZoSSX8ddqtGq oHXxrB+K0Up13qKW7slQuEhXvYWOihueyMnyduz2WQVfwabWdrHF9ZU6NCKFrZT8BNPzjPuDcmn 1/YClRUQHz2OaHjOyPPotkuJjL2XS8LHQV1JD2e8Fp7HZrX7vVoD3muUXwQBXOLnzBLEMNtQFgm USv5MEWmJES6kwTKJlaPEcEPa+d9scZ/enwNDU4wFh9XsK34+S6kAep086Vi7rHQuWHM8pSSj4p XUvxNK0PYC1NPbKLp2K/Rma9iewnsg6DP0IBPk9RnqzragD1G1ljiogClEfvbRktkjw0zHdYpsN nZszPNB6weUYdsA3kksSXZqlyYT3IFoVM9wkHZqz1Fu/xznllwFyQayWORNMVuFVUhuo8j0GjX0 Jj/3IOt53/4QvsQryP6nQq2ZkHqKQ64eJT5igWiJsYpq3Y/X4OJyGpql00iv0saRlKcsJ9Z5HQS MyygqViVnsuc32I8GDgWv2E X-Received: by 2002:a17:90a:d64f:b0:39e:4c80:44b9 with SMTP id 98e67ed59e1d1-39e54dccbb8mr18482940a91.28.1790022685159; Mon, 21 Sep 2026 13:31:25 -0700 (PDT) Received: from d.home.yangfl.dn42 ([2a09:bac1:76c0:d30::4d0:61]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-3a069918587sm447247a91.4.2026.09.21.13.31.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 21 Sep 2026 13:31:24 -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 v4 1/7] net: dsa: motorcomm: Hoist port_to_priv helper into chip.h Date: Tue, 22 Sep 2026 04:30:18 +0800 Message-ID: <20260921203040.1203911-2-mmyangfl@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260921203040.1203911-1-mmyangfl@gmail.com> References: <20260921203040.1203911-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" yt921x_poll_mib() open-codes the same container_of_const() expression that leds.c defines as to_yt921x_priv(). Move the macro to chip.h as yt921x_port_to_priv() so both files use one definition. Signed-off-by: David Yang Reviewed-by: Andrew Lunn --- drivers/net/dsa/motorcomm/chip.c | 3 +-- drivers/net/dsa/motorcomm/chip.h | 3 +++ drivers/net/dsa/motorcomm/leds.c | 14 ++++++-------- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/drivers/net/dsa/motorcomm/chip.c b/drivers/net/dsa/motorcomm/c= hip.c index 8b0ac5fc8c8b..38e7879a9f1a 100644 --- a/drivers/net/dsa/motorcomm/chip.c +++ b/drivers/net/dsa/motorcomm/chip.c @@ -608,9 +608,8 @@ static void yt921x_poll_mib(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); unsigned long delay =3D YT921X_STATS_INTERVAL_JIFFIES; + struct yt921x_priv *priv =3D yt921x_port_to_priv(pp); int port =3D pp->index; int res; =20 diff --git a/drivers/net/dsa/motorcomm/chip.h b/drivers/net/dsa/motorcomm/c= hip.h index 83cd454955dd..9cd1010eb970 100644 --- a/drivers/net/dsa/motorcomm/chip.h +++ b/drivers/net/dsa/motorcomm/chip.h @@ -989,4 +989,7 @@ struct yt921x_priv { struct yt921x_acl_blk *acl_blks[YT921X_ACL_BLK_NUM]; }; =20 +#define yt921x_port_to_priv(pp) \ + container_of_const((pp), struct yt921x_priv, ports[(pp)->index]) + #endif diff --git a/drivers/net/dsa/motorcomm/leds.c b/drivers/net/dsa/motorcomm/l= eds.c index 87a6b9cf6068..dd5b3684250d 100644 --- a/drivers/net/dsa/motorcomm/leds.c +++ b/drivers/net/dsa/motorcomm/leds.c @@ -12,8 +12,6 @@ #define to_yt921x_led(led_cdev) \ container_of_const((led_cdev), struct yt921x_led, cdev) #define to_yt921x_port(led) ((led)->port) -#define to_yt921x_priv(pp) \ - container_of_const((pp), struct yt921x_priv, ports[(pp)->index]) #define to_device(priv) ((priv)->ds.dev) =20 static u32 yt921x_led_regaddr(struct yt921x_priv *priv, int port, int grou= p) @@ -321,7 +319,7 @@ yt921x_cled_brightness_set_blocking(struct led_classdev= *led_cdev, { struct yt921x_led *led =3D to_yt921x_led(led_cdev); struct yt921x_port *pp =3D to_yt921x_port(led); - struct yt921x_priv *priv =3D to_yt921x_priv(pp); + struct yt921x_priv *priv =3D yt921x_port_to_priv(pp); int res; =20 mutex_lock(&priv->reg_lock); @@ -337,7 +335,7 @@ yt921x_cled_blink_set(struct led_classdev *led_cdev, un= signed long *delay_on, { struct yt921x_led *led =3D to_yt921x_led(led_cdev); struct yt921x_port *pp =3D to_yt921x_port(led); - struct yt921x_priv *priv =3D to_yt921x_priv(pp); + struct yt921x_priv *priv =3D yt921x_port_to_priv(pp); int res; =20 mutex_lock(&priv->reg_lock); @@ -353,7 +351,7 @@ yt921x_cled_hw_control_get_device(struct led_classdev *= led_cdev) { struct yt921x_led *led =3D to_yt921x_led(led_cdev); struct yt921x_port *pp =3D to_yt921x_port(led); - struct yt921x_priv *priv =3D to_yt921x_priv(pp); + struct yt921x_priv *priv =3D yt921x_port_to_priv(pp); struct dsa_port *dp; =20 dp =3D dsa_to_port(&priv->ds, pp->index); @@ -374,7 +372,7 @@ yt921x_cled_hw_control_is_supported(struct led_classdev= *led_cdev, { struct yt921x_led *led =3D to_yt921x_led(led_cdev); struct yt921x_port *pp =3D to_yt921x_port(led); - struct yt921x_priv *priv =3D to_yt921x_priv(pp); + struct yt921x_priv *priv =3D yt921x_port_to_priv(pp); =20 if (yt921x_led_trigger_is_supported(priv, pp->index, led->group, flags)) return 0; @@ -386,7 +384,7 @@ yt921x_cled_hw_control_get(struct led_classdev *led_cde= v, unsigned long *flagsp) { struct yt921x_led *led =3D to_yt921x_led(led_cdev); struct yt921x_port *pp =3D to_yt921x_port(led); - struct yt921x_priv *priv =3D to_yt921x_priv(pp); + struct yt921x_priv *priv =3D yt921x_port_to_priv(pp); int res; =20 mutex_lock(&priv->reg_lock); @@ -401,7 +399,7 @@ yt921x_cled_hw_control_set(struct led_classdev *led_cde= v, unsigned long flags) { struct yt921x_led *led =3D to_yt921x_led(led_cdev); struct yt921x_port *pp =3D to_yt921x_port(led); - struct yt921x_priv *priv =3D to_yt921x_priv(pp); + struct yt921x_priv *priv =3D yt921x_port_to_priv(pp); int res; =20 mutex_lock(&priv->reg_lock); --=20 2.53.0 From nobody Thu Sep 24 18:40:14 2026 Received: from mail-pz2-f12.google.com (mail-pz2-f12.google.com [74.125.228.12]) (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 508DE446074 for ; Mon, 21 Sep 2026 20:31:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.228.12 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790022690; cv=none; b=oV+nv7eq7dPy2E7dWlnorANreovnFJJxph112rTzUsa0x0G6m14wdlEEAQ3Wi6iCh1XbvOTSE865dZc3J3b21Zi6ygX1P3K02Ew7ik8ywtnEVkZLpx81YLMYG4q5mLbiNVheHJ5A4MGzHdkZJViR/0qG2OcmzCLT8ySMfC7Z7pg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790022690; c=relaxed/simple; bh=QAlPQDjqzmcU7tGTAfcLsdZnAHc4UxOIvqQXA9BbnBk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=tLNY9jkUyTVcxXTYdU6CWtv+wUBw19BkPyWuFZGqiIxAGkt2kH6qHeP+jUD3FYSSlZOwp9LYTFP+DFY+qnvLRI+Ac6ts0Qv+W5fYq8OciHlEDUbYA//ANE7feJs58sGPa8rTN7Z7kH+4vaC+uuhLp/UTP0BaeVAv08cggFPvKg0= 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=FUVVDZQN; arc=none smtp.client-ip=74.125.228.12 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="FUVVDZQN" Received: by mail-pz2-f12.google.com with SMTP id 41be03b00d2f7-cc1cea50db3so2073052a12.1 for ; Mon, 21 Sep 2026 13:31:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1790022689; x=1790627489; 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=ppb9oEIswlXdPW+vpBbxCBnXLp5edxa/JlS8+/nLpFY=; b=FUVVDZQNpeIto7XRSV6Kp2UsP3H2h1Hg+YbdUAOyEhbkcqd/4nFzLBPvoOiWdGBmr/ SLCmlJFHAz6EvxbqpqBwPpZLa0FxPiuVsT4gXWiVMQNhMOEZII9hiPd+H49uorQi48mW neJx1WguIk0LYgPxAVN5j51lnsFh9NRQ3+Fpbq2j4VE7+PAdnH2DiAXuMIIJABaAF5di zY8tSejmMGd9F+XCgOHWJHlkEDUn3a3o9D3SxqVdZl88iXBp3Pq8PrR2lMLGThXlzVLs J4oDACA2IOkZr9I6i3fkvpPrkYyb5rp5qZMtz4vCxlkSYvV6nVMGKX/f1xGv79CV+ZO8 PdHw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1790022689; x=1790627489; 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=ppb9oEIswlXdPW+vpBbxCBnXLp5edxa/JlS8+/nLpFY=; b=hoO8ivuhfjhxjmwaAOIdt3hDspNVZce3iNKNRmE9NQNrsFbsh5ghulPMpkzdsZXjT5 ff9cLvZL+wHY5+Rhhd1K5xGOed8RVNwxfQQG9PyQYhATNHrks+iZ+REVAXMVfYrXeCW1 1o4/d4n+WfywCKdikgtuLUF0TdkH8d6O3J7m+SpCPFUUhR4ou9KPrXU5kcYT6YMSugzS /DFqXsFAWT5HYy1qxWcefIVrNWUMIZFKVKmnhsIYuYfZl3oRm9/7saqD7KB+sdyM6NEh cWYbv1CQpVnjrevTCM3X3ujYqXJi3cS19QuSfLN8ZYl1vSw9YLaZZkfpwUwH6TcBWCAi 3HGw== X-Forwarded-Encrypted: i=1; AKwUvBwN1lmfVlWpRYny0v1xWK9nomJnmNda1ePb33cg/dQ2hjkgsi22A9DourZMaYN/AUQPCkAM+tJqdyZmJNA=@vger.kernel.org X-Gm-Message-State: AFuF++khfNYVNgp2FC0cDK8ns/iF230dQcBve8Rn9VqzvRVUxEUwyT2I WPyLFMY02IE3SN/GSXrL4Bk4ofwI3Yr0t7zed/dL2seJYB/cf54dvwB6 X-Gm-Gg: AYBFou3V/F24A2Wo5t1e5M3RjBGm0hcQetrPwJF4oXkTFcvV9jleKSEJN1e0mTpmQCK sn+XXLLZKTQdNG2JhmU5ey2z1mGFxgaiQRplBGxf2OJOrMetMTfEpxUZnjYZr8ldOtcWJM4f3Bz yYxIvToTM0/v2Q9onF+BzA/8hJDPmb0wLvvZauhlCSSmUeamwwEM6dcGeL8FlgVx4HZbtuKoCpJ kDtCWJWM72ve+zSIYcHQDccyeSf+fp9xqATr00Jj9Dsr60ZcxMFvGOJG3Ts0MiXkEEXcHmXHfX/ gVihVRbNzGfTs3Gu2fFSoclP1Pn+pkAXOSHxfEnLLc+hV9Q2lYOemIaPIJSWYbISkbYZ7FN2KVm 5q0pOWxQxh5bTkKifVaTvzEoKWJjHNDZdd27Hxk0wx3cseyaPbuqt2PZcE6KgHfJlUYOeePw8dq ITXIbP7MrL9aDs5M7hy1NDCwWuUiFjy7VM89J6WP2YJqULHz+M/kcAgyZzZ2Ek2Y+BPICjXNFT8 eryhiK5pBZhyODDDclXWRX9YgWpd45LXJI= X-Received: by 2002:a17:90b:3ccf:b0:39e:4c7f:7309 with SMTP id 98e67ed59e1d1-39e550784ecmr17184273a91.32.1790022688616; Mon, 21 Sep 2026 13:31:28 -0700 (PDT) Received: from d.home.yangfl.dn42 ([2a09:bac1:76c0:d30::4d0:61]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-3a069918587sm447247a91.4.2026.09.21.13.31.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 21 Sep 2026 13:31:27 -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 v4 2/7] net: dsa: motorcomm: Rename MIB stuff Date: Tue, 22 Sep 2026 04:30:19 +0800 Message-ID: <20260921203040.1203911-3-mmyangfl@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260921203040.1203911-1-mmyangfl@gmail.com> References: <20260921203040.1203911-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 Reviewed-by: Andrew Lunn --- drivers/net/dsa/motorcomm/chip.c | 34 ++++++++++++++++---------------- drivers/net/dsa/motorcomm/chip.h | 4 ++-- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/drivers/net/dsa/motorcomm/chip.c b/drivers/net/dsa/motorcomm/c= hip.c index 38e7879a9f1a..d0b25ded2447 100644 --- a/drivers/net/dsa/motorcomm/chip.c +++ b/drivers/net/dsa/motorcomm/chip.c @@ -38,7 +38,7 @@ struct yt921x_mib_desc { #define MIB_DESC(_size, _offset, _name) \ {_size, _offset, _name} =20 -/* Must agree with yt921x_mib +/* Must agree with yt921x_mib_stats * * 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 @@ -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); @@ -614,7 +614,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; @@ -642,11 +642,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; @@ -684,10 +684,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; @@ -720,10 +720,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; @@ -749,10 +749,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; @@ -785,7 +785,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; @@ -821,10 +821,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; @@ -4748,7 +4748,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 9cd1010eb970..9205be423e39 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 Thu Sep 24 18:40:14 2026 Received: from mail-pz2-f42.google.com (mail-pz2-f42.google.com [74.125.228.42]) (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 90B1A446047 for ; Mon, 21 Sep 2026 20:31:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.228.42 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790022694; cv=none; b=OhzB0ITpkjwXagsSiJtq651xt+Yzm3bnT4QFnkLHODUKzPl8DfjNFEXIRjeerx8N9/wbQgneU2o9sM504RchWk5UpfSzwsc1dYVlupn42xzmGxIaHyv13lIgHE8EoZoAeHWiRmMb5/IKXTW+XkOujMq+ac19b3zl7p2gDTvH7uY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790022694; c=relaxed/simple; bh=BO8JwmBV7M12ZjIAPttKH9Od+v3YjgSk2L+BNnMqJ6g=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=X+lT1ZJEgqqtOo5mPmypYhrMfsqY5xqqpATSeyuhFbhuexdS8tJCsRQ2gHC0vVEhveFeqtJy1hcQohAniyl1FieyQ5YQ2UMxXrMvEUWxpJexc0/YBozkqWCKa1yXGhne3L+jA8xsmSdm/FV5DLHJyvUoSWl6d49OUYwPbdyvu6g= 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=dnQmFrOP; arc=none smtp.client-ip=74.125.228.42 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="dnQmFrOP" Received: by mail-pz2-f42.google.com with SMTP id 41be03b00d2f7-cc1cea4c7a0so1832179a12.1 for ; Mon, 21 Sep 2026 13:31:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1790022692; x=1790627492; 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=7X0mZcKDU1sVxFSU71+VLAMsKKyq9GSDr8CZcLYgm68=; b=dnQmFrOPktpiIaGPLVBDQ6XB7vNizVx/OzhIAPONMPGQ6NTG8/1jVjE87A65IoXk3m c8K/og1pDX9cL6iTm/25jS+XNq1r9WJBIrGc8sODr1cDJHoXxau/j9dfwH9jrkDKLU8d y/ABrOgmVL+qSp/gfVeRNywwpy1qk/XrSMB5lC769Qes66K42+1crcPBEjpLDhfiDfb8 63geUTdVcTqjWUJ6XakEgLpo3XOZSQuLLtk3gB8lfQzhKMlWP5rk+n4UJE9wAkcEKOZ9 b4oA3FoithOsSsp73DdmueZiVCzqJ+Sy8C18PN9EWjQfQwzyNCB0uA6luSS62TYx5fsI RAWQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1790022692; x=1790627492; 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=7X0mZcKDU1sVxFSU71+VLAMsKKyq9GSDr8CZcLYgm68=; b=2Ot+x5llvJoUkmP3D9B9Uqp7cWVzpAEP+UtGrAUZP4cid1/x7nCshlClUYcM8nEQo6 8XCUyGQBV/XyDtVEOAqn8PSEp5YaAxtYwUtIdgawhMgspNdEfWbFBhxeKuk0e4NKQYaa Bzn76DVLbpGbH7ECz0tw6EFn/aAgf+tesmqDkO8bimq4kRwwzc46651Glxqxek2S7adA 9x6mHSl2elImoWhoH4JI88GgbUXOXXx4bkFvNm1YBYKdGKrreZVGDGhCcYakDJbQsTMb VmmJF0tAIwb6tuFTstfpYhRWZ3ZtIjV3ko4DRkaJnpg9T/LXow7i0XuCiKAwIwvuCM7W V6sg== X-Forwarded-Encrypted: i=1; AKwUvBwR8Ya/ZP55/COX5CU0lKtfnvArofP19jpoPloe+PFm+A7dGPCW3q8IBklK2wAToS1ru3qrFty/yWSOABU=@vger.kernel.org X-Gm-Message-State: AFuF++lCyttQoH4GLx5Xja2S9BspEEz37bUWXMlgYbWvMg8KSOjOKHfA ur1XgONIWB2l+Z/J7cd0XOnJ5JMZTDDCTDbiQkSoVrxg0eLdKswZ0La9 X-Gm-Gg: AYBFou2fOcpflCx0hqVS+b+RrwfXnULh1B896pVXBuDjCuBqOeOfrNPQOitOws0kDIz x9gHuJg5fV4MHTsRJ/hYEyuBHaz1X4oBCdNXm3ODq39hfqU37JGlXE8SR6L/PViEwXKOWE6bkcz tMLaxSvogujos1i+dPpmQMDXQPcoLeqDl1c3Rp0X9ThwliSrFA3GksmaSRPrAW1M0u4UgG9XS5p dTAZ6Z1ifYSJDvZRn3izRfhdcb31u0tIV8PbJFvc71nULaG4dGp3UNsp0yO4aprRx+wWZIJ6fIw XTWfS2ZJBJobEf4X4dPoWQAM1Fn2xibdTo0HwNQUG7XDAWbdtD/HYzFJKkOZ0hO5iCsGYwfayxf yQAYjWYIZhGK0qN78oCZ3xXihIKGvu/qCAOrNMxl7GYOPfFCnqQVUaRSXhv2dCkMEa74GQ/W0Ob sr97f7vaY6OEJrRvUuwhPZMZ3bni76SyAWUFBxEqPWEwwccGwuBiXcYvekU84y8raoOFFizy8Ky KMgt5YLsfGVtQoamVBfGTVF X-Received: by 2002:a17:90b:384d:b0:39e:6c6a:2092 with SMTP id 98e67ed59e1d1-39e6c6a2289mr10102247a91.51.1790022691555; Mon, 21 Sep 2026 13:31:31 -0700 (PDT) Received: from d.home.yangfl.dn42 ([2a09:bac1:76c0:d30::4d0:61]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-3a069918587sm447247a91.4.2026.09.21.13.31.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 21 Sep 2026 13:31:31 -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 v4 3/7] net: dsa: motorcomm: Split MIB buffers Date: Tue, 22 Sep 2026 04:30:20 +0800 Message-ID: <20260921203040.1203911-4-mmyangfl@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260921203040.1203911-1-mmyangfl@gmail.com> References: <20260921203040.1203911-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 Reviewed-by: Andrew Lunn --- drivers/net/dsa/motorcomm/chip.c | 115 ++++++++++++++++++++++++------- drivers/net/dsa/motorcomm/chip.h | 16 +++-- 2 files changed, 100 insertions(+), 31 deletions(-) diff --git a/drivers/net/dsa/motorcomm/chip.c b/drivers/net/dsa/motorcomm/c= hip.c index d0b25ded2447..ad06d894b001 100644 --- a/drivers/net/dsa/motorcomm/chip.c +++ b/drivers/net/dsa/motorcomm/chip.c @@ -549,10 +549,13 @@ 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_stats *mib =3D &pp->mib; + struct yt921x_mib *pm =3D pp->mib; + struct yt921x_mib_stats *mib; int res =3D 0; =20 - /* Reading of yt921x_port::mib is not protected by a lock and it's vain + mib =3D &pm->stats; + + /* Reading of yt921x_mib_stats 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,8 +609,9 @@ static int yt921x_mib_read(struct yt921x_priv *priv, in= t 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_mib *pm =3D container_of_const(work, struct yt921x_mib, + work.work); + struct yt921x_port *pp =3D pm->port; unsigned long delay =3D YT921X_STATS_INTERVAL_JIFFIES; struct yt921x_priv *priv =3D yt921x_port_to_priv(pp); int port =3D pp->index; @@ -619,7 +623,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 @@ -642,9 +646,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); @@ -684,16 +693,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; @@ -720,7 +734,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); @@ -749,7 +768,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); @@ -785,7 +809,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; @@ -801,8 +830,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 + @@ -821,7 +850,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); @@ -3952,11 +3986,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); @@ -3975,6 +4012,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 @@ -3987,7 +4025,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 @@ -4107,11 +4147,40 @@ 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; + + /* get_stats64() might not be synchronized with port_teardown(), hold + * the MIB block till the device teardown + */ + 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) { + enable_delayed_work(&pm->work); + } else if (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); @@ -4666,6 +4735,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 */ @@ -4695,12 +4765,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++) { @@ -4748,7 +4812,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 9205be423e39..9f3c8af4f638 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 Thu Sep 24 18:40:14 2026 Received: from mail-pj2-f13.google.com (mail-pj2-f13.google.com [74.125.227.141]) (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 0694342E423 for ; Mon, 21 Sep 2026 20:31:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.227.141 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790022698; cv=none; b=YF8ZADx7j1Ra72ONcy4i8wYrK0GPst60hIXXkTMqBGpmjKYAOifSp/1f2/cvuHI8/Vqumdl3pU7me3EmoJ8XeB6dlhXl1KjwXvN2Oy6tGWW6IApwvSJSLorEg8ae8GsNVevHMSlCRHP0pTp9aplDgdAQFwJDNxosjQaPwbNnJr0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790022698; c=relaxed/simple; bh=AwKKiho82111IrPhVfVqNS+YDUf3xYYzLkEfU743KFs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=r55xZcAezPzsfOxxoAcBIMUtqFLhCIq0ZpdLp6rwD8ca6T4HK67Cr2ZsRs0l8ZHAFoWtk3+fsVzmfJAhIuMxxDwrDJDe1MgH47ds+qdmiTVYBpM/GDqq8kliBgEhsNJYmmrkCOTEGjeaOIUWfiWfSNs1WU0KpBQh0wb0I/FK2Uc= 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=rb1Q8D+A; arc=none smtp.client-ip=74.125.227.141 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="rb1Q8D+A" Received: by mail-pj2-f13.google.com with SMTP id d9443c01a7336-2d747ed6d6eso33959395ad.2 for ; Mon, 21 Sep 2026 13:31:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1790022695; x=1790627495; 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=riLXlmu0KZL9/Now9lygvGKlCPtBFxJ/9eGrQ5SKHqQ=; b=rb1Q8D+ACGqx29XtiJ5L5ywIulhV+K795BCHsbBopvimuZjXHNiM1DWm43um4tNpRv fMT0CIDQw77YCOeXI53Cwl6LlsHgY9U5jj6xbF9aB77pNnZXIKBcgRZdp3z2EOHdAgXR AHEPfcAFUD5oljTJkoG2KPhDvx8Fgr+wxSWzV90SkVEmRGkFkq9kJasZwgRuMLkKJHzU /PZjo3tINxgDxN6k9Nn5tHn99+eT0TYqrLZdCsF1UATzr7By2iSkOhJyZZ8Y8+9bo5Zv 6XvNeYX+/0WzGPTV+yu075rNyHKlB269bMRi1Wghfu1vLGYpEC2Q/P4nPc0F6ByHOplP uHAw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1790022695; x=1790627495; 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=riLXlmu0KZL9/Now9lygvGKlCPtBFxJ/9eGrQ5SKHqQ=; b=sja/5pOMtsK2EDz1ijKesuBxFBl7/9W0o0of1Ac7t/hI4llwWhhG3RbW0hAnxFJPXU nMCgiNhrGVZyGitU7AAofySh2fMVTf9t7Apm4znT5tNOGLWoBGanRa+cmRbrMwAqNqS7 zUKzN/eU45UrnbxmlxL+ADb/HmXQ6qlEESVp/XDkUN26MDXs45tzPEyzQEWoY448AE2X JcgPdGbRw0et8YCokMaHmK833D4Sd1vZ35b0krfx0sLvZMQwQNKlDIj/kYYwHc3fNSgO wbHax3hQXXP6FT/3U/UGdg5QmVSQUJ6uc1DkWESRlyxWaucAsQ0Q0TotrNRLx7bGTb+b Fs/g== X-Forwarded-Encrypted: i=1; AKwUvBxGZypd2+A40sOM+Az7FxxkC4IuxvDCMniQdSNni5d0o46DZc9CqQqfoPX5Ii5w3RvflCqp1XzRn14jNCs=@vger.kernel.org X-Gm-Message-State: AFuF++lkNJ2WH2HpDcrCVAGc2pZh1P7hT/kiJZO4x1pfTv02/4ijjCWS RU/BIgQYN0TNaUF5CDNVqDZWdei2YYQjHQvcH4ZVqf9tgBdC1kxyIYIH X-Gm-Gg: AYBFou0cy4re/Zrkk6oNy5liB6N8WzV5hnJJJ215P/OOtZKVXmuMuDHGWTYe3b4HQMl Jg/ClMZzkkCFFDhhZ2x2xda2oCwqxzNk6xFzNrKUPBMX7MWNVcT1zoz9OnHvG7CDrJe0arq2G0S OG+UjRUXRVTTQjX/uTPzLXZdhNCzCKigpzOoBu3m2xpFir4Z2cm5Zn5NsWMydey5u0kyLqeeZUS 5EP7YOSCl9afS9I6ytEHDzFeq1ZRjNJ30S2kwRGGSR8VcZEzrS1k0/q1j+uaaEd27Keg4auisFp Cwii5CNznij8m4VEGN+ox3mCPnwyi01+U4GnmyPCJqrf+hxmE7Lj+F4/4IR7n/BQaBMsCee+0Z+ k9A+4cr+2WCe1a9heK9jt+BUVVgI/JkYtqrBxmKDEzZ72txMfFg1NP3J1sG7EtMDSwaFmCxnbqZ zt8ied8i30jeuoYa9FpYR4qrul8tEOj0KIweSbLzQPVtku0IAiy9pDQ+QU5Y/cHQZu2IriIhADY EqOddfdR9gd/DpDoEAXVlYS X-Received: by 2002:a17:90a:d648:b0:39e:6c6a:4b6f with SMTP id 98e67ed59e1d1-39e6c6a5502mr10216010a91.57.1790022695090; Mon, 21 Sep 2026 13:31:35 -0700 (PDT) Received: from d.home.yangfl.dn42 ([2a09:bac1:76c0:d30::4d0:61]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-3a069918587sm447247a91.4.2026.09.21.13.31.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 21 Sep 2026 13:31:34 -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 v4 4/7] net: dsa: motorcomm: Split MIB module Date: Tue, 22 Sep 2026 04:30:21 +0800 Message-ID: <20260921203040.1203911-5-mmyangfl@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260921203040.1203911-1-mmyangfl@gmail.com> References: <20260921203040.1203911-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 Reviewed-by: Andrew Lunn --- drivers/net/dsa/motorcomm/Makefile | 1 + drivers/net/dsa/motorcomm/chip.c | 397 +--------------------------- drivers/net/dsa/motorcomm/chip.h | 124 --------- drivers/net/dsa/motorcomm/mib.c | 407 +++++++++++++++++++++++++++++ drivers/net/dsa/motorcomm/mib.h | 159 +++++++++++ 5 files changed, 568 insertions(+), 520 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 ad06d894b001..34dbbdcea135 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_stats - * - * 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,327 +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_mib_stats 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; - unsigned long delay =3D YT921X_STATS_INTERVAL_JIFFIES; - struct yt921x_priv *priv =3D yt921x_port_to_priv(pp); - 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 9f3c8af4f638..b2e39b70bf61 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..c2f7d7f83cd9 --- /dev/null +++ b/drivers/net/dsa/motorcomm/mib.c @@ -0,0 +1,407 @@ +// 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_stats + * + * 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_mib_stats 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; + unsigned long delay =3D YT921X_STATS_INTERVAL_JIFFIES; + struct yt921x_priv *priv =3D yt921x_port_to_priv(pp); + 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 Thu Sep 24 18:40:14 2026 Received: from mail-pj2-f43.google.com (mail-pj2-f43.google.com [74.125.227.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 ED9E445D1BF for ; Mon, 21 Sep 2026 20:31:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.227.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790022701; cv=none; b=QR/oXeKs7iO5SLUCdlQZ4/duvfhUu4eAqQsdHCLTL4B5KnC+GkGh8wVPNiDs13b4N2pxeVlfrPK9zPzqth144nYjOX398akCCfHBm3m4h+RmHERZpamoT9HN/sj+vSWnnebu++7qZCDZRPvzO5DCtaUAc5vNDnfA/rbAU/N7P74= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790022701; c=relaxed/simple; bh=yY4iGfaolqNcXbtbE1oj0vjbXwyoD+x/vZgrNSCo1Dk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=tG0wLraePwgbr1+UgQFBqRLX4GC2uCi1Bg6H9C6xnpvLPHxhHpiUnDi4gGBp0lYii3p2ttjhaWWtphAM0F25oT/SzFMbz01PNF4jCHz1CDUcwQ92SdeO3M5trxUzBQbn/R3se2vD6cflVkWqchYjPbn7hPBnE7QpkhLdsjj/M3w= 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=VeWQ2/kt; arc=none smtp.client-ip=74.125.227.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="VeWQ2/kt" Received: by mail-pj2-f43.google.com with SMTP id 98e67ed59e1d1-398b3b189e0so2983707a91.2 for ; Mon, 21 Sep 2026 13:31:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1790022698; x=1790627498; 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=oPgXE+60QT4oPBf5ZZ8vbnIhKGd3bdVTICwsd61ah8Y=; b=VeWQ2/kt6JrQOrr5sEPxd5CIDJ0RD5JE3Uu1lDFrMQMEe/nI7T43kwN4LM+z/g77sn +PtYx2wejQQHEI6SZjMkCyHDLw1w5tDyV0lOVEq0rB4tB7P7BEXA+rMjGRKNMMbWwWVU kRw8BN9eQ1Zr1BOPAsTATHaTZGWUimcN5D/w99bPV4AEPYnv+K+lVWVx3yeSA3U4VMo8 vV1bTfnfNJapGy9NMWxAhJzAD4EYYXF9B8UqmL/aPiSDr+jP/fgpqCsl/DEEIy1d4mto mkm7ReHXsbBf1AmUgOvdcczd5wzzV/rqP6kUTO7PHm1aqpYYLPYXkaZiIjjXo0n7S3tE P5MA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1790022698; x=1790627498; 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=oPgXE+60QT4oPBf5ZZ8vbnIhKGd3bdVTICwsd61ah8Y=; b=gynmwXINuhk/vPUxYrcz+HtUHjTQLcQDnM1V83J6LUYIpfi/yUySVBaydZMIWaskTq bGKubSAyRYqMND3ZFkZLQPUF6J2dbh6dOurnnUqB2oQ16AsJ5YThsgBjrMJlq7AEcEF/ ho/qgyRL3FFtuOP7heCdBJFOCh5FzOLAY1TerU5jmhbnbMO8BHq7O89M0FrnbKpcXSyI JIV5p4U6pXQiCSmCuEtFYhwWFwvwpD8qXlZbnHkwHp6lwo4xfUw3pgyCgtgzSfVC5B7H Q2Rbzym1TNxS6tZ14PjgepCi8t/p6+Z3aof4eVnUB+PpE67vaxF3wyj0jxFYeRsc5uIr 73oQ== X-Forwarded-Encrypted: i=1; AKwUvBzsH1sPLZ8iBSPnvHgiOzCWJ4Iwf7HT6Ci5kfcHZr8uqJzcF4PkkEfWFbBtTRpmt42oWDErbbALIS5PuWQ=@vger.kernel.org X-Gm-Message-State: AFuF++lzZWywGSTfET7ChUtLl2oPv9oLNcygaBis1+pvnuCnYq/Sfacx Ue16tN62Xlb0hj5FMGWYNtNiPJpYJCscCd5T8i7o8AiWBBQH+KiUzGr+ X-Gm-Gg: AYBFou19T28pjDKc0CUCpRBYGhBQYGD9lfmItMYG5QezFjDOFScPNi5WW+M6miPJ5Ql v9OavrGn4DpQmsYJNuYTP4LNjri4xk2DlxZGA39WiSJ4ZiUwWpr9e4EQoTDJ3Ke1lXK4HnvvLhz rj/B5YG+D0gvuQF8S7RqmsY+oX2tKF2c6vtd3VcP2XaTV4R7XsYGwn0k0DzdBPJkaviKrmE8h8c zErbAO8XoS64Rxtt+JJ3c984YGFKvyyo218/t64FysalkX7X2YmURm+N/dET/yVQ6tKRjgkungh oA0x7JQoX1MQzo2dlG1W1Cqv+eW7W5mHAZoG1iFLuFxx/LwTmgQZQJHSWcFy82L+Qzlum2NosZP 5cpcTSp0F6cGlb5M1iiNDxereUJw20EmIIfHqneyHxN7v4XlWEc7GZ91ROyNfbzK7cGX4XckrLK cqJgEqWc8BA5hM3nKVcxioM23SM5WvI0iJafc2+0tm9wC1FS3TgT0+vQF8BrhmbPf+ain4DwuWD z/daQhITqYDpagDiIAode4L X-Received: by 2002:a17:90b:4f8e:b0:39e:433:23b5 with SMTP id 98e67ed59e1d1-3a06ade9015mr129966a91.5.1790022697947; Mon, 21 Sep 2026 13:31:37 -0700 (PDT) Received: from d.home.yangfl.dn42 ([2a09:bac1:76c0:d30::4d0:61]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-3a069918587sm447247a91.4.2026.09.21.13.31.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 21 Sep 2026 13:31:37 -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 v4 5/7] net: dsa: motorcomm: Use u64_stats_t for MIB stats Date: Tue, 22 Sep 2026 04:30:22 +0800 Message-ID: <20260921203040.1203911-6-mmyangfl@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260921203040.1203911-1-mmyangfl@gmail.com> References: <20260921203040.1203911-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 Reviewed-by: Andrew Lunn --- 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 c2f7d7f83cd9..69b9eb7e5208 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_mib_stats 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", @@ -206,7 +208,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++; } } @@ -245,28 +247,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 @@ -286,8 +288,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 @@ -322,26 +324,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 @@ -357,32 +359,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 @@ -402,6 +406,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 Thu Sep 24 18:40:14 2026 Received: from mail-pj2-f13.google.com (mail-pj2-f13.google.com [74.125.227.141]) (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 69D7F44683D for ; Mon, 21 Sep 2026 20:31:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.227.141 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790022703; cv=none; b=Vcw+vLDKRZdVKD/yTy5YNPoYMg5HhLYYSaznNBIDikYRCv8W9rJAqUDUrjZuunyORt5MH1xpJsnaRJOEv+mgvFxEORHz/9u/OfcRkxhvzc14+UvqXHnTQGm/sQd+a2hkuOjwHGFs6eOW4BLundIm1Pc4EbDrN6cTVLCJfInTFls= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790022703; c=relaxed/simple; bh=RYNIxcDUEwNdN/J8gDD/mi00V9bO7FPW5XmRpz6CyJA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=fAYZdmMt5uf5NMtXqU1+mP1dY4Wk18yUTnyl+j+vZV2K6F1mtC2fuHhD4oS2dUWdc5EJXPpg7avt4qHzZtPQ42i17PCxfgt4BLcDgeEk9z0OktpPqM8u4dMC3RdhgVS+WYF1kIVTm+47+D59wh4FtWgFZXkcUbxm2p7trun8RH8= 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=pMO1emx8; arc=none smtp.client-ip=74.125.227.141 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="pMO1emx8" Received: by mail-pj2-f13.google.com with SMTP id 98e67ed59e1d1-39dbdfaef3cso2899344a91.1 for ; Mon, 21 Sep 2026 13:31:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1790022701; x=1790627501; 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=Vkt5IsYlW3mPew+aRkZIweeeFfqxwIBHN8u1e5hZtB0=; b=pMO1emx8grF2/bXKVSj0PafC9yVYjket+mcId124QeJ4Zv2gJkHtyXiSafmm0Wsr+g 8/ibRo/Pn4dxH16yMACOQDLVaG6XNCO6OyLJhr0izMpsy4pY5QjUPFZ23QfFmzR8kH8F oiSycvEvCXDpPWVTnQoaj6YFVPI3sEtDg8SYengEpKBlZv96tyTW/HwckobYCEsTOHT9 +ai+tJpFX1ZN+hqFRcOboEK6KZf/7Qk6Fid6QamLO27ZVkUmsMTh1EIGsSqj+nzKjod+ 2VD810Y6EDawkptbmqePJ5VDvdoays+Y7OzQVL4yvyoHEL4Jf0H0ToYw1jtnv6JThh33 L5UA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1790022701; x=1790627501; 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=Vkt5IsYlW3mPew+aRkZIweeeFfqxwIBHN8u1e5hZtB0=; b=bq2+kXVkNcNk1tXP4iytzd4UkyqjUBhIMNnmWnkp0TSc5huHy9wbjikZos62+KBZcE O9Imj2+oCQrscSvwMSIT65x3Im6bN2PJxPHlm33jsNC3E4DX9XuLlRdG5c0o05pxEt4s K/yb6l0VG8HGpQpY8xsGPZCv693jHo0d2aeIstg8+1ccvcBVv9zWDkk80W+NoOx7+WV+ HGaG9Y6mJD5s75gkhfYHkj011/ZDhP8WML7TdALv3V9FhHqX5Sx16hsEFXmKdvY5X8rZ dJIFb31paejzllHHPEcKw3+veYLOfBXdRqUFKWK3gR3fRtOwa5K67Tm0Ykj5dgR9/ARR yaig== X-Forwarded-Encrypted: i=1; AKwUvBz0U961kfeFVbE2VE3wkEYRRhWLi8B8V1giXQf1taYDc9pqmf8LUrfgAssjVdBvluKZZWwH7I4b4pEX7oU=@vger.kernel.org X-Gm-Message-State: AFuF++m0LIdVN5jBd+gOBGGML4hIl/FExXvVN++hJD3XesgeMNuaSzyM Q6xDWS6Xu+P2SleUb+cEKN/txJA8ZJjNDY1ck+VqMcUa65GiqY1VDT5L X-Gm-Gg: AYBFou3crNT6JZpq6REP3QRghllDfheBgVkh2I62wGolg2BIofljQ01Vbmf261ph79g FjaP9VeVzKfUwRu27r9xSUyMPSIA7TNcqpYmazQUYM2lYBBlrrP1a+Dz74XThm7i7ZVsSUIW9Wp JI7Oh2Ok39dB81Wtw4IvuHrO5Ewfv2cA4yU///ko5m6mKNIFKFnfIoHRuX8CCCmtfmLjBUDZSDU EmdBfPJ89ZjkUn8Pi2Lb3XbaLmNi/c1kQMba6REV6lvcYPILhPtVUDbxz+yDi8jfoSgg7LpMCGc fEZI4dUfAvUUrN183BaXnu2wt1k4QEOo0wh/FEgMEfXAclJT1OyQG3K1ABe3csDEC/vofAEAT0p 67LThgRgyvkZskmddSQsHDHUjvO03yYJQ4gd3KC7PgX5VaksHJ4+2bK5lbeLMx2OJWaKLrcQE2+ aCrin6RRpVa3FcoD30b7M5AGTtrdPX4/U+CFRiXhJWPcmMmaCn4ZSlV9yhOVmj1L+MPkmEO55ZY E+sW3rpcIHffSFcLMH0i4vJ X-Received: by 2002:a17:90b:518b:b0:39e:6c69:7778 with SMTP id 98e67ed59e1d1-39e6c697984mr12897667a91.33.1790022700737; Mon, 21 Sep 2026 13:31:40 -0700 (PDT) Received: from d.home.yangfl.dn42 ([2a09:bac1:76c0:d30::4d0:61]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-3a069918587sm447247a91.4.2026.09.21.13.31.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 21 Sep 2026 13:31:40 -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 v4 6/7] net: dsa: motorcomm: Fix MIB synchronization Date: Tue, 22 Sep 2026 04:30:23 +0800 Message-ID: <20260921203040.1203911-7-mmyangfl@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260921203040.1203911-1-mmyangfl@gmail.com> References: <20260921203040.1203911-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 Reviewed-by: Andrew Lunn --- drivers/net/dsa/motorcomm/chip.c | 2 + drivers/net/dsa/motorcomm/mib.c | 93 ++++++++++++++++++++------------ drivers/net/dsa/motorcomm/mib.h | 6 +++ 3 files changed, 66 insertions(+), 35 deletions(-) diff --git a/drivers/net/dsa/motorcomm/chip.c b/drivers/net/dsa/motorcomm/c= hip.c index 34dbbdcea135..292a43f5d442 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 @@ -3783,6 +3784,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 69b9eb7e5208..f5197c1d2d7f 100644 --- a/drivers/net/dsa/motorcomm/mib.c +++ b/drivers/net/dsa/motorcomm/mib.c @@ -74,6 +74,8 @@ static const struct yt921x_mib_desc yt921x_mib_descs[] = =3D { MIB_DESC(1, YT921X_MIB_DATA_TX_OAM, "TxOAM"), }; =20 +static_assert(ARRAY_SIZE(yt921x_mib_descs) =3D=3D YT921X_MIB_STAT_NUM); + /* The interval should be small enough to avoid overflow of 32bit MIBs. * * Until we can read MIBs from stats64 call directly (i.e. sleep @@ -92,6 +94,8 @@ 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; + unsigned long flags; u64 rx_frames; u64 tx_frames; int res =3D 0; @@ -101,7 +105,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 +113,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 +127,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 + flags =3D u64_stats_update_begin_irqsave(&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 +149,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_irqrestore(&pm->syncp, flags); =20 if (res) dev_err(dev, "Failed to %s port %d: %i\n", "read stats for", @@ -190,16 +197,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++) { @@ -208,9 +215,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) @@ -244,8 +253,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); @@ -269,6 +278,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 @@ -285,12 +296,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 { @@ -319,8 +332,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 @@ -344,6 +357,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 @@ -354,39 +369,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 @@ -403,9 +424,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..55719c29992b 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_STAT_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_STAT_NUM]; }; =20 void yt921x_mib_poll(struct work_struct *work); --=20 2.53.0 From nobody Thu Sep 24 18:40:14 2026 Received: from mail-pj2-f43.google.com (mail-pj2-f43.google.com [74.125.227.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 A63764908D2 for ; Mon, 21 Sep 2026 20:31:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.227.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790022706; cv=none; b=a2oG5KfUpRl8Idi7zXxLB5S7rwaBsuSAK1LoIkzitSZvi9kU5+gsnCvV4eEt1Ieme0IbJpmIgZuvaGcrGRAxgiwAxhFwpEQzRo3M1tcrJcM929J2aRuf4TmaHl2G/0vk3lT10lsMuui1ocj3TExEiF8VwIaFGXR+mBYVs5XUyPQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790022706; c=relaxed/simple; bh=KxcqtCvLZZ0FyVbRd+9oxq5AkeO67/xxT1gvgXU7Dyo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=GrmNeZTagHFQbFDNCTDQZyKZ5ERWIG4NFQNiebixJOGUnaELQvh/+PTN7+q6mBeo8D/jS7gzYzEp9dP9CYmipX/92EGBxA33UJc8KjEVwiL1beQO2xKmUraRWfuS+DKEejTFs1vdROcOLlzrCOXYIH6/LLOKezwAY5HWGCe/I/A= 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=jmbby6a2; arc=none smtp.client-ip=74.125.227.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="jmbby6a2" Received: by mail-pj2-f43.google.com with SMTP id 98e67ed59e1d1-39b910bdf2eso2366179a91.2 for ; Mon, 21 Sep 2026 13:31:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1790022704; x=1790627504; 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=0oy7EV2JGAs9rxMIj6O8TddVtVASSLTNO0sqL2nzDGY=; b=jmbby6a2Ybi+OT2ZPFgx76sTrDbSJC6qPzFO+odIGyMDFUkhBQKE3k0wFzttd59kzV RZSensOLP0o+2mZNHQdmHLNab0raYpTwAU+7QAAsbIRw/IXCkWTZk9GcUQ9O9xXS0VHV c2KzLnUKnyQtp/1zokCZmVgeFiespbrEEXLMaqcsI4jl659cYMYWHfYMSKRjBn25abIJ 6hSfotU1srumsk3LAvS0oxC43IDQSCPtnt/J3L6SJ00CWMhp1sgxr5Rcik2g7KdC8OQH VazEsAT3ArtbKeH/9wj0D/E8jFlQWZFuycnidGlpzZFMiC94MMD9nes/LYh2851Q8+QE cEVQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1790022704; x=1790627504; 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=0oy7EV2JGAs9rxMIj6O8TddVtVASSLTNO0sqL2nzDGY=; b=TPdUy96T6xAADCR12NGk+A7243vxOPoiQqRvTVDD+uDpTY6C9DpjV0CTnqI8EOtJpX log54Rso/Tu8tKhxgHc9Mavmpdg2SzkRt75xRf12tHrB37PHvoooDHeZsEsxQX13+XnL JjM8Akr29JdzJq2XHT6dW3ihNEJ/pt6B/exnu6vpIzGmAk1rhDHwpvg2o5TLS31YYdpJ 55ZpFhHdhvUE9GNF9wzzrkRsFudQAjfG7z3f4QtB3UNVbND0UP1NmQlccxn2d9YwHqj/ sX+1xeA0ZYkGPcACQe8LSk0SZ4ZPcy9mfk9YAVLDv7nZWcupklKAUYxD9PP8DM+Y+Kwc 95aQ== X-Forwarded-Encrypted: i=1; AKwUvBwYtYCz6x3Q+BHXKTFxZFdjzAVjMGEL1RT1pjAwjrVz1mYiIc7vWB9G2B1nBr0vepBVUqrUI4G54aHar1w=@vger.kernel.org X-Gm-Message-State: AFuF++n+qctSIrogX3IrcZoPRy7QKHSwwB3+yT5wmhBLlIywwIGdIsh/ uTI/lvTB6z5xGtwsMDnFbUTVAxnxghGQPNg9Ub6kv8b/IHaI+ZUJ+0RV X-Gm-Gg: AYBFou3lPP8QXPjOcvX13N0MnEdpv6+FCypvtW/g/YgowVRx7hd2YY3tjiRDvU/Wl2F L7XYCutLKm9UWsI6AoNbyjhAZTqcofQX3NVFCTxfWOlN5Ic7o6EuHf98jKtSoJDU1nXsS4/bQkk TtkrZ/s14hQVZl4h/kWGeKaIvovQ6kyQ9msTCzMxe8CHTAwUQg0zqcJsG+uJ4UK4DZ62G8gR77a aWRXi0/vi3vnwGclKVxJ5hl+sfF+N3iGcUCr5bBA32IaVfI+qWb+SubiOppXQ2UlB6rvIQJ8w5B XVop7Er93dVWcWktiIXnThkydWLgD9E0IqP1gB1gOauj4DW1HKnx+NoHswXr1b5o7yIWjjVlGdV 07Z0oyRbVXiaSXqmBPTCcj8TEJfBSOZEK11TLsNfd7my3IiyhWg7G1sHN86M8966BX7gkcL6Ret +mqF/87R0IdZfNcLMRzgjH8j5uVFccNqknwyOcbr0jsPozXrt0IQVG2/CJvmuyjAHCWSm7DA777 6aNt6OZK5RuuyQ65QHhhX0As5f/GTSyTAQ= X-Received: by 2002:a17:90b:4c8c:b0:3a0:58e2:db0a with SMTP id 98e67ed59e1d1-3a058e2e23dmr2585368a91.27.1790022703454; Mon, 21 Sep 2026 13:31:43 -0700 (PDT) Received: from d.home.yangfl.dn42 ([2a09:bac1:76c0:d30::4d0:61]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-3a069918587sm447247a91.4.2026.09.21.13.31.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 21 Sep 2026 13:31:43 -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 v4 7/7] net: dsa: motorcomm: Use safe 64-bit counter reader Date: Tue, 22 Sep 2026 04:30:24 +0800 Message-ID: <20260921203040.1203911-8-mmyangfl@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260921203040.1203911-1-mmyangfl@gmail.com> References: <20260921203040.1203911-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 Reviewed-by: Andrew Lunn --- 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 f5197c1d2d7f..2786d9ec2932 100644 --- a/drivers/net/dsa/motorcomm/mib.c +++ b/drivers/net/dsa/motorcomm/mib.c @@ -105,29 +105,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 flags =3D u64_stats_update_begin_irqsave(&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