Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/net/nfc/digital_core.c
26288 views
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
27
struct 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
42
struct 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
55
void 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
72
int 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
100
static inline void digital_switch_rf(struct nfc_digital_dev *ddev, bool on)
101
{
102
ddev->ops->switch_rf(ddev, on);
103
}
104
105
static inline void digital_abort_cmd(struct nfc_digital_dev *ddev)
106
{
107
ddev->ops->abort_cmd(ddev);
108
}
109
110
static 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
142
static 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
152
static 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
227
int 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
255
int 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
266
int 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
277
static 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
303
static 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
309
int 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
405
void 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
427
static 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
450
static 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
*/
476
static 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
556
static 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
577
static 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
586
static 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
595
static 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
610
static 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
621
static 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
641
static 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
656
static 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
663
static 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
690
done:
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
701
static 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
733
exit:
734
if (rc)
735
kfree(data_exch);
736
737
return rc;
738
}
739
740
static 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
753
struct 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
811
free_dev:
812
kfree(ddev);
813
814
return NULL;
815
}
816
EXPORT_SYMBOL(nfc_digital_allocate_device);
817
818
void nfc_digital_free_device(struct nfc_digital_dev *ddev)
819
{
820
nfc_free_device(ddev->nfc_dev);
821
kfree(ddev);
822
}
823
EXPORT_SYMBOL(nfc_digital_free_device);
824
825
int nfc_digital_register_device(struct nfc_digital_dev *ddev)
826
{
827
return nfc_register_device(ddev->nfc_dev);
828
}
829
EXPORT_SYMBOL(nfc_digital_register_device);
830
831
void 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
}
859
EXPORT_SYMBOL(nfc_digital_unregister_device);
860
861
MODULE_DESCRIPTION("NFC Digital protocol stack");
862
MODULE_LICENSE("GPL");
863
864