diff --git a/CORE/MAC/src/cfg/cfgApi.c b/CORE/MAC/src/cfg/cfgApi.c
index 6a93c97..2e4314e 100644
--- a/CORE/MAC/src/cfg/cfgApi.c
+++ b/CORE/MAC/src/cfg/cfgApi.c
@@ -111,7 +111,7 @@
     pMac->cfg.gCfgStatus = CFG_INCOMPLETE;
   
      // Send CFG_DNLD_REQ to host
-    PELOGW(cfgLog(pMac, LOGW, FL("Sending CFG_DNLD_REQ\n"));)
+    PELOGW(cfgLog(pMac, LOGW, FL("Sending CFG_DNLD_REQ"));)
     cfgSendHostMsg(pMac, WNI_CFG_DNLD_REQ, WNI_CFG_DNLD_REQ_LEN,
                    WNI_CFG_DNLD_REQ_NUM, 0, 0, 0);
 
@@ -180,7 +180,7 @@
 
     if (cfgId >= CFG_PARAM_MAX_NUM)
     {
-        PELOGE(cfgLog(pMac, LOGE, FL("Invalid cfg id %d\n"), cfgId);)
+        PELOGE(cfgLog(pMac, LOGE, FL("Invalid cfg id %d"), cfgId);)
         return eSIR_CFG_INVALID_ID;
     }
 
@@ -190,7 +190,7 @@
 
     if (index >= CFG_STA_IBUF_MAX_SIZE)
     {
-        PELOGE(cfgLog(pMac, LOGE, FL("cfg index out of bounds %d\n"), index);)
+        PELOGE(cfgLog(pMac, LOGE, FL("cfg index out of bounds %d"), index);)
         retVal = eSIR_CFG_INVALID_ID;
         return retVal;
     }
