diff options
Diffstat (limited to 'net/nfc/nci/ntf.c')
-rw-r--r-- | net/nfc/nci/ntf.c | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/net/nfc/nci/ntf.c b/net/nfc/nci/ntf.c index af7a93b04393..b2aa98ef0927 100644 --- a/net/nfc/nci/ntf.c +++ b/net/nfc/nci/ntf.c | |||
@@ -176,6 +176,8 @@ static int nci_add_new_protocol(struct nci_dev *ndev, | |||
176 | protocol = NFC_PROTO_ISO14443_B_MASK; | 176 | protocol = NFC_PROTO_ISO14443_B_MASK; |
177 | else if (rf_protocol == NCI_RF_PROTOCOL_T3T) | 177 | else if (rf_protocol == NCI_RF_PROTOCOL_T3T) |
178 | protocol = NFC_PROTO_FELICA_MASK; | 178 | protocol = NFC_PROTO_FELICA_MASK; |
179 | else if (rf_protocol == NCI_RF_PROTOCOL_NFC_DEP) | ||
180 | protocol = NFC_PROTO_NFC_DEP_MASK; | ||
179 | else | 181 | else |
180 | protocol = 0; | 182 | protocol = 0; |
181 | 183 | ||
@@ -361,6 +363,33 @@ static int nci_extract_activation_params_iso_dep(struct nci_dev *ndev, | |||
361 | return NCI_STATUS_OK; | 363 | return NCI_STATUS_OK; |
362 | } | 364 | } |
363 | 365 | ||
366 | static int nci_extract_activation_params_nfc_dep(struct nci_dev *ndev, | ||
367 | struct nci_rf_intf_activated_ntf *ntf, __u8 *data) | ||
368 | { | ||
369 | struct activation_params_poll_nfc_dep *poll; | ||
370 | int i; | ||
371 | |||
372 | switch (ntf->activation_rf_tech_and_mode) { | ||
373 | case NCI_NFC_A_PASSIVE_POLL_MODE: | ||
374 | case NCI_NFC_F_PASSIVE_POLL_MODE: | ||
375 | poll = &ntf->activation_params.poll_nfc_dep; | ||
376 | poll->atr_res_len = min_t(__u8, *data++, 63); | ||
377 | pr_debug("atr_res_len %d\n", poll->atr_res_len); | ||
378 | if (poll->atr_res_len > 0) { | ||
379 | for (i = 0; i < poll->atr_res_len; i++) | ||
380 | poll->atr_res[poll->atr_res_len-1-i] = data[i]; | ||
381 | } | ||
382 | break; | ||
383 | |||
384 | default: | ||
385 | pr_err("unsupported activation_rf_tech_and_mode 0x%x\n", | ||
386 | ntf->activation_rf_tech_and_mode); | ||
387 | return NCI_STATUS_RF_PROTOCOL_ERROR; | ||
388 | } | ||
389 | |||
390 | return NCI_STATUS_OK; | ||
391 | } | ||
392 | |||
364 | static void nci_target_auto_activated(struct nci_dev *ndev, | 393 | static void nci_target_auto_activated(struct nci_dev *ndev, |
365 | struct nci_rf_intf_activated_ntf *ntf) | 394 | struct nci_rf_intf_activated_ntf *ntf) |
366 | { | 395 | { |
@@ -454,6 +483,11 @@ static void nci_rf_intf_activated_ntf_packet(struct nci_dev *ndev, | |||
454 | &ntf, data); | 483 | &ntf, data); |
455 | break; | 484 | break; |
456 | 485 | ||
486 | case NCI_RF_INTERFACE_NFC_DEP: | ||
487 | err = nci_extract_activation_params_nfc_dep(ndev, | ||
488 | &ntf, data); | ||
489 | break; | ||
490 | |||
457 | case NCI_RF_INTERFACE_FRAME: | 491 | case NCI_RF_INTERFACE_FRAME: |
458 | /* no activation params */ | 492 | /* no activation params */ |
459 | break; | 493 | break; |
@@ -473,6 +507,24 @@ exit: | |||
473 | 507 | ||
474 | /* set the available credits to initial value */ | 508 | /* set the available credits to initial value */ |
475 | atomic_set(&ndev->credits_cnt, ndev->initial_num_credits); | 509 | atomic_set(&ndev->credits_cnt, ndev->initial_num_credits); |
510 | |||
511 | /* store general bytes to be reported later in dep_link_up */ | ||
512 | if (ntf.rf_interface == NCI_RF_INTERFACE_NFC_DEP) { | ||
513 | ndev->remote_gb_len = 0; | ||
514 | |||
515 | if (ntf.activation_params_len > 0) { | ||
516 | /* ATR_RES general bytes at offset 15 */ | ||
517 | ndev->remote_gb_len = min_t(__u8, | ||
518 | (ntf.activation_params | ||
519 | .poll_nfc_dep.atr_res_len | ||
520 | - NFC_ATR_RES_GT_OFFSET), | ||
521 | NFC_MAX_GT_LEN); | ||
522 | memcpy(ndev->remote_gb, | ||
523 | (ntf.activation_params.poll_nfc_dep | ||
524 | .atr_res + NFC_ATR_RES_GT_OFFSET), | ||
525 | ndev->remote_gb_len); | ||
526 | } | ||
527 | } | ||
476 | } | 528 | } |
477 | 529 | ||
478 | if (atomic_read(&ndev->state) == NCI_DISCOVERY) { | 530 | if (atomic_read(&ndev->state) == NCI_DISCOVERY) { |