diff --git a/fm_hci/fm_hci.c b/fm_hci/fm_hci.c
index e0294eee6bdd42d2c8ade43e79c0792cfad324bc..f4b7e5400ef29e00a09121dde5232b1ea06e950c 100644
--- a/fm_hci/fm_hci.c
+++ b/fm_hci/fm_hci.c
@@ -478,7 +478,7 @@ err:
     return -1;
 }
 
-void enqueue_fm_tx_cmd(FM_HDR *pbuf)
+int enqueue_fm_tx_cmd(FM_HDR *pbuf)
 {
 
     pthread_mutex_lock(&fmHCIControlBlock.tx_q_lock);
@@ -486,36 +486,40 @@ void enqueue_fm_tx_cmd(FM_HDR *pbuf)
     if (!fmHCIControlBlock.first) {
         fmHCIControlBlock.first = (TX_Q *) malloc(sizeof(TX_Q));
         if (!fmHCIControlBlock.first) {
-            printf("Failed to allocate memory for first!!\n");
+            ALOGI("Failed to allocate memory for first!!\n");
             pthread_mutex_unlock(&fmHCIControlBlock.tx_q_lock);
-            return;
+            return FM_HC_STATUS_NOMEM;
         }
         fmHCIControlBlock.first->hdr = pbuf;
         fmHCIControlBlock.first->next = NULL;
         fmHCIControlBlock.last = fmHCIControlBlock.first;
-                ALOGI("%s: FM-CMD ENQUEUED SUCCESSFULLY", __func__);
+        ALOGI("%s: FM-CMD ENQUEUED SUCCESSFULLY", __func__);
     } else {
         TX_Q *element =  (TX_Q *) malloc(sizeof(TX_Q));
         if (!element) {
-            printf("Failed to allocate memory for element!!\n");
+            ALOGI("Failed to allocate memory for element!!\n");
             pthread_mutex_unlock(&fmHCIControlBlock.tx_q_lock);
-            return;
+            return FM_HC_STATUS_NOMEM;
         }
         fmHCIControlBlock.last->next = element;
         element->hdr = pbuf;
         element->next = NULL;
         fmHCIControlBlock.last = element;
-                ALOGI("%s: fm-cmd enqueued successfully", __func__);
+        ALOGI("%s: fm-cmd enqueued successfully", __func__);
     }
 
     pthread_mutex_unlock(&fmHCIControlBlock.tx_q_lock);
+    return FM_HC_STATUS_SUCCESS;
 }
 
 /** Transmit frame */
-void transmit(FM_HDR *pbuf)
+int transmit(FM_HDR *pbuf)
 {
-    enqueue_fm_tx_cmd(pbuf);
-    event_notification(HC_EVENT_TX);
+    int status = FM_HC_STATUS_FAIL;
+
+    if ((status = enqueue_fm_tx_cmd(pbuf)) == FM_HC_STATUS_SUCCESS)
+        event_notification(HC_EVENT_TX);
+    return status;
 }
 
 void userial_close_reader(void) {
diff --git a/fm_hci/fm_hci.h b/fm_hci/fm_hci.h
index 8ffbf04732b1bbeae7916aade6e3594fbd719119..2d5e4a157c1e90ea20b12d2e16596ce4f6466494 100644
--- a/fm_hci/fm_hci.h
+++ b/fm_hci/fm_hci.h
@@ -45,8 +45,8 @@ typedef enum {
 } fm_hc_status_t;
 
 typedef enum {
-	FM_RADIO_DISABLE,
-	FM_RADIO_ENABLE
+    FM_RADIO_DISABLE,
+    FM_RADIO_ENABLE
 }fm_power_state;
 
 /* Host/Controller lib internal event ID */
@@ -94,11 +94,11 @@ typedef struct {
 
 typedef struct hdr
 {
-	FM_HDR	*hdr;
-	struct hdr *next;
+    FM_HDR  *hdr;
+    struct hdr *next;
 } TX_Q;
 
-void transmit(FM_HDR *pbuf);
+int transmit(FM_HDR *pbuf);
 int  fm_hci_init(fm_hal_cb *);
 void fm_power(fm_power_state state);
 int open_serial_port(void);
diff --git a/fmapp2/res/values/arrays.xml b/fmapp2/res/values/arrays.xml
index 16b48e42d5026939024bf85e194dad4dc84f0675..ad30a859da2e6df99805b50ff1e674366bd8265c 100644
--- a/fmapp2/res/values/arrays.xml
+++ b/fmapp2/res/values/arrays.xml
@@ -392,6 +392,36 @@
       <item> RF Statistics</item>
   </string-array>
 
+  <string-array name="cfg_rf4">
+      <item> Select Option</item>
+      <item> Set SINR Samples Count</item>
+      <item> Set SINR Threshold</item>
+      <item> Set IntfDetoutLow Threshold</item>
+      <item> Set IntfDetoutHigh Threshold</item>
+      <item> Set SinrFirstStage</item>
+      <item> Set RmssiFirstStage</item>
+      <item> Set CF0Th12</item>
+      <item> Set SearchAlgo Type</item>
+      <item> Get SINR Samples Count</item>
+      <item> Get SINR Threshold</item>
+      <item> Get SinrFirstStage</item>
+      <item> Get RmssiFirstStage</item>
+      <item> Get CF0Th12</item>
+      <item> Get Search Algo Type</item>
+      <item> Set AfJmpRmssi Threshold</item>
+      <item> Set GoodChRmssi Threshold</item>
+      <item> Set AfJmpRmssi Samples count</item>
+      <item> Get AfJmpRmssi Threshold</item>
+      <item> Get GoodChRmssi Threshold</item>
+      <item> Get AfJmpRmssi Samples count</item>
+      <item> Set RXREPEAT Count</item>
+      <item> Set Sig Blend SinrHi</item>
+      <item> Get Sig Blend SinrHi</item>
+      <item> Set Sig Blend RmssiHi</item>
+      <item> Get Sig Blend RmssiHi</item>
+      <item> RF Statistics</item>
+  </string-array>
+
   <string-array name="stats_options">
       <item> Select the option</item>
       <item> Configure Performance parameters</item>
diff --git a/fmapp2/src/com/caf/fmradio/FMRadio.java b/fmapp2/src/com/caf/fmradio/FMRadio.java
index ee8ef3d5037407a5e6b4ef84280eaccea5eb55a2..f83a0d0a2e99018bea111f96b4b06cb513b75ca1 100644
--- a/fmapp2/src/com/caf/fmradio/FMRadio.java
+++ b/fmapp2/src/com/caf/fmradio/FMRadio.java
@@ -2118,7 +2118,7 @@ public class FMRadio extends Activity
                display = station.getName();
                 if (display.length() > 6)
                     display = display.substring(0,6)+"...";
-	       mPresetButtons[buttonIndex].setEllipsize(TextUtils.TruncateAt.END);
+               mPresetButtons[buttonIndex].setEllipsize(TextUtils.TruncateAt.END);
                mPresetButtons[buttonIndex].setText(display);
                mPresetButtons[buttonIndex].setTag(station);
                addedStations++;
@@ -2753,7 +2753,7 @@ public class FMRadio extends Activity
                   mRadioTextTV.setText("");
                   mRadioTextScroller.mOriginalString = "";
                }else {
-                  //Log.d(LOGTAG, "mUpdateRadioText: Leaving old string " + mRadioTextTV.getText());
+                  Log.v(LOGTAG, "mUpdateRadioText: Leaving old string " + mRadioTextTV.getText());
                }
 
                /* Get PTY and PI and update the display */
@@ -3225,6 +3225,40 @@ public class FMRadio extends Activity
           mSpeakerButton.setClickable(false);
           mMuteButton.setClickable(false);
       }
