aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/misc/mediatek/connectivity/combo/common/core/btm_core.c22
-rw-r--r--drivers/misc/mediatek/connectivity/combo/common/core/wmt_exp.c1
-rw-r--r--drivers/misc/mediatek/connectivity/combo/common/linux/include/stp_dbg.h3
-rw-r--r--drivers/misc/mediatek/connectivity/combo/common/linux/stp_dbg.c78
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__);