OSDN Git Service

NFC: Prepare asynchronous error management for driver and shdlc
authorEric Lapuyade <eric.lapuyade@intel.com>
Mon, 30 Apr 2012 16:21:51 +0000 (18:21 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Mon, 9 Jul 2012 20:42:04 +0000 (16:42 -0400)
Signed-off-by: Eric Lapuyade <eric.lapuyade@intel.com>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
include/net/nfc/hci.h
net/nfc/hci/core.c
net/nfc/hci/shdlc.c

index e30e6a8..d25dd9b 100644 (file)
@@ -112,6 +112,8 @@ void nfc_hci_unregister_device(struct nfc_hci_dev *hdev);
 void nfc_hci_set_clientdata(struct nfc_hci_dev *hdev, void *clientdata);
 void *nfc_hci_get_clientdata(struct nfc_hci_dev *hdev);
 
+void nfc_hci_driver_failure(struct nfc_hci_dev *hdev, int err);
+
 /* Host IDs */
 #define NFC_HCI_HOST_CONTROLLER_ID     0x00
 #define NFC_HCI_TERMINAL_HOST_ID       0x01
index a8b0b71..1dc6485 100644 (file)
@@ -717,6 +717,14 @@ void *nfc_hci_get_clientdata(struct nfc_hci_dev *hdev)
 }
 EXPORT_SYMBOL(nfc_hci_get_clientdata);
 
+void nfc_hci_driver_failure(struct nfc_hci_dev *hdev, int err)
+{
+       /* TODO: lower layer has permanent failure.
+        * complete potential HCI command or send an empty tag discovered event
+        */
+}
+EXPORT_SYMBOL(nfc_hci_driver_failure);
+
 void nfc_hci_recv_frame(struct nfc_hci_dev *hdev, struct sk_buff *skb)
 {
        struct hcp_packet *packet;
index 6b836e6..d7c74d1 100644 (file)
@@ -523,10 +523,6 @@ static void nfc_shdlc_handle_send_queue(struct nfc_shdlc *shdlc)
 
                r = shdlc->ops->xmit(shdlc, skb);
                if (r < 0) {
-                       /*
-                        * TODO: Cannot send, shdlc machine is dead, we
-                        * must propagate the information up to HCI.
-                        */
                        shdlc->hard_fault = r;
                        break;
                }
@@ -590,6 +586,11 @@ static void nfc_shdlc_sm_work(struct work_struct *work)
                skb_queue_purge(&shdlc->ack_pending_q);
                break;
        case SHDLC_CONNECTING:
+               if (shdlc->hard_fault) {
+                       nfc_shdlc_connect_complete(shdlc, shdlc->hard_fault);
+                       break;
+               }
+
                if (shdlc->connect_tries++ < 5)
                        r = nfc_shdlc_connect_initiate(shdlc);
                else
@@ -610,6 +611,11 @@ static void nfc_shdlc_sm_work(struct work_struct *work)
                }
 
                nfc_shdlc_handle_rcv_queue(shdlc);
+
+               if (shdlc->hard_fault) {
+                       nfc_shdlc_connect_complete(shdlc, shdlc->hard_fault);
+                       break;
+               }
                break;
        case SHDLC_CONNECTED:
                nfc_shdlc_handle_rcv_queue(shdlc);
@@ -637,10 +643,7 @@ static void nfc_shdlc_sm_work(struct work_struct *work)
                }
 
                if (shdlc->hard_fault) {
-                       /*
-                        * TODO: Handle hard_fault that occured during
-                        * this invocation of the shdlc worker
-                        */
+                       nfc_hci_driver_failure(shdlc->hdev, shdlc->hard_fault);
                }
                break;
        default: