static int stp_dbg_add_pkt ( MTKSTP_DBG_T*stp_dbg, struct stp_dbg_pkt_hdr *hdr, const unsigned char *body ) { //fix the frame size large issues. static struct stp_dbg_pkt stp_pkt; uint32_t hdr_sz = sizeof(struct stp_dbg_pkt_hdr); uint32_t body_sz = 0; osal_bug_on(!stp_dbg); if(hdr->dbg_type == STP_DBG_PKT){ body_sz = (hdr->len <= STP_PKT_SZ)?(hdr->len):(STP_PKT_SZ); }else{ body_sz = (hdr->len <= STP_DMP_SZ)?(hdr->len):(STP_DMP_SZ); } hdr->no = stp_dbg->pkt_trace_no++; memcpy((uint8_t *)&stp_pkt.hdr, (uint8_t*)hdr, hdr_sz); if(body != NULL){ memcpy((uint8_t *)&stp_pkt.raw[0], body, body_sz); } _stp_dbg_dmp_in(stp_dbg, (char *) &stp_pkt, hdr_sz + body_sz); //Only FW DMP MSG should inform BTM-CORE to dump packet to native process if(hdr->dbg_type == STP_DBG_FW_DMP) { stp_gdb_notify_btm_dmp_wq(stp_dbg); } return 0; }
static INT32 _stp_btm_put_dump_to_nl(VOID) { #define NUM_FETCH_ENTRY 8 static UINT8 buf[2048]; static UINT8 tmp[2048]; UINT32 buf_len; STP_PACKET_T *pkt; STP_DBG_HDR_T *hdr; INT32 remain = 0, index = 0; INT32 retry = 0, rc = 0; INT32 len; STP_BTM_INFO_FUNC("Enter..\n"); index = 0; tmp[index++] = '['; tmp[index++] = 'M'; tmp[index++] = ']'; do { index = 3; remain = stp_dbg_dmp_out_ex(&buf[0], &buf_len); 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); 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_btm_dump_send_retry_handler((PINT8)&tmp, len); if (rc) goto exit; /* schedule(); */ } else { STP_BTM_INFO_FUNC("dump entry length is over long\n"); osal_bug_on(0); } retry = 0; } } else { retry++; osal_sleep_ms(100); } } while ((remain > 0) || (retry < 2)); exit: STP_BTM_INFO_FUNC("Exit..\n"); return 0; }
INT32 mtk_wcn_stp_register_tx_event_cb(INT32 type, MTK_WCN_STP_EVENT_CB func) { if (type < MTKSTP_MAX_TASK_NUM) { tx_event_callback_tbl[type] = func; } else { osal_bug_on(0); } return 0; }
static INT32 _stp_btm_put_dump_to_aee(void) { static UINT8 buf[2048]; static UINT8 tmp[2048]; UINT32 buf_len; STP_PACKET_T *pkt; STP_DBG_HDR_T *hdr; INT32 remain = 0; INT32 retry = 0; INT32 ret = 0; STP_BTM_INFO_FUNC("Enter..\n"); do { remain = stp_dbg_dmp_out_ex(&buf[0], &buf_len); if (buf_len > 0) { pkt = (STP_PACKET_T*)buf; hdr = &pkt->hdr; if (hdr->dbg_type == STP_DBG_FW_DMP) { osal_memcpy(&tmp[0], pkt->raw, pkt->hdr.len); if (pkt->hdr.len <= 1500) { tmp[pkt->hdr.len] = '\n'; tmp[pkt->hdr.len + 1] = '\0'; ret = stp_dbg_aee_send(tmp, pkt->hdr.len, 0); } else { STP_BTM_INFO_FUNC("dump entry length is over long\n"); osal_bug_on(0); } retry = 0; } retry = 0; } else { retry ++; osal_sleep_ms(20); } }while ((remain > 0) || (retry < 10)); STP_BTM_INFO_FUNC("Exit..\n"); return ret; }
static INT32 _stp_btm_put_dump_to_nl(void) { #define NUM_FETCH_ENTRY 8 static UINT8 buf[2048]; static UINT8 tmp[2048]; UINT32 buf_len; STP_PACKET_T *pkt; STP_DBG_HDR_T *hdr; INT32 remain=0, index =0; INT32 retry = 0, rc = 0, nl_retry = 0; STP_BTM_INFO_FUNC("Enter..\n"); index = 0; tmp[index++]='['; tmp[index++]='M'; tmp[index++]=']'; do { index = 3; remain = stp_dbg_dmp_out_ex(&buf[0], &buf_len); if (buf_len > 0) { pkt = (STP_PACKET_T *)buf; hdr = &pkt->hdr; if (hdr->dbg_type == STP_DBG_FW_DMP){ osal_memcpy(&tmp[index], pkt->raw, pkt->hdr.len); if(pkt->hdr.len <= 1500) { tmp[index + pkt->hdr.len] = '\n'; tmp[index + pkt->hdr.len + 1] = '\0'; //printk("\n%s\n+++\n", tmp); rc = stp_dbg_nl_send((PCHAR)&tmp, 2); while(rc){ nl_retry++; if(nl_retry > 1000){ break; } STP_BTM_WARN_FUNC("**dump send fails, and retry again.**\n"); osal_msleep(3); rc = stp_dbg_nl_send((PCHAR)&tmp, 2); if(!rc){ STP_BTM_WARN_FUNC("****retry again ok!**\n"); } } //schedule(); } else { STP_BTM_INFO_FUNC("dump entry length is over long\n"); osal_bug_on(0); } retry = 0; } }else { retry ++; osal_msleep(100); } }while((remain > 0) || (retry < 2)); STP_BTM_INFO_FUNC("Exit..\n"); return 0; }