From patchwork Wed May 23 16:39:13 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Lendacky X-Patchwork-Id: 919189 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=amd.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=amdcloud.onmicrosoft.com header.i=@amdcloud.onmicrosoft.com header.b="4FblTW3Z"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40rdY72K43z9s15 for ; Thu, 24 May 2018 02:40:27 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933725AbeEWQjZ (ORCPT ); Wed, 23 May 2018 12:39:25 -0400 Received: from mail-co1nam03on0051.outbound.protection.outlook.com ([104.47.40.51]:28617 "EHLO NAM03-CO1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S933609AbeEWQjT (ORCPT ); Wed, 23 May 2018 12:39:19 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amdcloud.onmicrosoft.com; s=selector1-amd-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=2jWJv357+DuVbgoMpWg9U9SSp053egcKuiBVdUEAL6o=; b=4FblTW3ZoASAnre6RQ/u1/lQsxqvhmya2bDyJ9UShhFKLDy3UNY6f09phWrHFqiVwlVypnhfe1bOHehv5GG0vLEgcvtW+MgL26E6JK3PKElwk52odEfywtJ+puoPKmmHP3Wf/WZ2nas2x+uYsPmU7u0HyXgIX6ZEKq+kgGrrr90= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Thomas.Lendacky@amd.com; Received: from tlendack-t1.amdoffice.net (165.204.77.1) by SN1PR12MB0174.namprd12.prod.outlook.com (2a01:111:e400:5144::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.776.16; Wed, 23 May 2018 16:39:16 +0000 From: Tom Lendacky Subject: [PATCH net-next v2 08/12] amd-xgbe: Add ethtool show/set channels support To: netdev@vger.kernel.org Cc: David Miller Date: Wed, 23 May 2018 11:39:13 -0500 Message-ID: <20180523163913.31625.63415.stgit@tlendack-t1.amdoffice.net> In-Reply-To: <20180523163802.31625.76572.stgit@tlendack-t1.amdoffice.net> References: <20180523163802.31625.76572.stgit@tlendack-t1.amdoffice.net> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-Originating-IP: [165.204.77.1] X-ClientProxiedBy: SN4PR0501CA0087.namprd05.prod.outlook.com (2603:10b6:803:22::25) To SN1PR12MB0174.namprd12.prod.outlook.com (2a01:111:e400:5144::21) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(5600026)(48565401081)(4534165)(4627221)(201703031133081)(201702281549075)(2017052603328)(7153060)(7193020); SRVR:SN1PR12MB0174; X-Microsoft-Exchange-Diagnostics: 1; SN1PR12MB0174; 3:A8mFhmRZQsNu55KbZcLZgyH5RCjX+y6DaWD39oqQm6r6pZr+6UBieUCRKcVbGpnmnjMV+hQUS+i4NSFIS4HK5i+VTmYoopapX/QRQC53Jq91o8UeXKWnrd9ORXqhPfV2y/dKkZF/iokHuFf4sCrQ2fuZB6YrKdUWIDZp7YAUy0T9ZdP4XdhF00YzhckRuv/BodmtGNBL/jxI4cn1jPePNgM605l7LGEorCKjQoQ7cCpnH9JuS/ISDAzP0H62V/pm; 25:a5h5Y0MJ1E1H2+JGhGy/PbvSXv9BnufXZ9hAHB8qByDsgTqQRNKTcHmo3AN/khVatmgFM0KdjsAhN25CRwfuoDiO/4DmXeGoiTStRqvOy8/LwtTfK5/RNOE1ALIsFqywgFw7LPAI9JnF1X0rkAl2jjWHMaOliCEcmVhTSx4qGJd86VQLA2UFWrJOJoHC24IiOKjZQUfTobZ8m0/wK7zFTgqvIBIv+hmWmmMALTNNPmpuku2YEskd/cvuCD9l6HQBUph2oR0MNOI9aZh5QRyJJNby2+9L+U4yo5mQKo76udZfUPHsahGyQcjBQgpaTRzROAqkX5EoDvEwYKu81tHWjw==; 31:FVc68L6/OywF5UrdE+wEzyTPckK6qnU5gyHdpl6r+OVi0ZH8qtMH+pj15g6g5Rc1/VY/SiRcV7u4xWbdhdmC/Eg9UVhNv9AGduO0OQlG5cju/CmZXMbWosY+Db1SbH8TPQm6MxHkoMzEcAcc/vUtk7/7FrHtETP3tKXs85jJo0KK1cchxaY5/3l7C1xx10KgKnw7pT/l3sKaAwk00WhGRMsncHO2XWcn2H9w4qR7Sek= X-MS-TrafficTypeDiagnostic: SN1PR12MB0174: X-Microsoft-Exchange-Diagnostics: 1; SN1PR12MB0174; 20:1iZHmUbvtz8Q6qrRJj6OmBuKSoXVDhskOZWVI/0G8QFAT74aB8rkInLHVpUkRx5BgOliRtH3M4A7VqOnfu2lH8J/nsdV6RyhxfUCwXEa/rEBxhvcw4/2bcz02DGNxjJJZ3RPw0gCyqV5ORrWmJiGQor2d9BRn8IUvFQaps0ZbeJ4YGQtGO1tXO0jIRgzutPyxe/e7lAVrFd7uPlGaNECweQx1js3KO67AN6WhpxwmlfRjvCLgvTUNHzKgf8wHLTIgndxNM882I9At/6NA3gHLBZyHIBpoxHT9/PryXjq7wR7ekdnUOAnNE+1hayrN8d5Ips5lSwYANtMmZzFr0PkSgMsXOUFEzTh4atXHFSKBEiUCelVSjLI7Ob3FcDFYcaN5Hp/ynEZmM1iRYCxj5N589pp/vGvRmgLKoRyfVsqwxfrEHRRPfMxne6nijumapJZ6Qm4R7q/KRqMYPU8yaOZcS1obryfl3nXYsycZLBLFvA+BbhTdBCJLoQg2H3/bRBd; 4:MgVdzRccI2ns3yFl3cXDhNEsyyPgIz3ZNuBOxp3eGdZp4ufQ7f3E/+8yn7K5k7yKhG0ZhEYg9zaSrdl5itGiGD5iiEgCoBgzXESsjq0eTSmqfg/5YuZA2FmZBVxECex8giJdDvjFvvR5XW9u/3WCkOwxZjB2KuZpFr0PyyS2QbxY2IwCcncDtGvgw5Prw7fqdfvjB5xKoc5LVLOB9EuK2U3iOlWgvH572RqhmuXnkPX/D7OsL7DBRO9h8fMliZR9YteE00ZAFhcddYgehIIbSTHU65O8v3vNUCr3Q4smXU0NOUlIkLO1bHBHX1KKyTVKMdokwqLE77upVkFZp3uQkSuqAKOtEAsmZoaCJFBJpxo= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(209352067349851)(767451399110); X-MS-Exchange-SenderADCheck: 1 X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(8211001083)(6040522)(2401047)(5005006)(8121501046)(3002001)(3231254)(944501410)(52105095)(93006095)(93001095)(10201501046)(6055026)(149027)(150027)(6041310)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123560045)(20161123564045)(20161123562045)(20161123558120)(6072148)(201708071742011)(7699016); SRVR:SN1PR12MB0174; BCL:0; PCL:0; RULEID:; SRVR:SN1PR12MB0174; X-Forefront-PRVS: 06818431B9 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(366004)(39860400002)(39380400002)(346002)(376002)(396003)(189003)(199004)(446003)(86362001)(9686003)(66066001)(50466002)(76176011)(4326008)(6116002)(52116002)(7696005)(23676004)(105586002)(53936002)(2351001)(97746001)(316002)(2361001)(3846002)(25786009)(2486003)(81156014)(8676002)(68736007)(58126008)(1076002)(103116003)(55016002)(6506007)(486006)(386003)(6916009)(69596002)(476003)(8936002)(6666003)(72206003)(81166006)(7736002)(5660300001)(11346002)(478600001)(575784001)(2906002)(53416004)(97736004)(47776003)(106356001)(230700001)(59450400001)(16526019)(956004)(305945005)(186003)(26005); DIR:OUT; SFP:1101; SCL:1; SRVR:SN1PR12MB0174; H:tlendack-t1.amdoffice.net; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; MX:1; A:1; Received-SPF: None (protection.outlook.com: amd.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?utf-8?q?1=3BSN1PR12MB0174=3B23=3ArGFG?= =?utf-8?q?112uA4DGWHtmcQuEhqkHCtEVCMLaPPrW0JWru6hRq2iXpJEP78vaGoUY?= =?utf-8?q?SgAA+xqC2szAzsemgOQdU7Y7/ysdM+5TywCyjQHxBRewjVYZ6tjE6gtB?= =?utf-8?q?Lybr6YtHLi+uXnzC16gCaLm0U86WzrVs0GeD7GdJsbotwMiyFNylQnnw?= =?utf-8?q?At823DT0oVNSKg3Ekoq6EPh6p4DhwLJvtd9PpJfGMF4S9DxiJylickyf?= =?utf-8?q?99h7M+trXILblqd9KG/UfTXTwlCrlmk3lYOIJBnNCm/P8BYlQcKYmqWi?= =?utf-8?q?IXJy8HAgmFMm/SHOwxbCvLoF3fJZ49sd5kRE9rUcJoJYC5eo7ioiljFK?= =?utf-8?q?ZbIODt+b1lQNPX/JaMV9E+G/2MkJgAFpDkydUqvihezQ94AFwyg0RWIb?= =?utf-8?q?FtjVed8CGVovNEfR5p6w6XaKqAFblnAGP5qGonN5RyCctBfgmbk091Rl?= =?utf-8?q?1DHsKUgJO7vdRCA+Zr4u7hOhLXu2PXvJd2inpJvIE3MRaHjLUeZ6CFZ6?= =?utf-8?q?zWAmkGR8SwNBOrnvCpex9i39no6HwOWqnyYSdeYi+tvRbbZ4yMN4cYh1?= =?utf-8?q?pVvDg5e146Orzd/KO6kMydvloltinAza16Li3+CcmPKsVT62Ui7dyprq?= =?utf-8?q?U9LIRrV5Qg5k07tcPi1503/aJnjMH0kyx0BRHCTfejwyzEVeFJsdDZnP?= =?utf-8?q?/MVQK5yTBGPJton45m8Zw9H0yRXVGpXo1RaZpbh9yo36gRyNNzQq3J6m?= =?utf-8?q?yGKCv8YmJn+EEb3K1Cf5dTE5ZmXDl7YciMKq38/7HWKoJF9zVpennUqw?= =?utf-8?q?jMmbS45FVdu1TJaeFEOadUYf4Jt5YBvkF9Ve7KfqsrSCe7A+oDO8RPq4?= =?utf-8?q?0q29M8h8Nr+ntW/sx1hWsUaYWj9GT7O8L8XH/oqax1+1vcjtYfxDyDsE?= =?utf-8?q?XtuKrQCWTFjUoFBQr9MO/81243Sr0+Ly0OiDLcWGMPqQuMbUNrGQU0gj?= =?utf-8?q?UMxEWAREysuZhRsg4JiUoH1md0VdJ8mPNzg0y+O8SoaL9dhN2/Cx8Dzc?= =?utf-8?q?tt05BppK3ZN5n15qylvIvUdKVj8Tz70TbUH3uPXrO+jrL6RDEvmCPDLD?= =?utf-8?q?Pu2dJfwe2291x9rSBo7UeEwdQQwrcHXANci4vDXo0urIirO16DOQEshC?= =?utf-8?q?syqXFODphjwMjyrhcKz41ZhbaIL1jH4L3ptYtc2U2XyWWt/d+qp6tzRo?= =?utf-8?q?BzUO2G3gQ2miX0RSimu4SWVBE+ny4ISu6NOsGZj6J940ccLnbJ+AENGB?= =?utf-8?q?M3y7grAASKtt7c2RsF5RSikxc8DjjEqKu/iw7tX/SIv2MEmChrXZ3kri?= =?utf-8?q?HiVXLpZTSaaoHqUIQ1cfn9/CNTj9vg6pHthQKcw0wkb24iM0o839Cw7/?= =?utf-8?q?0DOpxANtKm2s9PxKo0ZU7oi6Kkp6+k7gh6ZJhe0=3D?= X-Microsoft-Antispam-Message-Info: j7IL73mppBFrKCNPf811g9cdCnQMzv4ZDb/fFLH9UjTajwFpBQQIWczUCa1NTmeSbAGHAL7Tk/vK0ZbOPYVzcqFb81XCDjb7MiW6lrCt1KjkMBca8klUH6VFb6yvKdzJCMHQgLkT6s55L22b1wGF6hjbFxiAshb3iOf+QKm3UFr/2pGzCTap2t6dI85vhq20 X-Microsoft-Exchange-Diagnostics: 1; SN1PR12MB0174; 6:uOoSbUeGWp6P/8NfesTgAKSLO8SezQn6BYzhmS0gpgqhU7k6zveQ6/QNHh65EfVWbr5ObijYo4GzRxjzT77gWQ2eNcN2cuw/3bTnzEe9z0fL2ryAgVo97mSIePZhwi6mkpbbcg4AUMr9ybyVVNG95On2zTFtlPqfeHlEdbzY+2LQrG2JVRbOxFgvGVQoyzqfKdgkYbcgrOmj2gwQKYOu5Ko/E8NYfxFKV7eAWXFMPyWYdNDD95OIv6HWj8YiYXnKxyMW5AmID5YQGyDJKtCs+18votOzER+hnsDFhcjFfBpkybS8E1cXZh5CxEF+z97g5ySa9olvy0472NMyEx8LuXDT3ETnw2D/Qw4TIG1k/PvDsuvAHRMN4GO/QnpaJjdFTHUbXaPJSovgFOAB+fpdYZ/tG9XMWaGcuVME+76AOLai/t1XT9bbsxvyHmo7GOBTUyXJA20bGRzN0+u2i1bx3g==; 5:2pmf9lAW/qpiYe9vCCpvZqFgS2EqZg8A4K4deIVg7NOXJDFzo/RQ+2mXBdWIVM6MTA7GlvfsGamH4rBDXyjHdoPuysYFvfxeKOrlSYwY1IPH7c7D5lZVSPmdMVkpgQQE65HFoICSA4h4BFYfskSnWDgzl46HyaYP8p2IhvpDCe8=; 24:32L7hGb2Z3XiBHR47txAe5gLkjYqTgGvDDT+5gVBc6jHiItj0jyIYm++zT76q3KeXTgSR4KNWni1hAu1g9KawSXoB65tVq8SB+nyzunW6to= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; SN1PR12MB0174; 7:fazFUmPeHFpWHgl/bwGXSj0C36acvj+JHIbb/7iXtbeCzvgYTCfyEEGPKQjWYivjEQKQ+PoyCMJMwyeChGBRB9Ug0Wx/nBEk0oaDhQeq8fwGVhSILIUUfPBY9nCnvMqbFjWxK21lqPO1BybSFa7DMccU2dEgSS6VEibd2nBSr92HPDspCNfQ4yaNQMEFPrI79FvaqBWlGYXX9iyVldPXBV4tEXYut22cYbe6gW+EMCQsj1Q3bb4pIa0URkiFxMZ0; 20:hRWtnL6PbwYhE4OS3mKLLgaKZ2BN2gTmXIR0svOiQH2VOF0XR7IuCAjEjh3sAnqfVFd60llLZ9Y52OiB7tS8ZvirM2O6N1kjJl4yo2u/RJM9zyYkL/SiAgkMbfoeXNxXWurn16R1L29AHNB07RsXjavLHAUxP1SCXT7qLPluHeG1up//DXd7eXsBgIszvAlw5hJvOvPf0UKxEBqN3c6My3aiKS6wf+sjm+85O/e/U+t++/OR95KdFiSvgDnlYAqU X-MS-Office365-Filtering-Correlation-Id: 870c5095-b333-40d7-340d-08d5c0cbb961 X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 May 2018 16:39:16.2123 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 870c5095-b333-40d7-340d-08d5c0cbb961 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN1PR12MB0174 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Add ethtool support to show and set the device channel configuration. Changing the channel configuration will result in a device restart. Signed-off-by: Tom Lendacky --- drivers/net/ethernet/amd/xgbe/xgbe-drv.c | 25 +++++ drivers/net/ethernet/amd/xgbe/xgbe-ethtool.c | 134 ++++++++++++++++++++++++++ drivers/net/ethernet/amd/xgbe/xgbe.h | 4 + 3 files changed, 163 insertions(+) diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-drv.c b/drivers/net/ethernet/amd/xgbe/xgbe-drv.c index 397e3a0..24f1053 100644 --- a/drivers/net/ethernet/amd/xgbe/xgbe-drv.c +++ b/drivers/net/ethernet/amd/xgbe/xgbe-drv.c @@ -1329,6 +1329,17 @@ static int xgbe_alloc_memory(struct xgbe_prv_data *pdata) struct net_device *netdev = pdata->netdev; int ret; + if (pdata->new_tx_ring_count) { + pdata->tx_ring_count = pdata->new_tx_ring_count; + pdata->tx_q_count = pdata->tx_ring_count; + pdata->new_tx_ring_count = 0; + } + + if (pdata->new_rx_ring_count) { + pdata->rx_ring_count = pdata->new_rx_ring_count; + pdata->new_rx_ring_count = 0; + } + /* Calculate the Rx buffer size before allocating rings */ pdata->rx_buf_size = xgbe_calc_rx_buf_size(netdev, netdev->mtu); @@ -1482,6 +1493,20 @@ static void xgbe_stopdev(struct work_struct *work) netdev_alert(pdata->netdev, "device stopped\n"); } +void xgbe_full_restart_dev(struct xgbe_prv_data *pdata) +{ + /* If not running, "restart" will happen on open */ + if (!netif_running(pdata->netdev)) + return; + + xgbe_stop(pdata); + + xgbe_free_memory(pdata); + xgbe_alloc_memory(pdata); + + xgbe_start(pdata); +} + void xgbe_restart_dev(struct xgbe_prv_data *pdata) { /* If not running, "restart" will happen on open */ diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-ethtool.c b/drivers/net/ethernet/amd/xgbe/xgbe-ethtool.c index d12f982..a880f10 100644 --- a/drivers/net/ethernet/amd/xgbe/xgbe-ethtool.c +++ b/drivers/net/ethernet/amd/xgbe/xgbe-ethtool.c @@ -705,6 +705,138 @@ static int xgbe_set_ringparam(struct net_device *netdev, return 0; } +static void xgbe_get_channels(struct net_device *netdev, + struct ethtool_channels *channels) +{ + struct xgbe_prv_data *pdata = netdev_priv(netdev); + unsigned int rx, tx, combined; + + /* Calculate maximums allowed: + * - Take into account the number of available IRQs + * - Do not take into account the number of online CPUs so that + * the user can over-subscribe if desired + * - Tx is additionally limited by the number of hardware queues + */ + rx = min(pdata->hw_feat.rx_ch_cnt, pdata->rx_max_channel_count); + rx = min(rx, pdata->channel_irq_count); + tx = min(pdata->hw_feat.tx_ch_cnt, pdata->tx_max_channel_count); + tx = min(tx, pdata->channel_irq_count); + tx = min(tx, pdata->tx_max_q_count); + + combined = min(rx, tx); + + channels->max_combined = combined; + channels->max_rx = rx ? rx - 1 : 0; + channels->max_tx = tx ? tx - 1 : 0; + + /* Get current settings based on device state */ + rx = pdata->new_rx_ring_count ? : pdata->rx_ring_count; + tx = pdata->new_tx_ring_count ? : pdata->tx_ring_count; + + combined = min(rx, tx); + rx -= combined; + tx -= combined; + + channels->combined_count = combined; + channels->rx_count = rx; + channels->tx_count = tx; +} + +static void xgbe_print_set_channels_input(struct net_device *netdev, + struct ethtool_channels *channels) +{ + netdev_err(netdev, "channel inputs: combined=%u, rx-only=%u, tx-only=%u\n", + channels->combined_count, channels->rx_count, + channels->tx_count); +} + +static int xgbe_set_channels(struct net_device *netdev, + struct ethtool_channels *channels) +{ + struct xgbe_prv_data *pdata = netdev_priv(netdev); + unsigned int rx, rx_curr, tx, tx_curr, combined; + + /* Calculate maximums allowed: + * - Take into account the number of available IRQs + * - Do not take into account the number of online CPUs so that + * the user can over-subscribe if desired + * - Tx is additionally limited by the number of hardware queues + */ + rx = min(pdata->hw_feat.rx_ch_cnt, pdata->rx_max_channel_count); + rx = min(rx, pdata->channel_irq_count); + tx = min(pdata->hw_feat.tx_ch_cnt, pdata->tx_max_channel_count); + tx = min(tx, pdata->tx_max_q_count); + tx = min(tx, pdata->channel_irq_count); + + combined = min(rx, tx); + + /* Should not be setting other count */ + if (channels->other_count) { + netdev_err(netdev, + "other channel count must be zero\n"); + return -EINVAL; + } + + /* Require at least one Combined (Rx and Tx) channel */ + if (!channels->combined_count) { + netdev_err(netdev, + "at least one combined Rx/Tx channel is required\n"); + xgbe_print_set_channels_input(netdev, channels); + return -EINVAL; + } + + /* Check combined channels */ + if (channels->combined_count > combined) { + netdev_err(netdev, + "combined channel count cannot exceed %u\n", + combined); + xgbe_print_set_channels_input(netdev, channels); + return -EINVAL; + } + + /* Can have some Rx-only or Tx-only channels, but not both */ + if (channels->rx_count && channels->tx_count) { + netdev_err(netdev, + "cannot specify both Rx-only and Tx-only channels\n"); + xgbe_print_set_channels_input(netdev, channels); + return -EINVAL; + } + + /* Check that we don't exceed the maximum number of channels */ + if ((channels->combined_count + channels->rx_count) > rx) { + netdev_err(netdev, + "total Rx channels (%u) requested exceeds maximum available (%u)\n", + channels->combined_count + channels->rx_count, rx); + xgbe_print_set_channels_input(netdev, channels); + return -EINVAL; + } + + if ((channels->combined_count + channels->tx_count) > tx) { + netdev_err(netdev, + "total Tx channels (%u) requested exceeds maximum available (%u)\n", + channels->combined_count + channels->tx_count, tx); + xgbe_print_set_channels_input(netdev, channels); + return -EINVAL; + } + + rx = channels->combined_count + channels->rx_count; + tx = channels->combined_count + channels->tx_count; + + rx_curr = pdata->new_rx_ring_count ? : pdata->rx_ring_count; + tx_curr = pdata->new_tx_ring_count ? : pdata->tx_ring_count; + + if ((rx == rx_curr) && (tx == tx_curr)) + goto out; + + pdata->new_rx_ring_count = rx; + pdata->new_tx_ring_count = tx; + + xgbe_full_restart_dev(pdata); + +out: + return 0; +} + static const struct ethtool_ops xgbe_ethtool_ops = { .get_drvinfo = xgbe_get_drvinfo, .get_msglevel = xgbe_get_msglevel, @@ -729,6 +861,8 @@ static int xgbe_set_ringparam(struct net_device *netdev, .get_module_eeprom = xgbe_get_module_eeprom, .get_ringparam = xgbe_get_ringparam, .set_ringparam = xgbe_set_ringparam, + .get_channels = xgbe_get_channels, + .set_channels = xgbe_set_channels, }; const struct ethtool_ops *xgbe_get_ethtool_ops(void) diff --git a/drivers/net/ethernet/amd/xgbe/xgbe.h b/drivers/net/ethernet/amd/xgbe/xgbe.h index 7dc0fac..7a412cf 100644 --- a/drivers/net/ethernet/amd/xgbe/xgbe.h +++ b/drivers/net/ethernet/amd/xgbe/xgbe.h @@ -1122,6 +1122,9 @@ struct xgbe_prv_data { unsigned int rx_ring_count; unsigned int rx_desc_count; + unsigned int new_tx_ring_count; + unsigned int new_rx_ring_count; + unsigned int tx_max_q_count; unsigned int rx_max_q_count; unsigned int tx_q_count; @@ -1336,6 +1339,7 @@ void xgbe_dump_rx_desc(struct xgbe_prv_data *, struct xgbe_ring *, void xgbe_init_rx_coalesce(struct xgbe_prv_data *); void xgbe_init_tx_coalesce(struct xgbe_prv_data *); void xgbe_restart_dev(struct xgbe_prv_data *pdata); +void xgbe_full_restart_dev(struct xgbe_prv_data *pdata); #ifdef CONFIG_DEBUG_FS void xgbe_debugfs_init(struct xgbe_prv_data *);