From mboxrd@z Thu Jan 1 00:00:00 1970 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=-9.1 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,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 36A77C43381 for ; Fri, 22 Feb 2019 13:57:06 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id CCD9F2075C for ; Fri, 22 Feb 2019 13:57:05 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=Mellanox.com header.i=@Mellanox.com header.b="cRRwjIRB" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726923AbfBVN5F (ORCPT ); Fri, 22 Feb 2019 08:57:05 -0500 Received: from mail-eopbgr150071.outbound.protection.outlook.com ([40.107.15.71]:17186 "EHLO EUR01-DB5-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1726275AbfBVN5E (ORCPT ); Fri, 22 Feb 2019 08:57:04 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Mellanox.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=op4ErPMQO5xWK5mQEVH3FYzJ+j3jaBMtqFAg36pQzLE=; b=cRRwjIRBT68Tst3n/GRZa1M8J9gcCOalzE8S/85s+ltQBauJtzYcD6Rttk6lKH+fIy4ZnNADmj1pc2cACFvQblkKH6S0uhP+IKS59ouQQLhnJrv7r6q2dz7GPMFmDbSnSwN6EUviK6ENeAcEB3GVE5Z8nbFFO/fsA8J58sDQk2E= Received: from AM6PR05MB5240.eurprd05.prod.outlook.com (20.177.196.214) by AM6PR05MB4358.eurprd05.prod.outlook.com (52.135.162.23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1622.19; Fri, 22 Feb 2019 13:56:40 +0000 Received: from AM6PR05MB5240.eurprd05.prod.outlook.com ([fe80::3542:889c:3a85:3866]) by AM6PR05MB5240.eurprd05.prod.outlook.com ([fe80::3542:889c:3a85:3866%5]) with mapi id 15.20.1643.014; Fri, 22 Feb 2019 13:56:40 +0000 From: Ido Schimmel To: "netdev@vger.kernel.org" CC: "davem@davemloft.net" , Jiri Pirko , Shalom Toledo , mlxsw , Ido Schimmel Subject: [PATCH net-next 05/10] mlxsw: spectrum: Add port type-speed operations Thread-Topic: [PATCH net-next 05/10] mlxsw: spectrum: Add port type-speed operations Thread-Index: AQHUyrZvwMnDnfyx+U6UWat2YS/zZQ== Date: Fri, 22 Feb 2019 13:56:40 +0000 Message-ID: <20190222135613.27692-6-idosch@mellanox.com> References: <20190222135613.27692-1-idosch@mellanox.com> In-Reply-To: <20190222135613.27692-1-idosch@mellanox.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-clientproxiedby: AM6PR10CA0017.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:209:89::30) To AM6PR05MB5240.eurprd05.prod.outlook.com (2603:10a6:20b:64::22) authentication-results: spf=none (sender IP is ) smtp.mailfrom=idosch@mellanox.com; x-ms-exchange-messagesentrepresentingtype: 1 x-mailer: git-send-email 2.20.1 x-originating-ip: [79.176.7.115] x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: 519de607-9e49-4e83-1716-08d698cd91db x-ms-office365-filtering-ht: Tenant x-microsoft-antispam: BCL:0;PCL:0;RULEID:(2390118)(7020095)(4652040)(8989299)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(5600110)(711020)(4605104)(4618075)(2017052603328)(7153060)(7193020);SRVR:AM6PR05MB4358; x-ms-traffictypediagnostic: AM6PR05MB4358: x-microsoft-exchange-diagnostics: =?iso-8859-1?Q?1;AM6PR05MB4358;23:eOYOhXKGikVyAABnIijglTjxK+ozaK9gY1JQ9x7?= =?iso-8859-1?Q?Q/5y47OToJDscjD6IpVjjuZ9YxxdRJw8/zl3mbjDrdF0RPVqkvJTh0l/Og?= =?iso-8859-1?Q?IsqudRf8nhatf7uuwDc3EyCVlSE7gTsdG7z3ruDNBvm9GUEoPLrvR48lMq?= =?iso-8859-1?Q?PcOozggCny5oMH7FLMRriVQaCkHNJdaiNvupShjMKuwkmjJqH1cCnuJCwg?= =?iso-8859-1?Q?Uy8mY+/oR6yaFPangB7CgvTongrsnB+tsQJSErmXW62drLccE/Z7hg2vHh?= =?iso-8859-1?Q?/1ERDKnfuFq+EMLhPMsruqrx8GMxQC5AJpWO07oQeZOo67PSAUE8cj0JMF?= =?iso-8859-1?Q?YR0wh2hUlSCSkNLLaBzAjZepfSDSwVYdEVlpTfLOH7ePPBh/qmPsoptNIZ?= =?iso-8859-1?Q?zFIx7E6Rtdm5SYdgfvJRc8jL6J67OWlFbE2U8xCKxOItYzTtGycguLreDe?= =?iso-8859-1?Q?PTHbsZCRODVmjJkJH1wcQCpquBEKASR3OeBjofEmK+MHHesLCN6B4JzzyS?= =?iso-8859-1?Q?RiSCSuRrDgXxkQfkdySMuxyfYitKwF/dAk99YXkLI5Wl8odEwj8CX89QiJ?= =?iso-8859-1?Q?pQKnFZBHmXY53nacVnte8gBEn0xnaJ+pKoJb0A0W7dhBkHF1tQUPyG5UPn?= =?iso-8859-1?Q?UOCtlQXfd6Lt2Zap016bvrnXvhFj1Gz/8nD1C4g3ZQcP2YUewnw08K6sNy?= =?iso-8859-1?Q?xgWkRH+RwDZwKfgq6RmvFGZc2LSNXe8x7cBK/CS7wPSK0nWKiVHxUP/BIl?= =?iso-8859-1?Q?E8A6i8ZJxf4cb1CN1LZsotjbUfHfdlvtYJ/xU2HJWImeJw6pCUsmBr8VGy?= =?iso-8859-1?Q?DqqYQBb4fRkO3eWE9mJA5ILkebh5XVP3Qt3+S2rWpYlODmDBZEqOFjoB8z?= =?iso-8859-1?Q?Nx966N4yMSgygZHnSb4Y9eBRli43z3M72ej5QtTZ3xaThFJNhl3eZRVwt6?= =?iso-8859-1?Q?hnujnjf8W1oJNG1DLU7Yd78LgjNXjSltP226CfC8T+m+yrlP4ImcRA8y6B?= =?iso-8859-1?Q?WbnBqQMuP8yI4PBesF93997qC5PDDfuy/ZrMmfMt40+k8C9ysgXEKqMmCh?= =?iso-8859-1?Q?yivx0TWidsUjaYeWa4Ew5Vp6kVIoyUHK18jCdrI1CurDJA5R99LEAcdD3x?= =?iso-8859-1?Q?+ivpiz3wAafV2PbFLIm+jPXYyek/NpaBatkNC6gZtv+F95LQEIq39CmEpY?= =?iso-8859-1?Q?Gm6VcSLPzQTJD4vYXk+afEp6uk5sU81/BNw4uIrZplRlp5r7pYQ4L8Z7OA?= =?iso-8859-1?Q?j1k/ec3Ou1hh9zKH3yHPXYcC5+AHTERFoSZyoS813FrCNavmY33BIc9391?= =?iso-8859-1?Q?cwjYcmcCieyi2LAMtJzuPxwp2r7litsycFn7dLQ2zD4bYElbQte7olt9ZP?= =?iso-8859-1?Q?uygDGkISvs72YVa7g/BubJl+I/PNS/K5srn25TlKL5izbe9LTow=3D=3D?= x-microsoft-antispam-prvs: x-forefront-prvs: 09565527D6 x-forefront-antispam-report: SFV:NSPM;SFS:(10009020)(366004)(39860400002)(346002)(136003)(376002)(396003)(189003)(199004)(81166006)(99286004)(3846002)(66066001)(50226002)(81156014)(11346002)(1730700003)(68736007)(2351001)(26005)(478600001)(8676002)(25786009)(6116002)(14454004)(97736004)(6916009)(6512007)(316002)(8936002)(6486002)(256004)(14444005)(5640700003)(54906003)(6436002)(105586002)(6506007)(186003)(106356001)(386003)(7736002)(5660300002)(76176011)(1076003)(30864003)(52116002)(476003)(107886003)(86362001)(2906002)(53936002)(71190400001)(2501003)(4326008)(486006)(102836004)(36756003)(446003)(71200400001)(305945005)(2616005);DIR:OUT;SFP:1101;SCL:1;SRVR:AM6PR05MB4358;H:AM6PR05MB5240.eurprd05.prod.outlook.com;FPR:;SPF:None;LANG:en;PTR:InfoNoRecords;MX:1;A:1; received-spf: None (protection.outlook.com: mellanox.com does not designate permitted sender hosts) x-ms-exchange-senderadcheck: 1 x-microsoft-antispam-message-info: V4YiqTBRmlaehGCresKle/ZdFsYQxhNS80IHzYa+E7T4YY+PgHxDCWi+HJ/2Ub98sIAmuyP8myacsbc+4iqzkg+rva48vkeiM8MFV3PSvKiIPKvgvgY5qgFaocVF6QlK+wCiW5AiGMWzwAsnsVms+RiTHTJpkWfDHAiFmaVTMhBCbtdvX8i1AKGYoMnLfixJ6TbClYEZjPiyfVH0k9+e3+RAZT+NhSy0aX+QbndcpXsm8d2QB+TENXPUbRdwD7AmnTcY59jri9gRf7UxDsfbCmX9LrKN+PWv9mon7p5fcd8StSgv2QQwzLSsS+ZNFif5nrXZUiUTU6Np+jWrG33gPiOSjnsGOCSSNjhi/H+okeKuNioEc9uJ8cU//i9p7csU8PRlTkBByliWYfSrNJdjBOaLw8bAp07JlzaHad2pIjQ= Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-OriginatorOrg: Mellanox.com X-MS-Exchange-CrossTenant-Network-Message-Id: 519de607-9e49-4e83-1716-08d698cd91db X-MS-Exchange-CrossTenant-originalarrivaltime: 22 Feb 2019 13:56:39.5701 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-id: a652971c-7d2e-4d9b-a6a4-d149256f461b X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM6PR05MB4358 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Shalom Toledo Add port type-speed operations in order to have different operations for different ASICs. For now, both ASICs use the same pointer. Signed-off-by: Shalom Toledo Acked-by: Jiri Pirko Signed-off-by: Ido Schimmel --- .../net/ethernet/mellanox/mlxsw/spectrum.c | 137 ++++++++++++++---- .../net/ethernet/mellanox/mlxsw/spectrum.h | 27 +++- 2 files changed, 133 insertions(+), 31 deletions(-) diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c b/drivers/net/e= thernet/mellanox/mlxsw/spectrum.c index 4824037248e8..fc0e7924233e 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c @@ -2473,7 +2473,8 @@ static const struct mlxsw_sp1_port_link_mode mlxsw_sp= 1_port_link_mode[] =3D { #define MLXSW_SP1_PORT_LINK_MODE_LEN ARRAY_SIZE(mlxsw_sp1_port_link_mode) =20 static void -mlxsw_sp1_from_ptys_supported_port(u32 ptys_eth_proto, +mlxsw_sp1_from_ptys_supported_port(struct mlxsw_sp *mlxsw_sp, + u32 ptys_eth_proto, struct ethtool_link_ksettings *cmd) { if (ptys_eth_proto & (MLXSW_REG_PTYS_ETH_SPEED_10GBASE_CR | @@ -2492,7 +2493,9 @@ mlxsw_sp1_from_ptys_supported_port(u32 ptys_eth_proto= , ethtool_link_ksettings_add_link_mode(cmd, supported, Backplane); } =20 -static void mlxsw_sp1_from_ptys_link(u32 ptys_eth_proto, unsigned long *mo= de) +static void +mlxsw_sp1_from_ptys_link(struct mlxsw_sp *mlxsw_sp, u32 ptys_eth_proto, + unsigned long *mode) { int i; =20 @@ -2504,7 +2507,8 @@ static void mlxsw_sp1_from_ptys_link(u32 ptys_eth_pro= to, unsigned long *mode) } =20 static void -mlxsw_sp1_from_ptys_speed_duplex(bool carrier_ok, u32 ptys_eth_proto, +mlxsw_sp1_from_ptys_speed_duplex(struct mlxsw_sp *mlxsw_sp, bool carrier_o= k, + u32 ptys_eth_proto, struct ethtool_link_ksettings *cmd) { u32 speed =3D SPEED_UNKNOWN; @@ -2527,7 +2531,8 @@ mlxsw_sp1_from_ptys_speed_duplex(bool carrier_ok, u32= ptys_eth_proto, } =20 static u32 -mlxsw_sp1_to_ptys_advert_link(const struct ethtool_link_ksettings *cmd) +mlxsw_sp1_to_ptys_advert_link(struct mlxsw_sp *mlxsw_sp, + const struct ethtool_link_ksettings *cmd) { u32 ptys_proto =3D 0; int i; @@ -2540,7 +2545,7 @@ mlxsw_sp1_to_ptys_advert_link(const struct ethtool_li= nk_ksettings *cmd) return ptys_proto; } =20 -static u32 mlxsw_sp1_to_ptys_speed(u32 speed) +static u32 mlxsw_sp1_to_ptys_speed(struct mlxsw_sp *mlxsw_sp, u32 speed) { u32 ptys_proto =3D 0; int i; @@ -2552,7 +2557,8 @@ static u32 mlxsw_sp1_to_ptys_speed(u32 speed) return ptys_proto; } =20 -static u32 mlxsw_sp1_to_ptys_upper_speed(u32 upper_speed) +static u32 +mlxsw_sp1_to_ptys_upper_speed(struct mlxsw_sp *mlxsw_sp, u32 upper_speed) { u32 ptys_proto =3D 0; int i; @@ -2564,25 +2570,74 @@ static u32 mlxsw_sp1_to_ptys_upper_speed(u32 upper_= speed) return ptys_proto; } =20 -static void mlxsw_sp_port_get_link_supported(u32 eth_proto_cap, - struct ethtool_link_ksettings *cmd) +static int +mlxsw_sp1_port_speed_base(struct mlxsw_sp *mlxsw_sp, u8 local_port, + u32 *base_speed) +{ + *base_speed =3D MLXSW_SP_PORT_BASE_SPEED_25G; + return 0; +} + +static void +mlxsw_sp1_reg_ptys_eth_pack(struct mlxsw_sp *mlxsw_sp, char *payload, + u8 local_port, u32 proto_admin, bool autoneg) +{ + mlxsw_reg_ptys_eth_pack(payload, local_port, proto_admin, autoneg); +} + +static void +mlxsw_sp1_reg_ptys_eth_unpack(struct mlxsw_sp *mlxsw_sp, char *payload, + u32 *p_eth_proto_cap, u32 *p_eth_proto_admin, + u32 *p_eth_proto_oper) +{ + mlxsw_reg_ptys_eth_unpack(payload, p_eth_proto_cap, p_eth_proto_admin, + p_eth_proto_oper); +} + +static const struct mlxsw_sp_port_type_speed_ops +mlxsw_sp1_port_type_speed_ops =3D { + .from_ptys_supported_port =3D mlxsw_sp1_from_ptys_supported_port, + .from_ptys_link =3D mlxsw_sp1_from_ptys_link, + .from_ptys_speed_duplex =3D mlxsw_sp1_from_ptys_speed_duplex, + .to_ptys_advert_link =3D mlxsw_sp1_to_ptys_advert_link, + .to_ptys_speed =3D mlxsw_sp1_to_ptys_speed, + .to_ptys_upper_speed =3D mlxsw_sp1_to_ptys_upper_speed, + .port_speed_base =3D mlxsw_sp1_port_speed_base, + .reg_ptys_eth_pack =3D mlxsw_sp1_reg_ptys_eth_pack, + .reg_ptys_eth_unpack =3D mlxsw_sp1_reg_ptys_eth_unpack, +}; + +static void +mlxsw_sp_port_get_link_supported(struct mlxsw_sp *mlxsw_sp, u32 eth_proto_= cap, + struct ethtool_link_ksettings *cmd) { + const struct mlxsw_sp_port_type_speed_ops *ops; + + ops =3D mlxsw_sp->port_type_speed_ops; + ethtool_link_ksettings_add_link_mode(cmd, supported, Asym_Pause); ethtool_link_ksettings_add_link_mode(cmd, supported, Autoneg); ethtool_link_ksettings_add_link_mode(cmd, supported, Pause); =20 - mlxsw_sp1_from_ptys_supported_port(eth_proto_cap, cmd); - mlxsw_sp1_from_ptys_link(eth_proto_cap, cmd->link_modes.supported); + ops->from_ptys_supported_port(mlxsw_sp, eth_proto_cap, cmd); + ops->from_ptys_link(mlxsw_sp, eth_proto_cap, cmd->link_modes.supported); } =20 -static void mlxsw_sp_port_get_link_advertise(u32 eth_proto_admin, bool aut= oneg, - struct ethtool_link_ksettings *cmd) +static void +mlxsw_sp_port_get_link_advertise(struct mlxsw_sp *mlxsw_sp, + u32 eth_proto_admin, bool autoneg, + struct ethtool_link_ksettings *cmd) { + const struct mlxsw_sp_port_type_speed_ops *ops; + + ops =3D mlxsw_sp->port_type_speed_ops; + if (!autoneg) return; =20 ethtool_link_ksettings_add_link_mode(cmd, advertising, Autoneg); - mlxsw_sp1_from_ptys_link(eth_proto_admin, cmd->link_modes.advertising); + ops->from_ptys_link(mlxsw_sp, eth_proto_admin, + cmd->link_modes.advertising); } =20 static u8 @@ -2619,31 +2674,36 @@ static int mlxsw_sp_port_get_link_ksettings(struct = net_device *dev, u32 eth_proto_cap, eth_proto_admin, eth_proto_oper; struct mlxsw_sp_port *mlxsw_sp_port =3D netdev_priv(dev); struct mlxsw_sp *mlxsw_sp =3D mlxsw_sp_port->mlxsw_sp; + const struct mlxsw_sp_port_type_speed_ops *ops; char ptys_pl[MLXSW_REG_PTYS_LEN]; u8 connector_type; u8 autoneg_status; bool autoneg; int err; =20 + ops =3D mlxsw_sp->port_type_speed_ops; + autoneg =3D mlxsw_sp_port->link.autoneg; - mlxsw_reg_ptys_eth_pack(ptys_pl, mlxsw_sp_port->local_port, 0, false); + ops->reg_ptys_eth_pack(mlxsw_sp, ptys_pl, mlxsw_sp_port->local_port, + 0, false); err =3D mlxsw_reg_query(mlxsw_sp->core, MLXSW_REG(ptys), ptys_pl); if (err) return err; - mlxsw_reg_ptys_eth_unpack(ptys_pl, ð_proto_cap, ð_proto_admin, - ð_proto_oper); + ops->reg_ptys_eth_unpack(mlxsw_sp, ptys_pl, ð_proto_cap, + ð_proto_admin, ð_proto_oper); =20 - mlxsw_sp_port_get_link_supported(eth_proto_cap, cmd); + mlxsw_sp_port_get_link_supported(mlxsw_sp, eth_proto_cap, cmd); =20 - mlxsw_sp_port_get_link_advertise(eth_proto_admin, autoneg, cmd); + mlxsw_sp_port_get_link_advertise(mlxsw_sp, eth_proto_admin, autoneg, + cmd); =20 autoneg_status =3D mlxsw_reg_ptys_an_status_get(ptys_pl); =20 cmd->base.autoneg =3D autoneg ? AUTONEG_ENABLE : AUTONEG_DISABLE; connector_type =3D mlxsw_reg_ptys_connector_type_get(ptys_pl); cmd->base.port =3D mlxsw_sp_port_connector_port(connector_type); - mlxsw_sp1_from_ptys_speed_duplex(netif_carrier_ok(dev), eth_proto_oper, - cmd); + ops->from_ptys_speed_duplex(mlxsw_sp, netif_carrier_ok(dev), + eth_proto_oper, cmd); =20 return 0; } @@ -2654,21 +2714,25 @@ mlxsw_sp_port_set_link_ksettings(struct net_device = *dev, { struct mlxsw_sp_port *mlxsw_sp_port =3D netdev_priv(dev); struct mlxsw_sp *mlxsw_sp =3D mlxsw_sp_port->mlxsw_sp; + const struct mlxsw_sp_port_type_speed_ops *ops; char ptys_pl[MLXSW_REG_PTYS_LEN]; u32 eth_proto_cap, eth_proto_new; bool autoneg; int err; =20 - mlxsw_reg_ptys_eth_pack(ptys_pl, mlxsw_sp_port->local_port, 0, false); + ops =3D mlxsw_sp->port_type_speed_ops; + + ops->reg_ptys_eth_pack(mlxsw_sp, ptys_pl, mlxsw_sp_port->local_port, + 0, false); err =3D mlxsw_reg_query(mlxsw_sp->core, MLXSW_REG(ptys), ptys_pl); if (err) return err; - mlxsw_reg_ptys_eth_unpack(ptys_pl, ð_proto_cap, NULL, NULL); + ops->reg_ptys_eth_unpack(mlxsw_sp, ptys_pl, ð_proto_cap, NULL, NULL); =20 autoneg =3D cmd->base.autoneg =3D=3D AUTONEG_ENABLE; eth_proto_new =3D autoneg ? - mlxsw_sp1_to_ptys_advert_link(cmd) : - mlxsw_sp1_to_ptys_speed(cmd->base.speed); + ops->to_ptys_advert_link(mlxsw_sp, cmd) : + ops->to_ptys_speed(mlxsw_sp, cmd->base.speed); =20 eth_proto_new =3D eth_proto_new & eth_proto_cap; if (!eth_proto_new) { @@ -2676,8 +2740,8 @@ mlxsw_sp_port_set_link_ksettings(struct net_device *d= ev, return -EINVAL; } =20 - mlxsw_reg_ptys_eth_pack(ptys_pl, mlxsw_sp_port->local_port, - eth_proto_new, autoneg); + ops->reg_ptys_eth_pack(mlxsw_sp, ptys_pl, mlxsw_sp_port->local_port, + eth_proto_new, autoneg); err =3D mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(ptys), ptys_pl); if (err) return err; @@ -2864,13 +2928,24 @@ static int mlxsw_sp_port_speed_by_width_set(struct mlxsw_sp_port *mlxsw_sp_port, u8 w= idth) { struct mlxsw_sp *mlxsw_sp =3D mlxsw_sp_port->mlxsw_sp; - u32 upper_speed =3D MLXSW_SP_PORT_BASE_SPEED * width; + const struct mlxsw_sp_port_type_speed_ops *ops; char ptys_pl[MLXSW_REG_PTYS_LEN]; u32 eth_proto_admin; + u32 upper_speed; + u32 base_speed; + int err; + + ops =3D mlxsw_sp->port_type_speed_ops; + + err =3D ops->port_speed_base(mlxsw_sp, mlxsw_sp_port->local_port, + &base_speed); + if (err) + return err; + upper_speed =3D base_speed * width; =20 - eth_proto_admin =3D mlxsw_sp1_to_ptys_upper_speed(upper_speed); - mlxsw_reg_ptys_eth_pack(ptys_pl, mlxsw_sp_port->local_port, - eth_proto_admin, mlxsw_sp_port->link.autoneg); + eth_proto_admin =3D ops->to_ptys_upper_speed(mlxsw_sp, upper_speed); + ops->reg_ptys_eth_pack(mlxsw_sp, ptys_pl, mlxsw_sp_port->local_port, + eth_proto_admin, mlxsw_sp_port->link.autoneg); return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(ptys), ptys_pl); } =20 @@ -4095,6 +4170,7 @@ static int mlxsw_sp1_init(struct mlxsw_core *mlxsw_co= re, mlxsw_sp->mac_mask =3D mlxsw_sp1_mac_mask; mlxsw_sp->rif_ops_arr =3D mlxsw_sp1_rif_ops_arr; mlxsw_sp->sb_vals =3D &mlxsw_sp1_sb_vals; + mlxsw_sp->port_type_speed_ops =3D &mlxsw_sp1_port_type_speed_ops; =20 return mlxsw_sp_init(mlxsw_core, mlxsw_bus_info); } @@ -4113,6 +4189,7 @@ static int mlxsw_sp2_init(struct mlxsw_core *mlxsw_co= re, mlxsw_sp->mac_mask =3D mlxsw_sp2_mac_mask; mlxsw_sp->rif_ops_arr =3D mlxsw_sp2_rif_ops_arr; mlxsw_sp->sb_vals =3D &mlxsw_sp2_sb_vals; + mlxsw_sp->port_type_speed_ops =3D &mlxsw_sp1_port_type_speed_ops; =20 return mlxsw_sp_init(mlxsw_core, mlxsw_bus_info); } diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.h b/drivers/net/e= thernet/mellanox/mlxsw/spectrum.h index 8bb83d0facc2..d4f53632b24c 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.h +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.h @@ -33,7 +33,7 @@ =20 #define MLXSW_SP_PORTS_PER_CLUSTER_MAX 4 =20 -#define MLXSW_SP_PORT_BASE_SPEED 25000 /* Mb/s */ +#define MLXSW_SP_PORT_BASE_SPEED_25G 25000 /* Mb/s */ =20 #define MLXSW_SP_KVD_LINEAR_SIZE 98304 /* entries */ #define MLXSW_SP_KVD_GRANULARITY 128 @@ -134,6 +134,7 @@ struct mlxsw_sp_mr_tcam_ops; struct mlxsw_sp_acl_tcam_ops; struct mlxsw_sp_nve_ops; struct mlxsw_sp_sb_vals; +struct mlxsw_sp_port_type_speed_ops; =20 struct mlxsw_sp { struct mlxsw_sp_port **ports; @@ -169,6 +170,7 @@ struct mlxsw_sp { const struct mlxsw_sp_nve_ops **nve_ops_arr; const struct mlxsw_sp_rif_ops **rif_ops_arr; const struct mlxsw_sp_sb_vals *sb_vals; + const struct mlxsw_sp_port_type_speed_ops *port_type_speed_ops; }; =20 static inline struct mlxsw_sp_upper * @@ -258,6 +260,29 @@ struct mlxsw_sp_port { struct mlxsw_sp_acl_block *eg_acl_block; }; =20 +struct mlxsw_sp_port_type_speed_ops { + void (*from_ptys_supported_port)(struct mlxsw_sp *mlxsw_sp, + u32 ptys_eth_proto, + struct ethtool_link_ksettings *cmd); + void (*from_ptys_link)(struct mlxsw_sp *mlxsw_sp, u32 ptys_eth_proto, + unsigned long *mode); + void (*from_ptys_speed_duplex)(struct mlxsw_sp *mlxsw_sp, + bool carrier_ok, u32 ptys_eth_proto, + struct ethtool_link_ksettings *cmd); + u32 (*to_ptys_advert_link)(struct mlxsw_sp *mlxsw_sp, + const struct ethtool_link_ksettings *cmd); + u32 (*to_ptys_speed)(struct mlxsw_sp *mlxsw_sp, u32 speed); + u32 (*to_ptys_upper_speed)(struct mlxsw_sp *mlxsw_sp, u32 upper_speed); + int (*port_speed_base)(struct mlxsw_sp *mlxsw_sp, u8 local_port, + u32 *base_speed); + void (*reg_ptys_eth_pack)(struct mlxsw_sp *mlxsw_sp, char *payload, + u8 local_port, u32 proto_admin, bool autoneg); + void (*reg_ptys_eth_unpack)(struct mlxsw_sp *mlxsw_sp, char *payload, + u32 *p_eth_proto_cap, + u32 *p_eth_proto_admin, + u32 *p_eth_proto_oper); +}; + static inline struct net_device * mlxsw_sp_bridge_vxlan_dev_find(struct net_device *br_dev) { --=20 2.20.1