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

digital_core.c (20553B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * NFC Digital Protocol stack
      4 * Copyright (c) 2013, Intel Corporation.
      5 */
      6
      7#define pr_fmt(fmt) "digital: %s: " fmt, __func__
      8
      9#include <linux/module.h>
     10
     11#include "digital.h"
     12
     13#define DIGITAL_PROTO_NFCA_RF_TECH \
     14	(NFC_PROTO_JEWEL_MASK | NFC_PROTO_MIFARE_MASK | \
     15	NFC_PROTO_NFC_DEP_MASK | NFC_PROTO_ISO14443_MASK)
     16
     17#define DIGITAL_PROTO_NFCB_RF_TECH	NFC_PROTO_ISO14443_B_MASK
     18
     19#define DIGITAL_PROTO_NFCF_RF_TECH \
     20	(NFC_PROTO_FELICA_MASK | NFC_PROTO_NFC_DEP_MASK)
     21
     22#define DIGITAL_PROTO_ISO15693_RF_TECH	NFC_PROTO_ISO15693_MASK
     23
     24/* Delay between each poll frame (ms) */
     25#define DIGITAL_POLL_INTERVAL 10
     26
     27struct digital_cmd {
     28	struct list_head queue;
     29
     30	u8 type;
     31	u8 pending;
     32
     33	u16 timeout;
     34	struct sk_buff *req;
     35	struct sk_buff *resp;
     36	struct digital_tg_mdaa_params *mdaa_params;
     37
     38	nfc_digital_cmd_complete_t cmd_cb;
     39	void *cb_context;
     40};
     41
     42struct sk_buff *digital_skb_alloc(struct nfc_digital_dev *ddev,
     43				  unsigned int len)
     44{
     45	struct sk_buff *skb;
     46
     47	skb = alloc_skb(len + ddev->tx_headroom + ddev->tx_tailroom,
     48			GFP_KERNEL);
     49	if (skb)
     50		skb_reserve(skb, ddev->tx_headroom);
     51
     52	return skb;
     53}
     54
     55void digital_skb_add_crc(struct sk_buff *skb, crc_func_t crc_func, u16 init,
     56			 u8 bitwise_inv, u8 msb_first)
     57{
     58	u16 crc;
     59
     60	crc = crc_func(init, skb->data, skb->len);
     61
     62	if (bitwise_inv)
     63		crc = ~crc;
     64
     65	if (msb_first)
     66		crc = __fswab16(crc);
     67
     68	skb_put_u8(skb, crc & 0xFF);
     69	skb_put_u8(skb, (crc >> 8) & 0xFF);
     70}
     71
     72int digital_skb_check_crc(struct sk_buff *skb, crc_func_t crc_func,
     73			  u16 crc_init, u8 bitwise_inv, u8 msb_first)
     74{
     75	int rc;
     76	u16 crc;
     77
     78	if (skb->len <= 2)
     79		return -EIO;
     80
     81	crc = crc_func(crc_init, skb->data, skb->len - 2);
     82
     83	if (bitwise_inv)
     84		crc = ~crc;
     85
     86	if (msb_first)
     87		crc = __swab16(crc);
     88
     89	rc = (skb->data[skb->len - 2] - (crc & 0xFF)) +
     90	     (skb->data[skb->len - 1] - ((crc >> 8) & 0xFF));
     91
     92	if (rc)
     93		return -EIO;
     94
     95	skb_trim(skb, skb->len - 2);
     96
     97	return 0;
     98}
     99
    100static inline void digital_switch_rf(struct nfc_digital_dev *ddev, bool on)
    101{
    102	ddev->ops->switch_rf(ddev, on);
    103}
    104
    105static inline void digital_abort_cmd(struct nfc_digital_dev *ddev)
    106{
    107	ddev->ops->abort_cmd(ddev);
    108}
    109
    110static void digital_wq_cmd_complete(struct work_struct *work)
    111{
    112	struct digital_cmd *cmd;
    113	struct nfc_digital_dev *ddev = container_of(work,
    114						    struct nfc_digital_dev,
    115						    cmd_complete_work);
    116
    117	mutex_lock(&ddev->cmd_lock);
    118
    119	cmd = list_first_entry_or_null(&ddev->cmd_queue, struct digital_cmd,
    120				       queue);
    121	if (!cmd) {
    122		mutex_unlock(&ddev->cmd_lock);
    123		return;
    124	}
    125
    126	list_del(&cmd->queue);
    127
    128	mutex_unlock(&ddev->cmd_lock);
    129
    130	if (!IS_ERR(cmd->resp))
    131		print_hex_dump_debug("DIGITAL RX: ", DUMP_PREFIX_NONE, 16, 1,
    132				     cmd->resp->data, cmd->resp->len, false);
    133
    134	cmd->cmd_cb(ddev, cmd->cb_context, cmd->resp);
    135
    136	kfree(cmd->mdaa_params);
    137	kfree(cmd);
    138
    139	schedule_work(&ddev->cmd_work);
    140}
    141
    142static void digital_send_cmd_complete(struct nfc_digital_dev *ddev,
    143				      void *arg, struct sk_buff *resp)
    144{
    145	struct digital_cmd *cmd = arg;
    146
    147	cmd->resp = resp;
    148
    149	schedule_work(&ddev->cmd_complete_work);
    150}
    151
    152static void digital_wq_cmd(struct work_struct *work)
    153{
    154	int rc;
    155	struct digital_cmd *cmd;
    156	struct digital_tg_mdaa_params *params;
    157	struct nfc_digital_dev *ddev = container_of(work,
    158						    struct nfc_digital_dev,
    159						    cmd_work);
    160
    161	mutex_lock(&ddev->cmd_lock);
    162
    163	cmd = list_first_entry_or_null(&ddev->cmd_queue, struct digital_cmd,
    164				       queue);
    165	if (!cmd || cmd->pending) {
    166		mutex_unlock(&ddev->cmd_lock);
    167		return;
    168	}
    169
    170	cmd->pending = 1;
    171
    172	mutex_unlock(&ddev->cmd_lock);
    173
    174	if (cmd->req)
    175		print_hex_dump_debug("DIGITAL TX: ", DUMP_PREFIX_NONE, 16, 1,
    176				     cmd->req->data, cmd->req->len, false);
    177
    178	switch (cmd->type) {
    179	case DIGITAL_CMD_IN_SEND:
    180		rc = ddev->ops->in_send_cmd(ddev, cmd->req, cmd->timeout,
    181					    digital_send_cmd_complete, cmd);
    182		break;
    183
    184	case DIGITAL_CMD_TG_SEND:
    185		rc = ddev->ops->tg_send_cmd(ddev, cmd->req, cmd->timeout,
    186					    digital_send_cmd_complete, cmd);
    187		break;
    188
    189	case DIGITAL_CMD_TG_LISTEN:
    190		rc = ddev->ops->tg_listen(ddev, cmd->timeout,
    191					  digital_send_cmd_complete, cmd);
    192		break;
    193
    194	case DIGITAL_CMD_TG_LISTEN_MDAA:
    195		params = cmd->mdaa_params;
    196
    197		rc = ddev->ops->tg_listen_mdaa(ddev, params, cmd->timeout,
    198					       digital_send_cmd_complete, cmd);
    199		break;
    200
    201	case DIGITAL_CMD_TG_LISTEN_MD:
    202		rc = ddev->ops->tg_listen_md(ddev, cmd->timeout,
    203					       digital_send_cmd_complete, cmd);
    204		break;
    205
    206	default:
    207		pr_err("Unknown cmd type %d\n", cmd->type);
    208		return;
    209	}
    210
    211	if (!rc)
    212		return;
    213
    214	pr_err("in_send_command returned err %d\n", rc);
    215
    216	mutex_lock(&ddev->cmd_lock);
    217	list_del(&cmd->queue);
    218	mutex_unlock(&ddev->cmd_lock);
    219
    220	kfree_skb(cmd->req);
    221	kfree(cmd->mdaa_params);
    222	kfree(cmd);
    223
    224	schedule_work(&ddev->cmd_work);
    225}
    226
    227int digital_send_cmd(struct nfc_digital_dev *ddev, u8 cmd_type,
    228		     struct sk_buff *skb, struct digital_tg_mdaa_params *params,
    229		     u16 timeout, nfc_digital_cmd_complete_t cmd_cb,
    230		     void *cb_context)
    231{
    232	struct digital_cmd *cmd;
    233
    234	cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
    235	if (!cmd)
    236		return -ENOMEM;
    237
    238	cmd->type = cmd_type;
    239	cmd->timeout = timeout;
    240	cmd->req = skb;
    241	cmd->mdaa_params = params;
    242	cmd->cmd_cb = cmd_cb;
    243	cmd->cb_context = cb_context;
    244	INIT_LIST_HEAD(&cmd->queue);
    245
    246	mutex_lock(&ddev->cmd_lock);
    247	list_add_tail(&cmd->queue, &ddev->cmd_queue);
    248	mutex_unlock(&ddev->cmd_lock);
    249
    250	schedule_work(&ddev->cmd_work);
    251
    252	return 0;
    253}
    254
    255int digital_in_configure_hw(struct nfc_digital_dev *ddev, int type, int param)
    256{
    257	int rc;
    258
    259	rc = ddev->ops->in_configure_hw(ddev, type, param);
    260	if (rc)
    261		pr_err("in_configure_hw failed: %d\n", rc);
    262
    263	return rc;
    264}
    265
    266int digital_tg_configure_hw(struct nfc_digital_dev *ddev, int type, int param)
    267{
    268	int rc;
    269
    270	rc = ddev->ops->tg_configure_hw(ddev, type, param);
    271	if (rc)
    272		pr_err("tg_configure_hw failed: %d\n", rc);
    273
    274	return rc;
    275}
    276
    277static int digital_tg_listen_mdaa(struct nfc_digital_dev *ddev, u8 rf_tech)
    278{
    279	struct digital_tg_mdaa_params *params;
    280	int rc;
    281
    282	params = kzalloc(sizeof(*params), GFP_KERNEL);
    283	if (!params)
    284		return -ENOMEM;
    285
    286	params->sens_res = DIGITAL_SENS_RES_NFC_DEP;
    287	get_random_bytes(params->nfcid1, sizeof(params->nfcid1));
    288	params->sel_res = DIGITAL_SEL_RES_NFC_DEP;
    289
    290	params->nfcid2[0] = DIGITAL_SENSF_NFCID2_NFC_DEP_B1;
    291	params->nfcid2[1] = DIGITAL_SENSF_NFCID2_NFC_DEP_B2;
    292	get_random_bytes(params->nfcid2 + 2, NFC_NFCID2_MAXSIZE - 2);
    293	params->sc = DIGITAL_SENSF_FELICA_SC;
    294
    295	rc = digital_send_cmd(ddev, DIGITAL_CMD_TG_LISTEN_MDAA, NULL, params,
    296			      500, digital_tg_recv_atr_req, NULL);
    297	if (rc)
    298		kfree(params);
    299
    300	return rc;
    301}
    302
    303static int digital_tg_listen_md(struct nfc_digital_dev *ddev, u8 rf_tech)
    304{
    305	return digital_send_cmd(ddev, DIGITAL_CMD_TG_LISTEN_MD, NULL, NULL, 500,
    306				digital_tg_recv_md_req, NULL);
    307}
    308
    309int digital_target_found(struct nfc_digital_dev *ddev,
    310			 struct nfc_target *target, u8 protocol)
    311{
    312	int rc;
    313	u8 framing;
    314	u8 rf_tech;
    315	u8 poll_tech_count;
    316	int (*check_crc)(struct sk_buff *skb);
    317	void (*add_crc)(struct sk_buff *skb);
    318
    319	rf_tech = ddev->poll_techs[ddev->poll_tech_index].rf_tech;
    320
    321	switch (protocol) {
    322	case NFC_PROTO_JEWEL:
    323		framing = NFC_DIGITAL_FRAMING_NFCA_T1T;
    324		check_crc = digital_skb_check_crc_b;
    325		add_crc = digital_skb_add_crc_b;
    326		break;
    327
    328	case NFC_PROTO_MIFARE:
    329		framing = NFC_DIGITAL_FRAMING_NFCA_T2T;
    330		check_crc = digital_skb_check_crc_a;
    331		add_crc = digital_skb_add_crc_a;
    332		break;
    333
    334	case NFC_PROTO_FELICA:
    335		framing = NFC_DIGITAL_FRAMING_NFCF_T3T;
    336		check_crc = digital_skb_check_crc_f;
    337		add_crc = digital_skb_add_crc_f;
    338		break;
    339
    340	case NFC_PROTO_NFC_DEP:
    341		if (rf_tech == NFC_DIGITAL_RF_TECH_106A) {
    342			framing = NFC_DIGITAL_FRAMING_NFCA_NFC_DEP;
    343			check_crc = digital_skb_check_crc_a;
    344			add_crc = digital_skb_add_crc_a;
    345		} else {
    346			framing = NFC_DIGITAL_FRAMING_NFCF_NFC_DEP;
    347			check_crc = digital_skb_check_crc_f;
    348			add_crc = digital_skb_add_crc_f;
    349		}
    350		break;
    351
    352	case NFC_PROTO_ISO15693:
    353		framing = NFC_DIGITAL_FRAMING_ISO15693_T5T;
    354		check_crc = digital_skb_check_crc_b;
    355		add_crc = digital_skb_add_crc_b;
    356		break;
    357
    358	case NFC_PROTO_ISO14443:
    359		framing = NFC_DIGITAL_FRAMING_NFCA_T4T;
    360		check_crc = digital_skb_check_crc_a;
    361		add_crc = digital_skb_add_crc_a;
    362		break;
    363
    364	case NFC_PROTO_ISO14443_B:
    365		framing = NFC_DIGITAL_FRAMING_NFCB_T4T;
    366		check_crc = digital_skb_check_crc_b;
    367		add_crc = digital_skb_add_crc_b;
    368		break;
    369
    370	default:
    371		pr_err("Invalid protocol %d\n", protocol);
    372		return -EINVAL;
    373	}
    374
    375	pr_debug("rf_tech=%d, protocol=%d\n", rf_tech, protocol);
    376
    377	ddev->curr_rf_tech = rf_tech;
    378
    379	if (DIGITAL_DRV_CAPS_IN_CRC(ddev)) {
    380		ddev->skb_add_crc = digital_skb_add_crc_none;
    381		ddev->skb_check_crc = digital_skb_check_crc_none;
    382	} else {
    383		ddev->skb_add_crc = add_crc;
    384		ddev->skb_check_crc = check_crc;
    385	}
    386
    387	rc = digital_in_configure_hw(ddev, NFC_DIGITAL_CONFIG_FRAMING, framing);
    388	if (rc)
    389		return rc;
    390
    391	target->supported_protocols = (1 << protocol);
    392
    393	poll_tech_count = ddev->poll_tech_count;
    394	ddev->poll_tech_count = 0;
    395
    396	rc = nfc_targets_found(ddev->nfc_dev, target, 1);
    397	if (rc) {
    398		ddev->poll_tech_count = poll_tech_count;
    399		return rc;
    400	}
    401
    402	return 0;
    403}
    404
    405void digital_poll_next_tech(struct nfc_digital_dev *ddev)
    406{
    407	u8 rand_mod;
    408
    409	digital_switch_rf(ddev, 0);
    410
    411	mutex_lock(&ddev->poll_lock);
    412
    413	if (!ddev->poll_tech_count) {
    414		mutex_unlock(&ddev->poll_lock);
    415		return;
    416	}
    417
    418	get_random_bytes(&rand_mod, sizeof(rand_mod));
    419	ddev->poll_tech_index = rand_mod % ddev->poll_tech_count;
    420
    421	mutex_unlock(&ddev->poll_lock);
    422
    423	schedule_delayed_work(&ddev->poll_work,
    424			      msecs_to_jiffies(DIGITAL_POLL_INTERVAL));
    425}
    426
    427static void digital_wq_poll(struct work_struct *work)
    428{
    429	int rc;
    430	struct digital_poll_tech *poll_tech;
    431	struct nfc_digital_dev *ddev = container_of(work,
    432						    struct nfc_digital_dev,
    433						    poll_work.work);
    434	mutex_lock(&ddev->poll_lock);
    435
    436	if (!ddev->poll_tech_count) {
    437		mutex_unlock(&ddev->poll_lock);
    438		return;
    439	}
    440
    441	poll_tech = &ddev->poll_techs[ddev->poll_tech_index];
    442
    443	mutex_unlock(&ddev->poll_lock);
    444
    445	rc = poll_tech->poll_func(ddev, poll_tech->rf_tech);
    446	if (rc)
    447		digital_poll_next_tech(ddev);
    448}
    449
    450static void digital_add_poll_tech(struct nfc_digital_dev *ddev, u8 rf_tech,
    451				  digital_poll_t poll_func)
    452{
    453	struct digital_poll_tech *poll_tech;
    454
    455	if (ddev->poll_tech_count >= NFC_DIGITAL_POLL_MODE_COUNT_MAX)
    456		return;
    457
    458	poll_tech = &ddev->poll_techs[ddev->poll_tech_count++];
    459
    460	poll_tech->rf_tech = rf_tech;
    461	poll_tech->poll_func = poll_func;
    462}
    463
    464/**
    465 * digital_start_poll - start_poll operation
    466 * @nfc_dev: device to be polled
    467 * @im_protocols: bitset of nfc initiator protocols to be used for polling
    468 * @tm_protocols: bitset of nfc transport protocols to be used for polling
    469 *
    470 * For every supported protocol, the corresponding polling function is added
    471 * to the table of polling technologies (ddev->poll_techs[]) using
    472 * digital_add_poll_tech().
    473 * When a polling function fails (by timeout or protocol error) the next one is
    474 * schedule by digital_poll_next_tech() on the poll workqueue (ddev->poll_work).
    475 */
    476static int digital_start_poll(struct nfc_dev *nfc_dev, __u32 im_protocols,
    477			      __u32 tm_protocols)
    478{
    479	struct nfc_digital_dev *ddev = nfc_get_drvdata(nfc_dev);
    480	u32 matching_im_protocols, matching_tm_protocols;
    481
    482	pr_debug("protocols: im 0x%x, tm 0x%x, supported 0x%x\n", im_protocols,
    483		 tm_protocols, ddev->protocols);
    484
    485	matching_im_protocols = ddev->protocols & im_protocols;
    486	matching_tm_protocols = ddev->protocols & tm_protocols;
    487
    488	if (!matching_im_protocols && !matching_tm_protocols) {
    489		pr_err("Unknown protocol\n");
    490		return -EINVAL;
    491	}
    492
    493	if (ddev->poll_tech_count) {
    494		pr_err("Already polling\n");
    495		return -EBUSY;
    496	}
    497
    498	if (ddev->curr_protocol) {
    499		pr_err("A target is already active\n");
    500		return -EBUSY;
    501	}
    502
    503	ddev->poll_tech_count = 0;
    504	ddev->poll_tech_index = 0;
    505
    506	if (matching_im_protocols & DIGITAL_PROTO_NFCA_RF_TECH)
    507		digital_add_poll_tech(ddev, NFC_DIGITAL_RF_TECH_106A,
    508				      digital_in_send_sens_req);
    509
    510	if (matching_im_protocols & DIGITAL_PROTO_NFCB_RF_TECH)
    511		digital_add_poll_tech(ddev, NFC_DIGITAL_RF_TECH_106B,
    512				      digital_in_send_sensb_req);
    513
    514	if (matching_im_protocols & DIGITAL_PROTO_NFCF_RF_TECH) {
    515		digital_add_poll_tech(ddev, NFC_DIGITAL_RF_TECH_212F,
    516				      digital_in_send_sensf_req);
    517
    518		digital_add_poll_tech(ddev, NFC_DIGITAL_RF_TECH_424F,
    519				      digital_in_send_sensf_req);
    520	}
    521
    522	if (matching_im_protocols & DIGITAL_PROTO_ISO15693_RF_TECH)
    523		digital_add_poll_tech(ddev, NFC_DIGITAL_RF_TECH_ISO15693,
    524				      digital_in_send_iso15693_inv_req);
    525
    526	if (matching_tm_protocols & NFC_PROTO_NFC_DEP_MASK) {
    527		if (ddev->ops->tg_listen_mdaa) {
    528			digital_add_poll_tech(ddev, 0,
    529					      digital_tg_listen_mdaa);
    530		} else if (ddev->ops->tg_listen_md) {
    531			digital_add_poll_tech(ddev, 0,
    532					      digital_tg_listen_md);
    533		} else {
    534			digital_add_poll_tech(ddev, NFC_DIGITAL_RF_TECH_106A,
    535					      digital_tg_listen_nfca);
    536
    537			digital_add_poll_tech(ddev, NFC_DIGITAL_RF_TECH_212F,
    538					      digital_tg_listen_nfcf);
    539
    540			digital_add_poll_tech(ddev, NFC_DIGITAL_RF_TECH_424F,
    541					      digital_tg_listen_nfcf);
    542		}
    543	}
    544
    545	if (!ddev->poll_tech_count) {
    546		pr_err("Unsupported protocols: im=0x%x, tm=0x%x\n",
    547		       matching_im_protocols, matching_tm_protocols);
    548		return -EINVAL;
    549	}
    550
    551	schedule_delayed_work(&ddev->poll_work, 0);
    552
    553	return 0;
    554}
    555
    556static void digital_stop_poll(struct nfc_dev *nfc_dev)
    557{
    558	struct nfc_digital_dev *ddev = nfc_get_drvdata(nfc_dev);
    559
    560	mutex_lock(&ddev->poll_lock);
    561
    562	if (!ddev->poll_tech_count) {
    563		pr_err("Polling operation was not running\n");
    564		mutex_unlock(&ddev->poll_lock);
    565		return;
    566	}
    567
    568	ddev->poll_tech_count = 0;
    569
    570	mutex_unlock(&ddev->poll_lock);
    571
    572	cancel_delayed_work_sync(&ddev->poll_work);
    573
    574	digital_abort_cmd(ddev);
    575}
    576
    577static int digital_dev_up(struct nfc_dev *nfc_dev)
    578{
    579	struct nfc_digital_dev *ddev = nfc_get_drvdata(nfc_dev);
    580
    581	digital_switch_rf(ddev, 1);
    582
    583	return 0;
    584}
    585
    586static int digital_dev_down(struct nfc_dev *nfc_dev)
    587{
    588	struct nfc_digital_dev *ddev = nfc_get_drvdata(nfc_dev);
    589
    590	digital_switch_rf(ddev, 0);
    591
    592	return 0;
    593}
    594
    595static int digital_dep_link_up(struct nfc_dev *nfc_dev,
    596			       struct nfc_target *target,
    597			       __u8 comm_mode, __u8 *gb, size_t gb_len)
    598{
    599	struct nfc_digital_dev *ddev = nfc_get_drvdata(nfc_dev);
    600	int rc;
    601
    602	rc = digital_in_send_atr_req(ddev, target, comm_mode, gb, gb_len);
    603
    604	if (!rc)
    605		ddev->curr_protocol = NFC_PROTO_NFC_DEP;
    606
    607	return rc;
    608}
    609
    610static int digital_dep_link_down(struct nfc_dev *nfc_dev)
    611{
    612	struct nfc_digital_dev *ddev = nfc_get_drvdata(nfc_dev);
    613
    614	digital_abort_cmd(ddev);
    615
    616	ddev->curr_protocol = 0;
    617
    618	return 0;
    619}
    620
    621static int digital_activate_target(struct nfc_dev *nfc_dev,
    622				   struct nfc_target *target, __u32 protocol)
    623{
    624	struct nfc_digital_dev *ddev = nfc_get_drvdata(nfc_dev);
    625
    626	if (ddev->poll_tech_count) {
    627		pr_err("Can't activate a target while polling\n");
    628		return -EBUSY;
    629	}
    630
    631	if (ddev->curr_protocol) {
    632		pr_err("A target is already active\n");
    633		return -EBUSY;
    634	}
    635
    636	ddev->curr_protocol = protocol;
    637
    638	return 0;
    639}
    640
    641static void digital_deactivate_target(struct nfc_dev *nfc_dev,
    642				      struct nfc_target *target,
    643				      u8 mode)
    644{
    645	struct nfc_digital_dev *ddev = nfc_get_drvdata(nfc_dev);
    646
    647	if (!ddev->curr_protocol) {
    648		pr_err("No active target\n");
    649		return;
    650	}
    651
    652	digital_abort_cmd(ddev);
    653	ddev->curr_protocol = 0;
    654}
    655
    656static int digital_tg_send(struct nfc_dev *dev, struct sk_buff *skb)
    657{
    658	struct nfc_digital_dev *ddev = nfc_get_drvdata(dev);
    659
    660	return digital_tg_send_dep_res(ddev, skb);
    661}
    662
    663static void digital_in_send_complete(struct nfc_digital_dev *ddev, void *arg,
    664				     struct sk_buff *resp)
    665{
    666	struct digital_data_exch *data_exch = arg;
    667	int rc;
    668
    669	if (IS_ERR(resp)) {
    670		rc = PTR_ERR(resp);
    671		resp = NULL;
    672		goto done;
    673	}
    674
    675	if (ddev->curr_protocol == NFC_PROTO_MIFARE) {
    676		rc = digital_in_recv_mifare_res(resp);
    677		/* crc check is done in digital_in_recv_mifare_res() */
    678		goto done;
    679	}
    680
    681	if ((ddev->curr_protocol == NFC_PROTO_ISO14443) ||
    682	    (ddev->curr_protocol == NFC_PROTO_ISO14443_B)) {
    683		rc = digital_in_iso_dep_pull_sod(ddev, resp);
    684		if (rc)
    685			goto done;
    686	}
    687
    688	rc = ddev->skb_check_crc(resp);
    689
    690done:
    691	if (rc) {
    692		kfree_skb(resp);
    693		resp = NULL;
    694	}
    695
    696	data_exch->cb(data_exch->cb_context, resp, rc);
    697
    698	kfree(data_exch);
    699}
    700
    701static int digital_in_send(struct nfc_dev *nfc_dev, struct nfc_target *target,
    702			   struct sk_buff *skb, data_exchange_cb_t cb,
    703			   void *cb_context)
    704{
    705	struct nfc_digital_dev *ddev = nfc_get_drvdata(nfc_dev);
    706	struct digital_data_exch *data_exch;
    707	int rc;
    708
    709	data_exch = kzalloc(sizeof(*data_exch), GFP_KERNEL);
    710	if (!data_exch)
    711		return -ENOMEM;
    712
    713	data_exch->cb = cb;
    714	data_exch->cb_context = cb_context;
    715
    716	if (ddev->curr_protocol == NFC_PROTO_NFC_DEP) {
    717		rc = digital_in_send_dep_req(ddev, target, skb, data_exch);
    718		goto exit;
    719	}
    720
    721	if ((ddev->curr_protocol == NFC_PROTO_ISO14443) ||
    722	    (ddev->curr_protocol == NFC_PROTO_ISO14443_B)) {
    723		rc = digital_in_iso_dep_push_sod(ddev, skb);
    724		if (rc)
    725			goto exit;
    726	}
    727
    728	ddev->skb_add_crc(skb);
    729
    730	rc = digital_in_send_cmd(ddev, skb, 500, digital_in_send_complete,
    731				 data_exch);
    732
    733exit:
    734	if (rc)
    735		kfree(data_exch);
    736
    737	return rc;
    738}
    739
    740static const struct nfc_ops digital_nfc_ops = {
    741	.dev_up = digital_dev_up,
    742	.dev_down = digital_dev_down,
    743	.start_poll = digital_start_poll,
    744	.stop_poll = digital_stop_poll,
    745	.dep_link_up = digital_dep_link_up,
    746	.dep_link_down = digital_dep_link_down,
    747	.activate_target = digital_activate_target,
    748	.deactivate_target = digital_deactivate_target,
    749	.tm_send = digital_tg_send,
    750	.im_transceive = digital_in_send,
    751};
    752
    753struct nfc_digital_dev *nfc_digital_allocate_device(const struct nfc_digital_ops *ops,
    754					    __u32 supported_protocols,
    755					    __u32 driver_capabilities,
    756					    int tx_headroom, int tx_tailroom)
    757{
    758	struct nfc_digital_dev *ddev;
    759
    760	if (!ops->in_configure_hw || !ops->in_send_cmd || !ops->tg_listen ||
    761	    !ops->tg_configure_hw || !ops->tg_send_cmd || !ops->abort_cmd ||
    762	    !ops->switch_rf || (ops->tg_listen_md && !ops->tg_get_rf_tech))
    763		return NULL;
    764
    765	ddev = kzalloc(sizeof(*ddev), GFP_KERNEL);
    766	if (!ddev)
    767		return NULL;
    768
    769	ddev->driver_capabilities = driver_capabilities;
    770	ddev->ops = ops;
    771
    772	mutex_init(&ddev->cmd_lock);
    773	INIT_LIST_HEAD(&ddev->cmd_queue);
    774
    775	INIT_WORK(&ddev->cmd_work, digital_wq_cmd);
    776	INIT_WORK(&ddev->cmd_complete_work, digital_wq_cmd_complete);
    777
    778	mutex_init(&ddev->poll_lock);
    779	INIT_DELAYED_WORK(&ddev->poll_work, digital_wq_poll);
    780
    781	if (supported_protocols & NFC_PROTO_JEWEL_MASK)
    782		ddev->protocols |= NFC_PROTO_JEWEL_MASK;
    783	if (supported_protocols & NFC_PROTO_MIFARE_MASK)
    784		ddev->protocols |= NFC_PROTO_MIFARE_MASK;
    785	if (supported_protocols & NFC_PROTO_FELICA_MASK)
    786		ddev->protocols |= NFC_PROTO_FELICA_MASK;
    787	if (supported_protocols & NFC_PROTO_NFC_DEP_MASK)
    788		ddev->protocols |= NFC_PROTO_NFC_DEP_MASK;
    789	if (supported_protocols & NFC_PROTO_ISO15693_MASK)
    790		ddev->protocols |= NFC_PROTO_ISO15693_MASK;
    791	if (supported_protocols & NFC_PROTO_ISO14443_MASK)
    792		ddev->protocols |= NFC_PROTO_ISO14443_MASK;
    793	if (supported_protocols & NFC_PROTO_ISO14443_B_MASK)
    794		ddev->protocols |= NFC_PROTO_ISO14443_B_MASK;
    795
    796	ddev->tx_headroom = tx_headroom + DIGITAL_MAX_HEADER_LEN;
    797	ddev->tx_tailroom = tx_tailroom + DIGITAL_CRC_LEN;
    798
    799	ddev->nfc_dev = nfc_allocate_device(&digital_nfc_ops, ddev->protocols,
    800					    ddev->tx_headroom,
    801					    ddev->tx_tailroom);
    802	if (!ddev->nfc_dev) {
    803		pr_err("nfc_allocate_device failed\n");
    804		goto free_dev;
    805	}
    806
    807	nfc_set_drvdata(ddev->nfc_dev, ddev);
    808
    809	return ddev;
    810
    811free_dev:
    812	kfree(ddev);
    813
    814	return NULL;
    815}
    816EXPORT_SYMBOL(nfc_digital_allocate_device);
    817
    818void nfc_digital_free_device(struct nfc_digital_dev *ddev)
    819{
    820	nfc_free_device(ddev->nfc_dev);
    821	kfree(ddev);
    822}
    823EXPORT_SYMBOL(nfc_digital_free_device);
    824
    825int nfc_digital_register_device(struct nfc_digital_dev *ddev)
    826{
    827	return nfc_register_device(ddev->nfc_dev);
    828}
    829EXPORT_SYMBOL(nfc_digital_register_device);
    830
    831void nfc_digital_unregister_device(struct nfc_digital_dev *ddev)
    832{
    833	struct digital_cmd *cmd, *n;
    834
    835	nfc_unregister_device(ddev->nfc_dev);
    836
    837	mutex_lock(&ddev->poll_lock);
    838	ddev->poll_tech_count = 0;
    839	mutex_unlock(&ddev->poll_lock);
    840
    841	cancel_delayed_work_sync(&ddev->poll_work);
    842	cancel_work_sync(&ddev->cmd_work);
    843	cancel_work_sync(&ddev->cmd_complete_work);
    844
    845	list_for_each_entry_safe(cmd, n, &ddev->cmd_queue, queue) {
    846		list_del(&cmd->queue);
    847
    848		/* Call the command callback if any and pass it a ENODEV error.
    849		 * This gives a chance to the command issuer to free any
    850		 * allocated buffer.
    851		 */
    852		if (cmd->cmd_cb)
    853			cmd->cmd_cb(ddev, cmd->cb_context, ERR_PTR(-ENODEV));
    854
    855		kfree(cmd->mdaa_params);
    856		kfree(cmd);
    857	}
    858}
    859EXPORT_SYMBOL(nfc_digital_unregister_device);
    860
    861MODULE_LICENSE("GPL");