Snap for 4818534 from dd72dbf6d5186eece10d5eb0303f2e0da89e35cb to pi-release

Change-Id: Id698c7280eedb3f8d2973e0b22661f5157b3f41d
diff --git a/src/include/nci_defs.h b/src/include/nci_defs.h
index 67a9afb..3cbe41b 100644
--- a/src/include/nci_defs.h
+++ b/src/include/nci_defs.h
@@ -275,6 +275,7 @@
 /****************************************************
  * NCI NFCEE INterface specific status Codes
  ****************************************************/
+#define NCI_NFCEE_STS_UNRECOVERABLE_ERROR 0x00
 #define NCI_NFCEE_STS_INTF_ACTIVATION_FAILED 0xC0
 #define NCI_NFCEE_STS_TRANSMISSION_ERROR 0xC1
 #define NCI_NFCEE_STS_PROTOCOL_ERROR 0xC2
diff --git a/src/include/nfc_config.h b/src/include/nfc_config.h
index 2e00216..c3687d9 100644
--- a/src/include/nfc_config.h
+++ b/src/include/nfc_config.h
@@ -35,6 +35,7 @@
 #define NAME_NFA_AID_BLOCK_ROUTE "NFA_AID_BLOCK_ROUTE"
 #define NAME_AID_FOR_EMPTY_SELECT "AID_FOR_EMPTY_SELECT"
 #define NAME_AID_MATCHING_MODE "AID_MATCHING_MODE"
+#define NAME_OFFHOST_AID_ROUTE_PWR_STATE "OFFHOST_AID_ROUTE_PWR_STATE"
 
 /* Configs from vendor interface */
 #define NAME_NFA_POLL_BAIL_OUT_MODE "NFA_POLL_BAIL_OUT_MODE"
diff --git a/src/nfa/dm/nfa_dm_act.cc b/src/nfa/dm/nfa_dm_act.cc
index 417fb95..59d55a6 100644
--- a/src/nfa/dm/nfa_dm_act.cc
+++ b/src/nfa/dm/nfa_dm_act.cc
@@ -339,6 +339,7 @@
     case NFC_NFCEE_INFO_REVT:     /* NFCEE Discover Notification */
     case NFC_EE_ACTION_REVT:      /* EE Action notification */
     case NFC_NFCEE_MODE_SET_REVT: /* NFCEE Mode Set response */
+    case NFC_NFCEE_STATUS_REVT:   /* NFCEE Status notification*/
     case NFC_SET_ROUTING_REVT:    /* Configure Routing response */
       nfa_ee_proc_evt(event, p_data);
       break;
@@ -1851,6 +1852,8 @@
       return "NFC_NFCC_TRANSPORT_ERR_REVT";
     case NFC_NFCC_POWER_OFF_REVT:
       return "NFC_NFCC_POWER_OFF_REVT";
+    case NFC_NFCEE_STATUS_REVT:
+      return "NFC_NFCEE_STATUS_REVT";
     default:
       return "unknown revt";
   }
diff --git a/src/nfa/ee/nfa_ee_act.cc b/src/nfa/ee/nfa_ee_act.cc
index 743034d..7b572ec 100644
--- a/src/nfa/ee/nfa_ee_act.cc
+++ b/src/nfa/ee/nfa_ee_act.cc
@@ -29,6 +29,7 @@
 #include "nfa_api.h"
 #include "nfa_dm_int.h"
 #include "nfa_ee_int.h"
+#include "nfa_hci_int.h"
 
 using android::base::StringPrintf;
 
@@ -885,12 +886,12 @@
     return;
   }
 
