Linux Audio

Check our new training course

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