|
@@ -47,9 +47,22 @@
|
|
|
|
|
|
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 */
|