in pn544/pn544.c [501:569]
static int pn544_hci_complete_target_discovered(struct nfc_hci_dev *hdev,
u8 gate,
struct nfc_target *target)
{
struct sk_buff *uid_skb;
int r = 0;
if (gate == PN544_RF_READER_NFCIP1_INITIATOR_GATE)
return r;
if (target->supported_protocols & NFC_PROTO_NFC_DEP_MASK) {
r = nfc_hci_send_cmd(hdev,
PN544_RF_READER_NFCIP1_INITIATOR_GATE,
PN544_HCI_CMD_CONTINUE_ACTIVATION, NULL, 0, NULL);
if (r < 0)
return r;
target->hci_reader_gate = PN544_RF_READER_NFCIP1_INITIATOR_GATE;
} else if (target->supported_protocols & NFC_PROTO_MIFARE_MASK) {
if (target->nfcid1_len != 4 && target->nfcid1_len != 7 &&
target->nfcid1_len != 10)
return -EPROTO;
r = nfc_hci_send_cmd(hdev, NFC_HCI_RF_READER_A_GATE,
PN544_RF_READER_CMD_ACTIVATE_NEXT,
target->nfcid1, target->nfcid1_len, NULL);
} else if (target->supported_protocols & NFC_PROTO_FELICA_MASK) {
r = nfc_hci_get_param(hdev, PN544_RF_READER_F_GATE,
PN544_FELICA_ID, &uid_skb);
if (r < 0)
return r;
if (uid_skb->len != 8) {
kfree_skb(uid_skb);
return -EPROTO;
}
/* Type F NFC-DEP IDm has prefix 0x01FE */
if ((uid_skb->data[0] == 0x01) && (uid_skb->data[1] == 0xfe)) {
kfree_skb(uid_skb);
r = nfc_hci_send_cmd(hdev,
PN544_RF_READER_NFCIP1_INITIATOR_GATE,
PN544_HCI_CMD_CONTINUE_ACTIVATION,
NULL, 0, NULL);
if (r < 0)
return r;
target->supported_protocols = NFC_PROTO_NFC_DEP_MASK;
target->hci_reader_gate =
PN544_RF_READER_NFCIP1_INITIATOR_GATE;
} else {
r = nfc_hci_send_cmd(hdev, PN544_RF_READER_F_GATE,
PN544_RF_READER_CMD_ACTIVATE_NEXT,
uid_skb->data, uid_skb->len, NULL);
kfree_skb(uid_skb);
}
} else if (target->supported_protocols & NFC_PROTO_ISO14443_MASK) {
/*
* TODO: maybe other ISO 14443 require some kind of continue
* activation, but for now we've seen only this one below.
*/
if (target->sens_res == 0x4403) /* Type 4 Mifare DESFire */
r = nfc_hci_send_cmd(hdev, NFC_HCI_RF_READER_A_GATE,
PN544_RF_READER_A_CMD_CONTINUE_ACTIVATION,
NULL, 0, NULL);
}
return r;
}