summaryrefslogtreecommitdiff
path: root/drivers/nfc/port100.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/nfc/port100.c')
-rw-r--r--drivers/nfc/port100.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/drivers/nfc/port100.c b/drivers/nfc/port100.c
index 909e3df2c16a..481cb435e19f 100644
--- a/drivers/nfc/port100.c
+++ b/drivers/nfc/port100.c
@@ -472,6 +472,7 @@ struct port100 {
struct port100_cmd *cmd;
bool cmd_cancel;
+ struct completion cmd_cancel_done;
};
struct port100_cmd {
@@ -728,6 +729,8 @@ static int port100_send_ack(struct port100 *dev)
mutex_lock(&dev->out_urb_lock);
+ init_completion(&dev->cmd_cancel_done);
+
usb_kill_urb(dev->out_urb);
dev->out_urb->transfer_buffer = ack_frame;
@@ -742,6 +745,9 @@ static int port100_send_ack(struct port100 *dev)
mutex_unlock(&dev->out_urb_lock);
+ if (!rc)
+ wait_for_completion(&dev->cmd_cancel_done);
+
return rc;
}
@@ -921,7 +927,10 @@ static void port100_send_complete(struct urb *urb)
{
struct port100 *dev = urb->context;
- dev->cmd_cancel = false;
+ if (dev->cmd_cancel) {
+ dev->cmd_cancel = false;
+ complete(&dev->cmd_cancel_done);
+ }
switch (urb->status) {
case 0: