forked from Minki/linux
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: Eric Lapuyade <eric.lapuyade@intel.com> Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
This commit is contained in:
parent
8668fdd6ef
commit
d94f9c55ff
@ -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,13 +588,18 @@ 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;
|
||||||
GFP_ATOMIC);
|
|
||||||
|
|
||||||
if (!dev->targets) {
|
if (targets) {
|
||||||
dev->n_targets = 0;
|
dev->targets = kmemdup(targets,
|
||||||
device_unlock(&dev->dev);
|
n_targets * sizeof(struct nfc_target),
|
||||||
return -ENOMEM;
|
GFP_ATOMIC);
|
||||||
|
|
||||||
|
if (!dev->targets) {
|
||||||
|
dev->n_targets = 0;
|
||||||
|
device_unlock(&dev->dev);
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dev->n_targets = n_targets;
|
dev->n_targets = n_targets;
|
||||||
|
Loading…
Reference in New Issue
Block a user