aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/nfc
diff options
context:
space:
mode:
authorOlivier Guiter <olivier.guiter@linux.intel.com>2013-06-13 09:43:29 -0400
committerSamuel Ortiz <sameo@linux.intel.com>2013-08-13 18:35:18 -0400
commit56a63c82cf82eb491af05759d9e9f9b97ca36bc2 (patch)
treea0bf4e03a0fe2fd8cfea02434ce397af3912fd8e /drivers/nfc
parent963a82e07d4e1f95fc423d53912ac0a7fe643b1c (diff)
NFC: pn533: Store the correct frame size (normal vs ext)
The extended information frame are sent by PN533 to exchange frames larger than 255 bytes. These extended frame are very close from the standard ones except for the header size length. On each incoming frame, we set the correct header length, and we do that only for the standard pn533 chipsets as the acr122 does not seem to support extended frames properly. Signed-off-by: Olivier Guiter <olivier.guiter@linux.intel.com> Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
Diffstat (limited to 'drivers/nfc')
-rw-r--r--drivers/nfc/pn533.c16
1 files changed, 7 insertions, 9 deletions
diff --git a/drivers/nfc/pn533.c b/drivers/nfc/pn533.c
index f06ef7c49f84..2f1ebbd8cba6 100644
--- a/drivers/nfc/pn533.c
+++ b/drivers/nfc/pn533.c
@@ -435,7 +435,7 @@ struct pn533_frame_ops {
435 int tx_header_len; 435 int tx_header_len;
436 int tx_tail_len; 436 int tx_tail_len;
437 437
438 bool (*rx_is_frame_valid)(void *frame); 438 bool (*rx_is_frame_valid)(void *frame, struct pn533 *dev);
439 int (*rx_frame_size)(void *frame); 439 int (*rx_frame_size)(void *frame);
440 int rx_header_len; 440 int rx_header_len;
441 int rx_tail_len; 441 int rx_tail_len;
@@ -510,7 +510,7 @@ static void pn533_acr122_tx_update_payload_len(void *_frame, int len)
510 frame->datalen += len; 510 frame->datalen += len;
511} 511}
512 512
513static bool pn533_acr122_is_rx_frame_valid(void *_frame) 513static bool pn533_acr122_is_rx_frame_valid(void *_frame, struct pn533 *dev)
514{ 514{
515 struct pn533_acr122_rx_frame *frame = _frame; 515 struct pn533_acr122_rx_frame *frame = _frame;
516 516
@@ -608,7 +608,7 @@ static void pn533_std_tx_update_payload_len(void *_frame, int len)
608 frame->datalen += len; 608 frame->datalen += len;
609} 609}
610 610
611static bool pn533_std_rx_frame_is_valid(void *_frame) 611static bool pn533_std_rx_frame_is_valid(void *_frame, struct pn533 *dev)
612{ 612{
613 u8 checksum; 613 u8 checksum;
614 struct pn533_std_frame *stdf = _frame; 614 struct pn533_std_frame *stdf = _frame;
@@ -618,6 +618,7 @@ static bool pn533_std_rx_frame_is_valid(void *_frame)
618 618
619 if (likely(!PN533_STD_IS_EXTENDED(stdf))) { 619 if (likely(!PN533_STD_IS_EXTENDED(stdf))) {
620 /* Standard frame code */ 620 /* Standard frame code */
621 dev->ops->rx_header_len = PN533_STD_FRAME_HEADER_LEN;
621 622
622 checksum = pn533_std_checksum(stdf->datalen); 623 checksum = pn533_std_checksum(stdf->datalen);
623 if (checksum != stdf->datalen_checksum) 624 if (checksum != stdf->datalen_checksum)
@@ -630,6 +631,8 @@ static bool pn533_std_rx_frame_is_valid(void *_frame)
630 /* Extended */ 631 /* Extended */
631 struct pn533_ext_frame *eif = _frame; 632 struct pn533_ext_frame *eif = _frame;
632 633
634 dev->ops->rx_header_len = PN533_EXT_FRAME_HEADER_LEN;
635
633 checksum = pn533_ext_checksum(be16_to_cpu(eif->datalen)); 636 checksum = pn533_ext_checksum(be16_to_cpu(eif->datalen));
634 if (checksum != eif->datalen_checksum) 637 if (checksum != eif->datalen_checksum)
635 return false; 638 return false;
@@ -734,7 +737,7 @@ static void pn533_recv_response(struct urb *urb)
734 print_hex_dump_debug("PN533 RX: ", DUMP_PREFIX_NONE, 16, 1, in_frame, 737 print_hex_dump_debug("PN533 RX: ", DUMP_PREFIX_NONE, 16, 1, in_frame,
735 dev->ops->rx_frame_size(in_frame), false); 738 dev->ops->rx_frame_size(in_frame), false);
736 739
737 if (!dev->ops->rx_is_frame_valid(in_frame)) { 740 if (!dev->ops->rx_is_frame_valid(in_frame, dev)) {
738 nfc_dev_err(&dev->interface->dev, "Received an invalid frame"); 741 nfc_dev_err(&dev->interface->dev, "Received an invalid frame");
739 cmd->status = -EIO; 742 cmd->status = -EIO;
740 goto sched_wq; 743 goto sched_wq;
@@ -747,11 +750,6 @@ static void pn533_recv_response(struct urb *urb)
747 goto sched_wq; 750 goto sched_wq;
748 } 751 }
749 752
750 if (PN533_STD_IS_EXTENDED((struct pn533_std_frame *)in_frame))
751 dev->ops->rx_header_len = PN533_EXT_FRAME_HEADER_LEN;
752 else
753 dev->ops->rx_header_len = PN533_STD_FRAME_HEADER_LEN;
754
755sched_wq: 753sched_wq:
756 queue_work(dev->wq, &dev->cmd_complete_work); 754 queue_work(dev->wq, &dev->cmd_complete_work);
757} 755}