From 4fb8563652a8e6ac6e3f03964338f11cd39e12aa Mon Sep 17 00:00:00 2001 From: nxpandroid Date: Mon, 16 Oct 2017 16:19:15 +0530 Subject: [PATCH] VEN & eSE SVDD power is not high during Secure Timer is Running --- pn8xT/pn553-i2c/pn553.c | 37 ++++++++++++++++++++++++++++++++++--- pn8xT/pn553-i2c/pn553.h | 11 ++++++++++- 2 files changed, 44 insertions(+), 4 deletions(-) diff --git a/pn8xT/pn553-i2c/pn553.c b/pn8xT/pn553-i2c/pn553.c index 9207e29417..d8029965cf 100644 --- a/pn8xT/pn553-i2c/pn553.c +++ b/pn8xT/pn553-i2c/pn553.c @@ -70,7 +70,7 @@ #include #include "pn553.h" -#define NEXUS5x 1 +#define NEXUS5x 0 #define HWINFO 0 #if NEXUS5x #undef ISO_RST @@ -119,6 +119,7 @@ static bool sIsWakeLocked = false; static struct pn544_dev *pn544_dev; static struct semaphore ese_access_sema; static struct semaphore svdd_sync_onoff_sema; +static struct completion dwp_onoff_sema; static struct timer_list secure_timer; static void release_ese_lock(p61_access_state_t p61_current_state); int get_ese_lock(p61_access_state_t p61_current_state, int timeout); @@ -382,6 +383,31 @@ static int release_svdd_wait(void) pr_info("%s: Exit\n", __func__); return 0; } + +static void dwp_OnOff(long nfc_service_pid, p61_access_state_t origin) +{ + int timeout = 100; //100 ms timeout + unsigned long tempJ = msecs_to_jiffies(timeout); + if(nfc_service_pid) + { + if (0 == signal_handler(origin, nfc_service_pid)) + { + init_completion(&dwp_onoff_sema); + if(wait_for_completion_timeout(&dwp_onoff_sema, tempJ) != 0) + { + pr_info("Dwp On/off wait protection: Timeout"); + } + pr_info("Dwp On/Off wait protection : released"); + } + } +} +static int release_dwpOnOff_wait(void) +{ + pr_info("%s: Enter \n", __func__); + complete(&dwp_onoff_sema); + return 0; +} + static int pn544_dev_open(struct inode *inode, struct file *filp) { struct pn544_dev *pn544_dev = container_of(filp->private_data, @@ -419,6 +445,9 @@ long pn544_dev_ioctl(struct file *filp, unsigned int cmd, case P544_SET_NFC_SERVICE_PID: return set_nfc_pid(arg); break; + case P544_REL_DWPONOFF_WAIT: + return release_dwpOnOff_wait(); + break; default: break; } @@ -540,7 +569,8 @@ long pn544_dev_ioctl(struct file *filp, unsigned int cmd, if (!(current_state & P61_STATE_JCP_DWNLD)){ if(pn544_dev->nfc_service_pid){ pr_info("nfc service pid %s ---- %ld", __func__, pn544_dev->nfc_service_pid); - signal_handler(P61_STATE_SPI, pn544_dev->nfc_service_pid); + /*signal_handler(P61_STATE_SPI, pn544_dev->nfc_service_pid);*/ + dwp_OnOff(pn544_dev->nfc_service_pid, P61_STATE_SPI); } else{ pr_info(" invalid nfc service pid....signalling failed%s ---- %ld", __func__, pn544_dev->nfc_service_pid); @@ -720,7 +750,8 @@ long pn544_dev_ioctl(struct file *filp, unsigned int cmd, if (current_state & P61_STATE_WIRED){ if(pn544_dev->nfc_service_pid){ pr_info("nfc service pid %s ---- %ld", __func__, pn544_dev->nfc_service_pid); - signal_handler(P61_STATE_SPI_PRIO, pn544_dev->nfc_service_pid); + /*signal_handler(P61_STATE_SPI_PRIO, pn544_dev->nfc_service_pid);*/ + dwp_OnOff(pn544_dev->nfc_service_pid, P61_STATE_SPI_PRIO); } else{ pr_info(" invalid nfc service pid....signalling failed%s ---- %ld", __func__, pn544_dev->nfc_service_pid); diff --git a/pn8xT/pn553-i2c/pn553.h b/pn8xT/pn553-i2c/pn553.h index 7bbd7ada3e..296f3cda91 100644 --- a/pn8xT/pn553-i2c/pn553.h +++ b/pn8xT/pn553-i2c/pn553.h @@ -92,8 +92,17 @@ * */ #define PN544_SET_DWNLD_STATUS _IOW(PN544_MAGIC, 0x09, long) +/* + NFC will call the ioctl to release the dwp on/off protection +*/ +#define P544_REL_DWPONOFF_WAIT _IOW(PN544_MAGIC, 0x0A, long) + +/* + NFC will call the ioctl to start Secure Timer +*/ + +#define P544_SECURE_TIMER_SESSION _IOW(PN544_MAGIC, 0x0B, long) -#define P544_SECURE_TIMER_SESSION _IOW(PN544_MAGIC, 0x0A, long) #define MAX_ESE_ACCESS_TIME_OUT_MS 200 /*100 milliseconds*/ typedef enum p61_access_state{