18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Copyright (C) 2011 Instituto Nokia de Tecnologia 48c2ecf20Sopenharmony_ci * Copyright (C) 2014 Marvell International Ltd. 58c2ecf20Sopenharmony_ci * 68c2ecf20Sopenharmony_ci * Authors: 78c2ecf20Sopenharmony_ci * Lauro Ramos Venancio <lauro.venancio@openbossa.org> 88c2ecf20Sopenharmony_ci * Aloisio Almeida Jr <aloisio.almeida@openbossa.org> 98c2ecf20Sopenharmony_ci */ 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci#ifndef __NET_NFC_H 128c2ecf20Sopenharmony_ci#define __NET_NFC_H 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_ci#include <linux/nfc.h> 158c2ecf20Sopenharmony_ci#include <linux/device.h> 168c2ecf20Sopenharmony_ci#include <linux/skbuff.h> 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_ci#define nfc_dbg(dev, fmt, ...) dev_dbg((dev), "NFC: " fmt, ##__VA_ARGS__) 198c2ecf20Sopenharmony_ci#define nfc_info(dev, fmt, ...) dev_info((dev), "NFC: " fmt, ##__VA_ARGS__) 208c2ecf20Sopenharmony_ci#define nfc_err(dev, fmt, ...) dev_err((dev), "NFC: " fmt, ##__VA_ARGS__) 218c2ecf20Sopenharmony_ci 228c2ecf20Sopenharmony_cistruct nfc_phy_ops { 238c2ecf20Sopenharmony_ci int (*write)(void *dev_id, struct sk_buff *skb); 248c2ecf20Sopenharmony_ci int (*enable)(void *dev_id); 258c2ecf20Sopenharmony_ci void (*disable)(void *dev_id); 268c2ecf20Sopenharmony_ci}; 278c2ecf20Sopenharmony_ci 288c2ecf20Sopenharmony_cistruct nfc_dev; 298c2ecf20Sopenharmony_ci 308c2ecf20Sopenharmony_ci/** 318c2ecf20Sopenharmony_ci * data_exchange_cb_t - Definition of nfc_data_exchange callback 328c2ecf20Sopenharmony_ci * 338c2ecf20Sopenharmony_ci * @context: nfc_data_exchange cb_context parameter 348c2ecf20Sopenharmony_ci * @skb: response data 358c2ecf20Sopenharmony_ci * @err: If an error has occurred during data exchange, it is the 368c2ecf20Sopenharmony_ci * error number. Zero means no error. 378c2ecf20Sopenharmony_ci * 388c2ecf20Sopenharmony_ci * When a rx or tx package is lost or corrupted or the target gets out 398c2ecf20Sopenharmony_ci * of the operating field, err is -EIO. 408c2ecf20Sopenharmony_ci */ 418c2ecf20Sopenharmony_citypedef void (*data_exchange_cb_t)(void *context, struct sk_buff *skb, 428c2ecf20Sopenharmony_ci int err); 438c2ecf20Sopenharmony_ci 448c2ecf20Sopenharmony_citypedef void (*se_io_cb_t)(void *context, u8 *apdu, size_t apdu_len, int err); 458c2ecf20Sopenharmony_ci 468c2ecf20Sopenharmony_cistruct nfc_target; 478c2ecf20Sopenharmony_ci 488c2ecf20Sopenharmony_cistruct nfc_ops { 498c2ecf20Sopenharmony_ci int (*dev_up)(struct nfc_dev *dev); 508c2ecf20Sopenharmony_ci int (*dev_down)(struct nfc_dev *dev); 518c2ecf20Sopenharmony_ci int (*start_poll)(struct nfc_dev *dev, 528c2ecf20Sopenharmony_ci u32 im_protocols, u32 tm_protocols); 538c2ecf20Sopenharmony_ci void (*stop_poll)(struct nfc_dev *dev); 548c2ecf20Sopenharmony_ci int (*dep_link_up)(struct nfc_dev *dev, struct nfc_target *target, 558c2ecf20Sopenharmony_ci u8 comm_mode, u8 *gb, size_t gb_len); 568c2ecf20Sopenharmony_ci int (*dep_link_down)(struct nfc_dev *dev); 578c2ecf20Sopenharmony_ci int (*activate_target)(struct nfc_dev *dev, struct nfc_target *target, 588c2ecf20Sopenharmony_ci u32 protocol); 598c2ecf20Sopenharmony_ci void (*deactivate_target)(struct nfc_dev *dev, 608c2ecf20Sopenharmony_ci struct nfc_target *target, u8 mode); 618c2ecf20Sopenharmony_ci int (*im_transceive)(struct nfc_dev *dev, struct nfc_target *target, 628c2ecf20Sopenharmony_ci struct sk_buff *skb, data_exchange_cb_t cb, 638c2ecf20Sopenharmony_ci void *cb_context); 648c2ecf20Sopenharmony_ci int (*tm_send)(struct nfc_dev *dev, struct sk_buff *skb); 658c2ecf20Sopenharmony_ci int (*check_presence)(struct nfc_dev *dev, struct nfc_target *target); 668c2ecf20Sopenharmony_ci int (*fw_download)(struct nfc_dev *dev, const char *firmware_name); 678c2ecf20Sopenharmony_ci 688c2ecf20Sopenharmony_ci /* Secure Element API */ 698c2ecf20Sopenharmony_ci int (*discover_se)(struct nfc_dev *dev); 708c2ecf20Sopenharmony_ci int (*enable_se)(struct nfc_dev *dev, u32 se_idx); 718c2ecf20Sopenharmony_ci int (*disable_se)(struct nfc_dev *dev, u32 se_idx); 728c2ecf20Sopenharmony_ci int (*se_io) (struct nfc_dev *dev, u32 se_idx, 738c2ecf20Sopenharmony_ci u8 *apdu, size_t apdu_length, 748c2ecf20Sopenharmony_ci se_io_cb_t cb, void *cb_context); 758c2ecf20Sopenharmony_ci}; 768c2ecf20Sopenharmony_ci 778c2ecf20Sopenharmony_ci#define NFC_TARGET_IDX_ANY -1 788c2ecf20Sopenharmony_ci#define NFC_MAX_GT_LEN 48 798c2ecf20Sopenharmony_ci#define NFC_ATR_RES_GT_OFFSET 15 808c2ecf20Sopenharmony_ci#define NFC_ATR_REQ_GT_OFFSET 14 818c2ecf20Sopenharmony_ci 828c2ecf20Sopenharmony_ci/** 838c2ecf20Sopenharmony_ci * struct nfc_target - NFC target descriptiom 848c2ecf20Sopenharmony_ci * 858c2ecf20Sopenharmony_ci * @sens_res: 2 bytes describing the target SENS_RES response, if the target 868c2ecf20Sopenharmony_ci * is a type A one. The %sens_res most significant byte must be byte 2 878c2ecf20Sopenharmony_ci * as described by the NFC Forum digital specification (i.e. the platform 888c2ecf20Sopenharmony_ci * configuration one) while %sens_res least significant byte is byte 1. 898c2ecf20Sopenharmony_ci */ 908c2ecf20Sopenharmony_cistruct nfc_target { 918c2ecf20Sopenharmony_ci u32 idx; 928c2ecf20Sopenharmony_ci u32 supported_protocols; 938c2ecf20Sopenharmony_ci u16 sens_res; 948c2ecf20Sopenharmony_ci u8 sel_res; 958c2ecf20Sopenharmony_ci u8 nfcid1_len; 968c2ecf20Sopenharmony_ci u8 nfcid1[NFC_NFCID1_MAXSIZE]; 978c2ecf20Sopenharmony_ci u8 nfcid2_len; 988c2ecf20Sopenharmony_ci u8 nfcid2[NFC_NFCID2_MAXSIZE]; 998c2ecf20Sopenharmony_ci u8 sensb_res_len; 1008c2ecf20Sopenharmony_ci u8 sensb_res[NFC_SENSB_RES_MAXSIZE]; 1018c2ecf20Sopenharmony_ci u8 sensf_res_len; 1028c2ecf20Sopenharmony_ci u8 sensf_res[NFC_SENSF_RES_MAXSIZE]; 1038c2ecf20Sopenharmony_ci u8 hci_reader_gate; 1048c2ecf20Sopenharmony_ci u8 logical_idx; 1058c2ecf20Sopenharmony_ci u8 is_iso15693; 1068c2ecf20Sopenharmony_ci u8 iso15693_dsfid; 1078c2ecf20Sopenharmony_ci u8 iso15693_uid[NFC_ISO15693_UID_MAXSIZE]; 1088c2ecf20Sopenharmony_ci}; 1098c2ecf20Sopenharmony_ci 1108c2ecf20Sopenharmony_ci/** 1118c2ecf20Sopenharmony_ci * nfc_se - A structure for NFC accessible secure elements. 1128c2ecf20Sopenharmony_ci * 1138c2ecf20Sopenharmony_ci * @idx: The secure element index. User space will enable or 1148c2ecf20Sopenharmony_ci * disable a secure element by its index. 1158c2ecf20Sopenharmony_ci * @type: The secure element type. It can be SE_UICC or 1168c2ecf20Sopenharmony_ci * SE_EMBEDDED. 1178c2ecf20Sopenharmony_ci * @state: The secure element state, either enabled or disabled. 1188c2ecf20Sopenharmony_ci * 1198c2ecf20Sopenharmony_ci */ 1208c2ecf20Sopenharmony_cistruct nfc_se { 1218c2ecf20Sopenharmony_ci struct list_head list; 1228c2ecf20Sopenharmony_ci u32 idx; 1238c2ecf20Sopenharmony_ci u16 type; 1248c2ecf20Sopenharmony_ci u16 state; 1258c2ecf20Sopenharmony_ci}; 1268c2ecf20Sopenharmony_ci 1278c2ecf20Sopenharmony_ci/** 1288c2ecf20Sopenharmony_ci * nfc_evt_transaction - A struct for NFC secure element event transaction. 1298c2ecf20Sopenharmony_ci * 1308c2ecf20Sopenharmony_ci * @aid: The application identifier triggering the event 1318c2ecf20Sopenharmony_ci * 1328c2ecf20Sopenharmony_ci * @aid_len: The application identifier length [5:16] 1338c2ecf20Sopenharmony_ci * 1348c2ecf20Sopenharmony_ci * @params: The application parameters transmitted during the transaction 1358c2ecf20Sopenharmony_ci * 1368c2ecf20Sopenharmony_ci * @params_len: The applications parameters length [0:255] 1378c2ecf20Sopenharmony_ci * 1388c2ecf20Sopenharmony_ci */ 1398c2ecf20Sopenharmony_ci#define NFC_MIN_AID_LENGTH 5 1408c2ecf20Sopenharmony_ci#define NFC_MAX_AID_LENGTH 16 1418c2ecf20Sopenharmony_ci#define NFC_MAX_PARAMS_LENGTH 255 1428c2ecf20Sopenharmony_ci 1438c2ecf20Sopenharmony_ci#define NFC_EVT_TRANSACTION_AID_TAG 0x81 1448c2ecf20Sopenharmony_ci#define NFC_EVT_TRANSACTION_PARAMS_TAG 0x82 1458c2ecf20Sopenharmony_cistruct nfc_evt_transaction { 1468c2ecf20Sopenharmony_ci u32 aid_len; 1478c2ecf20Sopenharmony_ci u8 aid[NFC_MAX_AID_LENGTH]; 1488c2ecf20Sopenharmony_ci u8 params_len; 1498c2ecf20Sopenharmony_ci u8 params[]; 1508c2ecf20Sopenharmony_ci} __packed; 1518c2ecf20Sopenharmony_ci 1528c2ecf20Sopenharmony_cistruct nfc_genl_data { 1538c2ecf20Sopenharmony_ci u32 poll_req_portid; 1548c2ecf20Sopenharmony_ci struct mutex genl_data_mutex; 1558c2ecf20Sopenharmony_ci}; 1568c2ecf20Sopenharmony_ci 1578c2ecf20Sopenharmony_cistruct nfc_vendor_cmd { 1588c2ecf20Sopenharmony_ci __u32 vendor_id; 1598c2ecf20Sopenharmony_ci __u32 subcmd; 1608c2ecf20Sopenharmony_ci int (*doit)(struct nfc_dev *dev, void *data, size_t data_len); 1618c2ecf20Sopenharmony_ci}; 1628c2ecf20Sopenharmony_ci 1638c2ecf20Sopenharmony_cistruct nfc_dev { 1648c2ecf20Sopenharmony_ci int idx; 1658c2ecf20Sopenharmony_ci u32 target_next_idx; 1668c2ecf20Sopenharmony_ci struct nfc_target *targets; 1678c2ecf20Sopenharmony_ci int n_targets; 1688c2ecf20Sopenharmony_ci int targets_generation; 1698c2ecf20Sopenharmony_ci struct device dev; 1708c2ecf20Sopenharmony_ci bool dev_up; 1718c2ecf20Sopenharmony_ci bool fw_download_in_progress; 1728c2ecf20Sopenharmony_ci u8 rf_mode; 1738c2ecf20Sopenharmony_ci bool polling; 1748c2ecf20Sopenharmony_ci struct nfc_target *active_target; 1758c2ecf20Sopenharmony_ci bool dep_link_up; 1768c2ecf20Sopenharmony_ci struct nfc_genl_data genl_data; 1778c2ecf20Sopenharmony_ci u32 supported_protocols; 1788c2ecf20Sopenharmony_ci 1798c2ecf20Sopenharmony_ci struct list_head secure_elements; 1808c2ecf20Sopenharmony_ci 1818c2ecf20Sopenharmony_ci int tx_headroom; 1828c2ecf20Sopenharmony_ci int tx_tailroom; 1838c2ecf20Sopenharmony_ci 1848c2ecf20Sopenharmony_ci struct timer_list check_pres_timer; 1858c2ecf20Sopenharmony_ci struct work_struct check_pres_work; 1868c2ecf20Sopenharmony_ci 1878c2ecf20Sopenharmony_ci bool shutting_down; 1888c2ecf20Sopenharmony_ci 1898c2ecf20Sopenharmony_ci struct rfkill *rfkill; 1908c2ecf20Sopenharmony_ci 1918c2ecf20Sopenharmony_ci struct nfc_vendor_cmd *vendor_cmds; 1928c2ecf20Sopenharmony_ci int n_vendor_cmds; 1938c2ecf20Sopenharmony_ci 1948c2ecf20Sopenharmony_ci struct nfc_ops *ops; 1958c2ecf20Sopenharmony_ci struct genl_info *cur_cmd_info; 1968c2ecf20Sopenharmony_ci}; 1978c2ecf20Sopenharmony_ci#define to_nfc_dev(_dev) container_of(_dev, struct nfc_dev, dev) 1988c2ecf20Sopenharmony_ci 1998c2ecf20Sopenharmony_ciextern struct class nfc_class; 2008c2ecf20Sopenharmony_ci 2018c2ecf20Sopenharmony_cistruct nfc_dev *nfc_allocate_device(struct nfc_ops *ops, 2028c2ecf20Sopenharmony_ci u32 supported_protocols, 2038c2ecf20Sopenharmony_ci int tx_headroom, 2048c2ecf20Sopenharmony_ci int tx_tailroom); 2058c2ecf20Sopenharmony_ci 2068c2ecf20Sopenharmony_ci/** 2078c2ecf20Sopenharmony_ci * nfc_free_device - free nfc device 2088c2ecf20Sopenharmony_ci * 2098c2ecf20Sopenharmony_ci * @dev: The nfc device to free 2108c2ecf20Sopenharmony_ci */ 2118c2ecf20Sopenharmony_cistatic inline void nfc_free_device(struct nfc_dev *dev) 2128c2ecf20Sopenharmony_ci{ 2138c2ecf20Sopenharmony_ci put_device(&dev->dev); 2148c2ecf20Sopenharmony_ci} 2158c2ecf20Sopenharmony_ci 2168c2ecf20Sopenharmony_ciint nfc_register_device(struct nfc_dev *dev); 2178c2ecf20Sopenharmony_ci 2188c2ecf20Sopenharmony_civoid nfc_unregister_device(struct nfc_dev *dev); 2198c2ecf20Sopenharmony_ci 2208c2ecf20Sopenharmony_ci/** 2218c2ecf20Sopenharmony_ci * nfc_set_parent_dev - set the parent device 2228c2ecf20Sopenharmony_ci * 2238c2ecf20Sopenharmony_ci * @nfc_dev: The nfc device whose parent is being set 2248c2ecf20Sopenharmony_ci * @dev: The parent device 2258c2ecf20Sopenharmony_ci */ 2268c2ecf20Sopenharmony_cistatic inline void nfc_set_parent_dev(struct nfc_dev *nfc_dev, 2278c2ecf20Sopenharmony_ci struct device *dev) 2288c2ecf20Sopenharmony_ci{ 2298c2ecf20Sopenharmony_ci nfc_dev->dev.parent = dev; 2308c2ecf20Sopenharmony_ci} 2318c2ecf20Sopenharmony_ci 2328c2ecf20Sopenharmony_ci/** 2338c2ecf20Sopenharmony_ci * nfc_set_drvdata - set driver specifc data 2348c2ecf20Sopenharmony_ci * 2358c2ecf20Sopenharmony_ci * @dev: The nfc device 2368c2ecf20Sopenharmony_ci * @data: Pointer to driver specifc data 2378c2ecf20Sopenharmony_ci */ 2388c2ecf20Sopenharmony_cistatic inline void nfc_set_drvdata(struct nfc_dev *dev, void *data) 2398c2ecf20Sopenharmony_ci{ 2408c2ecf20Sopenharmony_ci dev_set_drvdata(&dev->dev, data); 2418c2ecf20Sopenharmony_ci} 2428c2ecf20Sopenharmony_ci 2438c2ecf20Sopenharmony_ci/** 2448c2ecf20Sopenharmony_ci * nfc_get_drvdata - get driver specifc data 2458c2ecf20Sopenharmony_ci * 2468c2ecf20Sopenharmony_ci * @dev: The nfc device 2478c2ecf20Sopenharmony_ci */ 2488c2ecf20Sopenharmony_cistatic inline void *nfc_get_drvdata(struct nfc_dev *dev) 2498c2ecf20Sopenharmony_ci{ 2508c2ecf20Sopenharmony_ci return dev_get_drvdata(&dev->dev); 2518c2ecf20Sopenharmony_ci} 2528c2ecf20Sopenharmony_ci 2538c2ecf20Sopenharmony_ci/** 2548c2ecf20Sopenharmony_ci * nfc_device_name - get the nfc device name 2558c2ecf20Sopenharmony_ci * 2568c2ecf20Sopenharmony_ci * @dev: The nfc device whose name to return 2578c2ecf20Sopenharmony_ci */ 2588c2ecf20Sopenharmony_cistatic inline const char *nfc_device_name(struct nfc_dev *dev) 2598c2ecf20Sopenharmony_ci{ 2608c2ecf20Sopenharmony_ci return dev_name(&dev->dev); 2618c2ecf20Sopenharmony_ci} 2628c2ecf20Sopenharmony_ci 2638c2ecf20Sopenharmony_cistruct sk_buff *nfc_alloc_send_skb(struct nfc_dev *dev, struct sock *sk, 2648c2ecf20Sopenharmony_ci unsigned int flags, unsigned int size, 2658c2ecf20Sopenharmony_ci unsigned int *err); 2668c2ecf20Sopenharmony_cistruct sk_buff *nfc_alloc_recv_skb(unsigned int size, gfp_t gfp); 2678c2ecf20Sopenharmony_ci 2688c2ecf20Sopenharmony_ciint nfc_set_remote_general_bytes(struct nfc_dev *dev, 2698c2ecf20Sopenharmony_ci const u8 *gt, u8 gt_len); 2708c2ecf20Sopenharmony_ciu8 *nfc_get_local_general_bytes(struct nfc_dev *dev, size_t *gb_len); 2718c2ecf20Sopenharmony_ci 2728c2ecf20Sopenharmony_ciint nfc_fw_download_done(struct nfc_dev *dev, const char *firmware_name, 2738c2ecf20Sopenharmony_ci u32 result); 2748c2ecf20Sopenharmony_ci 2758c2ecf20Sopenharmony_ciint nfc_targets_found(struct nfc_dev *dev, 2768c2ecf20Sopenharmony_ci struct nfc_target *targets, int ntargets); 2778c2ecf20Sopenharmony_ciint nfc_target_lost(struct nfc_dev *dev, u32 target_idx); 2788c2ecf20Sopenharmony_ci 2798c2ecf20Sopenharmony_ciint nfc_dep_link_is_up(struct nfc_dev *dev, u32 target_idx, 2808c2ecf20Sopenharmony_ci u8 comm_mode, u8 rf_mode); 2818c2ecf20Sopenharmony_ci 2828c2ecf20Sopenharmony_ciint nfc_tm_activated(struct nfc_dev *dev, u32 protocol, u8 comm_mode, 2838c2ecf20Sopenharmony_ci const u8 *gb, size_t gb_len); 2848c2ecf20Sopenharmony_ciint nfc_tm_deactivated(struct nfc_dev *dev); 2858c2ecf20Sopenharmony_ciint nfc_tm_data_received(struct nfc_dev *dev, struct sk_buff *skb); 2868c2ecf20Sopenharmony_ci 2878c2ecf20Sopenharmony_civoid nfc_driver_failure(struct nfc_dev *dev, int err); 2888c2ecf20Sopenharmony_ci 2898c2ecf20Sopenharmony_ciint nfc_se_transaction(struct nfc_dev *dev, u8 se_idx, 2908c2ecf20Sopenharmony_ci struct nfc_evt_transaction *evt_transaction); 2918c2ecf20Sopenharmony_ciint nfc_se_connectivity(struct nfc_dev *dev, u8 se_idx); 2928c2ecf20Sopenharmony_ciint nfc_add_se(struct nfc_dev *dev, u32 se_idx, u16 type); 2938c2ecf20Sopenharmony_ciint nfc_remove_se(struct nfc_dev *dev, u32 se_idx); 2948c2ecf20Sopenharmony_cistruct nfc_se *nfc_find_se(struct nfc_dev *dev, u32 se_idx); 2958c2ecf20Sopenharmony_ci 2968c2ecf20Sopenharmony_civoid nfc_send_to_raw_sock(struct nfc_dev *dev, struct sk_buff *skb, 2978c2ecf20Sopenharmony_ci u8 payload_type, u8 direction); 2988c2ecf20Sopenharmony_ci 2998c2ecf20Sopenharmony_cistatic inline int nfc_set_vendor_cmds(struct nfc_dev *dev, 3008c2ecf20Sopenharmony_ci struct nfc_vendor_cmd *cmds, 3018c2ecf20Sopenharmony_ci int n_cmds) 3028c2ecf20Sopenharmony_ci{ 3038c2ecf20Sopenharmony_ci if (dev->vendor_cmds || dev->n_vendor_cmds) 3048c2ecf20Sopenharmony_ci return -EINVAL; 3058c2ecf20Sopenharmony_ci 3068c2ecf20Sopenharmony_ci dev->vendor_cmds = cmds; 3078c2ecf20Sopenharmony_ci dev->n_vendor_cmds = n_cmds; 3088c2ecf20Sopenharmony_ci 3098c2ecf20Sopenharmony_ci return 0; 3108c2ecf20Sopenharmony_ci} 3118c2ecf20Sopenharmony_ci 3128c2ecf20Sopenharmony_cistruct sk_buff *__nfc_alloc_vendor_cmd_reply_skb(struct nfc_dev *dev, 3138c2ecf20Sopenharmony_ci enum nfc_attrs attr, 3148c2ecf20Sopenharmony_ci u32 oui, u32 subcmd, 3158c2ecf20Sopenharmony_ci int approxlen); 3168c2ecf20Sopenharmony_ciint nfc_vendor_cmd_reply(struct sk_buff *skb); 3178c2ecf20Sopenharmony_ci 3188c2ecf20Sopenharmony_ci/** 3198c2ecf20Sopenharmony_ci * nfc_vendor_cmd_alloc_reply_skb - allocate vendor command reply 3208c2ecf20Sopenharmony_ci * @dev: nfc device 3218c2ecf20Sopenharmony_ci * @oui: vendor oui 3228c2ecf20Sopenharmony_ci * @approxlen: an upper bound of the length of the data that will 3238c2ecf20Sopenharmony_ci * be put into the skb 3248c2ecf20Sopenharmony_ci * 3258c2ecf20Sopenharmony_ci * This function allocates and pre-fills an skb for a reply to 3268c2ecf20Sopenharmony_ci * a vendor command. Since it is intended for a reply, calling 3278c2ecf20Sopenharmony_ci * it outside of a vendor command's doit() operation is invalid. 3288c2ecf20Sopenharmony_ci * 3298c2ecf20Sopenharmony_ci * The returned skb is pre-filled with some identifying data in 3308c2ecf20Sopenharmony_ci * a way that any data that is put into the skb (with skb_put(), 3318c2ecf20Sopenharmony_ci * nla_put() or similar) will end up being within the 3328c2ecf20Sopenharmony_ci * %NFC_ATTR_VENDOR_DATA attribute, so all that needs to be done 3338c2ecf20Sopenharmony_ci * with the skb is adding data for the corresponding userspace tool 3348c2ecf20Sopenharmony_ci * which can then read that data out of the vendor data attribute. 3358c2ecf20Sopenharmony_ci * You must not modify the skb in any other way. 3368c2ecf20Sopenharmony_ci * 3378c2ecf20Sopenharmony_ci * When done, call nfc_vendor_cmd_reply() with the skb and return 3388c2ecf20Sopenharmony_ci * its error code as the result of the doit() operation. 3398c2ecf20Sopenharmony_ci * 3408c2ecf20Sopenharmony_ci * Return: An allocated and pre-filled skb. %NULL if any errors happen. 3418c2ecf20Sopenharmony_ci */ 3428c2ecf20Sopenharmony_cistatic inline struct sk_buff * 3438c2ecf20Sopenharmony_cinfc_vendor_cmd_alloc_reply_skb(struct nfc_dev *dev, 3448c2ecf20Sopenharmony_ci u32 oui, u32 subcmd, int approxlen) 3458c2ecf20Sopenharmony_ci{ 3468c2ecf20Sopenharmony_ci return __nfc_alloc_vendor_cmd_reply_skb(dev, 3478c2ecf20Sopenharmony_ci NFC_ATTR_VENDOR_DATA, 3488c2ecf20Sopenharmony_ci oui, 3498c2ecf20Sopenharmony_ci subcmd, approxlen); 3508c2ecf20Sopenharmony_ci} 3518c2ecf20Sopenharmony_ci 3528c2ecf20Sopenharmony_ci#endif /* __NET_NFC_H */ 353