NFC: HCI check presence must not fail when driver doesn't support it
authorEric Lapuyade <eric.lapuyade@linux.intel.com>
Tue, 2 Oct 2012 15:27:36 +0000 (17:27 +0200)
committerSamuel Ortiz <sameo@linux.intel.com>
Fri, 26 Oct 2012 16:26:46 +0000 (18:26 +0200)
When the driver does not support checking the tag is still present, it
must return -EOPNOTSUPP. The NFC Core will then stop asking and not
report a tag lost event to user space.

Signed-off-by: Eric Lapuyade <eric.lapuyade@intel.com>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
drivers/nfc/pn544_hci.c
net/nfc/core.c

index b66d4681a57770aa89cd03497f809ca0a676ec1c..70858b5f81e434ac0ebc0eb933b4fe2e06827d08 100644 (file)
@@ -986,7 +986,7 @@ static int pn544_hci_check_presence(struct nfc_hci_dev *hdev,
        } else if (target->supported_protocols & NFC_PROTO_MIFARE_MASK) {
                if (target->nfcid1_len != 4 && target->nfcid1_len != 7 &&
                    target->nfcid1_len != 10)
-                       return -EPROTO;
+                       return -EOPNOTSUPP;
 
                 return nfc_hci_send_cmd(hdev, NFC_HCI_RF_READER_A_GATE,
                                     PN544_RF_READER_CMD_ACTIVATE_NEXT,
index 479bee36dc3e4bab3338213d7d8e3a078bf96d8d..4cb069766ce54603e15586fe70c5eb534245fae5 100644 (file)
@@ -697,6 +697,8 @@ static void nfc_check_pres_work(struct work_struct *work)
 
        if (dev->active_target && timer_pending(&dev->check_pres_timer) == 0) {
                rc = dev->ops->check_presence(dev, dev->active_target);
+               if (rc == -EOPNOTSUPP)
+                       goto exit;
                if (!rc) {
                        mod_timer(&dev->check_pres_timer, jiffies +
                                  msecs_to_jiffies(NFC_CHECK_PRES_FREQ_MS));
@@ -708,6 +710,7 @@ static void nfc_check_pres_work(struct work_struct *work)
                }
        }
 
+exit:
        device_unlock(&dev->dev);
 }