Bladeren bron

GenWQE: Add wmb before DDCB is started

Needed to add wmb() before we send the DDCB for execution.
Without the syncronizing it failed on System p.

Signed-off-by: Frank Haverkamp <haver@linux.vnet.ibm.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Frank Haverkamp 11 jaren geleden
bovenliggende
commit
68fe8acc20
1 gewijzigde bestanden met toevoegingen van 4 en 0 verwijderingen
  1. 4 0
      drivers/misc/genwqe/card_ddcb.c

+ 4 - 0
drivers/misc/genwqe/card_ddcb.c

@@ -305,6 +305,8 @@ static int enqueue_ddcb(struct genwqe_dev *cd, struct ddcb_queue *queue,
 			break;
 			break;
 
 
 		new = (old | DDCB_NEXT_BE32);
 		new = (old | DDCB_NEXT_BE32);
+
+		wmb();
 		icrc_hsi_shi = cmpxchg(&prev_ddcb->icrc_hsi_shi_32, old, new);
 		icrc_hsi_shi = cmpxchg(&prev_ddcb->icrc_hsi_shi_32, old, new);
 
 
 		if (icrc_hsi_shi == old)
 		if (icrc_hsi_shi == old)
@@ -314,6 +316,8 @@ static int enqueue_ddcb(struct genwqe_dev *cd, struct ddcb_queue *queue,
 	/* Queue must be re-started by updating QUEUE_OFFSET */
 	/* Queue must be re-started by updating QUEUE_OFFSET */
 	ddcb_mark_tapped(pddcb);
 	ddcb_mark_tapped(pddcb);
 	num = (u64)ddcb_no << 8;
 	num = (u64)ddcb_no << 8;
+
+	wmb();
 	__genwqe_writeq(cd, queue->IO_QUEUE_OFFSET, num); /* start queue */
 	__genwqe_writeq(cd, queue->IO_QUEUE_OFFSET, num); /* start queue */
 
 
 	return RET_DDCB_TAPPED;
 	return RET_DDCB_TAPPED;