st21nfca.h (5912B)
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 61struct st21nfca_se_status { 62 bool is_ese_present; 63 bool is_uicc_present; 64}; 65 66enum 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 */ 96enum 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 110struct st21nfca_vendor_info { 111 struct completion req_completion; 112 struct sk_buff *rx_skb; 113}; 114 115struct 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 127struct 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 147struct 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 167int 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); 171void st21nfca_hci_remove(struct nfc_hci_dev *hdev); 172 173int st21nfca_dep_event_received(struct nfc_hci_dev *hdev, 174 u8 event, struct sk_buff *skb); 175int st21nfca_tm_send_dep_res(struct nfc_hci_dev *hdev, struct sk_buff *skb); 176 177int st21nfca_im_send_atr_req(struct nfc_hci_dev *hdev, u8 *gb, size_t gb_len); 178int st21nfca_im_send_dep_req(struct nfc_hci_dev *hdev, struct sk_buff *skb); 179void st21nfca_dep_init(struct nfc_hci_dev *hdev); 180void st21nfca_dep_deinit(struct nfc_hci_dev *hdev); 181 182int st21nfca_connectivity_event_received(struct nfc_hci_dev *hdev, u8 host, 183 u8 event, struct sk_buff *skb); 184int st21nfca_apdu_reader_event_received(struct nfc_hci_dev *hdev, 185 u8 event, struct sk_buff *skb); 186 187int st21nfca_hci_discover_se(struct nfc_hci_dev *hdev); 188int st21nfca_hci_enable_se(struct nfc_hci_dev *hdev, u32 se_idx); 189int st21nfca_hci_disable_se(struct nfc_hci_dev *hdev, u32 se_idx); 190int 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 194void st21nfca_se_init(struct nfc_hci_dev *hdev); 195void st21nfca_se_deinit(struct nfc_hci_dev *hdev); 196 197int st21nfca_hci_loopback_event_received(struct nfc_hci_dev *ndev, u8 event, 198 struct sk_buff *skb); 199int st21nfca_vendor_cmds_init(struct nfc_hci_dev *ndev); 200 201#endif /* __LOCAL_ST21NFCA_H_ */