| From: Moshe Shemesh <moshe@mellanox.com> |
| Date: Wed, 9 May 2018 18:35:13 +0300 |
| Subject: net/mlx4_en: Verify coalescing parameters are in range |
| |
| commit 6ad4e91c6d796b38a7f0e724db1de28eeb122bad upstream. |
| |
| Add check of coalescing parameters received through ethtool are within |
| range of values supported by the HW. |
| Driver gets the coalescing rx/tx-usecs and rx/tx-frames as set by the |
| users through ethtool. The ethtool support up to 32 bit value for each. |
| However, mlx4 modify cq limits the coalescing time parameter and |
| coalescing frames parameters to 16 bits. |
| Return out of range error if user tries to set these parameters to |
| higher values. |
| Change type of sample-interval and adaptive_rx_coal parameters in mlx4 |
| driver to u32 as the ethtool holds them as u32 and these parameters are |
| not limited due to mlx4 HW. |
| |
| Fixes: c27a02cd94d6 ('mlx4_en: Add driver for Mellanox ConnectX 10GbE NIC') |
| Signed-off-by: Moshe Shemesh <moshe@mellanox.com> |
| Signed-off-by: Tariq Toukan <tariqt@mellanox.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Ben Hutchings <ben@decadent.org.uk> |
| --- |
| drivers/net/ethernet/mellanox/mlx4/en_ethtool.c | 16 ++++++++++++++++ |
| drivers/net/ethernet/mellanox/mlx4/mlx4_en.h | 7 +++++-- |
| 2 files changed, 21 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c |
| +++ b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c |
| @@ -441,6 +441,22 @@ static int mlx4_en_set_coalesce(struct n |
| if (!coal->tx_max_coalesced_frames_irq) |
| return -EINVAL; |
| |
| + if (coal->tx_coalesce_usecs > MLX4_EN_MAX_COAL_TIME || |
| + coal->rx_coalesce_usecs > MLX4_EN_MAX_COAL_TIME || |
| + coal->rx_coalesce_usecs_low > MLX4_EN_MAX_COAL_TIME || |
| + coal->rx_coalesce_usecs_high > MLX4_EN_MAX_COAL_TIME) { |
| + netdev_info(dev, "%s: maximum coalesce time supported is %d usecs\n", |
| + __func__, MLX4_EN_MAX_COAL_TIME); |
| + return -ERANGE; |
| + } |
| + |
| + if (coal->tx_max_coalesced_frames > MLX4_EN_MAX_COAL_PKTS || |
| + coal->rx_max_coalesced_frames > MLX4_EN_MAX_COAL_PKTS) { |
| + netdev_info(dev, "%s: maximum coalesced frames supported is %d\n", |
| + __func__, MLX4_EN_MAX_COAL_PKTS); |
| + return -ERANGE; |
| + } |
| + |
| priv->rx_frames = (coal->rx_max_coalesced_frames == |
| MLX4_EN_AUTO_CONF) ? |
| MLX4_EN_RX_COAL_TARGET : |
| --- a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h |
| +++ b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h |
| @@ -136,6 +136,9 @@ enum { |
| #define MLX4_EN_TX_COAL_PKTS 16 |
| #define MLX4_EN_TX_COAL_TIME 0x10 |
| |
| +#define MLX4_EN_MAX_COAL_PKTS U16_MAX |
| +#define MLX4_EN_MAX_COAL_TIME U16_MAX |
| + |
| #define MLX4_EN_RX_RATE_LOW 400000 |
| #define MLX4_EN_RX_COAL_TIME_LOW 0 |
| #define MLX4_EN_RX_RATE_HIGH 450000 |
| @@ -522,8 +525,8 @@ struct mlx4_en_priv { |
| u16 rx_usecs_low; |
| u32 pkt_rate_high; |
| u16 rx_usecs_high; |
| - u16 sample_interval; |
| - u16 adaptive_rx_coal; |
| + u32 sample_interval; |
| + u32 adaptive_rx_coal; |
| u32 msg_enable; |
| u32 loopback_ok; |
| u32 validate_loopback; |