|
@@ -2796,6 +2796,84 @@ static int bnx2x_set_rxfh_indir(struct net_device *dev, const u32 *indir)
|
|
|
return bnx2x_config_rss_eth(bp, false);
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * bnx2x_get_channels - gets the number of RSS queues.
|
|
|
+ *
|
|
|
+ * @dev: net device
|
|
|
+ * @channels: returns the number of max / current queues
|
|
|
+ */
|
|
|
+static void bnx2x_get_channels(struct net_device *dev,
|
|
|
+ struct ethtool_channels *channels)
|
|
|
+{
|
|
|
+ struct bnx2x *bp = netdev_priv(dev);
|
|
|
+
|
|
|
+ channels->max_combined = BNX2X_MAX_RSS_COUNT(bp);
|
|
|
+ channels->combined_count = BNX2X_NUM_ETH_QUEUES(bp);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * bnx2x_change_num_queues - change the number of RSS queues.
|
|
|
+ *
|
|
|
+ * @bp: bnx2x private structure
|
|
|
+ *
|
|
|
+ * Re-configure interrupt mode to get the new number of MSI-X
|
|
|
+ * vectors and re-add NAPI objects.
|
|
|
+ */
|
|
|
+static void bnx2x_change_num_queues(struct bnx2x *bp, int num_rss)
|
|
|
+{
|
|
|
+ bnx2x_del_all_napi(bp);
|
|
|
+ bnx2x_disable_msi(bp);
|
|
|
+ BNX2X_NUM_QUEUES(bp) = num_rss + NON_ETH_CONTEXT_USE;
|
|
|
+ bnx2x_set_int_mode(bp);
|
|
|
+ bnx2x_add_all_napi(bp);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * bnx2x_set_channels - sets the number of RSS queues.
|
|
|
+ *
|
|
|
+ * @dev: net device
|
|
|
+ * @channels: includes the number of queues requested
|
|
|
+ */
|
|
|
+static int bnx2x_set_channels(struct net_device *dev,
|
|
|
+ struct ethtool_channels *channels)
|
|
|
+{
|
|
|
+ struct bnx2x *bp = netdev_priv(dev);
|
|
|
+
|
|
|
+
|
|
|
+ DP(BNX2X_MSG_ETHTOOL,
|
|
|
+ "set-channels command parameters: rx = %d, tx = %d, other = %d, combined = %d\n",
|
|
|
+ channels->rx_count, channels->tx_count, channels->other_count,
|
|
|
+ channels->combined_count);
|
|
|
+
|
|
|
+ /* We don't support separate rx / tx channels.
|
|
|
+ * We don't allow setting 'other' channels.
|
|
|
+ */
|
|
|
+ if (channels->rx_count || channels->tx_count || channels->other_count
|
|
|
+ || (channels->combined_count == 0) ||
|
|
|
+ (channels->combined_count > BNX2X_MAX_RSS_COUNT(bp))) {
|
|
|
+ DP(BNX2X_MSG_ETHTOOL, "command parameters not supported\n");
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Check if there was a change in the active parameters */
|
|
|
+ if (channels->combined_count == BNX2X_NUM_ETH_QUEUES(bp)) {
|
|
|
+ DP(BNX2X_MSG_ETHTOOL, "No change in active parameters\n");
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Set the requested number of queues in bp context.
|
|
|
+ * Note that the actual number of queues created during load may be
|
|
|
+ * less than requested if memory is low.
|
|
|
+ */
|
|
|
+ if (unlikely(!netif_running(dev))) {
|
|
|
+ bnx2x_change_num_queues(bp, channels->combined_count);
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ bnx2x_nic_unload(bp, UNLOAD_NORMAL);
|
|
|
+ bnx2x_change_num_queues(bp, channels->combined_count);
|
|
|
+ return bnx2x_nic_load(bp, LOAD_NORMAL);
|
|
|
+}
|
|
|
+
|
|
|
static const struct ethtool_ops bnx2x_ethtool_ops = {
|
|
|
.get_settings = bnx2x_get_settings,
|
|
|
.set_settings = bnx2x_set_settings,
|
|
@@ -2827,6 +2905,8 @@ static const struct ethtool_ops bnx2x_ethtool_ops = {
|
|
|
.get_rxfh_indir_size = bnx2x_get_rxfh_indir_size,
|
|
|
.get_rxfh_indir = bnx2x_get_rxfh_indir,
|
|
|
.set_rxfh_indir = bnx2x_set_rxfh_indir,
|
|
|
+ .get_channels = bnx2x_get_channels,
|
|
|
+ .set_channels = bnx2x_set_channels,
|
|
|
.get_eee = bnx2x_get_eee,
|
|
|
.set_eee = bnx2x_set_eee,
|
|
|
};
|