summaryrefslogtreecommitdiffstats
path: root/drivers/net/enic/vnic_rq.h
diff options
context:
space:
mode:
authorScott Feldman <scofeldm@cisco.com>2008-11-21 21:29:01 -0800
committerDavid S. Miller <davem@davemloft.net>2008-11-21 21:29:01 -0800
commit845964515a76381e204d3399af82c149f8abcc1c (patch)
tree46f7f16c17294ccf56bd9f964e74a92cf7e7871e /drivers/net/enic/vnic_rq.h
parentcb3c766975985885e64e20cc72c4a36d90da2b30 (diff)
enic: move wmb closer to where needed: before writing posted_index to hw
Signed-off-by: Scott Feldman <scofeldm@cisco.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/enic/vnic_rq.h')
-rw-r--r--drivers/net/enic/vnic_rq.h9
1 files changed, 8 insertions, 1 deletions
diff --git a/drivers/net/enic/vnic_rq.h b/drivers/net/enic/vnic_rq.h
index 82bfca67cc4..fd0ef66d2e9 100644
--- a/drivers/net/enic/vnic_rq.h
+++ b/drivers/net/enic/vnic_rq.h
@@ -132,8 +132,15 @@ static inline void vnic_rq_post(struct vnic_rq *rq,
#define VNIC_RQ_RETURN_RATE 0xf /* keep 2^n - 1 */
#endif
- if ((buf->index & VNIC_RQ_RETURN_RATE) == 0)
+ if ((buf->index & VNIC_RQ_RETURN_RATE) == 0) {
+ /* Adding write memory barrier prevents compiler and/or CPU
+ * reordering, thus avoiding descriptor posting before
+ * descriptor is initialized. Otherwise, hardware can read
+ * stale descriptor fields.
+ */
+ wmb();
iowrite32(buf->index, &rq->ctrl->posted_index);
+ }
}
static inline void vnic_rq_return_descs(struct vnic_rq *rq, unsigned int count)