From patchwork Thu May 20 15:34:58 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vadym Kochan X-Patchwork-Id: 443838 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER, INCLUDES_PATCH, MAILING_LIST_MULTI, MSGID_FROM_MTA_HEADER, SPF_HELO_NONE, SPF_PASS, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 71FBEC43460 for ; Thu, 20 May 2021 15:35:56 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 5128660FE7 for ; Thu, 20 May 2021 15:35:56 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240123AbhETPhP (ORCPT ); Thu, 20 May 2021 11:37:15 -0400 Received: from mail-vi1eur05on2090.outbound.protection.outlook.com ([40.107.21.90]:8577 "EHLO EUR05-VI1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S235891AbhETPhL (ORCPT ); Thu, 20 May 2021 11:37:11 -0400 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=gtZPzh/PqJk1xEj7hNYgpZjhBhPYuQo8Ehr4zXNtLMSpJ+64L1bnMCB3l/xn5nyGnc3V4l70KbsNBA0XF631y6t8S7R16UCKXS56y+OIjqABQUCaiTPR6MplIjDljImLYliBEdw3MEk15VFwuPCvBoAdUnIc2d6tmsu7fSYGBfTcIJvmVnyugLV8sHUvwAGd8HPHnRe+NPD1uqRTifBkvOKa2tb2TGvOTEktic0kC/Us6fEgiS4KSfBGdccNvXdXGxPzHniEIOBLA+IWjScdM6m3Bf9NXOthEmxZtF6wpVwhOLW32c1EgnHr4XEamLYalHPI9MQLHZQ5WiDTLca3Og== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=xe0P7WfdIFuu+woSaGWO4fiFYO5nO0G/uHHqlGEqyM8=; b=AuFzEZvZd1l2gkqMOBw7hvUC2IwI5Ydokc0vc42t9Z7cuw/I3mH12P3CIeUTPvWBh4JvLMaue0kEMxO9WCb6YNabNowYRO3KVUap5lLL8sgcOvF7mnPgz69M5+K0yqdLIXRGSJ320oRFnYc8zaYyKmcTQ856yCiOcgBTZFd9OW4ljGYommRfG7pboOrg812tY8ggHWCMZLA75bPkW2YgfZdkL7jd4B2DRudn6T4gpizZmG33IA0MNMRhCngVqkPgkn6HkVrrh0sbt6qDbXCYHDgKjvhrmL9+Urzbv7hpuk9Ogez6wRHPv9rtvFYmRWLkUoWrtpD13Msc60gflE1JEQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=plvision.eu; dmarc=pass action=none header.from=plvision.eu; dkim=pass header.d=plvision.eu; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=plvision.eu; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=xe0P7WfdIFuu+woSaGWO4fiFYO5nO0G/uHHqlGEqyM8=; b=KVhqWcgH/gZeBgf3J7UpUEFJ/rMz1UlJmaxN7hJXusjuSGrQeacOMNHa+9W2ckgxzRS+fW5pMtRAPqmx/km0tinCv9VMqhHh/GtsL8ubz3dCD2sECQataBSTwbF60ZSEf80Dm7Esbp4tcm+/aEutt0IUaJS6doziqfsQKkNVH2E= Authentication-Results: davemloft.net; dkim=none (message not signed) header.d=none; davemloft.net; dmarc=none action=none header.from=plvision.eu; Received: from HE1P190MB0539.EURP190.PROD.OUTLOOK.COM (2603:10a6:7:56::28) by HE1P190MB0268.EURP190.PROD.OUTLOOK.COM (2603:10a6:7:62::24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4129.28; Thu, 20 May 2021 15:35:45 +0000 Received: from HE1P190MB0539.EURP190.PROD.OUTLOOK.COM ([fe80::edb4:ae92:2efe:8c8a]) by HE1P190MB0539.EURP190.PROD.OUTLOOK.COM ([fe80::edb4:ae92:2efe:8c8a%5]) with mapi id 15.20.4129.033; Thu, 20 May 2021 15:35:45 +0000 From: Vadym Kochan To: "David S. Miller" , Jakub Kicinski , netdev@vger.kernel.org, Andrew Lunn Cc: Vadym Kochan , Taras Chornyi , linux-kernel@vger.kernel.org, Mickey Rachamim , Vadym Kochan Subject: [RFC net-next v2 2/4] net: marvell: prestera: align flood setting according to latest firmware version Date: Thu, 20 May 2021 18:34:58 +0300 Message-Id: <20210520153500.22930-3-vadym.kochan@plvision.eu> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20210520153500.22930-1-vadym.kochan@plvision.eu> References: <20210520153500.22930-1-vadym.kochan@plvision.eu> X-Originating-IP: [217.20.186.93] X-ClientProxiedBy: AM4PR0101CA0065.eurprd01.prod.exchangelabs.com (2603:10a6:200:41::33) To HE1P190MB0539.EURP190.PROD.OUTLOOK.COM (2603:10a6:7:56::28) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from pc60716vkochan.x.ow.s (217.20.186.93) by AM4PR0101CA0065.eurprd01.prod.exchangelabs.com (2603:10a6:200:41::33) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4150.23 via Frontend Transport; Thu, 20 May 2021 15:35:44 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: a2de1718-ae2e-46ba-8619-08d91ba4eefc X-MS-TrafficTypeDiagnostic: HE1P190MB0268: X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:3044; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: XaUHISmN9YJmf9qPKSgvmbvfIHRImyA36wgAjIPWNkPx50tZL92d7H+XmrviP147tJ02Q4ZKsBSAH0GX9oQdJ2mVo2gaLwVRRW9xWYKomG3CkpLNHgcfceQttgy/cX/TCW1kadPr+fikQiFtrFjHPSM4K6QuR+pmEd+jwehVZgfKOSlRz6R0lb0DFHk/kc9tqTS0Fgkzfg1UcGd2qoPvPiJ+q97/V9a4XloewHShcPAxOpJ7rtUIT/ddaw0gLDjrWOhxXdNGsdWTFDARUmuDs9Z9H5MxQjTFhTxX2cJzbBQF5pYDdBE7JFo3tbJVyh3ZCW2NtsjJRk8kQBCUtscWu0obnhtLqekjxnHuMmxdo17nfsz0wVem8NZYLyO/nSMbY0MgM7RU9LQGoz8PBIbQ72rHOLbMleH1fBTEbFnD58qAVEV/JFT9xYz+4g7w+78B0Mjfg2BE2jwDLgrPlLJM6ezg7MM/emMrFMEBs7tPfZt03jBsSkymPxuf64sfOVT067oftyesDof/exfZF83osp1+nY/5HcMV/oC7LxjP/BvRXcvAtoa1y4kngKyKbd26fSk7A02eydJx+0kxG09Kwt6rD0i5cIHZqlrhLxhshA3XuJmFuhqvfeQ+u40yCRCVGxioSTckLHxgAekbAitgJiXyljK9SUlNpSOK+RBPZF0= X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:HE1P190MB0539.EURP190.PROD.OUTLOOK.COM; PTR:; CAT:NONE; SFS:(396003)(136003)(376002)(39830400003)(346002)(366004)(6666004)(26005)(5660300002)(4326008)(6512007)(66476007)(8676002)(66946007)(316002)(66556008)(110136005)(956004)(54906003)(36756003)(186003)(16526019)(52116002)(1076003)(2906002)(8936002)(83380400001)(38100700002)(38350700002)(86362001)(2616005)(44832011)(6506007)(6486002)(478600001); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData: 8Q3xKfTF7AzOiO1b7OU9G8Z8YoA1oBLC0ujnY73mL0xh/YhJh5ciifUk2Zp5mAVuHQULlxIskWuXuf1JuGmc4Lh/mFDSvoxwdvC76e4hHzEUJ0NbuF4JP5MN4y6kBhWfTpBM2gxUAUI84CRIRzs0CkxVMj+7FAf+CfKocu0Ya1Y554BjNlQ+jVvpcZyjJtxia//CYF6HwfTiM/a6A7vV/1EpqAqJ2BGk7NozjPxM7cHwztRhrMFC/5pgnmszL/g+GDgn0PsgBjh7J5Z60lC7Hoj0ORDAEgrIuHg6Gsk5j3BaHFqf+4yQviQeshLyEdQ2HFzfLBeXksKfgUZ70zDX4J0af2OKpsuIiGsm7fSfLN+l0rUvsvFNM4h8Pu01UGWh2E1mc2aCk3xoJz4wLlV7DVin4YVx/V+OLOO+wBtKIZ7+jBWqzFfkMGTN3FXQrZd2TXxvdvS3adJubJYL8QJen/xyL7dqRqknO9qQZGQppBL+0+rU+yWXH3KFc+rAjrNIplK6t84sIDtBFZQQDrl+VzTzn72sUlLBACWFkafDn+5jkc0K7gH8miBwJsXKKF2K3p2p9M94wf0O5kom4j7nBhx5/mNKB07c/B3zZMda1e283PjtxDPFmVX9hcU38jrKcl/YjQixEDK7eSLnMHGokcspWLrHn4DRVlPH1y38b06yyVCpah+mMagn2zwuvcJCw5Bhfsac7uMMc7sEU2TEbruGb0M9Stz4qtjJYSRjKBywPMliprlvOZvmd3PXQIQjskCMcAT7uHLrar1ZdOWnqGNrjzgNQFQ+GmtYGuNnpUdzm0KnWUSktCmYag3fVIXJpxydcD+7PsYFQOO3Cf+rkcEkEPgNpPIA9/xnPQPRw5z20jF8PyFjEviHj6cmbMs/sVbrKl263C/QM1kcRGuAg+Xa+E1xVMe+6kqwgOCpHUy1oPxABlMmOij9ylKyEV/5WrMa3e8UQCurXZRJ5ojZ1kU/8Q8UGUBvqLBmpwFOloL6bx1sJk4HET1TvcWxtpyrbZX1wEJbr4PDOlfu6NEEX1udQSdSJskWAEq2fGrRuOl4M2sHQnDv6waxrSyK9wZdfskyeWl4srNiVi/+87ErGFTJNPEADgV95t9mHeDgyweWoMYr218dAnqCRzHSxMuOAABrTSby7uMLRcSUpfmn+BWM/f2a6E1zWJq/1TywJiuKLrsNNDZnQ3E+mFjJ14/A2RS3G8yeG4aZIpufmhD5xJa1+DUyRZ6cdZxd+HqF6XNfwVamQsgbrwQuPElgo8ze8vWuSYgz/14BCjKUlauq45Z1xLhhySiMdfhKz7nHWkAcW/MNMBXRu6c9ZSG0QE+J X-OriginatorOrg: plvision.eu X-MS-Exchange-CrossTenant-Network-Message-Id: a2de1718-ae2e-46ba-8619-08d91ba4eefc X-MS-Exchange-CrossTenant-AuthSource: HE1P190MB0539.EURP190.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 20 May 2021 15:35:44.9228 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 03707b74-30f3-46b6-a0e0-ff0a7438c9c4 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: QknT5rlEjln/JTvqEKYBbVJ1czaMMi2xhrQRFZ81QvgEncEgzym22LoIXKqE1s2VKaz0bVewsrE0SgXRStgIqruDv7K1bpJPLvvgaCkvAQ0= X-MS-Exchange-Transport-CrossTenantHeadersStamped: HE1P190MB0268 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Vadym Kochan Latest FW IPC flood message format was changed to configure uc/mc flooding separately, so change code according to this. Signed-off-by: Vadym Kochan --- Notes: RFC: 1) Add support for previous FW ABI version (suggested by Andrew Lunn) .../ethernet/marvell/prestera/prestera_hw.c | 85 ++++++++++++++++++- .../ethernet/marvell/prestera/prestera_hw.h | 3 +- .../marvell/prestera/prestera_switchdev.c | 17 ++-- 3 files changed, 94 insertions(+), 11 deletions(-) diff --git a/drivers/net/ethernet/marvell/prestera/prestera_hw.c b/drivers/net/ethernet/marvell/prestera/prestera_hw.c index 0424718d5998..96ce73b50fec 100644 --- a/drivers/net/ethernet/marvell/prestera/prestera_hw.c +++ b/drivers/net/ethernet/marvell/prestera/prestera_hw.c @@ -2,6 +2,7 @@ /* Copyright (c) 2019-2020 Marvell International Ltd. All rights reserved */ #include +#include #include #include @@ -85,6 +86,11 @@ enum { PRESTERA_PORT_TP_AUTO, }; +enum { + PRESTERA_PORT_FLOOD_TYPE_UC = 0, + PRESTERA_PORT_FLOOD_TYPE_MC = 1, +}; + enum { PRESTERA_PORT_GOOD_OCTETS_RCV_CNT, PRESTERA_PORT_BAD_OCTETS_RCV_CNT, @@ -188,6 +194,11 @@ struct prestera_msg_port_mdix_param { u8 admin_mode; }; +struct prestera_msg_port_flood_param { + u8 type; + u8 enable; +}; + union prestera_msg_port_param { u8 admin_state; u8 oper_state; @@ -205,6 +216,7 @@ union prestera_msg_port_param { struct prestera_msg_port_mdix_param mdix; struct prestera_msg_port_autoneg_param autoneg; struct prestera_msg_port_cap_param cap; + struct prestera_msg_port_flood_param flood_ext; }; struct prestera_msg_port_attr_req { @@ -988,7 +1000,43 @@ int prestera_hw_port_learning_set(struct prestera_port *port, bool enable) &req.cmd, sizeof(req)); } -int prestera_hw_port_flood_set(struct prestera_port *port, bool flood) +static int prestera_hw_port_uc_flood_set(struct prestera_port *port, bool flood) +{ + struct prestera_msg_port_attr_req req = { + .attr = PRESTERA_CMD_PORT_ATTR_FLOOD, + .port = port->hw_id, + .dev = port->dev_id, + .param = { + .flood_ext = { + .type = PRESTERA_PORT_FLOOD_TYPE_UC, + .enable = flood, + } + } + }; + + return prestera_cmd(port->sw, PRESTERA_CMD_TYPE_PORT_ATTR_SET, + &req.cmd, sizeof(req)); +} + +static int prestera_hw_port_mc_flood_set(struct prestera_port *port, bool flood) +{ + struct prestera_msg_port_attr_req req = { + .attr = PRESTERA_CMD_PORT_ATTR_FLOOD, + .port = port->hw_id, + .dev = port->dev_id, + .param = { + .flood_ext = { + .type = PRESTERA_PORT_FLOOD_TYPE_MC, + .enable = flood, + } + } + }; + + return prestera_cmd(port->sw, PRESTERA_CMD_TYPE_PORT_ATTR_SET, + &req.cmd, sizeof(req)); +} + +static int prestera_hw_port_flood_set_v2(struct prestera_port *port, bool flood) { struct prestera_msg_port_attr_req req = { .attr = PRESTERA_CMD_PORT_ATTR_FLOOD, @@ -1003,6 +1051,41 @@ int prestera_hw_port_flood_set(struct prestera_port *port, bool flood) &req.cmd, sizeof(req)); } +int prestera_hw_port_flood_set(struct prestera_port *port, unsigned long mask, + unsigned long val) +{ + int err; + + if (port->sw->dev->fw_rev.maj <= 2) { + if (!(mask & BR_FLOOD)) + return 0; + + return prestera_hw_port_flood_set_v2(port, val & BR_FLOOD); + } + + if (mask & BR_FLOOD) { + err = prestera_hw_port_uc_flood_set(port, val & BR_FLOOD); + if (err) + goto err_uc_flood; + } + + if (mask & BR_MCAST_FLOOD) { + err = prestera_hw_port_mc_flood_set(port, val & BR_MCAST_FLOOD); + if (err) + goto err_mc_flood; + } + + return 0; + +err_mc_flood: + prestera_hw_port_mc_flood_set(port, 0); +err_uc_flood: + if (mask & BR_FLOOD) + prestera_hw_port_uc_flood_set(port, 0); + + return err; +} + int prestera_hw_vlan_create(struct prestera_switch *sw, u16 vid) { struct prestera_msg_vlan_req req = { diff --git a/drivers/net/ethernet/marvell/prestera/prestera_hw.h b/drivers/net/ethernet/marvell/prestera/prestera_hw.h index b2b5ac95b4e3..e8dd0e2b81d2 100644 --- a/drivers/net/ethernet/marvell/prestera/prestera_hw.h +++ b/drivers/net/ethernet/marvell/prestera/prestera_hw.h @@ -138,7 +138,8 @@ int prestera_hw_port_mdix_get(const struct prestera_port *port, u8 *status, int prestera_hw_port_mdix_set(const struct prestera_port *port, u8 mode); int prestera_hw_port_speed_get(const struct prestera_port *port, u32 *speed); int prestera_hw_port_learning_set(struct prestera_port *port, bool enable); -int prestera_hw_port_flood_set(struct prestera_port *port, bool flood); +int prestera_hw_port_flood_set(struct prestera_port *port, unsigned long mask, + unsigned long val); int prestera_hw_port_accept_frm_type(struct prestera_port *port, enum prestera_accept_frm_type type); /* Vlan API */ diff --git a/drivers/net/ethernet/marvell/prestera/prestera_switchdev.c b/drivers/net/ethernet/marvell/prestera/prestera_switchdev.c index cb564890a3dc..6442dc411285 100644 --- a/drivers/net/ethernet/marvell/prestera/prestera_switchdev.c +++ b/drivers/net/ethernet/marvell/prestera/prestera_switchdev.c @@ -404,7 +404,8 @@ prestera_bridge_1d_port_join(struct prestera_bridge_port *br_port) if (err) return err; - err = prestera_hw_port_flood_set(port, br_port->flags & BR_FLOOD); + err = prestera_hw_port_flood_set(port, BR_FLOOD | BR_MCAST_FLOOD, + br_port->flags); if (err) goto err_port_flood_set; @@ -415,7 +416,6 @@ prestera_bridge_1d_port_join(struct prestera_bridge_port *br_port) return 0; err_port_learning_set: - prestera_hw_port_flood_set(port, false); err_port_flood_set: prestera_hw_bridge_port_delete(port, bridge->bridge_id); @@ -528,7 +528,7 @@ static void prestera_port_bridge_leave(struct prestera_port *port, prestera_bridge_1d_port_leave(br_port); prestera_hw_port_learning_set(port, false); - prestera_hw_port_flood_set(port, false); + prestera_hw_port_flood_set(port, BR_FLOOD | BR_MCAST_FLOOD, 0); prestera_port_vid_stp_set(port, PRESTERA_VID_ALL, BR_STATE_FORWARDING); prestera_bridge_port_put(br_port); } @@ -590,11 +590,9 @@ static int prestera_port_attr_br_flags_set(struct prestera_port *port, if (!br_port) return 0; - if (flags.mask & BR_FLOOD) { - err = prestera_hw_port_flood_set(port, flags.val & BR_FLOOD); - if (err) - return err; - } + err = prestera_hw_port_flood_set(port, flags.mask, flags.val); + if (err) + return err; if (flags.mask & BR_LEARNING) { err = prestera_hw_port_learning_set(port, @@ -901,7 +899,8 @@ prestera_port_vlan_bridge_join(struct prestera_port_vlan *port_vlan, if (port_vlan->br_port) return 0; - err = prestera_hw_port_flood_set(port, br_port->flags & BR_FLOOD); + err = prestera_hw_port_flood_set(port, BR_FLOOD | BR_MCAST_FLOOD, + br_port->flags); if (err) return err; From patchwork Thu May 20 15:35:00 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vadym Kochan X-Patchwork-Id: 443837 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER, INCLUDES_PATCH, MAILING_LIST_MULTI, MSGID_FROM_MTA_HEADER, SPF_HELO_NONE, SPF_PASS, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3D84CC43461 for ; Thu, 20 May 2021 15:36:04 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 28F3360FE7 for ; Thu, 20 May 2021 15:36:04 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S243939AbhETPhY (ORCPT ); Thu, 20 May 2021 11:37:24 -0400 Received: from mail-vi1eur05on2090.outbound.protection.outlook.com ([40.107.21.90]:8577 "EHLO EUR05-VI1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S240517AbhETPhP (ORCPT ); Thu, 20 May 2021 11:37:15 -0400 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=eYA6Nat/v0kXeJhRUqNIDMbD023sPi5pXVKadTSOzDhMeNOuBoIbe0ug0NCoBQ8HNro67+boMUD3SdifbbsK28tosblO9dCGCbPWS//9pQn3p4vxmrvZ3GtYY4CI9TvMRmeignHcNUDqwICqsHWb7VC9zYvlM+1hCxcH8f6xlOyRR6DJ2vQNNg3cZnkX277XnYNyRioCpWRqfzhsQHKOSSyZkuxRbMYd3PeWUmmcdzqiWSikzx+bce5YU7hBN1xc5bWU5rICvpq67RhaGSby2UigoDIlnfA6GJksx3uXUnW0EqebYfo5U82bNebouT9YEaAeTEDnZ1KNd+k8RoHEKg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=05sY2SRMHPIV4oXtcsnvXFpQaIN1643PIPcK1mV8zyo=; b=I3TVmGrEX2o3Rg+6mG+TsUipiLH14e1oKyEkPOI4feRajtyGuP3F8vSCuH0elY8xw4fpfzhps0qwIFbmO0P5cL0RNnKEJF6xr1Ww/JQ9oXibWdNcW3qxKBr0IGby9YhUHMxAh5SBhrsysaBqvsLzqtLw3ZLtaEyIYr5jdEfnlRP13XfuW9fLeUn7WBs09pr7DAyTIe8lWYPiw9qLm7eaoHlfBKMmx7AJOIzi0Vam08a4rl0k7Fj7qWO3PbckbGzrUgnxHXUDskxrfw6EmoV5Ww8jYoY7GBYdmt8V44Xr2ciwLIklr59mCr28cvQ9E5JtcE8BL+0NAuLSUuemcnpKfA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=plvision.eu; dmarc=pass action=none header.from=plvision.eu; dkim=pass header.d=plvision.eu; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=plvision.eu; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=05sY2SRMHPIV4oXtcsnvXFpQaIN1643PIPcK1mV8zyo=; b=XVMXhaVJcDz4FIHedaXAyM15VllUm9CwmVc7438Eo29IjruX0JyIGIYpL0/OYZups840E1yZoxndAPMkAL+mPGKOzYXdLRmG+FWsbJTFzAxr+0YwakbvJpozgir+3PHi+CRhVyfdrN38bxvkH2lA1soMJDe8YCHe/+NfA5akoVc= Authentication-Results: davemloft.net; dkim=none (message not signed) header.d=none; davemloft.net; dmarc=none action=none header.from=plvision.eu; Received: from HE1P190MB0539.EURP190.PROD.OUTLOOK.COM (2603:10a6:7:56::28) by HE1P190MB0268.EURP190.PROD.OUTLOOK.COM (2603:10a6:7:62::24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4129.28; Thu, 20 May 2021 15:35:47 +0000 Received: from HE1P190MB0539.EURP190.PROD.OUTLOOK.COM ([fe80::edb4:ae92:2efe:8c8a]) by HE1P190MB0539.EURP190.PROD.OUTLOOK.COM ([fe80::edb4:ae92:2efe:8c8a%5]) with mapi id 15.20.4129.033; Thu, 20 May 2021 15:35:46 +0000 From: Vadym Kochan To: "David S. Miller" , Jakub Kicinski , netdev@vger.kernel.org, Andrew Lunn Cc: Vadym Kochan , Taras Chornyi , linux-kernel@vger.kernel.org, Mickey Rachamim , Vadym Kochan Subject: [RFC net-next v2 4/4] net: marvell: prestera: try to load previous fw version Date: Thu, 20 May 2021 18:35:00 +0300 Message-Id: <20210520153500.22930-5-vadym.kochan@plvision.eu> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20210520153500.22930-1-vadym.kochan@plvision.eu> References: <20210520153500.22930-1-vadym.kochan@plvision.eu> X-Originating-IP: [217.20.186.93] X-ClientProxiedBy: AM4PR0101CA0065.eurprd01.prod.exchangelabs.com (2603:10a6:200:41::33) To HE1P190MB0539.EURP190.PROD.OUTLOOK.COM (2603:10a6:7:56::28) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from pc60716vkochan.x.ow.s (217.20.186.93) by AM4PR0101CA0065.eurprd01.prod.exchangelabs.com (2603:10a6:200:41::33) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4150.23 via Frontend Transport; Thu, 20 May 2021 15:35:46 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 1cd24824-bfde-4859-5f50-08d91ba4f024 X-MS-TrafficTypeDiagnostic: HE1P190MB0268: X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:216; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: RP571Y7hY8CRi2HhaGVjk45hcTdbVjblgkmPLjQTfvC5UzZ4VlJHvYtHNkyuOSpgb6a6pLNnUU+GGdklq1h5kxorHPAKzj4250tA9JVMj3pQS57Bibdoo29VDvjsxgOVlEsr//Psm3ZofG4vjrOb7ar5OrjSVveU8ubcWVFPfY0no3iNt7SG1tRcoc0K167L3W0eJKMIgeKrc4iNw1DtMP+4UHOsoZvnOQYxzSaNIlFrDQhlciELP7hwRQR/g7okxpEplk7aV7eVZYhuHGymuMloRBHMNoYMFXsznu6FUKOOgl6v36dgUz/C89zVSmuxL2Oj5/HZC3WUYC3cmAYx34ZRJHEFKMsSlqVhHzq9LQ71z9Kpr3f0gwuexTnt+0c7zp8rHuQpINL9Ac1cknOgt9y021frBXp2kYSe2oWD/4h+Ifh6pAofLIkvmUCxlkEJLs7akCoh01iKVVCjPGNJ9ZEEA6zq2puHvSupIYmV75bJH1c8Or46yWDYieMxu32uZXSA/uNEbj1THsNQiuXSUFuNfVv5L8mxXBD2srjfTOfn1LE0i9+IJnH2cyoRs12p+Qf5wFZsroEdPnI0/oF43MSRVWOPEN4p7mGEkASHlu3oA1TwapROf03lWOxe3YZzYGxDNnmEUZ36dBb01Giz+Q== X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:HE1P190MB0539.EURP190.PROD.OUTLOOK.COM; PTR:; CAT:NONE; SFS:(396003)(136003)(376002)(39830400003)(346002)(366004)(6666004)(26005)(5660300002)(4326008)(6512007)(66476007)(8676002)(66946007)(316002)(66556008)(110136005)(956004)(54906003)(36756003)(186003)(16526019)(52116002)(1076003)(2906002)(8936002)(83380400001)(38100700002)(38350700002)(86362001)(2616005)(44832011)(6506007)(6486002)(478600001); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData: +PRCXYixVFsl1z9024c/9hf3FhWTTRk6rIrdJHVe1hVtkpDM7JVGpMXVNYxBYH7fn2ff5ixTSEsXbSmTGyULDm28MCTPf8ixPGKJB7gD19BVIvwCZVT4wcH1dl0QIY8jW526uMQ7NITkJGtW1cjIKQaPoTnat0SyA7IxfGNum5Eht01nvkqPA4+sBFO1bvJzWlNzVKlDV0y+pKgRfKm8iPNO54axyyk3tSDqfL6Z/h9JUaHKDCY8oQlmmD3ZaKE8huYTGn+5pBq6uUeRgsvd4V8IuEbT8wbh4tQhWImANBTtYv40zpii/cwCxUS9QScLHqHofygngdI0KdEwR768dc1I/Pq6d/M4sX+9Cxi65NxKaLfRkiZ2wly4omYRmgaWappweY8MWdXIattRAsSnWQI0V8jKSE3F+6pqOvhuTRdTbTcSylWoA4pyMcdIf/jFKF+plzMi3Rz7BbEUZCZlXa2ujLGr0//YEKt1V+X+64k5Nt2A82EZQn16zZf2xFbSHnRq58Y52yudcVT3+W54tPiOAbyedFdoq+R3ajiCUijc4qcyP/lcMUWjKhsU+WKH0ZEo/jLPAQla0NqIaaaTOrMpZAQMADMaNLFjtNS7CCH1KUyz/q3WrnLP0E06TPjL+C91EECvC8iYpu6alqj72+4nc2nmcb5IOKpNxXPyYGfYpZozSlvRkyaeXFSWvYXtIpDrkYH/pOHdipULxrxNS5YbvafojqZemy1HBg7qyzoml6nWYTyJk0E5fxSqIQJbFWuqXb9tDT19PQGRTp+4dAvBqVFzmEkyROGcYu+4ALXY+94UxXJ0Zbll6MKr9WaO5wKBuyh52bTZ95nXNcXiSoWvdXRoZrRqhIHv4nQK0SOUEp3VO0lsWiTRk14vgHXQn4qVNUfBH9MYxapsE8gukLpjWVnjJXfGFRvnp/8ysmP7IktSFBqi8N2VwUOapMMCbTBBb3XlWXbskHr25BrqpTpJWS8pfCQVE8bVAs1/LFLkGc0Av77kbstXh5uwJUKJQbLfDf5PJMQOwYl8crOs9OUpeGynokvMjjZQ58TsY3AKs9+0Mmx22B+33qyY4mt5HO5NG1HuwYPj5wOYuo0qaMxG+v2cAKZcAX3vK9z657T7mEhZ41tjOUwLsJAHqpue5pm6Obe+/vZTdmuXEH9gaRnjpD/plnEIGAF2P73bFmjQf0zKncU4EDrrRZ4oMaa3RVyQydfMi6Smi9amQCi5L2Xi6ySLYqGv3Rh8ecDndF+Ibo/SYouK5ePHxgGvwYQSsk3c02qTYhLRZfzHGKCEz9Db4TugCvrh31XHvkQ2N0xm+zmErEn0D64A6f4eIPK5 X-OriginatorOrg: plvision.eu X-MS-Exchange-CrossTenant-Network-Message-Id: 1cd24824-bfde-4859-5f50-08d91ba4f024 X-MS-Exchange-CrossTenant-AuthSource: HE1P190MB0539.EURP190.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 20 May 2021 15:35:46.8617 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 03707b74-30f3-46b6-a0e0-ff0a7438c9c4 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: PnHXb9956wO/qEdoq3KNgzta8gBX1C4TTRmj6faQL2otzDMqIsbjYuXCd8i2WNq0JrZBtt49yI1HiIl3GpTX2kxIDq/cbVIaaD8lqMtoCEk= X-MS-Exchange-Transport-CrossTenantHeadersStamped: HE1P190MB0268 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Vadym Kochan Lets try to load previous fw version in case the latest one is missing on existing system. Signed-off-by: Vadym Kochan --- Notes: RFCv2: 1) Get rid of automatic decrementing of major version but hard code it. 2) Print error message with file path if previous FW could not be loaded. .../ethernet/marvell/prestera/prestera_pci.c | 83 ++++++++++++++----- 1 file changed, 61 insertions(+), 22 deletions(-) diff --git a/drivers/net/ethernet/marvell/prestera/prestera_pci.c b/drivers/net/ethernet/marvell/prestera/prestera_pci.c index 5edd4d2ac672..a250d394da38 100644 --- a/drivers/net/ethernet/marvell/prestera/prestera_pci.c +++ b/drivers/net/ethernet/marvell/prestera/prestera_pci.c @@ -17,6 +17,9 @@ #define PRESTERA_SUPP_FW_MAJ_VER 3 #define PRESTERA_SUPP_FW_MIN_VER 0 +#define PRESTERA_PREV_FW_MAJ_VER 2 +#define PRESTERA_PREV_FW_MIN_VER 0 + #define PRESTERA_FW_PATH_FMT "mrvl/prestera/mvsw_prestera_fw-v%u.%u.img" #define PRESTERA_FW_HDR_MAGIC 0x351D9D06 @@ -172,6 +175,8 @@ struct prestera_fw_evtq { }; struct prestera_fw { + struct prestera_fw_rev rev_supp; + const struct firmware *bin; struct workqueue_struct *wq; struct prestera_device dev; u8 __iomem *ldr_regs; @@ -595,25 +600,24 @@ static void prestera_fw_rev_parse(const struct prestera_fw_header *hdr, static int prestera_fw_rev_check(struct prestera_fw *fw) { struct prestera_fw_rev *rev = &fw->dev.fw_rev; - u16 maj_supp = PRESTERA_SUPP_FW_MAJ_VER; - u16 min_supp = PRESTERA_SUPP_FW_MIN_VER; - if (rev->maj == maj_supp && rev->min >= min_supp) + if (rev->maj == fw->rev_supp.maj && rev->min >= fw->rev_supp.min) return 0; dev_err(fw->dev.dev, "Driver supports FW version only '%u.%u.x'", - PRESTERA_SUPP_FW_MAJ_VER, PRESTERA_SUPP_FW_MIN_VER); + fw->rev_supp.maj, fw->rev_supp.min); return -EINVAL; } -static int prestera_fw_hdr_parse(struct prestera_fw *fw, - const struct firmware *img) +static int prestera_fw_hdr_parse(struct prestera_fw *fw) { - struct prestera_fw_header *hdr = (struct prestera_fw_header *)img->data; struct prestera_fw_rev *rev = &fw->dev.fw_rev; + struct prestera_fw_header *hdr; u32 magic; + hdr = (struct prestera_fw_header *)fw->bin->data; + magic = be32_to_cpu(hdr->magic_number); if (magic != PRESTERA_FW_HDR_MAGIC) { dev_err(fw->dev.dev, "FW img hdr magic is invalid"); @@ -628,11 +632,52 @@ static int prestera_fw_hdr_parse(struct prestera_fw *fw, return prestera_fw_rev_check(fw); } +static int prestera_fw_get(struct prestera_fw *fw) +{ + int ver_maj = PRESTERA_SUPP_FW_MAJ_VER; + int ver_min = PRESTERA_SUPP_FW_MIN_VER; + char fw_path[128]; + int err; + +pick_fw_ver: + snprintf(fw_path, sizeof(fw_path), PRESTERA_FW_PATH_FMT, + ver_maj, ver_min); + + err = request_firmware_direct(&fw->bin, fw_path, fw->dev.dev); + if (err) { + if (ver_maj == PRESTERA_SUPP_FW_MAJ_VER) { + ver_maj = PRESTERA_PREV_FW_MAJ_VER; + ver_min = PRESTERA_PREV_FW_MIN_VER; + + dev_warn(fw->dev.dev, + "missing latest %s firmware, fall-back to previous %u.%u version\n", + fw_path, ver_maj, ver_min); + + goto pick_fw_ver; + } else { + dev_err(fw->dev.dev, "failed to request previous firmware: %s\n", + fw_path); + return err; + } + } + + dev_info(fw->dev.dev, "Loading %s ...", fw_path); + + fw->rev_supp.maj = ver_maj; + fw->rev_supp.min = ver_min; + fw->rev_supp.sub = 0; + + return 0; +} + +static void prestera_fw_put(struct prestera_fw *fw) +{ + release_firmware(fw->bin); +} + static int prestera_fw_load(struct prestera_fw *fw) { size_t hlen = sizeof(struct prestera_fw_header); - const struct firmware *f; - char fw_path[128]; int err; err = prestera_ldr_wait_reg32(fw, PRESTERA_LDR_READY_REG, @@ -651,30 +696,24 @@ static int prestera_fw_load(struct prestera_fw *fw) fw->ldr_wr_idx = 0; - snprintf(fw_path, sizeof(fw_path), PRESTERA_FW_PATH_FMT, - PRESTERA_SUPP_FW_MAJ_VER, PRESTERA_SUPP_FW_MIN_VER); - - err = request_firmware_direct(&f, fw_path, fw->dev.dev); - if (err) { - dev_err(fw->dev.dev, "failed to request firmware file\n"); + err = prestera_fw_get(fw); + if (err) return err; - } - err = prestera_fw_hdr_parse(fw, f); + err = prestera_fw_hdr_parse(fw); if (err) { dev_err(fw->dev.dev, "FW image header is invalid\n"); goto out_release; } - prestera_ldr_write(fw, PRESTERA_LDR_IMG_SIZE_REG, f->size - hlen); + prestera_ldr_write(fw, PRESTERA_LDR_IMG_SIZE_REG, fw->bin->size - hlen); prestera_ldr_write(fw, PRESTERA_LDR_CTL_REG, PRESTERA_LDR_CTL_DL_START); - dev_info(fw->dev.dev, "Loading %s ...", fw_path); - - err = prestera_ldr_fw_send(fw, f->data + hlen, f->size - hlen); + err = prestera_ldr_fw_send(fw, fw->bin->data + hlen, + fw->bin->size - hlen); out_release: - release_firmware(f); + prestera_fw_put(fw); return err; }