diff --git a/fmapp2/res/values/arrays.xml b/fmapp2/res/values/arrays.xml
index 3778be1..6686eb8 100644
--- a/fmapp2/res/values/arrays.xml
+++ b/fmapp2/res/values/arrays.xml
@@ -365,6 +365,18 @@
       <item> Set RXREPEAT Count</item>
   </string-array>
 
+
+  <string-array name="cfg_rf3">
+      <item> Set SINR Threshold</item>
+      <item> Get SINR Threshold</item>
+      <item> Set RSSI Threshold</item>
+      <item> Get RSSI Threshold</item>
+      <item> Set AFJumpRssi Threshold</item>
+      <item> Get AFJumpRssi Threshold</item>
+      <item> Set RDS FIFO count</item>
+      <item> Get RDS FIFO count</item>
+  </string-array>
+
   <string-array name="stats_options">
       <item> Select the option</item>
       <item> Configure Performance parameters</item>
diff --git a/fmapp2/res/values/strings.xml b/fmapp2/res/values/strings.xml
index a2bf1d4..cf07eb9 100644
--- a/fmapp2/res/values/strings.xml
+++ b/fmapp2/res/values/strings.xml
@@ -248,6 +248,12 @@
     <string name="rt_plus_tags">Tags</string>
     <string name="enter_RxRePeatCount">Enter RxRePeat count</string>
     <string name="set_RxRePeatCount">Config RxRePeat count</string>
+    <string name="enter_RssiTh">Enter RSSI Threshold</string>
+    <string name="set_RssiTh">Config RSSI Threshold</string>
+    <string name="enter_AfJumpRssiTh">Enter AF jump RSSI Threshold</string>
+    <string name="set_AfJumpRssiTh">Config AF jump RSSI Threshold</string>
+    <string name="enter_RdsFifoCnt">Enter RDS FIFO count</string>
+    <string name="set_RdsFifoCnt">Config RDS FIFO count</string>
 
     <string name="usr_def_band_min">Lower Freq Limit(In Mhz)</string>
     <string name="usr_def_band_max">Higher Freq Limit(In Mhz)</string>
diff --git a/fmapp2/src/com/caf/fmradio/FMStats.java b/fmapp2/src/com/caf/fmradio/FMStats.java
index 8defff5..38099ea 100644
--- a/fmapp2/src/com/caf/fmradio/FMStats.java
+++ b/fmapp2/src/com/caf/fmradio/FMStats.java
@@ -172,6 +172,7 @@
                                      new RfCfgItemSelectedListener();
     CfgRfItemSelectedListener1 mSpinCfgRfListener1 = null;
     CfgRfItemSelectedListener2 mSpinCfgRfListener2 = null;
+    CfgRfItemSelectedListener3 mSpinCfgRfListener3 = null;
     BandSweepMthdsSelectedListener mSweepMthdsListener =
                                      new BandSweepMthdsSelectedListener();
 
@@ -228,6 +229,12 @@
     private static final int MAX_GD_CH_RMSSI_TH = 127;
     private static final int MIN_AF_JMP_RMSSI_SAMPLES = 0;
     private static final int MAX_AF_JMP_RMSSI_SAMPLES = 255;
+    private static final int MIN_SINR_TH_SILABS = 0;
+    private static final int MAX_SINR_TH_SILABS = 127;
+    private static final int MIN_RSSI_TH_SILABS = 0;
+    private static final int MAX_RSSI_TH_SILABS = 127;
+    private static final int MIN_RDS_FIFO_CNT_SILABS = 0;
+    private static final int MAX_RDS_FIFO_CNT_SILABS = 25;
 
     private static final int DIALOG_BAND_SWEEP_SETTING = 1;
 
@@ -279,17 +286,23 @@
                             android.R.layout.simple_spinner_item);
 
         checkTransportLayer();
