scsi: qedf: Correct the memory barriers in qedf_ring_doorbell
authorAndrew Vasquez <andrewv@marvell.com>
Tue, 26 Mar 2019 07:38:40 +0000 (00:38 -0700)
committerMartin K. Petersen <martin.petersen@oracle.com>
Thu, 28 Mar 2019 01:54:52 +0000 (21:54 -0400)
 - Correct memory barriers to make sure all cmnds are flushed.

Signed-off-by: Andrew Vasquez <andrewv@marvell.com>
Signed-off-by: Saurav Kashyap <skashyap@marvell.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/qedf/qedf_io.c

index 58257ec..ab67056 100644 (file)
@@ -773,10 +773,18 @@ void qedf_ring_doorbell(struct qedf_rport *fcport)
            FCOE_DB_DATA_AGG_VAL_SEL_SHIFT;
 
        dbell.sq_prod = fcport->fw_sq_prod_idx;
+       /* wmb makes sure that the BDs data is updated before updating the
+        * producer, otherwise FW may read old data from the BDs.
+        */
+       wmb();
+       barrier();
        writel(*(u32 *)&dbell, fcport->p_doorbell);
-       /* Make sure SQ index is updated so f/w prcesses requests in order */
+       /*
+        * Fence required to flush the write combined buffer, since another
+        * CPU may write to the same doorbell address and data may be lost
+        * due to relaxed order nature of write combined bar.
+        */
        wmb();
-       mmiowb();
 }
 
 static void qedf_trace_io(struct qedf_rport *fcport, struct qedf_ioreq *io_req,