xref: /openbmc/linux/net/nfc/digital.h (revision 2025cf9e)
12025cf9eSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
24b10884eSThierry Escande /*
34b10884eSThierry Escande  * NFC Digital Protocol stack
44b10884eSThierry Escande  * Copyright (c) 2013, Intel Corporation.
54b10884eSThierry Escande  */
64b10884eSThierry Escande 
74b10884eSThierry Escande #ifndef __DIGITAL_H
84b10884eSThierry Escande #define __DIGITAL_H
94b10884eSThierry Escande 
104b10884eSThierry Escande #include <net/nfc/nfc.h>
114b10884eSThierry Escande #include <net/nfc/digital.h>
124b10884eSThierry Escande 
132c66daecSThierry Escande #include <linux/crc-ccitt.h>
148c0695e4SThierry Escande #include <linux/crc-itu-t.h>
152c66daecSThierry Escande 
16c5da0e4aSSamuel Ortiz #define PROTOCOL_ERR(req) pr_err("%d: NFC Digital Protocol error: %s\n", \
17c5da0e4aSSamuel Ortiz 				 __LINE__, req)
184b10884eSThierry Escande 
1959ee2361SThierry Escande #define DIGITAL_CMD_IN_SEND        0
2059ee2361SThierry Escande #define DIGITAL_CMD_TG_SEND        1
2159ee2361SThierry Escande #define DIGITAL_CMD_TG_LISTEN      2
2259ee2361SThierry Escande #define DIGITAL_CMD_TG_LISTEN_MDAA 3
23bf30a67cSMark A. Greer #define DIGITAL_CMD_TG_LISTEN_MD   4
2459ee2361SThierry Escande 
2559ee2361SThierry Escande #define DIGITAL_MAX_HEADER_LEN 7
2659ee2361SThierry Escande #define DIGITAL_CRC_LEN        2
2759ee2361SThierry Escande 
287d0911c0SThierry Escande #define DIGITAL_SENSF_NFCID2_NFC_DEP_B1 0x01
297d0911c0SThierry Escande #define DIGITAL_SENSF_NFCID2_NFC_DEP_B2 0xFE
307d0911c0SThierry Escande 
317d0911c0SThierry Escande #define DIGITAL_SENS_RES_NFC_DEP 0x0100
327d0911c0SThierry Escande #define DIGITAL_SEL_RES_NFC_DEP  0x40
337d0911c0SThierry Escande #define DIGITAL_SENSF_FELICA_SC  0xFFFF
347d0911c0SThierry Escande 
352c66daecSThierry Escande #define DIGITAL_DRV_CAPS_IN_CRC(ddev) \
362c66daecSThierry Escande 	((ddev)->driver_capabilities & NFC_DIGITAL_DRV_CAPS_IN_CRC)
372c66daecSThierry Escande #define DIGITAL_DRV_CAPS_TG_CRC(ddev) \
382c66daecSThierry Escande 	((ddev)->driver_capabilities & NFC_DIGITAL_DRV_CAPS_TG_CRC)
392c66daecSThierry Escande 
402c66daecSThierry Escande struct digital_data_exch {
412c66daecSThierry Escande 	data_exchange_cb_t cb;
422c66daecSThierry Escande 	void *cb_context;
432c66daecSThierry Escande };
442c66daecSThierry Escande 
4559ee2361SThierry Escande struct sk_buff *digital_skb_alloc(struct nfc_digital_dev *ddev,
4659ee2361SThierry Escande 				  unsigned int len);
4759ee2361SThierry Escande 
4859ee2361SThierry Escande int digital_send_cmd(struct nfc_digital_dev *ddev, u8 cmd_type,
491c7a4c24SThierry Escande 		     struct sk_buff *skb, struct digital_tg_mdaa_params *params,
501c7a4c24SThierry Escande 		     u16 timeout, nfc_digital_cmd_complete_t cmd_cb,
511c7a4c24SThierry Escande 		     void *cb_context);
5259ee2361SThierry Escande 
5359ee2361SThierry Escande int digital_in_configure_hw(struct nfc_digital_dev *ddev, int type, int param);
digital_in_send_cmd(struct nfc_digital_dev * ddev,struct sk_buff * skb,u16 timeout,nfc_digital_cmd_complete_t cmd_cb,void * cb_context)5459ee2361SThierry Escande static inline int digital_in_send_cmd(struct nfc_digital_dev *ddev,
5559ee2361SThierry Escande 				      struct sk_buff *skb, u16 timeout,
5659ee2361SThierry Escande 				      nfc_digital_cmd_complete_t cmd_cb,
5759ee2361SThierry Escande 				      void *cb_context)
5859ee2361SThierry Escande {
591c7a4c24SThierry Escande 	return digital_send_cmd(ddev, DIGITAL_CMD_IN_SEND, skb, NULL, timeout,
601c7a4c24SThierry Escande 				cmd_cb, cb_context);
6159ee2361SThierry Escande }
6259ee2361SThierry Escande 
6359ee2361SThierry Escande void digital_poll_next_tech(struct nfc_digital_dev *ddev);
6459ee2361SThierry Escande 
6559ee2361SThierry Escande int digital_in_send_sens_req(struct nfc_digital_dev *ddev, u8 rf_tech);
6624734607SMark A. Greer int digital_in_send_sensb_req(struct nfc_digital_dev *ddev, u8 rf_tech);
678c0695e4SThierry Escande int digital_in_send_sensf_req(struct nfc_digital_dev *ddev, u8 rf_tech);
68a381d482SMark A. Greer int digital_in_send_iso15693_inv_req(struct nfc_digital_dev *ddev, u8 rf_tech);
6959ee2361SThierry Escande 
70c813007fSThierry Escande int digital_in_iso_dep_pull_sod(struct nfc_digital_dev *ddev,
71c813007fSThierry Escande 				struct sk_buff *skb);
72c813007fSThierry Escande int digital_in_iso_dep_push_sod(struct nfc_digital_dev *ddev,
73c813007fSThierry Escande 				struct sk_buff *skb);
74c813007fSThierry Escande 
752c66daecSThierry Escande int digital_target_found(struct nfc_digital_dev *ddev,
762c66daecSThierry Escande 			 struct nfc_target *target, u8 protocol);
772c66daecSThierry Escande 
782c66daecSThierry Escande int digital_in_recv_mifare_res(struct sk_buff *resp);
792c66daecSThierry Escande 
807d0911c0SThierry Escande int digital_in_send_atr_req(struct nfc_digital_dev *ddev,
817d0911c0SThierry Escande 			    struct nfc_target *target, __u8 comm_mode, __u8 *gb,
827d0911c0SThierry Escande 			    size_t gb_len);
837d0911c0SThierry Escande int digital_in_send_dep_req(struct nfc_digital_dev *ddev,
847d0911c0SThierry Escande 			    struct nfc_target *target, struct sk_buff *skb,
857d0911c0SThierry Escande 			    struct digital_data_exch *data_exch);
867d0911c0SThierry Escande 
871c7a4c24SThierry Escande int digital_tg_configure_hw(struct nfc_digital_dev *ddev, int type, int param);
digital_tg_send_cmd(struct nfc_digital_dev * ddev,struct sk_buff * skb,u16 timeout,nfc_digital_cmd_complete_t cmd_cb,void * cb_context)881c7a4c24SThierry Escande static inline int digital_tg_send_cmd(struct nfc_digital_dev *ddev,
891c7a4c24SThierry Escande 			struct sk_buff *skb, u16 timeout,
901c7a4c24SThierry Escande 			nfc_digital_cmd_complete_t cmd_cb, void *cb_context)
911c7a4c24SThierry Escande {
921c7a4c24SThierry Escande 	return digital_send_cmd(ddev, DIGITAL_CMD_TG_SEND, skb, NULL, timeout,
931c7a4c24SThierry Escande 				cmd_cb, cb_context);
941c7a4c24SThierry Escande }
951c7a4c24SThierry Escande 
961c7a4c24SThierry Escande void digital_tg_recv_sens_req(struct nfc_digital_dev *ddev, void *arg,
971c7a4c24SThierry Escande 			      struct sk_buff *resp);
981c7a4c24SThierry Escande 
991c7a4c24SThierry Escande void digital_tg_recv_sensf_req(struct nfc_digital_dev *ddev, void *arg,
1001c7a4c24SThierry Escande 			       struct sk_buff *resp);
1011c7a4c24SThierry Escande 
digital_tg_listen(struct nfc_digital_dev * ddev,u16 timeout,nfc_digital_cmd_complete_t cb,void * arg)1021c7a4c24SThierry Escande static inline int digital_tg_listen(struct nfc_digital_dev *ddev, u16 timeout,
1031c7a4c24SThierry Escande 				    nfc_digital_cmd_complete_t cb, void *arg)
1041c7a4c24SThierry Escande {
1051c7a4c24SThierry Escande 	return digital_send_cmd(ddev, DIGITAL_CMD_TG_LISTEN, NULL, NULL,
1061c7a4c24SThierry Escande 				timeout, cb, arg);
1071c7a4c24SThierry Escande }
1081c7a4c24SThierry Escande 
1091c7a4c24SThierry Escande void digital_tg_recv_atr_req(struct nfc_digital_dev *ddev, void *arg,
1101c7a4c24SThierry Escande 			     struct sk_buff *resp);
1111c7a4c24SThierry Escande 
1121c7a4c24SThierry Escande int digital_tg_send_dep_res(struct nfc_digital_dev *ddev, struct sk_buff *skb);
1131c7a4c24SThierry Escande 
1141c7a4c24SThierry Escande int digital_tg_listen_nfca(struct nfc_digital_dev *ddev, u8 rf_tech);
1151c7a4c24SThierry Escande int digital_tg_listen_nfcf(struct nfc_digital_dev *ddev, u8 rf_tech);
116bf30a67cSMark A. Greer void digital_tg_recv_md_req(struct nfc_digital_dev *ddev, void *arg,
117bf30a67cSMark A. Greer 			    struct sk_buff *resp);
1181c7a4c24SThierry Escande 
1192c66daecSThierry Escande typedef u16 (*crc_func_t)(u16, const u8 *, size_t);
1202c66daecSThierry Escande 
1212c66daecSThierry Escande #define CRC_A_INIT 0x6363
1222c66daecSThierry Escande #define CRC_B_INIT 0xFFFF
1238c0695e4SThierry Escande #define CRC_F_INIT 0x0000
1242c66daecSThierry Escande 
1252c66daecSThierry Escande void digital_skb_add_crc(struct sk_buff *skb, crc_func_t crc_func, u16 init,
1262c66daecSThierry Escande 			 u8 bitwise_inv, u8 msb_first);
1272c66daecSThierry Escande 
digital_skb_add_crc_a(struct sk_buff * skb)1282c66daecSThierry Escande static inline void digital_skb_add_crc_a(struct sk_buff *skb)
1292c66daecSThierry Escande {
1302c66daecSThierry Escande 	digital_skb_add_crc(skb, crc_ccitt, CRC_A_INIT, 0, 0);
1312c66daecSThierry Escande }
1322c66daecSThierry Escande 
digital_skb_add_crc_b(struct sk_buff * skb)1332c66daecSThierry Escande static inline void digital_skb_add_crc_b(struct sk_buff *skb)
1342c66daecSThierry Escande {
1352c66daecSThierry Escande 	digital_skb_add_crc(skb, crc_ccitt, CRC_B_INIT, 1, 0);
1362c66daecSThierry Escande }
1372c66daecSThierry Escande 
digital_skb_add_crc_f(struct sk_buff * skb)1388c0695e4SThierry Escande static inline void digital_skb_add_crc_f(struct sk_buff *skb)
1398c0695e4SThierry Escande {
1408c0695e4SThierry Escande 	digital_skb_add_crc(skb, crc_itu_t, CRC_F_INIT, 0, 1);
1418c0695e4SThierry Escande }
1428c0695e4SThierry Escande 
digital_skb_add_crc_none(struct sk_buff * skb)1432c66daecSThierry Escande static inline void digital_skb_add_crc_none(struct sk_buff *skb)
1442c66daecSThierry Escande {
1452c66daecSThierry Escande 	return;
1462c66daecSThierry Escande }
1472c66daecSThierry Escande 
1482c66daecSThierry Escande int digital_skb_check_crc(struct sk_buff *skb, crc_func_t crc_func,
1492c66daecSThierry Escande 			  u16 crc_init, u8 bitwise_inv, u8 msb_first);
1502c66daecSThierry Escande 
digital_skb_check_crc_a(struct sk_buff * skb)1512c66daecSThierry Escande static inline int digital_skb_check_crc_a(struct sk_buff *skb)
1522c66daecSThierry Escande {
1532c66daecSThierry Escande 	return digital_skb_check_crc(skb, crc_ccitt, CRC_A_INIT, 0, 0);
1542c66daecSThierry Escande }
1552c66daecSThierry Escande 
digital_skb_check_crc_b(struct sk_buff * skb)1562c66daecSThierry Escande static inline int digital_skb_check_crc_b(struct sk_buff *skb)
1572c66daecSThierry Escande {
1582c66daecSThierry Escande 	return digital_skb_check_crc(skb, crc_ccitt, CRC_B_INIT, 1, 0);
1592c66daecSThierry Escande }
1602c66daecSThierry Escande 
digital_skb_check_crc_f(struct sk_buff * skb)1618c0695e4SThierry Escande static inline int digital_skb_check_crc_f(struct sk_buff *skb)
1628c0695e4SThierry Escande {
1638c0695e4SThierry Escande 	return digital_skb_check_crc(skb, crc_itu_t, CRC_F_INIT, 0, 1);
1648c0695e4SThierry Escande }
1658c0695e4SThierry Escande 
digital_skb_check_crc_none(struct sk_buff * skb)1662c66daecSThierry Escande static inline int digital_skb_check_crc_none(struct sk_buff *skb)
1672c66daecSThierry Escande {
1682c66daecSThierry Escande 	return 0;
1692c66daecSThierry Escande }
1702c66daecSThierry Escande 
1714b10884eSThierry Escande #endif /* __DIGITAL_H */
172