From patchwork Thu Jan 31 14:30:35 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Horatiu Vultur X-Patchwork-Id: 1034305 X-Patchwork-Delegate: daniel.schwierzeck@googlemail.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.denx.de (client-ip=81.169.180.215; helo=lists.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=microchip.com Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 43r3nL1t9Fz9s9G for ; Fri, 1 Feb 2019 02:19:50 +1100 (AEDT) Received: by lists.denx.de (Postfix, from userid 105) id E1A4AC21F80; Thu, 31 Jan 2019 15:19:47 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on lists.denx.de X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=BAD_ENC_HEADER, SPF_HELO_PASS autolearn=unavailable autolearn_force=no version=3.4.0 Received: from lists.denx.de (localhost [IPv6:::1]) by lists.denx.de (Postfix) with ESMTP id 022A0C21F0B; Thu, 31 Jan 2019 15:19:45 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 7FE71C21FAE; Thu, 31 Jan 2019 15:19:28 +0000 (UTC) Received: from NAM05-BY2-obe.outbound.protection.outlook.com (mail-eopbgr710064.outbound.protection.outlook.com [40.107.71.64]) by lists.denx.de (Postfix) with ESMTPS id CEDBCC21EE0 for ; Thu, 31 Jan 2019 15:19:27 +0000 (UTC) Received: from DM5PR19CA0036.namprd19.prod.outlook.com (2603:10b6:3:9a::22) by SN2PR19MB0735.namprd19.prod.outlook.com (2603:10b6:804:29::23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1558.21; Thu, 31 Jan 2019 15:19:25 +0000 Received: from BL2FFO11FD009.protection.gbl (2a01:111:f400:7c09::149) by DM5PR19CA0036.outlook.office365.com (2603:10b6:3:9a::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.1580.17 via Frontend Transport; Thu, 31 Jan 2019 15:19:25 +0000 Authentication-Results: spf=softfail (sender IP is 208.19.99.222) smtp.mailfrom=microchip.com; lists.denx.de; dkim=none (message not signed) header.d=none;lists.denx.de; dmarc=none action=none header.from=microchip.com; Received-SPF: SoftFail (protection.outlook.com: domain of transitioning microchip.com discourages use of 208.19.99.222 as permitted sender) Received: from AUSMBX2.microsemi.net (208.19.99.222) by BL2FFO11FD009.mail.protection.outlook.com (10.173.161.15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256) id 15.20.1580.12 via Frontend Transport; Thu, 31 Jan 2019 15:19:24 +0000 Received: from AUSMBX1.microsemi.net (10.201.34.31) by AUSMBX2.microsemi.net (10.201.34.32) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.1531.3; Thu, 31 Jan 2019 08:34:14 -0600 Received: from xrelay.vitesse.com (10.9.45.188) by ausmbx1.microsemi.net (10.201.34.31) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.1531.3 via Frontend Transport; Thu, 31 Jan 2019 08:34:14 -0600 Received: from soft-dev3.microsemi.net (soft-dev3.microsemi.net [10.205.27.16]) by xrelay.vitesse.com (8.13.8/8.13.8) with ESMTP id x0VEVFXU010440; Thu, 31 Jan 2019 06:33:47 -0800 From: Horatiu Vultur To: Date: Thu, 31 Jan 2019 15:30:35 +0100 Message-ID: <1548945040-12921-4-git-send-email-horatiu.vultur@microchip.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1548945040-12921-1-git-send-email-horatiu.vultur@microchip.com> References: <1548945040-12921-1-git-send-email-horatiu.vultur@microchip.com> MIME-Version: 1.0 X-EOPAttributedMessage: 0 X-Matching-Connectors: 131934215649437272; (5a93feec-e11d-4f7b-166a-08d09f1f276b); () X-Forefront-Antispam-Report: CIP:208.19.99.222; IPV:NLI; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(10009020)(39860400002)(346002)(396003)(136003)(376002)(2980300002)(189003)(199004)(2906002)(53416004)(44832011)(486006)(81156014)(126002)(50226002)(476003)(305945005)(8936002)(81166006)(6666004)(356004)(11346002)(2616005)(498600001)(8676002)(36756003)(76176011)(6916009)(51416003)(16586007)(316002)(69596002)(54906003)(47776003)(336012)(68736007)(106466001)(446003)(2351001)(105596002)(26005)(77096007)(107886003)(86362001)(4326008)(97736004)(48376002)(53936002)(50466002)(30864003); DIR:OUT; SFP:1101; SCL:1; SRVR:SN2PR19MB0735; H:AUSMBX2.microsemi.net; FPR:; SPF:SoftFail; LANG:en; PTR:InfoDomainNonexistent; MX:1; A:1; X-Microsoft-Exchange-Diagnostics: 1; BL2FFO11FD009; 1:wGKQXfysey6heyewbPtKjmK3z18IGmDCaWxUTTyYWnZnBjhf/1r5m01WszAlTz+M6seS+qoLduXzYXXcfhJyGEx3QFFUYwnVqE79jQZ0zBqOZ4aQ5YMa1d62sIpNqej2XdVO7sHVAE+fV9iYPJO/MA== X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: dafa1f9c-a0f0-4c2e-66ef-08d6878f7bf5 X-Microsoft-Antispam: BCL:0; PCL:0; RULEID:(2390118)(7020095)(5600110)(711020)(4605077)(2017052603328); SRVR:SN2PR19MB0735; X-Microsoft-Exchange-Diagnostics: 1; SN2PR19MB0735; 3:vv/nc2UjZ3RlZbwPBLzsjbUG31IgCDx3GU8IK1u+e/CulccxzKRzgr2wjWmql0RBY5UYfnOBo2Nj3inj2K9sbxReXlZoYgGjWk8H1GncmnHXv/CDBmJBgILY02tUB+tgy7O9zvOc882cjqy3KeDV+k4iGDtHRYeujAc7ROrK6A6TvfKXz+TMy9Is8d087uoEFH5ofWbiZYxenOuMmAEZA/memkZRIyIju/2588k9oY/2U6m/M7bx/atuAgjLZ3n2z07/bs3iOpxWcRLSsIUX8DNdkrHetA4fkKuI1MYD9QyzSeQVUiHmlGO8YEARUJonaY1lR+T1hlWkrCT1hd5F6OS7mQK5NpsafWd1FC1RNLlgErV+yc0qzvmqTqXZUm5b; 25:CNYUq4CEGZRQtsVQ0ekUt2B8RQGTQtGYSRsgwHOUfQkKmjyeSI3ec9xheiPmnB6kANxKA7bgyUNXanwXchu4Ve7yBC2mJa+DQgh+7cdsM/h4cdZ5r5VXetWcoAn00D7yNKGnW+gno+piK1QfLYMxJVViEH3xgcfnBtXGSGMTLCCYvUZ7sOVvr4L9JSKqUjYxNfUOwKTlPcMRnR69w+3zz++jUOdkqPGgWYc63663ZkZ4oAgkZB4PaWSE5uGmCiwuOL1lU+9mT58il/XtsdfE2Xi4Zo7lPm2KiXADIiKkPi/qcD9/8wITQOIWvozQRZ45T5IpJkzxugneGZwsSzV8Qg== X-MS-TrafficTypeDiagnostic: SN2PR19MB0735: X-Microsoft-Exchange-Diagnostics: 1; SN2PR19MB0735; 31:2whHqjvmAMejwsNGVDtwyn1bDGwn9FBgBgRGde/AAedgXZxjI6/znnV/03PyvBPG56kMojzdzfonZHC+Pnvjgu0tFdXJuzep1x1k5qCvfy606/kpynGMTQG0IWud841xJT0EMX/NWvgzMFDeVzgDVIMufnTl9sC7dwqwJ9I+8HhPiGX5kx24lWBO3JPVGaAGDrd5pKyWjGp+3t0njjkV/JIgiFnPUgLsD8p5+mAuTOs=; 4:fOge/PUrhrWr+geslj5M1biSfifl/Y+sgZUemHd2+JtTr95z5UEnnLYCmdPN6Ol8XorCYRMsTmo7PwFj2T5Ol4UoG+VVOeQXex9aF3ApU6Yz+HYpa7pUmCfj3Cqrr3YQTDn1WpxVTepx50chhkTUc05espu2q20KB6R7qYIC8FHy9KMAxttSY4zE6yhZMAvHpbdE9QBKAwWIqKlZbMTqs4o8a1Aa8RLLu0idLgx9bG/eNSUCy3q56ZIfZUYn91jodLP6l8lhuM3N0lopDLcGqWu6VMlZJYd2EeoEebSMUpmo4xWuawN6L7mPFVNhaLnJ X-Microsoft-Antispam-PRVS: X-Forefront-PRVS: 09347618C4 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; SN2PR19MB0735; 23:Q5QQB55GoN/IS+ePHs9oZgv+AO7kKa7JR+feyRWPu?= rNacvQDwo855RSPPL2UTdd9TF9iHFf7Csa64in5FSd6ibGXZzK383UlXJoVhyf5ool6mh9WSKusxquXR+qKRKEBOt4QzV6BChNdnXb1vITwXmuQlV1eDFtNO+djkzupn+fBR1qymmBHhSuiJ3dUJcrLkS1ezYNg1vQTjLSYSpesv3Y9HbFTyWov7ZQcnCcnXfo3WjzhLnMONSaMAhbw5wYbwYia39UcUkAQfsanvj6FB7TYpXDPg6WYo3YYKIvxEXTE+iY3UTAEKipqurw0zAegQwS1W8YotM33sqdQXcam6g2xxkExJlIPD8PICqsqLns1GbXp4egegB9xprumRHkycAANnA/XHfLCCPmq2lKNlEnEbGPaab8A3rGr0uhK4IAM2fLymppjcQeYB4+oO9y2UfE9799cL3cYEcvfR5its3LX7o2TZKg5HJu10yiQHMWExGKL8FoLHkv6flSTzX6vrjIIsBCO9rLYW3xypNfjReEn7voUeLOGD6bhBP5lhLlYyBBqz9KQ7jNmu2hsomYJFdsp71F0/TJ2/O4Ub6ntJego3jtbEPixcoT/CVV/QwQWMSWG89zpOWwAlIGRZYumd6EgassFiBsxmnUBsndLYUtsTRYyScsNRZJb/sSfgUepa1vofR6Q5NQp2YvgJD66LU6babvzf6/EC6ZJQk3fCAeDCczDrLpSC0Ivk/a+D+Ijy28hkK35C5oawnPJGcGN9DkjwVD9ij2Kv0qgEN/krUntDzudYPHynjil3MMlcRMsSbIGo+3DCccbTawfDKZYjWeyn4INsokGZpeniE7snxOjU23pbCEvFA6TB59ROW8Q7eP9dG+ZjVj/k0O5M10VZH+aKzVOMq8q1+76fC5dteXaf9Ls955Gn1tpTSDhm5k6bIIlSgYoSi/FDdR5cA9hxmBNc6jgkEyYOL/KN8cSwZO0OTC5FFNY/69FH5f7hD707NfOUFtTsbfHeDHYkCP4/DSR9BBki7X28OAhMAAFV/1NhX61AeNgkaL1FHZvvwhkkUvp8bDS3WxdqAwjDd39kO9DXSB/zFLCt2Lzb0ws8uAuij6JoXvETPUx1S/seI4= X-Microsoft-Antispam-Message-Info: kbWHH5WAMOllK4h1tNMwmATdWOylNls6eja3W8tBSLTkUK+Z9I8zwi0FrIhO76TsdLG6MPczCUAOjAdJHVBrBaeL4G9ZQBh2v1ZJw0F3WWIJojcKJmTSHlO1Wt1ip3MP1Jpi7m0Xk3kPMirmkC3Lkuayny/1Mr1pKTnlf45hcy4sbb8ZEfarsONyAVyMEGq2oF6+phuxlh1y2G74sbI3igYu4aJHw4wmiSi6nMt8uC4pVFzzsqX40/VcYElQRywWW1d1BSFsZv1xjVqpxm3sCHaqwcth7mhwyvrPllmvys1Ku71+zadnYnRHtXWfXiuEfJObfYTkyyYbk2I4w9Gzp17IldJDfn6O+9K3QNRrVf/OpZU4IcIEWBlLYZD4DxgITrNZLJb+MimNQLH5tD08tNnJEhlO9jH/7XxFQZyjycY= X-Microsoft-Exchange-Diagnostics: 1; SN2PR19MB0735; 6:LcjoVoSUGCxAFxPEd18+bT6gqiXdf2ges9TdJYJQnAUr2Ptcq64UWZlR9iPQESzNAZu5KNhJ1zt2hQFPV4WHSxcc0M3p25npM0cRCtf3/CBWoRNbjzfGpDO+UloUqm0IIjJMRmDJ5jawd/NW2cQB2JsnUSdffe9M73t+Y5OJxmyp4PV+aonBHLxkDfjC8HFawUPU7EJR3sQCHxZ66ONjVjKrQpBH8lElUblaQpqq3J/898yK/x7mEzlYP+lLeKkDSMjf6ED9sWAtvuSghnROWTZHuuNuscUzOhyUcD0YMCkm6K/o0Wwuc6vCIAEah7y0gy+jBBfTh5s8l31fzBRe5e8UCiFb/yz7ncnKZAPyrXNkFkMEsnyWV75zLw55pyzPjBCSDraAGwmP96S9iZG3avbaeTt7c1wXHojQkJ2zSx8psyT3PdwKuUkiybEX03w47j0MuOomGJqq/5/7aOTIQg==; 5:RZ58zcJ1wEmcD0jqtzuwSwgsj9xtikbYklu4cCjA7irHin7q4/Q8vOHokAw8+VsybpoSQSFqe7J2RFSPRmaYltOjCfzkPy/Np2xzSoYNqtODum2uATNH9V2UFNzUdO4+UY+Axq+L6DrsHINyM+JjvlWSVObNLHChwcSlHSGHQGOTsuwbgo8PIQbgHRnbzJc6VI4ovdbrZChIX7lLx/OcXg==; 7:FtliKpz7Pi8tfRuMTVPbNbWh8J3Rnv5w3vIsS6A6/MmY1XcAhq25Pc9TtfWET+wvI366x5UN85Pr542yNBULjFDRrlT4sITnJtMPdSiFYzujUpt7js9nzixZ313SU68L3CbxON+szuMGVq72qXfR/Q== X-MS-Exchange-CrossTenant-OriginalArrivalTime: 31 Jan 2019 15:19:24.8116 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: dafa1f9c-a0f0-4c2e-66ef-08d6878f7bf5 X-MS-Exchange-CrossTenant-Id: 5afe0b00-7697-4969-b663-5eab37d5f47e X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=5afe0b00-7697-4969-b663-5eab37d5f47e; Ip=[208.19.99.222]; Helo=[AUSMBX2.microsemi.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN2PR19MB0735 Cc: joe.hershberger@ni.com Subject: [U-Boot] [PATCH v3 3/8] net: mscc: Move ocelot_send and ocelot_recv in a different file. X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.18 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" This functions can be reused by other MSCC SoCs therefore, make them more generic and move them in separate files. Signed-off-by: Horatiu Vultur --- drivers/net/mscc_eswitch/Makefile | 2 +- drivers/net/mscc_eswitch/mscc_xfer.c | 139 +++++++++++++++++++++++++++++++ drivers/net/mscc_eswitch/mscc_xfer.h | 20 +++++ drivers/net/mscc_eswitch/ocelot_switch.c | 130 ++++------------------------- 4 files changed, 175 insertions(+), 116 deletions(-) create mode 100644 drivers/net/mscc_eswitch/mscc_xfer.c create mode 100644 drivers/net/mscc_eswitch/mscc_xfer.h diff --git a/drivers/net/mscc_eswitch/Makefile b/drivers/net/mscc_eswitch/Makefile index 1ceb92a..20e8e4c 100644 --- a/drivers/net/mscc_eswitch/Makefile +++ b/drivers/net/mscc_eswitch/Makefile @@ -1,2 +1,2 @@ -obj-$(CONFIG_MSCC_OCELOT_SWITCH) += ocelot_switch.o mscc_miim.o +obj-$(CONFIG_MSCC_OCELOT_SWITCH) += ocelot_switch.o mscc_miim.o mscc_xfer.o diff --git a/drivers/net/mscc_eswitch/mscc_xfer.c b/drivers/net/mscc_eswitch/mscc_xfer.c new file mode 100644 index 0000000..f412901 --- /dev/null +++ b/drivers/net/mscc_eswitch/mscc_xfer.c @@ -0,0 +1,139 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2018 Microsemi Corporation + */ + +#include +#include "mscc_xfer.h" + +#define QS_XTR_FLUSH_FLUSH GENMASK(1, 0) +#define QS_INJ_CTRL_GAP_SIZE(x) ((x) << 21) +#define QS_INJ_CTRL_EOF BIT(19) +#define QS_INJ_CTRL_SOF BIT(18) +#define QS_INJ_CTRL_VLD_BYTES(x) ((x) << 16) + +#define XTR_EOF_0 ntohl(0x80000000u) +#define XTR_EOF_1 ntohl(0x80000001u) +#define XTR_EOF_2 ntohl(0x80000002u) +#define XTR_EOF_3 ntohl(0x80000003u) +#define XTR_PRUNED ntohl(0x80000004u) +#define XTR_ABORT ntohl(0x80000005u) +#define XTR_ESCAPE ntohl(0x80000006u) +#define XTR_NOT_READY ntohl(0x80000007u) + +#define BUF_CELL_SZ 60 +#define XTR_VALID_BYTES(x) (4 - ((x) & 3)) + +int mscc_send(void __iomem *regs, const unsigned long *mscc_qs_offset, + u32 *ifh, size_t ifh_len, u32 *buff, size_t buff_len) +{ + int i, count = (buff_len + 3) / 4, last = buff_len % 4; + + writel(QS_INJ_CTRL_GAP_SIZE(1) | QS_INJ_CTRL_SOF, + regs + mscc_qs_offset[MSCC_QS_INJ_CTRL]); + + for (i = 0; i < ifh_len; i++) + writel(ifh[i], regs + mscc_qs_offset[MSCC_QS_INJ_WR]); + + for (i = 0; i < count; i++) + writel(buff[i], regs + mscc_qs_offset[MSCC_QS_INJ_WR]); + + /* Add padding */ + while (i < (BUF_CELL_SZ / 4)) { + writel(0, regs + mscc_qs_offset[MSCC_QS_INJ_WR]); + i++; + } + + /* Indicate EOF and valid bytes in last word */ + writel(QS_INJ_CTRL_GAP_SIZE(1) | + QS_INJ_CTRL_VLD_BYTES(buff_len < BUF_CELL_SZ ? 0 : last) | + QS_INJ_CTRL_EOF, regs + mscc_qs_offset[MSCC_QS_INJ_CTRL]); + + /* Add dummy CRC */ + writel(0, regs + mscc_qs_offset[MSCC_QS_INJ_WR]); + + return 0; +} + +int mscc_recv(void __iomem *regs, const unsigned long *mscc_qs_offset, + u32 *rxbuf, size_t ifh_len, bool byte_swap) +{ + u8 grp = 0; /* Recv everything on CPU group 0 */ + int i, byte_cnt = 0; + bool eof_flag = false, pruned_flag = false, abort_flag = false; + + if (!(readl(regs + mscc_qs_offset[MSCC_QS_XTR_DATA_PRESENT]) & + BIT(grp))) + return -EAGAIN; + + /* skip IFH */ + for (i = 0; i < ifh_len; i++) + readl(regs + mscc_qs_offset[MSCC_QS_XTR_RD]); + + while (!eof_flag) { + u32 val = readl(regs + mscc_qs_offset[MSCC_QS_XTR_RD]); + u32 cmp = val; + + if (byte_swap) + cmp = ntohl(val); + + switch (cmp) { + case XTR_NOT_READY: + debug("%d NOT_READY...?\n", byte_cnt); + break; + case XTR_ABORT: + *rxbuf = readl(regs + mscc_qs_offset[MSCC_QS_XTR_RD]); + abort_flag = true; + eof_flag = true; + debug("XTR_ABORT\n"); + break; + case XTR_EOF_0: + case XTR_EOF_1: + case XTR_EOF_2: + case XTR_EOF_3: + byte_cnt += XTR_VALID_BYTES(val); + *rxbuf = readl(regs + mscc_qs_offset[MSCC_QS_XTR_RD]); + eof_flag = true; + debug("EOF\n"); + break; + case XTR_PRUNED: + /* But get the last 4 bytes as well */ + eof_flag = true; + pruned_flag = true; + debug("PRUNED\n"); + /* fallthrough */ + case XTR_ESCAPE: + *rxbuf = readl(regs + mscc_qs_offset[MSCC_QS_XTR_RD]); + byte_cnt += 4; + rxbuf++; + debug("ESCAPED\n"); + break; + default: + *rxbuf = val; + byte_cnt += 4; + rxbuf++; + } + } + + if (abort_flag || pruned_flag || !eof_flag) { + debug("Discarded frame: abort:%d pruned:%d eof:%d\n", + abort_flag, pruned_flag, eof_flag); + return -EAGAIN; + } + + return byte_cnt; +} + +void mscc_flush(void __iomem *regs, const unsigned long *mscc_qs_offset) +{ + /* All Queues flush */ + setbits_le32(regs + mscc_qs_offset[MSCC_QS_XTR_FLUSH], + QS_XTR_FLUSH_FLUSH); + + /* Allow to drain */ + mdelay(1); + + /* All Queues normal */ + clrbits_le32(regs + mscc_qs_offset[MSCC_QS_XTR_FLUSH], + QS_XTR_FLUSH_FLUSH); +} diff --git a/drivers/net/mscc_eswitch/mscc_xfer.h b/drivers/net/mscc_eswitch/mscc_xfer.h new file mode 100644 index 0000000..c880a4e --- /dev/null +++ b/drivers/net/mscc_eswitch/mscc_xfer.h @@ -0,0 +1,20 @@ +/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */ +/* + * Copyright (c) 2018 Microsemi Corporation + */ + +#include + +enum mscc_regs_qs { + MSCC_QS_XTR_RD, + MSCC_QS_XTR_FLUSH, + MSCC_QS_XTR_DATA_PRESENT, + MSCC_QS_INJ_WR, + MSCC_QS_INJ_CTRL, +}; + +int mscc_send(void __iomem *regs, const unsigned long *mscc_qs_offset, + u32 *ifh, size_t ifh_len, u32 *buff, size_t buff_len); +int mscc_recv(void __iomem *regs, const unsigned long *mscc_qs_offset, + u32 *rxbuf, size_t ifh_len, bool byte_swap); +void mscc_flush(void __iomem *regs, const unsigned long *mscc_qs_offset); diff --git a/drivers/net/mscc_eswitch/ocelot_switch.c b/drivers/net/mscc_eswitch/ocelot_switch.c index a4361e8..c33ecd4 100644 --- a/drivers/net/mscc_eswitch/ocelot_switch.c +++ b/drivers/net/mscc_eswitch/ocelot_switch.c @@ -16,6 +16,7 @@ #include #include "mscc_miim.h" +#include "mscc_xfer.h" #define PHY_CFG 0x0 #define PHY_CFG_ENA 0xF @@ -87,37 +88,16 @@ #define QS_XTR_GRP_CFG_MODE(x) ((x) << 2) #define QS_XTR_GRP_CFG_STATUS_WORD_POS BIT(1) #define QS_XTR_GRP_CFG_BYTE_SWAP BIT(0) -#define QS_XTR_RD(x) (0x8 + 4 * (x)) -#define QS_XTR_FLUSH 0x18 -#define QS_XTR_FLUSH_FLUSH GENMASK(1, 0) -#define QS_XTR_DATA_PRESENT 0x1c #define QS_INJ_GRP_CFG(x) (0x24 + (x) * 4) #define QS_INJ_GRP_CFG_MODE(x) ((x) << 2) #define QS_INJ_GRP_CFG_BYTE_SWAP BIT(0) -#define QS_INJ_WR(x) (0x2c + 4 * (x)) -#define QS_INJ_CTRL(x) (0x34 + 4 * (x)) -#define QS_INJ_CTRL_GAP_SIZE(x) ((x) << 21) -#define QS_INJ_CTRL_EOF BIT(19) -#define QS_INJ_CTRL_SOF BIT(18) -#define QS_INJ_CTRL_VLD_BYTES(x) ((x) << 16) - -#define XTR_EOF_0 ntohl(0x80000000u) -#define XTR_EOF_1 ntohl(0x80000001u) -#define XTR_EOF_2 ntohl(0x80000002u) -#define XTR_EOF_3 ntohl(0x80000003u) -#define XTR_PRUNED ntohl(0x80000004u) -#define XTR_ABORT ntohl(0x80000005u) -#define XTR_ESCAPE ntohl(0x80000006u) -#define XTR_NOT_READY ntohl(0x80000007u) #define IFH_INJ_BYPASS BIT(31) #define IFH_TAG_TYPE_C 0 -#define XTR_VALID_BYTES(x) (4 - ((x) & 3)) #define MAC_VID 1 #define CPU_PORT 11 #define INTERNAL_PORT_MSK 0xF #define IFH_LEN 4 -#define OCELOT_BUF_CELL_SZ 60 #define ETH_ALEN 6 #define PGID_BROADCAST 13 #define PGID_UNICAST 14 @@ -181,6 +161,14 @@ struct ocelot_private { void *tx_adj_buf; }; +static const unsigned long ocelot_regs_qs[] = { + [MSCC_QS_XTR_RD] = 0x8, + [MSCC_QS_XTR_FLUSH] = 0x18, + [MSCC_QS_XTR_DATA_PRESENT] = 0x1c, + [MSCC_QS_INJ_WR] = 0x2c, + [MSCC_QS_INJ_CTRL] = 0x34, +}; + struct mscc_miim_dev miim[NUM_PHY]; static int mscc_miim_reset(struct mii_dev *bus) @@ -367,16 +355,6 @@ static int ocelot_switch_init(struct ocelot_private *priv) return 0; } -static void ocelot_switch_flush(struct ocelot_private *priv) -{ - /* All Queues flush */ - setbits_le32(priv->regs[QS] + QS_XTR_FLUSH, QS_XTR_FLUSH_FLUSH); - /* Allow to drain */ - mdelay(1); - /* All Queues normal */ - clrbits_le32(priv->regs[QS] + QS_XTR_FLUSH, QS_XTR_FLUSH_FLUSH); -} - static int ocelot_initialize(struct ocelot_private *priv) { int ret, i; @@ -394,7 +372,7 @@ static int ocelot_initialize(struct ocelot_private *priv) writel(0, priv->regs[ANA] + ANA_PGID(PGID_SRC + i)); /* Flush queues */ - ocelot_switch_flush(priv); + mscc_flush(priv->regs[QS], ocelot_regs_qs); /* Setup frame ageing - "2 sec" - The unit is 6.5us on Ocelot */ writel(SYS_FRM_AGING_ENA | (20000000 / 65), @@ -503,13 +481,8 @@ static int ocelot_send(struct udevice *dev, void *packet, int length) struct ocelot_private *priv = dev_get_priv(dev); u32 ifh[IFH_LEN]; int port = BIT(0); /* use port 0 */ - u8 grp = 0; /* Send everything on CPU group 0 */ - int i, count = (length + 3) / 4, last = length % 4; u32 *buf = packet; - writel(QS_INJ_CTRL_GAP_SIZE(1) | QS_INJ_CTRL_SOF, - priv->regs[QS] + QS_INJ_CTRL(grp)); - /* * Generate the IFH for frame injection * @@ -526,91 +499,18 @@ static int ocelot_send(struct udevice *dev, void *packet, int length) ifh[2] = (0xff & port) << 24; ifh[3] = (IFH_TAG_TYPE_C << 16); - for (i = 0; i < IFH_LEN; i++) - writel(ifh[i], priv->regs[QS] + QS_INJ_WR(grp)); - - for (i = 0; i < count; i++) - writel(buf[i], priv->regs[QS] + QS_INJ_WR(grp)); - - /* Add padding */ - while (i < (OCELOT_BUF_CELL_SZ / 4)) { - writel(0, priv->regs[QS] + QS_INJ_WR(grp)); - i++; - } - - /* Indicate EOF and valid bytes in last word */ - writel(QS_INJ_CTRL_GAP_SIZE(1) | - QS_INJ_CTRL_VLD_BYTES(length < OCELOT_BUF_CELL_SZ ? 0 : last) | - QS_INJ_CTRL_EOF, priv->regs[QS] + QS_INJ_CTRL(grp)); - - /* Add dummy CRC */ - writel(0, priv->regs[QS] + QS_INJ_WR(grp)); - - return 0; + return mscc_send(priv->regs[QS], ocelot_regs_qs, + ifh, IFH_LEN, buf, length); } static int ocelot_recv(struct udevice *dev, int flags, uchar **packetp) { struct ocelot_private *priv = dev_get_priv(dev); - u8 grp = 0; /* Send everything on CPU group 0 */ u32 *rxbuf = (u32 *)net_rx_packets[0]; - int i, byte_cnt = 0; - bool eof_flag = false, pruned_flag = false, abort_flag = false; - - if (!(readl(priv->regs[QS] + QS_XTR_DATA_PRESENT) & BIT(grp))) - return -EAGAIN; - - /* skip IFH */ - for (i = 0; i < IFH_LEN; i++) - readl(priv->regs[QS] + QS_XTR_RD(grp)); - - while (!eof_flag) { - u32 val = readl(priv->regs[QS] + QS_XTR_RD(grp)); - - switch (val) { - case XTR_NOT_READY: - debug("%d NOT_READY...?\n", byte_cnt); - break; - case XTR_ABORT: - /* really nedeed?? not done in linux */ - *rxbuf = readl(priv->regs[QS] + QS_XTR_RD(grp)); - abort_flag = true; - eof_flag = true; - debug("XTR_ABORT\n"); - break; - case XTR_EOF_0: - case XTR_EOF_1: - case XTR_EOF_2: - case XTR_EOF_3: - byte_cnt += XTR_VALID_BYTES(val); - *rxbuf = readl(priv->regs[QS] + QS_XTR_RD(grp)); - eof_flag = true; - debug("EOF\n"); - break; - case XTR_PRUNED: - /* But get the last 4 bytes as well */ - eof_flag = true; - pruned_flag = true; - debug("PRUNED\n"); - /* fallthrough */ - case XTR_ESCAPE: - *rxbuf = readl(priv->regs[QS] + QS_XTR_RD(grp)); - byte_cnt += 4; - rxbuf++; - debug("ESCAPED\n"); - break; - default: - *rxbuf = val; - byte_cnt += 4; - rxbuf++; - } - } + int byte_cnt; - if (abort_flag || pruned_flag || !eof_flag) { - debug("Discarded frame: abort:%d pruned:%d eof:%d\n", - abort_flag, pruned_flag, eof_flag); - return -EAGAIN; - } + byte_cnt = mscc_recv(priv->regs[QS], ocelot_regs_qs, rxbuf, IFH_LEN, + false); *packetp = net_rx_packets[0];