-  p_cb->tech_switch_on = p_data->set_tech.technologies_switch_on;
-  p_cb->tech_switch_off = p_data->set_tech.technologies_switch_off;
-  p_cb->tech_battery_off = p_data->set_tech.technologies_battery_off;
-  p_cb->tech_screen_lock = p_data->set_tech.technologies_screen_lock;
-  p_cb->tech_screen_off = p_data->set_tech.technologies_screen_off;
-  p_cb->tech_screen_off_lock = p_data->set_tech.technologies_screen_off_lock;
+  p_cb->tech_switch_on |= p_data->set_tech.technologies_switch_on;
+  p_cb->tech_switch_off |= p_data->set_tech.technologies_switch_off;
+  p_cb->tech_battery_off |= p_data->set_tech.technologies_battery_off;
+  p_cb->tech_screen_lock |= p_data->set_tech.technologies_screen_lock;
+  p_cb->tech_screen_off |= p_data->set_tech.technologies_screen_off;
+  p_cb->tech_screen_off_lock |= p_data->set_tech.technologies_screen_off_lock;
   nfa_ee_update_route_size(p_cb);
   if (nfa_ee_total_lmrt_size() > NFC_GetLmrtSize()) {
     LOG(ERROR) << StringPrintf("nfa_ee_api_set_tech_cfg Exceed LMRT size");
@@ -1506,6 +1507,9 @@
       NFA_EeGetInfo(&evt_data.ee_discover.num_ee, evt_data.ee_discover.ee_info);
       nfa_ee_report_event(p_cback, NFA_EE_DISCOVER_EVT, &evt_data);
     }
+    if ((nfa_hci_cb.hci_state == NFA_HCI_STATE_EE_RECOVERY) &&
+        nfa_ee_cb.p_enable_cback)
+      (*nfa_ee_cb.p_enable_cback)(NFA_EE_RECOVERY_REDISCOVERED);
   }
 }
 
@@ -1814,6 +1818,29 @@
 
 /*******************************************************************************
 **
+** Function         nfa_ee_nci_nfcee_status_ntf
+**
+** Description      Process the callback for NFCEE status notification
+**
+** Returns          void
+**
+*******************************************************************************/
+void nfa_ee_nci_nfcee_status_ntf(tNFA_EE_MSG* p_data) {
+  if (p_data != NULL) {
+    tNFC_NFCEE_STATUS_REVT* p_ee_data = p_data->nfcee_status_ntf.p_data;
+    if ((NFA_GetNCIVersion() == NCI_VERSION_2_0) &&
+        (p_ee_data->nfcee_status == NFC_NFCEE_STATUS_UNRECOVERABLE_ERROR)) {
+      tNFA_EE_ECB* p_cb = nfa_ee_find_ecb(p_ee_data->nfcee_id);
+      if (p_cb && nfa_ee_cb.p_enable_cback) {
+        (*nfa_ee_cb.p_enable_cback)(NFA_EE_RECOVERY_INIT);
+        NFC_NfceeDiscover(true);
+      }
+    }
+  }
+}
+
+/*******************************************************************************
+**
 ** Function         nfa_ee_check_restore_complete
 **
 ** Description      Check if restore the NFA-EE related configuration to the
@@ -1945,8 +1972,11 @@
     return;
   }
 
-  /* update routing table and vs on mode change */
-  nfa_ee_start_timer();
+  /* Do not update routing table in EE_RECOVERY state */
+  if (nfa_hci_cb.hci_state != NFA_HCI_STATE_EE_RECOVERY) {
+    /* Start routing table update debounce timer */
+    nfa_ee_start_timer();
+  }
   LOG(ERROR) << StringPrintf("%s p_rsp->status:0x%02x", __func__,
                              p_rsp->status);
   if (p_rsp->status == NFA_STATUS_OK) {
diff --git a/src/nfa/ee/nfa_ee_main.cc b/src/nfa/ee/nfa_ee_main.cc
index d635338..259bcba 100644
--- a/src/nfa/ee/nfa_ee_main.cc
+++ b/src/nfa/ee/nfa_ee_main.cc
@@ -77,7 +77,8 @@
     nfa_ee_nci_wait_rsp,        /* NFA_EE_NCI_WAIT_RSP_EVT      */
     nfa_ee_rout_timeout,        /* NFA_EE_ROUT_TIMEOUT_EVT      */
     nfa_ee_discv_timeout,       /* NFA_EE_DISCV_TIMEOUT_EVT     */
-    nfa_ee_lmrt_to_nfcc         /* NFA_EE_CFG_TO_NFCC_EVT       */
+    nfa_ee_lmrt_to_nfcc,        /* NFA_EE_CFG_TO_NFCC_EVT       */
+    nfa_ee_nci_nfcee_status_ntf /*NFA_EE_NCI_NFCEE_STATUS_NTF_EVT*/
 };
 
 /*******************************************************************************
@@ -347,6 +348,10 @@
       int_event = NFA_EE_NCI_WAIT_RSP_EVT;
       cbk.opcode = NCI_MSG_RF_SET_ROUTING;
       break;
+
+    case NFC_NFCEE_STATUS_REVT:
+      int_event = NFA_EE_NCI_NFCEE_STATUS_NTF_EVT;
+      break;
   }
 
   DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
diff --git a/src/nfa/hci/nfa_hci_main.cc b/src/nfa/hci/nfa_hci_main.cc
index 0ba7198..91aa89d 100644
--- a/src/nfa/hci/nfa_hci_main.cc
+++ b/src/nfa/hci/nfa_hci_main.cc
@@ -160,15 +160,22 @@
         }
       }
       break;
+    case NFA_EE_RECOVERY_REDISCOVERED:
     case NFA_EE_MODE_SET_COMPLETE:
       /*received mode set Ntf */
       if ((nfa_hci_cb.hci_state == NFA_HCI_STATE_WAIT_NETWK_ENABLE) ||
-          (nfa_hci_cb.hci_state == NFA_HCI_STATE_RESTORE_NETWK_ENABLE)) {
+          (nfa_hci_cb.hci_state == NFA_HCI_STATE_RESTORE_NETWK_ENABLE) ||
+          (nfa_hci_cb.hci_state == NFA_HCI_STATE_EE_RECOVERY)) {
         /* Discovery operation is complete, retrieve discovery result */
         NFA_EeGetInfo(&nfa_hci_cb.num_nfcee, nfa_hci_cb.ee_info);
         nfa_hci_enable_one_nfcee();
       }
       break;
