net/mlx4_en: IRQ affinity hint is not cleared on port down
[linux-2.6-microblaze.git] / drivers / net / ethernet / mellanox / mlx4 / en_cq.c
index c2cd8d3..14c0004 100644 (file)
@@ -125,10 +125,13 @@ int mlx4_en_activate_cq(struct mlx4_en_priv *priv, struct mlx4_en_cq *cq,
                                                   &cq->vector)) {
                                        cq->vector = (cq->ring + 1 + priv->port)
                                            % mdev->dev->caps.num_comp_vectors;
-                                       mlx4_warn(mdev, "Failed Assigning an EQ to "
-                                                 "%s ,Falling back to legacy EQ's\n",
+                                       mlx4_warn(mdev, "Failed assigning an EQ to %s, falling back to legacy EQ's\n",
                                                  name);
                                }
+
+                               cq->irq_desc =
+                                       irq_to_desc(mlx4_eq_get_irq(mdev->dev,
+                                                                   cq->vector));
                        }
                } else {
                        cq->vector = (cq->ring + 1 + priv->port) %
@@ -164,6 +167,13 @@ int mlx4_en_activate_cq(struct mlx4_en_priv *priv, struct mlx4_en_cq *cq,
                netif_napi_add(cq->dev, &cq->napi, mlx4_en_poll_tx_cq,
                               NAPI_POLL_WEIGHT);
        } else {
+               struct mlx4_en_rx_ring *ring = priv->rx_ring[cq->ring];
+
+               err = irq_set_affinity_hint(cq->mcq.irq,
+                                           ring->affinity_mask);
+               if (err)
+                       mlx4_warn(mdev, "Failed setting affinity hint\n");
+
                netif_napi_add(cq->dev, &cq->napi, mlx4_en_poll_rx_cq, 64);
                napi_hash_add(&cq->napi);
        }
@@ -180,8 +190,9 @@ void mlx4_en_destroy_cq(struct mlx4_en_priv *priv, struct mlx4_en_cq **pcq)
 
        mlx4_en_unmap_buffer(&cq->wqres.buf);
        mlx4_free_hwq_res(mdev->dev, &cq->wqres, cq->buf_size);
-       if (priv->mdev->dev->caps.comp_pool && cq->vector)
+       if (priv->mdev->dev->caps.comp_pool && cq->vector) {
                mlx4_release_eq(priv->mdev->dev, cq->vector);
+       }
        cq->vector = 0;
        cq->buf_size = 0;
        cq->buf = NULL;
@@ -195,6 +206,7 @@ void mlx4_en_deactivate_cq(struct mlx4_en_priv *priv, struct mlx4_en_cq *cq)
        if (!cq->is_tx) {
                napi_hash_del(&cq->napi);
                synchronize_rcu();
+               irq_set_affinity_hint(cq->mcq.irq, NULL);
        }
        netif_napi_del(&cq->napi);