diff options
| author | pramod kotreshappa <kpramod@codeaurora.org> | 2015-04-07 09:56:25 -0700 |
|---|---|---|
| committer | Scott Mertz <scott@cyngn.com> | 2015-08-19 11:17:45 -0700 |
| commit | c6a374ae4b392a6760be7c6d282e311bc329ceca (patch) | |
| tree | 58f4e866d95a075616ebccf646c5f53ea43c7e40 | |
| parent | a0dc758759985c173ebcc491bd3bd4be28ea73d3 (diff) | |
| download | android_hardware_qcom_bt-c6a374ae4b392a6760be7c6d282e311bc329ceca.tar.gz android_hardware_qcom_bt-c6a374ae4b392a6760be7c6d282e311bc329ceca.tar.bz2 android_hardware_qcom_bt-c6a374ae4b392a6760be7c6d282e311bc329ceca.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.
CRs-fixed: 819003
Change-Id: I4e360456f3ac41670f4738266f24e7b2550f1466
| -rw-r--r-- | libbt-vendor/include/hw_rome.h | 2 | ||||
| -rw-r--r-- | libbt-vendor/src/hw_rome.c | 29 |
2 files changed, 25 insertions, 6 deletions
diff --git a/libbt-vendor/include/hw_rome.h b/libbt-vendor/include/hw_rome.h index 6b2f934..64cadc1 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; } |