+    case NFA_EE_RECOVERY_INIT:
+      /*NFCEE recovery in progress*/
+      nfa_ee_cb.isDiscoveryStopped = nfa_dm_act_stop_rf_discovery(NULL);
+      nfa_hci_cb.hci_state = NFA_HCI_STATE_EE_RECOVERY;
+      break;
   }
 }
 
@@ -550,7 +557,16 @@
   }
 
   if (xx == nfa_hci_cb.num_nfcee) {
-    nfa_hciu_send_get_param_cmd(NFA_HCI_ADMIN_PIPE, NFA_HCI_HOST_LIST_INDEX);
+    if ((nfa_hci_cb.hci_state == NFA_HCI_STATE_WAIT_NETWK_ENABLE) ||
+        (nfa_hci_cb.hci_state == NFA_HCI_STATE_RESTORE_NETWK_ENABLE)) {
+      nfa_hciu_send_get_param_cmd(NFA_HCI_ADMIN_PIPE, NFA_HCI_HOST_LIST_INDEX);
+    } else if (nfa_hci_cb.hci_state == NFA_HCI_STATE_EE_RECOVERY) {
+      nfa_hci_cb.hci_state = NFA_HCI_STATE_IDLE;
+      if (nfa_ee_cb.isDiscoveryStopped == true) {
+        nfa_dm_act_start_rf_discovery(NULL);
+        nfa_ee_cb.isDiscoveryStopped = false;
+      }
+    }
   }
 }
 
diff --git a/src/nfa/include/nfa_ee_int.h b/src/nfa/include/nfa_ee_int.h
index 2cd0507..5c933ab 100644
--- a/src/nfa/include/nfa_ee_int.h
+++ b/src/nfa/include/nfa_ee_int.h
@@ -73,6 +73,7 @@
   NFA_EE_ROUT_TIMEOUT_EVT,
   NFA_EE_DISCV_TIMEOUT_EVT,
   NFA_EE_CFG_TO_NFCC_EVT,
+  NFA_EE_NCI_NFCEE_STATUS_NTF_EVT,
   NFA_EE_MAX_EVT
 
 };
