diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71-e3000/0006-amd-xgbe-Add-ethtool-show-set-ring-parameter-support.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71-e3000/0006-amd-xgbe-Add-ethtool-show-set-ring-parameter-support.patch | 153 |
1 files changed, 153 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71-e3000/0006-amd-xgbe-Add-ethtool-show-set-ring-parameter-support.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71-e3000/0006-amd-xgbe-Add-ethtool-show-set-ring-parameter-support.patch new file mode 100644 index 00000000..3464a094 --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71-e3000/0006-amd-xgbe-Add-ethtool-show-set-ring-parameter-support.patch @@ -0,0 +1,153 @@ +From b92764506809e9dd65c2e1a1d7e8e93bd8910491 Mon Sep 17 00:00:00 2001 +From: Tom Lendacky <thomas.lendacky@amd.com> +Date: Wed, 23 May 2018 11:38:56 -0500 +Subject: [PATCH 06/95] amd-xgbe: Add ethtool show/set ring parameter support + +Add ethtool support to show and set the number of the Rx and Tx ring +descriptors. Changing the ring 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 | 6 +-- + drivers/net/ethernet/amd/xgbe/xgbe-ethtool.c | 65 ++++++++++++++++++++++++++++ + drivers/net/ethernet/amd/xgbe/xgbe.h | 6 +++ + 3 files changed, 72 insertions(+), 5 deletions(-) + +diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-drv.c b/drivers/net/ethernet/amd/xgbe/xgbe-drv.c +index 75c4455..0360633 100644 +--- a/drivers/net/ethernet/amd/xgbe/xgbe-drv.c ++++ b/drivers/net/ethernet/amd/xgbe/xgbe-drv.c +@@ -1428,10 +1428,8 @@ static void xgbe_stopdev(struct work_struct *work) + netdev_alert(pdata->netdev, "device stopped\n"); + } + +-static void xgbe_restart_dev(struct xgbe_prv_data *pdata) ++void xgbe_restart_dev(struct xgbe_prv_data *pdata) + { +- DBGPR("-->xgbe_restart_dev\n"); +- + /* If not running, "restart" will happen on open */ + if (!netif_running(pdata->netdev)) + return; +@@ -1442,8 +1440,6 @@ static void xgbe_restart_dev(struct xgbe_prv_data *pdata) + xgbe_free_rx_data(pdata); + + xgbe_start(pdata); +- +- DBGPR("<--xgbe_restart_dev\n"); + } + + static void xgbe_restart(struct work_struct *work) +diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-ethtool.c b/drivers/net/ethernet/amd/xgbe/xgbe-ethtool.c +index 57394b77..d12f982 100644 +--- a/drivers/net/ethernet/amd/xgbe/xgbe-ethtool.c ++++ b/drivers/net/ethernet/amd/xgbe/xgbe-ethtool.c +@@ -642,6 +642,69 @@ static int xgbe_get_module_eeprom(struct net_device *netdev, + return pdata->phy_if.module_eeprom(pdata, eeprom, data); + } + ++static void xgbe_get_ringparam(struct net_device *netdev, ++ struct ethtool_ringparam *ringparam) ++{ ++ struct xgbe_prv_data *pdata = netdev_priv(netdev); ++ ++ ringparam->rx_max_pending = XGBE_RX_DESC_CNT_MAX; ++ ringparam->tx_max_pending = XGBE_TX_DESC_CNT_MAX; ++ ringparam->rx_pending = pdata->rx_desc_count; ++ ringparam->tx_pending = pdata->tx_desc_count; ++} ++ ++static int xgbe_set_ringparam(struct net_device *netdev, ++ struct ethtool_ringparam *ringparam) ++{ ++ struct xgbe_prv_data *pdata = netdev_priv(netdev); ++ unsigned int rx, tx; ++ ++ if (ringparam->rx_mini_pending || ringparam->rx_jumbo_pending) { ++ netdev_err(netdev, "unsupported ring parameter\n"); ++ return -EINVAL; ++ } ++ ++ if ((ringparam->rx_pending < XGBE_RX_DESC_CNT_MIN) || ++ (ringparam->rx_pending > XGBE_RX_DESC_CNT_MAX)) { ++ netdev_err(netdev, ++ "rx ring parameter must be between %u and %u\n", ++ XGBE_RX_DESC_CNT_MIN, XGBE_RX_DESC_CNT_MAX); ++ return -EINVAL; ++ } ++ ++ if ((ringparam->tx_pending < XGBE_TX_DESC_CNT_MIN) || ++ (ringparam->tx_pending > XGBE_TX_DESC_CNT_MAX)) { ++ netdev_err(netdev, ++ "tx ring parameter must be between %u and %u\n", ++ XGBE_TX_DESC_CNT_MIN, XGBE_TX_DESC_CNT_MAX); ++ return -EINVAL; ++ } ++ ++ rx = __rounddown_pow_of_two(ringparam->rx_pending); ++ if (rx != ringparam->rx_pending) ++ netdev_notice(netdev, ++ "rx ring parameter rounded to power of two: %u\n", ++ rx); ++ ++ tx = __rounddown_pow_of_two(ringparam->tx_pending); ++ if (tx != ringparam->tx_pending) ++ netdev_notice(netdev, ++ "tx ring parameter rounded to power of two: %u\n", ++ tx); ++ ++ if ((rx == pdata->rx_desc_count) && ++ (tx == pdata->tx_desc_count)) ++ goto out; ++ ++ pdata->rx_desc_count = rx; ++ pdata->tx_desc_count = tx; ++ ++ xgbe_restart_dev(pdata); ++ ++out: ++ return 0; ++} ++ + static const struct ethtool_ops xgbe_ethtool_ops = { + .get_drvinfo = xgbe_get_drvinfo, + .get_msglevel = xgbe_get_msglevel, +@@ -664,6 +727,8 @@ static const struct ethtool_ops xgbe_ethtool_ops = { + .set_link_ksettings = xgbe_set_link_ksettings, + .get_module_info = xgbe_get_module_info, + .get_module_eeprom = xgbe_get_module_eeprom, ++ .get_ringparam = xgbe_get_ringparam, ++ .set_ringparam = xgbe_set_ringparam, + }; + + 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 f0f455b..7dc0fac 100644 +--- a/drivers/net/ethernet/amd/xgbe/xgbe.h ++++ b/drivers/net/ethernet/amd/xgbe/xgbe.h +@@ -144,6 +144,11 @@ + #define XGBE_TX_DESC_MAX_PROC (XGBE_TX_DESC_CNT >> 1) + #define XGBE_RX_DESC_CNT 512 + ++#define XGBE_TX_DESC_CNT_MIN 64 ++#define XGBE_TX_DESC_CNT_MAX 4096 ++#define XGBE_RX_DESC_CNT_MIN 64 ++#define XGBE_RX_DESC_CNT_MAX 4096 ++ + #define XGBE_TX_MAX_BUF_SIZE (0x3fff & ~(64 - 1)) + + /* Descriptors required for maximum contiguous TSO/GSO packet */ +@@ -1330,6 +1335,7 @@ int xgbe_powerup(struct net_device *, unsigned int); + 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); + + #ifdef CONFIG_DEBUG_FS + void xgbe_debugfs_init(struct xgbe_prv_data *); +-- +2.7.4 + |