提交 cc809237 编写于 作者: G Govindarajulu Varadarajan 提交者: David S. Miller

enic: handle spurious error interrupt

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: NGovindarajulu Varadarajan <_govind@gmx.com>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 2905f5bb
...@@ -178,13 +178,15 @@ static int enic_wq_service(struct vnic_dev *vdev, struct cq_desc *cq_desc, ...@@ -178,13 +178,15 @@ static int enic_wq_service(struct vnic_dev *vdev, struct cq_desc *cq_desc,
return 0; return 0;
} }
static void enic_log_q_error(struct enic *enic) static bool enic_log_q_error(struct enic *enic)
{ {
unsigned int i; unsigned int i;
u32 error_status; u32 error_status;
bool err = false;
for (i = 0; i < enic->wq_count; i++) { for (i = 0; i < enic->wq_count; i++) {
error_status = vnic_wq_error_status(&enic->wq[i]); error_status = vnic_wq_error_status(&enic->wq[i]);
err |= error_status;
if (error_status) if (error_status)
netdev_err(enic->netdev, "WQ[%d] error_status %d\n", netdev_err(enic->netdev, "WQ[%d] error_status %d\n",
i, error_status); i, error_status);
...@@ -192,10 +194,13 @@ static void enic_log_q_error(struct enic *enic) ...@@ -192,10 +194,13 @@ static void enic_log_q_error(struct enic *enic)
for (i = 0; i < enic->rq_count; i++) { for (i = 0; i < enic->rq_count; i++) {
error_status = vnic_rq_error_status(&enic->rq[i]); error_status = vnic_rq_error_status(&enic->rq[i]);
err |= error_status;
if (error_status) if (error_status)
netdev_err(enic->netdev, "RQ[%d] error_status %d\n", netdev_err(enic->netdev, "RQ[%d] error_status %d\n",
i, error_status); i, error_status);
} }
return err;
} }
static void enic_msglvl_check(struct enic *enic) static void enic_msglvl_check(struct enic *enic)
...@@ -333,10 +338,9 @@ static irqreturn_t enic_isr_msix_err(int irq, void *data) ...@@ -333,10 +338,9 @@ static irqreturn_t enic_isr_msix_err(int irq, void *data)
vnic_intr_return_all_credits(&enic->intr[intr]); vnic_intr_return_all_credits(&enic->intr[intr]);
enic_log_q_error(enic); if (enic_log_q_error(enic))
/* schedule recovery from WQ/RQ error */
/* schedule recovery from WQ/RQ error */ schedule_work(&enic->reset);
schedule_work(&enic->reset);
return IRQ_HANDLED; return IRQ_HANDLED;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册