NFC service died when SPI + DWP-reset/NFC ON/OFF Lock added to serialize HalIoctl as a work around for Google's HIDL crash issue
diff --git a/src/adaptation/NfcAdaptation.cpp b/src/adaptation/NfcAdaptation.cpp
index 99d659d..4433981 100644
--- a/src/adaptation/NfcAdaptation.cpp
+++ b/src/adaptation/NfcAdaptation.cpp
@@ -74,6 +74,7 @@
NfcAdaptation* NfcAdaptation::mpInstance = NULL;
ThreadMutex NfcAdaptation::sLock;
+ThreadMutex NfcAdaptation::sIoctlLock;
sp<INxpNfc> NfcAdaptation::mHalNxpNfc;
sp<INfc> NfcAdaptation::mHal;
INfcClientCallback* NfcAdaptation::mCallback;
@@ -581,13 +582,15 @@
const char* func = "NfcAdaptation::HalIoctl";
mHalIoctlEvent.lock();
::android::hardware::nfc::V1_0::NfcData data;
+ AutoThreadMutex a(sIoctlLock);
nfc_nci_IoctlInOutData_t* pInpOutData = (nfc_nci_IoctlInOutData_t*)p_data;
int status = 0;
ALOGD("%s arg=%ld", func, arg);
pInpOutData->inp.context = &NfcAdaptation::GetInstance();
NfcAdaptation::GetInstance().mCurrentIoctlData = pInpOutData;
data.setToExternal((uint8_t*)pInpOutData, sizeof(nfc_nci_IoctlInOutData_t));
- mHalNxpNfc->ioctl(arg, data, IoctlCallback);
+ if(mHalNxpNfc != nullptr)
+ mHalNxpNfc->ioctl(arg, data, IoctlCallback);
ALOGD("%s Ioctl Completed for Type=%llu", func, pInpOutData->out.ioctlType);
mHalIoctlEvent.unlock();
return (pInpOutData->out.result);
diff --git a/src/include/NfcAdaptation.h b/src/include/NfcAdaptation.h
index e3ce61a..1bbf2b9 100644
--- a/src/include/NfcAdaptation.h
+++ b/src/include/NfcAdaptation.h
@@ -115,6 +115,7 @@
void signal();
static NfcAdaptation* mpInstance;
static ThreadMutex sLock;
+ static ThreadMutex sIoctlLock;
ThreadCondVar mCondVar;
tHAL_NFC_ENTRY mHalEntryFuncs; // function pointers for HAL entry points
static nfc_nci_device_t* mHalDeviceContext;