aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/net/nfc/nfc.h22
-rw-r--r--include/uapi/linux/nfc.h4
-rw-r--r--net/nfc/core.c45
3 files changed, 68 insertions, 3 deletions
diff --git a/include/net/nfc/nfc.h b/include/net/nfc/nfc.h
index 5187ec70b66a..0e353f1658bb 100644
--- a/include/net/nfc/nfc.h
+++ b/include/net/nfc/nfc.h
@@ -97,6 +97,23 @@ struct nfc_target {
97 u8 logical_idx; 97 u8 logical_idx;
98}; 98};
99 99
100/**
101 * nfc_se - A structure for NFC accessible secure elements.
102 *
103 * @idx: The secure element index. User space will enable or
104 * disable a secure element by its index.
105 * @type: The secure element type. It can be SE_UICC or
106 * SE_EMBEDDED.
107 * @state: The secure element state, either enabled or disabled.
108 *
109 */
110struct nfc_se {
111 struct list_head list;
112 u32 idx;
113 u16 type;
114 u16 state;
115};
116
100struct nfc_genl_data { 117struct nfc_genl_data {
101 u32 poll_req_portid; 118 u32 poll_req_portid;
102 struct mutex genl_data_mutex; 119 struct mutex genl_data_mutex;
@@ -118,7 +135,7 @@ struct nfc_dev {
118 struct nfc_genl_data genl_data; 135 struct nfc_genl_data genl_data;
119 u32 supported_protocols; 136 u32 supported_protocols;
120 137
121 u32 active_se; 138 struct list_head secure_elements;
122 139
123 int tx_headroom; 140 int tx_headroom;
124 int tx_tailroom; 141 int tx_tailroom;
@@ -221,4 +238,7 @@ int nfc_tm_data_received(struct nfc_dev *dev, struct sk_buff *skb);
221 238
222void nfc_driver_failure(struct nfc_dev *dev, int err); 239void nfc_driver_failure(struct nfc_dev *dev, int err);
223 240
241int nfc_add_se(struct nfc_dev *dev, u32 se_idx, u16 type);
242int nfc_remove_se(struct nfc_dev *dev, u32 se_idx);
243
224#endif /* __NET_NFC_H */ 244#endif /* __NET_NFC_H */
diff --git a/include/uapi/linux/nfc.h b/include/uapi/linux/nfc.h
index fb304fb774cc..3a57cef0b986 100644
--- a/include/uapi/linux/nfc.h
+++ b/include/uapi/linux/nfc.h
@@ -199,10 +199,12 @@ enum nfc_sdp_attr {
199#define NFC_PROTO_ISO14443_B_MASK (1 << NFC_PROTO_ISO14443_B) 199#define NFC_PROTO_ISO14443_B_MASK (1 << NFC_PROTO_ISO14443_B)
200 200
201/* NFC Secure Elements */ 201/* NFC Secure Elements */
202#define NFC_SE_NONE 0x0
203#define NFC_SE_UICC 0x1 202#define NFC_SE_UICC 0x1
204#define NFC_SE_EMBEDDED 0x2 203#define NFC_SE_EMBEDDED 0x2
205 204
205#define NFC_SE_DISABLED 0x0
206#define NFC_SE_ENABLED 0x1
207
206struct sockaddr_nfc { 208struct sockaddr_nfc {
207 sa_family_t sa_family; 209 sa_family_t sa_family;
208 __u32 dev_idx; 210 __u32 dev_idx;
diff --git a/net/nfc/core.c b/net/nfc/core.c
index a43a56d7f4be..dacadfbcacea 100644
--- a/net/nfc/core.c
+++ b/net/nfc/core.c
@@ -760,6 +760,49 @@ inline void nfc_driver_failure(struct nfc_dev *dev, int err)
760} 760}
761EXPORT_SYMBOL(nfc_driver_failure); 761EXPORT_SYMBOL(nfc_driver_failure);
762 762
763int nfc_add_se(struct nfc_dev *dev, u32 se_idx, u16 type)
764{
765 struct nfc_se *se, *n;
766
767 pr_debug("%s se index %d\n", dev_name(&dev->dev), se_idx);
768
769 list_for_each_entry_safe(se, n, &dev->secure_elements, list)
770 if (se->idx == se_idx)
771 return -EALREADY;
772
773 se = kzalloc(sizeof(struct nfc_se), GFP_KERNEL);
774 if (!se)
775 return -ENOMEM;
776
777 se->idx = se_idx;
778 se->type = type;
779 se->state = NFC_SE_DISABLED;
780 INIT_LIST_HEAD(&se->list);
781
782 list_add(&se->list, &dev->secure_elements);
783
784 return 0;
785}
786EXPORT_SYMBOL(nfc_add_se);
787
788int nfc_remove_se(struct nfc_dev *dev, u32 se_idx)
789{
790 struct nfc_se *se, *n;
791
792 pr_debug("%s se index %d\n", dev_name(&dev->dev), se_idx);
793
794 list_for_each_entry_safe(se, n, &dev->secure_elements, list)
795 if (se->idx == se_idx) {
796 list_del(&se->list);
797 kfree(se);
798
799 return 0;
800 }
801
802 return -EINVAL;
803}
804EXPORT_SYMBOL(nfc_remove_se);
805
763static void nfc_release(struct device *d) 806static void nfc_release(struct device *d)
764{ 807{
765 struct nfc_dev *dev = to_nfc_dev(d); 808 struct nfc_dev *dev = to_nfc_dev(d);
@@ -856,9 +899,9 @@ struct nfc_dev *nfc_allocate_device(struct nfc_ops *ops,
856 899
857 dev->ops = ops; 900 dev->ops = ops;
858 dev->supported_protocols = supported_protocols; 901 dev->supported_protocols = supported_protocols;
859 dev->active_se = NFC_SE_NONE;
860 dev->tx_headroom = tx_headroom; 902 dev->tx_headroom = tx_headroom;
861 dev->tx_tailroom = tx_tailroom; 903 dev->tx_tailroom = tx_tailroom;
904 INIT_LIST_HEAD(&dev->secure_elements);
862 905
863 nfc_genl_data_init(&dev->genl_data); 906 nfc_genl_data_init(&dev->genl_data);
864 907