artf222278-Timeout-occured-for-40-seconds
diff --git a/src/nfa/hci/nfa_hci_utils.c b/src/nfa/hci/nfa_hci_utils.c
index 31ef8ba..1cf00cb 100755
--- a/src/nfa/hci/nfa_hci_utils.c
+++ b/src/nfa/hci/nfa_hci_utils.c
@@ -360,6 +360,24 @@
{
nfa_hci_cb.hci_packet_len = msg_len;
nfa_hci_cb.IsEventAbortSent = FALSE;
+ if(instruction == NFA_EVT_ABORT)
+ {
+ NFA_TRACE_DEBUG0 ("Flush the queue!!!");
+ NFC_FlushData(nfa_hci_cb.conn_id);
+ }
+ else if(nfa_hci_cb.IsLastEvtAbortFailed)
+ {
+ /* send EVT_ABORT command */
+ if((p_buf = (BT_HDR *) GKI_getpoolbuf (NFC_RW_POOL_ID)) != NULL)
+ {
+ p_buf->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE;
+ p_data = (UINT8 *) (p_buf + 1) + p_buf->offset;
+ *p_data++ = (NFA_HCI_NO_MESSAGE_FRAGMENTATION << 7) | (nfa_hci_cb.pipe_in_use & 0x7F);
+ *p_data++ = (NFA_HCI_EVENT_TYPE << 6) | NFA_EVT_ABORT;
+ p_buf->len = 2;
+ NFC_SendData(nfa_hci_cb.conn_id, p_buf);
+ }
+ }
}
#endif
diff --git a/src/nfa/int/nfa_hci_int.h b/src/nfa/int/nfa_hci_int.h
index 7e91925..c5f2ee4 100755
--- a/src/nfa/int/nfa_hci_int.h
+++ b/src/nfa/int/nfa_hci_int.h
@@ -501,6 +501,7 @@
BOOLEAN bIsHciResponseTimedout;
UINT16 hci_packet_len;
BOOLEAN IsEventAbortSent;
+ BOOLEAN IsLastEvtAbortFailed;
tNFA_HCI_EVENT_SENT evt_sent;
struct
{
diff --git a/src/nfc/include/nfc_api.h b/src/nfc/include/nfc_api.h
index 2c855fd..1741649 100755
--- a/src/nfc/include/nfc_api.h
+++ b/src/nfc/include/nfc_api.h
@@ -231,12 +231,13 @@
#define NFC_FIRST_REVT 0x5000
#define NFC_FIRST_CEVT 0x6000
#define NFC_FIRST_TEVT 0x8000
-#if (NXP_EXTNS == TRUE)
+#if ((NXP_EXTNS == TRUE) && (NXP_ESE_DUAL_MODE_PRIO_SCHEME == NXP_ESE_WIRED_MODE_RESUME))
void nfc_ncif_onWiredModeHold_timeout();
void nfc_ncif_allow_dwp_transmission();
void nfc_ncif_modeSet_Ntf_timeout();
void nfc_ncif_modeSet_rsp_timeout();
void nfc_ncif_resume_dwp_wired_mode();
+void nfc_ncif_pwr_link_rsp_timeout();
#endif
/* the events reported on tNFC_RESPONSE_CBACK */
enum
diff --git a/src/nfc/int/nfc_int.h b/src/nfc/int/nfc_int.h
index 35a0f57..017ce26 100644
--- a/src/nfc/int/nfc_int.h
+++ b/src/nfc/int/nfc_int.h
@@ -97,6 +97,12 @@
#define NFC_TTYPE_P2P_PRIO_LOGIC_DEACT_NTF_TIMEOUT 113
#endif
#define NFC_TTYPE_VS_BASE 200
+#if((NXP_EXTNS == TRUE) && (NXP_ESE_DUAL_MODE_PRIO_SCHEME == NXP_ESE_WIRED_MODE_RESUME))
+#define NFC_TTYPE_PWR_LINK_RSP 201 /* Added for sending fave pwr link response to JNI since pwrlink cmd has been
+ ignored due to RF CE session */
+#define NFC_TTYPE_SET_MODE_RSP 202
+#endif
+
/* NFC Task event messages */
@@ -203,6 +209,11 @@
#if(NXP_EXTNS == TRUE)
#define NFC_WAIT_RSP_NXP 0x02
#endif
+typedef struct
+{
+ BOOLEAN bPwrLinkCmdRequested;
+ UINT16 param;
+} tNFC_PWRLINK_CMD;
typedef struct
{
@@ -283,9 +294,15 @@
BOOLEAN bRetransmitDwpPacket;
BOOLEAN bIsCreditNtfRcvd;
BOOLEAN bSetmodeOnReq;
+ BOOLEAN bCeActivatedeSE;
+ tNFC_PWRLINK_CMD pwr_link_cmd;
TIMER_LIST_ENT rf_filed_event_timeout_timer;
TIMER_LIST_ENT nci_wait_setMode_Ntf_timer;
+ TIMER_LIST_ENT nci_wait_pwrLinkRsp_timer;
+ TIMER_LIST_ENT nci_wait_setModeRsp_timer;
BOOLEAN bIsDwpResPending;
+ BOOLEAN bIssueModeSetCmd;
+ BOOLEAN bBlkPwrlinkAndModeSetCmd;
BT_HDR *temp_data;
#endif
} tNFC_CB;
diff --git a/src/nfc/nci/nci_hmsgs.c b/src/nfc/nci/nci_hmsgs.c
index ae29d24..5b6fc94 100755
--- a/src/nfc/nci/nci_hmsgs.c
+++ b/src/nfc/nci/nci_hmsgs.c
@@ -351,8 +351,20 @@
{
BT_HDR *p;
UINT8 *pp;
+#if (NXP_ESE_DUAL_MODE_PRIO_SCHEME == NXP_ESE_WIRED_MODE_RESUME)
+ if(nfc_cb.bBlkPwrlinkAndModeSetCmd)
+ {
+ NFC_TRACE_DEBUG0("pwr link cmd ignored due to RF session");
+ nfc_cb.pwr_link_cmd.bPwrLinkCmdRequested = TRUE;
+ nfc_cb.pwr_link_cmd.param = cfg_value;
+ nfc_start_quick_timer (&nfc_cb.nci_wait_pwrLinkRsp_timer, NFC_TTYPE_PWR_LINK_RSP,
+ ((UINT32) 100) * QUICK_TIMER_TICKS_PER_SEC / 1000);
+ return (NCI_STATUS_OK);
+ }
+#endif
if ((p = NCI_GET_CMD_BUF (NCI_PWR_LINK_PARAM_CMD_SIZE)) == NULL)
return (NCI_STATUS_FAILED);
+
p->event = BT_EVT_TO_NFC_NCI;
p->len = NCI_MSG_HDR_SIZE + NCI_PWR_LINK_PARAM_CMD_SIZE;
p->offset = NCI_MSG_OFFSET_SIZE;
@@ -384,16 +396,20 @@
BT_HDR *p;
UINT8 *pp;
- if ((p = NCI_GET_CMD_BUF (NCI_CORE_PARAM_SIZE_NFCEE_MODE_SET)) == NULL)
- return (NCI_STATUS_FAILED);
-#if(NXP_EXTNS == TRUE)
- if((nfc_cb.bBlockWiredMode) && (NFCEE_ID_ESE == nfcee_id))
+#if (NXP_ESE_DUAL_MODE_PRIO_SCHEME == NXP_ESE_WIRED_MODE_RESUME)
+ if((nfc_cb.bBlkPwrlinkAndModeSetCmd) && (NFCEE_ID_ESE == nfcee_id))
{
- nfc_start_timer(&nfc_cb.nci_wait_setMode_Ntf_timer, (UINT16)NFC_TYPE_NCI_WAIT_SETMODE_RSP, NFC_NCI_SETMODE_NTF_TIMEOUT);
+ NFC_TRACE_DEBUG0("mode set cmd ignored due to RF session");
+ nfc_start_quick_timer (&nfc_cb.nci_wait_pwrLinkRsp_timer, NFC_TTYPE_SET_MODE_RSP,
+ ((UINT32) 100) * QUICK_TIMER_TICKS_PER_SEC / 1000);
nfc_cb.bSetmodeOnReq = TRUE;
return NCI_STATUS_OK;
}
#endif
+
+ if ((p = NCI_GET_CMD_BUF (NCI_CORE_PARAM_SIZE_NFCEE_MODE_SET)) == NULL)
+ return (NCI_STATUS_FAILED);
+
p->event = BT_EVT_TO_NFC_NCI;
p->len = NCI_MSG_HDR_SIZE + NCI_CORE_PARAM_SIZE_NFCEE_MODE_SET;
p->offset = NCI_MSG_OFFSET_SIZE;
@@ -407,10 +423,6 @@
UINT8_TO_STREAM (pp, nfcee_mode);
nfc_ncif_send_cmd (p);
-#if(NXP_EXTNS == TRUE)
- if(NFCEE_ID_ESE == nfcee_id)
- nfc_start_timer(&nfc_cb.nci_wait_setMode_Ntf_timer, (UINT16)NFC_TYPE_NCI_WAIT_SETMODE_NTF, NFC_NCI_SETMODE_NTF_TIMEOUT);
-#endif
return (NCI_STATUS_OK);
}
#endif
diff --git a/src/nfc/nci/nci_hrcv.c b/src/nfc/nci/nci_hrcv.c
index 9aefedb..8be0209 100755
--- a/src/nfc/nci/nci_hrcv.c
+++ b/src/nfc/nci/nci_hrcv.c
@@ -375,6 +375,20 @@
pwr_lnk_ctrl.nfcee_id = 0;
event = NFC_NFCEE_PWR_LNK_CTRL_REVT;
pwr_lnk_ctrl.nfcee_id = *p_old++;
+#if (NXP_ESE_DUAL_MODE_PRIO_SCHEME == NXP_ESE_WIRED_MODE_RESUME)
+ if(nfc_cb.bIssueModeSetCmd)
+ {
+ NFC_TRACE_DEBUG0("mode set cmd send after pwrlink cmd");
+ nfc_cb.bSetmodeOnReq = TRUE;
+ nci_snd_nfcee_mode_set(NFCEE_ID_ESE, NFC_MODE_ACTIVATE);
+ nfc_start_timer(&nfc_cb.nci_wait_setMode_Ntf_timer, (UINT16)NFC_TYPE_NCI_WAIT_SETMODE_NTF, NFC_NCI_SETMODE_NTF_TIMEOUT);
+ nfc_cb.bIssueModeSetCmd = FALSE;
+ }
+ else
+ {
+ nfc_cb.bIssueModeSetCmd = FALSE;
+ }
+#endif
break;
#endif
default:
@@ -481,11 +495,15 @@
ee_status = *pp++;
mode_set_info.nfcee_id = *pp++;
mode_set_info.status = ee_status;
- if((!nfc_cb.bBlockWiredMode) && (nfc_cb.bSetmodeOnReq))
+#if(NXP_ESE_DUAL_MODE_PRIO_SCHEME == NXP_ESE_WIRED_MODE_RESUME)
+ if((nfc_cb.bBlockWiredMode) && (nfc_cb.bSetmodeOnReq))
{
nfc_cb.bSetmodeOnReq = FALSE;
+ nfc_cb.bBlockWiredMode = FALSE;
+ nfc_cb.bCeActivatedeSE = FALSE;
nfc_ncif_allow_dwp_transmission();
}
+#endif
}
#endif
else
diff --git a/src/nfc/nfc/nfc_main.c b/src/nfc/nfc/nfc_main.c
index 9e82d72..fccde57 100644
--- a/src/nfc/nfc/nfc_main.c
+++ b/src/nfc/nfc/nfc_main.c
@@ -914,10 +914,13 @@
nfc_cb.temp_data = NULL;
nfc_cb.bSetmodeOnReq = FALSE;
nfc_cb.bIsDwpResPending = FALSE;
-
- if(p_hal_entry_cntxt->boot_mode == NFC_NORMAL_BOOT_MODE)
- {
+ nfc_cb.bIssueModeSetCmd = FALSE;
+ nfc_cb.bCeActivatedeSE = FALSE;
+ nfc_cb.pwr_link_cmd.bPwrLinkCmdRequested = FALSE;
+ nfc_cb.bBlkPwrlinkAndModeSetCmd = FALSE;
+ if(p_hal_entry_cntxt->boot_mode != NFC_FAST_BOOT_MODE)
#endif
+ {
rw_init ();
ce_init ();
llcp_init ();
diff --git a/src/nfc/nfc/nfc_ncif.c b/src/nfc/nfc/nfc_ncif.c
index 8a1bf82..879cb7d 100644
--- a/src/nfc/nfc/nfc_ncif.c
+++ b/src/nfc/nfc/nfc_ncif.c
@@ -994,6 +994,7 @@
{
tNFC_CONN_CB *p_cb;
nfc_cb.bBlockWiredMode = TRUE;
+ nfc_cb.bBlkPwrlinkAndModeSetCmd = TRUE;
p_cb = nfc_find_conn_cb_by_conn_id(nfa_hci_cb.conn_id);
nfc_stop_timer(&nfc_cb.rf_filed_event_timeout_timer);
if(!nfc_cb.bIsCreditNtfRcvd)
@@ -1065,6 +1066,8 @@
{
NFC_TRACE_DEBUG0("nfc_ncif_proc_rf_field_ntf ON_EVT");
nfc_cb.bBlockWiredMode = TRUE;
+ nfc_cb.bBlkPwrlinkAndModeSetCmd = TRUE;
+ nfc_stop_timer(&nfc_cb.nci_wait_setMode_Ntf_timer); /* stop mode set Ntf timer if it is allready started */
nfc_start_timer(&nfc_cb.rf_filed_event_timeout_timer, (UINT16)(NFC_TTYPE_NCI_WAIT_RF_FIELD_NTF), NFC_NCI_RFFIELD_EVT_TIMEOUT);
}
else
@@ -1150,7 +1153,6 @@
NFC_TRACE_DEBUG0("nfc_ncif_onWiredModeHold_timeout");
if (nfc_cb.bBlockWiredMode)
{
- nfc_cb.bBlockWiredMode = FALSE;
nfc_ncif_resume_dwp_wired_mode();
}
}
@@ -1168,10 +1170,28 @@
NFC_TRACE_DEBUG0("nfc_ncif_resume_dwp_wired_mode");
tNFC_CONN_CB *p_cb;
p_cb = nfc_find_conn_cb_by_conn_id(nfa_hci_cb.conn_id);
- if((nfc_cb.bSetmodeOnReq) || (!GKI_queue_is_empty(&p_cb->tx_q)))
+ nfc_cb.bBlkPwrlinkAndModeSetCmd = FALSE;
+ nfc_cb.bIssueModeSetCmd = FALSE;
+ if(nfc_cb.pwr_link_cmd.bPwrLinkCmdRequested)
{
+ NFC_TRACE_DEBUG0("pwr link cmd to send");
+ nci_snd_pwr_nd_lnk_ctrl_cmd(NFCEE_ID_ESE,nfc_cb.pwr_link_cmd.param);
+ nfc_cb.pwr_link_cmd.bPwrLinkCmdRequested = FALSE;
+ if(!nfc_cb.bCeActivatedeSE)
+ nfc_cb.bIssueModeSetCmd = TRUE;
+ }
+ else if(((nfc_cb.bSetmodeOnReq) || (!GKI_queue_is_empty(&p_cb->tx_q))) && (!nfc_cb.bCeActivatedeSE))
+ {
+ NFC_TRACE_DEBUG0("mode set cmd to send");
nfc_cb.bSetmodeOnReq = TRUE;
nci_snd_nfcee_mode_set(NFCEE_ID_ESE, NFC_MODE_ACTIVATE);
+ nfc_start_timer(&nfc_cb.nci_wait_setMode_Ntf_timer, (UINT16)NFC_TYPE_NCI_WAIT_SETMODE_NTF, NFC_NCI_SETMODE_NTF_TIMEOUT);
+ }
+ else
+ {
+ nfc_cb.bBlockWiredMode = FALSE;
+ nfc_cb.bCeActivatedeSE = FALSE;
+ nfc_ncif_allow_dwp_transmission();
}
}
/*******************************************************************************
@@ -1187,22 +1207,10 @@
void nfc_ncif_modeSet_Ntf_timeout()
{
NFC_TRACE_DEBUG0("nfc_ncif_modeSet_Ntf_timeout");
- tNFC_NFCEE_MODE_SET_INFO mode_set_info;
- tNFC_RESPONSE_CBACK *p_cback = nfc_cb.p_resp_cback;
- tNFC_NFCEE_INFO_REVT nfcee_info;
- tNFC_RESPONSE *p_evt = (tNFC_RESPONSE *) &nfcee_info;
- tNFC_RESPONSE_EVT event = NFC_NFCEE_INFO_REVT;
- nfc_cb.bSetmodeOnReq = FALSE;
- p_evt = (tNFC_RESPONSE *) &mode_set_info;
- event = NFC_NFCEE_MODE_SET_INFO;
- mode_set_info.nfcee_id = NFCEE_ID_ESE;
- mode_set_info.status = NCI_STATUS_OK;
- if (p_cback)
+ if (nfc_cb.bBlockWiredMode)
{
- (*p_cback) (event, p_evt);
- }
- if (!nfc_cb.bBlockWiredMode)
- {
+ nfc_cb.bBlockWiredMode = FALSE;
+ nfc_cb.bCeActivatedeSE = FALSE;
nfc_ncif_allow_dwp_transmission();
}
}
@@ -1227,12 +1235,38 @@
p_evt = (tNFC_RESPONSE *) &mode_set_info;
event = NFC_NFCEE_MODE_SET_REVT;
mode_set_info.nfcee_id = NFCEE_ID_ESE;
+ mode_set_info.mode = NFC_MODE_ACTIVATE;
mode_set_info.status = NCI_STATUS_OK;
if (p_cback)
{
(*p_cback) (event, p_evt);
}
}
+/*******************************************************************************
+**
+** Function nfc_ncif_pwr_link_rsp_timeout
+**
+** Description This function is called when pwr link cmd is ignored due to rf session ongoing and sending fake resp
+** to aviod infinite wait for power link Rsp
+**
+** Returns void
+**
+*******************************************************************************/
+void nfc_ncif_pwr_link_rsp_timeout()
+{
+ NFC_TRACE_DEBUG0("nfc_ncif_pwr_link_rsp_timeout");
+ tNFC_RESPONSE_CBACK *p_cback = nfc_cb.p_resp_cback;
+ tNFC_NFCEE_EE_PWR_LNK_REVT pwr_lnk_ctrl;
+ tNFC_NFCEE_INFO_REVT nfcee_info;
+ tNFC_RESPONSE_EVT event = NFC_NFCEE_INFO_REVT;
+ tNFC_RESPONSE *p_evt = (tNFC_RESPONSE *) &nfcee_info;
+ p_evt = (tNFC_RESPONSE *) &pwr_lnk_ctrl;
+ pwr_lnk_ctrl.status = NCI_STATUS_OK;
+ pwr_lnk_ctrl.nfcee_id = NFCEE_ID_ESE;
+ event = NFC_NFCEE_PWR_LNK_CTRL_REVT;
+ if (p_cback)
+ (*p_cback) (event, p_evt);
+}
#endif
/*******************************************************************************
@@ -1641,7 +1675,6 @@
#if((NXP_EXTNS == TRUE) && (NXP_ESE_DUAL_MODE_PRIO_SCHEME == NXP_ESE_WIRED_MODE_RESUME))
if(nfc_cb.bBlockWiredMode)
{
- nfc_cb.bBlockWiredMode = FALSE;
nfc_ncif_resume_dwp_wired_mode();
}
#endif
@@ -1814,9 +1847,26 @@
case NCI_EE_TRIG_7816_SELECT:
if (data_len > NFC_MAX_AID_LEN)
data_len = NFC_MAX_AID_LEN;
+ NFC_TRACE_DEBUG1 ("AID len = %d", data_len);
evt_data.act_data.param.aid.len_aid = data_len;
STREAM_TO_ARRAY (evt_data.act_data.param.aid.aid, p, data_len);
break;
+#if ((NXP_EXTNS == TRUE) && (NXP_NFCC_PROP_ACTN_NTF == TRUE))
+ case NCI_EE_TRIG_RF_PROT_PROP_RSP_NTF:
+ case NCI_EE_TRIG_RF_TECH_PROP_RSP_NTF:
+ if (data_len > NFC_MAX_AID_LEN)
+ data_len = NFC_MAX_AID_LEN;
+ NFC_TRACE_DEBUG1 ("AID len = %d", data_len);
+ evt_data.act_data.param.aid.len_aid = data_len;
+ STREAM_TO_ARRAY (evt_data.act_data.param.aid.aid, p, data_len);
+ plen = plen - data_len;
+ if((plen != 0) && (*p++ == NCI_EE_TRIG_PROP_RSP_NTF))
+ {
+ evt_data.act_data.nfcee_act_ntf.len_data = *p++;
+ STREAM_TO_ARRAY (&evt_data.act_data.nfcee_act_ntf.data, p, evt_data.act_data.nfcee_act_ntf.len_data);
+ }
+ break;
+#endif
case NCI_EE_TRIG_RF_PROTOCOL:
evt_data.act_data.param.protocol = *p++;
break;
@@ -1855,6 +1905,13 @@
data_len -= ulen;
}
break;
+#if ((NFC_NXP_NOT_OPEN_INCLUDED == TRUE) && (NXP_NFCC_PROP_ACTN_NTF == TRUE))
+ case NCI_EE_TRIG_PROP_RSP_NTF:
+ NFC_TRACE_DEBUG1("NCI_EE_TRIG_PROP_APP Data len = %d", data_len);
+ evt_data.act_data.nfcee_act_ntf.len_data = data_len;
+ STREAM_TO_ARRAY (&evt_data.act_data.nfcee_act_ntf.data, p, data_len);
+ break;
+#endif
}
#if((NXP_EXTNS == TRUE) && (NXP_ESE_DUAL_MODE_PRIO_SCHEME == NXP_ESE_WIRED_MODE_RESUME))
@@ -1864,6 +1921,7 @@
if(evt_data.nfcee_id != 0xC0)
{
nfc_cb.bBlockWiredMode = TRUE;
+ nfc_cb.bBlkPwrlinkAndModeSetCmd = TRUE;
}
else
{
@@ -1873,13 +1931,12 @@
}
else if(nfc_cb.bBlockWiredMode)
{
- nfc_cb.bBlockWiredMode = FALSE;
+ nfc_cb.bCeActivatedeSE = TRUE;
nfc_ncif_resume_dwp_wired_mode();
}
}
#endif
-
- (*p_cback) (NFC_EE_ACTION_REVT, (void *) &evt_data);
+ (*p_cback) (NFC_EE_ACTION_REVT, (tNFC_RESPONSE *) &evt_data);
}
}
@@ -2643,7 +2700,6 @@
#if((NXP_EXTNS == TRUE) && (NXP_ESE_DUAL_MODE_PRIO_SCHEME == NXP_ESE_WIRED_MODE_RESUME))
if((p_cb) && (cid == NFC_RF_CONN_ID) && (nfc_cb.bBlockWiredMode))
{
- nfc_cb.bBlockWiredMode = FALSE;
nfc_ncif_resume_dwp_wired_mode();
}
#endif
diff --git a/src/nfc/nfc/nfc_task.c b/src/nfc/nfc/nfc_task.c
index e2665e4..c4a3c42 100755
--- a/src/nfc/nfc/nfc_task.c
+++ b/src/nfc/nfc/nfc_task.c
@@ -161,11 +161,13 @@
nfc_ncif_credit_ntf_timeout();
break;
}
+#if(NXP_ESE_DUAL_MODE_PRIO_SCHEME == NXP_ESE_WIRED_MODE_RESUME)
case NFC_TYPE_NCI_WAIT_SETMODE_NTF:
{
nfc_ncif_modeSet_Ntf_timeout();
break;
}
+#endif
case NFC_TYPE_NCI_WAIT_SETMODE_RSP:
{
nfc_ncif_modeSet_rsp_timeout();
@@ -347,6 +349,14 @@
ce_t4t_process_timeout (p_tle);
break;
#endif
+#if ((NFC_NXP_NOT_OPEN_INCLUDED == TRUE) && (NXP_ESE_DUAL_MODE_PRIO_SCHEME == NXP_ESE_WIRED_MODE_RESUME))
+ case NFC_TTYPE_PWR_LINK_RSP:
+ nfc_ncif_pwr_link_rsp_timeout();
+ break;
+ case NFC_TTYPE_SET_MODE_RSP:
+ nfc_ncif_modeSet_rsp_timeout();
+ break;
+#endif
default:
NFC_TRACE_DEBUG1 ("nfc_process_quick_timer_evt: unhandled timer event (0x%04x)", p_tle->event);
break;