diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71-e3000/0008-amd-xgbe-Add-ethtool-show-set-channels-support.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71-e3000/0008-amd-xgbe-Add-ethtool-show-set-channels-support.patch | 237 |
1 files changed, 0 insertions, 237 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71-e3000/0008-amd-xgbe-Add-ethtool-show-set-channels-support.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71-e3000/0008-amd-xgbe-Add-ethtool-show-set-channels-support.patch deleted file mode 100644 index 4282cc5e..00000000 --- a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71-e3000/0008-amd-xgbe-Add-ethtool-show-set-channels-support.patch +++ /dev/null @@ -1,237 +0,0 @@ -From 8ce6e8e4c95dc8c55c49348719668b9b61fc821e Mon Sep 17 00:00:00 2001 -From: Tom Lendacky <thomas.lendacky@amd.com> -Date: Wed, 23 May 2018 11:39:13 -0500 -Subject: [PATCH 08/95] amd-xgbe: Add ethtool show/set channels support - -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 <thomas.lendacky@amd.com> -Signed-off-by: David S. Miller <davem@davemloft.net> -Signed-off-by: Sudheesh Mavila <sudheesh.mavila@amd.com> ---- - 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 3c9681a..145b5c0 100644 ---- a/drivers/net/ethernet/amd/xgbe/xgbe-drv.c -+++ b/drivers/net/ethernet/amd/xgbe/xgbe-drv.c -@@ -1331,6 +1331,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); - -@@ -1484,6 +1495,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 const struct ethtool_ops xgbe_ethtool_ops = { - .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 @@ int xgbe_powerdown(struct net_device *, unsigned int); - 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 *); --- -2.7.4 - |