diff --git a/CORE/MAC/src/pe/lim/limAIDmgmt.c b/CORE/MAC/src/pe/lim/limAIDmgmt.c
index 85fea83..ca52ead 100644
--- a/CORE/MAC/src/pe/lim/limAIDmgmt.c
+++ b/CORE/MAC/src/pe/lim/limAIDmgmt.c
@@ -40,7 +40,6 @@
  */
 
 /*
- *
  * Airgo Networks, Inc proprietary. All rights reserved.
  * This file limAIDmgmt.cc contains the functions related to
  * AID pool management like initialization, assignment etc.
@@ -159,7 +158,7 @@
         if (pSessionEntry->freePeerIdxHead==0)
             pSessionEntry->freePeerIdxTail=0;
         pSessionEntry->gLimNumOfCurrentSTAs++;
-        //PELOG2(limLog(pMac, LOG2,FL("Assign aid %d, numSta %d, head %d tail %d \n"),aid,pSessionEntry->gLimNumOfCurrentSTAs,pSessionEntry->freeAidHead,pSessionEntry->freeAidTail);)
+        //PELOG2(limLog(pMac, LOG2,FL("Assign aid %d, numSta %d, head %d tail %d "),aid,pSessionEntry->gLimNumOfCurrentSTAs,pSessionEntry->freeAidHead,pSessionEntry->freeAidTail);)
         return peerId;
     }
 
@@ -204,6 +203,6 @@
         pSessionEntry->freePeerIdxTail=pSessionEntry->freePeerIdxHead=(tANI_U8)peerIdx;
     }
     pSessionEntry->gpLimPeerIdxpool[(tANI_U8)peerIdx]=0;
-    //PELOG2(limLog(pMac, LOG2,FL("Release aid %d, numSta %d, head %d tail %d \n"),aid,pMac->lim.gLimNumOfCurrentSTAs,pMac->lim.freeAidHead,pMac->lim.freeAidTail);)
+    //PELOG2(limLog(pMac, LOG2,FL("Release aid %d, numSta %d, head %d tail %d "),aid,pMac->lim.gLimNumOfCurrentSTAs,pMac->lim.freeAidHead,pMac->lim.freeAidTail);)
 
 }
diff --git a/CORE/MAC/src/pe/lim/limAdmitControl.c b/CORE/MAC/src/pe/lim/limAdmitControl.c
index 21b2da8..d48bd79 100644
--- a/CORE/MAC/src/pe/lim/limAdmitControl.c
+++ b/CORE/MAC/src/pe/lim/limAdmitControl.c
@@ -40,7 +40,6 @@
  */
 
 /*
- *
  * Airgo Networks, Inc proprietary. All rights reserved.
  * This file contains TSPEC and STA admit control related functions
  * NOTE: applies only to AP builds
@@ -150,7 +149,7 @@
         msduSz = pTspec->maxMsduSz;
     else
     {
-        PELOGE(limLog(pMac, LOGE, FL("MsduSize not specified\n"));)
+        PELOGE(limLog(pMac, LOGE, FL("MsduSize not specified"));)
         return eSIR_FAILURE;
     }
 
@@ -162,7 +161,7 @@
     else if (pTspec->minDataRate  != 0) dataRate = pTspec->minDataRate;
     else
     {
-        PELOGE(limLog(pMac, LOGE, FL("DataRate not specified\n"));)
+        PELOGE(limLog(pMac, LOGE, FL("DataRate not specified"));)
         return eSIR_FAILURE;
     }
 
@@ -191,7 +190,7 @@
     /* make sure a TSID is being requested */
     if (pTspec->tsinfo.traffic.tsid < SIR_MAC_HCCA_TSID_MIN)
     {
-        limLog(pMac, LOGW, FL("tsid %d must be >%d)\n"),
+        limLog(pMac, LOGW, FL("tsid %d must be >%d)"),
                pTspec->tsinfo.traffic.tsid, SIR_MAC_HCCA_TSID_MIN);
         retval =  eSIR_FAILURE;
     }
@@ -204,20 +203,20 @@
     if (pTspec->tsinfo.traffic.userPrio !=
         (pTspec->tsinfo.traffic.tsid - SIR_MAC_HCCA_TSID_MIN))
     {
-        limLog(pMac, LOGE, FL("TSid=0x%x, userPrio=%d: is not allowed\n"),
+        limLog(pMac, LOGE, FL("TSid=0x%x, userPrio=%d: is not allowed"),
                pTspec->tsinfo.traffic.tsid, pTspec->tsinfo.traffic.userPrio);
         retval = eSIR_FAILURE;
     }
     // an inactivity interval is mandatory
     if (pTspec->inactInterval == 0)
     {
-        PELOGW(limLog(pMac, LOGW, FL("inactInterval unspecified!\n"));)
+        PELOGW(limLog(pMac, LOGW, FL("inactInterval unspecified!"));)
         retval =  eSIR_FAILURE;
     }
     // surplus BW must be specified if a delay Bound is specified
     if ((pTspec->delayBound != 0) && (pTspec->surplusBw == 0))
     {
-        limLog(pMac, LOGW, FL("delayBound %d, but surplusBw unspecified!\n"),
+        limLog(pMac, LOGW, FL("delayBound %d, but surplusBw unspecified!"),
                pTspec->delayBound);
         retval =  eSIR_FAILURE;
     }
@@ -231,7 +230,7 @@
         || (pTspec->minPhyRate > maxPhyRate)
         || (pTspec->minPhyRate < minPhyRate))
     {
-        limLog(pMac, LOGW, FL("minPhyRate (%d) invalid\n"),
+        limLog(pMac, LOGW, FL("minPhyRate (%d) invalid"),
                pTspec->minPhyRate);
         retval =  eSIR_FAILURE;
     }
@@ -242,7 +241,7 @@
         (pTspec->meanDataRate == 0) ||
         (pTspec->peakDataRate == 0))
     {
-        limLog(pMac, LOGW, FL("DataRate must be specified (min %d, mean %d, peak %d)\n"),
+        limLog(pMac, LOGW, FL("DataRate must be specified (min %d, mean %d, peak %d)"),
                pTspec->minDataRate, pTspec->meanDataRate, pTspec->peakDataRate);
         retval =  eSIR_FAILURE;
     }
@@ -250,7 +249,7 @@
     // mean data rate can't be more than the min phy rate
     if (pTspec->meanDataRate > pTspec->minPhyRate)
     {
-        limLog(pMac, LOGW, FL("Data rate (%d) is more than Phyrate %d\n"),
+        limLog(pMac, LOGW, FL("Data rate (%d) is more than Phyrate %d"),
                pTspec->meanDataRate, pTspec->minPhyRate);
         return eSIR_FAILURE;
     }
@@ -265,13 +264,13 @@
         // max < min is ridiculous
         if (pTspec->maxSvcInterval < pTspec->minSvcInterval)
         {
-            limLog(pMac, LOGW, FL("maxSvcInt %d  > minSvcInterval %d!!\n"),
+            limLog(pMac, LOGW, FL("maxSvcInt %d  > minSvcInterval %d!!"),
                    pTspec->maxSvcInterval, pTspec->minSvcInterval);
             retval =  eSIR_FAILURE;
         }
         if (pTspec->maxSvcInterval < ADMIT_CONTROL_MIN_INTERVAL)
         {
-            limLog(pMac, LOGW, FL("maxSvcInt %d must be >%d\n"),
+            limLog(pMac, LOGW, FL("maxSvcInt %d must be >%d"),
                    pTspec->maxSvcInterval, ADMIT_CONTROL_MIN_INTERVAL);
             retval =  eSIR_FAILURE;
         }
@@ -285,12 +284,12 @@
          */
          if (pTspec->nomMsduSz == 0)
          {
-             PELOGW(limLog(pMac, LOGW, FL("No svcInt and no MsduSize specified\n"));)
+             PELOGW(limLog(pMac, LOGW, FL("No svcInt and no MsduSize specified"));)
              retval = eSIR_FAILURE;
          }
     }
 
-    limLog(pMac, ADMIT_CONTROL_LOGLEVEL, FL("return status %d\n"), retval);
+    limLog(pMac, ADMIT_CONTROL_LOGLEVEL, FL("return status %d"), retval);
     return retval;
 }
 
@@ -327,12 +326,12 @@
         (pTspec->minPhyRate   == 0) ||
         (pTspec->minPhyRate   > maxPhyRate))
     {
-        limLog(pMac, LOGW, FL("Invalid EDCA Tspec: NomMsdu %d, meanDataRate %d, surplusBw %d, minPhyRate %d\n"),
+        limLog(pMac, LOGW, FL("Invalid EDCA Tspec: NomMsdu %d, meanDataRate %d, surplusBw %d, minPhyRate %d"),
                pTspec->nomMsduSz, pTspec->meanDataRate, pTspec->surplusBw, pTspec->minPhyRate);
         retval = eSIR_FAILURE;
     }
 
-    limLog(pMac, ADMIT_CONTROL_LOGLEVEL, FL("return status %d\n"), retval);
+    limLog(pMac, ADMIT_CONTROL_LOGLEVEL, FL("return status %d"), retval);
     return retval;
 }
 
@@ -355,19 +354,19 @@
     {
         case SIR_MAC_ACCESSPOLICY_EDCA:
             if ((retval = limValidateTspecEdca(pMac, pTspec, psessionEntry)) != eSIR_SUCCESS)
-                PELOGW(limLog(pMac, LOGW, FL("EDCA tspec invalid\n"));)
+                PELOGW(limLog(pMac, LOGW, FL("EDCA tspec invalid"));)
             break;
 
         case SIR_MAC_ACCESSPOLICY_HCCA:
 #if 0 //Not supported right now.    
             if ((retval = limValidateTspecHcca(pMac, pTspec)) != eSIR_SUCCESS)
-                PELOGW(limLog(pMac, LOGW, FL("HCCA tspec invalid\n"));)
+                PELOGW(limLog(pMac, LOGW, FL("HCCA tspec invalid"));)
             break;
 #endif
        case SIR_MAC_ACCESSPOLICY_BOTH:
          // TBD: should we support hybrid tspec as well?? for now, just fall through
         default:
-            limLog(pMac, LOGW, FL("AccessType %d not supported\n"),
+            limLog(pMac, LOGW, FL("AccessType %d not supported"),
                    pTspec->tsinfo.traffic.accessPolicy);
             retval = eSIR_FAILURE;
             break;
@@ -407,7 +406,7 @@
             if (pSta == NULL)
             {
                 // maybe we should delete the tspec??
-                limLog(pMac, LOGE, FL("Tspec %d (assocId %d): dphNode not found\n"),
+                limLog(pMac, LOGE, FL("Tspec %d (assocId %d): dphNode not found"),
                        ctspec, pTspecInfo->assocId);
                 continue;
             }
@@ -505,7 +504,7 @@
     if ((totalbw - usedbw) < pTspec->meanDataRate)
     {
         limLog(pMac, ADMIT_CONTROL_POLICY_LOGLEVEL,
-               FL("Total BW %d, Used %d, Tspec request %d not possible\n"),
+               FL("Total BW %d, Used %d, Tspec request %d not possible"),
                totalbw, usedbw, pTspec->meanDataRate);
         return eSIR_FAILURE;
     }
@@ -538,7 +537,7 @@
             retval = limAdmitPolicyOversubscription(pMac, pTspec,
                         &pMac->lim.admitPolicyInfo, &pMac->lim.tspecInfo[0], psessionEntry);
             if (retval != eSIR_SUCCESS)
-                PELOGE(limLog(pMac, LOGE, FL("rejected by BWFactor policy\n"));)
+                PELOGE(limLog(pMac, LOGE, FL("rejected by BWFactor policy"));)
             break;
 
         case WNI_CFG_ADMIT_POLICY_REJECT_ALL:
@@ -547,7 +546,7 @@
 
         default:
             retval = eSIR_SUCCESS;
-            limLog(pMac, LOGE, FL("Admit Policy %d unknown, admitting all traffic\n"),
+            limLog(pMac, LOGE, FL("Admit Policy %d unknown, admitting all traffic"),
                    pAdmitPolicy->type);
             break;
     }
@@ -569,8 +568,8 @@
     if (pInfo == NULL)
         return;
         //pierre
-    limLog(pMac, ADMIT_CONTROL_LOGLEVEL, FL("tspec entry = %d\n"), pInfo->idx);
-    limLog(pMac, ADMIT_CONTROL_LOGLEVEL, FL("delete tspec %08X\n"),pInfo);
+    limLog(pMac, ADMIT_CONTROL_LOGLEVEL, FL("tspec entry = %d"), pInfo->idx);
+    limLog(pMac, ADMIT_CONTROL_LOGLEVEL, FL("delete tspec %08X"),pInfo);
     pInfo->inuse = 0;
 
     // clear the hcca/parameterized queue indicator
@@ -643,8 +642,8 @@
 
     *ppInfo = NULL;
 
-    limLog(pMac, ADMIT_CONTROL_LOGLEVEL, FL("Trying to find tspec entry for assocId = %d\n"), assocId);
-    limLog(pMac, ADMIT_CONTROL_LOGLEVEL, FL("pTsInfo->traffic.direction = %d, pTsInfo->traffic.tsid = %d\n"),
+    limLog(pMac, ADMIT_CONTROL_LOGLEVEL, FL("Trying to find tspec entry for assocId = %d"), assocId);
+    limLog(pMac, ADMIT_CONTROL_LOGLEVEL, FL("pTsInfo->traffic.direction = %d, pTsInfo->traffic.tsid = %d"),
                 pTspecIE->tsinfo.traffic.direction, pTspecIE->tsinfo.traffic.tsid);
 
     for (ctspec = 0; ctspec < LIM_NUM_TSPEC_MAX; ctspec++, pTspecList++)
@@ -683,8 +682,8 @@
 
     *ppInfo = NULL;
 
-    limLog(pMac, ADMIT_CONTROL_LOGLEVEL, FL("Trying to find tspec entry for assocId = %d\n"), assocId);
-    limLog(pMac, ADMIT_CONTROL_LOGLEVEL, FL("pTsInfo->traffic.direction = %d, pTsInfo->traffic.tsid = %d\n"),
+    limLog(pMac, ADMIT_CONTROL_LOGLEVEL, FL("Trying to find tspec entry for assocId = %d"), assocId);
+    limLog(pMac, ADMIT_CONTROL_LOGLEVEL, FL("pTsInfo->traffic.direction = %d, pTsInfo->traffic.tsid = %d"),
                 pTsInfo->traffic.direction, pTsInfo->traffic.tsid);
 
     for (ctspec = 0; ctspec < LIM_NUM_TSPEC_MAX; ctspec++, pTspecList++)
@@ -728,7 +727,7 @@
     // validate the assocId
     if (assocId >= pMac->lim.maxStation)
     {
-        PELOGE(limLog(pMac, LOGE, FL("Invalid assocId 0x%x\n"), assocId);)
+        PELOGE(limLog(pMac, LOGE, FL("Invalid assocId 0x%x"), assocId);)
         return eSIR_FAILURE;
     }
 
@@ -775,7 +774,7 @@
     {
         pTspecList->inuse = 1;
         *ppInfo = pTspecList;
-        limLog(pMac, ADMIT_CONTROL_LOGLEVEL, FL("added entry for EDCA AccessPolicy\n"));
+        limLog(pMac, ADMIT_CONTROL_LOGLEVEL, FL("added entry for EDCA AccessPolicy"));
         return eSIR_SUCCESS;
     }
 
@@ -795,7 +794,7 @@
 #endif
     pTspecList->inuse = 1;
     *ppInfo = pTspecList;
-    limLog(pMac, ADMIT_CONTROL_LOGLEVEL, FL("added entry for HCCA AccessPolicy\n"));
+    limLog(pMac, ADMIT_CONTROL_LOGLEVEL, FL("added entry for HCCA AccessPolicy"));
     return eSIR_SUCCESS;
 }
 
@@ -820,7 +819,7 @@
 
     if ((pSta == NULL) || (! pSta->valid))
     {
-        PELOGE(limLog(pMac, LOGE, FL("invalid station address passed\n"));)
+        PELOGE(limLog(pMac, LOGE, FL("invalid station address passed"));)
         return eSIR_FAILURE;
     }
 
@@ -840,12 +839,12 @@
             break;
 #endif  //only EDCA supported for now.
         default:
-            PELOGE(limLog(pMac, LOGE, FL("Invalid accessPolicy %d\n"), accessPolicy);)
+            PELOGE(limLog(pMac, LOGE, FL("Invalid accessPolicy %d"), accessPolicy);)
             break;
     }
 
     if (retval != eSIR_SUCCESS)
-        limLog(pMac, LOGW, FL("failed (accPol %d, staId %d, lle %d, wme %d, wsm %d)\n"),
+        limLog(pMac, LOGW, FL("failed (accPol %d, staId %d, lle %d, wme %d, wsm %d)"),
                accessPolicy, pSta->staIndex, pSta->lleEnabled, pSta->wmeEnabled, pSta->wsmEnabled);
 
     return retval;
@@ -889,7 +888,7 @@
     // EDCA: need to fill in the medium time and the minimum phy rate
     // to be consistent with the desired traffic parameters.
 
-    limLog(pMac, ADMIT_CONTROL_LOGLEVEL, FL("tsid %d, directn %d, start %d, intvl %d, accPolicy %d, up %d\n"),
+    limLog(pMac, ADMIT_CONTROL_LOGLEVEL, FL("tsid %d, directn %d, start %d, intvl %d, accPolicy %d, up %d"),
            pAddts->tspec.tsinfo.traffic.tsid, pAddts->tspec.tsinfo.traffic.direction,
            pAddts->tspec.svcStartTime, pAddts->tspec.minSvcInterval,
            pAddts->tspec.tsinfo.traffic.accessPolicy, pAddts->tspec.tsinfo.traffic.userPrio);
@@ -901,28 +900,28 @@
 
     if (retval == eSIR_SUCCESS)
     {
-        limLog(pMac, ADMIT_CONTROL_LOGLEVEL, FL("duplicate tspec (index %d)!\n"), pTspecInfo->idx);
+        limLog(pMac, ADMIT_CONTROL_LOGLEVEL, FL("duplicate tspec (index %d)!"), pTspecInfo->idx);
         return eSIR_FAILURE;
     }
 
     // check that the tspec's are well formed and acceptable
     if (limValidateTspec(pMac, &pAddts->tspec, psessionEntry) != eSIR_SUCCESS)
     {
-        PELOGW(limLog(pMac, LOGW, FL("tspec validation failed\n"));)
+        PELOGW(limLog(pMac, LOGW, FL("tspec validation failed"));)
         return eSIR_FAILURE;
     }
 
     // determine a service interval for the tspec
     if (limCalculateSvcInt(pMac, &pAddts->tspec, &svcInterval) != eSIR_SUCCESS)
     {
-        PELOGW(limLog(pMac, LOGW, FL("SvcInt calculate failed\n"));)
+        PELOGW(limLog(pMac, LOGW, FL("SvcInt calculate failed"));)
         return eSIR_FAILURE;
     }
 
     // determine if the tspec can be admitted or not based on current policy
     if (limAdmitPolicy(pMac, &pAddts->tspec, psessionEntry) != eSIR_SUCCESS)
     {
-        PELOGW(limLog(pMac, LOGW, FL("tspec rejected by admit control policy\n"));)
+        PELOGW(limLog(pMac, LOGW, FL("tspec rejected by admit control policy"));)
         return eSIR_FAILURE;
     }
 
@@ -947,7 +946,7 @@
     // check that we are in the proper mode to deal with the tspec type
     if (limValidateAccessPolicy(pMac, (tANI_U8) pAddts->tspec.tsinfo.traffic.accessPolicy, assocId, psessionEntry) != eSIR_SUCCESS)
     {
-        limLog(pMac, LOGW, FL("AccessPolicy %d is not valid in current mode\n"),
+        limLog(pMac, LOGW, FL("AccessPolicy %d is not valid in current mode"),
                pAddts->tspec.tsinfo.traffic.accessPolicy);
         return eSIR_FAILURE;
     }
@@ -956,7 +955,7 @@
     if (limTspecAdd(pMac, pAddr, assocId, &pAddts->tspec, svcInterval, &pTspecInfo)
         != eSIR_SUCCESS)
     {
-        PELOGE(limLog(pMac, LOGE, FL("no space in tspec list\n"));)
+        PELOGE(limLog(pMac, LOGE, FL("no space in tspec list"));)
         return eSIR_FAILURE;
     }
 
@@ -994,7 +993,7 @@
     {
         if(pTspecInfo != NULL)    
         {
-          limLog(pMac, ADMIT_CONTROL_LOGLEVEL, FL("Tspec entry %d found\n"), pTspecInfo->idx);
+          limLog(pMac, ADMIT_CONTROL_LOGLEVEL, FL("Tspec entry %d found"), pTspecInfo->idx);
         
           *ptspecIdx = pTspecInfo->idx;
           limTspecDelete(pMac, pTspecInfo);
@@ -1025,11 +1024,11 @@
         if (assocId == pTspecInfo->assocId)
         {
             limTspecDelete(pMac, pTspecInfo);
-            limLog(pMac, ADMIT_CONTROL_LOGLEVEL, FL("Deleting TSPEC %d for assocId %d\n"),
+            limLog(pMac, ADMIT_CONTROL_LOGLEVEL, FL("Deleting TSPEC %d for assocId %d"),
                    ctspec, assocId);
         }
     }
-    limLog(pMac, ADMIT_CONTROL_LOGLEVEL, FL("assocId %d done\n"), assocId);
+    limLog(pMac, ADMIT_CONTROL_LOGLEVEL, FL("assocId %d done"), assocId);
 
     return eSIR_SUCCESS;
 }
@@ -1058,18 +1057,18 @@
     tANI_U32 val;
     if (wlan_cfgGetInt(pMac, WNI_CFG_ADMIT_POLICY, &val) != eSIR_SUCCESS)
     {
-        limLog(pMac, LOGP, FL("Unable to get CFG_ADMIT_POLICY\n"));
+        limLog(pMac, LOGP, FL("Unable to get CFG_ADMIT_POLICY"));
         return eSIR_FAILURE;
     }
     pMac->lim.admitPolicyInfo.type = (tANI_U8) val;
     if (wlan_cfgGetInt(pMac, WNI_CFG_ADMIT_BWFACTOR, &val) != eSIR_SUCCESS)
     {
-        limLog(pMac, LOGP, FL("Unable to get CFG_ADMIT_BWFACTOR\n"));
+        limLog(pMac, LOGP, FL("Unable to get CFG_ADMIT_BWFACTOR"));
         return eSIR_FAILURE;
     }
     pMac->lim.admitPolicyInfo.bw_factor = (tANI_U8) val;
 
-    PELOG1(limLog(pMac, LOG1, FL("LIM: AdmitPolicy %d, bw_factor %d\n"),
+    PELOG1(limLog(pMac, LOG1, FL("LIM: AdmitPolicy %d, bw_factor %d"),
           pMac->lim.admitPolicyInfo.type, pMac->lim.admitPolicyInfo.bw_factor);)
 
     return eSIR_SUCCESS;
@@ -1101,7 +1100,7 @@
 
     if( eHAL_STATUS_SUCCESS != palAllocateMemory( pMac->hHdd, (void **)&pAddTsParam, sizeof(tAddTsParams)))
     {
-       PELOGW(limLog(pMac, LOGW, FL("palAllocateMemory() failed\n"));)
+       PELOGW(limLog(pMac, LOGW, FL("palAllocateMemory() failed"));)
        return eSIR_MEM_ALLOC_FAILED;          
     }
 
@@ -1123,7 +1122,7 @@
 
     if(eSIR_SUCCESS != wdaPostCtrlMsg(pMac, &msg))
     {
-       PELOGW(limLog(pMac, LOGW, FL("wdaPostCtrlMsg() failed\n"));)
+       PELOGW(limLog(pMac, LOGW, FL("wdaPostCtrlMsg() failed"));)
        SET_LIM_PROCESS_DEFD_MESGS(pMac, true);
        palFreeMemory(pMac->hHdd, (tANI_U8*)pAddTsParam);
        return eSIR_FAILURE;
@@ -1154,7 +1153,7 @@
 
   if( eHAL_STATUS_SUCCESS != palAllocateMemory( pMac->hHdd, (void **)&pDelTsParam, sizeof(tDelTsParams)))
   {
-     limLog(pMac, LOGP, FL("palAllocateMemory() failed\n"));
+     limLog(pMac, LOGP, FL("palAllocateMemory() failed"));
      return eSIR_MEM_ALLOC_FAILED;
   }
 
@@ -1167,12 +1166,12 @@
   pDelTsParam->staIdx = staIdx;
   pDelTsParam->tspecIdx = tspecIdx;
 
-  PELOGW(limLog(pMac, LOGW, FL("calling wdaPostCtrlMsg()\n"));)
+  PELOGW(limLog(pMac, LOGW, FL("calling wdaPostCtrlMsg()"));)
   MTRACE(macTraceMsgTx(pMac, sessionId, msg.type));
 
   if(eSIR_SUCCESS != wdaPostCtrlMsg(pMac, &msg))
   {
-     PELOGW(limLog(pMac, LOGW, FL("wdaPostCtrlMsg() failed\n"));)
+     PELOGW(limLog(pMac, LOGW, FL("wdaPostCtrlMsg() failed"));)
      palFreeMemory(pMac->hHdd, (tANI_U8*)pDelTsParam);
      return eSIR_FAILURE;
   }
@@ -1218,7 +1217,7 @@
 
     if(psessionEntry == NULL)
     {
-        PELOGE(limLog(pMac, LOGE,FL("Session does Not exist with given sessionId :%d \n"), pAddTsRspMsg->sessionId);)
+        PELOGE(limLog(pMac, LOGE,FL("Session does Not exist with given sessionId :%d "), pAddTsRspMsg->sessionId);)
         limSendSmeAddtsRsp(pMac, rspReqd, eSIR_SME_ADDTS_RSP_FAILED, psessionEntry, pAddTsRspMsg->tspec, 
               pMac->lim.gLimAddtsReq.sessionId, pMac->lim.gLimAddtsReq.transactionId);
         goto end;
@@ -1226,7 +1225,7 @@
 
     if(pAddTsRspMsg->status == eHAL_STATUS_SUCCESS)
     {
-        PELOG1(limLog(pMac, LOG1, FL("Received successful ADDTS response from HAL \n"));)
+        PELOG1(limLog(pMac, LOG1, FL("Received successful ADDTS response from HAL "));)
         // Use the smesessionId and smetransactionId from the PE session context
         limSendSmeAddtsRsp(pMac, rspReqd, eSIR_SME_SUCCESS, psessionEntry, pAddTsRspMsg->tspec,
                 psessionEntry->smeSessionId, psessionEntry->transactionId);
@@ -1234,7 +1233,7 @@
     }
     else
     {
-        PELOG1(limLog(pMac, LOG1, FL("Received failure ADDTS response from HAL \n"));)
+        PELOG1(limLog(pMac, LOG1, FL("Received failure ADDTS response from HAL "));)
 
         // Send DELTS action frame to AP        
         // 090803: Get peer MAC addr from session        
@@ -1242,7 +1241,7 @@
         cfgLen = sizeof(tSirMacAddr);
         if (wlan_cfgGetStr(pMac, WNI_CFG_BSSID, peerMacAddr, &cfgLen) != eSIR_SUCCESS)
         {
-            limLog(pMac, LOGP, FL("Fail to retrieve BSSID \n"));
+            limLog(pMac, LOGP, FL("Fail to retrieve BSSID "));
             goto end;
         }
 #endif //TO SUPPORT BT-AMP
diff --git a/CORE/MAC/src/pe/lim/limApi.c b/CORE/MAC/src/pe/lim/limApi.c
index 9404d40..68f0d4b 100644
--- a/CORE/MAC/src/pe/lim/limApi.c
+++ b/CORE/MAC/src/pe/lim/limApi.c
@@ -452,13 +452,13 @@
 
    if(wlan_cfgGetInt(pMac, WNI_CFG_HT_CAP_INFO, &val1) != eSIR_SUCCESS) 
    {
-      PELOGE(limLog(pMac, LOGE, FL("could not retrieve HT Cap CFG\n"));)
+      PELOGE(limLog(pMac, LOGE, FL("could not retrieve HT Cap CFG"));)
       return eSIR_FAILURE;
    }
 
    if(wlan_cfgGetInt(pMac, WNI_CFG_CHANNEL_BONDING_MODE, &val2) != eSIR_SUCCESS) 
    {
-      PELOGE(limLog(pMac, LOGE, FL("could not retrieve Channel Bonding CFG\n"));)
+      PELOGE(limLog(pMac, LOGE, FL("could not retrieve Channel Bonding CFG"));)
       return eSIR_FAILURE;
    }
    val16 = ( tANI_U16 ) val1;
@@ -471,13 +471,13 @@
    if(cfgSetInt(pMac, WNI_CFG_HT_CAP_INFO, *(tANI_U16*)pHTCapabilityInfo) 
       != eSIR_SUCCESS)
    {
-      PELOGE(limLog(pMac, LOGE, FL("could not update HT Cap Info CFG\n"));)
+      PELOGE(limLog(pMac, LOGE, FL("could not update HT Cap Info CFG"));)
       return eSIR_FAILURE;
    }
 
    if(wlan_cfgGetInt(pMac, WNI_CFG_HT_INFO_FIELD1, &val1) != eSIR_SUCCESS)
    {
-      PELOGE(limLog(pMac, LOGE, FL("could not retrieve HT INFO Field1 CFG\n"));)
+      PELOGE(limLog(pMac, LOGE, FL("could not retrieve HT INFO Field1 CFG"));)
       return eSIR_FAILURE;
    }
 
@@ -488,7 +488,7 @@
    if(cfgSetInt(pMac, WNI_CFG_HT_INFO_FIELD1, *(tANI_U8*)pHTInfoField1) 
       != eSIR_SUCCESS)
    {
-      PELOGE(limLog(pMac, LOGE, FL("could not update HT Info Field\n"));)
+      PELOGE(limLog(pMac, LOGE, FL("could not update HT Info Field"));)
       return eSIR_FAILURE;
    }
 
@@ -497,7 +497,7 @@
    if( wlan_cfgGetInt(pMac, WNI_CFG_HEART_BEAT_THRESHOLD, &val1) != 
        eSIR_SUCCESS ) 
    {
-      PELOGE(limLog(pMac, LOGE, FL("could not retrieve WNI_CFG_HEART_BEAT_THRESHOLD CFG\n"));) 
+      PELOGE(limLog(pMac, LOGE, FL("could not retrieve WNI_CFG_HEART_BEAT_THRESHOLD CFG"));)
       return eSIR_FAILURE;
    }
    if(!val1) 
@@ -515,17 +515,17 @@
 
    if (wlan_cfgGetInt(pMac, WNI_CFG_HT_CAP_INFO, &val1) != eSIR_SUCCESS) 
    {
-      PELOGE(limLog(pMac, LOGE, FL("could not retrieve HT Cap CFG\n"));)
+      PELOGE(limLog(pMac, LOGE, FL("could not retrieve HT Cap CFG"));)
       return eSIR_FAILURE;
    }
    if (wlan_cfgGetInt(pMac, WNI_CFG_SHORT_GI_20MHZ, &val2) != eSIR_SUCCESS) 
    {
-      PELOGE(limLog(pMac, LOGE, FL("could not retrieve shortGI 20Mhz CFG\n"));)
+      PELOGE(limLog(pMac, LOGE, FL("could not retrieve shortGI 20Mhz CFG"));)
       return eSIR_FAILURE;
    }
    if (wlan_cfgGetInt(pMac, WNI_CFG_SHORT_GI_40MHZ, &val3) != eSIR_SUCCESS) 
    {
-      PELOGE(limLog(pMac, LOGE, FL("could not retrieve shortGI 40Mhz CFG\n"));)
+      PELOGE(limLog(pMac, LOGE, FL("could not retrieve shortGI 40Mhz CFG"));)
       return eSIR_FAILURE;
    }
 
@@ -537,7 +537,7 @@
    if(cfgSetInt(pMac,  WNI_CFG_HT_CAP_INFO, *(tANI_U16*)pHTCapabilityInfo) != 
       eSIR_SUCCESS)
    {
-      PELOGE(limLog(pMac, LOGE, FL("could not update HT Cap Info CFG\n"));)
+      PELOGE(limLog(pMac, LOGE, FL("could not update HT Cap Info CFG"));)
       return eSIR_FAILURE;
    }
 
@@ -545,12 +545,12 @@
 
    if (wlan_cfgGetInt(pMac, WNI_CFG_HT_AMPDU_PARAMS, &val1) != eSIR_SUCCESS) 
    {
-      PELOGE(limLog(pMac, LOGE, FL("could not retrieve HT AMPDU Param CFG\n"));)
+      PELOGE(limLog(pMac, LOGE, FL("could not retrieve HT AMPDU Param CFG"));)
       return eSIR_FAILURE;
    }
    if (wlan_cfgGetInt(pMac, WNI_CFG_MAX_RX_AMPDU_FACTOR, &val2) != eSIR_SUCCESS) 
    {
-      PELOGE(limLog(pMac, LOGE, FL("could not retrieve AMPDU Factor CFG\n"));)
+      PELOGE(limLog(pMac, LOGE, FL("could not retrieve AMPDU Factor CFG"));)
       return eSIR_FAILURE;
    }
    val16 = ( tANI_U16 ) val1;
@@ -559,7 +559,7 @@
    if(cfgSetInt(pMac,  WNI_CFG_HT_AMPDU_PARAMS, *(tANI_U8*)pAmpduParamInfo) != 
       eSIR_SUCCESS)
    {
-      PELOGE(limLog(pMac, LOGE, FL("could not update HT AMPDU Param CFG\n"));)
+      PELOGE(limLog(pMac, LOGE, FL("could not update HT AMPDU Param CFG"));)
       return eSIR_FAILURE;
    }
 
@@ -567,7 +567,7 @@
       limHandleCFGparamUpdate do we want to update this? */
    if(wlan_cfgGetInt(pMac, WNI_CFG_SHORT_PREAMBLE, &val1) != eSIR_SUCCESS)
    {
-      limLog(pMac, LOGP, FL("cfg get short preamble failed\n"));
+      limLog(pMac, LOGP, FL("cfg get short preamble failed"));
       return eSIR_FAILURE;
    }
 
@@ -578,7 +578,7 @@
         sizeof(tSirPowerSaveCfg)) != eHAL_STATUS_SUCCESS)
    {
       PELOGE(limLog(pMac, LOGE, FL("LIM: Cannot allocate memory for power save "
-                                  "configuration\n"));) 
+                                  "configuration"));)
       return eSIR_FAILURE;
    }
        
@@ -592,14 +592,14 @@
    /* Note: it is okay to do this since DAL/HAL is alrady started */
    if ( (pmmSendPowerSaveCfg(pMac, pPowerSaveConfig)) != eSIR_SUCCESS)
    {
-      PELOGE(limLog(pMac, LOGE, FL("LIM: pmmSendPowerSaveCfg() failed \n"));)
+      PELOGE(limLog(pMac, LOGE, FL("LIM: pmmSendPowerSaveCfg() failed "));)
       return eSIR_FAILURE;
    }
 
    /* WNI_CFG_BG_SCAN_CHANNEL_LIST_CHANNEL_LIST */
 
    PELOG1(limLog(pMac, LOG1,
-      FL("VALID_CHANNEL_LIST has changed, reset next bg scan channel\n"));)
+      FL("VALID_CHANNEL_LIST has changed, reset next bg scan channel"));)
    pMac->lim.gLimBackgroundScanChannelId = 0;
 
    /* WNI_CFG_PROBE_RSP_BCN_ADDNIE_DATA - not needed */
@@ -609,7 +609,7 @@
    handleHTCapabilityandHTInfo(pMac, NULL);
    if(wlan_cfgGetInt(pMac, WNI_CFG_DISABLE_LDPC_WITH_TXBF_AP,(tANI_U32 *) &pMac->lim.disableLDPCWithTxbfAP) != eSIR_SUCCESS)
    {
-      limLog(pMac, LOGP, FL("cfg get disableLDPCWithTxbfAP failed\n"));
+      limLog(pMac, LOGP, FL("cfg get disableLDPCWithTxbfAP failed"));
       return eSIR_FAILURE;
    }
 
@@ -625,7 +625,7 @@
 {
    tSirResultCodes retCode = eSIR_SUCCESS;
 
-   PELOG1(limLog(pMac, LOG1, FL(" enter\n"));)
+   PELOG1(limLog(pMac, LOG1, FL(" enter"));)
 
    if (pMac->lim.gLimSmeState == eLIM_SME_OFFLINE_STATE)
    {
@@ -650,7 +650,7 @@
       * other than OFFLINE. Return response to host and
       * log error
       */
-      limLog(pMac, LOGE, FL("Invalid SME state %X\n"),pMac->lim.gLimSmeState );
+      limLog(pMac, LOGE, FL("Invalid SME state %X"),pMac->lim.gLimSmeState );
       retCode = eSIR_FAILURE;
    }
    
@@ -924,7 +924,7 @@
     retStatus = WLANTL_DeRegisterMgmtFrmClient(pvosGCTx);
 
     if ( retStatus != VOS_STATUS_SUCCESS )
-        PELOGE(limLog(pMac, LOGE, FL("DeRegistering the PE Handle with TL has failed bailing out...\n"));)
+        PELOGE(limLog(pMac, LOGE, FL("DeRegistering the PE Handle with TL has failed bailing out..."));)
 
 #if defined WLAN_FEATURE_VOWIFI
     rrmCleanup(pMac);
@@ -951,14 +951,14 @@
 
     if ((pMac->lim.maxBssId == 0) || (pMac->lim.maxStation == 0))
     {
-         PELOGE(limLog(pMac, LOGE, FL("max number of Bssid or Stations cannot be zero!\n"));)
+         PELOGE(limLog(pMac, LOGE, FL("max number of Bssid or Stations cannot be zero!"));)
          return eSIR_FAILURE;
     }
 
     if (eHAL_STATUS_SUCCESS != palAllocateMemory(pMac->hHdd,
               (void **) &pMac->lim.limTimers.gpLimCnfWaitTimer, sizeof(TX_TIMER)*pMac->lim.maxStation))
     {
-        PELOGE(limLog(pMac, LOGE, FL("memory allocate failed!\n"));)
+        PELOGE(limLog(pMac, LOGE, FL("memory allocate failed!"));)
         return eSIR_FAILURE;
     }
 
@@ -967,14 +967,14 @@
               (void **) &pMac->lim.gpLimAIDpool, 
               sizeof(*pMac->lim.gpLimAIDpool) * (WNI_CFG_ASSOC_STA_LIMIT_STAMAX+1)))
     {
-        PELOGE(limLog(pMac, LOGE, FL("memory allocate failed!\n"));)
+        PELOGE(limLog(pMac, LOGE, FL("memory allocate failed!"));)
         return eSIR_FAILURE;
     }
 #endif
     if (eHAL_STATUS_SUCCESS != palAllocateMemory(pMac->hHdd,
         (void **) &pMac->lim.gpSession, sizeof(tPESession)* pMac->lim.maxBssId))
     {
-        limLog(pMac, LOGE, FL("memory allocate failed!\n"));
+        limLog(pMac, LOGE, FL("memory allocate failed!"));
         return eSIR_FAILURE;
     }
  
@@ -985,14 +985,14 @@
     if (eHAL_STATUS_SUCCESS != palAllocateMemory(pMac->hHdd,
               (void **) &pMac->dph.dphHashTable.pHashTable, sizeof(tpDphHashNode)*pMac->lim.maxStation))
     {
-        PELOGE(limLog(pMac, LOGE, FL("memory allocate failed!\n"));)
+        PELOGE(limLog(pMac, LOGE, FL("memory allocate failed!"));)
         return eSIR_FAILURE;
     }
 
     if (eHAL_STATUS_SUCCESS != palAllocateMemory(pMac->hHdd,
               (void **) &pMac->dph.dphHashTable.pDphNodeArray, sizeof(tDphHashNode)*pMac->lim.maxStation))
     {
-        PELOGE(limLog(pMac, LOGE, FL("memory allocate failed!\n"));)
+        PELOGE(limLog(pMac, LOGE, FL("memory allocate failed!"));)
         return eSIR_FAILURE;
     }
     */
@@ -1000,7 +1000,7 @@
     if (eHAL_STATUS_SUCCESS != palAllocateMemory(pMac->hHdd,
               (void **) &pMac->pmm.gPmmTim.pTim, sizeof(tANI_U8)*pMac->lim.maxStation))
     {
-        PELOGE(limLog(pMac, LOGE, FL("memory allocate failed for pTim!\n"));)
+        PELOGE(limLog(pMac, LOGE, FL("memory allocate failed for pTim!"));)
         return eSIR_FAILURE;
     }
     palZeroMemory(pMac->hHdd, pMac->pmm.gPmmTim.pTim, sizeof(tANI_U8)*pMac->lim.maxStation);
@@ -1009,7 +1009,7 @@
 
     if( !VOS_IS_STATUS_SUCCESS( vos_lock_init( &pMac->lim.lkPeGlobalLock ) ) )
     {
-        PELOGE(limLog(pMac, LOGE, FL("pe lock init failed!\n"));)
+        PELOGE(limLog(pMac, LOGE, FL("pe lock init failed!"));)
         return eSIR_FAILURE;
     }
     return eSIR_SUCCESS;
@@ -1341,7 +1341,7 @@
     if(mHdr->fc.type == SIR_MAC_MGMT_FRAME) 
     {
     PELOG1(limLog( pMac, LOG1,
-       FL ( "RxBd=%p mHdr=%p Type: %d Subtype: %d  Sizes:FC%d Mgmt%d\n"),
+       FL ( "RxBd=%p mHdr=%p Type: %d Subtype: %d  Sizes:FC%d Mgmt%d"),
        pRxPacketInfo, mHdr, mHdr->fc.type, mHdr->fc.subType, sizeof(tSirMacFrameCtl), sizeof(tSirMacMgmtHdr) );)
 
     MTRACE(macTrace(pMac, TRACE_CODE_RX_MGMT, NO_SESSION, 
@@ -1362,7 +1362,7 @@
     {
         vos_pkt_return_packet(pVosPkt);
         limLog( pMac, LOGW,
-                FL ( "sysBbtProcessMessageCore failed to process SIR_BB_XPORT_MGMT_MSG\n" ));
+                FL ( "sysBbtProcessMessageCore failed to process SIR_BB_XPORT_MGMT_MSG" ));
         return VOS_STATUS_E_FAILURE;
     }
 
@@ -1395,7 +1395,7 @@
     retStatus = WLANTL_RegisterMgmtFrmClient(pvosGCTx, peHandleMgmtFrame);
 
     if (retStatus != VOS_STATUS_SUCCESS)
-        limLog( pMac, LOGP, FL("Registering the PE Handle with TL has failed bailing out...\n"));
+        limLog( pMac, LOGP, FL("Registering the PE Handle with TL has failed bailing out..."));
 
 }
 
@@ -1607,7 +1607,7 @@
 
     if (i == LIM_PROT_STA_OVERLAP_CACHE_SIZE)
     {
-        PELOG1(limLog(pMac, LOG1, FL("Overlap cache is full\n"));)
+        PELOG1(limLog(pMac, LOG1, FL("Overlap cache is full"));)
     }
     else
     {
@@ -1729,7 +1729,7 @@
         if (newChannel != psessionEntry->currentOperChannel)
         {
             PELOGE(limLog(pMac, LOGE, FL("Channel Change from %d --> %d  - "
-                                         "Ignoring beacon!\n"), 
+                                         "Ignoring beacon!"),
                           psessionEntry->currentOperChannel, newChannel);)
             return;
         }
@@ -1748,7 +1748,7 @@
                 (pBeacon->rsnPresent || pBeacon->wpaPresent))
         {
             PELOGE(limLog(pMac, LOGE, FL("BSS Caps (Privacy) bit 0 in beacon,"
-                                         " but WPA or RSN IE present, Ignore Beacon!\n"));)
+                                         " but WPA or RSN IE present, Ignore Beacon!"));)
             return;
         }
         else
@@ -1797,7 +1797,7 @@
                    != eSIR_SUCCESS)
     {
         limLog(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;
     }
     if (val == false)
@@ -1834,7 +1834,7 @@
     if (nShortSlot != psessionEntry->shortSlotTimeSupported)
     {
         // Short slot time capability of AP has changed. Adopt to it.
-        PELOG1(limLog(pMac, LOG1, FL("Shortslot capability of AP changed: %d\n"),  nShortSlot);)
+        PELOG1(limLog(pMac, LOG1, FL("Shortslot capability of AP changed: %d"),  nShortSlot);)
         ((tpSirMacCapabilityInfo)&psessionEntry->limCurrentBssCaps)->shortSlotTime = (tANI_U16)nShortSlot;
         psessionEntry->shortSlotTimeSupported = nShortSlot;
         pBeaconParams->fShortSlotTime = (tANI_U8) nShortSlot;
@@ -1868,13 +1868,13 @@
          (pMac->pmm.gPmmState == ePMM_STATE_UAPSD_SLEEP)||
          (pMac->pmm.gPmmState == ePMM_STATE_WOWLAN) )
     {
-        PELOG1(limLog(pMac, LOG1, FL("Sending LOW_RSSI_IND to SME \n"));)
+        PELOG1(limLog(pMac, LOG1, FL("Sending LOW_RSSI_IND to SME "));)
         limSendSmeRsp(pMac, eWNI_SME_LOW_RSSI_IND, eSIR_SME_SUCCESS, 0, 0);
     }
     else
     {
         limLog(pMac, LOGE,
-            FL("Received SIR_HAL_LOW_RSSI_IND while in incorrect state: %d\n"),
+            FL("Received SIR_HAL_LOW_RSSI_IND while in incorrect state: %d"),
             pMac->pmm.gPmmState);
     }
     return;
@@ -1908,13 +1908,13 @@
         case ePMM_STATE_UAPSD_SLEEP:
         case ePMM_STATE_UAPSD_WT_WAKEUP_RSP:
         case ePMM_STATE_WOWLAN:
-            PELOG1(limLog(pMac, LOG1, FL("Sending EXIT_BMPS_IND to SME \n"));)
+            PELOG1(limLog(pMac, LOG1, FL("Sending EXIT_BMPS_IND to SME "));)
             limSendExitBmpsInd(pMac, eSME_BMPS_STATUS_IND_RCVD);
             break;
 
         default:
             limLog(pMac, LOGE,
-                FL("Received SIR_HAL_BMPS_STATUS_IND while in incorrect state: %d\n"),
+                FL("Received SIR_HAL_BMPS_STATUS_IND while in incorrect state: %d"),
                 pMac->pmm.gPmmState);
             break;
     }
@@ -1952,7 +1952,7 @@
          (pMac->pmm.gPmmState == ePMM_STATE_WOWLAN) )
     {
         pMac->pmm.inMissedBeaconScenario = TRUE;
-        PELOG1(limLog(pMac, LOG1, FL("Sending EXIT_BMPS_IND to SME \n"));)
+        PELOG1(limLog(pMac, LOG1, FL("Sending EXIT_BMPS_IND to SME "));)
         limSendExitBmpsInd(pMac, eSME_MISSED_BEACON_IND_RCVD);
     }
 /* ACTIVE_MODE_HB_OFFLOAD */
@@ -1962,14 +1962,14 @@
                      (IS_ACTIVEMODE_OFFLOAD_FEATURE_ENABLE))
     {
         pMac->pmm.inMissedBeaconScenario = TRUE;
-        PELOGE(limLog(pMac, LOGE, FL("Received Heart Beat Failure\n"));)
+        PELOGE(limLog(pMac, LOGE, FL("Received Heart Beat Failure"));)
         limMissedBeaconInActiveMode(pMac, psessionEntry);
     }
 #endif
     else
     {
         limLog(pMac, LOGE,
-            FL("Received SIR_HAL_MISSED_BEACON_IND while in incorrect state: %d\n"),
+            FL("Received SIR_HAL_MISSED_BEACON_IND while in incorrect state: %d"),
             pMac->pmm.gPmmState);
     }
     return;
@@ -1995,7 +1995,7 @@
     if((psessionEntry = peFindSessionByBssid(pMac,pSirMicFailureInd->bssId,&sessionId))== NULL)
     {
          limLog(pMac, LOGE,
-               FL("session does not exist for given BSSId\n"));
+               FL("session does not exist for given BSSId"));
          return;
     }
 
