reset back to latest, and keep history
diff --git a/Android.mk b/Android.mk
index 0557a87..8f64cba 100644
--- a/Android.mk
+++ b/Android.mk
@@ -105,7 +105,11 @@
 LOCAL_SRC_FILES += Linux_x86/phDal4Nfc_i2c.c
 LOCAL_SRC_FILES += Linux_x86/phDal4Nfc_messageQueueLib.c
 
+# Really verbose:
 #LOCAL_CFLAGS += -DNXP_MESSAGING -DANDROID -DDEBUG -DDAL_TRACE -DINCLUDE_DALINIT_DEINIT -pipe -fomit-frame-pointer -Wall -Wno-trigraphs -Werror-implicit-function-declaration  -fno-strict-aliasing -mapcs -mno-sched-prolog -mabi=aapcs-linux -mno-thumb-interwork -msoft-float -Uarm -fno-common -fpic
+# Just show I2C traffic:
+#LOCAL_CFLAGS += -DNXP_MESSAGING -DANDROID -DINCLUDE_DALINIT_DEINIT -DLOW_LEVEL_TRACES -pipe -fomit-frame-pointer -Wall -Wno-trigraphs -Werror-implicit-function-declaration  -fno-strict-aliasing -mapcs -mno-sched-prolog -mabi=aapcs-linux -mno-thumb-interwork -msoft-float -Uarm -fno-common -fpic
+# Quiet:
 LOCAL_CFLAGS += -DNXP_MESSAGING -DANDROID -DINCLUDE_DALINIT_DEINIT -pipe -fomit-frame-pointer -Wall -Wno-trigraphs -Werror-implicit-function-declaration  -fno-strict-aliasing -mapcs -mno-sched-prolog -mabi=aapcs-linux -mno-thumb-interwork -msoft-float -Uarm -fno-common -fpic
 
 ifeq ($(NFC_BUILD_VARIANT),debug)
diff --git a/Linux_x86/phDal4Nfc.c b/Linux_x86/phDal4Nfc.c
index 1222525..6d3c9fb 100644
--- a/Linux_x86/phDal4Nfc.c
+++ b/Linux_x86/phDal4Nfc.c
@@ -30,6 +30,7 @@
 
 #include <unistd.h>
 #include <pthread.h>
+#include <stdlib.h>
 #ifdef ANDROID
 #include <linux/ipc.h>
 #else
@@ -660,6 +661,7 @@
     phDal4Nfc_Message_t      sMsg;
     phOsalNfc_Message_t      OsalMsg ;
     int i;
+    int i2c_error_count;
 
     pthread_setname_np(pthread_self(), "reader");
 
@@ -676,13 +678,38 @@
         sem_wait(&nfc_read_sem);
         DAL_PRINT("RX Thread Sem UnLock\n");
         /* Issue read operation.*/
+
+    i2c_error_count = 0;
+retry:
 	gReadWriteContext.nNbOfBytesRead=0;
 	DAL_DEBUG("\n*New *** *****Request Length = %d",gReadWriteContext.nNbOfBytesToRead);
 	memsetRet=memset(gReadWriteContext.pReadBuffer,0,gReadWriteContext.nNbOfBytesToRead);
 
 	/* Wait for IRQ !!!  */
-	gReadWriteContext.nNbOfBytesRead = gLinkFunc.read(gReadWriteContext.pReadBuffer, gReadWriteContext.nNbOfBytesToRead);
-        
+    gReadWriteContext.nNbOfBytesRead = gLinkFunc.read(gReadWriteContext.pReadBuffer, gReadWriteContext.nNbOfBytesToRead);
+
+    /* TODO: Remove this hack
+     * Reading the value 0x57 indicates a HW I2C error at I2C address 0x57
+     * (pn544). There should not be false positives because a read of length 1
+     * must be a HCI length read, and a length of 0x57 is impossible (max is 33).
+     */
+    if(gReadWriteContext.nNbOfBytesToRead == 1 && gReadWriteContext.pReadBuffer[0] == 0x57)
+    {
+        i2c_error_count++;
+        DAL_DEBUG("Read 0x57 %d times\n", i2c_error_count);
+        if (i2c_error_count < 5) {
+            usleep(2000);
+            goto retry;
+        }
+        DAL_PRINT("NOTHING TO READ, RECOVER");
+        phOsalNfc_RaiseException(phOsalNfc_e_UnrecovFirmwareErr,1);
+    }
+    else
+    {
+        i2c_error_count = 0;
+#ifdef LOW_LEVEL_TRACES
+        phOsalNfc_PrintData("Received buffer", (uint16_t)gReadWriteContext.nNbOfBytesRead, gReadWriteContext.pReadBuffer);
+#endif
         DAL_DEBUG("Read ok. nbToRead=%d\n", gReadWriteContext.nNbOfBytesToRead);
         DAL_DEBUG("NbReallyRead=%d\n", gReadWriteContext.nNbOfBytesRead);
         DAL_PRINT("ReadBuff[]={ ");
@@ -691,17 +718,16 @@
           DAL_DEBUG("0x%x ", gReadWriteContext.pReadBuffer[i]);
         }
         DAL_PRINT("}\n");
