aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/nfc/pn533/usb.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/nfc/pn533/usb.c')
-rw-r--r--drivers/nfc/pn533/usb.c42
1 files changed, 30 insertions, 12 deletions
diff --git a/drivers/nfc/pn533/usb.c b/drivers/nfc/pn533/usb.c
index e153e8b64bb8..d5553c47014f 100644
--- a/drivers/nfc/pn533/usb.c
+++ b/drivers/nfc/pn533/usb.c
@@ -62,6 +62,9 @@ struct pn533_usb_phy {
62 struct urb *out_urb; 62 struct urb *out_urb;
63 struct urb *in_urb; 63 struct urb *in_urb;
64 64
65 struct urb *ack_urb;
66 u8 *ack_buffer;
67
65 struct pn533 *priv; 68 struct pn533 *priv;
66}; 69};
67 70
@@ -150,13 +153,16 @@ static int pn533_usb_send_ack(struct pn533 *dev, gfp_t flags)
150 struct pn533_usb_phy *phy = dev->phy; 153 struct pn533_usb_phy *phy = dev->phy;
151 static const u8 ack[6] = {0x00, 0x00, 0xff, 0x00, 0xff, 0x00}; 154 static const u8 ack[6] = {0x00, 0x00, 0xff, 0x00, 0xff, 0x00};
152 /* spec 7.1.1.3: Preamble, SoPC (2), ACK Code (2), Postamble */ 155 /* spec 7.1.1.3: Preamble, SoPC (2), ACK Code (2), Postamble */
153 int rc;
154 156
155 phy->out_urb->transfer_buffer = (u8 *)ack; 157 if (!phy->ack_buffer) {
156 phy->out_urb->transfer_buffer_length = sizeof(ack); 158 phy->ack_buffer = kmemdup(ack, sizeof(ack), flags);
157 rc = usb_submit_urb(phy->out_urb, flags); 159 if (!phy->ack_buffer)
160 return -ENOMEM;
161 }
158 162
159 return rc; 163 phy->ack_urb->transfer_buffer = phy->ack_buffer;
164 phy->ack_urb->transfer_buffer_length = sizeof(ack);
165 return usb_submit_urb(phy->ack_urb, flags);
160} 166}
161 167
162static int pn533_usb_send_frame(struct pn533 *dev, 168static int pn533_usb_send_frame(struct pn533 *dev,
@@ -375,26 +381,31 @@ static int pn533_acr122_poweron_rdr(struct pn533_usb_phy *phy)
375 /* Power on th reader (CCID cmd) */ 381 /* Power on th reader (CCID cmd) */
376 u8 cmd[10] = {PN533_ACR122_PC_TO_RDR_ICCPOWERON, 382 u8 cmd[10] = {PN533_ACR122_PC_TO_RDR_ICCPOWERON,
377 0, 0, 0, 0, 0, 0, 3, 0, 0}; 383 0, 0, 0, 0, 0, 0, 3, 0, 0};
384 char *buffer;
385 int transferred;
378 int rc; 386 int rc;
379 void *cntx; 387 void *cntx;
380 struct pn533_acr122_poweron_rdr_arg arg; 388 struct pn533_acr122_poweron_rdr_arg arg;
381 389
382 dev_dbg(&phy->udev->dev, "%s\n", __func__); 390 dev_dbg(&phy->udev->dev, "%s\n", __func__);
383 391
392 buffer = kmemdup(cmd, sizeof(cmd), GFP_KERNEL);
393 if (!buffer)
394 return -ENOMEM;
395
384 init_completion(&arg.done); 396 init_completion(&arg.done);
385 cntx = phy->in_urb->context; /* backup context */ 397 cntx = phy->in_urb->context; /* backup context */
386 398
387 phy->in_urb->complete = pn533_acr122_poweron_rdr_resp; 399 phy->in_urb->complete = pn533_acr122_poweron_rdr_resp;
388 phy->in_urb->context = &arg; 400 phy->in_urb->context = &arg;
389 401
390 phy->out_urb->transfer_buffer = cmd;
391 phy->out_urb->transfer_buffer_length = sizeof(cmd);
392
393 print_hex_dump_debug("ACR122 TX: ", DUMP_PREFIX_NONE, 16, 1, 402 print_hex_dump_debug("ACR122 TX: ", DUMP_PREFIX_NONE, 16, 1,
394 cmd, sizeof(cmd), false); 403 cmd, sizeof(cmd), false);
395 404
396 rc = usb_submit_urb(phy->out_urb, GFP_KERNEL); 405 rc = usb_bulk_msg(phy->udev, phy->out_urb->pipe, buffer, sizeof(cmd),
397 if (rc) { 406 &transferred, 0);
407 kfree(buffer);
408 if (rc || (transferred != sizeof(cmd))) {
398 nfc_err(&phy->udev->dev, 409 nfc_err(&phy->udev->dev,
399 "Reader power on cmd error %d\n", rc); 410 "Reader power on cmd error %d\n", rc);
400 return rc; 411 return rc;
@@ -490,8 +501,9 @@ static int pn533_usb_probe(struct usb_interface *interface,
490 501
491 phy->in_urb = usb_alloc_urb(0, GFP_KERNEL); 502 phy->in_urb = usb_alloc_urb(0, GFP_KERNEL);
492 phy->out_urb = usb_alloc_urb(0, GFP_KERNEL); 503 phy->out_urb = usb_alloc_urb(0, GFP_KERNEL);
504 phy->ack_urb = usb_alloc_urb(0, GFP_KERNEL);
493 505
494 if (!phy->in_urb || !phy->out_urb) 506 if (!phy->in_urb || !phy->out_urb || !phy->ack_urb)
495 goto error; 507 goto error;
496 508
497 usb_fill_bulk_urb(phy->in_urb, phy->udev, 509 usb_fill_bulk_urb(phy->in_urb, phy->udev,
@@ -501,7 +513,9 @@ static int pn533_usb_probe(struct usb_interface *interface,
501 usb_fill_bulk_urb(phy->out_urb, phy->udev, 513 usb_fill_bulk_urb(phy->out_urb, phy->udev,
502 usb_sndbulkpipe(phy->udev, out_endpoint), 514 usb_sndbulkpipe(phy->udev, out_endpoint),
503 NULL, 0, pn533_send_complete, phy); 515 NULL, 0, pn533_send_complete, phy);
504 516 usb_fill_bulk_urb(phy->ack_urb, phy->udev,
517 usb_sndbulkpipe(phy->udev, out_endpoint),
518 NULL, 0, pn533_send_complete, phy);
505 519
506 switch (id->driver_info) { 520 switch (id->driver_info) {
507 case PN533_DEVICE_STD: 521 case PN533_DEVICE_STD:
@@ -554,6 +568,7 @@ static int pn533_usb_probe(struct usb_interface *interface,
554error: 568error:
555 usb_free_urb(phy->in_urb); 569 usb_free_urb(phy->in_urb);
556 usb_free_urb(phy->out_urb); 570 usb_free_urb(phy->out_urb);
571 usb_free_urb(phy->ack_urb);
557 usb_put_dev(phy->udev); 572 usb_put_dev(phy->udev);
558 kfree(in_buf); 573 kfree(in_buf);
559 574
@@ -573,10 +588,13 @@ static void pn533_usb_disconnect(struct usb_interface *interface)
573 588
574 usb_kill_urb(phy->in_urb); 589 usb_kill_urb(phy->in_urb);
575 usb_kill_urb(phy->out_urb); 590 usb_kill_urb(phy->out_urb);
591 usb_kill_urb(phy->ack_urb);
576 592
577 kfree(phy->in_urb->transfer_buffer); 593 kfree(phy->in_urb->transfer_buffer);
578 usb_free_urb(phy->in_urb); 594 usb_free_urb(phy->in_urb);
579 usb_free_urb(phy->out_urb); 595 usb_free_urb(phy->out_urb);
596 usb_free_urb(phy->ack_urb);
597 kfree(phy->ack_buffer);
580 598
581 nfc_info(&interface->dev, "NXP PN533 NFC device disconnected\n"); 599 nfc_info(&interface->dev, "NXP PN533 NFC device disconnected\n");
582} 600}