am 0e7ddd0a: Merge "remove /dev/diag node"

* commit '0e7ddd0a86f8006501afd74463914054abcef353':
  remove /dev/diag node
diff --git a/apns-full-conf.xml b/apns-full-conf.xml
index 8b61cc0..39a14a7 100644
--- a/apns-full-conf.xml
+++ b/apns-full-conf.xml
@@ -731,12 +731,41 @@
       type="mms"
   />
 
+  <apn carrier="Euskaltel Internet"
+      mcc="214"
+      mnc="03"
+      apn="internet.euskaltel.mobi"
+      user="CLIENTE"
+      password="EUSKALTEL"
+      authtype="1"
+      type="default,supl"
+      mvno_type="imsi"
+      mvno_match_data="2140359"
+  />
+
+  <apn carrier="Euskaltel MMS"
+      mcc="214"
+      mnc="03"
+      apn="euskaltelmms.euskaltel.mobi"
+      user="MMS"
+      password="EUSKALTEL"
+      authtype="1"
+      mmsc="http://mms.euskaltel.mobi"
+      mmsproxy="172.16.18.74"
+      mmsport="8080"
+      type="mms"
+      mvno_type="imsi"
+      mvno_match_data="2140359"
+  />
+
   <apn carrier="Carrefour"
       mcc="214"
       mnc="03"
       apn="CARREFOURINTERNET"
       authtype="1"
       type="default,supl"
+      mvno_type="imsi"
+      mvno_match_data="2140352"
   />
 
   <apn carrier="Carrefour MMS"
@@ -749,6 +778,8 @@
       mmsproxy="172.22.188.25"
       mmsport="8080"
       authtype="1"
+      mvno_type="imsi"
+      mvno_match_data="2140352"
       type="mms"
   />
 
@@ -819,6 +850,7 @@
       mcc="214"
       mnc="06"
       apn="internet.mundo-r.com"
+      authtype="1"
       type="default,supl"
       mvno_match_data="2140612"
       mvno_type="imsi"
@@ -827,10 +859,11 @@
   <apn carrier="MMS R"
       mcc="214"
       mnc="06"
-      apn="euskaltelmms.euskaltel.mobi"
+      apn="mms.mundo-r.com"
       mmsc="http://mms.mundo-r.com"
       mmsproxy="10.0.157.169"
       mmsport="8080"
+      authtype="1"
       type="mms"
       mvno_match_data="2140612"
       mvno_type="imsi"
@@ -886,18 +919,6 @@
       mvno_type="imsi"
   />
 
-  <apn carrier="Movistar MMS"
-      mcc="214"
-      mnc="07"
-      apn="telefonica.es"
-      user="telefonica"
-      password="telefonica"
-      mmsc="http://mms.movistar.com"
-      mmsproxy="10.138.255.5"
-      mmsport="8080"
-      type="mms"
-  />
-
   <apn carrier="Movistar"
       mcc="214"
       mnc="07"
@@ -906,7 +927,11 @@
       password="telefonica"
       proxy="10.138.255.133"
       port="8080"
-      type="default,supl"
+      mmsc="http://mms.movistar.com"
+      mmsproxy="10.138.255.5"
+      mmsport="8080"
+      authtype="1"
+      type="default,supl,mms"
   />
 
   <apn carrier="Jazztel Internet"
@@ -1853,10 +1878,10 @@
       type="mms"
   />
 
-  <apn carrier="YESSS! GPRS"
+  <apn carrier="Internet"
       mcc="232"
       mnc="12"
-      apn="web.yesss.at"
+      apn="webapn.at"
       type="default,supl"
   />
 
@@ -2376,6 +2401,27 @@
       type="default,supl"
   />
 
+  <apn carrier="Internet"
+      mcc="240"
+      mnc="01"
+      apn="halebop.telia.se"
+      type="default,supl"
+      mvno_match_data="240017"
+      mvno_type="imsi"
+  />
+
+  <apn carrier="MMS"
+      mcc="240"
+      mnc="01"
+      apn="mms.telia.se"
+      mmsc="http://mmss"
+      mmsproxy="193.209.134.132"
+      mmsport="80"
+      type="mms"
+      mvno_match_data="240017"
+      mvno_type="imsi"
+  />
+
   <apn carrier="Halebop Internet"
       mcc="240"
       mnc="017"
@@ -2436,14 +2482,25 @@
       type="default,supl"
   />
 
-  <apn carrier="Tele2"
+  <apn carrier="Tele2 Internet"
+      mcc="240"
+      mnc="07"
+      apn="internet.tele2.se"
+      type="default,supl"
+      mvno_match_data="Tele2"
+      mvno_type="spn"
+  />
+
+  <apn carrier="Tele2 MMS"
       mcc="240"
       mnc="07"
       apn="internet.tele2.se"
       mmsc="http://mmsc.tele2.se"
       mmsproxy="130.244.202.30"
       mmsport="8080"
-      type="default,supl,mms"
+      type="mms"
+      mvno_match_data="Tele2"
+      mvno_type="spn"
   />
 
   <apn carrier="Tele2 Internet"
@@ -2835,10 +2892,6 @@
       mcc="246"
       mnc="03"
       apn="internet.tele2.lt"
-      user="wap"
-      password="wap"
-      proxy="130.244.196.90"
-      port="8080"
       mmsc="http://mmsc.tele2.lt/"
       mmsproxy="193.12.40.29"
       mmsport="8080"
@@ -2963,16 +3016,14 @@
       type="default,supl"
   />
 
-  <apn carrier="Tele2 Internet"
+  <apn carrier="TELE2 Internet"
       mcc="248"
       mnc="03"
       apn="internet.tele2.ee"
       type="default,supl"
-      mvno_match_data="24803005x"
-      mvno_type="imsi"
   />
 
-  <apn carrier="Tele2 MMS"
+  <apn carrier="TELE2 MMS"
       mcc="248"
       mnc="03"
       apn="mms.tele2.ee"
@@ -2980,8 +3031,6 @@
       mmsproxy="193.12.40.6"
       mmsport="8080"
       type="mms"
-      mvno_match_data="24803005x"
-      mvno_type="imsi"
   />
 
   <apn carrier="Smart/Ultra MMS"
@@ -2992,29 +3041,6 @@
       mmsproxy="193.12.40.6"
       mmsport="8080"
       type="mms"
-      mvno_match_data="24803005x"
-      mvno_type="imsi"
-  />
-
-  <apn carrier="Tele2 Internet"
-      mcc="248"
-      mnc="03"
-      apn="internet.tele2.ee"
-      type="default,supl"
-      mvno_match_data="24803000x"
-      mvno_type="imsi"
-  />
-
-  <apn carrier="Smart/Ultra MMS"
-      mcc="248"
-      mnc="03"
-      apn="internet.tele2.ee"
-      mmsc="http://mmsc.tele2.ee"
-      mmsproxy="193.12.40.6"
-      mmsport="8080"
-      type="mms"
-      mvno_match_data="24803000x"
-      mvno_type="imsi"
   />
 
   <apn carrier="MTS Internet"
@@ -3883,6 +3909,39 @@
       type="mms"
   />
 
+  <apn carrier="T-2"
+      mcc="293"
+      mnc="64"
+      apn="internet.t-2.net"
+      mmsc="http://www.mms.t-2.net:8002"
+      mmsproxy="172.20.18.137"
+      mmsport="8080"
+      type="default,supl,mms"
+  />
+
+  <apn carrier="Tusmobil Internet"
+      mcc="293"
+      mnc="70"
+      apn="internet.tusmobil.si"
+      user="tusmobil"
+      password="internet"
+      authtype="1"
+      type="default,supl"
+  />
+
+  <apn carrier="Tusmobil MMS"
+      mcc="293"
+      mnc="70"
+      apn="mms.tusmobil.si"
+      user="tusmobil"
+      password="mms"
+      authtype="1"
+      mmsc="http://mms.tusmobil.si:8002"
+      mmsproxy="91.185.221.85"
+      mmsport="8080"
+      type="mms"
+  />
+
   <apn carrier="T-Mobile MK Internet"
       mcc="294"
       mnc="01"
@@ -5749,6 +5808,13 @@
       type="mms"
   />
 
+  <apn carrier="ALTEL INTERNET"
+      mcc="401"
+      mnc="07"
+      apn="Internet"
+      type="default"
+  />
+
   <apn carrier="Tele2 Internet"
       mcc="401"
       mnc="77"
@@ -5766,6 +5832,13 @@
       type="mms"
   />
 
+  <apn carrier="ALTEL INTERNET"
+      mcc="401"
+      mnc="07"
+      apn="Internet"
+      type="default"
+  />
+
   <apn carrier="B-Mobile"
       mcc="402"
       mnc="11"
@@ -12531,6 +12604,23 @@
       type="default,supl,mms"
   />
 
+  <apn carrier="Home Cellular Internet"
+      mcc="425"
+      mnc="15"
+      apn="hcminternet"
+      type="default,supl"
+  />
+
+  <apn carrier="Home Cellular MMS"
+      mcc="425"
+      mnc="15"
+      apn="hcmMMS"
+      mmsc="http://82.166.164.229:9000/mmsc"
+      mmsproxy="82.166.164.229"
+      mmsport="8898"
+      type="mms"
+  />
+
   <apn carrier="Rami Levi 3G"
       mcc="425"
       mnc="16"
@@ -14610,6 +14700,46 @@
       type="mms"
   />
 
+  <apn carrier="TRUE-H INTERNET"
+      mcc="520"
+      mnc="04"
+      apn="internet"
+      user="true"
+      password="true"
+      authtype="1"
+      type="default,supl"
+  />
+
+  <apn carrier="TRUE-H MMS"
+      mcc="520"
+      mnc="04"
+      apn="hmms"
+      user="true"
+      password="true"
+      authtype="1"
+      mmsc="http://mms.trueh.com:8002/"
+      mmsproxy="10.4.7.39"
+      mmsport="8080"
+      type="mms"
+  />
+
+  <apn carrier="dtac Internet"
+      mcc="520"
+      mnc="05"
+      apn="www.dtac.co.th"
+      type="default,supl"
+  />
+
+  <apn carrier="dtac MMS"
+      mcc="520"
+      mnc="05"
+      apn="mms"
+      mmsc="http://mms2.dtac.co.th:8002/"
+      mmsproxy="10.10.10.10"
+      mmsport="8080"
+      type="mms"
+  />
+
   <apn carrier="TOT 3G Internet"
       mcc="520"
       mnc="15"
@@ -17507,7 +17637,7 @@
       type="mms"
   />
 
-  <apn carrier="TIM Connect"
+  <apn carrier="TIM CONNECT"
       mcc="724"
       mnc="02"
       apn="timbrasil.br"
@@ -17517,10 +17647,10 @@
       mmsproxy="200.179.66.242"
       mmsport="8080"
       authtype="1"
-      type="default,supl,mms"
+      type="default,mms"
   />
 
-  <apn carrier="TIM Connect"
+  <apn carrier="TIM CONNECT"
       mcc="724"
       mnc="03"
       apn="timbrasil.br"
@@ -17530,10 +17660,10 @@
       mmsproxy="200.179.66.242"
       mmsport="8080"
       authtype="1"
-      type="default,supl,mms"
+      type="default,mms"
   />
 
-  <apn carrier="TIM Connect"
+  <apn carrier="TIM CONNECT"
       mcc="724"
       mnc="04"
       apn="timbrasil.br"
@@ -17543,7 +17673,7 @@
       mmsproxy="200.179.66.242"
       mmsport="8080"
       authtype="1"
-      type="default,supl,mms"
+      type="default,mms"
   />
 
   <apn carrier="Java Session"
@@ -17552,8 +17682,8 @@
       apn="java.claro.com.br"
       user="claro"
       password="claro"
-      authtype="1"
-      type="default,supl"
+      authtype="0"
+      type="default"
   />
 
   <apn carrier="Claro Foto"
@@ -17579,6 +17709,7 @@
       mmsproxy="200.142.130.104"
       mmsport="80"
       authtype="1"
+      protocol="IPV4V6"
       type="mms"
   />
 
@@ -17589,7 +17720,8 @@
       user="vivo"
       password="vivo"
       authtype="1"
-      type="default,supl"
+      protocol="IPV4V6"
+      type="default"
   />
 
   <apn carrier="SCTL MMS"
@@ -17620,7 +17752,9 @@
       apn="zap.vivo.com.br"
       user="vivo"
       password="vivo"
-      type="default,supl"
+      authtype="1"
+      protocol="IPV4V6"
+      type="default"
   />
 
   <apn carrier="Vivo MMS"
@@ -17633,6 +17767,7 @@
       mmsproxy="200.142.130.104"
       mmsport="80"
       authtype="1"
+      protocol="IPV4V6"
       type="mms"
   />
 
@@ -17646,6 +17781,7 @@
       mmsproxy="200.142.130.104"
       mmsport="80"
       authtype="1"
+      protocol="IPV4V6"
       type="mms"
   />
 
@@ -17656,7 +17792,8 @@
       user="vivo"
       password="vivo"
       authtype="1"
-      type="default,supl"
+      protocol="IPV4V6"
+      type="default"
   />
 
 
@@ -17683,6 +17820,29 @@
       type="mms"
   />
 
+  <apn carrier="Oi GPRS Internet"
+      mcc="724"
+      mnc="16"
+      apn="gprs.oi.com.br"
+      protocol="IPV4V6"
+      authtype="0"
+      type="default"
+  />
+
+  <apn carrier="MMS GPRS"
+      mcc="724"
+      mnc="16"
+      apn="mmsgprs.oi.com.br"
+      user="oimms"
+      password="oioioi"
+      mmsc="http://200.222.42.204:8002"
+      mmsproxy="192.168.10.50"
+      mmsport="3128"
+      authtype="1"
+      protocol="IPV4V6"
+      type="mms"
+  />
+
   <apn carrier="TelemigC GPRS"
       mcc="724"
       mnc="19"
@@ -17711,10 +17871,10 @@
       user="vivo"
       password="vivo"
       authtype="1"
-      type="default,supl"
+      protocol="IPV4V6"
+      type="default"
   />
 
-
   <apn carrier="Vivo MMS"
       mcc="724"
       mnc="23"
@@ -17725,6 +17885,7 @@
       mmsproxy="200.142.130.104"
       mmsport="80"
       authtype="1"
+      protocol="IPV4V6"
       type="mms"
   />
 
@@ -17751,27 +17912,61 @@
       type="mms"
   />
 
-  <apn carrier="OI GPRS"
+  <apn carrier="Oi GPRS Internet"
       mcc="724"
       mnc="31"
       apn="gprs.oi.com.br"
-      authtype="1"
-      type="default,supl"
+      protocol="IPV4V6"
+      authtype="0"
+      type="default"
   />
 
-  <apn carrier="OI MMS"
+  <apn carrier="MMS GPRS"
       mcc="724"
       mnc="31"
       apn="mmsgprs.oi.com.br"
       user="oimms"
-      password="oimms"
+      password="oioioi"
       mmsc="http://200.222.42.204:8002"
       mmsproxy="192.168.10.50"
       mmsport="3128"
       authtype="1"
+      protocol="IPV4V6"
       type="mms"
   />
 
+  <apn carrier='Nextel GPS'
+      mcc='724'
+      mnc='39'
+      apn='gps.nextel3g.net.br'
+      server='http://supl.nextel3g.net.br'
+      authtype='0'
+      type='supl'
+      protocol='IPV4V6'
+      roaming_protocol='IPV4V6'
+  />
+
+  <apn carrier='Nextel MMS'
+      mcc='724'
+      mnc='39'
+      apn='mms.nextel3g.net.br'
+      authtype='0'
+      mmsc='http://3gmms.nextel3g.net.br'
+      mmsproxy='129.192.129.104'
+      mmsport='8080'
+      type='mms'
+  />
+
+  <apn carrier='Nextel WAP'
+      mcc='724'
+      mnc='39'
+      apn='wap.nextel3g.net.br'
+      authtype='0'
+      type='default'
+      protocol='IPV4V6'
+      roaming_protocol='IPV4V6'
+  />
+
   <apn carrier="Internet Movil"
       mcc="730"
       mnc="01"
diff --git a/camera/QCameraHWI.cpp b/camera/QCameraHWI.cpp
index f3608f8..a26811e 100755
--- a/camera/QCameraHWI.cpp
+++ b/camera/QCameraHWI.cpp
@@ -1,5 +1,5 @@
 /*
-** Copyright (c) 2011-2012 The Linux Foundation. All rights reserved.
+** Copyright (c) 2011-2012,2015 The Linux Foundation. All rights reserved.
 **
 ** Licensed under the Apache License, Version 2.0 (the "License");
 ** you may not use this file except in compliance with the License.
@@ -176,7 +176,6 @@
                     mSnapshotFormat(0),
                     mStartRecording(0),
                     mZslInterval(1),
-                    mNoDisplayMode(0),
                     mBrightness(0),
                     mContrast(0),
                     mEffects(0),
@@ -1031,7 +1030,7 @@
         ALOGV("%s:  HAL::startPreview begin", __func__);
 
         if(QCAMERA_HAL_PREVIEW_START == mPreviewState &&
-           (mPreviewWindow || isNoDisplayMode())) {
+           (mPreviewWindow)) {
             ALOGD("%s:  start preview now", __func__);
             retVal = startPreview2();
             if(retVal == NO_ERROR)
@@ -2677,11 +2676,6 @@
     ALOGV("%s: X", __func__);
 }
 
-bool QCameraHardwareInterface::isNoDisplayMode()
-{
-  return (mNoDisplayMode != 0);
-}
-
 void QCameraHardwareInterface::pausePreviewForZSL()
 {
     ALOGV("%s: mRestartPreview %d", __func__, mRestartPreview);
diff --git a/camera/QCameraHWI.h b/camera/QCameraHWI.h
index f7e58ef..1a1604c 100755
--- a/camera/QCameraHWI.h
+++ b/camera/QCameraHWI.h
@@ -1,5 +1,5 @@
 /*
-** Copyright (c) 2011-2012 The Linux Foundation. All rights reserved.
+** Copyright (c) 2011-2012, 2015, The Linux Foundation. All rights reserved.
 **
 ** Licensed under the Apache License, Version 2.0 (the "License");
 ** you may not use this file except in compliance with the License.
@@ -453,7 +453,6 @@
     void processEvent(mm_camera_event_t *);
     int  getJpegQuality() const;
     int  getNumOfSnapshots(void) const;
-    int  getNumOfSnapshots(const QCameraParameters& params);
     int  getThumbSizesFromAspectRatio(uint32_t aspect_ratio,
                                      int *picture_width,
                                      int *picture_height);
@@ -493,7 +492,6 @@
       char* ext, int index);
     preview_format_info_t getPreviewFormatInfo( );
     bool isCameraReady();
-    bool isNoDisplayMode();
 
 private:
     int16_t  zoomRatios[MAX_ZOOM_RATIOS];
@@ -579,7 +577,7 @@
     status_t setVideoSize(const QCameraParameters& params);
     status_t setPictureSize(const QCameraParameters& params);
     status_t setJpegQuality(const QCameraParameters& params);
-    status_t setNumOfSnapshot(const QCameraParameters& params);
+    status_t setNumOfSnapshot();
     status_t setJpegRotation(int isZSL);
     int getJpegRotation(void);
     int getISOSpeedValue();
diff --git a/camera/QCameraHWI_Parm.cpp b/camera/QCameraHWI_Parm.cpp
index 72baa33..4eb8ca3 100644
--- a/camera/QCameraHWI_Parm.cpp
+++ b/camera/QCameraHWI_Parm.cpp
@@ -1,5 +1,5 @@
 /*
-** Copyright (c) 2011-2012 The Linux Foundation. All rights reserved.
+** Copyright (c) 2011-2012, 2015, The Linux Foundation. All rights reserved.
 **
 ** Licensed under the Apache License, Version 2.0 (the "License");
 ** you may not use this file except in compliance with the License.
@@ -1411,13 +1411,12 @@
     } else {
       mParameters.set("capture-burst-exposures", str_val);
     }
-    mParameters.set("num-snaps-per-shutter", params.get("num-snaps-per-shutter"));
 
     if ((rc = setAEBracket(params)))              final_rc = rc;
     //    if ((rc = setDenoise(params)))                final_rc = rc;
     if ((rc = setPreviewFpsRange(params)))              final_rc = rc;
     if((rc = setRecordingHint(params)))                 final_rc = rc;
-    if ((rc = setNumOfSnapshot(params)))                final_rc = rc;
+    if ((rc = setNumOfSnapshot()))                      final_rc = rc;
     if ((rc = setAecAwbLock(params)))                   final_rc = rc;
     if ((rc = setWhiteBalance(params)))                 final_rc = rc;
     const char *str = params.get(QCameraParameters::KEY_SCENE_MODE);
@@ -2167,6 +2166,14 @@
             if(strcmp(str,oldstr)) {
                 ALOGV("%s: valued changed from %s to %s",__func__,oldstr, str);
 
+                if (!strcmp(str, "hdr")) {
+                    ALOGV("%s: setting num-snaps-per-shutter to 2", __func__);
+                    mParameters.set("num-snaps-per-shutter", 2);
+                } else {
+                    ALOGV("%s: setting num-snaps-per-shutter to 1", __func__);
+                    mParameters.set("num-snaps-per-shutter", 1);
+                }
+
                 /* Check if we are either transitioning to/from HDR state
                    if yes preview needs restart*/
                 if(!strcmp(str, "hdr") || !strcmp(oldstr, "hdr") ) {
@@ -2180,8 +2187,10 @@
                         pausePreviewForZSL();
                     }
                 }