@@ -2006,7 +2006,7 @@
     {
         // Log error
        limLog(pMac, LOGP,
-               FL("memory allocate failed for eWNI_SME_MIC_FAILURE_IND\n"));
+               FL("memory allocate failed for eWNI_SME_MIC_FAILURE_IND"));
        return;
     }
 
diff --git a/CORE/MAC/src/pe/lim/limAssocUtils.c b/CORE/MAC/src/pe/lim/limAssocUtils.c
index 4ba11fd..8ed3ce1 100644
--- a/CORE/MAC/src/pe/lim/limAssocUtils.c
+++ b/CORE/MAC/src/pe/lim/limAssocUtils.c
@@ -193,7 +193,7 @@
          pLocalCapabs->shortPreamble))
     {
         PELOG1(limLog(pMac, LOG1,
-           FL("Allowing a STA requesting short preamble while AP does not support it\n"));)
+           FL("Allowing a STA requesting short preamble while AP does not support it"));)
 #if 0
         // AP does not support short preamable
         return false;
@@ -201,7 +201,7 @@
     }
 
 
-    limLog(pMac, LOGW, "QoS in AssocReq: %d, local ShortP: %d\n", 
+    limLog(pMac, LOGW, "QoS in AssocReq: %d, local ShortP: %d",
               pAssocReq->capabilityInfo.qos,
               pLocalCapabs->qos);
 
@@ -213,7 +213,7 @@
           CSR - proper fix needs to be put in place*/
         if ( 0 != vos_get_skip_11e_check())
         {
-             limLog(pMac, LOG1, FL("Received unmatched QOS but cfg to suppress - continuing\n"));
+             limLog(pMac, LOG1, FL("Received unmatched QOS but cfg to suppress - continuing"));
         }
         else
         {
@@ -234,7 +234,7 @@
     {
         if (wlan_cfgGetInt(pMac, WNI_CFG_ACCEPT_SHORT_SLOT_ASSOC_ONLY, &val) != eSIR_SUCCESS)
         {
-            limLog(pMac, LOGP, FL("error getting WNI_CFG_FORCE_SHORT_SLOT_ASSOC_ONLY \n"));
+            limLog(pMac, LOGP, FL("error getting WNI_CFG_FORCE_SHORT_SLOT_ASSOC_ONLY "));
             return false;
         }
         if(val)
@@ -280,7 +280,7 @@
     if( eHAL_STATUS_SUCCESS != palAllocateMemory( pMac->hHdd, (void **)&pRateSet, sizeof(tSirMacRateSet)))
     {
         // Log error
-        limLog(pMac, LOGP, FL("call to palAllocateMemory failed for RATESET\n"));
+        limLog(pMac, LOGP, FL("call to palAllocateMemory failed for RATESET"));
 
         return false;
     }
@@ -292,7 +292,7 @@
                   (tANI_U32 *) &cfgLen) != eSIR_SUCCESS)
     {
         /// Could not get Operational rateset from CFG. Log error.
-        limLog(pMac, LOGP, FL("could not retrieve Operational rateset\n"));
+        limLog(pMac, LOGP, FL("could not retrieve Operational rateset"));
 
         // Free up memory allocated for rateset
         palFreeMemory( pMac->hHdd, (tANI_U8 *) pRateSet);
@@ -384,7 +384,7 @@
                   (tANI_U32 *) &cfgLen) != eSIR_SUCCESS)
     {
         /// Could not get Basic MCS rateset from CFG. Log error.
-        limLog(pMac, LOGP, FL("could not retrieve Basic MCS rateset\n"));
+        limLog(pMac, LOGP, FL("could not retrieve Basic MCS rateset"));
         return false;
     }
 
@@ -742,7 +742,7 @@
                       sizeof(tSirMacAddr)) != eSIR_SUCCESS)
         {
             /// Could not update BSSID at CFG. Log error.
-            limLog(pMac, LOGP, FL("could not update BSSID at CFG\n"));
+            limLog(pMac, LOGP, FL("could not update BSSID at CFG"));
 
             return;
         }
@@ -774,7 +774,7 @@
          * Host or LMM driven Disassociation.
          * Issue Disassoc Confirm to SME.
          */
-           limLog( pMac, LOGW, FL("Lim Posting DISASSOC_CNF to Sme. Trigger: %X\n"), mlmStaContext.cleanupTrigger);
+           limLog( pMac, LOGW, FL("Lim Posting DISASSOC_CNF to Sme. Trigger: %X"), mlmStaContext.cleanupTrigger);
 
 
         palCopyMemory( pMac->hHdd,
@@ -800,7 +800,7 @@
          * Host or LMM driven Deauthentication.
          * Issue Deauth Confirm to SME.
          */
-        limLog( pMac, LOGW, FL("Lim Posting DEAUTH_CNF to Sme. Trigger: %X\n"), mlmStaContext.cleanupTrigger);
+        limLog( pMac, LOGW, FL("Lim Posting DEAUTH_CNF to Sme. Trigger: %X"), mlmStaContext.cleanupTrigger);
         palCopyMemory( pMac->hHdd, (tANI_U8 *) &mlmDeauthCnf.peerMacAddr,
                       (tANI_U8 *) staDsAddr,
                       sizeof(tSirMacAddr));
@@ -823,7 +823,7 @@
          * Received Disassociation/Deauthentication from peer.
          * Issue Purge Ind to SME.
          */
-        limLog( pMac, LOGW, FL("Lim Posting PURGE_STA_IND to Sme. Trigger: %X\n"), mlmStaContext.cleanupTrigger) ;
+        limLog( pMac, LOGW, FL("Lim Posting PURGE_STA_IND to Sme. Trigger: %X"), mlmStaContext.cleanupTrigger) ;
         palCopyMemory( pMac->hHdd, (tANI_U8 *) &mlmPurgeStaInd.peerMacAddr,
                       (tANI_U8 *) staDsAddr,
                       sizeof(tSirMacAddr));
@@ -955,7 +955,7 @@
         if (pStaDs == NULL)
         {
             limLog(pMac, LOGW,
-                   FL("No STA context, yet rejecting Association\n"));
+                   FL("No STA context, yet rejecting Association"));
 
             return;
         }
@@ -998,7 +998,7 @@
                                  subType, 0,psessionEntry);
         // Log error
         limLog(pMac, LOGW,
-           FL("received Re/Assoc req when max associated STAs reached from \n"));
+           FL("received Re/Assoc req when max associated STAs reached from "));
         limPrintMacAddr(pMac, peerAddr, LOGW);
         limSendSmeMaxAssocExceededNtf(pMac, peerAddr, psessionEntry->smeSessionId);
     }
@@ -1137,7 +1137,7 @@
             if (psessionEntry->gLim11bParams.numSta == 0)
             {
                 // disable protection
-                PELOG1(limLog(pMac, LOG1, FL("No 11B STA exists\n"));)
+                PELOG1(limLog(pMac, LOG1, FL("No 11B STA exists"));)
                 limEnable11gProtection(pMac, false, false, pBeaconParams,psessionEntry);
             }
         }
@@ -1289,11 +1289,11 @@
       if (psessionEntry->gLimNoShortParams.numNonShortPreambleSta == 0)
       {
          // enable short preamble
-         PELOG1(limLog(pMac, LOG1, FL("All associated STAs have short preamble support now.\n"));)
+         PELOG1(limLog(pMac, LOG1, FL("All associated STAs have short preamble support now."));)
          //reset the cache
          palZeroMemory( pMac->hHdd, (tANI_U8 *)&psessionEntry->gLimNoShortParams , sizeof(tLimNoShortParams));
          if (limEnableShortPreamble(pMac, true, pBeaconParams, psessionEntry) != eSIR_SUCCESS)
-             PELOGE(limLog(pMac, LOGE, FL("Cannot enable short preamble\n"));)
+             PELOGE(limLog(pMac, LOGE, FL("Cannot enable short preamble"));)
       }
    }
 }
@@ -1360,7 +1360,7 @@
          (val && psessionEntry->gLimNoShortSlotParams.numNonShortSlotSta == 0))
       {
          // enable short slot time
-         PELOG1(limLog(pMac, LOG1, FL("All associated STAs have short slot time support now.\n"));)
+         PELOG1(limLog(pMac, LOG1, FL("All associated STAs have short slot time support now."));)
          //reset the cache
          palZeroMemory( pMac->hHdd, (tANI_U8 *)&psessionEntry->gLimNoShortSlotParams , sizeof(tLimNoShortSlotParams));
          // in case of AP set SHORT_SLOT_TIME to enable
@@ -1376,7 +1376,7 @@
          if (val && pMac->lim.gLimNoShortSlotParams.numNonShortSlotSta == 0)
          {
             // enable short slot time
-            PELOG1(limLog(pMac, LOG1, FL("All associated STAs have short slot time support now.\n"));)
+            PELOG1(limLog(pMac, LOG1, FL("All associated STAs have short slot time support now."));)
             //reset the cache
             palZeroMemory( pMac->hHdd, (tANI_U8 *)&pMac->lim.gLimNoShortSlotParams , sizeof(tLimNoShortSlotParams));
             // in case of AP set SHORT_SLOT_TIME to enable
@@ -1456,7 +1456,7 @@
                   sizeof(tSirMacAddr)) != eSIR_SUCCESS)
     {
         /// Could not update BSSID at CFG. Log error.
-        limLog(pMac, LOGP, FL("could not update BSSID at CFG\n"));
+        limLog(pMac, LOGP, FL("could not update BSSID at CFG"));
         return;
     }
     #endif
