diff options
author | Waldemar Rymarkiewicz <waldemar.rymarkiewicz@tieto.com> | 2012-12-10 08:43:01 -0500 |
---|---|---|
committer | Samuel Ortiz <sameo@linux.intel.com> | 2013-01-09 18:51:46 -0500 |
commit | 9e2d493e74aca105aa86de56dbf80a0a654c4c53 (patch) | |
tree | 436aa3c11503d8a8469ed6f9ad283415f7bc12d1 /drivers/nfc | |
parent | 16f7541914e8bee0e76c510c4d8bc5ad8a5edf00 (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.c | 208 |
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 | ||
366 | struct pn533_cmd { | 363 | struct 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 | ||
380 | struct 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 */ |
383 | static inline u8 pn533_checksum(u8 value) | 397 | static 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 | ||
400 | static void pn533_tx_frame_init(struct pn533_frame *frame, u8 cmd) | 414 | static 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 | ||
409 | static void pn533_tx_frame_finish(struct pn533_frame *frame) | 425 | static 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 | ||
419 | static bool pn533_rx_frame_is_valid(struct pn533_frame *frame) | 437 | static void pn533_tx_update_payload_len(void *_frame, int len) |
438 | { | ||
439 | struct pn533_frame *frame = _frame; | ||
440 | |||
441 | frame->datalen += len; | ||
442 | } | ||
443 | |||
444 | static 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 | ||
448 | static bool pn533_rx_frame_is_cmd_response(struct pn533_frame *frame, u8 cmd) | 474 | static 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 | |||
481 | static u8 pn533_get_cmd_code(void *frame) | ||
482 | { | ||
483 | struct pn533_frame *f = frame; | ||
484 | |||
485 | return PN533_FRAME_CMD(f); | ||
486 | } | ||
487 | |||
488 | struct 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 | |||
504 | static 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) | |||
464 | static void pn533_recv_response(struct urb *urb) | 520 | static 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 | ||
626 | static void pn533_build_cmd_frame(u8 cmd_code, struct sk_buff *skb) | 682 | static 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 | ||
642 | struct pn533_send_async_complete_arg { | 698 | struct 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 | ||
931 | static struct sk_buff *pn533_alloc_skb(unsigned int size) | 987 | static 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 | ||
1300 | static struct sk_buff *pn533_alloc_poll_tg_frame(u8 *gbytes, size_t gbytes_len) | 1356 | static 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 | ||
1510 | static struct sk_buff *pn533_alloc_poll_in_frame(struct pn533_poll_modulations | 1569 | static 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 | ||