hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/nfc/pn533/usb.c
....@@ -153,10 +153,17 @@
153153 return usb_submit_urb(phy->ack_urb, flags);
154154 }
155155
156
+struct pn533_out_arg {
157
+ struct pn533_usb_phy *phy;
158
+ struct completion done;
159
+};
160
+
156161 static int pn533_usb_send_frame(struct pn533 *dev,
157162 struct sk_buff *out)
158163 {
159164 struct pn533_usb_phy *phy = dev->phy;
165
+ struct pn533_out_arg arg;
166
+ void *cntx;
160167 int rc;
161168
162169 if (phy->priv == NULL)
....@@ -168,9 +175,17 @@
168175 print_hex_dump_debug("PN533 TX: ", DUMP_PREFIX_NONE, 16, 1,
169176 out->data, out->len, false);
170177
178
+ arg.phy = phy;
179
+ init_completion(&arg.done);
180
+ cntx = phy->out_urb->context;
181
+ phy->out_urb->context = &arg;
182
+
171183 rc = usb_submit_urb(phy->out_urb, GFP_KERNEL);
172184 if (rc)
173185 return rc;
186
+
187
+ wait_for_completion(&arg.done);
188
+ phy->out_urb->context = cntx;
174189
175190 if (dev->protocol_type == PN533_PROTO_REQ_RESP) {
176191 /* request for response for sent packet directly */
....@@ -412,7 +427,31 @@
412427 return arg.rc;
413428 }
414429
415
-static void pn533_send_complete(struct urb *urb)
430
+static void pn533_out_complete(struct urb *urb)
431
+{
432
+ struct pn533_out_arg *arg = urb->context;
433
+ struct pn533_usb_phy *phy = arg->phy;
434
+
435
+ switch (urb->status) {
436
+ case 0:
437
+ break; /* success */
438
+ case -ECONNRESET:
439
+ case -ENOENT:
440
+ dev_dbg(&phy->udev->dev,
441
+ "The urb has been stopped (status %d)\n",
442
+ urb->status);
443
+ break;
444
+ case -ESHUTDOWN:
445
+ default:
446
+ nfc_err(&phy->udev->dev,
447
+ "Urb failure (status %d)\n",
448
+ urb->status);
449
+ }
450
+
451
+ complete(&arg->done);
452
+}
453
+
454
+static void pn533_ack_complete(struct urb *urb)
416455 {
417456 struct pn533_usb_phy *phy = urb->context;
418457
....@@ -500,10 +539,10 @@
500539
501540 usb_fill_bulk_urb(phy->out_urb, phy->udev,
502541 usb_sndbulkpipe(phy->udev, out_endpoint),
503
- NULL, 0, pn533_send_complete, phy);
542
+ NULL, 0, pn533_out_complete, phy);
504543 usb_fill_bulk_urb(phy->ack_urb, phy->udev,
505544 usb_sndbulkpipe(phy->udev, out_endpoint),
506
- NULL, 0, pn533_send_complete, phy);
545
+ NULL, 0, pn533_ack_complete, phy);
507546
508547 switch (id->driver_info) {
509548 case PN533_DEVICE_STD: