digital_dep.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749
  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. case DIGITAL_NFC_DEP_PFB_SUPERVISOR_PDU:
  358. pr_err("Received a SUPERVISOR PDU\n");
  359. rc = -EINVAL;
  360. goto exit;
  361. }
  362. skb_pull(resp, size);
  363. rc = nfc_tm_data_received(ddev->nfc_dev, resp);
  364. exit:
  365. if (rc)
  366. kfree_skb(resp);
  367. }
  368. int digital_tg_send_dep_res(struct nfc_digital_dev *ddev, struct sk_buff *skb)
  369. {
  370. struct digital_dep_req_res *dep_res;
  371. skb_push(skb, sizeof(struct digital_dep_req_res));
  372. dep_res = (struct digital_dep_req_res *)skb->data;
  373. dep_res->dir = DIGITAL_NFC_DEP_FRAME_DIR_IN;
  374. dep_res->cmd = DIGITAL_CMD_DEP_RES;
  375. dep_res->pfb = ddev->curr_nfc_dep_pni;
  376. digital_skb_push_dep_sod(ddev, skb);
  377. ddev->skb_add_crc(skb);
  378. return digital_tg_send_cmd(ddev, skb, 1500, digital_tg_recv_dep_req,
  379. NULL);
  380. }
  381. static void digital_tg_send_psl_res_complete(struct nfc_digital_dev *ddev,
  382. void *arg, struct sk_buff *resp)
  383. {
  384. u8 rf_tech = (unsigned long)arg;
  385. if (IS_ERR(resp))
  386. return;
  387. digital_tg_set_rf_tech(ddev, rf_tech);
  388. digital_tg_configure_hw(ddev, NFC_DIGITAL_CONFIG_RF_TECH, rf_tech);
  389. digital_tg_listen(ddev, 1500, digital_tg_recv_dep_req, NULL);
  390. dev_kfree_skb(resp);
  391. }
  392. static int digital_tg_send_psl_res(struct nfc_digital_dev *ddev, u8 did,
  393. u8 rf_tech)
  394. {
  395. struct digital_psl_res *psl_res;
  396. struct sk_buff *skb;
  397. int rc;
  398. skb = digital_skb_alloc(ddev, sizeof(struct digital_psl_res));
  399. if (!skb)
  400. return -ENOMEM;
  401. skb_put(skb, sizeof(struct digital_psl_res));
  402. psl_res = (struct digital_psl_res *)skb->data;
  403. psl_res->dir = DIGITAL_NFC_DEP_FRAME_DIR_IN;
  404. psl_res->cmd = DIGITAL_CMD_PSL_RES;
  405. psl_res->did = did;
  406. digital_skb_push_dep_sod(ddev, skb);
  407. ddev->skb_add_crc(skb);
  408. rc = digital_tg_send_cmd(ddev, skb, 0, digital_tg_send_psl_res_complete,
  409. (void *)(unsigned long)rf_tech);
  410. if (rc)
  411. kfree_skb(skb);
  412. return rc;
  413. }
  414. static void digital_tg_recv_psl_req(struct nfc_digital_dev *ddev, void *arg,
  415. struct sk_buff *resp)
  416. {
  417. int rc;
  418. struct digital_psl_req *psl_req;
  419. u8 rf_tech;
  420. u8 dsi;
  421. if (IS_ERR(resp)) {
  422. rc = PTR_ERR(resp);
  423. resp = NULL;
  424. goto exit;
  425. }
  426. rc = ddev->skb_check_crc(resp);
  427. if (rc) {
  428. PROTOCOL_ERR("14.4.1.6");
  429. goto exit;
  430. }
  431. rc = digital_skb_pull_dep_sod(ddev, resp);
  432. if (rc) {
  433. PROTOCOL_ERR("14.4.1.2");
  434. goto exit;
  435. }
  436. psl_req = (struct digital_psl_req *)resp->data;
  437. if (resp->len != sizeof(struct digital_psl_req) ||
  438. psl_req->dir != DIGITAL_NFC_DEP_FRAME_DIR_OUT ||
  439. psl_req->cmd != DIGITAL_CMD_PSL_REQ) {
  440. rc = -EIO;
  441. goto exit;
  442. }
  443. dsi = (psl_req->brs >> 3) & 0x07;
  444. switch (dsi) {
  445. case 0:
  446. rf_tech = NFC_DIGITAL_RF_TECH_106A;
  447. break;
  448. case 1:
  449. rf_tech = NFC_DIGITAL_RF_TECH_212F;
  450. break;
  451. case 2:
  452. rf_tech = NFC_DIGITAL_RF_TECH_424F;
  453. break;
  454. default:
  455. pr_err("Unsupported dsi value %d\n", dsi);
  456. goto exit;
  457. }
  458. rc = digital_tg_send_psl_res(ddev, psl_req->did, rf_tech);
  459. exit:
  460. kfree_skb(resp);
  461. }
  462. static void digital_tg_send_atr_res_complete(struct nfc_digital_dev *ddev,
  463. void *arg, struct sk_buff *resp)
  464. {
  465. int offset;
  466. if (IS_ERR(resp)) {
  467. digital_poll_next_tech(ddev);
  468. return;
  469. }
  470. offset = 2;
  471. if (resp->data[0] == DIGITAL_NFC_DEP_NFCA_SOD_SB)
  472. offset++;
  473. if (resp->data[offset] == DIGITAL_CMD_PSL_REQ)
  474. digital_tg_recv_psl_req(ddev, arg, resp);
  475. else
  476. digital_tg_recv_dep_req(ddev, arg, resp);
  477. }
  478. static int digital_tg_send_atr_res(struct nfc_digital_dev *ddev,
  479. struct digital_atr_req *atr_req)
  480. {
  481. struct digital_atr_res *atr_res;
  482. struct sk_buff *skb;
  483. u8 *gb;
  484. size_t gb_len;
  485. int rc;
  486. gb = nfc_get_local_general_bytes(ddev->nfc_dev, &gb_len);
  487. if (!gb)
  488. gb_len = 0;
  489. skb = digital_skb_alloc(ddev, sizeof(struct digital_atr_res) + gb_len);
  490. if (!skb)
  491. return -ENOMEM;
  492. skb_put(skb, sizeof(struct digital_atr_res));
  493. atr_res = (struct digital_atr_res *)skb->data;
  494. memset(atr_res, 0, sizeof(struct digital_atr_res));
  495. atr_res->dir = DIGITAL_NFC_DEP_FRAME_DIR_IN;
  496. atr_res->cmd = DIGITAL_CMD_ATR_RES;
  497. memcpy(atr_res->nfcid3, atr_req->nfcid3, sizeof(atr_req->nfcid3));
  498. atr_res->to = 8;
  499. atr_res->pp = DIGITAL_LR_BITS_PAYLOAD_SIZE_254B;
  500. if (gb_len) {
  501. skb_put(skb, gb_len);
  502. atr_res->pp |= DIGITAL_GB_BIT;
  503. memcpy(atr_res->gb, gb, gb_len);
  504. }
  505. digital_skb_push_dep_sod(ddev, skb);
  506. ddev->skb_add_crc(skb);
  507. rc = digital_tg_send_cmd(ddev, skb, 999,
  508. digital_tg_send_atr_res_complete, NULL);
  509. if (rc) {
  510. kfree_skb(skb);
  511. return rc;
  512. }
  513. return rc;
  514. }
  515. void digital_tg_recv_atr_req(struct nfc_digital_dev *ddev, void *arg,
  516. struct sk_buff *resp)
  517. {
  518. int rc;
  519. struct digital_atr_req *atr_req;
  520. size_t gb_len, min_size;
  521. u8 poll_tech_count;
  522. if (IS_ERR(resp)) {
  523. rc = PTR_ERR(resp);
  524. resp = NULL;
  525. goto exit;
  526. }
  527. if (!resp->len) {
  528. rc = -EIO;
  529. goto exit;
  530. }
  531. if (resp->data[0] == DIGITAL_NFC_DEP_NFCA_SOD_SB) {
  532. min_size = DIGITAL_ATR_REQ_MIN_SIZE + 2;
  533. digital_tg_set_rf_tech(ddev, NFC_DIGITAL_RF_TECH_106A);
  534. } else {
  535. min_size = DIGITAL_ATR_REQ_MIN_SIZE + 1;
  536. digital_tg_set_rf_tech(ddev, NFC_DIGITAL_RF_TECH_212F);
  537. }
  538. if (resp->len < min_size) {
  539. rc = -EIO;
  540. goto exit;
  541. }
  542. ddev->curr_protocol = NFC_PROTO_NFC_DEP_MASK;
  543. rc = ddev->skb_check_crc(resp);
  544. if (rc) {
  545. PROTOCOL_ERR("14.4.1.6");
  546. goto exit;
  547. }
  548. rc = digital_skb_pull_dep_sod(ddev, resp);
  549. if (rc) {
  550. PROTOCOL_ERR("14.4.1.2");
  551. goto exit;
  552. }
  553. atr_req = (struct digital_atr_req *)resp->data;
  554. if (atr_req->dir != DIGITAL_NFC_DEP_FRAME_DIR_OUT ||
  555. atr_req->cmd != DIGITAL_CMD_ATR_REQ) {
  556. rc = -EINVAL;
  557. goto exit;
  558. }
  559. rc = digital_tg_configure_hw(ddev, NFC_DIGITAL_CONFIG_FRAMING,
  560. NFC_DIGITAL_FRAMING_NFC_DEP_ACTIVATED);
  561. if (rc)
  562. goto exit;
  563. rc = digital_tg_send_atr_res(ddev, atr_req);
  564. if (rc)
  565. goto exit;
  566. gb_len = resp->len - sizeof(struct digital_atr_req);
  567. poll_tech_count = ddev->poll_tech_count;
  568. ddev->poll_tech_count = 0;
  569. rc = nfc_tm_activated(ddev->nfc_dev, NFC_PROTO_NFC_DEP_MASK,
  570. NFC_COMM_PASSIVE, atr_req->gb, gb_len);
  571. if (rc) {
  572. ddev->poll_tech_count = poll_tech_count;
  573. goto exit;
  574. }
  575. rc = 0;
  576. exit:
  577. if (rc)
  578. digital_poll_next_tech(ddev);
  579. dev_kfree_skb(resp);
  580. }