summaryrefslogtreecommitdiff
path: root/drivers/nfc/pn533.c
diff options
context:
space:
mode:
authorOlivier Guiter <olivier.guiter@linux.intel.com>2013-06-13 17:43:29 +0400
committerSamuel Ortiz <sameo@linux.intel.com>2013-08-14 02:35:18 +0400
commit56a63c82cf82eb491af05759d9e9f9b97ca36bc2 (patch)
treea0bf4e03a0fe2fd8cfea02434ce397af3912fd8e /drivers/nfc/pn533.c
parent963a82e07d4e1f95fc423d53912ac0a7fe643b1c (diff)
downloadlinux-56a63c82cf82eb491af05759d9e9f9b97ca36bc2.tar.xz
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/pn533.c')
-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 {
int tx_header_len;
int tx_tail_len;
- bool (*rx_is_frame_valid)(void *frame);
+ bool (*rx_is_frame_valid)(void *frame, struct pn533 *dev);
int (*rx_frame_size)(void *frame);
int rx_header_len;
int rx_tail_len;
@@ -510,7 +510,7 @@ static void pn533_acr122_tx_update_payload_len(void *_frame, int len)
frame->datalen += len;
}
-static bool pn533_acr122_is_rx_frame_valid(void *_frame)
+static bool pn533_acr122_is_rx_frame_valid(void *_frame, struct pn533 *dev)
{
struct pn533_acr122_rx_frame *frame = _frame;
@@ -608,7 +608,7 @@ static void pn533_std_tx_update_payload_len(void *_frame, int len)
frame->datalen += len;
}
-static bool pn533_std_rx_frame_is_valid(void *_frame)
+static bool pn533_std_rx_frame_is_valid(void *_frame, struct pn533 *dev)
{
u8 checksum;
struct pn533_std_frame *stdf = _frame;
@@ -618,6 +618,7 @@ static bool pn533_std_rx_frame_is_valid(void *_frame)
if (likely(!PN533_STD_IS_EXTENDED(stdf))) {
/* Standard frame code */
+ dev->ops->rx_header_len = PN533_STD_FRAME_HEADER_LEN;
checksum = pn533_std_checksum(stdf->datalen);
if (checksum != stdf->datalen_checksum)
@@ -630,6 +631,8 @@ static bool pn533_std_rx_frame_is_valid(void *_frame)
/* Extended */
struct pn533_ext_frame *eif = _frame;
+ dev->ops->rx_header_len = PN533_EXT_FRAME_HEADER_LEN;
+
checksum = pn533_ext_checksum(be16_to_cpu(eif->datalen));
if (checksum != eif->datalen_checksum)
return false;
@@ -734,7 +737,7 @@ static void pn533_recv_response(struct urb *urb)
print_hex_dump_debug("PN533 RX: ", DUMP_PREFIX_NONE, 16, 1, in_frame,
dev->ops->rx_frame_size(in_frame), false);
- if (!dev->ops->rx_is_frame_valid(in_frame)) {
+ if (!dev->ops->rx_is_frame_valid(in_frame, dev)) {
nfc_dev_err(&dev->interface->dev, "Received an invalid frame");
cmd->status = -EIO;
goto sched_wq;
@@ -747,11 +750,6 @@ static void pn533_recv_response(struct urb *urb)
goto sched_wq;
}
- if (PN533_STD_IS_EXTENDED((struct pn533_std_frame *)in_frame))
- dev->ops->rx_header_len = PN533_EXT_FRAME_HEADER_LEN;
- else
- dev->ops->rx_header_len = PN533_STD_FRAME_HEADER_LEN;
-
sched_wq:
queue_work(dev->wq, &dev->cmd_complete_work);
}