^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * The NFC Controller Interface is the communication protocol between an
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * NFC Controller (NFCC) and a Device Host (DH).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * Copyright (C) 2014 Marvell International Ltd.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * Copyright (C) 2011 Texas Instruments, Inc.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) * Written by Ilan Elias <ilane@ti.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) * Acknowledgements:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) * This file is based on hci_event.c, which was written
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) * by Maxim Krasnyansky.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #define pr_fmt(fmt) KBUILD_MODNAME ": %s: " fmt, __func__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <linux/types.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include <linux/interrupt.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #include <linux/bitops.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #include <linux/skbuff.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #include "../nfc.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #include <net/nfc/nci.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #include <net/nfc/nci_core.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #include <linux/nfc.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) /* Handle NCI Notification packets */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) static void nci_core_conn_credits_ntf_packet(struct nci_dev *ndev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) struct sk_buff *skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) struct nci_core_conn_credit_ntf *ntf = (void *) skb->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) struct nci_conn_info *conn_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) pr_debug("num_entries %d\n", ntf->num_entries);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) if (ntf->num_entries > NCI_MAX_NUM_CONN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) ntf->num_entries = NCI_MAX_NUM_CONN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) /* update the credits */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) for (i = 0; i < ntf->num_entries; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) ntf->conn_entries[i].conn_id =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) nci_conn_id(&ntf->conn_entries[i].conn_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) pr_debug("entry[%d]: conn_id %d, credits %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) i, ntf->conn_entries[i].conn_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) ntf->conn_entries[i].credits);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) conn_info = nci_get_conn_info_by_conn_id(ndev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) ntf->conn_entries[i].conn_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) if (!conn_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) atomic_add(ntf->conn_entries[i].credits,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) &conn_info->credits_cnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) /* trigger the next tx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) if (!skb_queue_empty(&ndev->tx_q))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) queue_work(ndev->tx_wq, &ndev->tx_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) static void nci_core_generic_error_ntf_packet(struct nci_dev *ndev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) struct sk_buff *skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) __u8 status = skb->data[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) pr_debug("status 0x%x\n", status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) if (atomic_read(&ndev->state) == NCI_W4_HOST_SELECT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) /* Activation failed, so complete the request
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) (the state remains the same) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) nci_req_complete(ndev, status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) static void nci_core_conn_intf_error_ntf_packet(struct nci_dev *ndev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) struct sk_buff *skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) struct nci_core_intf_error_ntf *ntf = (void *) skb->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) ntf->conn_id = nci_conn_id(&ntf->conn_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) pr_debug("status 0x%x, conn_id %d\n", ntf->status, ntf->conn_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) /* complete the data exchange transaction, if exists */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) if (test_bit(NCI_DATA_EXCHANGE, &ndev->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) nci_data_exchange_complete(ndev, NULL, ntf->conn_id, -EIO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) static __u8 *nci_extract_rf_params_nfca_passive_poll(struct nci_dev *ndev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) struct rf_tech_specific_params_nfca_poll *nfca_poll,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) __u8 *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) nfca_poll->sens_res = __le16_to_cpu(*((__le16 *)data));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) data += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) nfca_poll->nfcid1_len = min_t(__u8, *data++, NFC_NFCID1_MAXSIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) pr_debug("sens_res 0x%x, nfcid1_len %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) nfca_poll->sens_res, nfca_poll->nfcid1_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) memcpy(nfca_poll->nfcid1, data, nfca_poll->nfcid1_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) data += nfca_poll->nfcid1_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) nfca_poll->sel_res_len = *data++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) if (nfca_poll->sel_res_len != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) nfca_poll->sel_res = *data++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) pr_debug("sel_res_len %d, sel_res 0x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) nfca_poll->sel_res_len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) nfca_poll->sel_res);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) return data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) static __u8 *nci_extract_rf_params_nfcb_passive_poll(struct nci_dev *ndev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) struct rf_tech_specific_params_nfcb_poll *nfcb_poll,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) __u8 *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) nfcb_poll->sensb_res_len = min_t(__u8, *data++, NFC_SENSB_RES_MAXSIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) pr_debug("sensb_res_len %d\n", nfcb_poll->sensb_res_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) memcpy(nfcb_poll->sensb_res, data, nfcb_poll->sensb_res_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) data += nfcb_poll->sensb_res_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) return data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) static __u8 *nci_extract_rf_params_nfcf_passive_poll(struct nci_dev *ndev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) struct rf_tech_specific_params_nfcf_poll *nfcf_poll,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) __u8 *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) nfcf_poll->bit_rate = *data++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) nfcf_poll->sensf_res_len = min_t(__u8, *data++, NFC_SENSF_RES_MAXSIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) pr_debug("bit_rate %d, sensf_res_len %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) nfcf_poll->bit_rate, nfcf_poll->sensf_res_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) memcpy(nfcf_poll->sensf_res, data, nfcf_poll->sensf_res_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) data += nfcf_poll->sensf_res_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) return data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) static __u8 *nci_extract_rf_params_nfcv_passive_poll(struct nci_dev *ndev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) struct rf_tech_specific_params_nfcv_poll *nfcv_poll,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) __u8 *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) ++data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) nfcv_poll->dsfid = *data++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) memcpy(nfcv_poll->uid, data, NFC_ISO15693_UID_MAXSIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) data += NFC_ISO15693_UID_MAXSIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) return data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) static __u8 *nci_extract_rf_params_nfcf_passive_listen(struct nci_dev *ndev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) struct rf_tech_specific_params_nfcf_listen *nfcf_listen,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) __u8 *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) nfcf_listen->local_nfcid2_len = min_t(__u8, *data++,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) NFC_NFCID2_MAXSIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) memcpy(nfcf_listen->local_nfcid2, data, nfcf_listen->local_nfcid2_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) data += nfcf_listen->local_nfcid2_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) return data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) static __u32 nci_get_prop_rf_protocol(struct nci_dev *ndev, __u8 rf_protocol)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) if (ndev->ops->get_rfprotocol)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) return ndev->ops->get_rfprotocol(ndev, rf_protocol);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) static int nci_add_new_protocol(struct nci_dev *ndev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) struct nfc_target *target,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) __u8 rf_protocol,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) __u8 rf_tech_and_mode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) void *params)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) struct rf_tech_specific_params_nfca_poll *nfca_poll;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) struct rf_tech_specific_params_nfcb_poll *nfcb_poll;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) struct rf_tech_specific_params_nfcf_poll *nfcf_poll;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) struct rf_tech_specific_params_nfcv_poll *nfcv_poll;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) __u32 protocol;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) if (rf_protocol == NCI_RF_PROTOCOL_T1T)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) protocol = NFC_PROTO_JEWEL_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) else if (rf_protocol == NCI_RF_PROTOCOL_T2T)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) protocol = NFC_PROTO_MIFARE_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) else if (rf_protocol == NCI_RF_PROTOCOL_ISO_DEP)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) if (rf_tech_and_mode == NCI_NFC_A_PASSIVE_POLL_MODE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) protocol = NFC_PROTO_ISO14443_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) protocol = NFC_PROTO_ISO14443_B_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) else if (rf_protocol == NCI_RF_PROTOCOL_T3T)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) protocol = NFC_PROTO_FELICA_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) else if (rf_protocol == NCI_RF_PROTOCOL_NFC_DEP)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) protocol = NFC_PROTO_NFC_DEP_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) else if (rf_protocol == NCI_RF_PROTOCOL_T5T)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) protocol = NFC_PROTO_ISO15693_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) protocol = nci_get_prop_rf_protocol(ndev, rf_protocol);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) if (!(protocol & ndev->poll_prots)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) pr_err("the target found does not have the desired protocol\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) return -EPROTO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) if (rf_tech_and_mode == NCI_NFC_A_PASSIVE_POLL_MODE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) nfca_poll = (struct rf_tech_specific_params_nfca_poll *)params;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) target->sens_res = nfca_poll->sens_res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) target->sel_res = nfca_poll->sel_res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) target->nfcid1_len = nfca_poll->nfcid1_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) if (target->nfcid1_len > 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) memcpy(target->nfcid1, nfca_poll->nfcid1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) target->nfcid1_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) } else if (rf_tech_and_mode == NCI_NFC_B_PASSIVE_POLL_MODE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) nfcb_poll = (struct rf_tech_specific_params_nfcb_poll *)params;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) target->sensb_res_len = nfcb_poll->sensb_res_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) if (target->sensb_res_len > 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) memcpy(target->sensb_res, nfcb_poll->sensb_res,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) target->sensb_res_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) } else if (rf_tech_and_mode == NCI_NFC_F_PASSIVE_POLL_MODE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) nfcf_poll = (struct rf_tech_specific_params_nfcf_poll *)params;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) target->sensf_res_len = nfcf_poll->sensf_res_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) if (target->sensf_res_len > 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) memcpy(target->sensf_res, nfcf_poll->sensf_res,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) target->sensf_res_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) } else if (rf_tech_and_mode == NCI_NFC_V_PASSIVE_POLL_MODE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) nfcv_poll = (struct rf_tech_specific_params_nfcv_poll *)params;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) target->is_iso15693 = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) target->iso15693_dsfid = nfcv_poll->dsfid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) memcpy(target->iso15693_uid, nfcv_poll->uid, NFC_ISO15693_UID_MAXSIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) pr_err("unsupported rf_tech_and_mode 0x%x\n", rf_tech_and_mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) return -EPROTO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) target->supported_protocols |= protocol;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) pr_debug("protocol 0x%x\n", protocol);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) static void nci_add_new_target(struct nci_dev *ndev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) struct nci_rf_discover_ntf *ntf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) struct nfc_target *target;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) int i, rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) for (i = 0; i < ndev->n_targets; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) target = &ndev->targets[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) if (target->logical_idx == ntf->rf_discovery_id) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) /* This target already exists, add the new protocol */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) nci_add_new_protocol(ndev, target, ntf->rf_protocol,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) ntf->rf_tech_and_mode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) &ntf->rf_tech_specific_params);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) /* This is a new target, check if we've enough room */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) if (ndev->n_targets == NCI_MAX_DISCOVERED_TARGETS) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) pr_debug("not enough room, ignoring new target...\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) target = &ndev->targets[ndev->n_targets];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) rc = nci_add_new_protocol(ndev, target, ntf->rf_protocol,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) ntf->rf_tech_and_mode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) &ntf->rf_tech_specific_params);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) if (!rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) target->logical_idx = ntf->rf_discovery_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) ndev->n_targets++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) pr_debug("logical idx %d, n_targets %d\n", target->logical_idx,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) ndev->n_targets);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) void nci_clear_target_list(struct nci_dev *ndev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) memset(ndev->targets, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) (sizeof(struct nfc_target)*NCI_MAX_DISCOVERED_TARGETS));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) ndev->n_targets = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) static void nci_rf_discover_ntf_packet(struct nci_dev *ndev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) struct sk_buff *skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) struct nci_rf_discover_ntf ntf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) __u8 *data = skb->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) bool add_target = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) ntf.rf_discovery_id = *data++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) ntf.rf_protocol = *data++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) ntf.rf_tech_and_mode = *data++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) ntf.rf_tech_specific_params_len = *data++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) pr_debug("rf_discovery_id %d\n", ntf.rf_discovery_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) pr_debug("rf_protocol 0x%x\n", ntf.rf_protocol);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) pr_debug("rf_tech_and_mode 0x%x\n", ntf.rf_tech_and_mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) pr_debug("rf_tech_specific_params_len %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) ntf.rf_tech_specific_params_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) if (ntf.rf_tech_specific_params_len > 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) switch (ntf.rf_tech_and_mode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) case NCI_NFC_A_PASSIVE_POLL_MODE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) data = nci_extract_rf_params_nfca_passive_poll(ndev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) &(ntf.rf_tech_specific_params.nfca_poll), data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) case NCI_NFC_B_PASSIVE_POLL_MODE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) data = nci_extract_rf_params_nfcb_passive_poll(ndev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) &(ntf.rf_tech_specific_params.nfcb_poll), data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) case NCI_NFC_F_PASSIVE_POLL_MODE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) data = nci_extract_rf_params_nfcf_passive_poll(ndev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) &(ntf.rf_tech_specific_params.nfcf_poll), data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) case NCI_NFC_V_PASSIVE_POLL_MODE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) data = nci_extract_rf_params_nfcv_passive_poll(ndev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) &(ntf.rf_tech_specific_params.nfcv_poll), data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) pr_err("unsupported rf_tech_and_mode 0x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) ntf.rf_tech_and_mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) data += ntf.rf_tech_specific_params_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) add_target = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) ntf.ntf_type = *data++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) pr_debug("ntf_type %d\n", ntf.ntf_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) if (add_target == true)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) nci_add_new_target(ndev, &ntf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) if (ntf.ntf_type == NCI_DISCOVER_NTF_TYPE_MORE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) atomic_set(&ndev->state, NCI_W4_ALL_DISCOVERIES);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) atomic_set(&ndev->state, NCI_W4_HOST_SELECT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) nfc_targets_found(ndev->nfc_dev, ndev->targets,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) ndev->n_targets);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) static int nci_extract_activation_params_iso_dep(struct nci_dev *ndev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) struct nci_rf_intf_activated_ntf *ntf, __u8 *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) struct activation_params_nfca_poll_iso_dep *nfca_poll;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) struct activation_params_nfcb_poll_iso_dep *nfcb_poll;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) switch (ntf->activation_rf_tech_and_mode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) case NCI_NFC_A_PASSIVE_POLL_MODE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) nfca_poll = &ntf->activation_params.nfca_poll_iso_dep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) nfca_poll->rats_res_len = min_t(__u8, *data++, 20);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) pr_debug("rats_res_len %d\n", nfca_poll->rats_res_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) if (nfca_poll->rats_res_len > 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) memcpy(nfca_poll->rats_res,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) data, nfca_poll->rats_res_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) case NCI_NFC_B_PASSIVE_POLL_MODE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) nfcb_poll = &ntf->activation_params.nfcb_poll_iso_dep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) nfcb_poll->attrib_res_len = min_t(__u8, *data++, 50);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) pr_debug("attrib_res_len %d\n", nfcb_poll->attrib_res_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) if (nfcb_poll->attrib_res_len > 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) memcpy(nfcb_poll->attrib_res,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) data, nfcb_poll->attrib_res_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) pr_err("unsupported activation_rf_tech_and_mode 0x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) ntf->activation_rf_tech_and_mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) return NCI_STATUS_RF_PROTOCOL_ERROR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) return NCI_STATUS_OK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) static int nci_extract_activation_params_nfc_dep(struct nci_dev *ndev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) struct nci_rf_intf_activated_ntf *ntf, __u8 *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) struct activation_params_poll_nfc_dep *poll;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) struct activation_params_listen_nfc_dep *listen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) switch (ntf->activation_rf_tech_and_mode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) case NCI_NFC_A_PASSIVE_POLL_MODE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) case NCI_NFC_F_PASSIVE_POLL_MODE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) poll = &ntf->activation_params.poll_nfc_dep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) poll->atr_res_len = min_t(__u8, *data++,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) NFC_ATR_RES_MAXSIZE - 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) pr_debug("atr_res_len %d\n", poll->atr_res_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) if (poll->atr_res_len > 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) memcpy(poll->atr_res, data, poll->atr_res_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) case NCI_NFC_A_PASSIVE_LISTEN_MODE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) case NCI_NFC_F_PASSIVE_LISTEN_MODE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) listen = &ntf->activation_params.listen_nfc_dep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) listen->atr_req_len = min_t(__u8, *data++,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) NFC_ATR_REQ_MAXSIZE - 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) pr_debug("atr_req_len %d\n", listen->atr_req_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) if (listen->atr_req_len > 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) memcpy(listen->atr_req, data, listen->atr_req_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) pr_err("unsupported activation_rf_tech_and_mode 0x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) ntf->activation_rf_tech_and_mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) return NCI_STATUS_RF_PROTOCOL_ERROR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) return NCI_STATUS_OK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) static void nci_target_auto_activated(struct nci_dev *ndev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) struct nci_rf_intf_activated_ntf *ntf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) struct nfc_target *target;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) target = &ndev->targets[ndev->n_targets];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) rc = nci_add_new_protocol(ndev, target, ntf->rf_protocol,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) ntf->activation_rf_tech_and_mode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) &ntf->rf_tech_specific_params);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) target->logical_idx = ntf->rf_discovery_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) ndev->n_targets++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) pr_debug("logical idx %d, n_targets %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) target->logical_idx, ndev->n_targets);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) nfc_targets_found(ndev->nfc_dev, ndev->targets, ndev->n_targets);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) static int nci_store_general_bytes_nfc_dep(struct nci_dev *ndev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) struct nci_rf_intf_activated_ntf *ntf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) ndev->remote_gb_len = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) if (ntf->activation_params_len <= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) return NCI_STATUS_OK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) switch (ntf->activation_rf_tech_and_mode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) case NCI_NFC_A_PASSIVE_POLL_MODE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) case NCI_NFC_F_PASSIVE_POLL_MODE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) ndev->remote_gb_len = min_t(__u8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) (ntf->activation_params.poll_nfc_dep.atr_res_len
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) - NFC_ATR_RES_GT_OFFSET),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) NFC_ATR_RES_GB_MAXSIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) memcpy(ndev->remote_gb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) (ntf->activation_params.poll_nfc_dep.atr_res
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) + NFC_ATR_RES_GT_OFFSET),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) ndev->remote_gb_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) case NCI_NFC_A_PASSIVE_LISTEN_MODE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) case NCI_NFC_F_PASSIVE_LISTEN_MODE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) ndev->remote_gb_len = min_t(__u8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) (ntf->activation_params.listen_nfc_dep.atr_req_len
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) - NFC_ATR_REQ_GT_OFFSET),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) NFC_ATR_REQ_GB_MAXSIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) memcpy(ndev->remote_gb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) (ntf->activation_params.listen_nfc_dep.atr_req
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) + NFC_ATR_REQ_GT_OFFSET),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) ndev->remote_gb_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) pr_err("unsupported activation_rf_tech_and_mode 0x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) ntf->activation_rf_tech_and_mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) return NCI_STATUS_RF_PROTOCOL_ERROR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) return NCI_STATUS_OK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) static void nci_rf_intf_activated_ntf_packet(struct nci_dev *ndev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) struct sk_buff *skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) struct nci_conn_info *conn_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) struct nci_rf_intf_activated_ntf ntf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) __u8 *data = skb->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) int err = NCI_STATUS_OK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) ntf.rf_discovery_id = *data++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) ntf.rf_interface = *data++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) ntf.rf_protocol = *data++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) ntf.activation_rf_tech_and_mode = *data++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) ntf.max_data_pkt_payload_size = *data++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) ntf.initial_num_credits = *data++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) ntf.rf_tech_specific_params_len = *data++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) pr_debug("rf_discovery_id %d\n", ntf.rf_discovery_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) pr_debug("rf_interface 0x%x\n", ntf.rf_interface);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) pr_debug("rf_protocol 0x%x\n", ntf.rf_protocol);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) pr_debug("activation_rf_tech_and_mode 0x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) ntf.activation_rf_tech_and_mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) pr_debug("max_data_pkt_payload_size 0x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) ntf.max_data_pkt_payload_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) pr_debug("initial_num_credits 0x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) ntf.initial_num_credits);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) pr_debug("rf_tech_specific_params_len %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) ntf.rf_tech_specific_params_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) /* If this contains a value of 0x00 (NFCEE Direct RF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) * Interface) then all following parameters SHALL contain a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) * value of 0 and SHALL be ignored.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) if (ntf.rf_interface == NCI_RF_INTERFACE_NFCEE_DIRECT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) goto listen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) if (ntf.rf_tech_specific_params_len > 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) switch (ntf.activation_rf_tech_and_mode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) case NCI_NFC_A_PASSIVE_POLL_MODE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) data = nci_extract_rf_params_nfca_passive_poll(ndev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) &(ntf.rf_tech_specific_params.nfca_poll), data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) case NCI_NFC_B_PASSIVE_POLL_MODE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) data = nci_extract_rf_params_nfcb_passive_poll(ndev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) &(ntf.rf_tech_specific_params.nfcb_poll), data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) case NCI_NFC_F_PASSIVE_POLL_MODE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) data = nci_extract_rf_params_nfcf_passive_poll(ndev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) &(ntf.rf_tech_specific_params.nfcf_poll), data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) case NCI_NFC_V_PASSIVE_POLL_MODE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) data = nci_extract_rf_params_nfcv_passive_poll(ndev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) &(ntf.rf_tech_specific_params.nfcv_poll), data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) case NCI_NFC_A_PASSIVE_LISTEN_MODE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) /* no RF technology specific parameters */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) case NCI_NFC_F_PASSIVE_LISTEN_MODE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) data = nci_extract_rf_params_nfcf_passive_listen(ndev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) &(ntf.rf_tech_specific_params.nfcf_listen),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) pr_err("unsupported activation_rf_tech_and_mode 0x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) ntf.activation_rf_tech_and_mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) err = NCI_STATUS_RF_PROTOCOL_ERROR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) ntf.data_exch_rf_tech_and_mode = *data++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) ntf.data_exch_tx_bit_rate = *data++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) ntf.data_exch_rx_bit_rate = *data++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) ntf.activation_params_len = *data++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) pr_debug("data_exch_rf_tech_and_mode 0x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) ntf.data_exch_rf_tech_and_mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) pr_debug("data_exch_tx_bit_rate 0x%x\n", ntf.data_exch_tx_bit_rate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) pr_debug("data_exch_rx_bit_rate 0x%x\n", ntf.data_exch_rx_bit_rate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) pr_debug("activation_params_len %d\n", ntf.activation_params_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) if (ntf.activation_params_len > 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) switch (ntf.rf_interface) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) case NCI_RF_INTERFACE_ISO_DEP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) err = nci_extract_activation_params_iso_dep(ndev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) &ntf, data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) case NCI_RF_INTERFACE_NFC_DEP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) err = nci_extract_activation_params_nfc_dep(ndev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) &ntf, data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) case NCI_RF_INTERFACE_FRAME:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) /* no activation params */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) pr_err("unsupported rf_interface 0x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) ntf.rf_interface);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) err = NCI_STATUS_RF_PROTOCOL_ERROR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) exit:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) if (err == NCI_STATUS_OK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) conn_info = ndev->rf_conn_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) if (!conn_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) conn_info->max_pkt_payload_len = ntf.max_data_pkt_payload_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) conn_info->initial_num_credits = ntf.initial_num_credits;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) /* set the available credits to initial value */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) atomic_set(&conn_info->credits_cnt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) conn_info->initial_num_credits);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) /* store general bytes to be reported later in dep_link_up */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) if (ntf.rf_interface == NCI_RF_INTERFACE_NFC_DEP) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) err = nci_store_general_bytes_nfc_dep(ndev, &ntf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) if (err != NCI_STATUS_OK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) pr_err("unable to store general bytes\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) if (!(ntf.activation_rf_tech_and_mode & NCI_RF_TECH_MODE_LISTEN_MASK)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) /* Poll mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) if (atomic_read(&ndev->state) == NCI_DISCOVERY) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) /* A single target was found and activated
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) * automatically */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) atomic_set(&ndev->state, NCI_POLL_ACTIVE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) if (err == NCI_STATUS_OK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) nci_target_auto_activated(ndev, &ntf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) } else { /* ndev->state == NCI_W4_HOST_SELECT */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) /* A selected target was activated, so complete the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) * request */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) atomic_set(&ndev->state, NCI_POLL_ACTIVE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) nci_req_complete(ndev, err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) listen:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) /* Listen mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) atomic_set(&ndev->state, NCI_LISTEN_ACTIVE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) if (err == NCI_STATUS_OK &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) ntf.rf_protocol == NCI_RF_PROTOCOL_NFC_DEP) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) err = nfc_tm_activated(ndev->nfc_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) NFC_PROTO_NFC_DEP_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) NFC_COMM_PASSIVE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) ndev->remote_gb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) ndev->remote_gb_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) if (err != NCI_STATUS_OK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) pr_err("error when signaling tm activation\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) static void nci_rf_deactivate_ntf_packet(struct nci_dev *ndev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) struct sk_buff *skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) struct nci_conn_info *conn_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) struct nci_rf_deactivate_ntf *ntf = (void *) skb->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) pr_debug("entry, type 0x%x, reason 0x%x\n", ntf->type, ntf->reason);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) conn_info = ndev->rf_conn_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) if (!conn_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) /* drop tx data queue */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) skb_queue_purge(&ndev->tx_q);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) /* drop partial rx data packet */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) if (ndev->rx_data_reassembly) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) kfree_skb(ndev->rx_data_reassembly);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) ndev->rx_data_reassembly = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) /* complete the data exchange transaction, if exists */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) if (test_bit(NCI_DATA_EXCHANGE, &ndev->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) nci_data_exchange_complete(ndev, NULL, NCI_STATIC_RF_CONN_ID,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) -EIO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) switch (ntf->type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) case NCI_DEACTIVATE_TYPE_IDLE_MODE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) nci_clear_target_list(ndev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) atomic_set(&ndev->state, NCI_IDLE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) case NCI_DEACTIVATE_TYPE_SLEEP_MODE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) case NCI_DEACTIVATE_TYPE_SLEEP_AF_MODE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) atomic_set(&ndev->state, NCI_W4_HOST_SELECT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) case NCI_DEACTIVATE_TYPE_DISCOVERY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) nci_clear_target_list(ndev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) atomic_set(&ndev->state, NCI_DISCOVERY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) nci_req_complete(ndev, NCI_STATUS_OK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) static void nci_nfcee_discover_ntf_packet(struct nci_dev *ndev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) struct sk_buff *skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) u8 status = NCI_STATUS_OK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) struct nci_nfcee_discover_ntf *nfcee_ntf =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) (struct nci_nfcee_discover_ntf *)skb->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) pr_debug("\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) /* NFCForum NCI 9.2.1 HCI Network Specific Handling
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) * If the NFCC supports the HCI Network, it SHALL return one,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) * and only one, NFCEE_DISCOVER_NTF with a Protocol type of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) * “HCI Access”, even if the HCI Network contains multiple NFCEEs.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) ndev->hci_dev->nfcee_id = nfcee_ntf->nfcee_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) ndev->cur_params.id = nfcee_ntf->nfcee_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) nci_req_complete(ndev, status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) static void nci_nfcee_action_ntf_packet(struct nci_dev *ndev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) struct sk_buff *skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) pr_debug("\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) void nci_ntf_packet(struct nci_dev *ndev, struct sk_buff *skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) __u16 ntf_opcode = nci_opcode(skb->data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) pr_debug("NCI RX: MT=ntf, PBF=%d, GID=0x%x, OID=0x%x, plen=%d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) nci_pbf(skb->data),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) nci_opcode_gid(ntf_opcode),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) nci_opcode_oid(ntf_opcode),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) nci_plen(skb->data));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) /* strip the nci control header */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) skb_pull(skb, NCI_CTRL_HDR_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) if (nci_opcode_gid(ntf_opcode) == NCI_GID_PROPRIETARY) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) if (nci_prop_ntf_packet(ndev, ntf_opcode, skb) == -ENOTSUPP) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) pr_err("unsupported ntf opcode 0x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) ntf_opcode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) goto end;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) switch (ntf_opcode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) case NCI_OP_CORE_CONN_CREDITS_NTF:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) nci_core_conn_credits_ntf_packet(ndev, skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) case NCI_OP_CORE_GENERIC_ERROR_NTF:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) nci_core_generic_error_ntf_packet(ndev, skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) case NCI_OP_CORE_INTF_ERROR_NTF:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) nci_core_conn_intf_error_ntf_packet(ndev, skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) case NCI_OP_RF_DISCOVER_NTF:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) nci_rf_discover_ntf_packet(ndev, skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) case NCI_OP_RF_INTF_ACTIVATED_NTF:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) nci_rf_intf_activated_ntf_packet(ndev, skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) case NCI_OP_RF_DEACTIVATE_NTF:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) nci_rf_deactivate_ntf_packet(ndev, skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) case NCI_OP_NFCEE_DISCOVER_NTF:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) nci_nfcee_discover_ntf_packet(ndev, skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) case NCI_OP_RF_NFCEE_ACTION_NTF:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) nci_nfcee_action_ntf_packet(ndev, skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) pr_err("unknown ntf opcode 0x%x\n", ntf_opcode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) nci_core_ntf_packet(ndev, ntf_opcode, skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) end:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) kfree_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) }