summaryrefslogtreecommitdiff
path: root/src/phHal4Nfc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/phHal4Nfc.c')
-rw-r--r--src/phHal4Nfc.c65
1 files changed, 59 insertions, 6 deletions
diff --git a/src/phHal4Nfc.c b/src/phHal4Nfc.c
index 3e7c163..726b4b5 100644
--- a/src/phHal4Nfc.c
+++ b/src/phHal4Nfc.c
@@ -153,7 +153,11 @@ static void phHal4Nfc_OpenComplete(
gpphHal4Nfc_Hwref = NULL;
PHDBG_INFO("Hal4:Open Failed");
/*Call upper layer's Open Cb with error status*/
+ if(NULL != pUpper_OpenCb)
+ {
+ /*Upper layer's Open Cb*/
(*pUpper_OpenCb)(pUpper_Context,status);
+ }
}
return;
}
@@ -404,7 +408,7 @@ NFCSTATUS phHal4Nfc_Open(
if( openRetVal == NFCSTATUS_SUCCESS )
{
/*update Next state*/
- Hal4Ctxt->Hal4NextState = (HCI_SELF_TEST == eHciInitType?
+ Hal4Ctxt->Hal4NextState = (HCI_NFC_DEVICE_TEST == eHciInitType?
eHal4StateSelfTestMode:eHal4StateOpenAndReady);
/*Store callback and context ,and set Default settings in Context*/
Hal4Ctxt->sUpperLayerInfo.pUpperOpenCb = pOpenCallback;
@@ -468,13 +472,17 @@ NFCSTATUS phHal4Nfc_Ioctl(
else if(NULL == psHwReference->hal_context)
{
#ifdef FW_DOWNLOAD
+
+#if !defined (NXP_FW_INTEGRITY_VERIFY)
if(NFC_FW_DOWNLOAD_CHECK == IoctlCode)
{
RetStatus = phDnldNfc_Run_Check(
psHwReference
);
}
- else if((NFC_FW_DOWNLOAD == IoctlCode)
+ else
+#endif /* !defined (NXP_FW_INTEGRITY_VERIFY) */
+ if((NFC_FW_DOWNLOAD == IoctlCode)
&&(NULL == gpphHal4Nfc_Hwref))/*Indicates current state is shutdown*/
{
Hal4Ctxt = (phHal4Nfc_Hal4Ctxt_t *)
@@ -503,7 +511,9 @@ NFCSTATUS phHal4Nfc_Ioctl(
phHal4Nfc_DownloadComplete,
Hal4Ctxt
);
- if(NFCSTATUS_SUCCESS == RetStatus)
+ if((NFCSTATUS_SUCCESS == RetStatus)
+ || (NFCSTATUS_PENDING != PHNFCSTATUS(RetStatus))
+ )
{
phOsalNfc_FreeMemory(Hal4Ctxt);
((phHal_sHwReference_t *)psHwReference)->hal_context = NULL;
@@ -1006,10 +1016,15 @@ static void phHal4Nfc_LowerNotificationHandler(
break;
case NFC_NOTIFY_DEVICE_ERROR:
{
+ NFCSTATUS status = NFCSTATUS_BOARD_COMMUNICATION_ERROR;
+ pphHal4Nfc_GenCallback_t pUpper_OpenCb
+ = Hal4Ctxt->sUpperLayerInfo.pUpperOpenCb;
+ void *pUpper_Context
+ = Hal4Ctxt->sUpperLayerInfo.psUpperLayerCtxt;
static phHal4Nfc_NotificationInfo_t uNotificationInfo;
- Hal4Ctxt->Hal4NextState = eHal4StateInvalid;
if(NULL != Hal4Ctxt->sUpperLayerInfo.pDefaultEventHandler)
{
+ Hal4Ctxt->Hal4NextState = eHal4StateInvalid;
Hal4Ctxt->sUpperLayerInfo.pDefaultEventHandler(
Hal4Ctxt->sUpperLayerInfo.DefaultListenerCtxt,
NFC_EVENT_NOTIFICATION,
@@ -1017,8 +1032,31 @@ static void phHal4Nfc_LowerNotificationHandler(
NFCSTATUS_BOARD_COMMUNICATION_ERROR
);
}
+ else if (( eHal4StateSelfTestMode == Hal4Ctxt->Hal4NextState )
+ || ( eHal4StateOpenAndReady == Hal4Ctxt->Hal4NextState ) )
+ {
+ Hal4Ctxt->Hal4CurrentState = eHal4StateClosed;
+ Hal4Ctxt->Hal4NextState = eHal4StateInvalid;
+ (void)phHciNfc_Release((void *)Hal4Ctxt->psHciHandle,
+ pHwRef, (pphNfcIF_Notification_CB_t)NULL,
+ (void *)Hal4Ctxt);/*Clean up Hci*/
+ Hal4Ctxt->psHciHandle = NULL;
+ phOsalNfc_FreeMemory((void *)Hal4Ctxt->pHal4Nfc_LayerCfg);
+ Hal4Ctxt->pHal4Nfc_LayerCfg = NULL;
+ phOsalNfc_FreeMemory((void *)Hal4Ctxt);
+ gpphHal4Nfc_Hwref->hal_context = NULL;
+ gpphHal4Nfc_Hwref = NULL;
+ PHDBG_INFO("Hal4:Open Failed");
+ /*Call upper layer's Open Cb with error status*/
+ if(NULL != pUpper_OpenCb)
+ {
+ /*Upper layer's Open Cb*/
+ (*pUpper_OpenCb)(pUpper_Context,status);
+ }
+ }
else
{
+ Hal4Ctxt->Hal4NextState = eHal4StateInvalid;
phOsalNfc_RaiseException(phOsalNfc_e_UnrecovFirmwareErr,1);
}
break;
@@ -1216,6 +1254,7 @@ static void phHal4Nfc_HandleEvent(
case NFC_INFO_TXLDO_OVERCUR:
case NFC_INFO_MEM_VIOLATION:
case NFC_INFO_TEMP_OVERHEAT:
+ case NFC_INFO_LLC_ERROR:
{
sNotificationInfo.info = psEventInfo;
sNotificationInfo.status = NFCSTATUS_SUCCESS;
@@ -1292,10 +1331,23 @@ static void phHal4Nfc_SelfTestComplete(
= Hal4Ctxt->sUpperLayerInfo.pUpperIoctlCb;
void *pUpper_Context = Hal4Ctxt->sUpperLayerInfo.psUpperLayerCtxt;
/*check for Success*/
- if((SelfTestResults->length > 0) && (0 == SelfTestResults->buffer[0]))
+ if(( DEVMGMT_SWP_TEST == Hal4Ctxt->Ioctl_Type )
+ || ( DEVMGMT_ANTENNA_TEST == Hal4Ctxt->Ioctl_Type ))
{
status = NFCSTATUS_SUCCESS;
}
+ else if((SelfTestResults->length > 0) && (0 == SelfTestResults->buffer[0]))
+ {
+ status = NFCSTATUS_SUCCESS;
+ }
+ else
+ {
+ if (NULL != pInfo)
+ {
+ status = ((phNfc_sCompletionInfo_t *)pInfo)->status;
+ }
+ }
+
/*Copy response buffer and length*/
(void)memcpy(Hal4Ctxt->sUpperLayerInfo.pIoctlOutParam->buffer,
SelfTestResults->buffer,
@@ -1354,7 +1406,8 @@ static void phHal4Nfc_IoctlComplete(
{
/*for NFC_MEM_READ and NFC_GPIO_READ ,provide one Byte Response*/
if ((NFC_MEM_READ == Hal4Ctxt->Ioctl_Type)
- || (NFC_GPIO_READ == Hal4Ctxt->Ioctl_Type))
+ || (NFC_GPIO_READ == Hal4Ctxt->Ioctl_Type)
+ )
{
Hal4Ctxt->sUpperLayerInfo.pIoctlOutParam->length
= sizeof (uint8_t);