NFC: Changed event_received hci ops result semantic
Eric Lapuyade [Tue, 4 Dec 2012 15:43:24 +0000 (16:43 +0100)]
Some chips use a standard HCI event code, destined to a proprietary
gate, with a different meaning. Therefore, the HCI driver must always
have a chance to intercept the event before standard processing is
attempted.
The new semantic specifies that the result value "1" means that the
driver doesn't especially handle the event. result <= 0 means it was
handled.

Signed-off-by: Eric Lapuyade <eric.lapuyade@intel.com>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>

drivers/nfc/pn544/pn544.c
net/nfc/hci/core.c

index 4af70f9..9349c54 100644 (file)
@@ -714,18 +714,23 @@ static int pn544_hci_check_presence(struct nfc_hci_dev *hdev,
        return 0;
 }
 
+/*
+ * Returns:
+ * <= 0: driver handled the event, skb consumed
+ *    1: driver does not handle the event, please do standard processing
+ */
 static int pn544_hci_event_received(struct nfc_hci_dev *hdev, u8 gate, u8 event,
                                    struct sk_buff *skb)
 {
        struct sk_buff *rgb_skb = NULL;
-       int r = 0;
+       int r;
 
        pr_debug("hci event %d", event);
        switch (event) {
        case PN544_HCI_EVT_ACTIVATED:
-               if (gate == PN544_RF_READER_NFCIP1_INITIATOR_GATE)
+               if (gate == PN544_RF_READER_NFCIP1_INITIATOR_GATE) {
                        r = nfc_hci_target_discovered(hdev, gate);
-               else if (gate == PN544_RF_READER_NFCIP1_TARGET_GATE) {
+               } else if (gate == PN544_RF_READER_NFCIP1_TARGET_GATE) {
                        r = nfc_hci_get_param(hdev, gate, PN544_DEP_ATR_REQ,
                                              &rgb_skb);
                        if (r < 0)
@@ -736,6 +741,8 @@ static int pn544_hci_event_received(struct nfc_hci_dev *hdev, u8 gate, u8 event,
                                             rgb_skb->len);
 
                        kfree_skb(rgb_skb);
+               } else {
+                       r = -EINVAL;
                }
                break;
        case PN544_HCI_EVT_DEACTIVATED:
@@ -757,8 +764,7 @@ static int pn544_hci_event_received(struct nfc_hci_dev *hdev, u8 gate, u8 event,
                skb_pull(skb, 2);
                return nfc_tm_data_received(hdev->ndev, skb);
        default:
-               pr_err("Discarded unknown event %x to gate %x\n", event, gate);
-               break;
+               return 1;
        }
 
 exit:
index f30f6fe..0430f30 100644 (file)
@@ -297,6 +297,12 @@ void nfc_hci_event_received(struct nfc_hci_dev *hdev, u8 pipe, u8 event,
                goto exit;
        }
 
+       if (hdev->ops->event_received) {
+               r = hdev->ops->event_received(hdev, gate, event, skb);
+               if (r <= 0)
+                       goto exit_noskb;
+       }
+
        switch (event) {
        case NFC_HCI_EVT_TARGET_DISCOVERED:
                if (skb->len < 1) {     /* no status data? */
@@ -322,12 +328,8 @@ void nfc_hci_event_received(struct nfc_hci_dev *hdev, u8 pipe, u8 event,
                r = nfc_hci_target_discovered(hdev, gate);
                break;
        default:
-               if (hdev->ops->event_received) {
-                       r = hdev->ops->event_received(hdev, gate, event, skb);
-                       goto exit_noskb;
-               } else {
-                       r = -EINVAL;
-               }
+               pr_info("Discarded unknown event %x to gate %x\n", event, gate);
+               r = -EINVAL;
                break;
        }