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_technology.c (27083B)


      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 "digital.h"
     10
     11#define DIGITAL_CMD_SENS_REQ    0x26
     12#define DIGITAL_CMD_ALL_REQ     0x52
     13#define DIGITAL_CMD_SEL_REQ_CL1 0x93
     14#define DIGITAL_CMD_SEL_REQ_CL2 0x95
     15#define DIGITAL_CMD_SEL_REQ_CL3 0x97
     16
     17#define DIGITAL_SDD_REQ_SEL_PAR 0x20
     18
     19#define DIGITAL_SDD_RES_CT  0x88
     20#define DIGITAL_SDD_RES_LEN 5
     21#define DIGITAL_SEL_RES_LEN 1
     22
     23#define DIGITAL_SEL_RES_NFCID1_COMPLETE(sel_res) (!((sel_res) & 0x04))
     24#define DIGITAL_SEL_RES_IS_T2T(sel_res) (!((sel_res) & 0x60))
     25#define DIGITAL_SEL_RES_IS_T4T(sel_res) ((sel_res) & 0x20)
     26#define DIGITAL_SEL_RES_IS_NFC_DEP(sel_res) ((sel_res) & 0x40)
     27
     28#define DIGITAL_SENS_RES_IS_T1T(sens_res) (((sens_res) & 0x0C00) == 0x0C00)
     29#define DIGITAL_SENS_RES_IS_VALID(sens_res) \
     30	((!((sens_res) & 0x001F) && (((sens_res) & 0x0C00) == 0x0C00)) || \
     31	(((sens_res) & 0x001F) && ((sens_res) & 0x0C00) != 0x0C00))
     32
     33#define DIGITAL_MIFARE_READ_RES_LEN 16
     34#define DIGITAL_MIFARE_ACK_RES	0x0A
     35
     36#define DIGITAL_CMD_SENSB_REQ			0x05
     37#define DIGITAL_SENSB_ADVANCED			BIT(5)
     38#define DIGITAL_SENSB_EXTENDED			BIT(4)
     39#define DIGITAL_SENSB_ALLB_REQ			BIT(3)
     40#define DIGITAL_SENSB_N(n)			((n) & 0x7)
     41
     42#define DIGITAL_CMD_SENSB_RES			0x50
     43
     44#define DIGITAL_CMD_ATTRIB_REQ			0x1D
     45#define DIGITAL_ATTRIB_P1_TR0_DEFAULT		(0x0 << 6)
     46#define DIGITAL_ATTRIB_P1_TR1_DEFAULT		(0x0 << 4)
     47#define DIGITAL_ATTRIB_P1_SUPRESS_EOS		BIT(3)
     48#define DIGITAL_ATTRIB_P1_SUPRESS_SOS		BIT(2)
     49#define DIGITAL_ATTRIB_P2_LISTEN_POLL_1		(0x0 << 6)
     50#define DIGITAL_ATTRIB_P2_POLL_LISTEN_1		(0x0 << 4)
     51#define DIGITAL_ATTRIB_P2_MAX_FRAME_256		0x8
     52#define DIGITAL_ATTRIB_P4_DID(n)		((n) & 0xf)
     53
     54#define DIGITAL_CMD_SENSF_REQ	0x00
     55#define DIGITAL_CMD_SENSF_RES	0x01
     56
     57#define DIGITAL_SENSF_RES_MIN_LENGTH 17
     58#define DIGITAL_SENSF_RES_RD_AP_B1   0x00
     59#define DIGITAL_SENSF_RES_RD_AP_B2   0x8F
     60
     61#define DIGITAL_SENSF_REQ_RC_NONE 0
     62#define DIGITAL_SENSF_REQ_RC_SC   1
     63#define DIGITAL_SENSF_REQ_RC_AP   2
     64
     65#define DIGITAL_CMD_ISO15693_INVENTORY_REQ	0x01
     66
     67#define DIGITAL_ISO15693_REQ_FLAG_DATA_RATE	BIT(1)
     68#define DIGITAL_ISO15693_REQ_FLAG_INVENTORY	BIT(2)
     69#define DIGITAL_ISO15693_REQ_FLAG_NB_SLOTS	BIT(5)
     70#define DIGITAL_ISO15693_RES_FLAG_ERROR		BIT(0)
     71#define DIGITAL_ISO15693_RES_IS_VALID(flags) \
     72	(!((flags) & DIGITAL_ISO15693_RES_FLAG_ERROR))
     73
     74#define DIGITAL_ISO_DEP_I_PCB	 0x02
     75#define DIGITAL_ISO_DEP_PNI(pni) ((pni) & 0x01)
     76
     77#define DIGITAL_ISO_DEP_PCB_TYPE(pcb) ((pcb) & 0xC0)
     78
     79#define DIGITAL_ISO_DEP_I_BLOCK 0x00
     80
     81#define DIGITAL_ISO_DEP_BLOCK_HAS_DID(pcb) ((pcb) & 0x08)
     82
     83static const u8 digital_ats_fsc[] = {
     84	 16,  24,  32,  40,  48,  64,  96, 128,
     85};
     86
     87#define DIGITAL_ATS_FSCI(t0) ((t0) & 0x0F)
     88#define DIGITAL_SENSB_FSCI(pi2) (((pi2) & 0xF0) >> 4)
     89#define DIGITAL_ATS_MAX_FSC  256
     90
     91#define DIGITAL_RATS_BYTE1 0xE0
     92#define DIGITAL_RATS_PARAM 0x80
     93
     94struct digital_sdd_res {
     95	u8 nfcid1[4];
     96	u8 bcc;
     97} __packed;
     98
     99struct digital_sel_req {
    100	u8 sel_cmd;
    101	u8 b2;
    102	u8 nfcid1[4];
    103	u8 bcc;
    104} __packed;
    105
    106struct digital_sensb_req {
    107	u8 cmd;
    108	u8 afi;
    109	u8 param;
    110} __packed;
    111
    112struct digital_sensb_res {
    113	u8 cmd;
    114	u8 nfcid0[4];
    115	u8 app_data[4];
    116	u8 proto_info[3];
    117} __packed;
    118
    119struct digital_attrib_req {
    120	u8 cmd;
    121	u8 nfcid0[4];
    122	u8 param1;
    123	u8 param2;
    124	u8 param3;
    125	u8 param4;
    126} __packed;
    127
    128struct digital_attrib_res {
    129	u8 mbli_did;
    130} __packed;
    131
    132struct digital_sensf_req {
    133	u8 cmd;
    134	u8 sc1;
    135	u8 sc2;
    136	u8 rc;
    137	u8 tsn;
    138} __packed;
    139
    140struct digital_sensf_res {
    141	u8 cmd;
    142	u8 nfcid2[8];
    143	u8 pad0[2];
    144	u8 pad1[3];
    145	u8 mrti_check;
    146	u8 mrti_update;
    147	u8 pad2;
    148	u8 rd[2];
    149} __packed;
    150
    151struct digital_iso15693_inv_req {
    152	u8 flags;
    153	u8 cmd;
    154	u8 mask_len;
    155	u64 mask;
    156} __packed;
    157
    158struct digital_iso15693_inv_res {
    159	u8 flags;
    160	u8 dsfid;
    161	u64 uid;
    162} __packed;
    163
    164static int digital_in_send_sdd_req(struct nfc_digital_dev *ddev,
    165				   struct nfc_target *target);
    166
    167int digital_in_iso_dep_pull_sod(struct nfc_digital_dev *ddev,
    168				struct sk_buff *skb)
    169{
    170	u8 pcb;
    171	u8 block_type;
    172
    173	if (skb->len < 1)
    174		return -EIO;
    175
    176	pcb = *skb->data;
    177	block_type = DIGITAL_ISO_DEP_PCB_TYPE(pcb);
    178
    179	/* No support fo R-block nor S-block */
    180	if (block_type != DIGITAL_ISO_DEP_I_BLOCK) {
    181		pr_err("ISO_DEP R-block and S-block not supported\n");
    182		return -EIO;
    183	}
    184
    185	if (DIGITAL_ISO_DEP_BLOCK_HAS_DID(pcb)) {
    186		pr_err("DID field in ISO_DEP PCB not supported\n");
    187		return -EIO;
    188	}
    189
    190	skb_pull(skb, 1);
    191
    192	return 0;
    193}
    194
    195int digital_in_iso_dep_push_sod(struct nfc_digital_dev *ddev,
    196				struct sk_buff *skb)
    197{
    198	/*
    199	 * Chaining not supported so skb->len + 1 PCB byte + 2 CRC bytes must
    200	 * not be greater than remote FSC
    201	 */
    202	if (skb->len + 3 > ddev->target_fsc)
    203		return -EIO;
    204
    205	skb_push(skb, 1);
    206
    207	*skb->data = DIGITAL_ISO_DEP_I_PCB | ddev->curr_nfc_dep_pni;
    208
    209	ddev->curr_nfc_dep_pni =
    210		DIGITAL_ISO_DEP_PNI(ddev->curr_nfc_dep_pni + 1);
    211
    212	return 0;
    213}
    214
    215static void digital_in_recv_ats(struct nfc_digital_dev *ddev, void *arg,
    216				struct sk_buff *resp)
    217{
    218	struct nfc_target *target = arg;
    219	u8 fsdi;
    220	int rc;
    221
    222	if (IS_ERR(resp)) {
    223		rc = PTR_ERR(resp);
    224		resp = NULL;
    225		goto exit;
    226	}
    227
    228	if (resp->len < 2) {
    229		rc = -EIO;
    230		goto exit;
    231	}
    232
    233	fsdi = DIGITAL_ATS_FSCI(resp->data[1]);
    234	if (fsdi >= 8)
    235		ddev->target_fsc = DIGITAL_ATS_MAX_FSC;
    236	else
    237		ddev->target_fsc = digital_ats_fsc[fsdi];
    238
    239	ddev->curr_nfc_dep_pni = 0;
    240
    241	rc = digital_target_found(ddev, target, NFC_PROTO_ISO14443);
    242
    243exit:
    244	dev_kfree_skb(resp);
    245	kfree(target);
    246
    247	if (rc)
    248		digital_poll_next_tech(ddev);
    249}
    250
    251static int digital_in_send_rats(struct nfc_digital_dev *ddev,
    252				struct nfc_target *target)
    253{
    254	int rc;
    255	struct sk_buff *skb;
    256
    257	skb = digital_skb_alloc(ddev, 2);
    258	if (!skb)
    259		return -ENOMEM;
    260
    261	skb_put_u8(skb, DIGITAL_RATS_BYTE1);
    262	skb_put_u8(skb, DIGITAL_RATS_PARAM);
    263
    264	rc = digital_in_send_cmd(ddev, skb, 30, digital_in_recv_ats,
    265				 target);
    266	if (rc)
    267		kfree_skb(skb);
    268
    269	return rc;
    270}
    271
    272static void digital_in_recv_sel_res(struct nfc_digital_dev *ddev, void *arg,
    273				    struct sk_buff *resp)
    274{
    275	struct nfc_target *target = arg;
    276	int rc;
    277	u8 sel_res;
    278	u8 nfc_proto;
    279
    280	if (IS_ERR(resp)) {
    281		rc = PTR_ERR(resp);
    282		resp = NULL;
    283		goto exit;
    284	}
    285
    286	if (!DIGITAL_DRV_CAPS_IN_CRC(ddev)) {
    287		rc = digital_skb_check_crc_a(resp);
    288		if (rc) {
    289			PROTOCOL_ERR("4.4.1.3");
    290			goto exit;
    291		}
    292	}
    293
    294	if (resp->len != DIGITAL_SEL_RES_LEN) {
    295		rc = -EIO;
    296		goto exit;
    297	}
    298
    299	sel_res = resp->data[0];
    300
    301	if (!DIGITAL_SEL_RES_NFCID1_COMPLETE(sel_res)) {
    302		rc = digital_in_send_sdd_req(ddev, target);
    303		if (rc)
    304			goto exit;
    305
    306		goto exit_free_skb;
    307	}
    308
    309	target->sel_res = sel_res;
    310
    311	if (DIGITAL_SEL_RES_IS_T2T(sel_res)) {
    312		nfc_proto = NFC_PROTO_MIFARE;
    313	} else if (DIGITAL_SEL_RES_IS_NFC_DEP(sel_res)) {
    314		nfc_proto = NFC_PROTO_NFC_DEP;
    315	} else if (DIGITAL_SEL_RES_IS_T4T(sel_res)) {
    316		rc = digital_in_send_rats(ddev, target);
    317		if (rc)
    318			goto exit;
    319		/*
    320		 * Skip target_found and don't free it for now. This will be
    321		 * done when receiving the ATS
    322		 */
    323		goto exit_free_skb;
    324	} else {
    325		rc = -EOPNOTSUPP;
    326		goto exit;
    327	}
    328
    329	rc = digital_target_found(ddev, target, nfc_proto);
    330
    331exit:
    332	kfree(target);
    333
    334exit_free_skb:
    335	dev_kfree_skb(resp);
    336
    337	if (rc)
    338		digital_poll_next_tech(ddev);
    339}
    340
    341static int digital_in_send_sel_req(struct nfc_digital_dev *ddev,
    342				   struct nfc_target *target,
    343				   struct digital_sdd_res *sdd_res)
    344{
    345	struct sk_buff *skb;
    346	struct digital_sel_req *sel_req;
    347	u8 sel_cmd;
    348	int rc;
    349
    350	skb = digital_skb_alloc(ddev, sizeof(struct digital_sel_req));
    351	if (!skb)
    352		return -ENOMEM;
    353
    354	skb_put(skb, sizeof(struct digital_sel_req));
    355	sel_req = (struct digital_sel_req *)skb->data;
    356
    357	if (target->nfcid1_len <= 4)
    358		sel_cmd = DIGITAL_CMD_SEL_REQ_CL1;
    359	else if (target->nfcid1_len < 10)
    360		sel_cmd = DIGITAL_CMD_SEL_REQ_CL2;
    361	else
    362		sel_cmd = DIGITAL_CMD_SEL_REQ_CL3;
    363
    364	sel_req->sel_cmd = sel_cmd;
    365	sel_req->b2 = 0x70;
    366	memcpy(sel_req->nfcid1, sdd_res->nfcid1, 4);
    367	sel_req->bcc = sdd_res->bcc;
    368
    369	if (DIGITAL_DRV_CAPS_IN_CRC(ddev)) {
    370		rc = digital_in_configure_hw(ddev, NFC_DIGITAL_CONFIG_FRAMING,
    371				NFC_DIGITAL_FRAMING_NFCA_STANDARD_WITH_CRC_A);
    372		if (rc)
    373			goto exit;
    374	} else {
    375		digital_skb_add_crc_a(skb);
    376	}
    377
    378	rc = digital_in_send_cmd(ddev, skb, 30, digital_in_recv_sel_res,
    379				 target);
    380exit:
    381	if (rc)
    382		kfree_skb(skb);
    383
    384	return rc;
    385}
    386
    387static void digital_in_recv_sdd_res(struct nfc_digital_dev *ddev, void *arg,
    388				    struct sk_buff *resp)
    389{
    390	struct nfc_target *target = arg;
    391	struct digital_sdd_res *sdd_res;
    392	int rc;
    393	u8 offset, size;
    394	u8 i, bcc;
    395
    396	if (IS_ERR(resp)) {
    397		rc = PTR_ERR(resp);
    398		resp = NULL;
    399		goto exit;
    400	}
    401
    402	if (resp->len < DIGITAL_SDD_RES_LEN) {
    403		PROTOCOL_ERR("4.7.2.8");
    404		rc = -EINVAL;
    405		goto exit;
    406	}
    407
    408	sdd_res = (struct digital_sdd_res *)resp->data;
    409
    410	for (i = 0, bcc = 0; i < 4; i++)
    411		bcc ^= sdd_res->nfcid1[i];
    412
    413	if (bcc != sdd_res->bcc) {
    414		PROTOCOL_ERR("4.7.2.6");
    415		rc = -EINVAL;
    416		goto exit;
    417	}
    418
    419	if (sdd_res->nfcid1[0] == DIGITAL_SDD_RES_CT) {
    420		offset = 1;
    421		size = 3;
    422	} else {
    423		offset = 0;
    424		size = 4;
    425	}
    426
    427	memcpy(target->nfcid1 + target->nfcid1_len, sdd_res->nfcid1 + offset,
    428	       size);
    429	target->nfcid1_len += size;
    430
    431	rc = digital_in_send_sel_req(ddev, target, sdd_res);
    432
    433exit:
    434	dev_kfree_skb(resp);
    435
    436	if (rc) {
    437		kfree(target);
    438		digital_poll_next_tech(ddev);
    439	}
    440}
    441
    442static int digital_in_send_sdd_req(struct nfc_digital_dev *ddev,
    443				   struct nfc_target *target)
    444{
    445	int rc;
    446	struct sk_buff *skb;
    447	u8 sel_cmd;
    448
    449	rc = digital_in_configure_hw(ddev, NFC_DIGITAL_CONFIG_FRAMING,
    450				     NFC_DIGITAL_FRAMING_NFCA_STANDARD);
    451	if (rc)
    452		return rc;
    453
    454	skb = digital_skb_alloc(ddev, 2);
    455	if (!skb)
    456		return -ENOMEM;
    457
    458	if (target->nfcid1_len == 0)
    459		sel_cmd = DIGITAL_CMD_SEL_REQ_CL1;
    460	else if (target->nfcid1_len == 3)
    461		sel_cmd = DIGITAL_CMD_SEL_REQ_CL2;
    462	else
    463		sel_cmd = DIGITAL_CMD_SEL_REQ_CL3;
    464
    465	skb_put_u8(skb, sel_cmd);
    466	skb_put_u8(skb, DIGITAL_SDD_REQ_SEL_PAR);
    467
    468	rc = digital_in_send_cmd(ddev, skb, 30, digital_in_recv_sdd_res,
    469				 target);
    470	if (rc)
    471		kfree_skb(skb);
    472
    473	return rc;
    474}
    475
    476static void digital_in_recv_sens_res(struct nfc_digital_dev *ddev, void *arg,
    477				     struct sk_buff *resp)
    478{
    479	struct nfc_target *target = NULL;
    480	int rc;
    481
    482	if (IS_ERR(resp)) {
    483		rc = PTR_ERR(resp);
    484		resp = NULL;
    485		goto exit;
    486	}
    487
    488	if (resp->len < sizeof(u16)) {
    489		rc = -EIO;
    490		goto exit;
    491	}
    492
    493	target = kzalloc(sizeof(struct nfc_target), GFP_KERNEL);
    494	if (!target) {
    495		rc = -ENOMEM;
    496		goto exit;
    497	}
    498
    499	target->sens_res = __le16_to_cpu(*(__le16 *)resp->data);
    500
    501	if (!DIGITAL_SENS_RES_IS_VALID(target->sens_res)) {
    502		PROTOCOL_ERR("4.6.3.3");
    503		rc = -EINVAL;
    504		goto exit;
    505	}
    506
    507	if (DIGITAL_SENS_RES_IS_T1T(target->sens_res))
    508		rc = digital_target_found(ddev, target, NFC_PROTO_JEWEL);
    509	else
    510		rc = digital_in_send_sdd_req(ddev, target);
    511
    512exit:
    513	dev_kfree_skb(resp);
    514
    515	if (rc) {
    516		kfree(target);
    517		digital_poll_next_tech(ddev);
    518	}
    519}
    520
    521int digital_in_send_sens_req(struct nfc_digital_dev *ddev, u8 rf_tech)
    522{
    523	struct sk_buff *skb;
    524	int rc;
    525
    526	rc = digital_in_configure_hw(ddev, NFC_DIGITAL_CONFIG_RF_TECH,
    527				     NFC_DIGITAL_RF_TECH_106A);
    528	if (rc)
    529		return rc;
    530
    531	rc = digital_in_configure_hw(ddev, NFC_DIGITAL_CONFIG_FRAMING,
    532				     NFC_DIGITAL_FRAMING_NFCA_SHORT);
    533	if (rc)
    534		return rc;
    535
    536	skb = digital_skb_alloc(ddev, 1);
    537	if (!skb)
    538		return -ENOMEM;
    539
    540	skb_put_u8(skb, DIGITAL_CMD_SENS_REQ);
    541
    542	rc = digital_in_send_cmd(ddev, skb, 30, digital_in_recv_sens_res, NULL);
    543	if (rc)
    544		kfree_skb(skb);
    545
    546	return rc;
    547}
    548
    549int digital_in_recv_mifare_res(struct sk_buff *resp)
    550{
    551	/* Successful READ command response is 16 data bytes + 2 CRC bytes long.
    552	 * Since the driver can't differentiate a ACK/NACK response from a valid
    553	 * READ response, the CRC calculation must be handled at digital level
    554	 * even if the driver supports it for this technology.
    555	 */
    556	if (resp->len == DIGITAL_MIFARE_READ_RES_LEN + DIGITAL_CRC_LEN) {
    557		if (digital_skb_check_crc_a(resp)) {
    558			PROTOCOL_ERR("9.4.1.2");
    559			return -EIO;
    560		}
    561
    562		return 0;
    563	}
    564
    565	/* ACK response (i.e. successful WRITE). */
    566	if (resp->len == 1 && resp->data[0] == DIGITAL_MIFARE_ACK_RES) {
    567		resp->data[0] = 0;
    568		return 0;
    569	}
    570
    571	/* NACK and any other responses are treated as error. */
    572	return -EIO;
    573}
    574
    575static void digital_in_recv_attrib_res(struct nfc_digital_dev *ddev, void *arg,
    576				       struct sk_buff *resp)
    577{
    578	struct nfc_target *target = arg;
    579	struct digital_attrib_res *attrib_res;
    580	int rc;
    581
    582	if (IS_ERR(resp)) {
    583		rc = PTR_ERR(resp);
    584		resp = NULL;
    585		goto exit;
    586	}
    587
    588	if (resp->len < sizeof(*attrib_res)) {
    589		PROTOCOL_ERR("12.6.2");
    590		rc = -EIO;
    591		goto exit;
    592	}
    593
    594	attrib_res = (struct digital_attrib_res *)resp->data;
    595
    596	if (attrib_res->mbli_did & 0x0f) {
    597		PROTOCOL_ERR("12.6.2.1");
    598		rc = -EIO;
    599		goto exit;
    600	}
    601
    602	rc = digital_target_found(ddev, target, NFC_PROTO_ISO14443_B);
    603
    604exit:
    605	dev_kfree_skb(resp);
    606	kfree(target);
    607
    608	if (rc)
    609		digital_poll_next_tech(ddev);
    610}
    611
    612static int digital_in_send_attrib_req(struct nfc_digital_dev *ddev,
    613			       struct nfc_target *target,
    614			       struct digital_sensb_res *sensb_res)
    615{
    616	struct digital_attrib_req *attrib_req;
    617	struct sk_buff *skb;
    618	int rc;
    619
    620	skb = digital_skb_alloc(ddev, sizeof(*attrib_req));
    621	if (!skb)
    622		return -ENOMEM;
    623
    624	attrib_req = skb_put(skb, sizeof(*attrib_req));
    625
    626	attrib_req->cmd = DIGITAL_CMD_ATTRIB_REQ;
    627	memcpy(attrib_req->nfcid0, sensb_res->nfcid0,
    628	       sizeof(attrib_req->nfcid0));
    629	attrib_req->param1 = DIGITAL_ATTRIB_P1_TR0_DEFAULT |
    630			     DIGITAL_ATTRIB_P1_TR1_DEFAULT;
    631	attrib_req->param2 = DIGITAL_ATTRIB_P2_LISTEN_POLL_1 |
    632			     DIGITAL_ATTRIB_P2_POLL_LISTEN_1 |
    633			     DIGITAL_ATTRIB_P2_MAX_FRAME_256;
    634	attrib_req->param3 = sensb_res->proto_info[1] & 0x07;
    635	attrib_req->param4 = DIGITAL_ATTRIB_P4_DID(0);
    636
    637	rc = digital_in_send_cmd(ddev, skb, 30, digital_in_recv_attrib_res,
    638				 target);
    639	if (rc)
    640		kfree_skb(skb);
    641
    642	return rc;
    643}
    644
    645static void digital_in_recv_sensb_res(struct nfc_digital_dev *ddev, void *arg,
    646				      struct sk_buff *resp)
    647{
    648	struct nfc_target *target = NULL;
    649	struct digital_sensb_res *sensb_res;
    650	u8 fsci;
    651	int rc;
    652
    653	if (IS_ERR(resp)) {
    654		rc = PTR_ERR(resp);
    655		resp = NULL;
    656		goto exit;
    657	}
    658
    659	if (resp->len != sizeof(*sensb_res)) {
    660		PROTOCOL_ERR("5.6.2.1");
    661		rc = -EIO;
    662		goto exit;
    663	}
    664
    665	sensb_res = (struct digital_sensb_res *)resp->data;
    666
    667	if (sensb_res->cmd != DIGITAL_CMD_SENSB_RES) {
    668		PROTOCOL_ERR("5.6.2");
    669		rc = -EIO;
    670		goto exit;
    671	}
    672
    673	if (!(sensb_res->proto_info[1] & BIT(0))) {
    674		PROTOCOL_ERR("5.6.2.12");
    675		rc = -EIO;
    676		goto exit;
    677	}
    678
    679	if (sensb_res->proto_info[1] & BIT(3)) {
    680		PROTOCOL_ERR("5.6.2.16");
    681		rc = -EIO;
    682		goto exit;
    683	}
    684
    685	fsci = DIGITAL_SENSB_FSCI(sensb_res->proto_info[1]);
    686	if (fsci >= 8)
    687		ddev->target_fsc = DIGITAL_ATS_MAX_FSC;
    688	else
    689		ddev->target_fsc = digital_ats_fsc[fsci];
    690
    691	target = kzalloc(sizeof(struct nfc_target), GFP_KERNEL);
    692	if (!target) {
    693		rc = -ENOMEM;
    694		goto exit;
    695	}
    696
    697	rc = digital_in_send_attrib_req(ddev, target, sensb_res);
    698
    699exit:
    700	dev_kfree_skb(resp);
    701
    702	if (rc) {
    703		kfree(target);
    704		digital_poll_next_tech(ddev);
    705	}
    706}
    707
    708int digital_in_send_sensb_req(struct nfc_digital_dev *ddev, u8 rf_tech)
    709{
    710	struct digital_sensb_req *sensb_req;
    711	struct sk_buff *skb;
    712	int rc;
    713
    714	rc = digital_in_configure_hw(ddev, NFC_DIGITAL_CONFIG_RF_TECH,
    715				     NFC_DIGITAL_RF_TECH_106B);
    716	if (rc)
    717		return rc;
    718
    719	rc = digital_in_configure_hw(ddev, NFC_DIGITAL_CONFIG_FRAMING,
    720				     NFC_DIGITAL_FRAMING_NFCB);
    721	if (rc)
    722		return rc;
    723
    724	skb = digital_skb_alloc(ddev, sizeof(*sensb_req));
    725	if (!skb)
    726		return -ENOMEM;
    727
    728	sensb_req = skb_put(skb, sizeof(*sensb_req));
    729
    730	sensb_req->cmd = DIGITAL_CMD_SENSB_REQ;
    731	sensb_req->afi = 0x00; /* All families and sub-families */
    732	sensb_req->param = DIGITAL_SENSB_N(0);
    733
    734	rc = digital_in_send_cmd(ddev, skb, 30, digital_in_recv_sensb_res,
    735				 NULL);
    736	if (rc)
    737		kfree_skb(skb);
    738
    739	return rc;
    740}
    741
    742static void digital_in_recv_sensf_res(struct nfc_digital_dev *ddev, void *arg,
    743				   struct sk_buff *resp)
    744{
    745	int rc;
    746	u8 proto;
    747	struct nfc_target target;
    748	struct digital_sensf_res *sensf_res;
    749
    750	if (IS_ERR(resp)) {
    751		rc = PTR_ERR(resp);
    752		resp = NULL;
    753		goto exit;
    754	}
    755
    756	if (resp->len < DIGITAL_SENSF_RES_MIN_LENGTH) {
    757		rc = -EIO;
    758		goto exit;
    759	}
    760
    761	if (!DIGITAL_DRV_CAPS_IN_CRC(ddev)) {
    762		rc = digital_skb_check_crc_f(resp);
    763		if (rc) {
    764			PROTOCOL_ERR("6.4.1.8");
    765			goto exit;
    766		}
    767	}
    768
    769	skb_pull(resp, 1);
    770
    771	memset(&target, 0, sizeof(struct nfc_target));
    772
    773	sensf_res = (struct digital_sensf_res *)resp->data;
    774
    775	memcpy(target.sensf_res, sensf_res, resp->len);
    776	target.sensf_res_len = resp->len;
    777
    778	memcpy(target.nfcid2, sensf_res->nfcid2, NFC_NFCID2_MAXSIZE);
    779	target.nfcid2_len = NFC_NFCID2_MAXSIZE;
    780
    781	if (target.nfcid2[0] == DIGITAL_SENSF_NFCID2_NFC_DEP_B1 &&
    782	    target.nfcid2[1] == DIGITAL_SENSF_NFCID2_NFC_DEP_B2)
    783		proto = NFC_PROTO_NFC_DEP;
    784	else
    785		proto = NFC_PROTO_FELICA;
    786
    787	rc = digital_target_found(ddev, &target, proto);
    788
    789exit:
    790	dev_kfree_skb(resp);
    791
    792	if (rc)
    793		digital_poll_next_tech(ddev);
    794}
    795
    796int digital_in_send_sensf_req(struct nfc_digital_dev *ddev, u8 rf_tech)
    797{
    798	struct digital_sensf_req *sensf_req;
    799	struct sk_buff *skb;
    800	int rc;
    801	u8 size;
    802
    803	rc = digital_in_configure_hw(ddev, NFC_DIGITAL_CONFIG_RF_TECH, rf_tech);
    804	if (rc)
    805		return rc;
    806
    807	rc = digital_in_configure_hw(ddev, NFC_DIGITAL_CONFIG_FRAMING,
    808				     NFC_DIGITAL_FRAMING_NFCF);
    809	if (rc)
    810		return rc;
    811
    812	size = sizeof(struct digital_sensf_req);
    813
    814	skb = digital_skb_alloc(ddev, size);
    815	if (!skb)
    816		return -ENOMEM;
    817
    818	skb_put(skb, size);
    819
    820	sensf_req = (struct digital_sensf_req *)skb->data;
    821	sensf_req->cmd = DIGITAL_CMD_SENSF_REQ;
    822	sensf_req->sc1 = 0xFF;
    823	sensf_req->sc2 = 0xFF;
    824	sensf_req->rc = 0;
    825	sensf_req->tsn = 0;
    826
    827	*(u8 *)skb_push(skb, 1) = size + 1;
    828
    829	if (!DIGITAL_DRV_CAPS_IN_CRC(ddev))
    830		digital_skb_add_crc_f(skb);
    831
    832	rc = digital_in_send_cmd(ddev, skb, 30, digital_in_recv_sensf_res,
    833				 NULL);
    834	if (rc)
    835		kfree_skb(skb);
    836
    837	return rc;
    838}
    839
    840static void digital_in_recv_iso15693_inv_res(struct nfc_digital_dev *ddev,
    841		void *arg, struct sk_buff *resp)
    842{
    843	struct digital_iso15693_inv_res *res;
    844	struct nfc_target *target = NULL;
    845	int rc;
    846
    847	if (IS_ERR(resp)) {
    848		rc = PTR_ERR(resp);
    849		resp = NULL;
    850		goto out_free_skb;
    851	}
    852
    853	if (resp->len != sizeof(*res)) {
    854		rc = -EIO;
    855		goto out_free_skb;
    856	}
    857
    858	res = (struct digital_iso15693_inv_res *)resp->data;
    859
    860	if (!DIGITAL_ISO15693_RES_IS_VALID(res->flags)) {
    861		PROTOCOL_ERR("ISO15693 - 10.3.1");
    862		rc = -EINVAL;
    863		goto out_free_skb;
    864	}
    865
    866	target = kzalloc(sizeof(*target), GFP_KERNEL);
    867	if (!target) {
    868		rc = -ENOMEM;
    869		goto out_free_skb;
    870	}
    871
    872	target->is_iso15693 = 1;
    873	target->iso15693_dsfid = res->dsfid;
    874	memcpy(target->iso15693_uid, &res->uid, sizeof(target->iso15693_uid));
    875
    876	rc = digital_target_found(ddev, target, NFC_PROTO_ISO15693);
    877
    878	kfree(target);
    879
    880out_free_skb:
    881	dev_kfree_skb(resp);
    882
    883	if (rc)
    884		digital_poll_next_tech(ddev);
    885}
    886
    887int digital_in_send_iso15693_inv_req(struct nfc_digital_dev *ddev, u8 rf_tech)
    888{
    889	struct digital_iso15693_inv_req *req;
    890	struct sk_buff *skb;
    891	int rc;
    892
    893	rc = digital_in_configure_hw(ddev, NFC_DIGITAL_CONFIG_RF_TECH,
    894				     NFC_DIGITAL_RF_TECH_ISO15693);
    895	if (rc)
    896		return rc;
    897
    898	rc = digital_in_configure_hw(ddev, NFC_DIGITAL_CONFIG_FRAMING,
    899				     NFC_DIGITAL_FRAMING_ISO15693_INVENTORY);
    900	if (rc)
    901		return rc;
    902
    903	skb = digital_skb_alloc(ddev, sizeof(*req));
    904	if (!skb)
    905		return -ENOMEM;
    906
    907	skb_put(skb, sizeof(*req) - sizeof(req->mask)); /* No mask */
    908	req = (struct digital_iso15693_inv_req *)skb->data;
    909
    910	/* Single sub-carrier, high data rate, no AFI, single slot
    911	 * Inventory command
    912	 */
    913	req->flags = DIGITAL_ISO15693_REQ_FLAG_DATA_RATE |
    914		     DIGITAL_ISO15693_REQ_FLAG_INVENTORY |
    915		     DIGITAL_ISO15693_REQ_FLAG_NB_SLOTS;
    916	req->cmd = DIGITAL_CMD_ISO15693_INVENTORY_REQ;
    917	req->mask_len = 0;
    918
    919	rc = digital_in_send_cmd(ddev, skb, 30,
    920				 digital_in_recv_iso15693_inv_res, NULL);
    921	if (rc)
    922		kfree_skb(skb);
    923
    924	return rc;
    925}
    926
    927static int digital_tg_send_sel_res(struct nfc_digital_dev *ddev)
    928{
    929	struct sk_buff *skb;
    930	int rc;
    931
    932	skb = digital_skb_alloc(ddev, 1);
    933	if (!skb)
    934		return -ENOMEM;
    935
    936	skb_put_u8(skb, DIGITAL_SEL_RES_NFC_DEP);
    937
    938	if (!DIGITAL_DRV_CAPS_TG_CRC(ddev))
    939		digital_skb_add_crc_a(skb);
    940
    941	rc = digital_tg_configure_hw(ddev, NFC_DIGITAL_CONFIG_FRAMING,
    942				     NFC_DIGITAL_FRAMING_NFCA_ANTICOL_COMPLETE);
    943	if (rc) {
    944		kfree_skb(skb);
    945		return rc;
    946	}
    947
    948	rc = digital_tg_send_cmd(ddev, skb, 300, digital_tg_recv_atr_req,
    949				 NULL);
    950	if (rc)
    951		kfree_skb(skb);
    952
    953	return rc;
    954}
    955
    956static void digital_tg_recv_sel_req(struct nfc_digital_dev *ddev, void *arg,
    957				    struct sk_buff *resp)
    958{
    959	int rc;
    960
    961	if (IS_ERR(resp)) {
    962		rc = PTR_ERR(resp);
    963		resp = NULL;
    964		goto exit;
    965	}
    966
    967	if (!DIGITAL_DRV_CAPS_TG_CRC(ddev)) {
    968		rc = digital_skb_check_crc_a(resp);
    969		if (rc) {
    970			PROTOCOL_ERR("4.4.1.3");
    971			goto exit;
    972		}
    973	}
    974
    975	/* Silently ignore SEL_REQ content and send a SEL_RES for NFC-DEP */
    976
    977	rc = digital_tg_send_sel_res(ddev);
    978
    979exit:
    980	if (rc)
    981		digital_poll_next_tech(ddev);
    982
    983	dev_kfree_skb(resp);
    984}
    985
    986static int digital_tg_send_sdd_res(struct nfc_digital_dev *ddev)
    987{
    988	struct sk_buff *skb;
    989	struct digital_sdd_res *sdd_res;
    990	int rc, i;
    991
    992	skb = digital_skb_alloc(ddev, sizeof(struct digital_sdd_res));
    993	if (!skb)
    994		return -ENOMEM;
    995
    996	skb_put(skb, sizeof(struct digital_sdd_res));
    997	sdd_res = (struct digital_sdd_res *)skb->data;
    998
    999	sdd_res->nfcid1[0] = 0x08;
   1000	get_random_bytes(sdd_res->nfcid1 + 1, 3);
   1001
   1002	sdd_res->bcc = 0;
   1003	for (i = 0; i < 4; i++)
   1004		sdd_res->bcc ^= sdd_res->nfcid1[i];
   1005
   1006	rc = digital_tg_configure_hw(ddev, NFC_DIGITAL_CONFIG_FRAMING,
   1007				NFC_DIGITAL_FRAMING_NFCA_STANDARD_WITH_CRC_A);
   1008	if (rc) {
   1009		kfree_skb(skb);
   1010		return rc;
   1011	}
   1012
   1013	rc = digital_tg_send_cmd(ddev, skb, 300, digital_tg_recv_sel_req,
   1014				 NULL);
   1015	if (rc)
   1016		kfree_skb(skb);
   1017
   1018	return rc;
   1019}
   1020
   1021static void digital_tg_recv_sdd_req(struct nfc_digital_dev *ddev, void *arg,
   1022				    struct sk_buff *resp)
   1023{
   1024	u8 *sdd_req;
   1025	int rc;
   1026
   1027	if (IS_ERR(resp)) {
   1028		rc = PTR_ERR(resp);
   1029		resp = NULL;
   1030		goto exit;
   1031	}
   1032
   1033	sdd_req = resp->data;
   1034
   1035	if (resp->len < 2 || sdd_req[0] != DIGITAL_CMD_SEL_REQ_CL1 ||
   1036	    sdd_req[1] != DIGITAL_SDD_REQ_SEL_PAR) {
   1037		rc = -EINVAL;
   1038		goto exit;
   1039	}
   1040
   1041	rc = digital_tg_send_sdd_res(ddev);
   1042
   1043exit:
   1044	if (rc)
   1045		digital_poll_next_tech(ddev);
   1046
   1047	dev_kfree_skb(resp);
   1048}
   1049
   1050static int digital_tg_send_sens_res(struct nfc_digital_dev *ddev)
   1051{
   1052	struct sk_buff *skb;
   1053	u8 *sens_res;
   1054	int rc;
   1055
   1056	skb = digital_skb_alloc(ddev, 2);
   1057	if (!skb)
   1058		return -ENOMEM;
   1059
   1060	sens_res = skb_put(skb, 2);
   1061
   1062	sens_res[0] = (DIGITAL_SENS_RES_NFC_DEP >> 8) & 0xFF;
   1063	sens_res[1] = DIGITAL_SENS_RES_NFC_DEP & 0xFF;
   1064
   1065	rc = digital_tg_configure_hw(ddev, NFC_DIGITAL_CONFIG_FRAMING,
   1066				     NFC_DIGITAL_FRAMING_NFCA_STANDARD);
   1067	if (rc) {
   1068		kfree_skb(skb);
   1069		return rc;
   1070	}
   1071
   1072	rc = digital_tg_send_cmd(ddev, skb, 300, digital_tg_recv_sdd_req,
   1073				 NULL);
   1074	if (rc)
   1075		kfree_skb(skb);
   1076
   1077	return rc;
   1078}
   1079
   1080void digital_tg_recv_sens_req(struct nfc_digital_dev *ddev, void *arg,
   1081			      struct sk_buff *resp)
   1082{
   1083	u8 sens_req;
   1084	int rc;
   1085
   1086	if (IS_ERR(resp)) {
   1087		rc = PTR_ERR(resp);
   1088		resp = NULL;
   1089		goto exit;
   1090	}
   1091
   1092	sens_req = resp->data[0];
   1093
   1094	if (!resp->len || (sens_req != DIGITAL_CMD_SENS_REQ &&
   1095	    sens_req != DIGITAL_CMD_ALL_REQ)) {
   1096		rc = -EINVAL;
   1097		goto exit;
   1098	}
   1099
   1100	rc = digital_tg_send_sens_res(ddev);
   1101
   1102exit:
   1103	if (rc)
   1104		digital_poll_next_tech(ddev);
   1105
   1106	dev_kfree_skb(resp);
   1107}
   1108
   1109static void digital_tg_recv_atr_or_sensf_req(struct nfc_digital_dev *ddev,
   1110		void *arg, struct sk_buff *resp)
   1111{
   1112	if (!IS_ERR(resp) && (resp->len >= 2) &&
   1113			(resp->data[1] == DIGITAL_CMD_SENSF_REQ))
   1114		digital_tg_recv_sensf_req(ddev, arg, resp);
   1115	else
   1116		digital_tg_recv_atr_req(ddev, arg, resp);
   1117
   1118	return;
   1119}
   1120
   1121static int digital_tg_send_sensf_res(struct nfc_digital_dev *ddev,
   1122			      struct digital_sensf_req *sensf_req)
   1123{
   1124	struct sk_buff *skb;
   1125	u8 size;
   1126	int rc;
   1127	struct digital_sensf_res *sensf_res;
   1128
   1129	size = sizeof(struct digital_sensf_res);
   1130
   1131	if (sensf_req->rc == DIGITAL_SENSF_REQ_RC_NONE)
   1132		size -= sizeof(sensf_res->rd);
   1133
   1134	skb = digital_skb_alloc(ddev, size);
   1135	if (!skb)
   1136		return -ENOMEM;
   1137
   1138	skb_put(skb, size);
   1139
   1140	sensf_res = (struct digital_sensf_res *)skb->data;
   1141
   1142	memset(sensf_res, 0, size);
   1143
   1144	sensf_res->cmd = DIGITAL_CMD_SENSF_RES;
   1145	sensf_res->nfcid2[0] = DIGITAL_SENSF_NFCID2_NFC_DEP_B1;
   1146	sensf_res->nfcid2[1] = DIGITAL_SENSF_NFCID2_NFC_DEP_B2;
   1147	get_random_bytes(&sensf_res->nfcid2[2], 6);
   1148
   1149	switch (sensf_req->rc) {
   1150	case DIGITAL_SENSF_REQ_RC_SC:
   1151		sensf_res->rd[0] = sensf_req->sc1;
   1152		sensf_res->rd[1] = sensf_req->sc2;
   1153		break;
   1154	case DIGITAL_SENSF_REQ_RC_AP:
   1155		sensf_res->rd[0] = DIGITAL_SENSF_RES_RD_AP_B1;
   1156		sensf_res->rd[1] = DIGITAL_SENSF_RES_RD_AP_B2;
   1157		break;
   1158	}
   1159
   1160	*(u8 *)skb_push(skb, sizeof(u8)) = size + 1;
   1161
   1162	if (!DIGITAL_DRV_CAPS_TG_CRC(ddev))
   1163		digital_skb_add_crc_f(skb);
   1164
   1165	rc = digital_tg_send_cmd(ddev, skb, 300,
   1166				 digital_tg_recv_atr_or_sensf_req, NULL);
   1167	if (rc)
   1168		kfree_skb(skb);
   1169
   1170	return rc;
   1171}
   1172
   1173void digital_tg_recv_sensf_req(struct nfc_digital_dev *ddev, void *arg,
   1174			       struct sk_buff *resp)
   1175{
   1176	struct digital_sensf_req *sensf_req;
   1177	int rc;
   1178
   1179	if (IS_ERR(resp)) {
   1180		rc = PTR_ERR(resp);
   1181		resp = NULL;
   1182		goto exit;
   1183	}
   1184
   1185	if (!DIGITAL_DRV_CAPS_TG_CRC(ddev)) {
   1186		rc = digital_skb_check_crc_f(resp);
   1187		if (rc) {
   1188			PROTOCOL_ERR("6.4.1.8");
   1189			goto exit;
   1190		}
   1191	}
   1192
   1193	if (resp->len != sizeof(struct digital_sensf_req) + 1) {
   1194		rc = -EINVAL;
   1195		goto exit;
   1196	}
   1197
   1198	skb_pull(resp, 1);
   1199	sensf_req = (struct digital_sensf_req *)resp->data;
   1200
   1201	if (sensf_req->cmd != DIGITAL_CMD_SENSF_REQ) {
   1202		rc = -EINVAL;
   1203		goto exit;
   1204	}
   1205
   1206	rc = digital_tg_send_sensf_res(ddev, sensf_req);
   1207
   1208exit:
   1209	if (rc)
   1210		digital_poll_next_tech(ddev);
   1211
   1212	dev_kfree_skb(resp);
   1213}
   1214
   1215static int digital_tg_config_nfca(struct nfc_digital_dev *ddev)
   1216{
   1217	int rc;
   1218
   1219	rc = digital_tg_configure_hw(ddev, NFC_DIGITAL_CONFIG_RF_TECH,
   1220				     NFC_DIGITAL_RF_TECH_106A);
   1221	if (rc)
   1222		return rc;
   1223
   1224	return digital_tg_configure_hw(ddev, NFC_DIGITAL_CONFIG_FRAMING,
   1225				       NFC_DIGITAL_FRAMING_NFCA_NFC_DEP);
   1226}
   1227
   1228int digital_tg_listen_nfca(struct nfc_digital_dev *ddev, u8 rf_tech)
   1229{
   1230	int rc;
   1231
   1232	rc = digital_tg_config_nfca(ddev);
   1233	if (rc)
   1234		return rc;
   1235
   1236	return digital_tg_listen(ddev, 300, digital_tg_recv_sens_req, NULL);
   1237}
   1238
   1239static int digital_tg_config_nfcf(struct nfc_digital_dev *ddev, u8 rf_tech)
   1240{
   1241	int rc;
   1242
   1243	rc = digital_tg_configure_hw(ddev, NFC_DIGITAL_CONFIG_RF_TECH, rf_tech);
   1244	if (rc)
   1245		return rc;
   1246
   1247	return digital_tg_configure_hw(ddev, NFC_DIGITAL_CONFIG_FRAMING,
   1248				       NFC_DIGITAL_FRAMING_NFCF_NFC_DEP);
   1249}
   1250
   1251int digital_tg_listen_nfcf(struct nfc_digital_dev *ddev, u8 rf_tech)
   1252{
   1253	int rc;
   1254
   1255	rc = digital_tg_config_nfcf(ddev, rf_tech);
   1256	if (rc)
   1257		return rc;
   1258
   1259	return digital_tg_listen(ddev, 300, digital_tg_recv_sensf_req, NULL);
   1260}
   1261
   1262void digital_tg_recv_md_req(struct nfc_digital_dev *ddev, void *arg,
   1263			    struct sk_buff *resp)
   1264{
   1265	u8 rf_tech;
   1266	int rc;
   1267
   1268	if (IS_ERR(resp)) {
   1269		resp = NULL;
   1270		goto exit_free_skb;
   1271	}
   1272
   1273	rc = ddev->ops->tg_get_rf_tech(ddev, &rf_tech);
   1274	if (rc)
   1275		goto exit_free_skb;
   1276
   1277	switch (rf_tech) {
   1278	case NFC_DIGITAL_RF_TECH_106A:
   1279		rc = digital_tg_config_nfca(ddev);
   1280		if (rc)
   1281			goto exit_free_skb;
   1282		digital_tg_recv_sens_req(ddev, arg, resp);
   1283		break;
   1284	case NFC_DIGITAL_RF_TECH_212F:
   1285	case NFC_DIGITAL_RF_TECH_424F:
   1286		rc = digital_tg_config_nfcf(ddev, rf_tech);
   1287		if (rc)
   1288			goto exit_free_skb;
   1289		digital_tg_recv_sensf_req(ddev, arg, resp);
   1290		break;
   1291	default:
   1292		goto exit_free_skb;
   1293	}
   1294
   1295	return;
   1296
   1297exit_free_skb:
   1298	digital_poll_next_tech(ddev);
   1299	dev_kfree_skb(resp);
   1300}