Commit f61550b3 authored by Kuogee Hsieh's avatar Kuogee Hsieh Committed by Rob Clark
Browse files

drm/msm/dp: dp_link_parse_sink_count() return immediately if aux read failed



Add checking aux read/write status at both dp_link_parse_sink_count()
and dp_link_parse_sink_status_filed() to avoid long timeout delay if
dp aux read/write failed at timeout due to cable unplugged.

Changes in V4:
-- split this patch as stand alone patch

Changes in v5:
-- rebase on msm-next branch

Signed-off-by: default avatarKuogee Hsieh <quic_khsieh@quicinc.com>

Reviewed-by: default avatarStephen Boyd <swboyd@chromium.org>
Tested-by: default avatarStephen Boyd <swboyd@chromium.org>
Link: https://lore.kernel.org/r/1638985262-2072-1-git-send-email-quic_khsieh@quicinc.com


Signed-off-by: default avatarRob Clark <robdclark@chromium.org>
parent 44bf8704
Loading
Loading
Loading
Loading
+9 −3
Original line number Diff line number Diff line
@@ -693,10 +693,16 @@ static int dp_irq_hpd_handle(struct dp_display_private *dp, u32 data)
		return 0;
	}

	/*
	 * dp core (ahb/aux clks) must be initialized before
	 * irq_hpd be handled
	 */
	if (dp->core_initialized) {
		ret = dp_display_usbpd_attention_cb(&dp->pdev->dev);
		if (ret == -ECONNRESET) { /* cable unplugged */
			dp->core_initialized = false;
		}
	}
	DRM_DEBUG_DP("hpd_state=%d\n", state);

	mutex_unlock(&dp->event_mutex);
+14 −5
Original line number Diff line number Diff line
@@ -737,18 +737,25 @@ static int dp_link_parse_sink_count(struct dp_link *dp_link)
	return 0;
}

static void dp_link_parse_sink_status_field(struct dp_link_private *link)
static int dp_link_parse_sink_status_field(struct dp_link_private *link)
{
	int len = 0;

	link->prev_sink_count = link->dp_link.sink_count;
	dp_link_parse_sink_count(&link->dp_link);
	len = dp_link_parse_sink_count(&link->dp_link);
	if (len < 0) {
		DRM_ERROR("DP parse sink count failed\n");
		return len;
	}

	len = drm_dp_dpcd_read_link_status(link->aux,
		link->link_status);
	if (len < DP_LINK_STATUS_SIZE)
	if (len < DP_LINK_STATUS_SIZE) {
		DRM_ERROR("DP link status read failed\n");
	dp_link_parse_request(link);
		return len;
	}

	return dp_link_parse_request(link);
}

/**
@@ -1023,7 +1030,9 @@ int dp_link_process_request(struct dp_link *dp_link)

	dp_link_reset_data(link);

	dp_link_parse_sink_status_field(link);
	ret = dp_link_parse_sink_status_field(link);
	if (ret)
		return ret;

	if (link->request.test_requested == DP_TEST_LINK_EDID_READ) {
		dp_link->sink_request |= DP_TEST_LINK_EDID_READ;