aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/nfc
diff options
context:
space:
mode:
authorWaldemar Rymarkiewicz <waldemar.rymarkiewicz@tieto.com>2012-12-10 08:43:01 -0500
committerSamuel Ortiz <sameo@linux.intel.com>2013-01-09 18:51:46 -0500
commit9e2d493e74aca105aa86de56dbf80a0a654c4c53 (patch)
tree436aa3c11503d8a8469ed6f9ad283415f7bc12d1 /drivers/nfc
parent16f7541914e8bee0e76c510c4d8bc5ad8a5edf00 (diff)
NFC: pn533: Introduce ops for frame logic
Encapsulate whole frame logic (tx/rx frame structure and size) inside the ops structure to make the core driver generic for devices which handle frames in non standard menner (different then pn533 spec say). Signed-off-by: Waldemar Rymarkiewicz <waldemar.rymarkiewicz@tieto.com> Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
Diffstat (limited to 'drivers/nfc')
-rw-r--r--drivers/nfc/pn533.c208
1 files changed, 135 insertions, 73 deletions
diff --git a/drivers/nfc/pn533.c b/drivers/nfc/pn533.c
index 58f7f2cc6ae9..e8c083203b33 100644
--- a/drivers/nfc/pn533.c
+++ b/drivers/nfc/pn533.c
@@ -79,9 +79,6 @@ MODULE_DEVICE_TABLE(usb, pn533_table);
79#define PN533_LISTEN_TIME 2 79#define PN533_LISTEN_TIME 2
80 80
81/* frame definitions */ 81/* frame definitions */
82#define PN533_NORMAL_FRAME_MAX_LEN 262 /* 6 (PREAMBLE, SOF, LEN, LCS, TFI)
83 254 (DATA)
84 2 (DCS, postamble) */
85#define PN533_FRAME_HEADER_LEN (sizeof(struct pn533_frame) \ 82#define PN533_FRAME_HEADER_LEN (sizeof(struct pn533_frame) \
86 + 2) /* data[0] TFI, data[1] CC */ 83 + 2) /* data[0] TFI, data[1] CC */
87#define PN533_FRAME_TAIL_LEN 2 /* data[len] DCS, data[len + 1] postamble*/ 84#define PN533_FRAME_TAIL_LEN 2 /* data[len] DCS, data[len + 1] postamble*/
@@ -92,8 +89,6 @@ MODULE_DEVICE_TABLE(usb, pn533_table);
92 */ 89 */
93#define PN533_FRAME_MAX_PAYLOAD_LEN 263 90#define PN533_FRAME_MAX_PAYLOAD_LEN 263
94 91
95#define PN533_FRAME_SIZE(f) (sizeof(struct pn533_frame) + f->datalen + \
96 PN533_FRAME_TAIL_LEN)
97#define PN533_FRAME_ACK_SIZE 6 /* Preamble (1), SoPC (2), ACK Code (2), 92#define PN533_FRAME_ACK_SIZE 6 /* Preamble (1), SoPC (2), ACK Code (2),
98 Postamble (1) */ 93 Postamble (1) */
99#define PN533_FRAME_CHECKSUM(f) (f->data[f->datalen]) 94#define PN533_FRAME_CHECKSUM(f) (f->data[f->datalen])
@@ -361,6 +356,8 @@ struct pn533 {
361 356
362 struct list_head cmd_queue; 357 struct list_head cmd_queue;
363 u8 cmd_pending; 358 u8 cmd_pending;
359
360 struct pn533_frame_ops *ops;
364}; 361};
365 362
366struct pn533_cmd { 363struct pn533_cmd {
@@ -368,6 +365,7 @@ struct pn533_cmd {
368 u8 cmd_code; 365 u8 cmd_code;
369 struct sk_buff *req; 366 struct sk_buff *req;
370 struct sk_buff *resp; 367 struct sk_buff *resp;
368 int resp_len;
371 void *arg; 369 void *arg;
372}; 370};
373 371
@@ -379,6 +377,22 @@ struct pn533_frame {
379 u8 data[]; 377 u8 data[];
380} __packed; 378} __packed;
381 379
380struct pn533_frame_ops {
381 void (*tx_frame_init)(void *frame, u8 cmd_code);
382 void (*tx_frame_finish)(void *frame);
383 void (*tx_update_payload_len)(void *frame, int len);
384 int tx_header_len;
385 int tx_tail_len;
386
387 bool (*rx_is_frame_valid)(void *frame);
388 int (*rx_frame_size)(void *frame);
389 int rx_header_len;
390 int rx_tail_len;
391
392 int max_payload_len;
393 u8 (*get_cmd_code)(void *frame);
394};
395
382/* The rule: value + checksum = 0 */ 396/* The rule: value + checksum = 0 */
383static inline u8 pn533_checksum(u8 value) 397static inline u8 pn533_checksum(u8 value)
384{ 398{
@@ -397,17 +411,21 @@ static u8 pn533_data_checksum(u8 *data, int datalen)
397 return pn533_checksum(sum); 411 return pn533_checksum(sum);
398} 412}
399 413
400static void pn533_tx_frame_init(struct pn533_frame *frame, u8 cmd) 414static void pn533_tx_frame_init(void *_frame, u8 cmd_code)
401{ 415{
416 struct pn533_frame *frame = _frame;
417
402 frame->preamble = 0; 418 frame->preamble = 0;
403 frame->start_frame = cpu_to_be16(PN533_SOF); 419 frame->start_frame = cpu_to_be16(PN533_SOF);
404 PN533_FRAME_IDENTIFIER(frame) = PN533_DIR_OUT; 420 PN533_FRAME_IDENTIFIER(frame) = PN533_DIR_OUT;
405 PN533_FRAME_CMD(frame) = cmd; 421 PN533_FRAME_CMD(frame) = cmd_code;
406 frame->datalen = 2; 422 frame->datalen = 2;
407} 423}
408 424
409static void pn533_tx_frame_finish(struct pn533_frame *frame) 425static void pn533_tx_frame_finish(void *_frame)
410{ 426{
427 struct pn533_frame *frame = _frame;
428
411 frame->datalen_checksum = pn533_checksum(frame->datalen); 429 frame->datalen_checksum = pn533_checksum(frame->datalen);
412 430
413 PN533_FRAME_CHECKSUM(frame) = 431 PN533_FRAME_CHECKSUM(frame) =
@@ -416,9 +434,17 @@ static void pn533_tx_frame_finish(struct pn533_frame *frame)
416 PN533_FRAME_POSTAMBLE(frame) = 0; 434 PN533_FRAME_POSTAMBLE(frame) = 0;
417} 435}
418 436
419static bool pn533_rx_frame_is_valid(struct pn533_frame *frame) 437static void pn533_tx_update_payload_len(void *_frame, int len)
438{
439 struct pn533_frame *frame = _frame;
440
441 frame->datalen += len;
442}
443
444static bool pn533_rx_frame_is_valid(void *_frame)
420{ 445{
421 u8 checksum; 446 u8 checksum;
447 struct pn533_frame *frame = _frame;
422 448
423 if (frame->start_frame != cpu_to_be16(PN533_SOF)) 449 if (frame->start_frame != cpu_to_be16(PN533_SOF))
424 return false; 450 return false;
@@ -445,9 +471,39 @@ static bool pn533_rx_frame_is_ack(struct pn533_frame *frame)
445 return true; 471 return true;
446} 472}
447 473
448static bool pn533_rx_frame_is_cmd_response(struct pn533_frame *frame, u8 cmd) 474static inline int pn533_rx_frame_size(void *frame)
475{
476 struct pn533_frame *f = frame;
477
478 return sizeof(struct pn533_frame) + f->datalen + PN533_FRAME_TAIL_LEN;
479}
480
481static u8 pn533_get_cmd_code(void *frame)
482{
483 struct pn533_frame *f = frame;
484
485 return PN533_FRAME_CMD(f);
486}
487
488struct pn533_frame_ops pn533_std_frame_ops = {
489 .tx_frame_init = pn533_tx_frame_init,
490 .tx_frame_finish = pn533_tx_frame_finish,
491 .tx_update_payload_len = pn533_tx_update_payload_len,
492 .tx_header_len = PN533_FRAME_HEADER_LEN,
493 .tx_tail_len = PN533_FRAME_TAIL_LEN,
494
495 .rx_is_frame_valid = pn533_rx_frame_is_valid,
496 .rx_frame_size = pn533_rx_frame_size,
497 .rx_header_len = PN533_FRAME_HEADER_LEN,
498 .rx_tail_len = PN533_FRAME_TAIL_LEN,
499
500 .max_payload_len = PN533_FRAME_MAX_PAYLOAD_LEN,
501 .get_cmd_code = pn533_get_cmd_code,
502};
503
504static bool pn533_rx_frame_is_cmd_response(struct pn533 *dev, void *frame)
449{ 505{
450 return (PN533_FRAME_CMD(frame) == PN533_CMD_RESPONSE(cmd)); 506 return (dev->ops->get_cmd_code(frame) == PN533_CMD_RESPONSE(dev->cmd));
451} 507}
452 508
453 509
@@ -464,7 +520,7 @@ static void pn533_wq_cmd_complete(struct work_struct *work)
464static void pn533_recv_response(struct urb *urb) 520static void pn533_recv_response(struct urb *urb)
465{ 521{
466 struct pn533 *dev = urb->context; 522 struct pn533 *dev = urb->context;
467 struct pn533_frame *in_frame; 523 u8 *in_frame;
468 524
469 switch (urb->status) { 525 switch (urb->status) {
470 case 0: 526 case 0:
@@ -489,15 +545,15 @@ static void pn533_recv_response(struct urb *urb)
489 545
490 nfc_dev_dbg(&dev->interface->dev, "Received a frame."); 546 nfc_dev_dbg(&dev->interface->dev, "Received a frame.");
491 print_hex_dump(KERN_DEBUG, "PN533 RX: ", DUMP_PREFIX_NONE, 16, 1, 547 print_hex_dump(KERN_DEBUG, "PN533 RX: ", DUMP_PREFIX_NONE, 16, 1,
492 in_frame, PN533_FRAME_SIZE(in_frame), false); 548 in_frame, dev->ops->rx_frame_size(in_frame), false);
493 549
494 if (!pn533_rx_frame_is_valid(in_frame)) { 550 if (!dev->ops->rx_is_frame_valid(in_frame)) {
495 nfc_dev_err(&dev->interface->dev, "Received an invalid frame"); 551 nfc_dev_err(&dev->interface->dev, "Received an invalid frame");
496 dev->wq_in_error = -EIO; 552 dev->wq_in_error = -EIO;
497 goto sched_wq; 553 goto sched_wq;
498 } 554 }
499 555
500 if (!pn533_rx_frame_is_cmd_response(in_frame, dev->cmd)) { 556 if (!pn533_rx_frame_is_cmd_response(dev, in_frame)) {
501 nfc_dev_err(&dev->interface->dev, 557 nfc_dev_err(&dev->interface->dev,
502 "It it not the response to the last command"); 558 "It it not the response to the last command");
503 dev->wq_in_error = -EIO; 559 dev->wq_in_error = -EIO;
@@ -595,7 +651,7 @@ static int __pn533_send_frame_async(struct pn533 *dev,
595{ 651{
596 int rc; 652 int rc;
597 653
598 dev->cmd = PN533_FRAME_CMD(((struct pn533_frame *)out->data)); 654 dev->cmd = dev->ops->get_cmd_code(out->data);
599 dev->cmd_complete = cmd_complete; 655 dev->cmd_complete = cmd_complete;
600 dev->cmd_complete_arg = arg; 656 dev->cmd_complete_arg = arg;
601 657
@@ -623,20 +679,20 @@ error:
623 return rc; 679 return rc;
624} 680}
625 681
626static void pn533_build_cmd_frame(u8 cmd_code, struct sk_buff *skb) 682static void pn533_build_cmd_frame(struct pn533 *dev, u8 cmd_code,
683 struct sk_buff *skb)
627{ 684{
628 struct pn533_frame *frame;
629 /* payload is already there, just update datalen */ 685 /* payload is already there, just update datalen */
630 int payload_len = skb->len; 686 int payload_len = skb->len;
687 struct pn533_frame_ops *ops = dev->ops;
631 688
632 skb_push(skb, PN533_FRAME_HEADER_LEN);
633 skb_put(skb, PN533_FRAME_TAIL_LEN);
634 689
635 frame = (struct pn533_frame *)skb->data; 690 skb_push(skb, ops->tx_header_len);
691 skb_put(skb, ops->tx_tail_len);
636 692
637 pn533_tx_frame_init(frame, cmd_code); 693 ops->tx_frame_init(skb->data, cmd_code);
638 frame->datalen += payload_len; 694 ops->tx_update_payload_len(skb->data, payload_len);
639 pn533_tx_frame_finish(frame); 695 ops->tx_frame_finish(skb->data);
640} 696}
641 697
642struct pn533_send_async_complete_arg { 698struct pn533_send_async_complete_arg {
@@ -653,7 +709,6 @@ static int pn533_send_async_complete(struct pn533 *dev, void *_arg, int status)
653 struct sk_buff *req = arg->req; 709 struct sk_buff *req = arg->req;
654 struct sk_buff *resp = arg->resp; 710 struct sk_buff *resp = arg->resp;
655 711
656 struct pn533_frame *frame = (struct pn533_frame *)resp->data;
657 int rc; 712 int rc;
658 713
659 dev_kfree_skb(req); 714 dev_kfree_skb(req);
@@ -666,9 +721,9 @@ static int pn533_send_async_complete(struct pn533 *dev, void *_arg, int status)
666 return status; 721 return status;
667 } 722 }
668 723
669 skb_put(resp, PN533_FRAME_SIZE(frame)); 724 skb_put(resp, dev->ops->rx_frame_size(resp->data));
670 skb_pull(resp, PN533_FRAME_HEADER_LEN); 725 skb_pull(resp, dev->ops->rx_header_len);
671 skb_trim(resp, resp->len - PN533_FRAME_TAIL_LEN); 726 skb_trim(resp, resp->len - dev->ops->rx_tail_len);
672 727
673 rc = arg->complete_cb(dev, arg->complete_cb_context, resp); 728 rc = arg->complete_cb(dev, arg->complete_cb_context, resp);
674 729
@@ -697,7 +752,7 @@ static int __pn533_send_async(struct pn533 *dev, u8 cmd_code,
697 arg->resp = resp; 752 arg->resp = resp;
698 arg->req = req; 753 arg->req = req;
699 754
700 pn533_build_cmd_frame(cmd_code, req); 755 pn533_build_cmd_frame(dev, cmd_code, req);
701 756
702 mutex_lock(&dev->cmd_lock); 757 mutex_lock(&dev->cmd_lock);
703 758
@@ -724,6 +779,7 @@ static int __pn533_send_async(struct pn533 *dev, u8 cmd_code,
724 cmd->cmd_code = cmd_code; 779 cmd->cmd_code = cmd_code;
725 cmd->req = req; 780 cmd->req = req;
726 cmd->resp = resp; 781 cmd->resp = resp;
782 cmd->resp_len = resp_len;
727 cmd->arg = arg; 783 cmd->arg = arg;
728 784
729 list_add_tail(&cmd->queue, &dev->cmd_queue); 785 list_add_tail(&cmd->queue, &dev->cmd_queue);
@@ -744,9 +800,9 @@ static int pn533_send_data_async(struct pn533 *dev, u8 cmd_code,
744{ 800{
745 struct sk_buff *resp; 801 struct sk_buff *resp;
746 int rc; 802 int rc;
747 int resp_len = PN533_FRAME_HEADER_LEN + 803 int resp_len = dev->ops->rx_header_len +
748 PN533_FRAME_MAX_PAYLOAD_LEN + 804 dev->ops->max_payload_len +
749 PN533_FRAME_TAIL_LEN; 805 dev->ops->rx_tail_len;
750 806
751 resp = nfc_alloc_recv_skb(resp_len, GFP_KERNEL); 807 resp = nfc_alloc_recv_skb(resp_len, GFP_KERNEL);
752 if (!resp) 808 if (!resp)
@@ -767,14 +823,16 @@ static int pn533_send_cmd_async(struct pn533 *dev, u8 cmd_code,
767{ 823{
768 struct sk_buff *resp; 824 struct sk_buff *resp;
769 int rc; 825 int rc;
826 int resp_len = dev->ops->rx_header_len +
827 dev->ops->max_payload_len +
828 dev->ops->rx_tail_len;
770 829
771 resp = alloc_skb(PN533_NORMAL_FRAME_MAX_LEN, GFP_KERNEL); 830 resp = alloc_skb(resp_len, GFP_KERNEL);
772 if (!resp) 831 if (!resp)
773 return -ENOMEM; 832 return -ENOMEM;
774 833
775 rc = __pn533_send_async(dev, cmd_code, req, resp, 834 rc = __pn533_send_async(dev, cmd_code, req, resp, resp_len, complete_cb,
776 PN533_NORMAL_FRAME_MAX_LEN, 835 complete_cb_context);
777 complete_cb, complete_cb_context);
778 if (rc) 836 if (rc)
779 dev_kfree_skb(resp); 837 dev_kfree_skb(resp);
780 838
@@ -797,9 +855,9 @@ static int pn533_send_cmd_direct_async(struct pn533 *dev, u8 cmd_code,
797 struct pn533_send_async_complete_arg *arg; 855 struct pn533_send_async_complete_arg *arg;
798 struct sk_buff *resp; 856 struct sk_buff *resp;
799 int rc; 857 int rc;
800 int resp_len = PN533_FRAME_HEADER_LEN + 858 int resp_len = dev->ops->rx_header_len +
801 PN533_FRAME_MAX_PAYLOAD_LEN + 859 dev->ops->max_payload_len +
802 PN533_FRAME_TAIL_LEN; 860 dev->ops->rx_tail_len;
803 861
804 resp = alloc_skb(resp_len, GFP_KERNEL); 862 resp = alloc_skb(resp_len, GFP_KERNEL);
805 if (!resp) 863 if (!resp)
@@ -816,7 +874,7 @@ static int pn533_send_cmd_direct_async(struct pn533 *dev, u8 cmd_code,
816 arg->resp = resp; 874 arg->resp = resp;
817 arg->req = req; 875 arg->req = req;
818 876
819 pn533_build_cmd_frame(cmd_code, req); 877 pn533_build_cmd_frame(dev, cmd_code, req);
820 878
821 rc = __pn533_send_frame_async(dev, req, resp, resp_len, 879 rc = __pn533_send_frame_async(dev, req, resp, resp_len,
822 pn533_send_async_complete, arg); 880 pn533_send_async_complete, arg);
@@ -847,10 +905,8 @@ static void pn533_wq_cmd(struct work_struct *work)
847 905
848 mutex_unlock(&dev->cmd_lock); 906 mutex_unlock(&dev->cmd_lock);
849 907
850 __pn533_send_frame_async(dev, cmd->req, cmd->resp, 908 __pn533_send_frame_async(dev, cmd->req, cmd->resp, cmd->resp_len,
851 PN533_NORMAL_FRAME_MAX_LEN, 909 pn533_send_async_complete, cmd->arg);
852 pn533_send_async_complete,
853 cmd->arg);
854 910
855 kfree(cmd); 911 kfree(cmd);
856} 912}
@@ -928,16 +984,16 @@ static void pn533_send_complete(struct urb *urb)
928 } 984 }
929} 985}
930 986
931static struct sk_buff *pn533_alloc_skb(unsigned int size) 987static struct sk_buff *pn533_alloc_skb(struct pn533 *dev, unsigned int size)
932{ 988{
933 struct sk_buff *skb; 989 struct sk_buff *skb;
934 990
935 skb = alloc_skb(PN533_FRAME_HEADER_LEN + 991 skb = alloc_skb(dev->ops->tx_header_len +
936 size + 992 size +
937 PN533_FRAME_TAIL_LEN, GFP_KERNEL); 993 dev->ops->tx_tail_len, GFP_KERNEL);
938 994
939 if (skb) 995 if (skb)
940 skb_reserve(skb, PN533_FRAME_HEADER_LEN); 996 skb_reserve(skb, dev->ops->tx_header_len);
941 997
942 return skb; 998 return skb;
943} 999}
@@ -1297,11 +1353,14 @@ static int pn533_start_poll_complete(struct pn533 *dev, struct sk_buff *resp)
1297 return -EAGAIN; 1353 return -EAGAIN;
1298} 1354}
1299 1355
1300static struct sk_buff *pn533_alloc_poll_tg_frame(u8 *gbytes, size_t gbytes_len) 1356static struct sk_buff *pn533_alloc_poll_tg_frame(struct pn533 *dev)
1301{ 1357{
1302 struct sk_buff *skb; 1358 struct sk_buff *skb;
1303 u8 *felica, *nfcid3, *gb; 1359 u8 *felica, *nfcid3, *gb;
1304 1360
1361 u8 *gbytes = dev->gb;
1362 size_t gbytes_len = dev->gb_len;
1363
1305 u8 felica_params[18] = {0x1, 0xfe, /* DEP */ 1364 u8 felica_params[18] = {0x1, 0xfe, /* DEP */
1306 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* random */ 1365 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* random */
1307 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 1366 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
@@ -1316,7 +1375,7 @@ static struct sk_buff *pn533_alloc_poll_tg_frame(u8 *gbytes, size_t gbytes_len)
1316 gbytes_len + 1375 gbytes_len +
1317 1; /* len Tk*/ 1376 1; /* len Tk*/
1318 1377
1319 skb = pn533_alloc_skb(skb_len); 1378 skb = pn533_alloc_skb(dev, skb_len);
1320 if (!skb) 1379 if (!skb)
1321 return NULL; 1380 return NULL;
1322 1381
@@ -1382,7 +1441,7 @@ static void pn533_wq_tg_get_data(struct work_struct *work)
1382 1441
1383 nfc_dev_dbg(&dev->interface->dev, "%s", __func__); 1442 nfc_dev_dbg(&dev->interface->dev, "%s", __func__);
1384 1443
1385 skb = pn533_alloc_skb(0); 1444 skb = pn533_alloc_skb(dev, 0);
1386 if (!skb) 1445 if (!skb)
1387 return; 1446 return;
1388 1447
@@ -1507,12 +1566,12 @@ stop_poll:
1507 return rc; 1566 return rc;
1508} 1567}
1509 1568
1510static struct sk_buff *pn533_alloc_poll_in_frame(struct pn533_poll_modulations 1569static struct sk_buff *pn533_alloc_poll_in_frame(struct pn533 *dev,
1511 *mod) 1570 struct pn533_poll_modulations *mod)
1512{ 1571{
1513 struct sk_buff *skb; 1572 struct sk_buff *skb;
1514 1573
1515 skb = pn533_alloc_skb(mod->len); 1574 skb = pn533_alloc_skb(dev, mod->len);
1516 if (!skb) 1575 if (!skb)
1517 return NULL; 1576 return NULL;
1518 1577
@@ -1535,10 +1594,10 @@ static int pn533_send_poll_frame(struct pn533 *dev)
1535 1594
1536 if (mod->len == 0) { /* Listen mode */ 1595 if (mod->len == 0) { /* Listen mode */
1537 cmd_code = PN533_CMD_TG_INIT_AS_TARGET; 1596 cmd_code = PN533_CMD_TG_INIT_AS_TARGET;
1538 skb = pn533_alloc_poll_tg_frame(dev->gb, dev->gb_len); 1597 skb = pn533_alloc_poll_tg_frame(dev);
1539 } else { /* Polling mode */ 1598 } else { /* Polling mode */
1540 cmd_code = PN533_CMD_IN_LIST_PASSIVE_TARGET; 1599 cmd_code = PN533_CMD_IN_LIST_PASSIVE_TARGET;
1541 skb = pn533_alloc_poll_in_frame(mod); 1600 skb = pn533_alloc_poll_in_frame(dev, mod);
1542 } 1601 }
1543 1602
1544 if (!skb) { 1603 if (!skb) {
@@ -1652,7 +1711,7 @@ static int pn533_activate_target_nfcdep(struct pn533 *dev)
1652 1711
1653 nfc_dev_dbg(&dev->interface->dev, "%s", __func__); 1712 nfc_dev_dbg(&dev->interface->dev, "%s", __func__);
1654 1713
1655 skb = pn533_alloc_skb(sizeof(u8) * 2); /*TG + Next*/ 1714 skb = pn533_alloc_skb(dev, sizeof(u8) * 2); /*TG + Next*/
1656 if (!skb) 1715 if (!skb)
1657 return -ENOMEM; 1716 return -ENOMEM;
1658 1717
@@ -1746,7 +1805,7 @@ static void pn533_deactivate_target(struct nfc_dev *nfc_dev,
1746 dev->tgt_active_prot = 0; 1805 dev->tgt_active_prot = 0;
1747 skb_queue_purge(&dev->resp_q); 1806 skb_queue_purge(&dev->resp_q);
1748 1807
1749 skb = pn533_alloc_skb(sizeof(u8)); 1808 skb = pn533_alloc_skb(dev, sizeof(u8));
1750 if (!skb) 1809 if (!skb)
1751 return; 1810 return;
1752 1811
@@ -1877,7 +1936,7 @@ static int pn533_dep_link_up(struct nfc_dev *nfc_dev, struct nfc_target *target,
1877 if (comm_mode == NFC_COMM_PASSIVE) 1936 if (comm_mode == NFC_COMM_PASSIVE)
1878 skb_len += PASSIVE_DATA_LEN; 1937 skb_len += PASSIVE_DATA_LEN;
1879 1938
1880 skb = pn533_alloc_skb(skb_len); 1939 skb = pn533_alloc_skb(dev, skb_len);
1881 if (!skb) 1940 if (!skb)
1882 return -ENOMEM; 1941 return -ENOMEM;
1883 1942
@@ -2161,7 +2220,7 @@ static void pn533_wq_mi_recv(struct work_struct *work)
2161 2220
2162 nfc_dev_dbg(&dev->interface->dev, "%s", __func__); 2221 nfc_dev_dbg(&dev->interface->dev, "%s", __func__);
2163 2222
2164 skb = pn533_alloc_skb(PN533_CMD_DATAEXCH_HEAD_LEN); 2223 skb = pn533_alloc_skb(dev, PN533_CMD_DATAEXCH_HEAD_LEN);
2165 if (!skb) 2224 if (!skb)
2166 goto error; 2225 goto error;
2167 2226
@@ -2214,7 +2273,7 @@ static int pn533_set_configuration(struct pn533 *dev, u8 cfgitem, u8 *cfgdata,
2214 2273
2215 skb_len = sizeof(cfgitem) + cfgdata_len; /* cfgitem + cfgdata */ 2274 skb_len = sizeof(cfgitem) + cfgdata_len; /* cfgitem + cfgdata */
2216 2275
2217 skb = pn533_alloc_skb(skb_len); 2276 skb = pn533_alloc_skb(dev, skb_len);
2218 if (!skb) 2277 if (!skb)
2219 return -ENOMEM; 2278 return -ENOMEM;
2220 2279
@@ -2235,7 +2294,7 @@ static int pn533_get_firmware_version(struct pn533 *dev,
2235 struct sk_buff *skb; 2294 struct sk_buff *skb;
2236 struct sk_buff *resp; 2295 struct sk_buff *resp;
2237 2296
2238 skb = pn533_alloc_skb(0); 2297 skb = pn533_alloc_skb(dev, 0);
2239 if (!skb) 2298 if (!skb)
2240 return -ENOMEM; 2299 return -ENOMEM;
2241 2300
@@ -2259,7 +2318,7 @@ static int pn533_fw_reset(struct pn533 *dev)
2259 2318
2260 nfc_dev_dbg(&dev->interface->dev, "%s", __func__); 2319 nfc_dev_dbg(&dev->interface->dev, "%s", __func__);
2261 2320
2262 skb = pn533_alloc_skb(sizeof(u8)); 2321 skb = pn533_alloc_skb(dev, sizeof(u8));
2263 if (!skb) 2322 if (!skb)
2264 return -ENOMEM; 2323 return -ENOMEM;
2265 2324
@@ -2436,14 +2495,7 @@ static int pn533_probe(struct usb_interface *interface,
2436 2495
2437 usb_set_intfdata(interface, dev); 2496 usb_set_intfdata(interface, dev);
2438 2497
2439 memset(&fw_ver, 0, sizeof(fw_ver)); 2498 dev->ops = &pn533_std_frame_ops;
2440 rc = pn533_get_firmware_version(dev, &fw_ver);
2441 if (rc < 0)
2442 goto destroy_wq;
2443
2444 nfc_dev_info(&dev->interface->dev,
2445 "NXP PN533 firmware ver %d.%d now attached",
2446 fw_ver.ver, fw_ver.rev);
2447 2499
2448 dev->device_type = id->driver_info; 2500 dev->device_type = id->driver_info;
2449 switch (dev->device_type) { 2501 switch (dev->device_type) {
@@ -2462,10 +2514,20 @@ static int pn533_probe(struct usb_interface *interface,
2462 goto destroy_wq; 2514 goto destroy_wq;
2463 } 2515 }
2464 2516
2517 memset(&fw_ver, 0, sizeof(fw_ver));
2518 rc = pn533_get_firmware_version(dev, &fw_ver);
2519 if (rc < 0)
2520 goto destroy_wq;
2521
2522 nfc_dev_info(&dev->interface->dev,
2523 "NXP PN533 firmware ver %d.%d now attached",
2524 fw_ver.ver, fw_ver.rev);
2525
2526
2465 dev->nfc_dev = nfc_allocate_device(&pn533_nfc_ops, protocols, 2527 dev->nfc_dev = nfc_allocate_device(&pn533_nfc_ops, protocols,
2466 PN533_FRAME_HEADER_LEN + 2528 dev->ops->tx_header_len +
2467 PN533_CMD_DATAEXCH_HEAD_LEN, 2529 PN533_CMD_DATAEXCH_HEAD_LEN,
2468 PN533_FRAME_TAIL_LEN); 2530 dev->ops->tx_tail_len);
2469 if (!dev->nfc_dev) 2531 if (!dev->nfc_dev)
2470 goto destroy_wq; 2532 goto destroy_wq;
2471 2533