Code Review
/
kvmfornfv.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
review
|
tree
raw
|
inline
| side by side
Upgrade to 4.4.50-rt62
[kvmfornfv.git]
/
kernel
/
drivers
/
net
/
ethernet
/
qlogic
/
qlcnic
/
qlcnic_83xx_hw.c
diff --git
a/kernel/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c
b/kernel/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c
index
37a731b
..
f9640d5
100644
(file)
--- a/
kernel/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c
+++ b/
kernel/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c
@@
-491,7
+491,7
@@
irqreturn_t qlcnic_83xx_clear_legacy_intr(struct qlcnic_adapter *adapter)
static inline void qlcnic_83xx_notify_mbx_response(struct qlcnic_mailbox *mbx)
{
static inline void qlcnic_83xx_notify_mbx_response(struct qlcnic_mailbox *mbx)
{
-
atomic_set(&mbx->rsp_status, QLC_83XX_MBX_RESPONSE_ARRIVED)
;
+
mbx->rsp_status = QLC_83XX_MBX_RESPONSE_ARRIVED
;
complete(&mbx->completion);
}
complete(&mbx->completion);
}
@@
-510,7
+510,7
@@
static void qlcnic_83xx_poll_process_aen(struct qlcnic_adapter *adapter)
if (event & QLCNIC_MBX_ASYNC_EVENT) {
__qlcnic_83xx_process_aen(adapter);
} else {
if (event & QLCNIC_MBX_ASYNC_EVENT) {
__qlcnic_83xx_process_aen(adapter);
} else {
- if (
atomic_read(&mbx->rsp_status)
!= rsp_status)
+ if (
mbx->rsp_status
!= rsp_status)
qlcnic_83xx_notify_mbx_response(mbx);
}
out:
qlcnic_83xx_notify_mbx_response(mbx);
}
out:
@@
-1023,7
+1023,7
@@
static void qlcnic_83xx_process_aen(struct qlcnic_adapter *adapter)
if (event & QLCNIC_MBX_ASYNC_EVENT) {
__qlcnic_83xx_process_aen(adapter);
} else {
if (event & QLCNIC_MBX_ASYNC_EVENT) {
__qlcnic_83xx_process_aen(adapter);
} else {
- if (
atomic_read(&mbx->rsp_status)
!= rsp_status)
+ if (
mbx->rsp_status
!= rsp_status)
qlcnic_83xx_notify_mbx_response(mbx);
}
}
qlcnic_83xx_notify_mbx_response(mbx);
}
}
@@
-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)
{
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;
struct qlcnic_adapter *adapter = data;
struct qlcnic_mailbox *mbx;
- u32 mask, resp, event;
unsigned long flags;
mbx = adapter->ahw->mailbox;
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));
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);
__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);
out:
mask = QLCRDX(adapter->ahw, QLCNIC_DEF_INT_MASK);
@@
-4050,10
+4054,10
@@
static void qlcnic_83xx_mailbox_worker(struct work_struct *work)
struct qlcnic_adapter *adapter = mbx->adapter;
const struct qlcnic_mbx_ops *mbx_ops = mbx->ops;
struct device *dev = &adapter->pdev->dev;
struct qlcnic_adapter *adapter = mbx->adapter;
const struct qlcnic_mbx_ops *mbx_ops = mbx->ops;
struct device *dev = &adapter->pdev->dev;
- atomic_t *rsp_status = &mbx->rsp_status;
struct list_head *head = &mbx->cmd_q;
struct qlcnic_hardware_context *ahw;
struct qlcnic_cmd_args *cmd = NULL;
struct list_head *head = &mbx->cmd_q;
struct qlcnic_hardware_context *ahw;
struct qlcnic_cmd_args *cmd = NULL;
+ unsigned long flags;
ahw = adapter->ahw;
ahw = adapter->ahw;
@@
-4063,7
+4067,9
@@
static void qlcnic_83xx_mailbox_worker(struct work_struct *work)
return;
}
return;
}
- atomic_set(rsp_status, QLC_83XX_MBX_RESPONSE_WAIT);
+ 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);
spin_lock(&mbx->queue_lock);