Skip to content

Commit

Permalink
qed: Protect the doorbell BAR with the write barriers.
Browse files Browse the repository at this point in the history
SPQ doorbell is currently protected with the compilation barrier. Under the
stress scenarios, we may get into a state where (due to the weak ordering)
several ramrod doorbells were written to the BAR with an out-of-order
producer values. Need to change the barrier type to a write barrier to make
sure that the write buffer is flushed after each doorbell.

Signed-off-by: Sudarsana Reddy Kalluru <sudarsana.kalluru@qlogic.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Sudarsana Reddy Kalluru authored and David S. Miller committed Jun 29, 2016
1 parent b560f03 commit 34c7bb4
Showing 1 changed file with 3 additions and 7 deletions.
10 changes: 3 additions & 7 deletions drivers/net/ethernet/qlogic/qed/qed_spq.c
Original file line number Diff line number Diff line change
Expand Up @@ -213,19 +213,15 @@ static int qed_spq_hw_post(struct qed_hwfn *p_hwfn,
SET_FIELD(db.params, CORE_DB_DATA_AGG_VAL_SEL,
DQ_XCM_CORE_SPQ_PROD_CMD);
db.agg_flags = DQ_XCM_CORE_DQ_CF_CMD;

/* validate producer is up to-date */
rmb();

db.spq_prod = cpu_to_le16(qed_chain_get_prod_idx(p_chain));

/* do not reorder */
barrier();
/* make sure the SPQE is updated before the doorbell */
wmb();

DOORBELL(p_hwfn, qed_db_addr(p_spq->cid, DQ_DEMS_LEGACY), *(u32 *)&db);

/* make sure doorbell is rang */
mmiowb();
wmb();

DP_VERBOSE(p_hwfn, QED_MSG_SPQ,
"Doorbelled [0x%08x, CID 0x%08x] with Flags: %02x agg_params: %02x, prod: %04x\n",
Expand Down

0 comments on commit 34c7bb4

Please sign in to comment.