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