1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
2 | /* |
3 | * Copyright (C) 2014 STMicroelectronics SAS. All rights reserved. |
4 | */ |
5 | |
6 | #ifndef __LOCAL_ST21NFCA_H_ |
7 | #define __LOCAL_ST21NFCA_H_ |
8 | |
9 | #include <net/nfc/hci.h> |
10 | #include <linux/skbuff.h> |
11 | #include <linux/workqueue.h> |
12 | |
13 | #define HCI_MODE 0 |
14 | |
15 | /* framing in HCI mode */ |
16 | #define ST21NFCA_SOF_EOF_LEN 2 |
17 | |
18 | /* Almost every time value is 0 */ |
19 | #define ST21NFCA_HCI_LLC_LEN 1 |
20 | |
21 | /* Size in worst case : |
22 | * In normal case CRC len = 2 but byte stuffing |
23 | * may appear in case one CRC byte = ST21NFCA_SOF_EOF |
24 | */ |
25 | #define ST21NFCA_HCI_LLC_CRC 4 |
26 | |
27 | #define ST21NFCA_HCI_LLC_LEN_CRC (ST21NFCA_SOF_EOF_LEN + \ |
28 | ST21NFCA_HCI_LLC_LEN + \ |
29 | ST21NFCA_HCI_LLC_CRC) |
30 | #define ST21NFCA_HCI_LLC_MIN_SIZE (1 + ST21NFCA_HCI_LLC_LEN_CRC) |
31 | |
32 | /* Worst case when adding byte stuffing between each byte */ |
33 | #define ST21NFCA_HCI_LLC_MAX_PAYLOAD 29 |
34 | #define ST21NFCA_HCI_LLC_MAX_SIZE (ST21NFCA_HCI_LLC_LEN_CRC + 1 + \ |
35 | ST21NFCA_HCI_LLC_MAX_PAYLOAD) |
36 | |
37 | /* Reader RF commands */ |
38 | #define ST21NFCA_WR_XCHG_DATA 0x10 |
39 | |
40 | #define ST21NFCA_DEVICE_MGNT_GATE 0x01 |
41 | #define ST21NFCA_RF_READER_F_GATE 0x14 |
42 | #define ST21NFCA_RF_CARD_F_GATE 0x24 |
43 | #define ST21NFCA_APDU_READER_GATE 0xf0 |
44 | #define ST21NFCA_CONNECTIVITY_GATE 0x41 |
45 | |
46 | /* |
47 | * ref ISO7816-3 chap 8.1. the initial character TS is followed by a |
48 | * sequence of at most 32 characters. |
49 | */ |
50 | #define ST21NFCA_ESE_MAX_LENGTH 33 |
51 | #define ST21NFCA_ESE_HOST_ID 0xc0 |
52 | |
53 | #define DRIVER_DESC "HCI NFC driver for ST21NFCA" |
54 | |
55 | #define ST21NFCA_HCI_MODE 0 |
56 | #define ST21NFCA_NUM_DEVICES 256 |
57 | |
58 | #define ST21NFCA_VENDOR_OUI 0x0080E1 /* STMicroelectronics */ |
59 | #define ST21NFCA_FACTORY_MODE 2 |
60 | |
61 | struct st21nfca_se_status { |
62 | bool is_ese_present; |
63 | bool is_uicc_present; |
64 | }; |
65 | |
66 | enum st21nfca_state { |
67 | ST21NFCA_ST_COLD, |
68 | ST21NFCA_ST_READY, |
69 | }; |
70 | |
71 | /** |
72 | * enum nfc_vendor_cmds - supported nfc vendor commands |
73 | * |
74 | * @FACTORY_MODE: Allow to set the driver into a mode where no secure element |
75 | * are activated. It does not consider any NFC_ATTR_VENDOR_DATA. |
76 | * @HCI_CLEAR_ALL_PIPES: Allow to execute a HCI clear all pipes command. |
77 | * It does not consider any NFC_ATTR_VENDOR_DATA. |
78 | * @HCI_DM_PUT_DATA: Allow to configure specific CLF registry as for example |
79 | * RF trimmings or low level drivers configurations (I2C, SPI, SWP). |
80 | * @HCI_DM_UPDATE_AID: Allow to configure an AID routing into the CLF routing |
81 | * table following RF technology, CLF mode or protocol. |
82 | * @HCI_DM_GET_INFO: Allow to retrieve CLF information. |
83 | * @HCI_DM_GET_DATA: Allow to retrieve CLF configurable data such as low |
84 | * level drivers configurations or RF trimmings. |
85 | * @HCI_DM_LOAD: Allow to load a firmware into the CLF. A complete |
86 | * packet can be more than 8KB. |
87 | * @HCI_DM_RESET: Allow to run a CLF reset in order to "commit" CLF |
88 | * configuration changes without CLF power off. |
89 | * @HCI_GET_PARAM: Allow to retrieve an HCI CLF parameter (for example the |
90 | * white list). |
91 | * @HCI_DM_FIELD_GENERATOR: Allow to generate different kind of RF |
92 | * technology. When using this command to anti-collision is done. |
93 | * @HCI_LOOPBACK: Allow to echo a command and test the Dh to CLF |
94 | * connectivity. |
95 | */ |
96 | enum nfc_vendor_cmds { |
97 | FACTORY_MODE, |
98 | HCI_CLEAR_ALL_PIPES, |
99 | HCI_DM_PUT_DATA, |
100 | HCI_DM_UPDATE_AID, |
101 | HCI_DM_GET_INFO, |
102 | HCI_DM_GET_DATA, |
103 | HCI_DM_LOAD, |
104 | HCI_DM_RESET, |
105 | HCI_GET_PARAM, |
106 | HCI_DM_FIELD_GENERATOR, |
107 | HCI_LOOPBACK, |
108 | }; |
109 | |
110 | struct st21nfca_vendor_info { |
111 | struct completion req_completion; |
112 | struct sk_buff *rx_skb; |
113 | }; |
114 | |
115 | struct st21nfca_dep_info { |
116 | struct sk_buff *tx_pending; |
117 | struct work_struct tx_work; |
118 | u8 curr_nfc_dep_pni; |
119 | u32 idx; |
120 | u8 to; |
121 | u8 did; |
122 | u8 bsi; |
123 | u8 bri; |
124 | u8 lri; |
125 | } __packed; |
126 | |
127 | struct st21nfca_se_info { |
128 | u8 atr[ST21NFCA_ESE_MAX_LENGTH]; |
129 | struct completion req_completion; |
130 | |
131 | struct timer_list bwi_timer; |
132 | int wt_timeout; /* in msecs */ |
133 | bool bwi_active; |
134 | |
135 | struct timer_list se_active_timer; |
136 | bool se_active; |
137 | int expected_pipes; |
138 | int count_pipes; |
139 | |
140 | bool xch_error; |
141 | |
142 | se_io_cb_t cb; |
143 | void *cb_context; |
144 | struct work_struct timeout_work; |
145 | }; |
146 | |
147 | struct st21nfca_hci_info { |
148 | const struct nfc_phy_ops *phy_ops; |
149 | void *phy_id; |
150 | |
151 | struct nfc_hci_dev *hdev; |
152 | struct st21nfca_se_status *se_status; |
153 | |
154 | enum st21nfca_state state; |
155 | |
156 | struct mutex info_lock; |
157 | |
158 | int async_cb_type; |
159 | data_exchange_cb_t async_cb; |
160 | void *async_cb_context; |
161 | |
162 | struct st21nfca_dep_info dep_info; |
163 | struct st21nfca_se_info se_info; |
164 | struct st21nfca_vendor_info vendor_info; |
165 | }; |
166 | |
167 | int st21nfca_hci_probe(void *phy_id, const struct nfc_phy_ops *phy_ops, |
168 | char *llc_name, int phy_headroom, int phy_tailroom, |
169 | int phy_payload, struct nfc_hci_dev **hdev, |
170 | struct st21nfca_se_status *se_status); |
171 | void st21nfca_hci_remove(struct nfc_hci_dev *hdev); |
172 | |
173 | int st21nfca_dep_event_received(struct nfc_hci_dev *hdev, |
174 | u8 event, struct sk_buff *skb); |
175 | int st21nfca_tm_send_dep_res(struct nfc_hci_dev *hdev, struct sk_buff *skb); |
176 | |
177 | int st21nfca_im_send_atr_req(struct nfc_hci_dev *hdev, u8 *gb, size_t gb_len); |
178 | int st21nfca_im_send_dep_req(struct nfc_hci_dev *hdev, struct sk_buff *skb); |
179 | void st21nfca_dep_init(struct nfc_hci_dev *hdev); |
180 | void st21nfca_dep_deinit(struct nfc_hci_dev *hdev); |
181 | |
182 | int st21nfca_connectivity_event_received(struct nfc_hci_dev *hdev, u8 host, |
183 | u8 event, struct sk_buff *skb); |
184 | int st21nfca_apdu_reader_event_received(struct nfc_hci_dev *hdev, |
185 | u8 event, struct sk_buff *skb); |
186 | |
187 | int st21nfca_hci_discover_se(struct nfc_hci_dev *hdev); |
188 | int st21nfca_hci_enable_se(struct nfc_hci_dev *hdev, u32 se_idx); |
189 | int st21nfca_hci_disable_se(struct nfc_hci_dev *hdev, u32 se_idx); |
190 | int st21nfca_hci_se_io(struct nfc_hci_dev *hdev, u32 se_idx, |
191 | u8 *apdu, size_t apdu_length, |
192 | se_io_cb_t cb, void *cb_context); |
193 | |
194 | void st21nfca_se_init(struct nfc_hci_dev *hdev); |
195 | void st21nfca_se_deinit(struct nfc_hci_dev *hdev); |
196 | |
197 | int st21nfca_hci_loopback_event_received(struct nfc_hci_dev *ndev, u8 event, |
198 | struct sk_buff *skb); |
199 | int st21nfca_vendor_cmds_init(struct nfc_hci_dev *ndev); |
200 | |
201 | #endif /* __LOCAL_ST21NFCA_H_ */ |
202 | |