mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 19:21:31 -04:00
NFC: 3.15: First pull request
This is the NFC pull request for 3.15. With this one we have: - Support for ISO 15693 a.k.a. NFC vicinity a.k.a. Type 5 tags. ISO 15693 are long range (1 - 2 meters) vicinity tags/cards. The kernel now supports those through the NFC netlink and digital APIs. - Support for TI's trf7970a chipset. This chipset relies on the NFC digital layer and the driver currently supports type 2, 4A and 5 tags. - Support for NXP's pn544 secure firmare download. The pn544 C3 chipsets relies on a different firmware download protocal than the C2 one. We now support both and use the right one depending on the version we detect at runtime. - Support for 4A tags from the NFC digital layer. - A bunch of cleanups and minor fixes from Axel Lin and Thierry Escande. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABAgAGBQJTI1oQAAoJEIqAPN1PVmxKmxgP/iiwhQwsehiUZ6oXYjAc06WT e+vmJwHuDgbEnr5QDSIdpeaKuxYtCErbFcG4SD5+thTQNEeiRsmTLYdkwZ0FCDF+ WKU3F59EdUZu4F0GyUXvt8lUC3D96bJSIHMCJdg1YDJtyaJcuITeK7lW325CK4hF 4ik0+HXcv9mt/Dq4k6xgqdgCOSz7o9dJSbzw5NTCN1I+G6CNgYrvYqSmvsKut2C7 DQvFu8KhbUkSlXgY61YIA2qpf1hfATkfgLdSsjGJfYdKvWLUAyKbEwoG8dkFA38Y yqc49SJ6DJ4FGmSt4Qm2VtRa8HLqwjA30jBEeb7Zog80j7zEBS+th0NJxqDWp/82 eaeNdfrA5d17CHiR9ODuGOFt3VJZeN83u+JCli3FKGF727A/2Z0UI8UgnB5ZfcbZ +5IxV6mQp/h8H4AaQzGQ88x2xibhnrW/XYmTpoxj7CcT3AdbGw/IerZXf+afXBce iyJZ+Ktr6d5zFucCbm0QyZDSwAhfYDIYGiM6AIM3oum9n3K31dA0Qxy6saMiiK8c ArYY6raQbRCaOBVCI8JI6PoQFvw5MNug40v7Q/G88dElte9mSLsGslVVhCNBpAVB Atdwa+I3gwgsea1oqGJo0rSEaWv6PsOeQcFG8boDoQDUvgapzk17bTCz4k2DlXO5 U0Q/GcJnFEdcDhqVKqP5 =xikL -----END PGP SIGNATURE----- Merge tag 'nfc-next-3.15-1' of git://git.kernel.org/pub/scm/linux/kernel/git/sameo/nfc-next Samuel Ortiz <[email protected]> says: "NFC: 3.15: First pull request This is the NFC pull request for 3.15. With this one we have: - Support for ISO 15693 a.k.a. NFC vicinity a.k.a. Type 5 tags. ISO 15693 are long range (1 - 2 meters) vicinity tags/cards. The kernel now supports those through the NFC netlink and digital APIs. - Support for TI's trf7970a chipset. This chipset relies on the NFC digital layer and the driver currently supports type 2, 4A and 5 tags. - Support for NXP's pn544 secure firmare download. The pn544 C3 chipsets relies on a different firmware download protocal than the C2 one. We now support both and use the right one depending on the version we detect at runtime. - Support for 4A tags from the NFC digital layer. - A bunch of cleanups and minor fixes from Axel Lin and Thierry Escande." Signed-off-by: John W. Linville <[email protected]>
This commit is contained in:
commit
20d83f2464
22 changed files with 1985 additions and 68 deletions
|
|
@ -280,9 +280,6 @@ static struct nfc_target *nfc_find_target(struct nfc_dev *dev, u32 target_idx)
|
|||
{
|
||||
int i;
|
||||
|
||||
if (dev->n_targets == 0)
|
||||
return NULL;
|
||||
|
||||
for (i = 0; i < dev->n_targets; i++) {
|
||||
if (dev->targets[i].idx == target_idx)
|
||||
return &dev->targets[i];
|
||||
|
|
@ -546,9 +543,9 @@ error:
|
|||
|
||||
struct nfc_se *nfc_find_se(struct nfc_dev *dev, u32 se_idx)
|
||||
{
|
||||
struct nfc_se *se, *n;
|
||||
struct nfc_se *se;
|
||||
|
||||
list_for_each_entry_safe(se, n, &dev->secure_elements, list)
|
||||
list_for_each_entry(se, &dev->secure_elements, list)
|
||||
if (se->idx == se_idx)
|
||||
return se;
|
||||
|
||||
|
|
@ -655,9 +652,6 @@ int nfc_set_remote_general_bytes(struct nfc_dev *dev, u8 *gb, u8 gb_len)
|
|||
{
|
||||
pr_debug("dev_name=%s gb_len=%d\n", dev_name(&dev->dev), gb_len);
|
||||
|
||||
if (gb_len > NFC_MAX_GT_LEN)
|
||||
return -EINVAL;
|
||||
|
||||
return nfc_llcp_set_remote_gb(dev, gb, gb_len);
|
||||
}
|
||||
EXPORT_SYMBOL(nfc_set_remote_general_bytes);
|
||||
|
|
|
|||
|
|
@ -72,6 +72,12 @@ void digital_poll_next_tech(struct nfc_digital_dev *ddev);
|
|||
|
||||
int digital_in_send_sens_req(struct nfc_digital_dev *ddev, u8 rf_tech);
|
||||
int digital_in_send_sensf_req(struct nfc_digital_dev *ddev, u8 rf_tech);
|
||||
int digital_in_send_iso15693_inv_req(struct nfc_digital_dev *ddev, u8 rf_tech);
|
||||
|
||||
int digital_in_iso_dep_pull_sod(struct nfc_digital_dev *ddev,
|
||||
struct sk_buff *skb);
|
||||
int digital_in_iso_dep_push_sod(struct nfc_digital_dev *ddev,
|
||||
struct sk_buff *skb);
|
||||
|
||||
int digital_target_found(struct nfc_digital_dev *ddev,
|
||||
struct nfc_target *target, u8 protocol);
|
||||
|
|
|
|||
|
|
@ -25,6 +25,8 @@
|
|||
#define DIGITAL_PROTO_NFCF_RF_TECH \
|
||||
(NFC_PROTO_FELICA_MASK | NFC_PROTO_NFC_DEP_MASK)
|
||||
|
||||
#define DIGITAL_PROTO_ISO15693_RF_TECH NFC_PROTO_ISO15693_MASK
|
||||
|
||||
struct digital_cmd {
|
||||
struct list_head queue;
|
||||
|
||||
|
|
@ -331,6 +333,18 @@ int digital_target_found(struct nfc_digital_dev *ddev,
|
|||
}
|
||||
break;
|
||||
|
||||
case NFC_PROTO_ISO15693:
|
||||
framing = NFC_DIGITAL_FRAMING_ISO15693_T5T;
|
||||
check_crc = digital_skb_check_crc_b;
|
||||
add_crc = digital_skb_add_crc_b;
|
||||
break;
|
||||
|
||||
case NFC_PROTO_ISO14443:
|
||||
framing = NFC_DIGITAL_FRAMING_NFCA_T4T;
|
||||
check_crc = digital_skb_check_crc_a;
|
||||
add_crc = digital_skb_add_crc_a;
|
||||
break;
|
||||
|
||||
default:
|
||||
pr_err("Invalid protocol %d\n", protocol);
|
||||
return -EINVAL;
|
||||
|
|
@ -461,7 +475,7 @@ static int digital_start_poll(struct nfc_dev *nfc_dev, __u32 im_protocols,
|
|||
digital_add_poll_tech(ddev, NFC_DIGITAL_RF_TECH_106A,
|
||||
digital_in_send_sens_req);
|
||||
|
||||
if (im_protocols & DIGITAL_PROTO_NFCF_RF_TECH) {
|
||||
if (matching_im_protocols & DIGITAL_PROTO_NFCF_RF_TECH) {
|
||||
digital_add_poll_tech(ddev, NFC_DIGITAL_RF_TECH_212F,
|
||||
digital_in_send_sensf_req);
|
||||
|
||||
|
|
@ -469,7 +483,11 @@ static int digital_start_poll(struct nfc_dev *nfc_dev, __u32 im_protocols,
|
|||
digital_in_send_sensf_req);
|
||||
}
|
||||
|
||||
if (tm_protocols & NFC_PROTO_NFC_DEP_MASK) {
|
||||
if (matching_im_protocols & DIGITAL_PROTO_ISO15693_RF_TECH)
|
||||
digital_add_poll_tech(ddev, NFC_DIGITAL_RF_TECH_ISO15693,
|
||||
digital_in_send_iso15693_inv_req);
|
||||
|
||||
if (matching_tm_protocols & NFC_PROTO_NFC_DEP_MASK) {
|
||||
if (ddev->ops->tg_listen_mdaa) {
|
||||
digital_add_poll_tech(ddev, 0,
|
||||
digital_tg_listen_mdaa);
|
||||
|
|
@ -607,20 +625,30 @@ static void digital_in_send_complete(struct nfc_digital_dev *ddev, void *arg,
|
|||
|
||||
if (IS_ERR(resp)) {
|
||||
rc = PTR_ERR(resp);
|
||||
resp = NULL;
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (ddev->curr_protocol == NFC_PROTO_MIFARE)
|
||||
if (ddev->curr_protocol == NFC_PROTO_MIFARE) {
|
||||
rc = digital_in_recv_mifare_res(resp);
|
||||
else
|
||||
rc = ddev->skb_check_crc(resp);
|
||||
/* crc check is done in digital_in_recv_mifare_res() */
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (ddev->curr_protocol == NFC_PROTO_ISO14443) {
|
||||
rc = digital_in_iso_dep_pull_sod(ddev, resp);
|
||||
if (rc)
|
||||
goto done;
|
||||
}
|
||||
|
||||
rc = ddev->skb_check_crc(resp);
|
||||
|
||||
done:
|
||||
if (rc) {
|
||||
kfree_skb(resp);
|
||||
resp = NULL;
|
||||
}
|
||||
|
||||
done:
|
||||
data_exch->cb(data_exch->cb_context, resp, rc);
|
||||
|
||||
kfree(data_exch);
|
||||
|
|
@ -632,6 +660,7 @@ static int digital_in_send(struct nfc_dev *nfc_dev, struct nfc_target *target,
|
|||
{
|
||||
struct nfc_digital_dev *ddev = nfc_get_drvdata(nfc_dev);
|
||||
struct digital_data_exch *data_exch;
|
||||
int rc;
|
||||
|
||||
data_exch = kzalloc(sizeof(struct digital_data_exch), GFP_KERNEL);
|
||||
if (!data_exch) {
|
||||
|
|
@ -642,13 +671,27 @@ static int digital_in_send(struct nfc_dev *nfc_dev, struct nfc_target *target,
|
|||
data_exch->cb = cb;
|
||||
data_exch->cb_context = cb_context;
|
||||
|
||||
if (ddev->curr_protocol == NFC_PROTO_NFC_DEP)
|
||||
return digital_in_send_dep_req(ddev, target, skb, data_exch);
|
||||
if (ddev->curr_protocol == NFC_PROTO_NFC_DEP) {
|
||||
rc = digital_in_send_dep_req(ddev, target, skb, data_exch);
|
||||
goto exit;
|
||||
}
|
||||
|
||||
if (ddev->curr_protocol == NFC_PROTO_ISO14443) {
|
||||
rc = digital_in_iso_dep_push_sod(ddev, skb);
|
||||
if (rc)
|
||||
goto exit;
|
||||
}
|
||||
|
||||
ddev->skb_add_crc(skb);
|
||||
|
||||
return digital_in_send_cmd(ddev, skb, 500, digital_in_send_complete,
|
||||
data_exch);
|
||||
rc = digital_in_send_cmd(ddev, skb, 500, digital_in_send_complete,
|
||||
data_exch);
|
||||
|
||||
exit:
|
||||
if (rc)
|
||||
kfree(data_exch);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
static struct nfc_ops digital_nfc_ops = {
|
||||
|
|
@ -700,6 +743,10 @@ struct nfc_digital_dev *nfc_digital_allocate_device(struct nfc_digital_ops *ops,
|
|||
ddev->protocols |= NFC_PROTO_FELICA_MASK;
|
||||
if (supported_protocols & NFC_PROTO_NFC_DEP_MASK)
|
||||
ddev->protocols |= NFC_PROTO_NFC_DEP_MASK;
|
||||
if (supported_protocols & NFC_PROTO_ISO15693_MASK)
|
||||
ddev->protocols |= NFC_PROTO_ISO15693_MASK;
|
||||
if (supported_protocols & NFC_PROTO_ISO14443_MASK)
|
||||
ddev->protocols |= NFC_PROTO_ISO14443_MASK;
|
||||
|
||||
ddev->tx_headroom = tx_headroom + DIGITAL_MAX_HEADER_LEN;
|
||||
ddev->tx_tailroom = tx_tailroom + DIGITAL_CRC_LEN;
|
||||
|
|
|
|||
|
|
@ -30,6 +30,7 @@
|
|||
|
||||
#define DIGITAL_SEL_RES_NFCID1_COMPLETE(sel_res) (!((sel_res) & 0x04))
|
||||
#define DIGITAL_SEL_RES_IS_T2T(sel_res) (!((sel_res) & 0x60))
|
||||
#define DIGITAL_SEL_RES_IS_T4T(sel_res) ((sel_res) & 0x20)
|
||||
#define DIGITAL_SEL_RES_IS_NFC_DEP(sel_res) ((sel_res) & 0x40)
|
||||
|
||||
#define DIGITAL_SENS_RES_IS_T1T(sens_res) (((sens_res) & 0x0C00) == 0x0C00)
|
||||
|
|
@ -51,6 +52,34 @@
|
|||
#define DIGITAL_SENSF_REQ_RC_SC 1
|
||||
#define DIGITAL_SENSF_REQ_RC_AP 2
|
||||
|
||||
#define DIGITAL_CMD_ISO15693_INVENTORY_REQ 0x01
|
||||
|
||||
#define DIGITAL_ISO15693_REQ_FLAG_DATA_RATE BIT(1)
|
||||
#define DIGITAL_ISO15693_REQ_FLAG_INVENTORY BIT(2)
|
||||
#define DIGITAL_ISO15693_REQ_FLAG_NB_SLOTS BIT(5)
|
||||
#define DIGITAL_ISO15693_RES_FLAG_ERROR BIT(0)
|
||||
#define DIGITAL_ISO15693_RES_IS_VALID(flags) \
|
||||
(!((flags) & DIGITAL_ISO15693_RES_FLAG_ERROR))
|
||||
|
||||
#define DIGITAL_ISO_DEP_I_PCB 0x02
|
||||
#define DIGITAL_ISO_DEP_PNI(pni) ((pni) & 0x01)
|
||||
|
||||
#define DIGITAL_ISO_DEP_PCB_TYPE(pcb) ((pcb) & 0xC0)
|
||||
|
||||
#define DIGITAL_ISO_DEP_I_BLOCK 0x00
|
||||
|
||||
#define DIGITAL_ISO_DEP_BLOCK_HAS_DID(pcb) ((pcb) & 0x08)
|
||||
|
||||
static const u8 digital_ats_fsc[] = {
|
||||
16, 24, 32, 40, 48, 64, 96, 128,
|
||||
};
|
||||
|
||||
#define DIGITAL_ATS_FSCI(t0) ((t0) & 0x0F)
|
||||
#define DIGITAL_ATS_MAX_FSC 256
|
||||
|
||||
#define DIGITAL_RATS_BYTE1 0xE0
|
||||
#define DIGITAL_RATS_PARAM 0x80
|
||||
|
||||
struct digital_sdd_res {
|
||||
u8 nfcid1[4];
|
||||
u8 bcc;
|
||||
|
|
@ -82,9 +111,127 @@ struct digital_sensf_res {
|
|||
u8 rd[2];
|
||||
} __packed;
|
||||
|
||||
struct digital_iso15693_inv_req {
|
||||
u8 flags;
|
||||
u8 cmd;
|
||||
u8 mask_len;
|
||||
u64 mask;
|
||||
} __packed;
|
||||
|
||||
struct digital_iso15693_inv_res {
|
||||
u8 flags;
|
||||
u8 dsfid;
|
||||
u64 uid;
|
||||
} __packed;
|
||||
|
||||
static int digital_in_send_sdd_req(struct nfc_digital_dev *ddev,
|
||||
struct nfc_target *target);
|
||||
|
||||
int digital_in_iso_dep_pull_sod(struct nfc_digital_dev *ddev,
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
u8 pcb;
|
||||
u8 block_type;
|
||||
|
||||
if (skb->len < 1)
|
||||
return -EIO;
|
||||
|
||||
pcb = *skb->data;
|
||||
block_type = DIGITAL_ISO_DEP_PCB_TYPE(pcb);
|
||||
|
||||
/* No support fo R-block nor S-block */
|
||||
if (block_type != DIGITAL_ISO_DEP_I_BLOCK) {
|
||||
pr_err("ISO_DEP R-block and S-block not supported\n");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
if (DIGITAL_ISO_DEP_BLOCK_HAS_DID(pcb)) {
|
||||
pr_err("DID field in ISO_DEP PCB not supported\n");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
skb_pull(skb, 1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int digital_in_iso_dep_push_sod(struct nfc_digital_dev *ddev,
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
/*
|
||||
* Chaining not supported so skb->len + 1 PCB byte + 2 CRC bytes must
|
||||
* not be greater than remote FSC
|
||||
*/
|
||||
if (skb->len + 3 > ddev->target_fsc)
|
||||
return -EIO;
|
||||
|
||||
skb_push(skb, 1);
|
||||
|
||||
*skb->data = DIGITAL_ISO_DEP_I_PCB | ddev->curr_nfc_dep_pni;
|
||||
|
||||
ddev->curr_nfc_dep_pni =
|
||||
DIGITAL_ISO_DEP_PNI(ddev->curr_nfc_dep_pni + 1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void digital_in_recv_ats(struct nfc_digital_dev *ddev, void *arg,
|
||||
struct sk_buff *resp)
|
||||
{
|
||||
struct nfc_target *target = arg;
|
||||
u8 fsdi;
|
||||
int rc;
|
||||
|
||||
if (IS_ERR(resp)) {
|
||||
rc = PTR_ERR(resp);
|
||||
resp = NULL;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
if (resp->len < 2) {
|
||||
rc = -EIO;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
fsdi = DIGITAL_ATS_FSCI(resp->data[1]);
|
||||
if (fsdi >= 8)
|
||||
ddev->target_fsc = DIGITAL_ATS_MAX_FSC;
|
||||
else
|
||||
ddev->target_fsc = digital_ats_fsc[fsdi];
|
||||
|
||||
ddev->curr_nfc_dep_pni = 0;
|
||||
|
||||
rc = digital_target_found(ddev, target, NFC_PROTO_ISO14443);
|
||||
|
||||
exit:
|
||||
dev_kfree_skb(resp);
|
||||
kfree(target);
|
||||
|
||||
if (rc)
|
||||
digital_poll_next_tech(ddev);
|
||||
}
|
||||
|
||||
static int digital_in_send_rats(struct nfc_digital_dev *ddev,
|
||||
struct nfc_target *target)
|
||||
{
|
||||
int rc;
|
||||
struct sk_buff *skb;
|
||||
|
||||
skb = digital_skb_alloc(ddev, 2);
|
||||
if (!skb)
|
||||
return -ENOMEM;
|
||||
|
||||
*skb_put(skb, 1) = DIGITAL_RATS_BYTE1;
|
||||
*skb_put(skb, 1) = DIGITAL_RATS_PARAM;
|
||||
|
||||
rc = digital_in_send_cmd(ddev, skb, 30, digital_in_recv_ats,
|
||||
target);
|
||||
if (rc)
|
||||
kfree_skb(skb);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
static void digital_in_recv_sel_res(struct nfc_digital_dev *ddev, void *arg,
|
||||
struct sk_buff *resp)
|
||||
{
|
||||
|
|
@ -122,8 +269,19 @@ static void digital_in_recv_sel_res(struct nfc_digital_dev *ddev, void *arg,
|
|||
goto exit_free_skb;
|
||||
}
|
||||
|
||||
target->sel_res = sel_res;
|
||||
|
||||
if (DIGITAL_SEL_RES_IS_T2T(sel_res)) {
|
||||
nfc_proto = NFC_PROTO_MIFARE;
|
||||
} else if (DIGITAL_SEL_RES_IS_T4T(sel_res)) {
|
||||
rc = digital_in_send_rats(ddev, target);
|
||||
if (rc)
|
||||
goto exit;
|
||||
/*
|
||||
* Skip target_found and don't free it for now. This will be
|
||||
* done when receiving the ATS
|
||||
*/
|
||||
goto exit_free_skb;
|
||||
} else if (DIGITAL_SEL_RES_IS_NFC_DEP(sel_res)) {
|
||||
nfc_proto = NFC_PROTO_NFC_DEP;
|
||||
} else {
|
||||
|
|
@ -131,8 +289,6 @@ static void digital_in_recv_sel_res(struct nfc_digital_dev *ddev, void *arg,
|
|||
goto exit;
|
||||
}
|
||||
|
||||
target->sel_res = sel_res;
|
||||
|
||||
rc = digital_target_found(ddev, target, nfc_proto);
|
||||
|
||||
exit:
|
||||
|
|
@ -473,6 +629,93 @@ int digital_in_send_sensf_req(struct nfc_digital_dev *ddev, u8 rf_tech)
|
|||
return rc;
|
||||
}
|
||||
|
||||
static void digital_in_recv_iso15693_inv_res(struct nfc_digital_dev *ddev,
|
||||
void *arg, struct sk_buff *resp)
|
||||
{
|
||||
struct digital_iso15693_inv_res *res;
|
||||
struct nfc_target *target = NULL;
|
||||
int rc;
|
||||
|
||||
if (IS_ERR(resp)) {
|
||||
rc = PTR_ERR(resp);
|
||||
resp = NULL;
|
||||
goto out_free_skb;
|
||||
}
|
||||
|
||||
if (resp->len != sizeof(*res)) {
|
||||
rc = -EIO;
|
||||
goto out_free_skb;
|
||||
}
|
||||
|
||||
res = (struct digital_iso15693_inv_res *)resp->data;
|
||||
|
||||
if (!DIGITAL_ISO15693_RES_IS_VALID(res->flags)) {
|
||||
PROTOCOL_ERR("ISO15693 - 10.3.1");
|
||||
rc = -EINVAL;
|
||||
goto out_free_skb;
|
||||
}
|
||||
|
||||
target = kzalloc(sizeof(*target), GFP_KERNEL);
|
||||
if (!target) {
|
||||
rc = -ENOMEM;
|
||||
goto out_free_skb;
|
||||
}
|
||||
|
||||
target->is_iso15693 = 1;
|
||||
target->iso15693_dsfid = res->dsfid;
|
||||
memcpy(target->iso15693_uid, &res->uid, sizeof(target->iso15693_uid));
|
||||
|
||||
rc = digital_target_found(ddev, target, NFC_PROTO_ISO15693);
|
||||
|
||||
kfree(target);
|
||||
|
||||
out_free_skb:
|
||||
dev_kfree_skb(resp);
|
||||
|
||||
if (rc)
|
||||
digital_poll_next_tech(ddev);
|
||||
}
|
||||
|
||||
int digital_in_send_iso15693_inv_req(struct nfc_digital_dev *ddev, u8 rf_tech)
|
||||
{
|
||||
struct digital_iso15693_inv_req *req;
|
||||
struct sk_buff *skb;
|
||||
int rc;
|
||||
|
||||
rc = digital_in_configure_hw(ddev, NFC_DIGITAL_CONFIG_RF_TECH,
|
||||
NFC_DIGITAL_RF_TECH_ISO15693);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
rc = digital_in_configure_hw(ddev, NFC_DIGITAL_CONFIG_FRAMING,
|
||||
NFC_DIGITAL_FRAMING_ISO15693_INVENTORY);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
skb = digital_skb_alloc(ddev, sizeof(*req));
|
||||
if (!skb)
|
||||
return -ENOMEM;
|
||||
|
||||
skb_put(skb, sizeof(*req) - sizeof(req->mask)); /* No mask */
|
||||
req = (struct digital_iso15693_inv_req *)skb->data;
|
||||
|
||||
/* Single sub-carrier, high data rate, no AFI, single slot
|
||||
* Inventory command
|
||||
*/
|
||||
req->flags = DIGITAL_ISO15693_REQ_FLAG_DATA_RATE |
|
||||
DIGITAL_ISO15693_REQ_FLAG_INVENTORY |
|
||||
DIGITAL_ISO15693_REQ_FLAG_NB_SLOTS;
|
||||
req->cmd = DIGITAL_CMD_ISO15693_INVENTORY_REQ;
|
||||
req->mask_len = 0;
|
||||
|
||||
rc = digital_in_send_cmd(ddev, skb, 30,
|
||||
digital_in_recv_iso15693_inv_res, NULL);
|
||||
if (rc)
|
||||
kfree_skb(skb);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int digital_tg_send_sel_res(struct nfc_digital_dev *ddev)
|
||||
{
|
||||
struct sk_buff *skb;
|
||||
|
|
|
|||
|
|
@ -20,14 +20,12 @@
|
|||
|
||||
#include "llc.h"
|
||||
|
||||
static struct list_head llc_engines;
|
||||
static LIST_HEAD(llc_engines);
|
||||
|
||||
int nfc_llc_init(void)
|
||||
{
|
||||
int r;
|
||||
|
||||
INIT_LIST_HEAD(&llc_engines);
|
||||
|
||||
r = nfc_llc_nop_register();
|
||||
if (r)
|
||||
goto exit;
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@
|
|||
|
||||
static u8 llcp_magic[3] = {0x46, 0x66, 0x6d};
|
||||
|
||||
static struct list_head llcp_devices;
|
||||
static LIST_HEAD(llcp_devices);
|
||||
|
||||
static void nfc_llcp_rx_skb(struct nfc_llcp_local *local, struct sk_buff *skb);
|
||||
|
||||
|
|
@ -293,9 +293,9 @@ static void nfc_llcp_sdreq_timer(unsigned long data)
|
|||
|
||||
struct nfc_llcp_local *nfc_llcp_find_local(struct nfc_dev *dev)
|
||||
{
|
||||
struct nfc_llcp_local *local, *n;
|
||||
struct nfc_llcp_local *local;
|
||||
|
||||
list_for_each_entry_safe(local, n, &llcp_devices, list)
|
||||
list_for_each_entry(local, &llcp_devices, list)
|
||||
if (local->dev == dev)
|
||||
return local;
|
||||
|
||||
|
|
@ -609,14 +609,16 @@ u8 *nfc_llcp_general_bytes(struct nfc_dev *dev, size_t *general_bytes_len)
|
|||
|
||||
int nfc_llcp_set_remote_gb(struct nfc_dev *dev, u8 *gb, u8 gb_len)
|
||||
{
|
||||
struct nfc_llcp_local *local = nfc_llcp_find_local(dev);
|
||||
struct nfc_llcp_local *local;
|
||||
|
||||
if (gb_len < 3 || gb_len > NFC_MAX_GT_LEN)
|
||||
return -EINVAL;
|
||||
|
||||
local = nfc_llcp_find_local(dev);
|
||||
if (local == NULL) {
|
||||
pr_err("No LLCP device\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
if (gb_len < 3)
|
||||
return -EINVAL;
|
||||
|
||||
memset(local->remote_gb, 0, NFC_MAX_GT_LEN);
|
||||
memcpy(local->remote_gb, gb, gb_len);
|
||||
|
|
@ -1622,8 +1624,6 @@ void nfc_llcp_unregister_device(struct nfc_dev *dev)
|
|||
|
||||
int __init nfc_llcp_init(void)
|
||||
{
|
||||
INIT_LIST_HEAD(&llcp_devices);
|
||||
|
||||
return nfc_llcp_sock_init();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -74,7 +74,7 @@ static int __nci_request(struct nci_dev *ndev,
|
|||
|
||||
ndev->req_status = NCI_REQ_PEND;
|
||||
|
||||
init_completion(&ndev->req_completion);
|
||||
reinit_completion(&ndev->req_completion);
|
||||
req(ndev, opt);
|
||||
completion_rc =
|
||||
wait_for_completion_interruptible_timeout(&ndev->req_completion,
|
||||
|
|
@ -709,6 +709,7 @@ struct nci_dev *nci_allocate_device(struct nci_ops *ops,
|
|||
ndev->ops = ops;
|
||||
ndev->tx_headroom = tx_headroom;
|
||||
ndev->tx_tailroom = tx_tailroom;
|
||||
init_completion(&ndev->req_completion);
|
||||
|
||||
ndev->nfc_dev = nfc_allocate_device(&nci_nfc_ops,
|
||||
supported_protocols,
|
||||
|
|
|
|||
|
|
@ -105,7 +105,7 @@ int nci_spi_send(struct nci_spi *nspi,
|
|||
if (ret != 0 || nspi->acknowledge_mode == NCI_SPI_CRC_DISABLED)
|
||||
goto done;
|
||||
|
||||
init_completion(&nspi->req_completion);
|
||||
reinit_completion(&nspi->req_completion);
|
||||
completion_rc = wait_for_completion_interruptible_timeout(
|
||||
&nspi->req_completion,
|
||||
NCI_SPI_SEND_TIMEOUT);
|
||||
|
|
@ -145,6 +145,7 @@ struct nci_spi *nci_spi_allocate_spi(struct spi_device *spi,
|
|||
|
||||
nspi->spi = spi;
|
||||
nspi->ndev = ndev;
|
||||
init_completion(&nspi->req_completion);
|
||||
|
||||
return nspi;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -94,6 +94,14 @@ static int nfc_genl_send_target(struct sk_buff *msg, struct nfc_target *target,
|
|||
target->sensf_res))
|
||||
goto nla_put_failure;
|
||||
|
||||
if (target->is_iso15693) {
|
||||
if (nla_put_u8(msg, NFC_ATTR_TARGET_ISO15693_DSFID,
|
||||
target->iso15693_dsfid) ||
|
||||
nla_put(msg, NFC_ATTR_TARGET_ISO15693_UID,
|
||||
sizeof(target->iso15693_uid), target->iso15693_uid))
|
||||
goto nla_put_failure;
|
||||
}
|
||||
|
||||
return genlmsg_end(msg, hdr);
|
||||
|
||||
nla_put_failure:
|
||||
|
|
|
|||
Loading…
Reference in a new issue