@@ -1531,7 +1531,7 @@
         if ( wlan_cfgGetInt( pMac,WNI_CFG_VHT_RX_MCS_MAP,&val) != 
             eSIR_SUCCESS )
         {
-            PELOGE(limLog(pMac, LOGE, FL("could not retrieve VHT RX MCS MAP\n"));)
+            PELOGE(limLog(pMac, LOGE, FL("could not retrieve VHT RX MCS MAP"));)
             goto error;
         }
         pRates->vhtRxMCSMap = (tANI_U16)val;
@@ -1539,7 +1539,7 @@
         if ( wlan_cfgGetInt( pMac,WNI_CFG_VHT_TX_MCS_MAP,&val ) != 
             eSIR_SUCCESS )
         {
-            PELOGE(limLog(pMac, LOGE, FL("could not retrieve VHT TX MCS MAP\n"));)
+            PELOGE(limLog(pMac, LOGE, FL("could not retrieve VHT TX MCS MAP"));)
             goto error;
         }
         pRates->vhtTxMCSMap = (tANI_U16)val;
@@ -1547,7 +1547,7 @@
         if ( wlan_cfgGetInt( pMac,WNI_CFG_VHT_RX_HIGHEST_SUPPORTED_DATA_RATE,&val ) != 
             eSIR_SUCCESS )
         {
-            PELOGE(limLog(pMac, LOGE, FL("could not retrieve VHT RX Supported data rate MAP\n"));)
+            PELOGE(limLog(pMac, LOGE, FL("could not retrieve VHT RX Supported data rate MAP"));)
             goto error;
         }
         pRates->vhtRxHighestDataRate = (tANI_U16)val;
@@ -1555,7 +1555,7 @@
         if ( wlan_cfgGetInt( pMac,WNI_CFG_VHT_TX_HIGHEST_SUPPORTED_DATA_RATE,&val ) != 
             eSIR_SUCCESS )
         {
-            PELOGE(limLog(pMac, LOGE, FL("could not retrieve VHT RX Supported data rate MAP\n"));)
+            PELOGE(limLog(pMac, LOGE, FL("could not retrieve VHT RX Supported data rate MAP"));)
             goto error;
         }
         pRates->vhtTxHighestDataRate = (tANI_U16)val;
@@ -1644,7 +1644,7 @@
                   &val) != eSIR_SUCCESS)
     {
         /// Could not get rateset from CFG. Log error.
-        limLog(pMac, LOGP, FL("could not retrieve rateset\n"));
+        limLog(pMac, LOGP, FL("could not retrieve rateset"));
     }
     #endif // TO SUPPORT BT-AMP
     
@@ -1671,7 +1671,7 @@
                       &val) != eSIR_SUCCESS)
         {
             /// Could not get extended rateset from CFG. Log error.
-            limLog(pMac, LOGP, FL("could not retrieve extended rateset\n"));
+            limLog(pMac, LOGP, FL("could not retrieve extended rateset"));
         }
         tempRateSet2.numRates = (tANI_U8) val;
         #endif
@@ -1693,7 +1693,7 @@
     if ((tempRateSet.numRates + tempRateSet2.numRates) > 12)
     {
         //we are in big trouble
-        limLog(pMac, LOGP, FL("more than 12 rates in CFG\n"));
+        limLog(pMac, LOGP, FL("more than 12 rates in CFG"));
         //panic
         goto error;
     }
@@ -1768,7 +1768,7 @@
                       &val) != eSIR_SUCCESS)
         {
             /// Could not get rateset from CFG. Log error.
-            PELOGE(limLog(pMac, LOGE, FL("could not retrieve supportedMCSSet\n"));)
+            PELOGE(limLog(pMac, LOGE, FL("could not retrieve supportedMCSSet"));)
             goto error;
         }
 
@@ -1783,7 +1783,7 @@
 
         }
 
-        PELOG2(limLog(pMac, LOG2, FL("MCS Rate Set Bitmap: \n"));)
+        PELOG2(limLog(pMac, LOG2, FL("MCS Rate Set Bitmap: "));)
         for(i=0; i<SIR_MAC_MAX_SUPPORTED_MCS_SET; i++)
             PELOGW(limLog(pMac, LOG2,FL("%x ") , pRates->supportedMCSSet[i]);)
     }
@@ -1869,7 +1869,7 @@
                   &val) != eSIR_SUCCESS)
     {
         /// Could not get rateset from CFG. Log error.
-        limLog(pMac, LOGP, FL("could not retrieve rateset\n"));
+        limLog(pMac, LOGP, FL("could not retrieve rateset"));
     }
 
     #endif // TO SUPPORT BT-AMP
@@ -1896,7 +1896,7 @@
 
     if ((tempRateSet.numRates + tempRateSet2.numRates) > 12)
     {
-        PELOGE(limLog(pMac, LOGE, FL("more than 12 rates in CFG\n"));)
+        PELOGE(limLog(pMac, LOGE, FL("more than 12 rates in CFG"));)
         goto error;
     }
 
@@ -2026,7 +2026,7 @@
         val = 0;
         if(wlan_cfgGetInt(pMac, WNI_CFG_PROPRIETARY_RATES_ENABLED, &val) != eSIR_SUCCESS)
         {
-            limLog(pMac, LOGP, FL("could not retrieve prop rate enabled flag from CFG\n"));
+            limLog(pMac, LOGP, FL("could not retrieve prop rate enabled flag from CFG"));
         }
         else if(val)
         {
@@ -2051,14 +2051,14 @@
                       &val) != eSIR_SUCCESS)
         {
             /// Could not get rateset from CFG. Log error.
-            limLog(pMac, LOGP, FL("could not retrieve supportedMCSSet\n"));
+            limLog(pMac, LOGP, FL("could not retrieve supportedMCSSet"));
             goto error;
         }
 
         for(i=0; i<val; i++)
            pStaDs->supportedRates.supportedMCSSet[i] = mcsSet[i] & pSupportedMCSSet[i];
 
-        PELOG2(limLog(pMac, LOG2, FL("limPopulateMatchingRateSet: MCS Rate Set Bitmap from  CFG and DPH : \n"));)
+        PELOG2(limLog(pMac, LOG2, FL("limPopulateMatchingRateSet: MCS Rate Set Bitmap from  CFG and DPH : "));)
         for(i=0; i<SIR_MAC_MAX_SUPPORTED_MCS_SET; i++)
         {
             PELOG2(limLog(pMac, LOG2,FL("%x %x "), mcsSet[i], pStaDs->supportedRates.supportedMCSSet[i]);)
@@ -2122,7 +2122,7 @@
     #if 0
     retCode = wlan_cfgGetStr(pMac, WNI_CFG_STA_ID, staMac, &cfg);
     if (retCode != eSIR_SUCCESS)
-            limLog(pMac, LOGP, FL("could not retrieve STA MAC\n"));
+            limLog(pMac, LOGP, FL("could not retrieve STA MAC"));
     #endif //To SUPPORT BT-AMP
 
     
@@ -2131,7 +2131,7 @@
     if( eHAL_STATUS_SUCCESS !=
         palAllocateMemory( pMac->hHdd, (void **) &pAddStaParams, sizeof( tAddStaParams )))
       {
-        limLog( pMac, LOGP, FL( "Unable to allocate memory during ADD_STA\n" ));
+        limLog( pMac, LOGP, FL( "Unable to allocate memory during ADD_STA" ));
         return eSIR_MEM_ALLOC_FAILED;
       }
     palZeroMemory( pMac->hHdd, (tANI_U8 *) pAddStaParams, sizeof(tAddStaParams));
@@ -2331,7 +2331,7 @@
     msgQ.bodyptr = pAddStaParams;
     msgQ.bodyval = 0;
 
-    limLog( pMac, LOG1, FL( "Sending SIR_HAL_ADD_STA_REQ for assocId %d\n" ),
+    limLog( pMac, LOG1, FL( "Sending SIR_HAL_ADD_STA_REQ for assocId %d" ),
             pStaDs->assocId);
     MTRACE(macTraceMsgTx(pMac, psessionEntry->peSessionId, msgQ.type));
 
@@ -2340,7 +2340,7 @@
     {
        if (pAddStaParams->respReqd)
           SET_LIM_PROCESS_DEFD_MESGS(pMac, true);
-        limLog( pMac, LOGE, FL("ADD_STA_REQ for aId %d failed (reason %X)\n"),
+        limLog( pMac, LOGE, FL("ADD_STA_REQ for aId %d failed (reason %X)"),
                             pStaDs->assocId, retCode );
         palFreeMemory(pMac->hHdd, (void*)pAddStaParams);
     }
@@ -2385,7 +2385,7 @@
 
     if( eHAL_STATUS_SUCCESS != palAllocateMemory( pMac->hHdd, (void **) &pDelStaParams, sizeof( tDeleteStaParams )))
     {
-        limLog( pMac, LOGP, FL( "Unable to PAL allocate memory during ADD_STA\n" ));
+        limLog( pMac, LOGP, FL( "Unable to PAL allocate memory during ADD_STA" ));
         return eSIR_MEM_ALLOC_FAILED;
     }
 
@@ -2463,7 +2463,7 @@
     {
         if(fRespReqd)
            SET_LIM_PROCESS_DEFD_MESGS(pMac, true);
-        limLog( pMac, LOGE, FL("Posting DELETE_STA_REQ to HAL failed, reason=%X\n"),
+        limLog( pMac, LOGE, FL("Posting DELETE_STA_REQ to HAL failed, reason=%X"),
                         retCode );
         palFreeMemory(pMac->hHdd, (void*)pDelStaParams);
     }
@@ -2510,7 +2510,7 @@
     psessionEntry->limMlmState = eLIM_MLM_WT_ADD_STA_RSP_STATE;
     if( eSIR_SUCCESS != (retCode = wdaPostCtrlMsg( pMac, &msgQ )))
     {
-        limLog( pMac, LOGE, FL("Posting ADD_STA_REQ to HAL failed, reason=%X\n"), retCode );
+        limLog( pMac, LOGE, FL("Posting ADD_STA_REQ to HAL failed, reason=%X"), retCode );
         palFreeMemory(pMac->hHdd, (void*)pAddStaParams);
     }
     //
@@ -2569,7 +2569,7 @@
     if (retCode != eSIR_SUCCESS)
         {
             /// Could not get BSSID from CFG. Log error.
-            limLog(pMac, LOGP, FL("could not retrieve STA MAC\n"));
+            limLog(pMac, LOGP, FL("could not retrieve STA MAC"));
         return retCode;
         }
     #endif //TO SUPPORT BT-AMP
@@ -2578,7 +2578,7 @@
     if( eHAL_STATUS_SUCCESS !=
         palAllocateMemory( pMac->hHdd, (void **) &pAddStaParams, sizeof( tAddStaParams )))
     {
-        limLog( pMac, LOGP, FL( "Unable to PAL allocate memory during ADD_STA\n" ));
+        limLog( pMac, LOGP, FL( "Unable to PAL allocate memory during ADD_STA" ));
         return eSIR_MEM_ALLOC_FAILED;
     }
     palZeroMemory( pMac->hHdd, (tANI_U8 *) pAddStaParams, sizeof(tAddStaParams));
@@ -2665,7 +2665,7 @@
                       ((psessionEntry->txLdpcIniFeatureEnabled >> 1)& 0x01);
 
     if(wlan_cfgGetInt(pMac, WNI_CFG_LISTEN_INTERVAL, &listenInterval) != eSIR_SUCCESS)
-       limLog(pMac, LOGP, FL("Couldn't get LISTEN_INTERVAL\n"));
+       limLog(pMac, LOGP, FL("Couldn't get LISTEN_INTERVAL"));
     pAddStaParams->listenInterval = (tANI_U16)listenInterval;
 
     if (VOS_P2P_CLIENT_MODE == psessionEntry->pePersona)
@@ -2692,7 +2692,7 @@
 
   if( eSIR_SUCCESS != (retCode = wdaPostCtrlMsg( pMac, &msgQ )))
     {
-        limLog( pMac, LOGE, FL("Posting ADD_STA_REQ to HAL failed, reason=%X\n"), retCode );
+        limLog( pMac, LOGE, FL("Posting ADD_STA_REQ to HAL failed, reason=%X"), retCode );
         palFreeMemory(pMac->hHdd, (void*)pAddStaParams);
     }
       return retCode;
@@ -2757,7 +2757,7 @@
 
     if((psessionEntry = peFindSessionBySessionId(pMac, pMac->lim.limTimers.gpLimCnfWaitTimer[staId].sessionId))== 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;
     }
     systemRole = limGetSystemRole(psessionEntry);
@@ -2765,13 +2765,13 @@
 
     if (pStaDs == NULL)
     {
-        PELOGW(limLog(pMac, LOGW, FL("No STA context in SIR_LIM_CNF_WAIT_TIMEOUT.\n"));)
+        PELOGW(limLog(pMac, LOGW, FL("No STA context in SIR_LIM_CNF_WAIT_TIMEOUT."));)
         return;
     }
 
     switch (pStaDs->mlmStaContext.mlmState) {
         case eLIM_MLM_WT_ASSOC_CNF_STATE:
-            PELOGW(limLog(pMac, LOGW, FL("Did not receive Assoc Cnf in eLIM_MLM_WT_ASSOC_CNF_STATE sta Assoc id %d\n"), pStaDs->assocId);)
+            PELOGW(limLog(pMac, LOGW, FL("Did not receive Assoc Cnf in eLIM_MLM_WT_ASSOC_CNF_STATE sta Assoc id %d"), pStaDs->assocId);)
             limPrintMacAddr(pMac, pStaDs->staAddr, LOGW);
 
             if ( (systemRole == eLIM_AP_ROLE)|| (systemRole == eLIM_BT_AMP_AP_ROLE) )
@@ -2790,7 +2790,7 @@
             break;
 
         default:
-            limLog(pMac, LOGW, FL("Received CNF_WAIT_TIMEOUT in state %d\n"),
+            limLog(pMac, LOGW, FL("Received CNF_WAIT_TIMEOUT in state %d"),
                    pStaDs->mlmStaContext.mlmState);
     }
 }
@@ -2855,7 +2855,7 @@
             limDecideShortSlot(pMac, pStaDs, &beaconParams, psessionEntry);
 
             //Send message to HAL about beacon parameter change.
-            PELOGW(limLog(pMac, LOGW, FL("param bitmap = %d \n"), beaconParams.paramChangeBitmap);)
+            PELOGW(limLog(pMac, LOGW, FL("param bitmap = %d "), beaconParams.paramChangeBitmap);)
             if(beaconParams.paramChangeBitmap)
             {
                 schSetFixedBeaconFields(pMac,psessionEntry);    
@@ -2863,7 +2863,7 @@
             }
         }
         if (dphDeleteHashEntry(pMac, staAddr, staId, &psessionEntry->dph.dphHashTable) != eSIR_SUCCESS)
-           limLog(pMac, LOGP, FL("error deleting hash entry\n"));
+           limLog(pMac, LOGP, FL("error deleting hash entry"));
     }
 }
 
@@ -2926,7 +2926,7 @@
          * Received SSID does not match with the one we've.
          * Ignore received Beacon frame
          */
-        PELOG1(limLog(pMac, LOG1, FL("SSID received in Beacon does not match\n"));)
+        PELOG1(limLog(pMac, LOG1, FL("SSID received in Beacon does not match"));)
 #ifdef WLAN_DEBUG            
         pMac->lim.gLimBcnSSIDMismatchCnt++;
 #endif
@@ -2935,7 +2935,7 @@
 
     if( (psessionEntry->limSystemRole == eLIM_BT_AMP_STA_ROLE)||(psessionEntry->limSystemRole == eLIM_STA_ROLE))
     {
-        PELOG1(limLog(pMac, LOG1, FL("Received Beacon/PR with matching BSSID\n"));)
+        PELOG1(limLog(pMac, LOG1, FL("Received Beacon/PR with matching BSSID"));)
 
         // Deactivate Join Failure timer
         limDeactivateAndChangeTimer(pMac, eLIM_JOIN_FAIL_TIMER);
@@ -3030,14 +3030,14 @@
   palZeroMemory( pMac->hHdd, (tANI_U8 *) beaconStruct, sizeof( tSirProbeRespBeacon ));
 
   PELOG3(limLog( pMac, LOG3,
-      FL( "In limExtractApCapabilities: The IE's being received are:\n" ));
+      FL( "In limExtractApCapabilities: The IE's being received are:" ));
   sirDumpBuf( pMac, SIR_LIM_MODULE_ID, LOG3, pIE, ieLen );)
 
   // Parse the Beacon IE's, Don't try to parse if we dont have anything in IE
   if (ieLen > 0) {
   if( eSIR_SUCCESS != sirParseBeaconIE( pMac, beaconStruct, pIE, (tANI_U32)ieLen ))
   {
-    limLog( pMac, LOGE, FL("APCapExtract: Beacon parsing error!\n"));
+    limLog( pMac, LOGE, FL("APCapExtract: Beacon parsing error!"));
     return eSIR_FAILURE;
   }
   }
@@ -3077,7 +3077,7 @@
      if( eHAL_STATUS_SUCCESS !=
         palAllocateMemory( pMac->hHdd, (void **) &pDelBssParams, sizeof( tDeleteBssParams )))
      {
-        limLog( pMac, LOGP, FL( "Unable to PAL allocate memory during ADD_BSS\n" ));
+        limLog( pMac, LOGP, FL( "Unable to PAL allocate memory during ADD_BSS" ));
         return eSIR_MEM_ALLOC_FAILED;
      }
      palZeroMemory( pMac->hHdd, (tANI_U8 *) pDelBssParams, sizeof(tDeleteBssParams));
@@ -3100,7 +3100,7 @@
 
     pDelBssParams->status= eHAL_STATUS_SUCCESS;
     pDelBssParams->respReqd = 1;
-   PELOGW(limLog( pMac, LOGW, FL("Sending HAL_DELETE_BSS_REQ for BSSID: %X\n"),
+   PELOGW(limLog( pMac, LOGW, FL("Sending HAL_DELETE_BSS_REQ for BSSID: %X"),
           pDelBssParams->bssIdx);)
 
     //we need to defer the message until we get the response back from HAL.
@@ -3116,7 +3116,7 @@
     if( eSIR_SUCCESS != (retCode = wdaPostCtrlMsg( pMac, &msgQ )))
     {
         SET_LIM_PROCESS_DEFD_MESGS(pMac, true);
-        limLog( pMac, LOGE, FL("Posting DELETE_BSS_REQ to HAL failed, reason=%X\n"), retCode );
+        limLog( pMac, LOGE, FL("Posting DELETE_BSS_REQ to HAL failed, reason=%X"), retCode );
         palFreeMemory(pMac->hHdd, (void*)pDelBssParams);
     }
 
@@ -3169,7 +3169,7 @@
                                                   sizeof( tAddBssParams )))
     {
         limLog( pMac, LOGP,
-                FL( "Unable to PAL allocate memory during ADD_BSS\n" ));
+                FL( "Unable to PAL allocate memory during ADD_BSS" ));
         retCode = eSIR_MEM_ALLOC_FAILED;
         goto returnFailure;
     }
@@ -3371,7 +3371,7 @@
                                                 sizeof(tSirSupportedRates));
         }
         else
-            PELOGE(limLog(pMac, LOGE, FL("could not Update the supported rates.\n"));)
+            PELOGE(limLog(pMac, LOGE, FL("could not Update the supported rates."));)
 
     }
 
@@ -3439,7 +3439,7 @@
     {
         SET_LIM_PROCESS_DEFD_MESGS(pMac, true);
         palFreeMemory(pMac->hHdd, pAddBssParams);
-        limLog( pMac, LOGE, FL("Posting ADD_BSS_REQ to HAL failed, reason=%X\n"),
+        limLog( pMac, LOGE, FL("Posting ADD_BSS_REQ to HAL failed, reason=%X"),
                 retCode );
         goto returnFailure;
 
@@ -3468,7 +3468,7 @@
     if(eHAL_STATUS_SUCCESS != palAllocateMemory(pMac->hHdd, 
                                                 (void **)&pBeaconStruct, sizeof(tSchBeaconStruct)))
     {
-        limLog(pMac, LOGE, FL("Unable to PAL allocate memory during ADD_BSS\n") );
+        limLog(pMac, LOGE, FL("Unable to PAL allocate memory during ADD_BSS") );
         return eSIR_MEM_ALLOC_FAILED;
     }
 
@@ -3479,7 +3479,7 @@
                                                   sizeof( tAddBssParams )))
     {
         limLog( pMac, LOGP,
-                FL( "Unable to PAL allocate memory during ADD_BSS\n" ));
+                FL( "Unable to PAL allocate memory during ADD_BSS" ));
         retCode = eSIR_MEM_ALLOC_FAILED;
         goto returnFailure;
     }
@@ -3731,7 +3731,7 @@
     {
         SET_LIM_PROCESS_DEFD_MESGS(pMac, true);
         palFreeMemory(pMac->hHdd, pAddBssParams);
-        limLog( pMac, LOGE, FL("Posting ADD_BSS_REQ to HAL failed, reason=%X\n"),
+        limLog( pMac, LOGE, FL("Posting ADD_BSS_REQ to HAL failed, reason=%X"),
                 retCode );
         goto returnFailure;
 
@@ -3773,7 +3773,7 @@
 
     if(pStaDs == NULL)
     {
-      PELOGW(limLog(pMac, LOGW, FL("pStaDs is NULL\n"));)
+      PELOGW(limLog(pMac, LOGW, FL("pStaDs is NULL"));)
       return;
     }
     staDsAssocId = pStaDs->assocId;
@@ -3854,7 +3854,7 @@
         ** from CFG. Log error.
         **/
         limLog(pMac, LOGP,
-               FL("could not retrieve AUTH_RSP timeout value\n"));
+               FL("could not retrieve AUTH_RSP timeout value"));
         return;
     }
 
@@ -3870,7 +3870,7 @@
                         TX_NO_ACTIVATE) != TX_SUCCESS)
         {
             // Cannot create timer.  Log error.
-            limLog(pMac, LOGP, FL("Cannot create Auth Rsp timer of Index :%d.\n"), authNodeIdx);
+            limLog(pMac, LOGP, FL("Cannot create Auth Rsp timer of Index :%d."), authNodeIdx);
             return;
         }
         pAuthNode->authNodeIdx = (tANI_U8)authNodeIdx;
@@ -3915,7 +3915,7 @@
 {
     if ((authNodeIdx >= pAuthTable->numEntry) || (pAuthTable->pTable == NULL))
     {
-        limLog(pMac, LOGE, FL("Invalid Auth Timer Index : %d NumEntry : %d\n"), 
+        limLog(pMac, LOGE, FL("Invalid Auth Timer Index : %d NumEntry : %d"),
                   authNodeIdx, pAuthTable->numEntry);
         return NULL;
     }
@@ -3945,7 +3945,7 @@
     localMaxTxPower = cfgGetRegulatoryMaxTransmitPower(pMac, psessionEntry->currentOperChannel);
 
     if(wlan_cfgGetInt(pMac, WNI_CFG_LOCAL_POWER_CONSTRAINT, &localPwrConstraint) != eSIR_SUCCESS) {
-        limLog( pMac, LOGP, FL( "Unable to get Local Power Constraint from cfg\n" ));
+        limLog( pMac, LOGP, FL( "Unable to get Local Power Constraint from cfg" ));
         return eSIR_FAILURE;
     }
     localMaxTxPower -= (tPowerdBm)localPwrConstraint;
@@ -3956,7 +3956,7 @@
          */
     if(assoc->powerCapability.minTxPower > localMaxTxPower)
     {
-        limLog(pMac, LOGW, FL("minTxPower (STA) = %d, localMaxTxPower (AP) = %d\n"),
+        limLog(pMac, LOGW, FL("minTxPower (STA) = %d, localMaxTxPower (AP) = %d"),
                        assoc->powerCapability.minTxPower, localMaxTxPower);
         return (eSIR_FAILURE);
     }
diff --git a/CORE/MAC/src/pe/lim/limFT.c b/CORE/MAC/src/pe/lim/limFT.c
index 4d93e59..58eed71 100644
--- a/CORE/MAC/src/pe/lim/limFT.c
+++ b/CORE/MAC/src/pe/lim/limFT.c
@@ -88,7 +88,7 @@
     if (pMac->ft.ftPEContext.pFTPreAuthReq) 
     {
 #if defined WLAN_FEATURE_VOWIFI_11R_DEBUG
-        PELOGE(limLog( pMac, LOGE, "%s: Freeing pFTPreAuthReq= %p\n", 
+        PELOGE(limLog( pMac, LOGE, "%s: Freeing pFTPreAuthReq= %p",
             __func__, pMac->ft.ftPEContext.pFTPreAuthReq);) 
 #endif
         if (pMac->ft.ftPEContext.pFTPreAuthReq->pbssDescription)
@@ -105,7 +105,7 @@
     if (pMac->ft.ftPEContext.psavedsessionEntry)
     {
 #if defined WLAN_FEATURE_VOWIFI_11R_DEBUG
-        PELOGE(limLog( pMac, LOGE, "%s: Setting psavedsessionEntry= %p to NULL\n", 
+        PELOGE(limLog( pMac, LOGE, "%s: Setting psavedsessionEntry= %p to NULL",
             __func__, pMac->ft.ftPEContext.psavedsessionEntry);) 
 #endif
         pMac->ft.ftPEContext.psavedsessionEntry = NULL;
@@ -118,12 +118,12 @@
         if ((((tpPESession)(pMac->ft.ftPEContext.pftSessionEntry))->valid) &&
             (((tpPESession)(pMac->ft.ftPEContext.pftSessionEntry))->limSmeState == eLIM_SME_WT_REASSOC_STATE))
         {
-            PELOGE(limLog( pMac, LOGE, "%s: Deleting Preauth Session %d\n", __func__, ((tpPESession)pMac->ft.ftPEContext.pftSessionEntry)->peSessionId);)
+            PELOGE(limLog( pMac, LOGE, "%s: Deleting Preauth Session %d", __func__, ((tpPESession)pMac->ft.ftPEContext.pftSessionEntry)->peSessionId);)
             peDeleteSession(pMac, pMac->ft.ftPEContext.pftSessionEntry);
         }
         pMac->ft.ftPEContext.pftSessionEntry = NULL;
 #if defined WLAN_FEATURE_VOWIFI_11R_DEBUG
-        PELOGE(limLog( pMac, LOGE, "%s: Setting psavedsessionEntry= %p to NULL\n", 
+        PELOGE(limLog( pMac, LOGE, "%s: Setting psavedsessionEntry= %p to NULL",
             __func__, pMac->ft.ftPEContext.psavedsessionEntry);) 
 #endif
     }
@@ -152,7 +152,7 @@
     if (pMac->ft.ftPEContext.pFTPreAuthReq) 
     {
 #if defined WLAN_FEATURE_VOWIFI_11R_DEBUG
-        PELOGE(limLog( pMac, LOGE, "%s: Freeing pFTPreAuthReq= %p\n", 
+        PELOGE(limLog( pMac, LOGE, "%s: Freeing pFTPreAuthReq= %p",
             __func__, pMac->ft.ftPEContext.pFTPreAuthReq);) 
 #endif
         if (pMac->ft.ftPEContext.pFTPreAuthReq->pbssDescription)
@@ -170,7 +170,7 @@
     if (pMac->ft.ftPEContext.psavedsessionEntry)
     {
 #if defined WLAN_FEATURE_VOWIFI_11R_DEBUG
-        PELOGE(limLog( pMac, LOGE, "%s: Setting psavedsessionEntry= %p to NULL\n", 
+        PELOGE(limLog( pMac, LOGE, "%s: Setting psavedsessionEntry= %p to NULL",
             __func__, pMac->ft.ftPEContext.psavedsessionEntry);) 
 #endif
         pMac->ft.ftPEContext.psavedsessionEntry = NULL;
@@ -182,7 +182,7 @@
     {
         /* Cannot delete sessions across associations */
 #if defined WLAN_FEATURE_VOWIFI_11R_DEBUG
-        PELOGE(limLog( pMac, LOGE, "%s: Deleting session = %p \n", 
+        PELOGE(limLog( pMac, LOGE, "%s: Deleting session = %p ",
             __func__, pMac->ft.ftPEContext.pftSessionEntry);) 
 #endif
         pMac->ft.ftPEContext.pftSessionEntry = NULL;
@@ -191,7 +191,7 @@
     if (pMac->ft.ftPEContext.pAddBssReq)
     {
 #if defined WLAN_FEATURE_VOWIFI_11R_DEBUG
-        PELOGE(limLog( pMac, LOGE, "%s: Freeing AddBssReq = %p \n", 
+        PELOGE(limLog( pMac, LOGE, "%s: Freeing AddBssReq = %p ",
             __func__, pMac->ft.ftPEContext.pAddBssReq);) 
 #endif
         vos_mem_free(pMac->ft.ftPEContext.pAddBssReq);
@@ -202,7 +202,7 @@
     if (pMac->ft.ftPEContext.pAddStaReq)
     {
 #if defined WLAN_FEATURE_VOWIFI_11R_DEBUG
-        PELOGE(limLog( pMac, LOGE, "%s: Freeing AddStaReq = %p \n", 
+        PELOGE(limLog( pMac, LOGE, "%s: Freeing AddStaReq = %p ",
             __func__, pMac->ft.ftPEContext.pAddStaReq);) 
 #endif
         vos_mem_free(pMac->ft.ftPEContext.pAddStaReq);
@@ -226,7 +226,7 @@
     // The link is suspended of not ?
     if (status != eHAL_STATUS_SUCCESS) 
     {
-        PELOGE(limLog( pMac, LOGE, "%s: Returning \n", __func__);)
+        PELOGE(limLog( pMac, LOGE, "%s: Returning ", __func__);)
         // Post the FT Pre Auth Response to SME
         limPostFTPreAuthRsp(pMac, eSIR_FAILURE, NULL, 0, (tpPESession)data);
 
@@ -285,7 +285,7 @@
         pMac->ft.ftPEContext.pFTPreAuthReq->currbssId, &sessionId);
     if (psessionEntry == NULL)
     {
-        PELOGE(limLog( pMac, LOGE, "%s: Unable to find session for the following bssid\n", 
+        PELOGE(limLog( pMac, LOGE, "%s: Unable to find session for the following bssid",
             __func__);)
         limPrintMacAddr( pMac, pMac->ft.ftPEContext.pFTPreAuthReq->currbssId, LOGE );
         // Post the FT Pre Auth Response to SME
@@ -299,14 +299,14 @@
     {
         // Need to suspend link only if the channels are different
         PELOG2(limLog(pMac,LOG2,"%s: Performing pre-auth on different"
-               " channel (session %p)\n", __func__, psessionEntry);)
+               " channel (session %p)", __func__, psessionEntry);)
         limSuspendLink(pMac, eSIR_CHECK_ROAMING_SCAN, FTPreAuthSuspendLinkHandler, 
                        (tANI_U32 *)psessionEntry); 
     }
     else 
     {
         PELOG2(limLog(pMac,LOG2,"%s: Performing pre-auth on same"
-               " channel (session %p)\n", __func__, psessionEntry);)
+               " channel (session %p)", __func__, psessionEntry);)
         // We are in the same channel. Perform pre-auth
         limPerformFTPreAuth(pMac, eHAL_STATUS_SUCCESS, NULL, psessionEntry);
     }
@@ -328,20 +328,20 @@
         // Only 11r assoc has FT IEs.
         if (pMac->ft.ftPEContext.pFTPreAuthReq->ft_ies == NULL) 
         {
-            PELOGE(limLog( pMac, LOGE, "%s: FTIEs for Auth Req Seq 1 is absent\n");)
+            PELOGE(limLog( pMac, LOGE, "%s: FTIEs for Auth Req Seq 1 is absent");)
             return;
         }
     }
     if (status != eHAL_STATUS_SUCCESS) 
     {
-        PELOGE(limLog( pMac, LOGE, "%s: Change channel not successful for FT pre-auth\n");)
+        PELOGE(limLog( pMac, LOGE, "%s: Change channel not successful for FT pre-auth");)
         return;
     }
     pMac->ft.ftPEContext.psavedsessionEntry = psessionEntry;
 
 #if defined WLAN_FEATURE_VOWIFI_11R_DEBUG
     PELOG2(limLog(pMac,LOG2,"Entered wait auth2 state for FT"
-           " (old session %p)\n", 
+           " (old session %p)",
            pMac->ft.ftPEContext.psavedsessionEntry);)
 #endif
 
@@ -368,7 +368,7 @@
     if(TX_SUCCESS !=  tx_timer_activate(&pMac->lim.limTimers.gLimFTPreAuthRspTimer))
     {
 #if defined WLAN_FEATURE_VOWIFI_11R_DEBUG
-        PELOGE(limLog( pMac, LOGE, "%s: FT Auth Rsp Timer Start Failed\n", __func__);)
+        PELOGE(limLog( pMac, LOGE, "%s: FT Auth Rsp Timer Start Failed", __func__);)
 #endif
     }
 MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, psessionEntry->peSessionId, eLIM_FT_PREAUTH_RSP_TIMER));
@@ -404,7 +404,7 @@
     if(eHAL_STATUS_SUCCESS != palAllocateMemory(pMac->hHdd, 
                                                 (void **)&pBeaconStruct, sizeof(tSchBeaconStruct)))
     {
-        limLog(pMac, LOGE, FL("Unable to PAL allocate memory for creating ADD_BSS\n") );
+        limLog(pMac, LOGE, FL("Unable to PAL allocate memory for creating ADD_BSS") );
         return eSIR_MEM_ALLOC_FAILED;
     }
 
@@ -414,7 +414,7 @@
     {
         palFreeMemory(pMac->hHdd, pBeaconStruct);
         limLog( pMac, LOGP,
-                FL( "Unable to PAL allocate memory for creating ADD_BSS\n" ));
+                FL( "Unable to PAL allocate memory for creating ADD_BSS" ));
         return (eSIR_MEM_ALLOC_FAILED);
     }
     
@@ -493,7 +493,7 @@
     pAddBssParams->currentOperChannel = bssDescription->channelId;
 
 #if defined WLAN_FEATURE_VOWIFI_11R_DEBUG
-    limLog( pMac, LOGE, FL( "SIR_HAL_ADD_BSS_REQ with channel = %d..." ), 
+    limLog( pMac, LOGE, FL( "SIR_HAL_ADD_BSS_REQ with channel = %d..." ),
         pAddBssParams->currentOperChannel);
 #endif
 
@@ -616,7 +616,7 @@
     if(eHAL_STATUS_SUCCESS != palAllocateMemory(pMac->hHdd, 
                                                 (void **)&pBeaconStruct, sizeof(tSchBeaconStruct)))
     {
-        limLog(pMac, LOGE, FL("Unable to PAL allocate memory for creating limFillFTSession\n") );
+        limLog(pMac, LOGE, FL("Unable to PAL allocate memory for creating limFillFTSession") );
         return NULL;
     }
 
@@ -690,7 +690,7 @@
     else
     {   
         /* Throw an error and return and make sure to delete the session.*/
-        limLog(pMac, LOGE, FL("Invalid bss type\n"));
+        limLog(pMac, LOGE, FL("Invalid bss type"));
     }    
                        
     pftSessionEntry->limCurrentBssCaps = pbssDescription->capabilityInfo;
@@ -860,7 +860,7 @@
     if( NULL == pSta )
     {
         PELOGE(limLog( pMac, LOGE,
-            FL( "STA context not found for saved session's BSSID %02x:%02x:%02x:%02x:%02x:%02x\n" ),
+            FL( "STA context not found for saved session's BSSID %02x:%02x:%02x:%02x:%02x:%02x" ),
             pMac->ft.ftPEContext.pFTPreAuthReq->currbssId[0], 
             pMac->ft.ftPEContext.pFTPreAuthReq->currbssId[1], 
             pMac->ft.ftPEContext.pFTPreAuthReq->currbssId[2], 
@@ -894,7 +894,7 @@
         }
     }
 
-    PELOGE(limLog(pMac, LOGE, FL("Number of BA RIC IEs created = %d: Total length = %d\n"), numBA, *ric_ies_length);)
+    PELOGE(limLog(pMac, LOGE, FL("Number of BA RIC IEs created = %d: Total length = %d"), numBA, *ric_ies_length);)
     return status;
 }
 
@@ -916,7 +916,7 @@
     pFTPreAuthRsp = (tpSirFTPreAuthRsp)vos_mem_malloc(rspLen);
     if(NULL == pFTPreAuthRsp)
     {
-       PELOGE(limLog( pMac, LOGE, "Failed to allocate memory\n");)
+       PELOGE(limLog( pMac, LOGE, "Failed to allocate memory");)
        VOS_ASSERT(pFTPreAuthRsp != NULL);
        return;
     }
@@ -1009,7 +1009,7 @@
         if((pftSessionEntry = peCreateSession(pMac, pbssDescription->bssId,
                                               &sessionId, pMac->lim.maxStation)) == NULL)
         {
-            limLog(pMac, LOGE, FL("Session Can not be created for pre-auth 11R AP\n"));
+            limLog(pMac, LOGE, FL("Session Can not be created for pre-auth 11R AP"));
             return;
         }
         pftSessionEntry->peSessionId = sessionId;
@@ -1027,12 +1027,12 @@
         }
         else
         {
-            limLog(pMac, LOGE, FL("Invalid bss type\n"));
+            limLog(pMac, LOGE, FL("Invalid bss type"));
         }
         pftSessionEntry->limPrevSmeState = pftSessionEntry->limSmeState;
         pftSessionEntry->limSmeState = eLIM_SME_WT_REASSOC_STATE;
         pMac->ft.ftPEContext.pftSessionEntry = pftSessionEntry;
-        PELOGE(limLog(pMac,LOGE,"%s:created session (%p) with id = %d\n",
+        PELOGE(limLog(pMac,LOGE,"%s:created session (%p) with id = %d",
                       __func__, pftSessionEntry, pftSessionEntry->peSessionId);)
 
         /* Update the ReAssoc BSSID of the current session */
@@ -1050,7 +1050,7 @@
     else 
     {
 #ifdef WLAN_FEATURE_VOWIFI_11R_DEBUG
-        PELOGE(limLog( pMac, LOGE, "Pre auth on same channel as connected AP channel %d\n", 
+        PELOGE(limLog( pMac, LOGE, "Pre auth on same channel as connected AP channel %d",
             pMac->ft.ftPEContext.pFTPreAuthReq->preAuthchannelNum);)
 #endif
         limFTProcessPreAuthResult(pMac, status, (tANI_U32 *)psessionEntry);
@@ -1086,7 +1086,7 @@
         sizeof(tLimMlmReassocReq)))
     {
         // Log error
-        limLog(pMac, LOGE, FL("call to palAllocateMemory failed for mlmReassocReq\n"));
+        limLog(pMac, LOGE, FL("call to palAllocateMemory failed for mlmReassocReq"));
         return;
     }
 
@@ -1102,7 +1102,7 @@
          * Could not get ReassocFailureTimeout value
          * from CFG. Log error.
          */
-        limLog(pMac, LOGE, FL("could not retrieve ReassocFailureTimeout value\n"));
+        limLog(pMac, LOGE, FL("could not retrieve ReassocFailureTimeout value"));
         return;
     }
 
@@ -1112,7 +1112,7 @@
          * Could not get Capabilities value
          * from CFG. Log error.
          */
-        limLog(pMac, LOGE, FL("could not retrieve Capabilities value\n"));
+        limLog(pMac, LOGE, FL("could not retrieve Capabilities value"));
         return;
     }
     pMlmReassocReq->capabilityInfo = caps;
@@ -1123,7 +1123,7 @@
     /* If telescopic beaconing is enabled, set listen interval to WNI_CFG_TELE_BCN_MAX_LI */
     if(wlan_cfgGetInt(pMac, WNI_CFG_TELE_BCN_WAKEUP_EN, &teleBcnEn) != 
        eSIR_SUCCESS) 
-       limLog(pMac, LOGP, FL("Couldn't get WNI_CFG_TELE_BCN_WAKEUP_EN\n"));
+       limLog(pMac, LOGP, FL("Couldn't get WNI_CFG_TELE_BCN_WAKEUP_EN"));
 
     if(teleBcnEn)
     {
@@ -1133,7 +1133,7 @@
             * Could not get ListenInterval value
             * from CFG. Log error.
           */
-          limLog(pMac, LOGE, FL("could not retrieve ListenInterval\n"));
+          limLog(pMac, LOGE, FL("could not retrieve ListenInterval"));
           return;
        }
     }
@@ -1145,7 +1145,7 @@
             * Could not get ListenInterval value
             * from CFG. Log error.
             */
-         limLog(pMac, LOGE, FL("could not retrieve ListenInterval\n"));
+         limLog(pMac, LOGE, FL("could not retrieve ListenInterval"));
          return;
       }
     }
@@ -1184,7 +1184,7 @@
     if( eSIR_SUCCESS != retCode) 
     {
         vos_mem_free(pMac->ft.ftPEContext.pAddBssReq);
-        limLog( pMac, LOGE, FL("Posting ADD_BSS_REQ to HAL failed, reason=%X\n"),
+        limLog( pMac, LOGE, FL("Posting ADD_BSS_REQ to HAL failed, reason=%X"),
                 retCode );
     }
     // Dont need this anymore
@@ -1207,7 +1207,7 @@
 
     if((psessionEntry = peFindSessionBySessionId(pMac, pMac->lim.limTimers.gLimFTPreAuthRspTimer.sessionId))== 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;
     }
 
@@ -1244,7 +1244,7 @@
                   (tANI_U8 *) &pKeyInfo->keyMaterial.key, sizeof( tSirKeys ));
   if(eSIR_SUCCESS != wlan_cfgGetInt(pMac, WNI_CFG_SINGLE_TID_RC, &val))
   {
-     limLog( pMac, LOGP, FL( "Unable to read WNI_CFG_SINGLE_TID_RC\n" ));
+     limLog( pMac, LOGP, FL( "Unable to read WNI_CFG_SINGLE_TID_RC" ));
   }
 
   pAddBssParams->extSetStaKeyParam.singleTidRc = val;    
@@ -1270,14 +1270,14 @@
                 (void **)&pAggrAddTsParam,
                 sizeof(tAggrAddTsParams)))
     {
-        PELOGE(limLog(pMac, LOGE, FL("palAllocateMemory() failed\n"));)
+        PELOGE(limLog(pMac, LOGE, FL("palAllocateMemory() failed"));)
         return eSIR_MEM_ALLOC_FAILED;
     }
 
     psessionEntry = peFindSessionByBssid(pMac, aggrQosReq->bssId, &sessionId);
 
     if (psessionEntry == NULL) {
-        PELOGE(limLog(pMac, LOGE, FL("psession Entry Null for sessionId = %d\n"), aggrQosReq->sessionId);)
+        PELOGE(limLog(pMac, LOGE, FL("psession Entry Null for sessionId = %d"), aggrQosReq->sessionId);)
         palFreeMemory(pMac->hHdd, (tANI_U8*)pAggrAddTsParam);
         return eSIR_FAILURE;
     }
@@ -1285,7 +1285,7 @@
     pSta = dphLookupHashEntry(pMac, aggrQosReq->bssId, &aid, &psessionEntry->dph.dphHashTable);
     if (pSta == NULL)
     {
-        PELOGE(limLog(pMac, LOGE, FL("Station context not found - ignoring AddTsRsp\n"));)
+        PELOGE(limLog(pMac, LOGE, FL("Station context not found - ignoring AddTsRsp"));)
         palFreeMemory(pMac->hHdd, (tANI_U8*)pAggrAddTsParam);
         return eSIR_FAILURE;
     }
@@ -1351,7 +1351,7 @@
 
             if(eSIR_SUCCESS != limTspecAdd(pMac, pSta->staAddr, pSta->assocId, pTspec,  0, &tspecInfo))
             {
-                PELOGE(limLog(pMac, LOGE, FL("Adding entry in lim Tspec Table failed \n"));)
+                PELOGE(limLog(pMac, LOGE, FL("Adding entry in lim Tspec Table failed "));)
                 pMac->lim.gLimAddtsSent = false;
                 palFreeMemory(pMac->hHdd, (tANI_U8*)pAggrAddTsParam);
                 return eSIR_FAILURE; //Error handling. send the response with error status. need to send DelTS to tear down the TSPEC status.
@@ -1374,7 +1374,7 @@
 
     if(eSIR_SUCCESS != wdaPostCtrlMsg(pMac, &msg))
     {
-       PELOGW(limLog(pMac, LOGW, FL("wdaPostCtrlMsg() failed\n"));)
+       PELOGW(limLog(pMac, LOGW, FL("wdaPostCtrlMsg() failed"));)
        SET_LIM_PROCESS_DEFD_MESGS(pMac, true);
        palFreeMemory(pMac->hHdd, (tANI_U8*)pAggrAddTsParam);
        return eSIR_FAILURE;
@@ -1434,7 +1434,7 @@
     tpPESession  psessionEntry = NULL;
     int i = 0;
 
-    PELOG1(limLog(pMac, LOG1, FL(" Received AGGR_QOS_RSP from HAL\n"));)
+    PELOG1(limLog(pMac, LOG1, FL(" Received AGGR_QOS_RSP from HAL"));)
 
     /* Need to process all the deferred messages enqueued since sending the
        SIR_HAL_AGGR_ADD_TS_REQ */
@@ -1451,7 +1451,7 @@
     if (NULL == psessionEntry)
     {
         // Cant find session entry
-        PELOGE(limLog(pMac, LOGE, FL("Cant find session entry for %s\n"), __func__);)
+        PELOGE(limLog(pMac, LOGE, FL("Cant find session entry for %s"), __func__);)
         if( pAggrQosRspMsg != NULL )
         {
             palFreeMemory( pMac->hHdd, (void *)pAggrQosRspMsg );
diff --git a/CORE/MAC/src/pe/lim/limIbssPeerMgmt.c b/CORE/MAC/src/pe/lim/limIbssPeerMgmt.c
index 886536c..a903e22 100644
--- a/CORE/MAC/src/pe/lim/limIbssPeerMgmt.c
+++ b/CORE/MAC/src/pe/lim/limIbssPeerMgmt.c
@@ -418,14 +418,14 @@
                                sizeof(*pHdr));
     if (status != eHAL_STATUS_SUCCESS)
     {
-        PELOGE(limLog(pMac, LOGE, FL("ibbs-save: Failed malloc pHdr\n"));)
+        PELOGE(limLog(pMac, LOGE, FL("ibbs-save: Failed malloc pHdr"));)
         return;
     }
     status = palAllocateMemory(pMac->hHdd, (void **) &pMac->lim.ibssInfo.pBeacon,
                                sizeof(*pBeacon));
     if (status != eHAL_STATUS_SUCCESS)
     {
-        PELOGE(limLog(pMac, LOGE, FL("ibbs-save: Failed malloc pBeacon\n"));)
+        PELOGE(limLog(pMac, LOGE, FL("ibbs-save: Failed malloc pBeacon"));)
         ibss_coalesce_free(pMac);
         return;
     }
@@ -477,7 +477,7 @@
     if (pStaDs == NULL)
     {
         // Could not add hash table entry
-        PELOGE(limLog(pMac, LOGE, FL("could not add hash entry at DPH for peerIdx/aid=%d MACaddr:\n"), peerIdx);)
+        PELOGE(limLog(pMac, LOGE, FL("could not add hash entry at DPH for peerIdx/aid=%d MACaddr:"), peerIdx);)
         limPrintMacAddr(pMac, peerAddr, LOGE);
         return eSIR_FAILURE;
     }
@@ -536,7 +536,7 @@
 
     if ((pHdr == NULL) || (pBeacon == NULL))
     {
-        PELOGE(limLog(pMac, LOGE, FL("Unable to add BSS (no cached BSS info)\n"));)
+        PELOGE(limLog(pMac, LOGE, FL("Unable to add BSS (no cached BSS info)"));)
         return;
     }
 
@@ -546,7 +546,7 @@
     #if 0
     if (cfgSetStr(pMac, WNI_CFG_BSSID, (tANI_U8 *) pHdr->bssId, sizeof(tSirMacAddr))
         != eSIR_SUCCESS)
-        limLog(pMac, LOGP, FL("could not update BSSID at CFG\n"));
+        limLog(pMac, LOGP, FL("could not update BSSID at CFG"));
     #endif //TO SUPPORT BT-AMP
 
     sirCopyMacAddr(pHdr->bssId,psessionEntry->bssId);
@@ -555,7 +555,7 @@
 
 #if 0
     if (wlan_cfgGetInt(pMac, WNI_CFG_BEACON_INTERVAL, &cfg) != eSIR_SUCCESS)
-        limLog(pMac, LOGP, FL("Can't read beacon interval\n"));
+        limLog(pMac, LOGP, FL("Can't read beacon interval"));
 #endif //TO SUPPORT BT-AMP
     /* Copy beacon interval from sessionTable */
     cfg = psessionEntry->beaconParams.beaconInterval;
@@ -563,7 +563,7 @@
         #if 0
         if (cfgSetInt(pMac, WNI_CFG_BEACON_INTERVAL, pBeacon->beaconInterval)
             != eSIR_SUCCESS)
-            limLog(pMac, LOGP, FL("Can't update beacon interval\n"));
+            limLog(pMac, LOGP, FL("Can't update beacon interval"));
         #endif//TO SUPPORT BT-AMP
         psessionEntry->beaconParams.beaconInterval = pBeacon->beaconInterval;
 
@@ -587,7 +587,7 @@
            (tANI_U8 *) &pMac->lim.gpLimStartBssReq->operationalRateSet.rate,
            pMac->lim.gpLimStartBssReq->operationalRateSet.numRates)
         != eSIR_SUCCESS)
-        limLog(pMac, LOGP, FL("could not update OperRateset at CFG\n"));
+        limLog(pMac, LOGP, FL("could not update OperRateset at CFG"));
     #endif //TO SUPPORT BT-AMP
 
     /**
@@ -605,7 +605,7 @@
     if (cfgSetStr(pMac, WNI_CFG_EXTENDED_OPERATIONAL_RATE_SET,
            (tANI_U8 *) &pBeacon->extendedRates.rate, numExtRates) != eSIR_SUCCESS)
     {
-            limLog(pMac, LOGP, FL("could not update ExtendedOperRateset at CFG\n"));
+            limLog(pMac, LOGP, FL("could not update ExtendedOperRateset at CFG"));
         return;
     } 
 
@@ -634,7 +634,7 @@
 
     #if 0
     if (wlan_cfgGetInt(pMac, WNI_CFG_CURRENT_CHANNEL, &cfg) != eSIR_SUCCESS)
-        limLog(pMac, LOGP, FL("CurrentChannel CFG get fialed!\n"));
+        limLog(pMac, LOGP, FL("CurrentChannel CFG get fialed!"));
     #endif
 
     //mlmStartReq.channelNumber       = (tSirMacChanNum) cfg;
@@ -649,17 +649,17 @@
         (tANI_U8 *) &psessionEntry->pLimStartBssReq->ssId,
         psessionEntry->pLimStartBssReq->ssId.length + 1);
 
-    PELOG1(limLog(pMac, LOG1, FL("invoking ADD_BSS as part of coalescing!\n"));)
+    PELOG1(limLog(pMac, LOG1, FL("invoking ADD_BSS as part of coalescing!"));)
     if (limMlmAddBss(pMac, &mlmStartReq,psessionEntry) != eSIR_SME_SUCCESS)
     {
-        PELOGE(limLog(pMac, LOGE, FL("AddBss failure\n"));)
+        PELOGE(limLog(pMac, LOGE, FL("AddBss failure"));)
         return;
     }
 
     // Update fields in Beacon
     if (schSetFixedBeaconFields(pMac,psessionEntry) != eSIR_SUCCESS)
     {
-        PELOGE(limLog(pMac, LOGE, FL("*** Unable to set fixed Beacon fields ***\n"));)
+        PELOGE(limLog(pMac, LOGE, FL("*** Unable to set fixed Beacon fields ***"));)
         return;
     }
 
@@ -674,16 +674,16 @@
     tpPESession    psessionEntry)
 {
     tSirRetStatus status;
-    PELOGW(limLog(pMac, LOGW, FL("Initiating IBSS Delete BSS\n"));) 
+    PELOGW(limLog(pMac, LOGW, FL("Initiating IBSS Delete BSS"));)
     if (psessionEntry->limMlmState != eLIM_MLM_BSS_STARTED_STATE)
     {
-        limLog(pMac, LOGW, FL("Incorrect LIM MLM state for delBss (%d)\n"),
+        limLog(pMac, LOGW, FL("Incorrect LIM MLM state for delBss (%d)"),
                psessionEntry->limMlmState);
         return;
     }
     status = limDelBss(pMac, NULL, psessionEntry->bssIdx, psessionEntry);
     if (status != eSIR_SUCCESS)
-        PELOGE(limLog(pMac, LOGE, FL("delBss failed for bss %d\n"), psessionEntry->bssIdx);)
+        PELOGE(limLog(pMac, LOGE, FL("delBss failed for bss %d"), psessionEntry->bssIdx);)
 }
 
 /**
@@ -897,7 +897,7 @@
 
     if(!pMac->lim.cfgProtection.fromllb)
     {
-        PELOG1(limLog(pMac, LOG1, FL("protection from 11b is disabled\n"));)
+        PELOG1(limLog(pMac, LOG1, FL("protection from 11b is disabled"));)
         return;
     }
 
@@ -906,7 +906,7 @@
         psessionEntry->gLim11bParams.protectionEnabled = true;
         if(false == psessionEntry->beaconParams.llbCoexist/*pMac->lim.llbCoexist*/)
         {
-            PELOGE(limLog(pMac, LOGE, FL("=> IBSS: Enable Protection \n"));)
+            PELOGE(limLog(pMac, LOGE, FL("=> IBSS: Enable Protection "));)
             pBeaconParams->llbCoexist = psessionEntry->beaconParams.llbCoexist = true;
             pBeaconParams->paramChangeBitmap |= PARAM_llBCOEXIST_CHANGED;
         }
@@ -914,7 +914,7 @@
     else if (true == psessionEntry->beaconParams.llbCoexist/*pMac->lim.llbCoexist*/)
     {
         psessionEntry->gLim11bParams.protectionEnabled = false;
-        PELOGE(limLog(pMac, LOGE, FL("===> IBSS: Disable protection \n"));)
+        PELOGE(limLog(pMac, LOGE, FL("===> IBSS: Disable protection "));)
         pBeaconParams->llbCoexist = psessionEntry->beaconParams.llbCoexist = false;
         pBeaconParams->paramChangeBitmap |= PARAM_llBCOEXIST_CHANGED;
     }
@@ -953,7 +953,7 @@
               pMac->lim.protStaCache[i].addr,
               peerMacAddr, sizeof(tSirMacAddr)))
           {
-              PELOG1(limLog(pMac, LOG1, FL("matching cache entry at %d already active.\n"), i);)
+              PELOG1(limLog(pMac, LOG1, FL("matching cache entry at %d already active."), i);)
               return;
           }
       }
@@ -967,7 +967,7 @@
 
   if (i >= LIM_PROT_STA_CACHE_SIZE)
   {
-      PELOGE(limLog(pMac, LOGE, FL("No space in ProtStaCache\n"));)
+      PELOGE(limLog(pMac, LOGE, FL("No space in ProtStaCache"));)
       return;
   }
 
@@ -1008,7 +1008,7 @@
 
     if(NULL == pStaDs)
     {
-      PELOGE(limLog(pMac, LOGE, FL("pStaDs is NULL\n"));)
+      PELOGE(limLog(pMac, LOGE, FL("pStaDs is NULL"));)
       return;
     }
 
@@ -1028,7 +1028,7 @@
                 (!pStaDs->mlmStaContext.htCapability))
             {
                 protStaCacheType = eLIM_PROT_STA_CACHE_TYPE_llB;
-                PELOGE(limLog(pMac, LOGE, FL("Enable protection from 11B\n"));)
+                PELOGE(limLog(pMac, LOGE, FL("Enable protection from 11B"));)
                 limIbssSetProtection(pMac, true, pBeaconParams,psessionEntry);
             }
         }
@@ -1077,11 +1077,11 @@
 
     if (pBody == 0)
     {
-        PELOGE(limLog(pMac, LOGE, FL("Invalid IBSS AddSta\n"));)
+        PELOGE(limLog(pMac, LOGE, FL("Invalid IBSS AddSta"));)
         return eSIR_FAILURE;
     }
 
-    PELOGE(limLog(pMac, LOGE, FL("Rx Add-Ibss-Sta for MAC:\n"));)
+    PELOGE(limLog(pMac, LOGE, FL("Rx Add-Ibss-Sta for MAC:"));)
     limPrintMacAddr(pMac, *pPeerAddr, LOGE);
 
     pPeerNode = ibss_peer_find(pMac, *pPeerAddr);
@@ -1094,11 +1094,11 @@
             pStaDs->erpEnabled = pPeerNode->erpIePresent;
 
             ibss_sta_info_update(pMac, pStaDs, pPeerNode,psessionEntry);
-            PELOGW(limLog(pMac, LOGW, FL("initiating ADD STA for the IBSS peer.\n"));)
+            PELOGW(limLog(pMac, LOGW, FL("initiating ADD STA for the IBSS peer."));)
             retCode = limAddSta(pMac, pStaDs, false, psessionEntry);
             if(retCode != eSIR_SUCCESS)
             {
-                PELOGE(limLog(pMac, LOGE, FL("ibss-sta-add failed (reason %x)\n"), retCode);)
+                PELOGE(limLog(pMac, LOGE, FL("ibss-sta-add failed (reason %x)"), retCode);)
                 limPrintMacAddr(pMac, *pPeerAddr, LOGE);
                 if(NULL != pStaDs)
                 {
@@ -1113,7 +1113,7 @@
 
                 if(beaconParams.paramChangeBitmap)
                 {
-                    PELOGE(limLog(pMac, LOGE, FL("---> Update Beacon Params \n"));)
+                    PELOGE(limLog(pMac, LOGE, FL("---> Update Beacon Params "));)
                     schSetFixedBeaconFields(pMac, psessionEntry);    
                     limSendBeaconParams(pMac, &beaconParams, psessionEntry );
                 }
@@ -1121,7 +1121,7 @@
         }
         else
         {
-            PELOGE(limLog(pMac, LOGE, FL("hashTblAdd failed (reason %x)\n"), retCode);)
+            PELOGE(limLog(pMac, LOGE, FL("hashTblAdd failed (reason %x)"), retCode);)
             limPrintMacAddr(pMac, *pPeerAddr, LOGE);
         }
     }
@@ -1146,7 +1146,7 @@
     SET_LIM_PROCESS_DEFD_MESGS(pMac, true);
     if (pAddStaParams == NULL)
     {
-        PELOGE(limLog(pMac, LOGE, FL("IBSS: ADD_STA_RSP with no body!\n"));)
+        PELOGE(limLog(pMac, LOGE, FL("IBSS: ADD_STA_RSP with no body!"));)
         return eSIR_FAILURE;
     }
 
@@ -1174,7 +1174,7 @@
     pStaDs->valid                  = 1;
     pStaDs->mlmStaContext.mlmState = eLIM_MLM_LINK_ESTABLISHED_STATE;
 
-    PELOGW(limLog(pMac, LOGW, FL("IBSS: sending IBSS_NEW_PEER msg to SME!\n"));)
+    PELOGW(limLog(pMac, LOGW, FL("IBSS: sending IBSS_NEW_PEER msg to SME!"));)
 
     ibss_status_chg_notify(pMac, pAddStaParams->staMac, pStaDs->staIndex, 
                            pStaDs->ucUcastSig, pStaDs->ucBcastSig,
@@ -1191,11 +1191,11 @@
 {
    tpDeleteBssParams pDelBss = (tpDeleteBssParams) msg;
 
-    PELOGW(limLog(pMac, LOGW, FL("IBSS: DEL_BSS_RSP Rcvd during coalescing!\n"));)
+    PELOGW(limLog(pMac, LOGW, FL("IBSS: DEL_BSS_RSP Rcvd during coalescing!"));)
 
     if (pDelBss == NULL)
     {
-        PELOGE(limLog(pMac, LOGE, FL("IBSS: DEL_BSS_RSP(coalesce) with no body!\n"));)
+        PELOGE(limLog(pMac, LOGE, FL("IBSS: DEL_BSS_RSP(coalesce) with no body!"));)
         goto end;
     }
 
@@ -1230,7 +1230,7 @@
 
     if ((pHdr == NULL) || (pBeacon == NULL))
     {
-        PELOGE(limLog(pMac, LOGE, FL("Unable to handle AddBssRspWhenCoalescing (no cached BSS info)\n"));)
+        PELOGE(limLog(pMac, LOGE, FL("Unable to handle AddBssRspWhenCoalescing (no cached BSS info)"));)
         goto end;
     }
 
@@ -1244,7 +1244,7 @@
     palCopyMemory( pMac->hHdd, (tANI_U8 *) &newBssInfo.ssId,
                   (tANI_U8 *) &pBeacon->ssId, pBeacon->ssId.length + 1);
 
-    PELOGW(limLog(pMac, LOGW, FL("Sending JOINED_NEW_BSS notification to SME.\n"));)
+    PELOGW(limLog(pMac, LOGW, FL("Sending JOINED_NEW_BSS notification to SME."));)
 
     limSendSmeWmStatusChangeNtf(pMac, eSIR_SME_JOINED_NEW_BSS,
                                 (tANI_U32 *) &newBssInfo,
@@ -1273,14 +1273,14 @@
     SET_LIM_PROCESS_DEFD_MESGS(pMac, true);
     if (pDelBss == NULL)
     {
-        PELOGE(limLog(pMac, LOGE, FL("IBSS: DEL_BSS_RSP with no body!\n"));)
+        PELOGE(limLog(pMac, LOGE, FL("IBSS: DEL_BSS_RSP with no body!"));)
         rc = eSIR_SME_REFUSED;
         goto end;
     }
 
     if((psessionEntry = peFindSessionBySessionId(pMac,pDelBss->sessionId))==NULL)
     {
-           limLog(pMac, LOGP,FL("Session Does not exist for given sessionID\n"));
+           limLog(pMac, LOGP,FL("Session Does not exist for given sessionID"));
            goto end;
     }
 
@@ -1313,7 +1313,7 @@
     if(limSetLinkState(pMac, eSIR_LINK_IDLE_STATE, nullBssid,  
         psessionEntry->selfMacAddr, NULL, NULL) != eSIR_SUCCESS)
     {
-        PELOGE(limLog(pMac, LOGE, FL("IBSS: DEL_BSS_RSP setLinkState failed\n"));)
+        PELOGE(limLog(pMac, LOGE, FL("IBSS: DEL_BSS_RSP setLinkState failed"));)
         rc = eSIR_SME_REFUSED;
         goto end;
     }
@@ -1395,7 +1395,7 @@
          * processing will be done in the delBss response processing
          */
         pMac->lim.gLimIbssCoalescingHappened = true;
-        PELOGW(limLog(pMac, LOGW, FL("IBSS Coalescing happened\n"));)
+        PELOGW(limLog(pMac, LOGW, FL("IBSS Coalescing happened"));)
         ibss_coalesce_save(pMac, pHdr, pBeacon);
         ibss_bss_delete(pMac,psessionEntry);
         return eSIR_SUCCESS;
@@ -1408,7 +1408,7 @@
         /* Peer not in the list - Collect BSS description & add to the list */
         tANI_U32      frameLen;
         tSirRetStatus retCode;
-        PELOGW(limLog(pMac, LOGW, FL("IBSS Peer node does not exist, adding it***\n"));)
+        PELOGW(limLog(pMac, LOGW, FL("IBSS Peer node does not exist, adding it***"));)
 
 #ifndef ANI_SIR_IBSS_PEER_CACHING
         /** Limit the Max number of IBSS Peers allowed as the max number of STA's allowed
@@ -1421,7 +1421,7 @@
         if (eHAL_STATUS_SUCCESS !=
             palAllocateMemory(pMac->hHdd, (void **) &pPeerNode, (tANI_U16)frameLen))
         {
-            limLog(pMac, LOGP, FL("alloc fail (%d bytes) storing IBSS peer info\n"),
+            limLog(pMac, LOGP, FL("alloc fail (%d bytes) storing IBSS peer info"),
                    frameLen);
             return eSIR_MEM_ALLOC_FAILED;
         }
@@ -1446,14 +1446,14 @@
         if (pStaDs != NULL)
         {
             /// DPH node already exists for the peer
-            PELOGW(limLog(pMac, LOGW, FL("DPH Node present for just learned peer\n"));)
+            PELOGW(limLog(pMac, LOGW, FL("DPH Node present for just learned peer"));)
             PELOG1(limPrintMacAddr(pMac, pPeerNode->peerMacAddr, LOG1);)
             ibss_sta_info_update(pMac, pStaDs, pPeerNode,psessionEntry);
         }
         retCode = limIbssStaAdd(pMac, pPeerNode->peerMacAddr,psessionEntry);
         if (retCode != eSIR_SUCCESS)
         {
-            PELOGE(limLog(pMac, LOGE, FL("lim-ibss-sta-add failed (reason %x)\n"), retCode);)
+            PELOGE(limLog(pMac, LOGE, FL("lim-ibss-sta-add failed (reason %x)"), retCode);)
             limPrintMacAddr(pMac, pPeerNode->peerMacAddr, LOGE);
             return retCode;
         }
@@ -1465,7 +1465,7 @@
 
         if(beaconParams.paramChangeBitmap)
         {
-            PELOGE(limLog(pMac, LOGE, FL("beaconParams.paramChangeBitmap=1 ---> Update Beacon Params \n"));)
+            PELOGE(limLog(pMac, LOGE, FL("beaconParams.paramChangeBitmap=1 ---> Update Beacon Params "));)
             schSetFixedBeaconFields(pMac, psessionEntry);    
             limSendBeaconParams(pMac, &beaconParams, psessionEntry );
         }
@@ -1482,13 +1482,13 @@
     if (psessionEntry->limIbssActive == false)
     {
         limResetHBPktCount(psessionEntry);
-        PELOGW(limLog(pMac, LOGW, FL("Partner joined our IBSS, Sending IBSS_ACTIVE Notification to SME\n"));)
+        PELOGW(limLog(pMac, LOGW, FL("Partner joined our IBSS, Sending IBSS_ACTIVE Notification to SME"));)
         psessionEntry->limIbssActive = true;
         limSendSmeWmStatusChangeNtf(pMac, eSIR_SME_IBSS_ACTIVE, NULL, 0, psessionEntry->smeSessionId);
         limHeartBeatDeactivateAndChangeTimer(pMac, psessionEntry);
         MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, psessionEntry->peSessionId, eLIM_HEART_BEAT_TIMER));
         if (limActivateHearBeatTimer(pMac) != TX_SUCCESS)
-            limLog(pMac, LOGP, FL("could not activate Heartbeat timer\n"));
+            limLog(pMac, LOGP, FL("could not activate Heartbeat timer"));
     }
 
     return eSIR_SUCCESS;
@@ -1596,7 +1596,7 @@
     else
     {
 
-        PELOGW(limLog(pMac, LOGW, FL("Heartbeat Failure\n"));)
+        PELOGW(limLog(pMac, LOGW, FL("Heartbeat Failure"));)
         pMac->lim.gLimHBfailureCntInLinkEstState++;
 
         if (psessionEntry->limIbssActive == true)
@@ -1604,7 +1604,7 @@
             // We don't receive Beacon frames from any
             // other STA in IBSS. Announce IBSS inactive
             // to Roaming algorithm
-            PELOGW(limLog(pMac, LOGW, FL("Alone in IBSS\n"));)
+            PELOGW(limLog(pMac, LOGW, FL("Alone in IBSS"));)
             psessionEntry->limIbssActive = false;
 
             limSendSmeWmStatusChangeNtf(pMac, eSIR_SME_IBSS_INACTIVE,
@@ -1666,7 +1666,7 @@
 
             if (psessionEntry->gLim11bParams.numSta == 0)
             {
-                PELOGE(limLog(pMac, LOGE, FL("No more 11B STA exists. Disable protection. \n"));)
+                PELOGE(limLog(pMac, LOGE, FL("No more 11B STA exists. Disable protection. "));)
                 limIbssSetProtection(pMac, false, pBeaconParams,psessionEntry);
             }
         }
diff --git a/CORE/MAC/src/pe/lim/limLinkMonitoringAlgo.c b/CORE/MAC/src/pe/lim/limLinkMonitoringAlgo.c
index 0be37a9..a72acf9 100644
--- a/CORE/MAC/src/pe/lim/limLinkMonitoringAlgo.c
+++ b/CORE/MAC/src/pe/lim/limLinkMonitoringAlgo.c
@@ -116,12 +116,12 @@
 
     if(NULL == pMsg)
     {
-        PELOGE(limLog(pMac, LOGE,FL("Invalid body pointer in message\n"));)
+        PELOGE(limLog(pMac, LOGE,FL("Invalid body pointer in message"));)
         return;
     }
     if((psessionEntry = peFindSessionByBssid(pMac,pMsg->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"));)
             palFreeMemory(pMac->hHdd, pMsg);
         return;
     }
@@ -130,12 +130,12 @@
     {
         case HAL_DEL_STA_REASON_CODE_KEEP_ALIVE:
         case HAL_DEL_STA_REASON_CODE_TIM_BASED:
-             PELOGE(limLog(pMac, LOGE, FL(" Deleting station: staId = %d, reasonCode = %d\n"), pMsg->staId, pMsg->reasonCode);)
+             PELOGE(limLog(pMac, LOGE, FL(" Deleting station: staId = %d, reasonCode = %d"), pMsg->staId, pMsg->reasonCode);)
              pStaDs = dphLookupAssocId(pMac, pMsg->staId, &pMsg->assocId, &psessionEntry->dph.dphHashTable);
 
              if (!pStaDs)
              {
-                 PELOGE(limLog(pMac, LOGE, FL("Skip STA deletion (invalid STA) limSystemRole=%d\n"),psessionEntry->limSystemRole);)
+                 PELOGE(limLog(pMac, LOGE, FL("Skip STA deletion (invalid STA) limSystemRole=%d"),psessionEntry->limSystemRole);)
                  palFreeMemory(pMac->hHdd, pMsg);
                  return;
              }
@@ -145,7 +145,7 @@
               */
              if (pStaDs->staIndex != pMsg->staId)
              {
-                 PELOGE(limLog(pMac, LOGE, FL("staid mismatch: %d vs %d \n"), pStaDs->staIndex, pMsg->staId);)
+                 PELOGE(limLog(pMac, LOGE, FL("staid mismatch: %d vs %d "), pStaDs->staIndex, pMsg->staId);)
                  palFreeMemory(pMac->hHdd, pMsg);
                  return;
              }
@@ -153,7 +153,7 @@
              if((eLIM_BT_AMP_AP_ROLE == psessionEntry->limSystemRole) ||
                      (eLIM_AP_ROLE == psessionEntry->limSystemRole))
              {
-                 PELOG1(limLog(pMac, LOG1, FL("SAP:lim Delete Station Context (staId: %d, assocId: %d) \n"),
+                 PELOG1(limLog(pMac, LOG1, FL("SAP:lim Delete Station Context (staId: %d, assocId: %d) "),
                              pMsg->staId, pMsg->assocId);)
                  limTriggerSTAdeletion(pMac, pStaDs, psessionEntry);
              }
@@ -174,7 +174,7 @@
 #endif
                     //TearDownLink with AP
                     tLimMlmDeauthInd  mlmDeauthInd;
-                    PELOGW(limLog(pMac, LOGW, FL("lim Delete Station Context (staId: %d, assocId: %d) \n"),
+                    PELOGW(limLog(pMac, LOGW, FL("lim Delete Station Context (staId: %d, assocId: %d) "),
                                 pMsg->staId, pMsg->assocId);)
 
                     pStaDs->mlmStaContext.disassocReason = eSIR_MAC_UNSPEC_FAILURE_REASON;
@@ -200,13 +200,13 @@
              break;        
 
         case HAL_DEL_STA_REASON_CODE_UNKNOWN_A2:
-             PELOGE(limLog(pMac, LOGE, FL(" Deleting Unknown station \n"));)
+             PELOGE(limLog(pMac, LOGE, FL(" Deleting Unknown station "));)
              limPrintMacAddr(pMac, pMsg->addr2, LOGE);
              limSendDeauthMgmtFrame( pMac, eSIR_MAC_CLASS3_FRAME_FROM_NON_ASSOC_STA_REASON, pMsg->addr2, psessionEntry, FALSE);
              break;
 
         default:
-             PELOGE(limLog(pMac, LOGE, FL(" Unknown reason code \n"));)
+             PELOGE(limLog(pMac, LOGE, FL(" Unknown reason code "));)
              break;
 
     }
@@ -242,7 +242,7 @@
 
     if (! pStaDs)
     {
-        PELOGW(limLog(pMac, LOGW, FL("Skip STA deletion (invalid STA)\n"));)
+        PELOGW(limLog(pMac, LOGW, FL("Skip STA deletion (invalid STA)"));)
         return;
     }
     /**
@@ -253,7 +253,7 @@
 
     if( eHAL_STATUS_SUCCESS != palAllocateMemory( pMac->hHdd, (void **)&pSmeDeauthReq, sizeof(tSirSmeDeauthReq)))
     {
-        limLog(pMac, LOGP, FL("palAllocateMemory failed for eWNI_SME_DEAUTH_REQ \n"));
+        limLog(pMac, LOGP, FL("palAllocateMemory failed for eWNI_SME_DEAUTH_REQ "));
         return;
     }
 
@@ -340,7 +340,7 @@
 
     if((psessionEntry = peFindSessionBySessionId(pMac, sessionId))== 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;
     }
     /**
@@ -351,7 +351,7 @@
 
     pMac->pmm.inMissedBeaconScenario = FALSE;
     limLog(pMac, LOGW,
-       FL("No ProbeRsp from AP after HB failure. Tearing down link\n"));
+       FL("No ProbeRsp from AP after HB failure. Tearing down link"));
 
     // Deactivate heartbeat timer
     limHeartBeatDeactivateAndChangeTimer(pMac, psessionEntry);
@@ -466,7 +466,7 @@
         /**
          * Beacon frame not received within heartbeat timeout.
          */
-        PELOGW(limLog(pMac, LOGW, FL("Heartbeat Failure\n"));)
+        PELOGW(limLog(pMac, LOGW, FL("Heartbeat Failure"));)
         pMac->lim.gLimHBfailureCntInLinkEstState++;
 
         /**
@@ -482,7 +482,7 @@
              * it is still around. Wait until certain
              * timeout for Probe Response from AP.
              */
-            PELOGW(limLog(pMac, LOGW, FL("Heart Beat missed from AP. Sending Probe Req\n"));)
+            PELOGW(limLog(pMac, LOGW, FL("Heart Beat missed from AP. Sending Probe Req"));)
             /* for searching AP, we don't include any additional IE */
             limSendProbeReqMgmtFrame(pMac, &psessionEntry->ssId, psessionEntry->bssId,
                                       psessionEntry->currentOperChannel,psessionEntry->selfMacAddr,
@@ -503,7 +503,7 @@
             * or in states other than link-established state.
             * Log error.
             */
-        PELOG1(limLog(pMac, LOG1, FL("received heartbeat timeout in state %X\n"),
+        PELOG1(limLog(pMac, LOG1, FL("received heartbeat timeout in state %X"),
                psessionEntry->limMlmState);)
         limPrintMlmState(pMac, LOG1, psessionEntry->limMlmState);
         pMac->lim.gLimHBfailureCntInOtherStates++;
diff --git a/CORE/MAC/src/pe/lim/limP2P.c b/CORE/MAC/src/pe/lim/limP2P.c
index 4689abe..d654c38 100644
--- a/CORE/MAC/src/pe/lim/limP2P.c
+++ b/CORE/MAC/src/pe/lim/limP2P.c
@@ -168,14 +168,14 @@
                                           != TX_SUCCESS)
                 {
                     limLog(pMac, LOGP,
-                          FL("Unable to change remain on channel Timer val\n"));
+                          FL("Unable to change remain on channel Timer val"));
                     goto error;
                 }
                 else if(TX_SUCCESS != tx_timer_activate(
                                 &pMac->lim.limTimers.gLimRemainOnChannelTimer))
                 {
                     limLog(pMac, LOGP,
-                    FL("Unable to activate remain on channel Timer\n"));
+                    FL("Unable to activate remain on channel Timer"));
                     limDeactivateAndChangeTimer(pMac, eLIM_REMAIN_CHN_TIMER);
                     goto error;
                 }
@@ -232,7 +232,7 @@
         if((psessionEntry = peCreateSession(pMac,
            pMac->lim.gpLimRemainOnChanReq->selfMacAddr, &sessionId, 1)) == NULL)
         {
-            limLog(pMac, LOGE, FL("Session Can not be created \n"));
+            limLog(pMac, LOGE, FL("Session Can not be created "));
             /* send remain on chn failure */
             return nSirStatus;
         }
@@ -300,7 +300,7 @@
         /* Try to Create a new session */
         if(eSIR_SUCCESS != limCreateSessionForRemainOnChn(pMac, &psessionEntry))
         {
-            limLog(pMac, LOGE, FL("Session Can not be created \n"));
+            limLog(pMac, LOGE, FL("Session Can not be created "));
             /* send remain on chn failure */
             goto error;
         }
@@ -339,7 +339,7 @@
 
     if (status != eHAL_STATUS_SUCCESS)
     {
-        limLog( pMac, LOGE, "%s: Change channel not successful\n");
+        limLog( pMac, LOGE, "%s: Change channel not successful");
         goto error1;
     }
 
@@ -360,7 +360,7 @@
         * Could not change Remain on channel Timer. Log error.
         */
         limLog(pMac, LOGP,
-               FL("Unable to change remain on channel Timer val\n"));
+               FL("Unable to change remain on channel Timer val"));
         goto error;
     }
 
@@ -368,7 +368,7 @@
        tx_timer_activate(&pMac->lim.limTimers.gLimRemainOnChannelTimer))
     {
         limLog( pMac, LOGE,
-                  "%s: remain on channel Timer Start Failed\n", __func__);
+                  "%s: remain on channel Timer Start Failed", __func__);
         goto error;
     }
 
@@ -455,7 +455,7 @@
             pMac->lim.limTimers.gLimRemainOnChannelTimer.sessionId))== NULL)
         {
             limLog(pMac, LOGE,
-                  FL("Session Does not exist for given sessionID\n"));
+                  FL("Session Does not exist for given sessionID"));
             goto error;
         }
 
@@ -481,7 +481,7 @@
     
     if (status != eHAL_STATUS_SUCCESS)
     {
-        PELOGE(limLog( pMac, LOGE, "Remain on Channel Failed\n");)
+        PELOGE(limLog( pMac, LOGE, "Remain on Channel Failed");)
         goto error;
     }
     //Set the resume channel to Any valid channel (invalid). 
@@ -509,7 +509,7 @@
     if ( NULL == MsgRemainonChannel )
     {
         PELOGE(limLog( pMac, LOGP,
-             "%s: No Pointer for Remain on Channel Req\n", __func__);)
+             "%s: No Pointer for Remain on Channel Req", __func__);)
         return;
     }
 
@@ -583,7 +583,7 @@
          palAllocateMemory( pMac->hHdd, (void **)&pSirSmeMgmtFrame, length ))
     {
         limLog(pMac, LOGP,
-               FL("palAllocateMemory failed for eWNI_SME_LISTEN_RSP\n"));
+               FL("palAllocateMemory failed for eWNI_SME_LISTEN_RSP"));
         return;
     }
     palZeroMemory(pMac->hHdd, (void*)pSirSmeMgmtFrame, length);
@@ -898,7 +898,7 @@
                 nBytes += noaLen;
                 limLog( pMac, LOGE,
                         FL("noaLen=%d origLen=%d pP2PIe=0x%x"
-                        " nBytes=%d nBytesToCopy=%d \n"),
+                        " nBytes=%d nBytesToCopy=%d "),
                                    noaLen,origLen,pP2PIe,nBytes,
                    ((pP2PIe + origLen + 2) - (v_U8_t *)pMbMsg->data));
             }
@@ -928,20 +928,20 @@
                 val = SYS_MS_TO_TICKS(pMbMsg->wait);
 
                 limLog(pMac, LOG1,
-                        FL("Tx: Extending the gLimRemainOnChannelTimer\n"));
+                        FL("Tx: Extending the gLimRemainOnChannelTimer"));
                 if (tx_timer_change(
                             &pMac->lim.limTimers.gLimRemainOnChannelTimer, val, 0)
                         != TX_SUCCESS)
                 {
                     limLog(pMac, LOGP,
-                            FL("Unable to change remain on channel Timer val\n"));
+                            FL("Unable to change remain on channel Timer val"));
                     return;
                 }
                 else if(TX_SUCCESS != tx_timer_activate(
                             &pMac->lim.limTimers.gLimRemainOnChannelTimer))
                 {
                     limLog(pMac, LOGP,
-                            FL("Unable to activate remain on channel Timer\n"));
+                            FL("Unable to activate remain on channel Timer"));
                     limDeactivateAndChangeTimer(pMac, eLIM_REMAIN_CHN_TIMER);
                     return;
                 }
@@ -964,7 +964,7 @@
     if ( ! HAL_STATUS_SUCCESS ( halstatus ) )
     {
         limLog( pMac, LOGE, FL("Failed to allocate %d bytes for a Probe"
-          " Request.\n"), nBytes );
+          " Request."), nBytes );
         return;
     }
 
@@ -1018,7 +1018,7 @@
 
         if ( ! HAL_STATUS_SUCCESS ( halstatus ) )
         {
-             limLog( pMac, LOGE, FL("could not send action frame!\n" ));
+             limLog( pMac, LOGE, FL("could not send action frame!" ));
              limSendSmeRsp(pMac, eWNI_SME_ACTION_FRAME_SEND_CNF, halstatus, 
                 pMbMsg->sessionId, 0);
              pMac->lim.mgmtFrameSessionId = 0xff;
@@ -1026,7 +1026,7 @@
         else
         {
              pMac->lim.mgmtFrameSessionId = pMbMsg->sessionId;
-             limLog( pMac, LOG2, FL("lim.actionFrameSessionId = %lu\n" ), 
+             limLog( pMac, LOG2, FL("lim.actionFrameSessionId = %lu" ),
                      pMac->lim.mgmtFrameSessionId);
 
         }
@@ -1061,7 +1061,7 @@
                   pMac->hHdd, (void **) &pMsgNoA, sizeof( tP2pPsConfig )))
     {
         limLog( pMac, LOGE,
-                     FL( "Unable to allocate memory during NoA Update\n" ));
+                     FL( "Unable to allocate memory during NoA Update" ));
         return eSIR_MEM_ALLOC_FAILED;
     }
 
@@ -1081,7 +1081,7 @@
 
     if(eSIR_SUCCESS != wdaPostCtrlMsg(pMac, &msg))
     {
-        limLog(pMac, LOGE, FL("halPostMsgApi failed\n"));
+        limLog(pMac, LOGE, FL("halPostMsgApi failed"));
         return eSIR_FAILURE;
     }
 
diff --git a/CORE/MAC/src/pe/lim/limProcessActionFrame.c b/CORE/MAC/src/pe/lim/limProcessActionFrame.c
index e6a50d4..88a8354 100644
--- a/CORE/MAC/src/pe/lim/limProcessActionFrame.c
+++ b/CORE/MAC/src/pe/lim/limProcessActionFrame.c
@@ -111,7 +111,7 @@
       return;
     }
 
-    PELOG1(limLog(pMac, LOG1, FL("Channel switch Mode == %d\n"), 
+    PELOG1(limLog(pMac, LOG1, FL("Channel switch Mode == %d"),
                        psessionEntry->gLimChannelSwitch.switchMode);)
 
     if (psessionEntry->gLimChannelSwitch.switchMode == eSIR_CHANSW_MODE_SILENT ||
@@ -159,7 +159,7 @@
 
     if (tx_timer_activate(&pMac->lim.limTimers.gLimChannelSwitchTimer) != TX_SUCCESS)
     {
-        limLog(pMac, LOGP, FL("tx_timer_activate failed\n"));
+        limLog(pMac, LOGP, FL("tx_timer_activate failed"));
     }
     return;
 }
@@ -176,14 +176,14 @@
 ------------------------------------------------------------*/
 tSirRetStatus limStartChannelSwitch(tpAniSirGlobal pMac, tpPESession psessionEntry)
 {
-    PELOG1(limLog(pMac, LOG1, FL("Starting the channel switch\n"));)
+    PELOG1(limLog(pMac, LOG1, FL("Starting the channel switch"));)
     
     /*If channel switch is already running and it is on a different session, just return*/  
     /*This need to be removed for MCC */
     if( limIsChanSwitchRunning (pMac) &&
         psessionEntry->gLimSpecMgmt.dot11hChanSwState != eLIM_11H_CHANSW_RUNNING )
     {
-       limLog(pMac, LOGW, FL("Ignoring channel switch on session %d\n"), psessionEntry->peSessionId);
+       limLog(pMac, LOGW, FL("Ignoring channel switch on session %d"), psessionEntry->peSessionId);
        return eSIR_SUCCESS;
     }
      
@@ -192,7 +192,7 @@
     MTRACE(macTrace(pMac, TRACE_CODE_TIMER_DEACTIVATE, psessionEntry->peSessionId, eLIM_CHANNEL_SWITCH_TIMER));
     if (tx_timer_deactivate(&pMac->lim.limTimers.gLimChannelSwitchTimer) != eSIR_SUCCESS)
     {
-        limLog(pMac, LOGP, FL("tx_timer_deactivate failed!\n"));
+        limLog(pMac, LOGP, FL("tx_timer_deactivate failed!"));
         return eSIR_FAILURE;
     }
 
@@ -200,7 +200,7 @@
                 psessionEntry->gLimChannelSwitch.switchTimeoutValue,
                             0) != TX_SUCCESS)
     {
-        limLog(pMac, LOGP, FL("tx_timer_change failed \n"));
+        limLog(pMac, LOGP, FL("tx_timer_change failed "));
         return eSIR_FAILURE;
     }
 
@@ -212,7 +212,7 @@
         MTRACE(macTrace(pMac, TRACE_CODE_TIMER_DEACTIVATE, psessionEntry->peSessionId, eLIM_QUIET_TIMER));
         if (tx_timer_deactivate(&pMac->lim.limTimers.gLimQuietTimer) != TX_SUCCESS)
         {
-            limLog(pMac, LOGP, FL("tx_timer_deactivate failed\n"));
+            limLog(pMac, LOGP, FL("tx_timer_deactivate failed"));
             return eSIR_FAILURE;
         }
     }
