get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/702864/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 702864,
    "url": "http://patchwork.ozlabs.org/api/patches/702864/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/intel-wired-lan/patch/1480957333-4451-1-git-send-email-ryanschaefer23@gmail.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": "<1480957333-4451-1-git-send-email-ryanschaefer23@gmail.com>",
    "list_archive_url": null,
    "date": "2016-12-05T17:02:13",
    "name": "ixgbe: Switch to ETHTOOL_xLINKSETTINGS API",
    "commit_ref": null,
    "pull_url": null,
    "state": "changes-requested",
    "archived": false,
    "hash": "8c08d02b24b8c544c968f263cda102cda83e55f7",
    "submitter": {
        "id": 70063,
        "url": "http://patchwork.ozlabs.org/api/people/70063/?format=api",
        "name": "Ryan Schaefer",
        "email": "ryanschaefer23@gmail.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/1480957333-4451-1-git-send-email-ryanschaefer23@gmail.com/mbox/",
    "series": [],
    "comments": "http://patchwork.ozlabs.org/api/patches/702864/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/702864/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 fraxinus.osuosl.org (smtp4.osuosl.org [140.211.166.137])\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 3tXbXC1YH8z9srZ\n\tfor <incoming@patchwork.ozlabs.org>;\n\tTue,  6 Dec 2016 07:12:27 +1100 (AEDT)",
            "from localhost (localhost [127.0.0.1])\n\tby fraxinus.osuosl.org (Postfix) with ESMTP id B9FBD85542;\n\tMon,  5 Dec 2016 20:12:25 +0000 (UTC)",
            "from fraxinus.osuosl.org ([127.0.0.1])\n\tby localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024)\n\twith ESMTP id cbrmRxNjWJwL; Mon,  5 Dec 2016 20:12:24 +0000 (UTC)",
            "from ash.osuosl.org (ash.osuosl.org [140.211.166.34])\n\tby fraxinus.osuosl.org (Postfix) with ESMTP id 1E0FD8548A;\n\tMon,  5 Dec 2016 20:12:24 +0000 (UTC)",
            "from silver.osuosl.org (smtp3.osuosl.org [140.211.166.136])\n\tby ash.osuosl.org (Postfix) with ESMTP id 36EC11C0323\n\tfor <intel-wired-lan@lists.osuosl.org>;\n\tMon,  5 Dec 2016 17:02:32 +0000 (UTC)",
            "from localhost (localhost [127.0.0.1])\n\tby silver.osuosl.org (Postfix) with ESMTP id 2E36F231BA\n\tfor <intel-wired-lan@lists.osuosl.org>;\n\tMon,  5 Dec 2016 17:02:32 +0000 (UTC)",
            "from silver.osuosl.org ([127.0.0.1])\n\tby localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024)\n\twith ESMTP id MJtUkWBudCUQ for <intel-wired-lan@lists.osuosl.org>;\n\tMon,  5 Dec 2016 17:02:30 +0000 (UTC)",
            "from mail-pg0-f67.google.com (mail-pg0-f67.google.com\n\t[74.125.83.67])\n\tby silver.osuosl.org (Postfix) with ESMTPS id 8E42A2A1BE\n\tfor <intel-wired-lan@lists.osuosl.org>;\n\tMon,  5 Dec 2016 17:02:30 +0000 (UTC)",
            "by mail-pg0-f67.google.com with SMTP id x23so16980825pgx.3\n\tfor <intel-wired-lan@lists.osuosl.org>;\n\tMon, 05 Dec 2016 09:02:30 -0800 (PST)",
            "from beast.tc.fluke.com (a-129-196-226-78.ext.fluke.com.\n\t[129.196.226.78]) by smtp.gmail.com with ESMTPSA id\n\tc15sm28811175pfd.36.2016.12.05.09.02.29\n\t(version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128);\n\tMon, 05 Dec 2016 09:02:29 -0800 (PST)"
        ],
        "Authentication-Results": "ozlabs.org;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key;\n\tunprotected) header.d=gmail.com header.i=@gmail.com\n\theader.b=\"tlwctP+q\"; dkim-atps=neutral",
        "X-Virus-Scanned": [
            "amavisd-new at osuosl.org",
            "amavisd-new at osuosl.org"
        ],
        "X-Greylist": "domain auto-whitelisted by SQLgrey-1.7.6",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;\n\th=from:to:cc:subject:date:message-id;\n\tbh=T7GsVbxSy74waUeeESkVNcFSNxZw5QVGAGSso6Qbn+M=;\n\tb=tlwctP+qSJviFCGpc8z89MYdaS7Qz5h1lmvZpaxtOpzqKe5T/KGt+jtDwxt1xVMAaF\n\tM7WrbuWMNy/py7EQ7mDcSDH9c0awrBHgskaueB1IJph++zSuYXuDikFoTrr74ArMwTug\n\twpuhlyWq7kYgX3uo9V7g6WKRm7uh7HZbC2Mu0M8T0Um0rYyWuumqwUnK1V26/BqHLNoT\n\tDrJQStYbRIAcKdpobQjF5o7mz6/yl7sxcS7S395xMAxG9kp+EOw/Nkg4y8eWroRMJSWU\n\tQJ3KKvun6zKDOy7uskXohsMxTx2BEIz/0T3WhNsa3i4gSqq7qN2Ka4dSDQXF3QA6mS+6\n\thESA==",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20130820;\n\th=x-gm-message-state:from:to:cc:subject:date:message-id;\n\tbh=T7GsVbxSy74waUeeESkVNcFSNxZw5QVGAGSso6Qbn+M=;\n\tb=EBsBfy8lFCWdPAIfJjTcKBkunz011yIbBYOPG5zzSuGXKX5Nwwcz2JyUOFzCCOl/bD\n\t6ThI47QoLgxQhXaHTH53Kx5DeTZjpLcMklnZqc7bZ5RxgFPZZa76cbjCWToZXfYPQ5JA\n\tOkhCxh6H0ndHUqm0hWAsa/t4cM7m0RqmYTCw+nnvF8b0pPIlbB+NKIQpEabqlz2CGP7z\n\tQlk7pJWs7twkocHBZ7nRnOK2h/s4Osw+UfGxC6DTmXf3BtlzGeyAS2U9/9lWYna/NVnj\n\tpbz74XighCAcBjdo9Rx+xtgBNE7rwus+iYEZjs4IbhtlSVlPDioWwqYCWoQr/cSu70SL\n\tjJVw==",
        "X-Gm-Message-State": "AKaTC02LoMDcxhA4NWkbhsDu6DJyyhXfqHjTAtXx5FyVJIzHk88E/6HOtPXACO3m0bKTZQ==",
        "X-Received": "by 10.98.25.205 with SMTP id 196mr59111717pfz.46.1480957349988; \n\tMon, 05 Dec 2016 09:02:29 -0800 (PST)",
        "From": "Ryan Schaefer <ryanschaefer23@gmail.com>",
        "To": "intel-wired-lan@lists.osuosl.org",
        "Date": "Mon,  5 Dec 2016 09:02:13 -0800",
        "Message-Id": "<1480957333-4451-1-git-send-email-ryanschaefer23@gmail.com>",
        "X-Mailer": "git-send-email 2.7.4",
        "X-Mailman-Approved-At": "Mon, 05 Dec 2016 20:12:22 +0000",
        "Subject": "[Intel-wired-lan] [PATCH] ixgbe: Switch to ETHTOOL_xLINKSETTINGS API",
        "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": "Switch to new ethtool api in preparation for support of advertising\n2.5GBaseT and 5GBaseT.\n\nFixes a bug introduced in 9a799d7, which sets 1000baseT supported\nflags instead of 100baseT flag.\n\nSigned-off-by: Ryan Schaefer <ryanschaefer23@gmail.com>\n---\n drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c | 237 ++++++++++++++---------\n include/linux/ethtool.h                          |  34 ++++\n 2 files changed, 178 insertions(+), 93 deletions(-)",
    "diff": "diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c\nindex fd192bf..89afc48 100644\n--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c\n+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c\n@@ -158,29 +158,41 @@ static const char ixgbe_gstrings_test[][ETH_GSTRING_LEN] = {\n \n #define ixgbe_isbackplane(type) ((type) == ixgbe_media_type_backplane)\n \n-static u32 ixgbe_get_supported_10gtypes(struct ixgbe_hw *hw)\n+static void ixgbe_set_supported_10gtypes(struct ixgbe_hw *hw,\n+\t\t\t\t\t struct ethtool_link_ksettings *cmd)\n {\n-\tif (!ixgbe_isbackplane(hw->phy.media_type))\n-\t\treturn SUPPORTED_10000baseT_Full;\n+\tif (!ixgbe_isbackplane(hw->phy.media_type)) {\n+\t\tethtool_link_ksettings_add_link_mode(cmd, supported,\n+\t\t\t\t\t\t     10000baseT_Full);\n+\t\treturn;\n+\t}\n \n \tswitch (hw->device_id) {\n \tcase IXGBE_DEV_ID_82598:\n \tcase IXGBE_DEV_ID_82599_KX4:\n \tcase IXGBE_DEV_ID_82599_KX4_MEZZ:\n \tcase IXGBE_DEV_ID_X550EM_X_KX4:\n-\t\treturn SUPPORTED_10000baseKX4_Full;\n+\t\tethtool_link_ksettings_add_link_mode(cmd, supported,\n+\t\t\t\t\t\t     10000baseKX4_Full);\n+\t\tbreak;\n \tcase IXGBE_DEV_ID_82598_BX:\n \tcase IXGBE_DEV_ID_82599_KR:\n \tcase IXGBE_DEV_ID_X550EM_X_KR:\n-\t\treturn SUPPORTED_10000baseKR_Full;\n+\t\tethtool_link_ksettings_add_link_mode(cmd, supported,\n+\t\t\t\t\t\t     10000baseKR_Full);\n+\t\tbreak;\n \tdefault:\n-\t\treturn SUPPORTED_10000baseKX4_Full |\n-\t\t       SUPPORTED_10000baseKR_Full;\n+\t\tethtool_link_ksettings_add_link_mode(cmd, supported,\n+\t\t\t\t\t\t     10000baseKX4_Full);\n+\t\tethtool_link_ksettings_add_link_mode(cmd, supported,\n+\t\t\t\t\t\t     10000baseKR_Full);\n+\t\tbreak;\n \t}\n+\treturn;\n }\n \n-static int ixgbe_get_settings(struct net_device *netdev,\n-\t\t\t      struct ethtool_cmd *ecmd)\n+static int ixgbe_get_link_ksettings(struct net_device *netdev,\n+\t\t\t\t    struct ethtool_link_ksettings *cmd)\n {\n \tstruct ixgbe_adapter *adapter = netdev_priv(netdev);\n \tstruct ixgbe_hw *hw = &adapter->hw;\n@@ -191,46 +203,66 @@ static int ixgbe_get_settings(struct net_device *netdev,\n \n \t/* set the supported link speeds */\n \tif (supported_link & IXGBE_LINK_SPEED_10GB_FULL)\n-\t\tecmd->supported |= ixgbe_get_supported_10gtypes(hw);\n-\tif (supported_link & IXGBE_LINK_SPEED_1GB_FULL)\n-\t\tecmd->supported |= (ixgbe_isbackplane(hw->phy.media_type)) ?\n-\t\t\t\t   SUPPORTED_1000baseKX_Full :\n-\t\t\t\t   SUPPORTED_1000baseT_Full;\n+\t\tixgbe_set_supported_10gtypes(hw, cmd);\n+\tif (supported_link & IXGBE_LINK_SPEED_1GB_FULL) {\n+\t\tif (ixgbe_isbackplane(hw->phy.media_type))\n+\t\t\tethtool_link_ksettings_add_link_mode(cmd, supported,\n+\t\t\t\t\t\t\t     1000baseKX_Full);\n+\t\telse\n+\t\t\tethtool_link_ksettings_add_link_mode(cmd, supported,\n+\t\t\t\t\t\t\t     1000baseT_Full);\n+\t}\n \tif (supported_link & IXGBE_LINK_SPEED_100_FULL)\n-\t\tecmd->supported |= ixgbe_isbackplane(hw->phy.media_type) ?\n-\t\t\t\t   SUPPORTED_1000baseKX_Full :\n-\t\t\t\t   SUPPORTED_1000baseT_Full;\n+\t\tethtool_link_ksettings_add_link_mode(cmd, supported,\n+\t\t\t\t\t\t     100baseT_Full);\n \n \t/* default advertised speed if phy.autoneg_advertised isn't set */\n-\tecmd->advertising = ecmd->supported;\n+\tethtool_link_ksettings_copy_link_mode(cmd, advertising, supported);\n \t/* set the advertised speeds */\n \tif (hw->phy.autoneg_advertised) {\n-\t\tecmd->advertising = 0;\n+\t\tethtool_link_ksettings_zero_link_mode(cmd, advertising);\n \t\tif (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_100_FULL)\n-\t\t\tecmd->advertising |= ADVERTISED_100baseT_Full;\n-\t\tif (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_10GB_FULL)\n-\t\t\tecmd->advertising |= ecmd->supported & ADVRTSD_MSK_10G;\n+\t\t\tethtool_link_ksettings_add_link_mode(cmd, advertising,\n+\t\t\t\t\t\t\t     100baseT_Full);\n+\t\tif (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_10GB_FULL) {\n+\t\t\tif (ethtool_link_ksettings_test_link_mode(cmd,\n+\t\t\t\t\t\tsupported, 10000baseT_Full))\n+\t\t\t\tethtool_link_ksettings_add_link_mode(cmd,\n+\t\t\t\t\t\tadvertising, 10000baseT_Full);\n+\n+\t\t\tif (ethtool_link_ksettings_test_link_mode(cmd,\n+\t\t\t\t\t\tsupported, 10000baseKX4_Full))\n+\t\t\t\tethtool_link_ksettings_add_link_mode(cmd,\n+\t\t\t\t\t\tadvertising, 10000baseKX4_Full);\n+\n+\t\t\tif (ethtool_link_ksettings_test_link_mode(cmd,\n+\t\t\t\t\t\tsupported, 10000baseKR_Full))\n+\t\t\t\tethtool_link_ksettings_add_link_mode(cmd,\n+\t\t\t\t\t\tadvertising, 10000baseKR_Full);\n+\t\t}\n \t\tif (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_1GB_FULL) {\n-\t\t\tif (ecmd->supported & SUPPORTED_1000baseKX_Full)\n-\t\t\t\tecmd->advertising |= ADVERTISED_1000baseKX_Full;\n+\t\t\tif (ethtool_link_ksettings_test_link_mode(cmd,\n+\t\t\t\t\t\tsupported, 1000baseKX_Full))\n+\t\t\t\tethtool_link_ksettings_add_link_mode(cmd,\n+\t\t\t\t\t\tadvertising, 1000baseKX_Full);\n \t\t\telse\n-\t\t\t\tecmd->advertising |= ADVERTISED_1000baseT_Full;\n+\t\t\t\tethtool_link_ksettings_add_link_mode(cmd,\n+\t\t\t\t\t\tadvertising, 1000baseT_Full);\n \t\t}\n \t} else {\n \t\tif (hw->phy.multispeed_fiber && !autoneg) {\n \t\t\tif (supported_link & IXGBE_LINK_SPEED_10GB_FULL)\n-\t\t\t\tecmd->advertising = ADVERTISED_10000baseT_Full;\n+\t\t\t\tethtool_link_ksettings_add_link_mode(cmd,\n+\t\t\t\t\t\tadvertising, 1000baseT_Full);\n \t\t}\n \t}\n \n \tif (autoneg) {\n-\t\tecmd->supported |= SUPPORTED_Autoneg;\n-\t\tecmd->advertising |= ADVERTISED_Autoneg;\n-\t\tecmd->autoneg = AUTONEG_ENABLE;\n+\t\tethtool_link_ksettings_add_link_mode(cmd, supported, Autoneg);\n+\t\tethtool_link_ksettings_add_link_mode(cmd, advertising, Autoneg);\n+\t\tcmd->base.autoneg = AUTONEG_ENABLE;\n \t} else\n-\t\tecmd->autoneg = AUTONEG_DISABLE;\n-\n-\tecmd->transceiver = XCVR_EXTERNAL;\n+\t\tcmd->base.autoneg = AUTONEG_DISABLE;\n \n \t/* Determine the remaining settings based on the PHY type. */\n \tswitch (adapter->hw.phy.type) {\n@@ -238,14 +270,14 @@ static int ixgbe_get_settings(struct net_device *netdev,\n \tcase ixgbe_phy_aq:\n \tcase ixgbe_phy_x550em_ext_t:\n \tcase ixgbe_phy_cu_unknown:\n-\t\tecmd->supported |= SUPPORTED_TP;\n-\t\tecmd->advertising |= ADVERTISED_TP;\n-\t\tecmd->port = PORT_TP;\n+\t\tethtool_link_ksettings_add_link_mode(cmd, supported, TP);\n+\t\tethtool_link_ksettings_add_link_mode(cmd, advertising, TP);\n+\t\tcmd->base.port = PORT_TP;\n \t\tbreak;\n \tcase ixgbe_phy_qt:\n-\t\tecmd->supported |= SUPPORTED_FIBRE;\n-\t\tecmd->advertising |= ADVERTISED_FIBRE;\n-\t\tecmd->port = PORT_FIBRE;\n+\t\tethtool_link_ksettings_add_link_mode(cmd, supported, FIBRE);\n+\t\tethtool_link_ksettings_add_link_mode(cmd, advertising, FIBRE);\n+\t\tcmd->base.port = PORT_FIBRE;\n \t\tbreak;\n \tcase ixgbe_phy_nl:\n \tcase ixgbe_phy_sfp_passive_tyco:\n@@ -263,9 +295,11 @@ static int ixgbe_get_settings(struct net_device *netdev,\n \t\tcase ixgbe_sfp_type_da_cu:\n \t\tcase ixgbe_sfp_type_da_cu_core0:\n \t\tcase ixgbe_sfp_type_da_cu_core1:\n-\t\t\tecmd->supported |= SUPPORTED_FIBRE;\n-\t\t\tecmd->advertising |= ADVERTISED_FIBRE;\n-\t\t\tecmd->port = PORT_DA;\n+\t\t\tethtool_link_ksettings_add_link_mode(cmd, supported,\n+\t\t\t\t\t\t\t     FIBRE);\n+\t\t\tethtool_link_ksettings_add_link_mode(cmd, advertising,\n+\t\t\t\t\t\t\t     FIBRE);\n+\t\t\tcmd->base.port = PORT_DA;\n \t\t\tbreak;\n \t\tcase ixgbe_sfp_type_sr:\n \t\tcase ixgbe_sfp_type_lr:\n@@ -275,91 +309,103 @@ static int ixgbe_get_settings(struct net_device *netdev,\n \t\tcase ixgbe_sfp_type_1g_sx_core1:\n \t\tcase ixgbe_sfp_type_1g_lx_core0:\n \t\tcase ixgbe_sfp_type_1g_lx_core1:\n-\t\t\tecmd->supported |= SUPPORTED_FIBRE;\n-\t\t\tecmd->advertising |= ADVERTISED_FIBRE;\n-\t\t\tecmd->port = PORT_FIBRE;\n+\t\t\tethtool_link_ksettings_add_link_mode(cmd, supported,\n+\t\t\t\t\t\t\t     FIBRE);\n+\t\t\tethtool_link_ksettings_add_link_mode(cmd, advertising,\n+\t\t\t\t\t\t\t     FIBRE);\n+\t\t\tcmd->base.port = PORT_FIBRE;\n \t\t\tbreak;\n \t\tcase ixgbe_sfp_type_not_present:\n-\t\t\tecmd->supported |= SUPPORTED_FIBRE;\n-\t\t\tecmd->advertising |= ADVERTISED_FIBRE;\n-\t\t\tecmd->port = PORT_NONE;\n+\t\t\tethtool_link_ksettings_add_link_mode(cmd, supported,\n+\t\t\t\t\t\t\t     FIBRE);\n+\t\t\tethtool_link_ksettings_add_link_mode(cmd, advertising,\n+\t\t\t\t\t\t\t     FIBRE);\n+\t\t\tcmd->base.port = PORT_NONE;\n \t\t\tbreak;\n \t\tcase ixgbe_sfp_type_1g_cu_core0:\n \t\tcase ixgbe_sfp_type_1g_cu_core1:\n-\t\t\tecmd->supported |= SUPPORTED_TP;\n-\t\t\tecmd->advertising |= ADVERTISED_TP;\n-\t\t\tecmd->port = PORT_TP;\n+\t\t\tethtool_link_ksettings_add_link_mode(cmd, supported,\n+\t\t\t\t\t\t\t     TP);\n+\t\t\tethtool_link_ksettings_add_link_mode(cmd, advertising,\n+\t\t\t\t\t\t\t     TP);\n+\t\t\tcmd->base.port = PORT_TP;\n \t\t\tbreak;\n \t\tcase ixgbe_sfp_type_unknown:\n \t\tdefault:\n-\t\t\tecmd->supported |= SUPPORTED_FIBRE;\n-\t\t\tecmd->advertising |= ADVERTISED_FIBRE;\n-\t\t\tecmd->port = PORT_OTHER;\n+\t\t\tethtool_link_ksettings_add_link_mode(cmd, supported,\n+\t\t\t\t\t\t\t     FIBRE);\n+\t\t\tethtool_link_ksettings_add_link_mode(cmd, advertising,\n+\t\t\t\t\t\t\t     FIBRE);\n+\t\t\tcmd->base.port = PORT_OTHER;\n \t\t\tbreak;\n \t\t}\n \t\tbreak;\n \tcase ixgbe_phy_xaui:\n-\t\tecmd->supported |= SUPPORTED_FIBRE;\n-\t\tecmd->advertising |= ADVERTISED_FIBRE;\n-\t\tecmd->port = PORT_NONE;\n+\t\tethtool_link_ksettings_add_link_mode(cmd, supported, FIBRE);\n+\t\tethtool_link_ksettings_add_link_mode(cmd, advertising, FIBRE);\n+\t\tcmd->base.port = PORT_NONE;\n \t\tbreak;\n \tcase ixgbe_phy_unknown:\n \tcase ixgbe_phy_generic:\n \tcase ixgbe_phy_sfp_unsupported:\n \tdefault:\n-\t\tecmd->supported |= SUPPORTED_FIBRE;\n-\t\tecmd->advertising |= ADVERTISED_FIBRE;\n-\t\tecmd->port = PORT_OTHER;\n+\t\tethtool_link_ksettings_add_link_mode(cmd, supported, FIBRE);\n+\t\tethtool_link_ksettings_add_link_mode(cmd, advertising, FIBRE);\n+\t\tcmd->base.port = PORT_OTHER;\n \t\tbreak;\n \t}\n \n \t/* Indicate pause support */\n-\tecmd->supported |= SUPPORTED_Pause;\n+\tethtool_link_ksettings_add_link_mode(cmd, supported, Pause);\n \n \tswitch (hw->fc.requested_mode) {\n \tcase ixgbe_fc_full:\n-\t\tecmd->advertising |= ADVERTISED_Pause;\n+\t\tethtool_link_ksettings_add_link_mode(cmd, advertising, Pause);\n \t\tbreak;\n \tcase ixgbe_fc_rx_pause:\n-\t\tecmd->advertising |= ADVERTISED_Pause |\n-\t\t\t\t     ADVERTISED_Asym_Pause;\n+\t\tethtool_link_ksettings_add_link_mode(cmd, advertising, Pause);\n+\t\tethtool_link_ksettings_add_link_mode(cmd, advertising,\n+\t\t\t\t\t\t     Asym_Pause);\n \t\tbreak;\n \tcase ixgbe_fc_tx_pause:\n-\t\tecmd->advertising |= ADVERTISED_Asym_Pause;\n+\t\tethtool_link_ksettings_add_link_mode(cmd, advertising,\n+\t\t\t\t\t\t     Asym_Pause);\n \t\tbreak;\n \tdefault:\n-\t\tecmd->advertising &= ~(ADVERTISED_Pause |\n-\t\t\t\t       ADVERTISED_Asym_Pause);\n+\t\tethtool_link_ksettings_remove_link_mode(cmd, advertising,\n+\t\t\t\t\t\t\tPause);\n+\t\tethtool_link_ksettings_remove_link_mode(cmd, advertising,\n+\t\t\t\t\t\t\tAsym_Pause);\n \t}\n \n \tif (netif_carrier_ok(netdev)) {\n \t\tswitch (adapter->link_speed) {\n \t\tcase IXGBE_LINK_SPEED_10GB_FULL:\n-\t\t\tethtool_cmd_speed_set(ecmd, SPEED_10000);\n+\t\t\tcmd->base.speed = SPEED_10000;\n \t\t\tbreak;\n \t\tcase IXGBE_LINK_SPEED_2_5GB_FULL:\n-\t\t\tethtool_cmd_speed_set(ecmd, SPEED_2500);\n+\t\t\tcmd->base.speed = SPEED_2500;\n \t\t\tbreak;\n \t\tcase IXGBE_LINK_SPEED_1GB_FULL:\n-\t\t\tethtool_cmd_speed_set(ecmd, SPEED_1000);\n+\t\t\tcmd->base.speed = SPEED_1000;\n \t\t\tbreak;\n \t\tcase IXGBE_LINK_SPEED_100_FULL:\n-\t\t\tethtool_cmd_speed_set(ecmd, SPEED_100);\n+\t\t\tcmd->base.speed = SPEED_100;\n \t\t\tbreak;\n \t\tdefault:\n \t\t\tbreak;\n \t\t}\n-\t\tecmd->duplex = DUPLEX_FULL;\n+\t\tcmd->base.duplex = DUPLEX_FULL;\n \t} else {\n-\t\tethtool_cmd_speed_set(ecmd, SPEED_UNKNOWN);\n-\t\tecmd->duplex = DUPLEX_UNKNOWN;\n+\t\tcmd->base.speed = SPEED_UNKNOWN;\n+\t\tcmd->base.duplex = DUPLEX_UNKNOWN;\n \t}\n \n \treturn 0;\n }\n \n-static int ixgbe_set_settings(struct net_device *netdev,\n-\t\t\t      struct ethtool_cmd *ecmd)\n+static int ixgbe_set_link_ksettings(struct net_device *netdev,\n+\t\t\t\t    const struct ethtool_link_ksettings *cmd)\n {\n \tstruct ixgbe_adapter *adapter = netdev_priv(netdev);\n \tstruct ixgbe_hw *hw = &adapter->hw;\n@@ -372,30 +418,34 @@ static int ixgbe_set_settings(struct net_device *netdev,\n \t\t * this function does not support duplex forcing, but can\n \t\t * limit the advertising of the adapter to the specified speed\n \t\t */\n-\t\tif (ecmd->advertising & ~ecmd->supported)\n+\t\tif (!ethtool_link_ksettings_subset_link_mode(cmd, advertising,\n+\t\t\t\t\t\t\t     supported))\n \t\t\treturn -EINVAL;\n \n \t\t/* only allow one speed at a time if no autoneg */\n-\t\tif (!ecmd->autoneg && hw->phy.multispeed_fiber) {\n-\t\t\tif (ecmd->advertising ==\n-\t\t\t    (ADVERTISED_10000baseT_Full |\n-\t\t\t     ADVERTISED_1000baseT_Full))\n+\t\tif (!cmd->base.autoneg && hw->phy.multispeed_fiber)\n+\t\t\tif (ethtool_link_ksettings_test_link_mode(cmd,\n+\t\t\t\t\t\tadvertising, 10000baseT_Full) ||\n+\t\t\t    ethtool_link_ksettings_test_link_mode(cmd,\n+\t\t\t\t\t\tadvertising, 1000baseT_Full))\n \t\t\t\treturn -EINVAL;\n-\t\t}\n \n \t\told = hw->phy.autoneg_advertised;\n \t\tadvertised = 0;\n-\t\tif (ecmd->advertising & ADVERTISED_10000baseT_Full)\n+\t\tif (ethtool_link_ksettings_test_link_mode(cmd,\n+\t\t\t\t\tadvertising, 10000baseT_Full))\n \t\t\tadvertised |= IXGBE_LINK_SPEED_10GB_FULL;\n-\n-\t\tif (ecmd->advertising & ADVERTISED_1000baseT_Full)\n+\t\tif (ethtool_link_ksettings_test_link_mode(cmd,\n+\t\t\t\t\t\t\t  advertising,\n+\t\t\t\t\t\t\t  1000baseT_Full))\n \t\t\tadvertised |= IXGBE_LINK_SPEED_1GB_FULL;\n-\n-\t\tif (ecmd->advertising & ADVERTISED_100baseT_Full)\n+\t\tif (ethtool_link_ksettings_test_link_mode(cmd,\n+\t\t\t\t\t\t\t  advertising,\n+\t\t\t\t\t\t\t  100baseT_Full))\n \t\t\tadvertised |= IXGBE_LINK_SPEED_100_FULL;\n-\n \t\tif (old == advertised)\n \t\t\treturn err;\n+\n \t\t/* this sets the link speed and restarts auto-neg */\n \t\twhile (test_and_set_bit(__IXGBE_IN_SFP_INIT, &adapter->state))\n \t\t\tusleep_range(1000, 2000);\n@@ -409,10 +459,11 @@ static int ixgbe_set_settings(struct net_device *netdev,\n \t\tclear_bit(__IXGBE_IN_SFP_INIT, &adapter->state);\n \t} else {\n \t\t/* in this case we currently only support 10Gb/FULL */\n-\t\tu32 speed = ethtool_cmd_speed(ecmd);\n-\t\tif ((ecmd->autoneg == AUTONEG_ENABLE) ||\n-\t\t    (ecmd->advertising != ADVERTISED_10000baseT_Full) ||\n-\t\t    (speed + ecmd->duplex != SPEED_10000 + DUPLEX_FULL))\n+\t\tu32 speed = cmd->base.speed;\n+\t\tif ((cmd->base.autoneg == AUTONEG_ENABLE) ||\n+\t\t    (!ethtool_link_ksettings_test_link_mode(cmd, advertising,\n+\t\t\t\t\t\t\t    10000baseT_Full)) ||\n+\t\t    (speed + cmd->base.duplex != SPEED_10000 + DUPLEX_FULL))\n \t\t\treturn -EINVAL;\n \t}\n \n@@ -3238,8 +3289,8 @@ static int ixgbe_get_module_eeprom(struct net_device *dev,\n }\n \n static const struct ethtool_ops ixgbe_ethtool_ops = {\n-\t.get_settings           = ixgbe_get_settings,\n-\t.set_settings           = ixgbe_set_settings,\n+\t.get_link_ksettings     = ixgbe_get_link_ksettings,\n+\t.set_link_ksettings     = ixgbe_set_link_ksettings,\n \t.get_drvinfo            = ixgbe_get_drvinfo,\n \t.get_regs_len           = ixgbe_get_regs_len,\n \t.get_regs               = ixgbe_get_regs,\ndiff --git a/include/linux/ethtool.h b/include/linux/ethtool.h\nindex 9ded8c6..94434a6 100644\n--- a/include/linux/ethtool.h\n+++ b/include/linux/ethtool.h\n@@ -124,6 +124,29 @@ struct ethtool_link_ksettings {\n \tbitmap_zero((ptr)->link_modes.name, __ETHTOOL_LINK_MODE_MASK_NBITS)\n \n /**\n+ * ethtool_link_ksettings_subset_link_mode - check if link mode mask\n+ * modes are a subset of one another\n+ *   @ptr : pointer to struct ethtool_link_ksettings\n+ *   @src1 : one of supported/advertising/lp_advertising\n+ *   @src2 : one of supported/advertising/lp_advertising\n+ *\n+ * Returns true/false\n+ */\n+#define ethtool_link_ksettings_subset_link_mode(ptr, src1, src2)\t\\\n+\tbitmap_subset((ptr)->link_modes.src1, (ptr)->link_modes.src2,\t\\\n+\t__ETHTOOL_LINK_MODE_MASK_NBITS)\n+\n+/**\n+ * ethtool_link_ksettings_copy_link_mode - mask ksettings mask\n+ *   @ptr : pointer to struct ethtool_link_ksettings\n+ *   @dst : one of supported/advertising/lp_advertising\n+ *   @src : one of supported/advertising/lp_advertising\n+ */\n+#define ethtool_link_ksettings_copy_link_mode(ptr, dst, src)\t\\\n+\tbitmap_copy((ptr)->link_modes.dst, (ptr)->link_modes.src,\t\\\n+\t __ETHTOOL_LINK_MODE_MASK_NBITS)\t\t\t\t\\\n+\n+/**\n  * ethtool_link_ksettings_add_link_mode - set bit in link_ksettings\n  * link mode mask\n  *   @ptr : pointer to struct ethtool_link_ksettings\n@@ -135,6 +158,17 @@ struct ethtool_link_ksettings {\n \t__set_bit(ETHTOOL_LINK_MODE_ ## mode ## _BIT, (ptr)->link_modes.name)\n \n /**\n+ * ethtool_link_ksettings_remove_link_mode - set bit in link_ksettings\n+ * link mode mask\n+ *   @ptr : pointer to struct ethtool_link_ksettings\n+ *   @name : one of supported/advertising/lp_advertising\n+ *   @mode : one of the ETHTOOL_LINK_MODE_*_BIT\n+ * (not atomic, no bound checking)\n+ */\n+#define ethtool_link_ksettings_remove_link_mode(ptr, name, mode)\t\\\n+\t__clear_bit(ETHTOOL_LINK_MODE_ ## mode ## _BIT, (ptr)->link_modes.name)\n+\n+/**\n  * ethtool_link_ksettings_test_link_mode - test bit in ksettings link mode mask\n  *   @ptr : pointer to struct ethtool_link_ksettings\n  *   @name : one of supported/advertising/lp_advertising\n",
    "prefixes": []
}