1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 * Copyright (C) 2014  STMicroelectronics SAS. All rights reserved.
4 */
5
6#include <net/nfc/hci.h>
7
8#include "st21nfca.h"
9
10#define ST21NFCA_NFCIP1_INITIATOR 0x00
11#define ST21NFCA_NFCIP1_REQ 0xd4
12#define ST21NFCA_NFCIP1_RES 0xd5
13#define ST21NFCA_NFCIP1_ATR_REQ 0x00
14#define ST21NFCA_NFCIP1_ATR_RES 0x01
15#define ST21NFCA_NFCIP1_PSL_REQ 0x04
16#define ST21NFCA_NFCIP1_PSL_RES 0x05
17#define ST21NFCA_NFCIP1_DEP_REQ 0x06
18#define ST21NFCA_NFCIP1_DEP_RES 0x07
19
20#define ST21NFCA_NFC_DEP_PFB_PNI(pfb)     ((pfb) & 0x03)
21#define ST21NFCA_NFC_DEP_PFB_TYPE(pfb) ((pfb) & 0xE0)
22#define ST21NFCA_NFC_DEP_PFB_IS_TIMEOUT(pfb) \
23				((pfb) & ST21NFCA_NFC_DEP_PFB_TIMEOUT_BIT)
24#define ST21NFCA_NFC_DEP_DID_BIT_SET(pfb) ((pfb) & 0x04)
25#define ST21NFCA_NFC_DEP_NAD_BIT_SET(pfb) ((pfb) & 0x08)
26#define ST21NFCA_NFC_DEP_PFB_TIMEOUT_BIT 0x10
27
28#define ST21NFCA_NFC_DEP_PFB_IS_TIMEOUT(pfb) \
29				((pfb) & ST21NFCA_NFC_DEP_PFB_TIMEOUT_BIT)
30
31#define ST21NFCA_NFC_DEP_PFB_I_PDU          0x00
32#define ST21NFCA_NFC_DEP_PFB_ACK_NACK_PDU   0x40
33#define ST21NFCA_NFC_DEP_PFB_SUPERVISOR_PDU 0x80
34
35#define ST21NFCA_ATR_REQ_MIN_SIZE 17
36#define ST21NFCA_ATR_REQ_MAX_SIZE 65
37#define ST21NFCA_LR_BITS_PAYLOAD_SIZE_254B 0x30
38#define ST21NFCA_GB_BIT  0x02
39
40#define ST21NFCA_EVT_SEND_DATA		0x10
41#define ST21NFCA_EVT_FIELD_ON           0x11
42#define ST21NFCA_EVT_CARD_DEACTIVATED   0x12
43#define ST21NFCA_EVT_CARD_ACTIVATED     0x13
44#define ST21NFCA_EVT_FIELD_OFF          0x14
45
46#define ST21NFCA_EVT_CARD_F_BITRATE 0x16
47#define ST21NFCA_EVT_READER_F_BITRATE 0x13
48#define	ST21NFCA_PSL_REQ_SEND_SPEED(brs) (brs & 0x38)
49#define ST21NFCA_PSL_REQ_RECV_SPEED(brs) (brs & 0x07)
50#define ST21NFCA_PP2LRI(pp) ((pp & 0x30) >> 4)
51#define ST21NFCA_CARD_BITRATE_212 0x01
52#define ST21NFCA_CARD_BITRATE_424 0x02
53
54#define ST21NFCA_DEFAULT_TIMEOUT 0x0a
55
56
57#define PROTOCOL_ERR(req) pr_err("%d: ST21NFCA Protocol error: %s\n", \
58				 __LINE__, req)
59
60struct st21nfca_atr_req {
61	u8 length;
62	u8 cmd0;
63	u8 cmd1;
64	u8 nfcid3[NFC_NFCID3_MAXSIZE];
65	u8 did;
66	u8 bsi;
67	u8 bri;
68	u8 ppi;
69	u8 gbi[];
70} __packed;
71
72struct st21nfca_atr_res {
73	u8 length;
74	u8 cmd0;
75	u8 cmd1;
76	u8 nfcid3[NFC_NFCID3_MAXSIZE];
77	u8 did;
78	u8 bsi;
79	u8 bri;
80	u8 to;
81	u8 ppi;
82	u8 gbi[];
83} __packed;
84
85struct st21nfca_psl_req {
86	u8 length;
87	u8 cmd0;
88	u8 cmd1;
89	u8 did;
90	u8 brs;
91	u8 fsl;
92} __packed;
93
94struct st21nfca_psl_res {
95	u8 length;
96	u8 cmd0;
97	u8 cmd1;
98	u8 did;
99} __packed;
100
101struct st21nfca_dep_req_res {
102	u8 length;
103	u8 cmd0;
104	u8 cmd1;
105	u8 pfb;
106	u8 did;
107	u8 nad;
108} __packed;
109
110static void st21nfca_tx_work(struct work_struct *work)
111{
112	struct st21nfca_hci_info *info = container_of(work,
113						struct st21nfca_hci_info,
114						dep_info.tx_work);
115
116	struct nfc_dev *dev;
117	struct sk_buff *skb;
118
119	if (info) {
120		dev = info->hdev->ndev;
121		skb = info->dep_info.tx_pending;
122
123		device_lock(&dev->dev);
124
125		nfc_hci_send_cmd_async(info->hdev, ST21NFCA_RF_READER_F_GATE,
126				ST21NFCA_WR_XCHG_DATA, skb->data, skb->len,
127				info->async_cb, info);
128		device_unlock(&dev->dev);
129		kfree_skb(skb);
130	}
131}
132
133static void st21nfca_im_send_pdu(struct st21nfca_hci_info *info,
134						struct sk_buff *skb)
135{
136	info->dep_info.tx_pending = skb;
137	schedule_work(&info->dep_info.tx_work);
138}
139
140static int st21nfca_tm_send_atr_res(struct nfc_hci_dev *hdev,
141				    struct st21nfca_atr_req *atr_req)
142{
143	struct st21nfca_atr_res *atr_res;
144	struct sk_buff *skb;
145	size_t gb_len;
146	int r;
147	struct st21nfca_hci_info *info = nfc_hci_get_clientdata(hdev);
148
149	gb_len = atr_req->length - sizeof(struct st21nfca_atr_req);
150	skb = alloc_skb(atr_req->length + 1, GFP_KERNEL);
151	if (!skb)
152		return -ENOMEM;
153
154	skb_put(skb, sizeof(struct st21nfca_atr_res));
155
156	atr_res = (struct st21nfca_atr_res *)skb->data;
157	memset(atr_res, 0, sizeof(struct st21nfca_atr_res));
158
159	atr_res->length = atr_req->length + 1;
160	atr_res->cmd0 = ST21NFCA_NFCIP1_RES;
161	atr_res->cmd1 = ST21NFCA_NFCIP1_ATR_RES;
162
163	memcpy(atr_res->nfcid3, atr_req->nfcid3, 6);
164	atr_res->bsi = 0x00;
165	atr_res->bri = 0x00;
166	atr_res->to = ST21NFCA_DEFAULT_TIMEOUT;
167	atr_res->ppi = ST21NFCA_LR_BITS_PAYLOAD_SIZE_254B;
168
169	if (gb_len) {
170		skb_put(skb, gb_len);
171
172		atr_res->ppi |= ST21NFCA_GB_BIT;
173		memcpy(atr_res->gbi, atr_req->gbi, gb_len);
174		r = nfc_set_remote_general_bytes(hdev->ndev, atr_res->gbi,
175						  gb_len);
176		if (r < 0) {
177			kfree_skb(skb);
178			return r;
179		}
180	}
181
182	info->dep_info.curr_nfc_dep_pni = 0;
183
184	r = nfc_hci_send_event(hdev, ST21NFCA_RF_CARD_F_GATE,
185				ST21NFCA_EVT_SEND_DATA, skb->data, skb->len);
186	kfree_skb(skb);
187	return r;
188}
189
190static int st21nfca_tm_recv_atr_req(struct nfc_hci_dev *hdev,
191				    struct sk_buff *skb)
192{
193	struct st21nfca_atr_req *atr_req;
194	size_t gb_len;
195	int r;
196
197	skb_trim(skb, skb->len - 1);
198
199	if (!skb->len) {
200		r = -EIO;
201		goto exit;
202	}
203
204	if (skb->len < ST21NFCA_ATR_REQ_MIN_SIZE) {
205		r = -EPROTO;
206		goto exit;
207	}
208
209	atr_req = (struct st21nfca_atr_req *)skb->data;
210
211	if (atr_req->length < sizeof(struct st21nfca_atr_req)) {
212		r = -EPROTO;
213		goto exit;
214	}
215
216	r = st21nfca_tm_send_atr_res(hdev, atr_req);
217	if (r)
218		goto exit;
219
220	gb_len = skb->len - sizeof(struct st21nfca_atr_req);
221
222	r = nfc_tm_activated(hdev->ndev, NFC_PROTO_NFC_DEP_MASK,
223			      NFC_COMM_PASSIVE, atr_req->gbi, gb_len);
224	if (r)
225		goto exit;
226
227	r = 0;
228
229exit:
230	return r;
231}
232
233static int st21nfca_tm_send_psl_res(struct nfc_hci_dev *hdev,
234				    struct st21nfca_psl_req *psl_req)
235{
236	struct st21nfca_psl_res *psl_res;
237	struct sk_buff *skb;
238	u8 bitrate[2] = {0, 0};
239	int r;
240
241	skb = alloc_skb(sizeof(struct st21nfca_psl_res), GFP_KERNEL);
242	if (!skb)
243		return -ENOMEM;
244	skb_put(skb, sizeof(struct st21nfca_psl_res));
245
246	psl_res = (struct st21nfca_psl_res *)skb->data;
247
248	psl_res->length = sizeof(struct st21nfca_psl_res);
249	psl_res->cmd0 = ST21NFCA_NFCIP1_RES;
250	psl_res->cmd1 = ST21NFCA_NFCIP1_PSL_RES;
251	psl_res->did = psl_req->did;
252
253	r = nfc_hci_send_event(hdev, ST21NFCA_RF_CARD_F_GATE,
254				ST21NFCA_EVT_SEND_DATA, skb->data, skb->len);
255	if (r < 0)
256		goto error;
257
258	/*
259	 * ST21NFCA only support P2P passive.
260	 * PSL_REQ BRS value != 0 has only a meaning to
261	 * change technology to type F.
262	 * We change to BITRATE 424Kbits.
263	 * In other case switch to BITRATE 106Kbits.
264	 */
265	if (ST21NFCA_PSL_REQ_SEND_SPEED(psl_req->brs) &&
266	    ST21NFCA_PSL_REQ_RECV_SPEED(psl_req->brs)) {
267		bitrate[0] = ST21NFCA_CARD_BITRATE_424;
268		bitrate[1] = ST21NFCA_CARD_BITRATE_424;
269	}
270
271	/* Send an event to change bitrate change event to card f */
272	r = nfc_hci_send_event(hdev, ST21NFCA_RF_CARD_F_GATE,
273			ST21NFCA_EVT_CARD_F_BITRATE, bitrate, 2);
274error:
275	kfree_skb(skb);
276	return r;
277}
278
279static int st21nfca_tm_recv_psl_req(struct nfc_hci_dev *hdev,
280				    struct sk_buff *skb)
281{
282	struct st21nfca_psl_req *psl_req;
283	int r;
284
285	skb_trim(skb, skb->len - 1);
286
287	if (!skb->len) {
288		r = -EIO;
289		goto exit;
290	}
291
292	psl_req = (struct st21nfca_psl_req *)skb->data;
293
294	if (skb->len < sizeof(struct st21nfca_psl_req)) {
295		r = -EIO;
296		goto exit;
297	}
298
299	r = st21nfca_tm_send_psl_res(hdev, psl_req);
300exit:
301	return r;
302}
303
304int st21nfca_tm_send_dep_res(struct nfc_hci_dev *hdev, struct sk_buff *skb)
305{
306	int r;
307	struct st21nfca_hci_info *info = nfc_hci_get_clientdata(hdev);
308
309	*(u8 *)skb_push(skb, 1) = info->dep_info.curr_nfc_dep_pni;
310	*(u8 *)skb_push(skb, 1) = ST21NFCA_NFCIP1_DEP_RES;
311	*(u8 *)skb_push(skb, 1) = ST21NFCA_NFCIP1_RES;
312	*(u8 *)skb_push(skb, 1) = skb->len;
313
314	r = nfc_hci_send_event(hdev, ST21NFCA_RF_CARD_F_GATE,
315			ST21NFCA_EVT_SEND_DATA, skb->data, skb->len);
316	kfree_skb(skb);
317
318	return r;
319}
320EXPORT_SYMBOL(st21nfca_tm_send_dep_res);
321
322static int st21nfca_tm_recv_dep_req(struct nfc_hci_dev *hdev,
323				    struct sk_buff *skb)
324{
325	struct st21nfca_dep_req_res *dep_req;
326	u8 size;
327	int r;
328	struct st21nfca_hci_info *info = nfc_hci_get_clientdata(hdev);
329
330	skb_trim(skb, skb->len - 1);
331
332	size = 4;
333
334	dep_req = (struct st21nfca_dep_req_res *)skb->data;
335	if (skb->len < size) {
336		r = -EIO;
337		goto exit;
338	}
339
340	if (ST21NFCA_NFC_DEP_DID_BIT_SET(dep_req->pfb))
341		size++;
342	if (ST21NFCA_NFC_DEP_NAD_BIT_SET(dep_req->pfb))
343		size++;
344
345	if (skb->len < size) {
346		r = -EIO;
347		goto exit;
348	}
349
350	/* Receiving DEP_REQ - Decoding */
351	switch (ST21NFCA_NFC_DEP_PFB_TYPE(dep_req->pfb)) {
352	case ST21NFCA_NFC_DEP_PFB_I_PDU:
353		info->dep_info.curr_nfc_dep_pni =
354				ST21NFCA_NFC_DEP_PFB_PNI(dep_req->pfb);
355		break;
356	case ST21NFCA_NFC_DEP_PFB_ACK_NACK_PDU:
357		pr_err("Received a ACK/NACK PDU\n");
358		break;
359	case ST21NFCA_NFC_DEP_PFB_SUPERVISOR_PDU:
360		pr_err("Received a SUPERVISOR PDU\n");
361		break;
362	}
363
364	skb_pull(skb, size);
365
366	return nfc_tm_data_received(hdev->ndev, skb);
367exit:
368	return r;
369}
370
371static int st21nfca_tm_event_send_data(struct nfc_hci_dev *hdev,
372				struct sk_buff *skb)
373{
374	u8 cmd0, cmd1;
375	int r;
376
377	cmd0 = skb->data[1];
378	switch (cmd0) {
379	case ST21NFCA_NFCIP1_REQ:
380		cmd1 = skb->data[2];
381		switch (cmd1) {
382		case ST21NFCA_NFCIP1_ATR_REQ:
383			r = st21nfca_tm_recv_atr_req(hdev, skb);
384			break;
385		case ST21NFCA_NFCIP1_PSL_REQ:
386			r = st21nfca_tm_recv_psl_req(hdev, skb);
387			break;
388		case ST21NFCA_NFCIP1_DEP_REQ:
389			r = st21nfca_tm_recv_dep_req(hdev, skb);
390			break;
391		default:
392			return 1;
393		}
394		break;
395	default:
396		return 1;
397	}
398	return r;
399}
400
401/*
402 * Returns:
403 * <= 0: driver handled the event, skb consumed
404 *    1: driver does not handle the event, please do standard processing
405 */
406int st21nfca_dep_event_received(struct nfc_hci_dev *hdev,
407				u8 event, struct sk_buff *skb)
408{
409	int r = 0;
410	struct st21nfca_hci_info *info = nfc_hci_get_clientdata(hdev);
411
412	pr_debug("dep event: %d\n", event);
413
414	switch (event) {
415	case ST21NFCA_EVT_CARD_ACTIVATED:
416		info->dep_info.curr_nfc_dep_pni = 0;
417		break;
418	case ST21NFCA_EVT_CARD_DEACTIVATED:
419		break;
420	case ST21NFCA_EVT_FIELD_ON:
421		break;
422	case ST21NFCA_EVT_FIELD_OFF:
423		break;
424	case ST21NFCA_EVT_SEND_DATA:
425		r = st21nfca_tm_event_send_data(hdev, skb);
426		if (r < 0)
427			return r;
428		return 0;
429	default:
430		nfc_err(&hdev->ndev->dev, "Unexpected event on card f gate\n");
431		return 1;
432	}
433	kfree_skb(skb);
434	return r;
435}
436EXPORT_SYMBOL(st21nfca_dep_event_received);
437
438static void st21nfca_im_send_psl_req(struct nfc_hci_dev *hdev, u8 did, u8 bsi,
439				     u8 bri, u8 lri)
440{
441	struct sk_buff *skb;
442	struct st21nfca_psl_req *psl_req;
443	struct st21nfca_hci_info *info = nfc_hci_get_clientdata(hdev);
444
445	skb =
446	    alloc_skb(sizeof(struct st21nfca_psl_req) + 1, GFP_KERNEL);
447	if (!skb)
448		return;
449	skb_reserve(skb, 1);
450
451	skb_put(skb, sizeof(struct st21nfca_psl_req));
452	psl_req = (struct st21nfca_psl_req *) skb->data;
453
454	psl_req->length = sizeof(struct st21nfca_psl_req);
455	psl_req->cmd0 = ST21NFCA_NFCIP1_REQ;
456	psl_req->cmd1 = ST21NFCA_NFCIP1_PSL_REQ;
457	psl_req->did = did;
458	psl_req->brs = (0x30 & bsi << 4) | (bri & 0x03);
459	psl_req->fsl = lri;
460
461	*(u8 *)skb_push(skb, 1) = info->dep_info.to | 0x10;
462
463	st21nfca_im_send_pdu(info, skb);
464}
465
466#define ST21NFCA_CB_TYPE_READER_F 1
467static void st21nfca_im_recv_atr_res_cb(void *context, struct sk_buff *skb,
468					int err)
469{
470	struct st21nfca_hci_info *info = context;
471	struct st21nfca_atr_res *atr_res;
472	int r;
473
474	if (err != 0)
475		return;
476
477	if (!skb)
478		return;
479
480	switch (info->async_cb_type) {
481	case ST21NFCA_CB_TYPE_READER_F:
482		skb_trim(skb, skb->len - 1);
483		atr_res = (struct st21nfca_atr_res *)skb->data;
484		r = nfc_set_remote_general_bytes(info->hdev->ndev,
485				atr_res->gbi,
486				skb->len - sizeof(struct st21nfca_atr_res));
487		if (r < 0)
488			return;
489
490		if (atr_res->to >= 0x0e)
491			info->dep_info.to = 0x0e;
492		else
493			info->dep_info.to = atr_res->to + 1;
494
495		info->dep_info.to |= 0x10;
496
497		r = nfc_dep_link_is_up(info->hdev->ndev, info->dep_info.idx,
498					NFC_COMM_PASSIVE, NFC_RF_INITIATOR);
499		if (r < 0)
500			return;
501
502		info->dep_info.curr_nfc_dep_pni = 0;
503		if (ST21NFCA_PP2LRI(atr_res->ppi) != info->dep_info.lri)
504			st21nfca_im_send_psl_req(info->hdev, atr_res->did,
505						atr_res->bsi, atr_res->bri,
506						ST21NFCA_PP2LRI(atr_res->ppi));
507		break;
508	default:
509		kfree_skb(skb);
510		break;
511	}
512}
513
514int st21nfca_im_send_atr_req(struct nfc_hci_dev *hdev, u8 *gb, size_t gb_len)
515{
516	struct sk_buff *skb;
517	struct st21nfca_hci_info *info = nfc_hci_get_clientdata(hdev);
518	struct st21nfca_atr_req *atr_req;
519	struct nfc_target *target;
520	uint size;
521
522	info->dep_info.to = ST21NFCA_DEFAULT_TIMEOUT;
523	size = ST21NFCA_ATR_REQ_MIN_SIZE + gb_len;
524	if (size > ST21NFCA_ATR_REQ_MAX_SIZE) {
525		PROTOCOL_ERR("14.6.1.1");
526		return -EINVAL;
527	}
528
529	skb =
530	    alloc_skb(sizeof(struct st21nfca_atr_req) + gb_len + 1, GFP_KERNEL);
531	if (!skb)
532		return -ENOMEM;
533
534	skb_reserve(skb, 1);
535
536	skb_put(skb, sizeof(struct st21nfca_atr_req));
537
538	atr_req = (struct st21nfca_atr_req *)skb->data;
539	memset(atr_req, 0, sizeof(struct st21nfca_atr_req));
540
541	atr_req->cmd0 = ST21NFCA_NFCIP1_REQ;
542	atr_req->cmd1 = ST21NFCA_NFCIP1_ATR_REQ;
543	memset(atr_req->nfcid3, 0, NFC_NFCID3_MAXSIZE);
544	target = hdev->ndev->targets;
545
546	if (target->sensf_res_len > 0)
547		memcpy(atr_req->nfcid3, target->sensf_res,
548				target->sensf_res_len);
549	else
550		get_random_bytes(atr_req->nfcid3, NFC_NFCID3_MAXSIZE);
551
552	atr_req->did = 0x0;
553
554	atr_req->bsi = 0x00;
555	atr_req->bri = 0x00;
556	atr_req->ppi = ST21NFCA_LR_BITS_PAYLOAD_SIZE_254B;
557	if (gb_len) {
558		atr_req->ppi |= ST21NFCA_GB_BIT;
559		skb_put_data(skb, gb, gb_len);
560	}
561	atr_req->length = sizeof(struct st21nfca_atr_req) + hdev->gb_len;
562
563	*(u8 *)skb_push(skb, 1) = info->dep_info.to | 0x10; /* timeout */
564
565	info->async_cb_type = ST21NFCA_CB_TYPE_READER_F;
566	info->async_cb_context = info;
567	info->async_cb = st21nfca_im_recv_atr_res_cb;
568	info->dep_info.bri = atr_req->bri;
569	info->dep_info.bsi = atr_req->bsi;
570	info->dep_info.lri = ST21NFCA_PP2LRI(atr_req->ppi);
571
572	return nfc_hci_send_cmd_async(hdev, ST21NFCA_RF_READER_F_GATE,
573				ST21NFCA_WR_XCHG_DATA, skb->data,
574				skb->len, info->async_cb, info);
575}
576EXPORT_SYMBOL(st21nfca_im_send_atr_req);
577
578static void st21nfca_im_recv_dep_res_cb(void *context, struct sk_buff *skb,
579					int err)
580{
581	struct st21nfca_hci_info *info = context;
582	struct st21nfca_dep_req_res *dep_res;
583
584	int size;
585
586	if (err != 0)
587		return;
588
589	if (!skb)
590		return;
591
592	switch (info->async_cb_type) {
593	case ST21NFCA_CB_TYPE_READER_F:
594		dep_res = (struct st21nfca_dep_req_res *)skb->data;
595
596		size = 3;
597		if (skb->len < size)
598			goto exit;
599
600		if (ST21NFCA_NFC_DEP_DID_BIT_SET(dep_res->pfb))
601			size++;
602		if (ST21NFCA_NFC_DEP_NAD_BIT_SET(dep_res->pfb))
603			size++;
604
605		if (skb->len < size)
606			goto exit;
607
608		skb_trim(skb, skb->len - 1);
609
610		/* Receiving DEP_REQ - Decoding */
611		switch (ST21NFCA_NFC_DEP_PFB_TYPE(dep_res->pfb)) {
612		case ST21NFCA_NFC_DEP_PFB_ACK_NACK_PDU:
613			pr_err("Received a ACK/NACK PDU\n");
614			fallthrough;
615		case ST21NFCA_NFC_DEP_PFB_I_PDU:
616			info->dep_info.curr_nfc_dep_pni =
617			    ST21NFCA_NFC_DEP_PFB_PNI(dep_res->pfb + 1);
618			size++;
619			skb_pull(skb, size);
620			nfc_tm_data_received(info->hdev->ndev, skb);
621			break;
622		case ST21NFCA_NFC_DEP_PFB_SUPERVISOR_PDU:
623			pr_err("Received a SUPERVISOR PDU\n");
624			skb_pull(skb, size);
625			*(u8 *)skb_push(skb, 1) = ST21NFCA_NFCIP1_DEP_REQ;
626			*(u8 *)skb_push(skb, 1) = ST21NFCA_NFCIP1_REQ;
627			*(u8 *)skb_push(skb, 1) = skb->len;
628			*(u8 *)skb_push(skb, 1) = info->dep_info.to | 0x10;
629
630			st21nfca_im_send_pdu(info, skb);
631			break;
632		}
633
634		return;
635	default:
636		break;
637	}
638
639exit:
640	kfree_skb(skb);
641}
642
643int st21nfca_im_send_dep_req(struct nfc_hci_dev *hdev, struct sk_buff *skb)
644{
645	struct st21nfca_hci_info *info = nfc_hci_get_clientdata(hdev);
646
647	info->async_cb_type = ST21NFCA_CB_TYPE_READER_F;
648	info->async_cb_context = info;
649	info->async_cb = st21nfca_im_recv_dep_res_cb;
650
651	*(u8 *)skb_push(skb, 1) = info->dep_info.curr_nfc_dep_pni;
652	*(u8 *)skb_push(skb, 1) = ST21NFCA_NFCIP1_DEP_REQ;
653	*(u8 *)skb_push(skb, 1) = ST21NFCA_NFCIP1_REQ;
654	*(u8 *)skb_push(skb, 1) = skb->len;
655
656	*(u8 *)skb_push(skb, 1) = info->dep_info.to | 0x10;
657
658	return nfc_hci_send_cmd_async(hdev, ST21NFCA_RF_READER_F_GATE,
659				      ST21NFCA_WR_XCHG_DATA,
660				      skb->data, skb->len,
661				      info->async_cb, info);
662}
663EXPORT_SYMBOL(st21nfca_im_send_dep_req);
664
665void st21nfca_dep_init(struct nfc_hci_dev *hdev)
666{
667	struct st21nfca_hci_info *info = nfc_hci_get_clientdata(hdev);
668
669	INIT_WORK(&info->dep_info.tx_work, st21nfca_tx_work);
670	info->dep_info.curr_nfc_dep_pni = 0;
671	info->dep_info.idx = 0;
672	info->dep_info.to = ST21NFCA_DEFAULT_TIMEOUT;
673}
674EXPORT_SYMBOL(st21nfca_dep_init);
675
676void st21nfca_dep_deinit(struct nfc_hci_dev *hdev)
677{
678	struct st21nfca_hci_info *info = nfc_hci_get_clientdata(hdev);
679
680	cancel_work_sync(&info->dep_info.tx_work);
681}
682EXPORT_SYMBOL(st21nfca_dep_deinit);
683