Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9b8d1a4c authored by Christophe Ricard's avatar Christophe Ricard Committed by Samuel Ortiz
Browse files

nfc: nci: Add an additional parameter to identify a connection id



According to NCI specification, destination type and destination
specific parameters shall uniquely identify a single destination
for the Logical Connection.

Signed-off-by: default avatarChristophe Ricard <christophe-h.ricard@st.com>
Signed-off-by: default avatarSamuel Ortiz <sameo@linux.intel.com>
parent de5ea851
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -102,7 +102,8 @@ static int fdp_nci_create_conn(struct nci_dev *ndev)
	if (r)
		return r;

	return nci_get_conn_info_by_id(ndev, 0);
	return nci_get_conn_info_by_dest_type_params(ndev,
						     FDP_PATCH_CONN_DEST, NULL);
}

static inline int fdp_nci_get_versions(struct nci_dev *ndev)
+4 −2
Original line number Diff line number Diff line
@@ -600,10 +600,12 @@ static int st_nci_hci_network_init(struct nci_dev *ndev)
	 * HCI will be used here only for proprietary commands.
	 */
	if (test_bit(ST_NCI_FACTORY_MODE, &info->flags))
		r = nci_nfcee_mode_set(ndev, ndev->hci_dev->conn_info->id,
		r = nci_nfcee_mode_set(ndev,
				       ndev->hci_dev->conn_info->dest_params->id,
				       NCI_NFCEE_DISABLE);
	else
		r = nci_nfcee_mode_set(ndev, ndev->hci_dev->conn_info->id,
		r = nci_nfcee_mode_set(ndev,
				       ndev->hci_dev->conn_info->dest_params->id,
				       NCI_NFCEE_ENABLE);

free_dest_params:
+12 −3
Original line number Diff line number Diff line
@@ -109,7 +109,13 @@ struct nci_ops {

struct nci_conn_info {
	struct list_head list;
	__u8	id; /* can be an RF Discovery ID or an NFCEE ID */
	/* NCI specification 4.4.2 Connection Creation
	 * The combination of destination type and destination specific
	 * parameters shall uniquely identify a single destination for the
	 * Logical Connection
	 */
	struct dest_spec_params *dest_params;
	__u8	dest_type;
	__u8	conn_id;
	__u8	max_pkt_payload_len;

@@ -260,7 +266,9 @@ struct nci_dev {
	__u32			manufact_specific_info;

	/* Save RF Discovery ID or NFCEE ID under conn_create */
	__u8			cur_id;
	struct dest_spec_params cur_params;
	/* Save destination type under conn_create */
	__u8			cur_dest_type;

	/* stored during nci_data_exchange */
	struct sk_buff		*rx_data_reassembly;
@@ -378,7 +386,8 @@ void nci_clear_target_list(struct nci_dev *ndev);
void nci_req_complete(struct nci_dev *ndev, int result);
struct nci_conn_info *nci_get_conn_info_by_conn_id(struct nci_dev *ndev,
						   int conn_id);
int nci_get_conn_info_by_id(struct nci_dev *ndev, u8 id);
int nci_get_conn_info_by_dest_type_params(struct nci_dev *ndev, u8 dest_type,
					  struct dest_spec_params *params);

/* ----- NCI status code ----- */
int nci_to_errno(__u8 code);
+18 −7
Original line number Diff line number Diff line
@@ -64,18 +64,26 @@ struct nci_conn_info *nci_get_conn_info_by_conn_id(struct nci_dev *ndev,
	return NULL;
}

int nci_get_conn_info_by_id(struct nci_dev *ndev, u8 id)
int nci_get_conn_info_by_dest_type_params(struct nci_dev *ndev, u8 dest_type,
					  struct dest_spec_params *params)
{
	struct nci_conn_info *conn_info;

	list_for_each_entry(conn_info, &ndev->conn_info_list, list) {
		if (conn_info->id == id)
		if (conn_info->dest_type == dest_type) {
			if (!params)
				return conn_info->conn_id;
			if (conn_info) {
				if (params->id == conn_info->dest_params->id &&
				    params->protocol == conn_info->dest_params->protocol)
					return conn_info->conn_id;
			}
		}
	}

	return -EINVAL;
}
EXPORT_SYMBOL(nci_get_conn_info_by_id);
EXPORT_SYMBOL(nci_get_conn_info_by_dest_type_params);

/* ---- NCI requests ---- */

@@ -623,12 +631,15 @@ int nci_core_conn_create(struct nci_dev *ndev, u8 destination_type,
	if (params) {
		memcpy(cmd->params, params, params_len);
		if (params->length > 0)
			ndev->cur_id = params->value[DEST_SPEC_PARAMS_ID_INDEX];
			memcpy(&ndev->cur_params,
			       &params->value[DEST_SPEC_PARAMS_ID_INDEX],
			       sizeof(struct dest_spec_params));
		else
			ndev->cur_id = 0;
			ndev->cur_params.id = 0;
	} else {
		ndev->cur_id = 0;
		ndev->cur_params.id = 0;
	}
	ndev->cur_dest_type = destination_type;

	r = __nci_request(ndev, nci_core_conn_create_req, (unsigned long)&data,
			  msecs_to_jiffies(NCI_CMD_TIMEOUT));
+1 −1
Original line number Diff line number Diff line
@@ -734,7 +734,7 @@ static void nci_nfcee_discover_ntf_packet(struct nci_dev *ndev,
	 * “HCI Access”, even if the HCI Network contains multiple NFCEEs.
	 */
	ndev->hci_dev->nfcee_id = nfcee_ntf->nfcee_id;
	ndev->cur_id = nfcee_ntf->nfcee_id;
	ndev->cur_params.id = nfcee_ntf->nfcee_id;

	nci_req_complete(ndev, status);
}
Loading