| From 3229a1fa43b54bf845091dcb397adf46283f6f44 Mon Sep 17 00:00:00 2001 |
| From: Manish Chopra <manishc@marvell.com> |
| Date: Wed, 6 Feb 2019 14:43:42 -0800 |
| Subject: qed: Fix EQ full firmware assert. |
| |
| [ Upstream commit 660492bcf4a7561b5fdc13be0ae0b0c0a8c120be ] |
| |
| When slowpath messages are sent with high rate, the resulting |
| events can lead to a FW assert in case they are not handled fast |
| enough (Event Queue Full assert). Attempt to send queued slowpath |
| messages only after the newly evacuated entries in the EQ ring |
| are indicated to FW. |
| |
| Signed-off-by: Manish Chopra <manishc@marvell.com> |
| Signed-off-by: Ariel Elior <aelior@marvell.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/ethernet/qlogic/qed/qed_sp.h | 1 + |
| drivers/net/ethernet/qlogic/qed/qed_spq.c | 15 +++++++-------- |
| 2 files changed, 8 insertions(+), 8 deletions(-) |
| |
| diff --git a/drivers/net/ethernet/qlogic/qed/qed_sp.h b/drivers/net/ethernet/qlogic/qed/qed_sp.h |
| index 3157c0d99441..dae2896e1d8e 100644 |
| --- a/drivers/net/ethernet/qlogic/qed/qed_sp.h |
| +++ b/drivers/net/ethernet/qlogic/qed/qed_sp.h |
| @@ -380,6 +380,7 @@ void qed_consq_setup(struct qed_hwfn *p_hwfn); |
| * @param p_hwfn |
| */ |
| void qed_consq_free(struct qed_hwfn *p_hwfn); |
| +int qed_spq_pend_post(struct qed_hwfn *p_hwfn); |
| |
| /** |
| * @file |
| diff --git a/drivers/net/ethernet/qlogic/qed/qed_spq.c b/drivers/net/ethernet/qlogic/qed/qed_spq.c |
| index 7106ad17afe2..a0ee847f379b 100644 |
| --- a/drivers/net/ethernet/qlogic/qed/qed_spq.c |
| +++ b/drivers/net/ethernet/qlogic/qed/qed_spq.c |
| @@ -402,6 +402,11 @@ int qed_eq_completion(struct qed_hwfn *p_hwfn, void *cookie) |
| |
| qed_eq_prod_update(p_hwfn, qed_chain_get_prod_idx(p_chain)); |
| |
| + /* Attempt to post pending requests */ |
| + spin_lock_bh(&p_hwfn->p_spq->lock); |
| + rc = qed_spq_pend_post(p_hwfn); |
| + spin_unlock_bh(&p_hwfn->p_spq->lock); |
| + |
| return rc; |
| } |
| |
| @@ -745,7 +750,7 @@ static int qed_spq_post_list(struct qed_hwfn *p_hwfn, |
| return 0; |
| } |
| |
| -static int qed_spq_pend_post(struct qed_hwfn *p_hwfn) |
| +int qed_spq_pend_post(struct qed_hwfn *p_hwfn) |
| { |
| struct qed_spq *p_spq = p_hwfn->p_spq; |
| struct qed_spq_entry *p_ent = NULL; |
| @@ -883,7 +888,6 @@ int qed_spq_completion(struct qed_hwfn *p_hwfn, |
| struct qed_spq_entry *p_ent = NULL; |
| struct qed_spq_entry *tmp; |
| struct qed_spq_entry *found = NULL; |
| - int rc; |
| |
| if (!p_hwfn) |
| return -EINVAL; |
| @@ -941,12 +945,7 @@ int qed_spq_completion(struct qed_hwfn *p_hwfn, |
| */ |
| qed_spq_return_entry(p_hwfn, found); |
| |
| - /* Attempt to post pending requests */ |
| - spin_lock_bh(&p_spq->lock); |
| - rc = qed_spq_pend_post(p_hwfn); |
| - spin_unlock_bh(&p_spq->lock); |
| - |
| - return rc; |
| + return 0; |
| } |
| |
| int qed_consq_alloc(struct qed_hwfn *p_hwfn) |
| -- |
| 2.19.1 |
| |