Patch "drm/dp/mst: always send reply for UP request" has been added to the 4.4-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
drm/dp/mst: always send reply for UP request
to the 4.4-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
drm-dp-mst-always-send-reply-for-up-request.patch
and it can be found in the queue-4.4 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
1f16ee7fa13649f4e55aa48ad31c3eb0722a62d3Mon Sep 17 00:00:00 2001
From: Mykola Lysenko <[email protected]>
Date: Fri, 18 Dec 2015 17:14:43 -0500
Subject: drm/dp/mst: always send reply for UP request
From: Mykola Lysenko <[email protected]>
commit 1f16ee7fa13649f4e55aa48ad31c3eb0722a62d3 upstream.
We should always send reply for UP request in order to make downstream device clean-up resources appropriately.
Issue was that reply for UP request was sent only once.
--- drivers/gpu/drm/drm_dp_mst_topology.c | 30 +++++++++++------------------- include/drm/drm_dp_mst_helper.h | 2 -- 2 files changed, 11 insertions(+), 21 deletions(-)
drivers/gpu/drm/drm_dp_mst_topology.c +11 -19
@@ -1489,26 +1489,18 @@ static void process_single_down_tx_qlock }/* called holding qlock */ -static void process_single_up_tx_qlock (struct drm_dp_mst_topology_mgr *mgr) +static void process_single_up_tx_qlock (struct drm_dp_mst_topology_mgr *mgr, +struct drm_dp_sideband_msg_tx *txmsg) { -struct drm_dp_sideband_msg_tx *txmsg;int ret;/* construct a chunk from the first msg in the tx_msg queue */ -if (list_empty (&mgr->tx_msg_upq)) { - mgr->tx_up_in_progress = false; -return ; - } - - txmsg = list_first_entry(&mgr->tx_msg_upq, struct drm_dp_sideband_msg_tx, next); ret =process_single_tx_qlock (mgr, txmsg, true); -if (ret ==1 ) { -/* up txmsgs aren't put in slots - so free after we send it */ -list_del (&txmsg->next); -kfree (txmsg); - }else if (ret) + +if (ret !=1 )DRM_DEBUG_KMS ("failed to send msg in q %d\n" , ret); - mgr->tx_up_in_progress = true; + + txmsg->dst->tx_slots[txmsg->seqno] =NULL ; } static void drm_dp_queue_down_tx(struct drm_dp_mst_topology_mgr *mgr,
@@ -1895,11 +1887,12 @@ static int drm_dp_send_up_ack_reply(strudrm_dp_encode_up_ack_reply (txmsg, req_type);mutex_lock (&mgr->qlock); -list_add_tail (&txmsg->next, &mgr->tx_msg_upq); -if (!mgr->tx_up_in_progress) { -process_single_up_tx_qlock (mgr); - } + +process_single_up_tx_qlock (mgr, txmsg); +mutex_unlock (&mgr->qlock); + +kfree (txmsg);return 0 ; }
@@ -2809,7 +2802,6 @@ int drm_dp_mst_topology_mgr_init(structmutex_init (&mgr->qlock);mutex_init (&mgr->payload_lock);mutex_init (&mgr->destroy_connector_lock); -INIT_LIST_HEAD (&mgr->tx_msg_upq);INIT_LIST_HEAD (&mgr->tx_msg_downq);INIT_LIST_HEAD (&mgr->destroy_connector_list);INIT_WORK (&mgr->work, drm_dp_mst_link_probe_work);
include/drm/drm_dp_mst_helper.h +0 -2
@@ -450,9 +450,7 @@ struct drm_dp_mst_topology_mgr {the mstb tx_slots and txmsg->state once they are queued */ struct mutex qlock;struct list_head tx_msg_downq; -struct list_head tx_msg_upq;bool tx_down_in_progress; -bool tx_up_in_progress;/* payload info + lock for it */ struct mutex payload_lock;
Patches currently in stable-queue which might be from [email protected] are
queue-4.4/drm-dp-mst-deallocate-payload-on-port-destruction.patch queue-4.4/drm-dp-mst-process-broadcast-messages-correctly.patch queue-4.4/drm-dp-mst-fix-in-rad-element-access.patch queue-4.4/drm-dp-mst-always-send-reply-for-up-request.patch queue-4.4/drm-dp-mst-fix-in-mstb-rad-initialization.patch