14b10884eSThierry Escande /* 24b10884eSThierry Escande * NFC Digital Protocol stack 34b10884eSThierry Escande * Copyright (c) 2013, Intel Corporation. 44b10884eSThierry Escande * 54b10884eSThierry Escande * This program is free software; you can redistribute it and/or modify it 64b10884eSThierry Escande * under the terms and conditions of the GNU General Public License, 74b10884eSThierry Escande * version 2, as published by the Free Software Foundation. 84b10884eSThierry Escande * 94b10884eSThierry Escande * This program is distributed in the hope it will be useful, but WITHOUT 104b10884eSThierry Escande * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 114b10884eSThierry Escande * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 124b10884eSThierry Escande * more details. 134b10884eSThierry Escande * 144b10884eSThierry Escande */ 154b10884eSThierry Escande 164b10884eSThierry Escande #ifndef __DIGITAL_H 174b10884eSThierry Escande #define __DIGITAL_H 184b10884eSThierry Escande 194b10884eSThierry Escande #include <net/nfc/nfc.h> 204b10884eSThierry Escande #include <net/nfc/digital.h> 214b10884eSThierry Escande 222c66daecSThierry Escande #include <linux/crc-ccitt.h> 238c0695e4SThierry Escande #include <linux/crc-itu-t.h> 242c66daecSThierry Escande 25c5da0e4aSSamuel Ortiz #define PROTOCOL_ERR(req) pr_err("%d: NFC Digital Protocol error: %s\n", \ 26c5da0e4aSSamuel Ortiz __LINE__, req) 274b10884eSThierry Escande 2859ee2361SThierry Escande #define DIGITAL_CMD_IN_SEND 0 2959ee2361SThierry Escande #define DIGITAL_CMD_TG_SEND 1 3059ee2361SThierry Escande #define DIGITAL_CMD_TG_LISTEN 2 3159ee2361SThierry Escande #define DIGITAL_CMD_TG_LISTEN_MDAA 3 32bf30a67cSMark A. Greer #define DIGITAL_CMD_TG_LISTEN_MD 4 3359ee2361SThierry Escande 3459ee2361SThierry Escande #define DIGITAL_MAX_HEADER_LEN 7 3559ee2361SThierry Escande #define DIGITAL_CRC_LEN 2 3659ee2361SThierry Escande 377d0911c0SThierry Escande #define DIGITAL_SENSF_NFCID2_NFC_DEP_B1 0x01 387d0911c0SThierry Escande #define DIGITAL_SENSF_NFCID2_NFC_DEP_B2 0xFE 397d0911c0SThierry Escande 407d0911c0SThierry Escande #define DIGITAL_SENS_RES_NFC_DEP 0x0100 417d0911c0SThierry Escande #define DIGITAL_SEL_RES_NFC_DEP 0x40 427d0911c0SThierry Escande #define DIGITAL_SENSF_FELICA_SC 0xFFFF 437d0911c0SThierry Escande 442c66daecSThierry Escande #define DIGITAL_DRV_CAPS_IN_CRC(ddev) \ 452c66daecSThierry Escande ((ddev)->driver_capabilities & NFC_DIGITAL_DRV_CAPS_IN_CRC) 462c66daecSThierry Escande #define DIGITAL_DRV_CAPS_TG_CRC(ddev) \ 472c66daecSThierry Escande ((ddev)->driver_capabilities & NFC_DIGITAL_DRV_CAPS_TG_CRC) 482c66daecSThierry Escande 492c66daecSThierry Escande struct digital_data_exch { 502c66daecSThierry Escande data_exchange_cb_t cb; 512c66daecSThierry Escande void *cb_context; 522c66daecSThierry Escande }; 532c66daecSThierry Escande 5459ee2361SThierry Escande struct sk_buff *digital_skb_alloc(struct nfc_digital_dev *ddev, 5559ee2361SThierry Escande unsigned int len); 5659ee2361SThierry Escande 5759ee2361SThierry Escande int digital_send_cmd(struct nfc_digital_dev *ddev, u8 cmd_type, 581c7a4c24SThierry Escande struct sk_buff *skb, struct digital_tg_mdaa_params *params, 591c7a4c24SThierry Escande u16 timeout, nfc_digital_cmd_complete_t cmd_cb, 601c7a4c24SThierry Escande void *cb_context); 6159ee2361SThierry Escande 6259ee2361SThierry Escande int digital_in_configure_hw(struct nfc_digital_dev *ddev, int type, int param); 6359ee2361SThierry Escande static inline int digital_in_send_cmd(struct nfc_digital_dev *ddev, 6459ee2361SThierry Escande struct sk_buff *skb, u16 timeout, 6559ee2361SThierry Escande nfc_digital_cmd_complete_t cmd_cb, 6659ee2361SThierry Escande void *cb_context) 6759ee2361SThierry Escande { 681c7a4c24SThierry Escande return digital_send_cmd(ddev, DIGITAL_CMD_IN_SEND, skb, NULL, timeout, 691c7a4c24SThierry Escande cmd_cb, cb_context); 7059ee2361SThierry Escande } 7159ee2361SThierry Escande 7259ee2361SThierry Escande void digital_poll_next_tech(struct nfc_digital_dev *ddev); 7359ee2361SThierry Escande 7459ee2361SThierry Escande int digital_in_send_sens_req(struct nfc_digital_dev *ddev, u8 rf_tech); 7524734607SMark A. Greer int digital_in_send_sensb_req(struct nfc_digital_dev *ddev, u8 rf_tech); 768c0695e4SThierry Escande int digital_in_send_sensf_req(struct nfc_digital_dev *ddev, u8 rf_tech); 77a381d482SMark A. Greer int digital_in_send_iso15693_inv_req(struct nfc_digital_dev *ddev, u8 rf_tech); 7859ee2361SThierry Escande 79c813007fSThierry Escande int digital_in_iso_dep_pull_sod(struct nfc_digital_dev *ddev, 80c813007fSThierry Escande struct sk_buff *skb); 81c813007fSThierry Escande int digital_in_iso_dep_push_sod(struct nfc_digital_dev *ddev, 82c813007fSThierry Escande struct sk_buff *skb); 83c813007fSThierry Escande 842c66daecSThierry Escande int digital_target_found(struct nfc_digital_dev *ddev, 852c66daecSThierry Escande struct nfc_target *target, u8 protocol); 862c66daecSThierry Escande 872c66daecSThierry Escande int digital_in_recv_mifare_res(struct sk_buff *resp); 882c66daecSThierry Escande 897d0911c0SThierry Escande int digital_in_send_atr_req(struct nfc_digital_dev *ddev, 907d0911c0SThierry Escande struct nfc_target *target, __u8 comm_mode, __u8 *gb, 917d0911c0SThierry Escande size_t gb_len); 927d0911c0SThierry Escande int digital_in_send_dep_req(struct nfc_digital_dev *ddev, 937d0911c0SThierry Escande struct nfc_target *target, struct sk_buff *skb, 947d0911c0SThierry Escande struct digital_data_exch *data_exch); 957d0911c0SThierry Escande 961c7a4c24SThierry Escande int digital_tg_configure_hw(struct nfc_digital_dev *ddev, int type, int param); 971c7a4c24SThierry Escande static inline int digital_tg_send_cmd(struct nfc_digital_dev *ddev, 981c7a4c24SThierry Escande struct sk_buff *skb, u16 timeout, 991c7a4c24SThierry Escande nfc_digital_cmd_complete_t cmd_cb, void *cb_context) 1001c7a4c24SThierry Escande { 1011c7a4c24SThierry Escande return digital_send_cmd(ddev, DIGITAL_CMD_TG_SEND, skb, NULL, timeout, 1021c7a4c24SThierry Escande cmd_cb, cb_context); 1031c7a4c24SThierry Escande } 1041c7a4c24SThierry Escande 1051c7a4c24SThierry Escande void digital_tg_recv_sens_req(struct nfc_digital_dev *ddev, void *arg, 1061c7a4c24SThierry Escande struct sk_buff *resp); 1071c7a4c24SThierry Escande 1081c7a4c24SThierry Escande void digital_tg_recv_sensf_req(struct nfc_digital_dev *ddev, void *arg, 1091c7a4c24SThierry Escande struct sk_buff *resp); 1101c7a4c24SThierry Escande 1111c7a4c24SThierry Escande static inline int digital_tg_listen(struct nfc_digital_dev *ddev, u16 timeout, 1121c7a4c24SThierry Escande nfc_digital_cmd_complete_t cb, void *arg) 1131c7a4c24SThierry Escande { 1141c7a4c24SThierry Escande return digital_send_cmd(ddev, DIGITAL_CMD_TG_LISTEN, NULL, NULL, 1151c7a4c24SThierry Escande timeout, cb, arg); 1161c7a4c24SThierry Escande } 1171c7a4c24SThierry Escande 1181c7a4c24SThierry Escande void digital_tg_recv_atr_req(struct nfc_digital_dev *ddev, void *arg, 1191c7a4c24SThierry Escande struct sk_buff *resp); 1201c7a4c24SThierry Escande 1211c7a4c24SThierry Escande int digital_tg_send_dep_res(struct nfc_digital_dev *ddev, struct sk_buff *skb); 1221c7a4c24SThierry Escande 1231c7a4c24SThierry Escande int digital_tg_listen_nfca(struct nfc_digital_dev *ddev, u8 rf_tech); 1241c7a4c24SThierry Escande int digital_tg_listen_nfcf(struct nfc_digital_dev *ddev, u8 rf_tech); 125bf30a67cSMark A. Greer void digital_tg_recv_md_req(struct nfc_digital_dev *ddev, void *arg, 126bf30a67cSMark A. Greer struct sk_buff *resp); 1271c7a4c24SThierry Escande 1282c66daecSThierry Escande typedef u16 (*crc_func_t)(u16, const u8 *, size_t); 1292c66daecSThierry Escande 1302c66daecSThierry Escande #define CRC_A_INIT 0x6363 1312c66daecSThierry Escande #define CRC_B_INIT 0xFFFF 1328c0695e4SThierry Escande #define CRC_F_INIT 0x0000 1332c66daecSThierry Escande 1342c66daecSThierry Escande void digital_skb_add_crc(struct sk_buff *skb, crc_func_t crc_func, u16 init, 1352c66daecSThierry Escande u8 bitwise_inv, u8 msb_first); 1362c66daecSThierry Escande 1372c66daecSThierry Escande static inline void digital_skb_add_crc_a(struct sk_buff *skb) 1382c66daecSThierry Escande { 1392c66daecSThierry Escande digital_skb_add_crc(skb, crc_ccitt, CRC_A_INIT, 0, 0); 1402c66daecSThierry Escande } 1412c66daecSThierry Escande 1422c66daecSThierry Escande static inline void digital_skb_add_crc_b(struct sk_buff *skb) 1432c66daecSThierry Escande { 1442c66daecSThierry Escande digital_skb_add_crc(skb, crc_ccitt, CRC_B_INIT, 1, 0); 1452c66daecSThierry Escande } 1462c66daecSThierry Escande 1478c0695e4SThierry Escande static inline void digital_skb_add_crc_f(struct sk_buff *skb) 1488c0695e4SThierry Escande { 1498c0695e4SThierry Escande digital_skb_add_crc(skb, crc_itu_t, CRC_F_INIT, 0, 1); 1508c0695e4SThierry Escande } 1518c0695e4SThierry Escande 1522c66daecSThierry Escande static inline void digital_skb_add_crc_none(struct sk_buff *skb) 1532c66daecSThierry Escande { 1542c66daecSThierry Escande return; 1552c66daecSThierry Escande } 1562c66daecSThierry Escande 1572c66daecSThierry Escande int digital_skb_check_crc(struct sk_buff *skb, crc_func_t crc_func, 1582c66daecSThierry Escande u16 crc_init, u8 bitwise_inv, u8 msb_first); 1592c66daecSThierry Escande 1602c66daecSThierry Escande static inline int digital_skb_check_crc_a(struct sk_buff *skb) 1612c66daecSThierry Escande { 1622c66daecSThierry Escande return digital_skb_check_crc(skb, crc_ccitt, CRC_A_INIT, 0, 0); 1632c66daecSThierry Escande } 1642c66daecSThierry Escande 1652c66daecSThierry Escande static inline int digital_skb_check_crc_b(struct sk_buff *skb) 1662c66daecSThierry Escande { 1672c66daecSThierry Escande return digital_skb_check_crc(skb, crc_ccitt, CRC_B_INIT, 1, 0); 1682c66daecSThierry Escande } 1692c66daecSThierry Escande 1708c0695e4SThierry Escande static inline int digital_skb_check_crc_f(struct sk_buff *skb) 1718c0695e4SThierry Escande { 1728c0695e4SThierry Escande return digital_skb_check_crc(skb, crc_itu_t, CRC_F_INIT, 0, 1); 1738c0695e4SThierry Escande } 1748c0695e4SThierry Escande 1752c66daecSThierry Escande static inline int digital_skb_check_crc_none(struct sk_buff *skb) 1762c66daecSThierry Escande { 1772c66daecSThierry Escande return 0; 1782c66daecSThierry Escande } 1792c66daecSThierry Escande 1804b10884eSThierry Escande #endif /* __DIGITAL_H */ 181