From patchwork Mon May 21 21:59:37 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Lendacky X-Patchwork-Id: 917896 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="5JdvbJyc"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40qXm10vdxz9s16 for ; Tue, 22 May 2018 08:01:05 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754169AbeEUV7x (ORCPT ); Mon, 21 May 2018 17:59:53 -0400 Received: from mail-cys01nam02on0044.outbound.protection.outlook.com ([104.47.37.44]:9492 "EHLO NAM02-CY1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1753951AbeEUV7r (ORCPT ); Mon, 21 May 2018 17:59:47 -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=IPcOojSlJyx2BzlMUVnZQ/OZ41krP5SdbwTAMKmNGoA=; b=5JdvbJycbpaAXWW5It7RpF3o2bAgTHA/KAhF0pPh0kdlhfiZuz6pTW7WX0KYXE3Ig8/Dbrh3cOElf909qGudHSXqKugdtgKmbYmfexsC36+450mITNIHEW/2MvI9/t0EwgIyBT5FGboJR7OryOf19Agw8bVh40PKieXRe2KORko= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Thomas.Lendacky@amd.com; Received: from tlendack-t1.amdoffice.net (165.204.77.1) by CY1PR12MB0165.namprd12.prod.outlook.com (2a01:111:e400:50f6::23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.776.11; Mon, 21 May 2018 21:59:41 +0000 From: Tom Lendacky Subject: [PATCH net-next 08/12] amd-xgbe: Add ethtool show/set channels support To: netdev@vger.kernel.org Cc: David Miller Date: Mon, 21 May 2018 16:59:37 -0500 Message-ID: <20180521215937.8135.63942.stgit@tlendack-t1.amdoffice.net> In-Reply-To: <20180521215818.8135.83100.stgit@tlendack-t1.amdoffice.net> References: <20180521215818.8135.83100.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: SN4PR0201CA0010.namprd02.prod.outlook.com (2603:10b6:803:2b::20) To CY1PR12MB0165.namprd12.prod.outlook.com (2a01:111:e400:50f6::23) 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:CY1PR12MB0165; X-Microsoft-Exchange-Diagnostics: 1; CY1PR12MB0165; 3:qr1kC0XhpoZfsCztlYkew3o4yWPZDXrJWFEm/cNwu3TZQZZIweINPZvZjvBr8waKoYp0M3izeaqzffg+DzjwBv4SGOXDO5lHmBscPw2wpLiFHoH05W8r/TUjB9+R7QeAkoqOGEw/fAhxIny/fqNJ1WUaUlbu6XQViQESRC57YAbe70JbqM5VcHcEf+ZFdI82F2nXRH9sR1Xmu9l7ArCPOIoFiZ5iR3wLbt49EQfQrvTRiR0P0AsH42+HceAlzsn7; 25:bl9IGRgcbHrT6Kizi3CrF/6/GMtx4h1c+oc5ZaYDGokuYqpNfX/WJ8s0swWB2XNPvP78q4y8rHKSxGpAmo3BNQRzaQb+Sz3WtDybD+AHFXlo114btHKn3wghyhoZ/951ZK7I5AknR9JqAZ6O2sBjENSSxNU59SXg2ef4cVHh5dJX5S2Ul9VjPew3oHort6KhJ7ACF1J/gATTNSb9N5Den/aEM13hlUO7HuFJ+hK5OmA4GCLl+j7JAQuZIIdtlfS+RIQHy8UTbAh68DbIz8V/z4kycErwfyL+e8r81sk8vait9OrHMxYUg1vIXCg/lLkIbzMIxsoBsYjcUQGGuynqyQ==; 31:wRdy3iGdiLEoOTman9gEN8aYUJCxiAuKAjV4QU6X2ol+edxRXUL7Bdh7UovtIoR6/NIjtsUAZpkG+nDW9PeUBrwPm4V7LQRLOOJXAa6MFaVzQb2sVX4ZlX14WOfAvybHwAdFFnDW5Ixbo4HM9eDGx7IWSdQxKqHb5T7fXjEw++xrXJJ/GEc5oFMBzM+yfW5gK9F5NyfoT0QEGbDHsUZu411hfLwe58un3ohoOUCMPZg= X-MS-TrafficTypeDiagnostic: CY1PR12MB0165: X-Microsoft-Exchange-Diagnostics: 1; CY1PR12MB0165; 20:a8fXGz/STEIxUYbpmsiKeoCq0JIfbkWafy/2Prk4rEBtJFOt9aqzt5/EQ0BiNirCV5KN+QG1GMFDHGzo37/urry6r4DiJ2jqoNqS8RLPN+94uZS5VexdzmoaYat9Ljg2BiaXqiVQ4mZZtWRsuVt7JZ4xidPq338QJ36A01Z5vYSIOsZ9W9ynPX0bsp1YsjB4Atwp31A62fwbIY2RAVdSPAL2jDeTw/DFqeMPoNmfXqwCFE6tWp/83tzrMuGbjw9uY0x2F1hr6nu6Y123nQaerc4jjS8u2ls3KDmWLw7LsIy8gLNwz1A2yddnKldm5yLGcWReQ5YU/xNW0S+9+Dbpcg3VLzYN9t8RaAD+yAFTJRO5zNCCxBNS/lNvnYzNChPWDQHmY39HboNxNVpzfOd0yWehWJrKEdP7kGKKzat2uaVAbOGNRs0/7qw/rVU5nohvEO1b68E3bzlvpHHt2QHSSxBV875D+lEg/Rg63gBeXqmYxdDS8D4ZiXVdyXYgBK4h; 4:IM5CuEZuQmppesUrJFtym2E2/lIxiIFYc7oJPoF4EPVbEAAbozrMikI0WXek1JsGGSzkFcVS0WUrINvkHB5nHAsp0JPAGKwIjfmJOaTjdZL7Dwgbdgr/X8t86r4fACAUpU9MFQtJNtaVWJ0Rw5mnDU9N4oI1xXdKFhsw4hcTmIs4Rw9WCFPexJLdBiLdvD1ACpAUbLoze/T2+rAhDF5BrOEPnqT3LcZmosUnGrPRVl0podzkId36RQSMFZpwrQTF0poTXrYRl6dvDOaT4g/GuBqhX8fUFD1HCNzjCRpCMm+1qugGDeXd6/R0KGuBeLNWUlxP9noqFSMKvJ7FIIs3dw== 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)(8121501046)(5005006)(3231254)(944501410)(52105095)(93006095)(93001095)(3002001)(10201501046)(6055026)(149027)(150027)(6041310)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(20161123560045)(20161123564045)(20161123562045)(6072148)(201708071742011)(7699016); SRVR:CY1PR12MB0165; BCL:0; PCL:0; RULEID:; SRVR:CY1PR12MB0165; X-Forefront-PRVS: 06793E740F X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(346002)(39860400002)(376002)(39380400002)(366004)(396003)(199004)(189003)(6666003)(1076002)(68736007)(66066001)(106356001)(11346002)(58126008)(55016002)(4326008)(97746001)(52116002)(47776003)(53416004)(50466002)(2361001)(2351001)(53936002)(3846002)(7696005)(6116002)(486006)(86362001)(97736004)(476003)(446003)(6916009)(956004)(2486003)(316002)(25786009)(23676004)(105586002)(478600001)(575784001)(103116003)(72206003)(81166006)(230700001)(59450400001)(8936002)(7736002)(69596002)(2906002)(16526019)(81156014)(8676002)(76176011)(26005)(5660300001)(6506007)(186003)(305945005)(9686003)(386003); DIR:OUT; SFP:1101; SCL:1; SRVR:CY1PR12MB0165; H:tlendack-t1.amdoffice.net; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; A:1; MX:1; Received-SPF: None (protection.outlook.com: amd.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?utf-8?q?1=3BCY1PR12MB0165=3B23=3Ar0O9?= =?utf-8?q?FboNl+E1mbVD+adXO+/73w8CHx2aXHrQbcxZVQ2mrvD72AJz0lSgFtGK?= =?utf-8?q?wXsQOmN312lnLzpVLZz8uYhMIKaZuAO1l9R0pxhQYFd2+Rbtn5p5jaar?= =?utf-8?q?PkaN5Y+oIHmRX6D72dYM9XgxD6a7KSEJArb2VdvG+YeXKHr1MD5yanxz?= =?utf-8?q?5BQnl7hSYOm3bnABqNac1wmg1cl095KaDRR2ffwmqRZYA99ql6VYVdlU?= =?utf-8?q?PogJwbAdy9z2aAd+eC00/ofwK0ozMmsVpPfzmftsdgpDyYpYArRKEuMe?= =?utf-8?q?KWP9aFZyVvSHrXy4C6BRW03HqaAcMJNfPCVwywZ+6Gfis1P6ZphpEurP?= =?utf-8?q?2dD955Ea0MKESPLEJmjryBEWxZgfWQD7eSgvxeObWrrLpiaismXpfG0x?= =?utf-8?q?bZ6hP1GQzYEB24mjKaFix4i1M4k2GIuf0zScHUU/sH6Z098AywMCJlHJ?= =?utf-8?q?C6ryVjMyKl2IZyeQsrI+BueEYNGAN+OPTYjEN/oouOrSsWgWticTDM+a?= =?utf-8?q?dvHOmNrROVMPU/U+UoqhmrPbG8DFoKSBqpR0mqAJ4OnQxEk+TONzwDHC?= =?utf-8?q?NoS5EqRGJoBbRDN9cPShkd2S53A++3oD+TvAHcMZsDhTCsjCifr3uHI6?= =?utf-8?q?6rnM4AApW6MlbREG0BcNwN7e2XomoQtJRnVgWAdWz13thYISR3ueqLVM?= =?utf-8?q?fAbtVnxqaVMwUzCopIcR/8dHaV9jkABIhLUeQUM+rG6B8CDAq/xEGGiR?= =?utf-8?q?LnUKCUg/xuUHyJ92fBVaJIClXKUnU3uSBEp+zxEvBtrY9tWf0rV97FOS?= =?utf-8?q?+6WeEQbO1BLbLkEYfW4qhuWhqQG1aOWz6uT5wUzoLUI58qbiWNKKcK11?= =?utf-8?q?rorSKiIqU1NZ0hqBQQZV6wqUL4MwomDp/uGe2VJtO5bWzwThVGfivuDi?= =?utf-8?q?G7KNZF63wixHDrPuoOpJxpbSWsQ89TJKvj/9oh9MIjd5ouP2ZSvBjYDv?= =?utf-8?q?upYRAgywsxb0CyA6AqtGRQaGlCsP+Hqrp6LxS7BsQ2+OrpEe+zKRNdjD?= =?utf-8?q?xPp83JbAAZwDPMjf5hFTtgF4oUmjb1PIYLdnBNGlXpObGNAI6UPP1cdP?= =?utf-8?q?htRAbLohrEGYNHrcJMcRg5t8VpTD4xtrUdoRmTRq+JuubqPpkZIvUDZ5?= =?utf-8?q?wDl/ptwv9cZb3lfR1+uFj24P7Rr7qDTQUt8v8fspBaikQkmqXlUMyh/J?= =?utf-8?q?r8EY47epjT5scrWedaN2uXhfEILU+ebumAnu9A/nQSJjQC744tlGyu5I?= =?utf-8?q?qFH6Ccw/bB/xhalpHly1DWL3ZzNHRiOnEXXZQSEkb/JUef10Uxc6YTVU?= =?utf-8?q?2wHyCVJGt/CrQRt/K5iREfdLdHxStuTguvv1eyBg3Jb0C7ZuhVSXZeGG?= =?utf-8?q?7vDXZ4GIo8zHOvyG5V392pk+gsdb7X73f1aID+s=3D?= X-Microsoft-Antispam-Message-Info: uoWMSnzMYXt54pmTnA3471yHUEQkz9DesWbd9StEN4Yhte7xj7qJPg+urkyKqlqAFefhONlEBZcVSt343L2weethA+rTJsQwfdXCxsGTEKgcs786LaedRE16wqDyKoNlBXj1mNaD5namEDqEK1VJLP5Wk/+Z3V46oDs2SCJqJz690/w6ObJ7t5Tb7dFUMQ61 X-Microsoft-Exchange-Diagnostics: 1; CY1PR12MB0165; 6:Q5PuoThJBhNeF7V8YQ0g3DV7x987i2dO2sBdcnq4uwMaQzspTyBAp+MWJCXUr2UBJOkMwm3COeSWHsup81zgyFmVZETS/0rZI3n3msw6maglD1vVAu83upXvgKJrfJovcp82/Lo/6qJG9HPbLxyuygxnKOjFUKpnU/s7vk+wls06UpUVxmSXKvNhGNW0YPAVxsW6MAotpve98/gG6zK0O5P2/r/2kiaDVPhRDEeQIC0Vztr34MH1TRpIcKZPAm6csL5HTpg7SXC1F7nDtuYjqb9v7SYOPcgEyL58c+z1Xh8896CT7JA29NII9FWA6Q9+VTCoS3+Fc+wUMbCC8nOGmsnMADbcNjqWy/Fcbabm60kcUhkiauOzSKywZoGeJH4uTD8Bb8UCQPfi9W5Eaq198joYYTqVhF4TzUeC/WQNz8sTMX8FVr5oeu8BlI3Of2LFfSfaeKef+X2VKOig7JJJGQ==; 5:KQAwRsMZeuh2iHeITcMZsSbkhm6XUAIkqQjmFXCDtBEKPAwDp/KAf8ZNbseq6G8J1sL4PqBpcz8ngE8WRixk33bq5pDcp46h1M3fBYboBSogrw6loM9niw5Ac3XmAHNgKi0Xlc6YlxQGiD16zx7F6brzBFp9i85hOaggpMtXqQI=; 24:FHRFe1WJiGah0dBlYZo4JX8SRkuZ8GnS5pLB3JDd8HbmXYYRmWszaOL9QSgsRJf5IiN/3itCe4Gtt6IZ2glDLcHUS5gKmz9VrdYpI08RTNg= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; CY1PR12MB0165; 7:plFK8nfachbNhGpWuWp2uz34duhMxZTkz7LB1FzcqoLULlaRoNQpSxAXsNuwe8tU6xzM7AnLTUCK+FX9WvUXBxF4ee6WIpNNZjubagIL3PUrR7A/fbEVMl6lARGe4Wwdy9AZb0VVR29/CtDZ5D4oV0g8iKiNEWJnJ6cY17BU/FMpr0I0f+B1fdS66VFmJ3IWmjo7WqXWB7jj3IdDTsU6ZBiyHd4Z9qe3EvMLtOaWBjM7/qaE/fCmc1rxi85OAFcB; 20:/3GkgADfdJje2rlmhi2OafFpqA1s/xh7jiOgXOsopI7XFetmzFLDREPqjxBgkf24lx3sFkTFxWn0cvMmaN4F/fm9sBBhdBlRdAbhS3ONmqUX87IdAd4HqUP/RAGvuijiFcmi07WsI17r4UFE6YbGm7js6B5cFF5ayYGIGG976rTRJiX20vC19DeC74OwFt7ohaipYm25Vi2EgIJC9ao1BCYpboaViX7XdLFqhcIxTqCZ7LmVe9MS136Fv4ScYMDP X-MS-Office365-Filtering-Correlation-Id: 65918da1-9c7a-4706-81bb-08d5bf662795 X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 21 May 2018 21:59:41.1815 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 65918da1-9c7a-4706-81bb-08d5bf662795 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY1PR12MB0165 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 | 131 ++++++++++++++++++++++++++ drivers/net/ethernet/amd/xgbe/xgbe.h | 4 + 3 files changed, 160 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..d26fd95 100644 --- a/drivers/net/ethernet/amd/xgbe/xgbe-ethtool.c +++ b/drivers/net/ethernet/amd/xgbe/xgbe-ethtool.c @@ -705,6 +705,135 @@ 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; + channels->max_tx = tx; + + /* Current running settings */ + rx = pdata->rx_ring_count; + tx = 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, 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->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 Rx and Tx channel */ + if (!channels->combined_count) { + if (!channels->rx_count || !channels->tx_count) { + netdev_err(netdev, + "at least one Rx and one 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; + } + + /* Check for Rx/Tx specific channels */ + combined = channels->combined_count; + tx -= combined; + rx -= combined; + if (channels->rx_count > rx) { + netdev_err(netdev, + "Rx channel count cannot exceed %u when combined channel count is %u\n", + rx, combined); + xgbe_print_set_channels_input(netdev, channels); + return -EINVAL; + } + + if (channels->tx_count > tx) { + netdev_err(netdev, + "Tx channel count cannot exceed %u when combined channel count is %u\n", + tx, combined); + xgbe_print_set_channels_input(netdev, channels); + return -EINVAL; + } + + rx = combined + channels->rx_count; + tx = combined + channels->tx_count; + netdev_notice(netdev, "final channel count assignment: combined=%u, rx-only=%u, tx-only=%u\n", + min(rx, tx), rx - min(rx, tx), tx - min(rx, tx)); + + if ((rx == pdata->rx_ring_count) && + (tx == pdata->tx_ring_count)) + 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 +858,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 *);