Merge "FM: Fix KW issues." into fm.lnx.2.9.1
diff --git a/fm_hci/fm_hci.c b/fm_hci/fm_hci.c
index f45a00a..d509395 100644
--- a/fm_hci/fm_hci.c
+++ b/fm_hci/fm_hci.c
@@ -391,6 +391,7 @@
            return;
        }
   //     property_set("wc_transport.fm_service_status", "0");
+       usleep(100 * 1000);	// 100 msecs
        property_set(FM_VND_SERVICE_START, "true");
        ALOGI("%s: %s set to true ", __func__, FM_VND_SERVICE_START );
        for(i=0; i<45; i++) {
diff --git a/fmapp2/src/com/caf/fmradio/FMRadioService.java b/fmapp2/src/com/caf/fmradio/FMRadioService.java
index f605749..ab78098 100644
--- a/fmapp2/src/com/caf/fmradio/FMRadioService.java
+++ b/fmapp2/src/com/caf/fmradio/FMRadioService.java
@@ -1670,7 +1670,8 @@
                       if (true == mPlaybackInProgress) {
                           stopFM();
                       }
-                      mReceiver.EnableSlimbus(DISABLE_SLIMBUS_DATA_PORT);
+                      if (mReceiver != null)
+                          mReceiver.EnableSlimbus(DISABLE_SLIMBUS_DATA_PORT);
                       mStoppedOnFocusLoss = true;
                       break;
                   case AudioManager.AUDIOFOCUS_LOSS:
diff --git a/helium/radio-helium-commands.h b/helium/radio-helium-commands.h
index 46ed651..5aac139 100644
--- a/helium/radio-helium-commands.h
+++ b/helium/radio-helium-commands.h
@@ -115,6 +115,9 @@
     HCI_FM_HELIUM_AUDIO_MODE,
     HCI_FM_HELIUM_RMSSI,
     HCI_FM_HELIUM_AUDIO_MUTE,
+    HCI_FM_HELIUM_AF_ALGO,
+    HCI_FM_HELIUM_AF_SINR_GD_CH_TH,
+    HCI_FM_HELIUM_AF_SINR_TH,
 
     /*FM VSC command to enable/disable slimbus data port*/
     HCI_FM_HELIUM_AUDIO = 0x00980940,
diff --git a/helium/radio-helium.h b/helium/radio-helium.h
index 79f61bd..a244925 100644
--- a/helium/radio-helium.h
+++ b/helium/radio-helium.h
@@ -98,8 +98,13 @@
 /**RDS CONFIG MODE**/
 #define FM_RDS_CNFG_MODE    0x0f
 #define FM_RDS_CNFG_LEN     0x10
+
+/**AF JUMP CONFIG MODE**/
+#define AF_ALGO_OFFSET      0
 #define AF_RMSSI_TH_OFFSET  1
 #define AF_RMSSI_SAMPLES_OFFSET 2
+#define AF_SINR_GD_CH_TH_OFFSET 4
+#define AF_SINR_TH_OFFSET   5
 /**RX CONFIG MODE**/
 #define FM_RX_CONFG_MODE    0x15
 #define FM_RX_CNFG_LEN      0x15
@@ -1186,6 +1191,9 @@
 #define CMD_DEFRD_CF0TH12           (7)
 #define CMD_DEFRD_TUNE_POWER        (8)
 #define CMD_DEFRD_REPEATCOUNT       (9)
+#define CMD_DEFRD_AF_ALGO           (10)
+#define CMD_DEFRD_AF_SINR_GD_CH_TH  (11)
+#define CMD_DEFRD_AF_SINR_TH        (12)
 
 #define CMD_STNPARAM_RSSI           (1)
 #define CMD_STNPARAM_SINR           (2)
diff --git a/helium/radio_helium_hal.c b/helium/radio_helium_hal.c
index a25d888..7d04cb4 100644
--- a/helium/radio_helium_hal.c
+++ b/helium/radio_helium_hal.c
@@ -282,31 +282,48 @@
 
         if (test_bit(def_data_rd_mask_flag, CMD_DEFRD_AF_RMSSI_TH)) {
             val = hal->radio->def_data.data[AF_RMSSI_TH_OFFSET];
+            clear_bit(def_data_rd_mask_flag, CMD_DEFRD_AF_RMSSI_TH);
         } else if (test_bit(def_data_rd_mask_flag, CMD_DEFRD_AF_RMSSI_SAMPLE)) {
             val = hal->radio->def_data.data[AF_RMSSI_SAMPLES_OFFSET];
+            clear_bit(def_data_rd_mask_flag, CMD_DEFRD_AF_RMSSI_SAMPLE);
         } else if (test_bit(def_data_rd_mask_flag, CMD_DEFRD_GD_CH_RMSSI_TH)) {
             val = hal->radio->def_data.data[GD_CH_RMSSI_TH_OFFSET];
             if (val > MAX_GD_CH_RMSSI_TH)
                 val -= 256;
+            clear_bit(def_data_rd_mask_flag, CMD_DEFRD_GD_CH_RMSSI_TH);
         } else if (test_bit(def_data_rd_mask_flag, CMD_DEFRD_SEARCH_ALGO)) {
             val = hal->radio->def_data.data[SRCH_ALGO_TYPE_OFFSET];
+            clear_bit(def_data_rd_mask_flag, CMD_DEFRD_SEARCH_ALGO);
         } else if (test_bit(def_data_rd_mask_flag, CMD_DEFRD_SINR_FIRST_STAGE)) {
             val = hal->radio->def_data.data[SINRFIRSTSTAGE_OFFSET];
             if (val > MAX_SINR_FIRSTSTAGE)
                 val -= 256;
+            clear_bit(def_data_rd_mask_flag, CMD_DEFRD_SINR_FIRST_STAGE);
         } else if (test_bit(def_data_rd_mask_flag, CMD_DEFRD_RMSSI_FIRST_STAGE)) {
             val = hal->radio->def_data.data[RMSSIFIRSTSTAGE_OFFSET];
+            clear_bit(def_data_rd_mask_flag, CMD_DEFRD_RMSSI_FIRST_STAGE);
         } else if (test_bit(def_data_rd_mask_flag, CMD_DEFRD_CF0TH12)) {
             val = (hal->radio->def_data.data[CF0TH12_BYTE1_OFFSET] |
                     (hal->radio->def_data.data[CF0TH12_BYTE2_OFFSET] << 8));
+            clear_bit(def_data_rd_mask_flag, CMD_DEFRD_CF0TH12);
         } else if (test_bit(def_data_rd_mask_flag, CMD_DEFRD_TUNE_POWER)) {
+            clear_bit(def_data_rd_mask_flag, CMD_DEFRD_TUNE_POWER);
         } else if (test_bit(def_data_rd_mask_flag, CMD_DEFRD_REPEATCOUNT)) {
             val = hal->radio->def_data.data[RX_REPEATE_BYTE_OFFSET];
+            clear_bit(def_data_rd_mask_flag, CMD_DEFRD_REPEATCOUNT);
+        } else if(test_bit(def_data_rd_mask_flag, CMD_DEFRD_AF_ALGO)) {
+            val = hal->radio->def_data.data[AF_ALGO_OFFSET];
+            clear_bit(def_data_rd_mask_flag, CMD_DEFRD_AF_ALGO);
+        } else if (test_bit(def_data_rd_mask_flag, CMD_DEFRD_AF_SINR_GD_CH_TH)) {
+            val = hal->radio->def_data.data[AF_SINR_GD_CH_TH_OFFSET];
+            clear_bit(def_data_rd_mask_flag, CMD_DEFRD_AF_SINR_GD_CH_TH);
+        } else if (test_bit(def_data_rd_mask_flag, CMD_DEFRD_AF_SINR_TH)) {
+            val = hal->radio->def_data.data[AF_SINR_TH_OFFSET];
+            clear_bit(def_data_rd_mask_flag, CMD_DEFRD_AF_SINR_TH);
         }
     } else {
         ALOGE("%s: Error: Status= 0x%x", __func__, status);
     }
