fm_bool fm_wait_stc_done(fm_u32 sec) { fm_s32 ret_time = 0; ret_time = FM_EVENT_WAIT_TIMEOUT(link_event->ln_event, FLAG_TEST, sec); if (!ret_time) { WCN_DBG(FM_WAR | LINK, "wait stc done fail\n"); return fm_false; } else { WCN_DBG(FM_DBG | LINK, "wait stc done ok\n"); } FM_EVENT_CLR(link_event->ln_event, FLAG_TEST); return fm_true; }
/* * fm_cmd_tx() - send cmd to FM firmware and wait event * @buf - send buffer * @len - the length of cmd * @mask - the event flag mask * @ cnt - the retry conter * @timeout - timeout per cmd * Return 0, if success; error code, if failed */ fm_s32 fm_cmd_tx(fm_u8 *buf, fm_u16 len, fm_s32 mask, fm_s32 cnt, fm_s32 timeout, fm_s32(*callback) (struct fm_res_ctx *result)) { fm_s32 ret_time = 0; struct task_struct *task = current; struct fm_trace_t trace; if ((NULL == buf) || (len < 0) || (0 == mask) || (cnt > SW_RETRY_CNT_MAX) || (timeout > SW_WAIT_TIMEOUT_MAX)) { WCN_DBG(FM_ERR | LINK, "cmd tx, invalid para\n"); return -FM_EPARA; } FM_EVENT_CLR(link_event->ln_event, mask); #ifdef FM_TRACE_ENABLE trace.type = buf[0]; trace.opcode = buf[1]; trace.len = len - 4; trace.tid = (fm_s32) task->pid; fm_memset(trace.pkt, 0, FM_TRACE_PKT_SIZE); fm_memcpy(trace.pkt, &buf[4], (trace.len > FM_TRACE_PKT_SIZE) ? FM_TRACE_PKT_SIZE : trace.len); #endif sw_retry: #ifdef FM_TRACE_ENABLE if (fm_true == FM_TRACE_FULL(cmd_fifo)) { FM_TRACE_OUT(cmd_fifo, NULL); } FM_TRACE_IN(cmd_fifo, &trace); #endif /* send cmd to FM firmware */ if ((ret_time = mtk_wcn_stp_send_data(buf, len, FM_TASK_INDX)) <= 0) { WCN_DBG(FM_EMG | LINK, "send data over stp failed[%d]\n", ret_time); return -FM_ELINK; } /* wait the response form FM firmware */ ret_time = FM_EVENT_WAIT_TIMEOUT(link_event->ln_event, mask, timeout); if (!ret_time) { if (0 < cnt--) { WCN_DBG(FM_WAR | LINK, "wait even timeout, [retry_cnt=%d], pid=%d\n", cnt, task->pid); fm_print_cmd_fifo(); fm_print_evt_fifo(); return -FM_EFW; goto sw_retry; /* retry if timeout and retry cnt > 0 */ } else { WCN_DBG(FM_ALT | LINK, "fatal error, SW retry failed, reset HW\n"); return -FM_EFW; } } FM_EVENT_CLR(link_event->ln_event, mask); if (callback) { callback(&link_event->result); } return 0; }