diff options
author | Christophe Ricard <christophe.ricard@gmail.com> | 2015-02-01 22:26:15 +0100 |
---|---|---|
committer | Samuel Ortiz <sameo@linux.intel.com> | 2015-02-02 21:50:40 +0100 |
commit | 8ae01f7967718ac9ed800a99964f88c0c8b07e11 (patch) | |
tree | b3eecaca807410f2a5f547ea9fcb551375b89163 /drivers/nfc/st21nfcb/st21nfcb.c | |
parent | NFC: nci: Add HCI over NCI protocol support (diff) | |
download | linux-8ae01f7967718ac9ed800a99964f88c0c8b07e11.tar.xz linux-8ae01f7967718ac9ed800a99964f88c0c8b07e11.zip |
NFC: st21nfcb: Add support for secure element
The st21nfcb chipset has 3 SWP (Single Wire Protocol) lines and
supports up to 3 secure elements (UICC/eSE and µSD in the future).
Some st21nfcb firmware does not support the nci command
nci_nfcee_mode_set(NCI_NFCEE_DISABLE). For this reason, we assume
2 secures elements are always present (UICC and eSE).
They will be added to the SE list once successfully activated and
they will be available only after running through enable_se
handler or when the poll in listen mode is started.
During initialization, the white_list will be always set assuming
both UICC & eSE are present.
On eSE activation, the ATR bytes are fetched to build the command
exchange timeout.
The se_io hook will allow to transfer data over SWP. 2 kind of
events may appear data is sent over:
- ST21NFCB_EVT_TRANSMIT_DATA when receiving an apdu answer
- ST21NFCB_EVT_WTX_REQUEST when the secure element needs more time
than expected to process a command. If this timeout expires, we
send a software reset, and then a hardware one if it still fails.
Signed-off-by: Christophe Ricard <christophe-h.ricard@st.com>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
Diffstat (limited to 'drivers/nfc/st21nfcb/st21nfcb.c')
-rw-r--r-- | drivers/nfc/st21nfcb/st21nfcb.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/drivers/nfc/st21nfcb/st21nfcb.c b/drivers/nfc/st21nfcb/st21nfcb.c index ea63d5877831..ca9871ab3fb3 100644 --- a/drivers/nfc/st21nfcb/st21nfcb.c +++ b/drivers/nfc/st21nfcb/st21nfcb.c @@ -22,6 +22,7 @@ #include <net/nfc/nci_core.h> #include "st21nfcb.h" +#include "st21nfcb_se.h" #define DRIVER_DESC "NCI NFC driver for ST21NFCB" @@ -78,6 +79,13 @@ static struct nci_ops st21nfcb_nci_ops = { .close = st21nfcb_nci_close, .send = st21nfcb_nci_send, .get_rfprotocol = st21nfcb_nci_get_rfprotocol, + .discover_se = st21nfcb_nci_discover_se, + .enable_se = st21nfcb_nci_enable_se, + .disable_se = st21nfcb_nci_disable_se, + .se_io = st21nfcb_nci_se_io, + .hci_load_session = st21nfcb_hci_load_session, + .hci_event_received = st21nfcb_hci_event_received, + .hci_cmd_received = st21nfcb_hci_cmd_received, }; int st21nfcb_nci_probe(struct llt_ndlc *ndlc, int phy_headroom, @@ -114,9 +122,10 @@ int st21nfcb_nci_probe(struct llt_ndlc *ndlc, int phy_headroom, if (r) { pr_err("Cannot register nfc device to nci core\n"); nci_free_device(ndlc->ndev); + return r; } - return r; + return st21nfcb_se_init(ndlc->ndev); } EXPORT_SYMBOL_GPL(st21nfcb_nci_probe); |