port100.c 30 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216
  1. /*
  2. * Sony NFC Port-100 Series driver
  3. * Copyright (c) 2013, Intel Corporation.
  4. *
  5. * Partly based/Inspired by Stephen Tiedemann's nfcpy
  6. *
  7. * This program is free software; you can redistribute it and/or modify it
  8. * under the terms and conditions of the GNU General Public License,
  9. * version 2, as published by the Free Software Foundation.
  10. *
  11. * This program is distributed in the hope it will be useful, but WITHOUT
  12. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13. * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  14. * more details.
  15. *
  16. */
  17. #include <linux/module.h>
  18. #include <linux/usb.h>
  19. #include <net/nfc/digital.h>
  20. #define VERSION "0.1"
  21. #define SONY_VENDOR_ID 0x054c
  22. #define RCS380_PRODUCT_ID 0x06c1
  23. #define PORT100_PROTOCOLS (NFC_PROTO_JEWEL_MASK | \
  24. NFC_PROTO_MIFARE_MASK | \
  25. NFC_PROTO_FELICA_MASK | \
  26. NFC_PROTO_NFC_DEP_MASK)
  27. #define PORT100_CAPABILITIES (NFC_DIGITAL_DRV_CAPS_IN_CRC | \
  28. NFC_DIGITAL_DRV_CAPS_TG_CRC)
  29. /* Standard port100 frame definitions */
  30. #define PORT100_FRAME_HEADER_LEN (sizeof(struct port100_frame) \
  31. + 2) /* data[0] CC, data[1] SCC */
  32. #define PORT100_FRAME_TAIL_LEN 2 /* data[len] DCS, data[len + 1] postamble*/
  33. #define PORT100_COMM_RF_HEAD_MAX_LEN (sizeof(struct port100_tg_comm_rf_cmd))
  34. /*
  35. * Max extended frame payload len, excluding CC and SCC
  36. * which are already in PORT100_FRAME_HEADER_LEN.
  37. */
  38. #define PORT100_FRAME_MAX_PAYLOAD_LEN 1001
  39. #define PORT100_FRAME_ACK_SIZE 6 /* Preamble (1), SoPC (2), ACK Code (2),
  40. Postamble (1) */
  41. static u8 ack_frame[PORT100_FRAME_ACK_SIZE] = {
  42. 0x00, 0x00, 0xff, 0x00, 0xff, 0x00
  43. };
  44. #define PORT100_FRAME_CHECKSUM(f) (f->data[le16_to_cpu(f->datalen)])
  45. #define PORT100_FRAME_POSTAMBLE(f) (f->data[le16_to_cpu(f->datalen) + 1])
  46. /* start of frame */
  47. #define PORT100_FRAME_SOF 0x00FF
  48. #define PORT100_FRAME_EXT 0xFFFF
  49. #define PORT100_FRAME_ACK 0x00FF
  50. /* Port-100 command: in or out */
  51. #define PORT100_FRAME_DIRECTION(f) (f->data[0]) /* CC */
  52. #define PORT100_FRAME_DIR_OUT 0xD6
  53. #define PORT100_FRAME_DIR_IN 0xD7
  54. /* Port-100 sub-command */
  55. #define PORT100_FRAME_CMD(f) (f->data[1]) /* SCC */
  56. #define PORT100_CMD_GET_FIRMWARE_VERSION 0x20
  57. #define PORT100_CMD_GET_COMMAND_TYPE 0x28
  58. #define PORT100_CMD_SET_COMMAND_TYPE 0x2A
  59. #define PORT100_CMD_IN_SET_RF 0x00
  60. #define PORT100_CMD_IN_SET_PROTOCOL 0x02
  61. #define PORT100_CMD_IN_COMM_RF 0x04
  62. #define PORT100_CMD_SWITCH_RF 0x06
  63. #define PORT100_CMD_RESPONSE(cmd) (cmd + 1)
  64. #define PORT100_CMD_TYPE_IS_SUPPORTED(mask, cmd_type) \
  65. ((mask) & (0x01 << (cmd_type)))
  66. #define PORT100_CMD_TYPE_0 0
  67. #define PORT100_CMD_TYPE_1 1
  68. #define PORT100_CMD_STATUS_OK 0x00
  69. #define PORT100_CMD_STATUS_TIMEOUT 0x80
  70. struct port100;
  71. typedef void (*port100_send_async_complete_t)(struct port100 *dev, void *arg,
  72. struct sk_buff *resp);
  73. /**
  74. * Setting sets structure for in_set_rf command
  75. *
  76. * @in_*_set_number: Represent the entry indexes in the port-100 RF Base Table.
  77. * This table contains multiple RF setting sets required for RF
  78. * communication.
  79. *
  80. * @in_*_comm_type: Theses fields set the communication type to be used.
  81. */
  82. struct port100_in_rf_setting {
  83. u8 in_send_set_number;
  84. u8 in_send_comm_type;
  85. u8 in_recv_set_number;
  86. u8 in_recv_comm_type;
  87. } __packed;
  88. #define PORT100_COMM_TYPE_IN_212F 0x01
  89. #define PORT100_COMM_TYPE_IN_424F 0x02
  90. #define PORT100_COMM_TYPE_IN_106A 0x03
  91. static const struct port100_in_rf_setting in_rf_settings[] = {
  92. [NFC_DIGITAL_RF_TECH_212F] = {
  93. .in_send_set_number = 1,
  94. .in_send_comm_type = PORT100_COMM_TYPE_IN_212F,
  95. .in_recv_set_number = 15,
  96. .in_recv_comm_type = PORT100_COMM_TYPE_IN_212F,
  97. },
  98. [NFC_DIGITAL_RF_TECH_424F] = {
  99. .in_send_set_number = 1,
  100. .in_send_comm_type = PORT100_COMM_TYPE_IN_424F,
  101. .in_recv_set_number = 15,
  102. .in_recv_comm_type = PORT100_COMM_TYPE_IN_424F,
  103. },
  104. [NFC_DIGITAL_RF_TECH_106A] = {
  105. .in_send_set_number = 2,
  106. .in_send_comm_type = PORT100_COMM_TYPE_IN_106A,
  107. .in_recv_set_number = 15,
  108. .in_recv_comm_type = PORT100_COMM_TYPE_IN_106A,
  109. },
  110. };
  111. #define PORT100_IN_PROT_INITIAL_GUARD_TIME 0x00
  112. #define PORT100_IN_PROT_ADD_CRC 0x01
  113. #define PORT100_IN_PROT_CHECK_CRC 0x02
  114. #define PORT100_IN_PROT_MULTI_CARD 0x03
  115. #define PORT100_IN_PROT_ADD_PARITY 0x04
  116. #define PORT100_IN_PROT_CHECK_PARITY 0x05
  117. #define PORT100_IN_PROT_BITWISE_AC_RECV_MODE 0x06
  118. #define PORT100_IN_PROT_VALID_BIT_NUMBER 0x07
  119. #define PORT100_IN_PROT_CRYPTO1 0x08
  120. #define PORT100_IN_PROT_ADD_SOF 0x09
  121. #define PORT100_IN_PROT_CHECK_SOF 0x0A
  122. #define PORT100_IN_PROT_ADD_EOF 0x0B
  123. #define PORT100_IN_PROT_CHECK_EOF 0x0C
  124. #define PORT100_IN_PROT_DEAF_TIME 0x0E
  125. #define PORT100_IN_PROT_CRM 0x0F
  126. #define PORT100_IN_PROT_CRM_MIN_LEN 0x10
  127. #define PORT100_IN_PROT_T1_TAG_FRAME 0x11
  128. #define PORT100_IN_PROT_RFCA 0x12
  129. #define PORT100_IN_PROT_GUARD_TIME_AT_INITIATOR 0x13
  130. #define PORT100_IN_PROT_END 0x14
  131. #define PORT100_IN_MAX_NUM_PROTOCOLS 19
  132. struct port100_protocol {
  133. u8 number;
  134. u8 value;
  135. } __packed;
  136. static struct port100_protocol
  137. in_protocols[][PORT100_IN_MAX_NUM_PROTOCOLS + 1] = {
  138. [NFC_DIGITAL_FRAMING_NFCA_SHORT] = {
  139. { PORT100_IN_PROT_INITIAL_GUARD_TIME, 6 },
  140. { PORT100_IN_PROT_ADD_CRC, 0 },
  141. { PORT100_IN_PROT_CHECK_CRC, 0 },
  142. { PORT100_IN_PROT_MULTI_CARD, 0 },
  143. { PORT100_IN_PROT_ADD_PARITY, 0 },
  144. { PORT100_IN_PROT_CHECK_PARITY, 1 },
  145. { PORT100_IN_PROT_BITWISE_AC_RECV_MODE, 0 },
  146. { PORT100_IN_PROT_VALID_BIT_NUMBER, 7 },
  147. { PORT100_IN_PROT_CRYPTO1, 0 },
  148. { PORT100_IN_PROT_ADD_SOF, 0 },
  149. { PORT100_IN_PROT_CHECK_SOF, 0 },
  150. { PORT100_IN_PROT_ADD_EOF, 0 },
  151. { PORT100_IN_PROT_CHECK_EOF, 0 },
  152. { PORT100_IN_PROT_DEAF_TIME, 4 },
  153. { PORT100_IN_PROT_CRM, 0 },
  154. { PORT100_IN_PROT_CRM_MIN_LEN, 0 },
  155. { PORT100_IN_PROT_T1_TAG_FRAME, 0 },
  156. { PORT100_IN_PROT_RFCA, 0 },
  157. { PORT100_IN_PROT_GUARD_TIME_AT_INITIATOR, 6 },
  158. { PORT100_IN_PROT_END, 0 },
  159. },
  160. [NFC_DIGITAL_FRAMING_NFCA_STANDARD] = {
  161. { PORT100_IN_PROT_INITIAL_GUARD_TIME, 6 },
  162. { PORT100_IN_PROT_ADD_CRC, 0 },
  163. { PORT100_IN_PROT_CHECK_CRC, 0 },
  164. { PORT100_IN_PROT_MULTI_CARD, 0 },
  165. { PORT100_IN_PROT_ADD_PARITY, 1 },
  166. { PORT100_IN_PROT_CHECK_PARITY, 1 },
  167. { PORT100_IN_PROT_BITWISE_AC_RECV_MODE, 0 },
  168. { PORT100_IN_PROT_VALID_BIT_NUMBER, 8 },
  169. { PORT100_IN_PROT_CRYPTO1, 0 },
  170. { PORT100_IN_PROT_ADD_SOF, 0 },
  171. { PORT100_IN_PROT_CHECK_SOF, 0 },
  172. { PORT100_IN_PROT_ADD_EOF, 0 },
  173. { PORT100_IN_PROT_CHECK_EOF, 0 },
  174. { PORT100_IN_PROT_DEAF_TIME, 4 },
  175. { PORT100_IN_PROT_CRM, 0 },
  176. { PORT100_IN_PROT_CRM_MIN_LEN, 0 },
  177. { PORT100_IN_PROT_T1_TAG_FRAME, 0 },
  178. { PORT100_IN_PROT_RFCA, 0 },
  179. { PORT100_IN_PROT_GUARD_TIME_AT_INITIATOR, 6 },
  180. { PORT100_IN_PROT_END, 0 },
  181. },
  182. [NFC_DIGITAL_FRAMING_NFCA_STANDARD_WITH_CRC_A] = {
  183. { PORT100_IN_PROT_INITIAL_GUARD_TIME, 6 },
  184. { PORT100_IN_PROT_ADD_CRC, 1 },
  185. { PORT100_IN_PROT_CHECK_CRC, 1 },
  186. { PORT100_IN_PROT_MULTI_CARD, 0 },
  187. { PORT100_IN_PROT_ADD_PARITY, 1 },
  188. { PORT100_IN_PROT_CHECK_PARITY, 1 },
  189. { PORT100_IN_PROT_BITWISE_AC_RECV_MODE, 0 },
  190. { PORT100_IN_PROT_VALID_BIT_NUMBER, 8 },
  191. { PORT100_IN_PROT_CRYPTO1, 0 },
  192. { PORT100_IN_PROT_ADD_SOF, 0 },
  193. { PORT100_IN_PROT_CHECK_SOF, 0 },
  194. { PORT100_IN_PROT_ADD_EOF, 0 },
  195. { PORT100_IN_PROT_CHECK_EOF, 0 },
  196. { PORT100_IN_PROT_DEAF_TIME, 4 },
  197. { PORT100_IN_PROT_CRM, 0 },
  198. { PORT100_IN_PROT_CRM_MIN_LEN, 0 },
  199. { PORT100_IN_PROT_T1_TAG_FRAME, 0 },
  200. { PORT100_IN_PROT_RFCA, 0 },
  201. { PORT100_IN_PROT_GUARD_TIME_AT_INITIATOR, 6 },
  202. { PORT100_IN_PROT_END, 0 },
  203. },
  204. [NFC_DIGITAL_FRAMING_NFCA_T1T] = {
  205. /* nfc_digital_framing_nfca_short */
  206. { PORT100_IN_PROT_ADD_CRC, 2 },
  207. { PORT100_IN_PROT_CHECK_CRC, 2 },
  208. { PORT100_IN_PROT_VALID_BIT_NUMBER, 8 },
  209. { PORT100_IN_PROT_T1_TAG_FRAME, 2 },
  210. { PORT100_IN_PROT_END, 0 },
  211. },
  212. [NFC_DIGITAL_FRAMING_NFCA_T2T] = {
  213. /* nfc_digital_framing_nfca_standard */
  214. { PORT100_IN_PROT_ADD_CRC, 1 },
  215. { PORT100_IN_PROT_CHECK_CRC, 0 },
  216. { PORT100_IN_PROT_END, 0 },
  217. },
  218. [NFC_DIGITAL_FRAMING_NFCA_NFC_DEP] = {
  219. /* nfc_digital_framing_nfca_standard */
  220. { PORT100_IN_PROT_END, 0 },
  221. },
  222. [NFC_DIGITAL_FRAMING_NFCF] = {
  223. { PORT100_IN_PROT_INITIAL_GUARD_TIME, 18 },
  224. { PORT100_IN_PROT_ADD_CRC, 1 },
  225. { PORT100_IN_PROT_CHECK_CRC, 1 },
  226. { PORT100_IN_PROT_MULTI_CARD, 0 },
  227. { PORT100_IN_PROT_ADD_PARITY, 0 },
  228. { PORT100_IN_PROT_CHECK_PARITY, 0 },
  229. { PORT100_IN_PROT_BITWISE_AC_RECV_MODE, 0 },
  230. { PORT100_IN_PROT_VALID_BIT_NUMBER, 8 },
  231. { PORT100_IN_PROT_CRYPTO1, 0 },
  232. { PORT100_IN_PROT_ADD_SOF, 0 },
  233. { PORT100_IN_PROT_CHECK_SOF, 0 },
  234. { PORT100_IN_PROT_ADD_EOF, 0 },
  235. { PORT100_IN_PROT_CHECK_EOF, 0 },
  236. { PORT100_IN_PROT_DEAF_TIME, 4 },
  237. { PORT100_IN_PROT_CRM, 0 },
  238. { PORT100_IN_PROT_CRM_MIN_LEN, 0 },
  239. { PORT100_IN_PROT_T1_TAG_FRAME, 0 },
  240. { PORT100_IN_PROT_RFCA, 0 },
  241. { PORT100_IN_PROT_GUARD_TIME_AT_INITIATOR, 6 },
  242. { PORT100_IN_PROT_END, 0 },
  243. },
  244. [NFC_DIGITAL_FRAMING_NFCF_T3T] = {
  245. /* nfc_digital_framing_nfcf */
  246. { PORT100_IN_PROT_END, 0 },
  247. },
  248. [NFC_DIGITAL_FRAMING_NFCF_NFC_DEP] = {
  249. /* nfc_digital_framing_nfcf */
  250. { PORT100_IN_PROT_END, 0 },
  251. },
  252. [NFC_DIGITAL_FRAMING_NFC_DEP_ACTIVATED] = {
  253. { PORT100_IN_PROT_END, 0 },
  254. },
  255. };
  256. struct port100 {
  257. struct nfc_digital_dev *nfc_digital_dev;
  258. int skb_headroom;
  259. int skb_tailroom;
  260. struct usb_device *udev;
  261. struct usb_interface *interface;
  262. struct urb *out_urb;
  263. struct urb *in_urb;
  264. struct work_struct cmd_complete_work;
  265. u8 cmd_type;
  266. /* The digital stack serializes commands to be sent. There is no need
  267. * for any queuing/locking mechanism at driver level.
  268. */
  269. struct port100_cmd *cmd;
  270. };
  271. struct port100_cmd {
  272. u8 code;
  273. int status;
  274. struct sk_buff *req;
  275. struct sk_buff *resp;
  276. int resp_len;
  277. port100_send_async_complete_t complete_cb;
  278. void *complete_cb_context;
  279. };
  280. struct port100_frame {
  281. u8 preamble;
  282. __be16 start_frame;
  283. __be16 extended_frame;
  284. __le16 datalen;
  285. u8 datalen_checksum;
  286. u8 data[];
  287. } __packed;
  288. struct port100_ack_frame {
  289. u8 preamble;
  290. __be16 start_frame;
  291. __be16 ack_frame;
  292. u8 postambule;
  293. } __packed;
  294. struct port100_cb_arg {
  295. nfc_digital_cmd_complete_t complete_cb;
  296. void *complete_arg;
  297. u8 mdaa;
  298. };
  299. struct port100_tg_comm_rf_cmd {
  300. __le16 guard_time;
  301. __le16 send_timeout;
  302. u8 mdaa;
  303. u8 nfca_param[6];
  304. u8 nfcf_param[18];
  305. u8 mf_halted;
  306. u8 arae_flag;
  307. __le16 recv_timeout;
  308. u8 data[];
  309. } __packed;
  310. /* The rule: value + checksum = 0 */
  311. static inline u8 port100_checksum(u16 value)
  312. {
  313. return ~(((u8 *)&value)[0] + ((u8 *)&value)[1]) + 1;
  314. }
  315. /* The rule: sum(data elements) + checksum = 0 */
  316. static u8 port100_data_checksum(u8 *data, int datalen)
  317. {
  318. u8 sum = 0;
  319. int i;
  320. for (i = 0; i < datalen; i++)
  321. sum += data[i];
  322. return port100_checksum(sum);
  323. }
  324. static void port100_tx_frame_init(void *_frame, u8 cmd_code)
  325. {
  326. struct port100_frame *frame = _frame;
  327. frame->preamble = 0;
  328. frame->start_frame = cpu_to_be16(PORT100_FRAME_SOF);
  329. frame->extended_frame = cpu_to_be16(PORT100_FRAME_EXT);
  330. PORT100_FRAME_DIRECTION(frame) = PORT100_FRAME_DIR_OUT;
  331. PORT100_FRAME_CMD(frame) = cmd_code;
  332. frame->datalen = cpu_to_le16(2);
  333. }
  334. static void port100_tx_frame_finish(void *_frame)
  335. {
  336. struct port100_frame *frame = _frame;
  337. frame->datalen_checksum = port100_checksum(le16_to_cpu(frame->datalen));
  338. PORT100_FRAME_CHECKSUM(frame) =
  339. port100_data_checksum(frame->data, le16_to_cpu(frame->datalen));
  340. PORT100_FRAME_POSTAMBLE(frame) = 0;
  341. }
  342. static void port100_tx_update_payload_len(void *_frame, int len)
  343. {
  344. struct port100_frame *frame = _frame;
  345. frame->datalen = cpu_to_le16(le16_to_cpu(frame->datalen) + len);
  346. }
  347. static bool port100_rx_frame_is_valid(void *_frame)
  348. {
  349. u8 checksum;
  350. struct port100_frame *frame = _frame;
  351. if (frame->start_frame != cpu_to_be16(PORT100_FRAME_SOF) ||
  352. frame->extended_frame != cpu_to_be16(PORT100_FRAME_EXT))
  353. return false;
  354. checksum = port100_checksum(le16_to_cpu(frame->datalen));
  355. if (checksum != frame->datalen_checksum)
  356. return false;
  357. checksum = port100_data_checksum(frame->data,
  358. le16_to_cpu(frame->datalen));
  359. if (checksum != PORT100_FRAME_CHECKSUM(frame))
  360. return false;
  361. return true;
  362. }
  363. static bool port100_rx_frame_is_ack(struct port100_ack_frame *frame)
  364. {
  365. return (frame->start_frame == cpu_to_be16(PORT100_FRAME_SOF) &&
  366. frame->ack_frame == cpu_to_be16(PORT100_FRAME_ACK));
  367. }
  368. static inline int port100_rx_frame_size(void *frame)
  369. {
  370. struct port100_frame *f = frame;
  371. return sizeof(struct port100_frame) + le16_to_cpu(f->datalen) +
  372. PORT100_FRAME_TAIL_LEN;
  373. }
  374. static bool port100_rx_frame_is_cmd_response(struct port100 *dev, void *frame)
  375. {
  376. struct port100_frame *f = frame;
  377. return (PORT100_FRAME_CMD(f) == PORT100_CMD_RESPONSE(dev->cmd->code));
  378. }
  379. static void port100_recv_response(struct urb *urb)
  380. {
  381. struct port100 *dev = urb->context;
  382. struct port100_cmd *cmd = dev->cmd;
  383. u8 *in_frame;
  384. cmd->status = urb->status;
  385. switch (urb->status) {
  386. case 0:
  387. break; /* success */
  388. case -ECONNRESET:
  389. case -ENOENT:
  390. nfc_err(&dev->interface->dev,
  391. "The urb has been canceled (status %d)", urb->status);
  392. goto sched_wq;
  393. case -ESHUTDOWN:
  394. default:
  395. nfc_err(&dev->interface->dev, "Urb failure (status %d)",
  396. urb->status);
  397. goto sched_wq;
  398. }
  399. in_frame = dev->in_urb->transfer_buffer;
  400. if (!port100_rx_frame_is_valid(in_frame)) {
  401. nfc_err(&dev->interface->dev, "Received an invalid frame");
  402. cmd->status = -EIO;
  403. goto sched_wq;
  404. }
  405. print_hex_dump_debug("PORT100 RX: ", DUMP_PREFIX_NONE, 16, 1, in_frame,
  406. port100_rx_frame_size(in_frame), false);
  407. if (!port100_rx_frame_is_cmd_response(dev, in_frame)) {
  408. nfc_err(&dev->interface->dev,
  409. "It's not the response to the last command");
  410. cmd->status = -EIO;
  411. goto sched_wq;
  412. }
  413. sched_wq:
  414. schedule_work(&dev->cmd_complete_work);
  415. }
  416. static int port100_submit_urb_for_response(struct port100 *dev, gfp_t flags)
  417. {
  418. dev->in_urb->complete = port100_recv_response;
  419. return usb_submit_urb(dev->in_urb, flags);
  420. }
  421. static void port100_recv_ack(struct urb *urb)
  422. {
  423. struct port100 *dev = urb->context;
  424. struct port100_cmd *cmd = dev->cmd;
  425. struct port100_ack_frame *in_frame;
  426. int rc;
  427. cmd->status = urb->status;
  428. switch (urb->status) {
  429. case 0:
  430. break; /* success */
  431. case -ECONNRESET:
  432. case -ENOENT:
  433. nfc_err(&dev->interface->dev,
  434. "The urb has been stopped (status %d)", urb->status);
  435. goto sched_wq;
  436. case -ESHUTDOWN:
  437. default:
  438. nfc_err(&dev->interface->dev, "Urb failure (status %d)",
  439. urb->status);
  440. goto sched_wq;
  441. }
  442. in_frame = dev->in_urb->transfer_buffer;
  443. if (!port100_rx_frame_is_ack(in_frame)) {
  444. nfc_err(&dev->interface->dev, "Received an invalid ack");
  445. cmd->status = -EIO;
  446. goto sched_wq;
  447. }
  448. rc = port100_submit_urb_for_response(dev, GFP_ATOMIC);
  449. if (rc) {
  450. nfc_err(&dev->interface->dev,
  451. "usb_submit_urb failed with result %d", rc);
  452. cmd->status = rc;
  453. goto sched_wq;
  454. }
  455. return;
  456. sched_wq:
  457. schedule_work(&dev->cmd_complete_work);
  458. }
  459. static int port100_submit_urb_for_ack(struct port100 *dev, gfp_t flags)
  460. {
  461. dev->in_urb->complete = port100_recv_ack;
  462. return usb_submit_urb(dev->in_urb, flags);
  463. }
  464. static int port100_send_ack(struct port100 *dev)
  465. {
  466. int rc;
  467. dev->out_urb->transfer_buffer = ack_frame;
  468. dev->out_urb->transfer_buffer_length = sizeof(ack_frame);
  469. rc = usb_submit_urb(dev->out_urb, GFP_KERNEL);
  470. return rc;
  471. }
  472. static int port100_send_frame_async(struct port100 *dev, struct sk_buff *out,
  473. struct sk_buff *in, int in_len)
  474. {
  475. int rc;
  476. dev->out_urb->transfer_buffer = out->data;
  477. dev->out_urb->transfer_buffer_length = out->len;
  478. dev->in_urb->transfer_buffer = in->data;
  479. dev->in_urb->transfer_buffer_length = in_len;
  480. print_hex_dump_debug("PORT100 TX: ", DUMP_PREFIX_NONE, 16, 1,
  481. out->data, out->len, false);
  482. rc = usb_submit_urb(dev->out_urb, GFP_KERNEL);
  483. if (rc)
  484. return rc;
  485. rc = port100_submit_urb_for_ack(dev, GFP_KERNEL);
  486. if (rc)
  487. goto error;
  488. return 0;
  489. error:
  490. usb_unlink_urb(dev->out_urb);
  491. return rc;
  492. }
  493. static void port100_build_cmd_frame(struct port100 *dev, u8 cmd_code,
  494. struct sk_buff *skb)
  495. {
  496. /* payload is already there, just update datalen */
  497. int payload_len = skb->len;
  498. skb_push(skb, PORT100_FRAME_HEADER_LEN);
  499. skb_put(skb, PORT100_FRAME_TAIL_LEN);
  500. port100_tx_frame_init(skb->data, cmd_code);
  501. port100_tx_update_payload_len(skb->data, payload_len);
  502. port100_tx_frame_finish(skb->data);
  503. }
  504. static void port100_send_async_complete(struct port100 *dev)
  505. {
  506. struct port100_cmd *cmd = dev->cmd;
  507. int status = cmd->status;
  508. struct sk_buff *req = cmd->req;
  509. struct sk_buff *resp = cmd->resp;
  510. dev_kfree_skb(req);
  511. dev->cmd = NULL;
  512. if (status < 0) {
  513. cmd->complete_cb(dev, cmd->complete_cb_context,
  514. ERR_PTR(status));
  515. dev_kfree_skb(resp);
  516. goto done;
  517. }
  518. skb_put(resp, port100_rx_frame_size(resp->data));
  519. skb_pull(resp, PORT100_FRAME_HEADER_LEN);
  520. skb_trim(resp, resp->len - PORT100_FRAME_TAIL_LEN);
  521. cmd->complete_cb(dev, cmd->complete_cb_context, resp);
  522. done:
  523. kfree(cmd);
  524. }
  525. static int port100_send_cmd_async(struct port100 *dev, u8 cmd_code,
  526. struct sk_buff *req,
  527. port100_send_async_complete_t complete_cb,
  528. void *complete_cb_context)
  529. {
  530. struct port100_cmd *cmd;
  531. struct sk_buff *resp;
  532. int rc;
  533. int resp_len = PORT100_FRAME_HEADER_LEN +
  534. PORT100_FRAME_MAX_PAYLOAD_LEN +
  535. PORT100_FRAME_TAIL_LEN;
  536. resp = alloc_skb(resp_len, GFP_KERNEL);
  537. if (!resp)
  538. return -ENOMEM;
  539. cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
  540. if (!cmd) {
  541. dev_kfree_skb(resp);
  542. return -ENOMEM;
  543. }
  544. cmd->code = cmd_code;
  545. cmd->req = req;
  546. cmd->resp = resp;
  547. cmd->resp_len = resp_len;
  548. cmd->complete_cb = complete_cb;
  549. cmd->complete_cb_context = complete_cb_context;
  550. port100_build_cmd_frame(dev, cmd_code, req);
  551. dev->cmd = cmd;
  552. rc = port100_send_frame_async(dev, req, resp, resp_len);
  553. if (rc) {
  554. kfree(cmd);
  555. dev_kfree_skb(resp);
  556. dev->cmd = NULL;
  557. }
  558. return rc;
  559. }
  560. struct port100_sync_cmd_response {
  561. struct sk_buff *resp;
  562. struct completion done;
  563. };
  564. static void port100_wq_cmd_complete(struct work_struct *work)
  565. {
  566. struct port100 *dev = container_of(work, struct port100,
  567. cmd_complete_work);
  568. port100_send_async_complete(dev);
  569. }
  570. static void port100_send_sync_complete(struct port100 *dev, void *_arg,
  571. struct sk_buff *resp)
  572. {
  573. struct port100_sync_cmd_response *arg = _arg;
  574. arg->resp = resp;
  575. complete(&arg->done);
  576. }
  577. static struct sk_buff *port100_send_cmd_sync(struct port100 *dev, u8 cmd_code,
  578. struct sk_buff *req)
  579. {
  580. int rc;
  581. struct port100_sync_cmd_response arg;
  582. init_completion(&arg.done);
  583. rc = port100_send_cmd_async(dev, cmd_code, req,
  584. port100_send_sync_complete, &arg);
  585. if (rc) {
  586. dev_kfree_skb(req);
  587. return ERR_PTR(rc);
  588. }
  589. wait_for_completion(&arg.done);
  590. return arg.resp;
  591. }
  592. static void port100_send_complete(struct urb *urb)
  593. {
  594. struct port100 *dev = urb->context;
  595. switch (urb->status) {
  596. case 0:
  597. break; /* success */
  598. case -ECONNRESET:
  599. case -ENOENT:
  600. nfc_err(&dev->interface->dev,
  601. "The urb has been stopped (status %d)", urb->status);
  602. break;
  603. case -ESHUTDOWN:
  604. default:
  605. nfc_err(&dev->interface->dev, "Urb failure (status %d)",
  606. urb->status);
  607. }
  608. }
  609. static void port100_abort_cmd(struct nfc_digital_dev *ddev)
  610. {
  611. struct port100 *dev = nfc_digital_get_drvdata(ddev);
  612. /* An ack will cancel the last issued command */
  613. port100_send_ack(dev);
  614. /* cancel the urb request */
  615. usb_kill_urb(dev->in_urb);
  616. }
  617. static struct sk_buff *port100_alloc_skb(struct port100 *dev, unsigned int size)
  618. {
  619. struct sk_buff *skb;
  620. skb = alloc_skb(dev->skb_headroom + dev->skb_tailroom + size,
  621. GFP_KERNEL);
  622. if (skb)
  623. skb_reserve(skb, dev->skb_headroom);
  624. return skb;
  625. }
  626. static int port100_set_command_type(struct port100 *dev, u8 command_type)
  627. {
  628. struct sk_buff *skb;
  629. struct sk_buff *resp;
  630. int rc;
  631. skb = port100_alloc_skb(dev, 1);
  632. if (!skb)
  633. return -ENOMEM;
  634. *skb_put(skb, sizeof(u8)) = command_type;
  635. resp = port100_send_cmd_sync(dev, PORT100_CMD_SET_COMMAND_TYPE, skb);
  636. if (IS_ERR(resp))
  637. return PTR_ERR(resp);
  638. rc = resp->data[0];
  639. dev_kfree_skb(resp);
  640. return rc;
  641. }
  642. static u64 port100_get_command_type_mask(struct port100 *dev)
  643. {
  644. struct sk_buff *skb;
  645. struct sk_buff *resp;
  646. u64 mask;
  647. skb = port100_alloc_skb(dev, 0);
  648. if (!skb)
  649. return -ENOMEM;
  650. resp = port100_send_cmd_sync(dev, PORT100_CMD_GET_COMMAND_TYPE, skb);
  651. if (IS_ERR(resp))
  652. return PTR_ERR(resp);
  653. if (resp->len < 8)
  654. mask = 0;
  655. else
  656. mask = be64_to_cpu(*(__be64 *)resp->data);
  657. dev_kfree_skb(resp);
  658. return mask;
  659. }
  660. static u16 port100_get_firmware_version(struct port100 *dev)
  661. {
  662. struct sk_buff *skb;
  663. struct sk_buff *resp;
  664. u16 fw_ver;
  665. skb = port100_alloc_skb(dev, 0);
  666. if (!skb)
  667. return 0;
  668. resp = port100_send_cmd_sync(dev, PORT100_CMD_GET_FIRMWARE_VERSION,
  669. skb);
  670. if (IS_ERR(resp))
  671. return 0;
  672. fw_ver = le16_to_cpu(*(__le16 *)resp->data);
  673. dev_kfree_skb(resp);
  674. return fw_ver;
  675. }
  676. static int port100_switch_rf(struct nfc_digital_dev *ddev, bool on)
  677. {
  678. struct port100 *dev = nfc_digital_get_drvdata(ddev);
  679. struct sk_buff *skb, *resp;
  680. skb = port100_alloc_skb(dev, 1);
  681. if (!skb)
  682. return -ENOMEM;
  683. *skb_put(skb, 1) = on ? 1 : 0;
  684. resp = port100_send_cmd_sync(dev, PORT100_CMD_SWITCH_RF, skb);
  685. if (IS_ERR(resp))
  686. return PTR_ERR(resp);
  687. dev_kfree_skb(resp);
  688. return 0;
  689. }
  690. static int port100_in_set_rf(struct nfc_digital_dev *ddev, u8 rf)
  691. {
  692. struct port100 *dev = nfc_digital_get_drvdata(ddev);
  693. struct sk_buff *skb;
  694. struct sk_buff *resp;
  695. int rc;
  696. if (rf >= NFC_DIGITAL_RF_TECH_LAST)
  697. return -EINVAL;
  698. skb = port100_alloc_skb(dev, sizeof(struct port100_in_rf_setting));
  699. if (!skb)
  700. return -ENOMEM;
  701. memcpy(skb_put(skb, sizeof(struct port100_in_rf_setting)),
  702. &in_rf_settings[rf],
  703. sizeof(struct port100_in_rf_setting));
  704. resp = port100_send_cmd_sync(dev, PORT100_CMD_IN_SET_RF, skb);
  705. if (IS_ERR(resp))
  706. return PTR_ERR(resp);
  707. rc = resp->data[0];
  708. dev_kfree_skb(resp);
  709. return rc;
  710. }
  711. static int port100_in_set_framing(struct nfc_digital_dev *ddev, int param)
  712. {
  713. struct port100 *dev = nfc_digital_get_drvdata(ddev);
  714. struct port100_protocol *protocols;
  715. struct sk_buff *skb;
  716. struct sk_buff *resp;
  717. int num_protocols;
  718. size_t size;
  719. int rc;
  720. if (param >= NFC_DIGITAL_FRAMING_LAST)
  721. return -EINVAL;
  722. protocols = in_protocols[param];
  723. num_protocols = 0;
  724. while (protocols[num_protocols].number != PORT100_IN_PROT_END)
  725. num_protocols++;
  726. if (!num_protocols)
  727. return 0;
  728. size = sizeof(struct port100_protocol) * num_protocols;
  729. skb = port100_alloc_skb(dev, size);
  730. if (!skb)
  731. return -ENOMEM;
  732. memcpy(skb_put(skb, size), protocols, size);
  733. resp = port100_send_cmd_sync(dev, PORT100_CMD_IN_SET_PROTOCOL, skb);
  734. if (IS_ERR(resp))
  735. return PTR_ERR(resp);
  736. rc = resp->data[0];
  737. dev_kfree_skb(resp);
  738. return rc;
  739. }
  740. static int port100_in_configure_hw(struct nfc_digital_dev *ddev, int type,
  741. int param)
  742. {
  743. if (type == NFC_DIGITAL_CONFIG_RF_TECH)
  744. return port100_in_set_rf(ddev, param);
  745. if (type == NFC_DIGITAL_CONFIG_FRAMING)
  746. return port100_in_set_framing(ddev, param);
  747. return -EINVAL;
  748. }
  749. static void port100_in_comm_rf_complete(struct port100 *dev, void *arg,
  750. struct sk_buff *resp)
  751. {
  752. struct port100_cb_arg *cb_arg = arg;
  753. nfc_digital_cmd_complete_t cb = cb_arg->complete_cb;
  754. u32 status;
  755. int rc;
  756. if (IS_ERR(resp)) {
  757. rc = PTR_ERR(resp);
  758. goto exit;
  759. }
  760. if (resp->len < 4) {
  761. nfc_err(&dev->interface->dev,
  762. "Invalid packet length received.\n");
  763. rc = -EIO;
  764. goto error;
  765. }
  766. status = le32_to_cpu(*(__le32 *)resp->data);
  767. skb_pull(resp, sizeof(u32));
  768. if (status == PORT100_CMD_STATUS_TIMEOUT) {
  769. rc = -ETIMEDOUT;
  770. goto error;
  771. }
  772. if (status != PORT100_CMD_STATUS_OK) {
  773. nfc_err(&dev->interface->dev,
  774. "in_comm_rf failed with status 0x%08x\n", status);
  775. rc = -EIO;
  776. goto error;
  777. }
  778. /* Remove collision bits byte */
  779. skb_pull(resp, 1);
  780. goto exit;
  781. error:
  782. kfree_skb(resp);
  783. resp = ERR_PTR(rc);
  784. exit:
  785. cb(dev->nfc_digital_dev, cb_arg->complete_arg, resp);
  786. kfree(cb_arg);
  787. }
  788. static int port100_in_send_cmd(struct nfc_digital_dev *ddev,
  789. struct sk_buff *skb, u16 _timeout,
  790. nfc_digital_cmd_complete_t cb, void *arg)
  791. {
  792. struct port100 *dev = nfc_digital_get_drvdata(ddev);
  793. struct port100_cb_arg *cb_arg;
  794. __le16 timeout;
  795. cb_arg = kzalloc(sizeof(struct port100_cb_arg), GFP_KERNEL);
  796. if (!cb_arg)
  797. return -ENOMEM;
  798. cb_arg->complete_cb = cb;
  799. cb_arg->complete_arg = arg;
  800. timeout = cpu_to_le16(_timeout * 10);
  801. memcpy(skb_push(skb, sizeof(__le16)), &timeout, sizeof(__le16));
  802. return port100_send_cmd_async(dev, PORT100_CMD_IN_COMM_RF, skb,
  803. port100_in_comm_rf_complete, cb_arg);
  804. }
  805. static int port100_tg_configure_hw(struct nfc_digital_dev *ddev, int type,
  806. int param)
  807. {
  808. return -EOPNOTSUPP;
  809. }
  810. static int port100_tg_send_cmd(struct nfc_digital_dev *ddev,
  811. struct sk_buff *skb, u16 timeout,
  812. nfc_digital_cmd_complete_t cb, void *arg)
  813. {
  814. return -EOPNOTSUPP;
  815. }
  816. static int port100_listen_mdaa(struct nfc_digital_dev *ddev,
  817. struct digital_tg_mdaa_params *params,
  818. u16 timeout,
  819. nfc_digital_cmd_complete_t cb, void *arg)
  820. {
  821. return -EOPNOTSUPP;
  822. }
  823. static int port100_listen(struct nfc_digital_dev *ddev, u16 timeout,
  824. nfc_digital_cmd_complete_t cb, void *arg)
  825. {
  826. return -EOPNOTSUPP;
  827. }
  828. static struct nfc_digital_ops port100_digital_ops = {
  829. .in_configure_hw = port100_in_configure_hw,
  830. .in_send_cmd = port100_in_send_cmd,
  831. .tg_listen_mdaa = port100_listen_mdaa,
  832. .tg_listen = port100_listen,
  833. .tg_configure_hw = port100_tg_configure_hw,
  834. .tg_send_cmd = port100_tg_send_cmd,
  835. .switch_rf = port100_switch_rf,
  836. .abort_cmd = port100_abort_cmd,
  837. };
  838. static const struct usb_device_id port100_table[] = {
  839. { .match_flags = USB_DEVICE_ID_MATCH_DEVICE,
  840. .idVendor = SONY_VENDOR_ID,
  841. .idProduct = RCS380_PRODUCT_ID,
  842. },
  843. { }
  844. };
  845. MODULE_DEVICE_TABLE(usb, port100_table);
  846. static int port100_probe(struct usb_interface *interface,
  847. const struct usb_device_id *id)
  848. {
  849. struct port100 *dev;
  850. int rc;
  851. struct usb_host_interface *iface_desc;
  852. struct usb_endpoint_descriptor *endpoint;
  853. int in_endpoint;
  854. int out_endpoint;
  855. u16 fw_version;
  856. u64 cmd_type_mask;
  857. int i;
  858. dev = devm_kzalloc(&interface->dev, sizeof(struct port100), GFP_KERNEL);
  859. if (!dev)
  860. return -ENOMEM;
  861. dev->udev = usb_get_dev(interface_to_usbdev(interface));
  862. dev->interface = interface;
  863. usb_set_intfdata(interface, dev);
  864. in_endpoint = out_endpoint = 0;
  865. iface_desc = interface->cur_altsetting;
  866. for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
  867. endpoint = &iface_desc->endpoint[i].desc;
  868. if (!in_endpoint && usb_endpoint_is_bulk_in(endpoint))
  869. in_endpoint = endpoint->bEndpointAddress;
  870. if (!out_endpoint && usb_endpoint_is_bulk_out(endpoint))
  871. out_endpoint = endpoint->bEndpointAddress;
  872. }
  873. if (!in_endpoint || !out_endpoint) {
  874. nfc_err(&interface->dev,
  875. "Could not find bulk-in or bulk-out endpoint\n");
  876. rc = -ENODEV;
  877. goto error;
  878. }
  879. dev->in_urb = usb_alloc_urb(0, GFP_KERNEL);
  880. dev->out_urb = usb_alloc_urb(0, GFP_KERNEL);
  881. if (!dev->in_urb || !dev->out_urb) {
  882. nfc_err(&interface->dev, "Could not allocate USB URBs\n");
  883. rc = -ENOMEM;
  884. goto error;
  885. }
  886. usb_fill_bulk_urb(dev->in_urb, dev->udev,
  887. usb_rcvbulkpipe(dev->udev, in_endpoint),
  888. NULL, 0, NULL, dev);
  889. usb_fill_bulk_urb(dev->out_urb, dev->udev,
  890. usb_sndbulkpipe(dev->udev, out_endpoint),
  891. NULL, 0, port100_send_complete, dev);
  892. dev->skb_headroom = PORT100_FRAME_HEADER_LEN +
  893. PORT100_COMM_RF_HEAD_MAX_LEN;
  894. dev->skb_tailroom = PORT100_FRAME_TAIL_LEN;
  895. INIT_WORK(&dev->cmd_complete_work, port100_wq_cmd_complete);
  896. /* The first thing to do with the Port-100 is to set the command type
  897. * to be used. If supported we use command type 1. 0 otherwise.
  898. */
  899. cmd_type_mask = port100_get_command_type_mask(dev);
  900. if (!cmd_type_mask) {
  901. nfc_err(&interface->dev,
  902. "Could not get supported command types.\n");
  903. rc = -ENODEV;
  904. goto error;
  905. }
  906. if (PORT100_CMD_TYPE_IS_SUPPORTED(cmd_type_mask, PORT100_CMD_TYPE_1))
  907. dev->cmd_type = PORT100_CMD_TYPE_1;
  908. else
  909. dev->cmd_type = PORT100_CMD_TYPE_0;
  910. rc = port100_set_command_type(dev, dev->cmd_type);
  911. if (rc) {
  912. nfc_err(&interface->dev,
  913. "The device does not support command type %u.\n",
  914. dev->cmd_type);
  915. goto error;
  916. }
  917. fw_version = port100_get_firmware_version(dev);
  918. if (!fw_version)
  919. nfc_err(&interface->dev,
  920. "Could not get device firmware version.\n");
  921. nfc_info(&interface->dev,
  922. "Sony NFC Port-100 Series attached (firmware v%x.%02x)\n",
  923. (fw_version & 0xFF00) >> 8, fw_version & 0xFF);
  924. dev->nfc_digital_dev = nfc_digital_allocate_device(&port100_digital_ops,
  925. PORT100_PROTOCOLS,
  926. PORT100_CAPABILITIES,
  927. dev->skb_headroom,
  928. dev->skb_tailroom);
  929. if (!dev->nfc_digital_dev) {
  930. nfc_err(&interface->dev,
  931. "Could not allocate nfc_digital_dev.\n");
  932. rc = -ENOMEM;
  933. goto error;
  934. }
  935. nfc_digital_set_parent_dev(dev->nfc_digital_dev, &interface->dev);
  936. nfc_digital_set_drvdata(dev->nfc_digital_dev, dev);
  937. rc = nfc_digital_register_device(dev->nfc_digital_dev);
  938. if (rc) {
  939. nfc_err(&interface->dev,
  940. "Could not register digital device.\n");
  941. goto free_nfc_dev;
  942. }
  943. return 0;
  944. free_nfc_dev:
  945. nfc_digital_free_device(dev->nfc_digital_dev);
  946. error:
  947. usb_free_urb(dev->in_urb);
  948. usb_free_urb(dev->out_urb);
  949. usb_put_dev(dev->udev);
  950. return rc;
  951. }
  952. static void port100_disconnect(struct usb_interface *interface)
  953. {
  954. struct port100 *dev;
  955. dev = usb_get_intfdata(interface);
  956. usb_set_intfdata(interface, NULL);
  957. nfc_digital_unregister_device(dev->nfc_digital_dev);
  958. nfc_digital_free_device(dev->nfc_digital_dev);
  959. usb_kill_urb(dev->in_urb);
  960. usb_kill_urb(dev->out_urb);
  961. usb_free_urb(dev->in_urb);
  962. usb_free_urb(dev->out_urb);
  963. kfree(dev->cmd);
  964. nfc_info(&interface->dev, "Sony Port-100 NFC device disconnected");
  965. }
  966. static struct usb_driver port100_driver = {
  967. .name = "port100",
  968. .probe = port100_probe,
  969. .disconnect = port100_disconnect,
  970. .id_table = port100_table,
  971. };
  972. module_usb_driver(port100_driver);
  973. MODULE_DESCRIPTION("NFC Port-100 series usb driver ver " VERSION);
  974. MODULE_VERSION(VERSION);
  975. MODULE_LICENSE("GPL");