@@ -221,7 +221,7 @@
         MTRACE(macTrace(pMac, TRACE_CODE_TIMER_DEACTIVATE, psessionEntry->peSessionId, eLIM_QUIET_BSS_TIMER));
         if (tx_timer_deactivate(&pMac->lim.limTimers.gLimQuietBssTimer) != TX_SUCCESS)
         {
-            limLog(pMac, LOGP, FL("tx_timer_deactivate failed\n"));
+            limLog(pMac, LOGP, FL("tx_timer_deactivate failed"));
             return eSIR_FAILURE;
         }
     }
@@ -271,7 +271,7 @@
     pBody = WDA_GET_RX_MPDU_DATA(pRxPacketInfo);
     frameLen = WDA_GET_RX_PAYLOAD_LEN(pRxPacketInfo);
 
-    PELOG3(limLog(pMac, LOG3, FL("Received Channel switch action frame\n"));)
+    PELOG3(limLog(pMac, LOG3, FL("Received Channel switch action frame"));)
     if (!psessionEntry->lim11hEnable)
         return;
 
@@ -279,7 +279,7 @@
     if (eHAL_STATUS_SUCCESS != status)
     {
         limLog(pMac, LOGE,
-            FL("palAllocateMemory failed, status = %d \n"), status);
+            FL("palAllocateMemory failed, status = %d "), status);
         return;
     }
 
@@ -289,7 +289,7 @@
     if( DOT11F_FAILED( nStatus ))
     {
         limLog( pMac, LOGE,
-            FL( "Failed to unpack and parse an 11h-CHANSW Request (0x%08x, %d bytes):\n"),
+            FL( "Failed to unpack and parse an 11h-CHANSW Request (0x%08x, %d bytes):"),
             nStatus,
             frameLen);
         palFreeMemory(pMac->hHdd, pChannelSwitchFrame);
@@ -298,7 +298,7 @@
     else if(DOT11F_WARNED( nStatus ))
     {
         limLog( pMac, LOGW,
-            FL( "There were warnings while unpacking an 11h-CHANSW Request (0x%08x, %d bytes):\n"),
+            FL( "There were warnings while unpacking an 11h-CHANSW Request (0x%08x, %d bytes):"),
             nStatus,
             frameLen);
     }
@@ -311,7 +311,7 @@
         if (wlan_cfgGetInt(pMac, WNI_CFG_BEACON_INTERVAL, &val) != eSIR_SUCCESS)
         {
             palFreeMemory(pMac->hHdd, pChannelSwitchFrame);
-            limLog(pMac, LOGP, FL("could not retrieve Beacon interval\n"));
+            limLog(pMac, LOGP, FL("could not retrieve Beacon interval"));
             return;
         }
         #endif// TO SUPPORT BT-AMP
@@ -335,7 +335,7 @@
         }
 #endif
 
-       PELOG3(limLog(pMac, LOG3, FL("Rcv Chnl Swtch Frame: Timeout in %d ticks\n"),
+       PELOG3(limLog(pMac, LOG3, FL("Rcv Chnl Swtch Frame: Timeout in %d ticks"),
                              psessionEntry->gLimChannelSwitch.switchTimeoutValue);)
 
         /* Only primary channel switch element is present */
@@ -379,7 +379,7 @@
 
     if (eSIR_SUCCESS != limStartChannelSwitch(pMac, psessionEntry))
     {
-        PELOG1(limLog(pMac, LOG1, FL("Could not start channel switch\n"));)
+        PELOG1(limLog(pMac, LOG1, FL("Could not start channel switch"));)
     }
 
     palFreeMemory(pMac->hHdd, pChannelSwitchFrame);
@@ -406,12 +406,12 @@
     pBody = WDA_GET_RX_MPDU_DATA(pRxPacketInfo);
     frameLen = WDA_GET_RX_PAYLOAD_LEN(pRxPacketInfo);
 
-    PELOG3(limLog(pMac, LOG3, FL("Received Operating Mode action frame\n"));)
+    PELOG3(limLog(pMac, LOG3, FL("Received Operating Mode action frame"));)
     status = palAllocateMemory( pMac->hHdd, (void **)&pOperatingModeframe, sizeof(*pOperatingModeframe));
     if (eHAL_STATUS_SUCCESS != status)
     {
         limLog(pMac, LOGE,
-            FL("palAllocateMemory failed, status = %d \n"), status);
+            FL("palAllocateMemory failed, status = %d "), status);
         return;
     }
 
@@ -421,7 +421,7 @@
     if( DOT11F_FAILED( nStatus ))
     {
         limLog( pMac, LOGE,
-            FL( "Failed to unpack and parse an 11h-CHANSW Request (0x%08x, %d bytes):\n"),
+            FL( "Failed to unpack and parse an 11h-CHANSW Request (0x%08x, %d bytes):"),
             nStatus,
             frameLen);
         palFreeMemory(pMac->hHdd, pOperatingModeframe);
@@ -430,7 +430,7 @@
     else if(DOT11F_WARNED( nStatus ))
     {
         limLog( pMac, LOGW,
-            FL( "There were warnings while unpacking an 11h-CHANSW Request (0x%08x, %d bytes):\n"),
+            FL( "There were warnings while unpacking an 11h-CHANSW Request (0x%08x, %d bytes):"),
             nStatus,
             frameLen);
     }
@@ -440,12 +440,12 @@
     if( operMode != pOperatingModeframe->OperatingMode.chanWidth)
     {
         limLog(pMac, LOGE, 
-            FL(" received Chanwidth %d, staIdx = %d\n"),
+            FL(" received Chanwidth %d, staIdx = %d"),
             (pOperatingModeframe->OperatingMode.chanWidth ),
             pSta->staIndex);
 
         limLog(pMac, LOGE, 
-            FL(" MAC - %0x:%0x:%0x:%0x:%0x:%0x\n"),
+            FL(" MAC - %0x:%0x:%0x:%0x:%0x:%0x"),
             pHdr->sa[0],
             pHdr->sa[1],
             pHdr->sa[2],
@@ -505,24 +505,24 @@
     frameLen = WDA_GET_RX_PAYLOAD_LEN(pRxPacketInfo);
 
 
-    PELOGW(limLog(pMac, LOGW, "Recv AddTs Response\n");)
+    PELOGW(limLog(pMac, LOGW, "Recv AddTs Response");)
     if ((psessionEntry->limSystemRole == eLIM_AP_ROLE)||(psessionEntry->limSystemRole == eLIM_BT_AMP_AP_ROLE))
     {
-        PELOGW(limLog(pMac, LOGW, FL("AddTsRsp recvd at AP: ignoring\n"));)
+        PELOGW(limLog(pMac, LOGW, FL("AddTsRsp recvd at AP: ignoring"));)
         return;
     }
 
     pSta = dphLookupHashEntry(pMac, pHdr->sa, &aid, &psessionEntry->dph.dphHashTable);
     if (pSta == NULL)
     {
-        PELOGE(limLog(pMac, LOGE, FL("Station context not found - ignoring AddTsRsp\n"));)
+        PELOGE(limLog(pMac, LOGE, FL("Station context not found - ignoring AddTsRsp"));)
         return;
     }
 
     retval = sirConvertAddtsRsp2Struct(pMac, pBody, frameLen, &addts);
     if (retval != eSIR_SUCCESS)
     {
-        PELOGW(limLog(pMac, LOGW, FL("AddTsRsp parsing failed (error %d)\n"), retval);)
+        PELOGW(limLog(pMac, LOGW, FL("AddTsRsp parsing failed (error %d)"), retval);)
         return;
     }
 
@@ -531,13 +531,13 @@
     if (! pMac->lim.gLimAddtsSent)
     {
         // we never sent an addts request!
-        PELOGW(limLog(pMac, LOGW, "Recvd AddTsRsp but no request was ever sent - ignoring\n");)
+        PELOGW(limLog(pMac, LOGW, "Recvd AddTsRsp but no request was ever sent - ignoring");)
         return;
     }
 
     if (pMac->lim.gLimAddtsReq.req.dialogToken != addts.dialogToken)
     {
-        limLog(pMac, LOGW, "AddTsRsp: token mismatch (got %d, exp %d) - ignoring\n",
+        limLog(pMac, LOGW, "AddTsRsp: token mismatch (got %d, exp %d) - ignoring",
                addts.dialogToken, pMac->lim.gLimAddtsReq.req.dialogToken);
         return;
     }
@@ -557,17 +557,17 @@
         // add the classifier - this should always succeed
         if (addts.numTclas > 1) // currently no support for multiple tclas elements
         {
-            limLog(pMac, LOGE, FL("Sta %d: Too many Tclas (%d), only 1 supported\n"),
+            limLog(pMac, LOGE, FL("Sta %d: Too many Tclas (%d), only 1 supported"),
                    aid, addts.numTclas);
             return;
         }
         else if (addts.numTclas == 1)
         {
-            limLog(pMac, LOGW, "AddTs Response from STA %d: tsid %d, UP %d, OK!\n", aid,
+            limLog(pMac, LOGW, "AddTs Response from STA %d: tsid %d, UP %d, OK!", aid,
                    addts.tspec.tsinfo.traffic.tsid, addts.tspec.tsinfo.traffic.userPrio);
         }
     }
-    limLog(pMac, LOGW, "Recv AddTsRsp: tsid %d, UP %d, status %d \n",
+    limLog(pMac, LOGW, "Recv AddTsRsp: tsid %d, UP %d, status %d ",
           addts.tspec.tsinfo.traffic.tsid, addts.tspec.tsinfo.traffic.userPrio,
           addts.status);
 
@@ -576,7 +576,7 @@
 
     if (addts.status != eSIR_MAC_SUCCESS_STATUS)
     {
-        limLog(pMac, LOGW, "Recv AddTsRsp: tsid %d, UP %d, status %d \n",
+        limLog(pMac, LOGW, "Recv AddTsRsp: tsid %d, UP %d, status %d ",
               addts.tspec.tsinfo.traffic.tsid, addts.tspec.tsinfo.traffic.userPrio,
               addts.status);
         limSendSmeAddtsRsp(pMac, true, addts.status, psessionEntry, addts.tspec, 
@@ -590,7 +590,7 @@
 #ifdef FEATURE_WLAN_CCX
     if (addts.tsmPresent)
     {
-        limLog(pMac, LOGW, "TSM IE Present\n");
+        limLog(pMac, LOGW, "TSM IE Present");
         psessionEntry->ccxContext.tsm.tid = addts.tspec.tsinfo.traffic.userPrio;
         vos_mem_copy(&psessionEntry->ccxContext.tsm.tsmInfo,
                                          &addts.tsmIE,sizeof(tSirMacCCXTSMIE));
@@ -642,7 +642,7 @@
             limSendEdcaParams(pMac, psessionEntry->gLimEdcaParamsActive, pStaDs->bssId, eANI_BOOLEAN_FALSE);
     }
     else
-        limLog(pMac, LOGE, FL("Self entry missing in Hash Table \n"));
+        limLog(pMac, LOGE, FL("Self entry missing in Hash Table "));
 
         
     sirCopyMacAddr(peerMacAddr,psessionEntry->bssId);
@@ -652,7 +652,7 @@
       addts.schedule.svcInterval = 0;
     if(eSIR_SUCCESS != limTspecAdd(pMac, pSta->staAddr, pSta->assocId, &addts.tspec,  addts.schedule.svcInterval, &tspecInfo))
     {
-        PELOGE(limLog(pMac, LOGE, FL("Adding entry in lim Tspec Table failed \n"));)
+        PELOGE(limLog(pMac, LOGE, FL("Adding entry in lim Tspec Table failed "));)
         limSendDeltsReqActionFrame(pMac, peerMacAddr, rspReqd, &addts.tspec.tsinfo, &addts.tspec,
                 psessionEntry);
         pMac->lim.gLimAddtsSent = false;
@@ -676,14 +676,14 @@
             pMac->lim.gLimAddtsSent = false;
             return;
         }
-        PELOGW(limLog(pMac, LOGW, FL("AddTsRsp received successfully(UP %d, TSID %d)\n"),
+        PELOGW(limLog(pMac, LOGW, FL("AddTsRsp received successfully(UP %d, TSID %d)"),
            addts.tspec.tsinfo.traffic.userPrio, addts.tspec.tsinfo.traffic.tsid);)
     }
     else
     {
-        PELOGW(limLog(pMac, LOGW, FL("AddTsRsp received successfully(UP %d, TSID %d)\n"),
+        PELOGW(limLog(pMac, LOGW, FL("AddTsRsp received successfully(UP %d, TSID %d)"),
                addts.tspec.tsinfo.traffic.userPrio, addts.tspec.tsinfo.traffic.tsid);)
-        PELOGW(limLog(pMac, LOGW, FL("no ACM: Bypass sending WDA_ADD_TS_REQ to HAL \n"));)
+        PELOGW(limLog(pMac, LOGW, FL("no ACM: Bypass sending WDA_ADD_TS_REQ to HAL "));)
         // Use the smesessionId and smetransactionId from the PE session context
         limSendSmeAddtsRsp(pMac, true, eSIR_SME_SUCCESS, psessionEntry, addts.tspec,
                 psessionEntry->smeSessionId, psessionEntry->transactionId);
@@ -719,7 +719,7 @@
     pSta = dphLookupHashEntry(pMac, pHdr->sa, &aid, &psessionEntry->dph.dphHashTable);
     if (pSta == NULL)
     {
-        PELOGE(limLog(pMac, LOGE, FL("Station context not found - ignoring DelTs\n"));)
+        PELOGE(limLog(pMac, LOGE, FL("Station context not found - ignoring DelTs"));)
         return;
     }
 
@@ -727,7 +727,7 @@
     retval = sirConvertDeltsReq2Struct(pMac, pBody, frameLen, &delts);
     if (retval != eSIR_SUCCESS)
     {
-        PELOGW(limLog(pMac, LOGW, FL("DelTs parsing failed (error %d)\n"), retval);)
+        PELOGW(limLog(pMac, LOGW, FL("DelTs parsing failed (error %d)"), retval);)
         return;
     }
 
@@ -735,22 +735,22 @@
     {
         if ((!psessionEntry->limWmeEnabled) || (! pSta->wmeEnabled))
         {
-            PELOGW(limLog(pMac, LOGW, FL("Ignoring delts request: wme not enabled/capable\n"));)
+            PELOGW(limLog(pMac, LOGW, FL("Ignoring delts request: wme not enabled/capable"));)
             return;
         }
-        PELOG2(limLog(pMac, LOG2, FL("WME Delts received\n"));)
+        PELOG2(limLog(pMac, LOG2, FL("WME Delts received"));)
     }
     else if ((psessionEntry->limQosEnabled) && pSta->lleEnabled)
         {
-        PELOG2(limLog(pMac, LOG2, FL("11e QoS Delts received\n"));)
+        PELOG2(limLog(pMac, LOG2, FL("11e QoS Delts received"));)
         }
     else if ((psessionEntry->limWsmEnabled) && pSta->wsmEnabled)
         {
-        PELOG2(limLog(pMac, LOG2, FL("WSM Delts received\n"));)
+        PELOG2(limLog(pMac, LOG2, FL("WSM Delts received"));)
         }
     else
     {
-        PELOGW(limLog(pMac, LOGW, FL("Ignoring delts request: qos not enabled/capable\n"));)
+        PELOGW(limLog(pMac, LOGW, FL("Ignoring delts request: qos not enabled/capable"));)
         return;
     }
 
@@ -762,7 +762,7 @@
     
         if ((upToAc(tsinfo->traffic.userPrio) >= MAX_NUM_AC) || (! psessionEntry->gLimEdcaParams[upToAc(tsinfo->traffic.userPrio)].aci.acm))
         {
-            limLog(pMac, LOGW, FL("DelTs with UP %d has no AC - ignoring request\n"),
+            limLog(pMac, LOGW, FL("DelTs with UP %d has no AC - ignoring request"),
                    tsinfo->traffic.userPrio);
             return;
         }
@@ -771,7 +771,7 @@
     // try to delete the TS
     if (eSIR_SUCCESS != limAdmitControlDeleteTS(pMac, pSta->assocId, tsinfo, &tsStatus, &tspecIdx))
     {
-        PELOGW(limLog(pMac, LOGW, FL("Unable to Delete TS\n"));)
+        PELOGW(limLog(pMac, LOGW, FL("Unable to Delete TS"));)
         return;
     }
 
@@ -785,7 +785,7 @@
       //send message to HAL to delete TS
       if(eSIR_SUCCESS != limSendHalMsgDelTs(pMac, pSta->staIndex, tspecIdx, delts, psessionEntry->peSessionId))
       {
-        limLog(pMac, LOGW, FL("DelTs with UP %d failed in limSendHalMsgDelTs - ignoring request\n"),
+        limLog(pMac, LOGW, FL("DelTs with UP %d failed in limSendHalMsgDelTs - ignoring request"),
                          tsinfo->traffic.userPrio);
          return;
       }
@@ -840,9 +840,9 @@
             limSendEdcaParams(pMac, psessionEntry->gLimEdcaParamsActive, pStaDs->bssId, eANI_BOOLEAN_FALSE);
     }
     else
-        limLog(pMac, LOGE, FL("Self entry missing in Hash Table \n"));
+        limLog(pMac, LOGE, FL("Self entry missing in Hash Table "));
 
-    PELOG1(limLog(pMac, LOG1, FL("DeleteTS succeeded\n"));)
+    PELOG1(limLog(pMac, LOG1, FL("DeleteTS succeeded"));)
     if((psessionEntry->limSystemRole != eLIM_AP_ROLE)&&(psessionEntry->limSystemRole != eLIM_BT_AMP_AP_ROLE))
       limSendSmeDeltsInd(pMac, &delts, aid,psessionEntry);
 
@@ -885,7 +885,7 @@
                                pMeasReqFrame,
                                peerMacAddr) != eSIR_SUCCESS)
     {
-        PELOGE(limLog(pMac, LOGE, FL("fail to send Basic Meas report \n"));)
+        PELOGE(limLog(pMac, LOGE, FL("fail to send Basic Meas report "));)
         return;
     }
 }
@@ -922,7 +922,7 @@
                                pMeasReqFrame,
                                peerMacAddr) != eSIR_SUCCESS)
     {
-        PELOGE(limLog(pMac, LOGE, FL("fail to send CCA Meas report \n"));)
+        PELOGE(limLog(pMac, LOGE, FL("fail to send CCA Meas report "));)
         return;
     }
 }
@@ -956,7 +956,7 @@
                                pMeasReqFrame,
                                peerMacAddr) != eSIR_SUCCESS)
     {
-        PELOGE(limLog(pMac, LOGE, FL("fail to send RPI Meas report \n"));)
+        PELOGE(limLog(pMac, LOGE, FL("fail to send RPI Meas report "));)
         return;
     }
 }
@@ -994,14 +994,14 @@
         palAllocateMemory( pMac->hHdd, (void **)&pMeasReqFrame, sizeof( tSirMacMeasReqActionFrame ) ) )
     {
         limLog(pMac, LOGE,
-            FL("limProcessMeasurementRequestFrame: palAllocateMemory failed \n"));
+            FL("limProcessMeasurementRequestFrame: palAllocateMemory failed "));
         return;
     }
 
     if (sirConvertMeasReqFrame2Struct(pMac, pBody, pMeasReqFrame, frameLen) !=
         eSIR_SUCCESS)
     {
-        PELOGW(limLog(pMac, LOGW, FL("Rcv invalid Measurement Request Action Frame \n"));)
+        PELOGW(limLog(pMac, LOGW, FL("Rcv invalid Measurement Request Action Frame "));)
         return;
     }
 
@@ -1021,7 +1021,7 @@
             break;
 
         default:
-            PELOG1(limLog(pMac, LOG1, FL("Unknown Measurement Type %d \n"),
+            PELOG1(limLog(pMac, LOG1, FL("Unknown Measurement Type %d "),
                    pMeasReqFrame->measReqIE.measType);)
             break;
     }
@@ -1059,14 +1059,14 @@
     if ( eHAL_STATUS_SUCCESS !=
         palAllocateMemory( pMac->hHdd, (void **)&pTpcReqFrame, sizeof( tSirMacTpcReqActionFrame ) ) )
     {
-        PELOGE(limLog(pMac, LOGE, FL("palAllocateMemory failed \n"));)
+        PELOGE(limLog(pMac, LOGE, FL("palAllocateMemory failed "));)
         return;
     }
 
     if (sirConvertTpcReqFrame2Struct(pMac, pBody, pTpcReqFrame, frameLen) !=
         eSIR_SUCCESS)
     {
-        PELOGW(limLog(pMac, LOGW, FL("Rcv invalid TPC Req Action Frame \n"));)
+        PELOGW(limLog(pMac, LOGW, FL("Rcv invalid TPC Req Action Frame "));)
         return;
     }
 
@@ -1074,7 +1074,7 @@
                               pTpcReqFrame,
                               pHdr->sa) != eSIR_SUCCESS)
     {
-        PELOGE(limLog(pMac, LOGE, FL("fail to send TPC Report Frame. \n"));)
+        PELOGE(limLog(pMac, LOGE, FL("fail to send TPC Report Frame. "));)
         return;
     }
 }
@@ -1161,11 +1161,11 @@
       statusCode = eSIR_MAC_SUCCESS_STATUS;
 
       limLog( pMac, LOGW,
-          FL("Valid DELBA Ind received. Time to send WDA_DELBA_IND to HAL...\n"));
+          FL("Valid DELBA Ind received. Time to send WDA_DELBA_IND to HAL..."));
     }
     else
       limLog( pMac, LOGW,
-          FL("Received an INVALID DELBA Ind for TID %d...\n"),
+          FL("Received an INVALID DELBA Ind for TID %d..."),
           baParameterSet.tid );
 
   return statusCode;
@@ -1204,7 +1204,7 @@
     if( DOT11F_FAILED( nStatus ))
     {
         limLog( pMac, LOGE,
-            FL("Failed to unpack and parse an ADDBA Request (0x%08x, %d bytes):\n"),
+            FL("Failed to unpack and parse an ADDBA Request (0x%08x, %d bytes):"),
             nStatus,
             frameLen );
 
@@ -1216,7 +1216,7 @@
     else if ( DOT11F_WARNED( nStatus ) )
     {
         limLog( pMac, LOGW,
-            FL( "There were warnings while unpacking an ADDBA Request (0x%08x, %d bytes):\n"),
+            FL( "There were warnings while unpacking an ADDBA Request (0x%08x, %d bytes):"),
             nStatus,
             frameLen );
 
@@ -1227,7 +1227,7 @@
     if( pSta == NULL )
     {
         limLog( pMac, LOGE,
-            FL( "STA context not found - ignoring ADDBA from \n" ));
+            FL( "STA context not found - ignoring ADDBA from " ));
         limPrintMacAddr( pMac, pHdr->sa, LOGW );
 
         // FIXME - Should we do this?
@@ -1236,7 +1236,7 @@
     }
 
     limLog( pMac, LOGW,
-      FL( "ADDBA Req from STA with AID %d, tid = %d\n" ),
+      FL( "ADDBA Req from STA with AID %d, tid = %d" ),
       aid, frmAddBAReq.AddBAParameterSet.tid);
 
 #ifdef WLAN_SOFTAP_VSTA_FEATURE
@@ -1272,7 +1272,7 @@
 
   // Check if the ADD BA Declined configuration is Disabled
     if ((pMac->lim.gAddBA_Declined & ( 1 << frmAddBAReq.AddBAParameterSet.tid ) )) {
-        limLog( pMac, LOGE, FL( "Declined the ADDBA Req for the TID %d  \n" ),
+        limLog( pMac, LOGE, FL( "Declined the ADDBA Req for the TID %d  " ),
                         frmAddBAReq.AddBAParameterSet.tid);
         status = eSIR_MAC_REQ_DECLINED_STATUS;
         goto returnAfterError;
@@ -1290,13 +1290,13 @@
     
   if (wlan_cfgGetInt(pMac, WNI_CFG_NUM_BUFF_ADVERT , &val) != eSIR_SUCCESS)
     {
-        limLog(pMac, LOGP, FL("Unable to get WNI_CFG_NUM_BUFF_ADVERT  \n"));
+        limLog(pMac, LOGP, FL("Unable to get WNI_CFG_NUM_BUFF_ADVERT  "));
         return ;
     }
         
         frmAddBAReq.AddBAParameterSet.bufferSize=
             VOS_MIN(val,frmAddBAReq.AddBAParameterSet.bufferSize);
-        limLog( pMac, LOGE, FL( "ADDBAREQ NUMBUFF %d  \n" ),
+        limLog( pMac, LOGE, FL( "ADDBAREQ NUMBUFF %d  " ),
                         frmAddBAReq.AddBAParameterSet.bufferSize);
 
   if( eSIR_SUCCESS != limPostMsgAddBAReq( pMac,
@@ -1366,7 +1366,7 @@
   if( pSta == NULL )
   {
     limLog( pMac, LOGE,
-        FL( "STA context not found - ignoring ADDBA from \n" ));
+        FL( "STA context not found - ignoring ADDBA from " ));
     limPrintMacAddr( pMac, pHdr->sa, LOGW );
     return;
   }
@@ -1385,7 +1385,7 @@
   if( DOT11F_FAILED( nStatus ))
   {
     limLog( pMac, LOGE,
-        FL( "Failed to unpack and parse an ADDBA Response (0x%08x, %d bytes):\n"),
+        FL( "Failed to unpack and parse an ADDBA Response (0x%08x, %d bytes):"),
         nStatus,
         frameLen );
 
@@ -1395,7 +1395,7 @@
   else if ( DOT11F_WARNED( nStatus ) )
   {
     limLog( pMac, LOGW,
-        FL( "There were warnings while unpacking an ADDBA Response (0x%08x, %d bytes):\n"),
+        FL( "There were warnings while unpacking an ADDBA Response (0x%08x, %d bytes):"),
         nStatus,
         frameLen );
 
@@ -1403,7 +1403,7 @@
   }
 
   limLog( pMac, LOGW,
-      FL( "ADDBA Rsp from STA with AID %d, tid = %d, status = %d\n" ),
+      FL( "ADDBA Rsp from STA with AID %d, tid = %d, status = %d" ),
       aid, frmAddBARsp.AddBAParameterSet.tid, frmAddBARsp.Status.status);
 
   //if there is no matchin dialougue token then ignore the response.
@@ -1411,7 +1411,7 @@
   if(eSIR_SUCCESS != limSearchAndDeleteDialogueToken(pMac, frmAddBARsp.DialogToken.token,
         pSta->assocId, frmAddBARsp.AddBAParameterSet.tid))
   {
-      PELOGW(limLog(pMac, LOGW, FL("dialogueToken in received addBARsp did not match with outstanding requests\n"));)
+      PELOGW(limLog(pMac, LOGW, FL("dialogueToken in received addBARsp did not match with outstanding requests"));)
       return;
   }
 
@@ -1515,19 +1515,19 @@
   pSta = dphLookupHashEntry( pMac, pHdr->sa, &aid, &psessionEntry->dph.dphHashTable );
   if( pSta == NULL )
   {
-    limLog( pMac, LOGE, FL( "STA context not found - ignoring DELBA from \n"));
+    limLog( pMac, LOGE, FL( "STA context not found - ignoring DELBA from "));
     limPrintMacAddr( pMac, pHdr->sa, LOGW );
     return;
   }
 
-  limLog( pMac, LOG1, FL( "DELBA Ind from STA with AID %d\n" ), aid );
+  limLog( pMac, LOG1, FL( "DELBA Ind from STA with AID %d" ), aid );
 
   // Unpack the received frame
   nStatus = dot11fUnpackDelBAInd( pMac, pBody, frameLen, &frmDelBAInd );
   if( DOT11F_FAILED( nStatus ))
   {
     limLog( pMac, LOGE,
-        FL( "Failed to unpack and parse a DELBA Indication (0x%08x, %d bytes):\n"),
+        FL( "Failed to unpack and parse a DELBA Indication (0x%08x, %d bytes):"),
         nStatus,
         frameLen );
 
@@ -1537,7 +1537,7 @@
   else if ( DOT11F_WARNED( nStatus ) )
   {
     limLog( pMac, LOGW,
-        FL( "There were warnings while unpacking a DELBA Indication (0x%08x, %d bytes):\n"),
+        FL( "There were warnings while unpacking a DELBA Indication (0x%08x, %d bytes):"),
         nStatus,
         frameLen );
 
@@ -1545,7 +1545,7 @@
   }
 
   limLog( pMac, LOGW,
-      FL( "Received DELBA for TID %d, Reason code %d\n" ),
+      FL( "Received DELBA for TID %d, Reason code %d" ),
       frmDelBAInd.DelBAParameterSet.tid,
       frmDelBAInd.Reason.code );
 
@@ -1567,7 +1567,7 @@
         (tANI_U8) frmDelBAInd.DelBAParameterSet.tid,
         (eBA_RECIPIENT == frmDelBAInd.DelBAParameterSet.initiator)?
           eBA_INITIATOR: eBA_RECIPIENT,psessionEntry))
-    limLog( pMac, LOGE, FL( "Posting WDA_DELBA_IND to HAL failed \n"));
+    limLog( pMac, LOGE, FL( "Posting WDA_DELBA_IND to HAL failed "));
 
   return;
 
@@ -1592,7 +1592,7 @@
 
         pSta = dphLookupHashEntry(pMac, pHdr->sa, &aid, &psessionEntry->dph.dphHashTable );
         if( pSta == NULL ) {
-            limLog( pMac, LOGE,FL( "STA context not found - ignoring UpdateSM PSave Mode from \n" ));
+            limLog( pMac, LOGE,FL( "STA context not found - ignoring UpdateSM PSave Mode from " ));
             limPrintMacAddr( pMac, pHdr->sa, LOGW );
             return;
         }
@@ -1601,12 +1601,12 @@
         nStatus = dot11fUnpackSMPowerSave( pMac, pBody, frameLen, &frmSMPower);
 
         if( DOT11F_FAILED( nStatus )) {
-            limLog( pMac, LOGE, FL( "Failed to unpack and parse a Update SM Power (0x%08x, %d bytes):\n"),
+            limLog( pMac, LOGE, FL( "Failed to unpack and parse a Update SM Power (0x%08x, %d bytes):"),
                                                     nStatus, frameLen );
             PELOG2(sirDumpBuf( pMac, SIR_DBG_MODULE_ID, LOG2, pBody, frameLen );)
             return;
         }else if ( DOT11F_WARNED( nStatus ) ) {
-            limLog(pMac, LOGW, FL( "There were warnings while unpacking a SMPower Save update (0x%08x, %d bytes):\n"),
+            limLog(pMac, LOGW, FL( "There were warnings while unpacking a SMPower Save update (0x%08x, %d bytes):"),
                                 nStatus, frameLen );
             PELOG2(sirDumpBuf( pMac, SIR_DBG_MODULE_ID, LOG2, pBody, frameLen );)
         }
@@ -1663,12 +1663,12 @@
      nStatus = dot11fUnpackRadioMeasurementRequest( pMac, pBody, frameLen, &frm );
 
      if( DOT11F_FAILED( nStatus )) {
-          limLog( pMac, LOGE, FL( "Failed to unpack and parse a Radio Measure request (0x%08x, %d bytes):\n"),
+          limLog( pMac, LOGE, FL( "Failed to unpack and parse a Radio Measure request (0x%08x, %d bytes):"),
                     nStatus, frameLen );
           PELOG2(sirDumpBuf( pMac, SIR_DBG_MODULE_ID, LOG2, pBody, frameLen );)
                return;
      }else if ( DOT11F_WARNED( nStatus ) ) {
-          limLog(pMac, LOGW, FL( "There were warnings while unpacking a Radio Measure request (0x%08x, %d bytes):\n"),
+          limLog(pMac, LOGW, FL( "There were warnings while unpacking a Radio Measure request (0x%08x, %d bytes):"),
                     nStatus, frameLen );
           PELOG2(sirDumpBuf( pMac, SIR_DBG_MODULE_ID, LOG2, pBody, frameLen );)
      }
@@ -1699,12 +1699,12 @@
      nStatus = dot11fUnpackLinkMeasurementRequest( pMac, pBody, frameLen, &frm );
 
      if( DOT11F_FAILED( nStatus )) {
-          limLog( pMac, LOGE, FL( "Failed to unpack and parse a Link Measure request (0x%08x, %d bytes):\n"),
+          limLog( pMac, LOGE, FL( "Failed to unpack and parse a Link Measure request (0x%08x, %d bytes):"),
                     nStatus, frameLen );
           PELOG2(sirDumpBuf( pMac, SIR_DBG_MODULE_ID, LOG2, pBody, frameLen );)
                return;
      }else if ( DOT11F_WARNED( nStatus ) ) {
-          limLog(pMac, LOGW, FL( "There were warnings while unpacking a Link Measure request (0x%08x, %d bytes):\n"),
+          limLog(pMac, LOGW, FL( "There were warnings while unpacking a Link Measure request (0x%08x, %d bytes):"),
                     nStatus, frameLen );
           PELOG2(sirDumpBuf( pMac, SIR_DBG_MODULE_ID, LOG2, pBody, frameLen );)
      }
@@ -1730,7 +1730,7 @@
      if(eHAL_STATUS_SUCCESS != palAllocateMemory(pMac->hHdd, 
                                                  (void **)&pFrm, sizeof(tDot11fNeighborReportResponse)))
      {
-         limLog(pMac, LOGE, FL("Unable to PAL allocate memory in __limProcessNeighborReport\n") );
+         limLog(pMac, LOGE, FL("Unable to PAL allocate memory in __limProcessNeighborReport") );
          return;
      }
 
@@ -1744,13 +1744,13 @@
      nStatus = dot11fUnpackNeighborReportResponse( pMac, pBody, frameLen,pFrm );
 
      if( DOT11F_FAILED( nStatus )) {
-          limLog( pMac, LOGE, FL( "Failed to unpack and parse a Neighbor report response (0x%08x, %d bytes):\n"),
+          limLog( pMac, LOGE, FL( "Failed to unpack and parse a Neighbor report response (0x%08x, %d bytes):"),
                     nStatus, frameLen );
           PELOG2(sirDumpBuf( pMac, SIR_DBG_MODULE_ID, LOG2, pBody, frameLen );)
           palFreeMemory(pMac->hHdd, pFrm);
           return;
      }else if ( DOT11F_WARNED( nStatus ) ) {
-          limLog(pMac, LOGW, FL( "There were warnings while unpacking a Neighbor report response (0x%08x, %d bytes):\n"),
+          limLog(pMac, LOGW, FL( "There were warnings while unpacking a Neighbor report response (0x%08x, %d bytes):"),
                     nStatus, frameLen );
           PELOG2(sirDumpBuf( pMac, SIR_DBG_MODULE_ID, LOG2, pBody, frameLen );)
      }
@@ -1909,7 +1909,7 @@
                         break;
 
                     default:
-                        PELOGE(limLog(pMac, LOGE, FL("Qos action %d not handled."), pActionHdr->actionID);)
+                        PELOGE(limLog(pMac, LOGE, FL("Qos action %d not handled"), pActionHdr->actionID);)
                         break;
                 }
                 break ;
@@ -1955,7 +1955,7 @@
                     }
                     break;
                 default:
-                    PELOGE(limLog(pMac, LOGE, FL("Spectrum mgmt action id %d not handled."), pActionHdr->actionID);)
+                    PELOGE(limLog(pMac, LOGE, FL("Spectrum mgmt action id %d not handled"), pActionHdr->actionID);)
                     break;
             }
             break;
@@ -1963,7 +1963,7 @@
         case SIR_MAC_ACTION_WME:
             if (! psessionEntry->limWmeEnabled)
             {
-                limLog(pMac, LOGW, FL("WME mode disabled - dropping action frame %d."),
+                limLog(pMac, LOGW, FL("WME mode disabled - dropping action frame %d"),
                        pActionHdr->actionID);
                 break;
             }
@@ -1982,7 +1982,7 @@
                     break;
 
                 default:
-                    PELOGE(limLog(pMac, LOGE, FL("WME action %d not handled."), pActionHdr->actionID);)
+                    PELOGE(limLog(pMac, LOGE, FL("WME action %d not handled"), pActionHdr->actionID);)
                     break;
             }
             break;
@@ -2023,7 +2023,7 @@
             __limProcessSMPowerSaveUpdate(pMac, (tANI_U8 *) pRxPacketInfo,psessionEntry);
             break;
         default:
-            PELOGE(limLog(pMac, LOGE, FL("Action ID %d not handled in HT Action category."), pActionHdr->actionID);)
+            PELOGE(limLog(pMac, LOGE, FL("Action ID %d not handled in HT Action category"), pActionHdr->actionID);)
             break;
         }
         break;
@@ -2051,7 +2051,7 @@
                     __limProcessNeighborReport( pMac, (tANI_U8*) pRxPacketInfo, psessionEntry );
                     break;
                 default:
-                    PELOGE( limLog( pMac, LOGE, FL("Action ID %d not handled in RRM."), pActionHdr->actionID);)
+                    PELOGE( limLog( pMac, LOGE, FL("Action ID %d not handled in RRM"), pActionHdr->actionID);)
                     break;
 
             }
@@ -2059,7 +2059,7 @@
         else
         {
             // Else we will just ignore the RRM messages.
-            PELOGE( limLog( pMac, LOGE, FL("RRM Action frame ignored as RRM is disabled in cfg."));)
+            PELOGE( limLog( pMac, LOGE, FL("RRM Action frame ignored as RRM is disabled in cfg"));)
         }
         break;
 #endif
@@ -2086,7 +2086,7 @@
               }
               else
               {
-                 limLog( pMac, LOGE, FL("Unhandled public action frame (Vendor specific). OUI %x %x %x %x\n"),
+                 limLog( pMac, LOGE, FL("Unhandled public action frame (Vendor specific). OUI %x %x %x %x"),
                       pPubAction->Oui[0], pPubAction->Oui[1], pPubAction->Oui[2], pPubAction->Oui[3] );
               }
            }
@@ -2095,7 +2095,7 @@
            case SIR_MAC_TDLS_DIS_RSP:
            {
 #ifdef FEATURE_WLAN_TDLS_INTERNAL
-               //LIM_LOG_TDLS(printk("Public Action TDLS Discovery RSP ..\n")) ;
+               //LIM_LOG_TDLS(printk("Public Action TDLS Discovery RSP ..")) ;
                limProcessTdlsPublicActionFrame(pMac, (tANI_U32*)pRxPacketInfo, psessionEntry) ;
 #else
                tpSirMacMgmtHdr     pHdr;
@@ -2106,7 +2106,7 @@
                frameLen = WDA_GET_RX_PAYLOAD_LEN(pRxPacketInfo);
                rssi = WDA_GET_RX_RSSI_DB(pRxPacketInfo);
                VOS_TRACE(VOS_MODULE_ID_PE, VOS_TRACE_LEVEL_INFO, 
-                                    ("Public Action TDLS Discovery RSP ..\n")) ;
+                                    ("Public Action TDLS Discovery RSP ..")) ;
                limSendSmeMgmtFrameInd(pMac, pHdr->fc.subType, 
                   (tANI_U8*)pHdr, frameLen + sizeof(tSirMacMgmtHdr), 0, 
                   WDA_GET_RX_CH( pRxPacketInfo ), psessionEntry, rssi);
@@ -2116,7 +2116,7 @@
 #endif
 
         default:
-            PELOGE(limLog(pMac, LOGE, FL("Unhandled public action frame -- %x \n"), pActionHdr->actionID);)
+            PELOGE(limLog(pMac, LOGE, FL("Unhandled public action frame -- %x "), pActionHdr->actionID);)
             break;
         }
         break;
@@ -2161,7 +2161,7 @@
     }
 #endif
     default:
-       PELOGE(limLog(pMac, LOGE, FL("Action category %d not handled\n"), pActionHdr->category);)
+       PELOGE(limLog(pMac, LOGE, FL("Action category %d not handled"), pActionHdr->category);)
        break;
     }
 }
@@ -2218,18 +2218,18 @@
                 }
                 else
                 {
-                  limLog( pMac, LOGE, FL("Unhandled public action frame (Vendor specific). OUI %x %x %x %x\n"),
+                  limLog( pMac, LOGE, FL("Unhandled public action frame (Vendor specific). OUI %x %x %x %x"),
                       pActionHdr->Oui[0], pActionHdr->Oui[1], pActionHdr->Oui[2], pActionHdr->Oui[3] );
                 }
               }
                break;
             default:
-               PELOGE(limLog(pMac, LOGE, FL("Unhandled public action frame -- %x \n"), pActionHdr->actionID);)
+               PELOGE(limLog(pMac, LOGE, FL("Unhandled public action frame -- %x "), pActionHdr->actionID);)
                   break;
          }
          break;
       default:
-         PELOGE(limLog(pMac, LOG1, FL("Unhandled action frame without session -- %x \n"), pActionHdr->category);)
+         PELOGE(limLog(pMac, LOG1, FL("Unhandled action frame without session -- %x "), pActionHdr->category);)
             break;
 
    }
diff --git a/CORE/MAC/src/pe/lim/limProcessAssocReqFrame.c b/CORE/MAC/src/pe/lim/limProcessAssocReqFrame.c
index ba3b7d5..eae7010 100644
--- a/CORE/MAC/src/pe/lim/limProcessAssocReqFrame.c
+++ b/CORE/MAC/src/pe/lim/limProcessAssocReqFrame.c
@@ -101,7 +101,7 @@
 
     if(assocReq->supportedChannels.length >= SIR_MAX_SUPPORTED_CHANNEL_LIST)
     {
-        limLog(pMac, LOG1, FL("Number of supported channels:%d is more than MAX\n"),
+        limLog(pMac, LOG1, FL("Number of supported channels:%d is more than MAX"),
                               assocReq->supportedChannels.length);
         pMlmAssocInd->supportedChannels.numChnl = 0;
         return;
@@ -121,7 +121,7 @@
         }
         // Get Number of Channels in a Subband
         numberOfChannel = assocReq->supportedChannels.supportedChannels[i];
-        PELOG2(limLog(pMac, LOG2, FL("Rcv AssocReq: chnl=%d, numOfChnl=%d \n"),
+        PELOG2(limLog(pMac, LOG2, FL("Rcv AssocReq: chnl=%d, numOfChnl=%d "),
                               firstChannelNumber, numberOfChannel);)
 
         if (numberOfChannel > 1)
@@ -160,7 +160,7 @@
 
     pMlmAssocInd->supportedChannels.numChnl = (tANI_U8) index;
    PELOG2(limLog(pMac, LOG2,
-        FL("Send AssocInd to WSM: spectrum ON, minPwr %d, maxPwr %d, numChnl %d\n"),
+        FL("Send AssocInd to WSM: spectrum ON, minPwr %d, maxPwr %d, numChnl %d"),
         pMlmAssocInd->powerCap.minTxPower,
         pMlmAssocInd->powerCap.maxTxPower,
         pMlmAssocInd->supportedChannels.numChnl);)
@@ -249,7 +249,7 @@
                     1,
                     pHdr->sa,
                     subType, 0,psessionEntry);
-        limLog(pMac, LOGE, FL("Rejected Assoc Req frame Since same mac as SAP/GO\n"));
+        limLog(pMac, LOGE, FL("Rejected Assoc Req frame Since same mac as SAP/GO"));
         return ;
     }
 
@@ -267,7 +267,7 @@
     // Allocate memory for the Assoc Request frame
     if ( palAllocateMemory(pMac->hHdd, (void **)&pAssocReq, sizeof(*pAssocReq)) != eHAL_STATUS_SUCCESS)
     {
-        limLog(pMac, LOGP, FL("PAL Allocate Memory failed in AssocReq\n"));
+        limLog(pMac, LOGP, FL("PAL Allocate Memory failed in AssocReq"));
         return;
     }
     palZeroMemory( pMac->hHdd, (void *)pAssocReq , sizeof(*pAssocReq));
@@ -280,7 +280,7 @@
 
     if (status != eSIR_SUCCESS)
     {
-        limLog(pMac, LOGW, FL("Parse error AssocRequest, length=%d from \n"),framelen);
+        limLog(pMac, LOGW, FL("Parse error AssocRequest, length=%d from "),framelen);
         limPrintMacAddr(pMac, pHdr->sa, LOGW);
         limSendAssocRspMgmtFrame(pMac, eSIR_MAC_UNSPEC_FAILURE_STATUS, 1, pHdr->sa, subType, 0, psessionEntry);
         goto error;
@@ -288,7 +288,7 @@
 
     if ( palAllocateMemory(pMac->hHdd, (void **)&pAssocReq->assocReqFrame, framelen) != eHAL_STATUS_SUCCESS) 
     {
-        limLog(pMac, LOGE, FL("Unable to allocate memory for the assoc req, length=%d from \n"),framelen);
+        limLog(pMac, LOGE, FL("Unable to allocate memory for the assoc req, length=%d from "),framelen);
         goto error;
     }
     
@@ -298,7 +298,7 @@
 
     if (cfgGetCapabilityInfo(pMac, &temp,psessionEntry) != eSIR_SUCCESS)
     {
-        limLog(pMac, LOGP, FL("could not retrieve Capabilities\n"));
+        limLog(pMac, LOGP, FL("could not retrieve Capabilities"));
         goto error;
     }
     limCopyU16((tANI_U8 *) &localCapabilities, temp);
@@ -319,7 +319,7 @@
                         pHdr->sa,
                         subType, 0,psessionEntry);
 
-        limLog(pMac, LOGW, FL("local caps 0x%x received 0x%x\n"), localCapabilities, pAssocReq->capabilityInfo);
+        limLog(pMac, LOGW, FL("local caps 0x%x received 0x%x"), localCapabilities, pAssocReq->capabilityInfo);
 
         // Log error
         if (subType == LIM_ASSOC)
@@ -352,10 +352,10 @@
         // Log error
         if (subType == LIM_ASSOC)
             limLog(pMac, LOGW,
-                   FL("received Assoc req with unmatched SSID from \n"));
+                   FL("received Assoc req with unmatched SSID from "));
         else
             limLog(pMac, LOGW,
-                   FL("received ReAssoc req with unmatched SSID from \n"));
+                   FL("received ReAssoc req with unmatched SSID from "));
         limPrintMacAddr(pMac, pHdr->sa, LOGW);
         goto error;
     }
@@ -395,10 +395,10 @@
         // Log error
         if (subType == LIM_ASSOC)
             limLog(pMac, LOGW,
-               FL("received Assoc req with unsupported rates from \n"));
+               FL("received Assoc req with unsupported rates from "));
         else
             limLog(pMac, LOGW,
-               FL("received ReAssoc req with unsupported rates from\n"));
+               FL("received ReAssoc req with unsupported rates from"));
         limPrintMacAddr(pMac, pHdr->sa, LOGW);
         goto error;
     }
@@ -410,7 +410,7 @@
     {
         limSendAssocRspMgmtFrame( pMac, eSIR_MAC_CAPABILITIES_NOT_SUPPORTED_STATUS, 
                                   1, pHdr->sa, subType, 0, psessionEntry );
-        limLog(pMac, LOGE, FL("SOFTAP was in 11G only mode, rejecting legacy STA's\n"));
+        limLog(pMac, LOGE, FL("SOFTAP was in 11G only mode, rejecting legacy STA's"));
         goto error;
 
     }//end if phyMode == 11G_only
@@ -421,7 +421,7 @@
     {
         limSendAssocRspMgmtFrame( pMac, eSIR_MAC_CAPABILITIES_NOT_SUPPORTED_STATUS, 
                                   1, pHdr->sa, subType, 0, psessionEntry );
-        limLog(pMac, LOGE, FL("SOFTAP was in 11N only mode, rejecting legacy STA's\n"));
+        limLog(pMac, LOGE, FL("SOFTAP was in 11N only mode, rejecting legacy STA's"));
         goto error;
     }//end if PhyMode == 11N_only
 
@@ -442,16 +442,16 @@
                 if (!pAssocReq->powerCapabilityPresent)
                 {
                     if(subType == LIM_ASSOC)
-                       limLog(pMac, LOG1, FL("LIM Info: Missing Power capability IE in assoc request\n"));
+                       limLog(pMac, LOG1, FL("LIM Info: Missing Power capability IE in assoc request"));
                     else
-                       limLog(pMac, LOG1, FL("LIM Info: Missing Power capability IE in Reassoc request\n"));
+                       limLog(pMac, LOG1, FL("LIM Info: Missing Power capability IE in Reassoc request"));
                 }
                 if (!pAssocReq->supportedChannelsPresent)
                 {
                     if(subType == LIM_ASSOC)
-                        limLog(pMac, LOG1, FL("LIM Info: Missing Supported channel IE in assoc request\n"));
+                        limLog(pMac, LOG1, FL("LIM Info: Missing Supported channel IE in assoc request"));
                     else
-                        limLog(pMac, LOG1, FL("LIM Info: Missing Supported channel IE in Reassoc request\n"));
+                        limLog(pMac, LOG1, FL("LIM Info: Missing Supported channel IE in Reassoc request"));
                 }
                 limPrintMacAddr(pMac, pHdr->sa, LOG1);
             }
@@ -462,18 +462,18 @@
                 if (eSIR_SUCCESS != status)
                 {
                     if (subType == LIM_ASSOC)
-                        limLog(pMac, LOGW, FL("LIM Info: Association MinTxPower(STA) > MaxTxPower(AP)\n"));
+                        limLog(pMac, LOGW, FL("LIM Info: Association MinTxPower(STA) > MaxTxPower(AP)"));
                     else
-                        limLog(pMac, LOGW, FL("LIM Info: Reassociation MinTxPower(STA) > MaxTxPower(AP)\n"));
+                        limLog(pMac, LOGW, FL("LIM Info: Reassociation MinTxPower(STA) > MaxTxPower(AP)"));
                     limPrintMacAddr(pMac, pHdr->sa, LOGW);
                 }
                 status = limIsDot11hSupportedChannelsValid(pMac, pAssocReq);
                 if (eSIR_SUCCESS != status)
                 {
                     if (subType == LIM_ASSOC)
-                        limLog(pMac, LOGW, FL("LIM Info: Association wrong supported channels (STA)\n"));
+                        limLog(pMac, LOGW, FL("LIM Info: Association wrong supported channels (STA)"));
                     else
-                        limLog(pMac, LOGW, FL("LIM Info: Reassociation wrong supported channels (STA)\n"));
+                        limLog(pMac, LOGW, FL("LIM Info: Reassociation wrong supported channels (STA)"));
                     limPrintMacAddr(pMac, pHdr->sa, LOGW);
                 }
                 /* IEs are valid, use them if needed */
@@ -508,10 +508,10 @@
         // Log error
         if (subType == LIM_ASSOC)
             limLog(pMac, LOGW,
-               FL("received Assoc req with unsupported MCS Rate Set from \n"));
+               FL("received Assoc req with unsupported MCS Rate Set from "));
         else
             limLog(pMac, LOGW,
-               FL("received ReAssoc req with unsupported MCS Rate Set from\n"));
+               FL("received ReAssoc req with unsupported MCS Rate Set from"));
         limPrintMacAddr(pMac, pHdr->sa, LOGW);
         goto error;
     }
@@ -522,7 +522,7 @@
 
         if (wlan_cfgGetInt(pMac, WNI_CFG_11G_ONLY_POLICY, &val) != eSIR_SUCCESS)
         {
-            limLog(pMac, LOGP, FL("could not retrieve 11g-only flag\n"));
+            limLog(pMac, LOGP, FL("could not retrieve 11g-only flag"));
             goto error;
         }
 
@@ -579,7 +579,7 @@
             limLog(pMac, LOGW,
                    FL("Rejecting Re/Assoc req from STA: "));
             limPrintMacAddr(pMac, pHdr->sa, LOGW);
-            limLog(pMac, LOGE, FL("APSD not enabled, qosInfo - 0x%x\n"), *qInfo);
+            limLog(pMac, LOGE, FL("APSD not enabled, qosInfo - 0x%x"), *qInfo);
             goto error;
         }
     }
@@ -596,10 +596,10 @@
 
             limLog( pMac, LOG1, FL( "AdvCodingCap:%d ChaWidthSet:%d "
                                     "PowerSave:%d greenField:%d "
-                                    "shortGI20:%d shortGI40:%d\n"
+                                    "shortGI20:%d shortGI40:%d"
                                     "txSTBC:%d rxSTBC:%d delayBA:%d"
                                     "maxAMSDUsize:%d DSSS/CCK:%d "
-                                    "PSMP:%d stbcCntl:%d lsigTXProt:%d\n"),
+                                    "PSMP:%d stbcCntl:%d lsigTXProt:%d"),
                     pAssocReq->HTCaps.advCodingCap,
                     pAssocReq->HTCaps.supportedChannelWidthSet,
                     pAssocReq->HTCaps.mimoPowerSave,
@@ -626,7 +626,7 @@
             {
                 statusCode = eSIR_MAC_DSSS_CCK_RATE_NOT_SUPPORT_STATUS;
                 limLog( pMac, LOGW, FL( "AP DSSS/CCK is disabled; "
-                                        "STA rejected.\n" ) );
+                                        "STA rejected." ) );
                 // Reject association
                 limSendAssocRspMgmtFrame( pMac, statusCode, 1, pHdr->sa, subType, 0,psessionEntry);
                 goto error;
