Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) /* SPDX-License-Identifier: GPL-2.0-only */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3)  * NFC Digital Protocol stack
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4)  * Copyright (c) 2013, Intel Corporation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7) #ifndef __DIGITAL_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8) #define __DIGITAL_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10) #include <net/nfc/nfc.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11) #include <net/nfc/digital.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13) #include <linux/crc-ccitt.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) #include <linux/crc-itu-t.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16) #define PROTOCOL_ERR(req) pr_err("%d: NFC Digital Protocol error: %s\n", \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17) 				 __LINE__, req)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19) #define DIGITAL_CMD_IN_SEND        0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20) #define DIGITAL_CMD_TG_SEND        1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) #define DIGITAL_CMD_TG_LISTEN      2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) #define DIGITAL_CMD_TG_LISTEN_MDAA 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) #define DIGITAL_CMD_TG_LISTEN_MD   4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) #define DIGITAL_MAX_HEADER_LEN 7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) #define DIGITAL_CRC_LEN        2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28) #define DIGITAL_SENSF_NFCID2_NFC_DEP_B1 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29) #define DIGITAL_SENSF_NFCID2_NFC_DEP_B2 0xFE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) #define DIGITAL_SENS_RES_NFC_DEP 0x0100
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) #define DIGITAL_SEL_RES_NFC_DEP  0x40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) #define DIGITAL_SENSF_FELICA_SC  0xFFFF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) #define DIGITAL_DRV_CAPS_IN_CRC(ddev) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) 	((ddev)->driver_capabilities & NFC_DIGITAL_DRV_CAPS_IN_CRC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37) #define DIGITAL_DRV_CAPS_TG_CRC(ddev) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) 	((ddev)->driver_capabilities & NFC_DIGITAL_DRV_CAPS_TG_CRC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) struct digital_data_exch {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) 	data_exchange_cb_t cb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) 	void *cb_context;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) struct sk_buff *digital_skb_alloc(struct nfc_digital_dev *ddev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) 				  unsigned int len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) int digital_send_cmd(struct nfc_digital_dev *ddev, u8 cmd_type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) 		     struct sk_buff *skb, struct digital_tg_mdaa_params *params,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) 		     u16 timeout, nfc_digital_cmd_complete_t cmd_cb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) 		     void *cb_context);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) int digital_in_configure_hw(struct nfc_digital_dev *ddev, int type, int param);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) static inline int digital_in_send_cmd(struct nfc_digital_dev *ddev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) 				      struct sk_buff *skb, u16 timeout,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) 				      nfc_digital_cmd_complete_t cmd_cb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) 				      void *cb_context)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) 	return digital_send_cmd(ddev, DIGITAL_CMD_IN_SEND, skb, NULL, timeout,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) 				cmd_cb, cb_context);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) void digital_poll_next_tech(struct nfc_digital_dev *ddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) int digital_in_send_sens_req(struct nfc_digital_dev *ddev, u8 rf_tech);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) int digital_in_send_sensb_req(struct nfc_digital_dev *ddev, u8 rf_tech);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) int digital_in_send_sensf_req(struct nfc_digital_dev *ddev, u8 rf_tech);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) int digital_in_send_iso15693_inv_req(struct nfc_digital_dev *ddev, u8 rf_tech);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) int digital_in_iso_dep_pull_sod(struct nfc_digital_dev *ddev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) 				struct sk_buff *skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) int digital_in_iso_dep_push_sod(struct nfc_digital_dev *ddev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) 				struct sk_buff *skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) int digital_target_found(struct nfc_digital_dev *ddev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) 			 struct nfc_target *target, u8 protocol);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) int digital_in_recv_mifare_res(struct sk_buff *resp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) int digital_in_send_atr_req(struct nfc_digital_dev *ddev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) 			    struct nfc_target *target, __u8 comm_mode, __u8 *gb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) 			    size_t gb_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) int digital_in_send_dep_req(struct nfc_digital_dev *ddev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) 			    struct nfc_target *target, struct sk_buff *skb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) 			    struct digital_data_exch *data_exch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) int digital_tg_configure_hw(struct nfc_digital_dev *ddev, int type, int param);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) static inline int digital_tg_send_cmd(struct nfc_digital_dev *ddev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) 			struct sk_buff *skb, u16 timeout,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) 			nfc_digital_cmd_complete_t cmd_cb, void *cb_context)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) 	return digital_send_cmd(ddev, DIGITAL_CMD_TG_SEND, skb, NULL, timeout,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) 				cmd_cb, cb_context);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) void digital_tg_recv_sens_req(struct nfc_digital_dev *ddev, void *arg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) 			      struct sk_buff *resp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) void digital_tg_recv_sensf_req(struct nfc_digital_dev *ddev, void *arg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) 			       struct sk_buff *resp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) static inline int digital_tg_listen(struct nfc_digital_dev *ddev, u16 timeout,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) 				    nfc_digital_cmd_complete_t cb, void *arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) 	return digital_send_cmd(ddev, DIGITAL_CMD_TG_LISTEN, NULL, NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) 				timeout, cb, arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) void digital_tg_recv_atr_req(struct nfc_digital_dev *ddev, void *arg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) 			     struct sk_buff *resp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) int digital_tg_send_dep_res(struct nfc_digital_dev *ddev, struct sk_buff *skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) int digital_tg_listen_nfca(struct nfc_digital_dev *ddev, u8 rf_tech);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) int digital_tg_listen_nfcf(struct nfc_digital_dev *ddev, u8 rf_tech);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) void digital_tg_recv_md_req(struct nfc_digital_dev *ddev, void *arg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) 			    struct sk_buff *resp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) typedef u16 (*crc_func_t)(u16, const u8 *, size_t);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) #define CRC_A_INIT 0x6363
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) #define CRC_B_INIT 0xFFFF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) #define CRC_F_INIT 0x0000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) void digital_skb_add_crc(struct sk_buff *skb, crc_func_t crc_func, u16 init,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) 			 u8 bitwise_inv, u8 msb_first);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) static inline void digital_skb_add_crc_a(struct sk_buff *skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) 	digital_skb_add_crc(skb, crc_ccitt, CRC_A_INIT, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) static inline void digital_skb_add_crc_b(struct sk_buff *skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) 	digital_skb_add_crc(skb, crc_ccitt, CRC_B_INIT, 1, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) static inline void digital_skb_add_crc_f(struct sk_buff *skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) 	digital_skb_add_crc(skb, crc_itu_t, CRC_F_INIT, 0, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) static inline void digital_skb_add_crc_none(struct sk_buff *skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) 	return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) int digital_skb_check_crc(struct sk_buff *skb, crc_func_t crc_func,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) 			  u16 crc_init, u8 bitwise_inv, u8 msb_first);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) static inline int digital_skb_check_crc_a(struct sk_buff *skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) 	return digital_skb_check_crc(skb, crc_ccitt, CRC_A_INIT, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) static inline int digital_skb_check_crc_b(struct sk_buff *skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) 	return digital_skb_check_crc(skb, crc_ccitt, CRC_B_INIT, 1, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) static inline int digital_skb_check_crc_f(struct sk_buff *skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) 	return digital_skb_check_crc(skb, crc_itu_t, CRC_F_INIT, 0, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) static inline int digital_skb_check_crc_none(struct sk_buff *skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) #endif /* __DIGITAL_H */