@@ -198,13 +198,13 @@
     // Check if parameter is valid
     if ((control & CFG_CTL_VALID) == 0)
     {
-        PELOGE(cfgLog(pMac, LOGE, FL("Not valid cfg id %d\n"), cfgId);)
+        PELOGE(cfgLog(pMac, LOGE, FL("Not valid cfg id %d"), cfgId);)
         retVal = eSIR_CFG_INVALID_ID;
     }
     else if ((pMac->cfg.gCfgIBufMin[index] > value) ||
              (pMac->cfg.gCfgIBufMax[index] < value))
     {
-        PELOGE(cfgLog(pMac, LOGE, FL("Value %d out of range [%d,%d] cfg id %d\n"),
+        PELOGE(cfgLog(pMac, LOGE, FL("Value %d out of range [%d,%d] cfg id %d"),
                value, pMac->cfg.gCfgIBufMin[index],
                pMac->cfg.gCfgIBufMax[index], cfgId);)
         retVal = eSIR_CFG_INVALID_ID;
@@ -217,7 +217,7 @@
             // Update hardware if necessary
             mask = control & CFG_CTL_NTF_MASK;
             if ((mask & CFG_CTL_NTF_HW) != 0)
-                PELOGE(cfgLog(pMac, LOGE, FL("CFG Notify HW not supported!!!\n"));)
+                PELOGE(cfgLog(pMac, LOGE, FL("CFG Notify HW not supported!!!"));)
 
             // Notify other modules if necessary
             if ((mask & CFG_CTL_NTF_MASK) != 0)
@@ -255,7 +255,7 @@
 
     if (cfgId >= CFG_PARAM_MAX_NUM)
     {
-        PELOG3(cfgLog(pMac, LOG3, FL("Invalid cfg id %d\n"), cfgId);)
+        PELOG3(cfgLog(pMac, LOG3, FL("Invalid cfg id %d"), cfgId);)
         return(eSIR_CFG_INVALID_ID);
     }
 
@@ -264,7 +264,7 @@
     // Check if parameter is valid
     if ((control & CFG_CTL_VALID) == 0)
     {
-        PELOG3(cfgLog(pMac, LOG3, FL("Not valid cfg id %d\n"), cfgId);)
+        PELOG3(cfgLog(pMac, LOG3, FL("Not valid cfg id %d"), cfgId);)
         return(eSIR_CFG_INVALID_ID);
     }
     else
@@ -301,7 +301,7 @@
 
     if (cfgId >= CFG_PARAM_MAX_NUM)
     {
-        PELOGE(cfgLog(pMac, LOGE, FL("Invalid cfg id %d\n"), cfgId);)
+        PELOGE(cfgLog(pMac, LOGE, FL("Invalid cfg id %d"), cfgId);)
         retVal = eSIR_CFG_INVALID_ID;
         return retVal;
     }
@@ -312,7 +312,7 @@
 
     if (index >= CFG_STA_IBUF_MAX_SIZE)
     {
-        PELOGE(cfgLog(pMac, LOGE, FL("cfg index out of bounds %d\n"), index);)
+        PELOGE(cfgLog(pMac, LOGE, FL("cfg index out of bounds %d"), index);)
         retVal = eSIR_CFG_INVALID_ID;
         return retVal;
     }
@@ -320,7 +320,7 @@
     // Check if parameter is valid
     if ((control & CFG_CTL_VALID) == 0)
     {
-        PELOGE(cfgLog(pMac, LOGE, FL("Not valid cfg id %d\n"), cfgId);)
+        PELOGE(cfgLog(pMac, LOGE, FL("Not valid cfg id %d"), cfgId);)
         retVal = eSIR_CFG_INVALID_ID;
     }
     else {
@@ -366,7 +366,7 @@
 
     if (cfgId >= CFG_PARAM_MAX_NUM)
     {
-        PELOGE(cfgLog(pMac, LOGE, FL("Invalid cfg id %d\n"), cfgId);)
+        PELOGE(cfgLog(pMac, LOGE, FL("Invalid cfg id %d"), cfgId);)
         retVal = eSIR_CFG_INVALID_ID;
     }
 
@@ -377,7 +377,7 @@
     // Check if parameter is valid
     if ((control & CFG_CTL_VALID) == 0)
     {
-        PELOGE(cfgLog(pMac, LOGE, FL("Not valid cfg id %d\n"), cfgId);)
+        PELOGE(cfgLog(pMac, LOGE, FL("Not valid cfg id %d"), cfgId);)
         retVal = eSIR_CFG_INVALID_ID;
     }
     else
@@ -464,7 +464,7 @@
 
     if (cfgId >= CFG_PARAM_MAX_NUM)
     {
-        PELOGE(cfgLog(pMac, LOGE, FL("Invalid cfg id %d\n"), cfgId);)
+        PELOGE(cfgLog(pMac, LOGE, FL("Invalid cfg id %d"), cfgId);)
         return eSIR_CFG_INVALID_ID;
     }
 
@@ -475,12 +475,12 @@
     // Check if parameter is valid
     if ((control & CFG_CTL_VALID) == 0)
     {
-        PELOGE(cfgLog(pMac, LOGE, FL("Invalid cfg id %d\n"), cfgId);)
+        PELOGE(cfgLog(pMac, LOGE, FL("Invalid cfg id %d"), cfgId);)
         retVal = eSIR_CFG_INVALID_ID;
     }
     else if (index >= CFG_STA_SBUF_MAX_SIZE)
     {
-        PELOGE(cfgLog(pMac, LOGE, FL("Invalid Sbuf index %d (max size %d)\n"),
+        PELOGE(cfgLog(pMac, LOGE, FL("Invalid Sbuf index %d (max size %d)"),
                index, CFG_STA_SBUF_MAX_SIZE);)
         retVal = eSIR_CFG_INVALID_ID;
     }
@@ -490,7 +490,7 @@
             paramLen = *pDst++;
             if (length > paramLen)
             {
-                PELOGE(cfgLog(pMac, LOGE, FL("Invalid length %d (>%d) cfg id %d\n"),
+                PELOGE(cfgLog(pMac, LOGE, FL("Invalid length %d (>%d) cfg id %d"),
                        length, paramLen, cfgId);)
                 retVal = eSIR_CFG_INVALID_LEN;
             }
@@ -509,7 +509,7 @@
                     mask = control & CFG_CTL_NTF_MASK;
                     if ((mask & CFG_CTL_NTF_HW) != 0)
                     {
-                        PELOGE(cfgLog(pMac, LOGE, FL("CFG Notify HW not supported!!!\n"));)
+                        PELOGE(cfgLog(pMac, LOGE, FL("CFG Notify HW not supported!!!"));)
                     }
 
                     // Notify other modules if necessary
@@ -561,7 +561,7 @@
 
     if (cfgId >= CFG_PARAM_MAX_NUM)
     {
-        PELOGE(cfgLog(pMac, LOGE, FL("Invalid cfg id %d\n"), cfgId);)
+        PELOGE(cfgLog(pMac, LOGE, FL("Invalid cfg id %d"), cfgId);)
         retVal = eSIR_CFG_INVALID_ID;
         return retVal;
     }
@@ -572,7 +572,7 @@
 
     if (index >= CFG_STA_SBUF_MAX_SIZE)
     {
-        PELOGE(cfgLog(pMac, LOGE, FL("cfg index out of bounds %d\n"), index);)
+        PELOGE(cfgLog(pMac, LOGE, FL("cfg index out of bounds %d"), index);)
         retVal = eSIR_CFG_INVALID_ID;
         return retVal;
     }
@@ -580,7 +580,7 @@
     // Check if parameter is valid
     if ((control & CFG_CTL_VALID) == 0)
     {
-        PELOGE(cfgLog(pMac, LOGE, FL("Not valid cfg id %d\n"), cfgId);)
+        PELOGE(cfgLog(pMac, LOGE, FL("Not valid cfg id %d"), cfgId);)
         retVal = eSIR_CFG_INVALID_ID;
     }
     else
@@ -590,7 +590,7 @@
         pSrc++;                               // skip over max length
         if (*pLength < *pSrc)
         {
-            PELOGE(cfgLog(pMac, LOGE, FL("Invalid length %d (<%d) cfg id %d\n"),
+            PELOGE(cfgLog(pMac, LOGE, FL("Invalid length %d (<%d) cfg id %d"),
                    *pLength, *pSrc, cfgId);)
             retVal = eSIR_CFG_INVALID_LEN;
         }
@@ -638,7 +638,7 @@
 
     if (cfgId >= CFG_PARAM_MAX_NUM)
     {
-        PELOGE(cfgLog(pMac, LOGE, FL("Invalid cfg id %d\n"), cfgId);)
+        PELOGE(cfgLog(pMac, LOGE, FL("Invalid cfg id %d"), cfgId);)
         retVal = eSIR_CFG_INVALID_ID;
     }
 
@@ -648,7 +648,7 @@
 
     if (index >= CFG_STA_SBUF_MAX_SIZE)
     {
-        PELOGE(cfgLog(pMac, LOGE, FL("cfg index out of bounds %d\n"), index);)
+        PELOGE(cfgLog(pMac, LOGE, FL("cfg index out of bounds %d"), index);)
         retVal = eSIR_CFG_INVALID_ID;
         return retVal;
     }
@@ -656,7 +656,7 @@
     // Check if parameter is valid
     if ((control & CFG_CTL_VALID) == 0)
     {
-        PELOGE(cfgLog(pMac, LOGE, FL("Not valid cfg id %d\n"), cfgId);)
+        PELOGE(cfgLog(pMac, LOGE, FL("Not valid cfg id %d"), cfgId);)
         retVal = eSIR_CFG_INVALID_ID;
     }
     else
@@ -699,7 +699,7 @@
 
     if (cfgId >= CFG_PARAM_MAX_NUM)
     {
-        PELOGE(cfgLog(pMac, LOGE, FL("Invalid cfg id %d\n"), cfgId);)
+        PELOGE(cfgLog(pMac, LOGE, FL("Invalid cfg id %d"), cfgId);)
         retVal = eSIR_CFG_INVALID_ID;
     }
 
@@ -709,7 +709,7 @@
 
     if (index >= CFG_STA_SBUF_MAX_SIZE-1)
     {
-        PELOGE(cfgLog(pMac, LOGE, FL("cfg index out of bounds %d\n"), index);)
+        PELOGE(cfgLog(pMac, LOGE, FL("cfg index out of bounds %d"), index);)
         retVal = eSIR_CFG_INVALID_ID;
         return retVal;
     }
@@ -717,7 +717,7 @@
     // Check if parameter is valid
     if ((control & CFG_CTL_VALID) == 0)
     {
-        PELOGE(cfgLog(pMac, LOGE, FL("Not valid cfg id %d\n"), cfgId);)
+        PELOGE(cfgLog(pMac, LOGE, FL("Not valid cfg id %d"), cfgId);)
         retVal = eSIR_CFG_INVALID_ID;
     }
     else
@@ -880,7 +880,7 @@
         pCapInfo->ibss = 0;
     }
     else
-        cfgLog(pMac, LOGP, FL("can't get capability, role is UNKNOWN!!\n"));
+        cfgLog(pMac, LOGP, FL("can't get capability, role is UNKNOWN!!"));
 
 
     if(systemRole == eLIM_AP_ROLE)
@@ -892,7 +892,7 @@
         // PRIVACY bit
         if (wlan_cfgGetInt(pMac, WNI_CFG_PRIVACY_ENABLED, &val) != eSIR_SUCCESS)
         {
-            cfgLog(pMac, LOGP, FL("cfg get WNI_CFG_PRIVACY_ENABLED failed\n"));
+            cfgLog(pMac, LOGP, FL("cfg get WNI_CFG_PRIVACY_ENABLED failed"));
             return eSIR_FAILURE;
         }
     }
@@ -902,7 +902,7 @@
     // Short preamble bit
     if (wlan_cfgGetInt(pMac, WNI_CFG_SHORT_PREAMBLE, &val) != eSIR_SUCCESS)
     {
-        cfgLog(pMac, LOGP, FL("cfg get WNI_CFG_SHORT_PREAMBLE failed\n"));
+        cfgLog(pMac, LOGP, FL("cfg get WNI_CFG_SHORT_PREAMBLE failed"));
         return eSIR_FAILURE;
     }
     if (val)
@@ -929,7 +929,7 @@
                        != eSIR_SUCCESS)
         {
             cfgLog(pMac, LOGP,
-                   FL("cfg get WNI_CFG_11G_SHORT_SLOT_TIME failed\n"));
+                   FL("cfg get WNI_CFG_11G_SHORT_SLOT_TIME failed"));
             return eSIR_FAILURE;
         }
         /* When in STA mode, we need to check if short slot is enabled as well as check if the current operating
@@ -950,7 +950,7 @@
     {
       if (wlan_cfgGetInt(pMac, WNI_CFG_11H_ENABLED, &val) != eSIR_SUCCESS)
       {
-          cfgLog(pMac, LOGP, FL("cfg get WNI_CFG_11H_ENABLED failed\n"));
+          cfgLog(pMac, LOGP, FL("cfg get WNI_CFG_11H_ENABLED failed"));
           return eSIR_FAILURE;
       }
       if (val)
@@ -960,7 +960,7 @@
     // QoS bit
     if (wlan_cfgGetInt(pMac, WNI_CFG_QOS_ENABLED, &val) != eSIR_SUCCESS)
     {
-        cfgLog(pMac, LOGP, FL("cfg get WNI_CFG_QOS_ENABLED failed\n"));
+        cfgLog(pMac, LOGP, FL("cfg get WNI_CFG_QOS_ENABLED failed"));
         return eSIR_FAILURE;
     }
     if (val)
@@ -969,7 +969,7 @@
     // APSD bit
     if (wlan_cfgGetInt(pMac, WNI_CFG_APSD_ENABLED, &val) != eSIR_SUCCESS)
     {
-        cfgLog(pMac, LOGP, FL("cfg get WNI_CFG_APSD_ENABLED failed\n"));
+        cfgLog(pMac, LOGP, FL("cfg get WNI_CFG_APSD_ENABLED failed"));
         return eSIR_FAILURE;
     }
     if (val)
@@ -980,11 +980,11 @@
     {
       if (wlan_cfgGetInt(pMac, WNI_CFG_RRM_ENABLED, &val) != eSIR_SUCCESS)
       {
-        cfgLog(pMac, LOGP, FL("cfg get WNI_CFG_RRM_ENABLED failed\n"));
+        cfgLog(pMac, LOGP, FL("cfg get WNI_CFG_RRM_ENABLED failed"));
         return eSIR_FAILURE;
       }
 #if defined WLAN_VOWIFI_DEBUG
-      PELOGE(cfgLog( pMac, LOGE, "RRM = %d\n",val );)
+      PELOGE(cfgLog( pMac, LOGE, "RRM = %d",val );)
 #endif
       if (val)
         pCapInfo->rrm = 1;
@@ -996,7 +996,7 @@
     // Block ack bit
     if (wlan_cfgGetInt(pMac, WNI_CFG_BLOCK_ACK_ENABLED, &val) != eSIR_SUCCESS)
     {
-        cfgLog(pMac, LOGP, FL("cfg get WNI_CFG_BLOCK_ACK_ENABLED failed\n"));
+        cfgLog(pMac, LOGP, FL("cfg get WNI_CFG_BLOCK_ACK_ENABLED failed"));
         return eSIR_FAILURE;
     }
     pCapInfo->delayedBA = (tANI_U16)((val >> WNI_CFG_BLOCK_ACK_ENABLED_DELAYED) & 1);
diff --git a/CORE/MAC/src/cfg/cfgProcMsg.c b/CORE/MAC/src/cfg/cfgProcMsg.c
index 05c69d1..a053ab3 100644
--- a/CORE/MAC/src/cfg/cfgProcMsg.c
+++ b/CORE/MAC/src/cfg/cfgProcMsg.c
@@ -154,7 +154,7 @@
     tSirMsgQ    mmhMsg;
 
     // First Dword must contain the AP or STA magic dword
-    PELOGW(cfgLog(pMac, LOGW, FL("CFG size %d bytes MAGIC dword is 0x%x\n"),
+    PELOGW(cfgLog(pMac, LOGW, FL("CFG size %d bytes MAGIC dword is 0x%x"),
            length, sirReadU32N((tANI_U8*)pParam) );)
 
     // if the string is not correct, return failure
@@ -165,7 +165,7 @@
 
     else
     {
-        PELOGE(cfgLog(pMac, LOGE, FL("Invalid magic dword 0x%x\n"),sirReadU32N((tANI_U8*)pParam) );)
+        PELOGE(cfgLog(pMac, LOGE, FL("Invalid magic dword 0x%x"),sirReadU32N((tANI_U8*)pParam) );)
         retVal = WNI_CFG_INVALID_LEN;
         goto end;
     }
@@ -182,7 +182,7 @@
     // Parse the Cfg header
     pHdr = (tpCfgBinHdr) pParam;
     pParam += (sizeof(tCfgBinHdr) >> 2);
-    PELOGW(cfgLog(pMac, LOGW, FL("CFG hdr totParams %d intParams %d strBufSize %d/%d\n"),
+    PELOGW(cfgLog(pMac, LOGW, FL("CFG hdr totParams %d intParams %d strBufSize %d/%d"),
            pHdr->controlSize, pHdr->iBufSize, pHdr->sBufSize, pMac->cfg.gCfgMaxSBufSize);)
 
     expLen = ((CFG_PARAM_MAX_NUM + 3 * pMac->cfg.gCfgMaxIBufSize) << 2) +
@@ -190,7 +190,7 @@
 
     if (length != expLen)
     {
-        PELOGE(cfgLog(pMac, LOGE, FL("<CFG> DNLD_RSP invalid length %d (exp %d)\n"),
+        PELOGE(cfgLog(pMac, LOGE, FL("<CFG> DNLD_RSP invalid length %d (exp %d)"),
                length, expLen);)
         retVal = WNI_CFG_INVALID_LEN;
         goto end;
@@ -199,14 +199,14 @@
 
     if (pHdr->controlSize != CFG_PARAM_MAX_NUM)
     {
-        PELOGE(cfgLog(pMac, LOGE, FL("<CFG> Total parameter count mismatch\n"));)
+        PELOGE(cfgLog(pMac, LOGE, FL("<CFG> Total parameter count mismatch"));)
         retVal = WNI_CFG_INVALID_LEN;
         goto end;
     }
 
     if (pHdr->iBufSize != pMac->cfg.gCfgMaxIBufSize)
     {
-        PELOGE(cfgLog(pMac, LOGE, FL("<CFG> Integer parameter count mismatch\n"));)
+        PELOGE(cfgLog(pMac, LOGE, FL("<CFG> Integer parameter count mismatch"));)
         retVal = WNI_CFG_INVALID_LEN;
         goto end;
     }
@@ -248,7 +248,7 @@
             pMac->cfg.gCfgIBuf[i] > pMac->cfg.gCfgIBufMax[i])
         {
             PELOGE(cfgLog(pMac, LOGE, FL("cfg id %d Invalid def value %d "
-                            "min %d max %d\n"),
+                            "min %d max %d"),
                    i, pMac->cfg.gCfgIBuf[i], pMac->cfg.gCfgIBufMin[i],
                    pMac->cfg.gCfgIBufMax[i]);)
         }
@@ -266,7 +266,7 @@
         bufStart = pMac->cfg.gCfgEntry[i].control & CFG_BUF_INDX_MASK;
         pMac->cfg.gCfgSBuf[bufStart] = (tANI_U8)(bufEnd - bufStart - 2);
 
-       PELOG1(cfgLog(pMac, LOG1, FL("id %d max %d bufStart %d bufEnd %d\n"),
+       PELOG1(cfgLog(pMac, LOG1, FL("id %d max %d bufStart %d bufEnd %d"),
                i, pMac->cfg.gCfgSBuf[bufStart], bufStart, bufEnd);)
 
         bufEnd = bufStart;
@@ -280,7 +280,7 @@
 
         if (strSize < 4)
         {
-            PELOGE(cfgLog(pMac, LOGE, FL("Error parsing str defaults, rem %d bytes\n"), strSize);)
+            PELOGE(cfgLog(pMac, LOGE, FL("Error parsing str defaults, rem %d bytes"), strSize);)
             retVal = WNI_CFG_INVALID_LEN;
             goto end;
         }
@@ -292,8 +292,8 @@
         paramLenCeil4 = ((paramLen + 3) >> 2);
         if (strSize < paramLenCeil4 << 2)
         {
-            PELOGE(cfgLog(pMac, LOGE, FL("Error parsing str defaults, rem %d bytes\n"), strSize);)
-            PELOGE(cfgLog(pMac, LOGE, FL("param id %d len %d bytes\n"), paramId, paramLen);)
+            PELOGE(cfgLog(pMac, LOGE, FL("Error parsing str defaults, rem %d bytes"), strSize);)
+            PELOGE(cfgLog(pMac, LOGE, FL("param id %d len %d bytes"), paramId, paramLen);)
             retVal = WNI_CFG_INVALID_LEN;
             goto end;
         }
@@ -308,11 +308,11 @@
             strSize -= 4;
         }
 
-        PELOG1(cfgLog(pMac, LOG1, FL("set str id %d len %d\n"), paramId, paramLen);)
+        PELOG1(cfgLog(pMac, LOG1, FL("set str id %d len %d"), paramId, paramLen);)
 
         if (cfgSetStr(pMac, (tANI_U16) paramId, pStr, paramLen) != eSIR_SUCCESS)
         {
-            PELOGE(cfgLog(pMac, LOGE, FL("Error setting str default param %d len %d\n"), paramId, paramLen);)
+            PELOGE(cfgLog(pMac, LOGE, FL("Error setting str default param %d len %d"), paramId, paramLen);)
             retVal = WNI_CFG_INVALID_LEN;
             goto end;
         }
@@ -326,7 +326,7 @@
     // Set status to READY
     pMac->cfg.gCfgStatus = CFG_SUCCESS;
     retVal = WNI_CFG_SUCCESS;
-    PELOG1(cfgLog(pMac, LOG1, "<CFG> Completed successfully\n");)
+    PELOG1(cfgLog(pMac, LOG1, "<CFG> Completed successfully");)
 
     end:
 
@@ -346,7 +346,7 @@
     MTRACE(macTraceMsgTx(pMac, NO_SESSION, mmhMsg.type));
     if (wdaPostCtrlMsg(pMac, &mmhMsg) != eSIR_SUCCESS)
     {
-        PELOGE(cfgLog(pMac, LOGE, FL("WDAPostMsgApi failed!\n"));)
+        PELOGE(cfgLog(pMac, LOGE, FL("WDAPostMsgApi failed!"));)
     }
 
 } /*** end procDnldRsp() ***/
@@ -379,14 +379,14 @@
     tANI_U32    value, valueLen, result;
     tANI_U32    *pValue;
 
-    PELOG1(cfgLog(pMac, LOG1, FL("Rcvd cfg get request %d bytes\n"), length);)
+    PELOG1(cfgLog(pMac, LOG1, FL("Rcvd cfg get request %d bytes"), length);)
     for (i=0; i<length/4; i++)
-        PELOG2(cfgLog(pMac, LOG2, FL("[%2d] 0x%08x\n"), i, pParam[i]);)
+        PELOG2(cfgLog(pMac, LOG2, FL("[%2d] 0x%08x"), i, pParam[i]);)
 
     if (!pMac->cfg.gCfgStatus)
     {
         cfgId = (tANI_U16)sirReadU32N((tANI_U8*)pParam);
-        PELOGE(cfgLog(pMac, LOGE, FL("CFG not ready, param %d\n"), cfgId);)
+        PELOGE(cfgLog(pMac, LOGE, FL("CFG not ready, param %d"), cfgId);)
         pMac->cfg.gParamList[WNI_CFG_GET_RSP_RES]  = WNI_CFG_NOT_READY;
         pMac->cfg.gParamList[WNI_CFG_GET_RSP_PID]  = cfgId;
         pMac->cfg.gParamList[WNI_CFG_GET_RSP_PLEN] = 0;
@@ -402,7 +402,7 @@
             pValue   = 0;
             valueLen = 0;
 
-            PELOG1(cfgLog(pMac, LOG1, FL("Cfg get param %d\n"), cfgId);)
+            PELOG1(cfgLog(pMac, LOG1, FL("Cfg get param %d"), cfgId);)
 
             // Check for valid parameter ID, etc...
             if (CheckParam(pMac, cfgId, CFG_CTL_RE, WNI_CFG_WO_PARAM, &result))
@@ -427,7 +427,7 @@
             }
             else
             {
-                PELOGE(cfgLog(pMac, LOGE, FL("Check param failed, param %d\n"), cfgId);)
+                PELOGE(cfgLog(pMac, LOGE, FL("Check param failed, param %d"), cfgId);)
                 result = WNI_CFG_INVALID_LEN;
             }
 
@@ -480,9 +480,9 @@
     tANI_U16    cfgId, valueLen, valueLenRoundedUp4;
     tANI_U32    value, result;
 
-    PELOG1(cfgLog(pMac, LOGW, FL("Rcvd cfg set request %d bytes\n"), length);)
+    PELOG1(cfgLog(pMac, LOGW, FL("Rcvd cfg set request %d bytes"), length);)
     //for (i=0; i<length/4; i++)
-      //  PELOG2(cfgLog(pMac, LOG2, FL("[%2d] 0x%08x\n"), i, pParam[i]);)
+      //  PELOG2(cfgLog(pMac, LOG2, FL("[%2d] 0x%08x"), i, pParam[i]);)
 
     if (!pMac->cfg.gCfgStatus)
     {
@@ -517,14 +517,14 @@
                     // Set VALUE
                     if (valueLen != sizeof(tANI_U32))
                     {
-                        PELOGE(cfgLog(pMac, LOGE, FL("Invalid value length %d in set param %d (tot %d)\n"),
+                        PELOGE(cfgLog(pMac, LOGE, FL("Invalid value length %d in set param %d (tot %d)"),
                                valueLen, cfgId, length);)
                         result = WNI_CFG_INVALID_LEN;
                     }
                     else
                     {
                         value = *pParam;
-                        PELOG1(cfgLog(pMac, LOGW, FL("Cfg set int %d len %d(%d) val %d\n"),
+                        PELOG1(cfgLog(pMac, LOGW, FL("Cfg set int %d len %d(%d) val %d"),
                                cfgId, valueLen, valueLenRoundedUp4, value);)
                         result = (cfgSetInt(pMac, cfgId, value) == eSIR_SUCCESS ?
                                   WNI_CFG_SUCCESS : WNI_CFG_OTHER_ERROR);
@@ -547,14 +547,14 @@
                 {
                     if (valueLenRoundedUp4 > length)
                     {
-                        PELOGE(cfgLog(pMac, LOGE, FL("Invalid string length %d in set param %d (tot %d)\n"),
+                        PELOGE(cfgLog(pMac, LOGE, FL("Invalid string length %d in set param %d (tot %d)"),
                                valueLen, cfgId, length);)
                         result = WNI_CFG_INVALID_LEN;
                     }
                     else
                     {
                         GetStrValue((tANI_U8*)pParam, pMac->cfg.gSBuffer, valueLen);
-                        PELOG1(cfgLog(pMac, LOGW, FL("Cfg set str %d len %d(%d) bytes\n"),
+                        PELOG1(cfgLog(pMac, LOGW, FL("Cfg set str %d len %d(%d) bytes"),
                                cfgId, valueLen, valueLenRoundedUp4);)
                         result = (cfgSetStr(pMac, cfgId, pMac->cfg.gSBuffer, valueLen) == eSIR_SUCCESS ?
                                   WNI_CFG_SUCCESS : WNI_CFG_OTHER_ERROR);
@@ -575,7 +575,7 @@
             }
             else
             {
-                PELOGE(cfgLog(pMac, LOGE, FL("Check param failed, param %d\n"), cfgId);)
+                PELOGE(cfgLog(pMac, LOGE, FL("Check param failed, param %d"), cfgId);)
                 result = WNI_CFG_INVALID_LEN;
             }
 
@@ -589,7 +589,7 @@
             }
             else
             {
-                PELOGW(cfgLog( pMac, LOG2, "  CFGID %d no rsp\n", cfgId);)
+                PELOGW(cfgLog( pMac, LOG2, "  CFGID %d no rsp", cfgId);)
             }
 
             if (valueLenRoundedUp4 > length)
@@ -650,7 +650,7 @@
     // Check if parameter ID is out of bound
     if (cfgId >= CFG_PARAM_MAX_NUM)
     {
-        PELOGE(cfgLog(pMac, LOGE, FL("Invalid param id %d\n"), cfgId);)
+        PELOGE(cfgLog(pMac, LOGE, FL("Invalid param id %d"), cfgId);)
         *pResult = WNI_CFG_INVALID_PID;
     }
     else
@@ -658,7 +658,7 @@
         // Check if parameter is valid
         if ((pMac->cfg.gCfgEntry[cfgId].control & CFG_CTL_VALID) == 0)
         {
-            PELOGE(cfgLog(pMac, LOGE, FL("Param id %d not valid\n"), cfgId);)
+            PELOGE(cfgLog(pMac, LOGE, FL("Param id %d not valid"), cfgId);)
             *pResult = WNI_CFG_INVALID_PID;
         }
         else
@@ -666,7 +666,7 @@
             // Check control field against flag
             if ((pMac->cfg.gCfgEntry[cfgId].control & flag) == 0)
             {
-                PELOGE(cfgLog(pMac, LOGE, FL("Param id %d wrong permissions %x\n"),
+                PELOGE(cfgLog(pMac, LOGE, FL("Param id %d wrong permissions %x"),
                        cfgId, pMac->cfg.gCfgEntry[cfgId].control);)
                 *pResult = failedResult;
             }
@@ -743,13 +743,13 @@
     tANI_U32    logLevel;
 
     // First Dword must contain the AP or STA magic dword
-    PELOGW(cfgLog(pMac, LOGW, FL("CFG size %d bytes MAGIC dword is 0x%x\n"),
+    PELOGW(cfgLog(pMac, LOGW, FL("CFG size %d bytes MAGIC dword is 0x%x"),
            length, sirReadU32N((tANI_U8*)pConfig) );)
 
     // if the string is not correct, return failure
     if (CFG_STA_MAGIC_DWORD != *pConfig)
     {
-        PELOGE(cfgLog(pMac, LOGE, FL("Invalid magic dword 0x%x\n"),
+        PELOGE(cfgLog(pMac, LOGE, FL("Invalid magic dword 0x%x"),
                                              sirReadU32N((tANI_U8*)pConfig) );)
         retVal = WNI_CFG_INVALID_LEN;
         goto end;
@@ -766,7 +766,7 @@
     pHdr = (tpCfgBinHdr) pConfig;
     pConfig += (sizeof(tCfgBinHdr) >> 2);
 
-    PELOGW(cfgLog(pMac, LOGW, FL("CFG hdr totParams %d intParams %d strBufSize %d/%d\n"),
+    PELOGW(cfgLog(pMac, LOGW, FL("CFG hdr totParams %d intParams %d strBufSize %d/%d"),
                            pHdr->controlSize,pHdr->iBufSize,
                          pHdr->sBufSize, pMac->cfg.gCfgMaxSBufSize);)
 
@@ -775,7 +775,7 @@
 
     if (length != expLen)
     {
-        PELOGE(cfgLog(pMac, LOGE, FL("<CFG> DNLD_RSP invalid length %d (exp %d)\n"),
+        PELOGE(cfgLog(pMac, LOGE, FL("<CFG> DNLD_RSP invalid length %d (exp %d)"),
                length, expLen);)
         retVal = WNI_CFG_INVALID_LEN;
         goto end;
@@ -784,14 +784,14 @@
 
     if (CFG_PARAM_MAX_NUM != pHdr->controlSize )
     {
-        PELOGE(cfgLog(pMac, LOGE, FL("<CFG> Total parameter count mismatch\n"));)
+        PELOGE(cfgLog(pMac, LOGE, FL("<CFG> Total parameter count mismatch"));)
         retVal = WNI_CFG_INVALID_LEN;
         goto end;
     }
 
     if (pHdr->iBufSize != pMac->cfg.gCfgMaxIBufSize)
     {
-        PELOGE(cfgLog(pMac, LOGE, FL("<CFG> Integer parameter count mismatch\n"));)
+        PELOGE(cfgLog(pMac, LOGE, FL("<CFG> Integer parameter count mismatch"));)
         retVal = WNI_CFG_INVALID_LEN;
         goto end;
     }
@@ -835,7 +835,7 @@
             pMac->cfg.gCfgIBuf[i] > pMac->cfg.gCfgIBufMax[i])
         {
             PELOGE(cfgLog(pMac, LOGE, FL("cfg id %d Invalid def value %d "
-                             "min %d max %d\n"),
+                             "min %d max %d"),
                              i, pMac->cfg.gCfgIBuf[i], pMac->cfg.gCfgIBufMin[i],
                              pMac->cfg.gCfgIBufMax[i]);)
         }
@@ -854,7 +854,7 @@
         bufStart = pMac->cfg.gCfgEntry[i].control & CFG_BUF_INDX_MASK;
         pMac->cfg.gCfgSBuf[bufStart] = (tANI_U8)(bufEnd - bufStart - 2);
 
-        PELOG1(cfgLog(pMac, LOG1, FL("id %d max %d bufStart %d bufEnd %d\n"),
+        PELOG1(cfgLog(pMac, LOG1, FL("id %d max %d bufStart %d bufEnd %d"),
                i, pMac->cfg.gCfgSBuf[bufStart], bufStart, bufEnd);)
 
         bufEnd = bufStart;
@@ -868,7 +868,7 @@
 
         if (strSize < 4)
         {
-            PELOGE(cfgLog(pMac, LOGE, FL("Error parsing str defaults, rem %d bytes\n"),
+            PELOGE(cfgLog(pMac, LOGE, FL("Error parsing str defaults, rem %d bytes"),
                                                                       strSize);)
             retVal = WNI_CFG_INVALID_LEN;
             goto end;
@@ -883,8 +883,8 @@
         if (strSize < paramLenCeil4 << 2)
         {
             PELOGE(cfgLog(pMac, LOGE, FL("Error parsing str defaults, rem %d"
-                                                            "bytes\n"), strSize);)
-            PELOGE(cfgLog(pMac, LOGE, FL("param id %d len %d bytes\n"),
+                                                            "bytes"), strSize);)
+            PELOGE(cfgLog(pMac, LOGE, FL("param id %d len %d bytes"),
                                                             paramId, paramLen);)
             retVal = WNI_CFG_INVALID_LEN;
             goto end;
@@ -901,12 +901,12 @@
             strSize -= 4;
         }
 
-        PELOG1(cfgLog(pMac, LOG1, FL("set str id %d len %d\n"), paramId, paramLen);)
+        PELOG1(cfgLog(pMac, LOG1, FL("set str id %d len %d"), paramId, paramLen);)
 
         if (cfgSetStrNotify(pMac, (tANI_U16)paramId, pStr, paramLen, FALSE) != eSIR_SUCCESS)
         {
             PELOGE(cfgLog(pMac, LOGE, FL("Error setting str default param %d "
-                                                "len %d\n"), paramId, paramLen);)
+                                                "len %d"), paramId, paramLen);)
             retVal = WNI_CFG_INVALID_LEN;
             goto end;
         }
@@ -920,7 +920,7 @@
     // Set status to READY
     pMac->cfg.gCfgStatus = CFG_SUCCESS;
     retVal = WNI_CFG_SUCCESS;
-    PELOG1(cfgLog(pMac, LOG1, "<CFG> Completed successfully\n");)
+    PELOG1(cfgLog(pMac, LOG1, "<CFG> Completed successfully");)
 
 end:
 
diff --git a/CORE/MAC/src/dph/dphHashTable.c b/CORE/MAC/src/dph/dphHashTable.c
index 3772f8b..ee21d28 100644
--- a/CORE/MAC/src/dph/dphHashTable.c
+++ b/CORE/MAC/src/dph/dphHashTable.c
@@ -263,14 +263,14 @@
 
     if (assocId >= pDphHashTable->size)
     {
-        PELOGE(limLog(pMac, LOGE, FL("Invalid Assoc Id %d\n"), assocId);)
+        PELOGE(limLog(pMac, LOGE, FL("Invalid Assoc Id %d"), assocId);)
         return NULL;
     }
 
     pStaDs = getNode(pMac, (tANI_U8) assocId, pDphHashTable);
     staIdx = pStaDs->staIndex;
 
-    PELOG1(limLog(pMac, LOG1, FL("Assoc Id %d, Addr %08X\n"), assocId, pStaDs);)
+    PELOG1(limLog(pMac, LOG1, FL("Assoc Id %d, Addr %08X"), assocId, pStaDs);)
 
     // Clear the STA node except for the next pointer (last 4 bytes)
     palZeroMemory( pMac->hHdd, (tANI_U8 *) pStaDs, sizeof(tDphHashNode) - sizeof(tpDphHashNode));
@@ -287,7 +287,7 @@
 
     // Initialize fragmentation threshold
     if (wlan_cfgGetInt(pMac, WNI_CFG_FRAGMENTATION_THRESHOLD, &val) != eSIR_SUCCESS)
-        limLog(pMac, LOGP, FL("could not retrieve fragmentation threshold\n"));
+        limLog(pMac, LOGP, FL("could not retrieve fragmentation threshold"));
     else
         pStaDs->fragSize = (tANI_U16) val;
 
@@ -327,19 +327,19 @@
     tpDphHashNode ptr, node;
     tANI_U16 index = hashFunction(pMac, staAddr, pDphHashTable->size);
 
-    PELOG1(limLog(pMac, LOG1, FL("assocId %d index %d STA addr\n"),
+    PELOG1(limLog(pMac, LOG1, FL("assocId %d index %d STA addr"),
            assocId, index);
     dphPrintMacAddr(pMac, staAddr, LOG1);)
 
     if (assocId >= pDphHashTable->size)
     {
-        PELOGE(limLog(pMac, LOGE, FL("invalid STA id %d\n"), assocId);)
+        PELOGE(limLog(pMac, LOGE, FL("invalid STA id %d"), assocId);)
         return NULL;
     }
 
     if (pDphHashTable->pDphNodeArray[assocId].added)
     {
-        PELOGE(limLog(pMac, LOGE, FL("already added STA %d\n"), assocId);)
+        PELOGE(limLog(pMac, LOGE, FL("already added STA %d"), assocId);)
         return NULL;
     }
 
@@ -347,7 +347,7 @@
     {
         if (ptr == ptr->next)
         {
-            PELOGE(limLog(pMac, LOGE, FL("Infinite Loop\n"));)
+            PELOGE(limLog(pMac, LOGE, FL("Infinite Loop"));)
             return NULL;
         }
 
@@ -358,7 +358,7 @@
     if (ptr)
     {
         // Duplicate entry
-        limLog(pMac, LOGE, FL("assocId %d hashIndex %d entry exists\n"),
+        limLog(pMac, LOGE, FL("assocId %d hashIndex %d entry exists"),
                      assocId, index);
         return NULL;
     }
@@ -366,7 +366,7 @@
     {
         if (dphInitStaState(pMac, staAddr, assocId, false, pDphHashTable) == NULL)
         {
-            PELOGE(limLog(pMac, LOGE, FL("could not Init STAid=%d\n"), assocId);)
+            PELOGE(limLog(pMac, LOGE, FL("could not Init STAid=%d"), assocId);)
                     return NULL;
         }
 
@@ -404,19 +404,19 @@
   tANI_U16 index = hashFunction(pMac, staAddr, pDphHashTable->size);
 
 
-  PELOG1(limLog(pMac, LOG1, FL("assocId %d index %d STA addr\n"),
+  PELOG1(limLog(pMac, LOG1, FL("assocId %d index %d STA addr"),
                   assocId, index);
   dphPrintMacAddr(pMac, staAddr, LOG1);)
 
   if (assocId >= pDphHashTable->size)
   {
-      PELOGE(limLog(pMac, LOGE, FL("invalid STA id %d\n"), assocId);)
+      PELOGE(limLog(pMac, LOGE, FL("invalid STA id %d"), assocId);)
       return eSIR_FAILURE;
   }
 
   if (pDphHashTable->pDphNodeArray[assocId].added == 0)
   {
-      PELOGE(limLog(pMac, LOGE, FL("STA %d never added\n"), assocId);)
+      PELOGE(limLog(pMac, LOGE, FL("STA %d never added"), assocId);)
       return eSIR_FAILURE;
   }
 
@@ -429,7 +429,7 @@
       break;
     if (prev == ptr)
     {
-        PELOGE(limLog(pMac, LOGE, FL("Infinite Loop\n"));)
+        PELOGE(limLog(pMac, LOGE, FL("Infinite Loop"));)
         return eSIR_FAILURE;
     }
   }
@@ -449,7 +449,7 @@
   else
     {
       /// Entry not present
-      PELOGE(limLog(pMac, LOGE, FL("Entry not present STA addr\n"));
+      PELOGE(limLog(pMac, LOGE, FL("Entry not present STA addr"));
       dphPrintMacAddr(pMac, staAddr, LOGE);)
       return eSIR_FAILURE;
     }
@@ -477,7 +477,7 @@
 void
 dphPrintMacAddr(tpAniSirGlobal pMac, tANI_U8 addr[], tANI_U32 level)
 {
-    limLog(pMac, (tANI_U16) level, FL("MAC ADDR = %d:%d:%d:%d:%d:%d\n"),
+    limLog(pMac, (tANI_U16) level, FL("MAC ADDR = %d:%d:%d:%d:%d:%d"),
            addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]);
 }
 
diff --git a/CORE/MAC/src/include/parserApi.h b/CORE/MAC/src/include/parserApi.h
index 10d5383..d588ab6 100644
--- a/CORE/MAC/src/include/parserApi.h
+++ b/CORE/MAC/src/include/parserApi.h
@@ -288,7 +288,7 @@
         if ( eSIR_SUCCESS != (nStatus) )                             \
         {                                                            \
             dot11fLog( (pMac), LOGP, FL("Failed to retrieve "        \
-                                        #nItem " from CFG (%d).\n"), \
+                                        #nItem " from CFG (%d)."), \
                        (nStatus) );                                  \
             return nStatus;                                          \
         }                                                            \
@@ -299,7 +299,7 @@
         if ( eSIR_SUCCESS != (nStatus) )                             \
         {                                                            \
             dot11fLog( (pMac), LOGP, FL("Failed to retrieve "        \
-                                        #nItem " from CFG (%d).\n"), \
+                                        #nItem " from CFG (%d)."), \
                        (nStatus) );                                  \
             return;                                                  \
         }                                                            \
@@ -311,7 +311,7 @@
         if ( eSIR_SUCCESS != (nStatus) )                                \
         {                                                               \
             dot11fLog( (pMac), LOGP, FL("Failed to retrieve "           \
-                                        #nItem " from CFG (%d).\n"),    \
+                                        #nItem " from CFG (%d)."),    \
                        (nStatus) );                                     \
             return nStatus;                                             \
         }                                                               \
@@ -324,7 +324,7 @@
         if ( eSIR_SUCCESS != (nStatus) )                                \
         {                                                               \
             dot11fLog( (pMac), LOGP, FL("Failed to retrieve "           \
-                                        #nItem " from CFG (%d).\n"),    \
+                                        #nItem " from CFG (%d)."),    \
                        (nStatus) );                                     \
             return;                                                     \
         }                                                               \
diff --git a/CORE/MAC/src/pe/pmm/pmmApi.c b/CORE/MAC/src/pe/pmm/pmmApi.c
index 0c646e1..7784dff 100644
--- a/CORE/MAC/src/pe/pmm/pmmApi.c
+++ b/CORE/MAC/src/pe/pmm/pmmApi.c
@@ -220,7 +220,7 @@
     if(pMac->pmm.gPmmState != ePMM_STATE_BMPS_WT_INIT_RSP)
     {
         PELOGE(pmmLog(pMac, LOGE,
-            FL("pmmBmps: Received 'InitPwrSaveRsp' while in incorrect state: %d\n"),
+            FL("pmmBmps: Received 'InitPwrSaveRsp' while in incorrect state: %d"),
             pMac->pmm.gPmmState);)
 
         retStatus = eSIR_SME_INVALID_PMM_STATE;
@@ -240,7 +240,7 @@
     if(pEnterBmpsParams->status == eHAL_STATUS_SUCCESS)
     {
         PELOG2(pmmLog(pMac, LOG2,
-            FL("pmmBmps: Received successful response from HAL to enter BMPS_POWER_SAVE \n"));)
+            FL("pmmBmps: Received successful response from HAL to enter BMPS_POWER_SAVE "));)
 
         pMac->pmm.gPmmState = ePMM_STATE_BMPS_SLEEP;
 
@@ -265,7 +265,7 @@
     {
         //if init req failed, then go back to WAKEUP state.
         PELOGE(pmmLog(pMac, LOGE,
-            FL("pmmBmps: BMPS_INIT_PWR_SAVE_REQ failed, informing SME\n"));)
+            FL("pmmBmps: BMPS_INIT_PWR_SAVE_REQ failed, informing SME"));)
 
         pmmBmpsUpdateInitFailureCnt(pMac);
         nextState = ePMM_STATE_BMPS_WAKEUP;
@@ -327,7 +327,7 @@
     if (NULL == pExitBmpsInfo)
     {
         respStatus = eSIR_SME_BMPS_REQ_REJECT;
-        PELOGW(pmmLog(pMac, LOGW, FL("pmmBmps: Rcvd EXIT_BMPS with NULL body\n"));)
+        PELOGW(pmmLog(pMac, LOGW, FL("pmmBmps: Rcvd EXIT_BMPS with NULL body"));)
         goto failure;
     }
 
@@ -340,13 +340,13 @@
     if(limIsSystemInScanState(pMac))
     {
         PELOGW(pmmLog(pMac, LOGW, 
-            FL("pmmBmps: Device is already awake and scanning, returning success to PMC \n"));)
+            FL("pmmBmps: Device is already awake and scanning, returning success to PMC "));)
         limSendSmeRsp(pMac, eWNI_PMC_EXIT_BMPS_RSP, respStatus, 0, 0);
         return;
     }
 
     /* send wakeup request, only when in sleep state */
-    PELOGW(pmmLog(pMac, LOGW, FL("pmmBmps: Sending eWNI_PMC_EXIT_BMPS_REQ to HAL\n"));)
+    PELOGW(pmmLog(pMac, LOGW, FL("pmmBmps: Sending eWNI_PMC_EXIT_BMPS_REQ to HAL"));)
     if (pMac->pmm.gPmmState == ePMM_STATE_BMPS_SLEEP)
     {
         /* Store the reason code for exiting BMPS. This value will be
@@ -356,7 +356,7 @@
         palFreeMemory( pMac->hHdd, (tANI_U8 *) pExitBmpsInfo);
 
         PELOGW(pmmLog(pMac, LOGW, 
-            FL("pmmBmps: Rcvd EXIT_BMPS with reason code%d \n"), pMac->pmm.gPmmExitBmpsReasonCode);)
+            FL("pmmBmps: Rcvd EXIT_BMPS with reason code%d "), pMac->pmm.gPmmExitBmpsReasonCode);)
 
 
         // Set PMM to BMPS_WT_WAKEUP_RSP state
@@ -371,13 +371,13 @@
         else
         {
             PELOG1(pmmLog(pMac, LOG1,
-                          FL("pmmBmps: eWNI_PMC_EXIT_BMPS_REQ was successfully sent to HAL\n"));)
+                          FL("pmmBmps: eWNI_PMC_EXIT_BMPS_REQ was successfully sent to HAL"));)
         }
     }
     else
     {
         PELOGE(pmmLog(pMac, LOGE, 
-                      FL("pmmBmps: eWNI_PMC_EXIT_BMPS_REQ received in invalid state: %d\n"),
+                      FL("pmmBmps: eWNI_PMC_EXIT_BMPS_REQ received in invalid state: %d"),
             pMac->pmm.gPmmState );)
 
         respStatus = eSIR_SME_INVALID_PMM_STATE;
@@ -435,14 +435,14 @@
     // sending beacon filtering information down to HAL
     if (limSendBeaconFilterInfo(pMac, psessionEntry) != eSIR_SUCCESS)
     {
-        pmmLog(pMac, LOGE, FL("Fail to send Beacon Filter Info \n"));
+        pmmLog(pMac, LOGE, FL("Fail to send Beacon Filter Info "));
     }
 #else
     if(!IS_ACTIVEMODE_OFFLOAD_FEATURE_ENABLE)
     {
         if (limSendBeaconFilterInfo(pMac, psessionEntry) != eSIR_SUCCESS)
         {
-            pmmLog(pMac, LOGE, FL("Fail to send Beacon Filter Info \n"));
+            pmmLog(pMac, LOGE, FL("Fail to send Beacon Filter Info "));
         }
     }
 #endif
@@ -458,7 +458,7 @@
          limIsInQuietDuration(pMac) )
     {
         PELOGE(pmmLog(pMac, LOGE, 
-            FL("pmmBmps: BMPS Request received in invalid state PMM=%d, SME=%d, rejecting the initpwrsave request\n"), 
+            FL("pmmBmps: BMPS Request received in invalid state PMM=%d, SME=%d, rejecting the initpwrsave request"),
             pMac->pmm.gPmmState, pMac->lim.gLimSmeState);)
 
         respStatus = eSIR_SME_INVALID_PMM_STATE;
@@ -492,7 +492,7 @@
         if(VOS_TRUE != tx_timer_running(&pMac->lim.limTimers.gLimHeartBeatTimer)) 
         {
             PELOGE(pmmLog(pMac, LOGE, 
-                FL("Reject BMPS_REQ because HeartBeatTimer is not running. \n"));)
+                FL("Reject BMPS_REQ because HeartBeatTimer is not running. "));)
             respStatus = eSIR_SME_BMPS_REQ_FAILED;
             goto failure;
         }
@@ -507,7 +507,7 @@
     if((retStatus = pmmSendInitPowerSaveMsg(pMac,psessionEntry)) != eSIR_SUCCESS)
     {
         PELOGE(pmmLog(pMac, LOGE, 
-            FL("pmmBmps: Init Power Save Request Failed: Sending Response: %d\n"), 
+            FL("pmmBmps: Init Power Save Request Failed: Sending Response: %d"),
             retStatus);)
 
         respStatus = eSIR_SME_BMPS_REQ_REJECT;
@@ -555,7 +555,7 @@
 
     if( eHAL_STATUS_SUCCESS != palAllocateMemory( pMac->hHdd, (void **)&pExitBmpsParams, sizeof(*pExitBmpsParams)) )
     {
-        pmmLog(pMac, LOGW, FL("palAllocateMemory() failed\n"));
+        pmmLog(pMac, LOGW, FL("palAllocateMemory() failed"));
         retStatus = eSIR_MEM_ALLOC_FAILED;
         return retStatus;
     }
@@ -593,12 +593,12 @@
     retStatus = wdaPostCtrlMsg( pMac, &msgQ);
     if( eSIR_SUCCESS != retStatus )
     {
-        PELOGE(pmmLog( pMac, LOGE, FL("Sending WDA_EXIT_BMPS_REQ failed, reason=%X \n"), retStatus );)
+        PELOGE(pmmLog( pMac, LOGE, FL("Sending WDA_EXIT_BMPS_REQ failed, reason=%X "), retStatus );)
         palFreeMemory(pMac->hHdd, (tANI_U8*)pExitBmpsParams);
         return retStatus;
     }
 
-    PELOG1(pmmLog(pMac, LOG1, FL("WDA_EXIT_BMPS_REQ has been successfully sent to HAL\n"));)
+    PELOG1(pmmLog(pMac, LOG1, FL("WDA_EXIT_BMPS_REQ has been successfully sent to HAL"));)
     return retStatus;
 }
 
@@ -637,13 +637,13 @@
 
     if((psessionEntry->currentBssBeaconCnt == 0 && (!IS_ACTIVEMODE_OFFLOAD_FEATURE_ENABLE)))
     {
-        PELOGE(pmmLog( pMac, LOGE,  FL("Beacon count is zero, can not retrieve the TSF, failing the Enter Bmps Request\n"));)
+        PELOGE(pmmLog( pMac, LOGE,  FL("Beacon count is zero, can not retrieve the TSF, failing the Enter Bmps Request"));)
         return eSIR_FAILURE;
     }
 
     if (palAllocateMemory(pMac->hHdd, (void **)&pBmpsParams, sizeof(tEnterBmpsParams)) != eHAL_STATUS_SUCCESS)
     {
-        pmmLog(pMac, LOGP, "PMM: Not able to allocate memory for Enter Bmps\n");
+        pmmLog(pMac, LOGP, "PMM: Not able to allocate memory for Enter Bmps");
         return eSIR_FAILURE;
     }
 
@@ -708,7 +708,7 @@
             (tANI_U8)GET_MIN_VALUE((tANI_U8) numBeaconPerRssiAverage, WNI_CFG_NUM_BEACON_PER_RSSI_AVERAGE_STAMAX);
 
     pmmLog (pMac, LOG1,
-        "%s: [INFOLOG]RssiFilterInfo..%d %x %x\n", __func__, (int)pBmpsParams->bRssiFilterEnable,
+        "%s: [INFOLOG]RssiFilterInfo..%d %x %x", __func__, (int)pBmpsParams->bRssiFilterEnable,
         (unsigned int)pBmpsParams->rssiFilterPeriod, (unsigned int)pBmpsParams->numBeaconPerRssiAverage);
 
     msgQ.type = WDA_ENTER_BMPS_REQ;
@@ -729,7 +729,7 @@
     {
         palFreeMemory(pMac->hHdd, pBmpsParams);
         PELOGE(pmmLog( pMac, LOGE,
-            FL("Posting WDA_ENTER_BMPS_REQ to HAL failed, reason=%X\n"),
+            FL("Posting WDA_ENTER_BMPS_REQ to HAL failed, reason=%X"),
             retCode );)
     }
 
@@ -888,7 +888,7 @@
 
     if((psessionEntry = peFindSessionBySessionId(pMac,PowersavesessionId))==NULL)
     {
-        limLog(pMac, LOGP,FL("Session Does not exist for given sessionID\n"));
+        limLog(pMac, LOGP,FL("Session Does not exist for given sessionID"));
         return;
     }
 
@@ -908,7 +908,7 @@
     if(pMac->pmm.gPmmState != ePMM_STATE_BMPS_WT_WAKEUP_RSP)
     {
         PELOGE(pmmLog(pMac, LOGE,
-            FL("Received SIR_HAL_EXIT_BMPS_RSP while in incorrect state: %d\n"),
+            FL("Received SIR_HAL_EXIT_BMPS_RSP while in incorrect state: %d"),
             pMac->pmm.gPmmState);)
 
         retStatus = eSIR_SME_INVALID_PMM_STATE;
@@ -916,7 +916,7 @@
     }
     else
     {
-        PELOGW(pmmLog(pMac, LOGW, FL("Received SIR_HAL_EXIT_BMPS_RSP in correct state. \n"));)
+        PELOGW(pmmLog(pMac, LOGW, FL("Received SIR_HAL_EXIT_BMPS_RSP in correct state. "));)
     }
 
     /* PE is going to wakeup irrespective of whether
@@ -959,7 +959,7 @@
 
     if ( pMac->pmm.gPmmExitBmpsReasonCode == eSME_MISSED_BEACON_IND_RCVD)
     {
-        PELOGW(pmmLog(pMac, LOGW, FL("Rcvd SIR_HAL_EXIT_BMPS_RSP with MISSED_BEACON\n"));)
+        PELOGW(pmmLog(pMac, LOGW, FL("Rcvd SIR_HAL_EXIT_BMPS_RSP with MISSED_BEACON"));)
         pmmMissedBeaconHandler(pMac);
     }
     else if(pMac->pmm.inMissedBeaconScenario)
@@ -999,19 +999,19 @@
 
     if((psessionEntry = peFindSessionBySessionId(pMac,pwrSaveSessionId))==NULL)
     {
-        limLog(pMac, LOGE,FL("Session Does not exist for given sessionID\n"));
+        limLog(pMac, LOGE,FL("Session Does not exist for given sessionID"));
         return;
     }
 
 
-    PELOGE(pmmLog(pMac, LOG1, FL("The device woke up due to MISSED BEACON \n"));)
+    PELOGE(pmmLog(pMac, LOG1, FL("The device woke up due to MISSED BEACON "));)
 
     /* Proceed only if HeartBeat timer is created */
     if((pMac->lim.limTimers.gLimHeartBeatTimer.pMac) &&
        (pMac->lim.gLimTimersCreated))
     {
         if (wlan_cfgGetInt(pMac, WNI_CFG_BEACON_INTERVAL, &beaconInterval) != eSIR_SUCCESS)
-            PELOG1(pmmLog(pMac, LOG1, FL("Fail to get BEACON_INTERVAL value\n"));)
+            PELOG1(pmmLog(pMac, LOG1, FL("Fail to get BEACON_INTERVAL value"));)
 
         /* Change timer to reactivate it in future */
         heartBeatInterval= SYS_MS_TO_TICKS(beaconInterval * heartBeatInterval);
@@ -1019,7 +1019,7 @@
         if( tx_timer_change(&pMac->lim.limTimers.gLimHeartBeatTimer,
                             (tANI_U32)heartBeatInterval, 0) != TX_SUCCESS)
         {
-            PELOG1(pmmLog(pMac, LOG1, FL("Fail to change HeartBeat timer\n"));)
+            PELOG1(pmmLog(pMac, LOG1, FL("Fail to change HeartBeat timer"));)
         }
 
         /* update some statistics */
@@ -1041,7 +1041,7 @@
     }
     else
     {
-        PELOGE(pmmLog(pMac, LOGE, FL("HeartBeat Timer is not created, cannot re-activate\n"));)
+        PELOGE(pmmLog(pMac, LOGE, FL("HeartBeat Timer is not created, cannot re-activate"));)
     }
 
     return;
@@ -1094,7 +1094,7 @@
 
     if(psessionEntry == NULL)
     {
-      PELOGE(limLog(pMac, LOGE,FL("Session does Not exist with given sessionId :%d \n"),powersavesessionId);)
+      PELOGE(limLog(pMac, LOGE,FL("Session does Not exist with given sessionId :%d "),powersavesessionId);)
       return;
     }
 
@@ -1104,7 +1104,7 @@
      */
 
     PELOGW(pmmLog(pMac, LOGW, 
-           FL("pmmBmps: Received SIR_HAL_EXIT_BMPS_IND from HAL, Exiting BMPS sleep mode\n")); )
+           FL("pmmBmps: Received SIR_HAL_EXIT_BMPS_IND from HAL, Exiting BMPS sleep mode")); )
 
 
     pMac->pmm.gPmmState = ePMM_STATE_BMPS_WAKEUP;
@@ -1130,7 +1130,7 @@
         case eHAL_STATUS_HEARTBEAT_TMOUT:
             {
                 PELOG1(pmmLog(pMac, LOG1,
-                              FL("pmmBmps: The device woke up due to HeartBeat Timeout\n"));)
+                              FL("pmmBmps: The device woke up due to HeartBeat Timeout"));)
 
                 /* Proceed only if HeartBeat timer is created */
                 if((pMac->lim.limTimers.gLimHeartBeatTimer.pMac) &&
@@ -1147,7 +1147,7 @@
                                        (tANI_U32)heartBeatInterval, 0) != TX_SUCCESS)
                     {
                         PELOG1(pmmLog(pMac, LOG1,
-                               FL("pmmBmps: Unable to change HeartBeat timer\n"));)
+                               FL("pmmBmps: Unable to change HeartBeat timer"));)
                     }
 
                     /* update some statistics */
@@ -1170,7 +1170,7 @@
                 {
 
                     PELOGE(pmmLog(pMac, LOGE, 
-                           FL("pmmBmps: HeartBeat Timer is not created, cannot re-activate\n"));)
+                           FL("pmmBmps: HeartBeat Timer is not created, cannot re-activate"));)
                 }
             }
             break;
@@ -1215,7 +1215,7 @@
 
             if (palAllocateMemory(pMac->hHdd, (void **)&pPSCfg, sizeof(tSirPowerSaveCfg)) != eHAL_STATUS_SUCCESS)
             {
-                pmmLog(pMac, LOGP, "PMM: Not able to allocate memory for PMC Config\n");
+                pmmLog(pMac, LOGP, "PMM: Not able to allocate memory for PMC Config");
             }
             (void) palCopyMemory(pMac->hHdd, pPSCfg, pMbMsg->data, sizeof(tSirPowerSaveCfg));
             (void) pmmSendPowerSaveCfg(pMac, pPSCfg);
@@ -1237,7 +1237,7 @@
 
             if (palAllocateMemory(pMac->hHdd, (void **)&pExitBmpsInfo, sizeof(tExitBmpsInfo)) != eHAL_STATUS_SUCCESS)
             {
-                pmmLog(pMac, LOGP, "PMM: Failed to allocate memory for Exit BMPS Info \n");
+                pmmLog(pMac, LOGP, "PMM: Failed to allocate memory for Exit BMPS Info ");
             }
             (void) palCopyMemory(pMac->hHdd, pExitBmpsInfo, pMbMsg->data, sizeof(tExitBmpsInfo));
             (void) pmmExitBmpsRequestHandler(pMac, pExitBmpsInfo);
@@ -1322,7 +1322,7 @@
 
         default:
             PELOGW(pmmLog(pMac, LOGW, 
-                FL("PMM: Unknown message in pmmMsgQ type %d, potential memory leak!!\n"),
+                FL("PMM: Unknown message in pmmMsgQ type %d, potential memory leak!!"),
                 pMsg->type);)
     }
 
@@ -1362,7 +1362,7 @@
     vosStatus = vos_mq_post_message(VOS_MQ_ID_PE, (vos_msg_t *) pMsg);
     if(!VOS_IS_STATUS_SUCCESS(vosStatus))
     {
-        pmmLog(pMac, LOGP, FL("vos_mq_post_message failed with status code %d\n"), vosStatus);
+        pmmLog(pMac, LOGP, FL("vos_mq_post_message failed with status code %d"), vosStatus);
         return eSIR_FAILURE;
     }
 
@@ -1506,7 +1506,7 @@
          limIsInQuietDuration (pMac) )
     {
         PELOGE(pmmLog(pMac, LOGE, 
-              FL("pmmImps: PMM State = %d, Global MLM State = %d, Global SME State = %d, rejecting the sleep mode request\n"),
+              FL("pmmImps: PMM State = %d, Global MLM State = %d, Global SME State = %d, rejecting the sleep mode request"),
               pMac->pmm.gPmmState, pMac->lim.gLimMlmState, pMac->lim.gLimSmeState);)
 
         resultCode = eSIR_SME_INVALID_PMM_STATE;
@@ -1519,7 +1519,7 @@
     if( (retStatus = pmmImpsSendChangePwrSaveMsg(pMac, SIR_PM_SLEEP_MODE)) != eSIR_SUCCESS)
     {
         PELOGE(pmmLog(pMac, LOGE, 
-               FL("pmmImps: IMPS Sleep Request failed: sending response: %x\n"), retStatus);)
+               FL("pmmImps: IMPS Sleep Request failed: sending response: %x"), retStatus);)
 
         resultCode = eSIR_SME_IMPS_REQ_FAILED;
         goto failure;
@@ -1527,7 +1527,7 @@
     else
     {
         PELOG1(pmmLog(pMac, LOG1,
-               FL("pmmImps: Waiting for SoftMac response for IMPS request\n"));)
+               FL("pmmImps: Waiting for SoftMac response for IMPS request"));)
     }
     return;
 
@@ -1574,7 +1574,7 @@
     if(pMac->pmm.gPmmState != ePMM_STATE_IMPS_WT_SLEEP_RSP)
     {
         PELOGE(pmmLog(pMac, LOGE, 
-               FL("pmmImps: Receives IMPS sleep rsp in invalid state: %d\n"),
+               FL("pmmImps: Receives IMPS sleep rsp in invalid state: %d"),
                pMac->pmm.gPmmState);)
 
         resultCode = eSIR_SME_INVALID_PMM_STATE;
@@ -1589,7 +1589,7 @@
         pMac->pmm.gPmmState = ePMM_STATE_IMPS_SLEEP;
 
         PELOG2(pmmLog(pMac, LOG2,
-            FL("pmmImps: Received successful WDA_ENTER_IMPS_RSP from HAL\n"));)
+            FL("pmmImps: Received successful WDA_ENTER_IMPS_RSP from HAL"));)
 
         //update power save statistics
         pmmImpsUpdatePwrSaveStats(pMac);
@@ -1609,7 +1609,7 @@
 
 failure:
     PELOGE(pmmLog(pMac, LOGE, 
-           FL("pmmImpsSleepRsp failed, Ret Code: %d, next state will be: %d\n"),
+           FL("pmmImpsSleepRsp failed, Ret Code: %d, next state will be: %d"),
            rspStatus,
            pMac->pmm.gPmmState);)
 
@@ -1657,7 +1657,7 @@
             eSIR_SUCCESS)
         {
             PELOGE(pmmLog(pMac, LOGE, 
-                   FL("pmmImps: Wakeup request message sent to SoftMac failed\n"));)
+                   FL("pmmImps: Wakeup request message sent to SoftMac failed"));)
             resultCode = eSIR_SME_IMPS_REQ_FAILED;
             goto failure;
         }
@@ -1666,7 +1666,7 @@
     {
         // PE in invalid state 
         PELOGE(pmmLog(pMac, LOGE, 
-                      FL("pmmImps: Wakeup Req received in invalid state: %x\n"),
+                      FL("pmmImps: Wakeup Req received in invalid state: %x"),
                       pMac->pmm.gPmmState);)
 
         resultCode = eSIR_SME_INVALID_PMM_STATE;
@@ -1678,7 +1678,7 @@
 
 failure:
     PELOGE(pmmLog (pMac, LOGE, 
-                   FL("pmmImps: Changing to IMPS wakeup mode failed, Ret Code: %d, Next State: %d\n"),
+                   FL("pmmImps: Changing to IMPS wakeup mode failed, Ret Code: %d, Next State: %d"),
                    retStatus, pMac->pmm.gPmmState);)
 
     pMac->pmm.gPmmState = origState;
@@ -1722,7 +1722,7 @@
     if (pMac->pmm.gPmmState != ePMM_STATE_IMPS_WT_WAKEUP_RSP)
     {
         PELOGE(pmmLog(pMac, LOGE, 
-                      FL("pmmImps: Received 'Wakeup' response in invalid state: %d\n"), 
+                      FL("pmmImps: Received 'Wakeup' response in invalid state: %d"),
                       pMac->pmm.gPmmState);)
 
         resultCode = eSIR_SME_INVALID_PMM_STATE;
@@ -1735,7 +1735,7 @@
         {
             resultCode = eSIR_SME_SUCCESS;
             PELOG2(pmmLog(pMac, LOG2, 
-                          FL("pmmImps: Received WDA_EXIT_IMPS_RSP with Successful response from HAL\n"));)
+                          FL("pmmImps: Received WDA_EXIT_IMPS_RSP with Successful response from HAL"));)
         }
         break;
 
@@ -1743,7 +1743,7 @@
             {
                 resultCode = eSIR_SME_IMPS_REQ_FAILED;
                 PELOGW(pmmLog(pMac, LOGW, 
-                              FL("pmmImps: Received WDA_EXIT_IMPS_RSP with Failure Status from HAL\n"));)
+                              FL("pmmImps: Received WDA_EXIT_IMPS_RSP with Failure Status from HAL"));)
             }
             break;
 
@@ -1792,7 +1792,7 @@
          limIsSystemInScanState(pMac) )
     {
         PELOGE(pmmLog(pMac, LOGE,
-            FL("pmmUapsd: PMM State = %d, Global MLM State = %d, Global SME State = %d, rejecting the sleep mode request\n"),
+            FL("pmmUapsd: PMM State = %d, Global MLM State = %d, Global SME State = %d, rejecting the sleep mode request"),
             pMac->pmm.gPmmState, pMac->lim.gLimMlmState, pMac->lim.gLimSmeState);)
 
         resultCode = eSIR_SME_INVALID_PMM_STATE;
@@ -1804,12 +1804,12 @@
     if( (retStatus = pmmUapsdSendChangePwrSaveMsg(pMac, SIR_PM_SLEEP_MODE)) != eSIR_SUCCESS)
     {
         PELOGE(pmmLog(pMac, LOGE,
-            FL("pmmUapsd: HAL_ENTER_UAPSD_REQ failed with response: %x\n"), retStatus);)
+            FL("pmmUapsd: HAL_ENTER_UAPSD_REQ failed with response: %x"), retStatus);)
         resultCode = eSIR_SME_UAPSD_REQ_FAILED;
         goto failure;
     }
 
-    PELOG1(pmmLog(pMac, LOG1, FL("pmmUapsd: Waiting for WDA_ENTER_UAPSD_RSP \n"));)
+    PELOG1(pmmLog(pMac, LOG1, FL("pmmUapsd: Waiting for WDA_ENTER_UAPSD_RSP "));)
     return;
 
 failure:
@@ -1859,14 +1859,14 @@
 
     if((psessionEntry = peFindSessionBySessionId(pMac,PowersavesessionId))==NULL)
     {
-        limLog(pMac, LOGP,FL("Session Does not exist for given sessionID\n"));
+        limLog(pMac, LOGP,FL("Session Does not exist for given sessionID"));
         return;
     }
 
     if(pMac->pmm.gPmmState != ePMM_STATE_UAPSD_WT_SLEEP_RSP)
     {
         PELOGE(pmmLog(pMac, LOGE,
-            FL("pmmUapsd: Received SIR_HAL_ENTER_UAPSD_RSP while in incorrect state: %d\n"),
+            FL("pmmUapsd: Received SIR_HAL_ENTER_UAPSD_RSP while in incorrect state: %d"),
             pMac->pmm.gPmmState);)
         limSendSmeRsp(pMac, eWNI_PMC_ENTER_UAPSD_RSP, eSIR_SME_INVALID_PMM_STATE, 0, 0);        
         return;
@@ -1875,13 +1875,13 @@
     if(pUapsdRspMsg->status == eHAL_STATUS_SUCCESS)
     {
         PELOGW(pmmLog(pMac, LOGW,
-            FL("pmmUapsd: Received successful response from HAL to enter UAPSD mode \n"));)
+            FL("pmmUapsd: Received successful response from HAL to enter UAPSD mode "));)
         pMac->pmm.gPmmState = ePMM_STATE_UAPSD_SLEEP;
     }
     else
     {
         PELOGE(pmmLog(pMac, LOGE,
-            FL("pmmUapsd: SIR_HAL_ENTER_UAPSD_RSP failed, informing SME\n"));)
+            FL("pmmUapsd: SIR_HAL_ENTER_UAPSD_RSP failed, informing SME"));)
         pMac->pmm.gPmmState = ePMM_STATE_BMPS_SLEEP;
         retStatus = eSIR_SME_UAPSD_REQ_FAILED;
     }
@@ -1934,7 +1934,7 @@
                                                 eSIR_SUCCESS)
         {
             PELOGE(pmmLog(pMac, LOGE,
-                FL("pmmUapsd: sending EXIT_UAPSD to HAL failed \n"));)
+                FL("pmmUapsd: sending EXIT_UAPSD to HAL failed "));)
             resultCode = eSIR_SME_UAPSD_REQ_FAILED;
             goto failure;
         }
@@ -1942,7 +1942,7 @@
     else
     {
         PELOGE(pmmLog(pMac, LOGE,
-            FL("pmmUapsd: Rcv EXIT_UAPSD from PMC in invalid state: %x\n"),
+            FL("pmmUapsd: Rcv EXIT_UAPSD from PMC in invalid state: %x"),
             pMac->pmm.gPmmState);)
 
         resultCode = eSIR_SME_INVALID_PMM_STATE;
@@ -1953,7 +1953,7 @@
 failure:
     pMac->pmm.gPmmState = origState;
     PELOGE(pmmLog(pMac, LOGE,
-        FL("pmmUapsd: Waking up from UAPSD mode failed, Ret Code: %d, Next State: %d\n"),
+        FL("pmmUapsd: Waking up from UAPSD mode failed, Ret Code: %d, Next State: %d"),
         retStatus, pMac->pmm.gPmmState);)
     limSendSmeRsp(pMac, eWNI_PMC_EXIT_UAPSD_RSP, resultCode, 0, 0);
 }
@@ -1989,7 +1989,7 @@
     if (pMac->pmm.gPmmState != ePMM_STATE_UAPSD_WT_WAKEUP_RSP)
     {
         PELOGE(pmmLog(pMac, LOGE,
-            FL("Received HAL_EXIT_UAPSD_RSP in invalid state: %d\n"),
+            FL("Received HAL_EXIT_UAPSD_RSP in invalid state: %d"),
             pMac->pmm.gPmmState);)
         limSendSmeRsp(pMac, eWNI_PMC_EXIT_UAPSD_RSP, eSIR_SME_INVALID_PMM_STATE, 0, 0);
         return;
@@ -1999,14 +1999,14 @@
     PowersavesessionId = pMac->pmm.sessionId;
     if((psessionEntry = peFindSessionBySessionId(pMac,PowersavesessionId))==NULL)
     {
-        limLog(pMac, LOGP,FL("Session Does not exist for given sessionID\n"));
+        limLog(pMac, LOGP,FL("Session Does not exist for given sessionID"));
         return;
     }
 
     if(NULL == pUapsdExitRspParams )
     {
         PELOGE(pmmLog(pMac, LOGE,
-            FL("Received HAL_EXIT_UAPSD_RSP message with zero parameters:\n"));)
+            FL("Received HAL_EXIT_UAPSD_RSP message with zero parameters:"));)
             limSendSmeRsp(pMac, eWNI_PMC_EXIT_UAPSD_RSP, eSIR_SME_UAPSD_REQ_FAILED, 0, 0);
         return;
     }
@@ -2015,12 +2015,12 @@
         case eHAL_STATUS_SUCCESS:
             resultCode = eSIR_SME_SUCCESS;
             PELOGW(pmmLog(pMac, LOGW,
-                FL("Received SIR_HAL_EXIT_UAPSD_RSP with Successful response \n"));)
+                FL("Received SIR_HAL_EXIT_UAPSD_RSP with Successful response "));)
             break;
         default:
             resultCode = eSIR_SME_UAPSD_REQ_FAILED;
             PELOGE(pmmLog(pMac, LOGW,
-                FL("Received SIR_HAL_EXIT_UAPSD_RSP with Failure Status\n"));)
+                FL("Received SIR_HAL_EXIT_UAPSD_RSP with Failure Status"));)
             break;
     }
 
@@ -2055,14 +2055,14 @@
 
     if (palAllocateMemory(pMac->hHdd, (void **)&pBcastPtrn, sizeof(*pBcastPtrn)) != eHAL_STATUS_SUCCESS)
     {
-        pmmLog(pMac, LOGP, FL("Fail to allocate memory for WoWLAN Add Bcast Pattern \n"));
+        pmmLog(pMac, LOGP, FL("Fail to allocate memory for WoWLAN Add Bcast Pattern "));
         return;
     }
     (void) palCopyMemory(pMac->hHdd, pBcastPtrn, pMbMsg->data, sizeof(*pBcastPtrn));
 
     if (NULL == pBcastPtrn)
     {
-        pmmLog(pMac, LOGE, FL("Add broadcast pattern message is NULL \n"));
+        pmmLog(pMac, LOGE, FL("Add broadcast pattern message is NULL "));
         return;
     }
 
@@ -2102,14 +2102,14 @@
 
     if (palAllocateMemory(pMac->hHdd, (void **)&pDeletePtrn, sizeof(*pDeletePtrn)) != eHAL_STATUS_SUCCESS)
     {
-        pmmLog(pMac, LOGP, FL("Fail to allocate memory for WoWLAN Delete Bcast Pattern \n"));
+        pmmLog(pMac, LOGP, FL("Fail to allocate memory for WoWLAN Delete Bcast Pattern "));
         return;
     }
     (void) palCopyMemory(pMac->hHdd, pDeletePtrn, pMbMsg->data, sizeof(*pDeletePtrn));
 
     if (NULL == pDeletePtrn)
     {
-        pmmLog(pMac, LOGE, FL("Delete broadcast pattern message is NULL \n"));
+        pmmLog(pMac, LOGE, FL("Delete broadcast pattern message is NULL "));
         return;
     }
 
@@ -2160,7 +2160,7 @@
     if((pSessionEntry = peFindSessionByBssid(pMac,pSmeWowlParams->bssId,&peSessionId))== NULL)
     {
          limLog(pMac, LOGE,
-               FL("session does not exist for given BSSId\n"));
+               FL("session does not exist for given BSSId"));
         goto end;
     }
     pMac->pmm.sessionId = peSessionId;
@@ -2171,7 +2171,7 @@
 #if 0
     if (pMac->lim.gLimSmeState != eLIM_SME_LINK_EST_STATE)
     {
-        pmmLog(pMac, LOGE, FL("Rcvd PMC_ENTER_WOWL_REQ when station is not associated \n"));
+        pmmLog(pMac, LOGE, FL("Rcvd PMC_ENTER_WOWL_REQ when station is not associated "));
         limSendSmeRsp(pMac, eWNI_PMC_ENTER_WOWL_RSP, eSIR_SME_STA_NOT_ASSOCIATED, 0, 0);
         goto end;
     }
@@ -2180,14 +2180,14 @@
 
     if ((pMac->pmm.gPmmState != ePMM_STATE_BMPS_SLEEP) && (pMac->pmm.gPmmState != ePMM_STATE_WOWLAN))
     {
-        pmmLog(pMac, LOGE, FL("Rcvd PMC_ENTER_WOWL_REQ in invalid Power Save state \n"));
+        pmmLog(pMac, LOGE, FL("Rcvd PMC_ENTER_WOWL_REQ in invalid Power Save state "));
         limSendSmeRsp(pMac, eWNI_PMC_ENTER_WOWL_RSP, eSIR_SME_INVALID_PMM_STATE, 0, 0);
         goto end;
     }
 
     if (palAllocateMemory(pMac->hHdd, (void **)&pHalWowlParams, sizeof(*pHalWowlParams)) != eHAL_STATUS_SUCCESS)
     {
-        pmmLog(pMac, LOGP, FL("Fail to allocate memory for Enter Wowl Request \n"));
+        pmmLog(pMac, LOGP, FL("Fail to allocate memory for Enter Wowl Request "));
         goto end;
     }
     (void) palZeroMemory(pMac->hHdd, (tANI_U8 *)pHalWowlParams, sizeof(*pHalWowlParams) );
@@ -2223,28 +2223,28 @@
 
     if(wlan_cfgGetInt(pMac, WNI_CFG_WOWLAN_DEAUTH_ENABLE, &cfgValue) != eSIR_SUCCESS)
     {
-       limLog(pMac, LOGP, FL("cfgGet failed for WNI_CFG_WOWLAN_DEAUTH_ENABLE \n"));
+       limLog(pMac, LOGP, FL("cfgGet failed for WNI_CFG_WOWLAN_DEAUTH_ENABLE "));
        goto end;
     }
     pHalWowlParams->ucWowDeauthRcv = (tANI_U8)cfgValue;
 
     if(wlan_cfgGetInt(pMac, WNI_CFG_WOWLAN_DISASSOC_ENABLE, &cfgValue) != eSIR_SUCCESS)
     {
-        limLog(pMac, LOGP, FL("cfgGet failed for WNI_CFG_WOWLAN_DEAUTH_ENABLE \n"));
+        limLog(pMac, LOGP, FL("cfgGet failed for WNI_CFG_WOWLAN_DEAUTH_ENABLE "));
         goto end;
     }
     pHalWowlParams->ucWowDisassocRcv = (tANI_U8)cfgValue;
 
     if(wlan_cfgGetInt(pMac, WNI_CFG_WOWLAN_MAX_MISSED_BEACON, &cfgValue) != eSIR_SUCCESS)
     {
-        limLog(pMac, LOGP, FL("cfgGet failed for WNI_CFG_WOWLAN_MAX_MISSED_BEACON \n"));
+        limLog(pMac, LOGP, FL("cfgGet failed for WNI_CFG_WOWLAN_MAX_MISSED_BEACON "));
         goto end;
     }
     pHalWowlParams->ucWowMaxMissedBeacons = (tANI_U8)cfgValue;
 
     if(wlan_cfgGetInt(pMac, WNI_CFG_WOWLAN_MAX_SLEEP_PERIOD, &cfgValue) != eSIR_SUCCESS)
     {
-        limLog(pMac, LOGP, FL("cfgGet failed for WNI_CFG_WOWLAN_MAX_SLEEP_PERIOD \n"));
+        limLog(pMac, LOGP, FL("cfgGet failed for WNI_CFG_WOWLAN_MAX_SLEEP_PERIOD "));
         goto end;
     }
     pHalWowlParams->ucWowMaxSleepUsec = (tANI_U8)cfgValue;
@@ -2252,7 +2252,7 @@
     //Send message to HAL
     if( eSIR_SUCCESS != (retCode = pmmSendWowlEnterRequest( pMac, pHalWowlParams)))
     {
-        pmmLog(pMac, LOGE, FL("Send ENTER_WOWL_REQ to HAL failed, reasonCode %d \n"), retCode);
+        pmmLog(pMac, LOGE, FL("Send ENTER_WOWL_REQ to HAL failed, reasonCode %d "), retCode);
         limSendSmeRsp(pMac, eWNI_PMC_ENTER_WOWL_RSP, eSIR_SME_WOWL_ENTER_REQ_FAILED, 0, 0);
         goto end;
     }
@@ -2333,12 +2333,12 @@
 
         if(rspStatus == eHAL_STATUS_SUCCESS)
         {
-            pmmLog(pMac, LOGW, FL("Rcv successful response from HAL to enter WOWLAN \n"));
+            pmmLog(pMac, LOGW, FL("Rcv successful response from HAL to enter WOWLAN "));
             pMac->pmm.gPmmState = ePMM_STATE_WOWLAN;
         }
         else
         {
-            pmmLog(pMac, LOGE, FL("HAL enter WOWLAN failed, informing SME\n"));
+            pmmLog(pMac, LOGE, FL("HAL enter WOWLAN failed, informing SME"));
             smeRspCode = eSIR_SME_WOWL_ENTER_REQ_FAILED;
         }
     }
@@ -2366,14 +2366,14 @@
 
     if((pSessionEntry = peFindSessionBySessionId(pMac,PowersavesessionId)) == NULL )
     {
-        PELOGW(pmmLog(pMac, LOGE, FL("pmmWowl :palAllocateMemory() failed\n"));)
+        PELOGW(pmmLog(pMac, LOGE, FL("pmmWowl :palAllocateMemory() failed"));)
         smeRspCode = eSIR_SME_WOWL_EXIT_REQ_FAILED;
         goto failure;
     }
 
     if (palAllocateMemory(pMac->hHdd, (void **)&pHalWowlMsg, sizeof(*pHalWowlMsg)) != eHAL_STATUS_SUCCESS)
     {
-        pmmLog(pMac, LOGP, FL("Fail to allocate memory for WoWLAN Add Bcast Pattern \n"));
+        pmmLog(pMac, LOGP, FL("Fail to allocate memory for WoWLAN Add Bcast Pattern "));
         smeRspCode = eSIR_SME_WOWL_EXIT_REQ_FAILED;
         goto failure;
     }
@@ -2385,7 +2385,7 @@
     if ( pMac->pmm.gPmmState != ePMM_STATE_WOWLAN )
     {
         pmmLog(pMac, LOGE,
-            FL("Exit WOWLAN Request received in invalid state PMM=%d \n"),
+            FL("Exit WOWLAN Request received in invalid state PMM=%d "),
             pMac->pmm.gPmmState);
         smeRspCode = eSIR_SME_INVALID_PMM_STATE;
         goto failure;
@@ -2397,7 +2397,7 @@
     if((retStatus = pmmSendExitWowlReq(pMac, pHalWowlMsg)) != eSIR_SUCCESS)
     {
         pmmLog(pMac, LOGE,
-            FL("Fail to send WDA_WOWL_EXIT_REQ, reason code %d\n"),
+            FL("Fail to send WDA_WOWL_EXIT_REQ, reason code %d"),
             retStatus);
         smeRspCode = eSIR_SME_WOWL_EXIT_REQ_FAILED;
         goto failure;
@@ -2440,7 +2440,7 @@
 
     if( eSIR_SUCCESS != (retCode = wdaPostCtrlMsg( pMac, &msgQ )))
         pmmLog( pMac, LOGE,
-            FL("Posting WDA_WOWL_EXIT_REQ failed, reason=%X\n"),
+            FL("Posting WDA_WOWL_EXIT_REQ failed, reason=%X"),
             retCode );
 
     return retCode;
@@ -2478,12 +2478,12 @@
 
     if( rspStatus == eHAL_STATUS_SUCCESS)
     {
-        pmmLog(pMac, LOGW, FL("Rcvd successful rsp from HAL to exit WOWLAN \n"));
+        pmmLog(pMac, LOGW, FL("Rcvd successful rsp from HAL to exit WOWLAN "));
         limSendSmeRsp(pMac, eWNI_PMC_EXIT_WOWL_RSP, eSIR_SME_SUCCESS, 0, 0);
     }
     else
     {
-        pmmLog(pMac, LOGE, FL("Rcvd failure rsp from HAL to exit WOWLAN \n"));
+        pmmLog(pMac, LOGE, FL("Rcvd failure rsp from HAL to exit WOWLAN "));
         limSendSmeRsp(pMac, eWNI_PMC_EXIT_WOWL_RSP, eSIR_SME_WOWL_EXIT_REQ_FAILED, 0, 0);
     }
     return;
@@ -2517,12 +2517,12 @@
     if (SIR_PM_SLEEP_MODE == mode)
     {
         msgQ.type = WDA_ENTER_IMPS_REQ;
-        PELOG2(pmmLog (pMac, LOG2, FL("Sending WDA_ENTER_IMPS_REQ to HAL\n"));)
+        PELOG2(pmmLog (pMac, LOG2, FL("Sending WDA_ENTER_IMPS_REQ to HAL"));)
     }
     else
     {
         msgQ.type = WDA_EXIT_IMPS_REQ;
-        PELOG2(pmmLog (pMac, LOG2, FL("Sending WDA_EXIT_IMPS_REQ to HAL\n"));)
+        PELOG2(pmmLog (pMac, LOG2, FL("Sending WDA_EXIT_IMPS_REQ to HAL"));)
     }
 
     msgQ.reserved = 0;
@@ -2538,7 +2538,7 @@
     if ( eSIR_SUCCESS != retStatus )
     {
         PELOGE(pmmLog(pMac, LOGE, 
-            FL("WDA_ENTER/EXIT_IMPS_REQ to HAL failed, reason=%X\n"), retStatus);)
+            FL("WDA_ENTER/EXIT_IMPS_REQ to HAL failed, reason=%X"), retStatus);)
     }
 
     return retStatus;
@@ -2570,7 +2570,7 @@
 
     if((pSessionEntry = peGetValidPowerSaveSession(pMac)) == NULL )
     {
-        PELOGW(pmmLog(pMac, LOGW, FL("pmmUapsd :palAllocateMemory() failed\n"));)
+        PELOGW(pmmLog(pMac, LOGW, FL("pmmUapsd :palAllocateMemory() failed"));)
         retStatus = eSIR_FAILURE;
         return retStatus;
     }
@@ -2579,7 +2579,7 @@
     {
         if( eHAL_STATUS_SUCCESS != palAllocateMemory( pMac->hHdd, (void **)&pUapsdParams, sizeof(tUapsdParams)) )
         {
-            PELOGW(pmmLog(pMac, LOGW, FL("pmmUapsd :palAllocateMemory() failed\n"));)
+            PELOGW(pmmLog(pMac, LOGW, FL("pmmUapsd :palAllocateMemory() failed"));)
             retStatus = eSIR_MEM_ALLOC_FAILED;
             return retStatus;
         }
@@ -2602,30 +2602,30 @@
         pUapsdParams->bssIdx = pSessionEntry->bssIdx;
 
         PELOGE(pmmLog(pMac, LOGE, 
-                      FL("UAPSD Mask:  static = 0x%x, DeliveryEnabled = 0x%x, TriggerEnabled = 0x%x \n"),
+                      FL("UAPSD Mask:  static = 0x%x, DeliveryEnabled = 0x%x, TriggerEnabled = 0x%x "),
             pMac->lim.gUapsdPerAcBitmask,
             pMac->lim.gUapsdPerAcDeliveryEnableMask,
             pMac->lim.gUapsdPerAcTriggerEnableMask);)
 
-        PELOG1(pmmLog(pMac, LOG1, FL("Delivery Enabled: BK=%d, BE=%d, Vi=%d, Vo=%d \n"), 
+        PELOG1(pmmLog(pMac, LOG1, FL("Delivery Enabled: BK=%d, BE=%d, Vi=%d, Vo=%d "),
             pUapsdParams->bkDeliveryEnabled, 
             pUapsdParams->beDeliveryEnabled, 
             pUapsdParams->viDeliveryEnabled, 
             pUapsdParams->voDeliveryEnabled);)
 
-        PELOG1(pmmLog(pMac, LOG1, FL("Trigger Enabled: BK=%d, BE=%d, Vi=%d, Vo=%d \n"), 
+        PELOG1(pmmLog(pMac, LOG1, FL("Trigger Enabled: BK=%d, BE=%d, Vi=%d, Vo=%d "),
             pUapsdParams->bkTriggerEnabled, 
             pUapsdParams->beTriggerEnabled, 
             pUapsdParams->viTriggerEnabled, 
             pUapsdParams->voTriggerEnabled);)
 
-        PELOGW(pmmLog (pMac, LOGW, FL("pmmUapsd: Sending WDA_ENTER_UAPSD_REQ to HAL\n"));)
+        PELOGW(pmmLog (pMac, LOGW, FL("pmmUapsd: Sending WDA_ENTER_UAPSD_REQ to HAL"));)
     }
     else
     {
         if( eHAL_STATUS_SUCCESS != palAllocateMemory( pMac->hHdd, (void **)&pExitUapsdParams, sizeof(tExitUapsdParams)) )
         {
-            PELOGW(pmmLog(pMac, LOGW, FL("pmmUapsd :palAllocateMemory() failed\n"));)
+            PELOGW(pmmLog(pMac, LOGW, FL("pmmUapsd :palAllocateMemory() failed"));)
             retStatus = eSIR_MEM_ALLOC_FAILED;
             return retStatus;
         }
@@ -2634,7 +2634,7 @@
         msgQ.type = WDA_EXIT_UAPSD_REQ;
         msgQ.bodyptr = pExitUapsdParams;
         pExitUapsdParams->bssIdx = pSessionEntry->bssIdx;
-        PELOGW(pmmLog (pMac, LOGW, FL("pmmUapsd: Sending WDA_EXIT_UAPSD_REQ to HAL\n"));)
+        PELOGW(pmmLog (pMac, LOGW, FL("pmmUapsd: Sending WDA_EXIT_UAPSD_REQ to HAL"));)
     }
 
     /* we need to defer any incoming messages until we get a
@@ -2649,7 +2649,7 @@
     if ( eSIR_SUCCESS != retStatus )
     {
         PELOGE(pmmLog(pMac, LOGE, 
-            FL("pmmUapsd: WDA_ENTER/EXIT_UAPSD_REQ to HAL failed, reason=%X\n"),
+            FL("pmmUapsd: WDA_ENTER/EXIT_UAPSD_REQ to HAL failed, reason=%X"),
             retStatus);)
         if (SIR_PM_SLEEP_MODE == mode)
             palFreeMemory(pMac->hHdd, (tANI_U8*)pUapsdParams);
@@ -2903,7 +2903,7 @@
     if ((statusCode = limPostMsgApi(pMac, &limMsg)) != eSIR_SUCCESS)
     {
           PELOGW(pmmLog(pMac, LOGW,
-            FL("posting message %X to LIM failed, reason=%d\n"),
+            FL("posting message %X to LIM failed, reason=%d"),
             limMsg.type, statusCode);)
     }
 }
@@ -2933,12 +2933,12 @@
         if (eHAL_STATUS_SUCCESS == rspStatus)
         {
             pmmLog(pMac, LOGE, FL("Rcv successful response from HAL to get "
-                "Packet Coalescing Filter Match Count\n"));
+                "Packet Coalescing Filter Match Count"));
         }
         else
         {
             pmmLog(pMac, LOGE, FL("HAL failed to get Packet Coalescing "
-                "Filter Match Count, informing SME\n"));
+                "Filter Match Count, informing SME"));
             smeRspCode = eSIR_SME_PC_FILTER_MATCH_COUNT_REQ_FAILED;
         }
     }
@@ -2972,11 +2972,11 @@
         rspStatus = pGtkOffloadGetInfoRspParams->ulStatus;
         if(rspStatus == eHAL_STATUS_SUCCESS)
         {
-            pmmLog(pMac, LOGW, FL("Rcv successful response from HAL to get GTK Offload Information\n"));
+            pmmLog(pMac, LOGW, FL("Rcv successful response from HAL to get GTK Offload Information"));
         }
         else
         {
-            pmmLog(pMac, LOGE, FL("HAL failed to get GTK Offload Information, informing SME\n"));
+            pmmLog(pMac, LOGE, FL("HAL failed to get GTK Offload Information, informing SME"));
             smeRspCode = eSIR_SME_GTK_OFFLOAD_GETINFO_REQ_FAILED;
         }
     }
diff --git a/CORE/MAC/src/pe/rrm/rrmApi.c b/CORE/MAC/src/pe/rrm/rrmApi.c
index 6c8ac82..570cfaa 100644
--- a/CORE/MAC/src/pe/rrm/rrmApi.c
+++ b/CORE/MAC/src/pe/rrm/rrmApi.c
@@ -105,7 +105,7 @@
 rrmCacheMgmtTxPower ( tpAniSirGlobal pMac, tPowerdBm txPower, tpPESession pSessionEntry )
 {
 #if defined WLAN_VOWIFI_DEBUG
-   PELOGE(limLog( pMac, LOGE, "Cache Mgmt Tx Power = %d\n", txPower );) 
+   PELOGE(limLog( pMac, LOGE, "Cache Mgmt Tx Power = %d", txPower );)
 #endif
    if( pSessionEntry == NULL )
        pMac->rrm.rrmPEContext.txMgmtPower = txPower;
@@ -132,7 +132,7 @@
 rrmGetMgmtTxPower ( tpAniSirGlobal pMac, tpPESession pSessionEntry )
 {
 #if defined WLAN_VOWIFI_DEBUG
-   PELOGE(limLog( pMac, LOGE, "RrmGetMgmtTxPower called\n" );) 
+   PELOGE(limLog( pMac, LOGE, "RrmGetMgmtTxPower called" );)
 #endif
    if( pSessionEntry == NULL )
       return pMac->rrm.rrmPEContext.txMgmtPower;
@@ -165,18 +165,18 @@
 
    if( pSessionEntry == NULL )
    {
-      PELOGE(limLog(pMac, LOGE, FL(" Inavalid parameters\n"));)
+      PELOGE(limLog(pMac, LOGE, FL(" Inavalid parameters"));)
       return eSIR_FAILURE;
    }
    if( eHAL_STATUS_SUCCESS != palAllocateMemory( pMac->hHdd,
             (void **) &pMaxTxParams, sizeof(tMaxTxPowerParams) ) ) 
    {
-      limLog( pMac, LOGP, FL("Unable to allocate memory for pMaxTxParams \n") );
+      limLog( pMac, LOGP, FL("Unable to allocate memory for pMaxTxParams ") );
       return eSIR_MEM_ALLOC_FAILED;
 
    }
 #if defined WLAN_VOWIFI_DEBUG
-   PELOGE(limLog( pMac, LOGE, FL(" Allocated memory for pMaxTxParams...will be freed in other module\n") );)
+   PELOGE(limLog( pMac, LOGE, FL(" Allocated memory for pMaxTxParams...will be freed in other module") );)
 #endif
    pMaxTxParams->power = txPower;
    palCopyMemory( pMac->hHdd, pMaxTxParams->bssId, pSessionEntry->bssId, sizeof(tSirMacAddr) );
@@ -230,7 +230,7 @@
 
    if((pSessionEntry = peFindSessionByBssid(pMac, pMaxTxParams->bssId, &sessionId))==NULL)
    {
-      PELOGE(limLog(pMac, LOGE, FL("Unable to find session:\n") );)
+      PELOGE(limLog(pMac, LOGE, FL("Unable to find session:") );)
       retCode = eSIR_FAILURE;
    }
    else
@@ -270,18 +270,18 @@
    v_S7_t            currentRSSI = 0;
 
 #if defined WLAN_VOWIFI_DEBUG
-   PELOGE(limLog( pMac, LOGE, "Received Link measurement request\n");)
+   PELOGE(limLog( pMac, LOGE, "Received Link measurement request");)
 #endif
    if( pRxPacketInfo == NULL || pLinkReq == NULL || pSessionEntry == NULL )
    {
-      PELOGE(limLog( pMac, LOGE, "%s:%d: Invalid parameters - Ignoring the request\n");)
+      PELOGE(limLog( pMac, LOGE, "%s:%d: Invalid parameters - Ignoring the request");)
       return eSIR_FAILURE;
    }
    pHdr = WDA_GET_RX_MAC_HEADER( pRxPacketInfo );
 #if defined WLAN_VOWIFI_DEBUG
    if( pSessionEntry->maxTxPower != (tPowerdBm) pLinkReq->MaxTxPower.maxTxPower )
    {
-      PELOGE(limLog( pMac, LOGE, FL(" maxTx power in link request is not same as local...Local = %d LinkReq = %d\n"), 
+      PELOGE(limLog( pMac, LOGE, FL(" maxTx power in link request is not same as local...Local = %d LinkReq = %d"),
            pSessionEntry->maxTxPower, pLinkReq->MaxTxPower.maxTxPower );)
    }
 #endif
@@ -293,7 +293,7 @@
    currentRSSI = WDA_GET_RX_RSSI_DB(pRxPacketInfo);
 
 #if defined WLAN_VOWIFI_DEBUG
-   PELOGE(limLog( pMac, LOGE, "Received Link report frame with %d\n", currentRSSI);)
+   PELOGE(limLog( pMac, LOGE, "Received Link report frame with %d", currentRSSI);)
 #endif
 
    // 2008 11k spec reference: 18.4.8.5 RCPI Measurement
@@ -307,7 +307,7 @@
    LinkReport.rsni = WDA_GET_RX_SNR(pRxPacketInfo); 
    
 #if defined WLAN_VOWIFI_DEBUG
-   PELOGE(limLog( pMac, LOGE, "Sending Link report frame\n");)
+   PELOGE(limLog( pMac, LOGE, "Sending Link report frame");)
 #endif
    return limSendLinkReportActionFrame( pMac, &LinkReport, pHdr->sa, pSessionEntry ); 
 
@@ -343,23 +343,23 @@
 
    if( pNeighborRep == NULL || pSessionEntry == NULL )
    {
-      PELOGE(limLog( pMac, LOGE, FL(" Invalid parameters\n") );)
+      PELOGE(limLog( pMac, LOGE, FL(" Invalid parameters") );)
       return status;
    }
 
 #if defined WLAN_VOWIFI_DEBUG
-   PELOGE(limLog( pMac, LOGE, FL("Neighbor report response received \n") );)
+   PELOGE(limLog( pMac, LOGE, FL("Neighbor report response received ") );)
 #endif
 
    // Dialog token
    if( pMac->rrm.rrmPEContext.DialogToken != pNeighborRep->DialogToken.token )
    {
-      PELOGE(limLog( pMac, LOGE, "Dialog token mismatch in the received Neighbor report\n");)
+      PELOGE(limLog( pMac, LOGE, "Dialog token mismatch in the received Neighbor report");)
       return eSIR_FAILURE;
    }
    if( pNeighborRep->num_NeighborReport == 0 )
    {
-      PELOGE(limLog( pMac, LOGE, "No neighbor report in the frame...Dropping it\n");)
+      PELOGE(limLog( pMac, LOGE, "No neighbor report in the frame...Dropping it");)
       return eSIR_FAILURE;
    }
    length = (sizeof( tSirNeighborReportInd )) +
@@ -369,13 +369,13 @@
    if( eHAL_STATUS_SUCCESS != palAllocateMemory( pMac->hHdd,
             (void **) &pSmeNeighborRpt, length ) )
    {
-      PELOGE(limLog( pMac, LOGP, FL("Unable to allocate memory\n") );)
+      PELOGE(limLog( pMac, LOGP, FL("Unable to allocate memory") );)
       return eSIR_MEM_ALLOC_FAILED;
 
    }
    palZeroMemory( pMac->hHdd, pSmeNeighborRpt, length ); 
 #if defined WLAN_VOWIFI_DEBUG
-   PELOGE(limLog( pMac, LOGE, FL(" Allocated memory for pSmeNeighborRpt...will be freed by other module\n") );)
+   PELOGE(limLog( pMac, LOGE, FL(" Allocated memory for pSmeNeighborRpt...will be freed by other module") );)
 #endif
 
    for( i = 0 ; i < pNeighborRep->num_NeighborReport ; i++ )
@@ -440,23 +440,23 @@
 
    if( pNeighborReq == NULL )
    {
-      PELOGE(limLog( pMac, LOGE, "NeighborReq is NULL\n" );)
+      PELOGE(limLog( pMac, LOGE, "NeighborReq is NULL" );)
       return eSIR_FAILURE;
    }
    if ((pSessionEntry = peFindSessionByBssid(pMac,pNeighborReq->bssId,&sessionId))==NULL)
    {
-      PELOGE(limLog(pMac, LOGE,FL("session does not exist for given bssId\n"));)
+      PELOGE(limLog(pMac, LOGE,FL("session does not exist for given bssId"));)
       return eSIR_FAILURE;
    }
 
 #if defined WLAN_VOWIFI_DEBUG
-   PELOGE(limLog( pMac, LOGE, FL("Neighbor Request received \n") );)
-   PELOGE(limLog( pMac, LOGE, "SSID present = %d \n", pNeighborReq->noSSID );)
+   PELOGE(limLog( pMac, LOGE, FL("Neighbor Request received ") );)
+   PELOGE(limLog( pMac, LOGE, "SSID present = %d ", pNeighborReq->noSSID );)
 #endif
 
    palZeroMemory( pMac->hHdd, &NeighborReportReq, sizeof( tSirMacNeighborReportReq ) );
 
-   NeighborReportReq.dialogToken = ++pMac->rrm.rrmPEContext.DialogToken; 
+   NeighborReportReq.dialogToken = ++pMac->rrm.rrmPEContext.DialogToken;
    NeighborReportReq.ssid_present = !pNeighborReq->noSSID; 
    if( NeighborReportReq.ssid_present )
    {
@@ -510,7 +510,7 @@
       //Beacon reporting should not be included in request if number of repetitons is zero.
       // IEEE Std 802.11k-2008 Table 7-29g and section 11.10.8.1
 
-      PELOGE(limLog( pMac, LOGE, "Dropping the request: Reporting condition included in beacon report request and it is not zero\n");)
+      PELOGE(limLog( pMac, LOGE, "Dropping the request: Reporting condition included in beacon report request and it is not zero");)
       return eRRM_INCAPABLE;
    }
 
@@ -534,7 +534,7 @@
    measDuration = pBeaconReq->measurement_request.Beacon.meas_duration; 
 
 #if defined WLAN_VOWIFI_DEBUG
-   limLog( pMac, LOGE, "maxDuration = %d sign = %d maxMeasduration = %d measDuration = %d\n",
+   limLog( pMac, LOGE, "maxDuration = %d sign = %d maxMeasduration = %d measDuration = %d",
         maxDuration, sign, maxMeasduration, measDuration ); 
 #endif
 
@@ -542,7 +542,7 @@
    {
       if( pBeaconReq->durationMandatory )
       {
-         limLog( pMac, LOGE, "Dropping the request: duration mandatory and maxduration > measduration\n");
+         limLog( pMac, LOGE, "Dropping the request: duration mandatory and maxduration > measduration");
          return eRRM_REFUSED;
       }
       else
@@ -561,11 +561,11 @@
                                                     pBeaconReq->measurement_request.Beacon.RequestedInfo.num_requested_eids ) ) )
       {
             limLog( pMac, LOGP,
-               FL( "Unable to PAL allocate memory for request IEs buffer\n" ));
+               FL( "Unable to PAL allocate memory for request IEs buffer" ));
             return eRRM_FAILURE;
       }
 #if defined WLAN_VOWIFI_DEBUG
-      PELOGE(limLog( pMac, LOGE, FL(" Allocated memory for pElementIds\n") );)
+      PELOGE(limLog( pMac, LOGE, FL(" Allocated memory for pElementIds") );)
 #endif
       pCurrentReq->request.Beacon.reqIes.num = pBeaconReq->measurement_request.Beacon.RequestedInfo.num_requested_eids;
       palCopyMemory ( pMac->hHdd, pCurrentReq->request.Beacon.reqIes.pElementIds, 
@@ -585,7 +585,7 @@
             (sizeof( tSirBeaconReportReqInd ) + num_channels) ) )
    {
       limLog( pMac, LOGP,
-            FL( "Unable to PAL allocate memory during Beacon Report Req Ind to SME\n" ));
+            FL( "Unable to PAL allocate memory during Beacon Report Req Ind to SME" ));
 
       return eRRM_FAILURE;
 
@@ -594,7 +594,7 @@
    palZeroMemory( pMac->hHdd, pSmeBcnReportReq, sizeof( tSirBeaconReportReqInd ) + num_channels );
 
 #if defined WLAN_VOWIFI_DEBUG
-   PELOGE(limLog( pMac, LOGE, FL(" Allocated memory for pSmeBcnReportReq....will be freed by other module\n") );)
+   PELOGE(limLog( pMac, LOGE, FL(" Allocated memory for pSmeBcnReportReq....will be freed by other module") );)
 #endif
    palCopyMemory( pMac->hHdd, pSmeBcnReportReq->bssId, pSessionEntry->bssId, sizeof(tSirMacAddr) );
    pSmeBcnReportReq->messageType = eWNI_SME_BEACON_REPORT_REQ_IND;
@@ -668,7 +668,7 @@
 
    if( (pIes == NULL) || (pNumIes == NULL) || (pBssDesc == NULL) )
    {
-      PELOGE(limLog( pMac, LOGE, FL(" Invalid parameters\n") );)
+      PELOGE(limLog( pMac, LOGE, FL(" Invalid parameters") );)
       return;
    }
 
@@ -693,7 +693,7 @@
    {
       len = *(pBcnIes + 1) + 2; //element id + length.
 #if defined WLAN_VOWIFI_DEBUG
-      PELOGE(limLog( pMac, LOGE, "EID = %d, len = %d total = %d\n", *pBcnIes, *(pBcnIes+1), len );)
+      PELOGE(limLog( pMac, LOGE, "EID = %d, len = %d total = %d", *pBcnIes, *(pBcnIes+1), len );)
 #endif
 
       i = 0;
@@ -703,7 +703,7 @@
              ( (*pNumIes) + len) < pIesMaxSize )
          {
 #if defined WLAN_VOWIFI_DEBUG
-            PELOGE(limLog( pMac, LOGE, "Adding Eid %d, len=%d\n", *pBcnIes, len );)
+            PELOGE(limLog( pMac, LOGE, "Adding Eid %d, len=%d", *pBcnIes, len );)
 #endif
             palCopyMemory( pMac->hHdd, pIes, pBcnIes, len ); 
             pIes += len;
@@ -718,7 +718,7 @@
       BcnNumIes -= len;
    }
 #if defined WLAN_VOWIFI_DEBUG
-   PELOGE(limLog( pMac, LOGE, "Total length of Ies added = %d\n", *pNumIes );)
+   PELOGE(limLog( pMac, LOGE, "Total length of Ies added = %d", *pNumIes );)
 #endif
 }
       
@@ -749,19 +749,19 @@
    v_U8_t flagBSSPresent = FALSE;
 
 #if defined WLAN_VOWIFI_DEBUG
-   PELOGE(limLog( pMac, LOGE, "Received beacon report xmit indication\n");)  
+   PELOGE(limLog( pMac, LOGE, "Received beacon report xmit indication");)
 #endif
    if(NULL == pBcnReport)
       return eSIR_FAILURE;
 
    if ( pCurrentReq == NULL )
    {
-      PELOGE(limLog( pMac, LOGE, "Received report xmit while there is no request pending in PE\n");)
+      PELOGE(limLog( pMac, LOGE, "Received report xmit while there is no request pending in PE");)
       return eSIR_FAILURE;
    }
    if ((pSessionEntry = peFindSessionByBssid(pMac,pBcnReport->bssId,&sessionId))==NULL)
    {
-      PELOGE(limLog(pMac, LOGE,FL("session does not exist for given bssId\n"));)
+      PELOGE(limLog(pMac, LOGE,FL("session does not exist for given bssId"));)
       return eSIR_FAILURE;
    }
 
@@ -805,12 +805,12 @@
       {
          case BEACON_REPORTING_DETAIL_NO_FF_IE: //0 No need to include any elements.
 #if defined WLAN_VOWIFI_DEBUG
-            PELOGE(limLog(pMac, LOGE, "No reporting detail requested\n");)
+            PELOGE(limLog(pMac, LOGE, "No reporting detail requested");)
 #endif
             break;
          case BEACON_REPORTING_DETAIL_ALL_FF_REQ_IE: //1: Include all FFs and Requested Ies.
 #if defined WLAN_VOWIFI_DEBUG
-            PELOGE(limLog(pMac, LOGE, "Only requested IEs in reporting detail requested\n");)
+            PELOGE(limLog(pMac, LOGE, "Only requested IEs in reporting detail requested");)
 #endif
 
             if ( flagBSSPresent )
@@ -825,7 +825,7 @@
          case BEACON_REPORTING_DETAIL_ALL_FF_IE: //2 / default - Include all FFs and all Ies.
          default:
 #if defined WLAN_VOWIFI_DEBUG
-            PELOGE(limLog(pMac, LOGE, "Default all IEs and FFs\n");)
+            PELOGE(limLog(pMac, LOGE, "Default all IEs and FFs");)
 #endif
             if ( flagBSSPresent )
             {
@@ -838,15 +838,15 @@
       }
 
 #if defined WLAN_VOWIFI_DEBUG
-      PELOGE(limLog( pMac, LOGE, "Sending Action frame \n");)
+      PELOGE(limLog( pMac, LOGE, "Sending Action frame ");)
 #endif
-      limSendRadioMeasureReportActionFrame( pMac, pCurrentReq->dialog_token, 1, 
+      limSendRadioMeasureReportActionFrame( pMac, pCurrentReq->dialog_token, 1,
             pReport, pBcnReport->bssId, pSessionEntry );
    }
 
    if( pBcnReport->fMeasureDone )
    {
-      PELOGE(limLog( pMac, LOGE, "Measurement done....cleanup the context\n");)
+      PELOGE(limLog( pMac, LOGE, "Measurement done....cleanup the context");)
 
       rrmCleanup(pMac);
    }
@@ -864,7 +864,7 @@
                sizeof( tSirMacRadioMeasureReport ) ) )
     {
          limLog( pMac, LOGP,
-               FL( "Unable to PAL allocate memory during RRM Req processing\n" ));
+               FL( "Unable to PAL allocate memory during RRM Req processing" ));
          return;
     }
     palZeroMemory( pMac->hHdd, pReport, sizeof(tSirMacRadioMeasureReport) );
@@ -880,7 +880,7 @@
             pReport->incapable = 1;
             break;
         default:
-            PELOGE(limLog( pMac, LOGE, FL(" Beacon request processing failed no report sent with status %d \n"), status););
+            PELOGE(limLog( pMac, LOGE, FL(" Beacon request processing failed no report sent with status %d "), status););
             palFreeMemory( pMac->hHdd, pReport );
             return;
     }
@@ -890,7 +890,7 @@
 
     palFreeMemory( pMac->hHdd, pReport );
 #if defined WLAN_VOWIFI_DEBUG
-    PELOGE(limLog( pMac, LOGE, FL(" Free memory for pReport\n") );)
+    PELOGE(limLog( pMac, LOGE, FL(" Free memory for pReport") );)
 #endif
     return;
 }
@@ -936,19 +936,19 @@
                sizeof( tSirMacRadioMeasureReport ) ) )
       {
          limLog( pMac, LOGP,
-               FL( "Unable to PAL allocate memory during RRM Req processing\n" ));
+               FL( "Unable to PAL allocate memory during RRM Req processing" ));
          return eSIR_MEM_ALLOC_FAILED;
       }
       palZeroMemory( pMac->hHdd, pReport, sizeof(tSirMacRadioMeasureReport) );
 #if defined WLAN_VOWIFI_DEBUG
-      PELOGE(limLog( pMac, LOGE, FL(" Allocated memory for pReport\n") );)
+      PELOGE(limLog( pMac, LOGE, FL(" Allocated memory for pReport") );)
 #endif
       pReport->incapable = 1;
       num_report = 1;
       limSendRadioMeasureReportActionFrame( pMac, pRRMReq->DialogToken.token, num_report,
                   pReport, peer, pSessionEntry );
       palFreeMemory( pMac->hHdd, pReport );
-      PELOGE(limLog( pMac, LOGE, "No requestIes in the measurement request\n" );)
+      PELOGE(limLog( pMac, LOGE, "No requestIes in the measurement request" );)
       return eSIR_FAILURE;
    }
 
@@ -961,12 +961,12 @@
                sizeof( tSirMacRadioMeasureReport ) ) )
       {
          limLog( pMac, LOGP,
-               FL( "Unable to PAL allocate memory during RRM Req processing\n" ));
+               FL( "Unable to PAL allocate memory during RRM Req processing" ));
          return eSIR_MEM_ALLOC_FAILED;
       }
       palZeroMemory( pMac->hHdd, pReport, sizeof(tSirMacRadioMeasureReport) );
 #if defined WLAN_VOWIFI_DEBUG
-      PELOGE(limLog( pMac, LOGE, FL(" Allocated memory for pReport\n") );)
+      PELOGE(limLog( pMac, LOGE, FL(" Allocated memory for pReport") );)
 #endif
       pReport->incapable = 1;
       pReport->type = pRRMReq->MeasurementRequest[0].measurement_type;
@@ -990,12 +990,12 @@
                            sizeof( tSirMacRadioMeasureReport ) * (pRRMReq->num_MeasurementRequest - i) ) )
                   {
                      limLog( pMac, LOGP,
-                           FL( "Unable to PAL allocate memory during RRM Req processing\n" ));
+                           FL( "Unable to PAL allocate memory during RRM Req processing" ));
                      return eSIR_MEM_ALLOC_FAILED;
                   }
                   palZeroMemory( pMac->hHdd, pReport, sizeof( tSirMacRadioMeasureReport ) * (pRRMReq->num_MeasurementRequest - i) ); 
 #if defined WLAN_VOWIFI_DEBUG
-                  limLog( pMac, LOGE, FL(" Allocated memory for pReport\n") );
+                  limLog( pMac, LOGE, FL(" Allocated memory for pReport") );
 #endif
 
                }
@@ -1012,11 +1012,11 @@
                         sizeof( *pCurrentReq ) ) )
                {
                   limLog( pMac, LOGP,
-                        FL( "Unable to PAL allocate memory during RRM Req processing\n" ));
+                        FL( "Unable to PAL allocate memory during RRM Req processing" ));
                   return eSIR_MEM_ALLOC_FAILED;
                }
 #if defined WLAN_VOWIFI_DEBUG
-               PELOGE(limLog( pMac, LOGE, FL(" Allocated memory for pCurrentReq\n") );)
+               PELOGE(limLog( pMac, LOGE, FL(" Allocated memory for pCurrentReq") );)
 #endif
                palZeroMemory( pMac->hHdd, pCurrentReq, sizeof( *pCurrentReq ) );
                pCurrentReq->dialog_token = pRRMReq->DialogToken.token;
@@ -1039,12 +1039,12 @@
                         sizeof( tSirMacRadioMeasureReport ) * (pRRMReq->num_MeasurementRequest - i) ) )
                {
                   limLog( pMac, LOGP,
-                        FL( "Unable to PAL allocate memory during RRM Req processing\n" ));
+                        FL( "Unable to PAL allocate memory during RRM Req processing" ));
                   return eSIR_MEM_ALLOC_FAILED;
                }
                palZeroMemory( pMac->hHdd, pReport, sizeof( tSirMacRadioMeasureReport ) * (pRRMReq->num_MeasurementRequest - i) ); 
 #if defined WLAN_VOWIFI_DEBUG
-               PELOGE(limLog( pMac, LOGE, FL(" Allocated memory for pReport\n") );)
+               PELOGE(limLog( pMac, LOGE, FL(" Allocated memory for pReport") );)
 #endif
 
             }
@@ -1064,7 +1064,7 @@
 
       palFreeMemory( pMac->hHdd, pReport );
 #if defined WLAN_VOWIFI_DEBUG
-      PELOGE(limLog( pMac, LOGE, FL(" Free memory for pReport\n") );)
+      PELOGE(limLog( pMac, LOGE, FL(" Free memory for pReport") );)
 #endif
    }
    return status;
@@ -1090,7 +1090,7 @@
 rrmUpdateStartTSF ( tpAniSirGlobal pMac, tANI_U32 startTSF[2] )
 {
 #if 0 //defined WLAN_VOWIFI_DEBUG
-   limLog( pMac, LOGE, "Update Start TSF = %d %d\n", startTSF[0], startTSF[1] ); 
+   limLog( pMac, LOGE, "Update Start TSF = %d %d", startTSF[0], startTSF[1] );
 #endif
    pMac->rrm.rrmPEContext.startTSF[0] = startTSF[0];
    pMac->rrm.rrmPEContext.startTSF[1] = startTSF[1];
@@ -1115,7 +1115,7 @@
 rrmGetStartTSF ( tpAniSirGlobal pMac, tANI_U32 *pStartTSF )
 {
 #if 0 //defined WLAN_VOWIFI_DEBUG
-   limLog( pMac, LOGE, "Get the start TSF, TSF = %d %d \n", pMac->rrm.rrmPEContext.startTSF[0], pMac->rrm.rrmPEContext.startTSF[1] ); 
+   limLog( pMac, LOGE, "Get the start TSF, TSF = %d %d ", pMac->rrm.rrmPEContext.startTSF[0], pMac->rrm.rrmPEContext.startTSF[1] );
 #endif
    pStartTSF[0] = pMac->rrm.rrmPEContext.startTSF[0];
    pStartTSF[1] = pMac->rrm.rrmPEContext.startTSF[1];
@@ -1167,27 +1167,27 @@
 
    if (wlan_cfgGetInt(pMac, WNI_CFG_RRM_ENABLED, &val) != eSIR_SUCCESS)
    {
-       limLog(pMac, LOGP, FL("cfg get rrm enabled failed\n"));
+       limLog(pMac, LOGP, FL("cfg get rrm enabled failed"));
        return;
    }
    pMac->rrm.rrmPEContext.rrmEnable = (val) ? 1 : 0;    
 
    if (wlan_cfgGetInt(pMac, WNI_CFG_RRM_OPERATING_CHAN_MAX, &val) != eSIR_SUCCESS)
    {
-       limLog(pMac, LOGP, FL("cfg get rrm operating channel max measurement duration failed\n"));
+       limLog(pMac, LOGP, FL("cfg get rrm operating channel max measurement duration failed"));
        return;
    }
    pRRMCaps->operatingChanMax = (tANI_U8)val;
 
    if (wlan_cfgGetInt(pMac, WNI_CFG_RRM_NON_OPERATING_CHAN_MAX, &val) != eSIR_SUCCESS)
    {
-       limLog(pMac, LOGP, FL("cfg get rrm non-operating channel max measurement duration failed\n"));
+       limLog(pMac, LOGP, FL("cfg get rrm non-operating channel max measurement duration failed"));
        return;
    }
    pRRMCaps->nonOperatingChanMax =(tANI_U8) val;
 
 #if defined WLAN_VOWIFI_DEBUG
-   PELOGE(limLog( pMac, LOGE, "RRM enabled = %d  OperatingChanMax = %d  NonOperatingMax = %d\n", pMac->rrm.rrmPEContext.rrmEnable,
+   PELOGE(limLog( pMac, LOGE, "RRM enabled = %d  OperatingChanMax = %d  NonOperatingMax = %d", pMac->rrm.rrmPEContext.rrmEnable,
                      pRRMCaps->operatingChanMax, pRRMCaps->nonOperatingChanMax );)
 #endif
 }
@@ -1261,13 +1261,13 @@
       {
          palFreeMemory( pMac->hHdd, pMac->rrm.rrmPEContext.pCurrentReq->request.Beacon.reqIes.pElementIds );
 #if defined WLAN_VOWIFI_DEBUG
-         PELOGE(limLog( pMac, LOGE, FL(" Free memory for pElementIds\n") );)
+         PELOGE(limLog( pMac, LOGE, FL(" Free memory for pElementIds") );)
 #endif
       }
 
       palFreeMemory( pMac->hHdd, pMac->rrm.rrmPEContext.pCurrentReq ); 
 #if defined WLAN_VOWIFI_DEBUG
-      PELOGE(limLog( pMac, LOGE, FL(" Free memory for pCurrentReq\n") );)
+      PELOGE(limLog( pMac, LOGE, FL(" Free memory for pCurrentReq") );)
 #endif
    }
 
diff --git a/CORE/MAC/src/pe/sch/schApi.c b/CORE/MAC/src/pe/sch/schApi.c
index 94b8a71..59bf360 100644
--- a/CORE/MAC/src/pe/sch/schApi.c
+++ b/CORE/MAC/src/pe/sch/schApi.c
@@ -258,11 +258,11 @@
     tSirMsgQ        msgQ;
     tANI_U32        retCode;
 
-    PELOG1(schLog(pMac, LOG1, FL("Sending LIM message to go into scan\n"));)
+    PELOG1(schLog(pMac, LOG1, FL("Sending LIM message to go into scan"));)
     msgQ.type = SIR_SCH_START_SCAN_RSP;
     if ((retCode = limPostMsgApi(pMac, &msgQ)) != eSIR_SUCCESS)
         schLog(pMac, LOGE,
-               FL("Posting START_SCAN_RSP to LIM failed, reason=%X\n"), retCode);
+               FL("Posting START_SCAN_RSP to LIM failed, reason=%X"), retCode);
 }
 
 /**
@@ -297,7 +297,7 @@
     tSirRetStatus retCode;
 
   schLog( pMac, LOG2,
-      FL( "Indicating HAL to copy the beacon template [%d bytes] to memory\n" ),
+      FL( "Indicating HAL to copy the beacon template [%d bytes] to memory" ),
       size );
 
   if( eHAL_STATUS_SUCCESS != palAllocateMemory( pMac->hHdd,
@@ -318,7 +318,7 @@
   beaconParams->timIeOffset = pMac->sch.schObject.gSchBeaconOffsetBegin;
   beaconParams->p2pIeOffset = pMac->sch.schObject.p2pIeOffset;
 #ifdef WLAN_SOFTAP_FW_BEACON_TX_PRNT_LOG
-  schLog(pMac, LOGE,FL("TimIeOffset:[%d]\n"),beaconParams->TimIeOffset );
+  schLog(pMac, LOGE,FL("TimIeOffset:[%d]"),beaconParams->TimIeOffset );
 #endif
 
   beaconParams->beacon = beaconPayload;
@@ -347,12 +347,12 @@
   if( eSIR_SUCCESS != (retCode = wdaPostCtrlMsg( pMac, &msgQ )))
   {
     schLog( pMac, LOGE,
-        FL("Posting SEND_BEACON_REQ to HAL failed, reason=%X\n"),
+        FL("Posting SEND_BEACON_REQ to HAL failed, reason=%X"),
         retCode );
   } else
   {
     schLog( pMac, LOG2,
-        FL("Successfully posted WDA_SEND_BEACON_REQ to HAL\n"));
+        FL("Successfully posted WDA_SEND_BEACON_REQ to HAL"));
 
     if( (psessionEntry->limSystemRole == eLIM_AP_ROLE ) 
         && (psessionEntry->proxyProbeRspEn)
@@ -362,7 +362,7 @@
                                     &psessionEntry->DefProbeRspIeBitmap[0])))
         {
             /* check whether we have to free any memory */
-            schLog(pMac, LOGE, FL("FAILED to send probe response template with retCode %d\n"), retCode);
+            schLog(pMac, LOGE, FL("FAILED to send probe response template with retCode %d"), retCode);
         }
     }
   }
@@ -387,7 +387,7 @@
     if ( DOT11F_FAILED( nStatus ) )
     {
         schLog( pMac, LOGE, FL("Failed to calculate the packed size f"
-                               "or a Probe Response (0x%08x).\n"),
+                               "or a Probe Response (0x%08x)."),
                 nStatus );
         // We'll fall back on the worst case scenario:
         nPayload = sizeof( tDot11fProbeResponse );
@@ -396,7 +396,7 @@
     {
         schLog( pMac, LOGE, FL("There were warnings while calculating"
                                "the packed size for a Probe Response "
-                               "(0x%08x).\n"), nStatus );
+                               "(0x%08x)."), nStatus );
     }
 
     nBytes = nPayload + sizeof( tSirMacMgmtHdr );
