From: Christophe Ricard <christophe.ricard-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
To: linux-nfc-hn68Rpc1hR1g9hUCZPvPmw@public.gmane.org,
sameo-VuQAYsv1563Yd54FQh9/CA@public.gmane.org
Cc: devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
christophe.ricard-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org,
christophe-h.ricard-qxv4g6HH51o@public.gmane.org
Subject: [PATCH 04/10] NFC: st21nfca: Improved check for correct data reception on i2c bus.
Date: Thu, 24 Apr 2014 23:19:33 +0200 [thread overview]
Message-ID: <1398374379-17133-5-git-send-email-christophe-h.ricard@st.com> (raw)
In-Reply-To: <1398374379-17133-1-git-send-email-christophe-h.ricard-qxv4g6HH51o@public.gmane.org>
A frame starts with ST21NFCA_SOF_EOF(0x7e) + 0x00.
A frame ends with ST21NFCA_SOF_EOF(0x7e).
It is possible that the i2c macrocell is stopped for other
communication interfaces with highest priority(RF or SWP).
This can be seen with some 0xFF data at the end of a received shdlc buffer.
If this happen we need to discard the frame because the CLF will repeat it.
In order to push accurate data to hci layer, we add the following fix:
- Instead of looking for the first 0x7e in the frame, check that the last
received byte is 0x7e.
- Check that the first frame reception block start with start of
frame(0x7e 0x00). If not, clear the buffer.
- Check that the next frame reception block do not start with start of
frame(0x7e). If so, clear the buffer.
Signed-off-by: Christophe Ricard <christophe-h.ricard-qxv4g6HH51o@public.gmane.org>
---
drivers/nfc/st21nfca/i2c.c | 28 +++++++++++++++++++++++++---
1 file changed, 25 insertions(+), 3 deletions(-)
diff --git a/drivers/nfc/st21nfca/i2c.c b/drivers/nfc/st21nfca/i2c.c
index e29351c..dece61f 100644
--- a/drivers/nfc/st21nfca/i2c.c
+++ b/drivers/nfc/st21nfca/i2c.c
@@ -53,6 +53,8 @@
/* 2 bytes crc + EOF */
#define ST21NFCA_FRAME_TAILROOM 3
+#define IS_START_OF_FRAME(buf) (buf[0] == ST21NFCA_SOF_EOF && \
+ buf[1] == 0)
#define ST21NFCA_HCI_I2C_DRIVER_NAME "st21nfca_hci_i2c"
@@ -361,6 +363,7 @@ static int st21nfca_hci_i2c_read(struct st21nfca_i2c_phy *phy,
{
int r, i;
u8 len;
+ u8 buf[ST21NFCA_HCI_LLC_MAX_PAYLOAD];
struct i2c_client *client = phy->i2c_dev;
if (phy->current_read_len < ARRAY_SIZE(len_seq)) {
@@ -373,7 +376,7 @@ static int st21nfca_hci_i2c_read(struct st21nfca_i2c_phy *phy,
*/
r = 0;
for (i = 0; i < ARRAY_SIZE(wait_tab) && r <= 0; i++) {
- r = i2c_master_recv(client, skb_put(skb, len), len);
+ r = i2c_master_recv(client, buf, len);
if (r < 0)
msleep(wait_tab[i]);
}
@@ -383,8 +386,27 @@ static int st21nfca_hci_i2c_read(struct st21nfca_i2c_phy *phy,
return -EREMOTEIO;
}
- if (memchr(skb->data + 2, ST21NFCA_SOF_EOF,
- skb->len - 2) != NULL) {
+ /*
+ * The first read sequence does not start with SOF.
+ * Data are corrupeted. Drop them.
+ */
+ if (!phy->current_read_len && buf[0] != ST21NFCA_SOF_EOF) {
+ skb_trim(skb, 0);
+ phy->current_read_len = 0;
+ return -EIO;
+ } else if (phy->current_read_len &&
+ IS_START_OF_FRAME(buf)) {
+ /*
+ * Previous frame transmission was interrupted and
+ * the frame got repeated.
+ * Received frame start with ST21NFCA_SOF_EOF + 00.
+ */
+ skb_trim(skb, 0);
+ phy->current_read_len = 0;
+ }
+ memcpy(skb_put(skb, len), buf, len);
+
+ if (skb->data[skb->len - 1] == ST21NFCA_SOF_EOF) {
phy->current_read_len = 0;
return st21nfca_hci_i2c_repack(skb);
}
--
1.9.1
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
next prev parent reply other threads:[~2014-04-24 21:19 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-04-24 21:19 [PATCH 00/10] Clean up, DTS and ISO15693 support Christophe Ricard
[not found] ` <1398374379-17133-1-git-send-email-christophe-h.ricard-qxv4g6HH51o@public.gmane.org>
2014-04-24 21:19 ` [PATCH 01/10] NFC: st21nfca: Remove few useless include Christophe Ricard
2014-04-24 21:19 ` [PATCH 02/10] NFC: st21nfca: Fix incorrect TAILROOM and st21nfca_hci_remove_len_crc Christophe Ricard
2014-04-24 21:19 ` [PATCH 03/10] NFC: st21nfca: Fix incorrect byte stuffing revocation Christophe Ricard
2014-04-24 21:19 ` Christophe Ricard [this message]
2014-04-24 21:19 ` [PATCH 05/10] NFC: st21nfca: Add mutex to force a successful i2c transaction Christophe Ricard
2014-04-24 21:19 ` [PATCH 06/10] NFC: st21nfca: Free buffer when a bad frame is detected Christophe Ricard
2014-04-24 21:19 ` [PATCH 07/10] NFC: dts: st21nfca: Add device-tree (Open Firmware) support to st21nfca Christophe Ricard
2014-04-24 21:19 ` [PATCH 08/10] NFC: dts: st21nfca_i2c: Add DTS Documentation Christophe Ricard
2014-04-24 21:19 ` [PATCH 09/10] NFC: st21nfca: Improve load_session in order to create pipe when it does not exists Christophe Ricard
2014-04-24 21:19 ` [PATCH 10/10] NFC: st21nfca: Add ISO15693 Reader/Writer support Christophe Ricard
2014-05-04 23:09 ` [PATCH 00/10] Clean up, DTS and ISO15693 support Samuel Ortiz
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1398374379-17133-5-git-send-email-christophe-h.ricard@st.com \
--to=christophe.ricard-re5jqeeqqe8avxtiumwx3w@public.gmane.org \
--cc=christophe-h.ricard-qxv4g6HH51o@public.gmane.org \
--cc=devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=linux-nfc-hn68Rpc1hR1g9hUCZPvPmw@public.gmane.org \
--cc=sameo-VuQAYsv1563Yd54FQh9/CA@public.gmane.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox