]> git.karo-electronics.de Git - karo-tx-linux.git/blob - net/nfc/digital_dep.c
ARM: dts: imx6qdl: add support for Ka-Ro TX6 modules
[karo-tx-linux.git] / net / nfc / digital_dep.c
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 "digital.h"
19
20 #define DIGITAL_NFC_DEP_FRAME_DIR_OUT 0xD4
21 #define DIGITAL_NFC_DEP_FRAME_DIR_IN  0xD5
22
23 #define DIGITAL_NFC_DEP_NFCA_SOD_SB   0xF0
24
25 #define DIGITAL_CMD_ATR_REQ 0x00
26 #define DIGITAL_CMD_ATR_RES 0x01
27 #define DIGITAL_CMD_PSL_REQ 0x04
28 #define DIGITAL_CMD_PSL_RES 0x05
29 #define DIGITAL_CMD_DEP_REQ 0x06
30 #define DIGITAL_CMD_DEP_RES 0x07
31
32 #define DIGITAL_ATR_REQ_MIN_SIZE 16
33 #define DIGITAL_ATR_REQ_MAX_SIZE 64
34
35 #define DIGITAL_NFCID3_LEN ((u8)8)
36 #define DIGITAL_LR_BITS_PAYLOAD_SIZE_254B 0x30
37 #define DIGITAL_GB_BIT  0x02
38
39 #define DIGITAL_NFC_DEP_PFB_TYPE(pfb) ((pfb) & 0xE0)
40
41 #define DIGITAL_NFC_DEP_PFB_TIMEOUT_BIT 0x10
42
43 #define DIGITAL_NFC_DEP_PFB_IS_TIMEOUT(pfb) \
44                                 ((pfb) & DIGITAL_NFC_DEP_PFB_TIMEOUT_BIT)
45 #define DIGITAL_NFC_DEP_MI_BIT_SET(pfb)  ((pfb) & 0x10)
46 #define DIGITAL_NFC_DEP_NAD_BIT_SET(pfb) ((pfb) & 0x08)
47 #define DIGITAL_NFC_DEP_DID_BIT_SET(pfb) ((pfb) & 0x04)
48 #define DIGITAL_NFC_DEP_PFB_PNI(pfb)     ((pfb) & 0x03)
49
50 #define DIGITAL_NFC_DEP_PFB_I_PDU          0x00
51 #define DIGITAL_NFC_DEP_PFB_ACK_NACK_PDU   0x40
52 #define DIGITAL_NFC_DEP_PFB_SUPERVISOR_PDU 0x80
53
54 struct digital_atr_req {
55         u8 dir;
56         u8 cmd;
57         u8 nfcid3[10];
58         u8 did;
59         u8 bs;
60         u8 br;
61         u8 pp;
62         u8 gb[0];
63 } __packed;
64
65 struct digital_atr_res {
66         u8 dir;
67         u8 cmd;
68         u8 nfcid3[10];
69         u8 did;
70         u8 bs;
71         u8 br;
72         u8 to;
73         u8 pp;
74         u8 gb[0];
75 } __packed;
76
77 struct digital_psl_req {
78         u8 dir;
79         u8 cmd;
80         u8 did;
81         u8 brs;
82         u8 fsl;
83 } __packed;
84
85 struct digital_psl_res {
86         u8 dir;
87         u8 cmd;
88         u8 did;
89 } __packed;
90
91 struct digital_dep_req_res {
92         u8 dir;
93         u8 cmd;
94         u8 pfb;
95 } __packed;
96
97 static void digital_in_recv_dep_res(struct nfc_digital_dev *ddev, void *arg,
98                                     struct sk_buff *resp);
99
100 static void digital_skb_push_dep_sod(struct nfc_digital_dev *ddev,
101                                      struct sk_buff *skb)
102 {
103         skb_push(skb, sizeof(u8));
104
105         skb->data[0] = skb->len;
106
107         if (ddev->curr_rf_tech == NFC_DIGITAL_RF_TECH_106A)
108                 *skb_push(skb, sizeof(u8)) = DIGITAL_NFC_DEP_NFCA_SOD_SB;
109 }
110
111 static int digital_skb_pull_dep_sod(struct nfc_digital_dev *ddev,
112                                     struct sk_buff *skb)
113 {
114         u8 size;
115
116         if (skb->len < 2)
117                 return -EIO;
118
119         if (ddev->curr_rf_tech == NFC_DIGITAL_RF_TECH_106A)
120                 skb_pull(skb, sizeof(u8));
121
122         size = skb->data[0];
123         if (size != skb->len)
124                 return -EIO;
125
126         skb_pull(skb, sizeof(u8));
127
128         return 0;
129 }
130
131 static void digital_in_recv_atr_res(struct nfc_digital_dev *ddev, void *arg,
132                                  struct sk_buff *resp)
133 {
134         struct nfc_target *target = arg;
135         struct digital_atr_res *atr_res;
136         u8 gb_len;
137         int rc;
138
139         if (IS_ERR(resp)) {
140                 rc = PTR_ERR(resp);
141                 resp = NULL;
142                 goto exit;
143         }
144
145         rc = ddev->skb_check_crc(resp);
146         if (rc) {
147                 PROTOCOL_ERR("14.4.1.6");
148                 goto exit;
149         }
150
151         rc = digital_skb_pull_dep_sod(ddev, resp);
152         if (rc) {
153                 PROTOCOL_ERR("14.4.1.2");
154                 goto exit;
155         }
156
157         if (resp->len < sizeof(struct digital_atr_res)) {
158                 rc = -EIO;
159                 goto exit;
160         }
161
162         gb_len = resp->len - sizeof(struct digital_atr_res);
163
164         atr_res = (struct digital_atr_res *)resp->data;
165
166         rc = nfc_set_remote_general_bytes(ddev->nfc_dev, atr_res->gb, gb_len);
167         if (rc)
168                 goto exit;
169
170         rc = nfc_dep_link_is_up(ddev->nfc_dev, target->idx, NFC_COMM_ACTIVE,
171                                 NFC_RF_INITIATOR);
172
173         ddev->curr_nfc_dep_pni = 0;
174
175 exit:
176         dev_kfree_skb(resp);
177
178         if (rc)
179                 ddev->curr_protocol = 0;
180 }
181
182 int digital_in_send_atr_req(struct nfc_digital_dev *ddev,
183                             struct nfc_target *target, __u8 comm_mode, __u8 *gb,
184                             size_t gb_len)
185 {
186         struct sk_buff *skb;
187         struct digital_atr_req *atr_req;
188         uint size;
189
190         size = DIGITAL_ATR_REQ_MIN_SIZE + gb_len;
191
192         if (size > DIGITAL_ATR_REQ_MAX_SIZE) {
193                 PROTOCOL_ERR("14.6.1.1");
194                 return -EINVAL;
195         }
196
197         skb = digital_skb_alloc(ddev, size);
198         if (!skb)
199                 return -ENOMEM;
200
201         skb_put(skb, sizeof(struct digital_atr_req));
202
203         atr_req = (struct digital_atr_req *)skb->data;
204         memset(atr_req, 0, sizeof(struct digital_atr_req));
205
206         atr_req->dir = DIGITAL_NFC_DEP_FRAME_DIR_OUT;
207         atr_req->cmd = DIGITAL_CMD_ATR_REQ;
208         if (target->nfcid2_len)
209                 memcpy(atr_req->nfcid3, target->nfcid2,
210                        max(target->nfcid2_len, DIGITAL_NFCID3_LEN));
211         else
212                 get_random_bytes(atr_req->nfcid3, DIGITAL_NFCID3_LEN);
213
214         atr_req->did = 0;
215         atr_req->bs = 0;
216         atr_req->br = 0;
217
218         atr_req->pp = DIGITAL_LR_BITS_PAYLOAD_SIZE_254B;
219
220         if (gb_len) {
221                 atr_req->pp |= DIGITAL_GB_BIT;
222                 memcpy(skb_put(skb, gb_len), gb, gb_len);
223         }
224
225         digital_skb_push_dep_sod(ddev, skb);
226
227         ddev->skb_add_crc(skb);
228
229         digital_in_send_cmd(ddev, skb, 500, digital_in_recv_atr_res, target);
230
231         return 0;
232 }
233
234 static int digital_in_send_rtox(struct nfc_digital_dev *ddev,
235                                 struct digital_data_exch *data_exch, u8 rtox)
236 {
237         struct digital_dep_req_res *dep_req;
238         struct sk_buff *skb;
239         int rc;
240
241         skb = digital_skb_alloc(ddev, 1);
242         if (!skb)
243                 return -ENOMEM;
244
245         *skb_put(skb, 1) = rtox;
246
247         skb_push(skb, sizeof(struct digital_dep_req_res));
248
249         dep_req = (struct digital_dep_req_res *)skb->data;
250
251         dep_req->dir = DIGITAL_NFC_DEP_FRAME_DIR_OUT;
252         dep_req->cmd = DIGITAL_CMD_DEP_REQ;
253         dep_req->pfb = DIGITAL_NFC_DEP_PFB_SUPERVISOR_PDU |
254                        DIGITAL_NFC_DEP_PFB_TIMEOUT_BIT;
255
256         digital_skb_push_dep_sod(ddev, skb);
257
258         ddev->skb_add_crc(skb);
259
260         rc = digital_in_send_cmd(ddev, skb, 1500, digital_in_recv_dep_res,
261                                  data_exch);
262
263         return rc;
264 }
265
266 static void digital_in_recv_dep_res(struct nfc_digital_dev *ddev, void *arg,
267                                     struct sk_buff *resp)
268 {
269         struct digital_data_exch *data_exch = arg;
270         struct digital_dep_req_res *dep_res;
271         u8 pfb;
272         uint size;
273         int rc;
274
275         if (IS_ERR(resp)) {
276                 rc = PTR_ERR(resp);
277                 resp = NULL;
278                 goto exit;
279         }
280
281         rc = ddev->skb_check_crc(resp);
282         if (rc) {
283                 PROTOCOL_ERR("14.4.1.6");
284                 goto error;
285         }
286
287         rc = digital_skb_pull_dep_sod(ddev, resp);
288         if (rc) {
289                 PROTOCOL_ERR("14.4.1.2");
290                 goto exit;
291         }
292
293         dep_res = (struct digital_dep_req_res *)resp->data;
294
295         if (resp->len < sizeof(struct digital_dep_req_res) ||
296             dep_res->dir != DIGITAL_NFC_DEP_FRAME_DIR_IN ||
297             dep_res->cmd != DIGITAL_CMD_DEP_RES) {
298                 rc = -EIO;
299                 goto error;
300         }
301
302         pfb = dep_res->pfb;
303
304         switch (DIGITAL_NFC_DEP_PFB_TYPE(pfb)) {
305         case DIGITAL_NFC_DEP_PFB_I_PDU:
306                 if (DIGITAL_NFC_DEP_PFB_PNI(pfb) != ddev->curr_nfc_dep_pni) {
307                         PROTOCOL_ERR("14.12.3.3");
308                         rc = -EIO;
309                         goto error;
310                 }
311
312                 ddev->curr_nfc_dep_pni =
313                         DIGITAL_NFC_DEP_PFB_PNI(ddev->curr_nfc_dep_pni + 1);
314                 rc = 0;
315                 break;
316
317         case DIGITAL_NFC_DEP_PFB_ACK_NACK_PDU:
318                 pr_err("Received a ACK/NACK PDU\n");
319                 rc = -EIO;
320                 goto error;
321
322         case DIGITAL_NFC_DEP_PFB_SUPERVISOR_PDU:
323                 if (!DIGITAL_NFC_DEP_PFB_IS_TIMEOUT(pfb)) {
324                         rc = -EINVAL;
325                         goto error;
326                 }
327
328                 rc = digital_in_send_rtox(ddev, data_exch, resp->data[3]);
329                 if (rc)
330                         goto error;
331
332                 kfree_skb(resp);
333                 return;
334         }
335
336         if (DIGITAL_NFC_DEP_MI_BIT_SET(pfb)) {
337                 pr_err("MI bit set. Chained PDU not supported\n");
338                 rc = -EIO;
339                 goto error;
340         }
341
342         size = sizeof(struct digital_dep_req_res);
343
344         if (DIGITAL_NFC_DEP_DID_BIT_SET(pfb))
345                 size++;
346
347         if (size > resp->len) {
348                 rc = -EIO;
349                 goto error;
350         }
351
352         skb_pull(resp, size);
353
354 exit:
355         data_exch->cb(data_exch->cb_context, resp, rc);
356
357 error:
358         kfree(data_exch);
359
360         if (rc)
361                 kfree_skb(resp);
362 }
363
364 int digital_in_send_dep_req(struct nfc_digital_dev *ddev,
365                             struct nfc_target *target, struct sk_buff *skb,
366                             struct digital_data_exch *data_exch)
367 {
368         struct digital_dep_req_res *dep_req;
369
370         skb_push(skb, sizeof(struct digital_dep_req_res));
371
372         dep_req = (struct digital_dep_req_res *)skb->data;
373         dep_req->dir = DIGITAL_NFC_DEP_FRAME_DIR_OUT;
374         dep_req->cmd = DIGITAL_CMD_DEP_REQ;
375         dep_req->pfb = ddev->curr_nfc_dep_pni;
376
377         digital_skb_push_dep_sod(ddev, skb);
378
379         ddev->skb_add_crc(skb);
380
381         return digital_in_send_cmd(ddev, skb, 1500, digital_in_recv_dep_res,
382                                    data_exch);
383 }
384
385 static void digital_tg_recv_dep_req(struct nfc_digital_dev *ddev, void *arg,
386                                     struct sk_buff *resp)
387 {
388         int rc;
389         struct digital_dep_req_res *dep_req;
390         size_t size;
391
392         if (IS_ERR(resp)) {
393                 rc = PTR_ERR(resp);
394                 resp = NULL;
395                 goto exit;
396         }
397
398         rc = ddev->skb_check_crc(resp);
399         if (rc) {
400                 PROTOCOL_ERR("14.4.1.6");
401                 goto exit;
402         }
403
404         rc = digital_skb_pull_dep_sod(ddev, resp);
405         if (rc) {
406                 PROTOCOL_ERR("14.4.1.2");
407                 goto exit;
408         }
409
410         size = sizeof(struct digital_dep_req_res);
411         dep_req = (struct digital_dep_req_res *)resp->data;
412
413         if (resp->len < size || dep_req->dir != DIGITAL_NFC_DEP_FRAME_DIR_OUT ||
414             dep_req->cmd != DIGITAL_CMD_DEP_REQ) {
415                 rc = -EIO;
416                 goto exit;
417         }
418
419         if (DIGITAL_NFC_DEP_DID_BIT_SET(dep_req->pfb))
420                 size++;
421
422         if (resp->len < size) {
423                 rc = -EIO;
424                 goto exit;
425         }
426
427         switch (DIGITAL_NFC_DEP_PFB_TYPE(dep_req->pfb)) {
428         case DIGITAL_NFC_DEP_PFB_I_PDU:
429                 pr_debug("DIGITAL_NFC_DEP_PFB_I_PDU\n");
430                 ddev->curr_nfc_dep_pni = DIGITAL_NFC_DEP_PFB_PNI(dep_req->pfb);
431                 break;
432         case DIGITAL_NFC_DEP_PFB_ACK_NACK_PDU:
433                 pr_err("Received a ACK/NACK PDU\n");
434                 rc = -EINVAL;
435                 goto exit;
436                 break;
437         case DIGITAL_NFC_DEP_PFB_SUPERVISOR_PDU:
438                 pr_err("Received a SUPERVISOR PDU\n");
439                 rc = -EINVAL;
440                 goto exit;
441                 break;
442         }
443
444         skb_pull(resp, size);
445
446         rc = nfc_tm_data_received(ddev->nfc_dev, resp);
447
448 exit:
449         if (rc)
450                 kfree_skb(resp);
451 }
452
453 int digital_tg_send_dep_res(struct nfc_digital_dev *ddev, struct sk_buff *skb)
454 {
455         struct digital_dep_req_res *dep_res;
456
457         skb_push(skb, sizeof(struct digital_dep_req_res));
458         dep_res = (struct digital_dep_req_res *)skb->data;
459
460         dep_res->dir = DIGITAL_NFC_DEP_FRAME_DIR_IN;
461         dep_res->cmd = DIGITAL_CMD_DEP_RES;
462         dep_res->pfb = ddev->curr_nfc_dep_pni;
463
464         digital_skb_push_dep_sod(ddev, skb);
465
466         ddev->skb_add_crc(skb);
467
468         return digital_tg_send_cmd(ddev, skb, 1500, digital_tg_recv_dep_req,
469                                    NULL);
470 }
471
472 static void digital_tg_send_psl_res_complete(struct nfc_digital_dev *ddev,
473                                              void *arg, struct sk_buff *resp)
474 {
475         u8 rf_tech = PTR_ERR(arg);
476
477         if (IS_ERR(resp))
478                 return;
479
480         digital_tg_configure_hw(ddev, NFC_DIGITAL_CONFIG_RF_TECH, rf_tech);
481
482         digital_tg_listen(ddev, 1500, digital_tg_recv_dep_req, NULL);
483
484         dev_kfree_skb(resp);
485 }
486
487 static int digital_tg_send_psl_res(struct nfc_digital_dev *ddev, u8 did,
488                                    u8 rf_tech)
489 {
490         struct digital_psl_res *psl_res;
491         struct sk_buff *skb;
492         int rc;
493
494         skb = digital_skb_alloc(ddev, sizeof(struct digital_psl_res));
495         if (!skb)
496                 return -ENOMEM;
497
498         skb_put(skb, sizeof(struct digital_psl_res));
499
500         psl_res = (struct digital_psl_res *)skb->data;
501
502         psl_res->dir = DIGITAL_NFC_DEP_FRAME_DIR_IN;
503         psl_res->cmd = DIGITAL_CMD_PSL_RES;
504         psl_res->did = did;
505
506         digital_skb_push_dep_sod(ddev, skb);
507
508         ddev->skb_add_crc(skb);
509
510         rc = digital_tg_send_cmd(ddev, skb, 0, digital_tg_send_psl_res_complete,
511                                  ERR_PTR(rf_tech));
512
513         if (rc)
514                 kfree_skb(skb);
515
516         return rc;
517 }
518
519 static void digital_tg_recv_psl_req(struct nfc_digital_dev *ddev, void *arg,
520                                     struct sk_buff *resp)
521 {
522         int rc;
523         struct digital_psl_req *psl_req;
524         u8 rf_tech;
525         u8 dsi;
526
527         if (IS_ERR(resp)) {
528                 rc = PTR_ERR(resp);
529                 resp = NULL;
530                 goto exit;
531         }
532
533         rc = ddev->skb_check_crc(resp);
534         if (rc) {
535                 PROTOCOL_ERR("14.4.1.6");
536                 goto exit;
537         }
538
539         rc = digital_skb_pull_dep_sod(ddev, resp);
540         if (rc) {
541                 PROTOCOL_ERR("14.4.1.2");
542                 goto exit;
543         }
544
545         psl_req = (struct digital_psl_req *)resp->data;
546
547         if (resp->len != sizeof(struct digital_psl_req) ||
548             psl_req->dir != DIGITAL_NFC_DEP_FRAME_DIR_OUT ||
549             psl_req->cmd != DIGITAL_CMD_PSL_REQ) {
550                 rc = -EIO;
551                 goto exit;
552         }
553
554         dsi = (psl_req->brs >> 3) & 0x07;
555         switch (dsi) {
556         case 0:
557                 rf_tech = NFC_DIGITAL_RF_TECH_106A;
558                 break;
559         case 1:
560                 rf_tech = NFC_DIGITAL_RF_TECH_212F;
561                 break;
562         case 2:
563                 rf_tech = NFC_DIGITAL_RF_TECH_424F;
564                 break;
565         default:
566                 pr_err("Unsuported dsi value %d\n", dsi);
567                 goto exit;
568         }
569
570         rc = digital_tg_send_psl_res(ddev, psl_req->did, rf_tech);
571
572 exit:
573         kfree_skb(resp);
574 }
575
576 static void digital_tg_send_atr_res_complete(struct nfc_digital_dev *ddev,
577                                              void *arg, struct sk_buff *resp)
578 {
579         int offset;
580
581         if (IS_ERR(resp)) {
582                 digital_poll_next_tech(ddev);
583                 return;
584         }
585
586         offset = 2;
587         if (resp->data[0] == DIGITAL_NFC_DEP_NFCA_SOD_SB)
588                 offset++;
589
590         if (resp->data[offset] == DIGITAL_CMD_PSL_REQ)
591                 digital_tg_recv_psl_req(ddev, arg, resp);
592         else
593                 digital_tg_recv_dep_req(ddev, arg, resp);
594 }
595
596 static int digital_tg_send_atr_res(struct nfc_digital_dev *ddev,
597                                    struct digital_atr_req *atr_req)
598 {
599         struct digital_atr_res *atr_res;
600         struct sk_buff *skb;
601         u8 *gb;
602         size_t gb_len;
603         int rc;
604
605         gb = nfc_get_local_general_bytes(ddev->nfc_dev, &gb_len);
606         if (!gb)
607                 gb_len = 0;
608
609         skb = digital_skb_alloc(ddev, sizeof(struct digital_atr_res) + gb_len);
610         if (!skb)
611                 return -ENOMEM;
612
613         skb_put(skb, sizeof(struct digital_atr_res));
614         atr_res = (struct digital_atr_res *)skb->data;
615
616         memset(atr_res, 0, sizeof(struct digital_atr_res));
617
618         atr_res->dir = DIGITAL_NFC_DEP_FRAME_DIR_IN;
619         atr_res->cmd = DIGITAL_CMD_ATR_RES;
620         memcpy(atr_res->nfcid3, atr_req->nfcid3, sizeof(atr_req->nfcid3));
621         atr_res->to = 8;
622         atr_res->pp = DIGITAL_LR_BITS_PAYLOAD_SIZE_254B;
623         if (gb_len) {
624                 skb_put(skb, gb_len);
625
626                 atr_res->pp |= DIGITAL_GB_BIT;
627                 memcpy(atr_res->gb, gb, gb_len);
628         }
629
630         digital_skb_push_dep_sod(ddev, skb);
631
632         ddev->skb_add_crc(skb);
633
634         rc = digital_tg_send_cmd(ddev, skb, 999,
635                                  digital_tg_send_atr_res_complete, NULL);
636         if (rc) {
637                 kfree_skb(skb);
638                 return rc;
639         }
640
641         return rc;
642 }
643
644 void digital_tg_recv_atr_req(struct nfc_digital_dev *ddev, void *arg,
645                              struct sk_buff *resp)
646 {
647         int rc;
648         struct digital_atr_req *atr_req;
649         size_t gb_len, min_size;
650
651         if (IS_ERR(resp)) {
652                 rc = PTR_ERR(resp);
653                 resp = NULL;
654                 goto exit;
655         }
656
657         if (!resp->len) {
658                 rc = -EIO;
659                 goto exit;
660         }
661
662         if (resp->data[0] == DIGITAL_NFC_DEP_NFCA_SOD_SB) {
663                 min_size = DIGITAL_ATR_REQ_MIN_SIZE + 2;
664
665                 ddev->curr_rf_tech = NFC_DIGITAL_RF_TECH_106A;
666                 ddev->skb_add_crc = digital_skb_add_crc_a;
667                 ddev->skb_check_crc = digital_skb_check_crc_a;
668         } else {
669                 min_size = DIGITAL_ATR_REQ_MIN_SIZE + 1;
670
671                 ddev->curr_rf_tech = NFC_DIGITAL_RF_TECH_212F;
672                 ddev->skb_add_crc = digital_skb_add_crc_f;
673                 ddev->skb_check_crc = digital_skb_check_crc_f;
674         }
675
676         if (resp->len < min_size) {
677                 rc = -EIO;
678                 goto exit;
679         }
680
681         if (DIGITAL_DRV_CAPS_TG_CRC(ddev)) {
682                 ddev->skb_add_crc = digital_skb_add_crc_none;
683                 ddev->skb_check_crc = digital_skb_check_crc_none;
684         }
685
686         rc = ddev->skb_check_crc(resp);
687         if (rc) {
688                 PROTOCOL_ERR("14.4.1.6");
689                 goto exit;
690         }
691
692         rc = digital_skb_pull_dep_sod(ddev, resp);
693         if (rc) {
694                 PROTOCOL_ERR("14.4.1.2");
695                 goto exit;
696         }
697
698         atr_req = (struct digital_atr_req *)resp->data;
699
700         if (atr_req->dir != DIGITAL_NFC_DEP_FRAME_DIR_OUT ||
701             atr_req->cmd != DIGITAL_CMD_ATR_REQ) {
702                 rc = -EINVAL;
703                 goto exit;
704         }
705
706         rc = digital_tg_configure_hw(ddev, NFC_DIGITAL_CONFIG_FRAMING,
707                                      NFC_DIGITAL_FRAMING_NFC_DEP_ACTIVATED);
708         if (rc)
709                 goto exit;
710
711         rc = digital_tg_send_atr_res(ddev, atr_req);
712         if (rc)
713                 goto exit;
714
715         gb_len = resp->len - sizeof(struct digital_atr_req);
716         rc = nfc_tm_activated(ddev->nfc_dev, NFC_PROTO_NFC_DEP_MASK,
717                               NFC_COMM_PASSIVE, atr_req->gb, gb_len);
718         if (rc)
719                 goto exit;
720
721         ddev->poll_tech_count = 0;
722
723         rc = 0;
724 exit:
725         if (rc)
726                 digital_poll_next_tech(ddev);
727
728         dev_kfree_skb(resp);
729 }