@@ -404,7 +404,7 @@
     //Check if probe response IE is set first before checking beacon/probe rsp IE
     if(wlan_cfgGetInt(pMac, WNI_CFG_PROBE_RSP_ADDNIE_FLAG, &addnIEPresent) != eSIR_SUCCESS)
     {
-        schLog(pMac, LOGE, FL("Unable to get WNI_CFG_PROBE_RSP_BCN_ADDNIE_FLAG\n"));
+        schLog(pMac, LOGE, FL("Unable to get WNI_CFG_PROBE_RSP_BCN_ADDNIE_FLAG"));
         return retCode;
     }
 
@@ -413,7 +413,7 @@
         //TODO: If additional IE needs to be added. Add then alloc required buffer.
         if(wlan_cfgGetInt(pMac, WNI_CFG_PROBE_RSP_BCN_ADDNIE_FLAG, &addnIEPresent) != eSIR_SUCCESS)
         {
-            schLog(pMac, LOGE, FL("Unable to get WNI_CFG_PROBE_RSP_BCN_ADDNIE_FLAG\n"));
+            schLog(pMac, LOGE, FL("Unable to get WNI_CFG_PROBE_RSP_BCN_ADDNIE_FLAG"));
             return retCode;
         }
     
@@ -454,7 +454,7 @@
     if ( eSIR_SUCCESS != nSirStatus )
     {
         schLog( pMac, LOGE, FL("Failed to populate the buffer descrip"
-                               "tor for a Probe Response (%d).\n"),
+                               "tor for a Probe Response (%d)."),
                 nSirStatus );
         return retCode;
     }
