video: driver: flush pending last flag buffers in streamoff

When client called streamoff on capture port, driver needs
to flush out pending last flag buffers, if any, to avoid
session errors.

Change-Id: I733ba1a39374f38a1d63a876fb4d2fc06aa6daf7
Signed-off-by: Maheshwar Ajja <quic_majja@quicinc.com>
This commit is contained in:
Maheshwar Ajja
2022-01-04 08:39:49 -08:00
والد d827fc1e83
کامیت 2d5a106e01

مشاهده پرونده

@@ -1649,6 +1649,67 @@ bool msm_vidc_allow_last_flag(struct msm_vidc_inst *inst)
return false;
}
static int msm_vidc_flush_pending_last_flag(struct msm_vidc_inst *inst)
{
int rc = 0;
struct response_work *resp_work, *dummy = NULL;
if (!inst) {
d_vpr_e("%s: invalid params\n", __func__);
return -EINVAL;
}
if (list_empty(&inst->response_works))
return 0;
/* flush pending last flag buffers if any */
list_for_each_entry_safe(resp_work, dummy,
&inst->response_works, list) {
if (resp_work->type == RESP_WORK_LAST_FLAG) {
i_vpr_h(inst, "%s: flush pending last flag buffer\n",
__func__);
rc = handle_session_response_work(inst, resp_work);
if (rc) {
msm_vidc_change_inst_state(inst,
MSM_VIDC_ERROR, __func__);
return rc;
}
list_del(&resp_work->list);
kfree(resp_work->data);
kfree(resp_work);
}
}
return 0;
}
static int msm_vidc_discard_pending_opsc(struct msm_vidc_inst *inst)
{
struct response_work *resp_work, *dummy = NULL;
if (!inst) {
d_vpr_e("%s: invalid params\n", __func__);
return -EINVAL;
}
if (list_empty(&inst->response_works))
return 0;
/* discard pending port settings change if any */
list_for_each_entry_safe(resp_work, dummy,
&inst->response_works, list) {
if (resp_work->type == RESP_WORK_OUTPUT_PSC) {
i_vpr_h(inst,
"%s: discard pending output psc\n", __func__);
list_del(&resp_work->list);
kfree(resp_work->data);
kfree(resp_work);
}
}
return 0;
}
static int msm_vidc_discard_pending_ipsc(struct msm_vidc_inst *inst)
{
struct response_work *resp_work, *dummy = NULL;
@@ -3881,6 +3942,17 @@ int msm_vidc_session_streamoff(struct msm_vidc_inst *inst,
if(rc)
goto error;
/* discard pending input port settings change if any */
if (port == INPUT_PORT)
msm_vidc_discard_pending_ipsc(inst);
if (port == OUTPUT_PORT) {
/* discard pending opsc if any*/
msm_vidc_discard_pending_opsc(inst);
/* flush out pending last flag buffers if any */
msm_vidc_flush_pending_last_flag(inst);
}
/* no more queued buffers after streamoff */
count = msm_vidc_num_buffers(inst, buffer_type, MSM_VIDC_ATTR_QUEUED);
if (!count) {
@@ -3894,9 +3966,6 @@ int msm_vidc_session_streamoff(struct msm_vidc_inst *inst,
goto error;
}
/* discard pending port settings change if any */
msm_vidc_discard_pending_ipsc(inst);
/* flush deferred buffers */
msm_vidc_flush_buffers(inst, buffer_type);
msm_vidc_flush_delayed_unmap_buffers(inst, buffer_type);