From patchwork Thu Aug 10 13:47:04 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Florinel Iordache X-Patchwork-Id: 800207 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3xSqGw1HP3z9t2W for ; Thu, 10 Aug 2017 23:48:40 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752545AbdHJNs2 (ORCPT ); Thu, 10 Aug 2017 09:48:28 -0400 Received: from mail-by2nam03on0075.outbound.protection.outlook.com ([104.47.42.75]:35472 "EHLO NAM03-BY2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752358AbdHJNsZ (ORCPT ); Thu, 10 Aug 2017 09:48:25 -0400 Received: from BN3PR03CA0093.namprd03.prod.outlook.com (2603:10b6:400:4::11) by MWHSPR01MB180.namprd03.prod.outlook.com (2603:10b6:301:7b::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.1.1320.16; Thu, 10 Aug 2017 13:48:24 +0000 Received: from BN1AFFO11FD048.protection.gbl (2a01:111:f400:7c10::176) by BN3PR03CA0093.outlook.office365.com (2603:10b6:400:4::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.1.1341.17 via Frontend Transport; Thu, 10 Aug 2017 13:48:23 +0000 Authentication-Results: spf=fail (sender IP is 192.88.158.2) smtp.mailfrom=nxp.com; nxp.com; dkim=none (message not signed) header.d=none;nxp.com; dmarc=fail action=none header.from=nxp.com; Received-SPF: Fail (protection.outlook.com: domain of nxp.com does not designate 192.88.158.2 as permitted sender) receiver=protection.outlook.com; client-ip=192.88.158.2; helo=az84smr01.freescale.net; Received: from az84smr01.freescale.net (192.88.158.2) by BN1AFFO11FD048.mail.protection.outlook.com (10.58.53.63) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.1304.16 via Frontend Transport; Thu, 10 Aug 2017 13:48:23 +0000 Received: from fsr-ub1464-128.ea.freescale.net (fsr-ub1464-128.ea.freescale.net [10.171.72.50]) by az84smr01.freescale.net (8.14.3/8.14.0) with ESMTP id v7ADmKRq008584; Thu, 10 Aug 2017 06:48:20 -0700 From: Florinel Iordache To: CC: , , , , Florinel Iordache Subject: [PATCH net-next] fsl/fman: implement several errata workarounds Date: Thu, 10 Aug 2017 16:47:04 +0300 Message-ID: <1502372824-30180-1-git-send-email-florinel.iordache@nxp.com> X-Mailer: git-send-email 1.9.1 Reply-To: X-EOPAttributedMessage: 0 X-Matching-Connectors: 131468465041257140; (91ab9b29-cfa4-454e-5278-08d120cd25b8); () X-Forefront-Antispam-Report: CIP:192.88.158.2; IPV:NLI; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(10009020)(6009001)(336005)(39450400003)(39380400002)(39860400002)(39840400002)(39850400002)(39400400002)(39410400002)(2980300002)(1109001)(1110001)(339900001)(189002)(199003)(48376002)(6666003)(2351001)(86362001)(50466002)(69596002)(53936002)(77096006)(8656003)(97736004)(8936002)(43066003)(50226002)(106466001)(189998001)(68736007)(105606002)(47776003)(6916009)(38730400002)(5003940100001)(4326008)(626005)(110136004)(5660300001)(356003)(54906002)(305945005)(85426001)(33646002)(2906002)(36756003)(3450700001)(104016004)(498600001)(81156014)(81166006)(50986999)(8676002); DIR:OUT; SFP:1101; SCL:1; SRVR:MWHSPR01MB180; H:az84smr01.freescale.net; FPR:; SPF:Fail; PTR:InfoDomainNonexistent; MX:1; A:1; LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BN1AFFO11FD048; 1:0jNFhqo3G27cK76C3peQHFqvsZah/KLBlKlQBJ3tL?= =?us-ascii?Q?x0dc+O7JPXS979i9BIVj32hHeRBL3RqNqUSZUCrGGZBlY/N7+RkMDtbemEzy?= =?us-ascii?Q?uw9k5KA5PpV4WSQiftX4Dhp9YLCkU+cK1kzaiW1djRzjzSV1dY8puI+PUuKH?= =?us-ascii?Q?quu2hsz1Hz8lEDxYE2DbBwVYhUN3jpu1dXCQ52PMZQDaZcpOT6ExvSXoO8qV?= =?us-ascii?Q?9rewXKqmypRcXsAhWpRUwwqc4SzVp8/fFwVb6sjiCz4RnrpzpSKuiKTjyFuy?= =?us-ascii?Q?a5y3XPtpvXFa54XWtVVApzR1fFU9eeJDi05JcPXPmEinhoU4DSuCDklh/rtJ?= =?us-ascii?Q?LzklEOaCYxwjKCM+keUS1A2mWKqLTfyglSl8PDlWDxoFV45LCeoYVNLO+t3A?= =?us-ascii?Q?IVcr4BxQgGwnZGWYIz3YVGPCr3RwMz9tgMGp0gelybVR1me+Zoo0GJ9A4Hcm?= =?us-ascii?Q?8IMPvG6kTNu7xHpoZaNk6SLUuHwhMTbBwTE1Gp6zTTLjfctUv+uZJ55U8ik8?= =?us-ascii?Q?WK4FTTsNeQv8XDN1aEZ+pjFftlIWbfHvTfaKuJKDEFvygaareN6K0O7hMBuV?= =?us-ascii?Q?Mc1hmLNDNyfxY4axcdRmg6FPVSonzZTgjq6s++RRAiRQ6D0SdCKoBvXo1uqL?= =?us-ascii?Q?Fo/yVkzS8/sv7aCDY5e1+GE55PaNQDR1b6ws6o32o78LPiKi24Olpwd+NdfY?= =?us-ascii?Q?IHp1oEBi4WUh2nmWt9ZQ7mtI4cSIw+WZ9YC35pEZ87CpXKrWU90/nHZKNoDO?= =?us-ascii?Q?xi0p2+Ut5PQzEvN6x5D2XiVAhMIloTqms2YXOwhGc50OuxtygM7+Uu8l3tlN?= =?us-ascii?Q?+/uPLaOhd8q6MWsHVt80FsznKNsMrd60yNFiLmSNe2r8bPgpp1NyGITahbqn?= =?us-ascii?Q?+hAmRumwW0TFhl35hT2ihlPotlfOBq4+8o+kN2QTnaB1uZQdyyCIzM+X8DW9?= =?us-ascii?Q?5SppFXm1nhR/js96MYj3tI360eRO5YSdNbjmWVeqA=3D=3D?= MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: e0ee9d25-9709-44fd-d155-08d4dff67867 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(300000500095)(300135000095)(300000501095)(300135300095)(22001)(300000502095)(300135100095)(300000503095)(300135400095)(2017052603031)(201703131430075)(201703131517081)(300000504095)(300135200095)(300000505095)(300135600095)(300000506095)(300135500095); SRVR:MWHSPR01MB180; X-Microsoft-Exchange-Diagnostics: 1; MWHSPR01MB180; 3:sOBU+sQTPqE087bE7QFgH7hOojGlXj8YrSFhsfJhK+tHm6ACzVLIo+IzTLzB0Grqu7aNnvg8DDXn5SUGWbWCUJTmTAzhWbXJwijkgZtXydw3xJcZSkiQYq3ojJpePoPG6XJMQGVf4K5XXCOeWPX+UmMha/+ZAP3w5QteeHHMwgeYLQmDdaYo9wBRsg2MneSANnlKCQBx/VlnOXmsQELsIJlNSZBlNFzeJ0fgZ45FMHJ3nWLuPOYbI6ksDnBLVjdjdBmQLKqTR9MaDEUg7OuVFRiAjx+v4UuGgwdmgy0T0D4dDfr0BtaqWU4wVAQ+qfEKN537ixU9qvbbgZsmFslekA==; 25:EVU4jyCq7sUv03MzSfoV/FEWPMb9Q5vjce+CXSmy4uLBVn3ngd9foOgoNY73qfeS+cHebdl8z5uKnoKjx2dVliry/cgubFcnpqqGqBpOW6dlr91H/0hIDEtPknpkPJkaLK7B5bMhw3iDafZg7G1xW/ZAzY2lo51xPr2WJcX7ljm8MQ5e7g6zIQC3NGlrOt13BDyxqC//5lVPOcR8Jwki2iGDylpLLx2xladyryQ6S48ZqiVHfpUkwwKGoa1Rs1FxlFKxq5kvzTpZDyx8qMG3XRgqAwHVYVB2BMO6wNCyMH8f3s+pkzhBTh6h12xG3sQRsz38e4r2su08sJa7iFz2KQ==; 31:pERa4AikazZx6j6zaFuYoUsHy8Ulk6MAUGeNF/flCgayt6Kag5vZz9SzKbG8Ysb4qDszEk8ZpzkzYT7b2yeEjuGpeSnnAOwVgHUn93XcH6jCg7s82+t12zj1JtRRH8QopTK+DKjarLr1I27ijA3EJHLfzu1v0XWzxbOVuDqcBWkNjltDK5si6wx5ye1c1daCQNrvAMW5WJPb7W1Qpwirvho5fUCyyve2FSUp4AfQ/Bc= X-MS-TrafficTypeDiagnostic: MWHSPR01MB180: X-Exchange-Antispam-Report-Test: UriScan:(185117386973197); X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6095135)(601004)(2401047)(8121501046)(5005006)(13018025)(13016025)(93006095)(93001095)(10201501046)(100000703101)(100105400095)(3002001)(6055026)(6096035)(201703131430075)(201703131441075)(201703131448075)(201703131433075)(201703161259150)(20161123565025)(20161123563025)(20161123561025)(20161123556025)(20161123559100)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095); SRVR:MWHSPR01MB180; BCL:0; PCL:0; RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(400006)(100000804101)(100110200095)(100000805101)(100110500095); SRVR:MWHSPR01MB180; X-Microsoft-Exchange-Diagnostics: 1; MWHSPR01MB180; 4:xdKy3ufIdxfW8Lb/xBuCFgigsvRUGFMDswG9W1OrTAIXxkMofWevycmcUvGcNFbC+iRnTHcPYcW+duYegV8fCLVG9M6XMu6xEAqsPER1BfuO4Y01aKqy1LO3AjQUdC7Qm4YMsCMgAJg2o38qq5/WIeFvraKhdiRpxsImy5K0M/F1i38UW59fKkMMkTDwCijFPEGR75xsbIPjEAC5xfPgno7ybSKAmhH3z6v7iFqRraOZKIY+j2hVjPX+oevoN8P2lZD71QmUM4j1Q5GBDwguHt4lzA4HZ6BjjdI1LzgUJpM= X-Forefront-PRVS: 03950F25EC X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; MWHSPR01MB180; 23:1GU4q3549bm9fKwqxhV30dMnsAB9ZTUg+3MaNlbZT?= =?us-ascii?Q?errKRmEriRXDj2mcOG8tk5XuhgNhBRDhbss4qnxg740B8Oo+4ob18XVysauH?= =?us-ascii?Q?SedYR88d7wmN9sH9aeulTrgeJrdwpiLjatC1dN/mIrBKQOwz1OSbUnJlUPF5?= =?us-ascii?Q?R0wJ7KTv6ucYb3CSMRF545kZKf/BjT6qHpM6Puhq8h2HWCA5rgiEBmq35WqD?= =?us-ascii?Q?WhTqp/V4NGimxaoasaWRexWYabiby28dnsJuiXT9/PiaF136R5W0/TLVfm3o?= =?us-ascii?Q?FRJ/kHZSHLPpwZJyieMUI5jwLZmPCYDMIQiT+0PDOi9n4Laeb/4ZZBZ9jb07?= =?us-ascii?Q?h0lz5C34+MsCUXNPCM8vl0im7hC67PBA8JtiKBGo/VH0UOPybCknZzLPV2cY?= =?us-ascii?Q?Z8Ne9D07ihhsSjTDLRm9ZYavB+WLKDWBooScOtmnwN2Q1F4bKAjgnLvy+rNH?= =?us-ascii?Q?NEf7xwe/632XvC70AzW4g/yPOB3viOurUx3X6dbCqTVo6AUE+Ri60CbXFa8U?= =?us-ascii?Q?TmnzkC37ZIj+cM4Dwt3X/gj/J88FI4CNdp8W2HwXRXsV4w/7M2BwEtoWk4Ly?= =?us-ascii?Q?E82dhu1YIiO9rOM/JhD1Z7A3XiS5Pbzj/Cl1EST5r+TgzOI4IAyBV6Ym93q3?= =?us-ascii?Q?QgnyKKk6RXSIfdl2N5uxnhKhV74zRtXPN6at5nVj4daAVIgAEyTbYlVVsNbn?= =?us-ascii?Q?Nif1/DByI+vphdewGEeXNhqVu/PW+/Z5q20TNqZsvjtYd5Fa6an3cmhs5Voq?= =?us-ascii?Q?qoIORXNwlCjaBOQU+ZqkWxxupYW6ki914kSaQCKfwLnQbusDXcjae8RxN/KU?= =?us-ascii?Q?LCeRpE/iEh84SJhmJFIO5cp9y71DCBvsKg54/LKaktf7aceSCPZJ18OcQm/z?= =?us-ascii?Q?0j2O9Z7IK78lG3WNoQkMJ5OCo2B2zXDn93mOTzqWSR7M4jSdN01u1hPVbQzo?= =?us-ascii?Q?X5ZwgBMjhSrhiLurt7HaJFhuU7B16ubgtdeG2F+PMHihl51DYhW4+0JY5JfW?= =?us-ascii?Q?DCy7idpV7b+JriP9HjIo/R5DSX8o07Mg0+PsYKU6qtSaXEAUc4yDr+2KhHdK?= =?us-ascii?Q?9bcLij3KFJexg4erplRWV9UEBm4cwMNviZNGe3DmfdQf6Tb33Uh4JLN6UIQI?= =?us-ascii?Q?FpKt5BGw4GRn62ye9n9+fA8+oUBXxTDnv/GbF0aTMrSmre6BcnD7K6u2cl3r?= =?us-ascii?Q?Y0Lg4N95eg1LU8wzuFWRLY6NuGlsl3EiZnVADvtV+QvVv9ITFkkh0C3U0V8C?= =?us-ascii?Q?aCP8/MwIy33A6O5rBaXAckVGLK58ygabfSddgeQNWl4jj7h0BDi3fD0r3cEs?= =?us-ascii?Q?/Y70N28OwYzc6nhvuC8FYg=3D?= X-Microsoft-Exchange-Diagnostics: 1; MWHSPR01MB180; 6:E6WZBrdIqAs9tAofSzuUCursGpWvFXlKUcK6EKGKyVINU1Pg7o5D9Dm6lSnLFR0fL+dFPCHFY8vqy3TZq1ExXLIrMLf8Qy7kd9Y1coyQFIth/aM/xsKfESq22kFfcA9TxiWdBjK+3F9/KmTl41whMA3rmsB9KoYpQY1S2nuGuptuTZFnw4064nR/JJEuu/wvuLQNVK1I+fAP/FK8x6wPf9s/xEkU6owM7Y2kpjpMcOoRNdvsej+RwVWRk67PX556VJkCpLQadjynn9YH8k1Xy1Dq5Zygp1UR+nTa+ytcWpHdvom3LqedckydVTVbaobzAt6aPJm76q/fehHSFyLRew==; 5:/qOKTmGWE93FN1ai79TtgL/uYubEcwPoTk+T8FTr9ZARbwCdodEWOMY5zwfR22BcKWEtDt8QgVAUps8U6bqR/pdz9xPNvJf/ODChKcQ23IMdFPhmcBpDIndjhzr8/xhdF48MWeezx4NjH8KI2RgGbQ==; 24:vk4OCaVPas/DxDvAiLrLLn96eSa3aQkSB6+4OOP622lY3LtbREx2pIWPI/Aft+/+NR2iohVIRVc+75ECKPI4VdEgbZA4wD1xJRwO2TEqNS0=; 7:pChseJdUDbiroxPrw9LyRZctntuaa+LzK2ZrDnTxjo5OMZgLMffS+UofU+YgnNVBmTvtI6yUU2cvgpvZnrY6inMPf5fwo++P1Yo5bWbPKSe4OUREo5klelfmZgB7e2sXGuwOWtsVGCIw+uMSZkNDeyCrhjq0pOvToJDk0njjcCA1s2kR4X1xOSPJt8pKb1F9fI3I0iBJ6+84OhZw+c52LdtdoyXvt6oo3OTduFtRCQg= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-MS-Exchange-CrossTenant-OriginalArrivalTime: 10 Aug 2017 13:48:23.8761 (UTC) X-MS-Exchange-CrossTenant-Id: 5afe0b00-7697-4969-b663-5eab37d5f47e X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=5afe0b00-7697-4969-b663-5eab37d5f47e; Ip=[192.88.158.2]; Helo=[az84smr01.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: MWHSPR01MB180 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Implemented workarounds for the following dTSEC Erratum: A002, A004, A0012, A0014, A004839 on several operations that involve MAC CFG register changes: adjust link, rx pause frames, modify MAC address. Signed-off-by: Florinel Iordache Acked-by: Madalin Bucur --- drivers/net/ethernet/freescale/fman/fman_dtsec.c | 118 ++++++++++++++++++----- 1 file changed, 93 insertions(+), 25 deletions(-) diff --git a/drivers/net/ethernet/freescale/fman/fman_dtsec.c b/drivers/net/ethernet/freescale/fman/fman_dtsec.c index 98bba10..ea43b49 100644 --- a/drivers/net/ethernet/freescale/fman/fman_dtsec.c +++ b/drivers/net/ethernet/freescale/fman/fman_dtsec.c @@ -123,7 +123,7 @@ #define DTSEC_ECNTRL_R100M 0x00000008 #define DTSEC_ECNTRL_QSGMIIM 0x00000001 -#define DTSEC_TCTRL_GTS 0x00000020 +#define TCTRL_GTS 0x00000020 #define RCTRL_PAL_MASK 0x001f0000 #define RCTRL_PAL_SHIFT 16 @@ -863,6 +863,52 @@ int dtsec_cfg_pad_and_crc(struct fman_mac *dtsec, bool new_val) return 0; } +static void graceful_start(struct fman_mac *dtsec, enum comm_mode mode) +{ + struct dtsec_regs __iomem *regs = dtsec->regs; + + if (mode & COMM_MODE_TX) + iowrite32be(ioread32be(®s->tctrl) & + ~TCTRL_GTS, ®s->tctrl); + if (mode & COMM_MODE_RX) + iowrite32be(ioread32be(®s->rctrl) & + ~RCTRL_GRS, ®s->rctrl); +} + +static void graceful_stop(struct fman_mac *dtsec, enum comm_mode mode) +{ + struct dtsec_regs __iomem *regs = dtsec->regs; + u32 tmp; + + /* Graceful stop - Assert the graceful Rx stop bit */ + if (mode & COMM_MODE_RX) { + tmp = ioread32be(®s->rctrl) | RCTRL_GRS; + iowrite32be(tmp, ®s->rctrl); + + if (dtsec->fm_rev_info.major == 2) { + /* Workaround for dTSEC Errata A002 */ + usleep_range(100, 200); + } else { + /* Workaround for dTSEC Errata A004839 */ + usleep_range(10, 50); + } + } + + /* Graceful stop - Assert the graceful Tx stop bit */ + if (mode & COMM_MODE_TX) { + if (dtsec->fm_rev_info.major == 2) { + /* dTSEC Errata A004: Do not use TCTRL[GTS]=1 */ + pr_debug("GTS not supported due to DTSEC_A004 Errata.\n"); + } else { + tmp = ioread32be(®s->tctrl) | TCTRL_GTS; + iowrite32be(tmp, ®s->tctrl); + + /* Workaround for dTSEC Errata A0012, A0014 */ + usleep_range(10, 50); + } + } +} + int dtsec_enable(struct fman_mac *dtsec, enum comm_mode mode) { struct dtsec_regs __iomem *regs = dtsec->regs; @@ -880,13 +926,8 @@ int dtsec_enable(struct fman_mac *dtsec, enum comm_mode mode) iowrite32be(tmp, ®s->maccfg1); - /* Graceful start - clear the graceful receive stop bit */ - if (mode & COMM_MODE_TX) - iowrite32be(ioread32be(®s->tctrl) & ~DTSEC_TCTRL_GTS, - ®s->tctrl); - if (mode & COMM_MODE_RX) - iowrite32be(ioread32be(®s->rctrl) & ~RCTRL_GRS, - ®s->rctrl); + /* Graceful start - clear the graceful Rx/Tx stop bit */ + graceful_start(dtsec, mode); return 0; } @@ -899,23 +940,8 @@ int dtsec_disable(struct fman_mac *dtsec, enum comm_mode mode) if (!is_init_done(dtsec->dtsec_drv_param)) return -EINVAL; - /* Gracefull stop - Assert the graceful transmit stop bit */ - if (mode & COMM_MODE_RX) { - tmp = ioread32be(®s->rctrl) | RCTRL_GRS; - iowrite32be(tmp, ®s->rctrl); - - if (dtsec->fm_rev_info.major == 2) - usleep_range(100, 200); - else - udelay(10); - } - - if (mode & COMM_MODE_TX) { - if (dtsec->fm_rev_info.major == 2) - pr_debug("GTS not supported due to DTSEC_A004 errata.\n"); - else - pr_debug("GTS not supported due to DTSEC_A0014 errata.\n"); - } + /* Graceful stop - Assert the graceful Rx/Tx stop bit */ + graceful_stop(dtsec, mode); tmp = ioread32be(®s->maccfg1); if (mode & COMM_MODE_RX) @@ -933,11 +959,19 @@ int dtsec_set_tx_pause_frames(struct fman_mac *dtsec, u16 pause_time, u16 __maybe_unused thresh_time) { struct dtsec_regs __iomem *regs = dtsec->regs; + enum comm_mode mode = COMM_MODE_NONE; u32 ptv = 0; if (!is_init_done(dtsec->dtsec_drv_param)) return -EINVAL; + if ((ioread32be(®s->rctrl) & RCTRL_GRS) == 0) + mode |= COMM_MODE_RX; + if ((ioread32be(®s->tctrl) & TCTRL_GTS) == 0) + mode |= COMM_MODE_TX; + + graceful_stop(dtsec, mode); + if (pause_time) { /* FM_BAD_TX_TS_IN_B_2_B_ERRATA_DTSEC_A003 Errata workaround */ if (dtsec->fm_rev_info.major == 2 && pause_time <= 320) { @@ -958,17 +992,27 @@ int dtsec_set_tx_pause_frames(struct fman_mac *dtsec, iowrite32be(ioread32be(®s->maccfg1) & ~MACCFG1_TX_FLOW, ®s->maccfg1); + graceful_start(dtsec, mode); + return 0; } int dtsec_accept_rx_pause_frames(struct fman_mac *dtsec, bool en) { struct dtsec_regs __iomem *regs = dtsec->regs; + enum comm_mode mode = COMM_MODE_NONE; u32 tmp; if (!is_init_done(dtsec->dtsec_drv_param)) return -EINVAL; + if ((ioread32be(®s->rctrl) & RCTRL_GRS) == 0) + mode |= COMM_MODE_RX; + if ((ioread32be(®s->tctrl) & TCTRL_GTS) == 0) + mode |= COMM_MODE_TX; + + graceful_stop(dtsec, mode); + tmp = ioread32be(®s->maccfg1); if (en) tmp |= MACCFG1_RX_FLOW; @@ -976,20 +1020,34 @@ int dtsec_accept_rx_pause_frames(struct fman_mac *dtsec, bool en) tmp &= ~MACCFG1_RX_FLOW; iowrite32be(tmp, ®s->maccfg1); + graceful_start(dtsec, mode); + return 0; } int dtsec_modify_mac_address(struct fman_mac *dtsec, enet_addr_t *enet_addr) { + struct dtsec_regs __iomem *regs = dtsec->regs; + enum comm_mode mode = COMM_MODE_NONE; + if (!is_init_done(dtsec->dtsec_drv_param)) return -EINVAL; + if ((ioread32be(®s->rctrl) & RCTRL_GRS) == 0) + mode |= COMM_MODE_RX; + if ((ioread32be(®s->tctrl) & TCTRL_GTS) == 0) + mode |= COMM_MODE_TX; + + graceful_stop(dtsec, mode); + /* Initialize MAC Station Address registers (1 & 2) * Station address have to be swapped (big endian to little endian */ dtsec->addr = ENET_ADDR_TO_UINT64(*enet_addr); set_mac_address(dtsec->regs, (u8 *)(*enet_addr)); + graceful_start(dtsec, mode); + return 0; } @@ -1162,11 +1220,19 @@ int dtsec_set_promiscuous(struct fman_mac *dtsec, bool new_val) int dtsec_adjust_link(struct fman_mac *dtsec, u16 speed) { struct dtsec_regs __iomem *regs = dtsec->regs; + enum comm_mode mode = COMM_MODE_NONE; u32 tmp; if (!is_init_done(dtsec->dtsec_drv_param)) return -EINVAL; + if ((ioread32be(®s->rctrl) & RCTRL_GRS) == 0) + mode |= COMM_MODE_RX; + if ((ioread32be(®s->tctrl) & TCTRL_GTS) == 0) + mode |= COMM_MODE_TX; + + graceful_stop(dtsec, mode); + tmp = ioread32be(®s->maccfg2); /* Full Duplex */ @@ -1186,6 +1252,8 @@ int dtsec_adjust_link(struct fman_mac *dtsec, u16 speed) tmp &= ~DTSEC_ECNTRL_R100M; iowrite32be(tmp, ®s->ecntrl); + graceful_start(dtsec, mode); + return 0; }