void send_to_arm9(void* pReq, void* pRsp, unsigned int rsp_len) { // sleep some time to avoid normal and work queue overlap msleep(100); // initialize this work queue only once if(send_to_arm9_wq == NULL) { printk(KERN_INFO "%s initialize work queue\n", __func__); send_to_arm9_wq = create_singlethread_workqueue("send_to_arm9_wq"); INIT_WORK(&send_to_arm9_data.work, send_to_arm9_wq_func); SET_MUTEX_FLAG(0); // initial flag is 0 SET_COMPLETE_MAIN(1); // initial complete flag is 1 SET_COMPLETE_SUB(1); // initial complete flag is 1 } if(GET_MUTEX_FLAG() == 0) { #ifdef LOCAL_RAPI_DBG printk(KERN_INFO "%s, flag : %d, do normal work\n", __func__, GET_MUTEX_FLAG()); #endif INCREASE_MUTEX_FLAG(); SET_COMPLETE_MAIN(0); wait_for_sub_try_finished(); do_send_to_arm9(pReq, pRsp, NORMAL_WORK_FLAG, rsp_len); SET_COMPLETE_MAIN(1); DECREASE_MUTEX_FLAG(); } else { // hardly ever comes here in normal case. // Previously, it took more than 30 secs for modem factory reset, and this wq was needed at that time printk(KERN_INFO "%s, flag : %d, activate work queue\n", __func__, GET_MUTEX_FLAG()); INCREASE_MUTEX_FLAG(); // increase before getting into the work queue SET_COMPLETE_SUB(0); send_to_arm9_data.pReq = pReq; send_to_arm9_data.pRsp = pRsp; send_to_arm9_data.rsp_len = rsp_len; queue_work(send_to_arm9_wq, &send_to_arm9_data.work); wait_for_sub_try_finished(); } return; }
static void send_to_arm9_wq_func(struct work_struct *work) { printk(KERN_INFO "%s, flag : %d, handle work queue\n", __func__, GET_MUTEX_FLAG() ); wait_for_main_try_finished(); do_send_to_arm9(send_to_arm9_data.pReq, send_to_arm9_data.pRsp, WORK_QUEUE_FLAG); DECREASE_MUTEX_FLAG(); SET_COMPLETE_SUB(1); return; }
void send_to_arm9(void* pReq, void* pRsp) { msleep(100); if(send_to_arm9_wq == NULL) { printk(KERN_INFO "%s initialize work queue\n", __func__); send_to_arm9_wq = create_singlethread_workqueue("send_to_arm9_wq"); INIT_WORK(&send_to_arm9_data.work, send_to_arm9_wq_func); SET_MUTEX_FLAG(0); SET_COMPLETE_MAIN(1); SET_COMPLETE_SUB(1); } if(GET_MUTEX_FLAG() == 0) { #ifdef LOCAL_RAPI_DBG printk(KERN_INFO "%s, flag : %d, do normal work\n", __func__, GET_MUTEX_FLAG()); #endif INCREASE_MUTEX_FLAG(); SET_COMPLETE_MAIN(0); wait_for_sub_try_finished(); do_send_to_arm9(pReq, pRsp, NORMAL_WORK_FLAG); SET_COMPLETE_MAIN(1); DECREASE_MUTEX_FLAG(); } else { printk(KERN_INFO "%s, flag : %d, activate work queue\n", __func__, GET_MUTEX_FLAG()); INCREASE_MUTEX_FLAG(); SET_COMPLETE_SUB(0); send_to_arm9_data.pReq = pReq; send_to_arm9_data.pRsp = pRsp; queue_work(send_to_arm9_wq, &send_to_arm9_data.work); wait_for_sub_try_finished(); } return; }