-        if (!isTransportLayerSMD()) {
-            mSpinCfgRfListener1 = new CfgRfItemSelectedListener1();
+        if (isRomeChip()) {
+            mSpinCfgRfListener3 = new CfgRfItemSelectedListener3();
             adaptCfgRf = ArrayAdapter.createFromResource(
-                           this, R.array.cfg_rf1,
+                           this, R.array.cfg_rf3,
                            android.R.layout.simple_spinner_item);
-        }else {
+        }else if (isTransportLayerSMD()) {
             mSpinCfgRfListener2 = new CfgRfItemSelectedListener2();
             adaptCfgRf = ArrayAdapter.createFromResource(
                            this, R.array.cfg_rf2,
                            android.R.layout.simple_spinner_item);
+        }else {
+            mSpinCfgRfListener1 = new CfgRfItemSelectedListener1();
+            adaptCfgRf = ArrayAdapter.createFromResource(
+                           this, R.array.cfg_rf1,
+                           android.R.layout.simple_spinner_item);
         }
+
         adaptRfCfg = ArrayAdapter.createFromResource(
             this, R.array.rf_cfg, android.R.layout.simple_spinner_item);
 
@@ -486,7 +499,10 @@
                adaptCfgRf.setDropDownViewResource
                            (android.R.layout.simple_spinner_dropdown_item);
                spinOptionFmRf.setAdapter(adaptCfgRf);
-               if(isTransportLayerSMD())
+               if (isRomeChip())
+                  spinOptionFmRf.setOnItemSelectedListener
+                                   (mSpinCfgRfListener3);
+               else if(isTransportLayerSMD())
                   spinOptionFmRf.setOnItemSelectedListener
                                    (mSpinCfgRfListener2);
                else
@@ -494,6 +510,10 @@
                                    (mSpinCfgRfListener1);
                break;
        case 2:
+               /* RF statics option is for non-Silabs targets */
+               if (isRomeChip())
+                   break;
+
                txtbox1 = (EditText)findViewById(R.id.txtbox1);
                tv1 = (TextView)findViewById(R.id.label);
                if(txtbox1 != null) {
@@ -839,6 +859,98 @@
        }
     };
 
+    private View.OnClickListener mOnSetSinrThListenerSilabs =
+    new View.OnClickListener() {
+       public void onClick(View v) {
+          String a;
+          a = txtbox1.getText().toString();
+          try {
+              int rdel = Integer.parseInt(a);
+              Log.d(LOGTAG, "Value of Sinr Th is : " + rdel);
+              if(mService != null) {
+                 try {
+                     if((rdel >= MIN_SINR_TH_SILABS) &&
+                             (rdel <= MAX_SINR_TH_SILABS))
+                             mService.setSinrTh(rdel);
+                     else
+                        Log.d(LOGTAG, "SINR out of valid range");
+                 }catch (RemoteException e) {
+                     e.printStackTrace();
+                 }
+              }
+          }catch (NumberFormatException e) {
+              Log.e(LOGTAG, "Value entered is not in correct format: " + a);
+              txtbox1.setText("");
+          }
+      }
+    };
+
+    private View.OnClickListener mOnSetRssiThListenerSilabs =
+    new View.OnClickListener() {
+       public void onClick(View v) {
+          String a;
+          a = txtbox1.getText().toString();
+          try {
+              int rdel = Integer.parseInt(a);
+              Log.d(LOGTAG, "Value of Rssi Th is : " + rdel);
+              if(mReceiver != null) {
+                  if((rdel >= MIN_RSSI_TH_SILABS) &&
+                          (rdel <= MAX_RSSI_TH_SILABS))
+                          mReceiver.setRssiThreshold(rdel);
+                  else
+                     Log.d(LOGTAG, "RSSI out of valid range");
+              }
+          }catch (NumberFormatException e) {
+              Log.e(LOGTAG, "Value entered is not in correct format: " + a);
+              txtbox1.setText("");
+          }
+      }
+    };
+
+    private View.OnClickListener mOnSetAfJumpRssiThListenerSilabs =
+    new View.OnClickListener() {
+       public void onClick(View v) {
+          String a;
+          a = txtbox1.getText().toString();
+          try {
+              int rdel = Integer.parseInt(a);
+              Log.d(LOGTAG, "Value of Af jump Rssi Th is : " + rdel);
+              if(mReceiver != null) {
+                  if((rdel >= MIN_RSSI_TH_SILABS) &&
+                          (rdel <= MAX_RSSI_TH_SILABS))
+                          mReceiver.setAfJumpRssiThreshold(rdel);
+                  else
+                     Log.d(LOGTAG, "Af jump rssi out of valid range");
+              }
+          }catch (NumberFormatException e) {
+              Log.e(LOGTAG, "Value entered is not in correct format: " + a);
+              txtbox1.setText("");
+          }
+      }
+    };
+
+    private View.OnClickListener mOnSetRdsFifoCntListenerSilabs =
+    new View.OnClickListener() {
+       public void onClick(View v) {
+          String a;
+          a = txtbox1.getText().toString();
+          try {
+              int rdel = Integer.parseInt(a);
+              Log.d(LOGTAG, "Value of RDS fifo count is : " + rdel);
+              if(mReceiver != null) {
+                  if((rdel >= MIN_RDS_FIFO_CNT_SILABS) &&
+                          (rdel <= MAX_RDS_FIFO_CNT_SILABS))
+                          mReceiver.setRdsFifoCnt(rdel);
+                  else
+                     Log.d(LOGTAG, "RDS fifo count out of valid range");
+              }
+          }catch (NumberFormatException e) {
+              Log.e(LOGTAG, "Value entered is not in correct format: " + a);
+              txtbox1.setText("");
+          }
+      }
+    };
+
     public class CfgRfItemSelectedListener1 implements OnItemSelectedListener {
         public void onItemSelected(
                      AdapterView<?> parent, View view, int pos, long id) {
@@ -1461,6 +1573,235 @@
         }
     }
 
