NFC: nfc_targets_found() should accept zero target found
authorEric Lapuyade <eric.lapuyade@intel.com>
Thu, 3 May 2012 14:33:32 +0000 (16:33 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Mon, 9 Jul 2012 20:42:10 +0000 (16:42 -0400)
The semantics for a zero target found event is that the polling operation
could not complete.

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

index 94ccf07374a52be8961fa014544fe957911f69c7..749ee48d36005c98b246a12f10e8c0960196479d 100644 (file)
@@ -560,6 +560,8 @@ EXPORT_SYMBOL(nfc_alloc_recv_skb);
  * The device driver must call this function when one or many nfc targets
  * are found. After calling this function, the device driver must stop
  * polling for targets.
+ * NOTE: This function can be called with targets=NULL and n_targets=0 to
+ * notify a driver error, meaning that the polling operation cannot complete.
  * IMPORTANT: this function must not be called from an atomic context.
  * In addition, it must also not be called from a context that would prevent
  * the NFC Core to call other nfc ops entry point concurrently.
@@ -586,13 +588,18 @@ int nfc_targets_found(struct nfc_dev *dev,
        dev->targets_generation++;
 
        kfree(dev->targets);
-       dev->targets = kmemdup(targets, n_targets * sizeof(struct nfc_target),
-                              GFP_ATOMIC);
+       dev->targets = NULL;
 
-       if (!dev->targets) {
-               dev->n_targets = 0;
-               device_unlock(&dev->dev);
-               return -ENOMEM;
+       if (targets) {
+               dev->targets = kmemdup(targets,
+                                      n_targets * sizeof(struct nfc_target),
+                                      GFP_ATOMIC);
+
+               if (!dev->targets) {
+                       dev->n_targets = 0;
+                       device_unlock(&dev->dev);
+                       return -ENOMEM;
+               }
        }
 
        dev->n_targets = n_targets;