@@ -651,7 +651,7 @@
             && psessionEntry->pLimStartBssReq->rsnIE.length)
         {
             limLog(pMac, LOGE,
-                   FL("AP supports RSN enabled authentication\n"));
+                   FL("AP supports RSN enabled authentication"));
 
             if(pAssocReq->rsnPresent)
             {
@@ -882,7 +882,7 @@
 
         if (dphInitStaState(pMac, pHdr->sa, peerIdx, true, &psessionEntry->dph.dphHashTable) == NULL)   
         {
-            limLog(pMac, LOGE, FL("could not Init STAid=%d\n"), peerIdx);
+            limLog(pMac, LOGE, FL("could not Init STAid=%d"), peerIdx);
             goto  error;
         }
 
@@ -906,7 +906,7 @@
             if (limAdmitControlAddTS(pMac, pHdr->sa, &(pAssocReq->addtsReq),
                                      &(pAssocReq->qosCapability), 0, false, NULL, &tspecIdx, psessionEntry) != eSIR_SUCCESS)
             {
-                limLog(pMac, LOGW, FL("AdmitControl: TSPEC rejected\n"));
+                limLog(pMac, LOGW, FL("AdmitControl: TSPEC rejected"));
                 limSendAssocRspMgmtFrame(
                                pMac,
                                eSIR_MAC_QAP_NO_BANDWIDTH_REASON,
@@ -922,7 +922,7 @@
         else if (limAdmitControlAddSta(pMac, pHdr->sa, false)
                                                != eSIR_SUCCESS)
         {
-            limLog(pMac, LOGW, FL("AdmitControl: Sta rejected\n"));
+            limLog(pMac, LOGW, FL("AdmitControl: Sta rejected"));
             limSendAssocRspMgmtFrame(
                     pMac,
                     eSIR_MAC_QAP_NO_BANDWIDTH_REASON,
@@ -936,7 +936,7 @@
         }
 
         // else all ok
-        limLog(pMac, LOG1, FL("AdmitControl: Sta OK!\n"));
+        limLog(pMac, LOG1, FL("AdmitControl: Sta OK!"));
     }
 
     /**
@@ -980,7 +980,7 @@
     {
         // Could not add hash table entry at DPH
         limLog(pMac, LOGE,
-           FL("could not add hash entry at DPH for aid=%d, MacAddr:\n"),
+           FL("could not add hash entry at DPH for aid=%d, MacAddr:"),
            peerIdx);
         limPrintMacAddr(pMac, pHdr->sa, LOGE);
 
@@ -1114,7 +1114,7 @@
     {
         // Could not update hash table entry at DPH with rateset
         limLog(pMac, LOGE,
-           FL("could not update hash entry at DPH for aid=%d, MacAddr:\n"),
+           FL("could not update hash entry at DPH for aid=%d, MacAddr:"),
            peerIdx);
         limPrintMacAddr(pMac, pHdr->sa, LOGE);
 
@@ -1170,7 +1170,7 @@
                  * Received Re/Association Request from
                  * STA when UPASD is not supported.
                  */
-                limLog( pMac, LOGE, FL( "AP do not support UPASD REASSOC Failed\n" ));
+                limLog( pMac, LOGE, FL( "AP do not support UPASD REASSOC Failed" ));
                 limRejectAssociation(pMac, pHdr->sa,
                                      subType, true, authType, peerIdx, true,
                                      (tSirResultCodes) eSIR_MAC_WME_REFUSED_STATUS, psessionEntry);
@@ -1222,7 +1222,7 @@
         // BTAMP: Add STA context at HW - issue WDA_ADD_STA_REQ to HAL
         if (limAddSta(pMac, pStaDs, false, psessionEntry) != eSIR_SUCCESS)
         {
-            limLog(pMac, LOGE, FL("could not Add STA with assocId=%d\n"), pStaDs->assocId);
+            limLog(pMac, LOGE, FL("could not Add STA with assocId=%d"), pStaDs->assocId);
             limRejectAssociation( pMac, pStaDs->staAddr, pStaDs->mlmStaContext.subType,
                                   true, pStaDs->mlmStaContext.authType, pStaDs->assocId, true,
                                   (tSirResultCodes) eSIR_MAC_UNSPEC_FAILURE_STATUS, psessionEntry);
@@ -1245,7 +1245,7 @@
             pStaDs->mlmStaContext.mlmState = eLIM_MLM_WT_ASSOC_DEL_STA_RSP_STATE;
             if(limDelSta(pMac, pStaDs, true, psessionEntry) != eSIR_SUCCESS)
             {
-                limLog(pMac, LOGE, FL("could not DEL STA with assocId=%d staId %d\n"), pStaDs->assocId, pStaDs->staIndex);
+                limLog(pMac, LOGE, FL("could not DEL STA with assocId=%d staId %d"), pStaDs->assocId, pStaDs->staIndex);
                 limRejectAssociation( pMac, pStaDs->staAddr, pStaDs->mlmStaContext.subType, true, pStaDs->mlmStaContext.authType,
                                       pStaDs->assocId, true,(tSirResultCodes) eSIR_MAC_UNSPEC_FAILURE_STATUS, psessionEntry);
 
@@ -1260,7 +1260,7 @@
             /* use the same AID, already allocated */
             if (limAddSta(pMac, pStaDs, false, psessionEntry) != eSIR_SUCCESS)
             {
-                    limLog( pMac, LOGE, FL( "AP do not support UPASD REASSOC Failed\n" ));
+                    limLog( pMac, LOGE, FL( "AP do not support UPASD REASSOC Failed" ));
                     limRejectAssociation( pMac, pStaDs->staAddr, pStaDs->mlmStaContext.subType, true, pStaDs->mlmStaContext.authType,
                                           pStaDs->assocId, true,(tSirResultCodes) eSIR_MAC_WME_REFUSED_STATUS, psessionEntry);
 
@@ -1286,7 +1286,7 @@
 
         if (palFreeMemory(pMac->hHdd, pAssocReq) != eHAL_STATUS_SUCCESS) 
         {
-            limLog(pMac, LOGP, FL("PalFree Memory failed \n"));
+            limLog(pMac, LOGP, FL("PalFree Memory failed "));
             return;
         }
     }
@@ -1353,7 +1353,7 @@
         if( eHAL_STATUS_SUCCESS != palAllocateMemory( pMac->hHdd, (void **)&pMlmAssocInd, temp))
         {
             limReleasePeerIdx(pMac, pStaDs->assocId, psessionEntry);
-            limLog(pMac, LOGP, FL("palAllocateMemory failed for pMlmAssocInd\n"));
+            limLog(pMac, LOGP, FL("palAllocateMemory failed for pMlmAssocInd"));
             return;
         }
         palZeroMemory( pMac->hHdd, pMlmAssocInd, temp);
@@ -1375,7 +1375,7 @@
         }
         if (pAssocReq->rsnPresent && (NULL == wpsIe))
         {
-            limLog(pMac, LOG2, FL("Assoc Req RSN IE len = %d\n"), pAssocReq->rsn.length);
+            limLog(pMac, LOG2, FL("Assoc Req RSN IE len = %d"), pAssocReq->rsn.length);
             pMlmAssocInd->rsnIE.length = 2 + pAssocReq->rsn.length;
             pMlmAssocInd->rsnIE.rsnIEdata[0] = SIR_MAC_RSN_EID;
             pMlmAssocInd->rsnIE.rsnIEdata[1] = pAssocReq->rsn.length;
@@ -1402,7 +1402,7 @@
         {
             if((pMlmAssocInd->rsnIE.length + pAssocReq->wpa.length) >= SIR_MAC_MAX_IE_LENGTH)
             {
-                PELOGE(limLog(pMac, LOGE, FL("rsnIEdata index out of bounds %d\n"), pMlmAssocInd->rsnIE.length);)
+                PELOGE(limLog(pMac, LOGE, FL("rsnIEdata index out of bounds %d"), pMlmAssocInd->rsnIE.length);)
                 return;
             }
             pMlmAssocInd->rsnIE.rsnIEdata[pMlmAssocInd->rsnIE.length] = SIR_MAC_WPA_EID;
@@ -1430,7 +1430,7 @@
         {
 
             if (wlan_cfgGetInt(pMac, (tANI_U16) WNI_CFG_WME_ENABLED, &tmp) != eSIR_SUCCESS)
-                 limLog(pMac, LOGP, FL("wlan_cfgGetInt failed for id %d\n"), WNI_CFG_WME_ENABLED );
+                 limLog(pMac, LOGP, FL("wlan_cfgGetInt failed for id %d"), WNI_CFG_WME_ENABLED );
 
             /* check whether AP is enabled with WMM */
             if(tmp)
@@ -1462,7 +1462,7 @@
 
         if( eHAL_STATUS_SUCCESS != palAllocateMemory( pMac->hHdd, (void **)&pMlmReassocInd, temp))
         {
-            limLog(pMac, LOGP, FL("call to palAllocateMemory failed for pMlmReassocInd\n"));
+            limLog(pMac, LOGP, FL("call to palAllocateMemory failed for pMlmReassocInd"));
             limReleasePeerIdx(pMac, pStaDs->assocId, psessionEntry);
             return;
         }
@@ -1485,7 +1485,7 @@
 
         if (pAssocReq->rsnPresent && (NULL == wpsIe))
         {
-            limLog(pMac, LOG2, FL("Assoc Req: RSN IE length = %d\n"), pAssocReq->rsn.length);
+            limLog(pMac, LOG2, FL("Assoc Req: RSN IE length = %d"), pAssocReq->rsn.length);
             pMlmReassocInd->rsnIE.length = 2 + pAssocReq->rsn.length;
             pMlmReassocInd->rsnIE.rsnIEdata[0] = SIR_MAC_RSN_EID;
             pMlmReassocInd->rsnIE.rsnIEdata[1] = pAssocReq->rsn.length;
@@ -1501,7 +1501,7 @@
             pMlmReassocInd->supportedChannels.numChnl = (tANI_U8)(pAssocReq->supportedChannels.length / 2);
 
             limLog(pMac, LOG1,
-                FL("Sending Reassoc Ind: spectrum ON, minPwr %d, maxPwr %d, numChnl %d\n"),
+                FL("Sending Reassoc Ind: spectrum ON, minPwr %d, maxPwr %d, numChnl %d"),
                 pMlmReassocInd->powerCap.minTxPower,
                 pMlmReassocInd->powerCap.maxTxPower,
                 pMlmReassocInd->supportedChannels.numChnl);
@@ -1509,7 +1509,7 @@
             for(i=0; i < pMlmReassocInd->supportedChannels.numChnl; i++)
             {
                 pMlmReassocInd->supportedChannels.channelList[i] = pAssocReq->supportedChannels.supportedChannels[j];
-                limLog(pMac, LOG1, FL("Sending ReassocInd: chn[%d] = %d \n"),
+                limLog(pMac, LOG1, FL("Sending ReassocInd: chn[%d] = %d "),
                        i, pMlmReassocInd->supportedChannels.channelList[i]);
                 j+=2;
             }
@@ -1521,7 +1521,7 @@
         /* This check is to avoid extra Sec IEs present incase of WPS */
         if (pAssocReq->wpaPresent && (NULL == wpsIe))
         {
-            limLog(pMac, LOG2, FL("Received WPA IE length in Assoc Req is %d\n"), pAssocReq->wpa.length);
+            limLog(pMac, LOG2, FL("Received WPA IE length in Assoc Req is %d"), pAssocReq->wpa.length);
             pMlmReassocInd->rsnIE.rsnIEdata[pMlmReassocInd->rsnIE.length] = SIR_MAC_WPA_EID;
             pMlmReassocInd->rsnIE.rsnIEdata[pMlmReassocInd->rsnIE.length + 1] = pAssocReq->wpa.length;
             palCopyMemory( pMac->hHdd,
@@ -1546,7 +1546,7 @@
         {
 
             if (wlan_cfgGetInt(pMac, (tANI_U16) WNI_CFG_WME_ENABLED, &tmp) != eSIR_SUCCESS)
-                 limLog(pMac, LOGP, FL("wlan_cfgGetInt failed for id %d\n"), WNI_CFG_WME_ENABLED );
+                 limLog(pMac, LOGP, FL("wlan_cfgGetInt failed for id %d"), WNI_CFG_WME_ENABLED );
 
             /* check whether AP is enabled with WMM */
             if(tmp)
diff --git a/CORE/MAC/src/pe/lim/limProcessAssocRspFrame.c b/CORE/MAC/src/pe/lim/limProcessAssocRspFrame.c
index 09f2a64..41c787f 100644
--- a/CORE/MAC/src/pe/lim/limProcessAssocRspFrame.c
+++ b/CORE/MAC/src/pe/lim/limProcessAssocRspFrame.c
@@ -166,7 +166,7 @@
        if (limPopulateOwnRateSet(pMac, &pStaDs->supportedRates, pAssocRsp->HTCaps.supportedMCSSet, false,psessionEntry) != eSIR_SUCCESS) 
 #endif
        {
-           limLog(pMac, LOGP, FL("could not get rateset and extended rate set\n"));
+           limLog(pMac, LOGP, FL("could not get rateset and extended rate set"));
            return;
        }
    
@@ -180,7 +180,7 @@
                      (tANI_U8 *) &pStaDs->mlmStaContext.propRateSet.propRate,
                      &val) != eSIR_SUCCESS) {
            /// Could not get prop rateset from CFG. Log error.
-           limLog(pMac, LOGP, FL("could not retrieve prop rateset\n"));
+           limLog(pMac, LOGP, FL("could not retrieve prop rateset"));
            return;
        }
        pStaDs->mlmStaContext.propRateSet.numPropRates = (tANI_U8) val;
@@ -194,10 +194,10 @@
            if (pAssocRsp->edcaPresent) {
                tSirRetStatus status;
                status = schBeaconEdcaProcess(pMac,&pAssocRsp->edca, psessionEntry);
-              PELOG2(limLog(pMac, LOG2, "Edca set update based on AssocRsp: status %d\n",
+              PELOG2(limLog(pMac, LOG2, "Edca set update based on AssocRsp: status %d",
                       status);)
                if (status != eSIR_SUCCESS) {
-                   PELOGE(limLog(pMac, LOGE, FL("Edca error in AssocResp \n"));)
+                   PELOGE(limLog(pMac, LOGE, FL("Edca error in AssocResp "));)
                } else { // update default tidmap based on ACM
                    pStaDs->qosMode    = 1;
                    pStaDs->lleEnabled = 1;
@@ -211,10 +211,10 @@
        {
            tSirRetStatus status;
            status = schBeaconEdcaProcess(pMac,&pAssocRsp->edca, psessionEntry);
-           PELOGW(limLog(pMac, LOGW, "WME Edca set update based on AssocRsp: status %d\n", status);)
+           PELOGW(limLog(pMac, LOGW, "WME Edca set update based on AssocRsp: status %d", status);)
 
            if (status != eSIR_SUCCESS)
-               PELOGE(limLog(pMac, LOGE, FL("WME Edca error in AssocResp - ignoring\n"));)
+               PELOGE(limLog(pMac, LOGE, FL("WME Edca error in AssocResp - ignoring"));)
            else { // update default tidmap based on HashACM
                pStaDs->qosMode    = 1;
                pStaDs->wmeEnabled = 1;
@@ -337,7 +337,7 @@
     if(eHAL_STATUS_SUCCESS != palAllocateMemory(pMac->hHdd, 
                                                 (void **)&pBeaconStruct, sizeof(tSchBeaconStruct)))
     {
-        limLog(pMac, LOGE, FL("Unable to PAL allocate memory in limProcessAssocRspFrame\n") );
+        limLog(pMac, LOGE, FL("Unable to PAL allocate memory in limProcessAssocRspFrame") );
         return;
     }
 
@@ -347,7 +347,7 @@
         // Should not have received Re/Association Response
         // frame on AP. Log error
         limLog(pMac, LOGE,
-               FL("received Re/Assoc response frame on role %d \n"),
+               FL("received Re/Assoc response frame on role %d "),
                psessionEntry->limSystemRole);
 
         palFreeMemory(pMac->hHdd, pBeaconStruct);
@@ -370,14 +370,14 @@
         /// Received unexpected Re/Association Response frame
 
 #ifdef WLAN_FEATURE_VOWIFI_11R_DEBUG
-        PELOG1(limLog(pMac, LOG1,  FL("mlm state is set to %d session=%d\n"), 
+        PELOG1(limLog(pMac, LOG1,  FL("mlm state is set to %d session=%d"),
             psessionEntry->limMlmState, psessionEntry->peSessionId);)
 #endif
         // Log error
         if (!pHdr->fc.retry)
         {
             limLog(pMac, LOGE,
-               FL("received Re/Assoc rsp frame in unexpected state\n"));
+               FL("received Re/Assoc rsp frame in unexpected state"));
             limPrintMlmState(pMac, LOGE, psessionEntry->limMlmState);
         }
         palFreeMemory(pMac->hHdd, pBeaconStruct);
@@ -388,7 +388,7 @@
                                 eSIR_SUCCESS)
     {
         /// Could not get BSSID from CFG. Log error.
-        limLog(pMac, LOGP, FL("could not retrieve BSSID\n"));
+        limLog(pMac, LOGP, FL("could not retrieve BSSID"));
         palFreeMemory(pMac->hHdd, pBeaconStruct);
         return;
     }
@@ -434,7 +434,7 @@
     }
 
    if ( palAllocateMemory(pMac->hHdd, (void **)&pAssocRsp, sizeof(*pAssocRsp)) != eHAL_STATUS_SUCCESS) {
-        limLog(pMac, LOGP, FL("Pal Allocate Memory failed in AssocRsp\n"));
+        limLog(pMac, LOGP, FL("Pal Allocate Memory failed in AssocRsp"));
         palFreeMemory(pMac->hHdd, pBeaconStruct);
 
         return;
@@ -455,9 +455,9 @@
     {
         if (palFreeMemory(pMac->hHdd, pAssocRsp) != eHAL_STATUS_SUCCESS) 
         {
-            limLog(pMac, LOGP, FL("PalFree Memory failed \n"));
+            limLog(pMac, LOGP, FL("PalFree Memory failed "));
         }
-        PELOGE(limLog(pMac, LOGE, FL("Parse error Assoc resp subtype %d, length=%d\n"), frameLen,subType);)
+        PELOGE(limLog(pMac, LOGE, FL("Parse error Assoc resp subtype %d, length=%d"), frameLen,subType);)
         palFreeMemory(pMac->hHdd, pBeaconStruct);
 
         return;
@@ -553,7 +553,7 @@
         
         // Log error
         limLog(pMac, LOGE,
-               FL("received Re/AssocRsp frame with IBSS capability\n"));
+               FL("received Re/AssocRsp frame with IBSS capability"));
         palFreeMemory(pMac->hHdd, pAssocRsp);
         palFreeMemory(pMac->hHdd, pBeaconStruct);
 
@@ -569,7 +569,7 @@
         palFreeMemory(pMac->hHdd, pAssocRsp);
         palFreeMemory(pMac->hHdd, pBeaconStruct);
 
-        limLog(pMac, LOGP, FL("could not retrieve Capabilities value\n"));
+        limLog(pMac, LOGP, FL("could not retrieve Capabilities value"));
         return;
     }
     limCopyU16((tANI_U8 *) &localCapabilities, caps);
@@ -594,7 +594,7 @@
         // Re/Association response was received
         // either with failure code.
         // Log error.
-        PELOGE(limLog(pMac, LOGE, FL("received Re/AssocRsp frame failure code %d\n"), pAssocRsp->statusCode);)
+        PELOGE(limLog(pMac, LOGE, FL("received Re/AssocRsp frame failure code %d"), pAssocRsp->statusCode);)
         // Need to update 'association failure' error counter
         // along with STATUS CODE
 
@@ -621,7 +621,7 @@
         // Re/Association response was received
         // with invalid AID value
         // Log error
-        PELOGW(limLog(pMac, LOGW, FL("received Re/AssocRsp frame with invalid aid %X \n"),  pAssocRsp->aid);)
+        PELOGW(limLog(pMac, LOGW, FL("received Re/AssocRsp frame with invalid aid %X "),  pAssocRsp->aid);)
         mlmAssocCnf.resultCode = eSIR_SME_INVALID_ASSOC_RSP_RXED;
         mlmAssocCnf.protStatusCode = eSIR_MAC_UNSPEC_FAILURE_STATUS;
 
@@ -644,7 +644,7 @@
             if (limSetLinkState(pMac, eSIR_LINK_POSTASSOC_STATE, psessionEntry->bssId,
                                 psessionEntry->selfMacAddr, NULL, NULL) != eSIR_SUCCESS)
             {
-                PELOGE(limLog(pMac, LOGE, FL("Set link state to POSTASSOC failed\n"));)
+                PELOGE(limLog(pMac, LOGE, FL("Set link state to POSTASSOC failed"));)
                 palFreeMemory(pMac->hHdd, pBeaconStruct);
                 palFreeMemory(pMac->hHdd, pAssocRsp);
                 return;
@@ -653,13 +653,13 @@
     if (subType == LIM_REASSOC)
     {
         // Log success
-        PELOG1(limLog(pMac, LOG1, FL("Successfully Reassociated with BSS\n"));)
+        PELOG1(limLog(pMac, LOG1, FL("Successfully Reassociated with BSS"));)
 #ifdef FEATURE_WLAN_CCX
         {
             tANI_U8 cnt = 0;
             if (pAssocRsp->tsmPresent)
             {
-                limLog(pMac, LOGW, "TSM IE Present in Reassoc Rsp\n");
+                limLog(pMac, LOGW, "TSM IE Present in Reassoc Rsp");
                 // Start the TSM  timer only if the TSPEC Ie is present in the reassoc rsp
                 if (pAssocRsp->tspecPresent) {
                     // Find the TSPEC IE with VO user priority
@@ -676,7 +676,7 @@
                         }
                     }
                 } else {
-                    limLog(pMac, LOGE, "TSM present but TSPEC IE not present in Reassoc Rsp\n");
+                    limLog(pMac, LOGE, "TSM present but TSPEC IE not present in Reassoc Rsp");
                 }
             }
         }
@@ -781,7 +781,7 @@
     if ((pStaDs = dphGetHashEntry(pMac, DPH_STA_HASH_INDEX_PEER, &psessionEntry->dph.dphHashTable)) == NULL) 
     {
         // Could not add hash table entry
-        PELOGE(limLog(pMac, LOGE, FL("could not get hash entry at DPH for \n"));)
+        PELOGE(limLog(pMac, LOGE, FL("could not get hash entry at DPH for "));)
         limPrintMacAddr(pMac, pHdr->sa, LOGE);
 
         mlmAssocCnf.resultCode = eSIR_SME_RESOURCES_UNAVAILABLE;
@@ -841,7 +841,7 @@
                     || ((subType == LIM_REASSOC) && (psessionEntry->limMlmState == eLIM_MLM_WT_FT_REASSOC_RSP_STATE))
 #endif
        ) {
-        PELOGE(limLog(pMac, LOGE,  FL("Assoc Rejected by the peer. Reason: %d\n"), mlmAssocCnf.resultCode);)
+        PELOGE(limLog(pMac, LOGE,  FL("Assoc Rejected by the peer. Reason: %d"), mlmAssocCnf.resultCode);)
         psessionEntry->limMlmState = eLIM_MLM_IDLE_STATE;
         MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
 
diff --git a/CORE/MAC/src/pe/lim/limProcessAuthFrame.c b/CORE/MAC/src/pe/lim/limProcessAuthFrame.c
index 1ba03cb..7f9b288 100644
--- a/CORE/MAC/src/pe/lim/limProcessAuthFrame.c
+++ b/CORE/MAC/src/pe/lim/limProcessAuthFrame.c
@@ -290,7 +290,7 @@
              * Could not get Privacy option
              * from CFG. Log error.
              */
-            limLog(pMac, LOGP, FL("could not retrieve Privacy option\n"));
+            limLog(pMac, LOGP, FL("could not retrieve Privacy option"));
         }
 
         cfgPrivacyOptImp = (tANI_U8)val;
@@ -457,7 +457,7 @@
                     /// Could not get Default key from CFG.
                     //Log error.
                     limLog(pMac, LOGP,
-                           FL("could not retrieve Default key\n"));
+                           FL("could not retrieve Default key"));
 
                     /**
                      * Send Authentication frame
@@ -486,7 +486,7 @@
                                                         (tANI_U16) (frameLen-SIR_MAC_WEP_IV_LENGTH));
                     if (decryptResult == LIM_DECRYPT_ICV_FAIL)
                     {
-                        PELOGW(limLog(pMac, LOGW, FL("=====> decryptResult == LIM_DECRYPT_ICV_FAIL ...\n"));)
+                        PELOGW(limLog(pMac, LOGW, FL("=====> decryptResult == LIM_DECRYPT_ICV_FAIL ..."));)
                         /// ICV failure
                         limDeletePreAuthNode(pMac,
                                              pHdr->sa);
@@ -554,7 +554,7 @@
     pRxAuthFrameBody = &rxAuthFrame;
 
    PELOGW(limLog(pMac, LOGW,
-           FL("Received Auth frame with type=%d seqnum=%d, status=%d (%d)\n"),
+           FL("Received Auth frame with type=%d seqnum=%d, status=%d (%d)"),
            (tANI_U32) pRxAuthFrameBody->authAlgoNumber,
            (tANI_U32) pRxAuthFrameBody->authTransactionSeqNumber,
            (tANI_U32) pRxAuthFrameBody->authStatusCode,(tANI_U32)pMac->lim.gLimNumPreAuthContexts);)
@@ -622,7 +622,7 @@
                                                     eLIM_AUTH_RSP_TIMER,
                                                     pAuthNode->authNodeIdx);
                     }
-                    PELOGE(limLog(pMac, LOGE, FL("STA is initiating brand-new Authentication ...\n"));)
+                    PELOGE(limLog(pMac, LOGE, FL("STA is initiating brand-new Authentication ..."));)
                     limDeletePreAuthNode(pMac,
                                          pHdr->sa);
                     /**
@@ -649,7 +649,7 @@
 
                     if (NULL != pStaDs)
                     {
-                        PELOGE(limLog(pMac, LOGE, FL("lim Delete Station Context (staId: %d, assocId: %d) \n"),pStaDs->staIndex, assocId);)
+                        PELOGE(limLog(pMac, LOGE, FL("lim Delete Station Context (staId: %d, assocId: %d) "),pStaDs->staIndex, assocId);)
                         limSendDeauthMgmtFrame(pMac,
                                eSIR_MAC_UNSPEC_FAILURE_REASON, (tANI_U8 *) pAuthNode->peerMacAddr, psessionEntry, FALSE);
                         limTriggerSTAdeletion(pMac, pStaDs, psessionEntry);
@@ -663,7 +663,7 @@
                      * but ACK lost at STA side, in this case 2nd auth frame is already 
                      * in transmission queue
                      * */
-                    PELOGE(limLog(pMac, LOGE, FL("STA is initiating Authentication after ACK lost...\n"));)
+                    PELOGE(limLog(pMac, LOGE, FL("STA is initiating Authentication after ACK lost..."));)
                     return;
                 }
             }
@@ -675,7 +675,7 @@
                  * from CFG. Log error.
                  */
                 limLog(pMac, LOGP,
-                       FL("could not retrieve MaxNumPreAuth\n"));
+                       FL("could not retrieve MaxNumPreAuth"));
             }
             if (pMac->lim.gLimNumPreAuthContexts == maxNumPreAuth)
             {
@@ -706,7 +706,7 @@
                 switch (pRxAuthFrameBody->authAlgoNumber)
                 {
                     case eSIR_OPEN_SYSTEM:
-                        PELOGW(limLog(pMac, LOGW, FL("=======> eSIR_OPEN_SYSTEM  ...\n"));)
+                        PELOGW(limLog(pMac, LOGW, FL("=======> eSIR_OPEN_SYSTEM  ..."));)
                         /// Create entry for this STA in pre-auth list
                         pAuthNode = limAcquireFreePreAuthNode(pMac, &pMac->lim.gLimPreAuthTimerTable);
                         if (pAuthNode == NULL)
@@ -719,7 +719,7 @@
                             return;
                         }
 
-                        PELOG1(limLog(pMac, LOG1, FL("Alloc new data: %x peer \n"), pAuthNode);
+                        PELOG1(limLog(pMac, LOG1, FL("Alloc new data: %x peer "), pAuthNode);
                         limPrintMacAddr(pMac, pHdr->sa, LOG1);)
 
                         palCopyMemory( pMac->hHdd,
@@ -766,7 +766,7 @@
                         break;
 
                     case eSIR_SHARED_KEY:
-                        PELOGW(limLog(pMac, LOGW, FL("=======> eSIR_SHARED_KEY  ...\n"));)
+                        PELOGW(limLog(pMac, LOGW, FL("=======> eSIR_SHARED_KEY  ..."));)
                         if(psessionEntry->limSystemRole == eLIM_AP_ROLE)
                         {
                             val = psessionEntry->privacy;
@@ -780,7 +780,7 @@
                              * from CFG. Log error.
                              */
                             limLog(pMac, LOGP,
-                                   FL("could not retrieve Privacy option\n"));
+                                   FL("could not retrieve Privacy option"));
                         }
                         cfgPrivacyOptImp = (tANI_U8)val;
                         if (!cfgPrivacyOptImp)
@@ -842,7 +842,7 @@
                             pAuthNode->fTimerStarted = 0;
                             limAddPreAuthNode(pMac, pAuthNode);
 
-                            PELOG1(limLog(pMac, LOG1, FL("Alloc new data: %x id %d peer \n"),
+                            PELOG1(limLog(pMac, LOG1, FL("Alloc new data: %x id %d peer "),
                                           pAuthNode, pAuthNode->authNodeIdx);)
                             PELOG1(limPrintMacAddr(pMac, pHdr->sa, LOG1);)
 
@@ -1069,7 +1069,7 @@
                         return;
                     }
 
-                    PELOG1(limLog(pMac, LOG1, FL("Alloc new data: %x peer \n"), pAuthNode);)
+                    PELOG1(limLog(pMac, LOG1, FL("Alloc new data: %x peer "), pAuthNode);)
                     PELOG1(limPrintMacAddr(pMac, pHdr->sa, LOG1);)
 
                     palCopyMemory( pMac->hHdd,
@@ -1100,7 +1100,7 @@
                          * from CFG. Log error.
                          */
                         limLog(pMac, LOGP,
-                               FL("could not retrieve Privacy option\n"));
+                               FL("could not retrieve Privacy option"));
                     }
                     cfgPrivacyOptImp = (tANI_U8)val;
                     if (!cfgPrivacyOptImp)
@@ -1137,7 +1137,7 @@
                         {
                             // Log error
                             PELOGE(limLog(pMac, LOGE,
-                                   FL("received Auth frame with invalid challenge text IE\n"));)
+                                   FL("received Auth frame with invalid challenge text IE"));)
 
                             return;
                         }
@@ -1218,7 +1218,7 @@
                                  * from CFG. Log error.
                                  */
                                 limLog(pMac, LOGP,
-                                       FL("could not retrieve Default keyId\n"));
+                                       FL("could not retrieve Default keyId"));
                             }
                             keyId = (tANI_U8)val;
 
@@ -1239,7 +1239,7 @@
                                 /// Could not get Default key from CFG.
                                 //Log error.
                                 limLog(pMac, LOGP,
-                                       FL("could not retrieve Default key\n"));
+                                       FL("could not retrieve Default key"));
 
                                 authFrame.authAlgoNumber =
                                 pRxAuthFrameBody->authAlgoNumber;
@@ -1510,7 +1510,7 @@
 
                     // Log error
                     PELOGE( limLog(pMac, LOGW,
-                                   FL("Challenge failure for peer "MAC_ADDRESS_STR), 
+                                   FL("Challenge failure for peer "MAC_ADDRESS_STR),
                                    MAC_ADDR_ARRAY(pHdr->sa));)
                     return;
                 }
@@ -1608,7 +1608,7 @@
 
                     return;
                 }
-                PELOG1(limLog(pMac, LOG1, FL("Alloc new data: %x peer \n"), pAuthNode);
+                PELOG1(limLog(pMac, LOG1, FL("Alloc new data: %x peer "), pAuthNode);
                 limPrintMacAddr(pMac, pHdr->sa, LOG1);)
 
                 palCopyMemory( pMac->hHdd,
@@ -1711,7 +1711,7 @@
 #ifdef WLAN_FEATURE_VOWIFI_11R_DEBUG
     limPrintMacAddr(pMac, pHdr->bssId, LOG2);
     limPrintMacAddr(pMac, pMac->ft.ftPEContext.pFTPreAuthReq->preAuthbssId, LOG2);
-    limLog(pMac,LOG2,FL("seqControl 0x%X\n"), 
+    limLog(pMac,LOG2,FL("seqControl 0x%X"),
             ((pHdr->seqControl.seqNumHi << 8) | 
             (pHdr->seqControl.seqNumLo << 4) |
             (pHdr->seqControl.fragNum)));
@@ -1805,7 +1805,7 @@
 
         default:
 #ifdef WLAN_FEATURE_VOWIFI_11R_DEBUG
-            PELOGE(limLog( pMac, LOGE, "Seq. no incorrect expected 2 received %d\n", 
+            PELOGE(limLog( pMac, LOGE, "Seq. no incorrect expected 2 received %d",
                 (tANI_U32) pRxAuthFrameBody->authTransactionSeqNumber);)
 #endif
             break;
