NFC: NCI: Enable NFC-DEP in Listen A and Listen F
authorJulien Lefrique <lefrique@marvell.com>
Tue, 21 Oct 2014 14:52:45 +0000 (16:52 +0200)
committerSamuel Ortiz <sameo@linux.intel.com>
Fri, 28 Nov 2014 13:07:51 +0000 (14:07 +0100)
Send LA_SEL_INFO and LF_PROTOCOL_TYPE with NFC-DEP protocol enabled.
Configure 212 Kbit/s and 412 Kbit/s bit rates for Listen F.

Signed-off-by: Julien Lefrique <lefrique@marvell.com>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
include/net/nfc/nci.h
net/nfc/nci/core.c

index 9eca9ae2280c57245a4d40b3a17164a98859ccf0..36cf65386b8620550eb773f30bbbd8e0131bdebb 100644 (file)
 
 /* NCI Configuration Parameter Tags */
 #define NCI_PN_ATR_REQ_GEN_BYTES                               0x29
+#define NCI_LA_SEL_INFO                                                0x32
+#define NCI_LF_PROTOCOL_TYPE                                   0x50
+#define NCI_LF_CON_BITR_F                                      0x54
+
+/* NCI Configuration Parameters masks */
+#define NCI_LA_SEL_INFO_ISO_DEP_MASK                           0x20
+#define NCI_LA_SEL_INFO_NFC_DEP_MASK                           0x40
+#define NCI_LF_PROTOCOL_TYPE_NFC_DEP_MASK                      0x02
+#define NCI_LF_CON_BITR_F_212                                  0x02
+#define NCI_LF_CON_BITR_F_424                                  0x04
 
 /* NCI Reset types */
 #define NCI_RESET_TYPE_KEEP_CONFIG                             0x00
index d376e4abe0f248bcfc5f51b06986341bd7a11a0c..61f92678a64c9f10b822c879ffa64a532aab6fa4 100644 (file)
@@ -474,6 +474,29 @@ static int nci_set_local_general_bytes(struct nfc_dev *nfc_dev)
                           msecs_to_jiffies(NCI_SET_CONFIG_TIMEOUT));
 }
 
+static int nci_set_listen_parameters(struct nfc_dev *nfc_dev)
+{
+       struct nci_dev *ndev = nfc_get_drvdata(nfc_dev);
+       int rc;
+       __u8 val;
+
+       val = NCI_LA_SEL_INFO_NFC_DEP_MASK;
+
+       rc = nci_set_config(ndev, NCI_LA_SEL_INFO, 1, &val);
+       if (rc)
+               return rc;
+
+       val = NCI_LF_PROTOCOL_TYPE_NFC_DEP_MASK;
+
+       rc = nci_set_config(ndev, NCI_LF_PROTOCOL_TYPE, 1, &val);
+       if (rc)
+               return rc;
+
+       val = NCI_LF_CON_BITR_F_212 | NCI_LF_CON_BITR_F_424;
+
+       return nci_set_config(ndev, NCI_LF_CON_BITR_F, 1, &val);
+}
+
 static int nci_start_poll(struct nfc_dev *nfc_dev,
                          __u32 im_protocols, __u32 tm_protocols)
 {
@@ -510,6 +533,12 @@ static int nci_start_poll(struct nfc_dev *nfc_dev,
                }
        }
 
+       if (tm_protocols & NFC_PROTO_NFC_DEP_MASK) {
+               rc = nci_set_listen_parameters(nfc_dev);
+               if (rc)
+                       pr_err("failed to set listen parameters\n");
+       }
+
        param.im_protocols = im_protocols;
        param.tm_protocols = tm_protocols;
        rc = nci_request(ndev, nci_rf_discover_req, (unsigned long)&param,