Add Mifare Classic support

This patch is to support NXP Mifare Classic tag

Change-Id: I36009fdf3614043a32beca4aaf2f320ba17fb40c
diff --git a/halimpl/pn54x/hal/phNxpNciHal_ext.c b/halimpl/pn54x/hal/phNxpNciHal_ext.c
index 438da55..5ea767e 100644
--- a/halimpl/pn54x/hal/phNxpNciHal_ext.c
+++ b/halimpl/pn54x/hal/phNxpNciHal_ext.c
@@ -795,6 +795,19 @@
 //        status = NFCSTATUS_FAILED;
         NXPLOG_NCIHAL_D ("> Going through workaround - Dirty Set Config - End ");
     }
+    else if(p_cmd_data[0] == 0x21 &&
+            p_cmd_data[1] == 0x00 )
+    {
+        NXPLOG_NCIHAL_D ("> Going through workaround - Add Mifare Classic in Discovery Map");
+        p_cmd_data[*cmd_len] = 0x80;
+        p_cmd_data[*cmd_len +1] = 0x01;
+        p_cmd_data[*cmd_len + 2] = 0x80;
+        p_cmd_data[5] = 0x01;
+        p_cmd_data[6] = 0x01;
+        p_cmd_data[2] += 3;
+        p_cmd_data[3] += 1;
+        *cmd_len += 3;
+    }
     else if (*cmd_len == 3 &&
              p_cmd_data[0] == 0x00 &&
              p_cmd_data[1] == 0x00 &&
diff --git a/halimpl/pn54x/libnfc-brcm.conf b/halimpl/pn54x/libnfc-brcm.conf
index 7df047b..f65859e 100644
--- a/halimpl/pn54x/libnfc-brcm.conf
+++ b/halimpl/pn54x/libnfc-brcm.conf
@@ -392,7 +392,8 @@
 #  byte[2] NCI_PROTOCOL_DUAL
 #  byte[3] NCI_PROTOCOL_15693
 #  byte[4] NCI_PROTOCOL_KOVIO
-#  byte[5] NCI_DISCOVERY_TYPE_POLL_KOVIO
-#  byte[6] NCI_DISCOVERY_TYPE_POLL_B_PRIME
-#  byte[7] NCI_DISCOVERY_TYPE_LISTEN_B_PRIME
-NFA_PROPRIETARY_CFG={05:FF:FF:06:81:70:FF:FF}
+#  byte[5] NCI_PROTOCOL_MIFARE
+#  byte[6] NCI_DISCOVERY_TYPE_POLL_KOVIO
+#  byte[7] NCI_DISCOVERY_TYPE_POLL_B_PRIME
+#  byte[8] NCI_DISCOVERY_TYPE_LISTEN_B_PRIME
+NFA_PROPRIETARY_CFG={05:FF:FF:06:81:80:70:FF:FF}
diff --git a/src/hal/int/nfc_brcm_defs.h b/src/hal/int/nfc_brcm_defs.h
index 6e8670a..ff242f5 100644
--- a/src/hal/int/nfc_brcm_defs.h
+++ b/src/hal/int/nfc_brcm_defs.h
@@ -181,6 +181,7 @@
 /**********************************************
  * NCI Interface Types
  **********************************************/
+#define NCI_INTERFACE_VS_MIFARE         0x80
 #define NCI_INTERFACE_VS_CALYPSO_CE     0x81
 #define NCI_INTERFACE_VS_T2T_CE         0x82    /* for Card Emulation side */
 #define NCI_INTERFACE_VS_15693          0x83    /* for both Reader/Writer and Card Emulation side */
diff --git a/src/include/vendor_cfg.h b/src/include/vendor_cfg.h
index 8d30325..71d2a46 100644
--- a/src/include/vendor_cfg.h
+++ b/src/include/vendor_cfg.h
@@ -30,6 +30,7 @@
     UINT8 pro_protocol_dual;
     UINT8 pro_protocol_15693;
     UINT8 pro_protocol_kovio;
+    UINT8 pro_protocol_mfc;
 
     UINT8 pro_discovery_kovio_poll;
     UINT8 pro_discovery_b_prime_poll;
@@ -57,6 +58,9 @@
 #ifndef NCI_PROTOCOL_KOVIO
 #define NCI_PROTOCOL_KOVIO              (p_nfa_proprietary_cfg->pro_protocol_kovio)
 #endif
+#ifndef NCI_PROTOCOL_MIFARE
+#define NCI_PROTOCOL_MIFARE             (p_nfa_proprietary_cfg->pro_protocol_mfc)
+#endif
 
  /**********************************************
  * Proprietary Discovery technology and mode
diff --git a/src/nfa/dm/nfa_dm_act.c b/src/nfa/dm/nfa_dm_act.c
index 942e301..d28689e 100644
--- a/src/nfa/dm/nfa_dm_act.c
+++ b/src/nfa/dm/nfa_dm_act.c
@@ -1660,7 +1660,8 @@
                      ||(nfa_dm_cb.disc_cb.activated_protocol  == NFC_PROTOCOL_T3T)
                      ||(nfa_dm_cb.disc_cb.activated_protocol  == NFC_PROTOCOL_ISO_DEP)
                      ||(nfa_dm_cb.disc_cb.activated_protocol  == NFC_PROTOCOL_15693)
-                     ||(nfa_dm_cb.disc_cb.activated_protocol  == NFC_PROTOCOL_KOVIO)  )
+                     ||(nfa_dm_cb.disc_cb.activated_protocol  == NFC_PROTOCOL_KOVIO)
+                     ||(nfa_dm_cb.disc_cb.activated_protocol  == NFC_PROTOCOL_MIFARE)  )
             {
                 /* Notify NFA tag sub-system */
                 nfa_rw_proc_disc_evt (NFA_DM_RF_DISC_ACTIVATED_EVT, p_data, TRUE);
diff --git a/src/nfa/dm/nfa_dm_cfg.c b/src/nfa/dm/nfa_dm_cfg.c
index 9be2163..ed64d52 100644
--- a/src/nfa/dm/nfa_dm_cfg.c
+++ b/src/nfa/dm/nfa_dm_cfg.c
@@ -131,6 +131,7 @@
     0x82, /* NCI_PROTOCOL_DUAL */
     0x83, /* NCI_PROTOCOL_15693 */
     0x8A, /* NCI_PROTOCOL_KOVIO */
+    0xFF, /* NCI_PROTOCOL_MIFARE */
     0x77, /* NCI_DISCOVERY_TYPE_POLL_KOVIO */
     0x74, /* NCI_DISCOVERY_TYPE_POLL_B_PRIME */
     0xF4, /* NCI_DISCOVERY_TYPE_LISTEN_B_PRIME */
diff --git a/src/nfa/dm/nfa_dm_discover.c b/src/nfa/dm/nfa_dm_discover.c
index d0c4fe0..9930cfa 100644
--- a/src/nfa/dm/nfa_dm_discover.c
+++ b/src/nfa/dm/nfa_dm_discover.c
@@ -2253,6 +2253,14 @@
     switch (event)
     {
     case NFA_DM_RF_DEACTIVATE_CMD:
+        if (nfa_dm_cb.disc_cb.activated_protocol == NCI_PROTOCOL_MIFARE)
+        {
+            nfa_dm_cb.disc_cb.deact_pending = TRUE;
+            nfa_dm_cb.disc_cb.pending_deact_type = p_data->deactivate_type;
+            status = nfa_dm_send_deactivate_cmd (p_data->deactivate_type);
+            break;
+        }
+
         if (old_sleep_wakeup_flag)
         {
             /* sleep wakeup is already enabled when deactivate cmd is requested,
diff --git a/src/nfa/include/nfa_api.h b/src/nfa/include/nfa_api.h
index 0443275..a47da1d 100644
--- a/src/nfa/include/nfa_api.h
+++ b/src/nfa/include/nfa_api.h
@@ -124,6 +124,7 @@
 #define NFA_PROTOCOL_ISO15693   NFC_PROTOCOL_15693
 #define NFA_PROTOCOL_B_PRIME    NFC_PROTOCOL_B_PRIME
 #define NFA_PROTOCOL_KOVIO      NFC_PROTOCOL_KOVIO
+#define NFA_PROTOCOL_MIFARE     NFC_PROTOCOL_MIFARE
 #define NFA_PROTOCOL_INVALID    0xFF
 #define NFA_MAX_NUM_PROTOCOLS   8
 typedef UINT8 tNFA_NFC_PROTOCOL;
@@ -595,6 +596,7 @@
 #define NFA_INTERFACE_FRAME         NFC_INTERFACE_FRAME
 #define NFA_INTERFACE_ISO_DEP       NFC_INTERFACE_ISO_DEP
 #define NFA_INTERFACE_NFC_DEP       NFC_INTERFACE_NFC_DEP
+#define NFA_INTERFACE_MIFARE        NFC_INTERFACE_MIFARE
 typedef tNFC_INTF_TYPE tNFA_INTF_TYPE;
 
 /*******************************************************************************
diff --git a/src/nfc/include/nfc_api.h b/src/nfc/include/nfc_api.h
index f9cc864..4070c5c 100644
--- a/src/nfc/include/nfc_api.h
+++ b/src/nfc/include/nfc_api.h
@@ -202,7 +202,7 @@
 
 #define NFC_NFCC_INFO_LEN       4
 #ifndef NFC_NFCC_MAX_NUM_VS_INTERFACE
-#define NFC_NFCC_MAX_NUM_VS_INTERFACE   4
+#define NFC_NFCC_MAX_NUM_VS_INTERFACE   5
 #endif
 typedef struct
 {
@@ -344,6 +344,7 @@
 #define NFC_PROTOCOL_T3T        NCI_PROTOCOL_T3T      /* Type3Tag    - NFC-F            */
 #define NFC_PROTOCOL_ISO_DEP    NCI_PROTOCOL_ISO_DEP  /* Type 4A,4B  - NFC-A or NFC-B   */
 #define NFC_PROTOCOL_NFC_DEP    NCI_PROTOCOL_NFC_DEP  /* NFCDEP/LLCP - NFC-A or NFC-F       */
+#define NFC_PROTOCOL_MIFARE     NCI_PROTOCOL_MIFARE
 #define NFC_PROTOCOL_B_PRIME    NCI_PROTOCOL_B_PRIME
 #define NFC_PROTOCOL_15693      NCI_PROTOCOL_15693
 #define NFC_PROTOCOL_KOVIO      NCI_PROTOCOL_KOVIO
@@ -393,6 +394,7 @@
 #define NFC_INTERFACE_LLCP_LOW      NCI_INTERFACE_LLCP_LOW
 #define NFC_INTERFACE_LLCP_HIGH     NCI_INTERFACE_LLCP_HIGH
 #define NFC_INTERFACE_VS_T2T_CE     NCI_INTERFACE_VS_T2T_CE
+#define NFC_INTERFACE_MIFARE        NCI_INTERFACE_VS_MIFARE
 typedef tNCI_INTF_TYPE tNFC_INTF_TYPE;
 
 /**********************************************
diff --git a/src/nfc/nfc/nfc_main.c b/src/nfc/nfc/nfc_main.c
index 908942c..ad1b474 100644
--- a/src/nfc/nfc/nfc_main.c
+++ b/src/nfc/nfc/nfc_main.c
@@ -238,7 +238,7 @@
         {
             if ((*p) <= NCI_INTERFACE_MAX)
                 evt_data.enable.nci_interfaces |= (1 << (*p));
-            else if (((*p) > NCI_INTERFACE_FIRST_VS) && (yy < NFC_NFCC_MAX_NUM_VS_INTERFACE))
+            else if (((*p) >= NCI_INTERFACE_FIRST_VS) && (yy < NFC_NFCC_MAX_NUM_VS_INTERFACE))
             {
                 /* save the VS RF interface in control block, if there's still room */
                 nfc_cb.vs_interface[yy++] = *p;
@@ -844,6 +844,12 @@
     nfc_cb.p_discv_cback = p_cback;
     num_intf             = 0;
     NFC_TRACE_DEBUG1 ("nci_interfaces supported by NFCC: 0x%x", nfc_cb.nci_interfaces);
+
+    for (xx = 0; xx < NFC_NFCC_MAX_NUM_VS_INTERFACE + NCI_INTERFACE_MAX; xx++)
+    {
+        memset (&max_maps[xx], 0x00, sizeof(tNFC_DISCOVER_MAPS));
+    }
+
     for (xx = 0; xx < num_disc_maps; xx++)
     {
         is_supported = FALSE;