@@ -469,21 +469,21 @@
 
     if ( DOT11F_FAILED( nStatus ) )
     {
-        schLog( pMac, LOGE, FL("Failed to pack a Probe Response (0x%08x).\n"),
+        schLog( pMac, LOGE, FL("Failed to pack a Probe Response (0x%08x)."),
                 nStatus );
         return retCode;                 // allocated!
     }
     else if ( DOT11F_WARNED( nStatus ) )
     {
         schLog( pMac, LOGE, FL("There were warnings while packing a P"
-                               "robe Response (0x%08x).\n") );
+                               "robe Response (0x%08x).") );
     }
 
     if( eHAL_STATUS_SUCCESS != palAllocateMemory( pMac->hHdd,
                                                 (void **) &pprobeRespParams,
                                                 sizeof( tSendProbeRespParams )))
     {
-        schLog( pMac, LOGE, FL("limSendProbeRspTemplateToHal: HAL probe response params malloc failed for bytes %d\n"), nBytes );
+        schLog( pMac, LOGE, FL("limSendProbeRspTemplateToHal: HAL probe response params malloc failed for bytes %d"), nBytes );
     }
     else
     {
@@ -506,7 +506,7 @@
         if( eSIR_SUCCESS != (retCode = wdaPostCtrlMsg( pMac, &msgQ )))
         {
             /* free the allocated Memory */
-            schLog( pMac,LOGE, FL("limSendProbeRspTemplateToHal: FAIL bytes %d retcode[%X]\n"), nBytes , retCode );
+            schLog( pMac,LOGE, FL("limSendProbeRspTemplateToHal: FAIL bytes %d retcode[%X]"), nBytes , retCode );
             palFreeMemory(pMac->hHdd,pprobeRespParams);
         }
         else
diff --git a/CORE/MAC/src/pe/sch/schBeaconGen.c b/CORE/MAC/src/pe/sch/schBeaconGen.c
index 4b0e5d0..a846bc0 100644
--- a/CORE/MAC/src/pe/sch/schBeaconGen.c
+++ b/CORE/MAC/src/pe/sch/schBeaconGen.c
@@ -208,14 +208,14 @@
     status = palAllocateMemory(pMac->hHdd, (void **)&pBcn1, sizeof(tDot11fBeacon1));
     if(status != eSIR_SUCCESS)
     {
-        schLog(pMac, LOGE, FL("Failed to allocate memory\n") );
+        schLog(pMac, LOGE, FL("Failed to allocate memory") );
         return eSIR_FAILURE;
     }
 
     status = palAllocateMemory(pMac->hHdd, (void **)&pBcn2, sizeof(tDot11fBeacon2));
     if(status != eSIR_SUCCESS)
     {
-        schLog(pMac, LOGE, FL("Failed to allocate memory\n") );
+        schLog(pMac, LOGE, FL("Failed to allocate memory") );
         palFreeMemory(pMac->hHdd, pBcn1);
         return eSIR_FAILURE;
     }
@@ -223,13 +223,13 @@
     status = palAllocateMemory(pMac->hHdd, (void **)&pWscProbeRes, sizeof(tDot11fIEWscProbeRes));
     if(status != eSIR_SUCCESS)
     {
-        schLog(pMac, LOGE, FL("Failed to allocate memory\n") );
+        schLog(pMac, LOGE, FL("Failed to allocate memory") );
         palFreeMemory(pMac->hHdd, pBcn1);
         palFreeMemory(pMac->hHdd, pBcn2);
         return eSIR_FAILURE;
     }
 
-    PELOG1(schLog(pMac, LOG1, FL("Setting fixed beacon fields\n"));)
+    PELOG1(schLog(pMac, LOG1, FL("Setting fixed beacon fields"));)
 
     /*
      * First set the fixed fields
@@ -303,7 +303,7 @@
     if ( DOT11F_FAILED( nStatus ) )
     {
       schLog( pMac, LOGE, FL("Failed to packed a tDot11fBeacon1 (0x%0"
-                             "8x.).\n"), nStatus );
+                             "8x.)."), nStatus );
       palFreeMemory(pMac->hHdd, pBcn1);
       palFreeMemory(pMac->hHdd, pBcn2);
       palFreeMemory(pMac->hHdd, pWscProbeRes);
@@ -312,12 +312,12 @@
     else if ( DOT11F_WARNED( nStatus ) )
     {
       schLog( pMac, LOGE, FL("There were warnings while packing a tDo"
-                             "t11fBeacon1 (0x%08x.).\n"), nStatus );
+                             "t11fBeacon1 (0x%08x.)."), nStatus );
     }
     /*changed  to correct beacon corruption */
     palZeroMemory( pMac->hHdd, ( tANI_U8*) pBcn2, sizeof( tDot11fBeacon2 ) );
     pMac->sch.schObject.gSchBeaconOffsetBegin = offset + ( tANI_U16 )nBytes;
-    schLog( pMac, LOG1, FL("Initialized beacon begin, offset %d\n"), offset );
+    schLog( pMac, LOG1, FL("Initialized beacon begin, offset %d"), offset );
 
     /*
      * Initialize the 'new' fields at the end of the beacon
@@ -348,7 +348,7 @@
 #ifdef WLAN_FEATURE_11AC
     if(psessionEntry->vhtCapability)
     {        
-        limLog( pMac, LOGW, FL("Populate VHT IEs in Beacon\n"));
+        limLog( pMac, LOGW, FL("Populate VHT IEs in Beacon"));
         PopulateDot11fVHTCaps( pMac, &pBcn2->VHTCaps );
         PopulateDot11fVHTOperation( pMac, &pBcn2->VHTOperation);
         // we do not support multi users yet
@@ -384,7 +384,7 @@
     else
     {
         if (wlan_cfgGetInt(pMac, (tANI_U16) WNI_CFG_WPS_ENABLE, &tmp) != eSIR_SUCCESS)
-            limLog(pMac, LOGP,"Failed to cfg get id %d\n", WNI_CFG_WPS_ENABLE );
+            limLog(pMac, LOGP,"Failed to cfg get id %d", WNI_CFG_WPS_ENABLE );
 
         wpsApEnable = tmp & WNI_CFG_WPS_ENABLE_AP;
 
@@ -443,7 +443,7 @@
     if ( DOT11F_FAILED( nStatus ) )
     {
       schLog( pMac, LOGE, FL("Failed to packed a tDot11fBeacon2 (0x%0"
-                             "8x.).\n"), nStatus );
+                             "8x.)."), nStatus );
       palFreeMemory(pMac->hHdd, pBcn1);
       palFreeMemory(pMac->hHdd, pBcn2);
       palFreeMemory(pMac->hHdd, pWscProbeRes);
@@ -452,7 +452,7 @@
     else if ( DOT11F_WARNED( nStatus ) )
     {
       schLog( pMac, LOGE, FL("There were warnings while packing a tDo"
-                             "t11fBeacon2 (0x%08x.).\n"), nStatus );
+                             "t11fBeacon2 (0x%08x.)."), nStatus );
     }
 
     pExtraIe = pMac->sch.schObject.gSchBeaconFrameEnd + nBytes;
@@ -482,7 +482,7 @@
        pMac->sch.schObject.p2pIeOffset = 0;
     }
 
-    schLog( pMac, LOG1, FL("Initialized beacon end, offset %d\n"),
+    schLog( pMac, LOG1, FL("Initialized beacon end, offset %d"),
             pMac->sch.schObject.gSchBeaconOffsetEnd );
 
     pMac->sch.schObject.fBeaconChanged = 1;
@@ -741,7 +741,7 @@
         pBeacon->beaconLength = (tANI_U32) size - sizeof( tANI_U32 );
 
     // write size bytes from gSchBeaconFrameBegin
-    PELOG2(schLog(pMac, LOG2, FL("Beacon size - %d bytes\n"), size);)
+    PELOG2(schLog(pMac, LOG2, FL("Beacon size - %d bytes"), size);)
     PELOG2(sirDumpBuf(pMac, SIR_SCH_MODULE_ID, LOG2, pMac->sch.schObject.gSchBeaconFrameBegin, size);)
 
     if (! pMac->sch.schObject.fBeaconChanged)
@@ -759,7 +759,7 @@
 
         size = (size + 3) & (~3);
         if( eSIR_SUCCESS != schSendBeaconReq( pMac, pMac->sch.schObject.gSchBeaconFrameBegin, size , psessionEntry))
-            PELOGE(schLog(pMac, LOGE, FL("schSendBeaconReq() returned an error (zsize %d)\n"), size);)
+            PELOGE(schLog(pMac, LOGE, FL("schSendBeaconReq() returned an error (zsize %d)"), size);)
         else
         {
             pMac->sch.gSchBeaconsWritten++;
@@ -793,7 +793,7 @@
 
     if((psessionEntry = peFindSessionByBssid(pMac,pMsg->bssId, &sessionId))== NULL)
     {
-        PELOGE(schLog(pMac, LOGE, FL("session lookup fails\n"));)
+        PELOGE(schLog(pMac, LOGE, FL("session lookup fails"));)
         goto end;
     } 
            
@@ -802,7 +802,7 @@
     // If SME is not in normal mode, no need to generate beacon
     if (psessionEntry->limSmeState  != eLIM_SME_NORMAL_STATE)
     {
-        PELOGE(schLog(pMac, LOG1, FL("PreBeaconInd received in invalid state: %d\n"), psessionEntry->limSmeState);)
+        PELOGE(schLog(pMac, LOG1, FL("PreBeaconInd received in invalid state: %d"), psessionEntry->limSmeState);)
         goto end;
     }
 
@@ -815,7 +815,7 @@
         if(psessionEntry->statypeForBss == STA_ENTRY_SELF)
             writeBeaconToMemory(pMac, (tANI_U16) beaconSize, (tANI_U16)beaconSize, psessionEntry);
     else
-        PELOGE(schLog(pMac, LOGE, FL("can not send beacon for PEER session entry\n"));)
+        PELOGE(schLog(pMac, LOGE, FL("can not send beacon for PEER session entry"));)
         break;
 
     case eLIM_AP_ROLE:{
@@ -827,7 +827,7 @@
          writeBeaconToMemory(pMac, (tANI_U16) beaconSize, (tANI_U16)beaconSize, psessionEntry);
      }
      else
-         PELOGE(schLog(pMac, LOGE, FL("can not send beacon for PEER session entry\n"));)
+         PELOGE(schLog(pMac, LOGE, FL("can not send beacon for PEER session entry"));)
          }
      break;
 
diff --git a/CORE/MAC/src/pe/sch/schBeaconProcess.c b/CORE/MAC/src/pe/sch/schBeaconProcess.c
index a34de28..ab66fa2 100644
--- a/CORE/MAC/src/pe/sch/schBeaconProcess.c
+++ b/CORE/MAC/src/pe/sch/schBeaconProcess.c
@@ -153,7 +153,7 @@
                     if( psessionEntry->isCCXconnection )
                     {
                         VOS_TRACE (VOS_MODULE_ID_PE, VOS_TRACE_LEVEL_INFO, 
-                            "%s: [INFOLOG]CCX 11g erpPresent=%d useProtection=%d nonErpPresent=%d\n", __func__,
+                            "%s: [INFOLOG]CCX 11g erpPresent=%d useProtection=%d nonErpPresent=%d", __func__,
                             pBcnStruct->erpPresent,
                             pBcnStruct->erpIEInfo.useProtection,
                             pBcnStruct->erpIEInfo.nonErpPresent);
@@ -180,7 +180,7 @@
                   if( psessionEntry->isCCXconnection )
                   {
                       VOS_TRACE (VOS_MODULE_ID_PE, VOS_TRACE_LEVEL_INFO, 
-                          "%s: [INFOLOG]CCX 11g erpPresent=%d useProtection=%d nonErpPresent=%d\n", __func__,
+                          "%s: [INFOLOG]CCX 11g erpPresent=%d useProtection=%d nonErpPresent=%d", __func__,
                           pBcnStruct->erpPresent,
                           pBcnStruct->erpIEInfo.useProtection,
                           pBcnStruct->erpIEInfo.nonErpPresent);
@@ -381,7 +381,7 @@
         if((tANI_U8) pBeacon->channelNumber != psessionEntry->currentOperChannel)
         {
             PELOGE(limLog(pMac, LOGE, FL("Channel Change from %d --> %d  - "
-                                         "Ignoring beacon!\n"), 
+                                         "Ignoring beacon!"),
                           psessionEntry->currentOperChannel, pBeacon->channelNumber);)
            goto fail;
         }
@@ -403,7 +403,7 @@
         bi = psessionEntry->beaconParams.beaconInterval;
         if (bi != pBeacon->beaconInterval)
         {
-           PELOG1(schLog(pMac, LOG1, FL("Beacon interval changed from %d to %d\n"),
+           PELOG1(schLog(pMac, LOG1, FL("Beacon interval changed from %d to %d"),
                    pBeacon->beaconInterval, bi);)
 
             bi = pBeacon->beaconInterval;
@@ -445,7 +445,7 @@
             if(pBeacon->edcaParams.qosInfo.count != psessionEntry->gLimEdcaParamSetCount)
             {
                 if (schBeaconEdcaProcess(pMac, &pBeacon->edcaParams, psessionEntry) != eSIR_SUCCESS)
-                    PELOGE(schLog(pMac, LOGE, FL("EDCA parameter processing error\n"));)
+                    PELOGE(schLog(pMac, LOGE, FL("EDCA parameter processing error"));)
                 else if(pStaDs != NULL)
                 {
                     // If needed, downgrade the EDCA parameters
@@ -457,7 +457,7 @@
                         limSendEdcaParams(pMac, psessionEntry->gLimEdcaParamsActive, pStaDs->bssId, eANI_BOOLEAN_FALSE);
                 }
                 else
-                    PELOGE(limLog(pMac, LOGE, FL("Self Entry missing in Hash Table\n"));)
+                    PELOGE(limLog(pMac, LOGE, FL("Self Entry missing in Hash Table"));)
             }
         }
         else if( (pBeacon->qosCapabilityPresent && psessionEntry->limQosEnabled) &&
@@ -495,10 +495,10 @@
             operMode = pStaDs->vhtSupportedChannelWidthSet ? eHT_CHANNEL_WIDTH_80MHZ : pStaDs->htSupportedChannelWidthSet ? eHT_CHANNEL_WIDTH_40MHZ: eHT_CHANNEL_WIDTH_20MHZ;
             if( operMode != pBeacon->OperatingMode.chanWidth)
             {
-                PELOG1(limLog(pMac, LOG1, FL(" received Chanwidth %d, staIdx = %d\n"),
+                PELOG1(limLog(pMac, LOG1, FL(" received Chanwidth %d, staIdx = %d"),
                                           pBeacon->OperatingMode.chanWidth, 
                                           pStaDs->staIndex);)
-                PELOG1(limLog(pMac, LOG1, FL(" MAC - %0x:%0x:%0x:%0x:%0x:%0x\n"),
+                PELOG1(limLog(pMac, LOG1, FL(" MAC - %0x:%0x:%0x:%0x:%0x:%0x"),
                                           pMh->sa[0],
                                           pMh->sa[1],
                                           pMh->sa[2],
@@ -594,8 +594,8 @@
 
     if(beaconParams.paramChangeBitmap)
     {
-        PELOGW(schLog(pMac, LOGW, FL("Beacon for session[%d] got changed. \n"), psessionEntry->peSessionId);)
-        PELOGW(schLog(pMac, LOGW, FL("sending beacon param change bitmap: 0x%x \n"), beaconParams.paramChangeBitmap);)
+        PELOGW(schLog(pMac, LOGW, FL("Beacon for session[%d] got changed. "), psessionEntry->peSessionId);)
+        PELOGW(schLog(pMac, LOGW, FL("sending beacon param change bitmap: 0x%x "), beaconParams.paramChangeBitmap);)
         limSendBeaconParams(pMac, &beaconParams, psessionEntry);
     }
 
@@ -634,7 +634,7 @@
     // Convert the beacon frame into a structure
     if (sirConvertBeaconFrame2Struct(pMac, (tANI_U8 *) pRxPacketInfo, &beaconStruct)!= eSIR_SUCCESS)
     {
-        PELOGE(schLog(pMac, LOGE, FL("beacon parsing failed\n"));)
+        PELOGE(schLog(pMac, LOGE, FL("beacon parsing failed"));)
         pMac->sch.gSchBcnParseErrorCnt++;
         return;
     }
@@ -666,8 +666,8 @@
         {
             //Update the beacons and apply the new settings to HAL
             schSetFixedBeaconFields(pMac, pAPSession);
-            PELOG1(schLog(pMac, LOG1, FL("Beacon for PE session[%d] got changed.  \n"), pAPSession->peSessionId);)
-            PELOG1(schLog(pMac, LOG1, FL("sending beacon param change bitmap: 0x%x \n"), beaconParams.paramChangeBitmap);)
+            PELOG1(schLog(pMac, LOG1, FL("Beacon for PE session[%d] got changed.  "), pAPSession->peSessionId);)
+            PELOG1(schLog(pMac, LOG1, FL("sending beacon param change bitmap: 0x%x "), beaconParams.paramChangeBitmap);)
             limSendBeaconParams(pMac, &beaconParams, pAPSession);
         }
     }
@@ -714,7 +714,7 @@
     vos_log_qos_edca_pkt_type *log_ptr = NULL;
 #endif //FEATURE_WLAN_DIAG_SUPPORT 
 
-    PELOG1(schLog(pMac, LOG1, FL("Updating parameter set count: Old %d ---> new %d\n"),
+    PELOG1(schLog(pMac, LOG1, FL("Updating parameter set count: Old %d ---> new %d"),
            psessionEntry->gLimEdcaParamSetCount, edca->qosInfo.count);)
 
     psessionEntry->gLimEdcaParamSetCount = edca->qosInfo.count;
@@ -749,7 +749,7 @@
     PELOG1(schLog(pMac, LOGE, FL("Updating Local EDCA Params(gLimEdcaParams) to: "));)
     for(i=0; i<MAX_NUM_AC; i++)
     {
-        PELOG1(schLog(pMac, LOG1, FL("AC[%d]:  AIFSN: %d, ACM %d, CWmin %d, CWmax %d, TxOp %d\n"),
+        PELOG1(schLog(pMac, LOG1, FL("AC[%d]:  AIFSN: %d, ACM %d, CWmin %d, CWmax %d, TxOp %d"),
             i,
             psessionEntry->gLimEdcaParams[i].aci.aifsn, 
             psessionEntry->gLimEdcaParams[i].aci.acm,
diff --git a/CORE/MAC/src/pe/sch/schMessage.c b/CORE/MAC/src/pe/sch/schMessage.c
index 7162768..749c0d2 100644
--- a/CORE/MAC/src/pe/sch/schMessage.c
+++ b/CORE/MAC/src/pe/sch/schMessage.c
@@ -100,7 +100,7 @@
 
     if (bi < SCH_BEACON_INTERVAL_MIN || bi > SCH_BEACON_INTERVAL_MAX)
     {
-        schLog(pMac, LOGE, FL("Invalid beacon interval %d (should be [%d,%d]\n"),
+        schLog(pMac, LOGE, FL("Invalid beacon interval %d (should be [%d,%d]"),
                bi, SCH_BEACON_INTERVAL_MIN, SCH_BEACON_INTERVAL_MAX);
         return;
     }
@@ -135,7 +135,7 @@
     tANI_U32            val;
 
     tpPESession psessionEntry = &pMac->lim.gpSession[0];  //TBD-RAJESH HOW TO GET sessionEntry?????
-    PELOG3(schLog(pMac, LOG3, FL("Received message (%x) \n"), pSchMsg->type);)
+    PELOG3(schLog(pMac, LOG3, FL("Received message (%x) "), pSchMsg->type);)
 
     switch (pSchMsg->type)
     {
@@ -154,7 +154,7 @@
                 schBeaconProcess(pMac, pBD);
             else
             {
-                schLog(pMac, LOGE, FL("Unexpected message (%d,%d) rcvd\n"),
+                schLog(pMac, LOGE, FL("Unexpected message (%d,%d) rcvd"),
                        mh->fc.type, mh->fc.subType);
                 pMac->sch.gSchUnknownRcvCnt++;
             }
@@ -163,7 +163,7 @@
 
         case SIR_SCH_CHANNEL_SWITCH_REQUEST:
             schLog(pMac, LOGE,
-                   FL("Channel switch request not handled\n"));
+                   FL("Channel switch request not handled"));
             break;
 
         case SIR_SCH_START_SCAN_REQ:
@@ -176,7 +176,7 @@
                 {
                    PELOG1(schLog(pMac, LOG1,
                            FL("Waiting for TFP to halt before sending "
-                              "start scan response\n"));)
+                              "start scan response"));)
                 }
                 else
                     schSendStartScanRsp(pMac);
@@ -190,14 +190,14 @@
 
         case SIR_SCH_END_SCAN_NTF:
            PELOG3(schLog(pMac, LOG3,
-                   FL("Received STOP_SCAN_NTF from LIM\n"));)
+                   FL("Received STOP_SCAN_NTF from LIM"));)
             pMac->sch.gSchScanReqRcvd = false;
             break;
 
         case SIR_CFG_PARAM_UPDATE_IND:
 
             if (wlan_cfgGetInt(pMac, (tANI_U16) pSchMsg->bodyval, &val) != eSIR_SUCCESS)
-                schLog(pMac, LOGP, FL("failed to cfg get id %d\n"), pSchMsg->bodyval);
+                schLog(pMac, LOGP, FL("failed to cfg get id %d"), pSchMsg->bodyval);
 
             switch (pSchMsg->bodyval)
             {
@@ -248,13 +248,13 @@
                     break;
 
                 default:
-                    schLog(pMac, LOGE, FL("Cfg param %d indication not handled\n"),
+                    schLog(pMac, LOGE, FL("Cfg param %d indication not handled"),
                            pSchMsg->bodyval);
             }
             break;
 
         default:
-            schLog(pMac, LOGE, FL("Unknown message in schMsgQ type %d\n"),
+            schLog(pMac, LOGE, FL("Unknown message in schMsgQ type %d"),
                    pSchMsg->type);
     }
 
@@ -288,19 +288,19 @@
 
     if (wlan_cfgGetInt(pMac, WNI_CFG_EDCA_PROFILE, &val) != eSIR_SUCCESS)
     {
-        schLog(pMac, LOGP, FL("failed to cfg get EDCA_PROFILE id %d\n"),
+        schLog(pMac, LOGP, FL("failed to cfg get EDCA_PROFILE id %d"),
                WNI_CFG_EDCA_PROFILE);
         return eSIR_FAILURE;
     }
 
     if (val >= WNI_CFG_EDCA_PROFILE_MAX)
     {
-        schLog(pMac, LOGE, FL("Invalid EDCA_PROFILE %d, using %d instead\n"),
+        schLog(pMac, LOGE, FL("Invalid EDCA_PROFILE %d, using %d instead"),
                val, WNI_CFG_EDCA_PROFILE_ANI);
         val = WNI_CFG_EDCA_PROFILE_ANI;
     }
 
-    schLog(pMac, LOGW, FL("EdcaProfile: Using %d (%s)\n"),  val,
+    schLog(pMac, LOGW, FL("EdcaProfile: Using %d (%s)"),  val,
            ((val == WNI_CFG_EDCA_PROFILE_WMM) ? "WMM"
            : ( (val == WNI_CFG_EDCA_PROFILE_TIT_DEMO) ? "Titan" : "HiPerf")));
 
@@ -343,19 +343,19 @@
         tANI_U32 len = WNI_CFG_EDCA_ANI_ACBK_LOCAL_LEN;
         if (wlan_cfgGetStr(pMac, (tANI_U16) prf[i], (tANI_U8 *) &data[0], &len) != eSIR_SUCCESS)
         {
-            schLog(pMac, LOGP, FL("cfgGet failed for %d\n"), prf[i]);
+            schLog(pMac, LOGP, FL("cfgGet failed for %d"), prf[i]);
             return eSIR_FAILURE;
         }
         if (len > WNI_CFG_EDCA_ANI_ACBK_LOCAL_LEN)
         {
-            schLog(pMac, LOGE, FL("cfgGet for %d: length is %d instead of %d\n"),
+            schLog(pMac, LOGE, FL("cfgGet for %d: length is %d instead of %d"),
                    prf[i], len, WNI_CFG_EDCA_ANI_ACBK_LOCAL_LEN);
             return eSIR_FAILURE;
         }
         for (idx=0; idx < len; idx++)
             params[i][idx] = (tANI_U32) data[idx];
     }
-    PELOG1(schLog(pMac, LOG1, FL("GetParams: local=%d, profile = %d Done\n"), local, val);)
+    PELOG1(schLog(pMac, LOG1, FL("GetParams: local=%d, profile = %d Done"), local, val);)
     return eSIR_SUCCESS;
 }
 
@@ -382,7 +382,7 @@
                 psessionEntry->gLimEdcaParamsBC[j].cw.max =  pConcurrentStaSessionEntry->gLimEdcaParams[j].cw.max;
                 psessionEntry->gLimEdcaParamsBC[j].txoplimit=  pConcurrentStaSessionEntry->gLimEdcaParams[j].txoplimit;
 
-               PELOG1(schLog(pMac, LOG1, "QoSUpdateBCast changed again due to concurrent INFRA STA session: AC :%d: AIFSN: %d, ACM %d, CWmin %d, CWmax %d, TxOp %d\n",
+               PELOG1(schLog(pMac, LOG1, "QoSUpdateBCast changed again due to concurrent INFRA STA session: AC :%d: AIFSN: %d, ACM %d, CWmin %d, CWmax %d, TxOp %d",
                         j,
                         psessionEntry->gLimEdcaParamsBC[j].aci.aifsn,
                         psessionEntry->gLimEdcaParamsBC[j].aci.acm,
@@ -407,12 +407,12 @@
 
     if (schGetParams(pMac, params, false) != eSIR_SUCCESS)
     {
-        PELOGE(schLog(pMac, LOGE, FL("QosUpdateBroadcast: failed\n"));)
+        PELOGE(schLog(pMac, LOGE, FL("QosUpdateBroadcast: failed"));)
         return;
     }
     limGetPhyMode(pMac, &phyMode, psessionEntry);
 
-    PELOG1(schLog(pMac, LOG1, "QosUpdBcast: mode %d\n", phyMode);)
+    PELOG1(schLog(pMac, LOG1, "QosUpdBcast: mode %d", phyMode);)
 
     if (phyMode == WNI_CFG_PHY_MODE_11G)
     {
@@ -442,7 +442,7 @@
         psessionEntry->gLimEdcaParamsBC[i].cw.max =  convertCW(GET_CW(&params[i][cwmaxidx]));
         psessionEntry->gLimEdcaParamsBC[i].txoplimit=  (tANI_U16) params[i][txopidx];
 
-       PELOG1(schLog(pMac, LOG1, "QoSUpdateBCast: AC :%d: AIFSN: %d, ACM %d, CWmin %d, CWmax %d, TxOp %d\n", i,
+       PELOG1(schLog(pMac, LOG1, "QoSUpdateBCast: AC :%d: AIFSN: %d, ACM %d, CWmin %d, CWmax %d, TxOp %d", i,
                 psessionEntry->gLimEdcaParamsBC[i].aci.aifsn,
                 psessionEntry->gLimEdcaParamsBC[i].aci.acm,
                 psessionEntry->gLimEdcaParamsBC[i].cw.min,
@@ -455,7 +455,7 @@
     broadcastWMMOfConcurrentSTASession(pMac, psessionEntry);
 
     if (schSetFixedBeaconFields(pMac,psessionEntry) != eSIR_SUCCESS)
-        PELOGE(schLog(pMac, LOGE, "Unable to set beacon fields!\n");)
+        PELOGE(schLog(pMac, LOGE, "Unable to set beacon fields!");)
 }
 
 void
@@ -467,7 +467,7 @@
 
     if (schGetParams(pMac, params, true /*local*/) != eSIR_SUCCESS)
     {
-        PELOGE(schLog(pMac, LOGE, FL("schGetParams(local) failed\n"));)
+        PELOGE(schLog(pMac, LOGE, FL("schGetParams(local) failed"));)
         return;
     }
 
