Commit 76532d0c authored by Alexander Guller's avatar Alexander Guller Committed by David S. Miller

mlx4_en: Assigning TX irq per ring

Until now only RX rings used irq per ring
and TX used only one per port.
>From now on, both of them will use the
irq per ring while RX & TX ring[i] will
use the same irq.
Signed-off-by: default avatarAlexander Guller <alexg@mellanox.co.il>
Signed-off-by: default avatarSharon Cohen <sharonc@mellanox.co.il>
Signed-off-by: default avatarYevgeny Petrilin <yevgenyp@mellanox.co.il>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 8b0c1167
...@@ -74,7 +74,8 @@ int mlx4_en_create_cq(struct mlx4_en_priv *priv, ...@@ -74,7 +74,8 @@ int mlx4_en_create_cq(struct mlx4_en_priv *priv,
return err; return err;
} }
int mlx4_en_activate_cq(struct mlx4_en_priv *priv, struct mlx4_en_cq *cq) int mlx4_en_activate_cq(struct mlx4_en_priv *priv, struct mlx4_en_cq *cq,
int cq_idx)
{ {
struct mlx4_en_dev *mdev = priv->mdev; struct mlx4_en_dev *mdev = priv->mdev;
int err = 0; int err = 0;
...@@ -90,13 +91,15 @@ int mlx4_en_activate_cq(struct mlx4_en_priv *priv, struct mlx4_en_cq *cq) ...@@ -90,13 +91,15 @@ int mlx4_en_activate_cq(struct mlx4_en_priv *priv, struct mlx4_en_cq *cq)
if (cq->is_tx == RX) { if (cq->is_tx == RX) {
if (mdev->dev->caps.comp_pool) { if (mdev->dev->caps.comp_pool) {
if (!cq->vector) { if (!cq->vector) {
sprintf(name , "%s-rx-%d", priv->dev->name, cq->ring); sprintf(name, "%s-%d", priv->dev->name,
cq->ring);
/* Set IRQ for specific name (per ring) */
if (mlx4_assign_eq(mdev->dev, name, &cq->vector)) { if (mlx4_assign_eq(mdev->dev, name, &cq->vector)) {
cq->vector = (cq->ring + 1 + priv->port) % cq->vector = (cq->ring + 1 + priv->port)
mdev->dev->caps.num_comp_vectors; % mdev->dev->caps.num_comp_vectors;
mlx4_warn(mdev, "Failed Assigning an EQ to " mlx4_warn(mdev, "Failed Assigning an EQ to "
"%s_rx-%d ,Falling back to legacy EQ's\n", "%s ,Falling back to legacy EQ's\n",
priv->dev->name, cq->ring); name);
} }
} }
} else { } else {
...@@ -104,10 +107,13 @@ int mlx4_en_activate_cq(struct mlx4_en_priv *priv, struct mlx4_en_cq *cq) ...@@ -104,10 +107,13 @@ int mlx4_en_activate_cq(struct mlx4_en_priv *priv, struct mlx4_en_cq *cq)
mdev->dev->caps.num_comp_vectors; mdev->dev->caps.num_comp_vectors;
} }
} else { } else {
if (!cq->vector || !mdev->dev->caps.comp_pool) { /* For TX we use the same irq per
/*Fallback to legacy pool in case of error*/ ring we assigned for the RX */
cq->vector = 0; struct mlx4_en_cq *rx_cq;
}
cq_idx = cq_idx % priv->rx_ring_num;
rx_cq = &priv->rx_cq[cq_idx];
cq->vector = rx_cq->vector;
} }
if (!cq->is_tx) if (!cq->is_tx)
......
...@@ -587,7 +587,6 @@ int mlx4_en_start_port(struct net_device *dev) ...@@ -587,7 +587,6 @@ int mlx4_en_start_port(struct net_device *dev)
int i; int i;
int j; int j;
u8 mc_list[16] = {0}; u8 mc_list[16] = {0};
char name[32];
if (priv->port_up) { if (priv->port_up) {
en_dbg(DRV, priv, "start port called while port already up\n"); en_dbg(DRV, priv, "start port called while port already up\n");
...@@ -608,7 +607,7 @@ int mlx4_en_start_port(struct net_device *dev) ...@@ -608,7 +607,7 @@ int mlx4_en_start_port(struct net_device *dev)
for (i = 0; i < priv->rx_ring_num; i++) { for (i = 0; i < priv->rx_ring_num; i++) {
cq = &priv->rx_cq[i]; cq = &priv->rx_cq[i];
err = mlx4_en_activate_cq(priv, cq); err = mlx4_en_activate_cq(priv, cq, i);
if (err) { if (err) {
en_err(priv, "Failed activating Rx CQ\n"); en_err(priv, "Failed activating Rx CQ\n");
goto cq_err; goto cq_err;
...@@ -642,20 +641,11 @@ int mlx4_en_start_port(struct net_device *dev) ...@@ -642,20 +641,11 @@ int mlx4_en_start_port(struct net_device *dev)
goto mac_err; goto mac_err;
} }
if (mdev->dev->caps.comp_pool && !priv->tx_vector) {
sprintf(name , "%s-tx", priv->dev->name);
if (mlx4_assign_eq(mdev->dev , name, &priv->tx_vector)) {
mlx4_warn(mdev, "Failed Assigning an EQ to "
"%s_tx ,Falling back to legacy "
"EQ's\n", priv->dev->name);
}
}
/* Configure tx cq's and rings */ /* Configure tx cq's and rings */
for (i = 0; i < priv->tx_ring_num; i++) { for (i = 0; i < priv->tx_ring_num; i++) {
/* Configure cq */ /* Configure cq */
cq = &priv->tx_cq[i]; cq = &priv->tx_cq[i];
cq->vector = priv->tx_vector; err = mlx4_en_activate_cq(priv, cq, i);
err = mlx4_en_activate_cq(priv, cq);
if (err) { if (err) {
en_err(priv, "Failed allocating Tx CQ\n"); en_err(priv, "Failed allocating Tx CQ\n");
goto tx_err; goto tx_err;
......
...@@ -470,7 +470,6 @@ struct mlx4_en_priv { ...@@ -470,7 +470,6 @@ struct mlx4_en_priv {
u16 log_rx_info; u16 log_rx_info;
struct mlx4_en_tx_ring tx_ring[MAX_TX_RINGS]; struct mlx4_en_tx_ring tx_ring[MAX_TX_RINGS];
int tx_vector;
struct mlx4_en_rx_ring rx_ring[MAX_RX_RINGS]; struct mlx4_en_rx_ring rx_ring[MAX_RX_RINGS];
struct mlx4_en_cq tx_cq[MAX_TX_RINGS]; struct mlx4_en_cq tx_cq[MAX_TX_RINGS];
struct mlx4_en_cq rx_cq[MAX_RX_RINGS]; struct mlx4_en_cq rx_cq[MAX_RX_RINGS];
...@@ -510,7 +509,8 @@ int mlx4_en_create_cq(struct mlx4_en_priv *priv, struct mlx4_en_cq *cq, ...@@ -510,7 +509,8 @@ int mlx4_en_create_cq(struct mlx4_en_priv *priv, struct mlx4_en_cq *cq,
int entries, int ring, enum cq_type mode); int entries, int ring, enum cq_type mode);
void mlx4_en_destroy_cq(struct mlx4_en_priv *priv, struct mlx4_en_cq *cq, void mlx4_en_destroy_cq(struct mlx4_en_priv *priv, struct mlx4_en_cq *cq,
bool reserve_vectors); bool reserve_vectors);
int mlx4_en_activate_cq(struct mlx4_en_priv *priv, struct mlx4_en_cq *cq); int mlx4_en_activate_cq(struct mlx4_en_priv *priv, struct mlx4_en_cq *cq,
int cq_idx);
void mlx4_en_deactivate_cq(struct mlx4_en_priv *priv, struct mlx4_en_cq *cq); void mlx4_en_deactivate_cq(struct mlx4_en_priv *priv, struct mlx4_en_cq *cq);
int mlx4_en_set_cq_moder(struct mlx4_en_priv *priv, struct mlx4_en_cq *cq); int mlx4_en_set_cq_moder(struct mlx4_en_priv *priv, struct mlx4_en_cq *cq);
int mlx4_en_arm_cq(struct mlx4_en_priv *priv, struct mlx4_en_cq *cq); int mlx4_en_arm_cq(struct mlx4_en_priv *priv, struct mlx4_en_cq *cq);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment