summaryrefslogtreecommitdiff
path: root/drivers/infiniband/hw/qib/qib_iba7220.c
diff options
context:
space:
mode:
authorRam Vepa <ram.vepa@qlogic.com>2011-12-23 17:01:43 +0400
committerRoland Dreier <roland@purestorage.com>2012-01-04 08:53:02 +0400
commiteddfb675256f49d14e8c5763098afe3eb2c93701 (patch)
treefefe361432c162a48f98076f7156920e083c42fb /drivers/infiniband/hw/qib/qib_iba7220.c
parent8482d5d1bc18c17429a89ad37f8b74d5a16de239 (diff)
downloadlinux-eddfb675256f49d14e8c5763098afe3eb2c93701.tar.xz
IB/qib: Fix a possible data corruption when receiving packets
Prevent a receive data corruption by ensuring that the write to update the rcvhdrheadn register to generate an interrupt is at the very end of the receive processing. Signed-off-by: Ramkrishna Vepa <ram.vepa@qlogic.com> Signed-off-by: Mike Marciniszyn <mike.marciniszyn@qlogic.com> Cc: <stable@kernel.org> Signed-off-by: Roland Dreier <roland@purestorage.com>
Diffstat (limited to 'drivers/infiniband/hw/qib/qib_iba7220.c')
-rw-r--r--drivers/infiniband/hw/qib/qib_iba7220.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/drivers/infiniband/hw/qib/qib_iba7220.c b/drivers/infiniband/hw/qib/qib_iba7220.c
index 9dd886cc633a..3c722f79d6f6 100644
--- a/drivers/infiniband/hw/qib/qib_iba7220.c
+++ b/drivers/infiniband/hw/qib/qib_iba7220.c
@@ -2725,9 +2725,11 @@ static int qib_7220_set_loopback(struct qib_pportdata *ppd, const char *what)
static void qib_update_7220_usrhead(struct qib_ctxtdata *rcd, u64 hd,
u32 updegr, u32 egrhd, u32 npkts)
{
- qib_write_ureg(rcd->dd, ur_rcvhdrhead, hd, rcd->ctxt);
if (updegr)
qib_write_ureg(rcd->dd, ur_rcvegrindexhead, egrhd, rcd->ctxt);
+ mmiowb();
+ qib_write_ureg(rcd->dd, ur_rcvhdrhead, hd, rcd->ctxt);
+ mmiowb();
}
static u32 qib_7220_hdrqempty(struct qib_ctxtdata *rcd)