hwmon: (max6650) Add support for alarms
[deliverable/linux.git] / drivers / net / mlx4 / en_params.c
index 95706ee1c01996898a255b210a7cf8efd14e5ab4..c1bd040b9e05df2b7c1bfe25e23e53411743dfed 100644 (file)
@@ -60,49 +60,26 @@ MLX4_EN_PARM_INT(num_lro, MLX4_EN_MAX_LRO_DESCRIPTORS,
                 "Number of LRO sessions per ring or disabled (0)");
 
 /* Priority pausing */
-MLX4_EN_PARM_INT(pptx, MLX4_EN_DEF_TX_PAUSE,
-                "Pause policy on TX: 0 never generate pause frames "
-                "1 generate pause frames according to RX buffer threshold");
-MLX4_EN_PARM_INT(pprx, MLX4_EN_DEF_RX_PAUSE,
-                "Pause policy on RX: 0 ignore received pause frames "
-                "1 respect received pause frames");
 MLX4_EN_PARM_INT(pfctx, 0, "Priority based Flow Control policy on TX[7:0]."
                           " Per priority bit mask");
 MLX4_EN_PARM_INT(pfcrx, 0, "Priority based Flow Control policy on RX[7:0]."
                           " Per priority bit mask");
 
-/* Interrupt moderation tunning */
-MLX4_EN_PARM_INT(rx_moder_cnt, MLX4_EN_AUTO_CONF,
-              "Max coalesced descriptors for Rx interrupt moderation");
-MLX4_EN_PARM_INT(rx_moder_time, MLX4_EN_AUTO_CONF,
-              "Timeout following last packet for Rx interrupt moderation");
-MLX4_EN_PARM_INT(auto_moder, 1, "Enable dynamic interrupt moderation");
-
-MLX4_EN_PARM_INT(rx_ring_num1, 0, "Number or Rx rings for port 1 (0 = #cores)");
-MLX4_EN_PARM_INT(rx_ring_num2, 0, "Number or Rx rings for port 2 (0 = #cores)");
-
-MLX4_EN_PARM_INT(tx_ring_size1, MLX4_EN_AUTO_CONF, "Tx ring size for port 1");
-MLX4_EN_PARM_INT(tx_ring_size2, MLX4_EN_AUTO_CONF, "Tx ring size for port 2");
-MLX4_EN_PARM_INT(rx_ring_size1, MLX4_EN_AUTO_CONF, "Rx ring size for port 1");
-MLX4_EN_PARM_INT(rx_ring_size2, MLX4_EN_AUTO_CONF, "Rx ring size for port 2");
-
-
 int mlx4_en_get_profile(struct mlx4_en_dev *mdev)
 {
        struct mlx4_en_profile *params = &mdev->profile;
        int i;
 
-       params->rx_moder_cnt = min_t(int, rx_moder_cnt, MLX4_EN_AUTO_CONF);
-       params->rx_moder_time = min_t(int, rx_moder_time, MLX4_EN_AUTO_CONF);
-       params->auto_moder = auto_moder;
        params->rss_xor = (rss_xor != 0);
        params->rss_mask = rss_mask & 0x1f;
        params->num_lro = min_t(int, num_lro , MLX4_EN_MAX_LRO_DESCRIPTORS);
        for (i = 1; i <= MLX4_MAX_PORTS; i++) {
-               params->prof[i].rx_pause = pprx;
+               params->prof[i].rx_pause = 1;
                params->prof[i].rx_ppp = pfcrx;
-               params->prof[i].tx_pause = pptx;
+               params->prof[i].tx_pause = 1;
                params->prof[i].tx_ppp = pfctx;
+               params->prof[i].tx_ring_size = MLX4_EN_DEF_TX_RING_SIZE;
+               params->prof[i].rx_ring_size = MLX4_EN_DEF_RX_RING_SIZE;
        }
        if (pfcrx || pfctx) {
                params->prof[1].tx_ring_num = MLX4_EN_TX_RING_NUM;
@@ -111,32 +88,7 @@ int mlx4_en_get_profile(struct mlx4_en_dev *mdev)
                params->prof[1].tx_ring_num = 1;
                params->prof[2].tx_ring_num = 1;
        }
-       params->prof[1].rx_ring_num = min_t(int, rx_ring_num1, MAX_RX_RINGS);
-       params->prof[2].rx_ring_num = min_t(int, rx_ring_num2, MAX_RX_RINGS);
-
-       if (tx_ring_size1 == MLX4_EN_AUTO_CONF)
-               tx_ring_size1 = MLX4_EN_DEF_TX_RING_SIZE;
-       params->prof[1].tx_ring_size =
-               (tx_ring_size1 < MLX4_EN_MIN_TX_SIZE) ?
-                MLX4_EN_MIN_TX_SIZE : roundup_pow_of_two(tx_ring_size1);
-
-       if (tx_ring_size2 == MLX4_EN_AUTO_CONF)
-               tx_ring_size2 = MLX4_EN_DEF_TX_RING_SIZE;
-       params->prof[2].tx_ring_size =
-               (tx_ring_size2 < MLX4_EN_MIN_TX_SIZE) ?
-                MLX4_EN_MIN_TX_SIZE : roundup_pow_of_two(tx_ring_size2);
-
-       if (rx_ring_size1 == MLX4_EN_AUTO_CONF)
-               rx_ring_size1 = MLX4_EN_DEF_RX_RING_SIZE;
-       params->prof[1].rx_ring_size =
-               (rx_ring_size1 < MLX4_EN_MIN_RX_SIZE) ?
-                MLX4_EN_MIN_RX_SIZE : roundup_pow_of_two(rx_ring_size1);
-
-       if (rx_ring_size2 == MLX4_EN_AUTO_CONF)
-               rx_ring_size2 = MLX4_EN_DEF_RX_RING_SIZE;
-       params->prof[2].rx_ring_size =
-               (rx_ring_size2 < MLX4_EN_MIN_RX_SIZE) ?
-                MLX4_EN_MIN_RX_SIZE : roundup_pow_of_two(rx_ring_size2);
+
        return 0;
 }
 
