Commit 3682f49f authored by Christophe Ricard's avatar Christophe Ricard Committed by Samuel Ortiz

NFC: netlink: Add new netlink command NFC_CMD_ACTIVATE_TARGET

Some tag might get deactivated after some read or write tentative.
This may happen for example with Mifare Ultralight C tag when trying
to read the last 4 blocks (starting block 0x2c) configured as write
only.
NFC_CMD_ACTIVATE_TARGET will try to reselect the tag in order to
detect if it got remove from the field or if it is still present.
Signed-off-by: default avatarChristophe Ricard <christophe-h.ricard@st.com>
Signed-off-by: default avatarSamuel Ortiz <sameo@linux.intel.com>
parent 9295b5b5
...@@ -116,6 +116,7 @@ enum nfc_commands { ...@@ -116,6 +116,7 @@ enum nfc_commands {
NFC_EVENT_SE_TRANSACTION, NFC_EVENT_SE_TRANSACTION,
NFC_CMD_GET_SE, NFC_CMD_GET_SE,
NFC_CMD_SE_IO, NFC_CMD_SE_IO,
NFC_CMD_ACTIVATE_TARGET,
/* private: internal use only */ /* private: internal use only */
__NFC_CMD_AFTER_LAST __NFC_CMD_AFTER_LAST
}; };
......
...@@ -810,6 +810,31 @@ static int nfc_genl_stop_poll(struct sk_buff *skb, struct genl_info *info) ...@@ -810,6 +810,31 @@ static int nfc_genl_stop_poll(struct sk_buff *skb, struct genl_info *info)
return rc; return rc;
} }
static int nfc_genl_activate_target(struct sk_buff *skb, struct genl_info *info)
{
struct nfc_dev *dev;
u32 device_idx, target_idx, protocol;
int rc;
if (!info->attrs[NFC_ATTR_DEVICE_INDEX])
return -EINVAL;
device_idx = nla_get_u32(info->attrs[NFC_ATTR_DEVICE_INDEX]);
dev = nfc_get_device(device_idx);
if (!dev)
return -ENODEV;
target_idx = nla_get_u32(info->attrs[NFC_ATTR_TARGET_INDEX]);
protocol = nla_get_u32(info->attrs[NFC_ATTR_PROTOCOLS]);
nfc_deactivate_target(dev, target_idx);
rc = nfc_activate_target(dev, target_idx, protocol);
nfc_put_device(dev);
return 0;
}
static int nfc_genl_dep_link_up(struct sk_buff *skb, struct genl_info *info) static int nfc_genl_dep_link_up(struct sk_buff *skb, struct genl_info *info)
{ {
struct nfc_dev *dev; struct nfc_dev *dev;
...@@ -1455,6 +1480,11 @@ static const struct genl_ops nfc_genl_ops[] = { ...@@ -1455,6 +1480,11 @@ static const struct genl_ops nfc_genl_ops[] = {
.doit = nfc_genl_se_io, .doit = nfc_genl_se_io,
.policy = nfc_genl_policy, .policy = nfc_genl_policy,
}, },
{
.cmd = NFC_CMD_ACTIVATE_TARGET,
.doit = nfc_genl_activate_target,
.policy = nfc_genl_policy,
},
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment