NFC: digital: Add digital framing calls when in target mode
authorMark A. Greer <mgreer@animalcreek.com>
Wed, 2 Jul 2014 17:16:15 +0000 (10:16 -0700)
committerSamuel Ortiz <sameo@linux.intel.com>
Sun, 20 Jul 2014 22:45:21 +0000 (00:45 +0200)
Add new "NFC_DIGITAL_FRAMING_*" calls to the digital
layer so the driver can make the necessary adjustments
when performing anticollision while in target mode.

The driver must ensure that the effect of these calls
happens after the following response has been sent but
before reception of the next request begins.

Acked-by: Thierry Escande <thierry.escande@linux.intel.com>
Signed-off-by: Mark A. Greer <mgreer@animalcreek.com>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
include/net/nfc/digital.h
net/nfc/digital_technology.c

index bdf55c3b7a19ee1756c528ba067d79cef7e89d57..2bc31d10f9eb34ffa29638878673777a7fc29350 100644 (file)
@@ -49,6 +49,7 @@ enum {
        NFC_DIGITAL_FRAMING_NFCA_SHORT = 0,
        NFC_DIGITAL_FRAMING_NFCA_STANDARD,
        NFC_DIGITAL_FRAMING_NFCA_STANDARD_WITH_CRC_A,
+       NFC_DIGITAL_FRAMING_NFCA_ANTICOL_COMPLETE,
 
        NFC_DIGITAL_FRAMING_NFCA_T1T,
        NFC_DIGITAL_FRAMING_NFCA_T2T,
@@ -66,6 +67,7 @@ enum {
        NFC_DIGITAL_FRAMING_NFCB,
        NFC_DIGITAL_FRAMING_NFCB_T4T,
 
+
        NFC_DIGITAL_FRAMING_LAST,
 };
 
index d1684cbfea68bc2aeb8e0ce306ad1eb95eb839da..d276518cc8bf2c31d4932b4d1952324b664b4935 100644 (file)
@@ -944,6 +944,13 @@ static int digital_tg_send_sel_res(struct nfc_digital_dev *ddev)
        if (!DIGITAL_DRV_CAPS_TG_CRC(ddev))
                digital_skb_add_crc_a(skb);
 
+       rc = digital_tg_configure_hw(ddev, NFC_DIGITAL_CONFIG_FRAMING,
+                                    NFC_DIGITAL_FRAMING_NFCA_ANTICOL_COMPLETE);
+       if (rc) {
+               kfree_skb(skb);
+               return rc;
+       }
+
        rc = digital_tg_send_cmd(ddev, skb, 300, digital_tg_recv_atr_req,
                                 NULL);
        if (rc)
@@ -1002,6 +1009,13 @@ static int digital_tg_send_sdd_res(struct nfc_digital_dev *ddev)
        for (i = 0; i < 4; i++)
                sdd_res->bcc ^= sdd_res->nfcid1[i];
 
+       rc = digital_tg_configure_hw(ddev, NFC_DIGITAL_CONFIG_FRAMING,
+                               NFC_DIGITAL_FRAMING_NFCA_STANDARD_WITH_CRC_A);
+       if (rc) {
+               kfree_skb(skb);
+               return rc;
+       }
+
        rc = digital_tg_send_cmd(ddev, skb, 300, digital_tg_recv_sel_req,
                                 NULL);
        if (rc)
@@ -1054,6 +1068,13 @@ static int digital_tg_send_sens_res(struct nfc_digital_dev *ddev)
        sens_res[0] = (DIGITAL_SENS_RES_NFC_DEP >> 8) & 0xFF;
        sens_res[1] = DIGITAL_SENS_RES_NFC_DEP & 0xFF;
 
+       rc = digital_tg_configure_hw(ddev, NFC_DIGITAL_CONFIG_FRAMING,
+                                    NFC_DIGITAL_FRAMING_NFCA_STANDARD);
+       if (rc) {
+               kfree_skb(skb);
+               return rc;
+       }
+
        rc = digital_tg_send_cmd(ddev, skb, 300, digital_tg_recv_sdd_req,
                                 NULL);
        if (rc)