@@ -503,7 +503,7 @@
 
     if (getWmmLocalParams(pMac, params) != eSIR_SUCCESS)
     {
-        PELOGE(schLog(pMac, LOGE, FL("getWmmLocalParams() failed\n"));)
+        PELOGE(schLog(pMac, LOGE, FL("getWmmLocalParams() failed"));)
         return;
     }
 
@@ -528,7 +528,7 @@
 
     limGetPhyMode(pMac, &phyMode, psessionEntry);
 
-    PELOG1(schLog(pMac, LOG1, FL("limGetPhyMode() = %d\n"), phyMode);)
+    PELOG1(schLog(pMac, LOG1, FL("limGetPhyMode() = %d"), phyMode);)
 
     //if (pMac->lim.gLimPhyMode == WNI_CFG_PHY_MODE_11G)
     if (phyMode == WNI_CFG_PHY_MODE_11G)
@@ -559,7 +559,7 @@
         psessionEntry->gLimEdcaParams[i].cw.max =  convertCW(GET_CW(&params[i][cwmaxidx]));
         psessionEntry->gLimEdcaParams[i].txoplimit=  (tANI_U16) params[i][txopidx];
 
-       PELOG1(schLog(pMac, LOG1, FL("AC :%d: AIFSN: %d, ACM %d, CWmin %d, CWmax %d, TxOp %d\n"), i,
+       PELOG1(schLog(pMac, LOG1, FL("AC :%d: AIFSN: %d, ACM %d, CWmin %d, CWmax %d, TxOp %d"), i,
                 psessionEntry->gLimEdcaParams[i].aci.aifsn,
                 psessionEntry->gLimEdcaParams[i].aci.acm,
                 psessionEntry->gLimEdcaParams[i].cw.min,
@@ -592,12 +592,12 @@
         tANI_U32 len = WNI_CFG_EDCA_ANI_ACBK_LOCAL_LEN;
         if (wlan_cfgGetStr(pMac, (tANI_U16) prf[i], (tANI_U8 *) &data[0], &len) != eSIR_SUCCESS)
         {
-            schLog(pMac, LOGP, FL("cfgGet failed for %d\n"), prf[i]);
+            schLog(pMac, LOGP, FL("cfgGet failed for %d"), prf[i]);
             return eSIR_FAILURE;
         }
         if (len > WNI_CFG_EDCA_ANI_ACBK_LOCAL_LEN)
         {
-            schLog(pMac, LOGE, FL("cfgGet for %d: length is %d instead of %d\n"),
+            schLog(pMac, LOGE, FL("cfgGet for %d: length is %d instead of %d"),
                    prf[i], len, WNI_CFG_EDCA_ANI_ACBK_LOCAL_LEN);
             return eSIR_FAILURE;
         }