+
             }
 
+
             mParameters.set(QCameraParameters::KEY_SCENE_MODE, str);
             bool ret = native_set_parms(MM_CAMERA_PARM_BESTSHOT_MODE, sizeof(value),
                                        (void *)&value);
@@ -2849,16 +2858,10 @@
 }
 
 status_t QCameraHardwareInterface::
-setNumOfSnapshot(const QCameraParameters& params) {
+setNumOfSnapshot() {
     status_t rc = NO_ERROR;
 
-    int num_of_snapshot = getNumOfSnapshots(params);
-
-    if (num_of_snapshot <= 0) {
-        num_of_snapshot = 1;
-    }
-    ALOGV("number of snapshots = %d", num_of_snapshot);
-    mParameters.set("num-snaps-per-shutter", num_of_snapshot);
+    int num_of_snapshot = getNumOfSnapshots();
 
     bool result = native_set_parms(MM_CAMERA_PARM_SNAPSHOT_BURST_NUM,
                                    sizeof(int),
@@ -3188,7 +3191,7 @@
     if(!strcmp(str2, "hdr")) {
         str="HDR";
     }   else {
-        str = params.get(QCameraParameters::KEY_AE_BRACKET_HDR);
+        str=QCameraParameters::AE_BRACKET_HDR_OFF;
     }
 
     if (str != NULL) {
@@ -3571,22 +3574,6 @@
     }
 }
 
-int QCameraHardwareInterface::getNumOfSnapshots(const QCameraParameters& params)
-{
-    char prop[PROPERTY_VALUE_MAX];
-    memset(prop, 0, sizeof(prop));
-    property_get("persist.camera.snapshot.number", prop, "0");
-    ALOGV("%s: prop enable/disable = %d", __func__, atoi(prop));
-    if (atoi(prop)) {
-        ALOGV("%s: Reading maximum no of snapshots = %d"
-             "from properties", __func__, atoi(prop));
-        return atoi(prop);
-    } else {
-        return params.getInt("num-snaps-per-shutter");
-    }
-
-}
-
 int QCameraHardwareInterface::
 getThumbSizesFromAspectRatio(uint32_t aspect_ratio,
                              int *picture_width,
diff --git a/camera/QCameraHWI_Preview.cpp b/camera/QCameraHWI_Preview.cpp
index 658bd84..30927c5 100644
--- a/camera/QCameraHWI_Preview.cpp
+++ b/camera/QCameraHWI_Preview.cpp
@@ -1,5 +1,5 @@
 /*
-** Copyright (c) 2011-2012 The Linux Foundation. All rights reserved.
+** Copyright (c) 2011-2012,2015 The Linux Foundation. All rights reserved.
 **
 ** Licensed under the Apache License, Version 2.0 (the "License");
 ** you may not use this file except in compliance with the License.
@@ -315,96 +315,6 @@
     return NO_ERROR;
 }
 
-
-status_t  QCameraStream_preview::getBufferNoDisplay( )
-{
-  int err = 0;
-  status_t ret = NO_ERROR;
-  int i, num_planes, frame_len, y_off, cbcr_off;
-  cam_ctrl_dimension_t dim;
-  uint32_t planes[VIDEO_MAX_PLANES];
-
-  ALOGV("%s : E ", __FUNCTION__);
-
-
-  ret = cam_config_get_parm(mCameraId, MM_CAMERA_PARM_DIMENSION, &dim);
-  if(ret != NO_ERROR) {
-      ALOGE("%s: display format %d is not supported", __func__, dim.prev_format);
-    goto end;
-  }
-  mHalCamCtrl->mPreviewMemoryLock.lock();
-  mHalCamCtrl->mNoDispPreviewMemory.buffer_count = kPreviewBufferCount;
-  if(mHalCamCtrl->isZSLMode()) {
-    if(mHalCamCtrl->getZSLQueueDepth() > kPreviewBufferCount - 3)
-      mHalCamCtrl->mNoDispPreviewMemory.buffer_count =
-      mHalCamCtrl->getZSLQueueDepth() + 3;
-  }
-
-  num_planes = dim.display_frame_offset.num_planes;
-  for ( i = 0; i < num_planes; i++) {
-    planes[i] = dim.display_frame_offset.mp[i].len;
-  }
-
-  frame_len = dim.picture_frame_offset.frame_len;
-  y_off = dim.picture_frame_offset.mp[0].offset;
-  cbcr_off = dim.picture_frame_offset.mp[1].offset;
-  ALOGV("%s: main image: rotation = %d, yoff = %d, cbcroff = %d, size = %d, width = %d, height = %d",
-       __func__, dim.rotation, y_off, cbcr_off, frame_len,
-       dim.display_width, dim.display_height);
-  if (mHalCamCtrl->initHeapMem(&mHalCamCtrl->mNoDispPreviewMemory,
-     mHalCamCtrl->mNoDispPreviewMemory.buffer_count,
-     frame_len, y_off, cbcr_off, MSM_PMEM_MAINIMG,
-     NULL,NULL, num_planes, planes) < 0) {
-              ret = NO_MEMORY;
-              goto end;
-  };
-
-  memset(&mHalCamCtrl->mMetadata, 0, sizeof(mHalCamCtrl->mMetadata));
-  memset(mHalCamCtrl->mFace, 0, sizeof(mHalCamCtrl->mFace));
-
-  ALOGV(" %s : X ",__FUNCTION__);
-end:
-  //mDisplayLock.unlock();
-  mHalCamCtrl->mPreviewMemoryLock.unlock();
-
-  return NO_ERROR;
-}
-
-status_t   QCameraStream_preview::freeBufferNoDisplay()
-{
-  int err = 0;
-  status_t ret = NO_ERROR;
-
-  ALOGV(" %s : E ", __FUNCTION__);
-
-  //mDisplayLock.lock();
-  mHalCamCtrl->mPreviewMemoryLock.lock();
-  for (int cnt = 0; cnt < mHalCamCtrl->mNoDispPreviewMemory.buffer_count; cnt++) {
-      if (cnt < mHalCamCtrl->mNoDispPreviewMemory.buffer_count) {
-          if (NO_ERROR != mHalCamCtrl->sendUnMappingBuf(MSM_V4L2_EXT_CAPTURE_MODE_PREVIEW,
-                       cnt, mCameraId, CAM_SOCK_MSG_TYPE_FD_UNMAPPING)) {
-              ALOGE("%s: sending data Msg Failed", __func__);
-          }
-          if(mHalCamCtrl->isZSLMode()) {
-              if (NO_ERROR != mHalCamCtrl->sendUnMappingBuf(MSM_V4L2_EXT_CAPTURE_MODE_THUMBNAIL, cnt, mCameraId,
-                                                            CAM_SOCK_MSG_TYPE_FD_UNMAPPING)) {
-                  ALOGE("%s: Send socket msg to Unmap Failed", __func__);
-              }
-          }
-      }
-  }
-  mHalCamCtrl->releaseHeapMem(&mHalCamCtrl->mNoDispPreviewMemory);
-  memset(&mHalCamCtrl->mNoDispPreviewMemory, 0, sizeof(mHalCamCtrl->mNoDispPreviewMemory));
-  if (mDisplayBuf.preview.buf.mp != NULL) {
-      delete[] mDisplayBuf.preview.buf.mp;
-      mDisplayBuf.preview.buf.mp = NULL;
-  }
-
-  mHalCamCtrl->mPreviewMemoryLock.unlock();
-  ALOGV(" %s : X ",__FUNCTION__);
-  return NO_ERROR;
-}
-
 void QCameraStream_preview::notifyROIEvent(fd_roi_t roi)
 {
     camera_memory_t *data = mHalCamCtrl->mGetMemory(-1, 1, 1, NULL);
@@ -547,7 +457,6 @@
   mHalCamCtrl->mPreviewMemoryLock.lock();
   memset(&mHalCamCtrl->mPreviewMemory, 0, sizeof(mHalCamCtrl->mPreviewMemory));
   mHalCamCtrl->mPreviewMemoryLock.unlock();
-  memset(&mNotifyBuffer, 0, sizeof(mNotifyBuffer));
 
 /* get preview size, by qury mm_camera*/
   memset(&dim, 0, sizeof(cam_ctrl_dimension_t));
@@ -593,14 +502,14 @@
 
   /*allocate memory for the buffers*/
   for(int i = 0; i < mDisplayStreamBuf.num; i++){
-	  if (mHalCamCtrl->mPreviewMemory.private_buffer_handle[i] == NULL)
-		  continue;
+      if (mHalCamCtrl->mPreviewMemory.private_buffer_handle[i] == NULL)
+          continue;
       mDisplayStreamBuf.frame[i].fd = mHalCamCtrl->mPreviewMemory.private_buffer_handle[i]->fd;
       mDisplayStreamBuf.frame[i].cbcr_off = planes[0];
       mDisplayStreamBuf.frame[i].y_off = 0;
       mDisplayStreamBuf.frame[i].path = OUTPUT_TYPE_P;
-	  mHalCamCtrl->mPreviewMemory.addr_offset[i] =
-	      mHalCamCtrl->mPreviewMemory.private_buffer_handle[i]->offset;
+      mHalCamCtrl->mPreviewMemory.addr_offset[i] =
+              mHalCamCtrl->mPreviewMemory.private_buffer_handle[i]->offset;
       mDisplayStreamBuf.frame[i].buffer =
           (long unsigned int)mHalCamCtrl->mPreviewMemory.camera_memory[i]->data;
       mDisplayStreamBuf.frame[i].ion_alloc.len = mHalCamCtrl->mPreviewMemory.private_buffer_handle[i]->size;
@@ -658,6 +567,11 @@
         mDisplayBuf.preview.buf.mp[i].planes[j-1].length;
     }
 
+    if (mHalCamCtrl->mPreviewMemory.local_flag[i] == BUFFER_NOT_OWNED) {
+      mDisplayBuf.preview.no_enqueue_flag[i] = 1;
+    } else {
+      mDisplayBuf.preview.no_enqueue_flag[i] = 0;
+    }
     for (int j = 0; j < num_planes; j++)
       ALOGV("Planes: %d length: %d userptr: %lu offset: %d\n", j,
         mDisplayBuf.preview.buf.mp[i].planes[j].length,
@@ -680,151 +594,6 @@
     return ret;
 }
 
-status_t QCameraStream_preview::initPreviewOnlyBuffers()
-{
-  status_t ret = NO_ERROR;
-  int width = 0;  /* width of channel  */
-  int height = 0; /* height of channel */
-  uint32_t frame_len = 0; /* frame planner length */
-  int buffer_num = 4; /* number of buffers for display */
-  const char *pmem_region;
-  uint8_t num_planes = 0;
-  uint32_t planes[VIDEO_MAX_PLANES];
-
-  cam_ctrl_dimension_t dim;
-
-  ALOGV("%s:BEGIN",__func__);
-  memset(&mHalCamCtrl->mMetadata, 0, sizeof(camera_frame_metadata_t));
-  mHalCamCtrl->mPreviewMemoryLock.lock();
-  memset(&mHalCamCtrl->mNoDispPreviewMemory, 0, sizeof(mHalCamCtrl->mNoDispPreviewMemory));
-  mHalCamCtrl->mPreviewMemoryLock.unlock();
-  memset(&mNotifyBuffer, 0, sizeof(mNotifyBuffer));
-
-/* get preview size, by qury mm_camera*/
-  memset(&dim, 0, sizeof(cam_ctrl_dimension_t));
-  ret = cam_config_get_parm(mCameraId, MM_CAMERA_PARM_DIMENSION, &dim);
-  if (MM_CAMERA_OK != ret) {
-    ALOGE("%s: error - can't get camera dimension!", __func__);
-    ALOGV("%s: X", __func__);
-    return BAD_VALUE;
-  }else {
-    width =  dim.display_width;
-    height = dim.display_height;
-  }
-
-  ret = getBufferNoDisplay( );
-  if(ret != NO_ERROR) {
-    ALOGE("%s: cannot get memory from surface texture client, ret = %d", __func__, ret);
-    return ret;
-  }
-
-  /* set 4 buffers for display */
-  memset(&mDisplayStreamBuf, 0, sizeof(mDisplayStreamBuf));
-  mHalCamCtrl->mPreviewMemoryLock.lock();
-  this->mDisplayStreamBuf.num = mHalCamCtrl->mNoDispPreviewMemory.buffer_count;
-  this->myMode=myMode; /*Need to assign this in constructor after translating from mask*/
-  num_planes = dim.display_frame_offset.num_planes;
-  for (int i = 0; i < num_planes; i++) {
-    planes[i] = dim.display_frame_offset.mp[i].len;
-  }
-  this->mDisplayStreamBuf.frame_len = dim.display_frame_offset.frame_len;
-
-  memset(&mDisplayBuf, 0, sizeof(mDisplayBuf));
-  mDisplayBuf.preview.buf.mp = new mm_camera_mp_buf_t[mDisplayStreamBuf.num];
-  if (!mDisplayBuf.preview.buf.mp) {
-    ALOGE("%s Error allocating memory for mplanar struct ", __func__);
-  }
-  memset(mDisplayBuf.preview.buf.mp, 0,
-    mDisplayStreamBuf.num * sizeof(mm_camera_mp_buf_t));
-
-  /*allocate memory for the buffers*/
-  void *vaddr = NULL;
-  for(int i = 0; i < mDisplayStreamBuf.num; i++){
-	  if (mHalCamCtrl->mNoDispPreviewMemory.camera_memory[i] == NULL)
-		  continue;
-      mDisplayStreamBuf.frame[i].fd = mHalCamCtrl->mNoDispPreviewMemory.fd[i];
-      mDisplayStreamBuf.frame[i].cbcr_off = planes[0];
-      mDisplayStreamBuf.frame[i].y_off = 0;
-      mDisplayStreamBuf.frame[i].path = OUTPUT_TYPE_P;
-      mDisplayStreamBuf.frame[i].buffer =
-          (long unsigned int)mHalCamCtrl->mNoDispPreviewMemory.camera_memory[i]->data;
-      mDisplayStreamBuf.frame[i].ion_dev_fd = mHalCamCtrl->mNoDispPreviewMemory.main_ion_fd[i];
-      mDisplayStreamBuf.frame[i].fd_data = mHalCamCtrl->mNoDispPreviewMemory.ion_info_fd[i];
-
-    ALOGV("%s: idx = %d, fd = %d, size = %d, cbcr_offset = %d, y_offset = %d, "
-      "vaddr = 0x%x", __func__, i, mDisplayStreamBuf.frame[i].fd,
-      frame_len,
-      mDisplayStreamBuf.frame[i].cbcr_off, mDisplayStreamBuf.frame[i].y_off,
-      (uint32_t)mDisplayStreamBuf.frame[i].buffer);
-
-    if (NO_ERROR != mHalCamCtrl->sendMappingBuf(
-                        MSM_V4L2_EXT_CAPTURE_MODE_PREVIEW,
-                        i,
-                        mDisplayStreamBuf.frame[i].fd,
-                        mHalCamCtrl->mNoDispPreviewMemory.size,
-                        mCameraId, CAM_SOCK_MSG_TYPE_FD_MAPPING)) {
-      ALOGE("%s: sending mapping data Msg Failed", __func__);
-    }
-
-    if(mHalCamCtrl->isZSLMode()) {
-        if (NO_ERROR != mHalCamCtrl->sendMappingBuf(
-                    MSM_V4L2_EXT_CAPTURE_MODE_THUMBNAIL,
-                    i,
-                    mDisplayStreamBuf.frame[i].fd,
-                    mHalCamCtrl->mNoDispPreviewMemory.size,
-                    mCameraId, CAM_SOCK_MSG_TYPE_FD_MAPPING)) {
-            ALOGE("%s: sending mapping data Msg Failed", __func__);
-        }
-    }
-    mDisplayBuf.preview.buf.mp[i].frame = mDisplayStreamBuf.frame[i];
-    mDisplayBuf.preview.buf.mp[i].frame_offset = mDisplayStreamBuf.frame[i].y_off;
-    mDisplayBuf.preview.buf.mp[i].num_planes = num_planes;
-
-    /* Plane 0 needs to be set seperately. Set other planes
-     * in a loop. */
-    mDisplayBuf.preview.buf.mp[i].planes[0].length = planes[0];
-    mDisplayBuf.preview.buf.mp[i].planes[0].m.userptr = mDisplayStreamBuf.frame[i].fd;
-    mDisplayBuf.preview.buf.mp[i].planes[0].data_offset = 0;
-    mDisplayBuf.preview.buf.mp[i].planes[0].reserved[0] =
-      mDisplayBuf.preview.buf.mp[i].frame_offset;
-    for (int j = 1; j < num_planes; j++) {
-      mDisplayBuf.preview.buf.mp[i].planes[j].length = planes[j];
-      mDisplayBuf.preview.buf.mp[i].planes[j].m.userptr =
-        mDisplayStreamBuf.frame[i].fd;
-      mDisplayBuf.preview.buf.mp[i].planes[j].data_offset = 0;
-      mDisplayBuf.preview.buf.mp[i].planes[j].reserved[0] =
-        mDisplayBuf.preview.buf.mp[i].planes[j-1].reserved[0] +
-        mDisplayBuf.preview.buf.mp[i].planes[j-1].length;
-    }
-
-    for (int j = 0; j < num_planes; j++)
-      ALOGV("Planes: %d length: %d userptr: %lu offset: %d\n", j,
-        mDisplayBuf.preview.buf.mp[i].planes[j].length,
-        mDisplayBuf.preview.buf.mp[i].planes[j].m.userptr,
-        mDisplayBuf.preview.buf.mp[i].planes[j].reserved[0]);
-  }/*end of for loop*/
-
- /* register the streaming buffers for the channel*/
-  mDisplayBuf.ch_type = MM_CAMERA_CH_PREVIEW;
-  mDisplayBuf.preview.num = mDisplayStreamBuf.num;
-  mHalCamCtrl->mPreviewMemoryLock.unlock();
-  ALOGV("%s:END",__func__);
-  return NO_ERROR;
-
-end:
-  if (MM_CAMERA_OK == ret ) {
-    ALOGV("%s: X - NO_ERROR ", __func__);
-    return NO_ERROR;
-  }
-
-    ALOGV("%s: out of memory clean up", __func__);
-  /* release the allocated memory */
-
-  ALOGV("%s: X - BAD_VALUE ", __func__);
-  return BAD_VALUE;
-}
-
-
 void QCameraStream_preview::dumpFrameToFile(struct msm_frame* newFrame)
 {
 #if 0
@@ -909,10 +678,9 @@
   mHalCamCtrl->dumpFrameToFile(frame->def.frame, HAL_DUMP_FRM_PREVIEW);
 
   mHalCamCtrl->mPreviewMemoryLock.lock();
-  mNotifyBuffer[frame->def.idx] = *frame;
 
-  ALOGV("Enqueue buf handle %p\n",
-  mHalCamCtrl->mPreviewMemory.buffer_handle[frame->def.idx]);
+  ALOGV("Enqueue buf handle %p, index %d\n",
+  mHalCamCtrl->mPreviewMemory.buffer_handle[frame->def.idx], frame->def.idx);
   ALOGV("%s: camera call genlock_unlock", __FUNCTION__);
 
     if (BUFFER_LOCKED == mHalCamCtrl->mPreviewMemory.local_flag[frame->def.idx]) {
@@ -989,10 +757,10 @@
               &buffer_handle, &tmp_stride);
   if (err == NO_ERROR && buffer_handle != NULL) {
 
-    ALOGV("%s: dequed buf hdl =%p", __func__, *buffer_handle);
     for(i = 0; i < mHalCamCtrl->mPreviewMemory.buffer_count; i++) {
         if(mHalCamCtrl->mPreviewMemory.buffer_handle[i] == buffer_handle) {
           mHalCamCtrl->mPreviewMemory.local_flag[i] = BUFFER_UNLOCKED;
+          ALOGV("%s: dequed buf hdl =%p, index = %d", __func__, *buffer_handle, i);
           break;
         }
     }
@@ -1006,9 +774,14 @@
            // return -EINVAL;
       } else  {
         mHalCamCtrl->mPreviewMemory.local_flag[i] = BUFFER_LOCKED;
-
-        if(MM_CAMERA_OK != cam_evt_buf_done(mCameraId, &mNotifyBuffer[i])) {
-            ALOGE("BUF DONE FAILED");
+        mm_camera_ch_data_buf_t notify;
+        memset(&notify, 0, sizeof(mm_camera_ch_data_buf_t));
+        notify.type = MM_CAMERA_CH_PREVIEW;
+        notify.def.idx = i;
+        notify.def.frame = &mDisplayStreamBuf.frame[i];
+        ALOGV("%s: queueing buffer idx is %d", __func__, i);
+        if(MM_CAMERA_OK != cam_evt_buf_done(mCameraId, &notify)) {
+            ALOGE("%s: BUF DONE FAILED");
         }
       }
      }
@@ -1126,126 +899,10 @@
   return NO_ERROR;
 }
 
-
-status_t QCameraStream_preview::processPreviewFrameWithOutDisplay(
-  mm_camera_ch_data_buf_t *frame)
-{
-  ALOGV("%s",__func__);
-  int err = 0;
-  int msgType = 0;
-  int i;
-  camera_memory_t *data = NULL;
-  camera_frame_metadata_t *metadata = NULL;
-
-  Mutex::Autolock lock(mStopCallbackLock);
-  if(!mActive) {
-    ALOGV("Preview Stopped. Returning callback");
-    return NO_ERROR;
-  }
-  if(mHalCamCtrl==NULL) {
-    ALOGE("%s: X: HAL control object not set",__func__);
-    /*Call buf done*/
-    return BAD_VALUE;
-  }
-
-  if (UNLIKELY(mHalCamCtrl->mDebugFps)) {
-      mHalCamCtrl->debugShowPreviewFPS();
-  }
-  //dumpFrameToFile(frame->def.frame);
-  mHalCamCtrl->dumpFrameToFile(frame->def.frame, HAL_DUMP_FRM_PREVIEW);
-
-  mHalCamCtrl->mPreviewMemoryLock.lock();
-  mNotifyBuffer[frame->def.idx] = *frame;
-
-  /* Save the last displayed frame. We'll be using it to fill the gap between
-     when preview stops and postview start during snapshot.*/
-  mLastQueuedFrame = &(mDisplayStreamBuf.frame[frame->def.idx]);
-  mHalCamCtrl->mPreviewMemoryLock.unlock();
-
-  mHalCamCtrl->mCallbackLock.lock();
-  camera_data_callback pcb = mHalCamCtrl->mDataCb;
-  mHalCamCtrl->mCallbackLock.unlock();
-  ALOGV("Message enabled = 0x%x", mHalCamCtrl->mMsgEnabled);
-
-  camera_memory_t *previewMem = NULL;
-  int previewWidth, previewHeight;
-  mHalCamCtrl->mParameters.getPreviewSize(&previewWidth, &previewHeight);
-
-#ifdef USE_ION
-  struct ion_flush_data cache_inv_data;
-  int ion_fd;
-  ion_fd = frame->def.frame->ion_dev_fd;
-  cache_inv_data.vaddr = (void *)frame->def.frame->buffer;
-  cache_inv_data.fd = frame->def.frame->fd;
-  cache_inv_data.handle = frame->def.frame->fd_data.handle;
-  cache_inv_data.length = frame->def.frame->ion_alloc.len;
-
-  if (mHalCamCtrl->cache_ops(ion_fd, &cache_inv_data,
-                                ION_IOC_CLEAN_INV_CACHES) < 0)
-    ALOGE("%s: Cache clean for Preview buffer %p fd = %d failed", __func__,
-      cache_inv_data.vaddr, cache_inv_data.fd);
-#endif
-
-  if (pcb != NULL) {
-      //Sending preview callback if corresponding Msgs are enabled
-      if(mHalCamCtrl->mMsgEnabled & CAMERA_MSG_PREVIEW_FRAME) {
-          msgType |=  CAMERA_MSG_PREVIEW_FRAME;
-          int previewBufSize;
-          /* For CTS : Forcing preview memory buffer lenth to be
-             'previewWidth * previewHeight * 3/2'.
-              Needed when gralloc allocated extra memory.*/
-          //Can add this check for other formats as well.
-          if( mHalCamCtrl->mPreviewFormat == CAMERA_YUV_420_NV21) {
-              previewBufSize = previewWidth * previewHeight * 3/2;
-              if(previewBufSize != mHalCamCtrl->mPreviewMemory.private_buffer_handle[frame->def.idx]->size) {
-                  previewMem = mHalCamCtrl->mGetMemory(mHalCamCtrl->mPreviewMemory.private_buffer_handle[frame->def.idx]->fd,
-                  previewBufSize, 1, mHalCamCtrl->mCallbackCookie);
-                  if (!previewMem || !previewMem->data) {
-                      ALOGE("%s: mGetMemory failed.\n", __func__);
-                  } else {
-                      data = previewMem;
-                  }
-              } else
-                    data = mHalCamCtrl->mPreviewMemory.camera_memory[frame->def.idx];//mPreviewHeap->mBuffers[frame->def.idx];
-          } else
-                data = mHalCamCtrl->mPreviewMemory.camera_memory[frame->def.idx];//mPreviewHeap->mBuffers[frame->def.idx];
-      } else {
-          data = NULL;
-      }
-
-      if(mHalCamCtrl->mMsgEnabled & CAMERA_MSG_PREVIEW_METADATA){
-          msgType  |= CAMERA_MSG_PREVIEW_METADATA;
-          metadata = &mHalCamCtrl->mMetadata;
-      } else {
-          metadata = NULL;
-      }
-      if(msgType) {
-          mStopCallbackLock.unlock();
-          if(mActive)
-            pcb(msgType, data, 0, metadata, mHalCamCtrl->mCallbackCookie);
-          if (previewMem)
-              previewMem->release(previewMem);
-          mStopCallbackLock.lock();
-      }
-
-      if(MM_CAMERA_OK != cam_evt_buf_done(mCameraId, &mNotifyBuffer[frame->def.idx])) {
-          ALOGE("BUF DONE FAILED");
-      }
-
-      ALOGV("end of cb");
-  }
-
-  return NO_ERROR;
-}
-
 status_t QCameraStream_preview::processPreviewFrame (
   mm_camera_ch_data_buf_t *frame)
 {
-  if (mHalCamCtrl->isNoDisplayMode()) {
-    return processPreviewFrameWithOutDisplay(frame);
-  } else {
-    return processPreviewFrameWithDisplay(frame);
-  }
+  return processPreviewFrameWithDisplay(frame);
 }
 
 // ---------------------------------------------------------------------------
@@ -1322,14 +979,8 @@
     previewFmt = mHalCamCtrl->getPreviewFormat();
     setFormat(MM_CAMERA_CH_PREVIEW_MASK, previewFmt);
 
-    if (mHalCamCtrl->isNoDisplayMode()) {
-        if(NO_ERROR!=initPreviewOnlyBuffers()){
-            return BAD_VALUE;
-        }
-    } else {
-        if(NO_ERROR!=initDisplayBuffers()){
-            return BAD_VALUE;
-        }
+    if(NO_ERROR!=initDisplayBuffers()){
+        return BAD_VALUE;
     }
     ALOGV("Debug : %s : initDisplayBuffers",__func__);
 
@@ -1427,11 +1078,7 @@
     /* In case of a clean stop, we need to clean all buffers*/
     ALOGV("Debug : %s : Buffer Unprepared",__func__);
     /*free camera_memory handles and return buffer back to surface*/
-    if (! mHalCamCtrl->isNoDisplayMode() ) {
-      putBufferToSurface();
-    } else {
-      freeBufferNoDisplay( );
-    }
+    putBufferToSurface();
 
     ALOGV("%s: X", __func__);
 
diff --git a/camera/QCameraHWI_Record.cpp b/camera/QCameraHWI_Record.cpp
index f9da650..b1fc886 100644
--- a/camera/QCameraHWI_Record.cpp
+++ b/camera/QCameraHWI_Record.cpp
@@ -1,5 +1,5 @@
 /*
-** Copyright (c) 2011 The Linux Foundation. All rights reserved.
+** Copyright (c) 2011,2015 The Linux Foundation. All rights reserved.
 **
 ** Licensed under the Apache License, Version 2.0 (the "License");
 ** you may not use this file except in compliance with the License.
@@ -506,6 +506,8 @@
           mRecordBuf.video.video.buf.mp[cnt].planes[j-1].reserved[0] +
           mRecordBuf.video.video.buf.mp[cnt].planes[j-1].length;
       }
+
+      mRecordBuf.video.video.no_enqueue_flag[cnt] = 0;
     }
 
     //memset(&mRecordBuf, 0, sizeof(mRecordBuf));
diff --git a/camera/QCameraHWI_Still.cpp b/camera/QCameraHWI_Still.cpp
index 34d8765..d3fe706 100755
--- a/camera/QCameraHWI_Still.cpp
+++ b/camera/QCameraHWI_Still.cpp
@@ -2092,12 +2092,10 @@
 
         if(mHalCamCtrl->mHdrMode == HDR_MODE) {
             if ((hdrRawCount % 3) != 2) {
+                hdrRawCount++;
                 mStopCallbackLock.unlock();
                 return NO_ERROR;
             }
-            else {
-                hdrRawCount++;
-            }
         }
 
         if (rc != NO_ERROR)
diff --git a/camera/QCameraStream.h b/camera/QCameraStream.h
index 5724dbb..d9b0de3 100755
--- a/camera/QCameraStream.h
+++ b/camera/QCameraStream.h
@@ -1,6 +1,6 @@
 /*
 ** Copyright 2008, Google Inc.
-** Copyright (c) 2009-2012, The Linux Foundation. All rights reserved.
+** Copyright (c) 2009-2012,2015, The Linux Foundation. All rights reserved.
 **
 ** Licensed under the Apache License, Version 2.0 (the "License");
 ** you may not use this file except in compliance with the License.
@@ -218,15 +218,11 @@
     void *getLastQueuedFrame(void);
     /*init preview buffers with display case*/
     status_t initDisplayBuffers();
-    /*init preview buffers without display case*/
-    status_t initPreviewOnlyBuffers();
 
     status_t processPreviewFrame(mm_camera_ch_data_buf_t *frame);
 
     /*init preview buffers with display case*/
     status_t processPreviewFrameWithDisplay(mm_camera_ch_data_buf_t *frame);
-    /*init preview buffers without display case*/
-    status_t processPreviewFrameWithOutDisplay(mm_camera_ch_data_buf_t *frame);
 
     int setPreviewWindow(preview_stream_ops_t* window);
     void notifyROIEvent(fd_roi_t roi);
@@ -238,10 +234,6 @@
     status_t                 getBufferFromSurface();
     status_t                 putBufferToSurface();
 
-    /*allocate and free buffers without display case*/
-    status_t                 getBufferNoDisplay();
-    status_t                 freeBufferNoDisplay();
-
     void                     dumpFrameToFile(struct msm_frame* newFrame);
     bool                     mFirstFrameRcvd;
 
@@ -254,7 +246,6 @@
     Mutex                   mDisplayLock;
     preview_stream_ops_t   *mPreviewWindow;
     static const int        kPreviewBufferCount = PREVIEW_BUFFER_COUNT;
-    mm_camera_ch_data_buf_t mNotifyBuffer[16];
     int8_t                  mNumFDRcvd;
     int                     mVFEOutputs;
     int                     mHFRFrameCnt;
diff --git a/camera/mm-camera-interface/mm_camera.c b/camera/mm-camera-interface/mm_camera.c
index 512930b..ff50d58 100644
--- a/camera/mm-camera-interface/mm_camera.c
+++ b/camera/mm-camera-interface/mm_camera.c
@@ -1,5 +1,5 @@
 /*
-Copyright (c) 2011-2012, The Linux Foundation. All rights reserved.
+Copyright (c) 2011-2012,2015, The Linux Foundation. All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are
@@ -690,14 +690,6 @@
     return rc;
 }
 
-int32_t mm_camera_enqueue_buf(mm_camera_obj_t * my_obj, mm_camera_reg_buf_t *buf)
-{
-    int32_t rc = -MM_CAMERA_E_GENERAL;
-    rc = mm_camera_ch_fn(my_obj,    buf->ch_type,
-                    MM_CAMERA_STATE_EVT_ENQUEUE_BUF, (void *)&buf->preview);
-    return rc;
-}
-
 int32_t mm_camera_prepare_buf(mm_camera_obj_t * my_obj, mm_camera_reg_buf_t *buf)
 {
     int32_t rc = -MM_CAMERA_E_GENERAL;
diff --git a/camera/mm-camera-interface/mm_camera.h b/camera/mm-camera-interface/mm_camera.h
index 0d62fbe..57c229b 100644
--- a/camera/mm-camera-interface/mm_camera.h
+++ b/camera/mm-camera-interface/mm_camera.h
@@ -1,5 +1,5 @@
 /*
-Copyright (c) 2011-2012, The Linux Foundation. All rights reserved.
+Copyright (c) 2011-2012,2015, The Linux Foundation. All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are
@@ -58,7 +58,6 @@
     MM_CAMERA_STATE_EVT_GET_CROP,
     MM_CAMERA_STATE_EVT_DISPATCH_BUFFERED_FRAME,
     MM_CAMERA_STATE_EVT_REQUEST_BUF, // request amount of buffers to kernel only
-    MM_CAMERA_STATE_EVT_ENQUEUE_BUF, // enqueue some of buffers to kernel only
     MM_CAMERA_STATE_EVT_MAX
 } mm_camera_state_evt_type_t;
 
@@ -114,7 +113,7 @@
     mm_camera_frame_queue_t readyq;
     int32_t num_frame;
     uint32_t frame_len;
-    int8_t reg_flag;
+    int8_t reg_flag[MM_CAMERA_MAX_NUM_FRAMES];
     uint32_t frame_offset[MM_CAMERA_MAX_NUM_FRAMES];
     mm_camera_frame_t frame[MM_CAMERA_MAX_NUM_FRAMES];
     int8_t ref_count[MM_CAMERA_MAX_NUM_FRAMES];
@@ -302,7 +301,6 @@
 extern int32_t mm_camera_set_parm(mm_camera_obj_t * my_obj,
                                             mm_camera_parm_t *parm);
 extern int32_t mm_camera_request_buf(mm_camera_obj_t * my_obj, mm_camera_reg_buf_t *buf);
-extern int32_t mm_camera_enqueue_buf(mm_camera_obj_t * my_obj, mm_camera_reg_buf_t *buf);
 extern int32_t mm_camera_prepare_buf(mm_camera_obj_t * my_obj, mm_camera_reg_buf_t *buf);
 extern int32_t mm_camera_unprepare_buf(mm_camera_obj_t * my_obj, mm_camera_channel_type_t ch_type);
 extern int mm_camera_poll_thread_launch(mm_camera_obj_t * my_obj, int ch_type);
diff --git a/camera/mm-camera-interface/mm_camera_channel.c b/camera/mm-camera-interface/mm_camera_channel.c
index 40f3fb0..51b0f2c 100755
--- a/camera/mm-camera-interface/mm_camera_channel.c
+++ b/camera/mm-camera-interface/mm_camera_channel.c
@@ -1,5 +1,5 @@
 /*
-Copyright (c) 2011-2012, The Linux Foundation. All rights reserved.
+Copyright (c) 2011-2012,2015, The Linux Foundation. All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are
@@ -721,7 +721,6 @@
         break;
     case MM_CAMERA_STATE_EVT_REG_BUF:
     case MM_CAMERA_STATE_EVT_REQUEST_BUF:
-    case MM_CAMERA_STATE_EVT_ENQUEUE_BUF:
         rc = mm_camera_ch_util_reg_buf(my_obj, ch_type, evt, val);
         break;
     case MM_CAMERA_STATE_EVT_UNREG_BUF:
diff --git a/camera/mm-camera-interface/mm_camera_interface2.c b/camera/mm-camera-interface/mm_camera_interface2.c
index f6ccca9..0d46afb 100755
--- a/camera/mm-camera-interface/mm_camera_interface2.c
+++ b/camera/mm-camera-interface/mm_camera_interface2.c
@@ -1,5 +1,5 @@
 /*
-Copyright (c) 2011-2012, The Linux Foundation. All rights reserved.
+Copyright (c) 2011-2012,2015, The Linux Foundation. All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are
@@ -181,24 +181,6 @@
     return rc;
 }
 
-static int32_t mm_camera_cfg_enqueue_buf(mm_camera_t * camera,
-                                         mm_camera_reg_buf_t *buf)
-{
-    int32_t rc = -MM_CAMERA_E_GENERAL;
-    uint32_t tmp;
-    mm_camera_obj_t * my_obj = NULL;
-
-    pthread_mutex_lock(&g_mutex);
-    my_obj = g_cam_ctrl.cam_obj[camera->camera_info.camera_id];
-    pthread_mutex_unlock(&g_mutex);
-    if(my_obj) {
-        pthread_mutex_lock(&my_obj->mutex);
-        rc =  mm_camera_enqueue_buf(my_obj, buf);
-        pthread_mutex_unlock(&my_obj->mutex);
-    }
-    return rc;
-}
-
 static int32_t mm_camera_cfg_prepare_buf(mm_camera_t * camera,
                                          mm_camera_reg_buf_t *buf)
 {
@@ -240,7 +222,6 @@
   .set_parm = mm_camera_cfg_set_parm,
   .get_parm = mm_camera_cfg_get_parm,
   .request_buf = mm_camera_cfg_request_buf,
-  .enqueue_buf = mm_camera_cfg_enqueue_buf,
   .prepare_buf = mm_camera_cfg_prepare_buf,
   .unprepare_buf = mm_camera_cfg_unprepare_buf
 };
@@ -799,17 +780,6 @@
   return rc;
 }
 
-int32_t cam_config_enqueue_buf(int cam_id, mm_camera_reg_buf_t *buf)
-{
-
-  int32_t rc = -1;
-  mm_camera_t * mm_cam = get_camera_by_id(cam_id);
-  if (mm_cam) {
-    rc = mm_cam->cfg->enqueue_buf(mm_cam, buf);
-  }
-  return rc;
-}
-
 int32_t cam_config_prepare_buf(int cam_id, mm_camera_reg_buf_t *buf)
 {
 
diff --git a/camera/mm-camera-interface/mm_camera_interface2.h b/camera/mm-camera-interface/mm_camera_interface2.h
index ba4dcd5..20153e4 100755
--- a/camera/mm-camera-interface/mm_camera_interface2.h
+++ b/camera/mm-camera-interface/mm_camera_interface2.h
@@ -1,5 +1,5 @@
 /*
-Copyright (c) 2011-2012, The Linux Foundation. All rights reserved.
+Copyright (c) 2011-2012,2015, The Linux Foundation. All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are
@@ -177,6 +177,7 @@
 
 typedef struct {
   int8_t num;
+  int8_t no_enqueue_flag[MM_CAMERA_MAX_NUM_FRAMES];
   union {
       mm_camera_sp_buf_t sp;
       mm_camera_mp_buf_t *mp;
@@ -463,7 +464,6 @@
   mm_camera_parm_type_t parm_type,
   void* p_value);
 int32_t cam_config_request_buf(int cam_id, mm_camera_reg_buf_t *buf);
-int32_t cam_config_enqueue_buf(int cam_id, mm_camera_reg_buf_t *buf);
 int32_t cam_config_prepare_buf(int cam_id, mm_camera_reg_buf_t *buf);
 int32_t cam_config_unprepare_buf(int cam_id, mm_camera_channel_type_t ch_type);
 
diff --git a/camera/mm-camera-interface/mm_camera_stream.c b/camera/mm-camera-interface/mm_camera_stream.c
index e7ee4b1..ba60bcd 100644
--- a/camera/mm-camera-interface/mm_camera_stream.c
+++ b/camera/mm-camera-interface/mm_camera_stream.c
@@ -1,5 +1,5 @@
 /*
-Copyright (c) 2011-2012, The Linux Foundation. All rights reserved.
+Copyright (c) 2011-2012,2015, The Linux Foundation. All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are
@@ -220,6 +220,10 @@
     stream->frame.frame[idx].frame.frame_id = vb.sequence;
     stream->frame.frame[idx].frame.ts.tv_sec  = vb.timestamp.tv_sec;
     stream->frame.frame[idx].frame.ts.tv_nsec = vb.timestamp.tv_usec * 1000;
+
+    CDBG("%s:type=%d,frame idx=%d, frame_id %d\n", __func__,
+      stream->stream_type, idx, vb.sequence);
+
     return idx;
 }
 
@@ -400,7 +404,7 @@
 
   rc = ioctl(stream->fd, VIDIOC_QBUF, &buffer);
   if (rc < 0) {
-      CDBG_ERROR("%s: VIDIOC_QBUF error = %d, stream type=%d\n", __func__, rc, stream->stream_type);
+      CDBG_ERROR("%s: VIDIOC_QBUF error = %d, stream type=%d, errno = %d\n", __func__, rc, stream->stream_type, errno);
       return rc;
   }
   CDBG("%s: X idx: %d, stream_type:%d", __func__, idx, stream->stream_type);
@@ -439,40 +443,6 @@
     return rc;
 }
 
-/* This function enqueue existing buffers (not first time allocated buffers from Surface) to kernel */
-static int mm_camera_stream_util_enqueue_buf(mm_camera_obj_t * my_obj,
-                      mm_camera_stream_t *stream,
-                      mm_camera_buf_def_t *vbuf)
-{
-    int32_t i, rc = MM_CAMERA_OK, j;
-
-    if(vbuf->num > MM_CAMERA_MAX_NUM_FRAMES) {
-        rc = -MM_CAMERA_E_GENERAL;
-        CDBG("%s: buf num %d > max limit %d\n",
-                 __func__, vbuf->num, MM_CAMERA_MAX_NUM_FRAMES);
-        goto end;
-    }
-
-    for(i = 0; i < vbuf->num; i++){
-        int idx = vbuf->buf.mp[i].idx;
-        ALOGV("%s: enqueue buf index = %d\n",__func__, idx);
-        if(idx < MM_CAMERA_MAX_NUM_FRAMES) {
-            ALOGV("%s: stream_fd = %d, frame_fd = %d, frame ID = %d, offset = %d\n",
-                     __func__, stream->fd, stream->frame.frame[i].frame.fd,
-                     idx, stream->frame.frame_offset[idx]);
-            rc = mm_camera_stream_qbuf(my_obj, stream, stream->frame.frame[idx].idx);
-            if (rc < 0) {
-                CDBG("%s: VIDIOC_QBUF rc = %d\n", __func__, rc);
-                goto end;
-            }
-            stream->frame.ref_count[idx] = 0;
-        }
-    }
-    stream->frame.qbuf = 1;
-end:
-    return rc;
-}
-
 static int mm_camera_stream_util_reg_buf(mm_camera_obj_t * my_obj,
                       mm_camera_stream_t *stream,
                       mm_camera_buf_def_t *vbuf)
@@ -548,15 +518,20 @@
             stream->frame.frame_offset[i] = 0;
         }
 
-        rc = mm_camera_stream_qbuf(my_obj, stream, stream->frame.frame[i].idx);
-        if (rc < 0) {
-            CDBG_ERROR("%s: VIDIOC_QBUF rc = %d\n", __func__, rc);
-            goto end;
+        if (!vbuf->no_enqueue_flag[i]) {
+            rc = mm_camera_stream_qbuf(my_obj, stream, stream->frame.frame[i].idx);
+            if (rc < 0) {
+                CDBG_ERROR("%s: VIDIOC_QBUF rc = %d\n", __func__, rc);
+                goto end;
+            }
+            stream->frame.ref_count[i] = 0;
+        } else {
+            stream->frame.ref_count[i] = 1;
         }
-        stream->frame.ref_count[i] = 0;
-        CDBG("%s: stream_fd = %d, frame_fd = %d, frame ID = %d, offset = %d\n",
+        stream->frame.reg_flag[i] = vbuf->no_enqueue_flag[i];
+        CDBG("%s: stream_fd = %d, frame_fd = %d, frame ID = %d, offset = %d, reg_flag = %d, ref_cnt = %d\n",
           __func__, stream->fd, stream->frame.frame[i].frame.fd,
-          i, stream->frame.frame_offset[i]);
+          i, stream->frame.frame_offset[i], stream->frame.reg_flag[i], stream->frame.ref_count[i]);
     }
     stream->frame.qbuf = 1;
 end:
@@ -707,10 +682,6 @@
     case MM_CAMERA_STATE_EVT_REQUEST_BUF:
         rc = mm_camera_stream_util_request_buf(my_obj, stream, ((mm_camera_buf_def_t *)val)->num);
         break;
-    case MM_CAMERA_STATE_EVT_ENQUEUE_BUF:
-        rc = mm_camera_stream_util_enqueue_buf(my_obj, stream, (mm_camera_buf_def_t *)val);
-        if(!rc) mm_camera_stream_util_set_state(stream, MM_CAMERA_STREAM_STATE_REG);
-        break;
     default:
         CDBG_ERROR("%s: Invalid evt=%d, stream_state=%d", __func__, evt,
           stream->state);
@@ -796,13 +767,16 @@
             int i = 0;
             mm_camera_frame_t *frame;
             if(stream->frame.qbuf == 0) {
+                CDBG("%s: queueing buffers during stream on", __func__);
                 for(i = 0; i < stream->frame.num_frame; i++) {
-                    rc = mm_camera_stream_qbuf(my_obj, stream,
-                             stream->frame.frame[i].idx);
-                    if (rc < 0) {
-                        CDBG_ERROR("%s: ioctl VIDIOC_QBUF error=%d, stream->type=%d\n",
-                           __func__, rc, stream->stream_type);
-                        return rc;
+                    if (!stream->frame.reg_flag[i]) {
+                        rc = mm_camera_stream_qbuf(my_obj, stream,
+                                 stream->frame.frame[i].idx);
+                        if (rc < 0) {
+                            CDBG_ERROR("%s: ioctl VIDIOC_QBUF error=%d, stream->type=%d\n",
+                               __func__, rc, stream->stream_type);
+                            return rc;
+                        }
                     }
                     stream->frame.ref_count[i] = 0;
                 }
@@ -820,9 +794,6 @@
                 mm_camera_stream_util_set_state(stream, MM_CAMERA_STREAM_STATE_ACTIVE);
         }
         break;
-    case MM_CAMERA_STATE_EVT_ENQUEUE_BUF:
-        rc = mm_camera_stream_util_enqueue_buf(my_obj, stream, (mm_camera_buf_def_t *)val);
-        break;
     default:
         CDBG_ERROR("%s: Invalid evt=%d, stream_state=%d", __func__, evt,
           stream->state);
@@ -862,10 +833,7 @@
             }
         }
         break;
-    case MM_CAMERA_STATE_EVT_ENQUEUE_BUF:
-        rc = mm_camera_stream_util_enqueue_buf(my_obj, stream, (mm_camera_buf_def_t *)val);
-        break;
-    default:
+   default:
         CDBG_ERROR("%s: Invalid evt=%d, stream_state=%d", __func__, evt,
           stream->state);
         return -1;
diff --git a/device.mk b/device.mk
index 1967fda..c622a80 100644
--- a/device.mk
+++ b/device.mk
@@ -57,7 +57,8 @@
 PRODUCT_COPY_FILES += \
 	device/lge/mako/WCNSS_cfg.dat:system/vendor/firmware/wlan/prima/WCNSS_cfg.dat \
 	device/lge/mako/WCNSS_qcom_cfg.ini:system/etc/wifi/WCNSS_qcom_cfg.ini \
-	device/lge/mako/WCNSS_qcom_wlan_nv.bin:system/etc/wifi/WCNSS_qcom_wlan_nv.bin
+	device/lge/mako/WCNSS_qcom_wlan_nv.bin:system/etc/wifi/WCNSS_qcom_wlan_nv.bin \
+	device/lge/mako/init.mako.wifi.sh:system/etc/init.mako.wifi.sh
 
 PRODUCT_COPY_FILES += \
 	device/lge/mako/audio_policy.conf:system/etc/audio_policy.conf
diff --git a/init.mako.rc b/init.mako.rc
index 7a2339d..40b81a1 100644
--- a/init.mako.rc
+++ b/init.mako.rc
@@ -147,16 +147,12 @@
 # to observe dnsmasq.leases file for dhcp information of soft ap.
     chown dhcp system /data/misc/dhcp
 
-    write /dev/wcnss_wlan 1
+    chown system system /dev/wcnss_wlan
     write /sys/module/wcnss_ssr_8960/parameters/enable_riva_ssr 1
 
     # Create directory used by audio subsystem
     mkdir /data/misc/audio 0770 audio audio
 
-    # Workaround for conn_init not copying the updated firmware
-    rm /data/misc/wifi/WCNSS_qcom_cfg.ini
-    rm /data/misc/wifi/WCNSS_qcom_wlan_nv.bin
-
     # Mounting of persist is moved to 'on emmc-fs' and 'on fs' sections
     # We chown/chmod /persist again so because mount is run as root + defaults
     chown system system /persist
@@ -399,10 +395,11 @@
     user camera
     group camera system inet input
 
-service conn_init /system/bin/conn_init
+service wcnss_init /system/bin/sh /system/etc/init.mako.wifi.sh
     class late_start
     user system
     group system wifi
+    seclabel u:r:conn_init:s0
     oneshot
 
 service bdAddrLoader /system/bin/bdAddrLoader -f /persist/bluetooth/.bdaddr -h -x
diff --git a/init.mako.wifi.sh b/init.mako.wifi.sh
new file mode 100644
index 0000000..e586e96
--- /dev/null
+++ b/init.mako.wifi.sh
@@ -0,0 +1,10 @@
+#!/system/bin/sh
+
+# Workaround for conn_init not copying the updated firmware
+rm /data/misc/wifi/WCNSS_qcom_cfg.ini
+rm /data/misc/wifi/WCNSS_qcom_wlan_nv.bin
+
+/system/bin/conn_init
+
+echo 1 > /dev/wcnss_wlan
+
diff --git a/overlay/frameworks/base/core/res/res/values-mcc530-mnc05/config.xml b/overlay/frameworks/base/core/res/res/values-mcc530-mnc05/config.xml
new file mode 100644
index 0000000..3dfbe0e
--- /dev/null
+++ b/overlay/frameworks/base/core/res/res/values-mcc530-mnc05/config.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2014, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<!-- These resources are around just to allow their values to be customized
+     for different hardware and product builds. -->
+<resources>
+    <!-- If this value is true, The mms content-disposition field is supported correctly.
+         If false, Content-disposition fragments are ignored -->
+    <bool name="config_mms_content_disposition_support">false</bool>
+</resources>
diff --git a/overlay/frameworks/base/core/res/res/values-mcc724-mnc39/config.xml b/overlay/frameworks/base/core/res/res/values-mcc724-mnc39/config.xml
new file mode 100644
index 0000000..c200847
--- /dev/null
+++ b/overlay/frameworks/base/core/res/res/values-mcc724-mnc39/config.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2014, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You my obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<!-- These resources are around just to allow their values to be customized
+     for different hardware and product builds. -->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+
+    <!-- Array of ConnectivityManager.TYPE_xxxx values allowable for tethering -->
+    <!-- Common options are [1, 4] for TYPE_WIFI and TYPE_MOBILE_DUN or
+    <!== [0,1,5,7] for TYPE_MOBILE, TYPE_WIFI, TYPE_MOBILE_HIPRI and TYPE_BLUETOOTH -->
+    <integer-array translatable="false" name="config_tether_upstream_types">
+      <item>1</item>
+      <item>4</item>
+      <item>7</item>
+      <item>9</item>
+    </integer-array>
+
+    <!-- String containing the apn value for tethering.  May be overriden by secure settings
+         TETHER_DUN_APN.  Value is a comma separated series of strings:
+         "name,apn,proxy,port,username,password,server,mmsc,mmsproxy,mmsport,mcc,mnc,auth,type"
+         note that empty fields can be ommitted: "name,apn,,,,,,,,,310,260,,DUN" -->
+    <string-array translatable="false" name="config_tether_apndata">
+        <item>Nextel Modem,modem.nextel3g.net.br,,,,,,,,,724,39,0,DUN</item>
+    </string-array>
+</resources>
diff --git a/sepolicy/conn_init.te b/sepolicy/conn_init.te
index 33f0cab..6491888 100644
--- a/sepolicy/conn_init.te
+++ b/sepolicy/conn_init.te
@@ -2,10 +2,11 @@
 type conn_init, domain;
 type conn_init_exec, exec_type, file_type;
 
-# Started by logwrapper in init
-domain_auto_trans(init, conn_init_exec, conn_init)
+init_daemon_domain(conn_init)
 
-allow conn_init devpts:chr_file { read write };
+# Runs init.mako.wifi.sh
+allow conn_init shell_exec:file { entrypoint read };
+allow conn_init conn_init_exec:file rx_file_perms;
 
 # Allow /persist/wifi access
 allow conn_init { persist_file persist_wifi_file }:dir search;
@@ -14,3 +15,8 @@
 # Allow /data/misc/wifi access for firmware files
 allow conn_init wifi_data_file:dir w_dir_perms;
 allow conn_init wifi_data_file:file create_file_perms;
+
+allow conn_init wlan_device:chr_file rw_file_perms;
+
+# init.mako.wifi.sh runs toolbox
+allow conn_init system_file:file execute_no_trans;
diff --git a/sepolicy/device.te b/sepolicy/device.te
index 81caeca..b6e993a 100644
--- a/sepolicy/device.te
+++ b/sepolicy/device.te
@@ -1,3 +1,5 @@
+type wlan_device, dev_type;
+
 type diag_device, dev_type;
 
 # Kickstart device used by QC qcks
diff --git a/sepolicy/file_contexts b/sepolicy/file_contexts
index a44c8b1..7805255 100644
--- a/sepolicy/file_contexts
+++ b/sepolicy/file_contexts
@@ -2,6 +2,9 @@
 /dev/kgsl-3d0       u:object_r:gpu_device:s0
 /dev/kgsl           u:object_r:gpu_device:s0
 
+# WLAN
+/dev/wcnss_wlan         u:object_r:wlan_device:s0
+
 # Image Rotator Driver
 /dev/msm_rotator    u:object_r:video_device:s0