xref: /openbmc/linux/net/nfc/digital.h (revision bf30a67c)
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