^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 */