digital_dep.c 15 KB

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