]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/blame - drivers/nfc/st21nfca/dep.c
treewide: Use fallthrough pseudo-keyword
[mirror_ubuntu-jammy-kernel.git] / drivers / nfc / st21nfca / dep.c
CommitLineData
46fe7771 1// SPDX-License-Identifier: GPL-2.0-only
1892bf84
CR
2/*
3 * Copyright (C) 2014 STMicroelectronics SAS. All rights reserved.
1892bf84
CR
4 */
5
6#include <net/nfc/hci.h>
7
8#include "st21nfca.h"
1892bf84
CR
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
a4415e76
CR
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
1892bf84
CR
46#define ST21NFCA_EVT_CARD_F_BITRATE 0x16
47#define ST21NFCA_EVT_READER_F_BITRATE 0x13
48#define ST21NFCA_PSL_REQ_SEND_SPEED(brs) (brs & 0x38)
49#define ST21NFCA_PSL_REQ_RECV_SPEED(brs) (brs & 0x07)
50#define ST21NFCA_PP2LRI(pp) ((pp & 0x30) >> 4)
51#define ST21NFCA_CARD_BITRATE_212 0x01
52#define ST21NFCA_CARD_BITRATE_424 0x02
53
54#define ST21NFCA_DEFAULT_TIMEOUT 0x0a
55
56
57#define PROTOCOL_ERR(req) pr_err("%d: ST21NFCA Protocol error: %s\n", \
58 __LINE__, req)
59
60struct st21nfca_atr_req {
61 u8 length;
62 u8 cmd0;
63 u8 cmd1;
64 u8 nfcid3[NFC_NFCID3_MAXSIZE];
65 u8 did;
66 u8 bsi;
67 u8 bri;
68 u8 ppi;
da60fbe7 69 u8 gbi[];
1892bf84
CR
70} __packed;
71
72struct st21nfca_atr_res {
73 u8 length;
74 u8 cmd0;
75 u8 cmd1;
76 u8 nfcid3[NFC_NFCID3_MAXSIZE];
77 u8 did;
78 u8 bsi;
79 u8 bri;
80 u8 to;
81 u8 ppi;
da60fbe7 82 u8 gbi[];
1892bf84
CR
83} __packed;
84
85struct st21nfca_psl_req {
86 u8 length;
87 u8 cmd0;
88 u8 cmd1;
89 u8 did;
90 u8 brs;
91 u8 fsl;
92} __packed;
93
94struct st21nfca_psl_res {
95 u8 length;
96 u8 cmd0;
97 u8 cmd1;
98 u8 did;
99} __packed;
100
101struct st21nfca_dep_req_res {
102 u8 length;
103 u8 cmd0;
104 u8 cmd1;
105 u8 pfb;
106 u8 did;
107 u8 nad;
108} __packed;
109
110static void st21nfca_tx_work(struct work_struct *work)
111{
112 struct st21nfca_hci_info *info = container_of(work,
113 struct st21nfca_hci_info,
114 dep_info.tx_work);
115
116 struct nfc_dev *dev;
117 struct sk_buff *skb;
3e6df919 118
1892bf84
CR
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,
cc3faac9
CR
126 ST21NFCA_WR_XCHG_DATA, skb->data, skb->len,
127 info->async_cb, info);
1892bf84
CR
128 device_unlock(&dev->dev);
129 kfree_skb(skb);
130 }
131}
132
133static void st21nfca_im_send_pdu(struct st21nfca_hci_info *info,
134 struct sk_buff *skb)
135{
136 info->dep_info.tx_pending = skb;
137 schedule_work(&info->dep_info.tx_work);
138}
139
140static int st21nfca_tm_send_atr_res(struct nfc_hci_dev *hdev,
141 struct st21nfca_atr_req *atr_req)
142{
143 struct st21nfca_atr_res *atr_res;
144 struct sk_buff *skb;
145 size_t gb_len;
146 int r;
147 struct st21nfca_hci_info *info = nfc_hci_get_clientdata(hdev);
148
149 gb_len = atr_req->length - sizeof(struct st21nfca_atr_req);
150 skb = alloc_skb(atr_req->length + 1, GFP_KERNEL);
151 if (!skb)
152 return -ENOMEM;
153
154 skb_put(skb, sizeof(struct st21nfca_atr_res));
155
156 atr_res = (struct st21nfca_atr_res *)skb->data;
157 memset(atr_res, 0, sizeof(struct st21nfca_atr_res));
158
159 atr_res->length = atr_req->length + 1;
160 atr_res->cmd0 = ST21NFCA_NFCIP1_RES;
161 atr_res->cmd1 = ST21NFCA_NFCIP1_ATR_RES;
162
163 memcpy(atr_res->nfcid3, atr_req->nfcid3, 6);
164 atr_res->bsi = 0x00;
165 atr_res->bri = 0x00;
166 atr_res->to = ST21NFCA_DEFAULT_TIMEOUT;
167 atr_res->ppi = ST21NFCA_LR_BITS_PAYLOAD_SIZE_254B;
168
169 if (gb_len) {
170 skb_put(skb, gb_len);
171
172 atr_res->ppi |= ST21NFCA_GB_BIT;
173 memcpy(atr_res->gbi, atr_req->gbi, gb_len);
174 r = nfc_set_remote_general_bytes(hdev->ndev, atr_res->gbi,
175 gb_len);
3decabdc
CY
176 if (r < 0) {
177 kfree_skb(skb);
1892bf84 178 return r;
3decabdc 179 }
1892bf84
CR
180 }
181
182 info->dep_info.curr_nfc_dep_pni = 0;
183
ecc6522b 184 r = nfc_hci_send_event(hdev, ST21NFCA_RF_CARD_F_GATE,
1892bf84 185 ST21NFCA_EVT_SEND_DATA, skb->data, skb->len);
ecc6522b
CR
186 kfree_skb(skb);
187 return r;
1892bf84
CR
188}
189
190static int st21nfca_tm_recv_atr_req(struct nfc_hci_dev *hdev,
191 struct sk_buff *skb)
192{
193 struct st21nfca_atr_req *atr_req;
194 size_t gb_len;
195 int r;
196
197 skb_trim(skb, skb->len - 1);
1892bf84
CR
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
56f1ffcc
CR
211 if (atr_req->length < sizeof(struct st21nfca_atr_req)) {
212 r = -EPROTO;
213 goto exit;
214 }
215
1892bf84
CR
216 r = st21nfca_tm_send_atr_res(hdev, atr_req);
217 if (r)
218 goto exit;
219
220 gb_len = skb->len - sizeof(struct st21nfca_atr_req);
221
222 r = nfc_tm_activated(hdev->ndev, NFC_PROTO_NFC_DEP_MASK,
223 NFC_COMM_PASSIVE, atr_req->gbi, gb_len);
224 if (r)
225 goto exit;
226
227 r = 0;
228
229exit:
230 return r;
231}
232
233static int st21nfca_tm_send_psl_res(struct nfc_hci_dev *hdev,
234 struct st21nfca_psl_req *psl_req)
235{
236 struct st21nfca_psl_res *psl_res;
237 struct sk_buff *skb;
238 u8 bitrate[2] = {0, 0};
1892bf84
CR
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);
ecc6522b
CR
255 if (r < 0)
256 goto error;
1892bf84
CR
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 */
ecc6522b 272 r = nfc_hci_send_event(hdev, ST21NFCA_RF_CARD_F_GATE,
1892bf84 273 ST21NFCA_EVT_CARD_F_BITRATE, bitrate, 2);
ecc6522b
CR
274error:
275 kfree_skb(skb);
276 return r;
1892bf84
CR
277}
278
279static int st21nfca_tm_recv_psl_req(struct nfc_hci_dev *hdev,
280 struct sk_buff *skb)
281{
282 struct st21nfca_psl_req *psl_req;
283 int r;
284
285 skb_trim(skb, skb->len - 1);
1892bf84
CR
286
287 if (!skb->len) {
288 r = -EIO;
289 goto exit;
290 }
291
292 psl_req = (struct st21nfca_psl_req *)skb->data;
293
294 if (skb->len < sizeof(struct st21nfca_psl_req)) {
295 r = -EIO;
296 goto exit;
297 }
298
299 r = st21nfca_tm_send_psl_res(hdev, psl_req);
300exit:
301 return r;
302}
303
304int st21nfca_tm_send_dep_res(struct nfc_hci_dev *hdev, struct sk_buff *skb)
305{
306 int r;
307 struct st21nfca_hci_info *info = nfc_hci_get_clientdata(hdev);
308
d58ff351
JB
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;
1892bf84
CR
313
314 r = nfc_hci_send_event(hdev, ST21NFCA_RF_CARD_F_GATE,
cc3faac9 315 ST21NFCA_EVT_SEND_DATA, skb->data, skb->len);
1892bf84
CR
316 kfree_skb(skb);
317
318 return r;
319}
320EXPORT_SYMBOL(st21nfca_tm_send_dep_res);
321
322static int st21nfca_tm_recv_dep_req(struct nfc_hci_dev *hdev,
323 struct sk_buff *skb)
324{
325 struct st21nfca_dep_req_res *dep_req;
326 u8 size;
327 int r;
328 struct st21nfca_hci_info *info = nfc_hci_get_clientdata(hdev);
329
330 skb_trim(skb, skb->len - 1);
1892bf84
CR
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
1892bf84
CR
364 skb_pull(skb, size);
365
366 return nfc_tm_data_received(hdev->ndev, skb);
367exit:
368 return r;
369}
370
a4415e76
CR
371static int st21nfca_tm_event_send_data(struct nfc_hci_dev *hdev,
372 struct sk_buff *skb)
1892bf84
CR
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 }
a01bcfd6 394 break;
1892bf84
CR
395 default:
396 return 1;
397 }
398 return r;
399}
a4415e76
CR
400
401/*
402 * Returns:
403 * <= 0: driver handled the event, skb consumed
404 * 1: driver does not handle the event, please do standard processing
405 */
406int st21nfca_dep_event_received(struct nfc_hci_dev *hdev,
407 u8 event, struct sk_buff *skb)
408{
409 int r = 0;
410 struct st21nfca_hci_info *info = nfc_hci_get_clientdata(hdev);
411
412 pr_debug("dep event: %d\n", event);
413
414 switch (event) {
415 case ST21NFCA_EVT_CARD_ACTIVATED:
416 info->dep_info.curr_nfc_dep_pni = 0;
417 break;
418 case ST21NFCA_EVT_CARD_DEACTIVATED:
419 break;
420 case ST21NFCA_EVT_FIELD_ON:
421 break;
422 case ST21NFCA_EVT_FIELD_OFF:
423 break;
424 case ST21NFCA_EVT_SEND_DATA:
425 r = st21nfca_tm_event_send_data(hdev, skb);
426 if (r < 0)
427 return r;
428 return 0;
429 default:
a9e062d0 430 nfc_err(&hdev->ndev->dev, "Unexpected event on card f gate\n");
a4415e76
CR
431 return 1;
432 }
433 kfree_skb(skb);
434 return r;
435}
436EXPORT_SYMBOL(st21nfca_dep_event_received);
1892bf84
CR
437
438static void st21nfca_im_send_psl_req(struct nfc_hci_dev *hdev, u8 did, u8 bsi,
439 u8 bri, u8 lri)
440{
441 struct sk_buff *skb;
442 struct st21nfca_psl_req *psl_req;
443 struct st21nfca_hci_info *info = nfc_hci_get_clientdata(hdev);
444
445 skb =
446 alloc_skb(sizeof(struct st21nfca_psl_req) + 1, GFP_KERNEL);
447 if (!skb)
448 return;
449 skb_reserve(skb, 1);
450
451 skb_put(skb, sizeof(struct st21nfca_psl_req));
452 psl_req = (struct st21nfca_psl_req *) skb->data;
453
454 psl_req->length = sizeof(struct st21nfca_psl_req);
455 psl_req->cmd0 = ST21NFCA_NFCIP1_REQ;
456 psl_req->cmd1 = ST21NFCA_NFCIP1_PSL_REQ;
457 psl_req->did = did;
458 psl_req->brs = (0x30 & bsi << 4) | (bri & 0x03);
459 psl_req->fsl = lri;
460
d58ff351 461 *(u8 *)skb_push(skb, 1) = info->dep_info.to | 0x10;
1892bf84
CR
462
463 st21nfca_im_send_pdu(info, skb);
1892bf84
CR
464}
465
466#define ST21NFCA_CB_TYPE_READER_F 1
467static void st21nfca_im_recv_atr_res_cb(void *context, struct sk_buff *skb,
468 int err)
469{
470 struct st21nfca_hci_info *info = context;
471 struct st21nfca_atr_res *atr_res;
472 int r;
473
474 if (err != 0)
475 return;
476
459e794b 477 if (!skb)
1892bf84
CR
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:
32b41d8f 509 kfree_skb(skb);
1892bf84
CR
510 break;
511 }
512}
513
514int st21nfca_im_send_atr_req(struct nfc_hci_dev *hdev, u8 *gb, size_t gb_len)
515{
516 struct sk_buff *skb;
517 struct st21nfca_hci_info *info = nfc_hci_get_clientdata(hdev);
518 struct st21nfca_atr_req *atr_req;
519 struct nfc_target *target;
520 uint size;
521
522 info->dep_info.to = ST21NFCA_DEFAULT_TIMEOUT;
523 size = ST21NFCA_ATR_REQ_MIN_SIZE + gb_len;
524 if (size > ST21NFCA_ATR_REQ_MAX_SIZE) {
525 PROTOCOL_ERR("14.6.1.1");
526 return -EINVAL;
527 }
528
529 skb =
530 alloc_skb(sizeof(struct st21nfca_atr_req) + gb_len + 1, GFP_KERNEL);
531 if (!skb)
532 return -ENOMEM;
533
534 skb_reserve(skb, 1);
535
536 skb_put(skb, sizeof(struct st21nfca_atr_req));
537
538 atr_req = (struct st21nfca_atr_req *)skb->data;
539 memset(atr_req, 0, sizeof(struct st21nfca_atr_req));
540
541 atr_req->cmd0 = ST21NFCA_NFCIP1_REQ;
542 atr_req->cmd1 = ST21NFCA_NFCIP1_ATR_REQ;
543 memset(atr_req->nfcid3, 0, NFC_NFCID3_MAXSIZE);
544 target = hdev->ndev->targets;
545
72030a2e 546 if (target->sensf_res_len > 0)
1892bf84
CR
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;
59ae1d12 559 skb_put_data(skb, gb, gb_len);
1892bf84
CR
560 }
561 atr_req->length = sizeof(struct st21nfca_atr_req) + hdev->gb_len;
562
d58ff351 563 *(u8 *)skb_push(skb, 1) = info->dep_info.to | 0x10; /* timeout */
1892bf84
CR
564
565 info->async_cb_type = ST21NFCA_CB_TYPE_READER_F;
566 info->async_cb_context = info;
567 info->async_cb = st21nfca_im_recv_atr_res_cb;
568 info->dep_info.bri = atr_req->bri;
569 info->dep_info.bsi = atr_req->bsi;
570 info->dep_info.lri = ST21NFCA_PP2LRI(atr_req->ppi);
571
572 return nfc_hci_send_cmd_async(hdev, ST21NFCA_RF_READER_F_GATE,
573 ST21NFCA_WR_XCHG_DATA, skb->data,
574 skb->len, info->async_cb, info);
575}
576EXPORT_SYMBOL(st21nfca_im_send_atr_req);
577
578static void st21nfca_im_recv_dep_res_cb(void *context, struct sk_buff *skb,
579 int err)
580{
581 struct st21nfca_hci_info *info = context;
582 struct st21nfca_dep_req_res *dep_res;
583
584 int size;
585
586 if (err != 0)
587 return;
588
459e794b 589 if (!skb)
1892bf84
CR
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");
df561f66 614 fallthrough;
1892bf84
CR
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);
d58ff351
JB
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;
1892bf84
CR
629
630 st21nfca_im_send_pdu(info, skb);
631 break;
632 }
633
634 return;
635 default:
636 break;
637 }
638
639exit:
32b41d8f 640 kfree_skb(skb);
1892bf84
CR
641}
642
643int st21nfca_im_send_dep_req(struct nfc_hci_dev *hdev, struct sk_buff *skb)
644{
645 struct st21nfca_hci_info *info = nfc_hci_get_clientdata(hdev);
646
647 info->async_cb_type = ST21NFCA_CB_TYPE_READER_F;
648 info->async_cb_context = info;
649 info->async_cb = st21nfca_im_recv_dep_res_cb;
650
d58ff351
JB
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;
1892bf84 655
d58ff351 656 *(u8 *)skb_push(skb, 1) = info->dep_info.to | 0x10;
1892bf84
CR
657
658 return nfc_hci_send_cmd_async(hdev, ST21NFCA_RF_READER_F_GATE,
659 ST21NFCA_WR_XCHG_DATA,
660 skb->data, skb->len,
661 info->async_cb, info);
662}
663EXPORT_SYMBOL(st21nfca_im_send_dep_req);
664
665void st21nfca_dep_init(struct nfc_hci_dev *hdev)
666{
667 struct st21nfca_hci_info *info = nfc_hci_get_clientdata(hdev);
668
669 INIT_WORK(&info->dep_info.tx_work, st21nfca_tx_work);
670 info->dep_info.curr_nfc_dep_pni = 0;
671 info->dep_info.idx = 0;
672 info->dep_info.to = ST21NFCA_DEFAULT_TIMEOUT;
673}
674EXPORT_SYMBOL(st21nfca_dep_init);
675
676void st21nfca_dep_deinit(struct nfc_hci_dev *hdev)
677{
678 struct st21nfca_hci_info *info = nfc_hci_get_clientdata(hdev);
679
680 cancel_work_sync(&info->dep_info.tx_work);
681}
682EXPORT_SYMBOL(st21nfca_dep_deinit);