1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /* 3 * NFC Digital Protocol stack 4 * Copyright (c) 2013, Intel Corporation. 5 */ 6 7 #ifndef __NFC_DIGITAL_H 8 #define __NFC_DIGITAL_H 9 10 #include <linux/skbuff.h> 11 #include <net/nfc/nfc.h> 12 13 /** 14 * Configuration types for in_configure_hw and tg_configure_hw. 15 */ 16 enum { 17 NFC_DIGITAL_CONFIG_RF_TECH = 0, 18 NFC_DIGITAL_CONFIG_FRAMING, 19 }; 20 21 /** 22 * RF technology values passed as param argument to in_configure_hw and 23 * tg_configure_hw for NFC_DIGITAL_CONFIG_RF_TECH configuration type. 24 */ 25 enum { 26 NFC_DIGITAL_RF_TECH_106A = 0, 27 NFC_DIGITAL_RF_TECH_212F, 28 NFC_DIGITAL_RF_TECH_424F, 29 NFC_DIGITAL_RF_TECH_ISO15693, 30 NFC_DIGITAL_RF_TECH_106B, 31 32 NFC_DIGITAL_RF_TECH_LAST, 33 }; 34 35 /** 36 * Framing configuration passed as param argument to in_configure_hw and 37 * tg_configure_hw for NFC_DIGITAL_CONFIG_FRAMING configuration type. 38 */ 39 enum { 40 NFC_DIGITAL_FRAMING_NFCA_SHORT = 0, 41 NFC_DIGITAL_FRAMING_NFCA_STANDARD, 42 NFC_DIGITAL_FRAMING_NFCA_STANDARD_WITH_CRC_A, 43 NFC_DIGITAL_FRAMING_NFCA_ANTICOL_COMPLETE, 44 45 NFC_DIGITAL_FRAMING_NFCA_T1T, 46 NFC_DIGITAL_FRAMING_NFCA_T2T, 47 NFC_DIGITAL_FRAMING_NFCA_T4T, 48 NFC_DIGITAL_FRAMING_NFCA_NFC_DEP, 49 50 NFC_DIGITAL_FRAMING_NFCF, 51 NFC_DIGITAL_FRAMING_NFCF_T3T, 52 NFC_DIGITAL_FRAMING_NFCF_NFC_DEP, 53 NFC_DIGITAL_FRAMING_NFC_DEP_ACTIVATED, 54 55 NFC_DIGITAL_FRAMING_ISO15693_INVENTORY, 56 NFC_DIGITAL_FRAMING_ISO15693_T5T, 57 58 NFC_DIGITAL_FRAMING_NFCB, 59 NFC_DIGITAL_FRAMING_NFCB_T4T, 60 61 NFC_DIGITAL_FRAMING_LAST, 62 }; 63 64 #define DIGITAL_MDAA_NFCID1_SIZE 3 65 66 struct digital_tg_mdaa_params { 67 u16 sens_res; 68 u8 nfcid1[DIGITAL_MDAA_NFCID1_SIZE]; 69 u8 sel_res; 70 71 u8 nfcid2[NFC_NFCID2_MAXSIZE]; 72 u16 sc; 73 }; 74 75 struct nfc_digital_dev; 76 77 /** 78 * nfc_digital_cmd_complete_t - Definition of command result callback 79 * 80 * @ddev: nfc_digital_device ref 81 * @arg: user data 82 * @resp: response data 83 * 84 * resp pointer can be an error code and will be checked with IS_ERR() macro. 85 * The callback is responsible for freeing resp sk_buff. 86 */ 87 typedef void (*nfc_digital_cmd_complete_t)(struct nfc_digital_dev *ddev, 88 void *arg, struct sk_buff *resp); 89 90 /** 91 * Device side NFC Digital operations 92 * 93 * Initiator mode: 94 * @in_configure_hw: Hardware configuration for RF technology and communication 95 * framing in initiator mode. This is a synchronous function. 96 * @in_send_cmd: Initiator mode data exchange using RF technology and framing 97 * previously set with in_configure_hw. The peer response is returned 98 * through callback cb. If an io error occurs or the peer didn't reply 99 * within the specified timeout (ms), the error code is passed back through 100 * the resp pointer. This is an asynchronous function. 101 * 102 * Target mode: Only NFC-DEP protocol is supported in target mode. 103 * @tg_configure_hw: Hardware configuration for RF technology and communication 104 * framing in target mode. This is a synchronous function. 105 * @tg_send_cmd: Target mode data exchange using RF technology and framing 106 * previously set with tg_configure_hw. The peer next command is returned 107 * through callback cb. If an io error occurs or the peer didn't reply 108 * within the specified timeout (ms), the error code is passed back through 109 * the resp pointer. This is an asynchronous function. 110 * @tg_listen: Put the device in listen mode waiting for data from the peer 111 * device. This is an asynchronous function. 112 * @tg_listen_mdaa: If supported, put the device in automatic listen mode with 113 * mode detection and automatic anti-collision. In this mode, the device 114 * automatically detects the RF technology and executes the anti-collision 115 * detection using the command responses specified in mdaa_params. The 116 * mdaa_params structure contains SENS_RES, NFCID1, and SEL_RES for 106A RF 117 * tech. NFCID2 and system code (sc) for 212F and 424F. The driver returns 118 * the NFC-DEP ATR_REQ command through cb. The digital stack deducts the RF 119 * tech by analyzing the SoD of the frame containing the ATR_REQ command. 120 * This is an asynchronous function. 121 * @tg_listen_md: If supported, put the device in automatic listen mode with 122 * mode detection but without automatic anti-collision. In this mode, the 123 * device automatically detects the RF technology. What the actual 124 * RF technology is can be retrieved by calling @tg_get_rf_tech. 125 * The digital stack will then perform the appropriate anti-collision 126 * sequence. This is an asynchronous function. 127 * @tg_get_rf_tech: Required when @tg_listen_md is supported, unused otherwise. 128 * Return the RF Technology that was detected by the @tg_listen_md call. 129 * This is a synchronous function. 130 * 131 * @switch_rf: Turns device radio on or off. The stack does not call explicitly 132 * switch_rf to turn the radio on. A call to in|tg_configure_hw must turn 133 * the device radio on. 134 * @abort_cmd: Discard the last sent command. 135 * 136 * Notes: Asynchronous functions have a timeout parameter. It is the driver 137 * responsibility to call the digital stack back through the 138 * nfc_digital_cmd_complete_t callback when no RF respsonse has been 139 * received within the specified time (in milliseconds). In that case the 140 * driver must set the resp sk_buff to ERR_PTR(-ETIMEDOUT). 141 * Since the digital stack serializes commands to be sent, it's mandatory 142 * for the driver to handle the timeout correctly. Otherwise the stack 143 * would not be able to send new commands, waiting for the reply of the 144 * current one. 145 */ 146 struct nfc_digital_ops { 147 int (*in_configure_hw)(struct nfc_digital_dev *ddev, int type, 148 int param); 149 int (*in_send_cmd)(struct nfc_digital_dev *ddev, struct sk_buff *skb, 150 u16 timeout, nfc_digital_cmd_complete_t cb, 151 void *arg); 152 153 int (*tg_configure_hw)(struct nfc_digital_dev *ddev, int type, 154 int param); 155 int (*tg_send_cmd)(struct nfc_digital_dev *ddev, struct sk_buff *skb, 156 u16 timeout, nfc_digital_cmd_complete_t cb, 157 void *arg); 158 int (*tg_listen)(struct nfc_digital_dev *ddev, u16 timeout, 159 nfc_digital_cmd_complete_t cb, void *arg); 160 int (*tg_listen_mdaa)(struct nfc_digital_dev *ddev, 161 struct digital_tg_mdaa_params *mdaa_params, 162 u16 timeout, nfc_digital_cmd_complete_t cb, 163 void *arg); 164 int (*tg_listen_md)(struct nfc_digital_dev *ddev, u16 timeout, 165 nfc_digital_cmd_complete_t cb, void *arg); 166 int (*tg_get_rf_tech)(struct nfc_digital_dev *ddev, u8 *rf_tech); 167 168 int (*switch_rf)(struct nfc_digital_dev *ddev, bool on); 169 void (*abort_cmd)(struct nfc_digital_dev *ddev); 170 }; 171 172 #define NFC_DIGITAL_POLL_MODE_COUNT_MAX 6 /* 106A, 212F, and 424F in & tg */ 173 174 typedef int (*digital_poll_t)(struct nfc_digital_dev *ddev, u8 rf_tech); 175 176 struct digital_poll_tech { 177 u8 rf_tech; 178 digital_poll_t poll_func; 179 }; 180 181 /** 182 * Driver capabilities - bit mask made of the following values 183 * 184 * @NFC_DIGITAL_DRV_CAPS_IN_CRC: The driver handles CRC calculation in initiator 185 * mode. 186 * @NFC_DIGITAL_DRV_CAPS_TG_CRC: The driver handles CRC calculation in target 187 * mode. 188 */ 189 #define NFC_DIGITAL_DRV_CAPS_IN_CRC 0x0001 190 #define NFC_DIGITAL_DRV_CAPS_TG_CRC 0x0002 191 192 struct nfc_digital_dev { 193 struct nfc_dev *nfc_dev; 194 const struct nfc_digital_ops *ops; 195 196 u32 protocols; 197 198 int tx_headroom; 199 int tx_tailroom; 200 201 u32 driver_capabilities; 202 void *driver_data; 203 204 struct digital_poll_tech poll_techs[NFC_DIGITAL_POLL_MODE_COUNT_MAX]; 205 u8 poll_tech_count; 206 u8 poll_tech_index; 207 struct mutex poll_lock; 208 209 struct work_struct cmd_work; 210 struct work_struct cmd_complete_work; 211 struct list_head cmd_queue; 212 struct mutex cmd_lock; 213 214 struct delayed_work poll_work; 215 216 u8 curr_protocol; 217 u8 curr_rf_tech; 218 u8 curr_nfc_dep_pni; 219 u8 did; 220 u16 dep_rwt; 221 222 u8 local_payload_max; 223 u8 remote_payload_max; 224 225 struct sk_buff *chaining_skb; 226 struct digital_data_exch *data_exch; 227 228 int atn_count; 229 int nack_count; 230 231 struct sk_buff *saved_skb; 232 233 u16 target_fsc; 234 235 int (*skb_check_crc)(struct sk_buff *skb); 236 void (*skb_add_crc)(struct sk_buff *skb); 237 }; 238 239 struct nfc_digital_dev *nfc_digital_allocate_device(const struct nfc_digital_ops *ops, 240 __u32 supported_protocols, 241 __u32 driver_capabilities, 242 int tx_headroom, 243 int tx_tailroom); 244 void nfc_digital_free_device(struct nfc_digital_dev *ndev); 245 int nfc_digital_register_device(struct nfc_digital_dev *ndev); 246 void nfc_digital_unregister_device(struct nfc_digital_dev *ndev); 247 248 static inline void nfc_digital_set_parent_dev(struct nfc_digital_dev *ndev, 249 struct device *dev) 250 { 251 nfc_set_parent_dev(ndev->nfc_dev, dev); 252 } 253 254 static inline void nfc_digital_set_drvdata(struct nfc_digital_dev *dev, 255 void *data) 256 { 257 dev->driver_data = data; 258 } 259 260 static inline void *nfc_digital_get_drvdata(struct nfc_digital_dev *dev) 261 { 262 return dev->driver_data; 263 } 264 265 #endif /* __NFC_DIGITAL_H */ 266
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.