Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d94f9c55 authored by Eric Lapuyade's avatar Eric Lapuyade Committed by John W. Linville
Browse files

NFC: nfc_targets_found() should accept zero target found



The semantics for a zero target found event is that the polling operation
could not complete.

Signed-off-by: default avatarEric Lapuyade <eric.lapuyade@intel.com>
Signed-off-by: default avatarSamuel Ortiz <sameo@linux.intel.com>
parent 8668fdd6
Loading
Loading
Loading
Loading
+13 −6
Original line number Original line Diff line number Diff line
@@ -560,6 +560,8 @@ EXPORT_SYMBOL(nfc_alloc_recv_skb);
 * The device driver must call this function when one or many nfc targets
 * The device driver must call this function when one or many nfc targets
 * are found. After calling this function, the device driver must stop
 * are found. After calling this function, the device driver must stop
 * polling for targets.
 * 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.
 * 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
 * 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.
 * the NFC Core to call other nfc ops entry point concurrently.
@@ -586,7 +588,11 @@ int nfc_targets_found(struct nfc_dev *dev,
	dev->targets_generation++;
	dev->targets_generation++;


	kfree(dev->targets);
	kfree(dev->targets);
	dev->targets = kmemdup(targets, n_targets * sizeof(struct nfc_target),
	dev->targets = NULL;

	if (targets) {
		dev->targets = kmemdup(targets,
				       n_targets * sizeof(struct nfc_target),
				       GFP_ATOMIC);
				       GFP_ATOMIC);


		if (!dev->targets) {
		if (!dev->targets) {
@@ -594,6 +600,7 @@ int nfc_targets_found(struct nfc_dev *dev,
			device_unlock(&dev->dev);
			device_unlock(&dev->dev);
			return -ENOMEM;
			return -ENOMEM;
		}
		}
	}


	dev->n_targets = n_targets;
	dev->n_targets = n_targets;
	device_unlock(&dev->dev);
	device_unlock(&dev->dev);