-    clear_all_bit(def_data_rd_mask_flag);
     hal->jni_cb->fm_def_data_read_cb(val, status);
 }
 
@@ -1597,7 +1614,31 @@
          def_data_wrt.length = RDS_PS0_LEN;
          memcpy(&def_data_wrt.data, &hal->radio->def_data.data,
                  hal->radio->def_data.data_len);
-         def_data_wrt.data[AF_RMSSI_SAMPLES_OFFSET] = val;
+         def_data_wrt.data[RX_REPEATE_BYTE_OFFSET] = val;
+         ret = hci_fm_default_data_write_req(&def_data_wrt);
+         break;
+    case HCI_FM_HELIUM_AF_ALGO:
+         def_data_wrt.mode = FM_AFJUMP_CONFG_MODE;
+         def_data_wrt.length = FM_AFJUMP_CNFG_LEN;
+         memcpy(&def_data_wrt.data, &hal->radio->def_data.data,
+                 hal->radio->def_data.data_len);
+         def_data_wrt.data[AF_ALGO_OFFSET] = (char)val;
+         ret = hci_fm_default_data_write_req(&def_data_wrt);
+         break;
+    case HCI_FM_HELIUM_AF_SINR_GD_CH_TH:
+         def_data_wrt.mode = FM_AFJUMP_CONFG_MODE;
+         def_data_wrt.length = FM_AFJUMP_CNFG_LEN;
+         memcpy(&def_data_wrt.data, &hal->radio->def_data.data,
+                 hal->radio->def_data.data_len);
+         def_data_wrt.data[AF_SINR_GD_CH_TH_OFFSET] = (char)val;
+         ret = hci_fm_default_data_write_req(&def_data_wrt);
+         break;
+    case HCI_FM_HELIUM_AF_SINR_TH:
+         def_data_wrt.mode = FM_AFJUMP_CONFG_MODE;
+         def_data_wrt.length = FM_AFJUMP_CNFG_LEN;
+         memcpy(&def_data_wrt.data, &hal->radio->def_data.data,
+                 hal->radio->def_data.data_len);
+         def_data_wrt.data[AF_SINR_TH_OFFSET] = (char)val;
          ret = hci_fm_default_data_write_req(&def_data_wrt);
          break;
     case HCI_FM_HELIUM_BLEND_SINRHI:
@@ -1729,7 +1770,21 @@
         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;
-
+        goto cmd;
+    case HCI_FM_HELIUM_AF_ALGO:
+        set_bit(def_data_rd_mask_flag, CMD_DEFRD_AF_ALGO);
+        def_data_rd.mode = FM_AFJUMP_CONFG_MODE;
+        def_data_rd.length = FM_AFJUMP_CNFG_LEN;
+        goto cmd;
+    case HCI_FM_HELIUM_AF_SINR_GD_CH_TH:
+        set_bit(def_data_rd_mask_flag, CMD_DEFRD_AF_SINR_GD_CH_TH);
+        def_data_rd.mode = FM_AFJUMP_CONFG_MODE;
+        def_data_rd.length = FM_AFJUMP_CNFG_LEN;
+        goto cmd;
+    case HCI_FM_HELIUM_AF_SINR_TH:
+        set_bit(def_data_rd_mask_flag, CMD_DEFRD_AF_SINR_TH);
+        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;