@@ -378,6 +379,12 @@
   tNFC_EE_DISCOVER_REQ_REVT* p_data;
 } tNFA_EE_NCI_DISC_REQ;
 
+/* data type for NFA_EE_NCI_NFCEE_STATUS_EVT */
+typedef struct {
+  NFC_HDR hdr;
+  tNFC_NFCEE_STATUS_REVT* p_data;
+} tNFA_EE_NCI_NFCEE_STATUS_NTF;
+
 /* union of all event data types */
 typedef union {
   NFC_HDR hdr;
@@ -403,6 +410,7 @@
   tNFA_EE_NCI_CONN conn;
   tNFA_EE_NCI_ACTION act;
   tNFA_EE_NCI_DISC_REQ disc_req;
+  tNFA_EE_NCI_NFCEE_STATUS_NTF nfcee_status_ntf;
 } tNFA_EE_MSG;
 
 /* type for State Machine (SM) action functions */
@@ -447,6 +455,10 @@
 #define NFA_EE_DISC_STS_REQ 0x02
 /* received NFA_EE_MODE_SET_COMPLETE  */
 #define NFA_EE_MODE_SET_COMPLETE 0x03
+/* initialize EE_RECOVERY             */
+#define NFA_EE_RECOVERY_INIT 0x04
+/* update ee config during EE_RECOVERY */
+#define NFA_EE_RECOVERY_REDISCOVERED 0x05
 typedef uint8_t tNFA_EE_DISC_STS;
 
 typedef void(tNFA_EE_ENABLE_DONE_CBACK)(tNFA_EE_DISC_STS status);
@@ -469,6 +481,7 @@
   tNFA_EE_WAIT ee_wait_evt;    /* Pending event(s) to be reported  */
   tNFA_EE_FLAGS ee_flags;      /* flags                            */
   uint8_t route_block_control; /* controls route block feature   */
+  bool isDiscoveryStopped;     /* discovery status                  */
 } tNFA_EE_CB;
 
 /* Order of Routing entries in Routing Table */
@@ -524,6 +537,7 @@
 void nfa_ee_nci_disc_rsp(tNFA_EE_MSG* p_data);
 void nfa_ee_nci_disc_ntf(tNFA_EE_MSG* p_data);
 void nfa_ee_nci_mode_set_rsp(tNFA_EE_MSG* p_data);
+void nfa_ee_nci_nfcee_status_ntf(tNFA_EE_MSG* p_data);
 void nfa_ee_nci_wait_rsp(tNFA_EE_MSG* p_data);
 void nfa_ee_nci_conn(tNFA_EE_MSG* p_data);
 void nfa_ee_nci_action_ntf(tNFA_EE_MSG* p_data);
diff --git a/src/nfa/include/nfa_hci_int.h b/src/nfa/include/nfa_hci_int.h
index 3001779..9158a4e 100644
--- a/src/nfa/include/nfa_hci_int.h
+++ b/src/nfa/include/nfa_hci_int.h
@@ -73,6 +73,8 @@
  */
 #define NFA_HCI_STATE_RESTORE_NETWK_ENABLE 0x08
 
+#define NFA_HCI_STATE_EE_RECOVERY 0x09
+
 typedef uint8_t tNFA_HCI_STATE;
 
 /* NFA HCI PIPE states */
diff --git a/src/nfc/include/nfc_api.h b/src/nfc/include/nfc_api.h
index 3601867..c4a654e 100644
--- a/src/nfc/include/nfc_api.h
+++ b/src/nfc/include/nfc_api.h
@@ -266,6 +266,8 @@
   uint8_t info[NFC_MAX_EE_INFO];
 } tNFC_NFCEE_TLV;
 
+/* NFCEE unrecoverable error */
+#define NFC_NFCEE_STATUS_UNRECOVERABLE_ERROR NCI_NFCEE_STS_UNRECOVERABLE_ERROR
 /* NFCEE connected and inactive */
 #define NFC_NFCEE_STATUS_INACTIVE NCI_NFCEE_STS_CONN_INACTIVE
 /* NFCEE connected and active   */