Skip to content

Commit

Permalink
enic: handle spurious error interrupt
Browse files Browse the repository at this point in the history
Some of the enic adaptors are know to generate spurious interrupts. When
error interrupt is generated, driver just resets the device. This patch
resets the device only when an error is occurred.

Signed-off-by: Govindarajulu Varadarajan <_govind@gmx.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Govindarajulu Varadarajan authored and David S. Miller committed Oct 5, 2015
1 parent 2905f5b commit cc80923
Showing 1 changed file with 9 additions and 5 deletions.
14 changes: 9 additions & 5 deletions drivers/net/ethernet/cisco/enic/enic_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -178,24 +178,29 @@ static int enic_wq_service(struct vnic_dev *vdev, struct cq_desc *cq_desc,
return 0;
}

static void enic_log_q_error(struct enic *enic)
static bool enic_log_q_error(struct enic *enic)
{
unsigned int i;
u32 error_status;
bool err = false;

for (i = 0; i < enic->wq_count; i++) {
error_status = vnic_wq_error_status(&enic->wq[i]);
err |= error_status;
if (error_status)
netdev_err(enic->netdev, "WQ[%d] error_status %d\n",
i, error_status);
}

for (i = 0; i < enic->rq_count; i++) {
error_status = vnic_rq_error_status(&enic->rq[i]);
err |= error_status;
if (error_status)
netdev_err(enic->netdev, "RQ[%d] error_status %d\n",
i, error_status);
}

return err;
}

static void enic_msglvl_check(struct enic *enic)
Expand Down Expand Up @@ -333,10 +338,9 @@ static irqreturn_t enic_isr_msix_err(int irq, void *data)

vnic_intr_return_all_credits(&enic->intr[intr]);

enic_log_q_error(enic);

/* schedule recovery from WQ/RQ error */
schedule_work(&enic->reset);
if (enic_log_q_error(enic))
/* schedule recovery from WQ/RQ error */
schedule_work(&enic->reset);

return IRQ_HANDLED;
}
Expand Down

0 comments on commit cc80923

Please sign in to comment.