Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/730831/?format=api
{ "id": 730831, "url": "http://patchwork.ozlabs.org/api/patches/730831/?format=api", "web_url": "http://patchwork.ozlabs.org/project/intel-wired-lan/patch/1487721348-25617-6-git-send-email-bimmy.pujari@intel.com/", "project": { "id": 46, "url": "http://patchwork.ozlabs.org/api/projects/46/?format=api", "name": "Intel Wired Ethernet development", "link_name": "intel-wired-lan", "list_id": "intel-wired-lan.osuosl.org", "list_email": "intel-wired-lan@osuosl.org", "web_url": "", "scm_url": "", "webscm_url": "", "list_archive_url": "", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<1487721348-25617-6-git-send-email-bimmy.pujari@intel.com>", "list_archive_url": null, "date": "2017-02-21T23:55:43", "name": "[next,S61,05/10] i40e: Add support for 25G in ethtool", "commit_ref": null, "pull_url": null, "state": "changes-requested", "archived": false, "hash": "32c3f01ef44023b89609d0ade7df75a601755cb9", "submitter": { "id": 68919, "url": "http://patchwork.ozlabs.org/api/people/68919/?format=api", "name": "Pujari, Bimmy", "email": "bimmy.pujari@intel.com" }, "delegate": { "id": 68, "url": "http://patchwork.ozlabs.org/api/users/68/?format=api", "username": "jtkirshe", "first_name": "Jeff", "last_name": "Kirsher", "email": "jeffrey.t.kirsher@intel.com" }, "mbox": "http://patchwork.ozlabs.org/project/intel-wired-lan/patch/1487721348-25617-6-git-send-email-bimmy.pujari@intel.com/mbox/", "series": [], "comments": "http://patchwork.ozlabs.org/api/patches/730831/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/730831/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "<intel-wired-lan-bounces@lists.osuosl.org>", "X-Original-To": [ "incoming@patchwork.ozlabs.org", "intel-wired-lan@lists.osuosl.org" ], "Delivered-To": [ "patchwork-incoming@bilbo.ozlabs.org", "intel-wired-lan@lists.osuosl.org" ], "Received": [ "from hemlock.osuosl.org (smtp2.osuosl.org [140.211.166.133])\n\t(using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits))\n\t(No client certificate requested)\n\tby ozlabs.org (Postfix) with ESMTPS id 3vSbWS22KPz9s65\n\tfor <incoming@patchwork.ozlabs.org>;\n\tWed, 22 Feb 2017 09:58:12 +1100 (AEDT)", "from localhost (localhost [127.0.0.1])\n\tby hemlock.osuosl.org (Postfix) with ESMTP id D17FD8A686;\n\tTue, 21 Feb 2017 22:58:10 +0000 (UTC)", "from hemlock.osuosl.org ([127.0.0.1])\n\tby localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024)\n\twith ESMTP id 9ii4tERTs9nK; Tue, 21 Feb 2017 22:58:08 +0000 (UTC)", "from ash.osuosl.org (ash.osuosl.org [140.211.166.34])\n\tby hemlock.osuosl.org (Postfix) with ESMTP id 6B3C08ABE8;\n\tTue, 21 Feb 2017 22:58:08 +0000 (UTC)", "from hemlock.osuosl.org (smtp2.osuosl.org [140.211.166.133])\n\tby ash.osuosl.org (Postfix) with ESMTP id 2CB0C1BFF60\n\tfor <intel-wired-lan@lists.osuosl.org>;\n\tTue, 21 Feb 2017 22:58:04 +0000 (UTC)", "from localhost (localhost [127.0.0.1])\n\tby hemlock.osuosl.org (Postfix) with ESMTP id 281558AE75\n\tfor <intel-wired-lan@lists.osuosl.org>;\n\tTue, 21 Feb 2017 22:58:04 +0000 (UTC)", "from hemlock.osuosl.org ([127.0.0.1])\n\tby localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024)\n\twith ESMTP id 0mQzWw--P4Xm for <intel-wired-lan@lists.osuosl.org>;\n\tTue, 21 Feb 2017 22:57:56 +0000 (UTC)", "from mga01.intel.com (mga01.intel.com [192.55.52.88])\n\tby hemlock.osuosl.org (Postfix) with ESMTPS id 32E538A67C\n\tfor <intel-wired-lan@lists.osuosl.org>;\n\tTue, 21 Feb 2017 22:57:56 +0000 (UTC)", "from fmsmga002.fm.intel.com ([10.253.24.26])\n\tby fmsmga101.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384;\n\t21 Feb 2017 14:57:55 -0800", "from bimmy.jf.intel.com (HELO bimmy.linux1.jf.intel.com)\n\t([10.166.35.87])\n\tby fmsmga002.fm.intel.com with ESMTP; 21 Feb 2017 14:57:55 -0800" ], "X-Virus-Scanned": [ "amavisd-new at osuosl.org", "amavisd-new at osuosl.org" ], "X-Greylist": "domain auto-whitelisted by SQLgrey-1.7.6", "X-ExtLoop1": "1", "X-IronPort-AV": "E=Sophos; i=\"5.35,191,1484035200\"; d=\"scan'208\";\n\ta=\"1133083138\"", "From": "Bimmy Pujari <bimmy.pujari@intel.com>", "To": "intel-wired-lan@lists.osuosl.org", "Date": "Tue, 21 Feb 2017 15:55:43 -0800", "Message-Id": "<1487721348-25617-6-git-send-email-bimmy.pujari@intel.com>", "X-Mailer": "git-send-email 2.4.11", "In-Reply-To": "<1487721348-25617-1-git-send-email-bimmy.pujari@intel.com>", "References": "<1487721348-25617-1-git-send-email-bimmy.pujari@intel.com>", "Subject": "[Intel-wired-lan] [next PATCH S61 05/10] i40e: Add support for 25G\n\tin ethtool", "X-BeenThere": "intel-wired-lan@lists.osuosl.org", "X-Mailman-Version": "2.1.18-1", "Precedence": "list", "List-Id": "Intel Wired Ethernet Linux Kernel Driver Development\n\t<intel-wired-lan.lists.osuosl.org>", "List-Unsubscribe": "<http://lists.osuosl.org/mailman/options/intel-wired-lan>, \n\t<mailto:intel-wired-lan-request@lists.osuosl.org?subject=unsubscribe>", "List-Archive": "<http://lists.osuosl.org/pipermail/intel-wired-lan/>", "List-Post": "<mailto:intel-wired-lan@lists.osuosl.org>", "List-Help": "<mailto:intel-wired-lan-request@lists.osuosl.org?subject=help>", "List-Subscribe": "<http://lists.osuosl.org/mailman/listinfo/intel-wired-lan>, \n\t<mailto:intel-wired-lan-request@lists.osuosl.org?subject=subscribe>", "MIME-Version": "1.0", "Content-Type": "text/plain; charset=\"us-ascii\"", "Content-Transfer-Encoding": "7bit", "Errors-To": "intel-wired-lan-bounces@lists.osuosl.org", "Sender": "\"Intel-wired-lan\" <intel-wired-lan-bounces@lists.osuosl.org>" }, "content": "From: Henry Tieman <henry.w.tieman@intel.com>\n\nImplemented functions for the updated get and set commands\nin ethtool: ETHTOOL_GLINKSETTING and ETHTOOL_SLINKSETTINGS.\nThese new commands will replace the existing functionality\nof ETHTOOL_GSET and ETHTOOL_SSET, which have been deprecated.\n\nMacros for 25G support were added to the include files at the\nsame time as the new ethtool commands. So, 25G support has\nbeen implemented in the new functions.\n\nSigned-off-by: Henry Tieman <henry.w.tieman@intel.com>\nChange-ID: I3824ed616cf92bc8bdce3e976277a0cf94d0cd35\n---\nTesting Hints: The kernel macros required by this patch are\navailable in Linux kernels after 4.7. Also, the 25G macros have\nbeen back ported into RHEL7.3. This functionality was added in\nethtool version 4.5.\n\n drivers/net/ethernet/intel/i40e/i40e_ethtool.c | 583 +++++++++++++++++++++++++\n 1 file changed, 583 insertions(+)", "diff": "diff --git a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c\nindex 382fd2c..9c14d69 100644\n--- a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c\n+++ b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c\n@@ -846,6 +846,587 @@ static int i40e_set_settings(struct net_device *netdev,\n \treturn err;\n }\n \n+#define ETHTOOL_LINK_MODE_MASK_U32 \\\n+\tDIV_ROUND_UP(__ETHTOOL_LINK_MODE_MASK_NBITS, 32)\n+\n+/**\n+ * ethtool_link_ksettings_clear_link_mode - unset a bit in link_ksettings\n+ * link mode mask\n+ * @ptr : pointer to ethtool_link_ksettings\n+ * @name : one of supported, advertising or lp_advertising\n+ * @mode : one of ETHTOOL_LINK_MODE_*_BIT\n+ * (not atomic and no bounds checking)\n+ **/\n+#define ethtool_link_ksettings_clear_link_mode(ptr, name, mode) \\\n+\t__clear_bit(ETHTOOL_LINK_MODE_ ## mode ## _BIT, (ptr)->link_modes.name)\n+\n+/**\n+ * i40e_get_link_settings_link_down - Get the Link settings when link is down\n+ * @hw: hw structure\n+ * @ksettings: ethtool command to fill in\n+ * @pf: pointer to physical function struct\n+ *\n+ * Reports link settings that can be determined when link is down\n+ **/\n+static void i40e_get_link_settings_link_down(struct i40e_hw *hw,\n+\t\t\t\t struct ethtool_link_ksettings *ksettings,\n+\t\t\t\t struct i40e_pf *pf)\n+{\n+\tstruct i40e_link_status *hw_link_info = &pf->hw.phy.link_info;\n+\tu64 phy_types = pf->hw.phy.phy_types;\n+\n+\ti40e_phy_type_to_ethtool(pf, (u32 *)&ksettings->link_modes.supported[0],\n+\t\t\t\t (u32 *)&ksettings->link_modes.advertising[0]);\n+\t/* need to add 25G PHY types */\n+\tif (phy_types & I40E_CAP_PHY_TYPE_25GBASE_KR) {\n+\t\tethtool_link_ksettings_add_link_mode(ksettings, supported,\n+\t\t\t\t\t\t 25000baseKR_Full);\n+\t\tif (hw_link_info->requested_speeds & I40E_LINK_SPEED_25GB)\n+\t\t\tethtool_link_ksettings_add_link_mode(ksettings,\n+\t\t\t\t\t\t\t advertising,\n+\t\t\t\t\t\t\t 25000baseKR_Full);\n+\t}\n+\tif (phy_types & I40E_CAP_PHY_TYPE_25GBASE_CR) {\n+\t\tethtool_link_ksettings_add_link_mode(ksettings, supported,\n+\t\t\t\t\t\t 25000baseCR_Full);\n+\t\tif (hw_link_info->requested_speeds & I40E_LINK_SPEED_25GB)\n+\t\t\tethtool_link_ksettings_add_link_mode(ksettings,\n+\t\t\t\t\t\t\t advertising,\n+\t\t\t\t\t\t\t 25000baseCR_Full);\n+\t}\n+\tif (phy_types & I40E_CAP_PHY_TYPE_25GBASE_SR ||\n+\t phy_types & I40E_CAP_PHY_TYPE_25GBASE_LR) {\n+\t\tethtool_link_ksettings_add_link_mode(ksettings, supported,\n+\t\t\t\t\t\t 25000baseSR_Full);\n+\t\tif (hw_link_info->requested_speeds & I40E_LINK_SPEED_25GB)\n+\t\t\tethtool_link_ksettings_add_link_mode(ksettings,\n+\t\t\t\t\t\t\t advertising,\n+\t\t\t\t\t\t\t 25000baseSR_Full);\n+\t}\n+\tksettings->base.speed = SPEED_UNKNOWN;\n+\tksettings->base.duplex = DUPLEX_UNKNOWN;\n+}\n+\n+/**\n+ * i40e_get_link_settings_link_up - Get Link info and duplex settings\n+ * @hw: hw structure\n+ * @ksettings: ethtool structure to fill in\n+ * @netdev: network interface device structure\n+ * @pf: pointer to physical function struct\n+ **/\n+static void i40e_get_link_settings_link_up(struct i40e_hw *hw,\n+\t\t\t\t\t struct ethtool_link_ksettings *ks,\n+\t\t\t\t\t struct net_device *netdev,\n+\t\t\t\t\t struct i40e_pf *pf)\n+{\n+\tstruct i40e_link_status *hw_link_info = &hw->phy.link_info;\n+\tu32 link_speed = hw_link_info->link_speed;\n+\tstruct ethtool_link_ksettings cap_ksettings;\n+\tint idx;\n+\n+\t/* Initialize supported and advertised settings based on phy settings */\n+\tswitch (hw_link_info->phy_type) {\n+\tcase I40E_PHY_TYPE_40GBASE_CR4:\n+\tcase I40E_PHY_TYPE_40GBASE_CR4_CU:\n+\t\tethtool_link_ksettings_add_link_mode(ks, supported, Autoneg);\n+\t\tethtool_link_ksettings_add_link_mode(ks, supported,\n+\t\t\t\t\t\t 40000baseCR4_Full);\n+\t\tethtool_link_ksettings_add_link_mode(ks, advertising, Autoneg);\n+\t\tethtool_link_ksettings_add_link_mode(ks, advertising,\n+\t\t\t\t\t\t 40000baseCR4_Full);\n+\t\tbreak;\n+\tcase I40E_PHY_TYPE_XLAUI:\n+\tcase I40E_PHY_TYPE_XLPPI:\n+\tcase I40E_PHY_TYPE_40GBASE_AOC:\n+\t\tethtool_link_ksettings_add_link_mode(ks, supported,\n+\t\t\t\t\t\t 40000baseCR4_Full);\n+\t\tbreak;\n+\tcase I40E_PHY_TYPE_40GBASE_SR4:\n+\t\tethtool_link_ksettings_add_link_mode(ks, supported,\n+\t\t\t\t\t\t 40000baseSR4_Full);\n+\t\tbreak;\n+\tcase I40E_PHY_TYPE_40GBASE_LR4:\n+\t\tethtool_link_ksettings_add_link_mode(ks, supported,\n+\t\t\t\t\t\t 40000baseLR4_Full);\n+\t\tbreak;\n+\tcase I40E_PHY_TYPE_10GBASE_SR:\n+\tcase I40E_PHY_TYPE_10GBASE_LR:\n+\tcase I40E_PHY_TYPE_1000BASE_SX:\n+\tcase I40E_PHY_TYPE_1000BASE_LX:\n+\t\tethtool_link_ksettings_add_link_mode(ks, supported,\n+\t\t\t\t\t\t 10000baseT_Full);\n+\t\tif (hw_link_info->module_type[2] &\n+\t\t I40E_MODULE_TYPE_1000BASE_SX ||\n+\t\t hw_link_info->module_type[2] &\n+\t\t I40E_MODULE_TYPE_1000BASE_LX) {\n+\t\t\tethtool_link_ksettings_add_link_mode(ks, supported,\n+\t\t\t\t\t\t\t 1000baseT_Full);\n+\t\t\tif (hw_link_info->requested_speeds &\n+\t\t\t I40E_LINK_SPEED_1GB)\n+\t\t\t\tethtool_link_ksettings_add_link_mode(ks,\n+\t\t\t\t\t\t\t\tadvertising,\n+\t\t\t\t\t\t\t\t1000baseT_Full);\n+\t\t}\n+\t\tif (hw_link_info->requested_speeds & I40E_LINK_SPEED_10GB)\n+\t\t\tethtool_link_ksettings_add_link_mode(ks, advertising,\n+\t\t\t\t\t\t\t 10000baseT_Full);\n+\t\tbreak;\n+\tcase I40E_PHY_TYPE_10GBASE_T:\n+\tcase I40E_PHY_TYPE_1000BASE_T:\n+\tcase I40E_PHY_TYPE_100BASE_TX:\n+\t\tethtool_link_ksettings_add_link_mode(ks, supported, Autoneg);\n+\t\tethtool_link_ksettings_add_link_mode(ks, supported,\n+\t\t\t\t\t\t 10000baseT_Full);\n+\t\tethtool_link_ksettings_add_link_mode(ks, supported,\n+\t\t\t\t\t\t 1000baseT_Full);\n+\t\tethtool_link_ksettings_add_link_mode(ks, supported,\n+\t\t\t\t\t\t 100baseT_Full);\n+\t\tethtool_link_ksettings_add_link_mode(ks, advertising, Autoneg);\n+\t\tif (hw_link_info->requested_speeds & I40E_LINK_SPEED_10GB)\n+\t\t\tethtool_link_ksettings_add_link_mode(ks, advertising,\n+\t\t\t\t\t\t\t 10000baseT_Full);\n+\t\tif (hw_link_info->requested_speeds & I40E_LINK_SPEED_1GB)\n+\t\t\tethtool_link_ksettings_add_link_mode(ks, advertising,\n+\t\t\t\t\t\t\t 1000baseT_Full);\n+\t\tif (hw_link_info->requested_speeds & I40E_LINK_SPEED_100MB)\n+\t\t\tethtool_link_ksettings_add_link_mode(ks, advertising,\n+\t\t\t\t\t\t\t 100baseT_Full);\n+\t\tbreak;\n+\tcase I40E_PHY_TYPE_1000BASE_T_OPTICAL:\n+\t\tethtool_link_ksettings_add_link_mode(ks, supported, Autoneg);\n+\t\tethtool_link_ksettings_add_link_mode(ks, supported,\n+\t\t\t\t\t\t 1000baseT_Full);\n+\t\tethtool_link_ksettings_add_link_mode(ks, advertising, Autoneg);\n+\t\tethtool_link_ksettings_add_link_mode(ks, advertising,\n+\t\t\t\t\t\t 1000baseT_Full);\n+\t\tbreak;\n+\tcase I40E_PHY_TYPE_10GBASE_CR1_CU:\n+\tcase I40E_PHY_TYPE_10GBASE_CR1:\n+\t\tethtool_link_ksettings_add_link_mode(ks, supported, Autoneg);\n+\t\tethtool_link_ksettings_add_link_mode(ks, supported,\n+\t\t\t\t\t\t 10000baseT_Full);\n+\t\tethtool_link_ksettings_add_link_mode(ks, advertising, Autoneg);\n+\t\tethtool_link_ksettings_add_link_mode(ks, advertising,\n+\t\t\t\t\t\t 10000baseT_Full);\n+\t\tbreak;\n+\tcase I40E_PHY_TYPE_XAUI:\n+\tcase I40E_PHY_TYPE_XFI:\n+\tcase I40E_PHY_TYPE_SFI:\n+\tcase I40E_PHY_TYPE_10GBASE_SFPP_CU:\n+\tcase I40E_PHY_TYPE_10GBASE_AOC:\n+\t\tethtool_link_ksettings_add_link_mode(ks, supported,\n+\t\t\t\t\t\t 10000baseT_Full);\n+\t\tbreak;\n+\tcase I40E_PHY_TYPE_SGMII:\n+\t\tethtool_link_ksettings_add_link_mode(ks, supported, Autoneg);\n+\t\tethtool_link_ksettings_add_link_mode(ks, supported,\n+\t\t\t\t\t\t 1000baseT_Full);\n+\t\tif (hw_link_info->requested_speeds & I40E_LINK_SPEED_1GB)\n+\t\t\tethtool_link_ksettings_add_link_mode(ks, advertising,\n+\t\t\t\t\t\t\t 1000baseT_Full);\n+\t\tif (pf->flags & I40E_FLAG_100M_SGMII_CAPABLE) {\n+\t\t\tethtool_link_ksettings_add_link_mode(ks, supported,\n+\t\t\t\t\t\t\t 100baseT_Full);\n+\t\t\tif (hw_link_info->requested_speeds &\n+\t\t\t I40E_LINK_SPEED_100MB)\n+\t\t\t\tethtool_link_ksettings_add_link_mode(ks,\n+\t\t\t\t\t\t\t\t advertising,\n+\t\t\t\t\t\t\t\t 100baseT_Full);\n+\t\t}\n+\t\tbreak;\n+\tcase I40E_PHY_TYPE_40GBASE_KR4:\n+\tcase I40E_PHY_TYPE_20GBASE_KR2:\n+\tcase I40E_PHY_TYPE_10GBASE_KR:\n+\tcase I40E_PHY_TYPE_10GBASE_KX4:\n+\tcase I40E_PHY_TYPE_1000BASE_KX:\n+\t\tethtool_link_ksettings_add_link_mode(ks, supported,\n+\t\t\t\t\t\t 40000baseKR4_Full);\n+\t\tethtool_link_ksettings_add_link_mode(ks, supported,\n+\t\t\t\t\t\t 20000baseKR2_Full);\n+\t\tethtool_link_ksettings_add_link_mode(ks, supported,\n+\t\t\t\t\t\t 10000baseKR_Full);\n+\t\tethtool_link_ksettings_add_link_mode(ks, supported,\n+\t\t\t\t\t\t 10000baseKX4_Full);\n+\t\tethtool_link_ksettings_add_link_mode(ks, supported,\n+\t\t\t\t\t\t 1000baseKX_Full);\n+\t\tethtool_link_ksettings_add_link_mode(ks, supported, Autoneg);\n+\t\tethtool_link_ksettings_add_link_mode(ks, advertising,\n+\t\t\t\t\t\t 40000baseKR4_Full);\n+\t\tethtool_link_ksettings_add_link_mode(ks, advertising,\n+\t\t\t\t\t\t 20000baseKR2_Full);\n+\t\tethtool_link_ksettings_add_link_mode(ks, advertising,\n+\t\t\t\t\t\t 10000baseKR_Full);\n+\t\tethtool_link_ksettings_add_link_mode(ks, advertising,\n+\t\t\t\t\t\t 10000baseKX4_Full);\n+\t\tethtool_link_ksettings_add_link_mode(ks, advertising,\n+\t\t\t\t\t\t 1000baseKX_Full);\n+\t\tethtool_link_ksettings_add_link_mode(ks, advertising, Autoneg);\n+\t\tbreak;\n+\tcase I40E_PHY_TYPE_25GBASE_KR:\n+\t\tethtool_link_ksettings_add_link_mode(ks, supported, Autoneg);\n+\t\tethtool_link_ksettings_add_link_mode(ks, advertising, Autoneg);\n+\t\tethtool_link_ksettings_add_link_mode(ks, supported,\n+\t\t\t\t\t\t 25000baseKR_Full);\n+\t\tethtool_link_ksettings_add_link_mode(ks, advertising,\n+\t\t\t\t\t\t 25000baseKR_Full);\n+\t\tbreak;\n+\tcase I40E_PHY_TYPE_25GBASE_CR:\n+\t\tethtool_link_ksettings_add_link_mode(ks, supported, Autoneg);\n+\t\tethtool_link_ksettings_add_link_mode(ks, advertising, Autoneg);\n+\t\tethtool_link_ksettings_add_link_mode(ks, supported,\n+\t\t\t\t\t\t 25000baseCR_Full);\n+\t\tethtool_link_ksettings_add_link_mode(ks, advertising,\n+\t\t\t\t\t\t 25000baseCR_Full);\n+\t\tbreak;\n+\tcase I40E_PHY_TYPE_25GBASE_SR:\n+\tcase I40E_PHY_TYPE_25GBASE_LR:\n+\t\tethtool_link_ksettings_add_link_mode(ks, supported, Autoneg);\n+\t\tethtool_link_ksettings_add_link_mode(ks, advertising, Autoneg);\n+\t\tethtool_link_ksettings_add_link_mode(ks, supported,\n+\t\t\t\t\t\t 25000baseSR_Full);\n+\t\tethtool_link_ksettings_add_link_mode(ks, advertising,\n+\t\t\t\t\t\t 25000baseSR_Full);\n+\t\tbreak;\n+\tdefault:\n+\t\t/* if we got here and link is up something bad is afoot */\n+\t\tnetdev_info(netdev,\n+\t\t\t \"WARNING: Link is up but PHY type 0x%x is not recognized.\\n\",\n+\t\t\t hw_link_info->phy_type);\n+\t}\n+\n+\t/* Now that we've worked out everything that could be supported by the\n+\t * current phy type, get what is supported by the NVM and and them to\n+\t * get what is truly supported\n+\t */\n+\tmemset(&cap_ksettings, 0, sizeof(struct ethtool_link_ksettings));\n+\tcap_ksettings.base.cmd = ks->base.cmd;\n+\tcap_ksettings.base.link_mode_masks_nwords =\n+\t\t\t\t\t ks->base.link_mode_masks_nwords;\n+\ti40e_get_link_settings_link_down(hw, &cap_ksettings, pf);\n+\n+\tfor (idx = 0; idx < ETHTOOL_LINK_MODE_MASK_U32; idx++) {\n+\t\tks->base.link_mode_masks[idx] &=\n+\t\t\t\t\tcap_ksettings.base.link_mode_masks[idx];\n+\t\tks->base.link_mode_masks[idx + ETHTOOL_LINK_MODE_MASK_U32] &=\n+\t\t\t\t\tcap_ksettings.base.link_mode_masks[idx +\n+\t\t\t\t\tETHTOOL_LINK_MODE_MASK_U32];\n+\t}\n+\n+\t/* Set speed and duplex */\n+\tswitch (link_speed) {\n+\tcase I40E_LINK_SPEED_40GB:\n+\t\tks->base.speed = SPEED_40000;\n+\t\tbreak;\n+\tcase I40E_LINK_SPEED_25GB:\n+\t\tks->base.speed = SPEED_25000;\n+\t\tbreak;\n+\tcase I40E_LINK_SPEED_20GB:\n+\t\tks->base.speed = SPEED_20000;\n+\t\tbreak;\n+\tcase I40E_LINK_SPEED_10GB:\n+\t\tks->base.speed = SPEED_10000;\n+\t\tbreak;\n+\tcase I40E_LINK_SPEED_1GB:\n+\t\tks->base.speed = SPEED_1000;\n+\t\tbreak;\n+\tcase I40E_LINK_SPEED_100MB:\n+\t\tks->base.speed = SPEED_100;\n+\t\tbreak;\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\tks->base.duplex = DUPLEX_FULL;\n+}\n+\n+/**\n+ * i40e_get_link_settings - Get Link Speed and Duplex settings\n+ * @netdev: network interface device structure\n+ * @ksettings: ethtool command\n+ *\n+ * Reports speed/duplex settings based on media_type\n+ **/\n+static int i40e_get_link_settings(struct net_device *netdev,\n+\t\t\t\t struct ethtool_link_ksettings *ks)\n+{\n+\tstruct i40e_netdev_priv *np = netdev_priv(netdev);\n+\tstruct i40e_pf *pf = np->vsi->back;\n+\tstruct i40e_hw *hw = &pf->hw;\n+\tstruct i40e_link_status *hw_link_info = &hw->phy.link_info;\n+\tbool link_up = hw_link_info->link_info & I40E_AQ_LINK_UP;\n+\tstruct ethtool_link_settings *settings = &ks->base;\n+\n+\tethtool_link_ksettings_zero_link_mode(ks, supported);\n+\tethtool_link_ksettings_zero_link_mode(ks, advertising);\n+\n+\tif (link_up)\n+\t\ti40e_get_link_settings_link_up(hw, ks, netdev, pf);\n+\telse\n+\t\ti40e_get_link_settings_link_down(hw, ks, pf);\n+\n+\t/* Now set the settings that don't rely on link being up/down */\n+\t/* Set autoneg settings */\n+\tsettings->autoneg = (hw_link_info->an_info & I40E_AQ_AN_COMPLETED ?\n+\t\t\t AUTONEG_ENABLE : AUTONEG_DISABLE);\n+\n+\t/* Set media type settings */\n+\tswitch (hw->phy.media_type) {\n+\tcase I40E_MEDIA_TYPE_BACKPLANE:\n+\t\tethtool_link_ksettings_add_link_mode(ks, supported, Autoneg);\n+\t\tethtool_link_ksettings_add_link_mode(ks, supported, Backplane);\n+\t\tethtool_link_ksettings_add_link_mode(ks, advertising, Autoneg);\n+\t\tethtool_link_ksettings_add_link_mode(ks, advertising,\n+\t\t\t\t\t\t Backplane);\n+\t\tsettings->port = PORT_NONE;\n+\t\tbreak;\n+\tcase I40E_MEDIA_TYPE_BASET:\n+\t\tethtool_link_ksettings_add_link_mode(ks, supported, TP);\n+\t\tethtool_link_ksettings_add_link_mode(ks, advertising, TP);\n+\t\tsettings->port = PORT_TP;\n+\t\tbreak;\n+\tcase I40E_MEDIA_TYPE_DA:\n+\tcase I40E_MEDIA_TYPE_CX4:\n+\t\tethtool_link_ksettings_add_link_mode(ks, supported, FIBRE);\n+\t\tethtool_link_ksettings_add_link_mode(ks, advertising, FIBRE);\n+\t\tsettings->port = PORT_DA;\n+\t\tbreak;\n+\tcase I40E_MEDIA_TYPE_FIBER:\n+\t\tethtool_link_ksettings_add_link_mode(ks, supported, FIBRE);\n+\t\tsettings->port = PORT_FIBRE;\n+\t\tbreak;\n+\tcase I40E_MEDIA_TYPE_UNKNOWN:\n+\tdefault:\n+\t\tsettings->port = PORT_OTHER;\n+\t\tbreak;\n+\t}\n+\n+\t/* Set flow control settings */\n+\tethtool_link_ksettings_add_link_mode(ks, advertising, Pause);\n+\n+\tswitch (hw->fc.requested_mode) {\n+\tcase I40E_FC_FULL:\n+\t\tethtool_link_ksettings_add_link_mode(ks, advertising, Pause);\n+\t\tbreak;\n+\tcase I40E_FC_TX_PAUSE:\n+\t\tethtool_link_ksettings_add_link_mode(ks, advertising,\n+\t\t\t\t\t\t Asym_Pause);\n+\t\tbreak;\n+\tcase I40E_FC_RX_PAUSE:\n+\t\tethtool_link_ksettings_add_link_mode(ks, advertising, Pause);\n+\t\tethtool_link_ksettings_add_link_mode(ks, advertising,\n+\t\t\t\t\t\t Asym_Pause);\n+\t\tbreak;\n+\tdefault:\n+\t\tethtool_link_ksettings_clear_link_mode(ks, advertising, Pause);\n+\t\tethtool_link_ksettings_clear_link_mode(ks, advertising,\n+\t\t\t\t\t\t Asym_Pause);\n+\t\tbreak;\n+\t}\n+\treturn 0;\n+}\n+\n+/**\n+ * i40e_set_link_settings - Set Speed and Duplex\n+ * @netdev: network interface device structure\n+ * @ksettings_passed: ethtool command\n+ *\n+ * Set speed/duplex per media_types advertised/forced\n+ **/\n+static int i40e_set_link_settings(struct net_device *netdev,\n+\t\t\t const struct ethtool_link_ksettings *ksettings_passed)\n+{\n+\tstruct i40e_netdev_priv *np = netdev_priv(netdev);\n+\tstruct i40e_aq_get_phy_abilities_resp abilities;\n+\tstruct i40e_aq_set_phy_config config;\n+\tstruct i40e_pf *pf = np->vsi->back;\n+\tstruct i40e_vsi *vsi = np->vsi;\n+\tstruct i40e_hw *hw = &pf->hw;\n+\tstruct ethtool_link_ksettings safe_ksettings;\n+\ti40e_status status = 0;\n+\tbool autoneg_changed = false;\n+\tint err = 0;\n+\tu8 autoneg;\n+\tstruct ethtool_link_ksettings ksettings_real, *ksettings;\n+\tu32 advertise[ETHTOOL_LINK_MODE_MASK_U32];\n+\n+\tksettings = &ksettings_real;\n+\t*ksettings = *ksettings_passed;\n+\n+\t/* Changing port settings is not supported if this isn't the\n+\t * port's controlling PF\n+\t */\n+\tif (hw->partition_id != 1) {\n+\t\ti40e_partition_setting_complaint(pf);\n+\t\treturn -EOPNOTSUPP;\n+\t}\n+\tif (vsi != pf->vsi[pf->lan_vsi])\n+\t\treturn -EOPNOTSUPP;\n+\tif (hw->phy.media_type != I40E_MEDIA_TYPE_BASET &&\n+\t hw->phy.media_type != I40E_MEDIA_TYPE_FIBER &&\n+\t hw->phy.media_type != I40E_MEDIA_TYPE_BACKPLANE &&\n+\t hw->phy.media_type != I40E_MEDIA_TYPE_DA &&\n+\t hw->phy.link_info.link_info & I40E_AQ_LINK_UP)\n+\t\treturn -EOPNOTSUPP;\n+\tif (hw->device_id == I40E_DEV_ID_KX_B ||\n+\t hw->device_id == I40E_DEV_ID_KX_C ||\n+\t hw->device_id == I40E_DEV_ID_20G_KR2 ||\n+\t hw->device_id == I40E_DEV_ID_20G_KR2_A) {\n+\t\tnetdev_info(netdev,\n+\t\t\t \"Changing settings is not supported on backplane.\\n\");\n+\t\treturn -EOPNOTSUPP;\n+\t}\n+\n+\t/* get our own copy of the bits to check against */\n+\tmemset(&safe_ksettings, 0, sizeof(struct ethtool_link_ksettings));\n+\tsafe_ksettings.base.cmd = ksettings->base.cmd;\n+\tsafe_ksettings.base.link_mode_masks_nwords =\n+\t\tksettings->base.link_mode_masks_nwords;\n+\ti40e_get_link_settings(netdev, &safe_ksettings);\n+\n+\t/* save autoneg and speed out of ksettings */\n+\tautoneg = ksettings->base.autoneg;\n+\tmemcpy((void *)advertise,\n+\t &ksettings->base.link_mode_masks[ETHTOOL_LINK_MODE_MASK_U32],\n+\t sizeof(advertise));\n+\n+\t/* set autoneg and speed back to what they currently are */\n+\tksettings->base.autoneg = safe_ksettings.base.autoneg;\n+\tmemcpy((void *)ksettings->link_modes.advertising,\n+\t safe_ksettings.link_modes.advertising,\n+\t sizeof(advertise));\n+\n+\t/* If ksettings and safe_ksettings are not the same now, then they are\n+\t * trying to set something that we do not support\n+\t */\n+\tif (memcmp(ksettings, &safe_ksettings,\n+\t\t sizeof(struct ethtool_link_settings)))\n+\t\treturn -EOPNOTSUPP;\n+\twhile (test_bit(__I40E_CONFIG_BUSY, &vsi->state))\n+\t\tusleep_range(1000, 2000);\n+\n+\t/* Get the current phy config */\n+\tstatus = i40e_aq_get_phy_capabilities(hw, false, false, &abilities,\n+\t\t\t\t\t NULL);\n+\tif (status)\n+\t\treturn -EAGAIN;\n+\n+\t/* Copy abilities to config in case autoneg is not\n+\t * set below\n+\t */\n+\tmemset(&config, 0, sizeof(struct i40e_aq_set_phy_config));\n+\tconfig.abilities = abilities.abilities;\n+\n+\t/* Check autoneg */\n+\tif (autoneg == AUTONEG_ENABLE) {\n+\t\t/* If autoneg was not already enabled */\n+\t\tif (!(hw->phy.link_info.an_info & I40E_AQ_AN_COMPLETED)) {\n+\t\t\t/* If autoneg is not supported, return error */\n+\t\t\tif (!(safe_ksettings.link_modes.supported[0] &\n+\t\t\t SUPPORTED_Autoneg)) {\n+\t\t\t\tnetdev_info(netdev,\n+\t\t\t\t\t \"Autoneg not supported on this phy\\n\");\n+\t\t\t\treturn -EINVAL;\n+\t\t\t}\n+\t\t\t/* Autoneg is allowed to change */\n+\t\t\tconfig.abilities = abilities.abilities |\n+\t\t\t\t\t I40E_AQ_PHY_ENABLE_AN;\n+\t\t\tautoneg_changed = true;\n+\t\t}\n+\t} else {\n+\t\t/* If autoneg is currently enabled */\n+\t\tif (hw->phy.link_info.an_info & I40E_AQ_AN_COMPLETED) {\n+\t\t\t/* If autoneg is supported 10GBASE_T is the only phy\n+\t\t\t * that can disable it, so otherwise return error\n+\t\t\t */\n+\t\t\tif (safe_ksettings.link_modes.supported[0] &\n+\t\t\t SUPPORTED_Autoneg &&\n+\t\t\t hw->phy.link_info.phy_type !=\n+\t\t\t I40E_PHY_TYPE_10GBASE_T) {\n+\t\t\t\tnetdev_info(netdev,\n+\t\t\t\t\t \"Autoneg cannot be disabled on this phy\\n\");\n+\t\t\t\treturn -EINVAL;\n+\t\t\t}\n+\t\t\t/* Autoneg is allowed to change */\n+\t\t\tconfig.abilities = abilities.abilities &\n+\t\t\t\t\t ~I40E_AQ_PHY_ENABLE_AN;\n+\t\t\tautoneg_changed = true;\n+\t\t}\n+\t}\n+\tif (advertise[0] & ADVERTISED_100baseT_Full)\n+\t\tconfig.link_speed |= I40E_LINK_SPEED_100MB;\n+\tif (advertise[0] & ADVERTISED_1000baseT_Full ||\n+\t advertise[0] & ADVERTISED_1000baseKX_Full)\n+\t\tconfig.link_speed |= I40E_LINK_SPEED_1GB;\n+\tif (advertise[0] & ADVERTISED_10000baseT_Full ||\n+\t advertise[0] & ADVERTISED_10000baseKX4_Full ||\n+\t advertise[0] & ADVERTISED_10000baseKR_Full)\n+\t\tconfig.link_speed |= I40E_LINK_SPEED_10GB;\n+\tif (advertise[0] & ADVERTISED_20000baseKR2_Full)\n+\t\tconfig.link_speed |= I40E_LINK_SPEED_20GB;\n+\tif (ethtool_link_ksettings_test_link_mode(ksettings, advertising,\n+\t\t\t\t\t\t 25000baseCR_Full) ||\n+\t ethtool_link_ksettings_test_link_mode(ksettings, advertising,\n+\t\t\t\t\t\t 25000baseKR_Full) ||\n+\t ethtool_link_ksettings_test_link_mode(ksettings, advertising,\n+\t\t\t\t\t\t 25000baseSR_Full))\n+\t\tconfig.link_speed |= I40E_LINK_SPEED_25GB;\n+\tif (advertise[0] & ADVERTISED_40000baseKR4_Full ||\n+\t advertise[0] & ADVERTISED_40000baseCR4_Full ||\n+\t advertise[0] & ADVERTISED_40000baseSR4_Full ||\n+\t advertise[0] & ADVERTISED_40000baseLR4_Full)\n+\t\tconfig.link_speed |= I40E_LINK_SPEED_40GB;\n+\n+\t/* If speed didn't get set, set it to what it currently is.\n+\t * This is needed because if advertise is 0 (as it is when autoneg\n+\t * is disabled) then speed won't get set.\n+\t */\n+\tif (!config.link_speed)\n+\t\tconfig.link_speed = abilities.link_speed;\n+\tif (autoneg_changed || (abilities.link_speed != config.link_speed)) {\n+\t\t/* copy over the rest of the abilities */\n+\t\tconfig.phy_type = abilities.phy_type;\n+\t\tconfig.phy_type_ext = abilities.phy_type_ext;\n+\t\tconfig.eee_capability = abilities.eee_capability;\n+\t\tconfig.eeer = abilities.eeer_val;\n+\t\tconfig.low_power_ctrl = abilities.d3_lpan;\n+\t\tconfig.fec_config = abilities.fec_cfg_curr_mod_ext_info &\n+\t\t\t\t I40E_AQ_PHY_FEC_CONFIG_MASK;\n+\n+\t\t/* save the requested speeds */\n+\t\thw->phy.link_info.requested_speeds = config.link_speed;\n+\t\t/* set link and auto negotiation so changes take effect */\n+\t\tconfig.abilities |= I40E_AQ_PHY_ENABLE_ATOMIC_LINK;\n+\t\t/* If link is up put link down */\n+\t\tif (hw->phy.link_info.link_info & I40E_AQ_LINK_UP) {\n+\t\t\t/* Tell the OS link is going down, the link will go\n+\t\t\t * back up when fw says it is ready asynchronously\n+\t\t\t */\n+\t\t\ti40e_print_link_message(vsi, false);\n+\t\t\tnetif_carrier_off(netdev);\n+\t\t\tnetif_tx_stop_all_queues(netdev);\n+\t\t}\n+\n+\t\t/* make the aq call */\n+\t\tstatus = i40e_aq_set_phy_config(hw, &config, NULL);\n+\t\tif (status) {\n+\t\t\tnetdev_info(netdev,\n+\t\t\t\t \"Set phy config failed, err %s aq_err %s\\n\",\n+\t\t\t\t i40e_stat_str(hw, status),\n+\t\t\t\t i40e_aq_str(hw, hw->aq.asq_last_status));\n+\t\t\treturn -EAGAIN;\n+\t\t}\n+\t\tstatus = i40e_update_link_info(hw);\n+\t\tif (status)\n+\t\t\tnetdev_dbg(netdev,\n+\t\t\t\t \"Updating link info failed with err %s aq_err %s\\n\",\n+\t\t\t\t i40e_stat_str(hw, status),\n+\t\t\t\t i40e_aq_str(hw, hw->aq.asq_last_status));\n+\t} else {\n+\t\tnetdev_info(netdev,\n+\t\t\t \"Nothing changed, exiting without setting anything.\\n\");\n+\t}\n+\treturn err;\n+}\n+\n static int i40e_nway_reset(struct net_device *netdev)\n {\n \t/* restart autonegotiation */\n@@ -3198,6 +3779,8 @@ static const struct ethtool_ops i40e_ethtool_ops = {\n \t.set_priv_flags\t\t= i40e_set_priv_flags,\n \t.get_per_queue_coalesce\t= i40e_get_per_queue_coalesce,\n \t.set_per_queue_coalesce\t= i40e_set_per_queue_coalesce,\n+\t.get_link_ksettings = i40e_get_link_settings,\n+\t.set_link_ksettings = i40e_set_link_settings,\n };\n \n void i40e_set_ethtool_ops(struct net_device *netdev)\n", "prefixes": [ "next", "S61", "05/10" ] }