ice: fix changing of ring descriptor size (ethtool -G)
authorBruce Allan <bruce.w.allan@intel.com>
Thu, 20 Sep 2018 00:23:11 +0000 (17:23 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 13 Nov 2018 19:08:25 +0000 (11:08 -0800)
[ Upstream commit f934bb9b8b6136edd261b2dc2c9ad4dbc39ffc66 ]

rx_mini_pending was set to an incorrect value. This was causing EINVAL to
always be returned to 'ethtool -G'. The driver does not support mini or
jumbo rings so the respective settings should be zero.

Also, change the valid range of the number of descriptors in the rings to
make the code simpler and easier for users to understand (this removes the
valid settings of 8 and 16). Add a system log message indicating when the
number is rounded-up from what the user specifies with the 'ethtool -G'
command (i.e. when it is not a multiple of 32), and update the log message
when a user-provided value is out of range to also indicate the stride.

Signed-off-by: Bruce Allan <bruce.w.allan@intel.com>
Signed-off-by: Anirudh Venkataramanan <anirudh.venkataramanan@intel.com>
Tested-by: Andrew Bowers <andrewx.bowers@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/net/ethernet/intel/ice/ice.h
drivers/net/ethernet/intel/ice/ice_ethtool.c

index 868f4a1..6759172 100644 (file)
@@ -39,9 +39,9 @@
 extern const char ice_drv_ver[];
 #define ICE_BAR0               0
 #define ICE_DFLT_NUM_DESC      128
-#define ICE_MIN_NUM_DESC       8
-#define ICE_MAX_NUM_DESC       8160
 #define ICE_REQ_DESC_MULTIPLE  32
+#define ICE_MIN_NUM_DESC       ICE_REQ_DESC_MULTIPLE
+#define ICE_MAX_NUM_DESC       8160
 #define ICE_DFLT_TRAFFIC_CLASS BIT(0)
 #define ICE_INT_NAME_STR_LEN   (IFNAMSIZ + 16)
 #define ICE_ETHTOOL_FWVER_LEN  32
index c71a9b5..9d6754f 100644 (file)
@@ -478,9 +478,11 @@ ice_get_ringparam(struct net_device *netdev, struct ethtool_ringparam *ring)
        ring->tx_max_pending = ICE_MAX_NUM_DESC;
        ring->rx_pending = vsi->rx_rings[0]->count;
        ring->tx_pending = vsi->tx_rings[0]->count;
-       ring->rx_mini_pending = ICE_MIN_NUM_DESC;
+
+       /* Rx mini and jumbo rings are not supported */
        ring->rx_mini_max_pending = 0;
        ring->rx_jumbo_max_pending = 0;
+       ring->rx_mini_pending = 0;
        ring->rx_jumbo_pending = 0;
 }
 
@@ -498,14 +500,23 @@ ice_set_ringparam(struct net_device *netdev, struct ethtool_ringparam *ring)
            ring->tx_pending < ICE_MIN_NUM_DESC ||
            ring->rx_pending > ICE_MAX_NUM_DESC ||
            ring->rx_pending < ICE_MIN_NUM_DESC) {
-               netdev_err(netdev, "Descriptors requested (Tx: %d / Rx: %d) out of range [%d-%d]\n",
+               netdev_err(netdev, "Descriptors requested (Tx: %d / Rx: %d) out of range [%d-%d] (increment %d)\n",
                           ring->tx_pending, ring->rx_pending,
-                          ICE_MIN_NUM_DESC, ICE_MAX_NUM_DESC);
+                          ICE_MIN_NUM_DESC, ICE_MAX_NUM_DESC,
+                          ICE_REQ_DESC_MULTIPLE);
                return -EINVAL;
        }
 
        new_tx_cnt = ALIGN(ring->tx_pending, ICE_REQ_DESC_MULTIPLE);
+       if (new_tx_cnt != ring->tx_pending)
+               netdev_info(netdev,
+                           "Requested Tx descriptor count rounded up to %d\n",
+                           new_tx_cnt);
        new_rx_cnt = ALIGN(ring->rx_pending, ICE_REQ_DESC_MULTIPLE);
+       if (new_rx_cnt != ring->rx_pending)
+               netdev_info(netdev,
+                           "Requested Rx descriptor count rounded up to %d\n",
+                           new_rx_cnt);
 
        /* if nothing to do return success */
        if (new_tx_cnt == vsi->tx_rings[0]->count &&