GNU Linux-libre 5.10.215-gnu1
[releases.git] / drivers / nfc / st21nfca / dep.c
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
60 struct 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
72 struct 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
85 struct st21nfca_psl_req {
86         u8 length;
87         u8 cmd0;
88         u8 cmd1;
89         u8 did;
90         u8 brs;
91         u8 fsl;
92 } __packed;
93
94 struct st21nfca_psl_res {
95         u8 length;
96         u8 cmd0;
97         u8 cmd1;
98         u8 did;
99 } __packed;
100
101 struct 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
110 static 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
133 static 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
140 static 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
190 static 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
229 exit:
230         return r;
231 }
232
233 static 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);
274 error:
275         kfree_skb(skb);
276         return r;
277 }
278
279 static 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);
300 exit:
301         return r;
302 }
303
304 int 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 }
320 EXPORT_SYMBOL(st21nfca_tm_send_dep_res);
321
322 static 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);
367 exit:
368         return r;
369 }
370
371 static 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  */
406 int 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 }
436 EXPORT_SYMBOL(st21nfca_dep_event_received);
437
438 static 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
467 static 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
514 int 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 }
576 EXPORT_SYMBOL(st21nfca_im_send_atr_req);
577
578 static 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
639 exit:
640         kfree_skb(skb);
641 }
642
643 int 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 }
663 EXPORT_SYMBOL(st21nfca_im_send_dep_req);
664
665 void 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 }
674 EXPORT_SYMBOL(st21nfca_dep_init);
675
676 void 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 }
682 EXPORT_SYMBOL(st21nfca_dep_deinit);