Message ID | 20231124050818.1221-1-quic_snehshah@quicinc.com |
---|---|
State | New |
Headers |
Return-Path: <linux-kernel-owner@vger.kernel.org> Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:ce62:0:b0:403:3b70:6f57 with SMTP id o2csp908017vqx; Thu, 23 Nov 2023 21:09:15 -0800 (PST) X-Google-Smtp-Source: AGHT+IGJRLkk8RTmVjnxRGahHny2yoJuDQMqWHaswpr6o+lAqvcMha5fbnTmzVSAKXnTL8JilHwo X-Received: by 2002:a9d:4812:0:b0:6b9:9cc0:537f with SMTP id c18-20020a9d4812000000b006b99cc0537fmr1677085otf.33.1700802555417; Thu, 23 Nov 2023 21:09:15 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1700802555; cv=none; d=google.com; s=arc-20160816; b=c5yfso461MJLO4mv6w2QTaVljIUdZkIO1Tyb51pQ7/duEhCYyLxfeCg12CRaA7ChSD Oe/dsLRzGBdCmJokFsIgiQ4RaM3mnL+kOWRB/tp7QpcBE59jS5jB1rtgP+biPIUltBM9 cW0ArBu+299FlU+wF3yy5LdH16+BaZ0DJB5p2Fa4UAQB5LH5G7aEZXAVFLca9stXKoUk JSR5jRravBj/HzoeNHTzZVhwLc00B2u5UtLW/CGJH29eHSvnpvUPw2tMfXeKt4wI4qvy DceyVIrVolpjoTUqjn71Mc1/k7WG8aS+fPMYsDujQBdiJl4Nr+SnyFpxi1SjtOl0fY4A GL4Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:message-id:date:subject:cc:to:from :dkim-signature; bh=izkBQImg/TjzbwWFvoo0zSUxS/DMKyakfBpX5vZNJZY=; fh=1Jy5qpJ7e4FuBmQkVP0GCA4F+wDSel+w4r34NwoYij8=; b=WWBfkKdNg4QndQAuinL2Aqtj/LVoYfeLt7iZoKfO8iV3oUqh+Zy2sEC17+vuc6fEab rVicKyifRcgXpqyv/ZeKeaK1XmJOesPeSlpiQSELz9Z7fsxaq44uG9B/mCJdlHGKX8d5 +yyxr07e6a/EXGUezQxsOhz85BLOt6wQMHGKCKY3ly6o/NznRLBfNDhdhyX/uOks6JbN KsYkp022DlCnWCaINXXB7IlR2uJhpKXUQx6r3PSTMdD5E6zQIFgSwGFl0I94O8phsrR5 QGfdSa6/rGGPpvDUfBfyGjicqnfeNOUBd+2iyBQKjn8MZIZ4XDlUQLIsq2q6rq1mBcD0 IUrw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@quicinc.com header.s=qcppdkim1 header.b=PL2QT++9; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:3 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=quicinc.com Received: from lipwig.vger.email (lipwig.vger.email. [2620:137:e000::3:3]) by mx.google.com with ESMTPS id u9-20020a631409000000b005859b2d8d7asi2678883pgl.4.2023.11.23.21.09.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 23 Nov 2023 21:09:15 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:3 as permitted sender) client-ip=2620:137:e000::3:3; Authentication-Results: mx.google.com; dkim=pass header.i=@quicinc.com header.s=qcppdkim1 header.b=PL2QT++9; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:3 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=quicinc.com Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by lipwig.vger.email (Postfix) with ESMTP id 6736E829B8A5; Thu, 23 Nov 2023 21:09:12 -0800 (PST) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.11 at lipwig.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229769AbjKXFJD (ORCPT <rfc822;ouuuleilei@gmail.com> + 99 others); Fri, 24 Nov 2023 00:09:03 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43648 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231127AbjKXFJB (ORCPT <rfc822;linux-kernel@vger.kernel.org>); Fri, 24 Nov 2023 00:09:01 -0500 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5FEAFD71; Thu, 23 Nov 2023 21:09:08 -0800 (PST) Received: from pps.filterd (m0279865.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 3AO4Ha0q013621; Fri, 24 Nov 2023 05:08:34 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quicinc.com; h=from : to : cc : subject : date : message-id; s=qcppdkim1; bh=izkBQImg/TjzbwWFvoo0zSUxS/DMKyakfBpX5vZNJZY=; b=PL2QT++9iBWr/zas7GtBMaI6RaJsAH7ixLByYMkdZPcjhcQL/Df6sdg5pUQJgI6Pi1Cz u8xlh6OXwyOkNLHfef/oWKjFoGbywdFlccoT0MBS2RDYwaAr1REyJvP6+y5Dnzaj8hhi Gl6INKa6CZuZO+BlCfmONwhuKXTBXB1RCcCIXl8D5x+WVoI2A0Qqgo59jGOME/v1XDPk 3XMyPQtHy6GChurvqX4GCfTzbfOeuCKn2P9PPpVtSfmtGDtY8oWU5mu4uCMZV9sLf7AD cR/3OTP0cVl3GiTlwtP90kJteNRBdsrWLYuqdYircZom9NlfnCaSdubip3J6LHm3yXmz Fw== Received: from apblrppmta02.qualcomm.com (blr-bdr-fw-01_GlobalNAT_AllZones-Outside.qualcomm.com [103.229.18.19]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 3uhwmearxq-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 24 Nov 2023 05:08:34 +0000 Received: from pps.filterd (APBLRPPMTA02.qualcomm.com [127.0.0.1]) by APBLRPPMTA02.qualcomm.com (8.17.1.5/8.17.1.5) with ESMTP id 3AO58U1W008057; Fri, 24 Nov 2023 05:08:30 GMT Received: from pps.reinject (localhost [127.0.0.1]) by APBLRPPMTA02.qualcomm.com (PPS) with ESMTP id 3uepbkmrdf-1; Fri, 24 Nov 2023 05:08:30 +0000 Received: from APBLRPPMTA02.qualcomm.com (APBLRPPMTA02.qualcomm.com [127.0.0.1]) by pps.reinject (8.17.1.5/8.17.1.5) with ESMTP id 3AO58T5O008052; Fri, 24 Nov 2023 05:08:30 GMT Received: from hu-maiyas-hyd.qualcomm.com (hu-snehshah-hyd.qualcomm.com [10.147.246.35]) by APBLRPPMTA02.qualcomm.com (PPS) with ESMTP id 3AO58Tke008050; Fri, 24 Nov 2023 05:08:29 +0000 Received: by hu-maiyas-hyd.qualcomm.com (Postfix, from userid 2319345) id E29925299C4; Fri, 24 Nov 2023 10:38:28 +0530 (+0530) From: Sneh Shah <quic_snehshah@quicinc.com> To: Vinod Koul <vkoul@kernel.org>, Bhupesh Sharma <bhupesh.sharma@linaro.org>, Alexandre Torgue <alexandre.torgue@foss.st.com>, Jose Abreu <joabreu@synopsys.com>, "David S. Miller" <davem@davemloft.net>, Eric Dumazet <edumazet@google.com>, Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>, Maxime Coquelin <mcoquelin.stm32@gmail.com>, netdev@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-stm32@st-md-mailman.stormreply.com, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Cc: Sneh Shah <quic_snehshah@quicinc.com>, kernel@quicinc.com, Andrew Halaney <ahalaney@redhat.com> Subject: [PATCH net] net: stmmac: update Rx clk divider for 10M SGMII Date: Fri, 24 Nov 2023 10:38:18 +0530 Message-Id: <20231124050818.1221-1-quic_snehshah@quicinc.com> X-Mailer: git-send-email 2.17.1 X-QCInternal: smtphost X-QCInternal: smtphost X-Proofpoint-Virus-Version: vendor=nai engine=6200 definitions=5800 signatures=585085 X-Proofpoint-Virus-Version: vendor=nai engine=6200 definitions=5800 signatures=585085 X-Proofpoint-GUID: YJ2KeQV5hKZDAsVYZTG0luH-FmCxpuMW X-Proofpoint-ORIG-GUID: YJ2KeQV5hKZDAsVYZTG0luH-FmCxpuMW X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.272,Aquarius:18.0.987,Hydra:6.0.619,FMLib:17.11.176.26 definitions=2023-11-23_15,2023-11-22_01,2023-05-22_02 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 clxscore=1011 priorityscore=1501 malwarescore=0 mlxlogscore=701 lowpriorityscore=0 impostorscore=0 mlxscore=0 adultscore=0 bulkscore=0 spamscore=0 phishscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2311060000 definitions=main-2311240038 X-Spam-Status: No, score=-0.9 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI, SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lipwig.vger.email Precedence: bulk List-ID: <linux-kernel.vger.kernel.org> X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (lipwig.vger.email [0.0.0.0]); Thu, 23 Nov 2023 21:09:12 -0800 (PST) X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1783420740217789060 X-GMAIL-MSGID: 1783420740217789060 |
Series |
[net] net: stmmac: update Rx clk divider for 10M SGMII
|
|
Commit Message
Sneh Shah
Nov. 24, 2023, 5:08 a.m. UTC
SGMII 10MBPS mode needs RX clock divider to avoid drops in Rx.
Update configure SGMII function with rx clk divider programming.
Signed-off-by: Sneh Shah <quic_snehshah@quicinc.com>
---
drivers/net/ethernet/stmicro/stmmac/dwmac-qcom-ethqos.c | 3 +++
1 file changed, 3 insertions(+)
Comments
On 24-11-23, 10:38, Sneh Shah wrote: > SGMII 10MBPS mode needs RX clock divider to avoid drops in Rx. > Update configure SGMII function with rx clk divider programming. Acked-by: Vinod Koul <vkoul@kernel.org>
Hi Sneh, >---------------------------------------------------------------------- >SGMII 10MBPS mode needs RX clock divider to avoid drops in Rx. >Update configure SGMII function with rx clk divider programming. > [Suman] You need to add the Fixes tag as well. >Signed-off-by: Sneh Shah <quic_snehshah@quicinc.com> >--- > drivers/net/ethernet/stmicro/stmmac/dwmac-qcom-ethqos.c | 3 +++ > 1 file changed, 3 insertions(+) > >diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-qcom-ethqos.c >b/drivers/net/ethernet/stmicro/stmmac/dwmac-qcom-ethqos.c >index d3bf42d0fceb..f8c42e91a624 100644 >--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-qcom-ethqos.c >+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-qcom-ethqos.c >@@ -34,6 +34,7 @@ > #define RGMII_CONFIG_LOOPBACK_EN BIT(2) > #define RGMII_CONFIG_PROG_SWAP BIT(1) > #define RGMII_CONFIG_DDR_MODE BIT(0) >+#define RGMII_CONFIG_SGMII_CLK_DVDR GENMASK(18, 10) > > /* SDCC_HC_REG_DLL_CONFIG fields */ > #define SDCC_DLL_CONFIG_DLL_RST BIT(30) >@@ -617,6 +618,8 @@ static int ethqos_configure_sgmii(struct qcom_ethqos >*ethqos) > case SPEED_10: > val |= ETHQOS_MAC_CTRL_PORT_SEL; > val &= ~ETHQOS_MAC_CTRL_SPEED_MODE; >+ rgmii_updatel(ethqos, RGMII_CONFIG_SGMII_CLK_DVDR, BIT(10) | >+ GENMASK(15, 14), RGMII_IO_MACRO_CONFIG); > break; > } > >-- >2.17.1 >
On Fri, Nov 24, 2023 at 10:38:18AM +0530, Sneh Shah wrote: > #define RGMII_CONFIG_LOOPBACK_EN BIT(2) > #define RGMII_CONFIG_PROG_SWAP BIT(1) > #define RGMII_CONFIG_DDR_MODE BIT(0) > +#define RGMII_CONFIG_SGMII_CLK_DVDR GENMASK(18, 10) So you're saying here that this is a 9 bit field... > @@ -617,6 +618,8 @@ static int ethqos_configure_sgmii(struct qcom_ethqos *ethqos) > case SPEED_10: > val |= ETHQOS_MAC_CTRL_PORT_SEL; > val &= ~ETHQOS_MAC_CTRL_SPEED_MODE; > + rgmii_updatel(ethqos, RGMII_CONFIG_SGMII_CLK_DVDR, BIT(10) | > + GENMASK(15, 14), RGMII_IO_MACRO_CONFIG); ... and then you use GENMASK(15,14) | BIT(10) here to set bits in that bitfield. If there are multiple bitfields, then these should be defined separately and the mask built up. I suspect that they aren't, and you're using this to generate a _value_ that has bits 5, 4, and 0 set for something that really takes a _value_. So, FIELD_PREP(RGMII_CONFIG_SGMII_CLK_DVDR, 0x31) or FIELD_PREP(RGMII_CONFIG_SGMII_CLK_DVDR, 49) would be entirely correct here. The next concern I have is that you're only doing this for SPEED_10. If it needs to be programmed for SPEED_10 to work, and not any of the other speeds, isn't this something that can be done at initialisation time? If it has to be done depending on the speed, then don't you need to do this for each speed with an appropriate value?
You are right here for GENMASK(15,14) | BIT(10). I am using this to create a field value.I will switch to FIELD_PREP as that seems like a better way to do this. This field programming is required only for 10M speed in for SGMII mode. other speeds are agnostic to this field. Hence we are programming it always when SGMII link comes up in 10M mode. init driver data for ethqos is common for sgmii and rgmii. As this fix is specific to SGMII we can't add this to init driver data. On 11/24/2023 2:42 PM, Russell King (Oracle) wrote: > On Fri, Nov 24, 2023 at 10:38:18AM +0530, Sneh Shah wrote: >> #define RGMII_CONFIG_LOOPBACK_EN BIT(2) >> #define RGMII_CONFIG_PROG_SWAP BIT(1) >> #define RGMII_CONFIG_DDR_MODE BIT(0) >> +#define RGMII_CONFIG_SGMII_CLK_DVDR GENMASK(18, 10) > > So you're saying here that this is a 9 bit field... > >> @@ -617,6 +618,8 @@ static int ethqos_configure_sgmii(struct qcom_ethqos *ethqos) >> case SPEED_10: >> val |= ETHQOS_MAC_CTRL_PORT_SEL; >> val &= ~ETHQOS_MAC_CTRL_SPEED_MODE; >> + rgmii_updatel(ethqos, RGMII_CONFIG_SGMII_CLK_DVDR, BIT(10) | >> + GENMASK(15, 14), RGMII_IO_MACRO_CONFIG); > > ... and then you use GENMASK(15,14) | BIT(10) here to set bits in that > bitfield. If there are multiple bitfields, then these should be defined > separately and the mask built up. > > I suspect that they aren't, and you're using this to generate a _value_ > that has bits 5, 4, and 0 set for something that really takes a _value_. > So, FIELD_PREP(RGMII_CONFIG_SGMII_CLK_DVDR, 0x31) or > FIELD_PREP(RGMII_CONFIG_SGMII_CLK_DVDR, 49) would be entirely correct > here. > > The next concern I have is that you're only doing this for SPEED_10. > If it needs to be programmed for SPEED_10 to work, and not any of the > other speeds, isn't this something that can be done at initialisation > time? If it has to be done depending on the speed, then don't you need > to do this for each speed with an appropriate value? >
Please reply _inline_ rather than at the top of the message, just like every other email that is sent in the Linux community. It is actually the _Internet_ standard way of replying, before people like Microsoft encouraged your broken style. Also wrapping the text of your message makes it easier. On Mon, Nov 27, 2023 at 11:25:34AM +0530, Sneh Shah wrote: > On 11/24/2023 2:42 PM, Russell King (Oracle) wrote: > > On Fri, Nov 24, 2023 at 10:38:18AM +0530, Sneh Shah wrote: > >> #define RGMII_CONFIG_LOOPBACK_EN BIT(2) > >> #define RGMII_CONFIG_PROG_SWAP BIT(1) > >> #define RGMII_CONFIG_DDR_MODE BIT(0) > >> +#define RGMII_CONFIG_SGMII_CLK_DVDR GENMASK(18, 10) > > > > So you're saying here that this is a 9 bit field... > > > >> @@ -617,6 +618,8 @@ static int ethqos_configure_sgmii(struct qcom_ethqos *ethqos) > >> case SPEED_10: > >> val |= ETHQOS_MAC_CTRL_PORT_SEL; > >> val &= ~ETHQOS_MAC_CTRL_SPEED_MODE; > >> + rgmii_updatel(ethqos, RGMII_CONFIG_SGMII_CLK_DVDR, BIT(10) | > >> + GENMASK(15, 14), RGMII_IO_MACRO_CONFIG); > > > > ... and then you use GENMASK(15,14) | BIT(10) here to set bits in that > > bitfield. If there are multiple bitfields, then these should be defined > > separately and the mask built up. > > > > I suspect that they aren't, and you're using this to generate a _value_ > > that has bits 5, 4, and 0 set for something that really takes a _value_. > > So, FIELD_PREP(RGMII_CONFIG_SGMII_CLK_DVDR, 0x31) or > > FIELD_PREP(RGMII_CONFIG_SGMII_CLK_DVDR, 49) would be entirely correct > > here. > > You are right here for GENMASK(15,14) | BIT(10). I am using this to create a field value.I will switch to FIELD_PREP as that seems like a better way to do this. So this is a "nice" example of taking the use of GENMASK() and BIT() to an inappropriate case. > > The next concern I have is that you're only doing this for SPEED_10. > > If it needs to be programmed for SPEED_10 to work, and not any of the > > other speeds, isn't this something that can be done at initialisation > > time? If it has to be done depending on the speed, then don't you need > > to do this for each speed with an appropriate value? > > This field programming is required only for 10M speed in for SGMII mode. other speeds are agnostic to this field. Hence we are programming it always when SGMII link comes up in 10M mode. init driver data for ethqos is common for sgmii and rgmii. As this fix is specific to SGMII we can't add this to init driver data. I wasn't referring to adding it to driver data. I was asking whether it could be done in the initialisation path.
On 11/27/2023 2:09 PM, Russell King (Oracle) wrote: > Please reply _inline_ rather than at the top of the message, just like > every other email that is sent in the Linux community. It is actually > the _Internet_ standard way of replying, before people like Microsoft > encouraged your broken style. > > Also wrapping the text of your message makes it easier. Noted. Going forward will make sure to reply inline. > > On Mon, Nov 27, 2023 at 11:25:34AM +0530, Sneh Shah wrote: >> On 11/24/2023 2:42 PM, Russell King (Oracle) wrote: >>> On Fri, Nov 24, 2023 at 10:38:18AM +0530, Sneh Shah wrote: >>>> #define RGMII_CONFIG_LOOPBACK_EN BIT(2) >>>> #define RGMII_CONFIG_PROG_SWAP BIT(1) >>>> #define RGMII_CONFIG_DDR_MODE BIT(0) >>>> +#define RGMII_CONFIG_SGMII_CLK_DVDR GENMASK(18, 10) >>> >>> So you're saying here that this is a 9 bit field... >>> >>>> @@ -617,6 +618,8 @@ static int ethqos_configure_sgmii(struct qcom_ethqos *ethqos) >>>> case SPEED_10: >>>> val |= ETHQOS_MAC_CTRL_PORT_SEL; >>>> val &= ~ETHQOS_MAC_CTRL_SPEED_MODE; >>>> + rgmii_updatel(ethqos, RGMII_CONFIG_SGMII_CLK_DVDR, BIT(10) | >>>> + GENMASK(15, 14), RGMII_IO_MACRO_CONFIG); >>> >>> ... and then you use GENMASK(15,14) | BIT(10) here to set bits in that >>> bitfield. If there are multiple bitfields, then these should be defined >>> separately and the mask built up. >>> >>> I suspect that they aren't, and you're using this to generate a _value_ >>> that has bits 5, 4, and 0 set for something that really takes a _value_. >>> So, FIELD_PREP(RGMII_CONFIG_SGMII_CLK_DVDR, 0x31) or >>> FIELD_PREP(RGMII_CONFIG_SGMII_CLK_DVDR, 49) would be entirely correct >>> here. >> >> You are right here for GENMASK(15,14) | BIT(10). I am using this to create a field value.I will switch to FIELD_PREP as that seems like a better way to do this. > > So this is a "nice" example of taking the use of GENMASK() and BIT() to > an inappropriate case. > >>> The next concern I have is that you're only doing this for SPEED_10. >>> If it needs to be programmed for SPEED_10 to work, and not any of the >>> other speeds, isn't this something that can be done at initialisation >>> time? If it has to be done depending on the speed, then don't you need >>> to do this for each speed with an appropriate value? >> >> This field programming is required only for 10M speed in for SGMII mode. other speeds are agnostic to this field. Hence we are programming it always when SGMII link comes up in 10M mode. init driver data for ethqos is common for sgmii and rgmii. As this fix is specific to SGMII we can't add this to init driver data. > > I wasn't referring to adding it to driver data. I was asking whether it > could be done in the initialisation path. > No, IOMACRO block is configured post phylink up regardless of RGMII or SGMII mode. We are not updating them at driver initialization time itself.
On Mon, Nov 27, 2023 at 03:17:20PM +0530, Sneh Shah wrote: > On 11/27/2023 2:09 PM, Russell King (Oracle) wrote: > > On Mon, Nov 27, 2023 at 11:25:34AM +0530, Sneh Shah wrote: > >> On 11/24/2023 2:42 PM, Russell King (Oracle) wrote: > >>> The next concern I have is that you're only doing this for SPEED_10. > >>> If it needs to be programmed for SPEED_10 to work, and not any of the > >>> other speeds, isn't this something that can be done at initialisation > >>> time? If it has to be done depending on the speed, then don't you need > >>> to do this for each speed with an appropriate value? > >> > >> This field programming is required only for 10M speed in for SGMII mode. other speeds are agnostic to this field. Hence we are programming it always when SGMII link comes up in 10M mode. init driver data for ethqos is common for sgmii and rgmii. As this fix is specific to SGMII we can't add this to init driver data. > > > > I wasn't referring to adding it to driver data. I was asking whether it > > could be done in the initialisation path. > > > No, IOMACRO block is configured post phylink up regardless of RGMII or SGMII mode. We are not updating them at driver initialization time itself. What reason (in terms of the hardware) requires you to do this every time you select 10M speed? Does the hardware change the value in the register?
On 11/27/2023 3:35 PM, Russell King (Oracle) wrote: > On Mon, Nov 27, 2023 at 03:17:20PM +0530, Sneh Shah wrote: >> On 11/27/2023 2:09 PM, Russell King (Oracle) wrote: >>> On Mon, Nov 27, 2023 at 11:25:34AM +0530, Sneh Shah wrote: >>>> On 11/24/2023 2:42 PM, Russell King (Oracle) wrote: >>>>> The next concern I have is that you're only doing this for SPEED_10. >>>>> If it needs to be programmed for SPEED_10 to work, and not any of the >>>>> other speeds, isn't this something that can be done at initialisation >>>>> time? If it has to be done depending on the speed, then don't you need >>>>> to do this for each speed with an appropriate value? >>>> >>>> This field programming is required only for 10M speed in for SGMII mode. other speeds are agnostic to this field. Hence we are programming it always when SGMII link comes up in 10M mode. init driver data for ethqos is common for sgmii and rgmii. As this fix is specific to SGMII we can't add this to init driver data. >>> >>> I wasn't referring to adding it to driver data. I was asking whether it >>> could be done in the initialisation path. >>> >> No, IOMACRO block is configured post phylink up regardless of RGMII or SGMII mode. We are not updating them at driver initialization time itself. > > What reason (in terms of the hardware) requires you to do this every > time you select 10M speed? Does the hardware change the value in the > register? > Yes, the hardware changes the value in register every time the interface is toggled. That is the reason we have ethqos_configure_sgmii function to configure registers whenever there is link activity.
On Wed, Nov 29, 2023 at 04:56:53PM +0530, Sneh Shah wrote: > > > On 11/27/2023 3:35 PM, Russell King (Oracle) wrote: > > On Mon, Nov 27, 2023 at 03:17:20PM +0530, Sneh Shah wrote: > >> On 11/27/2023 2:09 PM, Russell King (Oracle) wrote: > >>> On Mon, Nov 27, 2023 at 11:25:34AM +0530, Sneh Shah wrote: > >>>> On 11/24/2023 2:42 PM, Russell King (Oracle) wrote: > >>>>> The next concern I have is that you're only doing this for SPEED_10. > >>>>> If it needs to be programmed for SPEED_10 to work, and not any of the > >>>>> other speeds, isn't this something that can be done at initialisation > >>>>> time? If it has to be done depending on the speed, then don't you need > >>>>> to do this for each speed with an appropriate value? > >>>> > >>>> This field programming is required only for 10M speed in for SGMII mode. other speeds are agnostic to this field. Hence we are programming it always when SGMII link comes up in 10M mode. init driver data for ethqos is common for sgmii and rgmii. As this fix is specific to SGMII we can't add this to init driver data. > >>> > >>> I wasn't referring to adding it to driver data. I was asking whether it > >>> could be done in the initialisation path. > >>> > >> No, IOMACRO block is configured post phylink up regardless of RGMII or SGMII mode. We are not updating them at driver initialization time itself. > > > > What reason (in terms of the hardware) requires you to do this every > > time you select 10M speed? Does the hardware change the value in the > > register? > > > Yes, the hardware changes the value in register every time the interface is toggled. That is the reason we have ethqos_configure_sgmii function to configure registers whenever there is link activity. That is sufficient reason to write it each time - and it would be good to mention this in a comment above the write in ethqos_configure_sgmii(). Thanks.
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-qcom-ethqos.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-qcom-ethqos.c index d3bf42d0fceb..f8c42e91a624 100644 --- a/drivers/net/ethernet/stmicro/stmmac/dwmac-qcom-ethqos.c +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-qcom-ethqos.c @@ -34,6 +34,7 @@ #define RGMII_CONFIG_LOOPBACK_EN BIT(2) #define RGMII_CONFIG_PROG_SWAP BIT(1) #define RGMII_CONFIG_DDR_MODE BIT(0) +#define RGMII_CONFIG_SGMII_CLK_DVDR GENMASK(18, 10) /* SDCC_HC_REG_DLL_CONFIG fields */ #define SDCC_DLL_CONFIG_DLL_RST BIT(30) @@ -617,6 +618,8 @@ static int ethqos_configure_sgmii(struct qcom_ethqos *ethqos) case SPEED_10: val |= ETHQOS_MAC_CTRL_PORT_SEL; val &= ~ETHQOS_MAC_CTRL_SPEED_MODE; + rgmii_updatel(ethqos, RGMII_CONFIG_SGMII_CLK_DVDR, BIT(10) | + GENMASK(15, 14), RGMII_IO_MACRO_CONFIG); break; }