cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

core.c (38192B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 *  The NFC Controller Interface is the communication protocol between an
      4 *  NFC Controller (NFCC) and a Device Host (DH).
      5 *
      6 *  Copyright (C) 2011 Texas Instruments, Inc.
      7 *  Copyright (C) 2014 Marvell International Ltd.
      8 *
      9 *  Written by Ilan Elias <ilane@ti.com>
     10 *
     11 *  Acknowledgements:
     12 *  This file is based on hci_core.c, which was written
     13 *  by Maxim Krasnyansky.
     14 */
     15
     16#define pr_fmt(fmt) KBUILD_MODNAME ": %s: " fmt, __func__
     17
     18#include <linux/module.h>
     19#include <linux/kernel.h>
     20#include <linux/types.h>
     21#include <linux/workqueue.h>
     22#include <linux/completion.h>
     23#include <linux/export.h>
     24#include <linux/sched.h>
     25#include <linux/bitops.h>
     26#include <linux/skbuff.h>
     27
     28#include "../nfc.h"
     29#include <net/nfc/nci.h>
     30#include <net/nfc/nci_core.h>
     31#include <linux/nfc.h>
     32
     33struct core_conn_create_data {
     34	int length;
     35	struct nci_core_conn_create_cmd *cmd;
     36};
     37
     38static void nci_cmd_work(struct work_struct *work);
     39static void nci_rx_work(struct work_struct *work);
     40static void nci_tx_work(struct work_struct *work);
     41
     42struct nci_conn_info *nci_get_conn_info_by_conn_id(struct nci_dev *ndev,
     43						   int conn_id)
     44{
     45	struct nci_conn_info *conn_info;
     46
     47	list_for_each_entry(conn_info, &ndev->conn_info_list, list) {
     48		if (conn_info->conn_id == conn_id)
     49			return conn_info;
     50	}
     51
     52	return NULL;
     53}
     54
     55int nci_get_conn_info_by_dest_type_params(struct nci_dev *ndev, u8 dest_type,
     56					  const struct dest_spec_params *params)
     57{
     58	const struct nci_conn_info *conn_info;
     59
     60	list_for_each_entry(conn_info, &ndev->conn_info_list, list) {
     61		if (conn_info->dest_type == dest_type) {
     62			if (!params)
     63				return conn_info->conn_id;
     64
     65			if (params->id == conn_info->dest_params->id &&
     66			    params->protocol == conn_info->dest_params->protocol)
     67				return conn_info->conn_id;
     68		}
     69	}
     70
     71	return -EINVAL;
     72}
     73EXPORT_SYMBOL(nci_get_conn_info_by_dest_type_params);
     74
     75/* ---- NCI requests ---- */
     76
     77void nci_req_complete(struct nci_dev *ndev, int result)
     78{
     79	if (ndev->req_status == NCI_REQ_PEND) {
     80		ndev->req_result = result;
     81		ndev->req_status = NCI_REQ_DONE;
     82		complete(&ndev->req_completion);
     83	}
     84}
     85EXPORT_SYMBOL(nci_req_complete);
     86
     87static void nci_req_cancel(struct nci_dev *ndev, int err)
     88{
     89	if (ndev->req_status == NCI_REQ_PEND) {
     90		ndev->req_result = err;
     91		ndev->req_status = NCI_REQ_CANCELED;
     92		complete(&ndev->req_completion);
     93	}
     94}
     95
     96/* Execute request and wait for completion. */
     97static int __nci_request(struct nci_dev *ndev,
     98			 void (*req)(struct nci_dev *ndev, const void *opt),
     99			 const void *opt, __u32 timeout)
    100{
    101	int rc = 0;
    102	long completion_rc;
    103
    104	ndev->req_status = NCI_REQ_PEND;
    105
    106	reinit_completion(&ndev->req_completion);
    107	req(ndev, opt);
    108	completion_rc =
    109		wait_for_completion_interruptible_timeout(&ndev->req_completion,
    110							  timeout);
    111
    112	pr_debug("wait_for_completion return %ld\n", completion_rc);
    113
    114	if (completion_rc > 0) {
    115		switch (ndev->req_status) {
    116		case NCI_REQ_DONE:
    117			rc = nci_to_errno(ndev->req_result);
    118			break;
    119
    120		case NCI_REQ_CANCELED:
    121			rc = -ndev->req_result;
    122			break;
    123
    124		default:
    125			rc = -ETIMEDOUT;
    126			break;
    127		}
    128	} else {
    129		pr_err("wait_for_completion_interruptible_timeout failed %ld\n",
    130		       completion_rc);
    131
    132		rc = ((completion_rc == 0) ? (-ETIMEDOUT) : (completion_rc));
    133	}
    134
    135	ndev->req_status = ndev->req_result = 0;
    136
    137	return rc;
    138}
    139
    140inline int nci_request(struct nci_dev *ndev,
    141		       void (*req)(struct nci_dev *ndev,
    142				   const void *opt),
    143		       const void *opt, __u32 timeout)
    144{
    145	int rc;
    146
    147	/* Serialize all requests */
    148	mutex_lock(&ndev->req_lock);
    149	/* check the state after obtaing the lock against any races
    150	 * from nci_close_device when the device gets removed.
    151	 */
    152	if (test_bit(NCI_UP, &ndev->flags))
    153		rc = __nci_request(ndev, req, opt, timeout);
    154	else
    155		rc = -ENETDOWN;
    156	mutex_unlock(&ndev->req_lock);
    157
    158	return rc;
    159}
    160
    161static void nci_reset_req(struct nci_dev *ndev, const void *opt)
    162{
    163	struct nci_core_reset_cmd cmd;
    164
    165	cmd.reset_type = NCI_RESET_TYPE_RESET_CONFIG;
    166	nci_send_cmd(ndev, NCI_OP_CORE_RESET_CMD, 1, &cmd);
    167}
    168
    169static void nci_init_req(struct nci_dev *ndev, const void *opt)
    170{
    171	u8 plen = 0;
    172
    173	if (opt)
    174		plen = sizeof(struct nci_core_init_v2_cmd);
    175
    176	nci_send_cmd(ndev, NCI_OP_CORE_INIT_CMD, plen, opt);
    177}
    178
    179static void nci_init_complete_req(struct nci_dev *ndev, const void *opt)
    180{
    181	struct nci_rf_disc_map_cmd cmd;
    182	struct disc_map_config *cfg = cmd.mapping_configs;
    183	__u8 *num = &cmd.num_mapping_configs;
    184	int i;
    185
    186	/* set rf mapping configurations */
    187	*num = 0;
    188
    189	/* by default mapping is set to NCI_RF_INTERFACE_FRAME */
    190	for (i = 0; i < ndev->num_supported_rf_interfaces; i++) {
    191		if (ndev->supported_rf_interfaces[i] ==
    192		    NCI_RF_INTERFACE_ISO_DEP) {
    193			cfg[*num].rf_protocol = NCI_RF_PROTOCOL_ISO_DEP;
    194			cfg[*num].mode = NCI_DISC_MAP_MODE_POLL |
    195				NCI_DISC_MAP_MODE_LISTEN;
    196			cfg[*num].rf_interface = NCI_RF_INTERFACE_ISO_DEP;
    197			(*num)++;
    198		} else if (ndev->supported_rf_interfaces[i] ==
    199			   NCI_RF_INTERFACE_NFC_DEP) {
    200			cfg[*num].rf_protocol = NCI_RF_PROTOCOL_NFC_DEP;
    201			cfg[*num].mode = NCI_DISC_MAP_MODE_POLL |
    202				NCI_DISC_MAP_MODE_LISTEN;
    203			cfg[*num].rf_interface = NCI_RF_INTERFACE_NFC_DEP;
    204			(*num)++;
    205		}
    206
    207		if (*num == NCI_MAX_NUM_MAPPING_CONFIGS)
    208			break;
    209	}
    210
    211	nci_send_cmd(ndev, NCI_OP_RF_DISCOVER_MAP_CMD,
    212		     (1 + ((*num) * sizeof(struct disc_map_config))), &cmd);
    213}
    214
    215struct nci_set_config_param {
    216	__u8		id;
    217	size_t		len;
    218	const __u8	*val;
    219};
    220
    221static void nci_set_config_req(struct nci_dev *ndev, const void *opt)
    222{
    223	const struct nci_set_config_param *param = opt;
    224	struct nci_core_set_config_cmd cmd;
    225
    226	BUG_ON(param->len > NCI_MAX_PARAM_LEN);
    227
    228	cmd.num_params = 1;
    229	cmd.param.id = param->id;
    230	cmd.param.len = param->len;
    231	memcpy(cmd.param.val, param->val, param->len);
    232
    233	nci_send_cmd(ndev, NCI_OP_CORE_SET_CONFIG_CMD, (3 + param->len), &cmd);
    234}
    235
    236struct nci_rf_discover_param {
    237	__u32	im_protocols;
    238	__u32	tm_protocols;
    239};
    240
    241static void nci_rf_discover_req(struct nci_dev *ndev, const void *opt)
    242{
    243	const struct nci_rf_discover_param *param = opt;
    244	struct nci_rf_disc_cmd cmd;
    245
    246	cmd.num_disc_configs = 0;
    247
    248	if ((cmd.num_disc_configs < NCI_MAX_NUM_RF_CONFIGS) &&
    249	    (param->im_protocols & NFC_PROTO_JEWEL_MASK ||
    250	     param->im_protocols & NFC_PROTO_MIFARE_MASK ||
    251	     param->im_protocols & NFC_PROTO_ISO14443_MASK ||
    252	     param->im_protocols & NFC_PROTO_NFC_DEP_MASK)) {
    253		cmd.disc_configs[cmd.num_disc_configs].rf_tech_and_mode =
    254			NCI_NFC_A_PASSIVE_POLL_MODE;
    255		cmd.disc_configs[cmd.num_disc_configs].frequency = 1;
    256		cmd.num_disc_configs++;
    257	}
    258
    259	if ((cmd.num_disc_configs < NCI_MAX_NUM_RF_CONFIGS) &&
    260	    (param->im_protocols & NFC_PROTO_ISO14443_B_MASK)) {
    261		cmd.disc_configs[cmd.num_disc_configs].rf_tech_and_mode =
    262			NCI_NFC_B_PASSIVE_POLL_MODE;
    263		cmd.disc_configs[cmd.num_disc_configs].frequency = 1;
    264		cmd.num_disc_configs++;
    265	}
    266
    267	if ((cmd.num_disc_configs < NCI_MAX_NUM_RF_CONFIGS) &&
    268	    (param->im_protocols & NFC_PROTO_FELICA_MASK ||
    269	     param->im_protocols & NFC_PROTO_NFC_DEP_MASK)) {
    270		cmd.disc_configs[cmd.num_disc_configs].rf_tech_and_mode =
    271			NCI_NFC_F_PASSIVE_POLL_MODE;
    272		cmd.disc_configs[cmd.num_disc_configs].frequency = 1;
    273		cmd.num_disc_configs++;
    274	}
    275
    276	if ((cmd.num_disc_configs < NCI_MAX_NUM_RF_CONFIGS) &&
    277	    (param->im_protocols & NFC_PROTO_ISO15693_MASK)) {
    278		cmd.disc_configs[cmd.num_disc_configs].rf_tech_and_mode =
    279			NCI_NFC_V_PASSIVE_POLL_MODE;
    280		cmd.disc_configs[cmd.num_disc_configs].frequency = 1;
    281		cmd.num_disc_configs++;
    282	}
    283
    284	if ((cmd.num_disc_configs < NCI_MAX_NUM_RF_CONFIGS - 1) &&
    285	    (param->tm_protocols & NFC_PROTO_NFC_DEP_MASK)) {
    286		cmd.disc_configs[cmd.num_disc_configs].rf_tech_and_mode =
    287			NCI_NFC_A_PASSIVE_LISTEN_MODE;
    288		cmd.disc_configs[cmd.num_disc_configs].frequency = 1;
    289		cmd.num_disc_configs++;
    290		cmd.disc_configs[cmd.num_disc_configs].rf_tech_and_mode =
    291			NCI_NFC_F_PASSIVE_LISTEN_MODE;
    292		cmd.disc_configs[cmd.num_disc_configs].frequency = 1;
    293		cmd.num_disc_configs++;
    294	}
    295
    296	nci_send_cmd(ndev, NCI_OP_RF_DISCOVER_CMD,
    297		     (1 + (cmd.num_disc_configs * sizeof(struct disc_config))),
    298		     &cmd);
    299}
    300
    301struct nci_rf_discover_select_param {
    302	__u8	rf_discovery_id;
    303	__u8	rf_protocol;
    304};
    305
    306static void nci_rf_discover_select_req(struct nci_dev *ndev, const void *opt)
    307{
    308	const struct nci_rf_discover_select_param *param = opt;
    309	struct nci_rf_discover_select_cmd cmd;
    310
    311	cmd.rf_discovery_id = param->rf_discovery_id;
    312	cmd.rf_protocol = param->rf_protocol;
    313
    314	switch (cmd.rf_protocol) {
    315	case NCI_RF_PROTOCOL_ISO_DEP:
    316		cmd.rf_interface = NCI_RF_INTERFACE_ISO_DEP;
    317		break;
    318
    319	case NCI_RF_PROTOCOL_NFC_DEP:
    320		cmd.rf_interface = NCI_RF_INTERFACE_NFC_DEP;
    321		break;
    322
    323	default:
    324		cmd.rf_interface = NCI_RF_INTERFACE_FRAME;
    325		break;
    326	}
    327
    328	nci_send_cmd(ndev, NCI_OP_RF_DISCOVER_SELECT_CMD,
    329		     sizeof(struct nci_rf_discover_select_cmd), &cmd);
    330}
    331
    332static void nci_rf_deactivate_req(struct nci_dev *ndev, const void *opt)
    333{
    334	struct nci_rf_deactivate_cmd cmd;
    335
    336	cmd.type = (unsigned long)opt;
    337
    338	nci_send_cmd(ndev, NCI_OP_RF_DEACTIVATE_CMD,
    339		     sizeof(struct nci_rf_deactivate_cmd), &cmd);
    340}
    341
    342struct nci_cmd_param {
    343	__u16 opcode;
    344	size_t len;
    345	const __u8 *payload;
    346};
    347
    348static void nci_generic_req(struct nci_dev *ndev, const void *opt)
    349{
    350	const struct nci_cmd_param *param = opt;
    351
    352	nci_send_cmd(ndev, param->opcode, param->len, param->payload);
    353}
    354
    355int nci_prop_cmd(struct nci_dev *ndev, __u8 oid, size_t len, const __u8 *payload)
    356{
    357	struct nci_cmd_param param;
    358
    359	param.opcode = nci_opcode_pack(NCI_GID_PROPRIETARY, oid);
    360	param.len = len;
    361	param.payload = payload;
    362
    363	return __nci_request(ndev, nci_generic_req, &param,
    364			     msecs_to_jiffies(NCI_CMD_TIMEOUT));
    365}
    366EXPORT_SYMBOL(nci_prop_cmd);
    367
    368int nci_core_cmd(struct nci_dev *ndev, __u16 opcode, size_t len,
    369		 const __u8 *payload)
    370{
    371	struct nci_cmd_param param;
    372
    373	param.opcode = opcode;
    374	param.len = len;
    375	param.payload = payload;
    376
    377	return __nci_request(ndev, nci_generic_req, &param,
    378			     msecs_to_jiffies(NCI_CMD_TIMEOUT));
    379}
    380EXPORT_SYMBOL(nci_core_cmd);
    381
    382int nci_core_reset(struct nci_dev *ndev)
    383{
    384	return __nci_request(ndev, nci_reset_req, (void *)0,
    385			     msecs_to_jiffies(NCI_RESET_TIMEOUT));
    386}
    387EXPORT_SYMBOL(nci_core_reset);
    388
    389int nci_core_init(struct nci_dev *ndev)
    390{
    391	return __nci_request(ndev, nci_init_req, (void *)0,
    392			     msecs_to_jiffies(NCI_INIT_TIMEOUT));
    393}
    394EXPORT_SYMBOL(nci_core_init);
    395
    396struct nci_loopback_data {
    397	u8 conn_id;
    398	struct sk_buff *data;
    399};
    400
    401static void nci_send_data_req(struct nci_dev *ndev, const void *opt)
    402{
    403	const struct nci_loopback_data *data = opt;
    404
    405	nci_send_data(ndev, data->conn_id, data->data);
    406}
    407
    408static void nci_nfcc_loopback_cb(void *context, struct sk_buff *skb, int err)
    409{
    410	struct nci_dev *ndev = (struct nci_dev *)context;
    411	struct nci_conn_info *conn_info;
    412
    413	conn_info = nci_get_conn_info_by_conn_id(ndev, ndev->cur_conn_id);
    414	if (!conn_info) {
    415		nci_req_complete(ndev, NCI_STATUS_REJECTED);
    416		return;
    417	}
    418
    419	conn_info->rx_skb = skb;
    420
    421	nci_req_complete(ndev, NCI_STATUS_OK);
    422}
    423
    424int nci_nfcc_loopback(struct nci_dev *ndev, const void *data, size_t data_len,
    425		      struct sk_buff **resp)
    426{
    427	int r;
    428	struct nci_loopback_data loopback_data;
    429	struct nci_conn_info *conn_info;
    430	struct sk_buff *skb;
    431	int conn_id = nci_get_conn_info_by_dest_type_params(ndev,
    432					NCI_DESTINATION_NFCC_LOOPBACK, NULL);
    433
    434	if (conn_id < 0) {
    435		r = nci_core_conn_create(ndev, NCI_DESTINATION_NFCC_LOOPBACK,
    436					 0, 0, NULL);
    437		if (r != NCI_STATUS_OK)
    438			return r;
    439
    440		conn_id = nci_get_conn_info_by_dest_type_params(ndev,
    441					NCI_DESTINATION_NFCC_LOOPBACK,
    442					NULL);
    443	}
    444
    445	conn_info = nci_get_conn_info_by_conn_id(ndev, conn_id);
    446	if (!conn_info)
    447		return -EPROTO;
    448
    449	/* store cb and context to be used on receiving data */
    450	conn_info->data_exchange_cb = nci_nfcc_loopback_cb;
    451	conn_info->data_exchange_cb_context = ndev;
    452
    453	skb = nci_skb_alloc(ndev, NCI_DATA_HDR_SIZE + data_len, GFP_KERNEL);
    454	if (!skb)
    455		return -ENOMEM;
    456
    457	skb_reserve(skb, NCI_DATA_HDR_SIZE);
    458	skb_put_data(skb, data, data_len);
    459
    460	loopback_data.conn_id = conn_id;
    461	loopback_data.data = skb;
    462
    463	ndev->cur_conn_id = conn_id;
    464	r = nci_request(ndev, nci_send_data_req, &loopback_data,
    465			msecs_to_jiffies(NCI_DATA_TIMEOUT));
    466	if (r == NCI_STATUS_OK && resp)
    467		*resp = conn_info->rx_skb;
    468
    469	return r;
    470}
    471EXPORT_SYMBOL(nci_nfcc_loopback);
    472
    473static int nci_open_device(struct nci_dev *ndev)
    474{
    475	int rc = 0;
    476
    477	mutex_lock(&ndev->req_lock);
    478
    479	if (test_bit(NCI_UNREG, &ndev->flags)) {
    480		rc = -ENODEV;
    481		goto done;
    482	}
    483
    484	if (test_bit(NCI_UP, &ndev->flags)) {
    485		rc = -EALREADY;
    486		goto done;
    487	}
    488
    489	if (ndev->ops->open(ndev)) {
    490		rc = -EIO;
    491		goto done;
    492	}
    493
    494	atomic_set(&ndev->cmd_cnt, 1);
    495
    496	set_bit(NCI_INIT, &ndev->flags);
    497
    498	if (ndev->ops->init)
    499		rc = ndev->ops->init(ndev);
    500
    501	if (!rc) {
    502		rc = __nci_request(ndev, nci_reset_req, (void *)0,
    503				   msecs_to_jiffies(NCI_RESET_TIMEOUT));
    504	}
    505
    506	if (!rc && ndev->ops->setup) {
    507		rc = ndev->ops->setup(ndev);
    508	}
    509
    510	if (!rc) {
    511		struct nci_core_init_v2_cmd nci_init_v2_cmd = {
    512			.feature1 = NCI_FEATURE_DISABLE,
    513			.feature2 = NCI_FEATURE_DISABLE
    514		};
    515		const void *opt = NULL;
    516
    517		if (ndev->nci_ver & NCI_VER_2_MASK)
    518			opt = &nci_init_v2_cmd;
    519
    520		rc = __nci_request(ndev, nci_init_req, opt,
    521				   msecs_to_jiffies(NCI_INIT_TIMEOUT));
    522	}
    523
    524	if (!rc && ndev->ops->post_setup)
    525		rc = ndev->ops->post_setup(ndev);
    526
    527	if (!rc) {
    528		rc = __nci_request(ndev, nci_init_complete_req, (void *)0,
    529				   msecs_to_jiffies(NCI_INIT_TIMEOUT));
    530	}
    531
    532	clear_bit(NCI_INIT, &ndev->flags);
    533
    534	if (!rc) {
    535		set_bit(NCI_UP, &ndev->flags);
    536		nci_clear_target_list(ndev);
    537		atomic_set(&ndev->state, NCI_IDLE);
    538	} else {
    539		/* Init failed, cleanup */
    540		skb_queue_purge(&ndev->cmd_q);
    541		skb_queue_purge(&ndev->rx_q);
    542		skb_queue_purge(&ndev->tx_q);
    543
    544		ndev->ops->close(ndev);
    545		ndev->flags = 0;
    546	}
    547
    548done:
    549	mutex_unlock(&ndev->req_lock);
    550	return rc;
    551}
    552
    553static int nci_close_device(struct nci_dev *ndev)
    554{
    555	nci_req_cancel(ndev, ENODEV);
    556
    557	/* This mutex needs to be held as a barrier for
    558	 * caller nci_unregister_device
    559	 */
    560	mutex_lock(&ndev->req_lock);
    561
    562	if (!test_and_clear_bit(NCI_UP, &ndev->flags)) {
    563		/* Need to flush the cmd wq in case
    564		 * there is a queued/running cmd_work
    565		 */
    566		flush_workqueue(ndev->cmd_wq);
    567		del_timer_sync(&ndev->cmd_timer);
    568		del_timer_sync(&ndev->data_timer);
    569		mutex_unlock(&ndev->req_lock);
    570		return 0;
    571	}
    572
    573	/* Drop RX and TX queues */
    574	skb_queue_purge(&ndev->rx_q);
    575	skb_queue_purge(&ndev->tx_q);
    576
    577	/* Flush RX and TX wq */
    578	flush_workqueue(ndev->rx_wq);
    579	flush_workqueue(ndev->tx_wq);
    580
    581	/* Reset device */
    582	skb_queue_purge(&ndev->cmd_q);
    583	atomic_set(&ndev->cmd_cnt, 1);
    584
    585	set_bit(NCI_INIT, &ndev->flags);
    586	__nci_request(ndev, nci_reset_req, (void *)0,
    587		      msecs_to_jiffies(NCI_RESET_TIMEOUT));
    588
    589	/* After this point our queues are empty
    590	 * and no works are scheduled.
    591	 */
    592	ndev->ops->close(ndev);
    593
    594	clear_bit(NCI_INIT, &ndev->flags);
    595
    596	/* Flush cmd wq */
    597	flush_workqueue(ndev->cmd_wq);
    598
    599	del_timer_sync(&ndev->cmd_timer);
    600
    601	/* Clear flags except NCI_UNREG */
    602	ndev->flags &= BIT(NCI_UNREG);
    603
    604	mutex_unlock(&ndev->req_lock);
    605
    606	return 0;
    607}
    608
    609/* NCI command timer function */
    610static void nci_cmd_timer(struct timer_list *t)
    611{
    612	struct nci_dev *ndev = from_timer(ndev, t, cmd_timer);
    613
    614	atomic_set(&ndev->cmd_cnt, 1);
    615	queue_work(ndev->cmd_wq, &ndev->cmd_work);
    616}
    617
    618/* NCI data exchange timer function */
    619static void nci_data_timer(struct timer_list *t)
    620{
    621	struct nci_dev *ndev = from_timer(ndev, t, data_timer);
    622
    623	set_bit(NCI_DATA_EXCHANGE_TO, &ndev->flags);
    624	queue_work(ndev->rx_wq, &ndev->rx_work);
    625}
    626
    627static int nci_dev_up(struct nfc_dev *nfc_dev)
    628{
    629	struct nci_dev *ndev = nfc_get_drvdata(nfc_dev);
    630
    631	return nci_open_device(ndev);
    632}
    633
    634static int nci_dev_down(struct nfc_dev *nfc_dev)
    635{
    636	struct nci_dev *ndev = nfc_get_drvdata(nfc_dev);
    637
    638	return nci_close_device(ndev);
    639}
    640
    641int nci_set_config(struct nci_dev *ndev, __u8 id, size_t len, const __u8 *val)
    642{
    643	struct nci_set_config_param param;
    644
    645	if (!val || !len)
    646		return 0;
    647
    648	param.id = id;
    649	param.len = len;
    650	param.val = val;
    651
    652	return __nci_request(ndev, nci_set_config_req, &param,
    653			     msecs_to_jiffies(NCI_SET_CONFIG_TIMEOUT));
    654}
    655EXPORT_SYMBOL(nci_set_config);
    656
    657static void nci_nfcee_discover_req(struct nci_dev *ndev, const void *opt)
    658{
    659	struct nci_nfcee_discover_cmd cmd;
    660	__u8 action = (unsigned long)opt;
    661
    662	cmd.discovery_action = action;
    663
    664	nci_send_cmd(ndev, NCI_OP_NFCEE_DISCOVER_CMD, 1, &cmd);
    665}
    666
    667int nci_nfcee_discover(struct nci_dev *ndev, u8 action)
    668{
    669	unsigned long opt = action;
    670
    671	return __nci_request(ndev, nci_nfcee_discover_req, (void *)opt,
    672				msecs_to_jiffies(NCI_CMD_TIMEOUT));
    673}
    674EXPORT_SYMBOL(nci_nfcee_discover);
    675
    676static void nci_nfcee_mode_set_req(struct nci_dev *ndev, const void *opt)
    677{
    678	const struct nci_nfcee_mode_set_cmd *cmd = opt;
    679
    680	nci_send_cmd(ndev, NCI_OP_NFCEE_MODE_SET_CMD,
    681		     sizeof(struct nci_nfcee_mode_set_cmd), cmd);
    682}
    683
    684int nci_nfcee_mode_set(struct nci_dev *ndev, u8 nfcee_id, u8 nfcee_mode)
    685{
    686	struct nci_nfcee_mode_set_cmd cmd;
    687
    688	cmd.nfcee_id = nfcee_id;
    689	cmd.nfcee_mode = nfcee_mode;
    690
    691	return __nci_request(ndev, nci_nfcee_mode_set_req, &cmd,
    692			     msecs_to_jiffies(NCI_CMD_TIMEOUT));
    693}
    694EXPORT_SYMBOL(nci_nfcee_mode_set);
    695
    696static void nci_core_conn_create_req(struct nci_dev *ndev, const void *opt)
    697{
    698	const struct core_conn_create_data *data = opt;
    699
    700	nci_send_cmd(ndev, NCI_OP_CORE_CONN_CREATE_CMD, data->length, data->cmd);
    701}
    702
    703int nci_core_conn_create(struct nci_dev *ndev, u8 destination_type,
    704			 u8 number_destination_params,
    705			 size_t params_len,
    706			 const struct core_conn_create_dest_spec_params *params)
    707{
    708	int r;
    709	struct nci_core_conn_create_cmd *cmd;
    710	struct core_conn_create_data data;
    711
    712	data.length = params_len + sizeof(struct nci_core_conn_create_cmd);
    713	cmd = kzalloc(data.length, GFP_KERNEL);
    714	if (!cmd)
    715		return -ENOMEM;
    716
    717	cmd->destination_type = destination_type;
    718	cmd->number_destination_params = number_destination_params;
    719
    720	data.cmd = cmd;
    721
    722	if (params) {
    723		memcpy(cmd->params, params, params_len);
    724		if (params->length > 0)
    725			memcpy(&ndev->cur_params,
    726			       &params->value[DEST_SPEC_PARAMS_ID_INDEX],
    727			       sizeof(struct dest_spec_params));
    728		else
    729			ndev->cur_params.id = 0;
    730	} else {
    731		ndev->cur_params.id = 0;
    732	}
    733	ndev->cur_dest_type = destination_type;
    734
    735	r = __nci_request(ndev, nci_core_conn_create_req, &data,
    736			  msecs_to_jiffies(NCI_CMD_TIMEOUT));
    737	kfree(cmd);
    738	return r;
    739}
    740EXPORT_SYMBOL(nci_core_conn_create);
    741
    742static void nci_core_conn_close_req(struct nci_dev *ndev, const void *opt)
    743{
    744	__u8 conn_id = (unsigned long)opt;
    745
    746	nci_send_cmd(ndev, NCI_OP_CORE_CONN_CLOSE_CMD, 1, &conn_id);
    747}
    748
    749int nci_core_conn_close(struct nci_dev *ndev, u8 conn_id)
    750{
    751	unsigned long opt = conn_id;
    752
    753	ndev->cur_conn_id = conn_id;
    754	return __nci_request(ndev, nci_core_conn_close_req, (void *)opt,
    755			     msecs_to_jiffies(NCI_CMD_TIMEOUT));
    756}
    757EXPORT_SYMBOL(nci_core_conn_close);
    758
    759static int nci_set_local_general_bytes(struct nfc_dev *nfc_dev)
    760{
    761	struct nci_dev *ndev = nfc_get_drvdata(nfc_dev);
    762	struct nci_set_config_param param;
    763	int rc;
    764
    765	param.val = nfc_get_local_general_bytes(nfc_dev, &param.len);
    766	if ((param.val == NULL) || (param.len == 0))
    767		return 0;
    768
    769	if (param.len > NFC_MAX_GT_LEN)
    770		return -EINVAL;
    771
    772	param.id = NCI_PN_ATR_REQ_GEN_BYTES;
    773
    774	rc = nci_request(ndev, nci_set_config_req, &param,
    775			 msecs_to_jiffies(NCI_SET_CONFIG_TIMEOUT));
    776	if (rc)
    777		return rc;
    778
    779	param.id = NCI_LN_ATR_RES_GEN_BYTES;
    780
    781	return nci_request(ndev, nci_set_config_req, &param,
    782			   msecs_to_jiffies(NCI_SET_CONFIG_TIMEOUT));
    783}
    784
    785static int nci_set_listen_parameters(struct nfc_dev *nfc_dev)
    786{
    787	struct nci_dev *ndev = nfc_get_drvdata(nfc_dev);
    788	int rc;
    789	__u8 val;
    790
    791	val = NCI_LA_SEL_INFO_NFC_DEP_MASK;
    792
    793	rc = nci_set_config(ndev, NCI_LA_SEL_INFO, 1, &val);
    794	if (rc)
    795		return rc;
    796
    797	val = NCI_LF_PROTOCOL_TYPE_NFC_DEP_MASK;
    798
    799	rc = nci_set_config(ndev, NCI_LF_PROTOCOL_TYPE, 1, &val);
    800	if (rc)
    801		return rc;
    802
    803	val = NCI_LF_CON_BITR_F_212 | NCI_LF_CON_BITR_F_424;
    804
    805	return nci_set_config(ndev, NCI_LF_CON_BITR_F, 1, &val);
    806}
    807
    808static int nci_start_poll(struct nfc_dev *nfc_dev,
    809			  __u32 im_protocols, __u32 tm_protocols)
    810{
    811	struct nci_dev *ndev = nfc_get_drvdata(nfc_dev);
    812	struct nci_rf_discover_param param;
    813	int rc;
    814
    815	if ((atomic_read(&ndev->state) == NCI_DISCOVERY) ||
    816	    (atomic_read(&ndev->state) == NCI_W4_ALL_DISCOVERIES)) {
    817		pr_err("unable to start poll, since poll is already active\n");
    818		return -EBUSY;
    819	}
    820
    821	if (ndev->target_active_prot) {
    822		pr_err("there is an active target\n");
    823		return -EBUSY;
    824	}
    825
    826	if ((atomic_read(&ndev->state) == NCI_W4_HOST_SELECT) ||
    827	    (atomic_read(&ndev->state) == NCI_POLL_ACTIVE)) {
    828		pr_debug("target active or w4 select, implicitly deactivate\n");
    829
    830		rc = nci_request(ndev, nci_rf_deactivate_req,
    831				 (void *)NCI_DEACTIVATE_TYPE_IDLE_MODE,
    832				 msecs_to_jiffies(NCI_RF_DEACTIVATE_TIMEOUT));
    833		if (rc)
    834			return -EBUSY;
    835	}
    836
    837	if ((im_protocols | tm_protocols) & NFC_PROTO_NFC_DEP_MASK) {
    838		rc = nci_set_local_general_bytes(nfc_dev);
    839		if (rc) {
    840			pr_err("failed to set local general bytes\n");
    841			return rc;
    842		}
    843	}
    844
    845	if (tm_protocols & NFC_PROTO_NFC_DEP_MASK) {
    846		rc = nci_set_listen_parameters(nfc_dev);
    847		if (rc)
    848			pr_err("failed to set listen parameters\n");
    849	}
    850
    851	param.im_protocols = im_protocols;
    852	param.tm_protocols = tm_protocols;
    853	rc = nci_request(ndev, nci_rf_discover_req, &param,
    854			 msecs_to_jiffies(NCI_RF_DISC_TIMEOUT));
    855
    856	if (!rc)
    857		ndev->poll_prots = im_protocols;
    858
    859	return rc;
    860}
    861
    862static void nci_stop_poll(struct nfc_dev *nfc_dev)
    863{
    864	struct nci_dev *ndev = nfc_get_drvdata(nfc_dev);
    865
    866	if ((atomic_read(&ndev->state) != NCI_DISCOVERY) &&
    867	    (atomic_read(&ndev->state) != NCI_W4_ALL_DISCOVERIES)) {
    868		pr_err("unable to stop poll, since poll is not active\n");
    869		return;
    870	}
    871
    872	nci_request(ndev, nci_rf_deactivate_req,
    873		    (void *)NCI_DEACTIVATE_TYPE_IDLE_MODE,
    874		    msecs_to_jiffies(NCI_RF_DEACTIVATE_TIMEOUT));
    875}
    876
    877static int nci_activate_target(struct nfc_dev *nfc_dev,
    878			       struct nfc_target *target, __u32 protocol)
    879{
    880	struct nci_dev *ndev = nfc_get_drvdata(nfc_dev);
    881	struct nci_rf_discover_select_param param;
    882	const struct nfc_target *nci_target = NULL;
    883	int i;
    884	int rc = 0;
    885
    886	pr_debug("target_idx %d, protocol 0x%x\n", target->idx, protocol);
    887
    888	if ((atomic_read(&ndev->state) != NCI_W4_HOST_SELECT) &&
    889	    (atomic_read(&ndev->state) != NCI_POLL_ACTIVE)) {
    890		pr_err("there is no available target to activate\n");
    891		return -EINVAL;
    892	}
    893
    894	if (ndev->target_active_prot) {
    895		pr_err("there is already an active target\n");
    896		return -EBUSY;
    897	}
    898
    899	for (i = 0; i < ndev->n_targets; i++) {
    900		if (ndev->targets[i].idx == target->idx) {
    901			nci_target = &ndev->targets[i];
    902			break;
    903		}
    904	}
    905
    906	if (!nci_target) {
    907		pr_err("unable to find the selected target\n");
    908		return -EINVAL;
    909	}
    910
    911	if (!(nci_target->supported_protocols & (1 << protocol))) {
    912		pr_err("target does not support the requested protocol 0x%x\n",
    913		       protocol);
    914		return -EINVAL;
    915	}
    916
    917	if (atomic_read(&ndev->state) == NCI_W4_HOST_SELECT) {
    918		param.rf_discovery_id = nci_target->logical_idx;
    919
    920		if (protocol == NFC_PROTO_JEWEL)
    921			param.rf_protocol = NCI_RF_PROTOCOL_T1T;
    922		else if (protocol == NFC_PROTO_MIFARE)
    923			param.rf_protocol = NCI_RF_PROTOCOL_T2T;
    924		else if (protocol == NFC_PROTO_FELICA)
    925			param.rf_protocol = NCI_RF_PROTOCOL_T3T;
    926		else if (protocol == NFC_PROTO_ISO14443 ||
    927			 protocol == NFC_PROTO_ISO14443_B)
    928			param.rf_protocol = NCI_RF_PROTOCOL_ISO_DEP;
    929		else
    930			param.rf_protocol = NCI_RF_PROTOCOL_NFC_DEP;
    931
    932		rc = nci_request(ndev, nci_rf_discover_select_req, &param,
    933				 msecs_to_jiffies(NCI_RF_DISC_SELECT_TIMEOUT));
    934	}
    935
    936	if (!rc)
    937		ndev->target_active_prot = protocol;
    938
    939	return rc;
    940}
    941
    942static void nci_deactivate_target(struct nfc_dev *nfc_dev,
    943				  struct nfc_target *target,
    944				  __u8 mode)
    945{
    946	struct nci_dev *ndev = nfc_get_drvdata(nfc_dev);
    947	unsigned long nci_mode = NCI_DEACTIVATE_TYPE_IDLE_MODE;
    948
    949	if (!ndev->target_active_prot) {
    950		pr_err("unable to deactivate target, no active target\n");
    951		return;
    952	}
    953
    954	ndev->target_active_prot = 0;
    955
    956	switch (mode) {
    957	case NFC_TARGET_MODE_SLEEP:
    958		nci_mode = NCI_DEACTIVATE_TYPE_SLEEP_MODE;
    959		break;
    960	}
    961
    962	if (atomic_read(&ndev->state) == NCI_POLL_ACTIVE) {
    963		nci_request(ndev, nci_rf_deactivate_req, (void *)nci_mode,
    964			    msecs_to_jiffies(NCI_RF_DEACTIVATE_TIMEOUT));
    965	}
    966}
    967
    968static int nci_dep_link_up(struct nfc_dev *nfc_dev, struct nfc_target *target,
    969			   __u8 comm_mode, __u8 *gb, size_t gb_len)
    970{
    971	struct nci_dev *ndev = nfc_get_drvdata(nfc_dev);
    972	int rc;
    973
    974	pr_debug("target_idx %d, comm_mode %d\n", target->idx, comm_mode);
    975
    976	rc = nci_activate_target(nfc_dev, target, NFC_PROTO_NFC_DEP);
    977	if (rc)
    978		return rc;
    979
    980	rc = nfc_set_remote_general_bytes(nfc_dev, ndev->remote_gb,
    981					  ndev->remote_gb_len);
    982	if (!rc)
    983		rc = nfc_dep_link_is_up(nfc_dev, target->idx, NFC_COMM_PASSIVE,
    984					NFC_RF_INITIATOR);
    985
    986	return rc;
    987}
    988
    989static int nci_dep_link_down(struct nfc_dev *nfc_dev)
    990{
    991	struct nci_dev *ndev = nfc_get_drvdata(nfc_dev);
    992	int rc;
    993
    994	if (nfc_dev->rf_mode == NFC_RF_INITIATOR) {
    995		nci_deactivate_target(nfc_dev, NULL, NCI_DEACTIVATE_TYPE_IDLE_MODE);
    996	} else {
    997		if (atomic_read(&ndev->state) == NCI_LISTEN_ACTIVE ||
    998		    atomic_read(&ndev->state) == NCI_DISCOVERY) {
    999			nci_request(ndev, nci_rf_deactivate_req, (void *)0,
   1000				    msecs_to_jiffies(NCI_RF_DEACTIVATE_TIMEOUT));
   1001		}
   1002
   1003		rc = nfc_tm_deactivated(nfc_dev);
   1004		if (rc)
   1005			pr_err("error when signaling tm deactivation\n");
   1006	}
   1007
   1008	return 0;
   1009}
   1010
   1011
   1012static int nci_transceive(struct nfc_dev *nfc_dev, struct nfc_target *target,
   1013			  struct sk_buff *skb,
   1014			  data_exchange_cb_t cb, void *cb_context)
   1015{
   1016	struct nci_dev *ndev = nfc_get_drvdata(nfc_dev);
   1017	int rc;
   1018	struct nci_conn_info *conn_info;
   1019
   1020	conn_info = ndev->rf_conn_info;
   1021	if (!conn_info)
   1022		return -EPROTO;
   1023
   1024	pr_debug("target_idx %d, len %d\n", target->idx, skb->len);
   1025
   1026	if (!ndev->target_active_prot) {
   1027		pr_err("unable to exchange data, no active target\n");
   1028		return -EINVAL;
   1029	}
   1030
   1031	if (test_and_set_bit(NCI_DATA_EXCHANGE, &ndev->flags))
   1032		return -EBUSY;
   1033
   1034	/* store cb and context to be used on receiving data */
   1035	conn_info->data_exchange_cb = cb;
   1036	conn_info->data_exchange_cb_context = cb_context;
   1037
   1038	rc = nci_send_data(ndev, NCI_STATIC_RF_CONN_ID, skb);
   1039	if (rc)
   1040		clear_bit(NCI_DATA_EXCHANGE, &ndev->flags);
   1041
   1042	return rc;
   1043}
   1044
   1045static int nci_tm_send(struct nfc_dev *nfc_dev, struct sk_buff *skb)
   1046{
   1047	struct nci_dev *ndev = nfc_get_drvdata(nfc_dev);
   1048	int rc;
   1049
   1050	rc = nci_send_data(ndev, NCI_STATIC_RF_CONN_ID, skb);
   1051	if (rc)
   1052		pr_err("unable to send data\n");
   1053
   1054	return rc;
   1055}
   1056
   1057static int nci_enable_se(struct nfc_dev *nfc_dev, u32 se_idx)
   1058{
   1059	struct nci_dev *ndev = nfc_get_drvdata(nfc_dev);
   1060
   1061	if (ndev->ops->enable_se)
   1062		return ndev->ops->enable_se(ndev, se_idx);
   1063
   1064	return 0;
   1065}
   1066
   1067static int nci_disable_se(struct nfc_dev *nfc_dev, u32 se_idx)
   1068{
   1069	struct nci_dev *ndev = nfc_get_drvdata(nfc_dev);
   1070
   1071	if (ndev->ops->disable_se)
   1072		return ndev->ops->disable_se(ndev, se_idx);
   1073
   1074	return 0;
   1075}
   1076
   1077static int nci_discover_se(struct nfc_dev *nfc_dev)
   1078{
   1079	int r;
   1080	struct nci_dev *ndev = nfc_get_drvdata(nfc_dev);
   1081
   1082	if (ndev->ops->discover_se) {
   1083		r = nci_nfcee_discover(ndev, NCI_NFCEE_DISCOVERY_ACTION_ENABLE);
   1084		if (r != NCI_STATUS_OK)
   1085			return -EPROTO;
   1086
   1087		return ndev->ops->discover_se(ndev);
   1088	}
   1089
   1090	return 0;
   1091}
   1092
   1093static int nci_se_io(struct nfc_dev *nfc_dev, u32 se_idx,
   1094		     u8 *apdu, size_t apdu_length,
   1095		     se_io_cb_t cb, void *cb_context)
   1096{
   1097	struct nci_dev *ndev = nfc_get_drvdata(nfc_dev);
   1098
   1099	if (ndev->ops->se_io)
   1100		return ndev->ops->se_io(ndev, se_idx, apdu,
   1101				apdu_length, cb, cb_context);
   1102
   1103	return 0;
   1104}
   1105
   1106static int nci_fw_download(struct nfc_dev *nfc_dev, const char *firmware_name)
   1107{
   1108	struct nci_dev *ndev = nfc_get_drvdata(nfc_dev);
   1109
   1110	if (!ndev->ops->fw_download)
   1111		return -ENOTSUPP;
   1112
   1113	return ndev->ops->fw_download(ndev, firmware_name);
   1114}
   1115
   1116static const struct nfc_ops nci_nfc_ops = {
   1117	.dev_up = nci_dev_up,
   1118	.dev_down = nci_dev_down,
   1119	.start_poll = nci_start_poll,
   1120	.stop_poll = nci_stop_poll,
   1121	.dep_link_up = nci_dep_link_up,
   1122	.dep_link_down = nci_dep_link_down,
   1123	.activate_target = nci_activate_target,
   1124	.deactivate_target = nci_deactivate_target,
   1125	.im_transceive = nci_transceive,
   1126	.tm_send = nci_tm_send,
   1127	.enable_se = nci_enable_se,
   1128	.disable_se = nci_disable_se,
   1129	.discover_se = nci_discover_se,
   1130	.se_io = nci_se_io,
   1131	.fw_download = nci_fw_download,
   1132};
   1133
   1134/* ---- Interface to NCI drivers ---- */
   1135/**
   1136 * nci_allocate_device - allocate a new nci device
   1137 *
   1138 * @ops: device operations
   1139 * @supported_protocols: NFC protocols supported by the device
   1140 * @tx_headroom: Reserved space at beginning of skb
   1141 * @tx_tailroom: Reserved space at end of skb
   1142 */
   1143struct nci_dev *nci_allocate_device(const struct nci_ops *ops,
   1144				    __u32 supported_protocols,
   1145				    int tx_headroom, int tx_tailroom)
   1146{
   1147	struct nci_dev *ndev;
   1148
   1149	pr_debug("supported_protocols 0x%x\n", supported_protocols);
   1150
   1151	if (!ops->open || !ops->close || !ops->send)
   1152		return NULL;
   1153
   1154	if (!supported_protocols)
   1155		return NULL;
   1156
   1157	ndev = kzalloc(sizeof(struct nci_dev), GFP_KERNEL);
   1158	if (!ndev)
   1159		return NULL;
   1160
   1161	ndev->ops = ops;
   1162
   1163	if (ops->n_prop_ops > NCI_MAX_PROPRIETARY_CMD) {
   1164		pr_err("Too many proprietary commands: %zd\n",
   1165		       ops->n_prop_ops);
   1166		goto free_nci;
   1167	}
   1168
   1169	ndev->tx_headroom = tx_headroom;
   1170	ndev->tx_tailroom = tx_tailroom;
   1171	init_completion(&ndev->req_completion);
   1172
   1173	ndev->nfc_dev = nfc_allocate_device(&nci_nfc_ops,
   1174					    supported_protocols,
   1175					    tx_headroom + NCI_DATA_HDR_SIZE,
   1176					    tx_tailroom);
   1177	if (!ndev->nfc_dev)
   1178		goto free_nci;
   1179
   1180	ndev->hci_dev = nci_hci_allocate(ndev);
   1181	if (!ndev->hci_dev)
   1182		goto free_nfc;
   1183
   1184	nfc_set_drvdata(ndev->nfc_dev, ndev);
   1185
   1186	return ndev;
   1187
   1188free_nfc:
   1189	nfc_free_device(ndev->nfc_dev);
   1190free_nci:
   1191	kfree(ndev);
   1192	return NULL;
   1193}
   1194EXPORT_SYMBOL(nci_allocate_device);
   1195
   1196/**
   1197 * nci_free_device - deallocate nci device
   1198 *
   1199 * @ndev: The nci device to deallocate
   1200 */
   1201void nci_free_device(struct nci_dev *ndev)
   1202{
   1203	nfc_free_device(ndev->nfc_dev);
   1204	nci_hci_deallocate(ndev);
   1205	kfree(ndev);
   1206}
   1207EXPORT_SYMBOL(nci_free_device);
   1208
   1209/**
   1210 * nci_register_device - register a nci device in the nfc subsystem
   1211 *
   1212 * @ndev: The nci device to register
   1213 */
   1214int nci_register_device(struct nci_dev *ndev)
   1215{
   1216	int rc;
   1217	struct device *dev = &ndev->nfc_dev->dev;
   1218	char name[32];
   1219
   1220	ndev->flags = 0;
   1221
   1222	INIT_WORK(&ndev->cmd_work, nci_cmd_work);
   1223	snprintf(name, sizeof(name), "%s_nci_cmd_wq", dev_name(dev));
   1224	ndev->cmd_wq = create_singlethread_workqueue(name);
   1225	if (!ndev->cmd_wq) {
   1226		rc = -ENOMEM;
   1227		goto exit;
   1228	}
   1229
   1230	INIT_WORK(&ndev->rx_work, nci_rx_work);
   1231	snprintf(name, sizeof(name), "%s_nci_rx_wq", dev_name(dev));
   1232	ndev->rx_wq = create_singlethread_workqueue(name);
   1233	if (!ndev->rx_wq) {
   1234		rc = -ENOMEM;
   1235		goto destroy_cmd_wq_exit;
   1236	}
   1237
   1238	INIT_WORK(&ndev->tx_work, nci_tx_work);
   1239	snprintf(name, sizeof(name), "%s_nci_tx_wq", dev_name(dev));
   1240	ndev->tx_wq = create_singlethread_workqueue(name);
   1241	if (!ndev->tx_wq) {
   1242		rc = -ENOMEM;
   1243		goto destroy_rx_wq_exit;
   1244	}
   1245
   1246	skb_queue_head_init(&ndev->cmd_q);
   1247	skb_queue_head_init(&ndev->rx_q);
   1248	skb_queue_head_init(&ndev->tx_q);
   1249
   1250	timer_setup(&ndev->cmd_timer, nci_cmd_timer, 0);
   1251	timer_setup(&ndev->data_timer, nci_data_timer, 0);
   1252
   1253	mutex_init(&ndev->req_lock);
   1254	INIT_LIST_HEAD(&ndev->conn_info_list);
   1255
   1256	rc = nfc_register_device(ndev->nfc_dev);
   1257	if (rc)
   1258		goto destroy_tx_wq_exit;
   1259
   1260	goto exit;
   1261
   1262destroy_tx_wq_exit:
   1263	destroy_workqueue(ndev->tx_wq);
   1264
   1265destroy_rx_wq_exit:
   1266	destroy_workqueue(ndev->rx_wq);
   1267
   1268destroy_cmd_wq_exit:
   1269	destroy_workqueue(ndev->cmd_wq);
   1270
   1271exit:
   1272	return rc;
   1273}
   1274EXPORT_SYMBOL(nci_register_device);
   1275
   1276/**
   1277 * nci_unregister_device - unregister a nci device in the nfc subsystem
   1278 *
   1279 * @ndev: The nci device to unregister
   1280 */
   1281void nci_unregister_device(struct nci_dev *ndev)
   1282{
   1283	struct nci_conn_info *conn_info, *n;
   1284
   1285	/* This set_bit is not protected with specialized barrier,
   1286	 * However, it is fine because the mutex_lock(&ndev->req_lock);
   1287	 * in nci_close_device() will help to emit one.
   1288	 */
   1289	set_bit(NCI_UNREG, &ndev->flags);
   1290
   1291	nci_close_device(ndev);
   1292
   1293	destroy_workqueue(ndev->cmd_wq);
   1294	destroy_workqueue(ndev->rx_wq);
   1295	destroy_workqueue(ndev->tx_wq);
   1296
   1297	list_for_each_entry_safe(conn_info, n, &ndev->conn_info_list, list) {
   1298		list_del(&conn_info->list);
   1299		/* conn_info is allocated with devm_kzalloc */
   1300	}
   1301
   1302	nfc_unregister_device(ndev->nfc_dev);
   1303}
   1304EXPORT_SYMBOL(nci_unregister_device);
   1305
   1306/**
   1307 * nci_recv_frame - receive frame from NCI drivers
   1308 *
   1309 * @ndev: The nci device
   1310 * @skb: The sk_buff to receive
   1311 */
   1312int nci_recv_frame(struct nci_dev *ndev, struct sk_buff *skb)
   1313{
   1314	pr_debug("len %d\n", skb->len);
   1315
   1316	if (!ndev || (!test_bit(NCI_UP, &ndev->flags) &&
   1317	    !test_bit(NCI_INIT, &ndev->flags))) {
   1318		kfree_skb(skb);
   1319		return -ENXIO;
   1320	}
   1321
   1322	/* Queue frame for rx worker thread */
   1323	skb_queue_tail(&ndev->rx_q, skb);
   1324	queue_work(ndev->rx_wq, &ndev->rx_work);
   1325
   1326	return 0;
   1327}
   1328EXPORT_SYMBOL(nci_recv_frame);
   1329
   1330int nci_send_frame(struct nci_dev *ndev, struct sk_buff *skb)
   1331{
   1332	pr_debug("len %d\n", skb->len);
   1333
   1334	if (!ndev) {
   1335		kfree_skb(skb);
   1336		return -ENODEV;
   1337	}
   1338
   1339	/* Get rid of skb owner, prior to sending to the driver. */
   1340	skb_orphan(skb);
   1341
   1342	/* Send copy to sniffer */
   1343	nfc_send_to_raw_sock(ndev->nfc_dev, skb,
   1344			     RAW_PAYLOAD_NCI, NFC_DIRECTION_TX);
   1345
   1346	return ndev->ops->send(ndev, skb);
   1347}
   1348EXPORT_SYMBOL(nci_send_frame);
   1349
   1350/* Send NCI command */
   1351int nci_send_cmd(struct nci_dev *ndev, __u16 opcode, __u8 plen, const void *payload)
   1352{
   1353	struct nci_ctrl_hdr *hdr;
   1354	struct sk_buff *skb;
   1355
   1356	pr_debug("opcode 0x%x, plen %d\n", opcode, plen);
   1357
   1358	skb = nci_skb_alloc(ndev, (NCI_CTRL_HDR_SIZE + plen), GFP_KERNEL);
   1359	if (!skb) {
   1360		pr_err("no memory for command\n");
   1361		return -ENOMEM;
   1362	}
   1363
   1364	hdr = skb_put(skb, NCI_CTRL_HDR_SIZE);
   1365	hdr->gid = nci_opcode_gid(opcode);
   1366	hdr->oid = nci_opcode_oid(opcode);
   1367	hdr->plen = plen;
   1368
   1369	nci_mt_set((__u8 *)hdr, NCI_MT_CMD_PKT);
   1370	nci_pbf_set((__u8 *)hdr, NCI_PBF_LAST);
   1371
   1372	if (plen)
   1373		skb_put_data(skb, payload, plen);
   1374
   1375	skb_queue_tail(&ndev->cmd_q, skb);
   1376	queue_work(ndev->cmd_wq, &ndev->cmd_work);
   1377
   1378	return 0;
   1379}
   1380EXPORT_SYMBOL(nci_send_cmd);
   1381
   1382/* Proprietary commands API */
   1383static const struct nci_driver_ops *ops_cmd_lookup(const struct nci_driver_ops *ops,
   1384						   size_t n_ops,
   1385						   __u16 opcode)
   1386{
   1387	size_t i;
   1388	const struct nci_driver_ops *op;
   1389
   1390	if (!ops || !n_ops)
   1391		return NULL;
   1392
   1393	for (i = 0; i < n_ops; i++) {
   1394		op = &ops[i];
   1395		if (op->opcode == opcode)
   1396			return op;
   1397	}
   1398
   1399	return NULL;
   1400}
   1401
   1402static int nci_op_rsp_packet(struct nci_dev *ndev, __u16 rsp_opcode,
   1403			     struct sk_buff *skb, const struct nci_driver_ops *ops,
   1404			     size_t n_ops)
   1405{
   1406	const struct nci_driver_ops *op;
   1407
   1408	op = ops_cmd_lookup(ops, n_ops, rsp_opcode);
   1409	if (!op || !op->rsp)
   1410		return -ENOTSUPP;
   1411
   1412	return op->rsp(ndev, skb);
   1413}
   1414
   1415static int nci_op_ntf_packet(struct nci_dev *ndev, __u16 ntf_opcode,
   1416			     struct sk_buff *skb, const struct nci_driver_ops *ops,
   1417			     size_t n_ops)
   1418{
   1419	const struct nci_driver_ops *op;
   1420
   1421	op = ops_cmd_lookup(ops, n_ops, ntf_opcode);
   1422	if (!op || !op->ntf)
   1423		return -ENOTSUPP;
   1424
   1425	return op->ntf(ndev, skb);
   1426}
   1427
   1428int nci_prop_rsp_packet(struct nci_dev *ndev, __u16 opcode,
   1429			struct sk_buff *skb)
   1430{
   1431	return nci_op_rsp_packet(ndev, opcode, skb, ndev->ops->prop_ops,
   1432				 ndev->ops->n_prop_ops);
   1433}
   1434
   1435int nci_prop_ntf_packet(struct nci_dev *ndev, __u16 opcode,
   1436			struct sk_buff *skb)
   1437{
   1438	return nci_op_ntf_packet(ndev, opcode, skb, ndev->ops->prop_ops,
   1439				 ndev->ops->n_prop_ops);
   1440}
   1441
   1442int nci_core_rsp_packet(struct nci_dev *ndev, __u16 opcode,
   1443			struct sk_buff *skb)
   1444{
   1445	return nci_op_rsp_packet(ndev, opcode, skb, ndev->ops->core_ops,
   1446				  ndev->ops->n_core_ops);
   1447}
   1448
   1449int nci_core_ntf_packet(struct nci_dev *ndev, __u16 opcode,
   1450			struct sk_buff *skb)
   1451{
   1452	return nci_op_ntf_packet(ndev, opcode, skb, ndev->ops->core_ops,
   1453				 ndev->ops->n_core_ops);
   1454}
   1455
   1456/* ---- NCI TX Data worker thread ---- */
   1457
   1458static void nci_tx_work(struct work_struct *work)
   1459{
   1460	struct nci_dev *ndev = container_of(work, struct nci_dev, tx_work);
   1461	struct nci_conn_info *conn_info;
   1462	struct sk_buff *skb;
   1463
   1464	conn_info = nci_get_conn_info_by_conn_id(ndev, ndev->cur_conn_id);
   1465	if (!conn_info)
   1466		return;
   1467
   1468	pr_debug("credits_cnt %d\n", atomic_read(&conn_info->credits_cnt));
   1469
   1470	/* Send queued tx data */
   1471	while (atomic_read(&conn_info->credits_cnt)) {
   1472		skb = skb_dequeue(&ndev->tx_q);
   1473		if (!skb)
   1474			return;
   1475
   1476		/* Check if data flow control is used */
   1477		if (atomic_read(&conn_info->credits_cnt) !=
   1478		    NCI_DATA_FLOW_CONTROL_NOT_USED)
   1479			atomic_dec(&conn_info->credits_cnt);
   1480
   1481		pr_debug("NCI TX: MT=data, PBF=%d, conn_id=%d, plen=%d\n",
   1482			 nci_pbf(skb->data),
   1483			 nci_conn_id(skb->data),
   1484			 nci_plen(skb->data));
   1485
   1486		nci_send_frame(ndev, skb);
   1487
   1488		mod_timer(&ndev->data_timer,
   1489			  jiffies + msecs_to_jiffies(NCI_DATA_TIMEOUT));
   1490	}
   1491}
   1492
   1493/* ----- NCI RX worker thread (data & control) ----- */
   1494
   1495static void nci_rx_work(struct work_struct *work)
   1496{
   1497	struct nci_dev *ndev = container_of(work, struct nci_dev, rx_work);
   1498	struct sk_buff *skb;
   1499
   1500	while ((skb = skb_dequeue(&ndev->rx_q))) {
   1501
   1502		/* Send copy to sniffer */
   1503		nfc_send_to_raw_sock(ndev->nfc_dev, skb,
   1504				     RAW_PAYLOAD_NCI, NFC_DIRECTION_RX);
   1505
   1506		/* Process frame */
   1507		switch (nci_mt(skb->data)) {
   1508		case NCI_MT_RSP_PKT:
   1509			nci_rsp_packet(ndev, skb);
   1510			break;
   1511
   1512		case NCI_MT_NTF_PKT:
   1513			nci_ntf_packet(ndev, skb);
   1514			break;
   1515
   1516		case NCI_MT_DATA_PKT:
   1517			nci_rx_data_packet(ndev, skb);
   1518			break;
   1519
   1520		default:
   1521			pr_err("unknown MT 0x%x\n", nci_mt(skb->data));
   1522			kfree_skb(skb);
   1523			break;
   1524		}
   1525	}
   1526
   1527	/* check if a data exchange timeout has occurred */
   1528	if (test_bit(NCI_DATA_EXCHANGE_TO, &ndev->flags)) {
   1529		/* complete the data exchange transaction, if exists */
   1530		if (test_bit(NCI_DATA_EXCHANGE, &ndev->flags))
   1531			nci_data_exchange_complete(ndev, NULL,
   1532						   ndev->cur_conn_id,
   1533						   -ETIMEDOUT);
   1534
   1535		clear_bit(NCI_DATA_EXCHANGE_TO, &ndev->flags);
   1536	}
   1537}
   1538
   1539/* ----- NCI TX CMD worker thread ----- */
   1540
   1541static void nci_cmd_work(struct work_struct *work)
   1542{
   1543	struct nci_dev *ndev = container_of(work, struct nci_dev, cmd_work);
   1544	struct sk_buff *skb;
   1545
   1546	pr_debug("cmd_cnt %d\n", atomic_read(&ndev->cmd_cnt));
   1547
   1548	/* Send queued command */
   1549	if (atomic_read(&ndev->cmd_cnt)) {
   1550		skb = skb_dequeue(&ndev->cmd_q);
   1551		if (!skb)
   1552			return;
   1553
   1554		atomic_dec(&ndev->cmd_cnt);
   1555
   1556		pr_debug("NCI TX: MT=cmd, PBF=%d, GID=0x%x, OID=0x%x, plen=%d\n",
   1557			 nci_pbf(skb->data),
   1558			 nci_opcode_gid(nci_opcode(skb->data)),
   1559			 nci_opcode_oid(nci_opcode(skb->data)),
   1560			 nci_plen(skb->data));
   1561
   1562		nci_send_frame(ndev, skb);
   1563
   1564		mod_timer(&ndev->cmd_timer,
   1565			  jiffies + msecs_to_jiffies(NCI_CMD_TIMEOUT));
   1566	}
   1567}
   1568
   1569MODULE_LICENSE("GPL");