Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-only */
0002 /*
0003  * NFC Digital Protocol stack
0004  * Copyright (c) 2013, Intel Corporation.
0005  */
0006 
0007 #ifndef __DIGITAL_H
0008 #define __DIGITAL_H
0009 
0010 #include <net/nfc/nfc.h>
0011 #include <net/nfc/digital.h>
0012 
0013 #include <linux/crc-ccitt.h>
0014 #include <linux/crc-itu-t.h>
0015 
0016 #define PROTOCOL_ERR(req) pr_err("%d: NFC Digital Protocol error: %s\n", \
0017                  __LINE__, req)
0018 
0019 #define DIGITAL_CMD_IN_SEND        0
0020 #define DIGITAL_CMD_TG_SEND        1
0021 #define DIGITAL_CMD_TG_LISTEN      2
0022 #define DIGITAL_CMD_TG_LISTEN_MDAA 3
0023 #define DIGITAL_CMD_TG_LISTEN_MD   4
0024 
0025 #define DIGITAL_MAX_HEADER_LEN 7
0026 #define DIGITAL_CRC_LEN        2
0027 
0028 #define DIGITAL_SENSF_NFCID2_NFC_DEP_B1 0x01
0029 #define DIGITAL_SENSF_NFCID2_NFC_DEP_B2 0xFE
0030 
0031 #define DIGITAL_SENS_RES_NFC_DEP 0x0100
0032 #define DIGITAL_SEL_RES_NFC_DEP  0x40
0033 #define DIGITAL_SENSF_FELICA_SC  0xFFFF
0034 
0035 #define DIGITAL_DRV_CAPS_IN_CRC(ddev) \
0036     ((ddev)->driver_capabilities & NFC_DIGITAL_DRV_CAPS_IN_CRC)
0037 #define DIGITAL_DRV_CAPS_TG_CRC(ddev) \
0038     ((ddev)->driver_capabilities & NFC_DIGITAL_DRV_CAPS_TG_CRC)
0039 
0040 struct digital_data_exch {
0041     data_exchange_cb_t cb;
0042     void *cb_context;
0043 };
0044 
0045 struct sk_buff *digital_skb_alloc(struct nfc_digital_dev *ddev,
0046                   unsigned int len);
0047 
0048 int digital_send_cmd(struct nfc_digital_dev *ddev, u8 cmd_type,
0049              struct sk_buff *skb, struct digital_tg_mdaa_params *params,
0050              u16 timeout, nfc_digital_cmd_complete_t cmd_cb,
0051              void *cb_context);
0052 
0053 int digital_in_configure_hw(struct nfc_digital_dev *ddev, int type, int param);
0054 static inline int digital_in_send_cmd(struct nfc_digital_dev *ddev,
0055                       struct sk_buff *skb, u16 timeout,
0056                       nfc_digital_cmd_complete_t cmd_cb,
0057                       void *cb_context)
0058 {
0059     return digital_send_cmd(ddev, DIGITAL_CMD_IN_SEND, skb, NULL, timeout,
0060                 cmd_cb, cb_context);
0061 }
0062 
0063 void digital_poll_next_tech(struct nfc_digital_dev *ddev);
0064 
0065 int digital_in_send_sens_req(struct nfc_digital_dev *ddev, u8 rf_tech);
0066 int digital_in_send_sensb_req(struct nfc_digital_dev *ddev, u8 rf_tech);
0067 int digital_in_send_sensf_req(struct nfc_digital_dev *ddev, u8 rf_tech);
0068 int digital_in_send_iso15693_inv_req(struct nfc_digital_dev *ddev, u8 rf_tech);
0069 
0070 int digital_in_iso_dep_pull_sod(struct nfc_digital_dev *ddev,
0071                 struct sk_buff *skb);
0072 int digital_in_iso_dep_push_sod(struct nfc_digital_dev *ddev,
0073                 struct sk_buff *skb);
0074 
0075 int digital_target_found(struct nfc_digital_dev *ddev,
0076              struct nfc_target *target, u8 protocol);
0077 
0078 int digital_in_recv_mifare_res(struct sk_buff *resp);
0079 
0080 int digital_in_send_atr_req(struct nfc_digital_dev *ddev,
0081                 struct nfc_target *target, __u8 comm_mode, __u8 *gb,
0082                 size_t gb_len);
0083 int digital_in_send_dep_req(struct nfc_digital_dev *ddev,
0084                 struct nfc_target *target, struct sk_buff *skb,
0085                 struct digital_data_exch *data_exch);
0086 
0087 int digital_tg_configure_hw(struct nfc_digital_dev *ddev, int type, int param);
0088 static inline int digital_tg_send_cmd(struct nfc_digital_dev *ddev,
0089             struct sk_buff *skb, u16 timeout,
0090             nfc_digital_cmd_complete_t cmd_cb, void *cb_context)
0091 {
0092     return digital_send_cmd(ddev, DIGITAL_CMD_TG_SEND, skb, NULL, timeout,
0093                 cmd_cb, cb_context);
0094 }
0095 
0096 void digital_tg_recv_sens_req(struct nfc_digital_dev *ddev, void *arg,
0097                   struct sk_buff *resp);
0098 
0099 void digital_tg_recv_sensf_req(struct nfc_digital_dev *ddev, void *arg,
0100                    struct sk_buff *resp);
0101 
0102 static inline int digital_tg_listen(struct nfc_digital_dev *ddev, u16 timeout,
0103                     nfc_digital_cmd_complete_t cb, void *arg)
0104 {
0105     return digital_send_cmd(ddev, DIGITAL_CMD_TG_LISTEN, NULL, NULL,
0106                 timeout, cb, arg);
0107 }
0108 
0109 void digital_tg_recv_atr_req(struct nfc_digital_dev *ddev, void *arg,
0110                  struct sk_buff *resp);
0111 
0112 int digital_tg_send_dep_res(struct nfc_digital_dev *ddev, struct sk_buff *skb);
0113 
0114 int digital_tg_listen_nfca(struct nfc_digital_dev *ddev, u8 rf_tech);
0115 int digital_tg_listen_nfcf(struct nfc_digital_dev *ddev, u8 rf_tech);
0116 void digital_tg_recv_md_req(struct nfc_digital_dev *ddev, void *arg,
0117                 struct sk_buff *resp);
0118 
0119 typedef u16 (*crc_func_t)(u16, const u8 *, size_t);
0120 
0121 #define CRC_A_INIT 0x6363
0122 #define CRC_B_INIT 0xFFFF
0123 #define CRC_F_INIT 0x0000
0124 
0125 void digital_skb_add_crc(struct sk_buff *skb, crc_func_t crc_func, u16 init,
0126              u8 bitwise_inv, u8 msb_first);
0127 
0128 static inline void digital_skb_add_crc_a(struct sk_buff *skb)
0129 {
0130     digital_skb_add_crc(skb, crc_ccitt, CRC_A_INIT, 0, 0);
0131 }
0132 
0133 static inline void digital_skb_add_crc_b(struct sk_buff *skb)
0134 {
0135     digital_skb_add_crc(skb, crc_ccitt, CRC_B_INIT, 1, 0);
0136 }
0137 
0138 static inline void digital_skb_add_crc_f(struct sk_buff *skb)
0139 {
0140     digital_skb_add_crc(skb, crc_itu_t, CRC_F_INIT, 0, 1);
0141 }
0142 
0143 static inline void digital_skb_add_crc_none(struct sk_buff *skb)
0144 {
0145     return;
0146 }
0147 
0148 int digital_skb_check_crc(struct sk_buff *skb, crc_func_t crc_func,
0149               u16 crc_init, u8 bitwise_inv, u8 msb_first);
0150 
0151 static inline int digital_skb_check_crc_a(struct sk_buff *skb)
0152 {
0153     return digital_skb_check_crc(skb, crc_ccitt, CRC_A_INIT, 0, 0);
0154 }
0155 
0156 static inline int digital_skb_check_crc_b(struct sk_buff *skb)
0157 {
0158     return digital_skb_check_crc(skb, crc_ccitt, CRC_B_INIT, 1, 0);
0159 }
0160 
0161 static inline int digital_skb_check_crc_f(struct sk_buff *skb)
0162 {
0163     return digital_skb_check_crc(skb, crc_itu_t, CRC_F_INIT, 0, 1);
0164 }
0165 
0166 static inline int digital_skb_check_crc_none(struct sk_buff *skb)
0167 {
0168     return 0;
0169 }
0170 
0171 #endif /* __DIGITAL_H */