| 1 |
|
| 2 | |
| 3 | * Copyright (C) 2011 Instituto Nokia de Tecnologia
|
| 4 | * Copyright (C) 2014 Marvell International Ltd.
|
| 5 | *
|
| 6 | * Authors:
|
| 7 | * Lauro Ramos Venancio <[email protected]>
|
| 8 | * Aloisio Almeida Jr <[email protected]>
|
| 9 |
|
| 10 |
|
| 11 | #ifndef __NET_NFC_H
|
| 12 | #define __NET_NFC_H
|
| 13 |
|
| 14 | #include <linux/nfc.h>
|
| 15 | #include <linux/device.h>
|
| 16 | #include <linux/skbuff.h>
|
| 17 |
|
| 18 | #define nfc_dbg(dev, fmt, ...) dev_dbg((dev), "NFC: " fmt, ##__VA_ARGS__)
|
| 19 | #define nfc_info(dev, fmt, ...) dev_info((dev), "NFC: " fmt, ##__VA_ARGS__)
|
| 20 | #define nfc_err(dev, fmt, ...) dev_err((dev), "NFC: " fmt, ##__VA_ARGS__)
|
| 21 |
|
| 22 | struct nfc_phy_ops {
|
| 23 | int (*write)(void *dev_id, struct sk_buff *skb);
|
| 24 | int (*enable)(void *dev_id);
|
| 25 | void (*disable)(void *dev_id);
|
| 26 | };
|
| 27 |
|
| 28 | struct nfc_dev;
|
| 29 |
|
| 30 | |
| 31 | * data_exchange_cb_t - Definition of nfc_data_exchange callback
|
| 32 | *
|
| 33 | * @context: nfc_data_exchange cb_context parameter
|
| 34 | * @skb: response data
|
| 35 | * @err: If an error has occurred during data exchange, it is the
|
| 36 | * error number. Zero means no error.
|
| 37 | *
|
| 38 | * When a rx or tx package is lost or corrupted or the target gets out
|
| 39 | * of the operating field, err is -EIO.
|
| 40 |
|
| 41 | typedef void (*data_exchange_cb_t)(void *context, struct sk_buff *skb,
|
| 42 | int err);
|
| 43 |
|
| 44 | typedef void (*se_io_cb_t)(void *context, u8 *apdu, size_t apdu_len, int err);
|
| 45 |
|
| 46 | struct nfc_target;
|
| 47 |
|
| 48 | struct nfc_ops {
|
| 49 | int (*dev_up)(struct nfc_dev *dev);
|
| 50 | int (*dev_down)(struct nfc_dev *dev);
|
| 51 | int (*start_poll)(struct nfc_dev *dev,
|
| 52 | u32 im_protocols, u32 tm_protocols);
|
| 53 | void (*stop_poll)(struct nfc_dev *dev);
|
| 54 | int (*dep_link_up)(struct nfc_dev *dev, struct nfc_target *target,
|
| 55 | u8 comm_mode, u8 *gb, size_t gb_len);
|
| 56 | int (*dep_link_down)(struct nfc_dev *dev);
|
| 57 | int (*activate_target)(struct nfc_dev *dev, struct nfc_target *target,
|
| 58 | u32 protocol);
|
| 59 | void (*deactivate_target)(struct nfc_dev *dev,
|
| 60 | struct nfc_target *target, u8 mode);
|
| 61 | int (*im_transceive)(struct nfc_dev *dev, struct nfc_target *target,
|
| 62 | struct sk_buff *skb, data_exchange_cb_t cb,
|
| 63 | void *cb_context);
|
| 64 | int (*tm_send)(struct nfc_dev *dev, struct sk_buff *skb);
|
| 65 | int (*check_presence)(struct nfc_dev *dev, struct nfc_target *target);
|
| 66 | int (*fw_download)(struct nfc_dev *dev, const char *firmware_name);
|
| 67 |
|
| 68 |
|
| 69 | int (*discover_se)(struct nfc_dev *dev);
|
| 70 | int (*enable_se)(struct nfc_dev *dev, u32 se_idx);
|
| 71 | int (*disable_se)(struct nfc_dev *dev, u32 se_idx);
|
| 72 | int (*se_io) (struct nfc_dev *dev, u32 se_idx,
|
| 73 | u8 *apdu, size_t apdu_length,
|
| 74 | se_io_cb_t cb, void *cb_context);
|
| 75 | };
|
| 76 |
|
| 77 | #define NFC_TARGET_IDX_ANY -1
|
| 78 | #define NFC_MAX_GT_LEN 48
|
| 79 | #define NFC_ATR_RES_GT_OFFSET 15
|
| 80 | #define NFC_ATR_REQ_GT_OFFSET 14
|
| 81 |
|
| 82 | |
| 83 | * struct nfc_target - NFC target description
|
| 84 | *
|
| 85 | * @sens_res: 2 bytes describing the target SENS_RES response, if the target
|
| 86 | * is a type A one. The %sens_res most significant byte must be byte 2
|
| 87 | * as described by the NFC Forum digital specification (i.e. the platform
|
| 88 | * configuration one) while %sens_res least significant byte is byte 1.
|
| 89 | * @ats_len: length of Answer To Select in bytes
|
| 90 | * @ats: Answer To Select returned by an ISO 14443 Type A target upon activation
|
| 91 |
|
| 92 | struct nfc_target {
|
| 93 | u32 idx;
|
| 94 | u32 supported_protocols;
|
| 95 | u16 sens_res;
|
| 96 | u8 sel_res;
|
| 97 | u8 nfcid1_len;
|
| 98 | u8 nfcid1[NFC_NFCID1_MAXSIZE];
|
| 99 | u8 nfcid2_len;
|
| 100 | u8 nfcid2[NFC_NFCID2_MAXSIZE];
|
| 101 | u8 sensb_res_len;
|
| 102 | u8 sensb_res[NFC_SENSB_RES_MAXSIZE];
|
| 103 | u8 sensf_res_len;
|
| 104 | u8 sensf_res[NFC_SENSF_RES_MAXSIZE];
|
| 105 | u8 hci_reader_gate;
|
| 106 | u8 logical_idx;
|
| 107 | u8 is_iso15693;
|
| 108 | u8 iso15693_dsfid;
|
| 109 | u8 iso15693_uid[NFC_ISO15693_UID_MAXSIZE];
|
| 110 | u8 ats_len;
|
| 111 | u8 ats[NFC_ATS_MAXSIZE];
|
| 112 | };
|
| 113 |
|
| 114 | |
| 115 | * nfc_se - A structure for NFC accessible secure elements.
|
| 116 | *
|
| 117 | * @idx: The secure element index. User space will enable or
|
| 118 | * disable a secure element by its index.
|
| 119 | * @type: The secure element type. It can be SE_UICC or
|
| 120 | * SE_EMBEDDED.
|
| 121 | * @state: The secure element state, either enabled or disabled.
|
| 122 | *
|
| 123 |
|
| 124 | struct nfc_se {
|
| 125 | struct list_head list;
|
| 126 | u32 idx;
|
| 127 | u16 type;
|
| 128 | u16 state;
|
| 129 | };
|
| 130 |
|
| 131 | |
| 132 | * nfc_evt_transaction - A struct for NFC secure element event transaction.
|
| 133 | *
|
| 134 | * @aid: The application identifier triggering the event
|
| 135 | *
|
| 136 | * @aid_len: The application identifier length [5:16]
|
| 137 | *
|
| 138 | * @params: The application parameters transmitted during the transaction
|
| 139 | *
|
| 140 | * @params_len: The applications parameters length [0:255]
|
| 141 | *
|
| 142 |
|
| 143 | #define NFC_MIN_AID_LENGTH 5
|
| 144 | #define NFC_MAX_AID_LENGTH 16
|
| 145 | #define NFC_MAX_PARAMS_LENGTH 255
|
| 146 |
|
| 147 | #define NFC_EVT_TRANSACTION_AID_TAG 0x81
|
| 148 | #define NFC_EVT_TRANSACTION_PARAMS_TAG 0x82
|
| 149 | struct nfc_evt_transaction {
|
| 150 | u32 aid_len;
|
| 151 | u8 aid[NFC_MAX_AID_LENGTH];
|
| 152 | u8 params_len;
|
| 153 | u8 params[];
|
| 154 | } __packed;
|
| 155 |
|
| 156 | struct nfc_genl_data {
|
| 157 | u32 poll_req_portid;
|
| 158 | struct mutex genl_data_mutex;
|
| 159 | };
|
| 160 |
|
| 161 | struct nfc_vendor_cmd {
|
| 162 | __u32 vendor_id;
|
| 163 | __u32 subcmd;
|
| 164 | int (*doit)(struct nfc_dev *dev, void *data, size_t data_len);
|
| 165 | };
|
| 166 |
|
| 167 | struct nfc_dev {
|
| 168 | int idx;
|
| 169 | u32 target_next_idx;
|
| 170 | struct nfc_target *targets;
|
| 171 | int n_targets;
|
| 172 | int targets_generation;
|
| 173 | struct device dev;
|
| 174 | bool dev_up;
|
| 175 | bool fw_download_in_progress;
|
| 176 | u8 rf_mode;
|
| 177 | bool polling;
|
| 178 | struct nfc_target *active_target;
|
| 179 | bool dep_link_up;
|
| 180 | struct nfc_genl_data genl_data;
|
| 181 | u32 supported_protocols;
|
| 182 |
|
| 183 | struct list_head secure_elements;
|
| 184 |
|
| 185 | int tx_headroom;
|
| 186 | int tx_tailroom;
|
| 187 |
|
| 188 | struct timer_list check_pres_timer;
|
| 189 | struct work_struct check_pres_work;
|
| 190 |
|
| 191 | bool shutting_down;
|
| 192 |
|
| 193 | struct rfkill *rfkill;
|
| 194 |
|
| 195 | const struct nfc_vendor_cmd *vendor_cmds;
|
| 196 | int n_vendor_cmds;
|
| 197 |
|
| 198 | const struct nfc_ops *ops;
|
| 199 | struct genl_info *cur_cmd_info;
|
| 200 | };
|
| 201 | #define to_nfc_dev(_dev) container_of(_dev, struct nfc_dev, dev)
|
| 202 |
|
| 203 | extern const struct class nfc_class;
|
| 204 |
|
| 205 | struct nfc_dev *nfc_allocate_device(const struct nfc_ops *ops,
|
| 206 | u32 supported_protocols,
|
| 207 | int tx_headroom,
|
| 208 | int tx_tailroom);
|
| 209 |
|
| 210 | |
| 211 | * nfc_free_device - free nfc device
|
| 212 | *
|
| 213 | * @dev: The nfc device to free
|
| 214 |
|
| 215 | static inline void nfc_free_device(struct nfc_dev *dev)
|
| 216 | {
|
| 217 | put_device(&dev->dev);
|
| 218 | }
|
| 219 |
|
| 220 | int nfc_register_device(struct nfc_dev *dev);
|
| 221 |
|
| 222 | void nfc_unregister_rfkill(struct nfc_dev *dev);
|
| 223 | void nfc_remove_device(struct nfc_dev *dev);
|
| 224 | void nfc_unregister_device(struct nfc_dev *dev);
|
| 225 |
|
| 226 | |
| 227 | * nfc_set_parent_dev - set the parent device
|
| 228 | *
|
| 229 | * @nfc_dev: The nfc device whose parent is being set
|
| 230 | * @dev: The parent device
|
| 231 |
|
| 232 | static inline void nfc_set_parent_dev(struct nfc_dev *nfc_dev,
|
| 233 | struct device *dev)
|
| 234 | {
|
| 235 | nfc_dev->dev.parent = dev;
|
| 236 | }
|
| 237 |
|
| 238 | |
| 239 | * nfc_set_drvdata - set driver specific data
|
| 240 | *
|
| 241 | * @dev: The nfc device
|
| 242 | * @data: Pointer to driver specific data
|
| 243 |
|
| 244 | static inline void nfc_set_drvdata(struct nfc_dev *dev, void *data)
|
| 245 | {
|
| 246 | dev_set_drvdata(&dev->dev, data);
|
| 247 | }
|
| 248 |
|
| 249 | |
| 250 | * nfc_get_drvdata - get driver specific data
|
| 251 | *
|
| 252 | * @dev: The nfc device
|
| 253 |
|
| 254 | static inline void *nfc_get_drvdata(const struct nfc_dev *dev)
|
| 255 | {
|
| 256 | return dev_get_drvdata(&dev->dev);
|
| 257 | }
|
| 258 |
|
| 259 | |
| 260 | * nfc_device_name - get the nfc device name
|
| 261 | *
|
| 262 | * @dev: The nfc device whose name to return
|
| 263 |
|
| 264 | static inline const char *nfc_device_name(const struct nfc_dev *dev)
|
| 265 | {
|
| 266 | return dev_name(&dev->dev);
|
| 267 | }
|
| 268 |
|
| 269 | struct sk_buff *nfc_alloc_send_skb(struct nfc_dev *dev, struct sock *sk,
|
| 270 | unsigned int flags, unsigned int size,
|
| 271 | unsigned int *err);
|
| 272 | struct sk_buff *nfc_alloc_recv_skb(unsigned int size, gfp_t gfp);
|
| 273 |
|
| 274 | int nfc_set_remote_general_bytes(struct nfc_dev *dev,
|
| 275 | const u8 *gt, u8 gt_len);
|
| 276 | u8 *nfc_get_local_general_bytes(struct nfc_dev *dev, u8 *out_gb,
|
| 277 | size_t gb_max_len, size_t *gb_len);
|
| 278 |
|
| 279 | int nfc_fw_download_done(struct nfc_dev *dev, const char *firmware_name,
|
| 280 | u32 result);
|
| 281 |
|
| 282 | int nfc_targets_found(struct nfc_dev *dev,
|
| 283 | struct nfc_target *targets, int ntargets);
|
| 284 | int nfc_target_lost(struct nfc_dev *dev, u32 target_idx);
|
| 285 |
|
| 286 | int nfc_dep_link_is_up(struct nfc_dev *dev, u32 target_idx,
|
| 287 | u8 comm_mode, u8 rf_mode);
|
| 288 |
|
| 289 | int nfc_tm_activated(struct nfc_dev *dev, u32 protocol, u8 comm_mode,
|
| 290 | const u8 *gb, size_t gb_len);
|
| 291 | int nfc_tm_deactivated(struct nfc_dev *dev);
|
| 292 | int nfc_tm_data_received(struct nfc_dev *dev, struct sk_buff *skb);
|
| 293 |
|
| 294 | void nfc_driver_failure(struct nfc_dev *dev, int err);
|
| 295 |
|
| 296 | int nfc_se_transaction(struct nfc_dev *dev, u8 se_idx,
|
| 297 | struct nfc_evt_transaction *evt_transaction);
|
| 298 | int nfc_se_connectivity(struct nfc_dev *dev, u8 se_idx);
|
| 299 | int nfc_add_se(struct nfc_dev *dev, u32 se_idx, u16 type);
|
| 300 | int nfc_remove_se(struct nfc_dev *dev, u32 se_idx);
|
| 301 | struct nfc_se *nfc_find_se(struct nfc_dev *dev, u32 se_idx);
|
| 302 |
|
| 303 | void nfc_send_to_raw_sock(struct nfc_dev *dev, struct sk_buff *skb,
|
| 304 | u8 payload_type, u8 direction);
|
| 305 |
|
| 306 | static inline int nfc_set_vendor_cmds(struct nfc_dev *dev,
|
| 307 | const struct nfc_vendor_cmd *cmds,
|
| 308 | int n_cmds)
|
| 309 | {
|
| 310 | if (dev->vendor_cmds || dev->n_vendor_cmds)
|
| 311 | return -EINVAL;
|
| 312 |
|
| 313 | dev->vendor_cmds = cmds;
|
| 314 | dev->n_vendor_cmds = n_cmds;
|
| 315 |
|
| 316 | return 0;
|
| 317 | }
|
| 318 |
|
| 319 | struct sk_buff *__nfc_alloc_vendor_cmd_reply_skb(struct nfc_dev *dev,
|
| 320 | enum nfc_attrs attr,
|
| 321 | u32 oui, u32 subcmd,
|
| 322 | int approxlen);
|
| 323 | int nfc_vendor_cmd_reply(struct sk_buff *skb);
|
| 324 |
|
| 325 | |
| 326 | * nfc_vendor_cmd_alloc_reply_skb - allocate vendor command reply
|
| 327 | * @dev: nfc device
|
| 328 | * @oui: vendor oui
|
| 329 | * @approxlen: an upper bound of the length of the data that will
|
| 330 | * be put into the skb
|
| 331 | *
|
| 332 | * This function allocates and pre-fills an skb for a reply to
|
| 333 | * a vendor command. Since it is intended for a reply, calling
|
| 334 | * it outside of a vendor command's doit() operation is invalid.
|
| 335 | *
|
| 336 | * The returned skb is pre-filled with some identifying data in
|
| 337 | * a way that any data that is put into the skb (with skb_put(),
|
| 338 | * nla_put() or similar) will end up being within the
|
| 339 | * %NFC_ATTR_VENDOR_DATA attribute, so all that needs to be done
|
| 340 | * with the skb is adding data for the corresponding userspace tool
|
| 341 | * which can then read that data out of the vendor data attribute.
|
| 342 | * You must not modify the skb in any other way.
|
| 343 | *
|
| 344 | * When done, call nfc_vendor_cmd_reply() with the skb and return
|
| 345 | * its error code as the result of the doit() operation.
|
| 346 | *
|
| 347 | * Return: An allocated and pre-filled skb. %NULL if any errors happen.
|
| 348 |
|
| 349 | static inline struct sk_buff *
|
| 350 | nfc_vendor_cmd_alloc_reply_skb(struct nfc_dev *dev,
|
| 351 | u32 oui, u32 subcmd, int approxlen)
|
| 352 | {
|
| 353 | return __nfc_alloc_vendor_cmd_reply_skb(dev,
|
| 354 | NFC_ATTR_VENDOR_DATA,
|
| 355 | oui,
|
| 356 | subcmd, approxlen);
|
| 357 | }
|
| 358 |
|
| 359 | #endif
|