diff options
| author | ssu-ying hung <ssu-ying.hung@mediatek.com> | 2016-06-20 21:21:11 +0800 |
|---|---|---|
| committer | Mister Oyster <oysterized@gmail.com> | 2017-04-11 11:00:05 +0200 |
| commit | 0b225d3a079571b3a1324e376f5ef7ea6ec2de4a (patch) | |
| tree | c801a1c94802d08b675ed2c663ff1065e24bd3b9 /drivers/misc | |
| parent | 99ebc8c3bede92aeb02cee4a48469f1e585857e7 (diff) | |
arm:mediatek: Resolve wmtFunCtrl wakelock issue
1.add the unlock step in some error case
2.add a timer to control the abnormal flow
Change-Id: Ief9108eae213214123c8c68aaa83eafc7101bec9
Signed-off-by: ssu-ying hung <ssu-ying.hung@mediatek.com>
Diffstat (limited to 'drivers/misc')
4 files changed, 91 insertions, 13 deletions
diff --git a/drivers/misc/mediatek/connectivity/combo/common/core/btm_core.c b/drivers/misc/mediatek/connectivity/combo/common/core/btm_core.c index 01eff987b..4396361ac 100644 --- a/drivers/misc/mediatek/connectivity/combo/common/core/btm_core.c +++ b/drivers/misc/mediatek/connectivity/combo/common/core/btm_core.c @@ -108,6 +108,8 @@ static INT32 _stp_btm_put_dump_to_nl(VOID) STP_DBG_HDR_T *hdr; INT32 remain = 0, index = 0; INT32 retry = 0, rc = 0, nl_retry = 0; + INT32 len; + STP_BTM_INFO_FUNC("Enter..\n"); index = 0; @@ -121,25 +123,33 @@ static INT32 _stp_btm_put_dump_to_nl(VOID) if (buf_len > 0) { pkt = (STP_PACKET_T *) buf; hdr = &pkt->hdr; + len = pkt->hdr.len; + osal_memcpy(&tmp[index], &len, 2); + index += 2; if (hdr->dbg_type == STP_DBG_FW_DMP) { - osal_memcpy(&tmp[index], pkt->raw, pkt->hdr.len); + osal_memcpy(&tmp[index], pkt->raw, len); if (pkt->hdr.len <= 1500) { - tmp[index + pkt->hdr.len] = '\n'; - tmp[index + pkt->hdr.len + 1] = '\0'; /* pr_warn("\n%s\n+++\n", tmp); */ - rc = stp_dbg_nl_send((PINT8) &tmp, 2); + rc = stp_dbg_nl_send((PINT8) &tmp, 2, index+len); while (rc) { nl_retry++; + if (rc == CORE_DUMP_TIMEOUT_RET) { + STP_BTM_ERR_FUNC("**dump send timeout : %d**\n", rc); + STP_BTM_INFO_FUNC("Exit..\n"); + return 0; + } if (nl_retry > 1000) { - break; + STP_BTM_ERR_FUNC("**dump send fails, and retry more than 1000: %d.**\n", rc); + STP_BTM_INFO_FUNC("Exit..\n"); + return 0; } STP_BTM_WARN_FUNC ("**dump send fails, and retry again.**\n"); osal_sleep_ms(3); - rc = stp_dbg_nl_send((PINT8) &tmp, 2); + rc = stp_dbg_nl_send((PINT8) &tmp, 2, index+len); if (!rc) { STP_BTM_WARN_FUNC ("****retry again ok!**\n"); diff --git a/drivers/misc/mediatek/connectivity/combo/common/core/wmt_exp.c b/drivers/misc/mediatek/connectivity/combo/common/core/wmt_exp.c index 5f2ae07b4..00343d70c 100644 --- a/drivers/misc/mediatek/connectivity/combo/common/core/wmt_exp.c +++ b/drivers/misc/mediatek/connectivity/combo/common/core/wmt_exp.c @@ -98,6 +98,7 @@ static MTK_WCN_BOOL mtk_wcn_wmt_func_ctrl(ENUM_WMTDRV_TYPE_T type, ENUM_WMT_OPID if (DISABLE_PSM_MONITOR()) { WMT_ERR_FUNC("wake up failed\n"); wmt_lib_put_op_to_free_queue(pOp); + wmt_lib_host_awake_put(); return MTK_WCN_BOOL_FALSE; } diff --git a/drivers/misc/mediatek/connectivity/combo/common/linux/include/stp_dbg.h b/drivers/misc/mediatek/connectivity/combo/common/linux/include/stp_dbg.h index d66ea211f..eb2f15299 100644 --- a/drivers/misc/mediatek/connectivity/combo/common/linux/include/stp_dbg.h +++ b/drivers/misc/mediatek/connectivity/combo/common/linux/include/stp_dbg.h @@ -26,6 +26,7 @@ #endif +#define CORE_DUMP_TIMEOUT_RET (32) typedef enum { STP_DBG_EN = 0, @@ -264,7 +265,7 @@ extern int stp_dbg_deinit(MTKSTP_DBG_T *stp_dbg); extern int stp_dbg_dmp_out_ex(PINT8 buf, PINT32 len); extern int stp_dbg_dmp_out(MTKSTP_DBG_T *stp_dbg, PINT8 buf, PINT32 len); extern int stp_dbg_dmp_print(MTKSTP_DBG_T *stp_dbg); -extern char stp_dbg_nl_send(PINT8 aucMsg, UINT8 cmd); +extern char stp_dbg_nl_send(PINT8 aucMsg, UINT8 cmd, INT32 len); extern INT32 stp_dbg_aee_send(PUINT8 aucMsg, INT32 len, INT32 cmd); diff --git a/drivers/misc/mediatek/connectivity/combo/common/linux/stp_dbg.c b/drivers/misc/mediatek/connectivity/combo/common/linux/stp_dbg.c index ecbd23861..134ce38d4 100644 --- a/drivers/misc/mediatek/connectivity/combo/common/linux/stp_dbg.c +++ b/drivers/misc/mediatek/connectivity/combo/common/linux/stp_dbg.c @@ -904,6 +904,64 @@ INT32 wcn_compressor_reset(P_WCN_COMPRESSOR_T cprs, UINT8 enable, WCN_COMPRESS_A return 0; } +INT32 wcn_core_dump_nl(P_WCN_CORE_DUMP_T dmp, PUINT8 buf, INT32 len) +{ + INT32 ret = 0; + + if ((!dmp) || (!buf)) { + STP_DBG_ERR_FUNC("invalid pointer!\n"); + return -1; + } + + ret = osal_lock_sleepable_lock(&dmp->dmp_lock); + if (ret) { + STP_DBG_ERR_FUNC("--->lock dmp->dmp_lock failed, ret=%d\n", ret); + return ret; + } + + switch (dmp->sm) { + case CORE_DUMP_INIT: + osal_timer_start(&dmp->dmp_timer, STP_CORE_DUMP_TIMEOUT); + STP_DBG_WARN_FUNC("COMBO_CONSYS coredump start, please wait up to 1 minutes.\n"); + /* check end srting */ + ret = wcn_core_dump_check_end(buf, len); + if (ret == 1) { + STP_DBG_INFO_FUNC("core dump end!\n"); + osal_timer_stop(&dmp->dmp_timer); + dmp->sm = CORE_DUMP_INIT; + } else { + dmp->sm = CORE_DUMP_DOING; + } + break; + + case CORE_DUMP_DOING: + /* check end srting */ + ret = wcn_core_dump_check_end(buf, len); + if (ret == 1) { + STP_DBG_INFO_FUNC("core dump end!\n"); + osal_timer_stop(&dmp->dmp_timer); + dmp->sm = CORE_DUMP_INIT; + } else { + dmp->sm = CORE_DUMP_DOING; + } + break; + + case CORE_DUMP_DONE: + osal_timer_stop(&dmp->dmp_timer); + dmp->sm = CORE_DUMP_INIT; + break; + + case CORE_DUMP_TIMEOUT: + ret = CORE_DUMP_TIMEOUT_RET; + break; + default: + break; + } + + osal_unlock_sleepable_lock(&dmp->dmp_lock); + + return ret; +} static VOID stp_dbg_dump_data(PUINT8 pBuf, PINT8 title, INT32 len) { @@ -1310,12 +1368,13 @@ static INT32 stp_dbg_nl_reset(struct sk_buff *skb, struct genl_info *info) return 0; } -INT8 stp_dbg_nl_send(PINT8 aucMsg, UINT8 cmd) +INT8 stp_dbg_nl_send(PINT8 aucMsg, UINT8 cmd, INT32 len) { struct sk_buff *skb = NULL; PVOID msg_head = NULL; INT32 rc = -1; INT32 i; + INT32 ret = 0; if (num_bind_process == 0) { /* no listening process */ @@ -1323,6 +1382,13 @@ INT8 stp_dbg_nl_send(PINT8 aucMsg, UINT8 cmd) return 0; } + ret = wcn_core_dump_nl(g_core_dump, aucMsg, len); + if (ret < 0) + return ret; + if (ret == CORE_DUMP_TIMEOUT_RET) { + return ret; + } + for (i = 0; i < num_bind_process; i++) { skb = genlmsg_new(2048, GFP_KERNEL); @@ -1335,11 +1401,11 @@ INT8 stp_dbg_nl_send(PINT8 aucMsg, UINT8 cmd) return -1; } - rc = nla_put_string(skb, STP_DBG_ATTR_MSG, aucMsg); + rc = nla_put(skb, STP_DBG_ATTR_MSG, aucMsg); if (rc != 0) { nlmsg_free(skb); - STP_DBG_ERR_FUNC("%s(): nla_put_string fail...\n", __func__); - return -1; + STP_DBG_DBG_FUNC("%s(): nla_put_string fail...: %d\n", __func__, rc); + return rc; } /* finalize the message */ @@ -1348,8 +1414,8 @@ INT8 stp_dbg_nl_send(PINT8 aucMsg, UINT8 cmd) /* sending message */ rc = genlmsg_unicast(&init_net, skb, bind_pid[i]); if (rc != 0) { - STP_DBG_ERR_FUNC("%s(): genlmsg_unicast fail...\n", __func__); - return -1; + STP_DBG_DBG_FUNC("%s(): genlmsg_unicast fail...: %d\n", __func__, rc); + return rc; } } else { STP_DBG_ERR_FUNC("%s(): genlmsg_new fail...\n", __func__); |
