NFC: NCI: Add support of ISO15693
authorVincent Cuissard <cuissard@marvell.com>
Tue, 22 Jul 2014 17:48:38 +0000 (19:48 +0200)
committerSamuel Ortiz <sameo@linux.intel.com>
Mon, 1 Sep 2014 12:40:31 +0000 (14:40 +0200)
Update nci.h to respect latest NCI specification proposal
(stop using proprietary opcodes). Handle ISO15693 parameters
in NCI_RF_ACTIVATED_NTF handler.

Signed-off-by: Vincent Cuissard <cuissard@marvell.com>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
include/net/nfc/nci.h
net/nfc/nci/core.c
net/nfc/nci/ntf.c

index fbfa4e471abb7f62cf31508da0f5ac3e2686fec9..9eca9ae2280c57245a4d40b3a17164a98859ccf0 100644 (file)
@@ -2,6 +2,7 @@
  *  The NFC Controller Interface is the communication protocol between an
  *  NFC Controller (NFCC) and a Device Host (DH).
  *
+ *  Copyright (C) 2014 Marvell International Ltd.
  *  Copyright (C) 2011 Texas Instruments, Inc.
  *
  *  Written by Ilan Elias <ilane@ti.com>
 #define NCI_NFC_F_PASSIVE_POLL_MODE                            0x02
 #define NCI_NFC_A_ACTIVE_POLL_MODE                             0x03
 #define NCI_NFC_F_ACTIVE_POLL_MODE                             0x05
-#define NCI_NFC_15693_PASSIVE_POLL_MODE                                0x06
+#define NCI_NFC_V_PASSIVE_POLL_MODE                            0x06
 #define NCI_NFC_A_PASSIVE_LISTEN_MODE                          0x80
 #define NCI_NFC_B_PASSIVE_LISTEN_MODE                          0x81
 #define NCI_NFC_F_PASSIVE_LISTEN_MODE                          0x82
 #define NCI_NFC_A_ACTIVE_LISTEN_MODE                           0x83
 #define NCI_NFC_F_ACTIVE_LISTEN_MODE                           0x85
-#define NCI_NFC_15693_PASSIVE_LISTEN_MODE                      0x86
 
 /* NCI RF Technologies */
 #define NCI_NFC_RF_TECHNOLOGY_A                                        0x00
 #define NCI_NFC_RF_TECHNOLOGY_B                                        0x01
 #define NCI_NFC_RF_TECHNOLOGY_F                                        0x02
-#define NCI_NFC_RF_TECHNOLOGY_15693                            0x03
+#define NCI_NFC_RF_TECHNOLOGY_V                                        0x03
 
 /* NCI Bit Rates */
 #define NCI_NFC_BIT_RATE_106                                   0x00
@@ -87,6 +87,7 @@
 #define NCI_NFC_BIT_RATE_1695                                  0x04
 #define NCI_NFC_BIT_RATE_3390                                  0x05
 #define NCI_NFC_BIT_RATE_6780                                  0x06
+#define NCI_NFC_BIT_RATE_26                                    0x20
 
 /* NCI RF Protocols */
 #define NCI_RF_PROTOCOL_UNKNOWN                                        0x00
@@ -95,6 +96,7 @@
 #define NCI_RF_PROTOCOL_T3T                                    0x03
 #define NCI_RF_PROTOCOL_ISO_DEP                                        0x04
 #define NCI_RF_PROTOCOL_NFC_DEP                                        0x05
+#define NCI_RF_PROTOCOL_T5T                                    0x06
 
 /* NCI RF Interfaces */
 #define NCI_RF_INTERFACE_NFCEE_DIRECT                          0x00
@@ -328,6 +330,12 @@ struct rf_tech_specific_params_nfcf_poll {
        __u8    sensf_res[18];  /* 16 or 18 Bytes */
 } __packed;
 
+struct rf_tech_specific_params_nfcv_poll {
+       __u8    res_flags;
+       __u8    dsfid;
+       __u8    uid[8]; /* 8 Bytes */
+} __packed;
+
 struct nci_rf_discover_ntf {
        __u8    rf_discovery_id;
        __u8    rf_protocol;
@@ -338,6 +346,7 @@ struct nci_rf_discover_ntf {
                struct rf_tech_specific_params_nfca_poll nfca_poll;
                struct rf_tech_specific_params_nfcb_poll nfcb_poll;
                struct rf_tech_specific_params_nfcf_poll nfcf_poll;
+               struct rf_tech_specific_params_nfcv_poll nfcv_poll;
        } rf_tech_specific_params;
 
        __u8    ntf_type;
@@ -372,6 +381,7 @@ struct nci_rf_intf_activated_ntf {
                struct rf_tech_specific_params_nfca_poll nfca_poll;
                struct rf_tech_specific_params_nfcb_poll nfcb_poll;
                struct rf_tech_specific_params_nfcf_poll nfcf_poll;
+               struct rf_tech_specific_params_nfcv_poll nfcv_poll;
        } rf_tech_specific_params;
 
        __u8    data_exch_rf_tech_and_mode;
index 2b400e1a869522b9ecbca787a0ff2938f6109c26..860080803a3e889525817a3abe35b9a3711e48be 100644 (file)
@@ -231,6 +231,14 @@ static void nci_rf_discover_req(struct nci_dev *ndev, unsigned long opt)
                cmd.num_disc_configs++;
        }
 
