From nobody Sat Sep 26 04:29:59 2026 Received: from mail-pj1-f53.google.com (mail-pj1-f53.google.com [209.85.216.53]) (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 BEC12501F4A for ; Fri, 4 Sep 2026 16:31:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.53 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788539471; cv=none; b=F6F2+ezegrsUgH3QdrtKh5zqNlZAZkgDId0UNoz0aZBM1BuuxZSv44Kd/Lf/0pY7B3kZEw8wuXDsYnh6E8hIbfaTS7MTGmFVk8P09CWwyDyVi1ykxMc0dl68Bsn/Q9M8TYlt2VJAoUqHFKwTNEoEA9/KQwrrUrlYAVXYI9KrTpk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788539471; c=relaxed/simple; bh=5Ue5J4wvdwmg3xCmIKxESOSyEdVbksmLLx4XYpOlFq0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=UG9K+e0tgqAwzVjXDm8QvjazCc3FB0WS01YkhgZW7ZtoFJsqVFT4Hu48cd4mUZmLcZlKm5zNvxTXoU0fGnwJYWmHsn+Myj34QhxNMi88IuI8XM4giaJUOJMYb4vCvy9AsKBU3hFQ3GQglehfhJC4f6N43TnGG0r9+y3mst7yWOY= 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=id2h+cV/; arc=none smtp.client-ip=209.85.216.53 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="id2h+cV/" Received: by mail-pj1-f53.google.com with SMTP id 98e67ed59e1d1-398e9698a70so1054753a91.0 for ; Fri, 04 Sep 2026 09:31:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788539469; x=1789144269; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=iXCbtCROcfidG6D2f2XjEN8/M12v+19c6nPqKarGz8g=; b=id2h+cV/t17+CGlBMwkQSHwSd4kH4d9zp0o2vkdrJwZ0pfZsGQBx0rTK6oLBOUh0r0 ClnI6QfHszTkYdVdCm6GKc2/spZFy92VlXJX95aSwj2OOtrux9xYISMisGrFREyYLLcD gFCphFJ0IlC2ZolMDdRm/PJsvDqTBIaKFwBaQFPgI8PaFcNra5wUoBasCG3XYSASp9C5 qXl7G/FcuDwaxRZkGH7i35T4tMC0N0mNKd1WTeJ6+bq7S2xodgxhX8BCsx78eYfmL1kT KyMjWkfL1DnHKqlqfvElO1hAqFsTiAOQYix2ao7s406SxxecsowP9m2Eq6oNF9ltyE6k SR6A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788539469; x=1789144269; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=iXCbtCROcfidG6D2f2XjEN8/M12v+19c6nPqKarGz8g=; b=PhX1/0rr9sasFinTQErOV91VHiauZbkrqaxDELXUhSIS2/bUgVUoQDnIwnb34Gxear cxbepvpqibbfxZDfDaSiehPS1rKvu6Yc8lGcJB+o5N5C44OAx12eOsuaBa5LQS5/KdEp +EI55i2DdTS63Awzs3xzdSTiopNtG6YVfeTE6wsRFjWl70brL2PHrn4Scw/TkRFEWt2V JwhfXaQB0zVLpVzERWr03edihaqxcr6EAxyzDTLWKPg3iTWEfWMTGchiPUbshrmj+1Qr FfOy6d4bYM7wNXpBBEn/iWQtRVX/K5JEg9G4soRC5bF8ZDLqKqapBMLsODvRICcr/7uK M1WA== X-Forwarded-Encrypted: i=1; AKwUvBzGTDFBdfVfjmN4BlDCMJhl+AX9pOSFsXD/ZKXbt5sgI5tFEXl/yevqM3O2hDeNDyB+6gchOkPvAfkUBB4=@vger.kernel.org X-Gm-Message-State: AFuF++ktpGXpGwiI1tJcyshCU1dH9imxb88mGN0YoHF6p+CPCsWS3+rW aZn5g5eJNyAy4V396MoAPdzeS+UXbpMxyOpTZE6VlhMGzXGIO1AaPvi5 X-Gm-Gg: AYBFou0b59wZqnpva7SUNLm8pmMX8y3SsSQSXAa5AtGPPmyd4/Y+ey85tkHDwoF+Rnw Y65b1GSRHaGAq0ys0Bxq/Cil21c4V8m8hWIDei9n0igtEkaE+2X1JEeRtW0F6uUMq0Qm/ho+TtP a+IL55yLh9qrm9spYpXWbkleTVJgkwYLQcRM+OVGGO/Pe46PsEeuUhChTZUg7rlHT8JpM84H9sB xk9gBj8njU/fhzEW+XMslHR6joYDcEwFTbl3C5uwaOHqXnM0PuMJ88NtMhqO+QEv6/NSpOjGzqv 3Xs1bRLQkMHbvKr4VpKzHoQhd4nhzBjeREs9nbYbYOJyxeNbKo8ctzsgRtYmycUNIsPJ7hSqKe/ F2G6xPObMJuCr4x6KoXdTPaCtbxdurDEnzWZlSrQP+fScBHj/kxdGoLQmm5SRZ8qz1KmevmmLDu RjPtsQXvwl9Kr3R0jiy6KPMHwlO2mVnAygaqUJaorfa1OBqi/owJ0GOxm96hYqNRtz2nwzzP51G exOhMe5uUD+GXg= X-Received: by 2002:a17:90b:2749:b0:398:d292:e6d5 with SMTP id 98e67ed59e1d1-39b26304385mr11635748a91.24.1788539468714; Fri, 04 Sep 2026 09:31:08 -0700 (PDT) Received: from d.home.yangfl.dn42 ([2a09:bac5:661b:3050::4d0:46]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-39b25c974cfsm5383010a91.0.2026.09.04.09.31.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 04 Sep 2026 09:31:08 -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 v2 1/6] net: dsa: motorcomm: Rename MIB stuffs Date: Sat, 5 Sep 2026 00:29:43 +0800 Message-ID: <20260904162952.709368-2-mmyangfl@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260904162952.709368-1-mmyangfl@gmail.com> References: <20260904162952.709368-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 | 32 ++++++++++++++++---------------- drivers/net/dsa/motorcomm/chip.h | 4 ++-- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/drivers/net/dsa/motorcomm/chip.c b/drivers/net/dsa/motorcomm/c= hip.c index d663af010f43..ad5fe1ccb1d7 100644 --- a/drivers/net/dsa/motorcomm/chip.c +++ b/drivers/net/dsa/motorcomm/chip.c @@ -545,11 +545,11 @@ yt921x_mbus_ext_init(struct yt921x_priv *priv, struct= device_node *mnp) } =20 /* Read and handle overflow of 32bit MIBs. MIB buffer must be zeroed befor= e. */ -static int yt921x_read_mib(struct yt921x_priv *priv, int port) +static int yt921x_mib_read(struct yt921x_priv *priv, int port) { struct yt921x_port *pp =3D &priv->ports[port]; struct device *dev =3D to_device(priv); - struct yt921x_mib *mib =3D &pp->mib; + struct yt921x_mib_stats *mib =3D &pp->mib; int res =3D 0; =20 /* Reading of yt921x_port::mib is not protected by a lock and it's vain @@ -604,7 +604,7 @@ static int yt921x_read_mib(struct yt921x_priv *priv, in= t port) return res; } =20 -static void yt921x_poll_mib(struct work_struct *work) +static void yt921x_mib_poll(struct work_struct *work) { struct yt921x_port *pp =3D container_of_const(work, struct yt921x_port, mib_read.work); @@ -615,7 +615,7 @@ static void yt921x_poll_mib(struct work_struct *work) int res; =20 mutex_lock(&priv->reg_lock); - res =3D yt921x_read_mib(priv, port); + res =3D yt921x_mib_read(priv, port); mutex_unlock(&priv->reg_lock); if (res) delay *=3D 4; @@ -643,11 +643,11 @@ yt921x_dsa_get_ethtool_stats(struct dsa_switch *ds, i= nt port, uint64_t *data) { struct yt921x_priv *priv =3D to_yt921x_priv(ds); struct yt921x_port *pp =3D &priv->ports[port]; - struct yt921x_mib *mib =3D &pp->mib; + struct yt921x_mib_stats *mib =3D &pp->mib; size_t j; =20 mutex_lock(&priv->reg_lock); - yt921x_read_mib(priv, port); + yt921x_mib_read(priv, port); mutex_unlock(&priv->reg_lock); =20 j =3D 0; @@ -685,10 +685,10 @@ yt921x_dsa_get_eth_mac_stats(struct dsa_switch *ds, i= nt port, { struct yt921x_priv *priv =3D to_yt921x_priv(ds); struct yt921x_port *pp =3D &priv->ports[port]; - struct yt921x_mib *mib =3D &pp->mib; + struct yt921x_mib_stats *mib =3D &pp->mib; =20 mutex_lock(&priv->reg_lock); - yt921x_read_mib(priv, port); + yt921x_mib_read(priv, port); mutex_unlock(&priv->reg_lock); =20 mac_stats->FramesTransmittedOK =3D pp->tx_frames; @@ -721,10 +721,10 @@ yt921x_dsa_get_eth_ctrl_stats(struct dsa_switch *ds, = int port, { struct yt921x_priv *priv =3D to_yt921x_priv(ds); struct yt921x_port *pp =3D &priv->ports[port]; - struct yt921x_mib *mib =3D &pp->mib; + struct yt921x_mib_stats *mib =3D &pp->mib; =20 mutex_lock(&priv->reg_lock); - yt921x_read_mib(priv, port); + yt921x_mib_read(priv, port); mutex_unlock(&priv->reg_lock); =20 ctrl_stats->MACControlFramesTransmitted =3D mib->tx_pause; @@ -750,10 +750,10 @@ yt921x_dsa_get_rmon_stats(struct dsa_switch *ds, int = port, { struct yt921x_priv *priv =3D to_yt921x_priv(ds); struct yt921x_port *pp =3D &priv->ports[port]; - struct yt921x_mib *mib =3D &pp->mib; + struct yt921x_mib_stats *mib =3D &pp->mib; =20 mutex_lock(&priv->reg_lock); - yt921x_read_mib(priv, port); + yt921x_mib_read(priv, port); mutex_unlock(&priv->reg_lock); =20 *ranges =3D yt921x_rmon_ranges; @@ -786,7 +786,7 @@ yt921x_dsa_get_stats64(struct dsa_switch *ds, int port, { struct yt921x_priv *priv =3D to_yt921x_priv(ds); struct yt921x_port *pp =3D &priv->ports[port]; - struct yt921x_mib *mib =3D &pp->mib; + struct yt921x_mib_stats *mib =3D &pp->mib; =20 stats->rx_length_errors =3D mib->rx_undersize_errors + mib->rx_fragment_errors; @@ -822,10 +822,10 @@ yt921x_dsa_get_pause_stats(struct dsa_switch *ds, int= port, { struct yt921x_priv *priv =3D to_yt921x_priv(ds); struct yt921x_port *pp =3D &priv->ports[port]; - struct yt921x_mib *mib =3D &pp->mib; + struct yt921x_mib_stats *mib =3D &pp->mib; =20 mutex_lock(&priv->reg_lock); - yt921x_read_mib(priv, port); + yt921x_mib_read(priv, port); mutex_unlock(&priv->reg_lock); =20 pause_stats->tx_pause_frames =3D mib->tx_pause; @@ -4749,7 +4749,7 @@ static int yt921x_mdio_probe(struct mdio_device *mdio= dev) struct yt921x_port *pp =3D &priv->ports[i]; =20 pp->index =3D i; - INIT_DELAYED_WORK(&pp->mib_read, yt921x_poll_mib); + INIT_DELAYED_WORK(&pp->mib_read, yt921x_mib_poll); } =20 ds =3D &priv->ds; diff --git a/drivers/net/dsa/motorcomm/chip.h b/drivers/net/dsa/motorcomm/c= hip.h index 83cd454955dd..805febb48683 100644 --- a/drivers/net/dsa/motorcomm/chip.h +++ b/drivers/net/dsa/motorcomm/chip.h @@ -861,7 +861,7 @@ enum yt921x_fdb_entry_status { #define yt921x_port_is_internal(port) ((port) < 8) #define yt921x_port_is_external(port) ((port) =3D=3D 8 || (port) =3D=3D 9) =20 -struct yt921x_mib { +struct yt921x_mib_stats { u64 rx_broadcast; u64 rx_pause; u64 rx_multicast; @@ -940,7 +940,7 @@ struct yt921x_port { bool isolated; =20 struct delayed_work mib_read; - struct yt921x_mib mib; + struct yt921x_mib_stats mib; u64 rx_frames; u64 tx_frames; =20 --=20 2.53.0 From nobody Sat Sep 26 04:29:59 2026 Received: from mail-pj1-f47.google.com (mail-pj1-f47.google.com [209.85.216.47]) (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 62CFC501F52 for ; Fri, 4 Sep 2026 16:31:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.47 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788539477; cv=none; b=LWFDmR4gkbAGQXv9VqkErqcNodxIVNqm9NVqpTDOLCl2djsZsMjkx8JCvkATso4BVnlpIjwOcap28YgRK3H3FHx8aDVnbL4Ng2KOvFxj5+YvkCtJlxyGTwUYujLNJh5qjeEf3sideFp7HR9nyo7mw3hQoBoRw/ffDdAZNBkcjAY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788539477; c=relaxed/simple; bh=9+bfhV3bKwYKq6jbJEd7Jz4nKsBAMRkbK1/fmkT6QO8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=tGx82xOKqB56Ifc8W/xkTMxl1bwqFFwKXv1uLaRtcB1TuuudXxBCHT4DOZmpD/M/riPB49ul/puKRGNWsIu14qajwxnVwwSqnEklrry1sPT1w99FIk0z+OEC2cp3Ln08UTTDCbEXk4S01xABH5cyN/A4mbZVlH9PUPLI0i3qZMs= 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=Tep47Jx4; arc=none smtp.client-ip=209.85.216.47 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="Tep47Jx4" Received: by mail-pj1-f47.google.com with SMTP id 98e67ed59e1d1-3856d6fbcb3so930298a91.2 for ; Fri, 04 Sep 2026 09:31:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788539474; x=1789144274; 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=oJMCXgDxT0gClhbr75BMCzC3pWErrQPjx1FIrmQQWzA=; b=Tep47Jx4dpwQYGUDzh73wVsxHENaH+qUhQjAnQDdYqN1XWzMz3HTG+rNNSDayEgNV5 b+ibCADHHq58mT4JsMpCs09QqaQzgYlc3D4p1KbhxapmLvgg4E+LUBv675t395ALLG7m hklvZ4MEU5Mc7qJkAuFmVD3bLiPtJNELeZbcpAzAItHpdv5M9ye1SnksVQDfyt324wBg 56O9TrtOx9X3l3Rfw3xBUpqioEdMDkKDkl0MQA5ggi8Td9raGYwNu36bHqzs8nnFie2r 2NK7Xt2IDjEWuR+u5zFGB77uiQ4qK/+vKF3qE5PzEDwoV5ibjP8IDDZ27sSQhDN1jFOF hFKA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788539474; x=1789144274; 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=oJMCXgDxT0gClhbr75BMCzC3pWErrQPjx1FIrmQQWzA=; b=P5RSVE1qaAEY5aWew7+5Rzk43B46cYtqRxgtTgnn0KszXgvEbHz84OVukNC06m4B0c 9zJFq1SLnFasgOI4OvD29xmCoLP6cMPELvQhzjyW0GyzZxDotuVp4OKltcjD995XJC0N 9O8+34qOlz7YvDjHRfnEQOwJMlGjgP1EPsaszt2udhnRMUe7gXAHOZQ3Y80/ESGTxApi StPwjNV4v/ogW5atH3hEJ6svJPAd7nLhD0HiPhYWoJ9rtaHxhEpfQJoW1U0t/AtnUS4+ MXE6+x5Pfy7mZ9+MXLbS0gbE6/DBu4ju+etIo9shTLeVMJ8vk8vuKCqDdFgkbHeINJDx U2eg== X-Forwarded-Encrypted: i=1; AKwUvBxlAxJpNzLm/OvkjtfwH2Knk8Xu6ShIkEqRHvslltxdmNKTu4W8MZUUDbCaK8GBfnLcxFr0AJfmkEQNaog=@vger.kernel.org X-Gm-Message-State: AFuF++nJyr2i8hOaXQcxm72mkOI9k2pwCcDZDzZHKIO+lra5ZcZmArnD Ll0Yw0GxWMbkzjIu3wFvUlHcTcmlSyzfUfpXxL+/qTmmrsPsxmbcjkr/ X-Gm-Gg: AYBFou3oYQYuRbVDEvE6zGnZh3n2ZRPRbNj9InKTv7q+oFrvdrU+05svsx+XCGGmdDn 75yReokqoMnDs1GNsniqEiCJgKez/jPu91Mj3ZeGha/u4czOIaB1sXPU2ybqAVfbwbBsoD7YYVz vpQBsrlC9rvqi0sWuSSlNoPwFSCyk1iUp888WjM27Jg21z+jKuWZ1HG+2vRDDr9oNO09TDQup50 s8cR6N3uNQdnbNSNpjiQuer96/5cD8wtyOuL7QZzP3GjMsZ7LXxCs4OulKow09MfwCc8TMRVh7Q o/FTcEr1K7l34vgBwyHdrmhGmpo80mra26wcee/MqCYBZ52/wjJiYJGRMa3XEoe2OU2etGJ4twq vQhkJsfLzWjsN18m8WDC0BguXMWWYivWovfXj0ZKTIMwHfrjCT/gOBRKo2k1JkBtz9egGQbBKsZ 3sOmBlcLy8ludQDGOLoa2e1f01luNBARN3Rktk4k4N5qfdqGfKdcmWz7X4QMBraeNRggXJmkx9v 00RNZrJR1AunTkV/lTZUlFuWg== X-Received: by 2002:a17:90b:4d06:b0:366:10f1:3d91 with SMTP id 98e67ed59e1d1-39b2614df74mr9767547a91.1.1788539472141; Fri, 04 Sep 2026 09:31:12 -0700 (PDT) Received: from d.home.yangfl.dn42 ([2a09:bac5:661b:3050::4d0:46]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-39b25c974cfsm5383010a91.0.2026.09.04.09.31.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 04 Sep 2026 09:31:11 -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 v2 2/6] net: dsa: motorcomm: Split MIB buffers Date: Sat, 5 Sep 2026 00:29:44 +0800 Message-ID: <20260904162952.709368-3-mmyangfl@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260904162952.709368-1-mmyangfl@gmail.com> References: <20260904162952.709368-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 | 112 +++++++++++++++++++++++-------- drivers/net/dsa/motorcomm/chip.h | 16 +++-- 2 files changed, 96 insertions(+), 32 deletions(-) diff --git a/drivers/net/dsa/motorcomm/chip.c b/drivers/net/dsa/motorcomm/c= hip.c index ad5fe1ccb1d7..bd8486cc10ac 100644 --- a/drivers/net/dsa/motorcomm/chip.c +++ b/drivers/net/dsa/motorcomm/chip.c @@ -549,9 +549,12 @@ static int yt921x_mib_read(struct yt921x_priv *priv, i= nt port) { struct yt921x_port *pp =3D &priv->ports[port]; struct device *dev =3D to_device(priv); - struct yt921x_mib_stats *mib =3D &pp->mib; + struct yt921x_mib *pm =3D pp->mib; + struct yt921x_mib_stats *mib; int res =3D 0; =20 + mib =3D &pm->stats; + /* Reading of yt921x_port::mib is not protected by a lock and it's vain * to keep its consistency, since we have to read registers one by one * and there is no way to make a snapshot of MIB stats. @@ -589,11 +592,11 @@ static int yt921x_mib_read(struct yt921x_priv *priv, = int port) WRITE_ONCE(*valp, val); } =20 - pp->rx_frames =3D mib->rx_64byte + mib->rx_65_127byte + + pm->rx_frames =3D mib->rx_64byte + mib->rx_65_127byte + mib->rx_128_255byte + mib->rx_256_511byte + mib->rx_512_1023byte + mib->rx_1024_1518byte + mib->rx_jumbo; - pp->tx_frames =3D mib->tx_64byte + mib->tx_65_127byte + + pm->tx_frames =3D mib->tx_64byte + mib->tx_65_127byte + mib->tx_128_255byte + mib->tx_256_511byte + mib->tx_512_1023byte + mib->tx_1024_1518byte + mib->tx_jumbo; @@ -606,10 +609,11 @@ static int yt921x_mib_read(struct yt921x_priv *priv, = int port) =20 static void yt921x_mib_poll(struct work_struct *work) { - struct yt921x_port *pp =3D container_of_const(work, struct yt921x_port, - mib_read.work); - struct yt921x_priv *priv =3D (void *)(pp - pp->index) - - offsetof(struct yt921x_priv, ports); + struct yt921x_mib *pm =3D container_of_const(work, struct yt921x_mib, + work.work); + struct yt921x_port *pp =3D pm->port; + struct yt921x_priv *priv =3D container_of_const(pp, struct yt921x_priv, + ports[pp->index]); unsigned long delay =3D YT921X_STATS_INTERVAL_JIFFIES; int port =3D pp->index; int res; @@ -620,7 +624,7 @@ static void yt921x_mib_poll(struct work_struct *work) if (res) delay *=3D 4; =20 - schedule_delayed_work(&pp->mib_read, delay); + schedule_delayed_work(&pm->work, delay); } =20 static void @@ -643,9 +647,14 @@ yt921x_dsa_get_ethtool_stats(struct dsa_switch *ds, in= t port, uint64_t *data) { struct yt921x_priv *priv =3D to_yt921x_priv(ds); struct yt921x_port *pp =3D &priv->ports[port]; - struct yt921x_mib_stats *mib =3D &pp->mib; + struct yt921x_mib *pm =3D pp->mib; + struct yt921x_mib_stats *mib; size_t j; =20 + if (!pm) + return; + mib =3D &pm->stats; + mutex_lock(&priv->reg_lock); yt921x_mib_read(priv, port); mutex_unlock(&priv->reg_lock); @@ -685,16 +694,21 @@ yt921x_dsa_get_eth_mac_stats(struct dsa_switch *ds, i= nt port, { struct yt921x_priv *priv =3D to_yt921x_priv(ds); struct yt921x_port *pp =3D &priv->ports[port]; - struct yt921x_mib_stats *mib =3D &pp->mib; + struct yt921x_mib *pm =3D pp->mib; + struct yt921x_mib_stats *mib; + + if (!pm) + return; + mib =3D &pm->stats; =20 mutex_lock(&priv->reg_lock); yt921x_mib_read(priv, port); mutex_unlock(&priv->reg_lock); =20 - mac_stats->FramesTransmittedOK =3D pp->tx_frames; + mac_stats->FramesTransmittedOK =3D pm->tx_frames; mac_stats->SingleCollisionFrames =3D mib->tx_single_collisions; mac_stats->MultipleCollisionFrames =3D mib->tx_multiple_collisions; - mac_stats->FramesReceivedOK =3D pp->rx_frames; + mac_stats->FramesReceivedOK =3D pm->rx_frames; mac_stats->FrameCheckSequenceErrors =3D mib->rx_crc_errors; mac_stats->AlignmentErrors =3D mib->rx_alignment_errors; mac_stats->OctetsTransmittedOK =3D mib->tx_good_bytes; @@ -721,7 +735,12 @@ yt921x_dsa_get_eth_ctrl_stats(struct dsa_switch *ds, i= nt port, { struct yt921x_priv *priv =3D to_yt921x_priv(ds); struct yt921x_port *pp =3D &priv->ports[port]; - struct yt921x_mib_stats *mib =3D &pp->mib; + struct yt921x_mib *pm =3D pp->mib; + struct yt921x_mib_stats *mib; + + if (!pm) + return; + mib =3D &pm->stats; =20 mutex_lock(&priv->reg_lock); yt921x_mib_read(priv, port); @@ -750,7 +769,12 @@ yt921x_dsa_get_rmon_stats(struct dsa_switch *ds, int p= ort, { struct yt921x_priv *priv =3D to_yt921x_priv(ds); struct yt921x_port *pp =3D &priv->ports[port]; - struct yt921x_mib_stats *mib =3D &pp->mib; + struct yt921x_mib *pm =3D pp->mib; + struct yt921x_mib_stats *mib; + + if (!pm) + return; + mib =3D &pm->stats; =20 mutex_lock(&priv->reg_lock); yt921x_mib_read(priv, port); @@ -786,7 +810,12 @@ yt921x_dsa_get_stats64(struct dsa_switch *ds, int port, { struct yt921x_priv *priv =3D to_yt921x_priv(ds); struct yt921x_port *pp =3D &priv->ports[port]; - struct yt921x_mib_stats *mib =3D &pp->mib; + struct yt921x_mib *pm =3D pp->mib; + struct yt921x_mib_stats *mib; + + if (!pm) + return; + mib =3D &pm->stats; =20 stats->rx_length_errors =3D mib->rx_undersize_errors + mib->rx_fragment_errors; @@ -802,8 +831,8 @@ yt921x_dsa_get_stats64(struct dsa_switch *ds, int port, /* stats->tx_heartbeat_errors */ stats->tx_window_errors =3D mib->tx_late_collisions; =20 - stats->rx_packets =3D pp->rx_frames; - stats->tx_packets =3D pp->tx_frames; + stats->rx_packets =3D pm->rx_frames; + stats->tx_packets =3D pm->tx_frames; stats->rx_bytes =3D mib->rx_good_bytes - ETH_FCS_LEN * stats->rx_packets; stats->tx_bytes =3D mib->tx_good_bytes - ETH_FCS_LEN * stats->tx_packets; stats->rx_errors =3D stats->rx_length_errors + stats->rx_over_errors + @@ -822,7 +851,12 @@ yt921x_dsa_get_pause_stats(struct dsa_switch *ds, int = port, { struct yt921x_priv *priv =3D to_yt921x_priv(ds); struct yt921x_port *pp =3D &priv->ports[port]; - struct yt921x_mib_stats *mib =3D &pp->mib; + struct yt921x_mib *pm =3D pp->mib; + struct yt921x_mib_stats *mib; + + if (!pm) + return; + mib =3D &pm->stats; =20 mutex_lock(&priv->reg_lock); yt921x_mib_read(priv, port); @@ -3953,11 +3987,14 @@ yt921x_phylink_mac_link_down(struct phylink_config = *config, unsigned int mode, { struct dsa_port *dp =3D dsa_phylink_to_port(config); struct yt921x_priv *priv =3D to_yt921x_priv(dp->ds); + struct yt921x_mib *pm; int port =3D dp->index; int res; =20 /* No need to sync; port control block is hold until device remove */ - cancel_delayed_work(&priv->ports[port].mib_read); + pm =3D priv->ports[port].mib; + if (pm) + cancel_delayed_work(&pm->work); =20 mutex_lock(&priv->reg_lock); res =3D yt921x_port_down(priv, port); @@ -3976,6 +4013,7 @@ yt921x_phylink_mac_link_up(struct phylink_config *con= fig, { struct dsa_port *dp =3D dsa_phylink_to_port(config); struct yt921x_priv *priv =3D to_yt921x_priv(dp->ds); + struct yt921x_mib *pm; int port =3D dp->index; int res; =20 @@ -3988,7 +4026,9 @@ yt921x_phylink_mac_link_up(struct phylink_config *con= fig, dev_err(dp->ds->dev, "Failed to %s port %d: %i\n", "bring up", port, res); =20 - schedule_delayed_work(&priv->ports[port].mib_read, 0); + pm =3D priv->ports[port].mib; + if (pm) + schedule_delayed_work(&pm->work, 0); } =20 static void @@ -4108,11 +4148,35 @@ yt921x_dsa_get_tag_protocol(struct dsa_switch *ds, = int port, return DSA_TAG_PROTO_YT921X; } =20 +static void yt921x_dsa_port_teardown(struct dsa_switch *ds, int port) +{ + struct yt921x_priv *priv =3D to_yt921x_priv(ds); + struct yt921x_port *pp =3D &priv->ports[port]; + struct yt921x_mib *pm =3D pp->mib; + + if (pm) + disable_delayed_work_sync(&pm->work); +} + static int yt921x_dsa_port_setup(struct dsa_switch *ds, int port) { struct yt921x_priv *priv =3D to_yt921x_priv(ds); + struct yt921x_port *pp =3D &priv->ports[port]; + struct device *dev =3D to_device(priv); + struct yt921x_mib *pm =3D pp->mib; int res; =20 + if (!pm && !(BIT(port) & (priv->info->internal_mask | + priv->info->external_mask))) { + pm =3D devm_kzalloc(dev, sizeof(*pm), GFP_KERNEL); + if (!pm) + return -ENOMEM; + pp->mib =3D pm; + + pm->port =3D pp; + INIT_DELAYED_WORK(&pm->work, yt921x_mib_poll); + } + mutex_lock(&priv->reg_lock); res =3D yt921x_port_setup(priv, port); mutex_unlock(&priv->reg_lock); @@ -4667,6 +4731,7 @@ static const struct dsa_switch_ops yt921x_dsa_switch_= ops =3D { /* port */ .get_tag_protocol =3D yt921x_dsa_get_tag_protocol, .phylink_get_caps =3D yt921x_dsa_phylink_get_caps, + .port_teardown =3D yt921x_dsa_port_teardown, .port_setup =3D yt921x_dsa_port_setup, #if IS_ENABLED(CONFIG_DCB) /* dscp */ @@ -4696,12 +4761,6 @@ static void yt921x_mdio_remove(struct mdio_device *m= diodev) if (!priv) return; =20 - for (size_t i =3D ARRAY_SIZE(priv->ports); i-- > 0; ) { - struct yt921x_port *pp =3D &priv->ports[i]; - - disable_delayed_work_sync(&pp->mib_read); - } - dsa_unregister_switch(&priv->ds); =20 for (unsigned int i =3D 0; i < ARRAY_SIZE(priv->acl_blks); i++) { @@ -4749,7 +4808,6 @@ static int yt921x_mdio_probe(struct mdio_device *mdio= dev) struct yt921x_port *pp =3D &priv->ports[i]; =20 pp->index =3D i; - INIT_DELAYED_WORK(&pp->mib_read, yt921x_mib_poll); } =20 ds =3D &priv->ds; diff --git a/drivers/net/dsa/motorcomm/chip.h b/drivers/net/dsa/motorcomm/c= hip.h index 805febb48683..5bf2d3409f4b 100644 --- a/drivers/net/dsa/motorcomm/chip.h +++ b/drivers/net/dsa/motorcomm/chip.h @@ -913,6 +913,15 @@ struct yt921x_mib_stats { u64 tx_oam; }; =20 +struct yt921x_mib { + struct yt921x_port *port; + + struct delayed_work work; + struct yt921x_mib_stats stats; + u64 rx_frames; + u64 tx_frames; +}; + struct yt921x_acl_entry { u32 key[2]; u32 mask[2]; @@ -939,11 +948,6 @@ struct yt921x_port { bool hairpin; bool isolated; =20 - struct delayed_work mib_read; - struct yt921x_mib_stats mib; - u64 rx_frames; - u64 tx_frames; - #if IS_ENABLED(CONFIG_NET_DSA_YT921X_LEDS) unsigned char led_duty; unsigned short led_cycle; @@ -953,6 +957,8 @@ struct yt921x_port { =20 struct yt921x_led *leds[YT921X_LED_GROUP_NUM]; #endif + + struct yt921x_mib *mib; }; =20 struct yt921x_reg_ops { --=20 2.53.0 From nobody Sat Sep 26 04:29:59 2026 Received: from mail-pg1-f169.google.com (mail-pg1-f169.google.com [209.85.215.169]) (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 8AC2F503BCF for ; Fri, 4 Sep 2026 16:31:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.169 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788539480; cv=none; b=osQ0gxYuVObbZf9VhEB4vY4NI/JRUaqxhHoXUcGJc5Y/O3ElK6fvHLH/Y/UCSV2sHOJSdK5lIQaYEYZTsFJsX7xHrR3KRI+5YJwOl95/a8cWKnDlsY7DDnYVwHPm0+CV20EVeuPv9vlxwfGjwQpB6iawlrBi5U+IFF5ygE+7iMg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788539480; c=relaxed/simple; bh=OcmOX3qED6j+zptdzp8Hx/GhTFrnL6x5UhkIOSdre3M=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=E1UrVryvnSWAx1SmyCriHJo3yAG1NfW2FNjMnh2Uk2fCE7SL323ftq4dauzCCPUz9L+UcbT8ASolZyByBH1TW35cyrYC+VJzWIqoE8yYWQUA0y8TvEL3lwcasF6lzRA2ngxp5GYZNxywDJ9a951DU7vIAksCGxEiGF94+NlAyfU= 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=AVRVOxxd; arc=none smtp.client-ip=209.85.215.169 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="AVRVOxxd" Received: by mail-pg1-f169.google.com with SMTP id 41be03b00d2f7-cc1c73645a1so1041210a12.1 for ; Fri, 04 Sep 2026 09:31:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788539477; x=1789144277; 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=jBMNTyRT0GaY+xUx5xJ46gjhjlBUhwHiWX7d+dI0yZk=; b=AVRVOxxdjGOpIo+7rNCgpYONjmDD7rX/6W9F5gSlx1s3+ica90uYwrvbcBTuQLWTQO lENdXhKe8N13px3BBi8PyVjm+N5gKfEvUqe3oKHem0gXcV7B3h9Aq0ksKwXeRsTeWZ+G iy/Utv/GythmO276KICKMrjfdGk1Fjd1BudxxXY5crq0NyGuzs98Oc1ppGRiUMRPaAm5 Q06hDvlxcFCFqaQcCwZQ0oijummbXn7FWCUPrlJ4d3ZYA1mHFIzGxvmcaioUEFwQ1Qca PAksUO9JzNRof6sVxoI4ZfYZx4gRRxAsrBIoCUSyMoCY8YGAtFlcKTtBJWFc51G4dNPq 9tgw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788539477; x=1789144277; 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=jBMNTyRT0GaY+xUx5xJ46gjhjlBUhwHiWX7d+dI0yZk=; b=eQcBW9JLHWzDiXlVkLwLJFu7GDGkb7EaCzm7i2cN3EburoJ8w+uVuU+ReXNmlMut6K GqkYykGUqh306As94VTi8VkoUrnPhmQQVRndLU/4J3aHTB6U6Gn4FLnoJLR7faogQ1Xw uE5QXnhD43m5jmQVG3yw5MQOr6CuY8TH8WHoJeQBTiZ7/Rult00NkGNdHaEc3lQQMnuP OVqmGRoNQUWFDWyZ3uyrG/hd2LtDi8k9FDYjIF68RUt5GF+uQzKR1tX2TnNfp5GtvFG+ Zi2Oh5A4HyUKE+ktRukiN09YZIQhvlDg62sreEptwzhPwgtwgSZx2wGP+eIOtzofTryP y4rA== X-Forwarded-Encrypted: i=1; AKwUvBwvxAXxD0uLXkDZ83VJRX0SFBRhAdQCBm+HQcILehvNgqmJKLlpCvE2tdBOxUqCWUCNHUi6llidygAsmqE=@vger.kernel.org X-Gm-Message-State: AFuF++kV6LcnmujWXfYwY5VN0MowH3Zm1Bh8DZLU2obXEQ4KyUN/WmVu uHjHweXCFNHgaVmLRCBoOribCbZkWoHlC+80y6Sq3dtrZ8aDgJSXMdRt X-Gm-Gg: AYBFou0YHn9TS26VsOHs7apFzdFADKmfzkYJejpLbGG9vEaSGlK6IfFX90z64/k6WKK YTL3DkuwsnBQpbClSW0et4NxffjoDa844xETvP9aRRZRpUapNPInVCjgbyWhpFBocMziwN0uccy ifqYGWgHhRyeHhUGo4AnvMAYOUyY7YhkODG9JeS7wR2FVw2sF6gvW2+ShTZhn2F6RSwFtjYwDtD EBOm9sVem0yUqgLEDjVcpe6X1QruDItQ9D8KCmRa0t5J0/DhTyGK3nRKYmpVwKancJ5q0R9nj78 oZ2Gk5TpFjZQy97Rv/7GNk01gMaXWZyDmQmxqeG+brKdPccKmdv6cCQofMXwF1lGXQlvAvtmm8a D2AksckCIkDtaOPwaYVaPeDhvwRi/JCOAq25lVghGymce4eiV1Avg0gd/IhA/6jkFDQdY/DsN++ oZRDJN729W+9YSROYRg7a1sXlkAYN5vbo6oC7avggaWglY5A0LKlvmXINfR0lhklgRvYUGbSsoY 9y2bLhMvBWlSKM= X-Received: by 2002:a17:90b:4c06:b0:396:b98b:a3c2 with SMTP id 98e67ed59e1d1-39b26116d9fmr8815083a91.8.1788539476267; Fri, 04 Sep 2026 09:31:16 -0700 (PDT) Received: from d.home.yangfl.dn42 ([2a09:bac5:661b:3050::4d0:46]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-39b25c974cfsm5383010a91.0.2026.09.04.09.31.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 04 Sep 2026 09:31:15 -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 v2 3/6] net: dsa: motorcomm: Split MIB module Date: Sat, 5 Sep 2026 00:29:45 +0800 Message-ID: <20260904162952.709368-4-mmyangfl@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260904162952.709368-1-mmyangfl@gmail.com> References: <20260904162952.709368-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 | 398 +--------------------------- drivers/net/dsa/motorcomm/chip.h | 124 --------- drivers/net/dsa/motorcomm/mib.c | 408 +++++++++++++++++++++++++++++ drivers/net/dsa/motorcomm/mib.h | 159 +++++++++++ 5 files changed, 569 insertions(+), 521 deletions(-) create mode 100644 drivers/net/dsa/motorcomm/mib.c create mode 100644 drivers/net/dsa/motorcomm/mib.h diff --git a/drivers/net/dsa/motorcomm/Makefile b/drivers/net/dsa/motorcomm= /Makefile index aeb12cb91f93..5c2d34ec05fc 100644 --- a/drivers/net/dsa/motorcomm/Makefile +++ b/drivers/net/dsa/motorcomm/Makefile @@ -2,4 +2,5 @@ obj-$(CONFIG_NET_DSA_YT921X) +=3D yt921x.o yt921x-objs :=3D chip.o yt921x-$(CONFIG_NET_DSA_YT921X_LEDS) +=3D leds.o +yt921x-objs +=3D mib.o yt921x-objs +=3D smi.o diff --git a/drivers/net/dsa/motorcomm/chip.c b/drivers/net/dsa/motorcomm/c= hip.c index bd8486cc10ac..d8520c38f9c7 100644 --- a/drivers/net/dsa/motorcomm/chip.c +++ b/drivers/net/dsa/motorcomm/chip.c @@ -27,75 +27,9 @@ =20 #include "chip.h" #include "leds.h" +#include "mib.h" #include "smi.h" =20 -struct yt921x_mib_desc { - unsigned int size; - unsigned int offset; - const char *name; -}; - -#define MIB_DESC(_size, _offset, _name) \ - {_size, _offset, _name} - -/* Must agree with yt921x_mib - * - * Unstructured fields (name !=3D NULL) will appear in get_ethtool_stats(), - * structured go to their *_stats() methods, but we need their sizes and o= ffsets - * to perform 32bit MIB overflow wraparound. - */ -static const struct yt921x_mib_desc yt921x_mib_descs[] =3D { - MIB_DESC(1, YT921X_MIB_DATA_RX_BROADCAST, NULL), - MIB_DESC(1, YT921X_MIB_DATA_RX_PAUSE, NULL), - MIB_DESC(1, YT921X_MIB_DATA_RX_MULTICAST, NULL), - MIB_DESC(1, YT921X_MIB_DATA_RX_CRC_ERR, NULL), - - MIB_DESC(1, YT921X_MIB_DATA_RX_ALIGN_ERR, NULL), - MIB_DESC(1, YT921X_MIB_DATA_RX_UNDERSIZE_ERR, NULL), - MIB_DESC(1, YT921X_MIB_DATA_RX_FRAG_ERR, NULL), - MIB_DESC(1, YT921X_MIB_DATA_RX_PKT_SZ_64, NULL), - - MIB_DESC(1, YT921X_MIB_DATA_RX_PKT_SZ_65_TO_127, NULL), - MIB_DESC(1, YT921X_MIB_DATA_RX_PKT_SZ_128_TO_255, NULL), - MIB_DESC(1, YT921X_MIB_DATA_RX_PKT_SZ_256_TO_511, NULL), - MIB_DESC(1, YT921X_MIB_DATA_RX_PKT_SZ_512_TO_1023, NULL), - - MIB_DESC(1, YT921X_MIB_DATA_RX_PKT_SZ_1024_TO_1518, NULL), - MIB_DESC(1, YT921X_MIB_DATA_RX_PKT_SZ_1519_TO_MAX, NULL), - MIB_DESC(2, YT921X_MIB_DATA_RX_GOOD_BYTES, NULL), - - MIB_DESC(2, YT921X_MIB_DATA_RX_BAD_BYTES, "RxBadBytes"), - MIB_DESC(1, YT921X_MIB_DATA_RX_OVERSIZE_ERR, NULL), - - MIB_DESC(1, YT921X_MIB_DATA_RX_DROPPED, NULL), - MIB_DESC(1, YT921X_MIB_DATA_TX_BROADCAST, NULL), - MIB_DESC(1, YT921X_MIB_DATA_TX_PAUSE, NULL), - MIB_DESC(1, YT921X_MIB_DATA_TX_MULTICAST, NULL), - - MIB_DESC(1, YT921X_MIB_DATA_TX_UNDERSIZE_ERR, NULL), - MIB_DESC(1, YT921X_MIB_DATA_TX_PKT_SZ_64, NULL), - MIB_DESC(1, YT921X_MIB_DATA_TX_PKT_SZ_65_TO_127, NULL), - MIB_DESC(1, YT921X_MIB_DATA_TX_PKT_SZ_128_TO_255, NULL), - - MIB_DESC(1, YT921X_MIB_DATA_TX_PKT_SZ_256_TO_511, NULL), - MIB_DESC(1, YT921X_MIB_DATA_TX_PKT_SZ_512_TO_1023, NULL), - MIB_DESC(1, YT921X_MIB_DATA_TX_PKT_SZ_1024_TO_1518, NULL), - MIB_DESC(1, YT921X_MIB_DATA_TX_PKT_SZ_1519_TO_MAX, NULL), - - MIB_DESC(2, YT921X_MIB_DATA_TX_GOOD_BYTES, NULL), - MIB_DESC(1, YT921X_MIB_DATA_TX_COLLISION, NULL), - - MIB_DESC(1, YT921X_MIB_DATA_TX_EXCESSIVE_COLLISION, NULL), - MIB_DESC(1, YT921X_MIB_DATA_TX_MULTIPLE_COLLISION, NULL), - MIB_DESC(1, YT921X_MIB_DATA_TX_SINGLE_COLLISION, NULL), - MIB_DESC(1, YT921X_MIB_DATA_TX_PKT, NULL), - - MIB_DESC(1, YT921X_MIB_DATA_TX_DEFERRED, NULL), - MIB_DESC(1, YT921X_MIB_DATA_TX_LATE_COLLISION, NULL), - MIB_DESC(1, YT921X_MIB_DATA_RX_OAM, "RxOAM"), - MIB_DESC(1, YT921X_MIB_DATA_TX_OAM, "TxOAM"), -}; - struct yt921x_info { const char *name; u16 major; @@ -154,14 +88,6 @@ static const struct yt921x_info yt921x_infos[] =3D { =20 #define YT921X_VID_UNWARE 4095 =20 -/* The interval should be small enough to avoid overflow of 32bit MIBs. - * - * Until we can read MIBs from stats64 call directly (i.e. sleep - * there), we have to poll stats more frequently then it is actually neede= d. - * For overflow protection, normally, 100 sec interval should have been OK. - */ -#define YT921X_STATS_INTERVAL_JIFFIES (3 * HZ) - struct yt921x_reg_mdio { struct mii_bus *bus; int addr; @@ -544,328 +470,6 @@ yt921x_mbus_ext_init(struct yt921x_priv *priv, struct= device_node *mnp) return 0; } =20 -/* Read and handle overflow of 32bit MIBs. MIB buffer must be zeroed befor= e. */ -static int yt921x_mib_read(struct yt921x_priv *priv, int port) -{ - struct yt921x_port *pp =3D &priv->ports[port]; - struct device *dev =3D to_device(priv); - struct yt921x_mib *pm =3D pp->mib; - struct yt921x_mib_stats *mib; - int res =3D 0; - - mib =3D &pm->stats; - - /* Reading of yt921x_port::mib is not protected by a lock and it's vain - * to keep its consistency, since we have to read registers one by one - * and there is no way to make a snapshot of MIB stats. - * - * Writing (by this function only) is and should be protected by - * reg_lock. - */ - - for (size_t i =3D 0; i < ARRAY_SIZE(yt921x_mib_descs); i++) { - const struct yt921x_mib_desc *desc =3D &yt921x_mib_descs[i]; - u32 reg =3D YT921X_MIBn_DATA0(port) + desc->offset; - u64 *valp =3D &((u64 *)mib)[i]; - u32 val0; - u64 val; - - res =3D yt921x_reg_read(priv, reg, &val0); - if (res) - break; - - if (desc->size <=3D 1) { - u64 old_val =3D *valp; - - val =3D (old_val & ~(u64)U32_MAX) | val0; - if (val < old_val) - val +=3D 1ull << 32; - } else { - u32 val1; - - res =3D yt921x_reg_read(priv, reg + 4, &val1); - if (res) - break; - val =3D ((u64)val1 << 32) | val0; - } - - WRITE_ONCE(*valp, val); - } - - pm->rx_frames =3D mib->rx_64byte + mib->rx_65_127byte + - mib->rx_128_255byte + mib->rx_256_511byte + - mib->rx_512_1023byte + mib->rx_1024_1518byte + - mib->rx_jumbo; - pm->tx_frames =3D mib->tx_64byte + mib->tx_65_127byte + - mib->tx_128_255byte + mib->tx_256_511byte + - mib->tx_512_1023byte + mib->tx_1024_1518byte + - mib->tx_jumbo; - - if (res) - dev_err(dev, "Failed to %s port %d: %i\n", "read stats for", - port, res); - return res; -} - -static void yt921x_mib_poll(struct work_struct *work) -{ - struct yt921x_mib *pm =3D container_of_const(work, struct yt921x_mib, - work.work); - struct yt921x_port *pp =3D pm->port; - struct yt921x_priv *priv =3D container_of_const(pp, struct yt921x_priv, - ports[pp->index]); - unsigned long delay =3D YT921X_STATS_INTERVAL_JIFFIES; - int port =3D pp->index; - int res; - - mutex_lock(&priv->reg_lock); - res =3D yt921x_mib_read(priv, port); - mutex_unlock(&priv->reg_lock); - if (res) - delay *=3D 4; - - schedule_delayed_work(&pm->work, delay); -} - -static void -yt921x_dsa_get_strings(struct dsa_switch *ds, int port, u32 stringset, - uint8_t *data) -{ - if (stringset !=3D ETH_SS_STATS) - return; - - for (size_t i =3D 0; i < ARRAY_SIZE(yt921x_mib_descs); i++) { - const struct yt921x_mib_desc *desc =3D &yt921x_mib_descs[i]; - - if (desc->name) - ethtool_puts(&data, desc->name); - } -} - -static void -yt921x_dsa_get_ethtool_stats(struct dsa_switch *ds, int port, uint64_t *da= ta) -{ - struct yt921x_priv *priv =3D to_yt921x_priv(ds); - struct yt921x_port *pp =3D &priv->ports[port]; - struct yt921x_mib *pm =3D pp->mib; - struct yt921x_mib_stats *mib; - size_t j; - - if (!pm) - return; - mib =3D &pm->stats; - - mutex_lock(&priv->reg_lock); - yt921x_mib_read(priv, port); - mutex_unlock(&priv->reg_lock); - - j =3D 0; - for (size_t i =3D 0; i < ARRAY_SIZE(yt921x_mib_descs); i++) { - const struct yt921x_mib_desc *desc =3D &yt921x_mib_descs[i]; - - if (!desc->name) - continue; - - data[j] =3D ((u64 *)mib)[i]; - j++; - } -} - -static int yt921x_dsa_get_sset_count(struct dsa_switch *ds, int port, int = sset) -{ - int cnt =3D 0; - - if (sset !=3D ETH_SS_STATS) - return 0; - - for (size_t i =3D 0; i < ARRAY_SIZE(yt921x_mib_descs); i++) { - const struct yt921x_mib_desc *desc =3D &yt921x_mib_descs[i]; - - if (desc->name) - cnt++; - } - - return cnt; -} - -static void -yt921x_dsa_get_eth_mac_stats(struct dsa_switch *ds, int port, - struct ethtool_eth_mac_stats *mac_stats) -{ - struct yt921x_priv *priv =3D to_yt921x_priv(ds); - struct yt921x_port *pp =3D &priv->ports[port]; - struct yt921x_mib *pm =3D pp->mib; - struct yt921x_mib_stats *mib; - - if (!pm) - return; - mib =3D &pm->stats; - - mutex_lock(&priv->reg_lock); - yt921x_mib_read(priv, port); - mutex_unlock(&priv->reg_lock); - - mac_stats->FramesTransmittedOK =3D pm->tx_frames; - mac_stats->SingleCollisionFrames =3D mib->tx_single_collisions; - mac_stats->MultipleCollisionFrames =3D mib->tx_multiple_collisions; - mac_stats->FramesReceivedOK =3D pm->rx_frames; - mac_stats->FrameCheckSequenceErrors =3D mib->rx_crc_errors; - mac_stats->AlignmentErrors =3D mib->rx_alignment_errors; - mac_stats->OctetsTransmittedOK =3D mib->tx_good_bytes; - mac_stats->FramesWithDeferredXmissions =3D mib->tx_deferred; - mac_stats->LateCollisions =3D mib->tx_late_collisions; - mac_stats->FramesAbortedDueToXSColls =3D mib->tx_aborted_errors; - /* mac_stats->FramesLostDueToIntMACXmitError */ - /* mac_stats->CarrierSenseErrors */ - mac_stats->OctetsReceivedOK =3D mib->rx_good_bytes; - /* mac_stats->FramesLostDueToIntMACRcvError */ - mac_stats->MulticastFramesXmittedOK =3D mib->tx_multicast; - mac_stats->BroadcastFramesXmittedOK =3D mib->tx_broadcast; - /* mac_stats->FramesWithExcessiveDeferral */ - mac_stats->MulticastFramesReceivedOK =3D mib->rx_multicast; - mac_stats->BroadcastFramesReceivedOK =3D mib->rx_broadcast; - /* mac_stats->InRangeLengthErrors */ - /* mac_stats->OutOfRangeLengthField */ - mac_stats->FrameTooLongErrors =3D mib->rx_oversize_errors; -} - -static void -yt921x_dsa_get_eth_ctrl_stats(struct dsa_switch *ds, int port, - struct ethtool_eth_ctrl_stats *ctrl_stats) -{ - struct yt921x_priv *priv =3D to_yt921x_priv(ds); - struct yt921x_port *pp =3D &priv->ports[port]; - struct yt921x_mib *pm =3D pp->mib; - struct yt921x_mib_stats *mib; - - if (!pm) - return; - mib =3D &pm->stats; - - mutex_lock(&priv->reg_lock); - yt921x_mib_read(priv, port); - mutex_unlock(&priv->reg_lock); - - ctrl_stats->MACControlFramesTransmitted =3D mib->tx_pause; - ctrl_stats->MACControlFramesReceived =3D mib->rx_pause; - /* ctrl_stats->UnsupportedOpcodesReceived */ -} - -static const struct ethtool_rmon_hist_range yt921x_rmon_ranges[] =3D { - { 0, 64 }, - { 65, 127 }, - { 128, 255 }, - { 256, 511 }, - { 512, 1023 }, - { 1024, 1518 }, - { 1519, YT921X_FRAME_SIZE_MAX }, - {} -}; - -static void -yt921x_dsa_get_rmon_stats(struct dsa_switch *ds, int port, - struct ethtool_rmon_stats *rmon_stats, - const struct ethtool_rmon_hist_range **ranges) -{ - struct yt921x_priv *priv =3D to_yt921x_priv(ds); - struct yt921x_port *pp =3D &priv->ports[port]; - struct yt921x_mib *pm =3D pp->mib; - struct yt921x_mib_stats *mib; - - if (!pm) - return; - mib =3D &pm->stats; - - mutex_lock(&priv->reg_lock); - yt921x_mib_read(priv, port); - mutex_unlock(&priv->reg_lock); - - *ranges =3D yt921x_rmon_ranges; - - rmon_stats->undersize_pkts =3D mib->rx_undersize_errors; - rmon_stats->oversize_pkts =3D mib->rx_oversize_errors; - rmon_stats->fragments =3D mib->rx_alignment_errors; - /* rmon_stats->jabbers */ - - rmon_stats->hist[0] =3D mib->rx_64byte; - rmon_stats->hist[1] =3D mib->rx_65_127byte; - rmon_stats->hist[2] =3D mib->rx_128_255byte; - rmon_stats->hist[3] =3D mib->rx_256_511byte; - rmon_stats->hist[4] =3D mib->rx_512_1023byte; - rmon_stats->hist[5] =3D mib->rx_1024_1518byte; - rmon_stats->hist[6] =3D mib->rx_jumbo; - - rmon_stats->hist_tx[0] =3D mib->tx_64byte; - rmon_stats->hist_tx[1] =3D mib->tx_65_127byte; - rmon_stats->hist_tx[2] =3D mib->tx_128_255byte; - rmon_stats->hist_tx[3] =3D mib->tx_256_511byte; - rmon_stats->hist_tx[4] =3D mib->tx_512_1023byte; - rmon_stats->hist_tx[5] =3D mib->tx_1024_1518byte; - rmon_stats->hist_tx[6] =3D mib->tx_jumbo; -} - -static void -yt921x_dsa_get_stats64(struct dsa_switch *ds, int port, - struct rtnl_link_stats64 *stats) -{ - struct yt921x_priv *priv =3D to_yt921x_priv(ds); - struct yt921x_port *pp =3D &priv->ports[port]; - struct yt921x_mib *pm =3D pp->mib; - struct yt921x_mib_stats *mib; - - if (!pm) - return; - mib =3D &pm->stats; - - stats->rx_length_errors =3D mib->rx_undersize_errors + - mib->rx_fragment_errors; - stats->rx_over_errors =3D mib->rx_oversize_errors; - stats->rx_crc_errors =3D mib->rx_crc_errors; - stats->rx_frame_errors =3D mib->rx_alignment_errors; - /* stats->rx_fifo_errors */ - /* stats->rx_missed_errors */ - - stats->tx_aborted_errors =3D mib->tx_aborted_errors; - /* stats->tx_carrier_errors */ - stats->tx_fifo_errors =3D mib->tx_undersize_errors; - /* stats->tx_heartbeat_errors */ - stats->tx_window_errors =3D mib->tx_late_collisions; - - stats->rx_packets =3D pm->rx_frames; - stats->tx_packets =3D pm->tx_frames; - stats->rx_bytes =3D mib->rx_good_bytes - ETH_FCS_LEN * stats->rx_packets; - stats->tx_bytes =3D mib->tx_good_bytes - ETH_FCS_LEN * stats->tx_packets; - stats->rx_errors =3D stats->rx_length_errors + stats->rx_over_errors + - stats->rx_crc_errors + stats->rx_frame_errors; - stats->tx_errors =3D stats->tx_aborted_errors + stats->tx_fifo_errors + - stats->tx_window_errors; - stats->rx_dropped =3D mib->rx_dropped; - /* stats->tx_dropped */ - stats->multicast =3D mib->rx_multicast; - stats->collisions =3D mib->tx_collisions; -} - -static void -yt921x_dsa_get_pause_stats(struct dsa_switch *ds, int port, - struct ethtool_pause_stats *pause_stats) -{ - struct yt921x_priv *priv =3D to_yt921x_priv(ds); - struct yt921x_port *pp =3D &priv->ports[port]; - struct yt921x_mib *pm =3D pp->mib; - struct yt921x_mib_stats *mib; - - if (!pm) - return; - mib =3D &pm->stats; - - mutex_lock(&priv->reg_lock); - yt921x_mib_read(priv, port); - mutex_unlock(&priv->reg_lock); - - pause_stats->tx_pause_frames =3D mib->tx_pause; - pause_stats->rx_pause_frames =3D mib->rx_pause; -} - static int yt921x_set_eee(struct yt921x_priv *priv, int port, struct ethtool_keee *e) { diff --git a/drivers/net/dsa/motorcomm/chip.h b/drivers/net/dsa/motorcomm/c= hip.h index 5bf2d3409f4b..ce63865bb905 100644 --- a/drivers/net/dsa/motorcomm/chip.h +++ b/drivers/net/dsa/motorcomm/chip.h @@ -167,69 +167,6 @@ #define YT921X_EEE_CTRL 0xb0000 #define YT921X_EEE_CTRL_ENn(port) BIT(port) =20 -#define YT921X_MIB_CTRL 0xc0004 -#define YT921X_MIB_CTRL_CLEAN BIT(30) -#define YT921X_MIB_CTRL_PORT_M GENMASK(6, 3) -#define YT921X_MIB_CTRL_PORT(x) FIELD_PREP(YT921X_MIB_CTRL_PORT_M, (x)) -#define YT921X_MIB_CTRL_ONE_PORT BIT(1) -#define YT921X_MIB_CTRL_ALL_PORT BIT(0) -#define YT921X_MIBn_DATA0(port) (0xc0100 + 0x100 * (port)) -#define YT921X_MIBn_DATAm(port, x) (YT921X_MIBn_DATA0(port) + 4 * (x)) -#define YT921X_MIB_DATA_RX_BROADCAST 0x00 -#define YT921X_MIB_DATA_RX_PAUSE 0x04 -#define YT921X_MIB_DATA_RX_MULTICAST 0x08 -#define YT921X_MIB_DATA_RX_CRC_ERR 0x0c - -#define YT921X_MIB_DATA_RX_ALIGN_ERR 0x10 -#define YT921X_MIB_DATA_RX_UNDERSIZE_ERR 0x14 -#define YT921X_MIB_DATA_RX_FRAG_ERR 0x18 -#define YT921X_MIB_DATA_RX_PKT_SZ_64 0x1c - -#define YT921X_MIB_DATA_RX_PKT_SZ_65_TO_127 0x20 -#define YT921X_MIB_DATA_RX_PKT_SZ_128_TO_255 0x24 -#define YT921X_MIB_DATA_RX_PKT_SZ_256_TO_511 0x28 -#define YT921X_MIB_DATA_RX_PKT_SZ_512_TO_1023 0x2c - -#define YT921X_MIB_DATA_RX_PKT_SZ_1024_TO_1518 0x30 -#define YT921X_MIB_DATA_RX_PKT_SZ_1519_TO_MAX 0x34 -/* 0x38: unused */ -#define YT921X_MIB_DATA_RX_GOOD_BYTES 0x3c - -/* 0x40: 64 bytes */ -#define YT921X_MIB_DATA_RX_BAD_BYTES 0x44 -/* 0x48: 64 bytes */ -#define YT921X_MIB_DATA_RX_OVERSIZE_ERR 0x4c - -#define YT921X_MIB_DATA_RX_DROPPED 0x50 -#define YT921X_MIB_DATA_TX_BROADCAST 0x54 -#define YT921X_MIB_DATA_TX_PAUSE 0x58 -#define YT921X_MIB_DATA_TX_MULTICAST 0x5c - -#define YT921X_MIB_DATA_TX_UNDERSIZE_ERR 0x60 -#define YT921X_MIB_DATA_TX_PKT_SZ_64 0x64 -#define YT921X_MIB_DATA_TX_PKT_SZ_65_TO_127 0x68 -#define YT921X_MIB_DATA_TX_PKT_SZ_128_TO_255 0x6c - -#define YT921X_MIB_DATA_TX_PKT_SZ_256_TO_511 0x70 -#define YT921X_MIB_DATA_TX_PKT_SZ_512_TO_1023 0x74 -#define YT921X_MIB_DATA_TX_PKT_SZ_1024_TO_1518 0x78 -#define YT921X_MIB_DATA_TX_PKT_SZ_1519_TO_MAX 0x7c - -/* 0x80: unused */ -#define YT921X_MIB_DATA_TX_GOOD_BYTES 0x84 -/* 0x88: 64 bytes */ -#define YT921X_MIB_DATA_TX_COLLISION 0x8c - -#define YT921X_MIB_DATA_TX_EXCESSIVE_COLLISION 0x90 -#define YT921X_MIB_DATA_TX_MULTIPLE_COLLISION 0x94 -#define YT921X_MIB_DATA_TX_SINGLE_COLLISION 0x98 -#define YT921X_MIB_DATA_TX_PKT 0x9c - -#define YT921X_MIB_DATA_TX_DEFERRED 0xa0 -#define YT921X_MIB_DATA_TX_LATE_COLLISION 0xa4 -#define YT921X_MIB_DATA_RX_OAM 0xa8 -#define YT921X_MIB_DATA_TX_OAM 0xac - #define YT921X_EDATA_CTRL 0xe0000 #define YT921X_EDATA_CTRL_ADDR_M GENMASK(15, 8) #define YT921X_EDATA_CTRL_ADDR(x) FIELD_PREP(YT921X_EDATA_CTRL_ADDR_M,= (x)) @@ -861,67 +798,6 @@ enum yt921x_fdb_entry_status { #define yt921x_port_is_internal(port) ((port) < 8) #define yt921x_port_is_external(port) ((port) =3D=3D 8 || (port) =3D=3D 9) =20 -struct yt921x_mib_stats { - u64 rx_broadcast; - u64 rx_pause; - u64 rx_multicast; - u64 rx_crc_errors; - - u64 rx_alignment_errors; - u64 rx_undersize_errors; - u64 rx_fragment_errors; - u64 rx_64byte; - - u64 rx_65_127byte; - u64 rx_128_255byte; - u64 rx_256_511byte; - u64 rx_512_1023byte; - - u64 rx_1024_1518byte; - u64 rx_jumbo; - u64 rx_good_bytes; - - u64 rx_bad_bytes; - u64 rx_oversize_errors; - - u64 rx_dropped; - u64 tx_broadcast; - u64 tx_pause; - u64 tx_multicast; - - u64 tx_undersize_errors; - u64 tx_64byte; - u64 tx_65_127byte; - u64 tx_128_255byte; - - u64 tx_256_511byte; - u64 tx_512_1023byte; - u64 tx_1024_1518byte; - u64 tx_jumbo; - - u64 tx_good_bytes; - u64 tx_collisions; - - u64 tx_aborted_errors; - u64 tx_multiple_collisions; - u64 tx_single_collisions; - u64 tx_good; - - u64 tx_deferred; - u64 tx_late_collisions; - u64 rx_oam; - u64 tx_oam; -}; - -struct yt921x_mib { - struct yt921x_port *port; - - struct delayed_work work; - struct yt921x_mib_stats stats; - u64 rx_frames; - u64 tx_frames; -}; - struct yt921x_acl_entry { u32 key[2]; u32 mask[2]; diff --git a/drivers/net/dsa/motorcomm/mib.c b/drivers/net/dsa/motorcomm/mi= b.c new file mode 100644 index 000000000000..9e0d40a26d08 --- /dev/null +++ b/drivers/net/dsa/motorcomm/mib.c @@ -0,0 +1,408 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Copyright (c) 2026 David Yang + */ + +#include "chip.h" +#include "mib.h" +#include "smi.h" + +struct yt921x_mib_desc { + unsigned int size; + unsigned int offset; + const char *name; +}; + +#define MIB_DESC(_size, _offset, _name) \ + {_size, _offset, _name} + +/* Must agree with yt921x_mib + * + * Unstructured fields (name !=3D NULL) will appear in get_ethtool_stats(), + * structured go to their *_stats() methods, but we need their sizes and o= ffsets + * to perform 32bit MIB overflow wraparound. + */ +static const struct yt921x_mib_desc yt921x_mib_descs[] =3D { + MIB_DESC(1, YT921X_MIB_DATA_RX_BROADCAST, NULL), + MIB_DESC(1, YT921X_MIB_DATA_RX_PAUSE, NULL), + MIB_DESC(1, YT921X_MIB_DATA_RX_MULTICAST, NULL), + MIB_DESC(1, YT921X_MIB_DATA_RX_CRC_ERR, NULL), + + MIB_DESC(1, YT921X_MIB_DATA_RX_ALIGN_ERR, NULL), + MIB_DESC(1, YT921X_MIB_DATA_RX_UNDERSIZE_ERR, NULL), + MIB_DESC(1, YT921X_MIB_DATA_RX_FRAG_ERR, NULL), + MIB_DESC(1, YT921X_MIB_DATA_RX_PKT_SZ_64, NULL), + + MIB_DESC(1, YT921X_MIB_DATA_RX_PKT_SZ_65_TO_127, NULL), + MIB_DESC(1, YT921X_MIB_DATA_RX_PKT_SZ_128_TO_255, NULL), + MIB_DESC(1, YT921X_MIB_DATA_RX_PKT_SZ_256_TO_511, NULL), + MIB_DESC(1, YT921X_MIB_DATA_RX_PKT_SZ_512_TO_1023, NULL), + + MIB_DESC(1, YT921X_MIB_DATA_RX_PKT_SZ_1024_TO_1518, NULL), + MIB_DESC(1, YT921X_MIB_DATA_RX_PKT_SZ_1519_TO_MAX, NULL), + MIB_DESC(2, YT921X_MIB_DATA_RX_GOOD_BYTES, NULL), + + MIB_DESC(2, YT921X_MIB_DATA_RX_BAD_BYTES, "RxBadBytes"), + MIB_DESC(1, YT921X_MIB_DATA_RX_OVERSIZE_ERR, NULL), + + MIB_DESC(1, YT921X_MIB_DATA_RX_DROPPED, NULL), + MIB_DESC(1, YT921X_MIB_DATA_TX_BROADCAST, NULL), + MIB_DESC(1, YT921X_MIB_DATA_TX_PAUSE, NULL), + MIB_DESC(1, YT921X_MIB_DATA_TX_MULTICAST, NULL), + + MIB_DESC(1, YT921X_MIB_DATA_TX_UNDERSIZE_ERR, NULL), + MIB_DESC(1, YT921X_MIB_DATA_TX_PKT_SZ_64, NULL), + MIB_DESC(1, YT921X_MIB_DATA_TX_PKT_SZ_65_TO_127, NULL), + MIB_DESC(1, YT921X_MIB_DATA_TX_PKT_SZ_128_TO_255, NULL), + + MIB_DESC(1, YT921X_MIB_DATA_TX_PKT_SZ_256_TO_511, NULL), + MIB_DESC(1, YT921X_MIB_DATA_TX_PKT_SZ_512_TO_1023, NULL), + MIB_DESC(1, YT921X_MIB_DATA_TX_PKT_SZ_1024_TO_1518, NULL), + MIB_DESC(1, YT921X_MIB_DATA_TX_PKT_SZ_1519_TO_MAX, NULL), + + MIB_DESC(2, YT921X_MIB_DATA_TX_GOOD_BYTES, NULL), + MIB_DESC(1, YT921X_MIB_DATA_TX_COLLISION, NULL), + + MIB_DESC(1, YT921X_MIB_DATA_TX_EXCESSIVE_COLLISION, NULL), + MIB_DESC(1, YT921X_MIB_DATA_TX_MULTIPLE_COLLISION, NULL), + MIB_DESC(1, YT921X_MIB_DATA_TX_SINGLE_COLLISION, NULL), + MIB_DESC(1, YT921X_MIB_DATA_TX_PKT, NULL), + + MIB_DESC(1, YT921X_MIB_DATA_TX_DEFERRED, NULL), + MIB_DESC(1, YT921X_MIB_DATA_TX_LATE_COLLISION, NULL), + MIB_DESC(1, YT921X_MIB_DATA_RX_OAM, "RxOAM"), + MIB_DESC(1, YT921X_MIB_DATA_TX_OAM, "TxOAM"), +}; + +/* The interval should be small enough to avoid overflow of 32bit MIBs. + * + * Until we can read MIBs from stats64 call directly (i.e. sleep + * there), we have to poll stats more frequently then it is actually neede= d. + * For overflow protection, normally, 100 sec interval should have been OK. + */ +#define YT921X_STATS_INTERVAL_JIFFIES (3 * HZ) + +#define to_yt921x_priv(_ds) container_of_const(_ds, struct yt921x_priv, ds) +#define to_device(priv) ((priv)->ds.dev) + +/* Read and handle overflow of 32bit MIBs. MIB buffer must be zeroed befor= e. */ +static int yt921x_mib_read(struct yt921x_priv *priv, int port) +{ + struct yt921x_port *pp =3D &priv->ports[port]; + struct device *dev =3D to_device(priv); + struct yt921x_mib *pm =3D pp->mib; + struct yt921x_mib_stats *mib; + int res =3D 0; + + mib =3D &pm->stats; + + /* Reading of yt921x_port::mib is not protected by a lock and it's vain + * to keep its consistency, since we have to read registers one by one + * and there is no way to make a snapshot of MIB stats. + * + * Writing (by this function only) is and should be protected by + * reg_lock. + */ + + for (size_t i =3D 0; i < ARRAY_SIZE(yt921x_mib_descs); i++) { + const struct yt921x_mib_desc *desc =3D &yt921x_mib_descs[i]; + u32 reg =3D YT921X_MIBn_DATA0(port) + desc->offset; + u64 *valp =3D &((u64 *)mib)[i]; + u32 val0; + u64 val; + + res =3D yt921x_reg_read(priv, reg, &val0); + if (res) + break; + + if (desc->size <=3D 1) { + u64 old_val =3D *valp; + + val =3D (old_val & ~(u64)U32_MAX) | val0; + if (val < old_val) + val +=3D 1ull << 32; + } else { + u32 val1; + + res =3D yt921x_reg_read(priv, reg + 4, &val1); + if (res) + break; + val =3D ((u64)val1 << 32) | val0; + } + + WRITE_ONCE(*valp, val); + } + + pm->rx_frames =3D mib->rx_64byte + mib->rx_65_127byte + + mib->rx_128_255byte + mib->rx_256_511byte + + mib->rx_512_1023byte + mib->rx_1024_1518byte + + mib->rx_jumbo; + pm->tx_frames =3D mib->tx_64byte + mib->tx_65_127byte + + mib->tx_128_255byte + mib->tx_256_511byte + + mib->tx_512_1023byte + mib->tx_1024_1518byte + + mib->tx_jumbo; + + if (res) + dev_err(dev, "Failed to %s port %d: %i\n", "read stats for", + port, res); + return res; +} + +void yt921x_mib_poll(struct work_struct *work) +{ + struct yt921x_mib *pm =3D container_of_const(work, struct yt921x_mib, + work.work); + struct yt921x_port *pp =3D pm->port; + struct yt921x_priv *priv =3D container_of_const(pp, struct yt921x_priv, + ports[pp->index]); + unsigned long delay =3D YT921X_STATS_INTERVAL_JIFFIES; + int port =3D pp->index; + int res; + + mutex_lock(&priv->reg_lock); + res =3D yt921x_mib_read(priv, port); + mutex_unlock(&priv->reg_lock); + if (res) + delay *=3D 4; + + schedule_delayed_work(&pm->work, delay); +} + +void +yt921x_dsa_get_strings(struct dsa_switch *ds, int port, u32 stringset, + uint8_t *data) +{ + if (stringset !=3D ETH_SS_STATS) + return; + + for (size_t i =3D 0; i < ARRAY_SIZE(yt921x_mib_descs); i++) { + const struct yt921x_mib_desc *desc =3D &yt921x_mib_descs[i]; + + if (desc->name) + ethtool_puts(&data, desc->name); + } +} + +void +yt921x_dsa_get_ethtool_stats(struct dsa_switch *ds, int port, uint64_t *da= ta) +{ + struct yt921x_priv *priv =3D to_yt921x_priv(ds); + struct yt921x_port *pp =3D &priv->ports[port]; + struct yt921x_mib *pm =3D pp->mib; + struct yt921x_mib_stats *mib; + size_t j; + + if (!pm) + return; + mib =3D &pm->stats; + + mutex_lock(&priv->reg_lock); + yt921x_mib_read(priv, port); + mutex_unlock(&priv->reg_lock); + + j =3D 0; + for (size_t i =3D 0; i < ARRAY_SIZE(yt921x_mib_descs); i++) { + const struct yt921x_mib_desc *desc =3D &yt921x_mib_descs[i]; + + if (!desc->name) + continue; + + data[j] =3D ((u64 *)mib)[i]; + j++; + } +} + +int yt921x_dsa_get_sset_count(struct dsa_switch *ds, int port, int sset) +{ + int cnt =3D 0; + + if (sset !=3D ETH_SS_STATS) + return 0; + + for (size_t i =3D 0; i < ARRAY_SIZE(yt921x_mib_descs); i++) { + const struct yt921x_mib_desc *desc =3D &yt921x_mib_descs[i]; + + if (desc->name) + cnt++; + } + + return cnt; +} + +void +yt921x_dsa_get_eth_mac_stats(struct dsa_switch *ds, int port, + struct ethtool_eth_mac_stats *mac_stats) +{ + struct yt921x_priv *priv =3D to_yt921x_priv(ds); + struct yt921x_port *pp =3D &priv->ports[port]; + struct yt921x_mib *pm =3D pp->mib; + struct yt921x_mib_stats *mib; + + if (!pm) + return; + mib =3D &pm->stats; + + mutex_lock(&priv->reg_lock); + yt921x_mib_read(priv, port); + mutex_unlock(&priv->reg_lock); + + mac_stats->FramesTransmittedOK =3D pm->tx_frames; + mac_stats->SingleCollisionFrames =3D mib->tx_single_collisions; + mac_stats->MultipleCollisionFrames =3D mib->tx_multiple_collisions; + mac_stats->FramesReceivedOK =3D pm->rx_frames; + mac_stats->FrameCheckSequenceErrors =3D mib->rx_crc_errors; + mac_stats->AlignmentErrors =3D mib->rx_alignment_errors; + mac_stats->OctetsTransmittedOK =3D mib->tx_good_bytes; + mac_stats->FramesWithDeferredXmissions =3D mib->tx_deferred; + mac_stats->LateCollisions =3D mib->tx_late_collisions; + mac_stats->FramesAbortedDueToXSColls =3D mib->tx_aborted_errors; + /* mac_stats->FramesLostDueToIntMACXmitError */ + /* mac_stats->CarrierSenseErrors */ + mac_stats->OctetsReceivedOK =3D mib->rx_good_bytes; + /* mac_stats->FramesLostDueToIntMACRcvError */ + mac_stats->MulticastFramesXmittedOK =3D mib->tx_multicast; + mac_stats->BroadcastFramesXmittedOK =3D mib->tx_broadcast; + /* mac_stats->FramesWithExcessiveDeferral */ + mac_stats->MulticastFramesReceivedOK =3D mib->rx_multicast; + mac_stats->BroadcastFramesReceivedOK =3D mib->rx_broadcast; + /* mac_stats->InRangeLengthErrors */ + /* mac_stats->OutOfRangeLengthField */ + mac_stats->FrameTooLongErrors =3D mib->rx_oversize_errors; +} + +void +yt921x_dsa_get_eth_ctrl_stats(struct dsa_switch *ds, int port, + struct ethtool_eth_ctrl_stats *ctrl_stats) +{ + struct yt921x_priv *priv =3D to_yt921x_priv(ds); + struct yt921x_port *pp =3D &priv->ports[port]; + struct yt921x_mib *pm =3D pp->mib; + struct yt921x_mib_stats *mib; + + if (!pm) + return; + mib =3D &pm->stats; + + mutex_lock(&priv->reg_lock); + yt921x_mib_read(priv, port); + mutex_unlock(&priv->reg_lock); + + ctrl_stats->MACControlFramesTransmitted =3D mib->tx_pause; + ctrl_stats->MACControlFramesReceived =3D mib->rx_pause; + /* ctrl_stats->UnsupportedOpcodesReceived */ +} + +const struct ethtool_rmon_hist_range yt921x_rmon_ranges[] =3D { + { 0, 64 }, + { 65, 127 }, + { 128, 255 }, + { 256, 511 }, + { 512, 1023 }, + { 1024, 1518 }, + { 1519, YT921X_FRAME_SIZE_MAX }, + {} +}; + +void +yt921x_dsa_get_rmon_stats(struct dsa_switch *ds, int port, + struct ethtool_rmon_stats *rmon_stats, + const struct ethtool_rmon_hist_range **ranges) +{ + struct yt921x_priv *priv =3D to_yt921x_priv(ds); + struct yt921x_port *pp =3D &priv->ports[port]; + struct yt921x_mib *pm =3D pp->mib; + struct yt921x_mib_stats *mib; + + if (!pm) + return; + mib =3D &pm->stats; + + mutex_lock(&priv->reg_lock); + yt921x_mib_read(priv, port); + mutex_unlock(&priv->reg_lock); + + *ranges =3D yt921x_rmon_ranges; + + rmon_stats->undersize_pkts =3D mib->rx_undersize_errors; + rmon_stats->oversize_pkts =3D mib->rx_oversize_errors; + rmon_stats->fragments =3D mib->rx_alignment_errors; + /* rmon_stats->jabbers */ + + rmon_stats->hist[0] =3D mib->rx_64byte; + rmon_stats->hist[1] =3D mib->rx_65_127byte; + rmon_stats->hist[2] =3D mib->rx_128_255byte; + rmon_stats->hist[3] =3D mib->rx_256_511byte; + rmon_stats->hist[4] =3D mib->rx_512_1023byte; + rmon_stats->hist[5] =3D mib->rx_1024_1518byte; + rmon_stats->hist[6] =3D mib->rx_jumbo; + + rmon_stats->hist_tx[0] =3D mib->tx_64byte; + rmon_stats->hist_tx[1] =3D mib->tx_65_127byte; + rmon_stats->hist_tx[2] =3D mib->tx_128_255byte; + rmon_stats->hist_tx[3] =3D mib->tx_256_511byte; + rmon_stats->hist_tx[4] =3D mib->tx_512_1023byte; + rmon_stats->hist_tx[5] =3D mib->tx_1024_1518byte; + rmon_stats->hist_tx[6] =3D mib->tx_jumbo; +} + +void +yt921x_dsa_get_stats64(struct dsa_switch *ds, int port, + struct rtnl_link_stats64 *stats) +{ + struct yt921x_priv *priv =3D to_yt921x_priv(ds); + struct yt921x_port *pp =3D &priv->ports[port]; + struct yt921x_mib *pm =3D pp->mib; + struct yt921x_mib_stats *mib; + + if (!pm) + return; + mib =3D &pm->stats; + + stats->rx_length_errors =3D mib->rx_undersize_errors + + mib->rx_fragment_errors; + stats->rx_over_errors =3D mib->rx_oversize_errors; + stats->rx_crc_errors =3D mib->rx_crc_errors; + stats->rx_frame_errors =3D mib->rx_alignment_errors; + /* stats->rx_fifo_errors */ + /* stats->rx_missed_errors */ + + stats->tx_aborted_errors =3D mib->tx_aborted_errors; + /* stats->tx_carrier_errors */ + stats->tx_fifo_errors =3D mib->tx_undersize_errors; + /* stats->tx_heartbeat_errors */ + stats->tx_window_errors =3D mib->tx_late_collisions; + + stats->rx_packets =3D pm->rx_frames; + stats->tx_packets =3D pm->tx_frames; + stats->rx_bytes =3D mib->rx_good_bytes - ETH_FCS_LEN * stats->rx_packets; + stats->tx_bytes =3D mib->tx_good_bytes - ETH_FCS_LEN * stats->tx_packets; + stats->rx_errors =3D stats->rx_length_errors + stats->rx_over_errors + + stats->rx_crc_errors + stats->rx_frame_errors; + stats->tx_errors =3D stats->tx_aborted_errors + stats->tx_fifo_errors + + stats->tx_window_errors; + stats->rx_dropped =3D mib->rx_dropped; + /* stats->tx_dropped */ + stats->multicast =3D mib->rx_multicast; + stats->collisions =3D mib->tx_collisions; +} + +void +yt921x_dsa_get_pause_stats(struct dsa_switch *ds, int port, + struct ethtool_pause_stats *pause_stats) +{ + struct yt921x_priv *priv =3D to_yt921x_priv(ds); + struct yt921x_port *pp =3D &priv->ports[port]; + struct yt921x_mib *pm =3D pp->mib; + struct yt921x_mib_stats *mib; + + if (!pm) + return; + mib =3D &pm->stats; + + mutex_lock(&priv->reg_lock); + yt921x_mib_read(priv, port); + mutex_unlock(&priv->reg_lock); + + pause_stats->tx_pause_frames =3D mib->tx_pause; + pause_stats->rx_pause_frames =3D mib->rx_pause; +} diff --git a/drivers/net/dsa/motorcomm/mib.h b/drivers/net/dsa/motorcomm/mi= b.h new file mode 100644 index 000000000000..cfad0665baae --- /dev/null +++ b/drivers/net/dsa/motorcomm/mib.h @@ -0,0 +1,159 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Copyright (c) 2026 David Yang + */ + +#ifndef _YT_MIB_H +#define _YT_MIB_H + +#include + +#define YT921X_MIB_CTRL 0xc0004 +#define YT921X_MIB_CTRL_CLEAN BIT(30) +#define YT921X_MIB_CTRL_PORT_M GENMASK(6, 3) +#define YT921X_MIB_CTRL_PORT(x) FIELD_PREP(YT921X_MIB_CTRL_PORT_M, (x)) +#define YT921X_MIB_CTRL_ONE_PORT BIT(1) +#define YT921X_MIB_CTRL_ALL_PORT BIT(0) +#define YT921X_MIBn_DATA0(port) (0xc0100 + 0x100 * (port)) +#define YT921X_MIBn_DATAm(port, x) (YT921X_MIBn_DATA0(port) + 4 * (x)) +#define YT921X_MIB_DATA_RX_BROADCAST 0x00 +#define YT921X_MIB_DATA_RX_PAUSE 0x04 +#define YT921X_MIB_DATA_RX_MULTICAST 0x08 +#define YT921X_MIB_DATA_RX_CRC_ERR 0x0c + +#define YT921X_MIB_DATA_RX_ALIGN_ERR 0x10 +#define YT921X_MIB_DATA_RX_UNDERSIZE_ERR 0x14 +#define YT921X_MIB_DATA_RX_FRAG_ERR 0x18 +#define YT921X_MIB_DATA_RX_PKT_SZ_64 0x1c + +#define YT921X_MIB_DATA_RX_PKT_SZ_65_TO_127 0x20 +#define YT921X_MIB_DATA_RX_PKT_SZ_128_TO_255 0x24 +#define YT921X_MIB_DATA_RX_PKT_SZ_256_TO_511 0x28 +#define YT921X_MIB_DATA_RX_PKT_SZ_512_TO_1023 0x2c + +#define YT921X_MIB_DATA_RX_PKT_SZ_1024_TO_1518 0x30 +#define YT921X_MIB_DATA_RX_PKT_SZ_1519_TO_MAX 0x34 +/* 0x38: unused */ +#define YT921X_MIB_DATA_RX_GOOD_BYTES 0x3c + +/* 0x40: 64 bytes */ +#define YT921X_MIB_DATA_RX_BAD_BYTES 0x44 +/* 0x48: 64 bytes */ +#define YT921X_MIB_DATA_RX_OVERSIZE_ERR 0x4c + +#define YT921X_MIB_DATA_RX_DROPPED 0x50 +#define YT921X_MIB_DATA_TX_BROADCAST 0x54 +#define YT921X_MIB_DATA_TX_PAUSE 0x58 +#define YT921X_MIB_DATA_TX_MULTICAST 0x5c + +#define YT921X_MIB_DATA_TX_UNDERSIZE_ERR 0x60 +#define YT921X_MIB_DATA_TX_PKT_SZ_64 0x64 +#define YT921X_MIB_DATA_TX_PKT_SZ_65_TO_127 0x68 +#define YT921X_MIB_DATA_TX_PKT_SZ_128_TO_255 0x6c + +#define YT921X_MIB_DATA_TX_PKT_SZ_256_TO_511 0x70 +#define YT921X_MIB_DATA_TX_PKT_SZ_512_TO_1023 0x74 +#define YT921X_MIB_DATA_TX_PKT_SZ_1024_TO_1518 0x78 +#define YT921X_MIB_DATA_TX_PKT_SZ_1519_TO_MAX 0x7c + +/* 0x80: unused */ +#define YT921X_MIB_DATA_TX_GOOD_BYTES 0x84 +/* 0x88: 64 bytes */ +#define YT921X_MIB_DATA_TX_COLLISION 0x8c + +#define YT921X_MIB_DATA_TX_EXCESSIVE_COLLISION 0x90 +#define YT921X_MIB_DATA_TX_MULTIPLE_COLLISION 0x94 +#define YT921X_MIB_DATA_TX_SINGLE_COLLISION 0x98 +#define YT921X_MIB_DATA_TX_PKT 0x9c + +#define YT921X_MIB_DATA_TX_DEFERRED 0xa0 +#define YT921X_MIB_DATA_TX_LATE_COLLISION 0xa4 +#define YT921X_MIB_DATA_RX_OAM 0xa8 +#define YT921X_MIB_DATA_TX_OAM 0xac + +struct yt921x_mib_stats { + u64 rx_broadcast; + u64 rx_pause; + u64 rx_multicast; + u64 rx_crc_errors; + + u64 rx_alignment_errors; + u64 rx_undersize_errors; + u64 rx_fragment_errors; + u64 rx_64byte; + + u64 rx_65_127byte; + u64 rx_128_255byte; + u64 rx_256_511byte; + u64 rx_512_1023byte; + + u64 rx_1024_1518byte; + u64 rx_jumbo; + u64 rx_good_bytes; + + u64 rx_bad_bytes; + u64 rx_oversize_errors; + + u64 rx_dropped; + u64 tx_broadcast; + u64 tx_pause; + u64 tx_multicast; + + u64 tx_undersize_errors; + u64 tx_64byte; + u64 tx_65_127byte; + u64 tx_128_255byte; + + u64 tx_256_511byte; + u64 tx_512_1023byte; + u64 tx_1024_1518byte; + u64 tx_jumbo; + + u64 tx_good_bytes; + u64 tx_collisions; + + u64 tx_aborted_errors; + u64 tx_multiple_collisions; + u64 tx_single_collisions; + u64 tx_good; + + u64 tx_deferred; + u64 tx_late_collisions; + u64 rx_oam; + u64 tx_oam; +}; + +struct yt921x_mib { + struct yt921x_port *port; + + struct delayed_work work; + struct yt921x_mib_stats stats; + u64 rx_frames; + u64 tx_frames; +}; + +void yt921x_mib_poll(struct work_struct *work); +void +yt921x_dsa_get_strings(struct dsa_switch *ds, int port, u32 stringset, + uint8_t *data); +void +yt921x_dsa_get_ethtool_stats(struct dsa_switch *ds, int port, uint64_t *da= ta); +int yt921x_dsa_get_sset_count(struct dsa_switch *ds, int port, int sset); +void +yt921x_dsa_get_eth_mac_stats(struct dsa_switch *ds, int port, + struct ethtool_eth_mac_stats *mac_stats); +void +yt921x_dsa_get_eth_ctrl_stats(struct dsa_switch *ds, int port, + struct ethtool_eth_ctrl_stats *ctrl_stats); +void +yt921x_dsa_get_rmon_stats(struct dsa_switch *ds, int port, + struct ethtool_rmon_stats *rmon_stats, + const struct ethtool_rmon_hist_range **ranges); +void +yt921x_dsa_get_stats64(struct dsa_switch *ds, int port, + struct rtnl_link_stats64 *stats); +void +yt921x_dsa_get_pause_stats(struct dsa_switch *ds, int port, + struct ethtool_pause_stats *pause_stats); + +#endif --=20 2.53.0 From nobody Sat Sep 26 04:29:59 2026 Received: from mail-pj1-f46.google.com (mail-pj1-f46.google.com [209.85.216.46]) (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 D9855509EF1 for ; Fri, 4 Sep 2026 16:31:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788539483; cv=none; b=KPo371gN1yrguNu4I0o5YjpKhW8x8KJGKd25G1Ujil/e0mpl3TH/90m2hgcCg1otlDkXEDhaKmL3rZSYJYzgMnDZcbRDYI0kZB4q1zjjQIi4031IpnXh3QtyU2KVNil1riENSJDNRYg5YnF42UQDLxSUDOx9nFD9gmSO91Mez24= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788539483; c=relaxed/simple; bh=aFHawD3ZOt8sorY6+QJIW09Yeqs/FU6oPQEXDfBhdFU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=nl2yMfnzSYZMSsgLd5BWuMaGTAd5AvzxuDOuxSaUPoF+x/djuq+qOeE6u66BtSfxEtA4+/O3jZskURTylixFNcF4AufgowamO3NkR0hPqcrptpg1qcAfUeIOVMglh+8uL4VtN6tvnb+fK4OLRT2VBwc1q+WngZ2n1FhoDz9RJsI= 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=IEwEWegE; arc=none smtp.client-ip=209.85.216.46 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="IEwEWegE" Received: by mail-pj1-f46.google.com with SMTP id 98e67ed59e1d1-398a4dcf289so1471219a91.2 for ; Fri, 04 Sep 2026 09:31:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788539480; x=1789144280; 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=N+A/Xnhrpk8UTiVuA2yiv6aoFVSfxG4NVi2T1x7q+Ho=; b=IEwEWegEtO5iNqOIPVAUFy2HSG4uHAEOJRFUUEcKy7akW+8KnkMRou6VV3PfdygdTr R+4wKnPnJ3RO1dtAwlNTR97573vodQBN0LVCTtU5Q/G4iR3l8oRFjO5lG/EdrCRKRPOM QIBMS/GHFHlFbl0V4mQenA5uU1Sj4pyGykEGixuFn7VPjQz3AnLh/fgnJ12y0aVqnTe4 HLEw5dvRXt8JNIMis9kFdTYsXJhTc+plhLZ50Zko6U49BtlLYJQYiRGhCNufapgIVolf nxyYt29ZNub4fQL4lvC3TawOJx6XSLOHBVL09pS3sUm7Okj+wWqeh4sWSlcSttonksi0 pTEA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788539480; x=1789144280; 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=N+A/Xnhrpk8UTiVuA2yiv6aoFVSfxG4NVi2T1x7q+Ho=; b=Mrs9Q/PgusGaN07ZZdy0EGMlr8wNCpmjJJQYjWWfjssxBRmthm7fD5dvIRiqOTjMLm bRT96RRBTdEJKrRrvgsFtk8etyfBQHhtDSiLn3brajw9M4zMWmbfK6lXGw/IEq1KA/Mc rkRmcrEmH0IpwvVXe82ZRYE/GWwv9eUzQoukX8XrfZCWBfQEJGQ+WK1M2dbOyKJBZOaL eMmbDUi1q0ovkCRcWoFm7V3W9S1Lj0jol9idp4A3EzHALzJtseg2HEdvuJhDLJngFtJy NP7Bz6d2oCK725/AL0vwCT+6JkrrttwENy9GGH57nzoV54f10xjASRBBumGSgHSSLpY6 Y3Aw== X-Forwarded-Encrypted: i=1; AKwUvByElGoQg3ZfkhQuxQhcwk7O4C8PDs9ODRh0GVTxCoC2Nl2pENZJ2iiERGeWvwr5WdQqqfP8upLJF9Mj6/c=@vger.kernel.org X-Gm-Message-State: AFuF++lNzqcveZhWAtrqU/V/oXLDzQreRUlSzCZ9AS/070V7SNwZhL6X 20986xT63BM/ROQMnFhDtjuqIX24meiUG4HOayEy6EfLbEX92SM3AqNtD2EBxzSU X-Gm-Gg: AYBFou3HngB9pgFSnLWZDwi3r8A8TnhMFdcDb311kVbW3QtFVBNMp1LLLAbFTGY7zkB 6uRH1k8hdzVdRfDMC/Iv9HIqPMotOHHs8+pV8sdhJ7Atm6B6DFwKUWPMMVCugW8FlDfRZAp8j4+ UWkX8LFPSosO+x/0fk+sRWhF8lV1yL6jj6H7p6QqMH7OeGfnT/kRuVMA0a5vuw7BI7Fmlu2F2hQ D1IlEbldqBrbLeuvkimAR0TtwjOVp8ngJhmxZ6FtAwa+ovzG0wPLkJzd5nqCT/9Okfw/KzVsC1F nmKsqd+BSJoQvt7ZWEsZy1OMRXZoPvsZwqierJNh0DQEH3fRUj2XTJ1aFcrgsUJpOL17QmEVC2L 73T0twMHPDmT8mqJTMtaN76U7jTayPzE1UH+IXXK/iFUK3YAu4zygKEZl6ObBv3j38zt4VicIEx NpdD+optEOGIXsRYX8fTQNy29xS6Fa6EJRhmJ84zD3cqDJ5DqG1Lz4FDws2U8TtIacvt2Xvc2W7 X/BusPq8IUDz6Na8hCJP0D04mV73bRwpnXlyXM= X-Received: by 2002:a17:90b:2ecd:b0:396:40e6:f631 with SMTP id 98e67ed59e1d1-39b2609f306mr12716461a91.3.1788539479621; Fri, 04 Sep 2026 09:31:19 -0700 (PDT) Received: from d.home.yangfl.dn42 ([2a09:bac5:661b:3050::4d0:46]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-39b25c974cfsm5383010a91.0.2026.09.04.09.31.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 04 Sep 2026 09:31:19 -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 v2 4/6] net: dsa: motorcomm: Use u64_stats_t for MIB stats Date: Sat, 5 Sep 2026 00:29:46 +0800 Message-ID: <20260904162952.709368-5-mmyangfl@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260904162952.709368-1-mmyangfl@gmail.com> References: <20260904162952.709368-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 9e0d40a26d08..d8a564d83bad 100644 --- a/drivers/net/dsa/motorcomm/mib.c +++ b/drivers/net/dsa/motorcomm/mib.c @@ -92,22 +92,16 @@ static int yt921x_mib_read(struct yt921x_priv *priv, in= t port) struct device *dev =3D to_device(priv); struct yt921x_mib *pm =3D pp->mib; struct yt921x_mib_stats *mib; + u64 rx_frames; + u64 tx_frames; int res =3D 0; =20 mib =3D &pm->stats; =20 - /* Reading of yt921x_port::mib is not protected by a lock and it's vain - * to keep its consistency, since we have to read registers one by one - * and there is no way to make a snapshot of MIB stats. - * - * Writing (by this function only) is and should be protected by - * reg_lock. - */ - for (size_t i =3D 0; i < ARRAY_SIZE(yt921x_mib_descs); i++) { const struct yt921x_mib_desc *desc =3D &yt921x_mib_descs[i]; u32 reg =3D YT921X_MIBn_DATA0(port) + desc->offset; - u64 *valp =3D &((u64 *)mib)[i]; + u64_stats_t *valp =3D &((u64_stats_t *)mib)[i]; u32 val0; u64 val; =20 @@ -116,7 +110,7 @@ static int yt921x_mib_read(struct yt921x_priv *priv, in= t port) break; =20 if (desc->size <=3D 1) { - u64 old_val =3D *valp; + u64 old_val =3D u64_stats_read(valp); =20 val =3D (old_val & ~(u64)U32_MAX) | val0; if (val < old_val) @@ -130,17 +124,25 @@ static int yt921x_mib_read(struct yt921x_priv *priv, = int port) val =3D ((u64)val1 << 32) | val0; } =20 - WRITE_ONCE(*valp, val); + u64_stats_set(valp, val); } =20 - pm->rx_frames =3D mib->rx_64byte + mib->rx_65_127byte + - mib->rx_128_255byte + mib->rx_256_511byte + - mib->rx_512_1023byte + mib->rx_1024_1518byte + - mib->rx_jumbo; - pm->tx_frames =3D mib->tx_64byte + mib->tx_65_127byte + - mib->tx_128_255byte + mib->tx_256_511byte + - mib->tx_512_1023byte + mib->tx_1024_1518byte + - mib->tx_jumbo; + rx_frames =3D u64_stats_read(&mib->rx_64byte) + + u64_stats_read(&mib->rx_65_127byte) + + u64_stats_read(&mib->rx_128_255byte) + + u64_stats_read(&mib->rx_256_511byte) + + u64_stats_read(&mib->rx_512_1023byte) + + u64_stats_read(&mib->rx_1024_1518byte) + + u64_stats_read(&mib->rx_jumbo); + tx_frames =3D u64_stats_read(&mib->tx_64byte) + + u64_stats_read(&mib->tx_65_127byte) + + u64_stats_read(&mib->tx_128_255byte) + + u64_stats_read(&mib->tx_256_511byte) + + u64_stats_read(&mib->tx_512_1023byte) + + u64_stats_read(&mib->tx_1024_1518byte) + + u64_stats_read(&mib->tx_jumbo); + u64_stats_set(&pm->rx_frames, rx_frames); + u64_stats_set(&pm->tx_frames, tx_frames); =20 if (res) dev_err(dev, "Failed to %s port %d: %i\n", "read stats for", @@ -207,7 +209,7 @@ yt921x_dsa_get_ethtool_stats(struct dsa_switch *ds, int= port, uint64_t *data) if (!desc->name) continue; =20 - data[j] =3D ((u64 *)mib)[i]; + data[j] =3D u64_stats_read(&((u64_stats_t *)mib)[i]); j++; } } @@ -246,28 +248,28 @@ yt921x_dsa_get_eth_mac_stats(struct dsa_switch *ds, i= nt port, yt921x_mib_read(priv, port); mutex_unlock(&priv->reg_lock); =20 - mac_stats->FramesTransmittedOK =3D pm->tx_frames; - mac_stats->SingleCollisionFrames =3D mib->tx_single_collisions; - mac_stats->MultipleCollisionFrames =3D mib->tx_multiple_collisions; - mac_stats->FramesReceivedOK =3D pm->rx_frames; - mac_stats->FrameCheckSequenceErrors =3D mib->rx_crc_errors; - mac_stats->AlignmentErrors =3D mib->rx_alignment_errors; - mac_stats->OctetsTransmittedOK =3D mib->tx_good_bytes; - mac_stats->FramesWithDeferredXmissions =3D mib->tx_deferred; - mac_stats->LateCollisions =3D mib->tx_late_collisions; - mac_stats->FramesAbortedDueToXSColls =3D mib->tx_aborted_errors; + mac_stats->FramesTransmittedOK =3D u64_stats_read(&pm->tx_frames); + mac_stats->SingleCollisionFrames =3D u64_stats_read(&mib->tx_single_colli= sions); + mac_stats->MultipleCollisionFrames =3D u64_stats_read(&mib->tx_multiple_c= ollisions); + mac_stats->FramesReceivedOK =3D u64_stats_read(&pm->rx_frames); + mac_stats->FrameCheckSequenceErrors =3D u64_stats_read(&mib->rx_crc_error= s); + mac_stats->AlignmentErrors =3D u64_stats_read(&mib->rx_alignment_errors); + mac_stats->OctetsTransmittedOK =3D u64_stats_read(&mib->tx_good_bytes); + mac_stats->FramesWithDeferredXmissions =3D u64_stats_read(&mib->tx_deferr= ed); + mac_stats->LateCollisions =3D u64_stats_read(&mib->tx_late_collisions); + mac_stats->FramesAbortedDueToXSColls =3D u64_stats_read(&mib->tx_aborted_= errors); /* mac_stats->FramesLostDueToIntMACXmitError */ /* mac_stats->CarrierSenseErrors */ - mac_stats->OctetsReceivedOK =3D mib->rx_good_bytes; + mac_stats->OctetsReceivedOK =3D u64_stats_read(&mib->rx_good_bytes); /* mac_stats->FramesLostDueToIntMACRcvError */ - mac_stats->MulticastFramesXmittedOK =3D mib->tx_multicast; - mac_stats->BroadcastFramesXmittedOK =3D mib->tx_broadcast; + mac_stats->MulticastFramesXmittedOK =3D u64_stats_read(&mib->tx_multicast= ); + mac_stats->BroadcastFramesXmittedOK =3D u64_stats_read(&mib->tx_broadcast= ); /* mac_stats->FramesWithExcessiveDeferral */ - mac_stats->MulticastFramesReceivedOK =3D mib->rx_multicast; - mac_stats->BroadcastFramesReceivedOK =3D mib->rx_broadcast; + mac_stats->MulticastFramesReceivedOK =3D u64_stats_read(&mib->rx_multicas= t); + mac_stats->BroadcastFramesReceivedOK =3D u64_stats_read(&mib->rx_broadcas= t); /* mac_stats->InRangeLengthErrors */ /* mac_stats->OutOfRangeLengthField */ - mac_stats->FrameTooLongErrors =3D mib->rx_oversize_errors; + mac_stats->FrameTooLongErrors =3D u64_stats_read(&mib->rx_oversize_errors= ); } =20 void @@ -287,8 +289,8 @@ yt921x_dsa_get_eth_ctrl_stats(struct dsa_switch *ds, in= t port, yt921x_mib_read(priv, port); mutex_unlock(&priv->reg_lock); =20 - ctrl_stats->MACControlFramesTransmitted =3D mib->tx_pause; - ctrl_stats->MACControlFramesReceived =3D mib->rx_pause; + ctrl_stats->MACControlFramesTransmitted =3D u64_stats_read(&mib->tx_pause= ); + ctrl_stats->MACControlFramesReceived =3D u64_stats_read(&mib->rx_pause); /* ctrl_stats->UnsupportedOpcodesReceived */ } =20 @@ -323,26 +325,26 @@ yt921x_dsa_get_rmon_stats(struct dsa_switch *ds, int = port, =20 *ranges =3D yt921x_rmon_ranges; =20 - rmon_stats->undersize_pkts =3D mib->rx_undersize_errors; - rmon_stats->oversize_pkts =3D mib->rx_oversize_errors; - rmon_stats->fragments =3D mib->rx_alignment_errors; + rmon_stats->undersize_pkts =3D u64_stats_read(&mib->rx_undersize_errors); + rmon_stats->oversize_pkts =3D u64_stats_read(&mib->rx_oversize_errors); + rmon_stats->fragments =3D u64_stats_read(&mib->rx_alignment_errors); /* rmon_stats->jabbers */ =20 - rmon_stats->hist[0] =3D mib->rx_64byte; - rmon_stats->hist[1] =3D mib->rx_65_127byte; - rmon_stats->hist[2] =3D mib->rx_128_255byte; - rmon_stats->hist[3] =3D mib->rx_256_511byte; - rmon_stats->hist[4] =3D mib->rx_512_1023byte; - rmon_stats->hist[5] =3D mib->rx_1024_1518byte; - rmon_stats->hist[6] =3D mib->rx_jumbo; - - rmon_stats->hist_tx[0] =3D mib->tx_64byte; - rmon_stats->hist_tx[1] =3D mib->tx_65_127byte; - rmon_stats->hist_tx[2] =3D mib->tx_128_255byte; - rmon_stats->hist_tx[3] =3D mib->tx_256_511byte; - rmon_stats->hist_tx[4] =3D mib->tx_512_1023byte; - rmon_stats->hist_tx[5] =3D mib->tx_1024_1518byte; - rmon_stats->hist_tx[6] =3D mib->tx_jumbo; + rmon_stats->hist[0] =3D u64_stats_read(&mib->rx_64byte); + rmon_stats->hist[1] =3D u64_stats_read(&mib->rx_65_127byte); + rmon_stats->hist[2] =3D u64_stats_read(&mib->rx_128_255byte); + rmon_stats->hist[3] =3D u64_stats_read(&mib->rx_256_511byte); + rmon_stats->hist[4] =3D u64_stats_read(&mib->rx_512_1023byte); + rmon_stats->hist[5] =3D u64_stats_read(&mib->rx_1024_1518byte); + rmon_stats->hist[6] =3D u64_stats_read(&mib->rx_jumbo); + + rmon_stats->hist_tx[0] =3D u64_stats_read(&mib->tx_64byte); + rmon_stats->hist_tx[1] =3D u64_stats_read(&mib->tx_65_127byte); + rmon_stats->hist_tx[2] =3D u64_stats_read(&mib->tx_128_255byte); + rmon_stats->hist_tx[3] =3D u64_stats_read(&mib->tx_256_511byte); + rmon_stats->hist_tx[4] =3D u64_stats_read(&mib->tx_512_1023byte); + rmon_stats->hist_tx[5] =3D u64_stats_read(&mib->tx_1024_1518byte); + rmon_stats->hist_tx[6] =3D u64_stats_read(&mib->tx_jumbo); } =20 void @@ -358,32 +360,34 @@ yt921x_dsa_get_stats64(struct dsa_switch *ds, int por= t, return; mib =3D &pm->stats; =20 - stats->rx_length_errors =3D mib->rx_undersize_errors + - mib->rx_fragment_errors; - stats->rx_over_errors =3D mib->rx_oversize_errors; - stats->rx_crc_errors =3D mib->rx_crc_errors; - stats->rx_frame_errors =3D mib->rx_alignment_errors; + stats->rx_length_errors =3D u64_stats_read(&mib->rx_undersize_errors) + + u64_stats_read(&mib->rx_fragment_errors); + stats->rx_over_errors =3D u64_stats_read(&mib->rx_oversize_errors); + stats->rx_crc_errors =3D u64_stats_read(&mib->rx_crc_errors); + stats->rx_frame_errors =3D u64_stats_read(&mib->rx_alignment_errors); /* stats->rx_fifo_errors */ /* stats->rx_missed_errors */ =20 - stats->tx_aborted_errors =3D mib->tx_aborted_errors; + stats->tx_aborted_errors =3D u64_stats_read(&mib->tx_aborted_errors); /* stats->tx_carrier_errors */ - stats->tx_fifo_errors =3D mib->tx_undersize_errors; + stats->tx_fifo_errors =3D u64_stats_read(&mib->tx_undersize_errors); /* stats->tx_heartbeat_errors */ - stats->tx_window_errors =3D mib->tx_late_collisions; - - stats->rx_packets =3D pm->rx_frames; - stats->tx_packets =3D pm->tx_frames; - stats->rx_bytes =3D mib->rx_good_bytes - ETH_FCS_LEN * stats->rx_packets; - stats->tx_bytes =3D mib->tx_good_bytes - ETH_FCS_LEN * stats->tx_packets; + stats->tx_window_errors =3D u64_stats_read(&mib->tx_late_collisions); + + stats->rx_packets =3D u64_stats_read(&pm->rx_frames); + stats->tx_packets =3D u64_stats_read(&pm->tx_frames); + stats->rx_bytes =3D u64_stats_read(&mib->rx_good_bytes) - + ETH_FCS_LEN * stats->rx_packets; + stats->tx_bytes =3D u64_stats_read(&mib->tx_good_bytes) - + ETH_FCS_LEN * stats->tx_packets; stats->rx_errors =3D stats->rx_length_errors + stats->rx_over_errors + stats->rx_crc_errors + stats->rx_frame_errors; stats->tx_errors =3D stats->tx_aborted_errors + stats->tx_fifo_errors + stats->tx_window_errors; - stats->rx_dropped =3D mib->rx_dropped; + stats->rx_dropped =3D u64_stats_read(&mib->rx_dropped); /* stats->tx_dropped */ - stats->multicast =3D mib->rx_multicast; - stats->collisions =3D mib->tx_collisions; + stats->multicast =3D u64_stats_read(&mib->rx_multicast); + stats->collisions =3D u64_stats_read(&mib->tx_collisions); } =20 void @@ -403,6 +407,6 @@ yt921x_dsa_get_pause_stats(struct dsa_switch *ds, int p= ort, yt921x_mib_read(priv, port); mutex_unlock(&priv->reg_lock); =20 - pause_stats->tx_pause_frames =3D mib->tx_pause; - pause_stats->rx_pause_frames =3D mib->rx_pause; + pause_stats->tx_pause_frames =3D u64_stats_read(&mib->tx_pause); + pause_stats->rx_pause_frames =3D u64_stats_read(&mib->rx_pause); } diff --git a/drivers/net/dsa/motorcomm/mib.h b/drivers/net/dsa/motorcomm/mi= b.h index cfad0665baae..d84ae2f449ac 100644 --- a/drivers/net/dsa/motorcomm/mib.h +++ b/drivers/net/dsa/motorcomm/mib.h @@ -6,6 +6,8 @@ #ifndef _YT_MIB_H #define _YT_MIB_H =20 +#include + #include =20 #define YT921X_MIB_CTRL 0xc0004 @@ -72,55 +74,55 @@ #define YT921X_MIB_DATA_TX_OAM 0xac =20 struct yt921x_mib_stats { - u64 rx_broadcast; - u64 rx_pause; - u64 rx_multicast; - u64 rx_crc_errors; - - u64 rx_alignment_errors; - u64 rx_undersize_errors; - u64 rx_fragment_errors; - u64 rx_64byte; - - u64 rx_65_127byte; - u64 rx_128_255byte; - u64 rx_256_511byte; - u64 rx_512_1023byte; - - u64 rx_1024_1518byte; - u64 rx_jumbo; - u64 rx_good_bytes; - - u64 rx_bad_bytes; - u64 rx_oversize_errors; - - u64 rx_dropped; - u64 tx_broadcast; - u64 tx_pause; - u64 tx_multicast; - - u64 tx_undersize_errors; - u64 tx_64byte; - u64 tx_65_127byte; - u64 tx_128_255byte; - - u64 tx_256_511byte; - u64 tx_512_1023byte; - u64 tx_1024_1518byte; - u64 tx_jumbo; - - u64 tx_good_bytes; - u64 tx_collisions; - - u64 tx_aborted_errors; - u64 tx_multiple_collisions; - u64 tx_single_collisions; - u64 tx_good; - - u64 tx_deferred; - u64 tx_late_collisions; - u64 rx_oam; - u64 tx_oam; + u64_stats_t rx_broadcast; + u64_stats_t rx_pause; + u64_stats_t rx_multicast; + u64_stats_t rx_crc_errors; + + u64_stats_t rx_alignment_errors; + u64_stats_t rx_undersize_errors; + u64_stats_t rx_fragment_errors; + u64_stats_t rx_64byte; + + u64_stats_t rx_65_127byte; + u64_stats_t rx_128_255byte; + u64_stats_t rx_256_511byte; + u64_stats_t rx_512_1023byte; + + u64_stats_t rx_1024_1518byte; + u64_stats_t rx_jumbo; + u64_stats_t rx_good_bytes; + + u64_stats_t rx_bad_bytes; + u64_stats_t rx_oversize_errors; + + u64_stats_t rx_dropped; + u64_stats_t tx_broadcast; + u64_stats_t tx_pause; + u64_stats_t tx_multicast; + + u64_stats_t tx_undersize_errors; + u64_stats_t tx_64byte; + u64_stats_t tx_65_127byte; + u64_stats_t tx_128_255byte; + + u64_stats_t tx_256_511byte; + u64_stats_t tx_512_1023byte; + u64_stats_t tx_1024_1518byte; + u64_stats_t tx_jumbo; + + u64_stats_t tx_good_bytes; + u64_stats_t tx_collisions; + + u64_stats_t tx_aborted_errors; + u64_stats_t tx_multiple_collisions; + u64_stats_t tx_single_collisions; + u64_stats_t tx_good; + + u64_stats_t tx_deferred; + u64_stats_t tx_late_collisions; + u64_stats_t rx_oam; + u64_stats_t tx_oam; }; =20 struct yt921x_mib { @@ -128,8 +130,8 @@ struct yt921x_mib { =20 struct delayed_work work; struct yt921x_mib_stats stats; - u64 rx_frames; - u64 tx_frames; + u64_stats_t rx_frames; + u64_stats_t tx_frames; }; =20 void yt921x_mib_poll(struct work_struct *work); --=20 2.53.0 From nobody Sat Sep 26 04:29:59 2026 Received: from mail-pj1-f47.google.com (mail-pj1-f47.google.com [209.85.216.47]) (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 4162E50AC13 for ; Fri, 4 Sep 2026 16:31:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.47 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788539487; cv=none; b=SzFfG76mpbfG5TN0esRL7LlX+C4R0Oq+1nMnAHAtzl87flDUCzYnGHuqdVkwFsmNCr/lq4TNiNRuORgIiWuM0ak/YH54EJBrbkZbk+E4kqm2jCKPsfWG2hbF2YoCI/W6yU3Uzjyx7jS5lMHBakcz+gDLmd215+8vKx+opISkr7Y= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788539487; c=relaxed/simple; bh=h2Bg8T4+bwTo3agItf9Pq+cGyjUAYAXOx+KCR2ysFhc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=eceaQxbfUuSpUbRuuUbTYIpsTWMqQomOyia2JJbbqFAWHNdlj6K0Bkb9+W4khkLeeHqDd6KYfh2RN8jMoSBhLh06VZ5IdbIhKpjr6YmV3EgP6bbD420fosBbpKGz/sD5HJyWdnIE8f6aCKJnePKsNZHtao7LgP3oR39DCFQzL1s= 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=ju+nfzXD; arc=none smtp.client-ip=209.85.216.47 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="ju+nfzXD" Received: by mail-pj1-f47.google.com with SMTP id 98e67ed59e1d1-39682983a0fso1260603a91.3 for ; Fri, 04 Sep 2026 09:31:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788539483; x=1789144283; 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=DCkRuirMIy2dg12kFXX5FXk2nrjUCv9nerEL84PWiVc=; b=ju+nfzXDOyZ3cpI+u769sfpUkRPOjuEPpRX3OIH/OBvy7gUAMZ+Ex1w5SZzYyXxK9p vw/c2Iq2cjtzWPCZQJsSVBgp8mlA2pt+/Y6NpfzIiFMG/MfSmhpRcRKKkuVGUCYMgybK okyEAzG5x/qeR2w+F5akBHSS9/l5CThiIaR2Ic2cpPYQSVEBipjNYkxAnLNLgWocEQfN EImOgt83C8oimusPFXuPgU67zkLN4iTqAtci89LDRzLrkbSuvXG4LZYRyJ0GwsYeR42v eCyZtBoCl0cekLtUMHU66COTAwX89mWlJwMBt07P440/iIe3I1ZTgX7xU4AE2atcPUId yzew== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788539483; x=1789144283; 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=DCkRuirMIy2dg12kFXX5FXk2nrjUCv9nerEL84PWiVc=; b=Ze/ZMTFDi1l6FZMO5nZl9Kx0KOPxfKJxQukulq3X/whYIoOx1MRweVXZm1RbJWrSls pJCh1D5ewT+uZzYfIiS6RS4D2/OsZ473MFFr4b3s23w6re66UhOen9f0xzWCIXhXZXCS 47y0w90VV7eh/ln7Mc/Mi3I7zyDyYcsC1ssLbfonWgnVFyKDcgIp/dc7YQhuldeM5cyZ sWGZRvjSQc+RpB+eQyH4cyxpsFvmX3c77eX01HcR6WRKZkQ33DjhtvLkEg6nJEDa1stL VtvN72jlOR1h8F9FasD2YWlKazEbg6t5FJC6rgh//CXmXzGrDaABsLKUYGhhQArttz1k MX7Q== X-Forwarded-Encrypted: i=1; AKwUvBxATnkoKX5VHHAQfbmGl+0kve13TttJ1xKvwZDSPmzAFM0r2A8wiVrzT6i/ln+Bzy9A3wOJn6UPrMi5etk=@vger.kernel.org X-Gm-Message-State: AFuF++kP4xuzWP5miiBuiGLdo/yTyTrTWxEJZbvVZdrk0Es+QQdyivTo nCu8V+0LdmE96HYhH2gbhbQSyVjzPGPKbaciKbCdWJvIgDubCb2PGppT X-Gm-Gg: AYBFou0uSFXu/k8oTqc8hgBkkkpK5veoiQB0XDPbaUkYXFAab9IC6ssqWVYd7mA6rPE fSLn8k8BVLCyQ3vNiZim3UCV7Waijuj2DzL6UfzNlXHpDtFoAagFGialBoIzSW72ijJvrvjgD95 JDnpuNoG08gKbtZn/ueil8XR7bh3p4aDVU2w+QUZ3cR26sKCzDS79cYfyxvjWjRuSsEF4MNuNjM MYdkC6WWNc04go54nZhkZxp36rtQffxbWU1oM92Xl8bB71xZdkM27TGhyQRWhl0O8nbCDiky5vl b9x97Nbl79tye3FXFg3EDdTKaUqx2SfenyFGpyIBJQVq0/9ID2ueXE3P84XlNtD2TysZyOxv1cz zpGo4iksSzoeWvIU5S/VgOZk6L/KC7hZEMeH6TFxTL0aEwlX/h9XuYff9gufZMUuuZfwdgQR0rz 69k0STNdTEyvuZPR/lk22cX41d+mQMJZzMwiI7dpg0w1A8ffMKZqeyz4LxX67GpxB9ILb4b7WZx f2GZ+ZEGnfrSk0= X-Received: by 2002:a17:90b:2681:b0:38f:5801:dc0e with SMTP id 98e67ed59e1d1-39b261d52a4mr10220549a91.15.1788539483303; Fri, 04 Sep 2026 09:31:23 -0700 (PDT) Received: from d.home.yangfl.dn42 ([2a09:bac5:661b:3050::4d0:46]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-39b25c974cfsm5383010a91.0.2026.09.04.09.31.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 04 Sep 2026 09:31:22 -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 v2 5/6] net: dsa: motorcomm: Fix MIB synchronization Date: Sat, 5 Sep 2026 00:29:47 +0800 Message-ID: <20260904162952.709368-6-mmyangfl@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260904162952.709368-1-mmyangfl@gmail.com> References: <20260904162952.709368-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 | 90 +++++++++++++++++++------------- drivers/net/dsa/motorcomm/mib.h | 6 +++ 3 files changed, 63 insertions(+), 35 deletions(-) diff --git a/drivers/net/dsa/motorcomm/chip.c b/drivers/net/dsa/motorcomm/c= hip.c index d8520c38f9c7..b4059053ef15 100644 --- a/drivers/net/dsa/motorcomm/chip.c +++ b/drivers/net/dsa/motorcomm/chip.c @@ -19,6 +19,7 @@ #include #include #include +#include =20 #include #include @@ -3778,6 +3779,7 @@ static int yt921x_dsa_port_setup(struct dsa_switch *d= s, int port) pp->mib =3D pm; =20 pm->port =3D pp; + u64_stats_init(&pm->syncp); INIT_DELAYED_WORK(&pm->work, yt921x_mib_poll); } =20 diff --git a/drivers/net/dsa/motorcomm/mib.c b/drivers/net/dsa/motorcomm/mi= b.c index d8a564d83bad..31d86c3122c7 100644 --- a/drivers/net/dsa/motorcomm/mib.c +++ b/drivers/net/dsa/motorcomm/mib.c @@ -92,6 +92,7 @@ static int yt921x_mib_read(struct yt921x_priv *priv, int = port) struct device *dev =3D to_device(priv); struct yt921x_mib *pm =3D pp->mib; struct yt921x_mib_stats *mib; + u64 *buf =3D pm->data; u64 rx_frames; u64 tx_frames; int res =3D 0; @@ -101,7 +102,6 @@ static int yt921x_mib_read(struct yt921x_priv *priv, in= t port) for (size_t i =3D 0; i < ARRAY_SIZE(yt921x_mib_descs); i++) { const struct yt921x_mib_desc *desc =3D &yt921x_mib_descs[i]; u32 reg =3D YT921X_MIBn_DATA0(port) + desc->offset; - u64_stats_t *valp =3D &((u64_stats_t *)mib)[i]; u32 val0; u64 val; =20 @@ -110,7 +110,7 @@ static int yt921x_mib_read(struct yt921x_priv *priv, in= t port) break; =20 if (desc->size <=3D 1) { - u64 old_val =3D u64_stats_read(valp); + u64 old_val =3D buf[i]; =20 val =3D (old_val & ~(u64)U32_MAX) | val0; if (val < old_val) @@ -124,9 +124,12 @@ static int yt921x_mib_read(struct yt921x_priv *priv, i= nt port) val =3D ((u64)val1 << 32) | val0; } =20 - u64_stats_set(valp, val); + buf[i] =3D val; } =20 + u64_stats_update_begin(&pm->syncp); + for (size_t i =3D 0; i < ARRAY_SIZE(yt921x_mib_descs); i++) + u64_stats_set(&((u64_stats_t *)mib)[i], buf[i]); rx_frames =3D u64_stats_read(&mib->rx_64byte) + u64_stats_read(&mib->rx_65_127byte) + u64_stats_read(&mib->rx_128_255byte) + @@ -143,6 +146,7 @@ static int yt921x_mib_read(struct yt921x_priv *priv, in= t port) u64_stats_read(&mib->tx_jumbo); u64_stats_set(&pm->rx_frames, rx_frames); u64_stats_set(&pm->tx_frames, tx_frames); + u64_stats_update_end(&pm->syncp); =20 if (res) dev_err(dev, "Failed to %s port %d: %i\n", "read stats for", @@ -191,16 +195,16 @@ yt921x_dsa_get_ethtool_stats(struct dsa_switch *ds, i= nt port, uint64_t *data) struct yt921x_priv *priv =3D to_yt921x_priv(ds); struct yt921x_port *pp =3D &priv->ports[port]; struct yt921x_mib *pm =3D pp->mib; - struct yt921x_mib_stats *mib; + u64 *buf; size_t j; =20 if (!pm) return; - mib =3D &pm->stats; + buf =3D pm->data; =20 mutex_lock(&priv->reg_lock); + yt921x_mib_read(priv, port); - mutex_unlock(&priv->reg_lock); =20 j =3D 0; for (size_t i =3D 0; i < ARRAY_SIZE(yt921x_mib_descs); i++) { @@ -209,9 +213,11 @@ yt921x_dsa_get_ethtool_stats(struct dsa_switch *ds, in= t port, uint64_t *data) if (!desc->name) continue; =20 - data[j] =3D u64_stats_read(&((u64_stats_t *)mib)[i]); + data[j] =3D buf[i]; j++; } + + mutex_unlock(&priv->reg_lock); } =20 int yt921x_dsa_get_sset_count(struct dsa_switch *ds, int port, int sset) @@ -245,8 +251,8 @@ yt921x_dsa_get_eth_mac_stats(struct dsa_switch *ds, int= port, mib =3D &pm->stats; =20 mutex_lock(&priv->reg_lock); + yt921x_mib_read(priv, port); - mutex_unlock(&priv->reg_lock); =20 mac_stats->FramesTransmittedOK =3D u64_stats_read(&pm->tx_frames); mac_stats->SingleCollisionFrames =3D u64_stats_read(&mib->tx_single_colli= sions); @@ -270,6 +276,8 @@ yt921x_dsa_get_eth_mac_stats(struct dsa_switch *ds, int= port, /* mac_stats->InRangeLengthErrors */ /* mac_stats->OutOfRangeLengthField */ mac_stats->FrameTooLongErrors =3D u64_stats_read(&mib->rx_oversize_errors= ); + + mutex_unlock(&priv->reg_lock); } =20 void @@ -286,12 +294,14 @@ yt921x_dsa_get_eth_ctrl_stats(struct dsa_switch *ds, = int port, mib =3D &pm->stats; =20 mutex_lock(&priv->reg_lock); + yt921x_mib_read(priv, port); - mutex_unlock(&priv->reg_lock); =20 ctrl_stats->MACControlFramesTransmitted =3D u64_stats_read(&mib->tx_pause= ); ctrl_stats->MACControlFramesReceived =3D u64_stats_read(&mib->rx_pause); /* ctrl_stats->UnsupportedOpcodesReceived */ + + mutex_unlock(&priv->reg_lock); } =20 const struct ethtool_rmon_hist_range yt921x_rmon_ranges[] =3D { @@ -320,8 +330,8 @@ yt921x_dsa_get_rmon_stats(struct dsa_switch *ds, int po= rt, mib =3D &pm->stats; =20 mutex_lock(&priv->reg_lock); + yt921x_mib_read(priv, port); - mutex_unlock(&priv->reg_lock); =20 *ranges =3D yt921x_rmon_ranges; =20 @@ -345,6 +355,8 @@ yt921x_dsa_get_rmon_stats(struct dsa_switch *ds, int po= rt, rmon_stats->hist_tx[4] =3D u64_stats_read(&mib->tx_512_1023byte); rmon_stats->hist_tx[5] =3D u64_stats_read(&mib->tx_1024_1518byte); rmon_stats->hist_tx[6] =3D u64_stats_read(&mib->tx_jumbo); + + mutex_unlock(&priv->reg_lock); } =20 void @@ -355,39 +367,45 @@ yt921x_dsa_get_stats64(struct dsa_switch *ds, int por= t, struct yt921x_port *pp =3D &priv->ports[port]; struct yt921x_mib *pm =3D pp->mib; struct yt921x_mib_stats *mib; + unsigned int start; =20 if (!pm) return; mib =3D &pm->stats; =20 - stats->rx_length_errors =3D u64_stats_read(&mib->rx_undersize_errors) + - u64_stats_read(&mib->rx_fragment_errors); - stats->rx_over_errors =3D u64_stats_read(&mib->rx_oversize_errors); - stats->rx_crc_errors =3D u64_stats_read(&mib->rx_crc_errors); - stats->rx_frame_errors =3D u64_stats_read(&mib->rx_alignment_errors); - /* stats->rx_fifo_errors */ - /* stats->rx_missed_errors */ - - stats->tx_aborted_errors =3D u64_stats_read(&mib->tx_aborted_errors); - /* stats->tx_carrier_errors */ - stats->tx_fifo_errors =3D u64_stats_read(&mib->tx_undersize_errors); - /* stats->tx_heartbeat_errors */ - stats->tx_window_errors =3D u64_stats_read(&mib->tx_late_collisions); - - stats->rx_packets =3D u64_stats_read(&pm->rx_frames); - stats->tx_packets =3D u64_stats_read(&pm->tx_frames); - stats->rx_bytes =3D u64_stats_read(&mib->rx_good_bytes) - - ETH_FCS_LEN * stats->rx_packets; - stats->tx_bytes =3D u64_stats_read(&mib->tx_good_bytes) - - ETH_FCS_LEN * stats->tx_packets; + do { + start =3D u64_stats_fetch_begin(&pm->syncp); + + stats->rx_length_errors =3D u64_stats_read(&mib->rx_undersize_errors) + + u64_stats_read(&mib->rx_fragment_errors); + stats->rx_over_errors =3D u64_stats_read(&mib->rx_oversize_errors); + stats->rx_crc_errors =3D u64_stats_read(&mib->rx_crc_errors); + stats->rx_frame_errors =3D u64_stats_read(&mib->rx_alignment_errors); + /* stats->rx_fifo_errors */ + /* stats->rx_missed_errors */ + + stats->tx_aborted_errors =3D u64_stats_read(&mib->tx_aborted_errors); + /* stats->tx_carrier_errors */ + stats->tx_fifo_errors =3D u64_stats_read(&mib->tx_undersize_errors); + /* stats->tx_heartbeat_errors */ + stats->tx_window_errors =3D u64_stats_read(&mib->tx_late_collisions); + + stats->rx_packets =3D u64_stats_read(&pm->rx_frames); + stats->tx_packets =3D u64_stats_read(&pm->tx_frames); + stats->rx_bytes =3D u64_stats_read(&mib->rx_good_bytes) - + ETH_FCS_LEN * stats->rx_packets; + stats->tx_bytes =3D u64_stats_read(&mib->tx_good_bytes) - + ETH_FCS_LEN * stats->tx_packets; + stats->rx_dropped =3D u64_stats_read(&mib->rx_dropped); + /* stats->tx_dropped */ + stats->multicast =3D u64_stats_read(&mib->rx_multicast); + stats->collisions =3D u64_stats_read(&mib->tx_collisions); + } while (u64_stats_fetch_retry(&pm->syncp, start)); + stats->rx_errors =3D stats->rx_length_errors + stats->rx_over_errors + stats->rx_crc_errors + stats->rx_frame_errors; stats->tx_errors =3D stats->tx_aborted_errors + stats->tx_fifo_errors + stats->tx_window_errors; - stats->rx_dropped =3D u64_stats_read(&mib->rx_dropped); - /* stats->tx_dropped */ - stats->multicast =3D u64_stats_read(&mib->rx_multicast); - stats->collisions =3D u64_stats_read(&mib->tx_collisions); } =20 void @@ -404,9 +422,11 @@ yt921x_dsa_get_pause_stats(struct dsa_switch *ds, int = port, mib =3D &pm->stats; =20 mutex_lock(&priv->reg_lock); + yt921x_mib_read(priv, port); - mutex_unlock(&priv->reg_lock); =20 pause_stats->tx_pause_frames =3D u64_stats_read(&mib->tx_pause); pause_stats->rx_pause_frames =3D u64_stats_read(&mib->rx_pause); + + mutex_unlock(&priv->reg_lock); } diff --git a/drivers/net/dsa/motorcomm/mib.h b/drivers/net/dsa/motorcomm/mi= b.h index d84ae2f449ac..33992a5f9bdc 100644 --- a/drivers/net/dsa/motorcomm/mib.h +++ b/drivers/net/dsa/motorcomm/mib.h @@ -125,13 +125,19 @@ struct yt921x_mib_stats { u64_stats_t tx_oam; }; =20 +#define YT921X_MIB_NUM (sizeof(struct yt921x_mib_stats) / sizeof(u64_stats= _t)) + struct yt921x_mib { struct yt921x_port *port; =20 struct delayed_work work; + struct u64_stats_sync syncp; + /* protected by syncp OR priv->reg_lock */ struct yt921x_mib_stats stats; u64_stats_t rx_frames; u64_stats_t tx_frames; + /* protected by priv->reg_lock */ + u64 data[YT921X_MIB_NUM]; }; =20 void yt921x_mib_poll(struct work_struct *work); --=20 2.53.0 From nobody Sat Sep 26 04:29:59 2026 Received: from mail-pg1-f175.google.com (mail-pg1-f175.google.com [209.85.215.175]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E572650AC36 for ; Fri, 4 Sep 2026 16:31:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788539489; cv=none; b=DBB72NGCbD3tTHKD183JcqEWXIApoRGWZY5xEK6qnExmdp08VKGR9UE+1j1Dfg8Q8cu94ya+dvP4UjXdzANP7QLe70nguOjws6bFwXSwIWy0WJ07QXwJesVXmW1+BZK1FcngWSkonmBewZaDWVvDdYguhe/i+UGunVuV10bFxwk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788539489; c=relaxed/simple; bh=v6BGTskfyYdAzw7ivySRKD5EqTbHTtrOxjyyM+NNpUM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=f9EdMgXfjQa3AweUGvvSSYnOHi00Ra/+8AAn4IHynnbvr2z56MWh9kau6Q+DWlJlC1SIm6BvxbnKQvt4z3nxcYeSt4x8/3hP3Z31Wm8W88edxK/QqHo4DgYjz4jvUc7QvYTys2tN18/KQKbwRWQ2w55ASo+jydQyCJncZxFCKlU= 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=KUmJKJCz; arc=none smtp.client-ip=209.85.215.175 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="KUmJKJCz" Received: by mail-pg1-f175.google.com with SMTP id 41be03b00d2f7-cc149372c14so689097a12.1 for ; Fri, 04 Sep 2026 09:31:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788539487; x=1789144287; 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=V7u3jRd+MzxyndQi5AHaCjt2uZ5jt3CwjA+sg8R0AWQ=; b=KUmJKJCzX4xewi5L89+oxty9tFyODo751x6VKtNj2HUuMZ1CmQipIO6rrao+2f6va/ WLE8Zh5bkX60JsmOBhTsxm8aduwMPTHUEkrBoOr3x/6i7TVMratzT3ElixBcVc83GPtS AX9V9u2RmEYHTd9gdoc/jComEqFm+0NnkgyumPTFOCBGC5G8WIvqcevZpUqi8/DBarTQ plJePtNiy6QLBZBnvFhl2tjMmO9BTZOT9l/LKglWHRcxYXv3donthtY6Y9NG+YTRP+q1 6z7IcvslfLBA+TT3hfyzdHLqnT6/KEcyxd16kASS6/RkM7JxtyBEGjG5fT4prSxV82NW 95DA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788539487; x=1789144287; 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=V7u3jRd+MzxyndQi5AHaCjt2uZ5jt3CwjA+sg8R0AWQ=; b=XoPdjSx4N1lu/0CWDnugDptm2qVy66nEY7ZDjwM1o4GBJEJlTfzgpDkg1sEC3kb5dQ G1kPUcC2bID8HHD6uqHhDgHqHq1Q5L5ZudGKUFtSLQP7Kfji/i8HvATE9VLU+5v1ltKr TvmNIGX20kOS/PwJErptuRR/2D3k4mnKUZyBvYdQaSiDvzjs9FmPeuG6q+cAU3AV9YGe RZAJGm/xgoyuXJWMkvfCtrDT0lip/W/iC3fW2at4WiPvdQzLZ9Okf49NnX+Y5PQLtzW8 CnOphzOEs+7s6rb15SteU0aAxz83zL3ec+D3SQjANtCkQe2Bj7ob2R8sohb379j/cNJB YSDg== X-Forwarded-Encrypted: i=1; AKwUvBz/xKNTggovtiI6szX+OW4nw0InndblhQg/fdLsLH+P2MKJP3YwdGlprchm9YCnPFcAIVEanbbG57Hgnw8=@vger.kernel.org X-Gm-Message-State: AFuF++kKJb4ZRMk9svYauq8Q0pssd9VBp5yI29MLFRpaYspnQGs+sm4+ IhIVYlHDvqbceTHEH4LpU93e2liJ0Lr0/vQ+amilkTyLVGXrSCiPffOa X-Gm-Gg: AYBFou0yQSkYIdKt/cLYSwPlZaxg7dJPhAZbLNQLGQcm8qQHRtk0XTz9zrfdW9nWfOC Coz81xzWeGBNU4jy0PJE09sWbzrb7SchpDIaEXCH55z1DN465ieQO8Jtswcq+cgFbEJICbWAKEo ifyuVMKkEIRAxYULsD556bXuN8G8yIuJBDKM7aO8Sad29okqzTyYuGudxd8yNF8/G7dkMzTmpcC nFEh2KmRiKFH3T9aoA6QCXWbgNSO+5YqtWalJDSfsm1Tkix0YnScV5NI2hvQbMYReWDJijB865C Ch/BTIqMm+q0UBZAUtA5dYiAdu0mc5XoCcf3P1m45UJt+95qVuR1WY1l3kCWeYxk6OeNBnXRzkQ qh6SjTIoWp/4PKma3ySPVJaUzvkMJiHwI+Dj4phj3ABkNYof8mSRQMj7MLvZtIcOcU5DVRy4JeZ 72rghze3nHb1A53II6742jAq8n2d8cwN5mXlkYr1h0ObvvkelJB7r+zaAbtEJq8/5baSen8EYIU PkD0WHfjBiYPbQ= X-Received: by 2002:a17:90b:2ccf:b0:398:a2a3:b631 with SMTP id 98e67ed59e1d1-39b262aaf3dmr11726379a91.19.1788539486428; Fri, 04 Sep 2026 09:31:26 -0700 (PDT) Received: from d.home.yangfl.dn42 ([2a09:bac5:661b:3050::4d0:46]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-39b25c974cfsm5383010a91.0.2026.09.04.09.31.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 04 Sep 2026 09:31:26 -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 v2 6/6] net: dsa: motorcomm: Use safe 64-bit counter reader Date: Sat, 5 Sep 2026 00:29:48 +0800 Message-ID: <20260904162952.709368-7-mmyangfl@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260904162952.709368-1-mmyangfl@gmail.com> References: <20260904162952.709368-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 | 19 +++++++++---------- drivers/net/dsa/motorcomm/smi.c | 30 ++++++++++++++++++++++++++++++ drivers/net/dsa/motorcomm/smi.h | 2 ++ 3 files changed, 41 insertions(+), 10 deletions(-) diff --git a/drivers/net/dsa/motorcomm/mib.c b/drivers/net/dsa/motorcomm/mi= b.c index 31d86c3122c7..8929476a976f 100644 --- a/drivers/net/dsa/motorcomm/mib.c +++ b/drivers/net/dsa/motorcomm/mib.c @@ -102,26 +102,25 @@ 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; } =20 buf[i] =3D val; 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