X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=stack%2Fbtm%2Fbtm_sco.c;h=8c374f9b878a2926584ac86209ad96cde49a38fd;hb=2b745bc0d3f3ce6ba81f93cf138747db3c0fc4a2;hp=55ddb11f2fb5cdb0ce8022b039475c52210787ad;hpb=dfed8a623c98c4f0134dc82d96ed877976cfecfe;p=android-x86%2Fsystem-bt.git diff --git a/stack/btm/btm_sco.c b/stack/btm/btm_sco.c index 55ddb11f2..8c374f9b8 100644 --- a/stack/btm/btm_sco.c +++ b/stack/btm/btm_sco.c @@ -49,6 +49,7 @@ #define SCO_ST_DISCONNECTING 5 #define SCO_ST_PEND_UNPARK 6 #define SCO_ST_PEND_ROLECHANGE 7 +#define SCO_ST_PEND_MODECHANGE 8 /********************************************************************************/ /* L O C A L F U N C T I O N P R O T O T Y P E S */ @@ -89,7 +90,7 @@ void btm_sco_flush_sco_data(UINT16 sco_inx) { p = &btm_cb.sco_cb.sco_db[sco_inx]; while ((p_buf = (BT_HDR *)fixed_queue_try_dequeue(p->xmit_data_q)) != NULL) - osi_freebuf(p_buf); + osi_free(p_buf); } } #else @@ -289,7 +290,7 @@ void btm_route_sco_data(BT_HDR *p_msg) /* send data callback */ if (!btm_cb.sco_cb.p_data_cb ) /* if no data callback registered, just free the buffer */ - osi_freebuf (p_msg); + osi_free(p_msg); else { (*btm_cb.sco_cb.p_data_cb)(sco_inx, p_msg, (tBTM_SCO_DATA_FLAG) pkt_status); @@ -297,10 +298,10 @@ void btm_route_sco_data(BT_HDR *p_msg) } else /* no mapping handle SCO connection is active, free the buffer */ { - osi_freebuf (p_msg); + osi_free(p_msg); } #else - osi_freebuf(p_msg); + osi_free(p_msg); #endif } @@ -339,7 +340,7 @@ tBTM_STATUS BTM_WriteScoData (UINT16 sco_inx, BT_HDR *p_buf) if (p_buf->offset < HCI_SCO_PREAMBLE_SIZE) { BTM_TRACE_ERROR ("BTM SCO - cannot send buffer, offset: %d", p_buf->offset); - osi_freebuf (p_buf); + osi_free(p_buf); status = BTM_ILLEGAL_VALUE; } else /* write HCI header */ @@ -368,7 +369,7 @@ tBTM_STATUS BTM_WriteScoData (UINT16 sco_inx, BT_HDR *p_buf) } else { - osi_freebuf(p_buf); + osi_free(p_buf); BTM_TRACE_WARNING ("BTM_WriteScoData, invalid sco index: %d at state [%d]", sco_inx, btm_cb.sco_cb.sco_db[sco_inx].state); @@ -582,9 +583,9 @@ tBTM_STATUS BTM_CreateSco (BD_ADDR remote_bda, BOOLEAN is_orig, UINT16 pkt_types tACL_CONN *p_acl; #if (BTM_SCO_WAKE_PARKED_LINK == TRUE) - tBTM_PM_MODE md; tBTM_PM_PWR_MD pm; -#else // BTM_SCO_WAKE_PARKED_LINK + tBTM_PM_STATE state; +#else UINT8 mode; #endif // BTM_SCO_WAKE_PARKED_LINK @@ -631,10 +632,12 @@ tBTM_STATUS BTM_CreateSco (BD_ADDR remote_bda, BOOLEAN is_orig, UINT16 pkt_types { /* can not create SCO link if in park mode */ #if BTM_SCO_WAKE_PARKED_LINK == TRUE - if(BTM_ReadPowerMode(remote_bda, &md) == BTM_SUCCESS) + if ((btm_read_power_mode_state(p->esco.data.bd_addr, &state) == BTM_SUCCESS)) { - if (md == BTM_PM_MD_PARK || md == BTM_PM_MD_SNIFF) + if (state == BTM_PM_ST_SNIFF || state == BTM_PM_ST_PARK || + state == BTM_PM_ST_PENDING) { + BTM_TRACE_DEBUG("%s In sniff, park or pend mode: %d", __func__, state); memset( (void*)&pm, 0, sizeof(pm)); pm.mode = BTM_PM_MD_ACTIVE; BTM_SetPowerMode(BTM_PM_SET_ONLY_ID, remote_bda, &pm); @@ -793,6 +796,37 @@ void btm_sco_chk_pend_rolechange (UINT16 hci_handle) /******************************************************************************* ** +** Function btm_sco_disc_chk_pend_for_modechange +** +** Description This function is called by btm when there is a mode change +** event to see if there are SCO disconnect commands waiting for the mode change. +** +** Returns void +** +*******************************************************************************/ +void btm_sco_disc_chk_pend_for_modechange (UINT16 hci_handle) +{ +#if (BTM_MAX_SCO_LINKS>0) + tSCO_CONN *p = &btm_cb.sco_cb.sco_db[0]; + + BTM_TRACE_DEBUG("%s: hci_handle 0x%04x, p->state 0x%02x", __func__, + hci_handle, p->state); + + for (UINT16 xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) + { + if ((p->state == SCO_ST_PEND_MODECHANGE) && + (BTM_GetHCIConnHandle (p->esco.data.bd_addr, BT_TRANSPORT_BR_EDR)) == hci_handle) + + { + BTM_TRACE_DEBUG("%s: SCO Link handle 0x%04x", __func__, p->hci_handle); + BTM_RemoveSco(xx); + } + } +#endif +} + +/******************************************************************************* +** ** Function btm_sco_conn_req ** ** Description This function is called by BTIF when an SCO connection @@ -1029,6 +1063,9 @@ tBTM_STATUS BTM_RemoveSco (UINT16 sco_inx) #if (BTM_MAX_SCO_LINKS>0) tSCO_CONN *p = &btm_cb.sco_cb.sco_db[sco_inx]; UINT16 tempstate; + tBTM_PM_STATE state = BTM_PM_ST_INVALID; + + BTM_TRACE_DEBUG("%s", __func__); /* Validity check */ if ((sco_inx >= BTM_MAX_SCO_LINKS) || (p->state == SCO_ST_UNUSED)) @@ -1043,6 +1080,15 @@ tBTM_STATUS BTM_RemoveSco (UINT16 sco_inx) return (BTM_SUCCESS); } + if ((btm_read_power_mode_state(p->esco.data.bd_addr, &state) == BTM_SUCCESS) + && state == BTM_PM_ST_PENDING) + { + BTM_TRACE_DEBUG("%s: BTM_PM_ST_PENDING for ACL mapped with SCO Link 0x%04x", + __func__, p->hci_handle); + p->state = SCO_ST_PEND_MODECHANGE; + return (BTM_CMD_STARTED); + } + tempstate = p->state; p->state = SCO_ST_DISCONNECTING;