summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpramod kotreshappa <kpramod@codeaurora.org>2015-04-07 09:56:25 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2015-04-14 11:03:41 -0700
commitc4bf0d2d4c23cc6d21653e03898232280a083eaf (patch)
treeba6f722319585bf43a9eeb919ff6d499fba0372c
parent73133303d5394634cef07314a76bf2f021ab2421 (diff)
downloadandroid_hardware_qcom_bt-c4bf0d2d4c23cc6d21653e03898232280a083eaf.tar.gz
android_hardware_qcom_bt-c4bf0d2d4c23cc6d21653e03898232280a083eaf.tar.bz2
android_hardware_qcom_bt-c4bf0d2d4c23cc6d21653e03898232280a083eaf.zip
Bluetooth: Fix to handle invalid VS event during patch download
Fix to handle invalid power apply VS event sent from SoC during patch download to avoid BT turn on failure. Change-Id: I4e360456f3ac41670f4738266f24e7b2550f1466 CRs-fixed: 819003
-rw-r--r--libbt-vendor/include/hw_rome.h2
-rw-r--r--libbt-vendor/src/hw_rome.c29
2 files changed, 25 insertions, 6 deletions
diff --git a/libbt-vendor/include/hw_rome.h b/libbt-vendor/include/hw_rome.h
index b6d214c..f2bee16 100644
--- a/libbt-vendor/include/hw_rome.h
+++ b/libbt-vendor/include/hw_rome.h
@@ -106,7 +106,7 @@
#define EDL_WIP_START_HANDOFF_TO_HOST_EVENT (0x19)
#define HCI_VS_GET_ADDON_FEATURES_EVENT (0x1B)
#define HCI_VS_GET_BUILD_VER_EVT (0x05)
-
+#define HCI_VS_STRAY_EVT (0x17)
/* Status Codes of HCI CMD execution*/
#define HCI_CMD_SUCCESS (0x0)
diff --git a/libbt-vendor/src/hw_rome.c b/libbt-vendor/src/hw_rome.c
index 9876fdc..25182bf 100644
--- a/libbt-vendor/src/hw_rome.c
+++ b/libbt-vendor/src/hw_rome.c
@@ -77,7 +77,8 @@ char *fw_su_info = NULL;
unsigned short fw_su_offset =0;
extern char enable_extldo;
unsigned char wait_vsc_evt = TRUE;
-
+bool patch_dnld_pending = FALSE;
+int dnld_fd = -1;
/******************************************************************************
** Extern variables
******************************************************************************/
@@ -86,7 +87,6 @@ extern uint8_t vnd_local_bd_addr[6];
/*****************************************************************************
** Functions
*****************************************************************************/
-
int get_vs_hci_event(unsigned char *rsp)
{
int err = 0;
@@ -244,6 +244,21 @@ int get_vs_hci_event(unsigned char *rsp)
property_set("persist.bluetooth.a4wp", "true");
}
break;
+ case HCI_VS_STRAY_EVT:
+ /* WAR to handle stray Power Apply EVT during patch download */
+ ALOGD("%s: Stray HCI VS EVENT", __FUNCTION__);
+ if (patch_dnld_pending && dnld_fd != -1)
+ {
+ unsigned char rsp[HCI_MAX_EVENT_SIZE];
+ memset(rsp, 0x00, HCI_MAX_EVENT_SIZE);
+ read_vs_hci_event(dnld_fd, rsp, HCI_MAX_EVENT_SIZE);
+ }
+ else
+ {
+ ALOGE("%s: Not a valid status!!!", __FUNCTION__);
+ err = -1;
+ }
+ break;
default:
ALOGE("%s: Not a valid status!!!", __FUNCTION__);
err = -1;
@@ -980,8 +995,10 @@ int rome_tlv_dnld_req(int fd, int tlv_size)
}
}
+ patch_dnld_pending = TRUE;
if((err = rome_tlv_dnld_segment(fd, i, MAX_SIZE_PER_TLV_SEGMENT, wait_cc_evt )) < 0)
goto error;
+ patch_dnld_pending = FALSE;
}
if ((rome_ver >= ROME_VER_1_1) && (rome_ver < ROME_VER_3_2) && (gTlv_type == TLV_TYPE_PATCH)) {
@@ -1003,10 +1020,11 @@ int rome_tlv_dnld_req(int fd, int tlv_size)
wait_vsc_evt = remain_size ? TRUE: FALSE;
}
}
-
+ patch_dnld_pending = TRUE;
if(remain_size) err =rome_tlv_dnld_segment(fd, i, remain_size, wait_cc_evt);
-
+ patch_dnld_pending = FALSE;
error:
+ if(patch_dnld_pending) patch_dnld_pending = FALSE;
return err;
}
@@ -1735,7 +1753,7 @@ static int disable_internal_ldo(int fd)
int rome_soc_init(int fd, char *bdaddr)
{
int err = -1, size = 0;
-
+ dnld_fd = fd;
ALOGI(" %s ", __FUNCTION__);
/* If wipower charging is going on in embedded mode then start hand off req */
@@ -1881,5 +1899,6 @@ download:
}
error:
+ dnld_fd = -1;
return err;
}