-	
+
         /* read completed immediately */
-	sMsg.eMsgType= PHDAL4NFC_READ_MESSAGE;
-	/* Update the state */
-	phDal4Nfc_FillMsg(&sMsg,&OsalMsg);
-	phDal4Nfc_DeferredCall((pphDal4Nfc_DeferFuncPointer_t)phDal4Nfc_DeferredCb,(void *)pmsgType);
-	memsetRet=memset(&sMsg,0,sizeof(phDal4Nfc_Message_t));
-	memsetRet=memset(&OsalMsg,0,sizeof(phOsalNfc_Message_t));
+        sMsg.eMsgType= PHDAL4NFC_READ_MESSAGE;
+        /* Update the state */
+        phDal4Nfc_FillMsg(&sMsg,&OsalMsg);
+        phDal4Nfc_DeferredCall((pphDal4Nfc_DeferFuncPointer_t)phDal4Nfc_DeferredCb,(void *)pmsgType);
+        memsetRet=memset(&sMsg,0,sizeof(phDal4Nfc_Message_t));
+        memsetRet=memset(&OsalMsg,0,sizeof(phOsalNfc_Message_t));
+    }
 
-
-        
     } /* End of thread Loop*/
     return TRUE;
 }
@@ -824,9 +850,15 @@
             break;
         case PHDAL4NFC_WRITE_MESSAGE:
             DAL_PRINT(" Dal deferred write called \n");
+
+#ifdef LOW_LEVEL_TRACES
+            phOsalNfc_PrintData("Send buffer", (uint16_t)gReadWriteContext.nNbOfBytesToWrite, gReadWriteContext.pWriteBuffer);
+#endif
+
             /* DAL_DEBUG("dalMsg->transactInfo.length : %d\n", dalMsg->transactInfo.length); */
             /* Make a Physical WRITE */
-            usleep(3000); /* Wait 3ms before issuing a Write */
+            /* NOTE: need to usleep(3000) here if the write is for SWP */
+            usleep(500);  /* NXP advise 500us sleep required between I2C writes */
             gReadWriteContext.nNbOfBytesWritten = gLinkFunc.write(gReadWriteContext.pWriteBuffer, gReadWriteContext.nNbOfBytesToWrite);
             if (gReadWriteContext.nNbOfBytesWritten != gReadWriteContext.nNbOfBytesToWrite)
             {
diff --git a/Linux_x86/phOsalNfc.c b/Linux_x86/phOsalNfc.c
index 6149fc3..9765e2c 100644
--- a/Linux_x86/phOsalNfc.c
+++ b/Linux_x86/phOsalNfc.c
@@ -150,3 +150,26 @@
     }
 }
 
+/*!
+ * \brief display data bytes.
+ *        This function displays data bytes for debug purpose
+ * \param[in] pString pointer to string to be displayed.
+ * \param[in] length number of bytes to be displayed.
+ * \param[in] pBuffer pointer to data bytes to be displayed.
+ *
+ */
+void phOsalNfc_PrintData(const char *pString, uint32_t length, uint8_t *pBuffer)
+{
+    char print_buffer[512]; // Max length 512 for the download mode
+    int i;
+
+    if(NULL!=pString && length > 1 && length < 34)
+    {
+        print_buffer[0] = '\0';
+        for (i = 0; i < length; i++) {
+            snprintf(&print_buffer[i*5], 6, " 0x%02X", pBuffer[i]);
+        }
+        LOGD("> NFC I2C %s: %s", pString,print_buffer);
+    }
+}
+
diff --git a/inc/phNfcConfig.h b/inc/phNfcConfig.h
index ccc20c0..19a881b 100644
--- a/inc/phNfcConfig.h
+++ b/inc/phNfcConfig.h
@@ -141,7 +141,7 @@
 
 /**< Default Session ID for Initialisation */
 #ifndef DEFAULT_SESSION
-#define DEFAULT_SESSION           "android7"
+#define DEFAULT_SESSION           "android8"
 #endif
 
 
@@ -240,7 +240,7 @@
 #define DEV_MGMT_ACT_GRD_TO_DEFAULT       0x20U
 #endif
 
