NFC: Handle error during NCI data exchange
authorIlan Elias <ilane@ti.com>
Tue, 20 Dec 2011 14:57:41 +0000 (16:57 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 4 Jan 2012 19:30:39 +0000 (14:30 -0500)
Add support for NCI Interface Error Notification.
When this notification is received and we're during a
data exchange transaction, indicate an error to the NFC
core layer via the data exchange callback.

Signed-off-by: Ilan Elias <ilane@ti.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
include/net/nfc/nci.h
net/nfc/nci/ntf.c

index 2a7fdb2656113831e09e2574c1542777832b01d8..2be95e2626c0a364f7c7a8858503971be5428aff 100644 (file)
@@ -260,6 +260,12 @@ struct nci_core_conn_credit_ntf {
        struct conn_credit_entry        conn_entries[NCI_MAX_NUM_CONN];
 } __packed;
 
+#define NCI_OP_CORE_INTF_ERROR_NTF     nci_opcode_pack(NCI_GID_CORE, 0x08)
+struct nci_core_intf_error_ntf {
+       __u8    status;
+       __u8    conn_id;
+} __packed;
+
 #define NCI_OP_RF_INTF_ACTIVATED_NTF   nci_opcode_pack(NCI_GID_RF_MGMT, 0x05)
 struct rf_tech_specific_params_nfca_poll {
        __u16   sens_res;
index c8813eda786554b8c89b875576d6b68b0f6216f4..352f7a2321d9041bfdda52f3313f8123d8565c72 100644 (file)
@@ -71,6 +71,20 @@ static void nci_core_conn_credits_ntf_packet(struct nci_dev *ndev,
                queue_work(ndev->tx_wq, &ndev->tx_work);
 }
 
+static void nci_core_conn_intf_error_ntf_packet(struct nci_dev *ndev,
+                                               struct sk_buff *skb)
+{
+       struct nci_core_intf_error_ntf *ntf = (void *) skb->data;
+
+       ntf->conn_id = nci_conn_id(&ntf->conn_id);
+
+       pr_debug("status 0x%x, conn_id %d\n", ntf->status, ntf->conn_id);
+
+       /* complete the data exchange transaction, if exists */
+       if (test_bit(NCI_DATA_EXCHANGE, &ndev->flags))
+               nci_data_exchange_complete(ndev, NULL, -EIO);
+}
+
 static __u8 *nci_extract_rf_params_nfca_passive_poll(struct nci_dev *ndev,
                        struct nci_rf_intf_activated_ntf *ntf, __u8 *data)
 {
@@ -280,6 +294,10 @@ void nci_ntf_packet(struct nci_dev *ndev, struct sk_buff *skb)
                nci_core_conn_credits_ntf_packet(ndev, skb);
                break;
 
+       case NCI_OP_CORE_INTF_ERROR_NTF:
+               nci_core_conn_intf_error_ntf_packet(ndev, skb);
+               break;
+
        case NCI_OP_RF_INTF_ACTIVATED_NTF:
                nci_rf_intf_activated_ntf_packet(ndev, skb);
                break;