From nobody Fri Sep 25 02:02:28 2026 Received: from mail-pj2-f28.google.com (mail-pj2-f28.google.com [74.125.227.156]) (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 B2F614B7A44 for ; Thu, 17 Sep 2026 18:52:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.227.156 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789671127; cv=none; b=s/AtI+0LJAV3CbJ3a0wd9qkub+Ew9UHKFQtODVFOaY6yauy4I/rNLI81roRMJnhZdxiAnN0nkZBUL/xuLHaVblN5YaQqR3TtC+xAwmj9Tq31RgyNlJr7+bqtd8JkYtspj/TnMmbaf8rWR1o9wq2ZeElZO283cg42YPKRx72bzdw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789671127; c=relaxed/simple; bh=t2Rh5HicDYfUhDshXxIV+ToBVIxCOdkpflXNAhRUTLk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=gpYI2Px6h1TwSyWry4V/T89r5rOEOAysW7cqbA4up17NcNmtUjYRPwzSM2iTbkcTisV67X0sZ/6i8ZMSX2pCCI9X1eE7yJL3KfSnIJ5NrRnhUqhj8aE1I8804oEXCf/9ndBBH3Z3+Su4rM8XyUubAvYEG1F853KrrtsZFT7/PYI= 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=T5pxtX+6; arc=none smtp.client-ip=74.125.227.156 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="T5pxtX+6" Received: by mail-pj2-f28.google.com with SMTP id d9443c01a7336-2d91c22d27dso8068055ad.1 for ; Thu, 17 Sep 2026 11:52:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1789671125; x=1790275925; 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=NmX2iathH1BothbInV/Ke+WVEC5Ed3SbwmWKrISd/bc=; b=T5pxtX+6IDQgsCLgsdHKya62Qy+iLqBixxRGItznFZ2qExnkwK5zPbLPSU97n09kPT kwSt6zXMgzK5GW74d2FoX9hiHPPFBOCfGqtFsQsCQpCRZcJMPT0TbJWX+vEuB8ND7gxe a5gIp9KfPXyuGLmVfXh0uAxbdWthhDShicbT2vRKYMEmCLx5WFRKkMQv1hvzrF8JRAZT mum8WZXoiIihZ4UzF0dOBZtyvPg8RO60tc1APefWtFN1WfhRuCeCzEEVfrWNZZRsK+GP DPSEiLZeompA7Ns+0ShqNrFEhhlf98ubFsm1xnX+vjxtlSj+1gmWaZG4nxoTSS9alAVY hn4Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789671125; x=1790275925; 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=NmX2iathH1BothbInV/Ke+WVEC5Ed3SbwmWKrISd/bc=; b=zrzYhRKZkFPOSA7Qs6h4mVIcmBcfKIT+EK79Hb/quboghweYUjuUErOmQa8P9DwFBE RhdIEeFZyqpJhueTt7zOwh2+jCRd/Zbd77FlBOsOhx5mURhdqV4JLVHqDKaHrzg2XSSq 4Kccii557PGIr0T+XnbjZA2wvWQNapyq2fGvIfAAjThFFaTazOpHe/Jf8krVsK95585a BOHokUD6PhDLTC2Bm80/S8hjN+TWrUpFVHn9WTqs8sahotp7d/qWf8IIbF4uDTLBAPSc AfjzsgIxrRffaaoJmpkCqL9hstWRXFlBf0FU3v6N5OOCnIN1FVdb7nx1PJIsCNttHcHH uOQw== X-Forwarded-Encrypted: i=1; AKwUvBx+yYl+cyK0Em/BUOr23w/+/REAGrPGyoRmAZT8iV7Bn76u9NKAzlPVMvHUZd2S3KYGH2hrWZDsl6wooug=@vger.kernel.org X-Gm-Message-State: AFuF++lLnaTgOxOIaH/K53bLcs94lM8TUNXbKJE6NRiAQfmzIzJCOEVb OK5rN++XuOMNOhkmZBKGGfq7eLc0KIg1Xl8lm7o91kVebrSd+mfxZsps X-Gm-Gg: AYBFou0O17h5Mm5izxArgUQMaxMrM+hfv/h1k3wKJVFR4snpdHlGTSCdPj82P6nxF8D oEGZ+BWw6bqBAXg1A+oW+7eqJS29mMFDVO3CNa+P8baWCojwD3QBxI8Sdi9oMaC400vjD/mTZcE BiKBq3HaYkc/tjmu3mnSSSsZhLdKY4P56JZT/pk+6DohToTI4JZHwiu5OP/OXVU1W7SQMrv4aLi q3gDV9RuxJliv0S57lU1K6tCDYJzDJRitGR245LzjNqsi6jx79PzWUTdTjkK8w1XkfrfoTdzXcF L/C1XRbJQPgM7BOXMjPzWvJiEQxtwKgP2ZYUPxEksg6DbHCBpP9+RnFW1tW83wLGpBM+Gb9D0Jo z9iWwzOz0Z6GNK1yqSTjzEt+PzdrQtr4GBX8ERCn39sqLGub2ONNh7Xwd09cUmh/F+ftM/UKjmq pLxRks8YXuveqEdcfBoX0swhwuka4aLBuCJeDkuhPtDi9ST0grRcU5PVeIWZ/+hL4vFq5sOMHjN mxFeOwzGCmURVzmBrY3JfcgRQ== X-Received: by 2002:a17:902:d4c4:b0:2d8:d4dd:24c0 with SMTP id d9443c01a7336-2ddb1b97ee1mr2276265ad.21.1789671124852; Thu, 17 Sep 2026 11:52:04 -0700 (PDT) Received: from d.home.yangfl.dn42 ([2a09:bac5:661a:1232::1d0:c5]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2dd89f331b7sm31032655ad.82.2026.09.17.11.52.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 17 Sep 2026 11:52:04 -0700 (PDT) From: David Yang To: netdev@vger.kernel.org Cc: David Yang , Andrew Lunn , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Russell King , linux-kernel@vger.kernel.org Subject: [PATCH net-next v3 1/8] net: dsa: motorcomm: Remove YT921X_PORT_MASK_* macros Date: Fri, 18 Sep 2026 02:49:48 +0800 Message-ID: <20260917185010.3189199-2-mmyangfl@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260917185010.3189199-1-mmyangfl@gmail.com> References: <20260917185010.3189199-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" Remove YT921X_PORT_MASK_* macros since they are only thin wrappers around BIT() and GENMASK() and are not used in other places (plain BIT() and GENMASK() are used there). No functional change. Signed-off-by: David Yang Reviewed-by: Andrew Lunn --- drivers/net/dsa/motorcomm/chip.c | 31 +++++++++++++------------------ 1 file changed, 13 insertions(+), 18 deletions(-) diff --git a/drivers/net/dsa/motorcomm/chip.c b/drivers/net/dsa/motorcomm/c= hip.c index d663af010f43..5acd7d27ff40 100644 --- a/drivers/net/dsa/motorcomm/chip.c +++ b/drivers/net/dsa/motorcomm/chip.c @@ -108,46 +108,41 @@ struct yt921x_info { u16 external_mask; }; =20 -#define YT921X_PORT_MASK_INTn(port) BIT(port) -#define YT921X_PORT_MASK_INT0_n(n) GENMASK((n) - 1, 0) -#define YT921X_PORT_MASK_EXT0 BIT(8) -#define YT921X_PORT_MASK_EXT1 BIT(9) - static const struct yt921x_info yt921x_infos[] =3D { { "YT9215SC", YT9215_MAJOR, 1, 0, - YT921X_PORT_MASK_INT0_n(5), - YT921X_PORT_MASK_EXT0 | YT921X_PORT_MASK_EXT1, + GENMASK(4, 0), + BIT(8) | BIT(9), }, { "YT9215S", YT9215_MAJOR, 2, 0, - YT921X_PORT_MASK_INT0_n(5), - YT921X_PORT_MASK_EXT0 | YT921X_PORT_MASK_EXT1, + GENMASK(4, 0), + BIT(8) | BIT(9), }, { "YT9215RB", YT9215_MAJOR, 3, 0, - YT921X_PORT_MASK_INT0_n(5), - YT921X_PORT_MASK_EXT0 | YT921X_PORT_MASK_EXT1, + GENMASK(4, 0), + BIT(8) | BIT(9), }, { "YT9214NB", YT9215_MAJOR, 3, 2, - YT921X_PORT_MASK_INTn(1) | YT921X_PORT_MASK_INTn(3), - YT921X_PORT_MASK_EXT0 | YT921X_PORT_MASK_EXT1, + BIT(1) | BIT(3), + BIT(8) | BIT(9), }, { "YT9213NB", YT9215_MAJOR, 3, 3, - YT921X_PORT_MASK_INTn(1) | YT921X_PORT_MASK_INTn(3), - YT921X_PORT_MASK_EXT1, + BIT(1) | BIT(3), + BIT(9), }, { "YT9218N", YT9218_MAJOR, 0, 0, - YT921X_PORT_MASK_INT0_n(8), + GENMASK(7, 0), 0, }, { "YT9218MB", YT9218_MAJOR, 1, 0, - YT921X_PORT_MASK_INT0_n(8), - YT921X_PORT_MASK_EXT0 | YT921X_PORT_MASK_EXT1, + GENMASK(7, 0), + BIT(8) | BIT(9), }, {} }; --=20 2.53.0 From nobody Fri Sep 25 02:02:28 2026 Received: from mail-pj2-f43.google.com (mail-pj2-f43.google.com [74.125.227.171]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id AC7B64D1797 for ; Thu, 17 Sep 2026 18:52:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.227.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789671130; cv=none; b=GMTr19qcowunU1G9qERsKzUk94YrGfGJyee4ksDdNOPaojSpIt+nYc9xuAJAbBTrtCnGIZJGUiOFliFDzHNtn6txj7fRsa4JjFE7Ok9nW1HmrIRf03d7qsaYorMUGc2giGwLtiR0WnWfuiqajSzuQFRtG6OsCgT+ozdFcZLMQ5w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789671130; c=relaxed/simple; bh=YuVnVbkxesHUrvTiDDRRP7qicf2K8BySrtV+L0OtK/E=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=tl+jYIBTdkCqoeGjJvH+kOr69OjNQTudev7NMcZ4t9VQiaq9c56Z+TjTvgt5KzizGSBkB3B9LM7iq3zkbx+AJZDwCyi22EFHv2o6l5HyCv4ADwtStqIHNd5GF/ZWeedmRpXBe7MLF4al1sLUNQmAXlSpOYPHGY+w1lSB5lPpW0w= 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=q9MirAp1; arc=none smtp.client-ip=74.125.227.171 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="q9MirAp1" Received: by mail-pj2-f43.google.com with SMTP id d9443c01a7336-2d91ede8035so14191775ad.3 for ; Thu, 17 Sep 2026 11:52:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1789671128; x=1790275928; 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=nUdkePa1f6mE21SLiU0MIHgY8wUKKU9ZP9pTIcp6WpA=; b=q9MirAp1+FgH1LS200NF60mel2o+AQU0aUEIdF/X93vlSl0Y+9jWiVdCdBr54oG/7H sdMPGY3smdLY10ipk/JPU7DB7L5FGyax6Co9zPtRAh0Fv0vlnDfCfzs/LhrUXuu/+wX1 8GAMQX4rsQR2IAmM9NYnsKQ3zaa/DqxRDfv/imzHxtRJk2pLhGiFJ55oUBCxNWMhiIJG xSCmhcK3KrTMtkPfnQg5omD0S3LukH9YLQk+gQDLUQgDVfBJxFGESiSO9ownK5ixADpb HU6xV+AX7gKGZpzoF9uV/jxXLIclqqzzRYCCRCcI7NNMhWCvdDRoWEx+5yZqTgAV3yWa biGQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789671128; x=1790275928; 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=nUdkePa1f6mE21SLiU0MIHgY8wUKKU9ZP9pTIcp6WpA=; b=T/O7YfennCUurTU0WKr0vGn0w29Xsaa1gvMZGVgLP1CFfgqE7r/ap+KBRmZ9zPmcS6 L/FDYwSOCgVV5OjgP882JyVEAyD1YpsLQMoz5kdGkwnfZBXraGg3SqmWFkUfVVCSlztr BO7yVCkAGV1nM5zVo1iVZWMQ6SvcNeVJnXWtXbu0RmKGbWTk4rMPTdfHoTCYEPlL3T79 ISOYIUNvXecSh4xqv0jqL4n2pDc1EhYmcREWo0eZLkin0WsHKWiwnjIU9OeSA6lqDM6n 1UyeoaipYtY/5D+yjM9emuLOrHddydN0SXDTIasHM97d0cLmf17ZeIXXzb2m5o05Sqtl 1EQg== X-Forwarded-Encrypted: i=1; AKwUvBzi8UNtRGIPjDpbyWiSWPAjOxC9SefVQKoIStRbL3G0JEfRjTJYmgJ6Z+IOb2ZDrqHwViBEjWA3Jtje0Zo=@vger.kernel.org X-Gm-Message-State: AFuF++mk6idv7j2IZbF3maLBNhqXKjx+tkTfIHDm7SSftaEQZfm6qDyH CM7BbFC8azkHH7/1G2ZiRRBR94QUD1ryFaAIKGRBGo4fbAa6c31KebCZHrqnR3lI X-Gm-Gg: AYBFou3X3YzO+0eJA5thRVXX/4cpdKjyVBmltJ2c+sD9wiPsDqmaIPUDunCtSSl5B7S hHm1Dr4mR4M7n3vO4UIiuiFP6aH3vqamsDwdSrKmtztEHcPT/G7CXj28KMKxVudDwbC3R9qoCWD SFhPWxDa0TpvarxN6dRewDgBs0FZ2IjyFef0lDXa3mJME3Ulb+0rgC2aEV3K5LPNmgiw6IR+Ebc HASBaRY00dBYmzXlg+uaPFByKPYHba85GZ/U8OI1D4+5JJWvePPFuUy80PZgK+MrfP2T1Z5n8uu tSGIjQGwqFmP1RmQ2SFI0x9ecpNlyhYQ5GQMQ3zCt/YMwkpkKG+wvXdlIlrCBD+m3BTSaIxnthF cGTQYV7z+QLAbdxCZk+XWWUEAZ7Yl/SW/1qQIChkhc/XXVsPhvAth2Waa5rjI3GWEevlip/ZxlH TQvoJFGrXxfG+0owJAEp9u+NswVWuA03s6s8FR7hYI0JoVkbC4YPDl9uTsGu0aj+0RUlmE7jnTN 58JmAFISwyOO00g+yELt4IE0Q== X-Received: by 2002:a17:903:234d:b0:2d6:e074:9cad with SMTP id d9443c01a7336-2ddb1acad2dmr2893325ad.6.1789671127782; Thu, 17 Sep 2026 11:52:07 -0700 (PDT) Received: from d.home.yangfl.dn42 ([2a09:bac5:661a:1232::1d0:c5]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2dd89f331b7sm31032655ad.82.2026.09.17.11.52.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 17 Sep 2026 11:52:07 -0700 (PDT) From: David Yang To: netdev@vger.kernel.org Cc: David Yang , Andrew Lunn , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Russell King , linux-kernel@vger.kernel.org Subject: [PATCH net-next v3 2/8] net: dsa: motorcomm: Split xMII and SERDES port masks Date: Fri, 18 Sep 2026 02:49:49 +0800 Message-ID: <20260917185010.3189199-3-mmyangfl@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260917185010.3189199-1-mmyangfl@gmail.com> References: <20260917185010.3189199-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" Replace external_mask with xmii_mask and serdes_mask, and advertise the interface modes it actually supports. Also move struct yt921x_info into chip.h for future use. Signed-off-by: David Yang Reviewed-by: Andrew Lunn --- drivers/net/dsa/motorcomm/chip.c | 39 ++++++++++++-------------------- drivers/net/dsa/motorcomm/chip.h | 13 +++++++++++ 2 files changed, 27 insertions(+), 25 deletions(-) diff --git a/drivers/net/dsa/motorcomm/chip.c b/drivers/net/dsa/motorcomm/c= hip.c index 5acd7d27ff40..b527a9cfd3e8 100644 --- a/drivers/net/dsa/motorcomm/chip.c +++ b/drivers/net/dsa/motorcomm/chip.c @@ -96,53 +96,48 @@ static const struct yt921x_mib_desc yt921x_mib_descs[] = =3D { MIB_DESC(1, YT921X_MIB_DATA_TX_OAM, "TxOAM"), }; =20 -struct yt921x_info { - const char *name; - u16 major; - /* Unknown, seems to be plain enumeration */ - u8 mode; - u8 extmode; - /* Ports with integral GbE PHYs, not including MCU Port 10 */ - u16 internal_mask; - /* TODO: see comments in yt921x_dsa_phylink_get_caps() */ - u16 external_mask; -}; - static const struct yt921x_info yt921x_infos[] =3D { { "YT9215SC", YT9215_MAJOR, 1, 0, GENMASK(4, 0), + BIT(9), BIT(8) | BIT(9), }, { "YT9215S", YT9215_MAJOR, 2, 0, GENMASK(4, 0), - BIT(8) | BIT(9), + BIT(9), + BIT(8), }, { "YT9215RB", YT9215_MAJOR, 3, 0, GENMASK(4, 0), BIT(8) | BIT(9), + 0, }, { "YT9214NB", YT9215_MAJOR, 3, 2, BIT(1) | BIT(3), - BIT(8) | BIT(9), + BIT(9), + BIT(8), }, { "YT9213NB", YT9215_MAJOR, 3, 3, BIT(1) | BIT(3), BIT(9), + BIT(9), }, { "YT9218N", YT9218_MAJOR, 0, 0, GENMASK(7, 0), 0, + 0, }, { "YT9218MB", YT9218_MAJOR, 1, 0, GENMASK(7, 0), BIT(8) | BIT(9), + BIT(8) | BIT(9), }, {} }; @@ -4021,15 +4016,10 @@ yt921x_dsa_phylink_get_caps(struct dsa_switch *ds, = int port, */ __set_bit(PHY_INTERFACE_MODE_INTERNAL, config->supported_interfaces); - } else if (info->external_mask & BIT(port)) { - /* TODO: external ports may support SERDES only, XMII only, or - * SERDES + XMII depending on the chip. However, we can't get - * the accurate config table due to lack of document, thus - * we simply declare SERDES + XMII and rely on the correctness - * of devicetree for now. - */ + return; + } =20 - /* SERDES */ + if (BIT(port) & info->serdes_mask) { __set_bit(PHY_INTERFACE_MODE_SGMII, config->supported_interfaces); /* REVSGMII (SGMII in PHY role) should go here, once @@ -4042,9 +4032,8 @@ yt921x_dsa_phylink_get_caps(struct dsa_switch *ds, in= t port, __set_bit(PHY_INTERFACE_MODE_2500BASEX, config->supported_interfaces); config->mac_capabilities |=3D MAC_2500FD; - - /* XMII */ - + } + if (BIT(port) & info->xmii_mask) { /* Not tested. To add support for XMII: * - Add proper interface modes below * - Handle them in yt921x_port_config() diff --git a/drivers/net/dsa/motorcomm/chip.h b/drivers/net/dsa/motorcomm/c= hip.h index 83cd454955dd..83e76cefbccd 100644 --- a/drivers/net/dsa/motorcomm/chip.h +++ b/drivers/net/dsa/motorcomm/chip.h @@ -960,6 +960,19 @@ struct yt921x_reg_ops { int (*write)(void *context, u32 reg, u32 val); }; =20 +struct yt921x_info { + const char *name; + u16 major; + /* Unknown, seems to be plain enumeration */ + u8 mode; + u8 extmode; + /* Ports with integral GbE PHYs, not including MCU Port 10 */ + u16 internal_mask; + /* Note: xmii_mask and serdes_mask may overlap */ + u16 xmii_mask; + u16 serdes_mask; +}; + struct yt921x_priv { struct dsa_switch ds; =20 --=20 2.53.0 From nobody Fri Sep 25 02:02:28 2026 Received: from mail-pj2-f20.google.com (mail-pj2-f20.google.com [74.125.227.148]) (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 06B334DDB22 for ; Thu, 17 Sep 2026 18:52:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.227.148 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789671133; cv=none; b=LDTWDpVhuEffRsC9bddvzj11zVUrya1xR1kGCGC3vFQ8nvozgrrPfeSfwoOGsvyLkPrq33O1mLOsc394t0dzbjeyrvkBi6cYXVok3q9vmZ465NTK0ZbkHfQUZA1InXLi3HWfQtLERlZVluaPcD7JozdhkNZuBlf0T2WttpSWTto= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789671133; c=relaxed/simple; bh=njI0Vg2kOdmWdWb4y8lHpI6W6+rIKolqjl46KofA73Y=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=SaWJ02vhFdtVxHBDxXg1X7Wl/NAlwctuNFfR3hEUnaa3eZslgofeRVq8QVKeRYfuQAigHxiBwxgm3iJ3w+nSvSkSeyFZ3RbeGx2ElX6R7m/e9JSasiCYUHy/NpvkTrCTOAfjCXiboRLlOs7o/+f7DINRxg06uR7tCm9ZjMVTkX0= 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=EMOM4GAA; arc=none smtp.client-ip=74.125.227.148 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="EMOM4GAA" Received: by mail-pj2-f20.google.com with SMTP id d9443c01a7336-2d747ed9866so10841785ad.2 for ; Thu, 17 Sep 2026 11:52:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1789671131; x=1790275931; 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=Y81t7BgQ+dtg+VKzZrcT7SMjZASx7AevuRrRDGaFD9s=; b=EMOM4GAAdJcgbqj70PnbMo6DNqn7N8XSE+0U3JRmEOMcn7i/8JOTlwggS//OqRr9uj AEIpR3PEkZWANrZpd5rDEpWXAYdyFQFF/HUR+9m/K9GhN46B2YMwpBYprCNf8FNNah6i 1KhrLWHloyMWHn92YdoCQ4patrheqXkSXzjACi2u9MO1Dlud7I9SzmrQEbKSwGFPY/X+ urlXC1DkS/r/DgvwR0LFmtPAH+PAi+ln0T8IM8pfaJW+7mVl+dZYjLVa+GMoNs+tTPkx 3+Qa89aMpUPkK6XvYnyXzmSSpC/WaajvVecSQc+YcHMOYvYFiFYHs7S/6jRKB9ygiNqt cUBA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789671131; x=1790275931; 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=Y81t7BgQ+dtg+VKzZrcT7SMjZASx7AevuRrRDGaFD9s=; b=nhqi5Ph09VxMFYZtmXovm4cI0vmgYyl1GOsGzps6TkqplWkIqwC9QIn2ndl/Tqch2m gRDAwu6xSDy273470keQa5n265fTcStWh9k067G8Zev1yGxCKXqnTLnWW7LqIr/hzqbh F+iMac9ehKTxsICDK/28vnVvbi+3FnstB2n38k8SiRLIt8QsjfmYc8nMFra2BVwZMozg rsVSyPwZG6bbpCq7IlM+WUd0g1dU/rG/5/Gb83iXjhWKoYsbidGZTRXq0vwFEiwurBlq KZn5/VXoYvXIUYu3w/c1meC+/SoKbSLM1/Yy4F1c5+4Z+cs+LFnKyWQVa8t6T1EyATVd yTTw== X-Forwarded-Encrypted: i=1; AKwUvByVRrHjdRhVJ7aSGIOlYRz0fkUl6OPQuLYqkMg9q1zQpbCLKtpsf7MIdLzCUKCy3+TafcyXJdm0odww6Jo=@vger.kernel.org X-Gm-Message-State: AFuF++nR2DAFEeeDbJcrp4UjxmR+xbR8J7xCklTh1A7t3WdmiNlcBtLJ 38EQbLZNW0BTOH9d1KEczf8P8IpYtiZa5tQZ8zI2ORmpxauDGqqjB7JE X-Gm-Gg: AYBFou2jhDsNvbdTA6L+p+fdcSsdfU/qfQ5R/nBGhcTbP2tkO69qP3QBhcf9UGu14YK 1K0oz2xcMJd425ZQsNHhrTdbfTnsTomAPXI+ZcyeGfP/Ek55HuaQE9MB4x81xQoBDO0tmzVfawT FqjCl+ooHuPJqp0UhOCOL1HBAeSYvvOyzkoNO03qPJgx0PDG3WsLEGT8QI1r+rOM5y3Z6q3n7fN 2QHHpI+zadDboH/66pEAbJ6Kh3dY0e6U3xQSlCpJWVHtK+APVDbwCnmkMIhSbzO8gvcj9DAhbpG NdC3CL5XU6Esy0aKrdaxRJHYyqAAXLjKoeDcVQOc/CbpicnqKx6nWrM1dbHR23TzbGkR+Vr0Ys5 Eupi3WDJU/RKLdg36E816XaHsKddL/dyMj+ugjhoU4Cnnr37T/PbcybIQZaUYuTtp3TALjNOEwM hPU77WkHi7V8pw+bk5+2+6SISNkuZSRFeCeUMMarqs8qJlQC0Ymm+tdMkWdMMpJ8aV9oFuxFMbX iK4a3t3vZ60t1AhHNVixa7NxA== X-Received: by 2002:a17:903:32c5:b0:2d9:2fc9:5706 with SMTP id d9443c01a7336-2ddb1ab3aabmr3003155ad.2.1789671131159; Thu, 17 Sep 2026 11:52:11 -0700 (PDT) Received: from d.home.yangfl.dn42 ([2a09:bac5:661a:1232::1d0:c5]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2dd89f331b7sm31032655ad.82.2026.09.17.11.52.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 17 Sep 2026 11:52:10 -0700 (PDT) From: David Yang To: netdev@vger.kernel.org Cc: David Yang , Andrew Lunn , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Russell King , linux-kernel@vger.kernel.org Subject: [PATCH net-next v3 3/8] net: dsa: motorcomm: Check port type with runtime info Date: Fri, 18 Sep 2026 02:49:50 +0800 Message-ID: <20260917185010.3189199-4-mmyangfl@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260917185010.3189199-1-mmyangfl@gmail.com> References: <20260917185010.3189199-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 yt921x_port_is_internal/external() macros hardcoded the port layout: they treat ports 8 and 9 as external on every chip and count the dummy ports as internal. Drop them and identify the port type using chip info and runtime configuration. Signed-off-by: David Yang --- drivers/net/dsa/motorcomm/chip.c | 39 +++++++++++++++++++++++--------- drivers/net/dsa/motorcomm/chip.h | 11 +++++---- 2 files changed, 34 insertions(+), 16 deletions(-) diff --git a/drivers/net/dsa/motorcomm/chip.c b/drivers/net/dsa/motorcomm/c= hip.c index b527a9cfd3e8..bcc9542370c2 100644 --- a/drivers/net/dsa/motorcomm/chip.c +++ b/drivers/net/dsa/motorcomm/chip.c @@ -3738,6 +3738,7 @@ yt921x_dsa_port_set_apptrust(struct dsa_switch *ds, i= nt port, const u8 *sel, =20 static int yt921x_port_down(struct yt921x_priv *priv, int port) { + const struct yt921x_info *info =3D priv->info; u32 mask; int res; =20 @@ -3746,12 +3747,13 @@ static int yt921x_port_down(struct yt921x_priv *pri= v, int port) if (res) return res; =20 - if (yt921x_port_is_external(port)) { + if (BIT(port) & info->serdes_mask) { mask =3D YT921X_SERDES_LINK; res =3D yt921x_reg_clear_bits(priv, YT921X_SERDESn(port), mask); if (res) return res; - + } + if (BIT(port) & info->xmii_mask) { mask =3D YT921X_XMII_LINK; res =3D yt921x_reg_clear_bits(priv, YT921X_XMIIn(port), mask); if (res) @@ -3766,6 +3768,8 @@ yt921x_port_up(struct yt921x_priv *priv, int port, un= signed int mode, phy_interface_t interface, int speed, int duplex, bool tx_pause, bool rx_pause) { + const struct yt921x_info *info =3D priv->info; + struct yt921x_port *pp =3D &priv->ports[port]; u32 mask; u32 ctrl; int res; @@ -3800,7 +3804,10 @@ yt921x_port_up(struct yt921x_priv *priv, int port, u= nsigned int mode, if (res) return res; =20 - if (yt921x_port_is_external(port)) { + if (!(BIT(port) & (info->serdes_mask | info->xmii_mask))) + return 0; + + if (pp->serdes) { mask =3D YT921X_SERDES_SPEED_M; switch (speed) { case SPEED_10: @@ -3836,7 +3843,7 @@ yt921x_port_up(struct yt921x_priv *priv, int port, un= signed int mode, mask, ctrl); if (res) return res; - + } else { mask =3D YT921X_XMII_LINK; res =3D yt921x_reg_set_bits(priv, YT921X_XMIIn(port), mask); if (res) @@ -3876,17 +3883,16 @@ static int yt921x_port_config(struct yt921x_priv *priv, int port, unsigned int mode, phy_interface_t interface) { + const struct yt921x_info *info =3D priv->info; + struct yt921x_port *pp =3D &priv->ports[port]; struct device *dev =3D to_device(priv); u32 mask; u32 ctrl; int res; =20 - if (!yt921x_port_is_external(port)) { - if (interface !=3D PHY_INTERFACE_MODE_INTERNAL) { - dev_err(dev, "Wrong mode %d on port %d\n", - interface, port); - return -EINVAL; - } + if (BIT(port) & info->internal_mask) { + if (interface !=3D PHY_INTERFACE_MODE_INTERNAL) + goto err; return 0; } =20 @@ -3896,6 +3902,9 @@ yt921x_port_config(struct yt921x_priv *priv, int port= , unsigned int mode, case PHY_INTERFACE_MODE_100BASEX: case PHY_INTERFACE_MODE_1000BASEX: case PHY_INTERFACE_MODE_2500BASEX: + if (!(BIT(port) & info->serdes_mask)) + goto err; + mask =3D YT921X_SERDES_CTRL_PORTn(port); res =3D yt921x_reg_set_bits(priv, YT921X_SERDES_CTRL, mask); if (res) @@ -3928,13 +3937,21 @@ yt921x_port_config(struct yt921x_priv *priv, int po= rt, unsigned int mode, if (res) return res; =20 + /* The order is quite arbitrary - we can't return to a safe + * state on IO errors. + */ + pp->serdes =3D true; break; /* add XMII support here */ default: - return -EINVAL; + goto err; } =20 return 0; + +err: + dev_err(dev, "Wrong mode %d on port %d\n", interface, port); + return -EINVAL; } =20 static void diff --git a/drivers/net/dsa/motorcomm/chip.h b/drivers/net/dsa/motorcomm/c= hip.h index 83e76cefbccd..fd552f7dced4 100644 --- a/drivers/net/dsa/motorcomm/chip.h +++ b/drivers/net/dsa/motorcomm/chip.h @@ -858,9 +858,6 @@ enum yt921x_fdb_entry_status { =20 #define YT921X_NAME "yt921x" =20 -#define yt921x_port_is_internal(port) ((port) < 8) -#define yt921x_port_is_external(port) ((port) =3D=3D 8 || (port) =3D=3D 9) - struct yt921x_mib { u64 rx_broadcast; u64 rx_pause; @@ -936,8 +933,12 @@ struct yt921x_acl_blk { struct yt921x_port { unsigned char index; =20 - bool hairpin; - bool isolated; + /* SerDes in use */ + bool serdes:1; + /* BR_HAIRPIN_MODE */ + bool hairpin:1; + /* BR_ISOLATED */ + bool isolated:1; =20 struct delayed_work mib_read; struct yt921x_mib mib; --=20 2.53.0 From nobody Fri Sep 25 02:02:28 2026 Received: from mail-pj2-f13.google.com (mail-pj2-f13.google.com [74.125.227.141]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CB4FF4C10CA for ; Thu, 17 Sep 2026 18:52:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.227.141 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789671141; cv=none; b=cyDHfw8Rx6uDCK+VYoWmlcsuuh6cfmei5L0F49C1qjJuET/YgvevASDeMvmCNliYYg5ViOmII/K6i9mo22kQBKJJlvc7MYkFXYnqExDlQYttQUBfKq8bFG9Q3JPHIPVqPCkt0QBUsfw69TyHKJSAXUEksUjLc0VS/gyr3av/C6w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789671141; c=relaxed/simple; bh=ib2A9udkzvYv7FD9VshCB8nL6L2/m8X7KTuloEvFaWY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=GPVueG9eS1gJbjH/o9XIX3YSsallhVr/wbX748GbxXQ5IcTmsgkwk3+rN+TIUxcikZuiySclUYhDROCWvsunzydSg//RurqKRChSCoUn9EwSq+WgHyWk4kOw1Eh9iVPOWJzaeA9YFod+jO7DQSmNX7AZcGNHIKUr4ckxZnLT+iY= 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=sv4+K562; arc=none smtp.client-ip=74.125.227.141 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="sv4+K562" Received: by mail-pj2-f13.google.com with SMTP id d9443c01a7336-2dd58e1e2c7so12366795ad.0 for ; Thu, 17 Sep 2026 11:52:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1789671139; x=1790275939; 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=O8YqplBJKdZ9jG0Stk9hqmzya10hEbvLDTdw7GUxkAQ=; b=sv4+K5626ODmhWj6rA4JXkw1eu3JLEtFyAOoTtDlXozl1K+hRaUd25rpwRfH5Z8Pl3 puHQSpxL08ExNpdP1zLPI78fCUG2Ar2sE8tTLxiqSlzC4iP9Z6ba1ITjMHxGxTxdV58B 8RhfCvuWuc2tBm8ge83Mt3BVMvL5YJ0rl/qz/N8TmlJg88+ds8X5Xw4Yw4Od3pFztEpn P/uk4pDSosmP45VCkQJtfalvg3sL7Zy6FSzQAx3QM8FMkHD3ByTtHuplPm4UYNFwHbQm fOBvafWk6c85CZw9wJY/McTSx5NrmZVjHeWC+Tu7hVFKs6QVVrl7sSVdIzEbKY9rn7KS SjYg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789671139; x=1790275939; 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=O8YqplBJKdZ9jG0Stk9hqmzya10hEbvLDTdw7GUxkAQ=; b=nuvTjhauAogFzXsENDiy9F13ppPnWmrmn8kIkxy/VXtdVRXOAc3gQwf0z7DwvzebRe 6HwJrn0S/Eelv3x1plCNjnBte/VszALOI+s4qhaG6ueC5o1QG2OY9I6fYg5NvDoGvS7K 8NPQw0Bd8HU3Od73jMLbN5mplavbzDQeVAZ/ZbuIXrg301wae3/RiHT07WKDc4Io4+iH RNadHrGOOslfdqfTifG1xsoJItOO5qgMYyiAMVNvSEv839kZ8hsUUNuQ9sRfTrtqmRgC xnvBXhqA6jtYlI8q1cW8q9xdUyWE3WQDezSIlN2s4vrQ2YxCDqX+GWaBHu1Usx1MbICj 0vtw== X-Forwarded-Encrypted: i=1; AKwUvBweMwkKFq1JhgJ28dDKNsiiQIb/X/wBcQjWETOLb2rE6hDoWovWZQMFI5OFKaWzwtxy7g1aoOJ+vwa7ra0=@vger.kernel.org X-Gm-Message-State: AFuF++nlJfpjyo/nFgdg/OR4Pp3QdBdUKE5IE2fNiGCPFjIvVToUn3GD ru6AXHfUMhZFf+2RRpk0Q1HrI7EGlmBT2Zz3/lCuViMriQBmOXPEl/mC X-Gm-Gg: AYBFou3AZXVqxf6MSnj5NOLRH3QHaz8TYhXip+SYBfJxuyB4LKXKujV/W/JfdLJOB7u /c1Q4m66ghbxtFmyhDW3oenRTung2zqA30a8UCuTlr7ErW1ZGjL0weGtTn080pGUs9qAu6lul4p zJfkU4ida79C+8Ez1kL8WiAirVqUutjOtrqFM34AcleDoSLkFbnjf4AHqZo326MggDvb+obpfd6 c2sVZIjk7ZyqiGzn629n2knUgJAkhH24cSnAxL8hYnb8uidPZerc4nD4qQm+vc2gF6Vxo60k5Tm GLwNd+K53Tg+/BWPdApM7T80T+UXuZ1Jro+b7qr24fDObtmSxvhWPVTbLT+Td+DIrZOCm6qebUj 7reAloVLQNOdbtydHBOfldXEDfZk8nsantdtfl0P16lQ/3VncKCtu6/Cy+wxa2FJRXS62BRryKV NEIR4tu5HuqNl4BWV5l0Ha+qmHnbRXHjHHltq4I7zh4OriIvcQyaEI/e5ATSZcD9TR7r6oQKDxb moeh8pcmDkq/iYFiNEKecjsRg== X-Received: by 2002:a17:902:f645:b0:2d8:d4d0:792b with SMTP id d9443c01a7336-2ddb1b79d84mr2382095ad.15.1789671134278; Thu, 17 Sep 2026 11:52:14 -0700 (PDT) Received: from d.home.yangfl.dn42 ([2a09:bac5:661a:1232::1d0:c5]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2dd89f331b7sm31032655ad.82.2026.09.17.11.52.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 17 Sep 2026 11:52:13 -0700 (PDT) From: David Yang To: netdev@vger.kernel.org Cc: David Yang , Andrew Lunn , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Russell King , linux-kernel@vger.kernel.org Subject: [PATCH net-next v3 4/8] net: dsa: motorcomm: Fix register bit field names Date: Fri, 18 Sep 2026 02:49:51 +0800 Message-ID: <20260917185010.3189199-5-mmyangfl@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260917185010.3189199-1-mmyangfl@gmail.com> References: <20260917185010.3189199-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" Review and fix the incorrectness in the bit field names. No functional change. Signed-off-by: David Yang Reviewed-by: Andrew Lunn --- drivers/net/dsa/motorcomm/chip.c | 3 ++- drivers/net/dsa/motorcomm/chip.h | 9 +++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/drivers/net/dsa/motorcomm/chip.c b/drivers/net/dsa/motorcomm/c= hip.c index bcc9542370c2..5049f4be8aa6 100644 --- a/drivers/net/dsa/motorcomm/chip.c +++ b/drivers/net/dsa/motorcomm/chip.c @@ -3742,7 +3742,8 @@ static int yt921x_port_down(struct yt921x_priv *priv,= int port) u32 mask; int res; =20 - mask =3D YT921X_PORT_LINK | YT921X_PORT_RX_MAC_EN | YT921X_PORT_TX_MAC_EN; + mask =3D YT921X_PORT_CTRL_LINK_AN | YT921X_PORT_RX_MAC_EN | + YT921X_PORT_TX_MAC_EN; res =3D yt921x_reg_clear_bits(priv, YT921X_PORTn_CTRL(port), mask); if (res) return res; diff --git a/drivers/net/dsa/motorcomm/chip.h b/drivers/net/dsa/motorcomm/c= hip.h index fd552f7dced4..3fb0c6a69dd8 100644 --- a/drivers/net/dsa/motorcomm/chip.h +++ b/drivers/net/dsa/motorcomm/chip.h @@ -42,7 +42,7 @@ #define YT921X_PVID_SEL 0x80014 #define YT921X_PVID_SEL_SVID_PORTn(port) BIT(port) #define YT921X_SERDES_CTRL 0x80028 -#define YT921X_SERDES_CTRL_PORTn_TEST(port) BIT((port) - 3) +#define YT921X_SERDES_CTRL_TEST BIT(6) #define YT921X_SERDES_CTRL_PORTn(port) BIT((port) - 8) #define YT921X_IO_LEVEL 0x80030 #define YT9215_IO_LEVEL_NORMAL_M GENMASK(5, 4) @@ -94,11 +94,12 @@ #define YT921X_SERDES_SPEED_1000 YT921X_SERDES_SPEED(2) #define YT921X_SERDES_SPEED_10000 YT921X_SERDES_SPEED(3) #define YT921X_SERDES_SPEED_2500 YT921X_SERDES_SPEED(4) -#define YT921X_PORTn_CTRL(port) (0x80100 + 4 * (port)) +#define YT921X_PORTn_CTRL(port) (0x80100 + 4 * (port)) /* Bit 7-0 shared= with PORT_STATUS */ #define YT921X_PORT_CTRL_PAUSE_AN BIT(10) +#define YT921X_PORT_CTRL_LINK_AN BIT(9) +#define YT921X_PORT_CTRL_HALF_PAUSE BIT(8) /* Half-duplex back pressure= mode */ #define YT921X_PORTn_STATUS(port) (0x80200 + 4 * (port)) -#define YT921X_PORT_LINK BIT(9) /* CTRL: auto negotiation */ -#define YT921X_PORT_HALF_PAUSE BIT(8) /* Half-duplex back pressure mod= e */ +#define YT921X_PORT_LINK BIT(8) #define YT921X_PORT_DUPLEX_FULL BIT(7) #define YT921X_PORT_RX_PAUSE BIT(6) #define YT921X_PORT_TX_PAUSE BIT(5) --=20 2.53.0 From nobody Fri Sep 25 02:02:28 2026 Received: from mail-pj2-f12.google.com (mail-pj2-f12.google.com [74.125.227.140]) (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 E60174E0B7E for ; Thu, 17 Sep 2026 18:52:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.227.140 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789671144; cv=none; b=iQU9VIxqOgpKRDxYYs896Lm6tgKqZyTBfwLatn5ANXf8svN40JxvOZqMuPICIJATn98cPG0wO5282v3erz1zl+WZDVP3niaugW1ladV11epG0xe10B7H7BeyhcXSfN7MPQW1RnvKeI/MwpRFh0ilXStb89ff353j5iEigxiF0WY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789671144; c=relaxed/simple; bh=Y3hzZlH4RfTt1GSDjBmAJN7+/oFT0VzwaZE3x6JZ7f4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=i9iJ4RraVusrldd//7khT0y3PYvhGe6zgQv2AtiZplmqpyivpTHpOM8KfYUZCMIzVeJE/0kIjq/bpFeF0+krSnwy1/tvLfgJDbHE5ZVuqpg4wyDEEyGUSOyTle5WHrmzZ6BDnAqpfic8u2PZwD+j48Vme+coHZu1T28FZS1L7uo= 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=U2/z64/s; arc=none smtp.client-ip=74.125.227.140 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="U2/z64/s" Received: by mail-pj2-f12.google.com with SMTP id d9443c01a7336-2d8fb334e72so11957805ad.1 for ; Thu, 17 Sep 2026 11:52:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1789671142; x=1790275942; 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=3YyQU7Pqm4R021NqFKJm1m07kcj+3eESCj8W+bHOyKE=; b=U2/z64/sIaJgo4bS9dtH+jXedNQxuAL0ANdouI/semmhYZYcalnVb5dAw/5XrlJvHu 13S8Y0YaFTYqgrCxH/JaYKDCtfv/pH5Ly5AGgbVo5D+Op1EugX/K/YbOqQ2NnstYRsry J+e9JQBYo0a7VeZsuySguIubGme63L/aIt37AiuYARxIUF9syKRARlxzG8WpVgcPjHEa JfqU0WXhKV6w2LZqDn/OrqyGJUAJ6zlWTq/16SL9VarveX1KOubjjTTuj8ION8LvRknX b0tmKr4r733qXy3D1cXFaxqMIpPp/33FJMqCrH2nspjsWIfMxULoHu1+LsN0rMT1U/7D jfFw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789671142; x=1790275942; 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=3YyQU7Pqm4R021NqFKJm1m07kcj+3eESCj8W+bHOyKE=; b=VokoM9KvN12E4vC58FulSzR/oppPowvrQoM7tqjx8JvAshJyEV3g8cM3MOsqG6Rx9C R+LO8NEDoMER8/GKlKrhk6N0ZxwG846pG994EZtnnzaaz/4UKFToB8nka332URiHWgGR fTzODSD/8wDIud0U3+vGnAS5wwz0trlwLzwgTYMe8BqiZ7DEPpXuDAjjBgueQFenBaO7 R6OkqWhFlnJxPpXjSGdZiaTWZC8Ep4UWlGYRKAzOWO21NFGJtFpiJymq38Cp3x0c9XU5 J+s8unegGb16JAe4qFj/4s86DE4Xp2uvoqGLIhYIC4sKw2YpIeWT5LKlIuR0xuy0fBEG aNJw== X-Forwarded-Encrypted: i=1; AKwUvBx4kT4HYbqCsS+vL/s8KkDatfGyftXtVV8pi650XFRwvs3dF6Cx1fjb2xbsWQxJmiZD5Sg12eFzM99zDQg=@vger.kernel.org X-Gm-Message-State: AFuF++mqPWM1T3gR9r5MAMhIfP4Pw47OFce2P0TYl1ZvdB7bKjauYE4B 1l6bmy4VQdpJ5Czug0/NP36CTZgL3qafJ7qaCJ1lOPjFZO34Rsbfbd+R X-Gm-Gg: AYBFou3ABEpBSYQpKH0TCDMVxJGURXOC3R7q/RPMkEugHM0XrpnirNMGO1KdtKdZMIB 53CkK/8Bb8Uv5YKdAXhinJN6vdGsmbra0RpNYGOYWrN1gJp30vgdX84a/5i+LbaJ0OuYyhJ/9+P GKa/qBx1HfLOlgNPnhBLUv1/TWPhtGCVacZOSeY1HyMWlSOHmpKnkJi8uI8YRMiBlTs4TnUN/8s GgKa/3fCMI46SET+ojW/C3PZKyYvxyLPoVjnLxgUTqs2GRK1v/0NVubrVQQITrwTfhAIRUd2JDP zNDnsdXS/nVy0zi+Flr6Rfko3aVtLp4n1ewRW+FjsaPaISdrk8GSZ+SRAA/OqtXnAP3LP8V9Huh /6W0UiG0RQ/psHjxPWPQnHIpRBi+974M6Pe69DBZ0twbv00r6OCkXRtG1GrMT6iyvceDlP5Jiu+ XZHRPnaIt3NlqQXUD2b69QAH+ZHgpbijJEvBxkapeYe+oHM1qj7xkR64sEib4Eqeg3TwPOO8Y8j jTacXOej3jLV0CA2vtzMJZq3A== X-Received: by 2002:a17:903:1b4e:b0:2d8:d4cc:be68 with SMTP id d9443c01a7336-2ddb1c15709mr1593525ad.21.1789671137547; Thu, 17 Sep 2026 11:52:17 -0700 (PDT) Received: from d.home.yangfl.dn42 ([2a09:bac5:661a:1232::1d0:c5]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2dd89f331b7sm31032655ad.82.2026.09.17.11.52.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 17 Sep 2026 11:52:16 -0700 (PDT) From: David Yang To: netdev@vger.kernel.org Cc: David Yang , Andrew Lunn , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Russell King , linux-kernel@vger.kernel.org Subject: [PATCH net-next v3 5/8] net: dsa: motorcomm: Introduce yt921x_speed Date: Fri, 18 Sep 2026 02:49:52 +0800 Message-ID: <20260917185010.3189199-6-mmyangfl@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260917185010.3189199-1-mmyangfl@gmail.com> References: <20260917185010.3189199-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" FIELD_PREP values cannot be used as case labels. Introduce enum for future use. Signed-off-by: David Yang --- drivers/net/dsa/motorcomm/chip.c | 62 ++++---------------------------- drivers/net/dsa/motorcomm/chip.h | 43 ++++++++++++++-------- 2 files changed, 34 insertions(+), 71 deletions(-) diff --git a/drivers/net/dsa/motorcomm/chip.c b/drivers/net/dsa/motorcomm/c= hip.c index 5049f4be8aa6..c99be2044fa2 100644 --- a/drivers/net/dsa/motorcomm/chip.c +++ b/drivers/net/dsa/motorcomm/chip.c @@ -3771,29 +3771,15 @@ yt921x_port_up(struct yt921x_priv *priv, int port, = unsigned int mode, { const struct yt921x_info *info =3D priv->info; struct yt921x_port *pp =3D &priv->ports[port]; + int ps =3D ethtool_speed_to_yt921x(speed); u32 mask; u32 ctrl; int res; =20 - switch (speed) { - case SPEED_10: - ctrl =3D YT921X_PORT_SPEED_10; - break; - case SPEED_100: - ctrl =3D YT921X_PORT_SPEED_100; - break; - case SPEED_1000: - ctrl =3D YT921X_PORT_SPEED_1000; - break; - case SPEED_2500: - ctrl =3D YT921X_PORT_SPEED_2500; - break; - case SPEED_10000: - ctrl =3D YT921X_PORT_SPEED_10000; - break; - default: + if (ps =3D=3D YT921X_SPEED_NUM) return -EINVAL; - } + + ctrl =3D YT921X_PORT_SPEED(ps); if (duplex =3D=3D DUPLEX_FULL) ctrl |=3D YT921X_PORT_DUPLEX_FULL; if (tx_pause) @@ -3810,25 +3796,7 @@ yt921x_port_up(struct yt921x_priv *priv, int port, u= nsigned int mode, =20 if (pp->serdes) { mask =3D YT921X_SERDES_SPEED_M; - switch (speed) { - case SPEED_10: - ctrl =3D YT921X_SERDES_SPEED_10; - break; - case SPEED_100: - ctrl =3D YT921X_SERDES_SPEED_100; - break; - case SPEED_1000: - ctrl =3D YT921X_SERDES_SPEED_1000; - break; - case SPEED_2500: - ctrl =3D YT921X_SERDES_SPEED_2500; - break; - case SPEED_10000: - ctrl =3D YT921X_SERDES_SPEED_10000; - break; - default: - return -EINVAL; - } + ctrl =3D YT921X_SERDES_SPEED(ps); mask |=3D YT921X_SERDES_DUPLEX_FULL; if (duplex =3D=3D DUPLEX_FULL) ctrl |=3D YT921X_SERDES_DUPLEX_FULL; @@ -3850,25 +3818,7 @@ yt921x_port_up(struct yt921x_priv *priv, int port, u= nsigned int mode, if (res) return res; =20 - switch (speed) { - case SPEED_10: - ctrl =3D YT921X_MDIO_POLLING_SPEED_10; - break; - case SPEED_100: - ctrl =3D YT921X_MDIO_POLLING_SPEED_100; - break; - case SPEED_1000: - ctrl =3D YT921X_MDIO_POLLING_SPEED_1000; - break; - case SPEED_2500: - ctrl =3D YT921X_MDIO_POLLING_SPEED_2500; - break; - case SPEED_10000: - ctrl =3D YT921X_MDIO_POLLING_SPEED_10000; - break; - default: - return -EINVAL; - } + ctrl =3D YT921X_MDIO_POLLING_SPEED(ps); if (duplex =3D=3D DUPLEX_FULL) ctrl |=3D YT921X_MDIO_POLLING_DUPLEX_FULL; ctrl |=3D YT921X_MDIO_POLLING_LINK; diff --git a/drivers/net/dsa/motorcomm/chip.h b/drivers/net/dsa/motorcomm/c= hip.h index 3fb0c6a69dd8..b3670f1e1427 100644 --- a/drivers/net/dsa/motorcomm/chip.h +++ b/drivers/net/dsa/motorcomm/chip.h @@ -89,11 +89,6 @@ #define YT921X_SERDES_DUPLEX_FULL BIT(3) #define YT921X_SERDES_SPEED_M GENMASK(2, 0) #define YT921X_SERDES_SPEED(x) FIELD_PREP(YT921X_SERDES_SPEED_M, (x)) -#define YT921X_SERDES_SPEED_10 YT921X_SERDES_SPEED(0) -#define YT921X_SERDES_SPEED_100 YT921X_SERDES_SPEED(1) -#define YT921X_SERDES_SPEED_1000 YT921X_SERDES_SPEED(2) -#define YT921X_SERDES_SPEED_10000 YT921X_SERDES_SPEED(3) -#define YT921X_SERDES_SPEED_2500 YT921X_SERDES_SPEED(4) #define YT921X_PORTn_CTRL(port) (0x80100 + 4 * (port)) /* Bit 7-0 shared= with PORT_STATUS */ #define YT921X_PORT_CTRL_PAUSE_AN BIT(10) #define YT921X_PORT_CTRL_LINK_AN BIT(9) @@ -107,11 +102,6 @@ #define YT921X_PORT_TX_MAC_EN BIT(3) #define YT921X_PORT_SPEED_M GENMASK(2, 0) #define YT921X_PORT_SPEED(x) FIELD_PREP(YT921X_PORT_SPEED_M, (x)) -#define YT921X_PORT_SPEED_10 YT921X_PORT_SPEED(0) -#define YT921X_PORT_SPEED_100 YT921X_PORT_SPEED(1) -#define YT921X_PORT_SPEED_1000 YT921X_PORT_SPEED(2) -#define YT921X_PORT_SPEED_10000 YT921X_PORT_SPEED(3) -#define YT921X_PORT_SPEED_2500 YT921X_PORT_SPEED(4) #define YT921X_PON_STRAP_FUNC 0x80320 #define YT921X_PON_STRAP_VAL 0x80324 #define YT921X_PON_STRAP_CAP 0x80328 @@ -122,11 +112,16 @@ #define YT921X_MDIO_POLLING_LINK BIT(3) #define YT921X_MDIO_POLLING_SPEED_M GENMASK(2, 0) #define YT921X_MDIO_POLLING_SPEED(x) FIELD_PREP(YT921X_MDIO_POLLING_SP= EED_M, (x)) -#define YT921X_MDIO_POLLING_SPEED_10 YT921X_MDIO_POLLING_SPEED(0) -#define YT921X_MDIO_POLLING_SPEED_100 YT921X_MDIO_POLLING_SPEED(1) -#define YT921X_MDIO_POLLING_SPEED_1000 YT921X_MDIO_POLLING_SPEED(2) -#define YT921X_MDIO_POLLING_SPEED_10000 YT921X_MDIO_POLLING_SPEED(3) -#define YT921X_MDIO_POLLING_SPEED_2500 YT921X_MDIO_POLLING_SPEED(4) + +enum yt921x_speed { + YT921X_SPEED_10, + YT921X_SPEED_100, + YT921X_SPEED_1000, + YT921X_SPEED_10000, + YT921X_SPEED_2500, + YT921X_SPEED_NUM +}; + #define YT921X_SENSOR 0x8036c #define YT921X_SENSOR_TEMP BIT(18) #define YT921X_TEMP 0x80374 @@ -1004,4 +999,22 @@ struct yt921x_priv { struct yt921x_acl_blk *acl_blks[YT921X_ACL_BLK_NUM]; }; =20 +static inline int ethtool_speed_to_yt921x(int speed) +{ + switch (speed) { + case SPEED_10: + return YT921X_SPEED_10; + case SPEED_100: + return YT921X_SPEED_100; + case SPEED_1000: + return YT921X_SPEED_1000; + case SPEED_2500: + return YT921X_SPEED_2500; + case SPEED_10000: + return YT921X_SPEED_10000; + default: + return YT921X_SPEED_NUM; + } +} + #endif --=20 2.53.0 From nobody Fri Sep 25 02:02:28 2026 Received: from mail-pj2-f12.google.com (mail-pj2-f12.google.com [74.125.227.140]) (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 469524CDDFF for ; Thu, 17 Sep 2026 18:52:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.227.140 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789671143; cv=none; b=mdoM2cfbOckZLDsSY2gvuW5qlcR4cGm+601fK6OfgEkgs68pTCWFR5tqX/bH7EGebcX+bdvfiOLOli845EBCQyakZEdmZbl32yiU0Ef2JqyO6j1h5ECRSO2gHNT2qPCUIGIgCxoEAV+gJdJ93fpSlEBQsxMFUiYirm9C5OpVKCM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789671143; c=relaxed/simple; bh=wa7JteC3r2unsWotGQCj8RSZpvy8xPFvd+PnrRKfCNI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=RPE8imoTXuZD25c3i1+ToW9R1D4pN1+tQAcoz7YwRH9oAjuUeDLn7PJUrs7bKCt5slH1/u9ZhXKA+VwJUyDKtl2AyQjxqmPC8/Xh44vMIuag1GaR8Pom6JS7zeKhlDzcBzzXYKQMLMvEx9juNk3ylSCS4+6xRpONUWa7aTwzYFs= 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=K9NZcpCR; arc=none smtp.client-ip=74.125.227.140 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="K9NZcpCR" Received: by mail-pj2-f12.google.com with SMTP id d9443c01a7336-2d747ed9866so10842765ad.2 for ; Thu, 17 Sep 2026 11:52:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1789671141; x=1790275941; 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=+Kri38BUKnkjofqEF/K1nnadfhRMk27GadV2uegZwdk=; b=K9NZcpCRdUc8qJM3IjtkgKDsT0iCpqHVaiIJ634sOtNvSGS9r6aQ6Fy2t12Af7e76z ABe51/HlHP8/mNRnKXmKDIkcTt95QBu1GlYxC48qbaVQbyHsCYDTHveotmy8YquM5qPJ pUk2CG7Ot7CHb58JCjtU+HAgkb8EGDSHIv9wQtu8k5EAH+1SO5Ekhg3BSxn8KrGXO8Rx //9enN/bOpB2IHah99qbZRcMybBYy9hiWZn9ZYOxLKBW61yw/pfkkgk08HQvfI2w+3SR Kvr9TRy1srLLlzRIKDBc6gk72VRKAItqjG/zVgw1QD2gbix+J14cSh0xCtv8jeNw9+Eg 0Rog== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789671141; x=1790275941; 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=+Kri38BUKnkjofqEF/K1nnadfhRMk27GadV2uegZwdk=; b=s9BWwzy9a/hND4NYfVD3075y9p/foa3sNDJUP2iIUcHWgVzFImjp/zCJiRo6HMNdRT IYar/nl071XQQye33rN/Ymw9O99d2AdDaFMh4CU96QKmaRHhsLoNqLYipZGeqI4ma4ln NJ5KwecsU5nPjMASL1cqCxN43qIzm4CU/eVEWd1z5KmApSss1fXjQCAjJdxXy4lOaWTz 68EQ7pbsso7OdiXd8RklgrUZfJ8WhPUi6LV4t2dJOpyrQEsBMsRNfZIiyzZebK5GoSUP pf5o/KEWrwXQAdOZQ3xHCZd3cxhEdOASNieLo3B7iTkoCzCdnwBIOB4Zy/cT2W9JpPRP Dsag== X-Forwarded-Encrypted: i=1; AKwUvByh+vZqnZMb3hs10BARuWtkftz9dV4YWIqZz1IXLhE8cyn3lFPAIm+JeCDkOQlU+Vr3qhGfhvDskVv8rx4=@vger.kernel.org X-Gm-Message-State: AFuF++mel4JZKsGT8C0emqBaI4crLlJERJxAhdAcypii6mLE5XSdNg95 turE5Laf7fBAy0gtCvPShPpq7DegESpIf1uVRnwbb+LkMEvlNxVMyh95 X-Gm-Gg: AYBFou3n0uw1XplIy/EUMF5ay0MwWqnzsBgk+1R9eMs+dTBcZd5PLN/RwS2VWg8PSKT R4NLamhhDd2qTOM5gMpo9E+JAKzy70gAafTjKEX0ElbiFODVhoYLfLKi3A4oDkaIBPUd7kBPF1W 5Lhte/QnUFZbB8OKkao+bo3NNhrirP7Fw9OW/6LoiZEXk2VHoIW8Twu1hO0r2xivhkX+/V/TjLJ XvHitViCGZcM8TNsn/MwTxfQvVPR0H0m25lrTzt16ufEJYUV1ICS81Kon2DwzpvwSBeJsyALa0Y rTuuXWc5N1WEVt38yJH75aVyMCJUku8xA0Z95JIcoCr8VorZchZmlLu6Wd4oBYcByZbbc4+jx3S y9zTWFoSzGePkigcHNME69iqNciiPkJ4czPRPC2doOOSMzwvJ+JLkUdb9Bkd/zRFx/5HAphAKER gtWjmuSJQj0nqvRwVv216j3k6Xfupc8F6bgT0mEzqeyKoo33Hj0wpQAyehilIsyRIy5QzR0YkKh Hz9jieyYoUUBvK1J73cE4WvYA== X-Received: by 2002:a17:902:ce07:b0:2da:f1b1:56c4 with SMTP id d9443c01a7336-2ddb1ab3254mr2717395ad.3.1789671141337; Thu, 17 Sep 2026 11:52:21 -0700 (PDT) Received: from d.home.yangfl.dn42 ([2a09:bac5:661a:1232::1d0:c5]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2dd89f331b7sm31032655ad.82.2026.09.17.11.52.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 17 Sep 2026 11:52:20 -0700 (PDT) From: David Yang To: netdev@vger.kernel.org Cc: David Yang , Andrew Lunn , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Russell King , linux-kernel@vger.kernel.org Subject: [PATCH net-next v3 6/8] net: dsa: motorcomm: Hoist port_to_priv helper into chip.h Date: Fri, 18 Sep 2026 02:49:53 +0800 Message-ID: <20260917185010.3189199-7-mmyangfl@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260917185010.3189199-1-mmyangfl@gmail.com> References: <20260917185010.3189199-1-mmyangfl@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" yt921x_poll_mib() open-codes the same container_of_const() expression that leds.c defines as to_yt921x_priv(). Move the macro to chip.h as yt921x_port_to_priv() so both files use one definition. Signed-off-by: David Yang Reviewed-by: Andrew Lunn --- drivers/net/dsa/motorcomm/chip.c | 3 +-- drivers/net/dsa/motorcomm/chip.h | 3 +++ drivers/net/dsa/motorcomm/leds.c | 14 ++++++-------- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/drivers/net/dsa/motorcomm/chip.c b/drivers/net/dsa/motorcomm/c= hip.c index c99be2044fa2..7b61cab55e2c 100644 --- a/drivers/net/dsa/motorcomm/chip.c +++ b/drivers/net/dsa/motorcomm/chip.c @@ -598,9 +598,8 @@ static void yt921x_poll_mib(struct work_struct *work) { struct yt921x_port *pp =3D container_of_const(work, struct yt921x_port, mib_read.work); - struct yt921x_priv *priv =3D (void *)(pp - pp->index) - - offsetof(struct yt921x_priv, ports); unsigned long delay =3D YT921X_STATS_INTERVAL_JIFFIES; + struct yt921x_priv *priv =3D yt921x_port_to_priv(pp); int port =3D pp->index; int res; =20 diff --git a/drivers/net/dsa/motorcomm/chip.h b/drivers/net/dsa/motorcomm/c= hip.h index b3670f1e1427..6652bb4304b7 100644 --- a/drivers/net/dsa/motorcomm/chip.h +++ b/drivers/net/dsa/motorcomm/chip.h @@ -999,6 +999,9 @@ struct yt921x_priv { struct yt921x_acl_blk *acl_blks[YT921X_ACL_BLK_NUM]; }; =20 +#define yt921x_port_to_priv(pp) \ + container_of_const((pp), struct yt921x_priv, ports[(pp)->index]) + static inline int ethtool_speed_to_yt921x(int speed) { switch (speed) { diff --git a/drivers/net/dsa/motorcomm/leds.c b/drivers/net/dsa/motorcomm/l= eds.c index 87a6b9cf6068..dd5b3684250d 100644 --- a/drivers/net/dsa/motorcomm/leds.c +++ b/drivers/net/dsa/motorcomm/leds.c @@ -12,8 +12,6 @@ #define to_yt921x_led(led_cdev) \ container_of_const((led_cdev), struct yt921x_led, cdev) #define to_yt921x_port(led) ((led)->port) -#define to_yt921x_priv(pp) \ - container_of_const((pp), struct yt921x_priv, ports[(pp)->index]) #define to_device(priv) ((priv)->ds.dev) =20 static u32 yt921x_led_regaddr(struct yt921x_priv *priv, int port, int grou= p) @@ -321,7 +319,7 @@ yt921x_cled_brightness_set_blocking(struct led_classdev= *led_cdev, { struct yt921x_led *led =3D to_yt921x_led(led_cdev); struct yt921x_port *pp =3D to_yt921x_port(led); - struct yt921x_priv *priv =3D to_yt921x_priv(pp); + struct yt921x_priv *priv =3D yt921x_port_to_priv(pp); int res; =20 mutex_lock(&priv->reg_lock); @@ -337,7 +335,7 @@ yt921x_cled_blink_set(struct led_classdev *led_cdev, un= signed long *delay_on, { struct yt921x_led *led =3D to_yt921x_led(led_cdev); struct yt921x_port *pp =3D to_yt921x_port(led); - struct yt921x_priv *priv =3D to_yt921x_priv(pp); + struct yt921x_priv *priv =3D yt921x_port_to_priv(pp); int res; =20 mutex_lock(&priv->reg_lock); @@ -353,7 +351,7 @@ yt921x_cled_hw_control_get_device(struct led_classdev *= led_cdev) { struct yt921x_led *led =3D to_yt921x_led(led_cdev); struct yt921x_port *pp =3D to_yt921x_port(led); - struct yt921x_priv *priv =3D to_yt921x_priv(pp); + struct yt921x_priv *priv =3D yt921x_port_to_priv(pp); struct dsa_port *dp; =20 dp =3D dsa_to_port(&priv->ds, pp->index); @@ -374,7 +372,7 @@ yt921x_cled_hw_control_is_supported(struct led_classdev= *led_cdev, { struct yt921x_led *led =3D to_yt921x_led(led_cdev); struct yt921x_port *pp =3D to_yt921x_port(led); - struct yt921x_priv *priv =3D to_yt921x_priv(pp); + struct yt921x_priv *priv =3D yt921x_port_to_priv(pp); =20 if (yt921x_led_trigger_is_supported(priv, pp->index, led->group, flags)) return 0; @@ -386,7 +384,7 @@ yt921x_cled_hw_control_get(struct led_classdev *led_cde= v, unsigned long *flagsp) { struct yt921x_led *led =3D to_yt921x_led(led_cdev); struct yt921x_port *pp =3D to_yt921x_port(led); - struct yt921x_priv *priv =3D to_yt921x_priv(pp); + struct yt921x_priv *priv =3D yt921x_port_to_priv(pp); int res; =20 mutex_lock(&priv->reg_lock); @@ -401,7 +399,7 @@ yt921x_cled_hw_control_set(struct led_classdev *led_cde= v, unsigned long flags) { struct yt921x_led *led =3D to_yt921x_led(led_cdev); struct yt921x_port *pp =3D to_yt921x_port(led); - struct yt921x_priv *priv =3D to_yt921x_priv(pp); + struct yt921x_priv *priv =3D yt921x_port_to_priv(pp); int res; =20 mutex_lock(&priv->reg_lock); --=20 2.53.0 From nobody Fri Sep 25 02:02:28 2026 Received: from mail-pj2-f43.google.com (mail-pj2-f43.google.com [74.125.227.171]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2DE2E4E324C for ; Thu, 17 Sep 2026 18:52:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.227.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789671147; cv=none; b=GFlNAYMDR0EONpgesqRVykHQXsw3kA/fUdUN4cClgCghDqzCK6ER38TRbnqPMzzIsDXaRnifRd/UaepkZUKolL+0sCcakyy0R2nfMJ89EzF1UFIiPddZOKwqi1S6PVHgp+JAJlgEIahMQqi01L0uveOEU017eywn+Nvb9Sjbj/s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789671147; c=relaxed/simple; bh=3K2ZIS8f+rhwpoiDFh0PMpB1FMbQ4qqvng5xOXzTKB4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=jxslONDJxQRrMo2eT3wgfYUX4LA7y9EvdVU9u88XtbajBX6x+QqzLFxwFyqz/PfCrF7J/EtIzf1+hZqgEVG87XpduDU0eElmUJiwxLS3BoigJu8lJc4DG0z9YlEiBJWnLqd2KtWdj9z0cTM7EDH2peJyj+2WV9hKoiHPd/bgbbU= 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=bfTMM6Gk; arc=none smtp.client-ip=74.125.227.171 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="bfTMM6Gk" Received: by mail-pj2-f43.google.com with SMTP id d9443c01a7336-2d747ee1f38so12303095ad.2 for ; Thu, 17 Sep 2026 11:52:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1789671144; x=1790275944; 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=fdWhhNtszMEmt8ITPevkH5iiNt1jxAGJIs212sri5Ao=; b=bfTMM6GkR00P5JXmdgW+cVM5WYqB4UgnJZwDd8vpV1mVSBR3+nRDYU++VkTVn3cXI6 RKhuzfSYz5vsOcORnOBxR08fH+l94Hy7fWUblj3fnI2qPswdZ+suw4XirWhOt8MV39ba wj5SH84x9H0b4Bjiz4WIUVElv8/Y47CooTDRaeGX4my3FVgASlTG8NPpDdfv5cOoWtgm Thp4I9ptIcyMXLE3EwoysoVJi5wIRJ67KZd3z3dDcBMVvBeavG3OeBfR5W7OBHmne59O OzB4zlOreh/sDmj5CNjCetbbnRVm4Ye3nW14rg53lavxC9CHpKJGTacY5XHwgLbyS9ir iTuA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789671144; x=1790275944; 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=fdWhhNtszMEmt8ITPevkH5iiNt1jxAGJIs212sri5Ao=; b=cLzPSQXh4GOTDfXbxNOmbTradJr7lyqfd36WsHSkb8bR8lNZqH1PxD4CJOGJj6RCdr p3kHC27OmsxLCM9DErz4qnyS+nBOEV+IZYEWzzJOWHPix7b5QRwtkQWauO0f0DVRSekt 1txs8O9oDPaz8IynqR/uwp1FMefipPLV0sCwpFxTH3/KI4jll1+r2os/PPx7BmmzaaQc cx7XPSRMFTFypJ2H2bErCGvhrXJBRWpq/R6UxBxoW15miSUXA1tkapLhaQ59p6wiPkLW y7ytAKvcoPhrLbO08v4hSsb3aAqNr5thwFbeJzpHBSvZba7YVDnwKwzfhpHTXuzNqUDt FHAA== X-Forwarded-Encrypted: i=1; AKwUvBy3YcUfMpmwrngFe17/BqmpbH/lD4KRsN2Cf8Y8PMhyhhoWYGwa0pyEetx9byUtDKZZsQa0GUJknVnq9Os=@vger.kernel.org X-Gm-Message-State: AFuF++kDC5fJdQ+q4kZqY+ElhT2qSiib9MXrrVq2JNj2jeZkryykDjp6 p1vV0SuZ6gQZuGfWBPba1tozmug/6kKgfPu3EKNYfGv3DZ1tuQP+yRyI X-Gm-Gg: AYBFou2IukA+fspMwPIjha7mLqXGhwACI3I+qmHhs8aqttMOsyLVZ7Wqw2GJGZQjZrB 2WoyrAtIgSsQB05JhdWoMjIDehYFJTFFzXPUqyGRTmRcNCeVC4dRPppkhNXiiYKiUmsDg6xRVxj aOv8gvoxTZ0EzAFe3o/x8VI571HJcS+Bm4nQ+4+QzIvI+kIRZjGa0GEuLxj4olnFmi7RzsKw86Q rrt7iajnWBl72Kms8hvMABWlNBoy8wfZp6fsTsT8dYEdDNmPUAgg1qMo8NOx2dJhv4FjezwvzsM hL0a5Xz8QB8kaHgm+7fZNCCcOrypkIlqXHO7Nk58T8ObARu/IZDtS8dTCOVxsLHzJZYUC/sLw6U zJIplcy/+STpGAGLETmVb06h2ocEaSvAVfFvyRlKsrtJByhF5N9Tj4LfuO3JbwZ72attUDbkAr4 7TSV50UW5Y3eleOphJ8UvDAn8iRMY5gJGhgAoJr3zWBPmCzixAzyw4lS+RQrOJp/zvpxeSxFtnz gzRn/dufMiKysCyrhmc9R51xw== X-Received: by 2002:a17:902:c94c:b0:2d8:d4cc:be64 with SMTP id d9443c01a7336-2ddb1c196e8mr1602265ad.17.1789671144464; Thu, 17 Sep 2026 11:52:24 -0700 (PDT) Received: from d.home.yangfl.dn42 ([2a09:bac5:661a:1232::1d0:c5]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2dd89f331b7sm31032655ad.82.2026.09.17.11.52.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 17 Sep 2026 11:52:23 -0700 (PDT) From: David Yang To: netdev@vger.kernel.org Cc: David Yang , Andrew Lunn , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Russell King , linux-kernel@vger.kernel.org Subject: [PATCH net-next v3 7/8] net: dsa: motorcomm: Split MDIO bus module Date: Fri, 18 Sep 2026 02:49:54 +0800 Message-ID: <20260917185010.3189199-8-mmyangfl@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260917185010.3189199-1-mmyangfl@gmail.com> References: <20260917185010.3189199-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" Split it in order to be used in other modules. Signed-off-by: David Yang Reviewed-by: Andrew Lunn --- drivers/net/dsa/motorcomm/Makefile | 1 + drivers/net/dsa/motorcomm/chip.c | 269 +------------------------- drivers/net/dsa/motorcomm/chip.h | 21 -- drivers/net/dsa/motorcomm/mdio_bus.c | 278 +++++++++++++++++++++++++++ drivers/net/dsa/motorcomm/mdio_bus.h | 39 ++++ 5 files changed, 319 insertions(+), 289 deletions(-) create mode 100644 drivers/net/dsa/motorcomm/mdio_bus.c create mode 100644 drivers/net/dsa/motorcomm/mdio_bus.h diff --git a/drivers/net/dsa/motorcomm/Makefile b/drivers/net/dsa/motorcomm= /Makefile index aeb12cb91f93..f7cce7eabbb8 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 mdio_bus.o yt921x-objs +=3D smi.o diff --git a/drivers/net/dsa/motorcomm/chip.c b/drivers/net/dsa/motorcomm/c= hip.c index 7b61cab55e2c..491ba1edfa3c 100644 --- a/drivers/net/dsa/motorcomm/chip.c +++ b/drivers/net/dsa/motorcomm/chip.c @@ -27,6 +27,7 @@ =20 #include "chip.h" #include "leds.h" +#include "mdio_bus.h" #include "smi.h" =20 struct yt921x_mib_desc { @@ -266,274 +267,6 @@ static const struct yt921x_reg_ops yt921x_reg_ops_mdi= o =3D { =20 /* TODO: SPI/I2C */ =20 -static int yt921x_intif_wait(struct yt921x_priv *priv) -{ - u32 val =3D 0; - - return yt921x_reg_wait(priv, YT921X_INT_MBUS_OP, YT921X_MBUS_OP_START, - &val); -} - -static int -yt921x_intif_read(struct yt921x_priv *priv, int port, int reg, u16 *valp) -{ - struct device *dev =3D to_device(priv); - u32 mask; - u32 ctrl; - u32 val; - int res; - - res =3D yt921x_intif_wait(priv); - if (res) - return res; - - mask =3D YT921X_MBUS_CTRL_PORT_M | YT921X_MBUS_CTRL_REG_M | - YT921X_MBUS_CTRL_OP_M; - ctrl =3D YT921X_MBUS_CTRL_PORT(port) | YT921X_MBUS_CTRL_REG(reg) | - YT921X_MBUS_CTRL_READ; - res =3D yt921x_reg_update_bits(priv, YT921X_INT_MBUS_CTRL, mask, ctrl); - if (res) - return res; - res =3D yt921x_reg_write(priv, YT921X_INT_MBUS_OP, YT921X_MBUS_OP_START); - if (res) - return res; - - res =3D yt921x_intif_wait(priv); - if (res) - return res; - res =3D yt921x_reg_read(priv, YT921X_INT_MBUS_DIN, &val); - if (res) - return res; - - if ((u16)val !=3D val) - dev_info(dev, - "%s: port %d, reg 0x%x: Expected u16, got 0x%08x\n", - __func__, port, reg, val); - *valp =3D (u16)val; - return 0; -} - -static int -yt921x_intif_write(struct yt921x_priv *priv, int port, int reg, u16 val) -{ - u32 mask; - u32 ctrl; - int res; - - res =3D yt921x_intif_wait(priv); - if (res) - return res; - - mask =3D YT921X_MBUS_CTRL_PORT_M | YT921X_MBUS_CTRL_REG_M | - YT921X_MBUS_CTRL_OP_M; - ctrl =3D YT921X_MBUS_CTRL_PORT(port) | YT921X_MBUS_CTRL_REG(reg) | - YT921X_MBUS_CTRL_WRITE; - res =3D yt921x_reg_update_bits(priv, YT921X_INT_MBUS_CTRL, mask, ctrl); - if (res) - return res; - res =3D yt921x_reg_write(priv, YT921X_INT_MBUS_DOUT, val); - if (res) - return res; - res =3D yt921x_reg_write(priv, YT921X_INT_MBUS_OP, YT921X_MBUS_OP_START); - if (res) - return res; - - return yt921x_intif_wait(priv); -} - -static int yt921x_mbus_int_read(struct mii_bus *mbus, int port, int reg) -{ - struct yt921x_priv *priv =3D mbus->priv; - u16 val; - int res; - - if (port >=3D YT921X_PORT_NUM) - return U16_MAX; - - mutex_lock(&priv->reg_lock); - res =3D yt921x_intif_read(priv, port, reg, &val); - mutex_unlock(&priv->reg_lock); - - if (res) - return res; - return val; -} - -static int -yt921x_mbus_int_write(struct mii_bus *mbus, int port, int reg, u16 data) -{ - struct yt921x_priv *priv =3D mbus->priv; - int res; - - if (port >=3D YT921X_PORT_NUM) - return -ENODEV; - - mutex_lock(&priv->reg_lock); - res =3D yt921x_intif_write(priv, port, reg, data); - mutex_unlock(&priv->reg_lock); - - return res; -} - -static int -yt921x_mbus_int_init(struct yt921x_priv *priv, struct device_node *mnp) -{ - struct device *dev =3D to_device(priv); - struct mii_bus *mbus; - int res; - - mbus =3D devm_mdiobus_alloc(dev); - if (!mbus) - return -ENOMEM; - - mbus->name =3D "YT921x internal MDIO bus"; - snprintf(mbus->id, MII_BUS_ID_SIZE, "%s", dev_name(dev)); - mbus->priv =3D priv; - mbus->read =3D yt921x_mbus_int_read; - mbus->write =3D yt921x_mbus_int_write; - mbus->parent =3D dev; - mbus->phy_mask =3D (u32)~GENMASK(YT921X_PORT_NUM - 1, 0); - - res =3D devm_of_mdiobus_register(dev, mbus, mnp); - if (res) - return res; - - priv->mbus_int =3D mbus; - - return 0; -} - -static int yt921x_extif_wait(struct yt921x_priv *priv) -{ - u32 val =3D 0; - - return yt921x_reg_wait(priv, YT921X_EXT_MBUS_OP, YT921X_MBUS_OP_START, - &val); -} - -static int -yt921x_extif_read(struct yt921x_priv *priv, int port, int reg, u16 *valp) -{ - struct device *dev =3D to_device(priv); - u32 mask; - u32 ctrl; - u32 val; - int res; - - res =3D yt921x_extif_wait(priv); - if (res) - return res; - - mask =3D YT921X_MBUS_CTRL_PORT_M | YT921X_MBUS_CTRL_REG_M | - YT921X_MBUS_CTRL_TYPE_M | YT921X_MBUS_CTRL_OP_M; - ctrl =3D YT921X_MBUS_CTRL_PORT(port) | YT921X_MBUS_CTRL_REG(reg) | - YT921X_MBUS_CTRL_TYPE_C22 | YT921X_MBUS_CTRL_READ; - res =3D yt921x_reg_update_bits(priv, YT921X_EXT_MBUS_CTRL, mask, ctrl); - if (res) - return res; - res =3D yt921x_reg_write(priv, YT921X_EXT_MBUS_OP, YT921X_MBUS_OP_START); - if (res) - return res; - - res =3D yt921x_extif_wait(priv); - if (res) - return res; - res =3D yt921x_reg_read(priv, YT921X_EXT_MBUS_DIN, &val); - if (res) - return res; - - if ((u16)val !=3D val) - dev_info(dev, - "%s: port %d, reg 0x%x: Expected u16, got 0x%08x\n", - __func__, port, reg, val); - *valp =3D (u16)val; - return 0; -} - -static int -yt921x_extif_write(struct yt921x_priv *priv, int port, int reg, u16 val) -{ - u32 mask; - u32 ctrl; - int res; - - res =3D yt921x_extif_wait(priv); - if (res) - return res; - - mask =3D YT921X_MBUS_CTRL_PORT_M | YT921X_MBUS_CTRL_REG_M | - YT921X_MBUS_CTRL_TYPE_M | YT921X_MBUS_CTRL_OP_M; - ctrl =3D YT921X_MBUS_CTRL_PORT(port) | YT921X_MBUS_CTRL_REG(reg) | - YT921X_MBUS_CTRL_TYPE_C22 | YT921X_MBUS_CTRL_WRITE; - res =3D yt921x_reg_update_bits(priv, YT921X_EXT_MBUS_CTRL, mask, ctrl); - if (res) - return res; - res =3D yt921x_reg_write(priv, YT921X_EXT_MBUS_DOUT, val); - if (res) - return res; - res =3D yt921x_reg_write(priv, YT921X_EXT_MBUS_OP, YT921X_MBUS_OP_START); - if (res) - return res; - - return yt921x_extif_wait(priv); -} - -static int yt921x_mbus_ext_read(struct mii_bus *mbus, int port, int reg) -{ - struct yt921x_priv *priv =3D mbus->priv; - u16 val; - int res; - - mutex_lock(&priv->reg_lock); - res =3D yt921x_extif_read(priv, port, reg, &val); - mutex_unlock(&priv->reg_lock); - - if (res) - return res; - return val; -} - -static int -yt921x_mbus_ext_write(struct mii_bus *mbus, int port, int reg, u16 data) -{ - struct yt921x_priv *priv =3D mbus->priv; - int res; - - mutex_lock(&priv->reg_lock); - res =3D yt921x_extif_write(priv, port, reg, data); - mutex_unlock(&priv->reg_lock); - - return res; -} - -static int -yt921x_mbus_ext_init(struct yt921x_priv *priv, struct device_node *mnp) -{ - struct device *dev =3D to_device(priv); - struct mii_bus *mbus; - int res; - - mbus =3D devm_mdiobus_alloc(dev); - if (!mbus) - return -ENOMEM; - - mbus->name =3D "YT921x external MDIO bus"; - snprintf(mbus->id, MII_BUS_ID_SIZE, "%s@ext", dev_name(dev)); - mbus->priv =3D priv; - /* TODO: c45? */ - mbus->read =3D yt921x_mbus_ext_read; - mbus->write =3D yt921x_mbus_ext_write; - mbus->parent =3D dev; - - res =3D devm_of_mdiobus_register(dev, mbus, mnp); - if (res) - return res; - - priv->mbus_ext =3D mbus; - - return 0; -} - /* 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) { diff --git a/drivers/net/dsa/motorcomm/chip.h b/drivers/net/dsa/motorcomm/c= hip.h index 6652bb4304b7..c1b5f29eb0fa 100644 --- a/drivers/net/dsa/motorcomm/chip.h +++ b/drivers/net/dsa/motorcomm/chip.h @@ -243,27 +243,6 @@ enum yt921x_speed { #define YT9218_SYS_CLK_167M 0 #define YT921X_SYS_CLK_143M 1 =20 -#define YT921X_EXT_MBUS_OP 0x6a000 -#define YT921X_INT_MBUS_OP 0xf0000 -#define YT921X_MBUS_OP_START BIT(0) -#define YT921X_EXT_MBUS_CTRL 0x6a004 -#define YT921X_INT_MBUS_CTRL 0xf0004 -#define YT921X_MBUS_CTRL_PORT_M GENMASK(25, 21) -#define YT921X_MBUS_CTRL_PORT(x) FIELD_PREP(YT921X_MBUS_CTRL_PORT_M, (= x)) -#define YT921X_MBUS_CTRL_REG_M GENMASK(20, 16) -#define YT921X_MBUS_CTRL_REG(x) FIELD_PREP(YT921X_MBUS_CTRL_REG_M, (x)) -#define YT921X_MBUS_CTRL_TYPE_M GENMASK(11, 8) /* wild guess */ -#define YT921X_MBUS_CTRL_TYPE(x) FIELD_PREP(YT921X_MBUS_CTRL_TYPE_M, (= x)) -#define YT921X_MBUS_CTRL_TYPE_C22 YT921X_MBUS_CTRL_TYPE(4) -#define YT921X_MBUS_CTRL_OP_M GENMASK(3, 2) /* wild guess */ -#define YT921X_MBUS_CTRL_OP(x) FIELD_PREP(YT921X_MBUS_CTRL_OP_M, (x)) -#define YT921X_MBUS_CTRL_WRITE YT921X_MBUS_CTRL_OP(1) -#define YT921X_MBUS_CTRL_READ YT921X_MBUS_CTRL_OP(2) -#define YT921X_EXT_MBUS_DOUT 0x6a008 -#define YT921X_INT_MBUS_DOUT 0xf0008 -#define YT921X_EXT_MBUS_DIN 0x6a00c -#define YT921X_INT_MBUS_DIN 0xf000c - #define YT921X_PORTn_EGR(port) (0x100000 + 4 * (port)) #define YT921X_PORT_EGR_TPID_CTAG_M GENMASK(5, 4) #define YT921X_PORT_EGR_TPID_CTAG(x) FIELD_PREP(YT921X_PORT_EGR_TPID_C= TAG_M, (x)) diff --git a/drivers/net/dsa/motorcomm/mdio_bus.c b/drivers/net/dsa/motorco= mm/mdio_bus.c new file mode 100644 index 000000000000..ba70343f3f33 --- /dev/null +++ b/drivers/net/dsa/motorcomm/mdio_bus.c @@ -0,0 +1,278 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Copyright (c) 2026 David Yang + */ + +#include + +#include "chip.h" +#include "mdio_bus.h" +#include "smi.h" + +#define to_device(priv) ((priv)->ds.dev) + +static int yt921x_intif_wait(struct yt921x_priv *priv) +{ + u32 val =3D 0; + + return yt921x_reg_wait(priv, YT921X_INT_MBUS_OP, YT921X_MBUS_OP_START, + &val); +} + +static int +yt921x_intif_read(struct yt921x_priv *priv, int port, int reg, u16 *valp) +{ + struct device *dev =3D to_device(priv); + u32 mask; + u32 ctrl; + u32 val; + int res; + + res =3D yt921x_intif_wait(priv); + if (res) + return res; + + mask =3D YT921X_MBUS_CTRL_PORT_M | YT921X_MBUS_CTRL_REG_M | + YT921X_MBUS_CTRL_OP_M; + ctrl =3D YT921X_MBUS_CTRL_PORT(port) | YT921X_MBUS_CTRL_REG(reg) | + YT921X_MBUS_CTRL_READ; + res =3D yt921x_reg_update_bits(priv, YT921X_INT_MBUS_CTRL, mask, ctrl); + if (res) + return res; + res =3D yt921x_reg_write(priv, YT921X_INT_MBUS_OP, YT921X_MBUS_OP_START); + if (res) + return res; + + res =3D yt921x_intif_wait(priv); + if (res) + return res; + res =3D yt921x_reg_read(priv, YT921X_INT_MBUS_DIN, &val); + if (res) + return res; + + if ((u16)val !=3D val) + dev_info(dev, + "%s: port %d, reg 0x%x: Expected u16, got 0x%08x\n", + __func__, port, reg, val); + *valp =3D (u16)val; + return 0; +} + +static int +yt921x_intif_write(struct yt921x_priv *priv, int port, int reg, u16 val) +{ + u32 mask; + u32 ctrl; + int res; + + res =3D yt921x_intif_wait(priv); + if (res) + return res; + + mask =3D YT921X_MBUS_CTRL_PORT_M | YT921X_MBUS_CTRL_REG_M | + YT921X_MBUS_CTRL_OP_M; + ctrl =3D YT921X_MBUS_CTRL_PORT(port) | YT921X_MBUS_CTRL_REG(reg) | + YT921X_MBUS_CTRL_WRITE; + res =3D yt921x_reg_update_bits(priv, YT921X_INT_MBUS_CTRL, mask, ctrl); + if (res) + return res; + res =3D yt921x_reg_write(priv, YT921X_INT_MBUS_DOUT, val); + if (res) + return res; + res =3D yt921x_reg_write(priv, YT921X_INT_MBUS_OP, YT921X_MBUS_OP_START); + if (res) + return res; + + return yt921x_intif_wait(priv); +} + +static int yt921x_mbus_int_read(struct mii_bus *mbus, int port, int reg) +{ + struct yt921x_priv *priv =3D mbus->priv; + u16 val; + int res; + + if (port >=3D YT921X_PORT_NUM) + return U16_MAX; + + mutex_lock(&priv->reg_lock); + res =3D yt921x_intif_read(priv, port, reg, &val); + mutex_unlock(&priv->reg_lock); + + if (res) + return res; + return val; +} + +static int +yt921x_mbus_int_write(struct mii_bus *mbus, int port, int reg, u16 data) +{ + struct yt921x_priv *priv =3D mbus->priv; + int res; + + if (port >=3D YT921X_PORT_NUM) + return -ENODEV; + + mutex_lock(&priv->reg_lock); + res =3D yt921x_intif_write(priv, port, reg, data); + mutex_unlock(&priv->reg_lock); + + return res; +} + +int yt921x_mbus_int_init(struct yt921x_priv *priv, struct device_node *mnp) +{ + struct device *dev =3D to_device(priv); + struct mii_bus *mbus; + int res; + + mbus =3D devm_mdiobus_alloc(dev); + if (!mbus) + return -ENOMEM; + + mbus->name =3D "YT921x internal MDIO bus"; + snprintf(mbus->id, MII_BUS_ID_SIZE, "%s", dev_name(dev)); + mbus->priv =3D priv; + mbus->read =3D yt921x_mbus_int_read; + mbus->write =3D yt921x_mbus_int_write; + mbus->parent =3D dev; + mbus->phy_mask =3D (u32)~GENMASK(YT921X_PORT_NUM - 1, 0); + + res =3D devm_of_mdiobus_register(dev, mbus, mnp); + if (res) + return res; + + priv->mbus_int =3D mbus; + + return 0; +} + +static int yt921x_extif_wait(struct yt921x_priv *priv) +{ + u32 val =3D 0; + + return yt921x_reg_wait(priv, YT921X_EXT_MBUS_OP, YT921X_MBUS_OP_START, + &val); +} + +static int +yt921x_extif_read(struct yt921x_priv *priv, int port, int reg, u16 *valp) +{ + struct device *dev =3D to_device(priv); + u32 mask; + u32 ctrl; + u32 val; + int res; + + res =3D yt921x_extif_wait(priv); + if (res) + return res; + + mask =3D YT921X_MBUS_CTRL_PORT_M | YT921X_MBUS_CTRL_REG_M | + YT921X_MBUS_CTRL_TYPE_M | YT921X_MBUS_CTRL_OP_M; + ctrl =3D YT921X_MBUS_CTRL_PORT(port) | YT921X_MBUS_CTRL_REG(reg) | + YT921X_MBUS_CTRL_TYPE_C22 | YT921X_MBUS_CTRL_READ; + res =3D yt921x_reg_update_bits(priv, YT921X_EXT_MBUS_CTRL, mask, ctrl); + if (res) + return res; + res =3D yt921x_reg_write(priv, YT921X_EXT_MBUS_OP, YT921X_MBUS_OP_START); + if (res) + return res; + + res =3D yt921x_extif_wait(priv); + if (res) + return res; + res =3D yt921x_reg_read(priv, YT921X_EXT_MBUS_DIN, &val); + if (res) + return res; + + if ((u16)val !=3D val) + dev_info(dev, + "%s: port %d, reg 0x%x: Expected u16, got 0x%08x\n", + __func__, port, reg, val); + *valp =3D (u16)val; + return 0; +} + +static int +yt921x_extif_write(struct yt921x_priv *priv, int port, int reg, u16 val) +{ + u32 mask; + u32 ctrl; + int res; + + res =3D yt921x_extif_wait(priv); + if (res) + return res; + + mask =3D YT921X_MBUS_CTRL_PORT_M | YT921X_MBUS_CTRL_REG_M | + YT921X_MBUS_CTRL_TYPE_M | YT921X_MBUS_CTRL_OP_M; + ctrl =3D YT921X_MBUS_CTRL_PORT(port) | YT921X_MBUS_CTRL_REG(reg) | + YT921X_MBUS_CTRL_TYPE_C22 | YT921X_MBUS_CTRL_WRITE; + res =3D yt921x_reg_update_bits(priv, YT921X_EXT_MBUS_CTRL, mask, ctrl); + if (res) + return res; + res =3D yt921x_reg_write(priv, YT921X_EXT_MBUS_DOUT, val); + if (res) + return res; + res =3D yt921x_reg_write(priv, YT921X_EXT_MBUS_OP, YT921X_MBUS_OP_START); + if (res) + return res; + + return yt921x_extif_wait(priv); +} + +static int yt921x_mbus_ext_read(struct mii_bus *mbus, int port, int reg) +{ + struct yt921x_priv *priv =3D mbus->priv; + u16 val; + int res; + + mutex_lock(&priv->reg_lock); + res =3D yt921x_extif_read(priv, port, reg, &val); + mutex_unlock(&priv->reg_lock); + + if (res) + return res; + return val; +} + +static int +yt921x_mbus_ext_write(struct mii_bus *mbus, int port, int reg, u16 data) +{ + struct yt921x_priv *priv =3D mbus->priv; + int res; + + mutex_lock(&priv->reg_lock); + res =3D yt921x_extif_write(priv, port, reg, data); + mutex_unlock(&priv->reg_lock); + + return res; +} + +int yt921x_mbus_ext_init(struct yt921x_priv *priv, struct device_node *mnp) +{ + struct device *dev =3D to_device(priv); + struct mii_bus *mbus; + int res; + + mbus =3D devm_mdiobus_alloc(dev); + if (!mbus) + return -ENOMEM; + + mbus->name =3D "YT921x external MDIO bus"; + snprintf(mbus->id, MII_BUS_ID_SIZE, "%s@ext", dev_name(dev)); + mbus->priv =3D priv; + /* TODO: c45? */ + mbus->read =3D yt921x_mbus_ext_read; + mbus->write =3D yt921x_mbus_ext_write; + mbus->parent =3D dev; + + res =3D devm_of_mdiobus_register(dev, mbus, mnp); + if (res) + return res; + + priv->mbus_ext =3D mbus; + + return 0; +} diff --git a/drivers/net/dsa/motorcomm/mdio_bus.h b/drivers/net/dsa/motorco= mm/mdio_bus.h new file mode 100644 index 000000000000..ae5792b8da24 --- /dev/null +++ b/drivers/net/dsa/motorcomm/mdio_bus.h @@ -0,0 +1,39 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Copyright (c) 2026 David Yang + */ + +#ifndef _YT_MDIO_BUS_H +#define _YT_MDIO_BUS_H + +#include +#include +#include + +#define YT921X_EXT_MBUS_OP 0x6a000 +#define YT921X_INT_MBUS_OP 0xf0000 +#define YT921X_MBUS_OP_START BIT(0) +#define YT921X_EXT_MBUS_CTRL 0x6a004 +#define YT921X_INT_MBUS_CTRL 0xf0004 +#define YT921X_MBUS_CTRL_PORT_M GENMASK(25, 21) +#define YT921X_MBUS_CTRL_PORT(x) FIELD_PREP(YT921X_MBUS_CTRL_PORT_M, (= x)) +#define YT921X_MBUS_CTRL_REG_M GENMASK(20, 16) +#define YT921X_MBUS_CTRL_REG(x) FIELD_PREP(YT921X_MBUS_CTRL_REG_M, (x)) +#define YT921X_MBUS_CTRL_TYPE_M GENMASK(11, 8) /* wild guess */ +#define YT921X_MBUS_CTRL_TYPE(x) FIELD_PREP(YT921X_MBUS_CTRL_TYPE_M, (= x)) +#define YT921X_MBUS_CTRL_TYPE_C22 YT921X_MBUS_CTRL_TYPE(4) +#define YT921X_MBUS_CTRL_OP_M GENMASK(3, 2) /* wild guess */ +#define YT921X_MBUS_CTRL_OP(x) FIELD_PREP(YT921X_MBUS_CTRL_OP_M, (x)) +#define YT921X_MBUS_CTRL_WRITE YT921X_MBUS_CTRL_OP(1) +#define YT921X_MBUS_CTRL_READ YT921X_MBUS_CTRL_OP(2) +#define YT921X_EXT_MBUS_DOUT 0x6a008 +#define YT921X_INT_MBUS_DOUT 0xf0008 +#define YT921X_EXT_MBUS_DIN 0x6a00c +#define YT921X_INT_MBUS_DIN 0xf000c + +struct yt921x_priv; + +int yt921x_mbus_int_init(struct yt921x_priv *priv, struct device_node *mnp= ); +int yt921x_mbus_ext_init(struct yt921x_priv *priv, struct device_node *mnp= ); + +#endif --=20 2.53.0 From nobody Fri Sep 25 02:02:28 2026 Received: from mail-pj2-f38.google.com (mail-pj2-f38.google.com [74.125.227.166]) (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 78A464E4C27 for ; Thu, 17 Sep 2026 18:52:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.227.166 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789671152; cv=none; b=SxrRNykhwmnZQRAYwQaOBL18XGuw0qQDIKgrP2KV670igG/TSxx0fGGPWdY1UcTrhiTs4jvSAofWOpj8Jncj2xglr9z1mJ0dlatk7QV1FxSfRqL2wb6AT37mvdKFEuMTNaDAc4jPapXb6N/qaqDzzc8FN03vXhpHEUv35wbhZwg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789671152; c=relaxed/simple; bh=1hlNjyF8SXq8T2VEhZOinsSQXTDMM3SEtYXYjTKDS3g=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=pymRsjOKRUQmBsm68fwHxQJh90Wh0JXhuDiH1YI9BAmddqQO+vQ8/1DvuOdbumYDx+05B4kHita7dJsKb3jQb76baQT5Jvx1i9gL8AMFN/reGZf3fCn3Sl2sPfjNfL6yon2WP7sKL4+djnEFiyGTTK1N0vaRwb6w+/nRy01XLvY= 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=cPfte0Nu; arc=none smtp.client-ip=74.125.227.166 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="cPfte0Nu" Received: by mail-pj2-f38.google.com with SMTP id d9443c01a7336-2d747ec6185so8308355ad.0 for ; Thu, 17 Sep 2026 11:52:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1789671148; x=1790275948; 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=Dv3ZuFRjU/rlwi5dKwkijyUjNb5XS0/4Nz5RmIwxYkk=; b=cPfte0Nu1L9SW6fwt/kf3OQd+qx28HGMZ6eZmbdBoXYGMZyng0l9y2I6Nf01jE54Ld vWPKgaT4O0BI2c13D8Ae/P71fNlA1ZDRFgnliwYjk5iDBsr+hXjMWWDmU0yYordD0oK8 wcTkNUGxOfvyb2+ilGQgyRzOZtnd78CiyoO1Jm0pcMYSzcJ015J55Qes3onMMHtiByLu La/mRP5ZIRka/0blRIVcAiUY4d0EpZwY0xUDNKGiZJKVH5yi3+1r7+w45rxDws8LTck7 xkqwpcaMVqDMASZ+qplwqn6h6wQWsEs2GtHrR9ln7dmeS4+uOlOXks4SgEMtND4xklJK vJCg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789671148; x=1790275948; 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=Dv3ZuFRjU/rlwi5dKwkijyUjNb5XS0/4Nz5RmIwxYkk=; b=cejST5KjJXVImXfQNRMzG6M+35C8IcxIQlKoNl1/fo9lZ5h9eePKRpeGpenY+1le/0 u/JNGmLMMa7u3KHFPC2H2HwRibhhA7Z1W/vT6cervEcbWv5ouw7WUK3IbUuT1pKCUk7k NYge6z/LGM9FySITzWnarb3OuFFoN5wvQYybo/wRB/7YMQenw00mfTDAXeHw1Lvi4TUL FIY5B1VZJ/BR0XChHD5CoHIlg1jGBXMV/qd+hJl92eRoHWABpddRjuMDJ5f5kqKTA+OF 7jm/TL8DX11GozAc3UHfIWjfnUJ/juAjExfuaZ5cAz1NFyYUJFriCZcP3eG2ET1OFnPO wu1g== X-Forwarded-Encrypted: i=1; AKwUvBwIHaxwmBo0Dfzrk4+5K6tGayrc70T/n3t+XygUGcQDz/sFoS17i7YfobseokZ432uYzeSjKqZ6yWeCi0s=@vger.kernel.org X-Gm-Message-State: AFuF++nGZcKUOHMQt8iW8E6vnIY1zk/T1ikkcp6V8VxmT1S83mcU6FIJ Ei1Bbo3o0aGdNDAsRrCEpHjpFNF25S8Oj2ayNzIQyLr1yWB2Ql1KgAJZ X-Gm-Gg: AYBFou0LEKS9dlqbsIlP+uycIUh3TI7gMRck5DHk+ZpGZo7jaEtmceZD55WiwbKow4j QqJEupbDcaAlfxBzEsCYAsGSPlPLcvEyGfWXiLhuTbDY8DIGI5FLBbMvkeHhc0QTzIiCMo1nkz8 8uT340xngXAzECXMAcaY2F4MC5+niYSVsxfClDq5LySebFgoyA9zY3lWVwr7SglXtORQy5TDP8N KGdeBkKFU7JT5ErG8j/tIiUICdjzwRy0CI8EgcUMlp/SXZhKEyj3zBC4qF+NFN9+DJ7AuplGYLI 6pm98yAo4EUpxe9FGPSsoBNx/XuUS/Vsku2E89FBKtTZnlZphTU8B81Ec7a8DPap5cTn7QWOy1m ozFzNuiVpxcolYX4LRQ9b1Bi21MHOi49wKgH6fbkQ5IdEL3drFlU+2UOVqvfcVcx3XwVNc4wT7B Hlmp8dOfb8jnnfSKic8tGyXgI3ofoftCD0jL7yZliWs9wjNiCrDpPCT7iGYc4QxQbBTYujp2Om9 WpBav072rXQD2cl9sYQHiLCmQ== X-Received: by 2002:a17:902:ce8d:b0:2dd:ad74:ac30 with SMTP id d9443c01a7336-2ddb1baedf4mr2290305ad.25.1789671147971; Thu, 17 Sep 2026 11:52:27 -0700 (PDT) Received: from d.home.yangfl.dn42 ([2a09:bac5:661a:1232::1d0:c5]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2dd89f331b7sm31032655ad.82.2026.09.17.11.52.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 17 Sep 2026 11:52:27 -0700 (PDT) From: David Yang To: netdev@vger.kernel.org Cc: David Yang , Andrew Lunn , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Russell King , linux-kernel@vger.kernel.org Subject: [PATCH net-next v3 8/8] net: dsa: motorcomm: Add SerDes PCS Date: Fri, 18 Sep 2026 02:49:55 +0800 Message-ID: <20260917185010.3189199-9-mmyangfl@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260917185010.3189199-1-mmyangfl@gmail.com> References: <20260917185010.3189199-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" Support in-band negotiation of the SerDes ports. Signed-off-by: David Yang Reviewed-by: Andrew Lunn --- drivers/net/dsa/motorcomm/Makefile | 1 + drivers/net/dsa/motorcomm/chip.c | 83 +++++++--- drivers/net/dsa/motorcomm/chip.h | 6 + drivers/net/dsa/motorcomm/mdio_bus.c | 31 +++- drivers/net/dsa/motorcomm/mdio_bus.h | 15 ++ drivers/net/dsa/motorcomm/pcs-921x.c | 235 +++++++++++++++++++++++++++ drivers/net/dsa/motorcomm/pcs.h | 13 ++ 7 files changed, 355 insertions(+), 29 deletions(-) create mode 100644 drivers/net/dsa/motorcomm/pcs-921x.c create mode 100644 drivers/net/dsa/motorcomm/pcs.h diff --git a/drivers/net/dsa/motorcomm/Makefile b/drivers/net/dsa/motorcomm= /Makefile index f7cce7eabbb8..1d2c1b3064c4 100644 --- a/drivers/net/dsa/motorcomm/Makefile +++ b/drivers/net/dsa/motorcomm/Makefile @@ -3,4 +3,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 mdio_bus.o +yt921x-objs +=3D pcs-921x.o yt921x-objs +=3D smi.o diff --git a/drivers/net/dsa/motorcomm/chip.c b/drivers/net/dsa/motorcomm/c= hip.c index 491ba1edfa3c..530bea77ac70 100644 --- a/drivers/net/dsa/motorcomm/chip.c +++ b/drivers/net/dsa/motorcomm/chip.c @@ -28,6 +28,7 @@ #include "chip.h" #include "leds.h" #include "mdio_bus.h" +#include "pcs.h" #include "smi.h" =20 struct yt921x_mib_desc { @@ -3511,6 +3512,10 @@ yt921x_port_up(struct yt921x_priv *priv, int port, u= nsigned int mode, if (ps =3D=3D YT921X_SPEED_NUM) return -EINVAL; =20 + mask =3D YT921X_PORT_SPEED_M | YT921X_PORT_TX_MAC_EN | + YT921X_PORT_RX_MAC_EN | YT921X_PORT_TX_PAUSE | + YT921X_PORT_RX_PAUSE | YT921X_PORT_DUPLEX_FULL | + YT921X_PORT_CTRL_LINK_AN; ctrl =3D YT921X_PORT_SPEED(ps); if (duplex =3D=3D DUPLEX_FULL) ctrl |=3D YT921X_PORT_DUPLEX_FULL; @@ -3519,7 +3524,9 @@ yt921x_port_up(struct yt921x_priv *priv, int port, un= signed int mode, if (rx_pause) ctrl |=3D YT921X_PORT_RX_PAUSE; ctrl |=3D YT921X_PORT_RX_MAC_EN | YT921X_PORT_TX_MAC_EN; - res =3D yt921x_reg_write(priv, YT921X_PORTn_CTRL(port), ctrl); + if (pp->serdes && pp->inband) + ctrl |=3D YT921X_PORT_CTRL_LINK_AN; + res =3D yt921x_reg_update_bits(priv, YT921X_PORTn_CTRL(port), mask, ctrl); if (res) return res; =20 @@ -3539,7 +3546,8 @@ yt921x_port_up(struct yt921x_priv *priv, int port, un= signed int mode, if (rx_pause) ctrl |=3D YT921X_SERDES_RX_PAUSE; mask |=3D YT921X_SERDES_LINK; - ctrl |=3D YT921X_SERDES_LINK; + if (!pp->inband) + ctrl |=3D YT921X_SERDES_LINK; res =3D yt921x_reg_update_bits(priv, YT921X_SERDESn(port), mask, ctrl); if (res) @@ -3570,7 +3578,6 @@ yt921x_port_config(struct yt921x_priv *priv, int port= , unsigned int mode, struct yt921x_port *pp =3D &priv->ports[port]; struct device *dev =3D to_device(priv); u32 mask; - u32 ctrl; int res; =20 if (BIT(port) & info->internal_mask) { @@ -3598,28 +3605,6 @@ yt921x_port_config(struct yt921x_priv *priv, int por= t, unsigned int mode, if (res) return res; =20 - mask =3D YT921X_SERDES_MODE_M; - switch (interface) { - case PHY_INTERFACE_MODE_SGMII: - ctrl =3D YT921X_SERDES_MODE_SGMII; - break; - case PHY_INTERFACE_MODE_100BASEX: - ctrl =3D YT921X_SERDES_MODE_100BASEX; - break; - case PHY_INTERFACE_MODE_1000BASEX: - ctrl =3D YT921X_SERDES_MODE_1000BASEX; - break; - case PHY_INTERFACE_MODE_2500BASEX: - ctrl =3D YT921X_SERDES_MODE_2500BASEX; - break; - default: - return -EINVAL; - } - res =3D yt921x_reg_update_bits(priv, YT921X_SERDESn(port), - mask, ctrl); - if (res) - return res; - /* The order is quite arbitrary - we can't return to a safe * state on IO errors. */ @@ -3637,6 +3622,29 @@ yt921x_port_config(struct yt921x_priv *priv, int por= t, unsigned int mode, return -EINVAL; } =20 +static struct phylink_pcs * +yt921x_phylink_mac_select_pcs(struct phylink_config *config, + phy_interface_t interface) +{ + struct dsa_port *dp =3D dsa_phylink_to_port(config); + struct yt921x_priv *priv =3D to_yt921x_priv(dp->ds); + const struct yt921x_info *info =3D priv->info; + int port =3D dp->index; + + if (!(BIT(port) & info->serdes_mask)) + return NULL; + + switch (interface) { + case PHY_INTERFACE_MODE_SGMII: + case PHY_INTERFACE_MODE_100BASEX: + case PHY_INTERFACE_MODE_1000BASEX: + case PHY_INTERFACE_MODE_2500BASEX: + return &priv->ports[port].pcs; + default: + return NULL; + } +} + static void yt921x_phylink_mac_link_down(struct phylink_config *config, unsigned int m= ode, phy_interface_t interface) @@ -4224,6 +4232,11 @@ static int yt921x_chip_setup(struct yt921x_priv *pri= v) if (res) return res; =20 + res =3D yt921x_reg_clear_bits(priv, YT921X_SERDES_CTRL, + YT921X_SERDES_CTRL_TEST); + if (res) + return res; + return 0; } =20 @@ -4233,6 +4246,8 @@ static int yt921x_dsa_setup(struct dsa_switch *ds) struct device *dev =3D to_device(priv); struct device_node *np =3D dev->of_node; struct device_node *child; + unsigned long mask; + int port; int res; =20 mutex_lock(&priv->reg_lock); @@ -4266,6 +4281,23 @@ static int yt921x_dsa_setup(struct dsa_switch *ds) return -ENODEV; } =20 + mask =3D priv->info->serdes_mask; + for_each_set_bit(port, &mask, YT921X_PORT_NUM) { + struct yt921x_port *pp =3D &priv->ports[port]; + + pp->pcs.ops =3D &yt921x_phylink_pcs_ops; + pp->pcs.poll =3D true; + + __set_bit(PHY_INTERFACE_MODE_SGMII, + pp->pcs.supported_interfaces); + __set_bit(PHY_INTERFACE_MODE_100BASEX, + pp->pcs.supported_interfaces); + __set_bit(PHY_INTERFACE_MODE_1000BASEX, + pp->pcs.supported_interfaces); + __set_bit(PHY_INTERFACE_MODE_2500BASEX, + pp->pcs.supported_interfaces); + } + mutex_lock(&priv->reg_lock); res =3D yt921x_chip_setup(priv); mutex_unlock(&priv->reg_lock); @@ -4283,6 +4315,7 @@ static int yt921x_dsa_setup(struct dsa_switch *ds) } =20 static const struct phylink_mac_ops yt921x_phylink_mac_ops =3D { + .mac_select_pcs =3D yt921x_phylink_mac_select_pcs, .mac_link_down =3D yt921x_phylink_mac_link_down, .mac_link_up =3D yt921x_phylink_mac_link_up, .mac_config =3D yt921x_phylink_mac_config, diff --git a/drivers/net/dsa/motorcomm/chip.h b/drivers/net/dsa/motorcomm/c= hip.h index c1b5f29eb0fa..0cbb54834fff 100644 --- a/drivers/net/dsa/motorcomm/chip.h +++ b/drivers/net/dsa/motorcomm/chip.h @@ -910,6 +910,8 @@ struct yt921x_port { =20 /* SerDes in use */ bool serdes:1; + /* Link from in-band status (PHYLINK_PCS_NEG_INBAND) */ + bool inband:1; /* BR_HAIRPIN_MODE */ bool hairpin:1; /* BR_ISOLATED */ @@ -929,8 +931,12 @@ struct yt921x_port { =20 struct yt921x_led *leds[YT921X_LED_GROUP_NUM]; #endif + + struct phylink_pcs pcs; }; =20 +#define pcs_to_yt921x_port(_pcs) container_of((_pcs), struct yt921x_port, = pcs) + struct yt921x_reg_ops { int (*read)(void *context, u32 reg, u32 *valp); int (*write)(void *context, u32 reg, u32 val); diff --git a/drivers/net/dsa/motorcomm/mdio_bus.c b/drivers/net/dsa/motorco= mm/mdio_bus.c index ba70343f3f33..1a3f3cc68275 100644 --- a/drivers/net/dsa/motorcomm/mdio_bus.c +++ b/drivers/net/dsa/motorcomm/mdio_bus.c @@ -19,8 +19,7 @@ static int yt921x_intif_wait(struct yt921x_priv *priv) &val); } =20 -static int -yt921x_intif_read(struct yt921x_priv *priv, int port, int reg, u16 *valp) +int yt921x_intif_read(struct yt921x_priv *priv, int port, int reg, u16 *va= lp) { struct device *dev =3D to_device(priv); u32 mask; @@ -58,8 +57,7 @@ yt921x_intif_read(struct yt921x_priv *priv, int port, int= reg, u16 *valp) return 0; } =20 -static int -yt921x_intif_write(struct yt921x_priv *priv, int port, int reg, u16 val) +int yt921x_intif_write(struct yt921x_priv *priv, int port, int reg, u16 va= l) { u32 mask; u32 ctrl; @@ -86,6 +84,31 @@ yt921x_intif_write(struct yt921x_priv *priv, int port, i= nt reg, u16 val) return yt921x_intif_wait(priv); } =20 +int +yt921x_intif_modify_changed(struct yt921x_priv *priv, int port, int reg, + u16 mask, u16 val) +{ + int res; + u16 v; + u16 u; + + res =3D yt921x_intif_read(priv, port, reg, &v); + if (res) + return res; + + u =3D v; + u &=3D ~mask; + u |=3D val; + if (u =3D=3D v) + return 0; + + res =3D yt921x_intif_write(priv, port, reg, u); + if (res) + return res; + + return 1; +} + static int yt921x_mbus_int_read(struct mii_bus *mbus, int port, int reg) { struct yt921x_priv *priv =3D mbus->priv; diff --git a/drivers/net/dsa/motorcomm/mdio_bus.h b/drivers/net/dsa/motorco= mm/mdio_bus.h index ae5792b8da24..e79b725d435b 100644 --- a/drivers/net/dsa/motorcomm/mdio_bus.h +++ b/drivers/net/dsa/motorcomm/mdio_bus.h @@ -33,6 +33,21 @@ =20 struct yt921x_priv; =20 +int yt921x_intif_read(struct yt921x_priv *priv, int port, int reg, u16 *va= lp); +int yt921x_intif_write(struct yt921x_priv *priv, int port, int reg, u16 va= l); +int yt921x_intif_modify_changed(struct yt921x_priv *priv, int port, int re= g, + u16 mask, u16 val); + +static inline int +yt921x_intif_modify(struct yt921x_priv *priv, int port, int reg, u16 mask, + u16 val) +{ + int res; + + res =3D yt921x_intif_modify_changed(priv, port, reg, mask, val); + return res >=3D 0 ? 0 : res; +} + int yt921x_mbus_int_init(struct yt921x_priv *priv, struct device_node *mnp= ); int yt921x_mbus_ext_init(struct yt921x_priv *priv, struct device_node *mnp= ); =20 diff --git a/drivers/net/dsa/motorcomm/pcs-921x.c b/drivers/net/dsa/motorco= mm/pcs-921x.c new file mode 100644 index 000000000000..dcf7397cd241 --- /dev/null +++ b/drivers/net/dsa/motorcomm/pcs-921x.c @@ -0,0 +1,235 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Copyright (c) 2026 David Yang + */ + +#include "chip.h" +#include "mdio_bus.h" +#include "pcs.h" +#include "smi.h" + +#define to_device(priv) ((priv)->ds.dev) + +static int +yt921x_serdes_config(struct yt921x_priv *priv, int port, unsigned int neg_= mode, + phy_interface_t interface, + const unsigned long *advertising, bool permit_pause_to_mac) +{ + bool inband =3D neg_mode & PHYLINK_PCS_NEG_INBAND; + struct yt921x_port *pp =3D &priv->ports[port]; + bool changed =3D false; + u16 bmcr; + u32 mask; + u32 ctrl; + u16 val; + int adv; + int res; + + switch (interface) { + case PHY_INTERFACE_MODE_SGMII: + ctrl =3D YT921X_SERDES_MODE_SGMII; + break; + case PHY_INTERFACE_MODE_100BASEX: + ctrl =3D YT921X_SERDES_MODE_100BASEX; + break; + case PHY_INTERFACE_MODE_1000BASEX: + ctrl =3D YT921X_SERDES_MODE_1000BASEX; + break; + case PHY_INTERFACE_MODE_2500BASEX: + ctrl =3D YT921X_SERDES_MODE_2500BASEX; + break; + default: + return -EOPNOTSUPP; + } + + res =3D yt921x_reg_update_bits(priv, YT921X_SERDESn(port), + YT921X_SERDES_MODE_M, ctrl); + if (res) + return res; + + mask =3D YT921X_PORT_CTRL_LINK_AN | YT921X_PORT_CTRL_PAUSE_AN; + ctrl =3D 0; + if (inband) + ctrl |=3D YT921X_PORT_CTRL_LINK_AN; + if (neg_mode =3D=3D PHYLINK_PCS_NEG_INBAND_ENABLED && permit_pause_to_mac) + ctrl |=3D YT921X_PORT_CTRL_PAUSE_AN; + res =3D yt921x_reg_update_bits(priv, YT921X_PORTn_CTRL(port), mask, ctrl); + if (res) + return res; + + if (inband) { + res =3D yt921x_reg_clear_bits(priv, YT921X_SERDESn(port), + YT921X_SERDES_LINK); + if (res) + return res; + } + + adv =3D phylink_mii_c22_pcs_encode_advertisement(interface, advertising); + if (adv >=3D 0) { + res =3D yt921x_intif_modify_changed(priv, port, MII_ADVERTISE, + U16_MAX, adv); + if (res < 0) + return res; + + changed =3D !!res; + } + + res =3D yt921x_intif_read(priv, port, MII_BMCR, &val); + if (res) + return res; + + bmcr =3D val; + if (neg_mode =3D=3D PHYLINK_PCS_NEG_INBAND_ENABLED) + bmcr |=3D BMCR_ANENABLE; + else + bmcr &=3D ~BMCR_ANENABLE; + + /* If the ANENABLE bit was changed, the PHY will restart negotiation, + * so we don't need to flag a change to trigger its own restart. + */ + if (bmcr !=3D val) + changed =3D false; + + bmcr &=3D ~BMCR_ISOLATE; + res =3D yt921x_intif_write(priv, port, MII_BMCR, bmcr); + if (res) + return res; + + pp->inband =3D inband; + return changed; +} + +static unsigned int +yt921x_phylink_pcs_inband_caps(struct phylink_pcs *pcs, + phy_interface_t interface) +{ + return LINK_INBAND_DISABLE | LINK_INBAND_ENABLE; +} + +static void +yt921x_phylink_pcs_get_state(struct phylink_pcs *pcs, unsigned int neg_mod= e, + struct phylink_link_state *state) +{ + struct yt921x_port *pp =3D pcs_to_yt921x_port(pcs); + struct yt921x_priv *priv =3D yt921x_port_to_priv(pp); + struct device *dev =3D to_device(priv); + int port =3D pp->index; + u16 bmsr; + u16 lpa; + int res; + + mutex_lock(&priv->reg_lock); + + res =3D yt921x_intif_read(priv, port, MII_BMSR, &bmsr); + if (res) + goto out; + + res =3D yt921x_intif_read(priv, port, MII_LPA, &lpa); + +out: + mutex_unlock(&priv->reg_lock); + + if (res) { + dev_err(dev, "Failed to %s PCS port %d: %i\n", "get state of", + port, res); + state->link =3D false; + return; + } + + phylink_mii_c22_pcs_decode_state(state, neg_mode, bmsr, lpa); +} + +static void yt921x_phylink_pcs_an_restart(struct phylink_pcs *pcs) +{ + struct yt921x_port *pp =3D pcs_to_yt921x_port(pcs); + struct yt921x_priv *priv =3D yt921x_port_to_priv(pp); + struct device *dev =3D to_device(priv); + int port =3D pp->index; + u16 val; + int res; + + mutex_lock(&priv->reg_lock); + + res =3D yt921x_intif_read(priv, port, MII_BMCR, &val); + if (res) + goto end; + + val |=3D BMCR_ANRESTART; + res =3D yt921x_intif_write(priv, port, MII_BMCR, val); + +end: + mutex_unlock(&priv->reg_lock); + + if (res) + dev_err(dev, "Failed to %s PCS port %d: %i\n", "restart", + port, res); +} + +static void yt921x_phylink_pcs_disable(struct phylink_pcs *pcs) +{ + struct yt921x_port *pp =3D pcs_to_yt921x_port(pcs); + struct yt921x_priv *priv =3D yt921x_port_to_priv(pp); + struct device *dev =3D to_device(priv); + int port =3D pp->index; + int res; + + mutex_lock(&priv->reg_lock); + res =3D yt921x_intif_modify(priv, port, MII_BMCR, BMCR_PDOWN, BMCR_PDOWN); + mutex_unlock(&priv->reg_lock); + + if (res) + dev_err(dev, "Failed to %s PCS port %d: %i\n", "power down", + port, res); +} + +static int yt921x_phylink_pcs_enable(struct phylink_pcs *pcs) +{ + struct yt921x_port *pp =3D pcs_to_yt921x_port(pcs); + struct yt921x_priv *priv =3D yt921x_port_to_priv(pp); + int port =3D pp->index; + u16 val; + int res; + + mutex_lock(&priv->reg_lock); + + res =3D yt921x_intif_read(priv, port, MII_BMCR, &val); + if (res) + goto end; + + val &=3D ~BMCR_PDOWN; + val |=3D BMCR_ANRESTART; + res =3D yt921x_intif_write(priv, port, MII_BMCR, val); + +end: + mutex_unlock(&priv->reg_lock); + + return res; +} + +static int +yt921x_phylink_pcs_config(struct phylink_pcs *pcs, unsigned int neg_mode, + phy_interface_t interface, + const unsigned long *advertising, + bool permit_pause_to_mac) +{ + struct yt921x_port *pp =3D pcs_to_yt921x_port(pcs); + struct yt921x_priv *priv =3D yt921x_port_to_priv(pp); + int port =3D pp->index; + int res; + + mutex_lock(&priv->reg_lock); + res =3D yt921x_serdes_config(priv, port, neg_mode, interface, + advertising, permit_pause_to_mac); + mutex_unlock(&priv->reg_lock); + + return res; +} + +const struct phylink_pcs_ops yt921x_phylink_pcs_ops =3D { + .pcs_inband_caps =3D yt921x_phylink_pcs_inband_caps, + .pcs_get_state =3D yt921x_phylink_pcs_get_state, + .pcs_an_restart =3D yt921x_phylink_pcs_an_restart, + .pcs_disable =3D yt921x_phylink_pcs_disable, + .pcs_enable =3D yt921x_phylink_pcs_enable, + .pcs_config =3D yt921x_phylink_pcs_config, +}; diff --git a/drivers/net/dsa/motorcomm/pcs.h b/drivers/net/dsa/motorcomm/pc= s.h new file mode 100644 index 000000000000..42426558086a --- /dev/null +++ b/drivers/net/dsa/motorcomm/pcs.h @@ -0,0 +1,13 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Copyright (c) 2026 David Yang + */ + +#ifndef _YT_PCS_H +#define _YT_PCS_H + +#include + +extern const struct phylink_pcs_ops yt921x_phylink_pcs_ops; + +#endif --=20 2.53.0