aboutsummaryrefslogtreecommitdiffstats
path: root/net/nfc/nci
diff options
context:
space:
mode:
authorVincent Cuissard <cuissard@marvell.com>2014-07-22 13:48:38 -0400
committerSamuel Ortiz <sameo@linux.intel.com>2014-09-01 08:40:31 -0400
commitcfdbeeafdbbdbc006f700e92cbad2cb5d4529f3d (patch)
treeecf3fc7d4cf0203573369febdedd3baced9a1593 /net/nfc/nci
parentf23b73526b82ca2ef333362e704a51d817c1ffc1 (diff)
NFC: NCI: Add support of ISO15693
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>
Diffstat (limited to 'net/nfc/nci')
-rw-r--r--net/nfc/nci/core.c8
-rw-r--r--net/nfc/nci/ntf.c31
2 files changed, 39 insertions, 0 deletions
diff --git a/net/nfc/nci/core.c b/net/nfc/nci/core.c
index 2b400e1a8695..860080803a3e 100644
--- a/net/nfc/nci/core.c
+++ b/net/nfc/nci/core.c
@@ -231,6 +231,14 @@ static void nci_rf_discover_req(struct nci_dev *ndev, unsigned long opt)
231 cmd.num_disc_configs++; 231 cmd.num_disc_configs++;
232 } 232 }
233 233
234 if ((cmd.num_disc_configs < NCI_MAX_NUM_RF_CONFIGS) &&
235 (protocols & NFC_PROTO_ISO15693_MASK)) {
236 cmd.disc_configs[cmd.num_disc_configs].rf_tech_and_mode =
237 NCI_NFC_V_PASSIVE_POLL_MODE;
238 cmd.disc_configs[cmd.num_disc_configs].frequency = 1;
239 cmd.num_disc_configs++;
240 }
241
234 nci_send_cmd(ndev, NCI_OP_RF_DISCOVER_CMD, 242 nci_send_cmd(ndev, NCI_OP_RF_DISCOVER_CMD,
235 (1 + (cmd.num_disc_configs * sizeof(struct disc_config))), 243 (1 + (cmd.num_disc_configs * sizeof(struct disc_config))),
236 &cmd); 244 &cmd);
diff --git a/net/nfc/nci/ntf.c b/net/nfc/nci/ntf.c
index df91bb95b12a..25e44cebd60a 100644
--- a/net/nfc/nci/ntf.c
+++ b/net/nfc/nci/ntf.c
@@ -2,6 +2,7 @@
2 * The NFC Controller Interface is the communication protocol between an 2 * The NFC Controller Interface is the communication protocol between an
3 * NFC Controller (NFCC) and a Device Host (DH). 3 * NFC Controller (NFCC) and a Device Host (DH).
4 * 4 *
5 * Copyright (C) 2014 Marvell International Ltd.
5 * Copyright (C) 2011 Texas Instruments, Inc. 6 * Copyright (C) 2011 Texas Instruments, Inc.
6 * 7 *
7 * Written by Ilan Elias <ilane@ti.com> 8 * Written by Ilan Elias <ilane@ti.com>
@@ -155,6 +156,17 @@ static __u8 *nci_extract_rf_params_nfcf_passive_poll(struct nci_dev *ndev,
155 return data; 156 return data;
156} 157}
157 158
159static __u8 *nci_extract_rf_params_nfcv_passive_poll(struct nci_dev *ndev,
160 struct rf_tech_specific_params_nfcv_poll *nfcv_poll,
161 __u8 *data)
162{
163 ++data;
164 nfcv_poll->dsfid = *data++;
165 memcpy(nfcv_poll->uid, data, NFC_ISO15693_UID_MAXSIZE);
166 data += NFC_ISO15693_UID_MAXSIZE;
167 return data;
168}
169
158static int nci_add_new_protocol(struct nci_dev *ndev, 170static int nci_add_new_protocol(struct nci_dev *ndev,
159 struct nfc_target *target, 171 struct nfc_target *target,
160 __u8 rf_protocol, 172 __u8 rf_protocol,
@@ -164,6 +176,7 @@ static int nci_add_new_protocol(struct nci_dev *ndev,
164 struct rf_tech_specific_params_nfca_poll *nfca_poll; 176 struct rf_tech_specific_params_nfca_poll *nfca_poll;
165 struct rf_tech_specific_params_nfcb_poll *nfcb_poll; 177 struct rf_tech_specific_params_nfcb_poll *nfcb_poll;
166 struct rf_tech_specific_params_nfcf_poll *nfcf_poll; 178 struct rf_tech_specific_params_nfcf_poll *nfcf_poll;
179 struct rf_tech_specific_params_nfcv_poll *nfcv_poll;
167 __u32 protocol; 180 __u32 protocol;
168 181
169 if (rf_protocol == NCI_RF_PROTOCOL_T1T) 182 if (rf_protocol == NCI_RF_PROTOCOL_T1T)
@@ -179,6 +192,8 @@ static int nci_add_new_protocol(struct nci_dev *ndev,
179 protocol = NFC_PROTO_FELICA_MASK; 192 protocol = NFC_PROTO_FELICA_MASK;
180 else if (rf_protocol == NCI_RF_PROTOCOL_NFC_DEP) 193 else if (rf_protocol == NCI_RF_PROTOCOL_NFC_DEP)
181 protocol = NFC_PROTO_NFC_DEP_MASK; 194 protocol = NFC_PROTO_NFC_DEP_MASK;
195 else if (rf_protocol == NCI_RF_PROTOCOL_T5T)
196 protocol = NFC_PROTO_ISO15693_MASK;
182 else 197 else
183 protocol = 0; 198 protocol = 0;
184 199
@@ -213,6 +228,12 @@ static int nci_add_new_protocol(struct nci_dev *ndev,
213 memcpy(target->sensf_res, nfcf_poll->sensf_res, 228 memcpy(target->sensf_res, nfcf_poll->sensf_res,
214 target->sensf_res_len); 229 target->sensf_res_len);
215 } 230 }
231 } else if (rf_tech_and_mode == NCI_NFC_V_PASSIVE_POLL_MODE) {
232 nfcv_poll = (struct rf_tech_specific_params_nfcv_poll *)params;
233
234 target->is_iso15693 = 1;
235 target->iso15693_dsfid = nfcv_poll->dsfid;
236 memcpy(target->iso15693_uid, nfcv_poll->uid, NFC_ISO15693_UID_MAXSIZE);
216 } else { 237 } else {
217 pr_err("unsupported rf_tech_and_mode 0x%x\n", rf_tech_and_mode); 238 pr_err("unsupported rf_tech_and_mode 0x%x\n", rf_tech_and_mode);
218 return -EPROTO; 239 return -EPROTO;
@@ -305,6 +326,11 @@ static void nci_rf_discover_ntf_packet(struct nci_dev *ndev,
305 &(ntf.rf_tech_specific_params.nfcf_poll), data); 326 &(ntf.rf_tech_specific_params.nfcf_poll), data);
306 break; 327 break;
307 328
329 case NCI_NFC_V_PASSIVE_POLL_MODE:
330 data = nci_extract_rf_params_nfcv_passive_poll(ndev,
331 &(ntf.rf_tech_specific_params.nfcv_poll), data);
332 break;
333
308 default: 334 default:
309 pr_err("unsupported rf_tech_and_mode 0x%x\n", 335 pr_err("unsupported rf_tech_and_mode 0x%x\n",
310 ntf.rf_tech_and_mode); 336 ntf.rf_tech_and_mode);
@@ -455,6 +481,11 @@ static void nci_rf_intf_activated_ntf_packet(struct nci_dev *ndev,
455 &(ntf.rf_tech_specific_params.nfcf_poll), data); 481 &(ntf.rf_tech_specific_params.nfcf_poll), data);
456 break; 482 break;
457 483
484 case NCI_NFC_V_PASSIVE_POLL_MODE:
485 data = nci_extract_rf_params_nfcv_passive_poll(ndev,
486 &(ntf.rf_tech_specific_params.nfcv_poll), data);
487 break;
488
458 default: 489 default:
459 pr_err("unsupported activation_rf_tech_and_mode 0x%x\n", 490 pr_err("unsupported activation_rf_tech_and_mode 0x%x\n",
460 ntf.activation_rf_tech_and_mode); 491 ntf.activation_rf_tech_and_mode);