|
@@ -2338,9 +2338,9 @@ static void qlcnic_83xx_handle_link_aen(struct qlcnic_adapter *adapter,
|
|
|
|
|
|
static irqreturn_t qlcnic_83xx_handle_aen(int irq, void *data)
|
|
|
{
|
|
|
+ u32 mask, resp, event, rsp_status = QLC_83XX_MBX_RESPONSE_ARRIVED;
|
|
|
struct qlcnic_adapter *adapter = data;
|
|
|
struct qlcnic_mailbox *mbx;
|
|
|
- u32 mask, resp, event;
|
|
|
unsigned long flags;
|
|
|
|
|
|
mbx = adapter->ahw->mailbox;
|
|
@@ -2350,10 +2350,14 @@ static irqreturn_t qlcnic_83xx_handle_aen(int irq, void *data)
|
|
|
goto out;
|
|
|
|
|
|
event = readl(QLCNIC_MBX_FW(adapter->ahw, 0));
|
|
|
- if (event & QLCNIC_MBX_ASYNC_EVENT)
|
|
|
+ if (event & QLCNIC_MBX_ASYNC_EVENT) {
|
|
|
__qlcnic_83xx_process_aen(adapter);
|
|
|
- else
|
|
|
- qlcnic_83xx_notify_mbx_response(mbx);
|
|
|
+ } else {
|
|
|
+ if (mbx->rsp_status != rsp_status)
|
|
|
+ qlcnic_83xx_notify_mbx_response(mbx);
|
|
|
+ else
|
|
|
+ adapter->stats.mbx_spurious_intr++;
|
|
|
+ }
|
|
|
|
|
|
out:
|
|
|
mask = QLCRDX(adapter->ahw, QLCNIC_DEF_INT_MASK);
|
|
@@ -4053,6 +4057,7 @@ static void qlcnic_83xx_mailbox_worker(struct work_struct *work)
|
|
|
struct list_head *head = &mbx->cmd_q;
|
|
|
struct qlcnic_hardware_context *ahw;
|
|
|
struct qlcnic_cmd_args *cmd = NULL;
|
|
|
+ unsigned long flags;
|
|
|
|
|
|
ahw = adapter->ahw;
|
|
|
|
|
@@ -4062,7 +4067,9 @@ static void qlcnic_83xx_mailbox_worker(struct work_struct *work)
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
+ spin_lock_irqsave(&mbx->aen_lock, flags);
|
|
|
mbx->rsp_status = QLC_83XX_MBX_RESPONSE_WAIT;
|
|
|
+ spin_unlock_irqrestore(&mbx->aen_lock, flags);
|
|
|
|
|
|
spin_lock(&mbx->queue_lock);
|
|
|
|