Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 306685
b: refs/heads/master
c: d4ccb13
h: refs/heads/master
i:
  306683: 584be05
v: v3
  • Loading branch information
Eric Lapuyade authored and John W. Linville committed May 15, 2012
1 parent f8f2bcf commit 85b219a
Show file tree
Hide file tree
Showing 4 changed files with 29 additions and 13 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: addfabf98daad7b469ad788a622dbeab6aaaa330
refs/heads/master: d4ccb132801aeeb2cfd18c4b4b7fa0043ab37f80
1 change: 0 additions & 1 deletion trunk/include/net/nfc/nfc.h
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,6 @@ struct nfc_dev {
struct nfc_target *targets;
int n_targets;
int targets_generation;
spinlock_t targets_lock;
struct device dev;
bool dev_up;
bool polling;
Expand Down
35 changes: 26 additions & 9 deletions trunk/net/nfc/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -501,6 +501,9 @@ 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.
* 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.
*/
int nfc_targets_found(struct nfc_dev *dev,
struct nfc_target *targets, int n_targets)
Expand All @@ -514,7 +517,7 @@ int nfc_targets_found(struct nfc_dev *dev,
for (i = 0; i < n_targets; i++)
targets[i].idx = dev->target_next_idx++;

spin_lock_bh(&dev->targets_lock);
device_lock(&dev->dev);

dev->targets_generation++;

Expand All @@ -524,27 +527,39 @@ int nfc_targets_found(struct nfc_dev *dev,

if (!dev->targets) {
dev->n_targets = 0;
spin_unlock_bh(&dev->targets_lock);
device_unlock(&dev->dev);
return -ENOMEM;
}

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

nfc_genl_targets_found(dev);

return 0;
}
EXPORT_SYMBOL(nfc_targets_found);

/**
* nfc_target_lost - inform that an activated target went out of field
*
* @dev: The nfc device that had the activated target in field
* @target_idx: the nfc index of the target
*
* The device driver must call this function when the activated target
* goes out of the field.
* 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.
*/
int nfc_target_lost(struct nfc_dev *dev, u32 target_idx)
{
struct nfc_target *tg;
int i;

pr_debug("dev_name %s n_target %d\n", dev_name(&dev->dev), target_idx);

spin_lock_bh(&dev->targets_lock);
device_lock(&dev->dev);

for (i = 0; i < dev->n_targets; i++) {
tg = &dev->targets[i];
Expand All @@ -553,7 +568,7 @@ int nfc_target_lost(struct nfc_dev *dev, u32 target_idx)
}

if (i == dev->n_targets) {
spin_unlock_bh(&dev->targets_lock);
device_unlock(&dev->dev);
return -EINVAL;
}

Expand All @@ -569,7 +584,7 @@ int nfc_target_lost(struct nfc_dev *dev, u32 target_idx)
dev->targets = NULL;
}

spin_unlock_bh(&dev->targets_lock);
device_unlock(&dev->dev);

nfc_genl_target_lost(dev, target_idx);

Expand Down Expand Up @@ -607,8 +622,10 @@ static void nfc_check_pres_work(struct work_struct *work)
mod_timer(&dev->check_pres_timer, jiffies +
msecs_to_jiffies(NFC_CHECK_PRES_FREQ_MS));
} else {
nfc_target_lost(dev, dev->active_target->idx);
dev->active_target = NULL;
u32 active_target_idx = dev->active_target->idx;
device_unlock(&dev->dev);
nfc_target_lost(dev, active_target_idx);
return;
}
}

Expand Down Expand Up @@ -681,9 +698,9 @@ struct nfc_dev *nfc_allocate_device(struct nfc_ops *ops,
dev->tx_headroom = tx_headroom;
dev->tx_tailroom = tx_tailroom;

spin_lock_init(&dev->targets_lock);
nfc_genl_data_init(&dev->genl_data);


/* first generation must not be 0 */
dev->targets_generation = 1;

Expand Down
4 changes: 2 additions & 2 deletions trunk/net/nfc/netlink.c
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ static int nfc_genl_dump_targets(struct sk_buff *skb,
cb->args[1] = (long) dev;
}

spin_lock_bh(&dev->targets_lock);
device_lock(&dev->dev);

cb->seq = dev->targets_generation;

Expand All @@ -141,7 +141,7 @@ static int nfc_genl_dump_targets(struct sk_buff *skb,
i++;
}

spin_unlock_bh(&dev->targets_lock);
device_unlock(&dev->dev);

cb->args[0] = i;

Expand Down

0 comments on commit 85b219a

Please sign in to comment.