void mhl_msc_send_work(struct work_struct *work) { struct mhl_tx_ctrl *mhl_ctrl = container_of(work, struct mhl_tx_ctrl, mhl_msc_send_work); struct msc_cmd_envelope *cmd_env; int ret, postpone_send; /* * Remove item from the queue * and schedule it */ mutex_lock(&msc_send_workqueue_mutex); while (!list_empty(&mhl_ctrl->list_cmd)) { cmd_env = list_first_entry(&mhl_ctrl->list_cmd, struct msc_cmd_envelope, msc_queue_envelope); list_del(&cmd_env->msc_queue_envelope); mutex_unlock(&msc_send_workqueue_mutex); postpone_send = mhl_flag_scrpd_burst_req( mhl_ctrl, &cmd_env->msc_cmd_msg); if (postpone_send) { if (cmd_env->msc_cmd_msg.retry-- > 0) { mutex_lock(&msc_send_workqueue_mutex); list_add_tail( &cmd_env->msc_queue_envelope, &mhl_ctrl->list_cmd); mutex_unlock(&msc_send_workqueue_mutex); } else { pr_err("%s: max scrpd retry out\n", __func__); } } else { ret = mhl_send_msc_command(mhl_ctrl, &cmd_env->msc_cmd_msg); if (ret == -EAGAIN) { int retry = 2; while (retry--) { ret = mhl_send_msc_command( mhl_ctrl, &cmd_env->msc_cmd_msg); if (ret != -EAGAIN) break; } } if (ret == -EAGAIN) pr_err("%s: send_msc_command retry out!\n", __func__); vfree(cmd_env); } mutex_lock(&msc_send_workqueue_mutex); } mutex_unlock(&msc_send_workqueue_mutex); }
static void mhl_msc_send_work(struct work_struct *work) { int ret; struct msc_command_struct *req; while (!list_empty(&mhl_msm_state->list_cmd)) { req = mhl_msm_state->msc_command_get_work(); ret = mhl_send_msc_command(req); if (ret == -EAGAIN) pr_err("MHL: Queue still busy!!\n"); else { vfree(req); pr_debug("MESSAGE SENT!!!!\n"); } } }