Skip to content

Commit

Permalink
be2net: memory barrier fixes on IBM p7 platform
Browse files Browse the repository at this point in the history
The ibm p7 architecure seems to reorder memory accesses more
aggressively than previous ppc64 architectures. This requires memory
barriers to ensure that rx/tx doorbells are pressed only after
memory to be DMAed is written.

Signed-off-by: Sathya Perla <sathyap@serverengines.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Sathya Perla authored and David S. Miller committed Jun 30, 2010
1 parent 7e307c7 commit f3eb62d
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 0 deletions.
2 changes: 2 additions & 0 deletions drivers/net/benet/be_cmds.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ static void be_mcc_notify(struct be_adapter *adapter)

val |= mccq->id & DB_MCCQ_RING_ID_MASK;
val |= 1 << DB_MCCQ_NUM_POSTED_SHIFT;

wmb();
iowrite32(val, adapter->db + DB_MCCQ_OFFSET);
}

Expand Down
7 changes: 7 additions & 0 deletions drivers/net/benet/be_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,8 @@ static void be_rxq_notify(struct be_adapter *adapter, u16 qid, u16 posted)
u32 val = 0;
val |= qid & DB_RQ_RING_ID_MASK;
val |= posted << DB_RQ_NUM_POSTED_SHIFT;

wmb();
iowrite32(val, adapter->db + DB_RQ_OFFSET);
}

Expand All @@ -97,6 +99,8 @@ static void be_txq_notify(struct be_adapter *adapter, u16 qid, u16 posted)
u32 val = 0;
val |= qid & DB_TXULP_RING_ID_MASK;
val |= (posted & DB_TXULP_NUM_POSTED_MASK) << DB_TXULP_NUM_POSTED_SHIFT;

wmb();
iowrite32(val, adapter->db + DB_TXULP1_OFFSET);
}

Expand Down Expand Up @@ -973,6 +977,7 @@ static struct be_eth_rx_compl *be_rx_compl_get(struct be_adapter *adapter)
if (rxcp->dw[offsetof(struct amap_eth_rx_compl, valid) / 32] == 0)
return NULL;

rmb();
be_dws_le_to_cpu(rxcp, sizeof(*rxcp));

queue_tail_inc(&adapter->rx_obj.cq);
Expand Down Expand Up @@ -1066,6 +1071,7 @@ static struct be_eth_tx_compl *be_tx_compl_get(struct be_queue_info *tx_cq)
if (txcp->dw[offsetof(struct amap_eth_tx_compl, valid) / 32] == 0)
return NULL;

rmb();
be_dws_le_to_cpu(txcp, sizeof(*txcp));

txcp->dw[offsetof(struct amap_eth_tx_compl, valid) / 32] = 0;
Expand Down Expand Up @@ -1113,6 +1119,7 @@ static inline struct be_eq_entry *event_get(struct be_eq_obj *eq_obj)
if (!eqe->evt)
return NULL;

rmb();
eqe->evt = le32_to_cpu(eqe->evt);
queue_tail_inc(&eq_obj->q);
return eqe;
Expand Down

0 comments on commit f3eb62d

Please sign in to comment.