From nobody Fri Sep 25 04:40:47 2026 Received: from mail-pz2-f42.google.com (mail-pz2-f42.google.com [74.125.228.42]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EF6A34B8288 for ; Wed, 16 Sep 2026 16:43:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.228.42 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789577028; cv=none; b=kX82UOj9EnAeW7XyfK/SOtthZLJkwN8q6bqQlxCjrwx6xt0AfnwdPxBXzDLVndBH0hbMJUycRTmUMcGN5p6OBOvnDTWrNkVz/GBprz5G3blqeJHaT5QLm21Jve/1h/8DLrMC6vvf97v1UVIDnZTCd2PHe8D2odnMmBbHI0siZz0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789577028; c=relaxed/simple; bh=t2Rh5HicDYfUhDshXxIV+ToBVIxCOdkpflXNAhRUTLk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Tn4zs0hVL1i/JzHFQy7zKvK+WSvrJVRWESqiNdK52O/GKvMDC8X+dlLh6bRsor42+crUR+yRttOFwn1oiMOgG9sZ6UNO0nFVVcY6pfuSjK+OI7efl+L7/WG2+N5IY3imlkcctoMXoRJCz6wyKLofk1viOMQXXoCNeB1e1Enu8wA= 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=cnNC+Fwn; arc=none smtp.client-ip=74.125.228.42 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="cnNC+Fwn" Received: by mail-pz2-f42.google.com with SMTP id 41be03b00d2f7-cc4c3304784so945992a12.3 for ; Wed, 16 Sep 2026 09:43:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1789577012; x=1790181812; 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=cnNC+FwnmKWQBGu3rsYm6gCf2VEbURC9FHJPg/dKZoE327N9gZbHwRK16MaxFr2roz uYIYkHlb4n/ocvvhmAkPoqX2U3CIEEdhExk4uBsRsPNA55S2dDp6xoQTEuMWLdB3bTup D1RghBbs77ROPmYu1iNL6AqKwsr/Gni+vVSnXTej2Np4LxrULqbP8iJeei0ZS91vcdRU NgczjKaeYjJJGsGHuSCYESKZNPORhil6gVMMVRBFEr85z/WXJPbca5S1TebpcrgfBDyn zEQZT99qIHJZVsL7qMJitCc8b91EivrMUF2cJE0iLrYveV524CvOY/Ll4uaCjYb8lhse LxQg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789577012; x=1790181812; 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=AiZSUJsO65LDgD52v0Crm2mFjJRZJxtTu+C9XaSN4ttM9daKLA7wmWjRcBnhpcomg1 4gA0YW73oGl/ZWEj8evXN/r3T/BmOYaxkh8sxvsy5DS+CW+vecsD4PcQ+HuZCbDryfZ/ xJNt8XgszqEi7dyr26GYN92N0vnrlMEQvhPmPtRFmfy96rpXwr8yCjQNMsmkBnFnWX8u TyBRLjwUIF3AU0CdBECOiQ2sqey4mAbF1KUfBijJ4yqrOsZsSh59AeMSgWnMAASu0xrp VIFnvcPNr2VJsNJIknlIj2Kw4N+eb9D9Nh7ePjxg+mqkCfLrgtE9s+0oiW5LZdd0V3cx k5EQ== X-Forwarded-Encrypted: i=1; AKwUvByujrqrgvbr+g4ENj0kJ5gcZjMSvt1TvOpmqyRiox7LDMFT37GtklUe3bqLF17KGCKKgNUTbGWlu5OWIDE=@vger.kernel.org X-Gm-Message-State: AFuF++nAqQM57fx/xcOtu0Xf+0yABKJUbOtLdPNCJjihJn326XztPP9G 6nc17cL02vnNihgs8cPsHPsfLcQ4vycqc4Jv4Suzfh3S7VUYI1fXsm7M X-Gm-Gg: AYBFou2t0mcCRTiZLwDv6tCPzVW6zCfeAnwSZO6P5vTKZNO73NHNXfTlqONuUcI4sZf 1mmISzxt2MnXp04FXrcQtF6h/xUqTU7ZjM49EGVJtiSZ7rryudhBgAVg+K/YHYPhOGZ5aII1oQg sVlCU+vuYhS2UTLgkLtr1ExGwRauvP8IWL75boe2T2KgXUxF4+rCAdKaZ+ZDPk1aG+eMDgav/dj 12+Mexm9JP3uftOS/3lRdAvzaN8Dk44XpeXW2oeVLfis72yh8Zgn0JzDUKthrhhpS18+duszBN4 cFP1nTY9/0DHh/xHpHV+RfFQofHiUnZhtvqlNRzv36v6gwfkq9w8emyDECdp66swbxokpfHmcVC 3pM9PJ79jVbdm5quyGsgaK7Yb3lQtY7nEJl3MuzDmXWe7ANgasbhoZIgwwc2K/fejTG7Vukv2L1 bw0aLaobwiMOYv9Trr0cf6Ga6Ii7Fh0i+wfKvy9l1fi6NrXA3IcOIr2yDrebuA2SKKqAO+eQxJt S1E+2I/MJwFh+jJExQAHcYZaA8= X-Received: by 2002:a05:6a20:3d8b:b0:3da:b761:80c0 with SMTP id adf61e73a8af0-3dd5f5c7a4amr10074959637.14.1789577011577; Wed, 16 Sep 2026 09:43:31 -0700 (PDT) Received: from d.home.yangfl.dn42 ([2a09:bac5:661a:1232::1d0:c5]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-cc50acc757csm1902278a12.32.2026.09.16.09.43.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 16 Sep 2026 09:43:31 -0700 (PDT) From: David Yang To: netdev@vger.kernel.org Cc: David Yang , Andrew Lunn , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Russell King , linux-kernel@vger.kernel.org Subject: [PATCH net-next v2 1/8] net: dsa: motorcomm: Remove YT921X_PORT_MASK_* macros Date: Thu, 17 Sep 2026 00:43:01 +0800 Message-ID: <20260916164310.3168269-2-mmyangfl@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260916164310.3168269-1-mmyangfl@gmail.com> References: <20260916164310.3168269-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 --- 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 04:40:47 2026 Received: from mail-pz2-f40.google.com (mail-pz2-f40.google.com [74.125.228.40]) (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 03D314B0E2C for ; Wed, 16 Sep 2026 16:43:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.228.40 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789577034; cv=none; b=cUD8o47hqE4U8hAFGdPDAhvglGwextHK3UQZqHMGvBm2o1yr6UVWOk8CCrxv2UMBY3gfyUOkln7d+1qag49h/iab1eXNvuBa+JH4TRwScCMdPj+kQQ/ew0yn6SupeY14GyFX9WDLlxa/DYOxAn2nASeVgN2wosf33ve7eGunukQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789577034; c=relaxed/simple; bh=YuVnVbkxesHUrvTiDDRRP7qicf2K8BySrtV+L0OtK/E=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=fFFjLIaixTLvH7jQI/atcTuo3f4squq94nUU9tip4GndGZmsJabMIDIBKgfc/xtQveqFE/V07VpK/dkuCf9slt6ndx/AG00/rJVCbzl7kZouvLP4OQaPgM279apSj3SQvR0g5ulld7by/IywLAAprRjmHuVpr4OJH4454TgZc/8= 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=hhN0a1Hh; arc=none smtp.client-ip=74.125.228.40 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="hhN0a1Hh" Received: by mail-pz2-f40.google.com with SMTP id 41be03b00d2f7-cc5121bcf1aso552040a12.1 for ; Wed, 16 Sep 2026 09:43:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1789577015; x=1790181815; 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=hhN0a1HhHOvtP/in0VooKFYuw15/0BMdFcO5nuDobVqnaET8L9Z3HSIuOTtTJxKtPe Y1vJR53kCQIdEYnXT1sNaRhjAygsEDX85ol2Y6iGl2ypsx7Qpq+VdNyPlIVI8CKs32pW wmjM/MljKrDx6mPlaG2yc+tEfsBhXlXvOTdwF84SQbgCOCmIjyJP6RQWoBOQfdWidFu2 bvF5RmQweATBXVencG+hzlp1vSKRwPJAlQ15jphsJsXmSzjKqoy40VZMc4QXHeqv/mJE jfHocyxG+4zt6uJBeTB0HTzwvPi4B8XOQuyrFkd56SAMP0W2apbablmrcgbhj5nEjjN8 wT1A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789577015; x=1790181815; 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=1Uv6VW0GngASih9FG2frvPipZ5JeOQA1PYKc5lFtZH4KYbInTciaTBWWbRnqvPAJOM x1S4G3uY/STQOTNFajNzdSzSPqCyckkEf9CbFHG7zzKTFUWQyC2VZSmQPEnr5LL9V2fW v09PH832GX3tO2WPKF/nftx2sMKP/4gzKI/8RoBSiIZa+6l3L7Stu5XT08bU8t0J3eZO 9FQKWI28FJMM2gKSLqWrfwKWQVnHQENhhh0SmEBtIyqLMEuZqHxEmxqDO5aOnMUJr4YP 1x8g9H5Z5/kkVEpSK4v1hQxIbIvW9nlVbuDeoGsTUfymhPoI9rnuyehaUG+wXPTShEio xeWw== X-Forwarded-Encrypted: i=1; AKwUvBwkL30v9OOSkrLueb0jE+2URzMC4hrUq1jetP1WsJiuo8l2yl6VXiEN84DiuX22g/LmB9yYfsnJPUIvtow=@vger.kernel.org X-Gm-Message-State: AFuF++lAY1Q/G5jKm/d4Lzb/QY9THKpeNVghji4JSRbSQ4jQtIhn3vS0 tWcjzhviTB+uAaEsNtz9h1bFSl4W68XvWK0WX5M2BfV18rxRdXDACVt+ X-Gm-Gg: AYBFou0pcMVpTwbsVqDuK8a6Rme1omNfY7dSE1S5lYKESiCxLdLsesyWDvEUXWnZh3w 3V7V90glQyhfQNXKv/aZFVgrPnTdPo/zwEqAQHBkOfUQCFKhnjAFkanZlYDRDmFvOJLDk5WItFB eDgifmB7V7kHYCxFEvLC2AHunVSSlbUnkOooXPNZM9Fofj4/FIHveAqjr8Kpv22EFNbRpEEpPcG COQQ+zNLZH0W25TKyEedNQreohHrExDfYOvNEajl9NXvNMUX4zviezY3fZZ7Ez4PlgO97vYNVvt mdpOKAuV4JQKIu1ReQD/K/8c0pWVNxSD2AwLGs1zNGDPrwZOgXbPZr/Z6Zt8nLVMPqqbBisOwVx kJsJAA2ar+4uNdhWm9H44/S78eQw6WiKv8T8yU3AmW1o+IAzWXi4uysV7gpFmXEfh+UafGzg3DZ v3McdwFTnewyDqwHky4X8mdKdOFRkOf2hiVqVDZWick3tXHRbxdlby1OM2SE5XYx9DRFB9EEcsh YcSzmG0LhEPCR4ph4oyNGTJRXjvtAIRC+/p X-Received: by 2002:a05:6a20:72a6:b0:3c3:7179:a640 with SMTP id adf61e73a8af0-3dd5f3c0a6cmr8204589637.3.1789577015271; Wed, 16 Sep 2026 09:43:35 -0700 (PDT) Received: from d.home.yangfl.dn42 ([2a09:bac5:661a:1232::1d0:c5]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-cc50acc757csm1902278a12.32.2026.09.16.09.43.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 16 Sep 2026 09:43:34 -0700 (PDT) From: David Yang To: netdev@vger.kernel.org Cc: David Yang , Andrew Lunn , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Russell King , linux-kernel@vger.kernel.org Subject: [PATCH net-next v2 2/8] net: dsa: motorcomm: Split xMII and SERDES port masks Date: Thu, 17 Sep 2026 00:43:02 +0800 Message-ID: <20260916164310.3168269-3-mmyangfl@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260916164310.3168269-1-mmyangfl@gmail.com> References: <20260916164310.3168269-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 --- 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 04:40:47 2026 Received: from mail-pz2-f43.google.com (mail-pz2-f43.google.com [74.125.228.43]) (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 C15EE4B8263 for ; Wed, 16 Sep 2026 16:43:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.228.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789577028; cv=none; b=kSrwaYiR8O8ItX7QGJFy2ByWOAnAq8L8H/npeJJN63T3BgHWEeQJoEiQb4LUBCpBQT9SSNSunU5+LAJO36kJoifk+mzn30c2ub9btTCdApBlHtevcqQIQPkSmM8aUh8s+LnFUUtwJZULYqDsgHlJzOzyNPq6LNcupFlVPtfI55Y= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789577028; c=relaxed/simple; bh=MCurz1LhxhbfRsPZRv1fgE6bTlasRPCfgz3NdkDubv0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Z3T7akDa/qNS6ahgvyN9ey6P1IWhE6KRFsLBYyDaYiH+ElC4c3ssnzjkAqQAke2EY6lKGiPqKEDQYb5rrUPff5/eRGj9JK1qvSi+yCVwLZmLRT28NAVerRo5u+Ltawni//9xjx261l/b96borg9D70j+cm6r/gg6JgiKqNkpTIc= 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=E/KD3Mf3; arc=none smtp.client-ip=74.125.228.43 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="E/KD3Mf3" Received: by mail-pz2-f43.google.com with SMTP id d2e1a72fcca58-8674704dab1so1338060b3a.2 for ; Wed, 16 Sep 2026 09:43:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1789577019; x=1790181819; 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=KtEJkdfTsz7PKT9363OYIZ/7x8QutK8/+4IHsILR5ac=; b=E/KD3Mf32LHDJcoMGhwZkQGhph5D57ihZm0EJh95v3NE4kjIldSVqONVPS5wpoE4/S 1l+onsn7b7mjW+tWCiRj9zZLL+PSo4XxFUnAfyJCUsnn796h8rkZX6WGbEMppUH5H9En kWrh36/LmMKs1nsFTQ5F2kq1qvxRABOj0jcVdpJCOR7tmTBzXTJijdPz8kB4XfL7fb4b SUYLkYZ8GPPHtUWYCT3h0QgNObiSke+pJnKitlOcqHZJ520MpFQHMO+Yprhgs2WdRBMJ GH1T4GrHfMkwKZoXyvjwLqU7TMmP0qUJhrDj4MwAtKtItu/h3ds3kEEBoPxitXThOyEx O3Lw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789577019; x=1790181819; 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=KtEJkdfTsz7PKT9363OYIZ/7x8QutK8/+4IHsILR5ac=; b=hcaLsa4CJc4bBr8sF4xeeZMS7m87+t8NuzRN10XPeyIoCU0ylBIHV056Z577jTRTH3 uKt1pLFz/GfPkuFCAkHI8xPXONV7JyeZ0XuvgtPVm/r49hcYrKfMOOERbpW80yzzRe9/ Jdz1aVHsAo9xa3CLp7dfuxWhBz0r9SRwxy60fD+HVAYT6kZbUMKpkYFhS80UYE3xQtB/ 2TG9kAb4GghEvFcECIjxTDmKDP526LHQ4B6Yxi6TFLhDMBmuQwYVaTCnGC+8CBOtrH+N CbmFjO+jKAA56qy40qDNC8PQlVNIaNQbPllDCatQnEHEzLWPbVHZ1/H3MATJ0jTQx+DB VQTw== X-Forwarded-Encrypted: i=1; AKwUvByOtO/y+jy2pV4RHPSHkX4Y2/nUk32ldelSaE0bsmNnLkShBAL0o19XBHJCkR0pCLp4bDuWrxXd7fMdCyA=@vger.kernel.org X-Gm-Message-State: AFuF++lBZoxOXAFBX44jJEuW+OpQfBPWi+Nwl+dQPOzfESGZ4pIC/xjE zw1jYUaD6xnND/wS+RHJ1zKsmMxSK7X5d5RcB5oXbiZnmy2W5Gd12BPh X-Gm-Gg: AYBFou2hY5nvdIn+MezmVLLW5SpaEGhhlXzdN3Wu2sjAxIn2taAHbBM9q7EJfYMNTG0 zxkqpdaqBCx/SLVQgCDpK2flABQafpOZNCCXt/O/xujaSu03YoFogZCuh9xsdD0SatT48o79gQW BjwU1zHLWfjSM11z5CAcMDG7d2yzo3W2ou2DuADQ4y/+8LwEfX3SqdEHe2eA5lfdU3DGWD6LhG6 8tIFZ5hkp34bR4oI4ch9A9MYZViv5ePFy4fTHShlcfO+xa5fH+eRKG1fDlI6JrBGtWvCDVsosqC FbHE0U+Hj3861W9bLlSvdO8vNHhQtsI8C1FGiQtFp/ahL2F6vitCEzoQnJ/9qgJzHpg1BGh6Grg CiEtOnk8hmxvlbm+/B+vExwn9qXWvHHnoNu/F8fv7bozq7LFvXu05xeGksKj4R7P+l9/Njc/qhp Vn83j9OEQExLxlk8pVBEzYA9H2h8B9o3fLj9Vym8S2+EZMQzAwVj+ki9HxXXOf2xX6JT6yvsCgG OPRXYPcabudhe075WHPkPm28w== X-Received: by 2002:a05:6a00:440a:b0:86b:922d:6aa with SMTP id d2e1a72fcca58-8723adb0210mr7433422b3a.1.1789577018741; Wed, 16 Sep 2026 09:43:38 -0700 (PDT) Received: from d.home.yangfl.dn42 ([2a09:bac5:661a:1232::1d0:c5]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-cc50acc757csm1902278a12.32.2026.09.16.09.43.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 16 Sep 2026 09:43:38 -0700 (PDT) From: David Yang To: netdev@vger.kernel.org Cc: David Yang , Andrew Lunn , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Russell King , linux-kernel@vger.kernel.org Subject: [PATCH net-next v2 3/8] net: dsa: motorcomm: Check port type with runtime info Date: Thu, 17 Sep 2026 00:43:03 +0800 Message-ID: <20260916164310.3168269-4-mmyangfl@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260916164310.3168269-1-mmyangfl@gmail.com> References: <20260916164310.3168269-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 | 61 +++++++++++++++----------------- drivers/net/dsa/motorcomm/chip.h | 11 +++--- 2 files changed, 34 insertions(+), 38 deletions(-) diff --git a/drivers/net/dsa/motorcomm/chip.c b/drivers/net/dsa/motorcomm/c= hip.c index b527a9cfd3e8..45c19d962458 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) @@ -3906,35 +3915,21 @@ yt921x_port_config(struct yt921x_priv *priv, int po= rt, 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. + */ + 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 04:40:47 2026 Received: from mail-pz2-f12.google.com (mail-pz2-f12.google.com [74.125.228.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 058394C2268 for ; Wed, 16 Sep 2026 16:43:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.228.12 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789577031; cv=none; b=JAh5oL2LqWDxMf8kmKIqfOZskvBoA7dRNRpDEn9LfdxSA27TRjNJ4EVawSPcZplZ9VroNyQOzgpv6Ay1B3W8t6PkVCQcZIHvVGQnB6FJZMz4XUUplzLldDCEawQTkKqWD+WWiTYyCFsyX7pQuC20+luNndNrDHJIqTfeGYJMVjg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789577031; c=relaxed/simple; bh=5Mk+lnirw4Bjs33nbqDwv1cmjLuAW+fXe7zM5oJKLh8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ZY8Elyfl9K6kWeNUvbvC6EtcXwcbQoawGPQoK/nyXcxuTLgPk9CPYEK2973bk/xWORIOI89lPHdcqdEUZeeykRIBVSAMkLApuCoRblKE+kcCoGZtyXZ0tI1A3hV+AENlw/wKp/ml9S0D1ekD3FBga8hQXqY5McF0FyB5L8IQbT0= 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=gydTWYCE; arc=none smtp.client-ip=74.125.228.12 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="gydTWYCE" Received: by mail-pz2-f12.google.com with SMTP id d2e1a72fcca58-8693af0d7c4so1324436b3a.3 for ; Wed, 16 Sep 2026 09:43:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1789577022; x=1790181822; 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=I+mpDMSv68K/PAHcJ/BXtEa2Gbm5+igpNMLOW8SgDp0=; b=gydTWYCEbbztBVQirfI49wWyNmmj8Vt7Iva/nOuc31KAIUVltsAUN4Q84thnjbXGkW IaT/wsYDvjM6HKchjd1z3xeEr7DegLX4EqOgIUCzEliWfF/I6mytjUdPkpEhJRojI7az R7ijQjcZrBQKzQP/YkrjCVrbYWfZxeXFTUjSPyGdHfFzwDNhDJrFbTlkGaTDCBbcmr5T FsIztsvnqtiWH+9533Sj7kSTMTVdq1t0nucnpFO/tc7QWgwuTLM1o2vXC4+ok94mn6fg ua5IRRJXPd4M7BAMnmXob4tAsQxbn6Zsfq6zx9Nl4HEUD680UoybtPa/S1jr0jxrB4O4 y/rw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789577022; x=1790181822; 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=I+mpDMSv68K/PAHcJ/BXtEa2Gbm5+igpNMLOW8SgDp0=; b=XN+n/0VeY13KAzj2LLVa/2NERAIEK15WUa0TuUTA788Aez4L3AK98CkXbERnTY/6gZ huJhkTtkEZRn7NAFKHzIcGLNNGq9uyrGiB/ZRpH9HCXTHO15EjNEl5mMVp1n1dnCkKda Tsns9QMAOE1jgvmxUmp4s3KCvu/XfpqasYMVLZ1vABfhnBLj1gNkaVgdLKG5MuurN4F6 R81iT9c82+QhPiwH+GcFJ43achK1ySV8OeEDgmGi/IXTp+n0JDZkWkZczg3AsGpTpz98 oMkwf0q6tWF5UfZn5K4IBUt9GHHfkYKoOIXiyCOwBgoet8gtwU9kt+vHTcfcz1IKnCCI DuqQ== X-Forwarded-Encrypted: i=1; AKwUvBz5DGomYLLZm07Sx7ky59oScHvdul0DrZO1FlgnzOCYpzSlhkp0DlryUsFrFzERNLegXlBSt9ZKyGNAecA=@vger.kernel.org X-Gm-Message-State: AFuF++kSocaf+M4uY5es12nHpDnOR2FAcIKykUMsXFqQxVW1vS2scowC 1D95/eXvOH9L2owVtwzAlVGFoJU+ScYZ44yjEdqbSKwkkDTSffJRy0wC X-Gm-Gg: AYBFou0LnshJf2JxFDSExwVMlkrJWTa8ojE197zjR/sNPpUuKWY6UGYHbibc6PlUMpp /WA2JpZMpexjo5Au7fxKixQY0sT56VaQ9PekxupJhtfAThfW8Qrfty1oOIN6vtkmFxDPc1yvlBx 3GpazUem0AyyWmTOGbdmECoQmDBRL68JVxoCJY0wHGnW99ti7UoauoZ+XDx5lZlHPt0zAZEsATw lUW6AOmAKAyJ/B9QdjX9k+eeI4MalfsccrvbMQeDqaX9YqjtWTt6beN1dgWru9isbYVpBFXA4T2 QD2kVDVh0MJ5P4kkMJN2+FPJQRGkyirvg6NBEFWEwFdtPH6KeJVp9Ax3uhZBtv6+2IYojVxI7kr p07ZFkFpCyjwHj3/KMLK92BOqMSzoTaRg7ECpQeUxfH+JyrQ1Zcqjjkz8sGJ0O8ne9PkmVAB2DO hJFFt1vKtLX/XMBm3S5vnnhAJJmQNISZ7852F/Y/e4gEahuP7ww33NRa1fcUoGLc1Nn53c9veRE DDL32jH2403BDcqyzEqew3jog== X-Received: by 2002:a05:6a21:3986:b0:3c3:8d86:9855 with SMTP id adf61e73a8af0-3dd5f454cc0mr8300273637.7.1789577021541; Wed, 16 Sep 2026 09:43:41 -0700 (PDT) Received: from d.home.yangfl.dn42 ([2a09:bac5:661a:1232::1d0:c5]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-cc50acc757csm1902278a12.32.2026.09.16.09.43.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 16 Sep 2026 09:43:41 -0700 (PDT) From: David Yang To: netdev@vger.kernel.org Cc: David Yang , Andrew Lunn , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Russell King , linux-kernel@vger.kernel.org Subject: [PATCH net-next v2 4/8] net: dsa: motorcomm: Fix register bit field names Date: Thu, 17 Sep 2026 00:43:04 +0800 Message-ID: <20260916164310.3168269-5-mmyangfl@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260916164310.3168269-1-mmyangfl@gmail.com> References: <20260916164310.3168269-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 --- 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 45c19d962458..3a8efffb3f97 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 04:40:47 2026 Received: from mail-pf1-f181.google.com (mail-pf1-f181.google.com [209.85.210.181]) (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 44433495AF7 for ; Wed, 16 Sep 2026 16:43:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.181 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789577034; cv=none; b=LbACUNEX9x0F2UrAFAc0FidF3a/1gRj+sG2cCTMLZ6hrAmkvDLMrMSc2f6Gka+23iVi33ChaUVaO6SphZRjy+BFnGhMCUzCr1wRaIpOjt96tFXXAVSuF2LmL7ZszWI9CLhxxBFmtZ+yLvRsBevewjvGAexqlJyCWptiCRdo7m4g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789577034; c=relaxed/simple; bh=oxQfveLbn2/DQNzTnqZa8s/d01tWMQISQrNwQD1mY0Q=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=L7+3uIwG//Ih1Jf5WAPNEPhT3QWBHK6MDssHi7EaLJDCeXHUWN4rsYK52E3qhY+qveDoutrdcvZ8TmUsbcNctjN5hiCBfFm3jcCBI5nBZqf8tlfsb1EDlIgbq6od9s93YuKnH5PttfdWazWJ+M9zfpmNnKxjr2ckENoDaD2b2+o= 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=d3h9qAUz; arc=none smtp.client-ip=209.85.210.181 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="d3h9qAUz" Received: by mail-pf1-f181.google.com with SMTP id d2e1a72fcca58-86ec25cf7ecso2269282b3a.1 for ; Wed, 16 Sep 2026 09:43:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1789577025; x=1790181825; 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=tuN8aoHSWEa5dHkvtDyZOdX8Adpy+bSIBgKElfCoi4g=; b=d3h9qAUz9V4eGZ7hZevVjwLTRFqqxs1TmDZHHFAU8KYYu6l1IZ68oqfZyMUlWaM7cP g71w6CX7nL3TRzBvXri3XOdBBN+JxlLpGJ4UWwQobBtFAl99V4TgZDPSeVrcbPN5vVBt 3L5IoQ5Pv+b5ulaRZkPxBPwRX51vX+0yoAOZWD5AyT8r6xq2T6aEiPVSRen/ZKItd6gF ZJlHIi6K+2NUrThp1fNgrA+HmKbCS6ewQKr4RX11IOLGuhSG479yUUw0Eo+XP2gIY6vs 5av/FNDnC+DHdJMZYWVPXRcZO5ZxgXRhYX/ilQaFtVTKsQn7Dso5RBoEOFIIZW7oui// qRCA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789577025; x=1790181825; 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=tuN8aoHSWEa5dHkvtDyZOdX8Adpy+bSIBgKElfCoi4g=; b=w5onD0ZvHqsDChTs0T726B4tlUo/dJHfb1vuD3+GlE2dc64W0UBJXdFl4xZA0D2tPA e6u0FRJrOFYbokScQ+WrL6BBrXvXVWVFQHKzzwa+wxmE57DQilgccqcfq150Qn9SUsI4 rOvfTuZEn2cJi76YEfvt1sRWscI2I8x5ZJR6BfMb6yPwlqSnPvDOAsfvQnfkJvHalVQz enVlRoewylo4KSQO6/lTaJjIcxo5tkW5+ho0Le/yM3P7x6vw/deAJY/vaUWZsAnmMgj/ mTMsJ0Dd4xDzLCUJACjSCZHdbjlb0D3ZjmJ8oa3nI5dVNp5+Igt8qiQDuKmLQxxM4z/v NWUQ== X-Forwarded-Encrypted: i=1; AKwUvBxL6jfP3AdCkISEsX9f3UmFUSNLId+m8QTXN1gDUowQS7JTVFlm8uBPgq3LbuRi7mh1oScKUgqnS1cTDE0=@vger.kernel.org X-Gm-Message-State: AFuF++nBg8qsQsxkc1K/OcNoLaXbg1Cpb6x3gIA30OO31lrp0qsDn7pg jaN0ZSJafes//7o6gGdjOa3dV479bGymUMFQ1U6Au2tVb54RI+9sii5U X-Gm-Gg: AYBFou3/FCXJ6AbPl2kFV+ii3I4HQv+BmrhYqPkZvWk7KC3gQ7JK5t05iDU0i39O9Lb MC6DDvcYJBrjgwK9EbcAh0PGpH7r6TaJXp+KFr4YwBfl7j7sUJ9nIyXIu2No2d5/E0R+sGRLzve 2qSnJcqtlqlZ/t0W+i3fgFkUVWC5OV2mOqhZDKzAIRHKugEhQVC04SX6ugi0xaZQEAF4sjWISyl QXJXmLp04kBixDIb+z9aDgJwc5q3M+S/PTDDkjohDtRhj/bi/Oh1gVHubCZGCYWFsb59/M1wpgk P3XNGi73fkVsg0k+8KwdTloL2cp2E4Vt7pftsvoPnHDTJ5Hb65eGY8+3aHnXN6m7pndGEO4E/4O Ivh0wDjIbSmUokWetELa09qE04DlpXhBPSLL5AMhsIT3FccXx5jTpIMlJ7Rak0RfyaCXW5yPYrT QcEVaFO2am2mpW5VjhB64NAF+S4YdLQR+RNaDcBBlElXk+KBLo7g28phu7tp/iMcn4SHFwnd7hC 8EAIkzHftWDNCfQXyZT4/jNxoFl5Kc+9XD7lA== X-Received: by 2002:a05:6a00:4099:b0:842:3c77:5996 with SMTP id d2e1a72fcca58-87341085fd4mr330193b3a.1.1789577025130; Wed, 16 Sep 2026 09:43:45 -0700 (PDT) Received: from d.home.yangfl.dn42 ([2a09:bac5:661a:1232::1d0:c5]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-cc50acc757csm1902278a12.32.2026.09.16.09.43.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 16 Sep 2026 09:43:44 -0700 (PDT) From: David Yang To: netdev@vger.kernel.org Cc: David Yang , Andrew Lunn , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Russell King , linux-kernel@vger.kernel.org Subject: [PATCH net-next v2 5/8] net: dsa: motorcomm: Introduce yt921x_speed Date: Thu, 17 Sep 2026 00:43:05 +0800 Message-ID: <20260916164310.3168269-6-mmyangfl@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260916164310.3168269-1-mmyangfl@gmail.com> References: <20260916164310.3168269-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 3a8efffb3f97..aac550bb4f72 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 04:40:47 2026 Received: from mail-pz2-f43.google.com (mail-pz2-f43.google.com [74.125.228.43]) (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 58C8E4B8287 for ; Wed, 16 Sep 2026 16:43:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.228.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789577046; cv=none; b=Rgm8fY0EBRtS9c1IP6vde+JEMdRBtUQw6YB9ii3Nc4yXSpnOxIT/YhPccH6xkKmCt+DTAGQ/QA9042WQeUemkT4IrbRuqjV4YNImqxAuL/WTXoW9bsdz7Lkyt6lvr94j59i5YYcoJSN6eOaqwdL1i2CNa7ByjHGeIVfTMxUr2fA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789577046; c=relaxed/simple; bh=9OzXTV0DA223m5vSCHBBhdaUL4nKz5XYVLsqm8ikMrQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=hf/+OY+3KzbZsPadKdpbrFWZcQRpGA5G0W8WK8frTMfIrjkt3Pcik27wRyXdwL4jIrKUiRJ5UlDPcNZvg/L8VmKKpbVaeAv3bzUd5byfEeiAppp2oLEVmMyU6WKiP6s1z/DJ+ikHxI/k7SexJsl3Liy/oNVdqLMAhUmtsWStC9o= 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=DIEe9K3z; arc=none smtp.client-ip=74.125.228.43 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="DIEe9K3z" Received: by mail-pz2-f43.google.com with SMTP id d2e1a72fcca58-85469e211a3so901455b3a.2 for ; Wed, 16 Sep 2026 09:43:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1789577028; x=1790181828; 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=MFUZqkMC5HU2RrjnHFq3xM9VTr/hsbrNJYOLEraLd5A=; b=DIEe9K3z1S1ReY6ZKBy5guty6474aRlSXzrOpvTTmYqk05p7qmawy/l2j6cIaO42Jy 6qGOqZQj3l0LELq/Ne8jOciBac8P9vP1sDNopm851EjKMfjPsnIswYQ2PtclkcinCzdt R8hmkRWpPl5B+oKeGSBOFxciAbuvDhrYVgE3NFukK0QrReTgxA+eZvLGaJmDnZIEDnrI z62cd1dD+IX+tomX7uZPD8dBXUg3brqCjVhHyakcEX2CXd2l4arIjdPv5sj8Nv7W94cH yfM+AjgUsCE0XFxYzHLZLDgOcdAFNlSb8NUhBkB1r+9bs0oBY5m2ikihQ6ThjG0U9Dhw n+KA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789577028; x=1790181828; 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=MFUZqkMC5HU2RrjnHFq3xM9VTr/hsbrNJYOLEraLd5A=; b=lj6+SiRkgFnh3VPNm9dMXcCM4VsFY7e499iEWcOjfAe7MnIHJGcfpB4sPDBxyWltfa x0EMl1Hg34ygEmn1FM9YCNG9zQRfA25a0qcU6qEw3dFfuTal6CU3+fyJtNqbFKpG94Yf PFj3jrReBTXEPD/qw/8MlrqqX90u2bkqP/px/rnmgxi2zTwx7FX7Cp2Ko8NL/zVOdjWp HNHZmn94MyI7iCvyj6mN0+q4AaJ+dmBvkpfRu9cqfBODI9Cw7WGhovPTN9lnd9C1dX7q T7QJiwXE/9isaK3MyH6YxOAiwUfPe0Ra86BwcsZa9BXtB0M9iDIxV/X2FveKldJUmjKq s1vw== X-Forwarded-Encrypted: i=1; AKwUvBwmGS4keWLtii+k36hY/e5M3K7n462Fbb4YwjYwf8epjkFlIml4x4SeUqkWGwrXXXYO+pITPIbp5p9dzsg=@vger.kernel.org X-Gm-Message-State: AFuF++lZnSTfGL3x/j0gpznzmQzZj9YNcRwU0X8BIAM8JBY+JmV2VT/L cQ7DDR8n+4gXcXsrjldSeGBcSqWg8GlKdYAb2RagaK/ERx1DbnTIe2qu X-Gm-Gg: AYBFou0abLuz0HJtFf4Neb+P21rdAfFLQR9/FqAlqkDw3X0w5/YthWMw0JApk4dSYhS 0riWG1WqR+/a6jlJBUdJHRoHQvR6GDBpTafUTp+yFoJcSA4bo8OhA7nfkj5ZEYIyDsSgUBB4SXw g8wwrRTRXTsCXc5aE3GtlDnN21OldkhyMIgxlxi92WvAT4/2dqoLdsAAej5QyNu58c+H0NQRN2t jmFAOdroiUWXLs1A4NHy+/Y8IoZ69X+Dga7iIBh+tgGvQpxNhHu0JDN8tVCUH95nHg4+erYpt40 SpcVSfYpkbVLlhBdNydurl1j4BOaDzvHuBnGc0ZYuqIdFmBGCQJCWvKlyHpCraItyg9skd7UKU/ 9Bgy2yMmyKYtIThrbd3316c9WINohF9Shx9D9NH+TForyLTG3gesu5wLuAR88Bl5d3PUlnD6oHO f0FPxP85f56eSyfObxOBwjjpdaT+Lii/6I2iGqg+sB5PwV0BrfocxI9AEIDgmd3cgz1ICiHDJJz G9iQYo5Z5dgZABw1OJVUsFIqA== X-Received: by 2002:a05:6300:6708:b0:3d3:ae40:51e3 with SMTP id adf61e73a8af0-3dd5f702df7mr8337741637.23.1789577028021; Wed, 16 Sep 2026 09:43:48 -0700 (PDT) Received: from d.home.yangfl.dn42 ([2a09:bac5:661a:1232::1d0:c5]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-cc50acc757csm1902278a12.32.2026.09.16.09.43.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 16 Sep 2026 09:43:47 -0700 (PDT) From: David Yang To: netdev@vger.kernel.org Cc: David Yang , Andrew Lunn , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Russell King , linux-kernel@vger.kernel.org Subject: [PATCH net-next v2 6/8] net: dsa: motorcomm: Hoist port_to_priv helper into chip.h Date: Thu, 17 Sep 2026 00:43:06 +0800 Message-ID: <20260916164310.3168269-7-mmyangfl@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260916164310.3168269-1-mmyangfl@gmail.com> References: <20260916164310.3168269-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 --- 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 aac550bb4f72..e7fa5557ec81 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 04:40:47 2026 Received: from mail-pz2-f41.google.com (mail-pz2-f41.google.com [74.125.228.41]) (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 0F3424C651F for ; Wed, 16 Sep 2026 16:43:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.228.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789577053; cv=none; b=KXTWdR/a7oE6aWE9IR3rjWpAFoPCDFMzmBwlWLKdM/7EOBKSQ9EkM1Elhbswd6ZcV1ZyakYPTQIRFImiiAgSeLM2kviw4TTa+P49BcS2NMKV4mO4JsUaKdxzKjwoeqT+2DF/TS+UuhQUeDUKR3wkCMswI0L8t7ihSlbt+StrQQw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789577053; c=relaxed/simple; bh=F2Prgz29T+jTiEa6vcQe1q6NIeuBEr97mTPeLD6h+IM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=E1FDCcrNGfAfNTKKS3ReKezvs+s26AvfzrUl14sKX/dz4nwNSRqRdC8P8Ibez20sISJzYWXRNfQXJJWG3p+SKgSc9j2ID5wiXiuq6WSL+OdX70tTd5ceJjCItkd6nYBaR8687JXyDvasQAC0M6j8VF3mEmytihq66c+w6Twh8zk= 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=NAfrVjrG; arc=none smtp.client-ip=74.125.228.41 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="NAfrVjrG" Received: by mail-pz2-f41.google.com with SMTP id d2e1a72fcca58-85469b2e1d5so1022782b3a.1 for ; Wed, 16 Sep 2026 09:43:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1789577031; x=1790181831; 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=2+2Q3mTjdDlrxij5IsS30F/SyZaUVlGmYVSRkzfKqyo=; b=NAfrVjrGmbU5wtWco8CxLNoKZvw3eTWaUMSdNkpduXuXBoD7n6DVY5WGzCKMn2LOZf KCv+Judnv9CN8aBlZiXWbSDWmUXomdM3R8aEUVeE17p4cAHaoAadqr8elNhvMVPgKhS3 /G6/WuBTYnJfE9wKlFYYR5ud5vHtGyYuy1YhnzV5Zolo+w/Iw/62jPwPpqIcZ0Sy0ujk C0HBTO80QlIzoN7WnXXysCUZVIN9LQDbWznyD6/hERXTS893WzWy+ROaq4E9maWixmpV xJkqc9MW8ZhcUMq3LJ5nz6+hR6iRl7ErURz7HbqsXoIXhO4ee+EiFEVqPZiURlm+ANiM UyzA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789577031; x=1790181831; 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=2+2Q3mTjdDlrxij5IsS30F/SyZaUVlGmYVSRkzfKqyo=; b=UNUCze8UaR2OGL7SKf/ZO2f7ImxybhF4vxZgBOz160R+wlWSj7i4hLdOgnEVq0VWy6 Qg/JEojtkyPDTX2wcAsbvH/L1Bruq4Qp3rH3cc5xZDxh6rFAwMDglbwvJ0aLq25qlfe0 7LTLQcyrIrTpa1+Jw0xgxoDz3skJTnXM4RVjqYlX7nH8oMteYFcHVybM3b72QY6jw94P 79L0XIEXYo0UYuwx/5mlmbtOFA6xcOaeRqIn9tipkNRfwiXNsqmnbVE/ffdgG7+5AbN+ lZjgiy9tmIZfD2s+0MjqR2DACI8Tm2AaVRBfywGnghmVanndguq4O8GAlpCLRE0S3Kt/ HLrA== X-Forwarded-Encrypted: i=1; AKwUvBxGG+8H2bLCHYcBpChL4OWRge8pQOjgVDYqYASfdmBAbQiHBb3fUOII5D3NJgqpepPPYevSfOaK1hLIQF4=@vger.kernel.org X-Gm-Message-State: AFuF++lrg1K+0jRtlASj2WOToiyERdbbNPRAinaaB9cfQn6kxxbl9BEt rYAXWiNgPlrxsLfurIQeKE9+ZTCuO8pQ0NQ0i+918+ZwvinEoahvC2ui X-Gm-Gg: AYBFou2iGOlRzM91CAds0av//lprLeftTMlW7t2hoa7XgftEa2n9/+cjyHgiSlcjHEg Ya0t1ru1OMYoG5bTojlewftsXqY30+4ASw2e7qGsTRwOKwj4g2N26fmzchQc2viMN1YJkXwQgdS tqd2wmU/10hZaE3PoXnOzrvuvyP1sSKlOSgg+yE25irfRYwgf6SjVNGrDRSLm/vXtT2YoX3bVZS Vb6Zm3tB5fnlJ8TIhDQhwSl2jlyTHqUiXyNfa/d/nwsk/QMkLSWNqGL2qpsHOR3iNr5+K3Qtmfx kQYjSrfXO2lt2plcZmi+nRNR/zgRMmR1EmM+PHiRPzgDKBzqelsSy9UDmR/lOfzbfZrw4GEC+dG Pt6aKMCe+740/0SnouWnZ1lw1Onf1eqdqSgXS2hz7sEAO0/aSM2qfi6ushM5ME/bTOkeqm1iZG+ w/kylYSXT6/FvE2aMLlvmoCo0bSiaEuumTtdbtQ0FB1rY8lAuQbagIcNcS6MNTF1hNlClJYM12u 0F3ZqY8D0yLY4fDXZz5AVm+fUtjGW2edga3 X-Received: by 2002:a05:6a20:9d93:b0:3da:9f19:bf2 with SMTP id adf61e73a8af0-3dd5f5c7a3dmr9686951637.18.1789577030891; Wed, 16 Sep 2026 09:43:50 -0700 (PDT) Received: from d.home.yangfl.dn42 ([2a09:bac5:661a:1232::1d0:c5]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-cc50acc757csm1902278a12.32.2026.09.16.09.43.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 16 Sep 2026 09:43:50 -0700 (PDT) From: David Yang To: netdev@vger.kernel.org Cc: David Yang , Andrew Lunn , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Russell King , linux-kernel@vger.kernel.org Subject: [PATCH net-next v2 7/8] net: dsa: motorcomm: Split MDIO bus module Date: Thu, 17 Sep 2026 00:43:07 +0800 Message-ID: <20260916164310.3168269-8-mmyangfl@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260916164310.3168269-1-mmyangfl@gmail.com> References: <20260916164310.3168269-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 --- 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 e7fa5557ec81..c7a8004ce34a 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 04:40:47 2026 Received: from mail-pz2-f12.google.com (mail-pz2-f12.google.com [74.125.228.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2A9FC4CEE70 for ; Wed, 16 Sep 2026 16:43:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.228.12 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789577043; cv=none; b=hdrmutBvKvoDOds9JM1RbSoScC1S2FxKRjS+yFxFIQrSIFIEDQDcmjrscKpSsAPSxCMZ2pwopNyo6FbsNfmCjAYC8vFqneW/hza2CTbuuBkdRrsnkfxQiX7VE8LwifMqdnCfpIsWHQmQStASeaMt6BG41y3nS/E6RAJmi0DN/po= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789577043; c=relaxed/simple; bh=VewGv01dzeArNwz6G4oTQ7PUYU/ujavLp1cXDQYa58Q=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=CAGuA43uyvZ9UKFsElabhKytad9cuC+sRgQIkrIxqTN1ePkQtJtT0xUTk0sDtX6Y5VuNl1pDDaM7hOOMgdX5NrUpraGhhTPBDBsf2GqNa2T1ks7oKBsruc2Tq0ELCBmL0jQ9N6W0w2M5zw3Dzc+/SensxEMQ3byKKFh2npoHQ08= 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=RlaS27U5; arc=none smtp.client-ip=74.125.228.12 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="RlaS27U5" Received: by mail-pz2-f12.google.com with SMTP id 41be03b00d2f7-cc1cea48edcso883410a12.2 for ; Wed, 16 Sep 2026 09:43:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1789577034; x=1790181834; 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=eqHY/HHhqcI64MdlILGee2ugK76bq9SvJgTA/Q/klAg=; b=RlaS27U5GAiMDv9FFMaSA464jvCzw5uejDMxWWR+C/7UD+1TJaFZ2WdIj9iRCNYbOk aSu6yS/E0zXSW04qCSE+62paAhhIeAaToS2jrCnzZ9LVEvSTCWaGQSGlM88UWB8lvMlt ZgrZpSo9BaJ6BgIWbo+kXpTDnZrhsdy6+wBt+uoBuSjTol1HWGbiWWfPinvUIG2hOCRY 5xgmGjRRW9gmqZAQ1m7UTGWs03Cgj+0rT7jUCkSYETlC2yQ9jU5xtm5OyS9qwURSkt8V renyvz0uB9a09EgGyvsYvYsUqqh1esUxupJkooVQ52QzFSS+SvBh+VCqqoN3n1bV+dor DMRQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789577034; x=1790181834; 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=eqHY/HHhqcI64MdlILGee2ugK76bq9SvJgTA/Q/klAg=; b=vbTBRBGW18kCZFbmImENS66AsBvGgNvpEPyAlid3BABDGI5hdorro4aLrOzOjlb9vw 5umtDf3qbLUtmr6QLZv3aK6s9aVtGj/E4jZKHvGr2ZIryNJMIDAkfGkGq0M4Gx7ufYO0 nmDHxdwMtwBnk0y55jlUYMwN/mDHZNxlxg12RYy3NJsfLRLgKr3T+cPHrQHABVEqXuib fAOuItsqcNQU9NjZup5spfXhEbGwRxLi+oDw2YSJVhKKGHlyyRZJkCYaRM4DV1PMeYua u9jiRFKyihuyGW6xkSMVgS2wbwJHkx8bve5xhA+E5P7+gKZEMePd7xSlza36Bv7RVSZQ 2xZg== X-Forwarded-Encrypted: i=1; AKwUvBzkDmnVstdAQaFvNPJswy4v4Tvb8cywE4y09iiJIkuYFSR2Kho6J1YzJiQXc4SLdbaubwp9rpQ4gHaiqTg=@vger.kernel.org X-Gm-Message-State: AFuF++kWUzIvcnfSRTwpAOBgmV7prEHxh9pXGXrTjP9dXb/ZTqYhB4Cj 223KHIxEdzNWqc9m+3LwzFR7zDTsWSjO96Z9bhmA4TqW3jqtu8GfeLLN X-Gm-Gg: AYBFou0rcyjahOqlEA8fQDvVwhYrlIk/65rN1Xr5ZTp1wm0oc19qXA8OFoq+QgWn8QH xH4zxua1I0Sx+EMSpQcnt4jiA6Tzt4rnKvpNTNQ0vii5TNt7/XOFY8riYjal7kAjQt2yPmvD3N0 gfT6BYY6MO4YJsdFSxznYRetIcarogkG5+kG9Vyco0iCB1Ee4K3N6R8/GoSS06tLmTPRnn0LIou nIalNWTNdRlnCO2fSBJrbdnFKsa+Zt9hLkGTJ+JSMCqzkA4pDDNO9UCdMNaSgKfgWZTqZF6AvZn 9VGT7yb3LTtRucvVBdRGIzhe659gsn2EwwMH2vErMBZmdfpGRSPW5r5DvuXzT5fi9xhnc58ydVG lJxEuYuDkgFHZTxfXJJfThCV7blGWrydhejs8AJBzuCg6DcglIIUVDNi+vFEHebrt2bvBRWGAQt SvDogqgS0Jkdv4B8S7HlmExL/D/vIB2ICeqwEdKWt151wIwV4chRQFHdjU88ds9NuICsOn2wn5+ oXj/Fuq29lZkyXfeAs3IosZMA== X-Received: by 2002:a05:6a21:3294:b0:3d8:1f68:59ac with SMTP id adf61e73a8af0-3dd5f79ce3dmr7651251637.23.1789577034165; Wed, 16 Sep 2026 09:43:54 -0700 (PDT) Received: from d.home.yangfl.dn42 ([2a09:bac5:661a:1232::1d0:c5]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-cc50acc757csm1902278a12.32.2026.09.16.09.43.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 16 Sep 2026 09:43:53 -0700 (PDT) From: David Yang To: netdev@vger.kernel.org Cc: David Yang , Andrew Lunn , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Russell King , linux-kernel@vger.kernel.org Subject: [PATCH net-next v2 8/8] net: dsa: motorcomm: Add SerDes PCS Date: Thu, 17 Sep 2026 00:43:08 +0800 Message-ID: <20260916164310.3168269-9-mmyangfl@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260916164310.3168269-1-mmyangfl@gmail.com> References: <20260916164310.3168269-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 --- drivers/net/dsa/motorcomm/Makefile | 1 + drivers/net/dsa/motorcomm/chip.c | 61 ++++++- 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(+), 7 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 c7a8004ce34a..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) { @@ -3615,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) @@ -4202,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 @@ -4211,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); @@ -4244,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); @@ -4261,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