-/**<  NFCIP Active Mode Configuration
+/**<  NFCIP Active Mode Default Configuration (when acting as Target)
        0x01     106 kbps
        0x02     212 kbps
        0x04     424 kbps
@@ -323,7 +323,7 @@
 /**< Macro to Enable the Peer to Peer Feature */
 #define ENABLE_P2P
 
-#define DEFAULT_NFCIP_INITIATOR_MODE_SUPPORT   0x0FU
+#define DEFAULT_NFCIP_INITIATOR_MODE_SUPPORT   0x3FU
 #define DEFAULT_NFCIP_TARGET_MODE_SUPPORT      0x0FU
 
 /**< Macro to Enable the ISO14443-B Feature */
diff --git a/inc/phNfcTypes.h b/inc/phNfcTypes.h
index 03ce30d..989cfe8 100644
--- a/inc/phNfcTypes.h
+++ b/inc/phNfcTypes.h
@@ -978,10 +978,12 @@
 {
     phNfc_eDefaultP2PMode  = 0x00U,
     phNfc_ePassive106 = 0x01U,
-    phNfc_ePassive212 = 0x02U, 
-    phNfc_ePassive424 = 0x04U, 
-    phNfc_eActive     = 0x08U, 
-    phNfc_eP2P_ALL    = 0x0FU,
+    phNfc_ePassive212 = 0x02U,
+    phNfc_ePassive424 = 0x04U,
+    phNfc_eActive106 = 0x08U,
+    phNfc_eActive212 = 0x10U,
+    phNfc_eActive424 = 0x20U,
+    phNfc_eP2P_ALL   = 0x27U,  /* All Passive and 424 Active */
     phNfc_eInvalidP2PMode = 0xFFU
 } phNfc_eP2PMode_t;
 
diff --git a/src/phFriNfc_Llcp.c b/src/phFriNfc_Llcp.c
index 13f1f92..ac38311 100644
--- a/src/phFriNfc_Llcp.c
+++ b/src/phFriNfc_Llcp.c
@@ -408,7 +408,7 @@
             if (sValueBuffer.length != PHFRINFC_LLCP_TLV_LENGTH_VERSION)
             {
                /* Error : Ill-formed VERSION parameter TLV */
-               return PHNFCSTVAL(CID_FRI_NFC_LLCP, NFCSTATUS_INVALID_PARAMETER);
+               break;
             }
             /* Get VERSION */
             version = sValueBuffer.buffer[0];
@@ -420,7 +420,7 @@
             if (sValueBuffer.length != PHFRINFC_LLCP_TLV_LENGTH_MIUX)
             {
                /* Error : Ill-formed MIUX parameter TLV */
-               return PHNFCSTVAL(CID_FRI_NFC_LLCP, NFCSTATUS_INVALID_PARAMETER);
+               break;
             }
             /* Get MIU */
             sParams.miu = PHFRINFC_LLCP_MIU_DEFAULT + ((sValueBuffer.buffer[0] << 8) | sValueBuffer.buffer[1]) & PHFRINFC_LLCP_TLV_MIUX_MASK;
@@ -432,7 +432,7 @@
             if (sValueBuffer.length != PHFRINFC_LLCP_TLV_LENGTH_WKS)
             {
                /* Error : Ill-formed MIUX parameter TLV */
-               return PHNFCSTVAL(CID_FRI_NFC_LLCP, NFCSTATUS_INVALID_PARAMETER);
+               break;
             }
             /* Get WKS */
             sParams.wks = (sValueBuffer.buffer[0] << 8) | sValueBuffer.buffer[1];
@@ -446,7 +446,7 @@
             if (sValueBuffer.length != PHFRINFC_LLCP_TLV_LENGTH_LTO)
             {
                /* Error : Ill-formed LTO parameter TLV */
-               return PHNFCSTVAL(CID_FRI_NFC_LLCP, NFCSTATUS_INVALID_PARAMETER);
+               break;
             }
             /* Get LTO */
             sParams.lto = sValueBuffer.buffer[0];
@@ -458,7 +458,7 @@
             if (sValueBuffer.length != PHFRINFC_LLCP_TLV_LENGTH_OPT)
             {
                /* Error : Ill-formed OPT parameter TLV */
-               return PHNFCSTVAL(CID_FRI_NFC_LLCP, NFCSTATUS_INVALID_PARAMETER);
+               break;;
             }
             /* Get OPT */
             sParams.option = sValueBuffer.buffer[0] & PHFRINFC_LLCP_TLV_OPT_MASK;
@@ -467,7 +467,7 @@
          default:
          {
             /* Error : Unknown Type */
-            return PHNFCSTVAL(CID_FRI_NFC_LLCP, NFCSTATUS_INVALID_PARAMETER);
+            break;
          }
       }
    }
