diff options
Diffstat (limited to 'drivers/net/mlx4/en_netdev.c')
-rw-r--r-- | drivers/net/mlx4/en_netdev.c | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/drivers/net/mlx4/en_netdev.c b/drivers/net/mlx4/en_netdev.c index 5727bf5ad452..f6ed315b4b89 100644 --- a/drivers/net/mlx4/en_netdev.c +++ b/drivers/net/mlx4/en_netdev.c | |||
@@ -557,6 +557,7 @@ int mlx4_en_start_port(struct net_device *dev) | |||
557 | int err = 0; | 557 | int err = 0; |
558 | int i; | 558 | int i; |
559 | int j; | 559 | int j; |
560 | char name[32]; | ||
560 | 561 | ||
561 | if (priv->port_up) { | 562 | if (priv->port_up) { |
562 | en_dbg(DRV, priv, "start port called while port already up\n"); | 563 | en_dbg(DRV, priv, "start port called while port already up\n"); |
@@ -601,10 +602,19 @@ int mlx4_en_start_port(struct net_device *dev) | |||
601 | goto cq_err; | 602 | goto cq_err; |
602 | } | 603 | } |
603 | 604 | ||
605 | if (mdev->dev->caps.comp_pool && !priv->tx_vector) { | ||
606 | sprintf(name , "%s-tx", priv->dev->name); | ||
607 | if (mlx4_assign_eq(mdev->dev , name, &priv->tx_vector)) { | ||
608 | mlx4_warn(mdev, "Failed Assigning an EQ to " | ||
609 | "%s_tx ,Falling back to legacy " | ||
610 | "EQ's\n", priv->dev->name); | ||
611 | } | ||
612 | } | ||
604 | /* Configure tx cq's and rings */ | 613 | /* Configure tx cq's and rings */ |
605 | for (i = 0; i < priv->tx_ring_num; i++) { | 614 | for (i = 0; i < priv->tx_ring_num; i++) { |
606 | /* Configure cq */ | 615 | /* Configure cq */ |
607 | cq = &priv->tx_cq[i]; | 616 | cq = &priv->tx_cq[i]; |
617 | cq->vector = priv->tx_vector; | ||
608 | err = mlx4_en_activate_cq(priv, cq); | 618 | err = mlx4_en_activate_cq(priv, cq); |
609 | if (err) { | 619 | if (err) { |
610 | en_err(priv, "Failed allocating Tx CQ\n"); | 620 | en_err(priv, "Failed allocating Tx CQ\n"); |
@@ -819,7 +829,7 @@ static int mlx4_en_close(struct net_device *dev) | |||
819 | return 0; | 829 | return 0; |
820 | } | 830 | } |
821 | 831 | ||
822 | void mlx4_en_free_resources(struct mlx4_en_priv *priv) | 832 | void mlx4_en_free_resources(struct mlx4_en_priv *priv, bool reserve_vectors) |
823 | { | 833 | { |
824 | int i; | 834 | int i; |
825 | 835 | ||
@@ -827,14 +837,14 @@ void mlx4_en_free_resources(struct mlx4_en_priv *priv) | |||
827 | if (priv->tx_ring[i].tx_info) | 837 | if (priv->tx_ring[i].tx_info) |
828 | mlx4_en_destroy_tx_ring(priv, &priv->tx_ring[i]); | 838 | mlx4_en_destroy_tx_ring(priv, &priv->tx_ring[i]); |
829 | if (priv->tx_cq[i].buf) | 839 | if (priv->tx_cq[i].buf) |
830 | mlx4_en_destroy_cq(priv, &priv->tx_cq[i]); | 840 | mlx4_en_destroy_cq(priv, &priv->tx_cq[i], reserve_vectors); |
831 | } | 841 | } |
832 | 842 | ||
833 | for (i = 0; i < priv->rx_ring_num; i++) { | 843 | for (i = 0; i < priv->rx_ring_num; i++) { |
834 | if (priv->rx_ring[i].rx_info) | 844 | if (priv->rx_ring[i].rx_info) |
835 | mlx4_en_destroy_rx_ring(priv, &priv->rx_ring[i]); | 845 | mlx4_en_destroy_rx_ring(priv, &priv->rx_ring[i]); |
836 | if (priv->rx_cq[i].buf) | 846 | if (priv->rx_cq[i].buf) |
837 | mlx4_en_destroy_cq(priv, &priv->rx_cq[i]); | 847 | mlx4_en_destroy_cq(priv, &priv->rx_cq[i], reserve_vectors); |
838 | } | 848 | } |
839 | } | 849 | } |
840 | 850 | ||
@@ -896,7 +906,7 @@ void mlx4_en_destroy_netdev(struct net_device *dev) | |||
896 | mdev->pndev[priv->port] = NULL; | 906 | mdev->pndev[priv->port] = NULL; |
897 | mutex_unlock(&mdev->state_lock); | 907 | mutex_unlock(&mdev->state_lock); |
898 | 908 | ||
899 | mlx4_en_free_resources(priv); | 909 | mlx4_en_free_resources(priv, false); |
900 | free_netdev(dev); | 910 | free_netdev(dev); |
901 | } | 911 | } |
902 | 912 | ||