net/mlx4_en: num cores tx rings for every UP
[cascardo/linux.git] / drivers / net / ethernet / mellanox / mlx4 / en_netdev.c
index eaa8fad..926d8aa 100644 (file)
 
 static int mlx4_en_setup_tc(struct net_device *dev, u8 up)
 {
-       if (up != MLX4_EN_NUM_UP)
+       struct mlx4_en_priv *priv = netdev_priv(dev);
+       int i;
+       unsigned int q, offset = 0;
+
+       if (up && up != MLX4_EN_NUM_UP)
                return -EINVAL;
 
+       netdev_set_num_tc(dev, up);
+
+       /* Partition Tx queues evenly amongst UP's */
+       q = priv->tx_ring_num / up;
+       for (i = 0; i < up; i++) {
+               netdev_set_tc_queue(dev, i, q, offset);
+               offset += q;
+       }
+
        return 0;
 }
 
@@ -661,7 +674,7 @@ int mlx4_en_start_port(struct net_device *dev)
                /* Configure ring */
                tx_ring = &priv->tx_ring[i];
                err = mlx4_en_activate_tx_ring(priv, tx_ring, cq->mcq.cqn,
-                               max(0, i - MLX4_EN_NUM_TX_RINGS));
+                       i / priv->mdev->profile.num_tx_rings_p_up);
                if (err) {
                        en_err(priv, "Failed allocating Tx ring\n");
                        mlx4_en_deactivate_cq(priv, cq);
@@ -986,6 +999,9 @@ void mlx4_en_destroy_netdev(struct net_device *dev)
 
        mlx4_en_free_resources(priv);
 
+       kfree(priv->tx_ring);
+       kfree(priv->tx_cq);
+
        free_netdev(dev);
 }
 
@@ -1091,6 +1107,18 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port,
        priv->ctrl_flags = cpu_to_be32(MLX4_WQE_CTRL_CQ_UPDATE |
                        MLX4_WQE_CTRL_SOLICITED);
        priv->tx_ring_num = prof->tx_ring_num;
+       priv->tx_ring = kzalloc(sizeof(struct mlx4_en_tx_ring) *
+                       priv->tx_ring_num, GFP_KERNEL);
+       if (!priv->tx_ring) {
+               err = -ENOMEM;
+               goto out;
+       }
+       priv->tx_cq = kzalloc(sizeof(struct mlx4_en_cq) * priv->tx_ring_num,
+                       GFP_KERNEL);
+       if (!priv->tx_cq) {
+               err = -ENOMEM;
+               goto out;
+       }
        priv->rx_ring_num = prof->rx_ring_num;
        priv->mac_index = -1;
        priv->msg_enable = MLX4_EN_MSG_LEVEL;
@@ -1138,15 +1166,6 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port,
        netif_set_real_num_tx_queues(dev, priv->tx_ring_num);
        netif_set_real_num_rx_queues(dev, priv->rx_ring_num);
 
-       netdev_set_num_tc(dev, MLX4_EN_NUM_UP);
-
-       /* First 9 rings are for UP 0 */
-       netdev_set_tc_queue(dev, 0, MLX4_EN_NUM_TX_RINGS + 1, 0);
-
-       /* Partition Tx queues evenly amongst UP's 1-7 */
-       for (i = 1; i < MLX4_EN_NUM_UP; i++)
-               netdev_set_tc_queue(dev, i, 1, MLX4_EN_NUM_TX_RINGS + i);
-
        SET_ETHTOOL_OPS(dev, &mlx4_en_ethtool_ops);
 
        /* Set defualt MAC */