Received: by 2002:a05:7412:2a8c:b0:e2:908c:2ebd with SMTP id u12csp1822470rdh; Tue, 26 Sep 2023 04:53:50 -0700 (PDT) X-Google-Smtp-Source: AGHT+IGFCUcszhkIGgttm7AY035iTlJvRIhesdzanRvAeW2QozmL6ZB/s68twHn8NSyWD4dvr7tt X-Received: by 2002:a05:6a20:5605:b0:14c:d494:77c3 with SMTP id ir5-20020a056a20560500b0014cd49477c3mr6937819pzc.33.1695729229776; Tue, 26 Sep 2023 04:53:49 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1695729229; cv=none; d=google.com; s=arc-20160816; b=gX86hbSpEHxKAiqlDQGLImnOk3K0jDEWau/ImEPRtkujfYIVIxzGZJx9R42rZRoh+a cuwRf6LKYa71UgUdKmexP8S4d6zZnxFjVgoP3bd/3m2vvcY5D04tKYd3GxRkGGA3O34F TUFg6d0t1fSxaB4s1YhhFJti9D3LvQf5gDWWVbJi6EKYBXDuVPHdtg4be/3If//7QyXm fKwzI36LYEUOV1D2kWsk48K7mjg73wtmWWOHab7C3PP0KYJgs1wCQ76Hhdfe97pumaGJ jSJAo+Dc7K8AyEQ0Qf56kXZC8DYUHkznU94f1PPvuYuf2BGmqfQ54T1FXOO66hOyxZBb 6pYA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=J9ax27tHipVHC0PQuyQUNvH0ifmmkw3PeH6WUQE4sxE=; fh=J4St9tMjBInT3r1VVHSF1O7f2qS3KxSaZBHCVggmRHk=; b=DbR7SUq1lAp9z4A9bUbcprHj2Clo3JzoR7CTLhazI0/Cz2wXzsm2s2oVv4+CZgzS84 zOaM9gddwz/Bxcb71KJj3YehtmHjJswbGE5OsfD/6P5uoLuxj/EFypleof8Ay/k2OACQ wJQ8MXIJvv3p942dMXG2istvS+zUZ2sXxmvEx5lBPjIoE0NilxgPGcy26pISJkt1JyFx DM8Nm11jzaZKDFU31Nl8dSatP5ZlbSEYeiZmhqc0zWHpGiXAwYrNhnyAGLSdlr+4Q+zv B2p5P6kf+D6RjpfdoDTmg2YWLc93vI5JvscCDs9YdiNhiG2vd2AuOaUpRuSTl3LDLtHb SuFw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:5 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from groat.vger.email (groat.vger.email. [2620:137:e000::3:5]) by mx.google.com with ESMTPS id p15-20020a170902e74f00b001bbd0358ef7si13770596plf.518.2023.09.26.04.53.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 26 Sep 2023 04:53:49 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:5 as permitted sender) client-ip=2620:137:e000::3:5; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:5 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by groat.vger.email (Postfix) with ESMTP id D1BA882F3046; Tue, 26 Sep 2023 04:50:51 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at groat.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234518AbjIZLuq (ORCPT + 99 others); Tue, 26 Sep 2023 07:50:46 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58142 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234048AbjIZLu3 (ORCPT ); Tue, 26 Sep 2023 07:50:29 -0400 Received: from rtits2.realtek.com.tw (rtits2.realtek.com [211.75.126.72]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 51774197; Tue, 26 Sep 2023 04:50:20 -0700 (PDT) X-SpamFilter-By: ArmorX SpamTrap 5.78 with qID 38QBo0vaD882046, This message is accepted by code: ctloc85258 Received: from mail.realtek.com (rtexh36506.realtek.com.tw[172.21.6.27]) by rtits2.realtek.com.tw (8.15.2/2.92/5.92) with ESMTPS id 38QBo0vaD882046 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 26 Sep 2023 19:50:00 +0800 Received: from RTEXMBS04.realtek.com.tw (172.21.6.97) by RTEXH36506.realtek.com.tw (172.21.6.27) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.17; Tue, 26 Sep 2023 19:50:00 +0800 Received: from RTDOMAIN (172.21.210.160) by RTEXMBS04.realtek.com.tw (172.21.6.97) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2375.7; Tue, 26 Sep 2023 19:49:59 +0800 From: Justin Lai To: CC: , , , , , , , , Justin Lai Subject: [PATCH net-next v8 10/13] net:ethernet:realtek:rtase: Implement ethtool function Date: Tue, 26 Sep 2023 19:49:40 +0800 Message-ID: <20230926114943.16340-11-justinlai0215@realtek.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230926114943.16340-1-justinlai0215@realtek.com> References: <20230926114943.16340-1-justinlai0215@realtek.com> MIME-Version: 1.0 Content-Transfer-Encoding: 7BIT Content-Type: text/plain; charset=US-ASCII X-Originating-IP: [172.21.210.160] X-ClientProxiedBy: RTEXH36505.realtek.com.tw (172.21.6.25) To RTEXMBS04.realtek.com.tw (172.21.6.97) X-KSE-ServerInfo: RTEXMBS04.realtek.com.tw, 9 X-KSE-AntiSpam-Interceptor-Info: fallback X-KSE-Antivirus-Interceptor-Info: fallback X-KSE-AntiSpam-Interceptor-Info: fallback X-Spam-Status: No, score=-0.8 required=5.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on groat.vger.email Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (groat.vger.email [0.0.0.0]); Tue, 26 Sep 2023 04:50:53 -0700 (PDT) Implement the ethtool function to support users to obtain network card information, including obtaining various device settings, Report whether physical link is up, Report pause parameters, Set pause parameters, Return a set of strings that describe the requested objects, Get number of strings that @get_strings will write, Return extended statistics about the device. Signed-off-by: Justin Lai --- .../net/ethernet/realtek/rtase/rtase_main.c | 146 ++++++++++++++++++ 1 file changed, 146 insertions(+) diff --git a/drivers/net/ethernet/realtek/rtase/rtase_main.c b/drivers/net/ethernet/realtek/rtase/rtase_main.c index 9c6d8d69dcc5..f470f1066565 100644 --- a/drivers/net/ethernet/realtek/rtase/rtase_main.c +++ b/drivers/net/ethernet/realtek/rtase/rtase_main.c @@ -1851,9 +1851,155 @@ static void rtase_get_mac_address(struct net_device *dev) ether_addr_copy(dev->perm_addr, dev->dev_addr); } +static void rtase_get_drvinfo(struct net_device *dev, + struct ethtool_drvinfo *drvinfo) +{ + const struct rtase_private *tp = netdev_priv(dev); + + strscpy(drvinfo->driver, KBUILD_MODNAME, 32); + strscpy(drvinfo->bus_info, pci_name(tp->pdev), 32); +} + +static int rtase_get_settings(struct net_device *dev, + struct ethtool_link_ksettings *cmd) +{ + u32 supported = SUPPORTED_MII | SUPPORTED_Pause; + + ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.supported, + supported); + cmd->base.speed = SPEED_5000; + cmd->base.duplex = DUPLEX_FULL; + cmd->base.port = PORT_MII; + cmd->base.autoneg = AUTONEG_DISABLE; + + return 0; +} + +static void rtase_get_pauseparam(struct net_device *dev, + struct ethtool_pauseparam *pause) +{ + const struct rtase_private *tp = netdev_priv(dev); + u16 value = rtase_r16(tp, RTASE_CPLUS_CMD); + + pause->autoneg = AUTONEG_DISABLE; + + if ((value & (FORCE_TXFLOW_EN | FORCE_RXFLOW_EN)) == + (FORCE_TXFLOW_EN | FORCE_RXFLOW_EN)) { + pause->rx_pause = 1; + pause->tx_pause = 1; + } else if ((value & FORCE_TXFLOW_EN)) { + pause->tx_pause = 1; + } else if ((value & FORCE_RXFLOW_EN)) { + pause->rx_pause = 1; + } +} + +static int rtase_set_pauseparam(struct net_device *dev, + struct ethtool_pauseparam *pause) +{ + const struct rtase_private *tp = netdev_priv(dev); + u16 value = rtase_r16(tp, RTASE_CPLUS_CMD); + + if (pause->autoneg) + return -EOPNOTSUPP; + + value &= ~(FORCE_TXFLOW_EN | FORCE_RXFLOW_EN); + + if (pause->tx_pause) + value |= FORCE_TXFLOW_EN; + + if (pause->rx_pause) + value |= FORCE_RXFLOW_EN; + + rtase_w16(tp, RTASE_CPLUS_CMD, value); + return 0; +} + +static const char rtase_gstrings[][ETH_GSTRING_LEN] = { + "tx_packets", + "rx_packets", + "tx_errors", + "rx_errors", + "rx_missed", + "align_errors", + "tx_single_collisions", + "tx_multi_collisions", + "unicast", + "broadcast", + "multicast", + "tx_aborted", + "tx_underrun", +}; + +static void rtase_get_strings(struct net_device *dev, u32 stringset, u8 *data) +{ + switch (stringset) { + case ETH_SS_STATS: + memcpy(data, *rtase_gstrings, sizeof(rtase_gstrings)); + break; + } +} + +static int rtase_get_sset_count(struct net_device *dev, int sset) +{ + int ret = -EOPNOTSUPP; + + switch (sset) { + case ETH_SS_STATS: + ret = ARRAY_SIZE(rtase_gstrings); + break; + } + + return ret; +} + +static void rtase_get_ethtool_stats(struct net_device *dev, + struct ethtool_stats *stats, u64 *data) +{ + struct rtase_private *tp = netdev_priv(dev); + const struct rtase_counters *counters; + dma_addr_t paddr; + + ASSERT_RTNL(); + + counters = tp->tally_vaddr; + if (!counters) + return; + paddr = tp->tally_paddr; + + rtase_dump_tally_counter(tp, paddr); + + data[0] = le64_to_cpu(counters->tx_packets); + data[1] = le64_to_cpu(counters->rx_packets); + data[2] = le64_to_cpu(counters->tx_errors); + data[3] = le32_to_cpu(counters->rx_errors); + data[4] = le16_to_cpu(counters->rx_missed); + data[5] = le16_to_cpu(counters->align_errors); + data[6] = le32_to_cpu(counters->tx_one_collision); + data[7] = le32_to_cpu(counters->tx_multi_collision); + data[8] = le64_to_cpu(counters->rx_unicast); + data[9] = le64_to_cpu(counters->rx_broadcast); + data[10] = le32_to_cpu(counters->rx_multicast); + data[11] = le16_to_cpu(counters->tx_aborted); + data[12] = le16_to_cpu(counters->tx_underun); +} + +static const struct ethtool_ops rtase_ethtool_ops = { + .get_drvinfo = rtase_get_drvinfo, + .get_link = ethtool_op_get_link, + .get_link_ksettings = rtase_get_settings, + .get_pauseparam = rtase_get_pauseparam, + .set_pauseparam = rtase_set_pauseparam, + .get_strings = rtase_get_strings, + .get_sset_count = rtase_get_sset_count, + .get_ethtool_stats = rtase_get_ethtool_stats, + .get_ts_info = ethtool_op_get_ts_info, +}; + static void rtase_init_netdev_ops(struct net_device *dev) { dev->netdev_ops = &rtase_netdev_ops; + dev->ethtool_ops = &rtase_ethtool_ops; } static void rtase_reset_interrupt(struct pci_dev *pdev, -- 2.34.1