NFC: st21nfca: Implement stop_poll HCI hook
authorChristophe Ricard <christophe.ricard@gmail.com>
Tue, 20 May 2014 20:21:58 +0000 (22:21 +0200)
committerSamuel Ortiz <sameo@linux.intel.com>
Tue, 22 Jul 2014 23:04:31 +0000 (01:04 +0200)
Send DM_DISCONNECT command to disconnect Terminal Host from the HCI network.

- The persistent states of the terminal host pipes, including registry values,
are not modifies. Therefore, there is no NVRAM update to disconnect the
terminal host.
- The terminal host RF card gates are disabled which means that there will be no event
related to card RF gates until communication has been restored.
- The terminal host RF reader request is reset so the RF reader polling for terminal
host is disabled.

To restore the communication, the terminal host can send any HCI command or event.

Signed-off-by: Christophe Ricard <christophe-h.ricard@st.com>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
drivers/nfc/st21nfca/st21nfca.c

index 51e0f00b3a4fd81fb5ff5d8bf5ed239ca90ac2da..7ff1dcdd16bac42bb86a87abed0ce909962b4667 100644 (file)
@@ -53,6 +53,7 @@
 #define ST21NFCA_DM_PIPE_CREATED        0x02
 #define ST21NFCA_DM_PIPE_OPEN           0x04
 #define ST21NFCA_DM_RF_ACTIVE           0x80
+#define ST21NFCA_DM_DISCONNECT         0x30
 
 #define ST21NFCA_DM_IS_PIPE_OPEN(p) \
        ((p & 0x0f) == (ST21NFCA_DM_PIPE_CREATED | ST21NFCA_DM_PIPE_OPEN))
@@ -356,6 +357,12 @@ static int st21nfca_hci_start_poll(struct nfc_hci_dev *hdev,
        return r;
 }
 
+static void st21nfca_hci_stop_poll(struct nfc_hci_dev *hdev)
+{
+       nfc_hci_send_cmd(hdev, ST21NFCA_DEVICE_MGNT_GATE,
+                       ST21NFCA_DM_DISCONNECT, NULL, 0, NULL);
+}
+
 static int st21nfca_get_iso14443_3_atqa(struct nfc_hci_dev *hdev, u16 *atqa)
 {
        int r;
@@ -601,6 +608,7 @@ static struct nfc_hci_ops st21nfca_hci_ops = {
        .hci_ready = st21nfca_hci_ready,
        .xmit = st21nfca_hci_xmit,
        .start_poll = st21nfca_hci_start_poll,
+       .stop_poll = st21nfca_hci_stop_poll,
        .target_from_gate = st21nfca_hci_target_from_gate,
        .im_transceive = st21nfca_hci_im_transceive,
        .check_presence = st21nfca_hci_check_presence,