Patch "qlcnic: Fix mailbox completion handling during spurious interrupt" has been added to the 4.4-stable tree
This is a note to let you know that I've just added the patch titled
qlcnic: Fix mailbox completion handling during spurious interrupt
to the 4.4-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
qlcnic-fix-mailbox-completion-handling-during-spurious-interrupt.patch
and it can be found in the queue-4.4 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From foo@baz Sat Apr 16 10:02:53 PDT 2016
From: Rajesh Borundia <[email protected]>
Date: Tue, 8 Mar 2016 02:39:58 -0500
Subject: qlcnic: Fix mailbox completion handling during spurious interrupt
From: Rajesh Borundia <[email protected]>
[ Upstream commit 819bfe764dceec2f6b4551768453f374b4c60443 ]
o While the driver is in the middle of a MB completion processing and it receives a spurious MB interrupt, it is mistaken as a good MB completion interrupt leading to premature completion of the next MB request. Fix the driver to guard against this by checking the current state of MB processing and ignore the spurious interrupt. Also added a stats counter to record this condition.
--- drivers/net/ethernet/qlogic/qlcnic/qlcnic.h | 1 + drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c | 15 +++++++++++---- drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c | 3 ++- 3 files changed, 14 insertions(+), 5 deletions(-)
drivers/net/ethernet/qlogic/qlcnic/qlcnic.h +1 -0
@@ -566,6 +566,7 @@ struct qlcnic_adapter_stats {u64 tx_dma_map_error;u64 spurious_intr;u64 mac_filter_limit_overrun; +u64 mbx_spurious_intr; };/*
drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c +11 -4
@@ -2338,9 +2338,9 @@ static void qlcnic_83xx_handle_link_aen(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_ae 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(sstruct 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(sreturn ; } +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);
drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c +2 -1
@@ -59,7 +59,8 @@ static const struct qlcnic_stats qlcnic_ QLC_OFF(stats.mac_filter_limit_overrun)}, {"spurious intr" ,QLC_SIZEOF (stats.spurious_intr), QLC_OFF(stats.spurious_intr)}, - + {"mbx spurious intr", QLC_SIZEOF(stats.mbx_spurious_intr), + QLC_OFF(stats.mbx_spurious_intr)}, }; static const char qlcnic_device_gstrings_stats[][ETH_GSTRING_LEN] = {
Patches currently in stable-queue which might be from [email protected] are
queue-4.4/qlcnic-remove-unnecessary-usage-of-atomic_t.patch queue-4.4/qlcnic-fix-mailbox-completion-handling-during-spurious-interrupt.patch