+       if ((cmd.num_disc_configs < NCI_MAX_NUM_RF_CONFIGS) &&
+           (protocols & NFC_PROTO_ISO15693_MASK)) {
+               cmd.disc_configs[cmd.num_disc_configs].rf_tech_and_mode =
+                       NCI_NFC_V_PASSIVE_POLL_MODE;
+               cmd.disc_configs[cmd.num_disc_configs].frequency = 1;
+               cmd.num_disc_configs++;
+       }
+
        nci_send_cmd(ndev, NCI_OP_RF_DISCOVER_CMD,
                     (1 + (cmd.num_disc_configs * sizeof(struct disc_config))),
                     &cmd);
index df91bb95b12aacd265f89ba82db7e3ae4cf0553e..25e44cebd60a5f58d074c8be943a0253cb34bf48 100644 (file)
@@ -2,6 +2,7 @@
  *  The NFC Controller Interface is the communication protocol between an
  *  NFC Controller (NFCC) and a Device Host (DH).
  *
+ *  Copyright (C) 2014 Marvell International Ltd.
  *  Copyright (C) 2011 Texas Instruments, Inc.
  *
  *  Written by Ilan Elias <ilane@ti.com>
@@ -155,6 +156,17 @@ static __u8 *nci_extract_rf_params_nfcf_passive_poll(struct nci_dev *ndev,
        return data;
 }
 
+static __u8 *nci_extract_rf_params_nfcv_passive_poll(struct nci_dev *ndev,
+                       struct rf_tech_specific_params_nfcv_poll *nfcv_poll,
+                                                    __u8 *data)
+{
+       ++data;
+       nfcv_poll->dsfid = *data++;
+       memcpy(nfcv_poll->uid, data, NFC_ISO15693_UID_MAXSIZE);
+       data += NFC_ISO15693_UID_MAXSIZE;
+       return data;
+}
+
 static int nci_add_new_protocol(struct nci_dev *ndev,
                                struct nfc_target *target,
                                __u8 rf_protocol,
@@ -164,6 +176,7 @@ static int nci_add_new_protocol(struct nci_dev *ndev,
        struct rf_tech_specific_params_nfca_poll *nfca_poll;
        struct rf_tech_specific_params_nfcb_poll *nfcb_poll;
        struct rf_tech_specific_params_nfcf_poll *nfcf_poll;
+       struct rf_tech_specific_params_nfcv_poll *nfcv_poll;
        __u32 protocol;
 
        if (rf_protocol == NCI_RF_PROTOCOL_T1T)
@@ -179,6 +192,8 @@ static int nci_add_new_protocol(struct nci_dev *ndev,
                protocol = NFC_PROTO_FELICA_MASK;
        else if (rf_protocol == NCI_RF_PROTOCOL_NFC_DEP)
                protocol = NFC_PROTO_NFC_DEP_MASK;
+       else if (rf_protocol == NCI_RF_PROTOCOL_T5T)
+               protocol = NFC_PROTO_ISO15693_MASK;
        else
                protocol = 0;
 
@@ -213,6 +228,12 @@ static int nci_add_new_protocol(struct nci_dev *ndev,
                        memcpy(target->sensf_res, nfcf_poll->sensf_res,
                               target->sensf_res_len);
                }
+       } else if (rf_tech_and_mode == NCI_NFC_V_PASSIVE_POLL_MODE) {
+               nfcv_poll = (struct rf_tech_specific_params_nfcv_poll *)params;
+
+               target->is_iso15693 = 1;
+               target->iso15693_dsfid = nfcv_poll->dsfid;
+               memcpy(target->iso15693_uid, nfcv_poll->uid, NFC_ISO15693_UID_MAXSIZE);
        } else {
                pr_err("unsupported rf_tech_and_mode 0x%x\n", rf_tech_and_mode);
                return -EPROTO;
@@ -305,6 +326,11 @@ static void nci_rf_discover_ntf_packet(struct nci_dev *ndev,
                                &(ntf.rf_tech_specific_params.nfcf_poll), data);
                        break;
 
+               case NCI_NFC_V_PASSIVE_POLL_MODE:
+                       data = nci_extract_rf_params_nfcv_passive_poll(ndev,
+                               &(ntf.rf_tech_specific_params.nfcv_poll), data);
+                       break;
+
                default:
                        pr_err("unsupported rf_tech_and_mode 0x%x\n",
                               ntf.rf_tech_and_mode);
@@ -455,6 +481,11 @@ static void nci_rf_intf_activated_ntf_packet(struct nci_dev *ndev,
                                &(ntf.rf_tech_specific_params.nfcf_poll), data);
                        break;
 
+               case NCI_NFC_V_PASSIVE_POLL_MODE:
+                       data = nci_extract_rf_params_nfcv_passive_poll(ndev,
+                               &(ntf.rf_tech_specific_params.nfcv_poll), data);
+                       break;
+
                default:
                        pr_err("unsupported activation_rf_tech_and_mode 0x%x\n",
                               ntf.activation_rf_tech_and_mode);