NFC: pn544: Identify NFC-F device through NFCID2
authorArron Wang <arron.wang@intel.com>
Mon, 15 Apr 2013 03:16:09 +0000 (11:16 +0800)
committerArron Wang <arron.wang@intel.com>
Wed, 24 Apr 2013 07:06:36 +0000 (15:06 +0800)
NFCID2 is defined under the name of manufacture ID(IDm)
in Felica card

Change-Id: I0200a1c0efa3c5d21686fb822d26bab1b113d674
Signed-off-by: Arron Wang <arron.wang@intel.com>
drivers/nfc/pn544/pn544.c

index 9c5f16e..7f36346 100644 (file)
@@ -551,20 +551,25 @@ static int pn544_hci_complete_target_discovered(struct nfc_hci_dev *hdev,
                        return -EPROTO;
                }
 
-               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);
-
-               r = nfc_hci_send_cmd(hdev,
+               /* Felica NFCIP1 device uid 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;
+                       if (r < 0)
+                               return r;
 
-               target->hci_reader_gate = PN544_RF_READER_NFCIP1_INITIATOR_GATE;
-               target->supported_protocols = NFC_PROTO_NFC_DEP_MASK;
+                       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