+    public class CfgRfItemSelectedListener3 implements OnItemSelectedListener {
+        public void onItemSelected(
+                     AdapterView<?> parent, View view, int pos, long id) {
+            Log.d("Table","onItemSelected is hit with " + pos);
+            int ret = Integer.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);
+            switch(pos)
+            {
+            case 0:
+                   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(mOnSetSinrThListenerSilabs);
+                   }
+                   break;
+            case 1:
+                   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);
+                          if((ret >= MIN_SINR_TH_SILABS) &&
+                                  (ret <= MAX_SINR_TH_SILABS))
+                             tv1.setText(" " + String.valueOf(ret));
+                   }catch (RemoteException e) {
+
+                   }
+                   break;
+            case 2:
+                   if (txtbox1 != null) {
+                       txtbox1.setText(R.string.type_rd);
+                       txtbox1.setVisibility(View.VISIBLE);
+                   }
+                   if (tv1 != null) {
+                       tv1.setText(R.string.enter_RssiTh);
+                       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_RssiTh);
+                       SetButton.setVisibility(View.VISIBLE);
+                       SetButton.setOnClickListener(mOnSetRssiThListenerSilabs);
+                   }
+                   break;
+            case 3:
+                   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) {
+                      ret = mReceiver.getRssiThreshold();
+                      Log.d(LOGTAG, "Get Rssi Th: " + ret);
+                      if((ret >= MIN_RSSI_TH_SILABS) &&
+                             (ret <= MAX_RSSI_TH_SILABS))
+                         tv1.setText(" " + String.valueOf(ret));
+                   }
+                   break;
+            case 4:
+                   if (txtbox1 != null) {
+                       txtbox1.setText(R.string.type_rd);
+                       txtbox1.setVisibility(View.VISIBLE);
+                   }
+                   if (tv1 != null) {
+                       tv1.setText(R.string.enter_AfJumpRssiTh);
+                       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_AfJumpRssiTh);
+                       SetButton.setVisibility(View.VISIBLE);
+                       SetButton.setOnClickListener(mOnSetAfJumpRssiThListenerSilabs);
+                   }
+                   break;
+            case 5:
+                   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) {
+                      ret = mReceiver.getAfJumpRssiThreshold();
+                      Log.d(LOGTAG, "Get AF jump Rssi threshold: " + ret);
+                      if((ret >= MIN_RSSI_TH_SILABS) &&
+                             (ret <= MAX_RSSI_TH_SILABS))
+                         tv1.setText(" " + String.valueOf(ret));
+                   }
+                   break;
+            case 6:
+                   if (txtbox1 != null) {
+                       txtbox1.setText(R.string.type_rd);
+                       txtbox1.setVisibility(View.VISIBLE);
+                   }
+                   if (tv1 != null) {
+                       tv1.setText(R.string.enter_AfJumpRssiTh);
+                       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_RdsFifoCnt);
+                       SetButton.setVisibility(View.VISIBLE);
+                       SetButton.setOnClickListener(mOnSetRdsFifoCntListenerSilabs);
+                   }
+                   break;
+            case 7:
+                   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) {
+                      ret = mReceiver.getRdsFifoCnt();
+                      Log.d(LOGTAG, "Get RDS fifo count: " + ret);
+                      if((ret >= MIN_RDS_FIFO_CNT_SILABS) &&
+                             (ret <= MAX_RDS_FIFO_CNT_SILABS))
+                         tv1.setText(" " + String.valueOf(ret));
+                   }
+                   break;
+/*
+            case 2:
+                   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);
+                   }
+                   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) {
@@ -1502,7 +1843,9 @@
                     adaptCfgRf.setDropDownViewResource(
                                      android.R.layout.simple_spinner_dropdown_item);
                     spinOptionFmRf.setAdapter(adaptCfgRf);
-                    if(isTransportLayerSMD())
+                    if (isRomeChip())
+                       spinOptionFmRf.setOnItemSelectedListener(mSpinCfgRfListener3);
+                    else if(isTransportLayerSMD())
                        spinOptionFmRf.setOnItemSelectedListener(mSpinCfgRfListener2);
                     else
                        spinOptionFmRf.setOnItemSelectedListener(mSpinCfgRfListener1);
@@ -1536,6 +1879,15 @@
     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);
diff --git a/qcom/fmradio/FmReceiver.java b/qcom/fmradio/FmReceiver.java
index 832cb29..3f5eb62 100644
--- a/qcom/fmradio/FmReceiver.java
+++ b/qcom/fmradio/FmReceiver.java
@@ -2493,6 +2493,114 @@
    }
 
 /*==============================================================
+   FUNCTION:  setRssiThreshold
+   ==============================================================*/
+   /**
+   *    Sets the RSSI threshold value
+   *
+   *    <p>
+   *    This method sets the RSSI threshold value.
+   *
+   *    <p>
+   */
+   public boolean setRssiThreshold(int data)
+   {
+      int re =  mControl.setRssiThreshold(sFd, data);
+      if (re < 0)
+          return false;
+      else
+          return true;
+   }
+
+/*==============================================================
+   FUNCTION:  getRssiThreshold
+   ==============================================================*/
+   /**
+   *    Gets the Rssi threshold value
+   *
+   *    <p>
+   *    This method gets the currently set Rssi threshold value.
+   *
+   *    <p>
+   */
+   public int getRssiThreshold()
+   {
+      return mControl.getRssiThreshold(sFd);
+   }
+
+/*==============================================================
+   FUNCTION:  setAfJumpRssiThreshold
+   ==============================================================*/
+   /**
+   *    Sets the Af jump RSSI threshold value
+   *
+   *    <p>
+   *    This method sets the AF jump RSSI threshold value.
+   *
+   *    <p>
+   */
+   public boolean setAfJumpRssiThreshold(int data)
+   {
+      int re =  mControl.setAfJumpRssiThreshold(sFd, data);
+      if (re < 0)
+          return false;
+      else
+          return true;
+   }
+
+/*==============================================================
+   FUNCTION:  getAfJumpRssiThreshold
+   ==============================================================*/
+   /**
+   *    Gets the Af jump RSSI threshold value
+   *
+   *    <p>
+   *    This method gets the currently set AF jump RSSI threshold value.
+   *
+   *    <p>
+   */
+   public int getAfJumpRssiThreshold()
+   {
+      return mControl.getAfJumpRssiThreshold(sFd);
+   }
+
+/*==============================================================
+   FUNCTION: setRdsFifoCnt
+   ==============================================================*/
+   /**
+   *    Sets the RDS FIFO count value
+   *
+   *    <p>
+   *    This method sets the RDS FIFO count value.
+   *
+   *    <p>
+   */
+   public boolean setRdsFifoCnt(int data)
+   {
+      int re =  mControl.setRdsFifoCnt(sFd, data);
+      if (re < 0)
+          return false;
+      else
+          return true;
+   }
+
+/*==============================================================
+   FUNCTION:  getRdsFifoCnt
+   ==============================================================*/
+   /**
+   *    Gets the RDS FIFO count value
+   *
+   *    <p>
+   *    This method gets the currently set RDS FIFO count value.
+   *
+   *    <p>
+   */
+   public int getRdsFifoCnt()
+   {
+      return mControl.getRdsFifoCnt(sFd);
+   }
+
+/*==============================================================
    FUNCTION:  setSINRsamples
    ==============================================================*/
    /**
diff --git a/qcom/fmradio/FmRxControls.java b/qcom/fmradio/FmRxControls.java
index ad69496..b959b70 100644
--- a/qcom/fmradio/FmRxControls.java
+++ b/qcom/fmradio/FmRxControls.java
@@ -72,6 +72,7 @@
    private static final int V4L2_CID_PRIVATE_TAVARUA_RDSON                 = V4L2_CID_PRIVATE_BASE + 15;
    private static final int V4L2_CID_PRIVATE_TAVARUA_RDSGROUP_PROC         = V4L2_CID_PRIVATE_BASE + 16;
    private static final int V4L2_CID_PRIVATE_TAVARUA_LP_MODE               = V4L2_CID_PRIVATE_BASE + 17;
+   private static final int V4L2_CID_PRIVATE_TAVARUA_RDSD_BUF              = V4L2_CID_PRIVATE_BASE + 19;
    private static final int V4L2_CID_PRIVATE_TAVARUA_IOVERC                = V4L2_CID_PRIVATE_BASE + 24;
    private static final int V4L2_CID_PRIVATE_TAVARUA_INTDET                = V4L2_CID_PRIVATE_BASE + 25;
    private static final int V4L2_CID_PRIVATE_TAVARUA_MPX_DCC               = V4L2_CID_PRIVATE_BASE + 26;
@@ -95,6 +96,8 @@
    private static final int V4L2_CID_PRIVATE_SINRFIRSTSTAGE                = V4L2_CID_PRIVATE_BASE + 0x3B;
    private static final int V4L2_CID_PRIVATE_RMSSIFIRSTSTAGE               = V4L2_CID_PRIVATE_BASE + 0x3C;
    private static final int V4L2_CID_PRIVATE_RXREPEATCOUNT                 = V4L2_CID_PRIVATE_BASE + 0x3D;
+   private static final int V4L2_CID_PRIVATE_RSSI_TH                       = V4L2_CID_PRIVATE_BASE + 0x3E;
+   private static final int V4L2_CID_PRIVATE_AF_JUMP_RSSI_TH               = V4L2_CID_PRIVATE_BASE + 0x3F;
 
    private static final int V4L2_CTRL_CLASS_USER = 0x980000;
    private static final int V4L2_CID_BASE        = V4L2_CTRL_CLASS_USER | 0x900;
@@ -225,6 +228,63 @@
    }
 
    /*
+    * Set rssi threshold
+    */
+   public int setRssiThreshold(int fd, int sBuff)
+   {
+      int re = FmReceiverJNI.setControlNative(fd, V4L2_CID_PRIVATE_RSSI_TH, sBuff);
+      if ( re < 0)
+         Log.e(TAG, "Failed to set RSSI threshold data");
+      return re;
+   }
+
+   /*
+    * Get Rssi threshold
+    */
+   public int getRssiThreshold(int fd)
+   {
+      return  FmReceiverJNI.getControlNative(fd, V4L2_CID_PRIVATE_RSSI_TH);
+   }
+
+   /*
+    * Set AF jump rssi threshold
+    */
+   public int setAfJumpRssiThreshold(int fd, int sBuff)
+   {
+      int re = FmReceiverJNI.setControlNative(fd, V4L2_CID_PRIVATE_AF_JUMP_RSSI_TH, sBuff);
+      if ( re < 0)
+         Log.e(TAG, "Failed to set AF Jump Rssithreshold data");
+      return re;
+   }
+
+   /*
+    * Get AF jump Rssi threshold
+    */
+   public int getAfJumpRssiThreshold(int fd)
+   {
+      return  FmReceiverJNI.getControlNative(fd, V4L2_CID_PRIVATE_AF_JUMP_RSSI_TH);
+   }
+
+   /*
+    * Set RDS FIFO count
+    */
+   public int setRdsFifoCnt(int fd, int sBuff)
+   {
+      int re = FmReceiverJNI.setControlNative(fd, V4L2_CID_PRIVATE_TAVARUA_RDSD_BUF, sBuff);
+      if ( re < 0)
+         Log.e(TAG, "Failed to set RDS fifo count data");
+      return re;
+   }
+
+   /*
+    * Get RDS FIFO count
+    */
+   public int getRdsFifoCnt(int fd)
+   {
+      return  FmReceiverJNI.getControlNative(fd, V4L2_CID_PRIVATE_TAVARUA_RDSD_BUF);
+   }
+
+   /*
     * Set number of sinr samples to take in to account for SINR avg calculation
     */
    public int setSINRsamples(int fd, int sBuff)
