Fix unhandled NCI errors and wrong states
This patch handles NCI errors and wrong states like
NCI_STATUS_SEMANTIC_ERROR, NCI_DISCOVER_NTF_LAST_ABORT,
NCI_PROTOCOL_UNKNOWN
Change-Id: If10912736a4a4fa4cacc493395000a97674fcb0d
diff --git a/src/nfa/dm/nfa_dm_discover.c b/src/nfa/dm/nfa_dm_discover.c
index 9930cfa..6066381 100644
--- a/src/nfa/dm/nfa_dm_discover.c
+++ b/src/nfa/dm/nfa_dm_discover.c
@@ -1908,6 +1908,13 @@
}
/* Otherwise, deactivating when getting unexpected activation */
}
+ else if (p_data->nfc_discover.status == NCI_STATUS_SEMANTIC_ERROR)
+ {
+ /* check any pending flags like NFA_DM_DISC_FLAGS_STOPPING or NFA_DM_DISC_FLAGS_DISABLING */
+ nfa_dm_disc_new_state (NFA_DM_RFST_IDLE);
+ /* check if need to restart discovery after resync discovery state with NFCC */
+ nfa_dm_start_rf_discover ();
+ }
/* Otherwise, wait for deactivation NTF */
break;
@@ -1988,7 +1995,17 @@
}
break;
case NFA_DM_RF_DISCOVER_NTF:
- nfa_dm_disc_new_state (NFA_DM_RFST_W4_ALL_DISCOVERIES);
+ /* Notification Type = NCI_DISCOVER_NTF_LAST_ABORT */
+ if (p_data->nfc_discover.result.more == NCI_DISCOVER_NTF_LAST_ABORT)
+ {
+ /* Fix for multiple tags: After receiving deactivate event, restart discovery */
+ NFA_TRACE_DEBUG0 ("Received NCI_DISCOVER_NTF_LAST_ABORT, sending deactivate command");
+ NFC_Deactivate (NFA_DEACTIVATE_TYPE_IDLE);
+ }
+ else
+ {
+ nfa_dm_disc_new_state (NFA_DM_RFST_W4_ALL_DISCOVERIES);
+ }
nfa_dm_notify_discovery (p_data);
break;
case NFA_DM_RF_INTF_ACTIVATED_NTF:
@@ -2086,6 +2103,14 @@
nfa_dm_start_rf_discover ();
break;
case NFA_DM_RF_DISCOVER_NTF:
+ if(p_data->nfc_discover.result.protocol == NCI_PROTOCOL_UNKNOWN)
+ {
+ /* fix for p2p interop issues */
+ NFA_TRACE_DEBUG0("Unknown protocol - Restart Discovery");
+ /* after receiving unknown protocol, restart discovery */
+ NFC_Deactivate (NFA_DEACTIVATE_TYPE_IDLE);
+ return;
+ }
/* if deactivate CMD is already sent then ignore discover NTF */
if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP))
{
@@ -2221,6 +2246,7 @@
break;
default:
NFA_TRACE_ERROR0 ("nfa_dm_disc_sm_w4_host_select (): Unexpected discovery event");
+ NFC_Deactivate (NFA_DEACTIVATE_TYPE_IDLE);
break;
}
diff --git a/src/nfc/nfc/nfc_ncif.c b/src/nfc/nfc/nfc_ncif.c
index 80663bb..fe41ec8 100644
--- a/src/nfc/nfc/nfc_ncif.c
+++ b/src/nfc/nfc/nfc_ncif.c
@@ -1005,6 +1005,12 @@
if (p_cb->p_cback)
(*p_cb->p_cback) (NFC_RF_CONN_ID, NFC_DEACTIVATE_CEVT, (tNFC_CONN *) p_deact);
+ if((nfc_cb.flags & (NFC_FL_DISCOVER_PENDING | NFC_FL_CONTROL_REQUESTED))
+ && (deact_type == NFC_DEACTIVATE_TYPE_DISCOVERY) && (is_ntf == TRUE))
+ {
+ NFC_TRACE_DEBUG0 ("Abnormal State, Deactivate NTF is ignored, MW is already going to Discovery state");
+ return;
+ }
if (nfc_cb.p_discv_cback)
{