digital_dep.c 15 KB

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