aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornxpandroid <srikrishna.pramoda@nxp.com>2017-10-16 15:13:03 +0530
committernxpandroid <srikrishna.pramoda@nxp.com>2017-10-16 15:13:03 +0530
commitb7194d6863d714078d65ccd9d14dc66d28bbe926 (patch)
treeadf9e5621b9a86ead80c2d8d3fd3107f55e88a63
parente67b679e8d719b11d25c5e39a8d6e211ed0cb57c (diff)
downloadandroid_vendor_nxp_opensource_packages_apps_Nfc-b7194d6863d714078d65ccd9d14dc66d28bbe926.tar.gz
android_vendor_nxp_opensource_packages_apps_Nfc-b7194d6863d714078d65ccd9d14dc66d28bbe926.tar.bz2
android_vendor_nxp_opensource_packages_apps_Nfc-b7194d6863d714078d65ccd9d14dc66d28bbe926.zip
NFC died issue seen during screen off in between ETSI transaction
-rw-r--r--nci/jni/IntervalTimer.cpp14
-rwxr-xr-xnci/jni/IntervalTimer.h1
-rwxr-xr-xnci/jni/NativeNfcManager.cpp7
-rwxr-xr-x[-rw-r--r--]nci/jni/TransactionController.cpp64
-rwxr-xr-x[-rw-r--r--]nci/jni/TransactionController.h2
5 files changed, 73 insertions, 15 deletions
diff --git a/nci/jni/IntervalTimer.cpp b/nci/jni/IntervalTimer.cpp
index e5644bdf..5f034f42 100644
--- a/nci/jni/IntervalTimer.cpp
+++ b/nci/jni/IntervalTimer.cpp
@@ -118,3 +118,17 @@ bool IntervalTimer::create(TIMER_FUNC cb)
ALOGE("fail create timer");
return stat == 0;
}
+
+bool IntervalTimer::isRunning(void)
+{
+ if (mTimerId == 0)
+ return false;
+
+ int stat = 0;
+ struct itimerspec ts;
+
+ stat = timer_gettime(mTimerId, &ts);
+ if (stat != 0)
+ return false;
+ return ((ts.it_value.tv_sec > 0 || ts.it_value.tv_nsec > 0) ? true : false);
+}
diff --git a/nci/jni/IntervalTimer.h b/nci/jni/IntervalTimer.h
index 66e345d3..b6bbd5a9 100755
--- a/nci/jni/IntervalTimer.h
+++ b/nci/jni/IntervalTimer.h
@@ -31,6 +31,7 @@ public:
bool set(int ms, TIMER_FUNC cb);
void kill();
bool create(TIMER_FUNC );
+ bool isRunning(void); //This function returns true if a valid timer is running(curTime > 0)
private:
timer_t mTimerId;
diff --git a/nci/jni/NativeNfcManager.cpp b/nci/jni/NativeNfcManager.cpp
index b221d8c2..b58d8356 100755
--- a/nci/jni/NativeNfcManager.cpp
+++ b/nci/jni/NativeNfcManager.cpp
@@ -6453,12 +6453,7 @@ void *enableThread(void *arg)
if(nfcFL.chipType != pn547C2) {
set_AGC_process_state(false);
}
-#if (NXP_EXTNS == TRUE)
- if(!pTransactionController->transactionTerminate(TRANSACTION_REQUESTOR(exec_pending_req)))
- {
- ALOGE("%s: Transaction in progress. Can not reset", __func__);
- }
-#endif
+
bool screen_lock_flag = false;
bool disable_discovery = false;
diff --git a/nci/jni/TransactionController.cpp b/nci/jni/TransactionController.cpp
index 7250523d..e2e745f2 100644..100755
--- a/nci/jni/TransactionController.cpp
+++ b/nci/jni/TransactionController.cpp
@@ -61,7 +61,24 @@ void transactionController::lastRequestResume(void)
pthread_attr_destroy(&attr);
pTransactionDetail->current_transcation_state = NFA_TRANS_DM_RF_TRANS_END;
}
+/*******************************************************************************
+ **
+ ** Function: transactionHandlePendingCb
+ **
+ ** Description: This is a callback function registered against
+ ** pendingTransHandleTimer timer. This timer handler
+ ** triggers enable_thread for handling pending transactions
+ **
+ ** Returns: None
+ **
+ *******************************************************************************/
+
+extern "C" void transactionController::transactionHandlePendingCb(union sigval)
+{
+ ALOGD("Inside %s", __FUNCTION__);
+ pInstance->lastRequestResume();
+}
/*******************************************************************************
**
** Function: transactionAbortTimerCb
@@ -76,7 +93,8 @@ extern "C" void transactionController::transactionAbortTimerCb(union sigval)
{
ALOGD("Inside %s", __FUNCTION__);
- pInstance->lastRequestResume();
+ pInstance->transactionTerminate(TRANSACTION_REQUESTOR(exec_pending_req));
+
}
/*******************************************************************************
@@ -97,6 +115,7 @@ transactionController::transactionController(void)
pTransactionDetail = android::nfcManager_transactionDetail();
abortTimer = new IntervalTimer();
+ pendingTransHandleTimer = new IntervalTimer();
requestor = NULL;
}
/*******************************************************************************
@@ -139,6 +158,11 @@ bool transactionController::transactionAttempt(const char* transactionRequestor,
sem_getvalue(&barrier, &semVal);
ALOGD ("%s: Transaction attempted : %s when barrier is: %d", __FUNCTION__, transactionRequestor, semVal);
+ if(pendingTransHandleTimer->isRunning())
+ {
+ ALOGD ("%s: Transaction denied due to pending transaction: %s ", __FUNCTION__, transactionRequestor);
+ return false;
+ }
//Block wait on barrier
if(sem_timedwait(&barrier, &timeout) != 0)
{
@@ -177,6 +201,12 @@ bool transactionController::transactionAttempt(const char* transactionRequestor)
sem_getvalue(&barrier, &semVal);
ALOGD ("%s: Transaction attempted : %s when barrier is: %d", __FUNCTION__, transactionRequestor, semVal);
+ if(pendingTransHandleTimer->isRunning())
+ {
+ ALOGD ("%s: Transaction denied due to pending transaction: %s ", __FUNCTION__, transactionRequestor);
+ return false;
+ }
+
if(sem_trywait(&barrier) == 0)
{
pTransactionDetail->trans_in_progress = true;
@@ -210,13 +240,14 @@ void transactionController::transactionEnd(const char* transactionRequestor)
if(requestor == transactionRequestor)
{
+ /*If any abort timer is running for this transaction then stop it*/
+ if(abortTimer != NULL && abortTimer->isRunning())
+ {
+ ALOGD ("%s: Transaction control timer killed", __FUNCTION__);
+ killAbortTimer();
+ }
pTransactionDetail->trans_in_progress = false;
- sem_getvalue(&barrier, &val);
-
- if(!val)
- sem_post(&barrier);
-
ALOGD ("%s: Transaction ended : %s ", __FUNCTION__, transactionRequestor);
/*
@@ -224,9 +255,12 @@ void transactionController::transactionEnd(const char* transactionRequestor)
**/
if(android::nfcManager_isRequestPending())
{
- abortTimer->set(5, transactionAbortTimerCb);
+ pendingTransHandleTimer->set(1, transactionHandlePendingCb);
}
+ sem_getvalue(&barrier, &val);
+ if(!val)
+ sem_post(&barrier);
}
}
/*******************************************************************************
@@ -249,7 +283,12 @@ bool transactionController::transactionTerminate(const char* transactionRequest
(requestor == transactionRequestor || !strcmp(transactionRequestor,"exec_pending_req")))
{
pTransactionDetail->trans_in_progress = false;
- abortTimer->kill();
+ killAbortTimer();
+
+ if(android::nfcManager_isRequestPending())
+ {
+ pendingTransHandleTimer->set(1, transactionHandlePendingCb);
+ }
sem_getvalue(&barrier, &val);
if(!val)
@@ -308,6 +347,10 @@ transactionController* transactionController::controller(void)
pInstance->requestor = NULL;
pInstance->abortTimer->kill();
+ pInstance->pendingTransHandleTimer->kill();
+
+ pInstance->abortTimer = new IntervalTimer();
+ pInstance->pendingTransHandleTimer = new IntervalTimer();
sem_destroy(&pInstance->barrier);
@@ -332,7 +375,10 @@ void transactionController::killAbortTimer(void)
ALOGD ("%s: transaction controller abort timer killed", __FUNCTION__);
if(transactionInProgress())
+ {
abortTimer->kill();
+ abortTimer = new IntervalTimer();
+ }
}
/*******************************************************************************
**
@@ -349,4 +395,4 @@ void transactionController::setAbortTimer(unsigned int msec)
if(transactionInProgress())
abortTimer->set(msec, transactionAbortTimerCb);
-} \ No newline at end of file
+}
diff --git a/nci/jni/TransactionController.h b/nci/jni/TransactionController.h
index d3965dd9..8402db28 100644..100755
--- a/nci/jni/TransactionController.h
+++ b/nci/jni/TransactionController.h
@@ -76,6 +76,7 @@ class transactionController
static transactionController* pInstance; //Reference to controller
sem_t barrier; //barrier: Guard for controlling access to NFCC when profile switch happening
IntervalTimer* abortTimer; //abortTimer: Used for aborting a stuck transaction
+ IntervalTimer* pendingTransHandleTimer; //pendingTransHandleTimer: Used to schedule pending transaction handler thread
Transcation_Check_t* pTransactionDetail; //transactionDetail: holds last transaction detail
const char* requestor; //requestor: Identifier of transaction trigger
@@ -91,6 +92,7 @@ class transactionController
void killAbortTimer(void);
void setAbortTimer(unsigned int msec);
static void transactionAbortTimerCb(union sigval);
+ static void transactionHandlePendingCb(union sigval);
static transactionController* controller(void);
static transactionController* getInstance(void);
};