+      /* Not used in FmRadio */
+      public void getSigThCb(int val, int status) {
+          Log.d(LOGTAG,"get Sig Thres callback");
+      }
+      public void getChDetThCb(int val, int status) {
+          Log.d(LOGTAG, "get Channel Det Threshold Callback");
+      }
+      public void setChDetThCb(int status)
+      {
+          Log.d(LOGTAG, "set channel Det Threshold Callback");
+      }
+      public void DefDataRdCb(int val, int status) {
+          Log.d(LOGTAG, "Def data Read callback");
+      }
+      public void DefDataWrtCb(int status)
+      {
+          Log.d(LOGTAG, "DefDataWrt");
+      }
+      public void getBlendCb(int val, int status)
+      {
+          Log.d(LOGTAG, "get blend callback");
+      }
+      public void setBlendCb(int status)
+      {
+          Log.d(LOGTAG, "set blend callback");
+      }
+      public void getStationParamCb(int val, int status)
+      {
+          Log.d(LOGTAG, "getStationParam");
+      }
+      public void getStationDbgParamCb(int val, int status)
+      {
+          Log.d(LOGTAG, "getStationDbgParam");
+      }
    };
 
     private void registerFMSettingListner() {
diff --git a/fmapp2/src/com/caf/fmradio/FMRadioService.java b/fmapp2/src/com/caf/fmradio/FMRadioService.java
index f4b24fb7f9846506405b4d2214ebaa05b7fac4fb..b238e538c3372b0a562efd542d72626fe04b0bc4 100644
--- a/fmapp2/src/com/caf/fmradio/FMRadioService.java
+++ b/fmapp2/src/com/caf/fmradio/FMRadioService.java
@@ -1952,10 +1952,18 @@ public class FMRadioService extends Service
       {
           return (mService.get().setIntfDetLowTh(intfLowTh));
       }
+      public boolean getIntfDetLowTh()
+      {
+          return (mService.get().getIntfDetLowTh());
+      }
       public boolean setIntfDetHighTh(int intfHighTh)
       {
           return (mService.get().setIntfDetHighTh(intfHighTh));
       }
+      public boolean getIntfDetHighTh()
+      {
+          return (mService.get().getIntfDetHighTh());
+      }
       public int getSearchAlgoType()
       {
           return (mService.get().getSearchAlgoType());
@@ -2024,6 +2032,10 @@ public class FMRadioService extends Service
       {
            return (mService.get().setRxRepeatCount(count));
       }
+      public boolean getRxRepeatCount()
+      {
+           return (mService.get().getRxRepeatCount());
+      }
       public long getRecordingStartTime()
       {
            return (mService.get().getRecordingStartTime());
@@ -3151,10 +3163,113 @@ public class FMRadioService extends Service
              Log.d(LOGTAG, "FmRxEvServiceAvailable: Tuned frequency is below signal threshold level");
          }
       }
-      public void FmRxEvGetSignalThreshold()
+      public void FmRxEvGetSignalThreshold(int val, int status)
       {
          Log.d(LOGTAG, "FmRxEvGetSignalThreshold");
+
+         if (mCallbacks != null) {
+             try {
+                 mCallbacks.getSigThCb(val, status);
+             } catch (RemoteException e) {
+                 Log.e(LOGTAG, "FmRxEvGetSignalThreshold: Exception:" + e.toString());
+             }
+         }
+      }
+
+      public void FmRxEvGetChDetThreshold(int val, int status)
+      {
+          Log.e(LOGTAG, "FmRxEvGetChDetThreshold");
+          if (mCallbacks != null) {
+              try {
+                  mCallbacks.getChDetThCb(val, status);
+              } catch (RemoteException e) {
+                  Log.e(LOGTAG, "FmRxEvGetChDetThreshold: Exception = " + e.toString());
+              }
+          }
+      }
+
+      public void FmRxEvSetChDetThreshold(int status)
+      {
+          Log.e(LOGTAG, "FmRxEvSetChDetThreshold");
+          if (mCallbacks != null) {
+              try {
+                  mCallbacks.setChDetThCb(status);
+              } catch (RemoteException e) {
+                    e.printStackTrace();
+              }
+          }
+      }
+
+      public void FmRxEvDefDataRead(int val, int status) {
+          Log.e(LOGTAG, "FmRxEvDefDataRead");
+          if (mCallbacks != null) {
+              try {
+                  mCallbacks.DefDataRdCb(val, status);
+              } catch (RemoteException e) {
+                  Log.e(LOGTAG, "FmRxEvDefDataRead: Exception = " + e.toString());
+              }
+          }
+      }
+
+      public void FmRxEvDefDataWrite(int status)
+      {
+          Log.e(LOGTAG, "FmRxEvDefDataWrite");
+          if (mCallbacks != null) {
+              try {
+                  mCallbacks.DefDataWrtCb(status);
+              } catch (RemoteException e) {
+                  e.printStackTrace();
+              }
+          }
+      }
+
+      public void FmRxEvGetBlend(int val, int status)
+      {
+          Log.e(LOGTAG, "FmRxEvGetBlend");
+
+          if (mCallbacks != null) {
+              try {
+                  mCallbacks.getBlendCb(val, status);
+              } catch (RemoteException e) {
+                  e.printStackTrace();
+              }
+          }
+      }
+
+      public void FmRxEvSetBlend(int status)
+      {
+          Log.e(LOGTAG, "FmRxEvSetBlend");
+          if (mCallbacks != null) {
+              try {
+                  mCallbacks.setBlendCb(status);
+              } catch (RemoteException e) {
+                  e.printStackTrace();
+              }
+          }
+      }
+
+      public void FmRxGetStationParam(int val, int status)
+      {
+          if (mCallbacks != null) {
+              try {
+                  mCallbacks.getStationParamCb(val, status);
+              } catch (RemoteException e) {
+                  e.printStackTrace();
+              }
+          }
+      }
+
+      public void FmRxGetStationDbgParam(int val, int status)
+      {
+          if (mCallbacks != null) {
+              try {
+                  mCallbacks.getStationDbgParamCb(val, status);
+              } catch (RemoteException e) {
+                  e.printStackTrace();
+              }
+          }
       }
+
       public void FmRxEvSearchInProgress()
       {
          Log.d(LOGTAG, "FmRxEvSearchInProgress");
@@ -3402,12 +3517,26 @@ public class FMRadioService extends Service
       else
          return false;
    }
+   public boolean getIntfDetLowTh()
+   {
+       if (mReceiver != null)
+           return mReceiver.getOnChannelThreshold();
+       else
+           return false;
+   }
    public boolean setIntfDetHighTh(int intfHighTh) {
       if(mReceiver != null)
          return mReceiver.setOffChannelThreshold(intfHighTh);
       else
          return false;
    }
+   public boolean getIntfDetHighTh()
+   {
+       if (mReceiver != null)
+           return mReceiver.getOffChannelThreshold();
+       else
+           return false;
+   }
    public int getSearchAlgoType() {
        if(mReceiver != null)
           return mReceiver.getSearchAlgoType();
@@ -3556,7 +3685,12 @@ public class FMRadioService extends Service
       else
          return false;
    }
-
+   public boolean getRxRepeatCount() {
+      if(mReceiver != null)
+         return mReceiver.getPSRxRepeatCount();
+      else
+         return false;
+   }
    public long getRecordingStartTime() {
       return mSampleStart;
    }
diff --git a/fmapp2/src/com/caf/fmradio/FMStats.java b/fmapp2/src/com/caf/fmradio/FMStats.java
index 75ba4c686f9f13e810f00c9667e0c1833297e461..1c506c4a5047e9e75146f2b097c596aa6687cb5f 100644
--- a/fmapp2/src/com/caf/fmradio/FMStats.java
+++ b/fmapp2/src/com/caf/fmradio/FMStats.java
@@ -59,6 +59,8 @@ import android.app.AlertDialog;
 import android.app.Dialog;
 import android.view.LayoutInflater;
 import android.content.DialogInterface;
+import android.os.Handler;
+import android.os.Message;
 import android.os.PowerManager;
 import android.os.PowerManager.WakeLock;
 import android.app.AlarmManager;
@@ -173,6 +175,7 @@ public class FMStats extends Activity  {
     CfgRfItemSelectedListener1 mSpinCfgRfListener1 = null;
     CfgRfItemSelectedListener2 mSpinCfgRfListener2 = null;
     CfgRfItemSelectedListener3 mSpinCfgRfListener3 = null;
+    CfgRfItemSelectedListener4 mSpinCfgRfListener4 = null;
     BandSweepMthdsSelectedListener mSweepMthdsListener =
                                      new BandSweepMthdsSelectedListener();
 
@@ -210,6 +213,27 @@ public class FMStats extends Activity  {
     ArrayAdapter<CharSequence> bandSweepMthds;
 
     private static boolean mIsTransportSMD = false;
+    private static boolean setCmdSent = false;
+    private static int lastCmdSent = 0;
+    private final int CMD_CHDET_SINR_TH = 1;
+    private final int CMD_CHDET_SINR_SAMPLE = 2;
+    private final int CMD_CHDET_INTF_TH_LOW = 3;
+    private final int CMD_CHDET_INTF_TH_HIGH = 4;
+    private final int CMD_DEFRD_AF_RMSSI_TH = 5;
+    private final int CMD_DEFRD_AF_RMSSI_SAMPLE = 6;
+    private final int CMD_DEFRD_GD_CH_RMSSI_TH = 7;
+    private final int CMD_DEFRD_SEARCH_ALGO = 8;
+    private final int CMD_DEFRD_SINR_FIRST_STAGE = 9;
+    private final int CMD_DEFRD_RMSSI_FIRST_STAGE = 10;
+    private final int CMD_DEFRD_CF0TH12 = 11;
+    private final int CMD_DEFRD_TUNE_POWER = 12;
+    private final int CMD_DEFRD_REPEATCOUNT = 13;
+    private final int CMD_BLENDTBL_SINR_HI = 14;
+    private final int CMD_BLENDTBL_RMSSI_HI = 15;
+    private final int CMD_STNPARAM_SINR = 16;
+    private final int CMD_STNPARAM_RSSI = 17;
+    private final int CMD_STNDBGPARAM_IOVERC = 18;
+    private final int CMD_STNDBGPARAM_INFDETOUT = 19;
 
     private static final int MPX_DCC = 0;
     private static final int SINR_INTF = 1;
@@ -247,8 +271,11 @@ public class FMStats extends Activity  {
     private int prevSweepMthd = 0; //Manual (using band min, max)
 
     private int curSweepMthd = 0;
+    private int textBoxVal = 0;
+    private int algo_type = -1;
 
     private Thread mRecordUpdateHandlerThread = null;
+    private Thread mRunTestThread = null;
     boolean mRecording = false;
 
 
@@ -268,6 +295,21 @@ public class FMStats extends Activity  {
 
     private GetNextFreqInterface mNextFreqInterface;
     private CommaSeparatedFreqFileReader mFreqFileReader;
+    private final int SIGNAL_THRESHOLD = 1;
+    private final int GET_CHANNEL_DET_THRESHOLD = 2;
+    private final int DEFAULT_DATA_READ = 3;
+    private final int GET_BLEND_TBL = 4;
+    private final int SET_CHANNEL_DET_THRESHOLD = 5;
+    private final int DEFAULT_DATA_WRITE = 6;
+    private final int SET_BLEND_TBL = 7;
+    private final int GET_STATION_PARAM = 8;
+    private final int GET_STATION_DBG_PARAM = 9;
+    private Object obj = new Object();
+    private int nRssi = 0;
+    private int nIoC = 0;
+    private int nIntDet = 0;
+    private int nMpxDcc = 0;
+    private int nSINR = 0;
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
@@ -289,8 +331,14 @@ public class FMStats extends Activity  {
                           (this, R.array.band_sweep_methods,
                             android.R.layout.simple_spinner_item);
 
+        Log.d(LOGTAG, "oncreate");
         checkTransportLayer();
-        if (isRomeChip()) {
+        if (isCherokeeChip()) {
+            mSpinCfgRfListener4 = new CfgRfItemSelectedListener4();
+            adaptCfgRf = ArrayAdapter.createFromResource(
+                    this, R.array.cfg_rf4,
+                    android.R.layout.simple_spinner_item);
+        } else if (isRomeChip()) {
             mSpinCfgRfListener3 = new CfgRfItemSelectedListener3();
             adaptCfgRf = ArrayAdapter.createFromResource(
                            this, R.array.cfg_rf3,
@@ -333,12 +381,6 @@ public class FMStats extends Activity  {
             mCurrentFileName = null;
         }
 
-        if (false == bindToService(this, osc)) {
-            Log.d(LOGTAG, "onCreate: Failed to Start Service");
-        }else {
-            Log.d(LOGTAG, "onCreate: Start Service completed successfully");
-        }
-
         /*Initialize the column header with
         constant values*/
         if (isRomeChip()) {
@@ -367,9 +409,104 @@ public class FMStats extends Activity  {
         registerBandSweepDwellExprdListener();
     }
 
+    private final Handler mCallbackHandler = new Handler() {
+        @Override
+        public void handleMessage(Message msg) {
+            Log.e(LOGTAG, "mCallbackHandler: msg.what = " + msg.what);
+            int val, status;
+            tv1 = (TextView)findViewById(R.id.label);
+            switch (msg.what) {
+                case SIGNAL_THRESHOLD:
+                case GET_CHANNEL_DET_THRESHOLD:
+                case GET_BLEND_TBL:
+                    status = msg.arg2;
+                    if (status != 0) {
+                        tv1.setText("Error:"  + String.valueOf(status));
+                    } else {
+                        val = msg.arg1;
+                        tv1.setText(String.valueOf(val));
+                    }
+                    break;
+                case DEFAULT_DATA_READ:
+                    status = msg.arg2;
+                    if (status != 0) {
+                        tv1.setText("Error:"  + String.valueOf(status));
+                    } else {
+                        val = msg.arg1;
+                        if (lastCmdSent == CMD_DEFRD_SEARCH_ALGO  && val == MPX_DCC) {
+                            tv1.setText(R.string.search_algo_mpx);
+                        } else if (lastCmdSent == CMD_DEFRD_SEARCH_ALGO && val == SINR_INTF) {
+                            tv1.setText(R.string.search_algo_sinrint);
+                        } else {
+                            tv1.setText(String.valueOf(val));
+                        }
+                        lastCmdSent = 0;
+                    }
+                    break;
+                case SET_CHANNEL_DET_THRESHOLD:
+                case DEFAULT_DATA_WRITE:
+                case SET_BLEND_TBL:
+                    tv1.setVisibility(View.VISIBLE);
+                    status = msg.arg1;
+                    if (status != 0)
+                        tv1.setText("Error:" + String.valueOf(status));
+                    else
+                        tv1.setText("Success");
+                    break;
+                case GET_STATION_PARAM:
+                    status = msg.arg2;
+                    if (status != 0) {
+                        Log.e(LOGTAG, "GET_STATION_DBG_PARAM: status = " + status);
+                        nRssi = Integer.MAX_VALUE;
+                        nSINR = Integer.MAX_VALUE;
+                    } else {
+                        if (lastCmdSent == CMD_STNPARAM_RSSI)
+                            nRssi = msg.arg1;
+                        if (lastCmdSent == CMD_STNPARAM_SINR)
+                            nSINR = msg.arg1;
+                    }
+                    if (mRunTestThread !=  null) {
+                        synchronized (obj) {
+                            obj.notify();
+                        }
+                    }
+                    lastCmdSent = 0;
+                    break;
+                case GET_STATION_DBG_PARAM:
+                    status = msg.arg2;
+                    if (status != 0) {
+                        Log.e(LOGTAG, "GET_STATION_DBG_PARAM: status = " + status);
+                        nIoC = Integer.MAX_VALUE;
+                        nIntDet = Integer.MAX_VALUE;
+                    } else {
+                        if (lastCmdSent == CMD_STNDBGPARAM_IOVERC)
+                            nIoC = msg.arg1;
+                        if  (lastCmdSent == CMD_STNDBGPARAM_INFDETOUT)
+                            nIntDet = msg.arg1;
+                    }
+                    if (mRunTestThread !=  null) {
+                        synchronized (obj) {
+                            mRunTestThread.notify();
+                        }
+                    }
+                    break;
+                default:
+                    Log.e(LOGTAG, "mCallbackHandler:Default");
+                    break;
+            }
+            Log.e(LOGTAG, "mCallbackHandler--");
+        }
+    };
+
     @Override
     public void onStart() {
        super.onStart();
+
+        if (false == bindToService(this, osc)) {
+            Log.e(LOGTAG, "onCreate: Failed to Start Service");
+        }else {
+            Log.d(LOGTAG, "onCreate: Start Service completed successfully");
+        }
        if(isRecording()) {
           Log.d(LOGTAG, "onStart");
           initiateRecordThread();
@@ -420,24 +557,45 @@ public class FMStats extends Activity  {
         super.onDestroy();
     }
 
+    private Runnable mRunTest = new Runnable(){
+        public void run() {
+              runCurrentTest();
+        }
+    };
+
     private View.OnClickListener mOnRunListener = new View.OnClickListener() {
         public void onClick(View v) {
+            Log.d(LOGTAG, "mTestRunning=" + mTestRunning);
            if(false == mTestRunning) {
               clearPreviousTestResults();
               mTestRunning = true;
               if(mTestSelected == SWEEP_TEST) {
                  disableBandSweepSetting();
               }
-              runCurrentTest();
-           }else {
+              SetButtonState(false);
+              createResult(mColumnHeader);
+              if ((mRunTestThread == null) || (mRunTestThread.getState() == Thread.State.TERMINATED)) {
+                    mRunTestThread = new Thread(mRunTest,
+                            "mRunTestThread");
+              } else {
+                  Log.e(LOGTAG, "Error: Thread is already running");
+                  return;
+              }
+              if (mRunTestThread != null) {
+                  mRunTestThread.start();
+              } else {
+                  SetButtonState(true);
+                  Log.e(LOGTAG, "RunTestThread: new Thread failed");
+                  return;
+              }
+           } else {
               mTestRunning = false;
               SetButtonState(true);
               /*Stop the thread by interrupting it*/
-              if(mMultiUpdateThread != null) {
-                 mMultiUpdateThread.interrupt();
-                 mMultiUpdateThread = null;
+              if (mRunTestThread != null) {
+                  mRunTestThread.interrupt();
+                  mRunTestThread = null;
               }
-
               if(SEARCH_TEST == mTestSelected) {
                  try {
                       mService.cancelSearch();
@@ -495,6 +653,7 @@ public class FMStats extends Activity  {
        szbTestHeader.append("running test:").append
                               (szTestInformation[mTestSelected]);
        String szTestHeader = new String(szbTestHeader);
+       Log.d(LOGTAG, "chooseFMRfoption");
        switch(mTestSelected)
        {
        case 1:
@@ -509,7 +668,10 @@ public class FMStats extends Activity  {
                adaptCfgRf.setDropDownViewResource
                            (android.R.layout.simple_spinner_dropdown_item);
                spinOptionFmRf.setAdapter(adaptCfgRf);
-               if (isRomeChip())
+               if (isCherokeeChip()) {
+                   spinOptionFmRf.setOnItemSelectedListener
+                       (mSpinCfgRfListener4);
+               } else if (isRomeChip())
                   spinOptionFmRf.setOnItemSelectedListener
                                    (mSpinCfgRfListener3);
                else if(isTransportLayerSMD())
@@ -563,14 +725,16 @@ public class FMStats extends Activity  {
             String a;
             a =  txtbox1.getText().toString();
             try {
-                 int count = Integer.parseInt(a);
-                 Log.d(LOGTAG, "Value entered for mOnSetRxRePeatCount: " + count);
-                 if((count < 0) ||
-                     (count > 255))
+                 textBoxVal = Integer.parseInt(a);
+                 Log.d(LOGTAG, "Value entered for mOnSetRxRePeatCount: " + textBoxVal);
+                 if((textBoxVal < 0) ||
+                     (textBoxVal > 255))
                      return;
                  if(mService != null) {
                     try {
-                         mService.setRxRepeatCount(count);
+                        mService.getRxRepeatCount();
+                        setCmdSent = true;
+                        lastCmdSent = CMD_DEFRD_REPEATCOUNT;
                     } catch (RemoteException e) {
                          e.printStackTrace();
                     }
@@ -587,13 +751,15 @@ public class FMStats extends Activity  {
             String a;
             a =  txtbox1.getText().toString();
             try {
-                 byte count = (byte) Integer.parseInt(a);
-                 Log.d(LOGTAG, "Value entered for mOnSetBlendSinrHiListener: " + count);
-                 if((count < MIN_BLEND_SINRHI ) ||
-                     (count > MAX_BLEND_SINRHI))
+                 textBoxVal = (byte) Integer.parseInt(a);
+                 Log.d(LOGTAG, "Value entered for mOnSetBlendSinrHiListener: " + textBoxVal);
+                 if((textBoxVal < MIN_BLEND_SINRHI ) ||
+                     (textBoxVal > MAX_BLEND_SINRHI))
                      return;
                  if(mReceiver != null) {
-                         mReceiver.setBlendSinr(count);
+                     mReceiver.getBlendSinr();
+                     setCmdSent = true;
+                     lastCmdSent = CMD_BLENDTBL_SINR_HI;
                  }
             } catch (NumberFormatException e) {
                  Log.e(LOGTAG, "Value entered is not in correct format : " + a);
@@ -607,13 +773,15 @@ public class FMStats extends Activity  {
             String a;
             a =  txtbox1.getText().toString();
             try {
-                 byte count = (byte)Integer.parseInt(a);
-                 Log.d(LOGTAG, "Value entered for mOnSetBlendRmssiHiListener: " + count);
-                 if((count < MIN_BLEND_RMSSIHI) ||
-                     (count > MAX_BLEND_RMSSIHI))
+                 textBoxVal = (byte)Integer.parseInt(a);
+                 Log.d(LOGTAG, "Value entered for mOnSetBlendRmssiHiListener: " + textBoxVal);
+                 if((textBoxVal < MIN_BLEND_RMSSIHI) ||
+                     (textBoxVal > MAX_BLEND_RMSSIHI))
                      return;
                  if(mReceiver != null) {
-                         mReceiver.setBlendRmssi(count);
+                     mReceiver.getBlendRmssi();
+                     setCmdSent = true;
+                     lastCmdSent = CMD_BLENDTBL_RMSSI_HI;
                  }
             } catch (NumberFormatException e) {
                  Log.e(LOGTAG, "Value entered is not in correct format : " + a);
@@ -646,17 +814,18 @@ public class FMStats extends Activity  {
           String a;
           a = txtbox1.getText().toString();
           try {
-              int rdel = Integer.parseInt(a);
-              Log.d(LOGTAG, "Value of Sinr Samples count is : " + rdel);
+              textBoxVal = Integer.parseInt(a);
+              Log.d(LOGTAG, "Value of Sinr Samples count is : " + textBoxVal);
               if(mService != null) {
                  try {
-                     mService.setSinrSamplesCnt(rdel);
+                     mService.getSinrSamplesCnt();
+                     setCmdSent = true;
+                     lastCmdSent = CMD_CHDET_SINR_SAMPLE;
                  }catch (RemoteException e) {
                      e.printStackTrace();
                  }
               }
           }catch (NumberFormatException e) {
-              Log.e(LOGTAG, "Value entered is not in correct format: " + a);
               txtbox1.setText("");
           }
       }
@@ -668,11 +837,13 @@ public class FMStats extends Activity  {
           String a;
           a = txtbox1.getText().toString();
           try {
-              int rdel = Integer.parseInt(a);
-              Log.d(LOGTAG, "Value of Sinr Th is : " + rdel);
+              textBoxVal = Integer.parseInt(a);
+              Log.d(LOGTAG, "Value of Sinr Th is : " + textBoxVal);
               if(mService != null) {
                  try {
-                     mService.setSinrTh(rdel);
+                     mService.getSinrTh();
+                     setCmdSent = true;
+                     lastCmdSent = CMD_CHDET_SINR_TH;
                  }catch (RemoteException e) {
                      e.printStackTrace();
                  }
@@ -690,11 +861,13 @@ public class FMStats extends Activity  {
           String a;
           a = txtbox1.getText().toString();
           try {
-              int rdel = Integer.parseInt(a);
-              Log.d(LOGTAG, "Value of Intf Det Low Th is : " + rdel);
+              textBoxVal = Integer.parseInt(a);
+              Log.d(LOGTAG, "Value of Intf Det Low Th is : " + textBoxVal);
               if(mService != null) {
                  try {
-                     mService.setIntfDetLowTh(rdel);
+                     mService.getIntfDetLowTh();
+                     setCmdSent =  true;
+                     lastCmdSent = CMD_CHDET_INTF_TH_LOW;
                  }catch (RemoteException e) {
                      e.printStackTrace();
                  }
@@ -711,11 +884,13 @@ public class FMStats extends Activity  {
           String a;
           a = txtbox1.getText().toString();
           try {
-              int rdel = Integer.parseInt(a);
-              Log.d(LOGTAG, "Value of Intf Det Low Th is : " + rdel);
+              textBoxVal = Integer.parseInt(a);
+              Log.d(LOGTAG, "Value of Intf Det Low Th is : " + textBoxVal);
               if(mService != null) {
                  try {
-                     mService.setIntfDetHighTh(rdel);
+                     mService.getIntfDetHighTh();
+                     setCmdSent = true;
+                     lastCmdSent = CMD_CHDET_INTF_TH_HIGH;
                  }catch (RemoteException e) {
                      e.printStackTrace();
                  }
@@ -733,14 +908,16 @@ public class FMStats extends Activity  {
           String a;
           a = txtbox1.getText().toString();
           try {
-              int sinr = Integer.parseInt(a);
-              Log.d(LOGTAG, "Value entered for SINR FIRST STAGE is : " + sinr);
-              if((sinr < MIN_SINR_FIRST_STAGE) ||
-                     (sinr > MAX_SINR_FIRST_STAGE))
+              textBoxVal = Integer.parseInt(a);
+              Log.d(LOGTAG, "Value entered for SINR FIRST STAGE is : " + textBoxVal);
+              if((textBoxVal < MIN_SINR_FIRST_STAGE) ||
+                     (textBoxVal > MAX_SINR_FIRST_STAGE))
                   return;
               if(mService != null) {
                  try {
-                     mService.setSinrFirstStage(sinr);
+                     mService.getSinrFirstStage();
+                     setCmdSent = true;
+                     lastCmdSent = CMD_DEFRD_SINR_FIRST_STAGE;
                  }catch (RemoteException e) {
                      e.printStackTrace();
                  }
@@ -758,14 +935,16 @@ public class FMStats extends Activity  {
           String a;
           a = txtbox1.getText().toString();
           try {
-              int rmssi = Integer.parseInt(a);
-              Log.d(LOGTAG, "Value entered for RMSSI FIRST STAGE is: " + rmssi);
-              if((rmssi < MIN_RMSSI_FIRST_STAGE) ||
-                     (rmssi > MAX_RMSSI_FIRST_STAGE))
+              textBoxVal = Integer.parseInt(a);
+              Log.d(LOGTAG, "Value entered for RMSSI FIRST STAGE is: " + textBoxVal);
+              if((textBoxVal < MIN_RMSSI_FIRST_STAGE) ||
+                     (textBoxVal > MAX_RMSSI_FIRST_STAGE))
                   return;
               if(mService != null) {
                  try {
-                     mService.setRmssiFirstStage(rmssi);
+                     mService.getRmssiFirstStage();
+                     setCmdSent = true;
+                     lastCmdSent = CMD_DEFRD_RMSSI_FIRST_STAGE;
                  }catch (RemoteException e) {
                      e.printStackTrace();
                  }
@@ -783,14 +962,16 @@ public class FMStats extends Activity  {
           String a;
           a = txtbox1.getText().toString();
           try {
-              int cf0 = Integer.parseInt(a);
-              Log.d(LOGTAG, "Value entered for CF0TH12 is: " + cf0);
-              if((cf0 < MIN_CF0TH12) ||
-                     (cf0 > MAX_CF0TH12))
+              textBoxVal = Integer.parseInt(a);
+              Log.d(LOGTAG, "Value entered for CF0TH12 is: " + textBoxVal);
+              if((textBoxVal < MIN_CF0TH12) ||
+                     (textBoxVal > MAX_CF0TH12))
                   return;
               if(mService != null) {
                  try {
-                     mService.setCFOMeanTh(cf0);
+                     mService.getCFOMeanTh();
+                     setCmdSent = true;
+                     lastCmdSent = CMD_DEFRD_CF0TH12;
                  }catch (RemoteException e) {
                      e.printStackTrace();
                  }
@@ -808,9 +989,12 @@ public class FMStats extends Activity  {
           Log.d(LOGTAG, "Value entered for search is: MPX DCC");
           if(mService != null) {
              try {
-                  mService.setSearchAlgoType(MPX_DCC);
+                 mService.getSearchAlgoType();
+                 setCmdSent = true;
+                 algo_type = MPX_DCC;
+                 lastCmdSent = CMD_DEFRD_SEARCH_ALGO;
              }catch (RemoteException e) {
-                  e.printStackTrace();
+                 e.printStackTrace();
              }
           }
        }
@@ -822,7 +1006,10 @@ public class FMStats extends Activity  {
           Log.d(LOGTAG, "Value entered for search is: SINR INTF");
           if(mService != null) {
              try {
-                  mService.setSearchAlgoType(SINR_INTF);
+                 mService.getSearchAlgoType();
+                 setCmdSent = true;
+                 algo_type = SINR_INTF;
+                 lastCmdSent = CMD_DEFRD_SEARCH_ALGO;
              }catch (RemoteException e) {
                   e.printStackTrace();
              }
@@ -836,14 +1023,16 @@ public class FMStats extends Activity  {
           String a;
           a = txtbox1.getText().toString();
           try {
-              int th = Integer.parseInt(a);
-              Log.d(LOGTAG, "Value entered for AfJmpRmssiTh is: " + th);
-              if((th < MIN_AF_JMP_RMSSI_TH) ||
-                     (th > MAX_AF_JMP_RMSSI_TH))
+              textBoxVal = Integer.parseInt(a);
+              Log.d(LOGTAG, "Value entered for AfJmpRmssiTh is: " + textBoxVal);
+              if((textBoxVal < MIN_AF_JMP_RMSSI_TH) ||
+                     (textBoxVal > MAX_AF_JMP_RMSSI_TH))
                   return;
               if(mService != null) {
                  try {
-                     mService.setAfJmpRmssiTh(th);
+                     mService.getAfJmpRmssiTh();
+                     setCmdSent = true;
+                     lastCmdSent = CMD_DEFRD_AF_RMSSI_TH;
                  }catch (RemoteException e) {
                      e.printStackTrace();
                  }
@@ -861,14 +1050,16 @@ public class FMStats extends Activity  {
           String a;
           a = txtbox1.getText().toString();
           try {
-              int th = Integer.parseInt(a);
-              Log.d(LOGTAG, "Value entered for Good channel Rmssi Th is: " + th);
-              if((th < MIN_GD_CH_RMSSI_TH) ||
-                     (th > MAX_GD_CH_RMSSI_TH))
+              textBoxVal = Integer.parseInt(a);
+              Log.d(LOGTAG, "Value entered for Good channel Rmssi Th is: " + textBoxVal);
+              if((textBoxVal < MIN_GD_CH_RMSSI_TH) ||
+                     (textBoxVal > MAX_GD_CH_RMSSI_TH))
                   return;
               if(mService != null) {
                  try {
-                     mService.setGoodChRmssiTh(th);
+                     mService.getGoodChRmssiTh();
+                     setCmdSent = true;
+                     lastCmdSent = CMD_DEFRD_GD_CH_RMSSI_TH;
                  }catch (RemoteException e) {
                      e.printStackTrace();
                  }
@@ -886,14 +1077,16 @@ public class FMStats extends Activity  {
           String a;
           a = txtbox1.getText().toString();
           try {
-              int cnt = Integer.parseInt(a);
-              Log.d(LOGTAG, "Value entered for AfJmpRmssiSamples is: " + cnt);
-              if((cnt < MIN_AF_JMP_RMSSI_SAMPLES) ||
-                     (cnt > MAX_AF_JMP_RMSSI_SAMPLES))
+              textBoxVal = Integer.parseInt(a);
+              Log.d(LOGTAG, "Value entered for AfJmpRmssiSamples is: " + textBoxVal);
+              if((textBoxVal < MIN_AF_JMP_RMSSI_SAMPLES) ||
+                     (textBoxVal > MAX_AF_JMP_RMSSI_SAMPLES))
                   return;
               if(mService != null) {
                  try {
-                     mService.setAfJmpRmssiSamplesCnt(cnt);
+                     mService.getAfJmpRmssiSamplesCnt();
+                     setCmdSent = true;
+                     lastCmdSent = CMD_DEFRD_AF_RMSSI_SAMPLE;
                  }catch (RemoteException e) {
                      e.printStackTrace();
                  }
@@ -1989,144 +2182,773 @@ public class FMStats extends Activity  {
         }
     }
 
-    public class RfCfgItemSelectedListener implements OnItemSelectedListener {
+    public class CfgRfItemSelectedListener4 implements OnItemSelectedListener {
         public void onItemSelected(AdapterView<?> parent,
                                     View view, int pos, long id) {
-            Log.d("Table","onItemSelected is hit with "+pos);
+            Log.d("Table","onItemSelected is hit with " + pos);
+            int ret = Integer.MAX_VALUE;
+            byte retval = Byte.MAX_VALUE;
+            txtbox1 = (EditText) findViewById(R.id.txtbox1);
+            tv1 = (TextView) findViewById(R.id.label);
+            button1 = (Button)findViewById(R.id.SearchMpxDcc);
+            button2 = (Button)findViewById(R.id.SearchSinrInt);
+            Button SetButton = (Button)findViewById(R.id.Setbutton);
             tLayout.setVisibility(View.INVISIBLE);
-            if (mTestRunning)
-                stopCurTest();
             switch(pos)
             {
-                case 0:
                 case 1:
+                    if (txtbox1 != null) {
+                       txtbox1.setText(R.string.type_rd);
+                       txtbox1.setVisibility(View.VISIBLE);
+                    }
+                    if (tv1 != null) {
+                       tv1.setText(R.string.enter_SinrSmplsCnt);
+                       tv1.setVisibility(View.VISIBLE);
+                    }
+                    if(button1 != null) {
+                       button1.setVisibility(View.INVISIBLE);
+                    }
+                    if(button2 != null) {
+                       button2.setVisibility(View.INVISIBLE);
+                    }
+                    if (SetButton != null) {
+                       SetButton.setText(R.string.set_SinrSmplsCnt);
+                       SetButton.setVisibility(View.VISIBLE);
+                       SetButton.setOnClickListener(mOnSetSinrSmplCntListener);
+                    }
+                    break;
                 case 2:
+                    if (txtbox1 != null) {
+                       txtbox1.setText(R.string.type_rd);
+                       txtbox1.setVisibility(View.VISIBLE);
+                    }
+                    if (tv1 != null) {
+                       tv1.setText(R.string.enter_SinrTh);
+                       tv1.setVisibility(View.VISIBLE);
+                    }
+                    if(button1 != null) {
+                       button1.setVisibility(View.INVISIBLE);
+                    }
+                    if(button2 != null) {
+                       button2.setVisibility(View.INVISIBLE);
+                    }
+                    if (SetButton != null) {
+                       SetButton.setText(R.string.set_SinrTh);
+                       SetButton.setVisibility(View.VISIBLE);
+                       SetButton.setOnClickListener(mOnSetSinrThListener);
+                    }
+                    break;
                 case 3:
-                    mTestSelected = pos;
-                    tLayout.removeAllViewsInLayout();
-                    mNewRowIds = NEW_ROW_ID;
-                    tLayout.setVisibility(View.VISIBLE);
-                    RunButton = (Button)findViewById(R.id.Runbutton);
-                    if (RunButton != null) {
-                       RunButton.setText(R.string.test_run);
-                       RunButton.setVisibility(View.VISIBLE);
-                       RunButton.setOnClickListener(mOnRunListener);
+                    if (txtbox1 != null) {
+                       txtbox1.setText(R.string.type_rd);
+                       txtbox1.setVisibility(View.VISIBLE);
                     }
-                    if(mTestSelected == SWEEP_TEST) {
-                       enableBandSweepSetting();
-                    }else {
-                       disableBandSweepSetting();
+                    if (tv1 != null) {
+                       tv1.setText(R.string.enter_IntfLowTh);
+                       tv1.setVisibility(View.VISIBLE);
+                    }
+                    if(button1 != null) {
+                       button1.setVisibility(View.INVISIBLE);
+                    }
+                    if(button2 != null) {
+                       button2.setVisibility(View.INVISIBLE);
+                    }
+                    if (SetButton != null) {
+                       SetButton.setText(R.string.set_IntfLowTh);
+                       SetButton.setVisibility(View.VISIBLE);
+                       SetButton.setOnClickListener(mOnSetIntfLowThListener);
                     }
                     break;
                 case 4:
-                    RunButton = (Button)findViewById(R.id.Runbutton);
-                    if (RunButton != null) {
-                       RunButton.setVisibility(View.INVISIBLE);
+                    if (txtbox1 != null) {
+                       txtbox1.setText(R.string.type_rd);
+                       txtbox1.setVisibility(View.VISIBLE);
                     }
-                    pbar = (ProgressBar) findViewById(R.id.progressbar);
-                    if (pbar != null) {
-                       pbar.setVisibility(View.INVISIBLE);
+                    if (tv1 != null) {
+                       tv1.setText(R.string.enter_IntfHighTh);
+                       tv1.setVisibility(View.VISIBLE);
+                    }
+                    if(button1 != null) {
+                       button1.setVisibility(View.INVISIBLE);
+                    }
+                    if(button2 != null) {
+                       button2.setVisibility(View.INVISIBLE);
+                    }
+                    if (SetButton != null) {
+                       SetButton.setText(R.string.set_IntfHighTh);
+                       SetButton.setVisibility(View.VISIBLE);
+                       SetButton.setOnClickListener(mOnSetIntfHighThListener);
                     }
-                    adaptCfgRf.setDropDownViewResource(
-                                     android.R.layout.simple_spinner_dropdown_item);
-                    spinOptionFmRf.setAdapter(adaptCfgRf);
-                    if (isRomeChip())
-                       spinOptionFmRf.setOnItemSelectedListener(mSpinCfgRfListener3);
-                    else if(isTransportLayerSMD())
-                       spinOptionFmRf.setOnItemSelectedListener(mSpinCfgRfListener2);
-                    else
-                       spinOptionFmRf.setOnItemSelectedListener(mSpinCfgRfListener1);
-                    disableBandSweepSetting();
                     break;
-            }
-        }
-
-        public void onNothingSelected(AdapterView<?> parent) {
-            // Do Nothing
-        }
-    }
-    public class FmRfItemSelectedListener implements OnItemSelectedListener {
-        public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
-            Log.d("Table","onItemSelected is hit with "+pos);
-            mTestSelected = pos;
-            tLayout.setVisibility(View.INVISIBLE);
-            chooseFMRFoption();
-        }
-        public void onNothingSelected(AdapterView<?> parent) {
-            // Do Nothing
-        }
-    }
-    private void checkTransportLayer() {
-        String transportLayer = "";
-
-        transportLayer = SystemProperties.get("ro.qualcomm.bt.hci_transport");
-        if(transportLayer.equals("smd"))
-           mIsTransportSMD = true;
-    }
-    private boolean isTransportLayerSMD() {
-        return mIsTransportSMD;
-    }
-    private boolean isRomeChip() {
-        String chip = "";
-
-        chip = SystemProperties.get("qcom.bluetooth.soc");
-        if(chip.equals("rome"))
-           return true;
-        return false;
-    }
-
-    private void createResult(Result aRes) {
-        // Get the TableLayout
-        TableLayout tl = (TableLayout) findViewById(R.id.maintable);
-        if (tl == null) {
-           return;
-        }
-
-         /* Create a new row to be added. */
-        mNewRowIds++;
-        TableRow tr2 = new TableRow(getApplicationContext());
-        int width = getWindowManager().getDefaultDisplay().getWidth();
-        tr2.setLayoutParams(new LayoutParams(
-                     LayoutParams.FILL_PARENT,
-                     LayoutParams.WRAP_CONTENT));
-        tr2.setId(mNewRowIds);
-        /* Create a Button to be the row-content. */
-        TextView colFreq = new TextView(getApplicationContext());
-        colFreq.setText(aRes.getFreq());
-        colFreq.setTextSize(TypedValue.COMPLEX_UNIT_SP, 25);
-        colFreq.setWidth(width/4);
-                /* Add Button to row. */
-        tr2.addView(colFreq);
-
-        TextView colRMSSI = new TextView(getApplicationContext());
-        colRMSSI.setText(aRes.getRSSI());
-        colRMSSI.setTextSize(TypedValue.COMPLEX_UNIT_SP, 25);
-        colRMSSI.setWidth(width/4);
-        tr2.addView(colRMSSI);
-
-        if(!isRomeChip()) {
-            TextView colIoC = new TextView(getApplicationContext());
-            colIoC.setText(aRes.getIoC());
-            colIoC.setTextSize(TypedValue.COMPLEX_UNIT_SP, 25);
-            colIoC.setWidth(width/4);
-            tr2.addView(colIoC);
-        }
-
-        if(isTransportLayerSMD() || isRomeChip())
-        {
-             TextView colSINR = new TextView(getApplicationContext());
-             colSINR.setText(aRes.getSINR());
-             colSINR.setTextSize(TypedValue.COMPLEX_UNIT_SP, 25);
-             colSINR.setWidth(width/4);
-             tr2.addView(colSINR);
-        } else
-        {
-             TextView colMpxDcc = new TextView(getApplicationContext());
-             colMpxDcc.setText(aRes.getMpxDcc());
-             colMpxDcc.setTextSize(TypedValue.COMPLEX_UNIT_SP, 25);
-             colMpxDcc.setWidth(width/4);
-             tr2.addView(colMpxDcc);
-        }
+                case 5:
+                    if (txtbox1 != null) {
+                       txtbox1.setText(R.string.type_rd);
+                       txtbox1.setVisibility(View.VISIBLE);
+                    }
+                    if (tv1 != null) {
+                       tv1.setText(R.string.enter_SinrFirstStage);
+                       tv1.setVisibility(View.VISIBLE);
+                    }
+                    if(button1 != null) {
+                       button1.setVisibility(View.INVISIBLE);
+                    }
+                    if(button2 != null) {
+                       button2.setVisibility(View.INVISIBLE);
+                    }
+                    if (SetButton != null) {
+                       SetButton.setText(R.string.set_SinrFirstStage);
+                       SetButton.setVisibility(View.VISIBLE);
+                       SetButton.setOnClickListener(mOnSetSinrFirstStageListener);
+                    }
+                    break;
+                case 6:
+                    if (txtbox1 != null) {
+                       txtbox1.setText(R.string.type_rd);
+                       txtbox1.setVisibility(View.VISIBLE);
+                    }
+                    if (tv1 != null) {
+                       tv1.setText(R.string.enter_RmssiFirstStage);
+                       tv1.setVisibility(View.VISIBLE);
+                    }
+                    if(button1 != null) {
+                       button1.setVisibility(View.INVISIBLE);
+                    }
+                    if(button2 != null) {
+                       button2.setVisibility(View.INVISIBLE);
+                    }
+                    if (SetButton != null) {
+                       SetButton.setText(R.string.set_RmssiFirstStage);
+                       SetButton.setVisibility(View.VISIBLE);
+                       SetButton.setOnClickListener(mOnSetRmssiFirstStageListener);
+                    }
+                    break;
+                case 7:
+                    if (txtbox1 != null) {
+                       txtbox1.setText(R.string.type_rd);
+                       txtbox1.setVisibility(View.VISIBLE);
+                    }
+                    if (tv1 != null) {
+                       tv1.setText(R.string.enter_CF0Th12);
+                       tv1.setVisibility(View.VISIBLE);
+                    }
+                    if(button1 != null) {
+                       button1.setVisibility(View.INVISIBLE);
+                    }
+                    if(button2 != null) {
+                       button2.setVisibility(View.INVISIBLE);
+                    }
+                    if (SetButton != null) {
+                       SetButton.setText(R.string.set_CF0Th12);
+                       SetButton.setVisibility(View.VISIBLE);
+                       SetButton.setOnClickListener(mOnSetCFOMeanThListener);
+                    }
+                    break;
+                case 8:
+                    if (txtbox1 != null) {
+                        txtbox1.setVisibility(View.INVISIBLE);
+                    }
+                    if (tv1 != null) {
+                        tv1.setVisibility(View.INVISIBLE);
+                    }
+                    if (SetButton != null) {
+                        SetButton.setVisibility(View.INVISIBLE);
+                    }
+                    if(button1 != null) {
+                       button1.setText(R.string.search_algo_mpx);
+                       button1.setVisibility(View.VISIBLE);
+                       button1.setOnClickListener(mOnSetSearchMPXDCCListener);
+                    }
+                    if(button2 != null) {
+                       button2.setText(R.string.search_algo_sinrint);
+                       button2.setVisibility(View.VISIBLE);
+                       button2.setOnClickListener(mOnSetSearchSinrIntfListener);
+                    }
+                    break;
+                case 9:
+                    if (txtbox1 != null) {
+                        txtbox1.setVisibility(View.INVISIBLE);
+                    }
+                    if (tv1 != null) {
+                        tv1.setText("");
+                        tv1.setVisibility(View.VISIBLE);
+                    }
+                    if(button1 != null) {
+                       button1.setVisibility(View.INVISIBLE);
+                    }
+                    if(button2 != null) {
+                       button2.setVisibility(View.INVISIBLE);
+                    }
+                    if (SetButton != null) {
+                        SetButton.setVisibility(View.INVISIBLE);
+                    }
+                    try {
+                        if(mService != null)
+                           ret = mService.getSinrSamplesCnt();
+                           Log.d(LOGTAG, "Get Sinr Samples Count: " + ret);
+                    }catch (RemoteException e) {
+                    }
+                    break;
+                case 10:
+                    if (txtbox1 != null) {
+                        txtbox1.setVisibility(View.INVISIBLE);
+                    }
+                    if (tv1 != null) {
+                        tv1.setText("");
+                        tv1.setVisibility(View.VISIBLE);
+                    }
+                    if(button1 != null) {
+                       button1.setVisibility(View.INVISIBLE);
+                    }
+                    if(button2 != null) {
+                       button2.setVisibility(View.INVISIBLE);
+                    }
+                    if (SetButton != null) {
+                        SetButton.setVisibility(View.INVISIBLE);
+                    }
+                    try {
+                        if(mService != null)
+                           ret = mService.getSinrTh();
+                           Log.d(LOGTAG, "Get Sinr Threshold: " + ret);
+                    }catch (RemoteException e) {
+
+                    }
+                    break;
+                case 11:
+                    if (txtbox1 != null) {
+                        txtbox1.setVisibility(View.INVISIBLE);
+                    }
+                    if (tv1 != null) {
+                        tv1.setText("");
+                        tv1.setVisibility(View.VISIBLE);
+                    }
+                    if(button1 != null) {
+                       button1.setVisibility(View.INVISIBLE);
+                    }
+                    if(button2 != null) {
+                       button2.setVisibility(View.INVISIBLE);
+                    }
+                    if (SetButton != null) {
+                        SetButton.setVisibility(View.INVISIBLE);
+                    }
+                    try {
+                        if(mService != null) {
+                           ret = mService.getSinrFirstStage();
+                           Log.d(LOGTAG, "Get Sinr First Stage: " + ret);
+                        }
+                    }catch (RemoteException e) {
+
+                    }
+                    break;
+                case 12:
+                    if (txtbox1 != null) {
+                        txtbox1.setVisibility(View.INVISIBLE);
+                    }
+                    if (tv1 != null) {
+                        tv1.setText("");
+                        tv1.setVisibility(View.VISIBLE);
+                    }
+                    if(button1 != null) {
+                       button1.setVisibility(View.INVISIBLE);
+                    }
+                    if(button2 != null) {
+                       button2.setVisibility(View.INVISIBLE);
+                    }
+                    if (SetButton != null) {
+                        SetButton.setVisibility(View.INVISIBLE);
+                    }
+                    try {
+                        if(mService != null) {
+                           ret = mService.getRmssiFirstStage();
+                           Log.d(LOGTAG, "Get Rmssi First Stage: " + ret);
+                        }
+                    }catch (RemoteException e) {
+
+                    }
+                    break;
+                case 13:
+                    if (txtbox1 != null) {
+                        txtbox1.setVisibility(View.INVISIBLE);
+                    }
+                    if (tv1 != null) {
+                        tv1.setText("");
+                        tv1.setVisibility(View.VISIBLE);
+                    }
+                    if(button1 != null) {
+                       button1.setVisibility(View.INVISIBLE);
+                    }
+                    if(button2 != null) {
+                       button2.setVisibility(View.INVISIBLE);
+                    }
+                    if (SetButton != null) {
+                        SetButton.setVisibility(View.INVISIBLE);
+                    }
+                    try {
+                        if(mService != null) {
+                           ret = mService.getCFOMeanTh();
+                           Log.d(LOGTAG, "Get CF0 Threshold: " + ret);
+                        }
+                    }catch (RemoteException e) {
+
+                    }
+                    break;
+                case 14:
+                    if (txtbox1 != null) {
+                        txtbox1.setVisibility(View.INVISIBLE);
+                    }
+                    if (tv1 != null) {
+                        tv1.setText("");
+                        tv1.setVisibility(View.VISIBLE);
+                    }
+                    if(button1 != null) {
+                       button1.setVisibility(View.INVISIBLE);
+                    }
+                    if(button2 != null) {
+                       button2.setVisibility(View.INVISIBLE);
+                    }
+                    if (SetButton != null) {
+                        SetButton.setVisibility(View.INVISIBLE);
+                    }
+                    try {
+                        if(mService != null) {
+                            ret = mService.getSearchAlgoType();
+                            lastCmdSent = CMD_DEFRD_SEARCH_ALGO;
+                            Log.d(LOGTAG, "Search Type: " + ret);
+                        }
+                    }catch (RemoteException e) {
+
+                    }
+                    break;
+                case 15:
+                    if (txtbox1 != null) {
+                       txtbox1.setText(R.string.type_rd);
+                       txtbox1.setVisibility(View.VISIBLE);
+                    }
+                    if (tv1 != null) {
+                       tv1.setText(R.string.enter_AfJmpRmssiTh);
+                       tv1.setVisibility(View.VISIBLE);
+                    }
+                    if(button1 != null) {
+                       button1.setVisibility(View.INVISIBLE);
+                    }
+                    if(button2 != null) {
+                       button2.setVisibility(View.INVISIBLE);
+                    }
+                    if (SetButton != null) {
+                       SetButton.setText(R.string.set_AfJmpRmssiTh);
+                       SetButton.setVisibility(View.VISIBLE);
+                       SetButton.setOnClickListener(mOnSetAfJmpRmssiThListener);
+                    }
+                    break;
+                case 16:
+                    if (txtbox1 != null) {
+                       txtbox1.setText(R.string.type_rd);
+                       txtbox1.setVisibility(View.VISIBLE);
+                    }
+                    if (tv1 != null) {
+                       tv1.setText(R.string.enter_GdChRmssiTh);
+                       tv1.setVisibility(View.VISIBLE);
+                    }
+                    if(button1 != null) {
+                       button1.setVisibility(View.INVISIBLE);
+                    }
+                    if(button2 != null) {
+                       button2.setVisibility(View.INVISIBLE);
+                    }
+                    if (SetButton != null) {
+                       SetButton.setText(R.string.set_GdChRmssiTh);
+                       SetButton.setVisibility(View.VISIBLE);
+                       SetButton.setOnClickListener(mOnSetGdChRmssiThListener);
+                    }
+                    break;
+                case 17:
+                    if (txtbox1 != null) {
+                       txtbox1.setText(R.string.type_rd);
+                       txtbox1.setVisibility(View.VISIBLE);
+                    }
+                    if (tv1 != null) {
+                       tv1.setText(R.string.enter_AfJmpRmssiSmplsCnt);
+                       tv1.setVisibility(View.VISIBLE);
+                    }
+                    if(button1 != null) {
+                       button1.setVisibility(View.INVISIBLE);
+                    }
+                    if(button2 != null) {
+                       button2.setVisibility(View.INVISIBLE);
+                    }
+                    if (SetButton != null) {
+                       SetButton.setText(R.string.set_AfJmpRmssiSmplsCnt);
+                       SetButton.setVisibility(View.VISIBLE);
+                       SetButton.setOnClickListener(mOnSetAfJmpRmssiSmplsCntListener);
+                    }
+                    break;
+                case 18:
+                    if (txtbox1 != null) {
+                        txtbox1.setVisibility(View.INVISIBLE);
+                    }
+                    if (tv1 != null) {
+                        tv1.setText("");
+                        tv1.setVisibility(View.VISIBLE);
+                    }
+                    if(button1 != null) {
+                       button1.setVisibility(View.INVISIBLE);
+                    }
+                    if(button2 != null) {
+                       button2.setVisibility(View.INVISIBLE);
+                    }
+                    if (SetButton != null) {
+                        SetButton.setVisibility(View.INVISIBLE);
+                    }
+                    try {
+                        if(mService != null) {
+                           ret = mService.getAfJmpRmssiTh();
+                           Log.d(LOGTAG, "Get Af Jmp Rmssi Th: " + ret);
+                        }
+                    }catch (RemoteException e) {
+
+                    }
+                    break;
+                case 19:
+                    if (txtbox1 != null) {
+                        txtbox1.setVisibility(View.INVISIBLE);
+                    }
+                    if (tv1 != null) {
+                        tv1.setText("");
+                        tv1.setVisibility(View.VISIBLE);
+                    }
+                    if(button1 != null) {
+                       button1.setVisibility(View.INVISIBLE);
+                    }
+                    if(button2 != null) {
+                       button2.setVisibility(View.INVISIBLE);
+                    }
+                    if (SetButton != null) {
+                        SetButton.setVisibility(View.INVISIBLE);
+                    }
+                    try {
+                        if(mService != null) {
+                           ret = mService.getGoodChRmssiTh();
+                           Log.d(LOGTAG, "Get GoodChRmssi Threshold: " + ret);
+                        }
+                    }catch (RemoteException e) {
+
+                    }
+                    break;
+                case 20:
+                    if (txtbox1 != null) {
+                        txtbox1.setVisibility(View.INVISIBLE);
+                    }
+                    if (tv1 != null) {
+                        tv1.setText("");
+                        tv1.setVisibility(View.VISIBLE);
+                    }
+                    if(button1 != null) {
+                       button1.setVisibility(View.INVISIBLE);
+                    }
+                    if(button2 != null) {
+                       button2.setVisibility(View.INVISIBLE);
+                    }
+                    if (SetButton != null) {
+                        SetButton.setVisibility(View.INVISIBLE);
+                    }
+                    try {
+                        if(mService != null) {
+                           ret = mService.getAfJmpRmssiSamplesCnt();
+                           Log.d(LOGTAG, "Get AfJmpRmssiSamples count: " + ret);
+                        }
+                    }catch (RemoteException e) {
+
+                    }
+                    break;
+                case 21:
+                    if (txtbox1 != null) {
+                        txtbox1.setText(R.string.type_rd);
+                        txtbox1.setVisibility(View.VISIBLE);
+                    }
+                    if (tv1 != null) {
+                        tv1.setText(R.string.enter_RxRePeatCount);
+                        tv1.setVisibility(View.VISIBLE);
+                    }
+                    if (SetButton != null) {
+                        SetButton.setText(R.string.set_RxRePeatCount);
+                        SetButton.setVisibility(View.VISIBLE);
+                        SetButton.setOnClickListener(mOnSetRxRePeatCount);
+                    }
+                    if(button1 != null) {
+                       button1.setVisibility(View.INVISIBLE);
+                    }
+                    if(button2 != null) {
+                       button2.setVisibility(View.INVISIBLE);
+                    }
+                    break;
+                case 22:
+                    if (txtbox1 != null) {
+                       txtbox1.setText(R.string.type_rd);
+                       txtbox1.setVisibility(View.VISIBLE);
+                    }
+                    if (tv1 != null) {
+                       tv1.setText(R.string.enter_BlendSinrHi);
+                       tv1.setVisibility(View.VISIBLE);
+                    }
+                    if(button1 != null) {
+                       button1.setVisibility(View.INVISIBLE);
+                    }
+                    if(button2 != null) {
+                       button2.setVisibility(View.INVISIBLE);
+                    }
+                    if (SetButton != null) {
+                       SetButton.setText(R.string.set_BlendSinrHi);
+                       SetButton.setVisibility(View.VISIBLE);
+                       SetButton.setOnClickListener(mOnSetBlendSinrHiListener);
+                    }
+                    break;
+                case 23:
+                    if (txtbox1 != null) {
+                        txtbox1.setVisibility(View.INVISIBLE);
+                    }
+                    if (tv1 != null) {
+                        tv1.setText("");
+                        tv1.setVisibility(View.VISIBLE);
+                    }
+                    if(button1 != null) {
+                       button1.setVisibility(View.INVISIBLE);
+                    }
+                    if(button2 != null) {
+                       button2.setVisibility(View.INVISIBLE);
+                    }
+                    if (SetButton != null) {
+                        SetButton.setVisibility(View.INVISIBLE);
+                    }
+                    if (mReceiver != null) {
+                        retval = mReceiver.getBlendSinr();
+                        Log.d(LOGTAG, "Get BlendSinrHi: " + retval);
+                    }
+                    break;
+                case 24:
+                    if (txtbox1 != null) {
+                       txtbox1.setText(R.string.type_rd);
+                       txtbox1.setVisibility(View.VISIBLE);
+                    }
+                    if (tv1 != null) {
+                       tv1.setText(R.string.enter_BlendRmssiHi);
+                       tv1.setVisibility(View.VISIBLE);
+                    }
+                    if(button1 != null) {
+                       button1.setVisibility(View.INVISIBLE);
+                    }
+                    if(button2 != null) {
+                       button2.setVisibility(View.INVISIBLE);
+                    }
+                    if (SetButton != null) {
+                       SetButton.setText(R.string.set_BlendRmssiHi);
+                       SetButton.setVisibility(View.VISIBLE);
+                       SetButton.setOnClickListener(mOnSetBlendRmssiHiListener);
+                    }
+                    break;
+                case 25:
+                    if (txtbox1 != null) {
+                        txtbox1.setVisibility(View.INVISIBLE);
+                    }
+                    if (tv1 != null) {
+                        tv1.setText("");
+                        tv1.setVisibility(View.VISIBLE);
+                    }
+                    if(button1 != null) {
+                       button1.setVisibility(View.INVISIBLE);
+                    }
+                    if(button2 != null) {
+                       button2.setVisibility(View.INVISIBLE);
+                    }
+                    if (SetButton != null) {
+                        SetButton.setVisibility(View.INVISIBLE);
+                    }
+                    if (mReceiver != null) {
+                        retval = mReceiver.getBlendRmssi();
+                        Log.d(LOGTAG, "Get BlendRmssiHi: " + retval);
+                    }
+                    break;
+                case 26:
+                    tLayout.removeAllViewsInLayout();
+                    mNewRowIds = NEW_ROW_ID;
+                    tLayout.setVisibility(View.VISIBLE);
+                    if (txtbox1 != null) {
+                       txtbox1.setVisibility(View.INVISIBLE);
+                    }
+                    if (tv1 != null) {
+                       tv1.setVisibility(View.INVISIBLE);
+                    }
+                    if (SetButton != null) {
+                       SetButton.setVisibility(View.INVISIBLE);
+                    }
+                    if(button1 != null) {
+                       button1.setVisibility(View.INVISIBLE);
+                    }
+                    if(button2 != null) {
+                       button2.setVisibility(View.INVISIBLE);
+                    }
+                    adaptRfCfg.setDropDownViewResource(
+                              android.R.layout.simple_spinner_dropdown_item);
+                    spinOptionFmRf.setAdapter(adaptRfCfg);
+                    spinOptionFmRf.setOnItemSelectedListener(mSpinRfCfgListener);
+                    break;
+            }
+        }
+        public void onNothingSelected(AdapterView<?> parent) {
+            // Do Nothing
+        }
+    }
+
+    public class RfCfgItemSelectedListener implements OnItemSelectedListener {
+        public void onItemSelected(AdapterView<?> parent,
+                                    View view, int pos, long id) {
+            Log.d("Table","onItemSelected is hit with "+pos);
+            tLayout.setVisibility(View.INVISIBLE);
+            if (mTestRunning)
+                stopCurTest();
+            switch(pos)
+            {
+                case 0:
+                case 1:
+                case 2:
+                case 3:
+                    mTestSelected = pos;
+                    tLayout.removeAllViewsInLayout();
+                    mNewRowIds = NEW_ROW_ID;
+                    tLayout.setVisibility(View.VISIBLE);
+                    RunButton = (Button)findViewById(R.id.Runbutton);
+                    if (RunButton != null) {
+                       RunButton.setText(R.string.test_run);
+                       RunButton.setVisibility(View.VISIBLE);
+                       RunButton.setOnClickListener(mOnRunListener);
+                    }
+                    if(mTestSelected == SWEEP_TEST) {
+                       enableBandSweepSetting();
+                    }else {
+                       disableBandSweepSetting();
+                    }
+                    break;
+                case 4:
+                    RunButton = (Button)findViewById(R.id.Runbutton);
+                    if (RunButton != null) {
+                       RunButton.setVisibility(View.INVISIBLE);
+                    }
+                    pbar = (ProgressBar) findViewById(R.id.progressbar);
+                    if (pbar != null) {
+                       pbar.setVisibility(View.INVISIBLE);
+                    }
+                    adaptCfgRf.setDropDownViewResource(
+                                     android.R.layout.simple_spinner_dropdown_item);
+                    spinOptionFmRf.setAdapter(adaptCfgRf);
+                    if (isCherokeeChip())
+                       spinOptionFmRf.setOnItemSelectedListener(mSpinCfgRfListener4);
+                    if (isRomeChip())
+                       spinOptionFmRf.setOnItemSelectedListener(mSpinCfgRfListener3);
+                    else if(isTransportLayerSMD())
+                       spinOptionFmRf.setOnItemSelectedListener(mSpinCfgRfListener2);
+                    else
+                       spinOptionFmRf.setOnItemSelectedListener(mSpinCfgRfListener1);
+                    disableBandSweepSetting();
+                    break;
+            }
+        }
+
+        public void onNothingSelected(AdapterView<?> parent) {
+            // Do Nothing
+        }
+    }
+    public class FmRfItemSelectedListener implements OnItemSelectedListener {
+        public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
+            Log.d("Table","onItemSelected is hit with "+pos);
+            mTestSelected = pos;
+            tLayout.setVisibility(View.INVISIBLE);
+            chooseFMRFoption();
+        }
+        public void onNothingSelected(AdapterView<?> parent) {
+            // Do Nothing
+        }
+    }
+    private void checkTransportLayer() {
+        String transportLayer = "";
+
+        transportLayer = SystemProperties.get("ro.qualcomm.bt.hci_transport");
+        if(transportLayer.equals("smd"))
+           mIsTransportSMD = true;
+    }
+    private boolean isTransportLayerSMD() {
+        return mIsTransportSMD;
+    }
+
+    private boolean isCherokeeChip() {
+        Log.d(LOGTAG, "isCherokeeChip");
+
+		String chip = SystemProperties.get("qcom.bluetooth.soc");
+		if (chip.equals("cherokee"))
+			return true;
+		else
+			return false;
+	}
+
+    private boolean isRomeChip() {
+        String chip = "";
+
+        chip = SystemProperties.get("qcom.bluetooth.soc");
+        if(chip.equals("rome"))
+           return true;
+        return false;
+    }
+
+    private void createResult(Result aRes) {
+        // Get the TableLayout
+        TableLayout tl = (TableLayout) findViewById(R.id.maintable);
+        if (tl == null) {
+            Log.e(LOGTAG, "Tl is null");
+           return;
+        }
+
+         /* Create a new row to be added. */
+        mNewRowIds++;
+        TableRow tr2 = new TableRow(getApplicationContext());
+        int width = getWindowManager().getDefaultDisplay().getWidth();
+        tr2.setLayoutParams(new LayoutParams(
+                     LayoutParams.FILL_PARENT,
+                     LayoutParams.WRAP_CONTENT));
+        tr2.setId(mNewRowIds);
+        /* Create a Button to be the row-content. */
+        TextView colFreq = new TextView(getApplicationContext());
+        colFreq.setText(aRes.getFreq());
+        colFreq.setTextSize(TypedValue.COMPLEX_UNIT_SP, 25);
+        colFreq.setWidth(width/4);
+                /* Add Button to row. */
+        tr2.addView(colFreq);
+
+        TextView colRMSSI = new TextView(getApplicationContext());
+        colRMSSI.setText(aRes.getRSSI());
+        colRMSSI.setTextSize(TypedValue.COMPLEX_UNIT_SP, 25);
+        colRMSSI.setWidth(width/4);
+        tr2.addView(colRMSSI);
+
+        if(!isRomeChip()) {
+            TextView colIoC = new TextView(getApplicationContext());
+            colIoC.setText(aRes.getIoC());
+            colIoC.setTextSize(TypedValue.COMPLEX_UNIT_SP, 25);
+            colIoC.setWidth(width/4);
+            tr2.addView(colIoC);
+        }
+
+        if(isTransportLayerSMD() || isRomeChip() || isCherokeeChip())
+        {
+             TextView colSINR = new TextView(getApplicationContext());
+             colSINR.setText(aRes.getSINR());
+             colSINR.setTextSize(TypedValue.COMPLEX_UNIT_SP, 25);
+             colSINR.setWidth(width/4);
+             tr2.addView(colSINR);
+        } else
+        {
+             TextView colMpxDcc = new TextView(getApplicationContext());
+             colMpxDcc.setText(aRes.getMpxDcc());
+             colMpxDcc.setTextSize(TypedValue.COMPLEX_UNIT_SP, 25);
+             colMpxDcc.setWidth(width/4);
+             tr2.addView(colMpxDcc);
+        }
           /* Add row to TableLayout. */
           /* Add row to TableLayout. */
         tl.addView(tr2,new TableLayout.LayoutParams(
@@ -2170,6 +2992,8 @@ public class FMStats extends Activity  {
         szbTestHeader.append("running test:").append(szTestInformation[mTestSelected]);
         szbTestHeader.append("\r\n");
         String szTestHeader = new String(szbTestHeader);
+        Message updateStop;
+        int freq;
         if(null != mFileCursor ) {
            try {
                 mFileCursor.write(szTestHeader.getBytes());
@@ -2181,53 +3005,61 @@ public class FMStats extends Activity  {
         {
         case CUR_FREQ_TEST:
              Log.d(LOGTAG,"Current Freq test is going to run");
-             int freq = FmSharedPreferences.getTunedFrequency();
+             freq = FmSharedPreferences.getTunedFrequency();
              Result res = GetFMStatsForFreq(freq);
-             createResult(mColumnHeader);
-             if(res != null)
-                createResult(res);
-              mTestRunning = false;
+             if(res != null) {
+                 Log.e(LOGTAG, "CUR_FREQ_TEST: Updating UI");
+                 Message updateUI = new Message();
+                 updateUI.what = STATUS_UPDATE;
+                 updateUI.obj = (Object)res;
+                 mUIUpdateHandlerHandler.sendMessage(updateUI);
+             }
+             updateStop = new Message();
+             updateStop.what = STATUS_DONE;
+             mUIUpdateHandlerHandler.sendMessage(updateStop);
+             mTestRunning = false;
               break;
         case CUR_MULTI_TEST:
-             /*Set it to ready to Stop*/
-             SetButtonState(false);
-             createResult(mColumnHeader);
 
-             if(mMultiUpdateThread == null) {
-                mMultiUpdateThread = new Thread(null, getMultipleResults,
-                                                 "MultiResultsThread");
-             }
-             /* Launch dummy thread to simulate the transfer progress */
-             Log.d(LOGTAG, "Thread State: " + mMultiUpdateThread.getState());
-             if(mMultiUpdateThread.getState() == Thread.State.TERMINATED) {
-                mMultiUpdateThread = new Thread(null, getMultipleResults,
-                                                 "MultiResultsThread");
-             }
-             /* If the thread state is "new" then the thread has not yet started */
-             if(mMultiUpdateThread.getState() == Thread.State.NEW) {
-                mMultiUpdateThread.start();
-             }
-             // returns and UI in different thread.
-             break;
+              freq = FmSharedPreferences.getTunedFrequency();
+
+              for(int i = 0; i < 20 && !Thread.currentThread().isInterrupted(); i++) {
+                  try {
+                      Thread.sleep(500);
+                      Message updateUI = new Message();
+                      updateUI.what = STATUS_UPDATE;
+                      updateUI.obj = (Object)GetFMStatsForFreq(freq);
+                      if(updateUI.obj == null)
+                          break;
+                      mUIUpdateHandlerHandler.sendMessage(updateUI);
+                  }catch (InterruptedException e) {
+                      /*break the loop*/
+                      break;
+                  }
+              }
+              mTestRunning = false;
+              updateStop = new Message();
+              updateStop.what = STATUS_DONE;
+              mUIUpdateHandlerHandler.sendMessage(updateStop);
+              // returns and UI in different thread.
+
+              break;
         case SEARCH_TEST:
-             try {
-                 Log.d(LOGTAG, "start scanning\n");
-                 if(isTransportLayerSMD()) {
-                    Log.d(LOGTAG,"Scanning with 0 scan time");
-                    if (mReceiver != null)
-                        mIsSearching = mReceiver.searchStations(FmReceiver.FM_RX_SRCH_MODE_SCAN,
-                                           SCAN_DWELL_PERIOD, FmReceiver.FM_RX_SEARCHDIR_UP);
-                 }else {
-                    mIsSearching = mService.scan(0);
-                 }
-             }catch (RemoteException e) {
-                 e.printStackTrace();
-             }
+              try {
+                  Log.e(LOGTAG, "start scanning\n");
+                  if(isTransportLayerSMD() || isCherokeeChip()) {
+                      Log.d(LOGTAG,"Scanning with 0 scan time");
+                      if (mReceiver != null)
+                          mIsSearching = mReceiver.searchStations(FmReceiver.FM_RX_SRCH_MODE_SCAN,
+                                  SCAN_DWELL_PERIOD, FmReceiver.FM_RX_SEARCHDIR_UP);
+                  } else {
+                      mIsSearching = mService.scan(0);
+                  }
+              }catch (RemoteException e) {
+                  e.printStackTrace();
+              }
 
              if(mIsSearching) {
-                 /*Set it to Ready to Stop*/
-                 SetButtonState(false);
-                 createResult(mColumnHeader);
                  Log.d(LOGTAG, "Created the results and cancel UI\n");
              }else {
                  mTestRunning = false;
@@ -2243,9 +3075,7 @@ public class FMStats extends Activity  {
              }catch (RemoteException e) {
                  e.printStackTrace();
              }
-             /* Set it to Ready to stop*/
-             SetButtonState(false);
-             createResult(mColumnHeader);
+
              getFMStatsInBand(lowerFreq, higherFreq, Spacing);
              break;
         }
@@ -2416,98 +3246,144 @@ public class FMStats extends Activity  {
     private Result GetFMStatsForFreq(int freq)
     {
         Result result = new Result();
+        int ret;
         Log.d(LOGTAG,"freq is "+freq);
         result.setFreq(Integer.toString(freq));
-        byte nRssi = 0;
-        int nIoC = 0;
-        int dummy = 0;
-        int nIntDet = 0;
-        int nMpxDcc = 0;
-        byte nSINR = 0;
         if((null != mService)) {
-           try {
-               dummy = mService.getRssi();
-               if (dummy != Integer.MAX_VALUE) {
-                   nRssi = (byte)dummy;
-                   result.setRSSI(Byte.toString(nRssi));
-               } else {
-                   return null;
-               }
-           } catch (RemoteException e) {
-               e.printStackTrace();
-           } catch(Exception e) {
-               e.printStackTrace();
-           }
+            try {
+                ret = mService.getRssi();
+                 if (ret != 0) {
+                     Log.e(LOGTAG, "getrssi cmd failed: ret = " + ret);
+                     return null;
+                 }
+                lastCmdSent = CMD_STNPARAM_RSSI;
+                Log.e(LOGTAG, "wait for response of mService.getRssi");
+                synchronized (obj) {
+                    try {
+                        obj.wait();
+                    } catch (InterruptedException e) {
+                        Log.e(LOGTAG, "getRSSI:THREAD interrupted");
+                        e.printStackTrace();
+                        return null;
+                    }
+                }
+                Log.e(LOGTAG, "Got response of mService.getRssi");
+                if (nRssi != Integer.MAX_VALUE) {
+                    result.setRSSI(Integer.toString(nRssi));
+                } else {
+                    return null;
+                }
+            } catch (RemoteException e) {
+                e.printStackTrace();
+            } catch(Exception e) {
+                e.printStackTrace();
+            }
 
-           if(!isRomeChip()) {
-              try {
-                  nIoC = mService.getIoC();
-                  if (nIoC != Integer.MAX_VALUE)
-                      result.setIoC(Integer.toString(nIoC));
-                  else
-                      return null;
-              } catch (RemoteException e) {
-                  e.printStackTrace();
-              } catch(Exception e) {
-                  e.printStackTrace();
-              }
-           }
+            if(!isRomeChip()) {
+                try {
+                    mService.getIoC();
+                    lastCmdSent = CMD_STNDBGPARAM_IOVERC;
+                    Log.e(LOGTAG, "wait for response of mService.getIoC");
+                    synchronized (obj) {
+                        try {
+                            obj.wait();
+                        } catch (InterruptedException e) {
+                            Log.e(LOGTAG, "getIOC:THREAD interrupted");
+                            e.printStackTrace();
+                            return null;
+                        }
+                    }
+                    Log.e(LOGTAG, "GOT response of mService.getIoC");
+                    if (nIoC != Integer.MAX_VALUE)
+                        result.setIoC(Integer.toString(nIoC));
+                    else
+                        return null;
+                } catch (RemoteException e) {
+                    e.printStackTrace();
+                } catch(Exception e) {
+                    e.printStackTrace();
+                }
+            }
 
-           if(isTransportLayerSMD() || isRomeChip()) {
-              try {
-                  dummy = mService.getSINR();
-                  if (dummy != Integer.MAX_VALUE) {
-                      nSINR = (byte)dummy;
-                      result.setSINR(Integer.toString(nSINR));
-                  } else {
-                      return null;
-                  }
-              } catch (RemoteException e) {
-                  e.printStackTrace();
-              } catch(Exception e) {
-                  e.printStackTrace();
-              }
-           } else {
-              try {
-                  nMpxDcc = mService.getMpxDcc();
-                  if (nMpxDcc != Integer.MAX_VALUE)
-                      result.setMpxDcc(Integer.toString(nMpxDcc));
-                  else
-                      return null;
-              } catch (RemoteException e) {
-                  e.printStackTrace();
-              }catch(Exception e) {
-                  e.printStackTrace();
-              }
-           }
+            if(isTransportLayerSMD() || isRomeChip() || isCherokeeChip()) {
+                try {
+                    mService.getSINR();
+                    lastCmdSent = CMD_STNPARAM_SINR;
+                    Log.e(LOGTAG, "wait for response of mService.getSINR");
+                    synchronized (obj) {
+                        try {
+                            obj.wait();
+                        } catch (InterruptedException e) {
+                            Log.e(LOGTAG, "getSINR:THREAD interrupted");
+                            e.printStackTrace();
+                            return null;
+                        }
+                    }
+                    Log.e(LOGTAG, "Got response of mService.getSINR");
+                    if (nSINR != Integer.MAX_VALUE) {
+                        result.setSINR(Integer.toString(nSINR));
+                    } else {
+                        return null;
+                    }
+                } catch (RemoteException e) {
+                    e.printStackTrace();
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            } else {
+                try {
+                    nMpxDcc = mService.getMpxDcc();
+                    if (nMpxDcc != Integer.MAX_VALUE)
+                        result.setMpxDcc(Integer.toString(nMpxDcc));
+                    else
+                        return null;
+                } catch (RemoteException e) {
+                    e.printStackTrace();
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
 
-           if(!isRomeChip()) {
-              try {
-                  nIntDet = mService.getIntDet();
-                  if (nIntDet != Integer.MAX_VALUE)
-                      result.setIntDet(Integer.toString(nIntDet));
-                  else
-                      return null;
-              } catch (RemoteException e) {
-                  e.printStackTrace();
-              }catch (Exception e) {
-                  e.printStackTrace();
-              }
-           }
+            if(!isRomeChip()) {
+                try {
+                    mService.getIntDet();
+                    lastCmdSent = CMD_STNDBGPARAM_INFDETOUT;
+                    Log.e(LOGTAG, "wait for response of mService.getIntDet");
+                    synchronized (obj) {
+                        try {
+                            obj.wait();
+                        } catch (InterruptedException e) {
+                            Log.e(LOGTAG, "getIntDet:THREAD interrupted");
+                            e.printStackTrace();
+                            return null;
+                        }
+                    }
+                    Log.e(LOGTAG, "Got response of mService.getIntDet");
+                    if (nIntDet != Integer.MAX_VALUE)
+                        result.setIntDet(Integer.toString(nIntDet));
+                    else
+                        return null;
+                } catch (RemoteException e) {
+                    e.printStackTrace();
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
         } else {
-           return null;
+            return null;
         }
         return result;
-   }
+    }
 
 
     private Handler mUIUpdateHandlerHandler = new Handler() {
             public void handleMessage(Message msg) {
+                Log.d(LOGTAG, "mUIUpdateHandlerHandler: msg.what = " + msg.what);
                switch (msg.what)
                {
                case STATUS_UPDATE:
                     Result myRes = (Result) msg.obj;
-                    Log.d(LOGTAG,"Status update is" +myRes.mFreq);
+                    Log.d(LOGTAG,"Status update is" +myRes.mFreq + "mRSSI=" + myRes.mRSSI + "mSINR=" + myRes.mSINR);
                     createResult(myRes);
                     break;
                case STATUS_DONE:
@@ -2558,7 +3434,7 @@ public class FMStats extends Activity  {
        {
           // presumably there is nobody interested in the service at this point,
           // so don't hang on to the ServiceConnection
-          sService = null;
+          mService = null;
        }
     }
 
@@ -2570,7 +3446,6 @@ public class FMStats extends Activity  {
        }
 
        public void onServiceConnected(ComponentName className, android.os.IBinder service) {
-          sService = IFMRadioService.Stub.asInterface(service);
           if (mCallback != null)
           {
              Log.e(LOGTAG, "onServiceConnected: mCallback");
@@ -2583,7 +3458,7 @@ public class FMStats extends Activity  {
           {
              mCallback.onServiceDisconnected(className);
           }
-          sService = null;
+          mService = null;
        }
     }
 
@@ -2639,7 +3514,7 @@ public class FMStats extends Activity  {
 
           public void onTuneStatusChanged()
           {
-             Log.d(LOGTAG, "mServiceCallbacks.onTuneStatusChanged :");
+             Log.d(LOGTAG, "mServiceCallbacks.onTuneStatusChanged :" + mTestRunning);
              if (mTestRunning)
                  mHandler.post(mTuneComplete);
           }
@@ -2729,6 +3604,138 @@ public class FMStats extends Activity  {
           public void onFmAudioPathStopped() {
              Log.d(LOGTAG, "mServiceCallbacks.onFmAudioPathStopped:");
           }
+          public void getSigThCb(int val, int status) {
+              Log.d(LOGTAG, "getSigThCb ");
+
+              if (setCmdSent) {
+                  setCmdSent = false;
+                  if (mService != null) {
+                      try {
+                          mService.setSinrSamplesCnt(textBoxVal);
+                      } catch (RemoteException e) {
+                          e.printStackTrace();
+                      }
+                  } else {
+                      Log.e(LOGTAG, "getSigTh: Service is null");
+                  }
+              } else {
+                  Log.e(LOGTAG, "Send message: SIGNAL_THRESHOLD");
+                  mCallbackHandler.obtainMessage(SIGNAL_THRESHOLD, val, status).sendToTarget();
+              }
+          }
+
+          public void getChDetThCb(int val, int status) {
+              Log.d(LOGTAG, "getChDetThCb");
+
+              if (setCmdSent) {
+                  setCmdSent = false;
+                  if (mService != null) {
+                      try {
+                          if (lastCmdSent == CMD_CHDET_SINR_TH)
+                              mService.setSinrTh(textBoxVal);
+                          else if (lastCmdSent == CMD_CHDET_SINR_SAMPLE)
+                              mService.setSinrSamplesCnt(textBoxVal);
+                          else if (lastCmdSent == CMD_CHDET_INTF_TH_LOW)
+                              mService.setIntfDetLowTh(textBoxVal);
+                          else if (lastCmdSent == CMD_CHDET_INTF_TH_HIGH)
+                              mService.setIntfDetHighTh(textBoxVal);
+                      } catch (RemoteException e) {
+                          Log.e(LOGTAG, "getChDetTh: exception");
+                          e.printStackTrace();
+                      }
+                  }
+                  lastCmdSent = 0;
+              } else {
+                  Log.e(LOGTAG, "Send message: GET_CHANNEL_DET_THRESHOLD");
+                  mCallbackHandler.obtainMessage(GET_CHANNEL_DET_THRESHOLD, val, status).sendToTarget();
+              }
+          }
+
+          public void setChDetThCb(int status)
+          {
+              Log.d(LOGTAG, "setChDetTh++");
+              mCallbackHandler.obtainMessage(SET_CHANNEL_DET_THRESHOLD, status).sendToTarget();
+          }
+
+          public void DefDataRdCb(int val, int status) {
+              Log.d(LOGTAG, "DefDataRdCb");
+
+              if (setCmdSent) {
+                  setCmdSent = false;
+                  if (mService != null) {
+                      try {
+                          if (lastCmdSent == CMD_DEFRD_AF_RMSSI_TH)
+                               mService.setAfJmpRmssiTh(textBoxVal);
+                          else if (lastCmdSent == CMD_DEFRD_AF_RMSSI_SAMPLE)
+                              mService.setAfJmpRmssiSamplesCnt(textBoxVal);
+                          else if (lastCmdSent == CMD_DEFRD_GD_CH_RMSSI_TH)
+                              mService.setGoodChRmssiTh(textBoxVal);
+                          else if (lastCmdSent == CMD_DEFRD_SEARCH_ALGO)
+                              mService.setSearchAlgoType(algo_type);
+                          else if (lastCmdSent == CMD_DEFRD_SINR_FIRST_STAGE)
+                              mService.setSinrFirstStage(textBoxVal);
+                          else if (lastCmdSent == CMD_DEFRD_RMSSI_FIRST_STAGE)
+                              mService.setRmssiFirstStage(textBoxVal);
+                          else if (lastCmdSent == CMD_DEFRD_CF0TH12)
+                              mService.setCFOMeanTh(textBoxVal);
+                          else if (lastCmdSent == CMD_DEFRD_REPEATCOUNT)
+                              mService.setRxRepeatCount(textBoxVal);
+                      } catch (RemoteException e) {
+                          Log.e(LOGTAG,"DefDataRd: exception");
+                          lastCmdSent = 0;
+                          e.printStackTrace();
+                      }
+                  } else {
+                      Log.e(LOGTAG, "DefDataRd:Service is null");
+                  }
+                  lastCmdSent = 0;
+              } else {
+                  Log.e(LOGTAG, "Send message: DEFAULT_DATA_READ");
+                  mCallbackHandler.obtainMessage(DEFAULT_DATA_READ, val, status).sendToTarget();
+              }
+          }
+
+          public void DefDataWrtCb(int status)
+          {
+              Log.d(LOGTAG, "DefDataWrtCb");
+              mCallbackHandler.obtainMessage(DEFAULT_DATA_WRITE, status).sendToTarget();
+          }
+
+          public void getBlendCb(int val, int status) {
+              Log.d(LOGTAG, "getBlend");
+
+              if (setCmdSent) {
+                  setCmdSent = false;
+                  if (mReceiver != null) {
+                      if (lastCmdSent == CMD_BLENDTBL_SINR_HI)
+                          mReceiver.setBlendSinr(textBoxVal);
+                      else if (lastCmdSent == CMD_BLENDTBL_RMSSI_HI)
+                          mReceiver.setBlendRmssi(textBoxVal);
+                  } else {
+                      Log.e(LOGTAG, "getBlend: Service is null");
+                  }
+                  lastCmdSent = 0;
+              } else {
+                  Log.e(LOGTAG, "Send message: GET_BLEND_TBL");
+                  mCallbackHandler.obtainMessage(GET_BLEND_TBL, val, status).sendToTarget();
+              }
+          }
+
+          public void setBlendCb(int status)
+          {
+              Log.d(LOGTAG, "setBlendCb");
+              mCallbackHandler.obtainMessage(SET_BLEND_TBL, status).sendToTarget();
+          }
+          public void getStationParamCb(int val, int status)
+          {
+              Log.d(LOGTAG, "getStationParamCb");
+              mCallbackHandler.obtainMessage(GET_STATION_PARAM, val, status).sendToTarget();
+          }
+          public void getStationDbgParamCb(int val, int status)
+          {
+              Log.d(LOGTAG, "getStationDbgParamCb");
+              mCallbackHandler.obtainMessage(GET_STATION_DBG_PARAM, val, status).sendToTarget();
+          }
       };
       /* Radio Vars */
      private Handler mHandler = new Handler();
@@ -2756,6 +3763,9 @@ public class FMStats extends Activity  {
      };
 
      private void stopCurTest() {
+         if (mRunTestThread != null) {
+             mRunTestThread.interrupt();
+         }
          if (mTestRunning) {
              switch(mTestSelected) {
              case CUR_FREQ_TEST:
diff --git a/fmapp2/src/com/caf/fmradio/IFMRadioService.aidl b/fmapp2/src/com/caf/fmradio/IFMRadioService.aidl
index 766961adab914077c0979345ac8ee748c085f903..50706af6df829d1d99a664f6b69cef51a3a38bfe 100644
--- a/fmapp2/src/com/caf/fmradio/IFMRadioService.aidl
+++ b/fmapp2/src/com/caf/fmradio/IFMRadioService.aidl
@@ -76,5 +76,8 @@ interface IFMRadioService
     boolean isSSRInProgress();
     boolean isRtPlusSupported();
     boolean isA2DPConnected();
+    boolean getIntfDetLowTh();
+    boolean getIntfDetHighTh();
+    boolean getRxRepeatCount();
 }
 
diff --git a/fmapp2/src/com/caf/fmradio/IFMRadioServiceCallbacks.aidl b/fmapp2/src/com/caf/fmradio/IFMRadioServiceCallbacks.aidl
index 826b5f3b5fdfb1a581511d4a339c959f3739d27c..f16c2d612f7b0aedab9a0e19792908aefc32399e 100644
--- a/fmapp2/src/com/caf/fmradio/IFMRadioServiceCallbacks.aidl
+++ b/fmapp2/src/com/caf/fmradio/IFMRadioServiceCallbacks.aidl
@@ -51,4 +51,13 @@ interface IFMRadioServiceCallbacks
   void onFmAudioPathStarted();
   void onFmAudioPathStopped();
   void onExtenCountryCodeChanged();
+  void getSigThCb(int val, int status);
+  void getChDetThCb(int val, int status);
+  void DefDataRdCb(int val, int status);
+  void getBlendCb(int val, int status);
+  void setChDetThCb(int status);
+  void DefDataWrtCb(int status);
+  void setBlendCb(int status);
+  void getStationParamCb(int val, int status);
+  void getStationDbgParamCb(int val, int status);
 }
diff --git a/helium/radio-helium-commands.h b/helium/radio-helium-commands.h
index f76b7d22f8204c0995146544b988c3b3f545f943..3c9bbdca87c57a6ba213643054db221feea800f5 100644
--- a/helium/radio-helium-commands.h
+++ b/helium/radio-helium-commands.h
@@ -109,6 +109,7 @@ enum helium_cmd_t {
     HCI_FM_HELIUM_UPPER_BAND,
     HCI_FM_HELIUM_LOWER_BAND,
     HCI_FM_HELIUM_AUDIO_MODE,
+    HCI_FM_HELIUM_RMSSI,
     HCI_FM_HELIUM_AUDIO_MUTE,
 };
 #endif /* __RADIO_CHEROKEE_COMMANDS_H */
diff --git a/helium/radio-helium.h b/helium/radio-helium.h
index 98452d800d4b02005fd9dff9b886e917c4128f64..05fc309e16fc67223cab7818283eba5aac30f429 100644
--- a/helium/radio-helium.h
+++ b/helium/radio-helium.h
@@ -104,38 +104,41 @@ pthread_mutex_t fm_hal;
 #define FM_TX_PHY_CFG_LEN    0x10
 #define FM_TX_PWR_GAIN_OFFSET 14
 /**RDS CONFIG MODE**/
-#define FM_RDS_CNFG_MODE	0x0f
-#define FM_RDS_CNFG_LEN		0x10
-#define AF_RMSSI_TH_LSB_OFFSET	10
-#define AF_RMSSI_TH_MSB_OFFSET	11
-#define AF_RMSSI_SAMPLES_OFFSET	15
+#define FM_RDS_CNFG_MODE    0x0f
+#define FM_RDS_CNFG_LEN     0x10
+#define AF_RMSSI_TH_OFFSET  1
+#define AF_RMSSI_SAMPLES_OFFSET 2
 /**RX CONFIG MODE**/
-#define FM_RX_CONFG_MODE	0x15
-#define FM_RX_CNFG_LEN		0x20
-#define GD_CH_RMSSI_TH_OFFSET	12
-#define MAX_GD_CH_RMSSI_TH	127
-#define SRCH_ALGO_TYPE_OFFSET  25
-#define SINRFIRSTSTAGE_OFFSET  26
-#define RMSSIFIRSTSTAGE_OFFSET 27
-#define CF0TH12_BYTE1_OFFSET   8
-#define CF0TH12_BYTE2_OFFSET   9
-#define CF0TH12_BYTE3_OFFSET   10
-#define CF0TH12_BYTE4_OFFSET   11
-#define MAX_SINR_FIRSTSTAGE	127
-#define MAX_RMSSI_FIRSTSTAGE	127
+#define FM_RX_CONFG_MODE    0x15
+#define FM_RX_CNFG_LEN      0x15
+#define GD_CH_RMSSI_TH_OFFSET   0x03
+#define MAX_GD_CH_RMSSI_TH  0x7F
+#define SRCH_ALGO_TYPE_OFFSET  0x00
+#define SINRFIRSTSTAGE_OFFSET  0x01
+#define RMSSIFIRSTSTAGE_OFFSET 0x02
+#define CF0TH12_BYTE1_OFFSET   0x03
+#define CF0TH12_BYTE2_OFFSET   0x04
+#define MAX_SINR_FIRSTSTAGE 0x7F
+#define MAX_RMSSI_FIRSTSTAGE    0x7F
 #define RDS_PS0_XFR_MODE 0x01
-#define RDS_PS0_LEN 6
-#define RX_REPEATE_BYTE_OFFSET 5
-#define FM_SPUR_TBL_SIZE 240
-#define SPUR_DATA_LEN 16
-#define ENTRIES_EACH_CMD 15
-#define SPUR_DATA_INDEX 2
-#define FM_AF_LIST_MAX_SIZE   200
+#define RDS_PS0_LEN 0x06
+#define RX_REPEATE_BYTE_OFFSET 0x05
+#define FM_SPUR_TBL_SIZE 0xF0
+#define SPUR_DATA_LEN 0x10
+#define ENTRIES_EACH_CMD 0x0F
+#define SPUR_DATA_INDEX 0x02
+#define FM_AF_LIST_MAX_SIZE   0xC8
 #define AF_LIST_MAX     (FM_AF_LIST_MAX_SIZE / 4) /* Each AF frequency consist
-							of sizeof(int) bytes */
-#define MAX_BLEND_INDEX 49
+                            of sizeof(int) bytes */
+#define MAX_BLEND_INDEX 0x31
+
+#define FM_SRCH_CONFG_MODE  0x41
+#define FM_AFJUMP_CONFG_MODE 0x42
+#define FM_SRCH_CNFG_LEN    0x08
+#define FM_AFJUMP_CNFG_LEN  0x06
+
 /* HCI timeouts */
-#define RADIO_HCI_TIMEOUT	(10000)	/* 10 seconds */
+#define RADIO_HCI_TIMEOUT   (10000) /* 10 seconds */
 
 typedef enum {
     ASSOCIATE_JVM,
@@ -164,6 +167,15 @@ typedef void (*fm_peek_cb)(char *peek_rsp);
 typedef void (*fm_ssbi_peek_cb)(char *ssbi_peek_rsp);
 typedef void (*fm_ch_det_th_cb)(char *ch_det_rsp);
 typedef void (*fm_ecc_evt_cb)(char *ecc_rsp);
+typedef void (*fm_sig_thr_cb) (int val, int status);
+typedef void (*fm_get_ch_det_thrs_cb) (int val, int status);
+typedef void (*fm_def_data_rd_cb) (int val, int status);
+typedef void (*fm_get_blnd_cb) (int val, int status);
+typedef void (*fm_set_ch_det_thrs_cb) (int status);
+typedef void (*fm_def_data_wrt_cb) (int status);
+typedef void (*fm_set_blnd_cb) (int status);
+typedef void (*fm_get_stn_prm_cb) (int val, int status);
+typedef void (*fm_get_stn_dbg_prm_cb) (int val, int status);
 
 typedef struct {
     size_t  size;
@@ -188,6 +200,15 @@ typedef struct {
     fm_ch_det_th_cb fm_ch_det_th_rsp_cb;
     fm_ecc_evt_cb	ext_country_code_cb;
     callback_thread_event thread_evt_cb;
+    fm_sig_thr_cb fm_get_sig_thres_cb;
+    fm_get_ch_det_thrs_cb fm_get_ch_det_thr_cb;
+    fm_def_data_rd_cb fm_def_data_read_cb;
+    fm_get_blnd_cb fm_get_blend_cb;
+    fm_set_ch_det_thrs_cb fm_set_ch_det_thr_cb;
+    fm_def_data_wrt_cb fm_def_data_write_cb;
+    fm_set_blnd_cb fm_set_blend_cb;
+    fm_get_stn_prm_cb fm_get_station_param_cb;
+    fm_get_stn_dbg_prm_cb fm_get_station_debug_param_cb;
 } fm_vendor_callbacks_t;
 
 pthread_mutex_t radio_fm_cmd;
@@ -304,11 +325,11 @@ struct radio_hci_dev {
      (short) hci_opcode_pack(HCI_OGF_FM_RECV_CTRL_CMD_REQ, ocf)
 #define hci_trans_ctrl_cmd_op_pack(ocf) \
      (short) hci_opcode_pack(HCI_OGF_FM_TRANS_CTRL_CMD_REQ, ocf)
-#define hci_common_cmd_op_pack(ocf)	\
+#define hci_common_cmd_op_pack(ocf) \
      (short) hci_opcode_pack(HCI_OGF_FM_COMMON_CTRL_CMD_REQ, ocf)
-#define hci_status_param_op_pack(ocf)	\
+#define hci_status_param_op_pack(ocf)   \
      (short) hci_opcode_pack(HCI_OGF_FM_STATUS_PARAMETERS_CMD_REQ, ocf)
-#define hci_diagnostic_cmd_op_pack(ocf)	\
+#define hci_diagnostic_cmd_op_pack(ocf) \
      (short) hci_opcode_pack(HCI_OGF_FM_DIAGNOSTIC_CMD_REQ, ocf)
 
 
@@ -342,15 +363,15 @@ struct hci_fm_recv_conf_req {
     char  ch_spacing;
     char  rds_std;
     char  hlsi;
-    int	  band_low_limit;
-    int	  band_high_limit;
+    int   band_low_limit;
+    int   band_high_limit;
 } ;
 
 /* ----- HCI Command request ----- */
 struct hci_fm_trans_conf_req_struct {
     char  emphasis;
     char  rds_std;
-    int	  band_low_limit;
+    int   band_low_limit;
     int   band_high_limit;
 } ;
 
@@ -467,21 +488,27 @@ struct hci_fm_ch_det_threshold {
     char sinr_samples;
     char low_th;
     char high_th;
-
 } ;
 
 struct hci_fm_blend_table {
-    char ucBlendType;
-    char ucBlendRampRateUp;
-    char ucBlendDebounceNumSampleUp;
-    char ucBlendDebounceIdxUp;
-    char ucBlendSinrIdxSkipStep;
-    char scBlendSinrHi;
-    char scBlendRmssiHi;
-    char ucBlendIndexHi;
-    char ucBlendIndex[MAX_BLEND_INDEX];
+    char BlendType;
+    char BlendRampRateUp;
+    char BlendDebounceNumSampleUp;
+    char BlendDebounceIdxUp;
+    char BlendSinrIdxSkipStep;
+    char BlendSinrHi;
+    char BlendRmssiHi;
+    char BlendIndexHi;
+    char BlendIndex[MAX_BLEND_INDEX];
 } ;
 
+struct hci_fm_def_data_rd {
+    char mode;
+    char length;
+    char param_len;
+    char param;
+};
+
 /*HCI events*/
 #define HCI_EV_TUNE_STATUS              0x01
 #define HCI_EV_RDS_LOCK_STATUS          0x02
@@ -521,22 +548,22 @@ struct hci_fm_blend_table {
 /*RT PLUS*/
 #define DUMMY_CLASS             0
 #define RT_PLUS_LEN_1_TAG       3
-#define RT_ERT_FLAG_BIT	        5
+#define RT_ERT_FLAG_BIT         5
 
 /*TAG1*/
-#define TAG1_MSB_OFFSET	        3
-#define TAG1_MSB_MASK	        7
-#define TAG1_LSB_OFFSET	        5
+#define TAG1_MSB_OFFSET         3
+#define TAG1_MSB_MASK           7
+#define TAG1_LSB_OFFSET         5
 #define TAG1_POS_MSB_MASK       31
 #define TAG1_POS_MSB_OFFSET     1
 #define TAG1_POS_LSB_OFFSET     7
-#define TAG1_LEN_OFFSET	        1
+#define TAG1_LEN_OFFSET         1
 #define TAG1_LEN_MASK           63
 
 /*TAG2*/
-#define TAG2_MSB_OFFSET	        5
+#define TAG2_MSB_OFFSET         5
 #define TAG2_MSB_MASK           1
-#define TAG2_LSB_OFFSET	        3
+#define TAG2_LSB_OFFSET         3
 #define TAG2_POS_MSB_MASK       7
 #define TAG2_POS_MSB_OFFSET     3
 #define TAG2_POS_LSB_OFFSET     5
@@ -544,7 +571,7 @@ struct hci_fm_blend_table {
 
 #define AGT_MASK                31
 /*Extract 5 left most bits of lsb of 2nd block*/
-#define AGT(x) 	             (x & AGT_MASK)
+#define AGT(x)               (x & AGT_MASK)
 /*16 bits of 4th block*/
 #define AID(lsb, msb)        ((msb << 8) | (lsb))
 /*Extract 5 right most bits of msb of 2nd block*/
@@ -554,9 +581,9 @@ struct hci_fm_blend_table {
 #define RT_PLUS_AID          0x4bd7
 
 /*ERT*/
-#define ERT_AID	             0x6552
-#define CARRIAGE_RETURN	     0x000D
-#define MAX_ERT_SEGMENT	     31
+#define ERT_AID              0x6552
+#define CARRIAGE_RETURN      0x000D
+#define MAX_ERT_SEGMENT      31
 #define ERT_FORMAT_DIR_BIT   1
 
 #define EXTRACT_BIT(data, bit_pos) ((data & (1 << bit_pos)) >> bit_pos)
@@ -683,8 +710,7 @@ struct hci_fm_af_list_rsp {
 } ;
 
 struct hci_fm_data_rd_rsp {
-    char    status;
-    char    ret_data_len;
+    char    data_len;
     char    data[DEFAULT_DATA_SIZE];
 } ;
 
@@ -694,7 +720,6 @@ struct hci_fm_feature_list_rsp {
 } ;
 
 struct hci_fm_dbg_param_rsp {
-    char    status;
     char    blend;
     char    soft_mute;
     char    inf_blend;
@@ -704,35 +729,35 @@ struct hci_fm_dbg_param_rsp {
     char    in_det_out;
 } ;
 
-#define CLKSPURID_INDEX0	0
-#define CLKSPURID_INDEX1	5
-#define CLKSPURID_INDEX2	10
-#define CLKSPURID_INDEX3	15
-#define CLKSPURID_INDEX4	20
-#define CLKSPURID_INDEX5	25
+#define CLKSPURID_INDEX0    0
+#define CLKSPURID_INDEX1    5
+#define CLKSPURID_INDEX2    10
+#define CLKSPURID_INDEX3    15
+#define CLKSPURID_INDEX4    20
+#define CLKSPURID_INDEX5    25
 
-#define MAX_SPUR_FREQ_LIMIT	30
-#define CKK_SPUR		0x3B
-#define SPUR_DATA_SIZE		0x4
-#define SPUR_ENTRIES_PER_ID	0x5
+#define MAX_SPUR_FREQ_LIMIT 30
+#define CKK_SPUR        0x3B
+#define SPUR_DATA_SIZE      0x4
+#define SPUR_ENTRIES_PER_ID 0x5
 
 #define COMPUTE_SPUR(val)         ((((val) - (76000)) / (50)))
 #define GET_FREQ(val, bit)        ((bit == 1) ? ((val) >> 8) : ((val) & 0xFF))
 #define GET_SPUR_ENTRY_LEVEL(val) ((val) / (5))
 
 struct hci_fm_spur_data {
-    int	  freq[MAX_SPUR_FREQ_LIMIT];
+    int   freq[MAX_SPUR_FREQ_LIMIT];
     char  rmssi[MAX_SPUR_FREQ_LIMIT];
     char  enable[MAX_SPUR_FREQ_LIMIT];
 } ;
 
 
 /* HCI dev events */
-#define RADIO_HCI_DEV_REG			1
-#define RADIO_HCI_DEV_WRITE			2
+#define RADIO_HCI_DEV_REG           1
+#define RADIO_HCI_DEV_WRITE         2
 
-#define hci_req_lock(d)		mutex_lock(&d->req_lock)
-#define hci_req_unlock(d)	mutex_unlock(&d->req_lock)
+#define hci_req_lock(d)     mutex_lock(&d->req_lock)
+#define hci_req_unlock(d)   mutex_unlock(&d->req_lock)
 
 /* FM RDS */
 #define RDS_PTYPE 2
@@ -824,7 +849,7 @@ enum spur_entry_levels {
 #define SRCH_MODE       0x07
 #define SRCH_DIR        0x08 /* 0-up 1-down */
 #define SCAN_DWELL      0x70
-#define SRCH_ON	        0x80
+#define SRCH_ON         0x80
 
 /* I/O Control */
 #define IOC_HRD_MUTE    0x03
@@ -835,12 +860,12 @@ enum spur_entry_levels {
 #define IOC_ANTENNA     0x01
 
 /* RDS Control */
-#define RDS_ON	    0x01
+#define RDS_ON      0x01
 #define RDS_BUF_SZ  100
 
 /* constants */
-#define  RDS_BLOCKS_NUM	(4)
-#define BYTES_PER_BLOCK	(3)
+#define  RDS_BLOCKS_NUM (4)
+#define BYTES_PER_BLOCK (3)
 #define MAX_PS_LENGTH   (108)
 #define MAX_RT_LENGTH   (64)
 #define RDS_GRP_CNTR_LEN (36)
@@ -861,7 +886,7 @@ enum spur_entry_levels {
 #define GET_LSB(x)((x) & 0xFF)
 
 /* control options */
-#define CTRL_ON	    (1)
+#define CTRL_ON     (1)
 #define CTRL_OFF    (0)
 
 /*Diagnostic commands*/
@@ -885,7 +910,7 @@ enum spur_entry_levels {
 #define MAX_CALIB_SIZE 75
 
 /* Channel validity */
-#define INVALID_CHANNEL	    (0)
+#define INVALID_CHANNEL     (0)
 #define VALID_CHANNEL       (1)
 
 struct hci_fm_set_cal_req_proc {
@@ -1170,7 +1195,44 @@ struct helium_device {
     struct hci_fm_ssbi_req    ssbi_data_accs;
     struct hci_fm_ssbi_peek   ssbi_peek_reg;
     struct hci_fm_ch_det_threshold ch_det_threshold;
+    struct hci_fm_data_rd_rsp def_data;
+    struct hci_fm_blend_table blend_tbl;
 };
+
+#define set_bit(flag, bit_pos)      ((flag) |= (1 << (bit_pos)))
+#define clear_bit(flag, bit_pos)    ((flag) &= (~(1 << (bit_pos))))
+#define test_bit(flag, bit_pos)     ((flag) & (1 << (bit_pos)))
+#define clear_all_bit(flag)         ((flag) &= (~0xFFFFFFFF))
+#define CMD_CHDET_SINR_TH           (1)
+#define CMD_CHDET_SINR_SAMPLE       (2)
+#define CMD_CHDET_INTF_TH_LOW       (3)
+#define CMD_CHDET_INTF_TH_HIGH      (4)
+
+#define CMD_DEFRD_AF_RMSSI_TH       (1)
+#define CMD_DEFRD_AF_RMSSI_SAMPLE   (2)
+#define CMD_DEFRD_GD_CH_RMSSI_TH    (3)
+#define CMD_DEFRD_SEARCH_ALGO       (4)
+#define CMD_DEFRD_SINR_FIRST_STAGE  (5)
+#define CMD_DEFRD_RMSSI_FIRST_STAGE (6)
+#define CMD_DEFRD_CF0TH12           (7)
+#define CMD_DEFRD_TUNE_POWER        (8)
+#define CMD_DEFRD_REPEATCOUNT       (9)
+
+#define CMD_STNPARAM_RSSI           (1)
+#define CMD_STNPARAM_SINR           (2)
+#define CMD_STNPARAM_INTF_DET_TH    (3)
+
+#define CMD_STNDBGPARAM_BLEND       (1)
+#define CMD_STNDBGPARAM_SOFTMUTE    (2)
+#define CMD_STNDBGPARAM_INFBLEND    (3)
+#define CMD_STNDBGPARAM_INFSOFTMUTE (4)
+#define CMD_STNDBGPARAM_PILOTPLL    (5)
+#define CMD_STNDBGPARAM_IOVERC      (6)
+#define CMD_STNDBGPARAM_INFDETOUT   (7)
+
+#define CMD_BLENDTBL_SINR_HI        (1)
+#define CMD_BLENDTBL_RMSSI_HI       (2)
+
 int hci_fm_disable_recv_req();
 int helium_search_list(struct hci_fm_search_station_list_req *s_list);
 int helium_search_rds_stations(struct hci_fm_search_rds_station_req *rds_srch);
@@ -1194,6 +1256,11 @@ int hci_ssbi_poke_reg(struct hci_fm_ssbi_req *data);
 int hci_ssbi_peek_reg(struct hci_fm_ssbi_peek *data);
 int hci_fm_get_ch_det_th();
 int set_ch_det_thresholds_req(struct hci_fm_ch_det_threshold *ch_det_th);
-
+int hci_fm_default_data_read_req(struct hci_fm_def_data_rd_req *def_data_rd);
+int hci_fm_get_blend_req();
+int hci_fm_set_blend_tbl_req(struct hci_fm_blend_table *blnd_tbl);
+int hci_fm_default_data_write_req(struct hci_fm_def_data_wr_req * data_wrt);
+int hci_fm_get_station_dbg_param_req();
+int hci_fm_get_station_cmd_param_req();
 
 #endif /* __UAPI_RADIO_HCI_CORE_H */
diff --git a/helium/radio_helium_hal.c b/helium/radio_helium_hal.c
index 561c92af8aa5989c1e3dd4674018fccf7606e8f5..2a29f64d64801d75d73e087d327a96c121d5b656 100644
--- a/helium/radio_helium_hal.c
+++ b/helium/radio_helium_hal.c
@@ -36,6 +36,7 @@ IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #include "radio-helium.h"
 #include "fm_hci.h"
 #include <dlfcn.h>
+#include <errno.h>
 
 fm_vendor_callbacks_t *jni_cb;
 int hci_fm_get_signal_threshold();
@@ -52,6 +53,12 @@ static unsigned char c_byt_pair_index;
 static char utf_8_flag;
 static char rt_ert_flag;
 static char formatting_dir;
+static uint32_t ch_det_th_mask_flag;
+static uint32_t def_data_rd_mask_flag;
+static uint32_t blend_tbl_mask_flag;
+static uint32_t station_param_mask_flag;
+static uint32_t station_dbg_param_mask_flag;
+uint64_t flag;
 
 #define LOG_TAG "radio_helium"
 static void radio_hci_req_complete(char result)
@@ -76,6 +83,8 @@ static void hci_cc_fm_enable_rsp(char *ev_rsp)
     jni_cb->thread_evt_cb(0);
     radio_hci_req_complete(rsp->status);
     jni_cb->enabled_cb();
+    if (rsp->status == FM_HC_STATUS_SUCCESS)
+        radio->mode = FM_RECV;
 }
 
 static void hci_cc_conf_rsp(char *ev_rsp)
@@ -181,20 +190,179 @@ static void hci_cc_ssbi_peek_rsp(char *ev_buff)
 
 static void hci_cc_get_ch_det_threshold_rsp(char *ev_buff)
 {
-    char status;
-
+    int status;
+    int val = 0;
     if (ev_buff == NULL) {
         ALOGE("%s:%s, buffer is null\n", LOG_TAG, __func__);
         return;
     }
     status = ev_buff[0];
-    ALOGE("%s:%s, status =%d\n", LOG_TAG, __func__,status);
-    if (status < 0) {
+    ALOGV("%s:%s, status =%d\n", LOG_TAG, __func__,status);
+    if (status != 0) {
         ALOGE("%s:%s,ssbi peek failed=%d\n", LOG_TAG, __func__, status);
-    }
-    memcpy(&radio->ch_det_threshold, &ev_buff[1],
+    } else {
+        memcpy(&radio->ch_det_threshold, &ev_buff[1],
                         sizeof(struct hci_fm_ch_det_threshold));
-    radio_hci_req_complete(status);
+        radio_hci_req_complete(status);
+
+        if (test_bit(ch_det_th_mask_flag, CMD_CHDET_SINR_TH))
+            val = radio->ch_det_threshold.sinr;
+        else if (test_bit(ch_det_th_mask_flag, CMD_CHDET_SINR_SAMPLE))
+            val = radio->ch_det_threshold.sinr_samples;
+        else if (test_bit(ch_det_th_mask_flag, CMD_CHDET_INTF_TH_LOW))
+            val = radio->ch_det_threshold.low_th;
+        else if (test_bit(ch_det_th_mask_flag, CMD_CHDET_INTF_TH_HIGH))
+            val = radio->ch_det_threshold.high_th;
+    }
+    clear_all_bit(ch_det_th_mask_flag);
+    jni_cb->fm_get_ch_det_thr_cb(val, status);
+}
+
+static void hci_cc_set_ch_det_threshold_rsp(char *ev_buff)
+{
+    int status = ev_buff[0];
+
+    jni_cb->fm_set_ch_det_thr_cb(status);
+}
+
+static void hci_cc_sig_threshold_rsp(char *ev_buff)
+{
+    int status, val = -1;
+    ALOGD("hci_cc_sig_threshold_rsp");
+
+    status = ev_buff[0];
+
+    if (status != 0) {
+        ALOGE("%s: status= 0x%x", __func__, status);
+    } else {
+        val = ev_buff[1];
+    }
+    jni_cb->fm_get_sig_thres_cb(val, status);
+}
+
+static void hci_cc_default_data_read_rsp(char *ev_buff)
+{
+    int status, val= 0, data_len = 0;
+
+    if (ev_buff == NULL) {
+        ALOGE("Response buffer is null");
+        return;
+    }
+    status = ev_buff[0];
+    if (status == 0) {
+        data_len = ev_buff[1];
+        ALOGV("hci_cc_default_data_read_rsp:data_len = %d", data_len);
+        memcpy(&radio->def_data, &ev_buff[1], data_len + sizeof(char));
+
+        if (test_bit(def_data_rd_mask_flag, CMD_DEFRD_AF_RMSSI_TH)) {
+            val = radio->def_data.data[AF_RMSSI_TH_OFFSET];
+        } else if (test_bit(def_data_rd_mask_flag, CMD_DEFRD_AF_RMSSI_SAMPLE)) {
+            val = radio->def_data.data[AF_RMSSI_SAMPLES_OFFSET];
+        } else if (test_bit(def_data_rd_mask_flag, CMD_DEFRD_GD_CH_RMSSI_TH)) {
+            val = radio->def_data.data[GD_CH_RMSSI_TH_OFFSET];
+            if (val > MAX_GD_CH_RMSSI_TH)
+                val -= 256;
+        } else if (test_bit(def_data_rd_mask_flag, CMD_DEFRD_SEARCH_ALGO)) {
+            val = radio->def_data.data[SRCH_ALGO_TYPE_OFFSET];
+        } else if (test_bit(def_data_rd_mask_flag, CMD_DEFRD_SINR_FIRST_STAGE)) {
+            val = radio->def_data.data[SINRFIRSTSTAGE_OFFSET];
+            if (val > MAX_SINR_FIRSTSTAGE)
+                val -= 256;
+        } else if (test_bit(def_data_rd_mask_flag, CMD_DEFRD_RMSSI_FIRST_STAGE)) {
+            val = radio->def_data.data[RMSSIFIRSTSTAGE_OFFSET];
+        } else if (test_bit(def_data_rd_mask_flag, CMD_DEFRD_CF0TH12)) {
+            val = (radio->def_data.data[CF0TH12_BYTE1_OFFSET] |
+                    (radio->def_data.data[CF0TH12_BYTE2_OFFSET] << 8));
+        } else if (test_bit(def_data_rd_mask_flag, CMD_DEFRD_TUNE_POWER)) {
+        } else if (test_bit(def_data_rd_mask_flag, CMD_DEFRD_REPEATCOUNT)) {
+            val = radio->def_data.data[RX_REPEATE_BYTE_OFFSET];
+        }
+    } else {
+        ALOGE("%s: Error: Status= 0x%x", __func__, status);
+    }
+    clear_all_bit(def_data_rd_mask_flag);
+    jni_cb->fm_def_data_read_cb(val, status);
+}
+
+static void hci_cc_default_data_write_rsp(char *ev_buff)
+{
+    int status = ev_buff[0];
+
+    jni_cb->fm_def_data_write_cb(status);
+}
+
+static void hci_cc_get_blend_tbl_rsp(char *ev_buff)
+{
+    int status, val;
+
+    if (ev_buff == NULL) {
+        ALOGE("%s:response buffer in null", LOG_TAG);
+        return;
+    }
+
+    status = ev_buff[0];
+    if (status != 0) {
+        ALOGE("%s: status = 0x%x", LOG_TAG, status);
+    } else {
+        memcpy(&radio->blend_tbl, &ev_buff[1],
+                sizeof(struct hci_fm_blend_table));
+
+        ALOGE("hci_cc_get_blend_tbl_rsp: data");
+        int i;
+        for (i = 0; i < 8; i++)
+            ALOGE("data[%d] = 0x%x", i, ev_buff[1 + i]);
+        if (test_bit(blend_tbl_mask_flag, CMD_BLENDTBL_SINR_HI)) {
+            val = radio->blend_tbl.BlendSinrHi;
+        } else if (test_bit(blend_tbl_mask_flag, CMD_BLENDTBL_RMSSI_HI)) {
+            val = radio->blend_tbl.BlendRmssiHi;
+        }
+    }
+    clear_all_bit(blend_tbl_mask_flag);
+    jni_cb->fm_get_blend_cb(val, status);
+}
+
+static void hci_cc_set_blend_tbl_rsp(char *ev_buff)
+{
+    int status = ev_buff[0];
+
+    jni_cb->fm_set_blend_cb(status);
+}
+
+static void hci_cc_station_rsp(char *ev_buff)
+{
+    int val, status = ev_buff[0];
+
+    if (status == FM_HC_STATUS_SUCCESS) {
+        memcpy(&radio->fm_st_rsp.station_rsp.station_freq, &ev_buff[1],
+                sizeof(struct hci_fm_station_rsp) - sizeof(char));
+        if (test_bit(station_param_mask_flag, CMD_STNPARAM_RSSI)) {
+                val = radio->fm_st_rsp.station_rsp.rssi;
+        } else if (test_bit(station_param_mask_flag, CMD_STNPARAM_SINR)) {
+            val = radio->fm_st_rsp.station_rsp.sinr;
+        }
+    }
+    ALOGE("hci_cc_station_rsp: val =%x, status = %x", val, status);
+
+    jni_cb->fm_get_station_param_cb(val, status);
+    clear_all_bit(station_param_mask_flag);
+}
+
+static void hci_cc_dbg_param_rsp(char *ev_buff)
+{
+    int val, status = ev_buff[0];
+
+    if (status == FM_HC_STATUS_SUCCESS) {
+        memcpy(&radio->st_dbg_param, &ev_buff[1],
+                sizeof(struct hci_fm_dbg_param_rsp));
+        if (test_bit(station_dbg_param_mask_flag, CMD_STNDBGPARAM_INFDETOUT)) {
+            val = radio->st_dbg_param.in_det_out;
+        } else if (test_bit(station_dbg_param_mask_flag, CMD_STNDBGPARAM_IOVERC)) {
+            val = radio->st_dbg_param.io_verc;
+        }
+    }
+    ALOGE("hci_cc_dbg_param_rsp: val =%x, status = %x", val, status);
+    jni_cb->fm_get_station_debug_param_cb(val, status);
+    clear_all_bit(station_dbg_param_mask_flag);
 }
 
 static inline void hci_cmd_complete_event(char *buff)
@@ -233,11 +401,11 @@ static inline void hci_cmd_complete_event(char *buff)
     case hci_recv_ctrl_cmd_op_pack(HCI_OCF_FM_RDS_GRP_PROCESS):
     case hci_recv_ctrl_cmd_op_pack(HCI_OCF_FM_EN_WAN_AVD_CTRL):
     case hci_recv_ctrl_cmd_op_pack(HCI_OCF_FM_EN_NOTCH_CTRL):
-    case hci_recv_ctrl_cmd_op_pack(HCI_OCF_FM_SET_CH_DET_THRESHOLD):
-    case hci_recv_ctrl_cmd_op_pack(HCI_OCF_FM_SET_BLND_TBL):
-    case hci_common_cmd_op_pack(HCI_OCF_FM_DEFAULT_DATA_WRITE):
             hci_cc_rsp(pbuf);
             break;
+    case hci_recv_ctrl_cmd_op_pack(HCI_OCF_FM_SET_CH_DET_THRESHOLD):
+            hci_cc_set_ch_det_threshold_rsp(pbuf);
+            break;
     case hci_common_cmd_op_pack(HCI_OCF_FM_RESET):
     case hci_diagnostic_cmd_op_pack(HCI_OCF_FM_SSBI_POKE_REG):
     case hci_diagnostic_cmd_op_pack(HCI_OCF_FM_POKE_DATA):
@@ -257,17 +425,34 @@ static inline void hci_cmd_complete_event(char *buff)
             hci_cc_ssbi_peek_rsp(buff);
             break;
     case hci_recv_ctrl_cmd_op_pack(HCI_OCF_FM_GET_CH_DET_THRESHOLD):
-            hci_cc_get_ch_det_threshold_rsp(buff);
-            break;
-/*    case hci_common_cmd_op_pack(HCI_OCF_FM_GET_SPUR_TABLE):
-            hci_cc_get_spur_tbl(buff);
+            hci_cc_get_ch_det_threshold_rsp(pbuf);
             break;
     case hci_recv_ctrl_cmd_op_pack(HCI_OCF_FM_GET_SIGNAL_THRESHOLD):
-            hci_cc_sig_threshold_rsp(buff);
+            hci_cc_sig_threshold_rsp(pbuf);
+            break;
+    case hci_common_cmd_op_pack(HCI_OCF_FM_DEFAULT_DATA_READ):
+            hci_cc_default_data_read_rsp(pbuf);
+            break;
+    case hci_common_cmd_op_pack(HCI_OCF_FM_DEFAULT_DATA_WRITE):
+            hci_cc_default_data_write_rsp(pbuf);
+            break;
+    case hci_recv_ctrl_cmd_op_pack(HCI_OCF_FM_GET_BLND_TBL):
+            hci_cc_get_blend_tbl_rsp(pbuf);
+            break;
+    case hci_recv_ctrl_cmd_op_pack(HCI_OCF_FM_SET_BLND_TBL):
+            hci_cc_set_blend_tbl_rsp(pbuf);
             break;
 
     case hci_recv_ctrl_cmd_op_pack(HCI_OCF_FM_GET_STATION_PARAM_REQ):
-            hci_cc_station_rsp(buff);
+            hci_cc_station_rsp(pbuf);
+            break;
+
+    case hci_diagnostic_cmd_op_pack(HCI_OCF_FM_STATION_DBG_PARAM):
+            hci_cc_dbg_param_rsp(pbuf);
+            break;
+
+/*    case hci_common_cmd_op_pack(HCI_OCF_FM_GET_SPUR_TABLE):
+            hci_cc_get_spur_tbl(buff);
             break;
 
     case hci_recv_ctrl_cmd_op_pack(HCI_OCF_FM_GET_PROGRAM_SERVICE_REQ):
@@ -282,17 +467,10 @@ static inline void hci_cmd_complete_event(char *buff)
             hci_cc_af_list_rsp(buff);
             break;
 
-    case hci_common_cmd_op_pack(HCI_OCF_FM_DEFAULT_DATA_READ):
-            hci_cc_riva_read_default_rsp(buff);
-            break;
-
     case hci_common_cmd_op_pack(HCI_OCF_FM_GET_FEATURE_LIST):
             hci_cc_feature_list_rsp(buff);
             break;
 
-    case hci_diagnostic_cmd_op_pack(HCI_OCF_FM_STATION_DBG_PARAM):
-            hci_cc_dbg_param_rsp(buff);
-            break;
     case hci_status_param_op_pack(HCI_OCF_FM_READ_GRP_COUNTERS):
             hci_cc_rds_grp_cntrs_rsp(buff);
             break;
@@ -300,9 +478,6 @@ static inline void hci_cmd_complete_event(char *buff)
             hci_cc_do_calibration_rsp(buff);
             break;
 
-    case hci_recv_ctrl_cmd_op_pack(HCI_OCF_FM_GET_BLND_TBL):
-            hci_cc_get_blend_tbl_rsp(buff);
-            break;
     default:
             ALOGE("opcode 0x%x", opcode);
             break; */
@@ -733,7 +908,7 @@ static void hci_ev_raw_rds_group_data(char *buff)
     }
 }
 
-void radio_hci_event_packet(char *evt_buf)
+static void radio_hci_event_packet(char *evt_buf)
 {
     char evt;
 
@@ -947,8 +1122,11 @@ static int set_fm_ctrl(int cmd, int val)
     char temp_val = 0;
     unsigned int rds_grps_proc = 0;
     char *data;
+    struct hci_fm_def_data_wr_req def_data_wrt;
+
 
     ALOGE("%s:cmd: %x, val: %d",LOG_TAG, cmd, val);
+
     switch (cmd) {
     case HCI_FM_HELIUM_AUDIO_MUTE:
         saved_val = radio->mute_mode.hard_mute;
@@ -960,10 +1138,16 @@ static int set_fm_ctrl(int cmd, int val)
         }
         break;
     case HCI_FM_HELIUM_SRCHMODE:
+        if (is_valid_srch_mode(val))
             radio->g_search_mode = val;
+        else
+            ret = -EINVAL;
         break;
     case HCI_FM_HELIUM_SCANDWELL:
+        if (is_valid_scan_dwell_prd(val))
             radio->g_scan_time = val;
+        else
+            ret = -EINVAL;
         break;
     case HCI_FM_HELIUM_SRCHON:
         helium_search_req(val, SRCH_DIR_UP);
@@ -989,18 +1173,28 @@ static int set_fm_ctrl(int cmd, int val)
         ret = helium_set_sig_threshold_req(temp_val);
         if (ret < 0) {
             ALOGE("%s:Error while setting signal threshold\n", LOG_TAG);
-            goto END;
+            goto end;
         }
         break;
     case HCI_FM_HELIUM_SRCH_PTY:
-         radio->srch_rds.srch_pty = val;
-         radio->srch_st_list.srch_pty = val;
+        if (is_valid_pty(val)) {
+            radio->srch_rds.srch_pty = val;
+            radio->srch_st_list.srch_pty = val;
+        } else {
+            ret = -EINVAL;
+        }
          break;
     case HCI_FM_HELIUM_SRCH_PI:
-         radio->srch_rds.srch_pi = val;
+         if (is_valid_pi(val))
+             radio->srch_rds.srch_pi = val;
+         else
+             ret = -EINVAL;
          break;
     case HCI_FM_HELIUM_SRCH_CNT:
-         radio->srch_st_list.srch_list_max = val;
+         if (is_valid_srch_station_cnt(val))
+             radio->srch_st_list.srch_list_max = val;
+         else
+             ret = -EINVAL;
          break;
     case HCI_FM_HELIUM_SPACING:
          saved_val = radio->recv_conf.ch_spacing;
@@ -1009,7 +1203,7 @@ static int set_fm_ctrl(int cmd, int val)
          if (ret < 0) {
              ALOGE("%s:Error in setting channel spacing", LOG_TAG);
              radio->recv_conf.ch_spacing = saved_val;
-             goto END;
+             goto end;
         }
         break;
     case HCI_FM_HELIUM_EMPHASIS:
@@ -1019,7 +1213,7 @@ static int set_fm_ctrl(int cmd, int val)
          if (ret < 0) {
              ALOGE("%s:Error in setting emphasis", LOG_TAG);
              radio->recv_conf.emphasis = saved_val;
-             goto END;
+             goto end;
          }
          break;
     case HCI_FM_HELIUM_RDS_STD:
@@ -1029,7 +1223,7 @@ static int set_fm_ctrl(int cmd, int val)
          if (ret < 0) {
              ALOGE("%s:Error in rds_std", LOG_TAG);
              radio->recv_conf.rds_std = saved_val;
-             goto END;
+             goto end;
          }
          break;
     case HCI_FM_HELIUM_RDSON:
@@ -1039,7 +1233,7 @@ static int set_fm_ctrl(int cmd, int val)
          if (ret < 0) {
              ALOGE("%s:Error in rds_std", LOG_TAG);
              radio->recv_conf.rds_std = saved_val;
-             goto END;
+             goto end;
          }
          break;
     case HCI_FM_HELIUM_RDSGROUP_MASK:
@@ -1052,7 +1246,7 @@ static int set_fm_ctrl(int cmd, int val)
          if (ret < 0) {
              ALOGE("%s:error in setting group mask\n", LOG_TAG);
              radio->rds_grp.rds_grp_enable_mask = saved_val;
-             goto END;
+             goto end;
         }
         break;
     case HCI_FM_HELIUM_RDSGROUP_PROC:
@@ -1062,7 +1256,7 @@ static int set_fm_ctrl(int cmd, int val)
          ret = helium_rds_grp_process_req(radio->g_rds_grp_proc_ps);
          if (ret < 0) {
              radio->g_rds_grp_proc_ps = saved_val;
-             goto END;
+             goto end;
          }
          break;
 
@@ -1071,7 +1265,7 @@ static int set_fm_ctrl(int cmd, int val)
          ret = hci_fm_get_rds_grpcounters_req(val);
          if (ret < 0) {
              radio->g_rds_grp_proc_ps = saved_val;
-             goto END;
+             goto end;
          }
          break;
 
@@ -1079,7 +1273,7 @@ static int set_fm_ctrl(int cmd, int val)
          ALOGD("%s: set notch filter  notch=%d ", LOG_TAG,val);
          ret = hci_fm_set_notch_filter_req(val);
          if (ret < 0) {
-            goto END;
+            goto end;
          }
          break;
 
@@ -1093,7 +1287,7 @@ static int set_fm_ctrl(int cmd, int val)
          ret = helium_rds_grp_process_req(radio->g_rds_grp_proc_ps);
          if (ret < 0) {
              radio->g_rds_grp_proc_ps = saved_val;
-             goto END;
+             goto end;
         }
         break;
     case HCI_FM_HELIUM_AF_JUMP:
@@ -1106,7 +1300,7 @@ static int set_fm_ctrl(int cmd, int val)
         ret = helium_rds_grp_process_req(radio->g_rds_grp_proc_ps);
         if (ret < 0) {
             radio->g_rds_grp_proc_ps = saved_val;
-            goto END;
+            goto end;
         }
         break;
     case HCI_FM_HELIUM_LP_MODE:
@@ -1117,7 +1311,7 @@ static int set_fm_ctrl(int cmd, int val)
         ret = helium_set_antenna_req(temp_val);
         if (ret < 0) {
             ALOGE("%s:Set Antenna failed retval = %x", LOG_TAG, ret);
-            goto END;
+            goto end;
         }
         radio->g_antenna =  val;
         break;
@@ -1128,7 +1322,7 @@ static int set_fm_ctrl(int cmd, int val)
          if (ret < 0) {
              ALOGE("%s:Error while setting FM soft mute %d", LOG_TAG, ret);
              radio->mute_mode.soft_mute = saved_val;
-             goto END;
+             goto end;
          }
          break;
     case HCI_FM_HELIUM_FREQ:
@@ -1156,7 +1350,7 @@ static int set_fm_ctrl(int cmd, int val)
         } else {
             ret = -1;
             ALOGE("%s: riva access len is not valid\n", LOG_TAG);
-            goto END;
+            goto end;
         }
         break;
     case HCI_FM_HELIUM_RIVA_PEEK:
@@ -1172,7 +1366,7 @@ static int set_fm_ctrl(int cmd, int val)
          } else {
              ALOGE("%s: riva access len is not valid for poke\n", LOG_TAG);
              ret = -1;
-             goto END;
+             goto end;
          }
          break;
     case HCI_FM_HELIUM_SSBI_ACCS_ADDR:
@@ -1190,97 +1384,142 @@ static int set_fm_ctrl(int cmd, int val)
          if (!is_valid_sinr_samples(val)) {
              ALOGE("%s: sinr samples count is not valid\n", __func__);
              ret = -1;
-             goto END;
-         }
-         ret = hci_fm_get_ch_det_th();
-         if (ret < 0) {
-             ALOGE("Failed to get chnl det thresholds  %d", ret);
-             goto END;
+             goto end;
          }
-         saved_val = radio->ch_det_threshold.sinr_samples;
          radio->ch_det_threshold.sinr_samples = val;
          ret = set_ch_det_thresholds_req(&radio->ch_det_threshold);
          if (ret < 0) {
              ALOGE("Failed to set SINR samples  %d", ret);
-             radio->ch_det_threshold.sinr_samples = saved_val;
-             goto END;
+             goto end;
          }
          break;
     case HCI_FM_HELIUM_SINR_THRESHOLD:
          if (!is_valid_sinr_th(val)) {
-             ALOGE("%s: sinr threshold is not valid\n");
+             ALOGE("%s: sinr threshold is not valid\n", __func__);
              ret = -1;
-             goto END;
+             goto end;
          }
-         ret = hci_fm_get_ch_det_th();
-         if (ret < 0) {
-             ALOGE("Failed to get chnl det thresholds  %d", ret);
-             goto END;
-         }
-         saved_val = radio->ch_det_threshold.sinr;
          radio->ch_det_threshold.sinr = val;
          ret = set_ch_det_thresholds_req(&radio->ch_det_threshold);
-         if (ret < 0) {
-             ALOGE("Failed to set SINR threshold %d", ret);
-             radio->ch_det_threshold.sinr = saved_val;
-             goto END;
-         }
          break;
     case HCI_FM_HELIUM_INTF_LOW_THRESHOLD:
          if (!is_valid_intf_det_low_th(val)) {
              ALOGE("%s: intf det low threshold is not valid\n", __func__);
              ret = -1;
-             goto END;
+             goto end;
          }
-         ret = hci_fm_get_ch_det_th();
-         if (ret < 0) {
-             ALOGE("Failed to get chnl det thresholds  %d", ret);
-             goto END;
-         }
-         saved_val = radio->ch_det_threshold.low_th;
          radio->ch_det_threshold.low_th = val;
          ret = set_ch_det_thresholds_req(&radio->ch_det_threshold);
-         if (ret < 0) {
-             ALOGE("Failed to Set Low det threshold %d", ret);
-             radio->ch_det_threshold.low_th = saved_val;
-             goto END;
-         }
          break;
     case HCI_FM_HELIUM_INTF_HIGH_THRESHOLD:
          if (!is_valid_intf_det_hgh_th(val)) {
              ALOGE("%s: intf high threshold is not valid\n", __func__);
              ret = -1;
-             goto END;
+             goto end;
          }
-         ret = hci_fm_get_ch_det_th();
-         if (ret < 0) {
-             ALOGE("Failed to get chnl det thresholds  %d", ret);
-             goto END;
-         }
-         saved_val = radio->ch_det_threshold.high_th;
          radio->ch_det_threshold.high_th = val;
          ret = set_ch_det_thresholds_req(&radio->ch_det_threshold);
-         if (ret < 0) {
-             ALOGE("Failed to set High det threshold %d ", ret);
-             radio->ch_det_threshold.high_th = saved_val;
-             goto END;
+         break;
+    case HCI_FM_HELIUM_SINRFIRSTSTAGE:
+         def_data_wrt.mode = FM_SRCH_CONFG_MODE;
+         def_data_wrt.length = FM_SRCH_CNFG_LEN;
+         memcpy(&def_data_wrt.data, &radio->def_data.data,
+                 radio->def_data.data_len);
+         def_data_wrt.data[SINRFIRSTSTAGE_OFFSET] = val;
+         ret = hci_fm_default_data_write_req(&def_data_wrt);
+         break;
+    case HCI_FM_HELIUM_RMSSIFIRSTSTAGE:
+         def_data_wrt.mode = FM_SRCH_CONFG_MODE;
+         def_data_wrt.length = FM_SRCH_CNFG_LEN;
+         memcpy(&def_data_wrt.data, &radio->def_data.data,
+                 radio->def_data.data_len);
+         def_data_wrt.data[RMSSIFIRSTSTAGE_OFFSET] = val;
+         ret = hci_fm_default_data_write_req(&def_data_wrt);
+         break;
+    case HCI_FM_HELIUM_CF0TH12:
+         def_data_wrt.mode = FM_SRCH_CONFG_MODE;
+         def_data_wrt.length = FM_SRCH_CNFG_LEN;
+         memcpy(&def_data_wrt.data, &radio->def_data.data,
+                 radio->def_data.data_len);
+         def_data_wrt.data[CF0TH12_BYTE1_OFFSET] = (val & 0xFF);
+         def_data_wrt.data[CF0TH12_BYTE2_OFFSET] = ((val >> 8) & 0xFF);
+         ret = hci_fm_default_data_write_req(&def_data_wrt);
+         break;
+    case HCI_FM_HELIUM_SRCHALGOTYPE:
+         def_data_wrt.mode = FM_SRCH_CONFG_MODE;
+         def_data_wrt.length = FM_SRCH_CNFG_LEN;
+         memcpy(&def_data_wrt.data, &radio->def_data.data,
+                 radio->def_data.data_len);
+         def_data_wrt.data[SRCH_ALGO_TYPE_OFFSET] = val;
+         ret = hci_fm_default_data_write_req(&def_data_wrt);
+         break;
+    case HCI_FM_HELIUM_AF_RMSSI_TH:
+         def_data_wrt.mode = FM_AFJUMP_CONFG_MODE;
+         def_data_wrt.length = FM_AFJUMP_CNFG_LEN;
+         memcpy(&def_data_wrt.data, &radio->def_data.data,
+                 radio->def_data.data_len);
+         def_data_wrt.data[AF_RMSSI_TH_OFFSET] = (val & 0xFF);
+         ret = hci_fm_default_data_write_req(&def_data_wrt);
+         break;
+    case HCI_FM_HELIUM_GOOD_CH_RMSSI_TH:
+         def_data_wrt.mode = FM_AFJUMP_CONFG_MODE;
+         def_data_wrt.length = FM_AFJUMP_CNFG_LEN;
+         memcpy(&def_data_wrt.data, &radio->def_data.data,
+                 radio->def_data.data_len);
+         def_data_wrt.data[GD_CH_RMSSI_TH_OFFSET] = val;
+         ret = hci_fm_default_data_write_req(&def_data_wrt);
+         break;
+    case HCI_FM_HELIUM_AF_RMSSI_SAMPLES:
+         def_data_wrt.mode = FM_AFJUMP_CONFG_MODE;
+         def_data_wrt.length = FM_AFJUMP_CNFG_LEN;
+         memcpy(&def_data_wrt.data, &radio->def_data.data,
+                 radio->def_data.data_len);
+         def_data_wrt.data[AF_RMSSI_SAMPLES_OFFSET] = val;
+         ret = hci_fm_default_data_write_req(&def_data_wrt);
+         break;
+    case HCI_FM_HELIUM_RXREPEATCOUNT:
+         def_data_wrt.mode = RDS_PS0_XFR_MODE;
+         def_data_wrt.length = RDS_PS0_LEN;
+         memcpy(&def_data_wrt.data, &radio->def_data.data,
+                 radio->def_data.data_len);
+         def_data_wrt.data[AF_RMSSI_SAMPLES_OFFSET] = val;
+         ret = hci_fm_default_data_write_req(&def_data_wrt);
+         break;
+    case HCI_FM_HELIUM_BLEND_SINRHI:
+         if (!is_valid_blend_value(val)) {
+             ALOGE("%s: sinr samples count is not valid\n", __func__);
+             ret = -1;
+             goto end;
          }
+         radio->blend_tbl.BlendSinrHi = val;
+         ret = hci_fm_set_blend_tbl_req(&radio->blend_tbl);
+         break;
+    case HCI_FM_HELIUM_BLEND_RMSSIHI:
+         if (!is_valid_blend_value(val)) {
+             ALOGE("%s: sinr samples count is not valid\n", __func__);
+             ret = -1;
+             goto end;
+         }
+         radio->blend_tbl.BlendRmssiHi = val;
+         ret = hci_fm_set_blend_tbl_req(&radio->blend_tbl);
          break;
     default:
         ALOGE("%s:%s: Not a valid FM CMD!!", LOG_TAG, __func__);
         ret = 0;
         break;
     }
-END:
+end:
     if (ret < 0)
         ALOGE("%s:%s: %d cmd failed", LOG_TAG, __func__, cmd);
     return ret;
 }
 
-static void get_fm_ctrl(int cmd, int val)
+static int get_fm_ctrl(int cmd, int val)
 {
     int ret = 0;
+    struct hci_fm_def_data_rd_req def_data_rd;
 
+    ALOGE("%s: cmd = 0x%x", __func__, cmd);
     switch(cmd) {
     case HCI_FM_HELIUM_FREQ:
         val = radio->fm_st_rsp.station_rsp.station_freq;
@@ -1292,24 +1531,127 @@ static void get_fm_ctrl(int cmd, int val)
         val = radio->recv_conf.band_low_limit;
         break;
     case HCI_FM_HELIUM_SINR_SAMPLES:
+        set_bit(ch_det_th_mask_flag, CMD_CHDET_SINR_SAMPLE);
         ret = hci_fm_get_ch_det_th();
-         if (ret == 0)
-             val = radio->ch_det_threshold.sinr_samples;
+        if (ret != FM_HC_STATUS_SUCCESS)
+            clear_bit(ch_det_th_mask_flag, CMD_CHDET_SINR_SAMPLE);
         break;
     case HCI_FM_HELIUM_SINR_THRESHOLD:
+        set_bit(ch_det_th_mask_flag, CMD_CHDET_SINR_TH);
         ret = hci_fm_get_ch_det_th();
-        if (ret == 0)
-            val = radio->ch_det_threshold.sinr;
+        if (ret != FM_HC_STATUS_SUCCESS)
+            clear_bit(ch_det_th_mask_flag, CMD_CHDET_SINR_TH);
         break;
     case HCI_FM_HELIUM_INTF_LOW_THRESHOLD:
+        set_bit(ch_det_th_mask_flag, CMD_CHDET_INTF_TH_LOW);
         ret = hci_fm_get_ch_det_th();
-        if (ret == 0)
-            val = radio->ch_det_threshold.low_th;
+        if (ret != FM_HC_STATUS_SUCCESS)
+            clear_bit(ch_det_th_mask_flag, CMD_CHDET_INTF_TH_LOW);
         break;
     case HCI_FM_HELIUM_INTF_HIGH_THRESHOLD:
+        set_bit(ch_det_th_mask_flag, CMD_CHDET_INTF_TH_HIGH);
         ret = hci_fm_get_ch_det_th();
-        if (ret == 0)
-            val = radio->ch_det_threshold.high_th;
+        if (ret != FM_HC_STATUS_SUCCESS)
+            clear_bit(ch_det_th_mask_flag, CMD_CHDET_INTF_TH_HIGH);
+        break;
+    case HCI_FM_HELIUM_SINRFIRSTSTAGE:
+        set_bit(def_data_rd_mask_flag, CMD_DEFRD_SINR_FIRST_STAGE);
+        def_data_rd.mode = FM_SRCH_CONFG_MODE;
+        def_data_rd.length = FM_SRCH_CNFG_LEN;
+        goto cmd;
+    case HCI_FM_HELIUM_RMSSIFIRSTSTAGE:
+        set_bit(def_data_rd_mask_flag, CMD_DEFRD_RMSSI_FIRST_STAGE);
+        def_data_rd.mode = FM_SRCH_CONFG_MODE;
+        def_data_rd.length = FM_SRCH_CNFG_LEN;
+        goto cmd;
+    case HCI_FM_HELIUM_CF0TH12:
+        set_bit(def_data_rd_mask_flag, CMD_DEFRD_CF0TH12);
+        def_data_rd.mode = FM_SRCH_CONFG_MODE;
+        def_data_rd.length = FM_SRCH_CNFG_LEN;
+        goto cmd;
+    case HCI_FM_HELIUM_SRCHALGOTYPE:
+        def_data_rd.mode = FM_SRCH_CONFG_MODE;
+        def_data_rd.length = FM_SRCH_CNFG_LEN;
+        set_bit(def_data_rd_mask_flag, CMD_DEFRD_SEARCH_ALGO);
+        goto cmd;
+    case HCI_FM_HELIUM_AF_RMSSI_TH:
+        set_bit(def_data_rd_mask_flag, CMD_DEFRD_AF_RMSSI_TH);
+        def_data_rd.mode = FM_AFJUMP_CONFG_MODE;
+        def_data_rd.length = FM_AFJUMP_CNFG_LEN;
+        goto cmd;
+    case HCI_FM_HELIUM_GOOD_CH_RMSSI_TH:
+        set_bit(def_data_rd_mask_flag, CMD_DEFRD_GD_CH_RMSSI_TH);
+        def_data_rd.mode = FM_AFJUMP_CONFG_MODE;
+        def_data_rd.length = FM_AFJUMP_CNFG_LEN;
+        goto cmd;
+    case HCI_FM_HELIUM_AF_RMSSI_SAMPLES:
+        set_bit(def_data_rd_mask_flag, CMD_DEFRD_AF_RMSSI_SAMPLE);
+        def_data_rd.mode = FM_AFJUMP_CONFG_MODE;
+        def_data_rd.length = FM_AFJUMP_CNFG_LEN;
+
+cmd:
+        def_data_rd.param_len = 0;
+        def_data_rd.param = 0;
+
+        ret = hci_fm_default_data_read_req(&def_data_rd);
+        if (ret != FM_HC_STATUS_SUCCESS)
+            clear_all_bit(def_data_rd_mask_flag);
+        break;
+    case HCI_FM_HELIUM_RXREPEATCOUNT:
+        def_data_rd.mode = RDS_PS0_XFR_MODE;
+        def_data_rd.length = RDS_PS0_LEN;
+        def_data_rd.param_len = 0;
+        def_data_rd.param = 0;
+        set_bit(def_data_rd_mask_flag, CMD_DEFRD_REPEATCOUNT);
+
+        ret = hci_fm_default_data_read_req(&def_data_rd);
+        if (ret != FM_HC_STATUS_SUCCESS)
+            clear_bit(def_data_rd_mask_flag, CMD_DEFRD_REPEATCOUNT);
+        break;
+    case HCI_FM_HELIUM_BLEND_SINRHI:
+        set_bit(blend_tbl_mask_flag, CMD_BLENDTBL_SINR_HI);
+        ret = hci_fm_get_blend_req();
+        if (ret != FM_HC_STATUS_SUCCESS)
+            clear_bit(blend_tbl_mask_flag, CMD_BLENDTBL_SINR_HI);
+    case HCI_FM_HELIUM_BLEND_RMSSIHI:
+        set_bit(blend_tbl_mask_flag, CMD_BLENDTBL_RMSSI_HI);
+        ret = hci_fm_get_blend_req();
+        if (ret != FM_HC_STATUS_SUCCESS)
+            clear_bit(blend_tbl_mask_flag, CMD_BLENDTBL_RMSSI_HI);
+        break;
+    case HCI_FM_HELIUM_IOVERC:
+        set_bit(station_dbg_param_mask_flag, CMD_STNDBGPARAM_IOVERC);
+        ret = hci_fm_get_station_dbg_param_req();
+        if (ret != FM_HC_STATUS_SUCCESS)
+            clear_bit(station_dbg_param_mask_flag, CMD_STNDBGPARAM_IOVERC);
+        break;
+    case HCI_FM_HELIUM_INTDET:
+        set_bit(station_dbg_param_mask_flag, CMD_STNDBGPARAM_INFDETOUT);
+        ret = hci_fm_get_station_dbg_param_req();
+        if (ret != FM_HC_STATUS_SUCCESS)
+            clear_bit(station_dbg_param_mask_flag, CMD_STNDBGPARAM_INFDETOUT);
+        break;
+    case HCI_FM_HELIUM_GET_SINR:
+        if (radio->mode == FM_RECV) {
+            set_bit(station_param_mask_flag, CMD_STNPARAM_SINR);
+            ret = hci_fm_get_station_cmd_param_req();
+            if (ret != FM_HC_STATUS_SUCCESS)
+                clear_bit(station_param_mask_flag, CMD_STNPARAM_SINR);
+        } else {
+            ALOGE("HCI_FM_HELIUM_GET_SINR: radio is not in recv mode");
+            ret = -EINVAL;
+        }
+        break;
+    case HCI_FM_HELIUM_RMSSI:
+        if (radio->mode == FM_RECV) {
+            set_bit(station_param_mask_flag, CMD_STNPARAM_RSSI);
+            ret = hci_fm_get_station_cmd_param_req();
+            if (ret != FM_HC_STATUS_SUCCESS)
+                clear_bit(station_param_mask_flag, CMD_STNPARAM_RSSI);
+        } else if (radio->mode == FM_TRANS) {
+            ALOGE("HCI_FM_HELIUM_RMSSI: radio is not in recv mode");
+            ret = -EINVAL;
+        }
         break;
     default:
         break;
diff --git a/helium/radio_helium_hal_cmds.c b/helium/radio_helium_hal_cmds.c
index df79d75cdd6f9b604224a05281e0c85026ed2e94..ea0b3c26791727db21123f3ba720ecaca112112e 100644
--- a/helium/radio_helium_hal_cmds.c
+++ b/helium/radio_helium_hal_cmds.c
@@ -47,32 +47,28 @@ static int send_fm_cmd_pkt(uint16_t opcode,  uint32_t len, void *param)
     FM_HDR *hdr = (FM_HDR *) malloc(p_len);
     if (!hdr) {
         ALOGE("%s:hdr allocation failed", LOG_TAG);
-        return -1;
+        return -FM_HC_STATUS_NOMEM;
     }
 
-    ALOGE("%s:%s: Sizeof FM_HDR: %d", LOG_TAG, __func__, sizeof(FM_HDR));
-    ALOGE("%s:opcode: %x", LOG_TAG, opcode);
+    ALOGV("%s:opcode: %x", LOG_TAG, opcode);
 
-    hdr->protocol_byte = 0x11;
+    hdr->protocol_byte = RADIO_HCI_COMMAND_PKT;
     hdr->opcode = opcode;
     hdr->plen = len;
     if (len)
         memcpy(hdr->cmd_params, (uint8_t *)param, len);
-    ALOGE("%s:calling transmit", __func__);
-    transmit(hdr);
-    ALOGE("%s:transmit success",__func__);
-    return 0;
+    ret = transmit(hdr);
+    ALOGV("%s:transmit done. status = %d", __func__, ret);
+    return ret;
 }
 
 int hci_fm_get_signal_threshold()
 {
+    uint16_t opcode = 0;
 
-    FM_HDR *hdr = (FM_HDR *) malloc(sizeof(FM_HDR));
-    hdr->protocol_byte = FM_CMD;
-    hdr->opcode = hci_opcode_pack(HCI_OGF_FM_RECV_CTRL_CMD_REQ, HCI_OCF_FM_GET_SIGNAL_THRESHOLD);
-    hdr->plen   = 0;
-    transmit(hdr);
-    return 0;
+    opcode = hci_opcode_pack(HCI_OGF_FM_RECV_CTRL_CMD_REQ,
+            HCI_OCF_FM_GET_SIGNAL_THRESHOLD);
+    return send_fm_cmd_pkt(opcode, 0, NULL);
 }
 
 int hci_fm_enable_recv_req()
@@ -109,7 +105,7 @@ int helium_search_list(struct hci_fm_search_station_list_req *s_list)
 
    if (s_list == NULL) {
        ALOGE("%s:%s, search list param is null\n", LOG_TAG, __func__);
-       return -1;
+       return -EINVAL;
    }
    opcode = hci_opcode_pack(HCI_OGF_FM_RECV_CTRL_CMD_REQ,
                 HCI_OCF_FM_SEARCH_STATIONS_LIST);
@@ -122,7 +118,7 @@ int helium_search_rds_stations(struct hci_fm_search_rds_station_req *rds_srch)
 
    if (rds_srch == NULL) {
        ALOGE("%s:%s, rds stations param is null\n", LOG_TAG, __func__);
-       return -1;
+       return -EINVAL;
    }
    opcode = hci_opcode_pack(HCI_OGF_FM_RECV_CTRL_CMD_REQ,
                 HCI_OCF_FM_SEARCH_RDS_STATIONS);
@@ -135,7 +131,7 @@ int helium_search_stations(struct hci_fm_search_station_req *srch)
 
    if (srch == NULL) {
        ALOGE("%s:%s, search station param is null\n", LOG_TAG, __func__);
-       return -1;
+       return -EINVAL;
    }
    opcode = hci_opcode_pack(HCI_OGF_FM_RECV_CTRL_CMD_REQ,
                 HCI_OCF_FM_SEARCH_STATIONS);
@@ -157,7 +153,7 @@ int hci_fm_set_recv_conf_req (struct hci_fm_recv_conf_req *conf)
 
     if (conf == NULL) {
         ALOGE("%s:%s, recv conf is null\n", LOG_TAG, __func__);
-        return -1;
+        return -EINVAL;
     }
     opcode = hci_opcode_pack(HCI_OGF_FM_RECV_CTRL_CMD_REQ,
                               HCI_OCF_FM_SET_RECV_CONF_REQ);
@@ -198,11 +194,11 @@ int helium_set_sig_threshold_req(char th)
 
     if (th == NULL) {
         ALOGE("%s:Threshold value NULL", LOG_TAG);
-        return -1;
+        return -EINVAL;
     }
     opcode = hci_opcode_pack(HCI_OGF_FM_RECV_CTRL_CMD_REQ,
                                HCI_OCF_FM_SET_SIGNAL_THRESHOLD);
-    return send_fm_cmd_pkt(opcode, sizeof(th), th);
+    return send_fm_cmd_pkt(opcode, sizeof(th), &th);
 }
 
 int helium_rds_grp_mask_req(struct hci_fm_rds_grp_req *rds_grp_msk)
@@ -251,7 +247,7 @@ int helium_set_fm_mute_mode_req(struct hci_fm_mute_mode_req *mute)
 
     if (mute == NULL) {
         ALOGE("%s:%s, mute mode is null\n", LOG_TAG, __func__);
-        return -1;
+        return -EINVAL;
     }
     opcode = hci_opcode_pack(HCI_OGF_FM_RECV_CTRL_CMD_REQ,
                                HCI_OCF_FM_SET_MUTE_MODE_REQ);
@@ -263,7 +259,7 @@ int hci_fm_tune_station_req(int param)
     uint16_t opcode = 0;
     int tune_freq = param;
 
-    ALOGE("%s:tune_freq: %d", LOG_TAG, tune_freq);
+    ALOGV("%s:tune_freq: %d", LOG_TAG, tune_freq);
     opcode = hci_opcode_pack(HCI_OGF_FM_COMMON_CTRL_CMD_REQ,
                                   HCI_OCF_FM_TUNE_STATION_REQ);
     return send_fm_cmd_pkt(opcode, sizeof(tune_freq), &tune_freq);
@@ -277,7 +273,7 @@ int hci_set_fm_stereo_mode_req(struct hci_fm_stereo_mode_req *param)
 
     if (stereo_mode_req == NULL) {
         ALOGE("%s:%s, stere mode req is null\n", LOG_TAG, __func__);
-        return -1;
+        return -EINVAL;
     }
     opcode = hci_opcode_pack(HCI_OGF_FM_RECV_CTRL_CMD_REQ,
                              HCI_OCF_FM_SET_STEREO_MODE_REQ);
@@ -291,7 +287,7 @@ int hci_peek_data(struct hci_fm_riva_data *data)
 
     if (data == NULL) {
         ALOGE("%s:%s, peek data req is null\n", LOG_TAG, __func__);
-        return -1;
+        return -EINVAL;
     }
     opcode = hci_opcode_pack(HCI_OGF_FM_DIAGNOSTIC_CMD_REQ,
                 HCI_OCF_FM_PEEK_DATA);
@@ -304,7 +300,7 @@ int hci_poke_data(struct hci_fm_riva_poke *data)
 
     if (data == NULL) {
         ALOGE("%s:%s, poke data req is null\n", LOG_TAG, __func__);
-        return -1;
+        return -EINVAL;
     }
     opcode = hci_opcode_pack(HCI_OGF_FM_DIAGNOSTIC_CMD_REQ,
                 HCI_OCF_FM_POKE_DATA);
@@ -317,7 +313,7 @@ int hci_ssbi_poke_reg(struct hci_fm_ssbi_req *data)
 
     if (data == NULL) {
         ALOGE("%s:%s,SSBI poke data req is null\n", LOG_TAG, __func__);
-        return -1;
+        return -EINVAL;
     }
     opcode = hci_opcode_pack(HCI_OGF_FM_DIAGNOSTIC_CMD_REQ,
                 HCI_OCF_FM_SSBI_POKE_REG);
@@ -330,7 +326,7 @@ int hci_ssbi_peek_reg(struct hci_fm_ssbi_peek *data)
 
     if (data == NULL) {
         ALOGE("%s:%s,SSBI peek data req is null\n", LOG_TAG, __func__);
-        return -1;
+        return -EINVAL;
     }
     opcode = hci_opcode_pack(HCI_OGF_FM_DIAGNOSTIC_CMD_REQ,
                 HCI_OCF_FM_SSBI_PEEK_REG);
@@ -339,8 +335,9 @@ int hci_ssbi_peek_reg(struct hci_fm_ssbi_peek *data)
 
 int hci_fm_get_ch_det_th()
 {
+    ALOGV("%s", __func__);
     uint16_t opcode = hci_opcode_pack(HCI_OGF_FM_RECV_CTRL_CMD_REQ,
-			HCI_OCF_FM_GET_CH_DET_THRESHOLD);
+            HCI_OCF_FM_GET_CH_DET_THRESHOLD);
     return send_fm_cmd_pkt(opcode, 0, NULL);
 }
 
@@ -350,9 +347,81 @@ int set_ch_det_thresholds_req(struct hci_fm_ch_det_threshold *ch_det_th)
 
     if (ch_det_th == NULL) {
         ALOGE("%s,%s channel det thrshld is null\n", LOG_TAG,  __func__);
-        return -1;
+        return -EINVAL;
     }
     opcode = hci_opcode_pack(HCI_OGF_FM_RECV_CTRL_CMD_REQ,
                             HCI_OCF_FM_SET_CH_DET_THRESHOLD);
     return send_fm_cmd_pkt(opcode, sizeof((*ch_det_th)), ch_det_th);
 }
+
+int hci_fm_default_data_read_req(struct hci_fm_def_data_rd_req *def_data_rd)
+{
+    uint16_t opcode = 0;
+
+    if (def_data_rd == NULL) {
+        ALOGE("Def data read param is null");
+        return -EINVAL;
+    }
+
+    opcode = hci_opcode_pack(HCI_OGF_FM_COMMON_CTRL_CMD_REQ,
+            HCI_OCF_FM_DEFAULT_DATA_READ);
+    return send_fm_cmd_pkt(opcode, sizeof(struct hci_fm_def_data_rd_req),
+            def_data_rd);
+}
+
+int hci_fm_get_blend_req()
+{
+    uint16_t opcode = 0;
+
+    opcode = hci_opcode_pack(HCI_OGF_FM_RECV_CTRL_CMD_REQ,
+            HCI_OCF_FM_GET_BLND_TBL);
+    return send_fm_cmd_pkt(opcode, 0, NULL);
+}
+
+int hci_fm_set_blend_tbl_req(struct hci_fm_blend_table *blnd_tbl)
+{
+    int opcode = 0;
+
+    if (blnd_tbl == NULL) {
+        ALOGE("Req param is null");
+        return -EINVAL;
+    }
+
+    opcode =  hci_opcode_pack(HCI_OGF_FM_RECV_CTRL_CMD_REQ,
+            HCI_OCF_FM_SET_BLND_TBL);
+    return send_fm_cmd_pkt(opcode, sizeof(struct hci_fm_blend_table),
+            blnd_tbl);
+}
+
+int hci_fm_default_data_write_req(struct hci_fm_def_data_wr_req * data_wrt)
+{
+    int opcode = 0;
+
+    if (data_wrt == NULL) {
+        ALOGE("req param is null");
+        return -EINVAL;
+    }
+
+    opcode = hci_opcode_pack(HCI_OGF_FM_COMMON_CTRL_CMD_REQ,
+            HCI_OCF_FM_DEFAULT_DATA_WRITE);
+    return send_fm_cmd_pkt(opcode, data_wrt->length + sizeof(char) * 2,
+            data_wrt);
+}
+
+int hci_fm_get_station_cmd_param_req()
+{
+    int opcode = 0;
+
+    opcode = hci_opcode_pack(HCI_OGF_FM_RECV_CTRL_CMD_REQ,
+            HCI_OCF_FM_GET_STATION_PARAM_REQ);
+    return send_fm_cmd_pkt(opcode, 0,  NULL);
+}
+
+int hci_fm_get_station_dbg_param_req()
+{
+    int opcode = 0;
+
+    opcode = hci_opcode_pack(HCI_OGF_FM_DIAGNOSTIC_CMD_REQ,
+            HCI_OCF_FM_STATION_DBG_PARAM);
+    return send_fm_cmd_pkt(opcode, 0, NULL);
+}
diff --git a/jni/FmConst.h b/jni/FmConst.h
index 8c8d6f47fcec4452d38f033a15a02af9c12d2c90..26eb616fa09aeda9b0a9a05fa9dc2cdd2ec759e5 100644
--- a/jni/FmConst.h
+++ b/jni/FmConst.h
@@ -152,6 +152,7 @@ enum FM_V4L2_PRV_CONTROLS
     V4L2_CID_PRV_IRIS_UPPER_BAND,
     V4L2_CID_PRV_IRIS_LOWER_BAND,
     V4L2_CID_PRV_IRIS_AUDIO_MODE,
+    V4L2_CID_PRV_IRIS_RMSSI,
 };
 
 #endif
diff --git a/jni/android_hardware_fm.cpp b/jni/android_hardware_fm.cpp
index 21528bbf70ed1dbc3097d3b0aa55c37d31e0c505..d1857e4ffacc268c674ba37600dce10150fa154b 100644
--- a/jni/android_hardware_fm.cpp
+++ b/jni/android_hardware_fm.cpp
@@ -108,6 +108,15 @@ typedef void (*fm_peek_cb)(char *peek_rsp);
 typedef void (*fm_ssbi_peek_cb)(char *ssbi_peek_rsp);
 typedef void (*fm_ch_det_th_cb)(char *ch_det_rsp);
 typedef void (*fm_ecc_evt_cb)(char *ecc);
+typedef void (*fm_sig_thr_cb)(int val, int status);
+typedef void (*fm_get_ch_det_thrs_cb) (int val, int status);
+typedef void (*fm_def_data_rd_cb) (int val, int status);
+typedef void (*fm_get_blnd_cb) (int val, int status);
+typedef void (*fm_set_ch_det_thrs_cb) (int status);
+typedef void (*fm_def_data_wrt_cb) (int status);
+typedef void (*fm_set_blnd_cb) (int status);
+typedef void (*fm_get_stn_prm_cb) (int val, int status);
+typedef void (*fm_get_stn_dbg_prm_cb) (int val, int status);
 
 static JNIEnv *mCallbackEnv = NULL;
 static jobject mCallbacksObj = NULL;
@@ -129,6 +138,15 @@ jmethodID method_srchListCallback;
 jmethodID method_stereostsCallback;
 jmethodID method_rdsAvlStsCallback;
 jmethodID method_disableCallback;
+jmethodID method_getSigThCallback;
+jmethodID method_getChDetThrCallback;
+jmethodID method_defDataRdCallback;
+jmethodID method_getBlendCallback;
+jmethodID method_setChDetThrCallback;
+jmethodID method_defDataWrtCallback;
+jmethodID method_setBlendCallback;
+jmethodID method_getStnParamCallback;
+jmethodID method_getStnDbgParamCallback;
 
 static bool checkCallbackThread() {
    JNIEnv* env = AndroidRuntime::getJNIEnv();
@@ -142,55 +160,55 @@ static bool checkCallbackThread() {
 }
 
 void fm_enabled_cb() {
-    ALOGE("Entered %s", __func__);
+    ALOGD("Entered %s", __func__);
     if (mCallbackEnv != NULL) {
         ALOGE("javaObjectRef creating");
         jobject javaObjectRef =  mCallbackEnv->NewObject(javaClassRef, method_enableCallback);
         mCallbacksObj = javaObjectRef;
         ALOGE("javaObjectRef = %p mCallbackobject =%p \n",javaObjectRef,mCallbacksObj);
     }
-    ALOGE("exit  %s", __func__);
+    ALOGD("exit  %s", __func__);
 }
 
 void fm_tune_cb(int Freq)
 {
-    ALOGE("TUNE:Freq:%d", Freq);
+    ALOGD("TUNE:Freq:%d", Freq);
     mCallbackEnv->CallVoidMethod(mCallbacksObj, method_tuneCallback, (jint) Freq);
 }
 
 void fm_seek_cmpl_cb(int Freq)
 {
-    ALOGE("SEEK_CMPL: Freq: %d", Freq);
+    ALOGI("SEEK_CMPL: Freq: %d", Freq);
     mCallbackEnv->CallVoidMethod(mCallbacksObj, method_seekCmplCallback, (jint) Freq);
 }
 
 void fm_scan_next_cb()
 {
-    ALOGE("SCAN_NEXT");
+    ALOGI("SCAN_NEXT");
     mCallbackEnv->CallVoidMethod(mCallbacksObj, method_scanNxtCallback);
 }
 
 void fm_srch_list_cb(uint16_t *scan_tbl)
 {
-    ALOGE("SRCH_LIST");
+    ALOGI("SRCH_LIST");
     //mCallbackEnv->CallVoidMethod(javaObjectRef, method_srchListCallback);
 }
 
 void fm_stereo_status_cb(bool stereo)
 {
-    ALOGE("STEREO: %d", stereo);
+    ALOGI("STEREO: %d", stereo);
     mCallbackEnv->CallVoidMethod(mCallbacksObj, method_stereostsCallback, (jboolean) stereo);
 }
 
 void fm_rds_avail_status_cb(bool rds_avl)
 {
-    ALOGE("fm_rds_avail_status_cb: %d", rds_avl);
+    ALOGD("fm_rds_avail_status_cb: %d", rds_avl);
     mCallbackEnv->CallVoidMethod(mCallbacksObj, method_rdsAvlStsCallback, (jboolean) rds_avl);
 }
 
 void fm_af_list_update_cb(uint16_t *af_list)
 {
-    ALOGE("AF_LIST");
+    ALOGD("AF_LIST");
     jbyteArray af_buffer = NULL;
 
     if (!checkCallbackThread()) {
@@ -211,7 +229,7 @@ void fm_af_list_update_cb(uint16_t *af_list)
 
 void fm_rt_update_cb(char *rt)
 {
-    ALOGE("RT_EVT: " );
+    ALOGD("RT_EVT: " );
     jbyteArray rt_buff = NULL;
     int i,len;
 
@@ -221,10 +239,10 @@ void fm_rt_update_cb(char *rt)
     }
 
     len  = (int)(rt[0] & 0xFF);
-    ALOGV(" rt data len=%d :",len);
+    ALOGD(" rt data len=%d :",len);
     len = len+5;
 
-    ALOGE(" rt data len=%d :",len);
+    ALOGD(" rt data len=%d :",len);
     rt_buff = mCallbackEnv->NewByteArray(len);
     if (rt_buff == NULL) {
         ALOGE(" ps data allocate failed :");
@@ -251,7 +269,7 @@ void fm_ps_update_cb(char *ps)
     numPs  = (int)(ps[0] & 0xFF);
     len = (numPs *8)+5;
 
-    ALOGE(" ps data len=%d :",len);
+    ALOGD(" ps data len=%d :",len);
     ps_data = mCallbackEnv->NewByteArray(len);
     if(ps_data == NULL) {
        ALOGE(" ps data allocate failed :");
@@ -266,17 +284,17 @@ void fm_ps_update_cb(char *ps)
 
 void fm_oda_update_cb()
 {
-    ALOGE("ODA_EVT");
+    ALOGD("ODA_EVT");
 }
 
 void fm_rt_plus_update_cb(char *rt_plus)
 {
     jbyteArray RtPlus = NULL;
-    ALOGE("RT_PLUS");
+    ALOGD("RT_PLUS");
     int len;
 
     len =  (int)(rt_plus[0] & 0xFF);
-    ALOGE(" rt plus len=%d :",len);
+    ALOGD(" rt plus len=%d :",len);
     RtPlus = mCallbackEnv->NewByteArray(len);
     if (RtPlus == NULL) {
         ALOGE(" rt plus data allocate failed :");
@@ -289,7 +307,7 @@ void fm_rt_plus_update_cb(char *rt_plus)
 
 void fm_ert_update_cb(char *ert)
 {
-    ALOGI("ERT_EVT");
+    ALOGD("ERT_EVT");
     jbyteArray ert_buff = NULL;
     int i,len;
 
@@ -341,7 +359,7 @@ void fm_ext_country_code_cb(char *ecc)
 
 void rds_grp_cntrs_rsp_cb(char * evt_buffer)
 {
-   ALOGE("rds_grp_cntrs_rsp_cb");
+   ALOGD("rds_grp_cntrs_rsp_cb");
 }
 
 void fm_disabled_cb()
@@ -351,15 +369,15 @@ void fm_disabled_cb()
 }
 
 void fm_peek_rsp_cb(char *peek_rsp) {
-    ALOGE("fm_peek_rsp_cb");
+    ALOGD("fm_peek_rsp_cb");
 }
 
 void fm_ssbi_peek_rsp_cb(char *ssbi_peek_rsp){
-    ALOGE("fm_ssbi_peek_rsp_cb");
+    ALOGD("fm_ssbi_peek_rsp_cb");
 }
 
 void fm_ch_det_th_rsp_cb(char *ch_det_rsp){
-    ALOGE("fm_ch_det_th_rsp_cb");
+    ALOGD("fm_ch_det_th_rsp_cb");
 }
 
 static void fm_thread_evt_cb(unsigned int event) {
@@ -371,7 +389,7 @@ static void fm_thread_evt_cb(unsigned int event) {
         args.name = name;
         args.group = NULL;
        vm->AttachCurrentThread(&mCallbackEnv, &args);
-        ALOGE("satish: Callback thread attached: %p", mCallbackEnv);
+        ALOGD("Callback thread attached: %p", mCallbackEnv);
     } else if (event == 1) {
         if (!checkCallbackThread()) {
             ALOGE("Callback: '%s' is not called on the correct thread", __FUNCTION__);
@@ -380,6 +398,70 @@ static void fm_thread_evt_cb(unsigned int event) {
         vm->DetachCurrentThread();
     }
 }
+
+static void fm_get_sig_thres_cb(int val, int status)
+{
+    ALOGD("Get signal Thres callback");
+
+    mCallbackEnv->CallVoidMethod(mCallbacksObj, method_getSigThCallback, val, status);
+}
+
+static void fm_get_ch_det_thr_cb(int val, int status)
+{
+    ALOGD("fm_get_ch_det_thr_cb");
+
+    mCallbackEnv->CallVoidMethod(mCallbacksObj, method_getChDetThrCallback, val, status);
+}
+
+static void fm_set_ch_det_thr_cb(int status)
+{
+    ALOGD("fm_set_ch_det_thr_cb");
+
+    mCallbackEnv->CallVoidMethod(mCallbacksObj, method_setChDetThrCallback, status);
+}
+
+static void fm_def_data_read_cb(int val, int status)
+{
+    ALOGD("fm_def_data_read_cb");
+
+    mCallbackEnv->CallVoidMethod(mCallbacksObj, method_defDataRdCallback, val, status);
+}
+
+static void fm_def_data_write_cb(int status)
+{
+    ALOGD("fm_def_data_write_cb");
+
+    mCallbackEnv->CallVoidMethod(mCallbacksObj, method_defDataWrtCallback, status);
+}
+
+static void fm_get_blend_cb(int val, int status)
+{
+    ALOGD("fm_get_blend_cb");
+
+    mCallbackEnv->CallVoidMethod(mCallbacksObj, method_getBlendCallback, val, status);
+}
+
+static void fm_set_blend_cb(int status)
+{
+    ALOGD("fm_set_blend_cb");
+
+    mCallbackEnv->CallVoidMethod(mCallbacksObj, method_setBlendCallback, status);
+}
+
+static void fm_get_station_param_cb(int val, int status)
+{
+    ALOGD("fm_get_station_param_cb");
+
+    mCallbackEnv->CallVoidMethod(mCallbacksObj, method_getStnParamCallback, val, status);
+}
+
+static void fm_get_station_debug_param_cb(int val, int status)
+{
+    ALOGD("fm_get_station_debug_param_cb");
+
+    mCallbackEnv->CallVoidMethod(mCallbacksObj, method_getStnDbgParamCallback, val, status);
+}
+
 typedef struct {
    size_t  size;
 
@@ -403,6 +485,15 @@ typedef struct {
    fm_ch_det_th_cb fm_ch_det_th_rsp_cb;
    fm_ecc_evt_cb   ext_country_code_cb;
    callback_thread_event thread_evt_cb;
+   fm_sig_thr_cb fm_get_sig_thres_cb;
+   fm_get_ch_det_thrs_cb fm_get_ch_det_thr_cb;
+   fm_def_data_rd_cb fm_def_data_read_cb;
+   fm_get_blnd_cb fm_get_blend_cb;
+   fm_set_ch_det_thrs_cb fm_set_ch_det_thr_cb;
+   fm_def_data_wrt_cb fm_def_data_write_cb;
+   fm_set_blnd_cb fm_set_blend_cb;
+   fm_get_stn_prm_cb fm_get_station_param_cb;
+   fm_get_stn_dbg_prm_cb fm_get_station_debug_param_cb;
 } fm_vendor_callbacks_t;
 
 typedef struct {
@@ -434,7 +525,16 @@ static   fm_vendor_callbacks_t fm_callbacks = {
     fm_ssbi_peek_rsp_cb,
     fm_ch_det_th_rsp_cb,
     fm_ext_country_code_cb,
-    fm_thread_evt_cb
+    fm_thread_evt_cb,
+    fm_get_sig_thres_cb,
+    fm_get_ch_det_thr_cb,
+    fm_def_data_read_cb,
+    fm_get_blend_cb,
+    fm_set_ch_det_thr_cb,
+    fm_def_data_write_cb,
+    fm_set_blend_cb,
+    fm_get_station_param_cb,
+    fm_get_station_debug_param_cb
 };
 #endif
 /* native interface */
@@ -734,6 +834,15 @@ static jint android_hardware_fmradio_FmReceiverJNI_getRSSINative
     int err;
     long rmssi;
 
+#ifdef FM_SOC_TYPE_CHEROKEE
+    err = vendor_interface->get_fm_ctrl(V4L2_CID_PRV_IRIS_RMSSI, rmssi);
+    if (err < 0) {
+        ALOGE("%s: Get Rssi failed", LOG_TAG);
+        err = FM_JNI_FAILURE;
+    } else {
+        err = FM_JNI_SUCCESS;
+    }
+#else
     if (fd >= 0) {
         err = FmIoctlsInterface :: get_rmssi(fd, rmssi);
         if (err < 0) {
@@ -747,7 +856,7 @@ static jint android_hardware_fmradio_FmReceiverJNI_getRSSINative
                LOG_TAG, fd);
         err = FM_JNI_FAILURE;
     }
-
+#endif
     return err;
 }
 
@@ -1393,6 +1502,15 @@ static void classInitNative(JNIEnv* env, jclass clazz) {
     method_stereostsCallback = env->GetMethodID(javaClassRef, "stereostsCallback", "(Z)V");
     method_rdsAvlStsCallback = env->GetMethodID(javaClassRef, "rdsAvlStsCallback", "(Z)V");
     method_disableCallback = env->GetMethodID(javaClassRef, "disableCallback", "()V");
+    method_getSigThCallback = env->GetMethodID(javaClassRef, "getSigThCallback", "(II)V");
+    method_getChDetThrCallback = env->GetMethodID(javaClassRef, "getChDetThCallback", "(II)V");
+    method_defDataRdCallback = env->GetMethodID(javaClassRef, "DefDataRdCallback", "(II)V");
+    method_getBlendCallback = env->GetMethodID(javaClassRef, "getBlendCallback", "(II)V");
+    method_setChDetThrCallback = env->GetMethodID(javaClassRef, "setChDetThCallback","(I)V");
+    method_defDataWrtCallback = env->GetMethodID(javaClassRef, "DefDataWrtCallback", "(I)V");
+    method_setBlendCallback = env->GetMethodID(javaClassRef, "setBlendCallback", "(I)V");
+    method_getStnParamCallback = env->GetMethodID(javaClassRef, "getStnParamCallback", "(II)V");
+    method_getStnDbgParamCallback = env->GetMethodID(javaClassRef, "getStnDbgParamCallback", "(II)V");
 
     return;
 error:
diff --git a/qcom/fmradio/FmReceiver.java b/qcom/fmradio/FmReceiver.java
index 8e681e7d60ebe63817727f096aaa1efbd13d410e..c61b78e46642dc58b3466ed9cc84088f0b3c1986 100644
--- a/qcom/fmradio/FmReceiver.java
+++ b/qcom/fmradio/FmReceiver.java
@@ -1455,7 +1455,7 @@ public class FmReceiver extends FmTransceiver
       try
       {
 
-	 String rdsStr = new String(buff, 5, numOfPs*8 );
+     String rdsStr = new String(buff, 5, numOfPs*8 );
          mRdsData.setPrgmServices (rdsStr);
 
       } catch (StringIndexOutOfBoundsException x)
@@ -2018,6 +2018,16 @@ public class FmReceiver extends FmTransceiver
       return mControl.setPSRxRepeatCount(sFd, count);
    }
 
+   public boolean getPSRxRepeatCount() {
+      int state = getFMState();
+      /* Check current state of FM device */
+      if (state == FMState_Turned_Off){
+          Log.d(TAG, "setRxRepeatcount failed");
+          return false;
+      }
+      return mControl.getPSRxRepeatCount(sFd);
+   }
+
    public byte getBlendSinr() {
       int state = getFMState();
       if ((state == FMState_Turned_Off) || (state == FMState_Srch_InProg)) {
@@ -2027,7 +2037,7 @@ public class FmReceiver extends FmTransceiver
       return mControl.getBlendSinr(sFd);
    }
 
-   public boolean setBlendSinr(byte sinrHi) {
+   public boolean setBlendSinr(int sinrHi) {
       int state = getFMState();
       if ((state == FMState_Turned_Off) || (state == FMState_Srch_InProg)) {
           Log.d(TAG, "setBlendSinr: Device currently busy in executing another command.");
@@ -2045,7 +2055,7 @@ public class FmReceiver extends FmTransceiver
       return mControl.getBlendRmssi(sFd);
    }
 
-   public boolean setBlendRmssi(byte rmssiHi) {
+   public boolean setBlendRmssi(int rmssiHi) {
       int state = getFMState();
       if ((state == FMState_Turned_Off) || (state == FMState_Srch_InProg)) {
           Log.d(TAG, "setBlendRmssi: Device currently busy in executing another command.");
@@ -2318,7 +2328,7 @@ public class FmReceiver extends FmTransceiver
    *
    *    <p>
    *    @return    IOVERC of currently tuned station on Success.
-   *		   -1 on failure to retrieve the current IoverC.
+   *           -1 on failure to retrieve the current IoverC.
    */
    public int getIoverc()
    {
@@ -2339,7 +2349,7 @@ public class FmReceiver extends FmTransceiver
    *
    *    <p>
    *    @return    IntDet of currently tuned station.
-   *		   -1 on failure to retrieve the current IntDet
+   *           -1 on failure to retrieve the current IntDet
    */
    public int getIntDet()
    {
@@ -2510,9 +2520,14 @@ public class FmReceiver extends FmTransceiver
    *
    *    <p>
    */
-   public int getOnChannelThreshold()
+   public boolean getOnChannelThreshold()
    {
-      return mControl.getOnChannelThreshold(sFd);
+       int re = mControl.getOnChannelThreshold(sFd);
+
+       if (re != 0)
+           return false;
+       else
+           return true;
    }
 
 /*==============================================================
@@ -2545,9 +2560,14 @@ public class FmReceiver extends FmTransceiver
    *
    *    <p>
    */
-   public int getOffChannelThreshold()
+   public boolean  getOffChannelThreshold()
    {
-      return mControl.getOffChannelThreshold(sFd);
+       int re = mControl.getOffChannelThreshold(sFd);
+
+       if (re != 0)
+           return false;
+       else
+           return true;
    }
 /*===============================================================
    FUNCTION:  getSINR
diff --git a/qcom/fmradio/FmReceiverJNI.java b/qcom/fmradio/FmReceiverJNI.java
index d085476b211bef457e9976be691c7fcafa52d6a8..e587b446be4446f11f8b54af911af20692ff29eb 100644
--- a/qcom/fmradio/FmReceiverJNI.java
+++ b/qcom/fmradio/FmReceiverJNI.java
@@ -80,6 +80,53 @@ class FmReceiverJNI {
         Log.e(TAG, "AflistCallback exit " );
     }
 
+    public void getSigThCallback(int val, int status)
+    {
+        Log.d(TAG, "get Signal Threshold callback");
+
+        FmReceiver.mCallback.FmRxEvGetSignalThreshold(val, status);
+    }
+
+    public void getChDetThCallback(int val, int status)
+    {
+        FmReceiver.mCallback.FmRxEvGetChDetThreshold(val, status);
+    }
+
+    public void setChDetThCallback(int status)
+    {
+        FmReceiver.mCallback.FmRxEvSetChDetThreshold(status);
+    }
+
+    public void DefDataRdCallback(int val, int status)
+    {
+        FmReceiver.mCallback.FmRxEvDefDataRead(val, status);
+    }
+
+    public void DefDataWrtCallback(int status)
+    {
+        FmReceiver.mCallback.FmRxEvDefDataWrite(status);
+    }
+
+    public void getBlendCallback(int val, int status)
+    {
+        FmReceiver.mCallback.FmRxEvGetBlend(val, status);
+    }
+
+    public void setBlendCallback(int status)
+    {
+        FmReceiver.mCallback.FmRxEvSetBlend(status);
+    }
+
+    public void getStnParamCallback(int val, int status)
+    {
+        FmReceiver.mCallback.FmRxGetStationParam(val, status);
+    }
+
+    public void getStnDbgParamCallback(int val, int status)
+    {
+        FmReceiver.mCallback.FmRxGetStationDbgParam(val, status);
+    }
+
     public void RtPlusCallback(byte[] rtplus) {
         Log.d(TAG, "RtPlusCallback enter " );
         if (rtplus == null) {
diff --git a/qcom/fmradio/FmRxControls.java b/qcom/fmradio/FmRxControls.java
index 767d56f0abf2d065aaa5e36d52706c081c193c5d..701448f02825cb2ee27e0a10418bb2ce3cdcd11f 100644
--- a/qcom/fmradio/FmRxControls.java
+++ b/qcom/fmradio/FmRxControls.java
@@ -738,11 +738,21 @@ class FmRxControls
       }
    }
 
+   public boolean getPSRxRepeatCount(int fd) {
+      int ret;
+      ret = FmReceiverJNI.getControlNative(fd, V4L2_CID_PRIVATE_RXREPEATCOUNT);
+      if (ret < 0) {
+          return false;
+      } else {
+          return true;
+      }
+   }
+
    public byte getBlendSinr(int fd) {
       return (byte)FmReceiverJNI.getControlNative(fd, V4L2_CID_PRIVATE_BLEND_SINRHI);
    }
 
-   public boolean setBlendSinr(int fd, byte sinrHi) {
+   public boolean setBlendSinr(int fd, int sinrHi) {
       int ret;
       ret = FmReceiverJNI.setControlNative(fd, V4L2_CID_PRIVATE_BLEND_SINRHI, sinrHi);
       if(ret < 0) {
@@ -757,7 +767,7 @@ class FmRxControls
       return (byte)FmReceiverJNI.getControlNative(fd, V4L2_CID_PRIVATE_BLEND_RMSSIHI);
    }
 
-   public boolean setBlendRmssi(int fd, byte rmssiHi) {
+   public boolean setBlendRmssi(int fd, int rmssiHi) {
       int ret;
       ret = FmReceiverJNI.setControlNative(fd, V4L2_CID_PRIVATE_BLEND_RMSSIHI, rmssiHi);
       if(ret < 0) {
diff --git a/qcom/fmradio/FmRxEvCallbacksAdaptor.java b/qcom/fmradio/FmRxEvCallbacksAdaptor.java
index 753d506330469264a9b077b1e68bae0c7a5043a1..59953e80a1eb4235f6baf01301caa51f03b40790 100644
--- a/qcom/fmradio/FmRxEvCallbacksAdaptor.java
+++ b/qcom/fmradio/FmRxEvCallbacksAdaptor.java
@@ -52,5 +52,13 @@ public class FmRxEvCallbacksAdaptor implements FmRxEvCallbacks {
     public void FmRxEvRTPlus() {};
     public void FmRxEvERTInfo() {};
     public void FmRxEvECCInfo() {};
+    public void FmRxEvGetSignalThreshold(int val, int status) {};
+    public void FmRxEvGetChDetThreshold(int val, int status) {};
+    public void FmRxEvDefDataRead(int val, int status) {};
+    public void FmRxEvGetBlend(int val, int status) {};
+    public void FmRxEvSetChDetThreshold(int status) {};
+    public void FmRxEvDefDataWrite(int status) {};
+    public void FmRxEvSetBlend(int status) {};
+    public void FmRxGetStationParam(int val, int status) {};
+    public void FmRxGetStationDbgParam(int val, int status) {};
 }
-