/* This function executes in (Linux) softirq context */ void ccmCfgCnfMsgHandler(tHalHandle hHal, void *m) { tHddHandle hHdd = halHandle2HddHandle(hHal); tpAniSirGlobal pMac = PMAC_STRUCT( hHal ); tSirMbMsg *msg = (tSirMbMsg *)m ; tANI_U32 result, cfgId ; tCfgReq *req, *old ; #if 0 if (pMac->ccm.state != eCCM_STARTED) { return ; } #endif result = pal_be32_to_cpu(msg->data[0]); cfgId = pal_be32_to_cpu(msg->data[1]); if (pMac->ccm.replay.started && cfgId == CFG_UPDATE_MAGIC_DWORD) { pMac->ccm.replay.in_progress = 1 ; return ; } if (pMac->ccm.replay.in_progress) { /* save error code */ if (!CCM_IS_RESULT_SUCCESS(result)) { pMac->ccm.replay.result = result ; } if (--pMac->ccm.replay.nr_param == 0) { pMac->ccm.replay.in_progress = 0 ; if (pMac->ccm.replay.callback) { pMac->ccm.replay.callback(hHal, pMac->ccm.replay.result); } pMac->ccm.replay.started = 0 ; /* Wake up the sleeping process */ #ifdef CCM_DEBUG smsLog(pMac, LOGW, FL("ccmComplete(%p)"), pMac->ccm.replay.done); #endif ccmComplete(hHdd, pMac->ccm.replay.done); //Let go with the rest of the set CFGs waiting. sendQueuedReqToMacSw(pMac, hHdd); } } else { /* * Try to match this response with the request. * What if i could not find the req entry ??? */ req = pMac->ccm.reqQ.head ; if (req) { if (req->cfgId == cfgId && req->state == eCCM_REQ_SENT) { palSpinLockTake(hHdd, pMac->ccm.lock); del_req(req, &pMac->ccm.reqQ); palSpinLockGive(hHdd, pMac->ccm.lock); req->state = eCCM_REQ_DONE ; if (result == WNI_CFG_NEED_RESTART || result == WNI_CFG_NEED_RELOAD) { #ifdef CCM_DEBUG smsLog(pMac, LOGW, FL("need restart/reload, cfgId=%d"), req->cfgId) ; #endif //purgeReqQ(hHal); } /* invoke callback */ if (req->callback) { #ifdef CCM_DEBUG req->callback(hHal, cfgId) ; #else req->callback(hHal, result) ; #endif } /* Wake up the sleeping process */ #ifdef CCM_DEBUG smsLog(pMac, LOGW, FL("cfgId=%ld, calling ccmComplete(%p)"), cfgId, req->done); #endif ccmComplete(hHdd, req->done); /* move the completed req from reqQ to comp[] */ if (req->toBeSaved && (CCM_IS_RESULT_SUCCESS(result))) { if (cfgId < CFG_PARAM_MAX_NUM) { if ((old = pMac->ccm.comp[cfgId]) != NULL) { freeCfgReq(hHdd, old) ; } pMac->ccm.comp[cfgId] = req ; } } else { freeCfgReq(hHdd, req) ; } sendQueuedReqToMacSw(pMac, hHdd); } else { smsLog( pMac, LOGW, FL("can not match RSP with REQ, rspcfgid=%d result=%d reqcfgid=%d reqstate=%d"), (int)cfgId, (int)result, req->cfgId, req->state); #ifdef CCM_DEBUG smsLog(pMac, LOGW, FL("ccmComplete(%p)"), req->done); #endif } } } return ; }
void ccmCfgCnfMsgHandler(tHalHandle hHal, void *m) { tHddHandle hHdd = halHandle2HddHandle(hHal); tpAniSirGlobal pMac = PMAC_STRUCT( hHal ); tSirMbMsg *msg = (tSirMbMsg *)m ; tANI_U32 result, cfgId ; tCfgReq *req, *old ; #if 0 if (pMac->ccm.state != eCCM_STARTED) { return ; } #endif result = pal_be32_to_cpu(msg->data[0]); cfgId = pal_be32_to_cpu(msg->data[1]); if (pMac->ccm.replay.started && cfgId == CFG_UPDATE_MAGIC_DWORD) { pMac->ccm.replay.in_progress = 1 ; return ; } if (pMac->ccm.replay.in_progress) { if (!CCM_IS_RESULT_SUCCESS(result)) { pMac->ccm.replay.result = result ; } if (--pMac->ccm.replay.nr_param == 0) { pMac->ccm.replay.in_progress = 0 ; if (pMac->ccm.replay.callback) { pMac->ccm.replay.callback(hHal, pMac->ccm.replay.result); } pMac->ccm.replay.started = 0 ; #ifdef CCM_DEBUG smsLog(pMac, LOGW, FL("ccmComplete(%p)"), pMac->ccm.replay.done); #endif ccmComplete(hHdd, pMac->ccm.replay.done); sendQueuedReqToMacSw(pMac, hHdd); } } else { req = pMac->ccm.reqQ.head ; if (req) { if (req->cfgId == cfgId && req->state == eCCM_REQ_SENT) { palSpinLockTake(hHdd, pMac->ccm.lock); del_req(req, &pMac->ccm.reqQ); palSpinLockGive(hHdd, pMac->ccm.lock); req->state = eCCM_REQ_DONE ; if (result == WNI_CFG_NEED_RESTART || result == WNI_CFG_NEED_RELOAD) { #ifdef CCM_DEBUG smsLog(pMac, LOGW, FL("need restart/reload, cfgId=%d"), req->cfgId) ; #endif } if (req->callback) { #ifdef CCM_DEBUG req->callback(hHal, cfgId) ; #else req->callback(hHal, result) ; #endif } #ifdef CCM_DEBUG smsLog(pMac, LOGW, FL("cfgId=%ld, calling ccmComplete(%p)"), cfgId, req->done); #endif ccmComplete(hHdd, req->done); if (req->toBeSaved && (CCM_IS_RESULT_SUCCESS(result))) { if (cfgId < CFG_PARAM_MAX_NUM) { if ((old = pMac->ccm.comp[cfgId]) != NULL) { freeCfgReq(hHdd, old) ; } pMac->ccm.comp[cfgId] = req ; } } else { freeCfgReq(hHdd, req) ; } sendQueuedReqToMacSw(pMac, hHdd); } else { smsLog( pMac, LOGW, FL("can not match RSP with REQ, rspcfgid=%d result=%d reqcfgid=%d reqstate=%d"), (int)cfgId, (int)result, req->cfgId, req->state); #ifdef CCM_DEBUG smsLog(pMac, LOGW, FL("ccmComplete(%p)"), req->done); #endif } } } return ; }