mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-03 09:41:54 +09:00
usb: chipidea: need to mask when writting endptflush and endptprime
commit 5bf5dbeda2 upstream.
ENDPTFLUSH and ENDPTPRIME registers are set by software and clear
by hardware. There is a bit for each endpoint. When we are setting
a bit for an endpoint we should make sure we do not touch other
endpoint bit. There is a race condition if the hardware clear the
bit between the read and the write in hw_write.
Signed-off-by: Peter Chen <peter.chen@freescale.com>
Signed-off-by: Matthieu CASTET <matthieu.castet@parrot.com>
Tested-by: Michael Grzeschik <mgrzeschik@pengutronix.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
2551dadbe3
commit
4ebd089823
@@ -103,7 +103,7 @@ static int hw_ep_flush(struct ci13xxx *ci, int num, int dir)
|
||||
|
||||
do {
|
||||
/* flush any pending transfer */
|
||||
hw_write(ci, OP_ENDPTFLUSH, BIT(n), BIT(n));
|
||||
hw_write(ci, OP_ENDPTFLUSH, ~0, BIT(n));
|
||||
while (hw_read(ci, OP_ENDPTFLUSH, BIT(n)))
|
||||
cpu_relax();
|
||||
} while (hw_read(ci, OP_ENDPTSTAT, BIT(n)));
|
||||
@@ -203,7 +203,7 @@ static int hw_ep_prime(struct ci13xxx *ci, int num, int dir, int is_ctrl)
|
||||
if (is_ctrl && dir == RX && hw_read(ci, OP_ENDPTSETUPSTAT, BIT(num)))
|
||||
return -EAGAIN;
|
||||
|
||||
hw_write(ci, OP_ENDPTPRIME, BIT(n), BIT(n));
|
||||
hw_write(ci, OP_ENDPTPRIME, ~0, BIT(n));
|
||||
|
||||
while (hw_read(ci, OP_ENDPTPRIME, BIT(n)))
|
||||
cpu_relax();
|
||||
|
||||
Reference in New Issue
Block a user