From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751673AbdJBIiP (ORCPT ); Mon, 2 Oct 2017 04:38:15 -0400 Received: from mail-sn1nam02on0070.outbound.protection.outlook.com ([104.47.36.70]:35664 "EHLO NAM02-SN1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751127AbdJBIgg (ORCPT ); Mon, 2 Oct 2017 04:36:36 -0400 Authentication-Results: spf=fail (sender IP is 192.88.168.50) smtp.mailfrom=nxp.com; nxp.com; dkim=none (message not signed) header.d=none;nxp.com; dmarc=fail action=none header.from=nxp.com; From: Razvan Stefanescu To: CC: , , , , , , , , , Subject: [PATCH v2 3/6] staging: fsl-dpaa2/ethsw: Add ethtool support Date: Mon, 2 Oct 2017 11:36:17 +0300 Message-ID: <1506933380-12641-4-git-send-email-razvan.stefanescu@nxp.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1506933380-12641-1-git-send-email-razvan.stefanescu@nxp.com> References: <1506933380-12641-1-git-send-email-razvan.stefanescu@nxp.com> X-EOPAttributedMessage: 0 X-Matching-Connectors: 131514069933835838;(91ab9b29-cfa4-454e-5278-08d120cd25b8);() X-Forefront-Antispam-Report: CIP:192.88.168.50;IPV:NLI;CTRY:US;EFV:NLI;SFV:NSPM;SFS:(10009020)(6009001)(336005)(376002)(39380400002)(346002)(39860400002)(2980300002)(1109001)(1110001)(339900001)(189002)(54534003)(199003)(86362001)(81156014)(81166006)(5660300001)(2906002)(47776003)(356003)(33646002)(5003940100001)(36756003)(8936002)(8656003)(8676002)(6916009)(7416002)(498600001)(2950100002)(54906003)(77096006)(189998001)(50466002)(48376002)(85426001)(97736004)(50986999)(105606002)(2351001)(106466001)(316002)(4326008)(76176999)(39060400002)(53936002)(16586007)(305945005)(50226002)(6666003)(104016004)(68736007)(2004002);DIR:OUT;SFP:1101;SCL:1;SRVR:MWHPR03MB2703;H:tx30smr01.am.freescale.net;FPR:;SPF:Fail;PTR:InfoDomainNonexistent;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;BL2FFO11FD042;1:ZvJGNK8/07gH8GwJ++Z9t/HjU28nEq62ZWAviERogPu5OizVIbt83A19aKgkqVGBri6nWGSqnZZO2anrEgJQT7cVk5ioiiuAmD33oyjfYP80E8EF2Qj5F5vtO5tsuhbc MIME-Version: 1.0 Content-Type: text/plain X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 5b6ccbf5-4b3a-40f3-e4dd-08d50970afd3 X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001)(2017052603199)(201703131430075)(201703131517081);SRVR:MWHPR03MB2703; X-Microsoft-Exchange-Diagnostics: 1;MWHPR03MB2703;3:QfT1j7dVczDUmYeRRziEcvg3seFAmouc8T4tJrSWfBHhdKOJf7iIBZkeUna1Zvo9kWC6qJsBWPTcAvH4BZO93uOnUWrUjJZtXH7fOrxddqe6PvRSKvZ2M9GiMA42+wTz7ItpzC9EEsyapZQ0fu1ZGGqivB7ES19fkfvQqFiOXjgOeGT2+US8kesod2iBG6XZz4/IiOWtGL+fO13aTUWP3r47oIM/WRw4l0r+j684GLZxwt03NIRAtW4lr5PjRXJhs9dLZYLYn2H6+mpDxpJ1bK0SC49xvhJX08fV/ipAZ8UL1BfKHnSAUDGJaAOSFA7zR1fxR6K7EiT8UVpQyJX3DvsLmMwfoHkyWyaFfrnaEtk=;25:HGZKax+1f0Kunl1JO4tvHkTkf9iQguaOuepZgR7ASZgF8MuGdlzM5gXUHDIgDWFSETXJ0WAI/imvOYWsAJO9+CEt9LZxWrUacFxrLFNB1WJ1lMLMEqfFNe8tP5tRJx4stm8DVF25HMoJ2jXI7U+K42zLjuNbcjjv0UlYm6yd4bYjdIAC2TwAV68tNZm7AWQFowZaUeaER0eL0TCdKDDHef/Fu7hobmml1bEVlkNKN8f8OAfjQ4uvLG/J5zyqqGBlhef7gOkp2jwG9yZdbti28xokQmgLZxxLvshBof7X/NsqM4Qwev3zdgfwACKPBxUhUwT9MdSJNlVhFmbe8Nk8CA== X-MS-TrafficTypeDiagnostic: MWHPR03MB2703: X-Microsoft-Exchange-Diagnostics: 1;MWHPR03MB2703;31:2q3i3kLv4Wq0CAms0j0Pfj3/eEDcFBhyuqKoSoHrlatn703c3+9x2OZFYCZvkjZogahah6PCxK1OATPJI3E/5VYQa/I46LctWv15eM0zFQycKyG8NyNdyPUnegRZ34E8A3wOIbwB1yIHaVjBrn12oRlai3ypw3s7wCFEG484gD49tKg3M4fi7qIYXwyDZ4R6FNaxpVPYvvNkGxvdhzB/8yZMY6ZVip1qsxn4qnZAYv0=;4:moa+pIAjqmWOiYd2xV5wAwp5LAkbXh2nLCMBS0izxIZOXhrYs7oFR5bQml92HgEeWHW1rwr4nIq22pQpjEaf9IREcRgyPpHGO28Dzcl1RgScfVOrhRyGk9fiX3q1Q+m8QOKlV+azlZ8LPC/bZkkvvm7Fa2NLLxzjXMC40c8fagpYPlGVXKtBovY/BaBItvUQCqhaDHc3yC64xek79VV8swn6G+OEq7HhWdtZo4IBOocdtU7C9fEQDLVnkk6qYeh+jCrc0YaGq1UKwuJ9lE0fiO/6VXQuWMGBXP0JEET546CVILcJJj31BfhmIfeQkzurKEegZZltwjhLmWNC9+rJng== X-Exchange-Antispam-Report-Test: UriScan:(185117386973197)(275809806118684); X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6095135)(2401047)(5005006)(8121501046)(93006095)(93001095)(100000703101)(100105400095)(10201501046)(3002001)(6055026)(6096035)(20161123559100)(201703131430075)(201703131448075)(201703131433075)(201703161259150)(201703151042153)(20161123563025)(20161123556025)(20161123565025)(20161123561025)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095);SRVR:MWHPR03MB2703;BCL:0;PCL:0;RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(400006)(100000804101)(100110200095)(100000805101)(100110500095);SRVR:MWHPR03MB2703; X-Forefront-PRVS: 0448A97BF2 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;MWHPR03MB2703;23:OWF9WQ7hklTvqZMIpZ+kTN8Y2PQyf5JzejZ+a7uXx?= =?us-ascii?Q?23PJ5oyuOqKSw07c4I2WhpIC8ERONZZKl/kjhtw0vY8j0C2HHDRFOzn7AZGE?= =?us-ascii?Q?VaAbAMwjEL9MSkvCly3eEd9ciiObPsuHdp0CHg6zXdOK/t+iSfpTP8JkK2GT?= =?us-ascii?Q?QFnmyzhW4CuivkpfYsZZgNj6+hjkWT5lmKKdhSDOkzRbCXWGHfqpNUJBjQYH?= =?us-ascii?Q?5DMb6Z6aQ0KayfRHbXjiFjNxRD1oznjJTaL9pDPoFFMVjTRvWCylU34bC0Qf?= =?us-ascii?Q?ZrN6ooglA3NSyHODmeEjzfYevhcOpUutKUbnyUudGzF2hsXyH7BmEuR+kuw1?= =?us-ascii?Q?i/WJZPvHUfRkUYZD+U0a5adVZiVstvxE9+MF0HERBLl64oDOSg4MkfKiS/sS?= =?us-ascii?Q?2Rodk3nKhs7gZB3QLIDen35FOTdTrgCe5nUGxZyMUou6LhHUiYry0PaoXkVL?= =?us-ascii?Q?4zew8FCnHJWt4u2/dHpQtQVdyQvqMIK03TEtVdgiG+bUWqh7tkJUVVwRle5j?= =?us-ascii?Q?kbREhBoos2tEKEqiwHeRzTt9Lu6mzZNSi4ERih2TIhlTT05a0JdKTWxoI8z7?= =?us-ascii?Q?Mwoj/4fypmUs3smHu8io6594wttZrBirds/cOny1ojrLU8+zzo/1RBXRgXQI?= =?us-ascii?Q?K+z/9+SNEBhKLOq3SwUuUZc9H8Sr2Vovh6uShqSNZvvTI0opm9bKWjypszDu?= =?us-ascii?Q?szg3ehBifgLnj2wSKdnw5dPs/X8K9enx9kN/9uI6fZXXHkLmjWE+HVfe29N2?= =?us-ascii?Q?eremCHXmEDeXv/u9aFhGkaSenJvXmV1vT1laEluPZVuja1eSk1ea3AL5RvCO?= =?us-ascii?Q?EVld0fmg+8nwkl2dlxfUehtjWRTpHTkWTNhk5mIBl4cI1Ma+fpcUrypLzT9g?= =?us-ascii?Q?DbNiqXtTA1HqYOu9qiUXts8+QcU0MrAeEZluERSU5CQlxgO/QBbW/IxzdJ2R?= =?us-ascii?Q?hgyHPjFMvlqFg4RI2EofDXV4jV8knmZW5qMV2s5KB9HgPfshG/fIigBAZFxD?= =?us-ascii?Q?39mr36F11jk18+KvNeX0dN03fMC+54xNErFBPS4HnHksZDKuNOEK1asFKc2w?= =?us-ascii?Q?/3RKjqE4G1RRmNc9ldxi7GAvu97TtcDSszZCyBjQwWu9OC/K44kcYIBulHtP?= =?us-ascii?Q?w++FD1ZSAVQvvp7tSXLoKXIb31NvE0XsE6GGAFA0QqyTApWHH8W/GteGH7BP?= =?us-ascii?Q?22gpsuH7XzngBkMtom4N+1DBwExD7QY301hh2HZZxiQxwFHg0ZGM/QCEzC6Z?= =?us-ascii?Q?SnyISZRz60WotCwprU=3D?= X-Microsoft-Exchange-Diagnostics: 1;MWHPR03MB2703;6:DpZTzb2c7BX+PIki68ZFiHmw9V5oW7psxtdsTYVeMLghvEHY+3tHMZPF/eUCwEJXJ1r0QTMAqLR2vkmk0a/pv+chd7hNRy2nA5JQ1kh+kJAmzpmQ0QNnuzGM9hkmcl88MPYXGBJ9WdOEmhYF06K4JPWErZga3YKqtFDk/HDYCQdIt663eRN8BXCm4lY5bJZZsQ8obnwqACMNFjxREaxumctKWn8yUBn/nh0/5muOSMR7tn+yQWenUcCoxEx/EtjD7reCnTwMgAWErZkofGncO8AU2GjfPZ4rPSnAXyxFQIMfgzq0Cykg1Pxl4t1bxrqVbvvFo4QZ/PExvfC3H4e8ag==;5:jE32T4XDv/2CiISh5zoofLpSZDlSTIwm0OhlpChCWoM4DL8O58dRH8h4ylcs5qjYkCleaZvrVnRBwJThjILMMthcnHCQV5W0KvrPKGNL8GYdrzhtuF/xJJyf/G5REOlIxb9FeVcf7nJZ7i4uCi8F2w==;24:uLohA2ACUHwJ3UiXWre8k5INP4JXaRaMGka0FZ+ftdTUim2PYAKr/fgBi3PKQ19MHSyZ74UsCWv21G09HkTLbKjXDvgaWx1CFra2G/+ZDeE=;7:rKVN51R3A2/dO3gs8iyunZ0x0w/ZSgRI42RO3DrvFIroli7H2IHRwFLlz5yRAghNM3P2KadIPzpvbXdOMGg9WdM8czG9d70kowo/Vqz7mImX5ayIJjb9FWypn+M9ww6U5rCN4MhXwR6+LJbYZsGZJrtdkWF7/iKFoYWaptg3YIcPCFYK6Zu5G+1qtGnU892Le6nWshqrUJxkB2FYpIWJRFoFCrQhz4k2EVJtQ+Oc2D4= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-MS-Exchange-CrossTenant-OriginalArrivalTime: 02 Oct 2017 08:36:33.1963 (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.168.50];Helo=[tx30smr01.am.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: MWHPR03MB2703 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add driver information, link details and hardware statistics to be reported via ethtool -S. Signed-off-by: Razvan Stefanescu --- Changelog: v2: - no changes drivers/staging/fsl-dpaa2/ethsw/Makefile | 2 +- drivers/staging/fsl-dpaa2/ethsw/dpsw-cmd.h | 13 ++ drivers/staging/fsl-dpaa2/ethsw/dpsw.c | 32 ++++ drivers/staging/fsl-dpaa2/ethsw/dpsw.h | 32 ++++ drivers/staging/fsl-dpaa2/ethsw/ethsw-ethtool.c | 207 ++++++++++++++++++++++++ drivers/staging/fsl-dpaa2/ethsw/ethsw.c | 3 + drivers/staging/fsl-dpaa2/ethsw/ethsw.h | 3 + 7 files changed, 291 insertions(+), 1 deletion(-) create mode 100644 drivers/staging/fsl-dpaa2/ethsw/ethsw-ethtool.c diff --git a/drivers/staging/fsl-dpaa2/ethsw/Makefile b/drivers/staging/fsl-dpaa2/ethsw/Makefile index a6d72d1..de92cd9 100644 --- a/drivers/staging/fsl-dpaa2/ethsw/Makefile +++ b/drivers/staging/fsl-dpaa2/ethsw/Makefile @@ -4,4 +4,4 @@ obj-$(CONFIG_FSL_DPAA2_ETHSW) += dpaa2-ethsw.o -dpaa2-ethsw-objs := ethsw.o dpsw.o +dpaa2-ethsw-objs := ethsw.o ethsw-ethtool.o dpsw.o diff --git a/drivers/staging/fsl-dpaa2/ethsw/dpsw-cmd.h b/drivers/staging/fsl-dpaa2/ethsw/dpsw-cmd.h index ddfd820..06b71122 100644 --- a/drivers/staging/fsl-dpaa2/ethsw/dpsw-cmd.h +++ b/drivers/staging/fsl-dpaa2/ethsw/dpsw-cmd.h @@ -74,6 +74,8 @@ #define DPSW_CMDID_IF_SET_FLOODING DPSW_CMD_ID(0x047) #define DPSW_CMDID_IF_SET_BROADCAST DPSW_CMD_ID(0x048) +#define DPSW_CMDID_IF_SET_LINK_CFG DPSW_CMD_ID(0x04C) + #define DPSW_CMDID_VLAN_ADD DPSW_CMD_ID(0x060) #define DPSW_CMDID_VLAN_ADD_IF DPSW_CMD_ID(0x061) #define DPSW_CMDID_VLAN_ADD_IF_UNTAGGED DPSW_CMD_ID(0x062) @@ -262,6 +264,17 @@ struct dpsw_cmd_if_set_max_frame_length { __le16 frame_length; }; +struct dpsw_cmd_if_set_link_cfg { + /* cmd word 0 */ + __le16 if_id; + u8 pad[6]; + /* cmd word 1 */ + __le32 rate; + __le32 pad1; + /* cmd word 2 */ + __le64 options; +}; + struct dpsw_cmd_if_get_link_state { __le16 if_id; }; diff --git a/drivers/staging/fsl-dpaa2/ethsw/dpsw.c b/drivers/staging/fsl-dpaa2/ethsw/dpsw.c index e65b6f5..f1a1fac 100644 --- a/drivers/staging/fsl-dpaa2/ethsw/dpsw.c +++ b/drivers/staging/fsl-dpaa2/ethsw/dpsw.c @@ -383,6 +383,38 @@ int dpsw_get_attributes(struct fsl_mc_io *mc_io, } /** + * dpsw_if_set_link_cfg() - Set the link configuration. + * @mc_io: Pointer to MC portal's I/O object + * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' + * @token: Token of DPSW object + * @if_id: Interface id + * @cfg: Link configuration + * + * Return: '0' on Success; Error code otherwise. + */ +int dpsw_if_set_link_cfg(struct fsl_mc_io *mc_io, + u32 cmd_flags, + u16 token, + u16 if_id, + struct dpsw_link_cfg *cfg) +{ + struct mc_command cmd = { 0 }; + struct dpsw_cmd_if_set_link_cfg *cmd_params; + + /* prepare command */ + cmd.header = mc_encode_cmd_header(DPSW_CMDID_IF_SET_LINK_CFG, + cmd_flags, + token); + cmd_params = (struct dpsw_cmd_if_set_link_cfg *)cmd.params; + cmd_params->if_id = cpu_to_le16(if_id); + cmd_params->rate = cpu_to_le32(cfg->rate); + cmd_params->options = cpu_to_le64(cfg->options); + + /* send command to mc*/ + return mc_send_command(mc_io, &cmd); +} + +/** * dpsw_if_get_link_state - Return the link state * @mc_io: Pointer to MC portal's I/O object * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' diff --git a/drivers/staging/fsl-dpaa2/ethsw/dpsw.h b/drivers/staging/fsl-dpaa2/ethsw/dpsw.h index 7fa8a61..87369a5 100644 --- a/drivers/staging/fsl-dpaa2/ethsw/dpsw.h +++ b/drivers/staging/fsl-dpaa2/ethsw/dpsw.h @@ -245,6 +245,38 @@ enum dpsw_action { }; /** + * Enable auto-negotiation + */ +#define DPSW_LINK_OPT_AUTONEG 0x0000000000000001ULL +/** + * Enable half-duplex mode + */ +#define DPSW_LINK_OPT_HALF_DUPLEX 0x0000000000000002ULL +/** + * Enable pause frames + */ +#define DPSW_LINK_OPT_PAUSE 0x0000000000000004ULL +/** + * Enable a-symmetric pause frames + */ +#define DPSW_LINK_OPT_ASYM_PAUSE 0x0000000000000008ULL + +/** + * struct dpsw_link_cfg - Structure representing DPSW link configuration + * @rate: Rate + * @options: Mask of available options; use 'DPSW_LINK_OPT_' values + */ +struct dpsw_link_cfg { + u32 rate; + u64 options; +}; + +int dpsw_if_set_link_cfg(struct fsl_mc_io *mc_io, + u32 cmd_flags, + u16 token, + u16 if_id, + struct dpsw_link_cfg *cfg); +/** * struct dpsw_link_state - Structure representing DPSW link state * @rate: Rate * @options: Mask of available options; use 'DPSW_LINK_OPT_' values diff --git a/drivers/staging/fsl-dpaa2/ethsw/ethsw-ethtool.c b/drivers/staging/fsl-dpaa2/ethsw/ethsw-ethtool.c new file mode 100644 index 0000000..dcd49d2 --- /dev/null +++ b/drivers/staging/fsl-dpaa2/ethsw/ethsw-ethtool.c @@ -0,0 +1,207 @@ +/* Copyright 2014-2016 Freescale Semiconductor Inc. + * Copyright 2017 NXP + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the above-listed copyright holders nor the + * names of any contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * + * ALTERNATIVELY, this software may be distributed under the terms of the + * GNU General Public License ("GPL") as published by the Free Software + * Foundation, either version 2 of that License or (at your option) any + * later version. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "ethsw.h" + +static struct { + enum dpsw_counter id; + char name[ETH_GSTRING_LEN]; +} ethsw_ethtool_counters[] = { + {DPSW_CNT_ING_FRAME, "rx frames"}, + {DPSW_CNT_ING_BYTE, "rx bytes"}, + {DPSW_CNT_ING_FLTR_FRAME, "rx filtered frames"}, + {DPSW_CNT_ING_FRAME_DISCARD, "rx discarded frames"}, + {DPSW_CNT_ING_BCAST_FRAME, "rx b-cast frames"}, + {DPSW_CNT_ING_BCAST_BYTES, "rx b-cast bytes"}, + {DPSW_CNT_ING_MCAST_FRAME, "rx m-cast frames"}, + {DPSW_CNT_ING_MCAST_BYTE, "rx m-cast bytes"}, + {DPSW_CNT_EGR_FRAME, "tx frames"}, + {DPSW_CNT_EGR_BYTE, "tx bytes"}, + {DPSW_CNT_EGR_FRAME_DISCARD, "tx discarded frames"}, + +}; + +#define ETHSW_NUM_COUNTERS ARRAY_SIZE(ethsw_ethtool_counters) + +static void ethsw_get_drvinfo(struct net_device *netdev, + struct ethtool_drvinfo *drvinfo) +{ + struct ethsw_port_priv *port_priv = netdev_priv(netdev); + u16 version_major, version_minor; + int err; + + strlcpy(drvinfo->driver, KBUILD_MODNAME, sizeof(drvinfo->driver)); + strlcpy(drvinfo->version, ethsw_drv_version, sizeof(drvinfo->version)); + + err = dpsw_get_api_version(port_priv->ethsw_data->mc_io, 0, + &version_major, + &version_minor); + if (err) + strlcpy(drvinfo->fw_version, "N/A", + sizeof(drvinfo->fw_version)); + else + snprintf(drvinfo->fw_version, sizeof(drvinfo->fw_version), + "%u.%u", version_major, version_minor); + + strlcpy(drvinfo->bus_info, dev_name(netdev->dev.parent->parent), + sizeof(drvinfo->bus_info)); +} + +static int +ethsw_get_link_ksettings(struct net_device *netdev, + struct ethtool_link_ksettings *link_ksettings) +{ + struct ethsw_port_priv *port_priv = netdev_priv(netdev); + struct dpsw_link_state state = {0}; + int err = 0; + + err = dpsw_if_get_link_state(port_priv->ethsw_data->mc_io, 0, + port_priv->ethsw_data->dpsw_handle, + port_priv->idx, + &state); + if (err) { + netdev_err(netdev, "ERROR %d getting link state", err); + goto out; + } + + /* At the moment, we have no way of interrogating the DPMAC + * from the DPSW side or there may not exist a DPMAC at all. + * Report only autoneg state, duplexity and speed. + */ + if (state.options & DPSW_LINK_OPT_AUTONEG) + link_ksettings->base.autoneg = AUTONEG_ENABLE; + if (!(state.options & DPSW_LINK_OPT_HALF_DUPLEX)) + link_ksettings->base.duplex = DUPLEX_FULL; + link_ksettings->base.speed = state.rate; + +out: + return err; +} + +static int +ethsw_set_link_ksettings(struct net_device *netdev, + const struct ethtool_link_ksettings *link_ksettings) +{ + struct ethsw_port_priv *port_priv = netdev_priv(netdev); + struct dpsw_link_cfg cfg = {0}; + int err = 0; + + netdev_dbg(netdev, "Setting link parameters..."); + + /* Due to a temporary MC limitation, the DPSW port must be down + * in order to be able to change link settings. Taking steps to let + * the user know that. + */ + if (netif_running(netdev)) { + netdev_info(netdev, "Sorry, interface must be brought down first.\n"); + return -EACCES; + } + + cfg.rate = link_ksettings->base.speed; + if (link_ksettings->base.autoneg == AUTONEG_ENABLE) + cfg.options |= DPSW_LINK_OPT_AUTONEG; + else + cfg.options &= ~DPSW_LINK_OPT_AUTONEG; + if (link_ksettings->base.duplex == DUPLEX_HALF) + cfg.options |= DPSW_LINK_OPT_HALF_DUPLEX; + else + cfg.options &= ~DPSW_LINK_OPT_HALF_DUPLEX; + + err = dpsw_if_set_link_cfg(port_priv->ethsw_data->mc_io, 0, + port_priv->ethsw_data->dpsw_handle, + port_priv->idx, + &cfg); + if (err) + /* ethtool will be loud enough if we return an error; no point + * in putting our own error message on the console by default + */ + netdev_dbg(netdev, "ERROR %d setting link cfg", err); + + return err; +} + +static int ethsw_ethtool_get_sset_count(struct net_device *dev, int sset) +{ + switch (sset) { + case ETH_SS_STATS: + return ETHSW_NUM_COUNTERS; + default: + return -EOPNOTSUPP; + } +} + +static void ethsw_ethtool_get_strings(struct net_device *netdev, + u32 stringset, u8 *data) +{ + int i; + + switch (stringset) { + case ETH_SS_STATS: + for (i = 0; i < ETHSW_NUM_COUNTERS; i++) + memcpy(data + i * ETH_GSTRING_LEN, + ethsw_ethtool_counters[i].name, ETH_GSTRING_LEN); + break; + } +} + +static void ethsw_ethtool_get_stats(struct net_device *netdev, + struct ethtool_stats *stats, + u64 *data) +{ + struct ethsw_port_priv *port_priv = netdev_priv(netdev); + int i, err; + + memset(data, 0, + sizeof(u64) * ETHSW_NUM_COUNTERS); + + for (i = 0; i < ETHSW_NUM_COUNTERS; i++) { + err = dpsw_if_get_counter(port_priv->ethsw_data->mc_io, 0, + port_priv->ethsw_data->dpsw_handle, + port_priv->idx, + ethsw_ethtool_counters[i].id, + &data[i]); + if (err) + netdev_err(netdev, "dpsw_if_get_counter[%s] err %d\n", + ethsw_ethtool_counters[i].name, err); + } +} + +const struct ethtool_ops ethsw_port_ethtool_ops = { + .get_drvinfo = ethsw_get_drvinfo, + .get_link = ethtool_op_get_link, + .get_link_ksettings = ethsw_get_link_ksettings, + .set_link_ksettings = ethsw_set_link_ksettings, + .get_strings = ethsw_ethtool_get_strings, + .get_ethtool_stats = ethsw_ethtool_get_stats, + .get_sset_count = ethsw_ethtool_get_sset_count, +}; diff --git a/drivers/staging/fsl-dpaa2/ethsw/ethsw.c b/drivers/staging/fsl-dpaa2/ethsw/ethsw.c index f45e5bb..f1ba23c 100644 --- a/drivers/staging/fsl-dpaa2/ethsw/ethsw.c +++ b/drivers/staging/fsl-dpaa2/ethsw/ethsw.c @@ -44,6 +44,8 @@ static struct workqueue_struct *ethsw_owq; +const char ethsw_drv_version[] = "0.1"; + /* Minimal supported DPSW version */ #define DPSW_MIN_VER_MAJOR 8 #define DPSW_MIN_VER_MINOR 0 @@ -1402,6 +1404,7 @@ static int ethsw_probe_port(struct ethsw_core *ethsw, u16 port_idx) SET_NETDEV_DEV(port_netdev, dev); port_netdev->netdev_ops = ðsw_port_ops; + port_netdev->ethtool_ops = ðsw_port_ethtool_ops; port_netdev->switchdev_ops = ðsw_port_switchdev_ops; /* Set MTU limits */ diff --git a/drivers/staging/fsl-dpaa2/ethsw/ethsw.h b/drivers/staging/fsl-dpaa2/ethsw/ethsw.h index 8c1d645..ba53cc5 100644 --- a/drivers/staging/fsl-dpaa2/ethsw/ethsw.h +++ b/drivers/staging/fsl-dpaa2/ethsw/ethsw.h @@ -57,6 +57,9 @@ #define ETHSW_MAX_FRAME_LENGTH (DPAA2_MFL - VLAN_ETH_HLEN - ETH_FCS_LEN) #define ETHSW_L2_MAX_FRM(mtu) ((mtu) + VLAN_ETH_HLEN + ETH_FCS_LEN) +extern const char ethsw_drv_version[]; +extern const struct ethtool_ops ethsw_port_ethtool_ops; + struct ethsw_core; /* Per port private data */ -- 1.9.1