diff options
author | Ram Vepa <ram.vepa@qlogic.com> | 2011-12-23 08:01:43 -0500 |
---|---|---|
committer | Roland Dreier <roland@purestorage.com> | 2012-01-03 20:53:02 -0800 |
commit | eddfb675256f49d14e8c5763098afe3eb2c93701 (patch) | |
tree | fefe361432c162a48f98076f7156920e083c42fb /drivers/infiniband/hw/qib/qib_iba7322.c | |
parent | 8482d5d1bc18c17429a89ad37f8b74d5a16de239 (diff) | |
download | linux-eddfb675256f49d14e8c5763098afe3eb2c93701.tar.gz linux-eddfb675256f49d14e8c5763098afe3eb2c93701.tar.bz2 linux-eddfb675256f49d14e8c5763098afe3eb2c93701.zip |
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_iba7322.c')
-rw-r--r-- | drivers/infiniband/hw/qib/qib_iba7322.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/drivers/infiniband/hw/qib/qib_iba7322.c b/drivers/infiniband/hw/qib/qib_iba7322.c index abd218d429fe..e22735402649 100644 --- a/drivers/infiniband/hw/qib/qib_iba7322.c +++ b/drivers/infiniband/hw/qib/qib_iba7322.c @@ -4083,10 +4083,12 @@ static void qib_update_7322_usrhead(struct qib_ctxtdata *rcd, u64 hd, */ if (hd >> IBA7322_HDRHEAD_PKTINT_SHIFT) adjust_rcv_timeout(rcd, npkts); - qib_write_ureg(rcd->dd, ur_rcvhdrhead, hd, rcd->ctxt); - 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); + qib_write_ureg(rcd->dd, ur_rcvhdrhead, hd, rcd->ctxt); + mmiowb(); } static u32 qib_7322_hdrqempty(struct qib_ctxtdata *rcd) |