@@ -433,6 +385,56 @@ static void mlx4_en_get_pauseparam(struct net_device *dev,
        pause->rx_pause = priv->prof->rx_pause;
 }
 
+static int mlx4_en_set_ringparam(struct net_device *dev,
+                                struct ethtool_ringparam *param)
+{
+       struct mlx4_en_priv *priv = netdev_priv(dev);
+       struct mlx4_en_dev *mdev = priv->mdev;
+       u32 rx_size, tx_size;
+       int port_up = 0;
+       int err = 0;
+
+       if (param->rx_jumbo_pending || param->rx_mini_pending)
+               return -EINVAL;
+
+       rx_size = roundup_pow_of_two(param->rx_pending);
+       rx_size = max_t(u32, rx_size, MLX4_EN_MIN_RX_SIZE);
+       rx_size = min_t(u32, rx_size, MLX4_EN_MAX_RX_SIZE);
+       tx_size = roundup_pow_of_two(param->tx_pending);
+       tx_size = max_t(u32, tx_size, MLX4_EN_MIN_TX_SIZE);
+       tx_size = min_t(u32, tx_size, MLX4_EN_MAX_TX_SIZE);
+
+       if (rx_size == priv->prof->rx_ring_size &&
+           tx_size == priv->prof->tx_ring_size)
+               return 0;
+
+       mutex_lock(&mdev->state_lock);
+       if (priv->port_up) {
+               port_up = 1;
+               mlx4_en_stop_port(dev);
+       }
+
+       mlx4_en_free_resources(priv);
+
+       priv->prof->tx_ring_size = tx_size;
+       priv->prof->rx_ring_size = rx_size;
+
+       err = mlx4_en_alloc_resources(priv);
+       if (err) {
+               mlx4_err(mdev, "Failed reallocating port resources\n");
+               goto out;
+       }
+       if (port_up) {
+               err = mlx4_en_start_port(dev);
+               if (err)
+                       mlx4_err(mdev, "Failed starting port\n");
+       }
+
+out:
+       mutex_unlock(&mdev->state_lock);
+       return err;
+}
+
 static void mlx4_en_get_ringparam(struct net_device *dev,
                                  struct ethtool_ringparam *param)
 {
@@ -440,8 +442,8 @@ static void mlx4_en_get_ringparam(struct net_device *dev,
        struct mlx4_en_dev *mdev = priv->mdev;
 
        memset(param, 0, sizeof(*param));
-       param->rx_max_pending = mdev->dev->caps.max_rq_sg;
-       param->tx_max_pending = mdev->dev->caps.max_sq_sg;
+       param->rx_max_pending = MLX4_EN_MAX_RX_SIZE;
+       param->tx_max_pending = MLX4_EN_MAX_TX_SIZE;
        param->rx_pending = mdev->profile.prof[priv->port].rx_ring_size;
        param->tx_pending = mdev->profile.prof[priv->port].tx_ring_size;
 }
@@ -472,6 +474,7 @@ const struct ethtool_ops mlx4_en_ethtool_ops = {
        .get_pauseparam = mlx4_en_get_pauseparam,
        .set_pauseparam = mlx4_en_set_pauseparam,
        .get_ringparam = mlx4_en_get_ringparam,
+       .set_ringparam = mlx4_en_set_ringparam,
        .get_flags = ethtool_op_get_flags,
        .set_flags = ethtool_op_set_flags,
 };
This page took 0.040823 seconds and 5 git commands to generate.