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