mirror of
https://github.com/torvalds/linux.git
synced 2024-11-22 20:22:09 +00:00
NFC: Changed target activated state logic
Signed-off-by: Eric Lapuyade <eric.lapuyade@intel.com> Signed-off-by: Samuel Ortiz <sameo@linux.intel.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
01ae0eea9b
commit
144612cacc
@ -66,6 +66,7 @@ struct nfc_ops {
|
||||
|
||||
#define NFC_TARGET_IDX_ANY -1
|
||||
#define NFC_MAX_GT_LEN 48
|
||||
#define NFC_TARGET_IDX_NONE 0xffffffff
|
||||
|
||||
struct nfc_target {
|
||||
u32 idx;
|
||||
@ -97,7 +98,7 @@ struct nfc_dev {
|
||||
struct device dev;
|
||||
bool dev_up;
|
||||
bool polling;
|
||||
bool remote_activated;
|
||||
u32 activated_target_idx;
|
||||
bool dep_link_up;
|
||||
u32 dep_rf_mode;
|
||||
struct nfc_genl_data genl_data;
|
||||
|
@ -95,7 +95,7 @@ int nfc_dev_down(struct nfc_dev *dev)
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (dev->polling || dev->remote_activated) {
|
||||
if (dev->polling || dev->activated_target_idx != NFC_TARGET_IDX_NONE) {
|
||||
rc = -EBUSY;
|
||||
goto error;
|
||||
}
|
||||
@ -211,6 +211,8 @@ int nfc_dep_link_up(struct nfc_dev *dev, int target_index, u8 comm_mode)
|
||||
}
|
||||
|
||||
rc = dev->ops->dep_link_up(dev, target_index, comm_mode, gb, gb_len);
|
||||
if (!rc)
|
||||
dev->activated_target_idx = target_index;
|
||||
|
||||
error:
|
||||
device_unlock(&dev->dev);
|
||||
@ -246,6 +248,7 @@ int nfc_dep_link_down(struct nfc_dev *dev)
|
||||
rc = dev->ops->dep_link_down(dev);
|
||||
if (!rc) {
|
||||
dev->dep_link_up = false;
|
||||
dev->activated_target_idx = NFC_TARGET_IDX_NONE;
|
||||
nfc_llcp_mac_is_down(dev);
|
||||
nfc_genl_dep_link_down_event(dev);
|
||||
}
|
||||
@ -290,7 +293,7 @@ int nfc_activate_target(struct nfc_dev *dev, u32 target_idx, u32 protocol)
|
||||
|
||||
rc = dev->ops->activate_target(dev, target_idx, protocol);
|
||||
if (!rc)
|
||||
dev->remote_activated = true;
|
||||
dev->activated_target_idx = target_idx;
|
||||
|
||||
error:
|
||||
device_unlock(&dev->dev);
|
||||
@ -318,7 +321,7 @@ int nfc_deactivate_target(struct nfc_dev *dev, u32 target_idx)
|
||||
}
|
||||
|
||||
dev->ops->deactivate_target(dev, target_idx);
|
||||
dev->remote_activated = false;
|
||||
dev->activated_target_idx = NFC_TARGET_IDX_NONE;
|
||||
|
||||
error:
|
||||
device_unlock(&dev->dev);
|
||||
@ -352,6 +355,18 @@ int nfc_data_exchange(struct nfc_dev *dev, u32 target_idx, struct sk_buff *skb,
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (dev->activated_target_idx == NFC_TARGET_IDX_NONE) {
|
||||
rc = -ENOTCONN;
|
||||
kfree_skb(skb);
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (target_idx != dev->activated_target_idx) {
|
||||
rc = -EADDRNOTAVAIL;
|
||||
kfree_skb(skb);
|
||||
goto error;
|
||||
}
|
||||
|
||||
rc = dev->ops->data_exchange(dev, target_idx, skb, cb, cb_context);
|
||||
|
||||
error:
|
||||
@ -482,6 +497,7 @@ int nfc_target_lost(struct nfc_dev *dev, u32 target_idx)
|
||||
|
||||
dev->targets_generation++;
|
||||
dev->n_targets--;
|
||||
dev->activated_target_idx = NFC_TARGET_IDX_NONE;
|
||||
|
||||
if (dev->n_targets) {
|
||||
memcpy(&dev->targets[i], &dev->targets[i + 1],
|
||||
@ -575,6 +591,8 @@ struct nfc_dev *nfc_allocate_device(struct nfc_ops *ops,
|
||||
/* first generation must not be 0 */
|
||||
dev->targets_generation = 1;
|
||||
|
||||
dev->activated_target_idx = NFC_TARGET_IDX_NONE;
|
||||
|
||||
return dev;
|
||||
}
|
||||
EXPORT_SYMBOL(nfc_allocate_device);
|
||||
|
Loading…
Reference in New Issue
Block a user