diff --git a/src/phFriNfc_Llcp.h b/src/phFriNfc_Llcp.h
index 4d2e71e..73fa486 100644
--- a/src/phFriNfc_Llcp.h
+++ b/src/phFriNfc_Llcp.h
@@ -119,7 +119,7 @@
 #define PHFRINFC_LLCP_SAP_SDP                      0x01 /**< Service Discovery Protocol SAP.*/
 #define PHFRINFC_LLCP_SAP_SDP_ADVERTISED_FIRST     0x10 /**< First SAP number from SDP-avertised SAP range.*/
 #define PHFRINFC_LLCP_SAP_SDP_UNADVERTISED_FIRST   0x20 /**< First SAP number from SDP-unavertised SAP range.*/
-#define PHFRINFC_LLCP_SAP_NUMBER                   0x30 /**< Number of possible SAP values (also first invalid value).*/
+#define PHFRINFC_LLCP_SAP_NUMBER                   0x40 /**< Number of possible SAP values (also first invalid value).*/
 #define PHFRINFC_LLCP_SAP_DEFAULT                  0xFF /**< Default number when a socket is created or reset */
 /*@}*/
 
diff --git a/src/phFriNfc_LlcpTransport_Connection.c b/src/phFriNfc_LlcpTransport_Connection.c
index fff63b4..fcdb246 100644
--- a/src/phFriNfc_LlcpTransport_Connection.c
+++ b/src/phFriNfc_LlcpTransport_Connection.c
@@ -627,7 +627,7 @@
                if(sValueBuffer.length == 0)
                {
                   /* Error : Ill-formed SN parameter TLV */
-                  return PHNFCSTVAL(CID_FRI_NFC_LLCP,NFCSTATUS_INVALID_PARAMETER);
+                  break;
                }
                /* Get the Service Name */
                *psServiceName = sValueBuffer;
@@ -639,7 +639,7 @@
                if (sValueBuffer.length != PHFRINFC_LLCP_TLV_LENGTH_RW)
                {
                   /* Error : Ill-formed MIUX parameter TLV */
-                  return PHNFCSTVAL(CID_FRI_NFC_LLCP,NFCSTATUS_INVALID_PARAMETER);
+                  break;
                }
                *pRemoteRW_Size = sValueBuffer.buffer[0];
             }break;
@@ -650,10 +650,16 @@
                if (sValueBuffer.length != PHFRINFC_LLCP_TLV_LENGTH_MIUX)
                {
                   /* Error : Ill-formed MIUX parameter TLV */
-                  return PHNFCSTVAL(CID_FRI_NFC_LLCP,NFCSTATUS_INVALID_PARAMETER);
+                  break;
                }
                *pRemoteMIU = PHFRINFC_LLCP_MIU_DEFAULT + (((sValueBuffer.buffer[0] << 8) | sValueBuffer.buffer[1]) & PHFRINFC_LLCP_TLV_MIUX_MASK);
             }break;
+
+            default:
+            {
+               /* Error : Unknown type */
+               break;
+            }
          }
       }
    }
diff --git a/src/phHal4Nfc_P2P.c b/src/phHal4Nfc_P2P.c
index 47a64de..99c5978 100644
--- a/src/phHal4Nfc_P2P.c
+++ b/src/phHal4Nfc_P2P.c
@@ -478,7 +478,7 @@
             Hal4Ctxt->psTrcvCtxtInfo->TransactionTimerId
                 = PH_OSALNFC_INVALID_TIMER_ID;
             Hal4Ctxt->psTrcvCtxtInfo->RecvDataBufferStatus 
-                = NFCSTATUS_MORE_INFORMATION;
+                = NFCSTATUS_PENDING;
         }       
     }
     if(NULL == Hal4Ctxt->psTrcvCtxtInfo)
diff --git a/src/phOsalNfc.h b/src/phOsalNfc.h
index ad55066..246c2e6 100644
--- a/src/phOsalNfc.h
+++ b/src/phOsalNfc.h
@@ -154,6 +154,19 @@
  */
 void phOsalNfc_DbgString(const char *pString);
 
+/*!
+ * \ingroup grp_osal_nfc
+ * \brief Print data buffer
+ *
+ * Outputs given string to debug port.
+ *
+ * \param[in] pString pointer to string to be displayed.
+ * \param[in] length number of bytes to be displayed.
+ * \param[in] pBuffer pointer to data bytes to be displayed.
+ *
+ * \retval None
+ */
+void phOsalNfc_PrintData(const char *pString, uint32_t length, uint8_t *pBuffer);
 
 /*!
  * \ingroup grp_osal_nfc