Эх сурвалжийг харах

crypto: caam - only query h/w in job ring dequeue path

Code was needlessly checking the s/w job ring when there
would be nothing to process if the h/w's output completion
ring were empty anyway.

Signed-off-by: Kim Phillips <kim.phillips@freescale.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Kim Phillips 13 жил өмнө
parent
commit
a8ea07c21d

+ 5 - 12
drivers/crypto/caam/jr.c

@@ -59,15 +59,15 @@ static void caam_jr_dequeue(unsigned long devarg)
 	u32 *userdesc, userstatus;
 	u32 *userdesc, userstatus;
 	void *userarg;
 	void *userarg;
 
 
-	spin_lock_bh(&jrp->outlock);
+	while (rd_reg32(&jrp->rregs->outring_used)) {
 
 
-	head = ACCESS_ONCE(jrp->head);
-	sw_idx = tail = jrp->tail;
+		head = ACCESS_ONCE(jrp->head);
 
 
-	while (CIRC_CNT(head, tail, JOBR_DEPTH) >= 1 &&
-	       rd_reg32(&jrp->rregs->outring_used)) {
+		spin_lock_bh(&jrp->outlock);
 
 
+		sw_idx = tail = jrp->tail;
 		hw_idx = jrp->out_ring_read_index;
 		hw_idx = jrp->out_ring_read_index;
+
 		for (i = 0; CIRC_CNT(head, tail + i, JOBR_DEPTH) >= 1; i++) {
 		for (i = 0; CIRC_CNT(head, tail + i, JOBR_DEPTH) >= 1; i++) {
 			sw_idx = (tail + i) & (JOBR_DEPTH - 1);
 			sw_idx = (tail + i) & (JOBR_DEPTH - 1);
 
 
@@ -121,15 +121,8 @@ static void caam_jr_dequeue(unsigned long devarg)
 
 
 		/* Finally, execute user's callback */
 		/* Finally, execute user's callback */
 		usercall(dev, userdesc, userstatus, userarg);
 		usercall(dev, userdesc, userstatus, userarg);
-
-		spin_lock_bh(&jrp->outlock);
-
-		head = ACCESS_ONCE(jrp->head);
-		sw_idx = tail = jrp->tail;
 	}
 	}
 
 
-	spin_unlock_bh(&jrp->outlock);
-
 	/* reenable / unmask IRQs */
 	/* reenable / unmask IRQs */
 	clrbits32(&jrp->rregs->rconfig_lo, JRCFG_IMSK);
 	clrbits32(&jrp->rregs->rconfig_lo, JRCFG_IMSK);
 }
 }