@@ -1190,6 +1190,8 @@ static int drm_dp_mst_wait_tx_reply(struct drm_dp_mst_branch *mstb,
1190
1190
txmsg -> state == DRM_DP_SIDEBAND_TX_SENT ) {
1191
1191
mstb -> tx_slots [txmsg -> seqno ] = NULL ;
1192
1192
}
1193
+ mgr -> is_waiting_for_dwn_reply = false;
1194
+
1193
1195
}
1194
1196
out :
1195
1197
if (unlikely (ret == - EIO ) && drm_debug_enabled (DRM_UT_DP )) {
@@ -1199,6 +1201,7 @@ static int drm_dp_mst_wait_tx_reply(struct drm_dp_mst_branch *mstb,
1199
1201
}
1200
1202
mutex_unlock (& mgr -> qlock );
1201
1203
1204
+ drm_dp_mst_kick_tx (mgr );
1202
1205
return ret ;
1203
1206
}
1204
1207
@@ -2318,7 +2321,7 @@ drm_dp_mst_handle_conn_stat(struct drm_dp_mst_branch *mstb,
2318
2321
{
2319
2322
struct drm_dp_mst_topology_mgr * mgr = mstb -> mgr ;
2320
2323
struct drm_dp_mst_port * port ;
2321
- int old_ddps , ret ;
2324
+ int old_ddps , old_input , ret , i ;
2322
2325
u8 new_pdt ;
2323
2326
bool dowork = false, create_connector = false;
2324
2327
@@ -2349,6 +2352,7 @@ drm_dp_mst_handle_conn_stat(struct drm_dp_mst_branch *mstb,
2349
2352
}
2350
2353
2351
2354
old_ddps = port -> ddps ;
2355
+ old_input = port -> input ;
2352
2356
port -> input = conn_stat -> input_port ;
2353
2357
port -> mcs = conn_stat -> message_capability_status ;
2354
2358
port -> ldps = conn_stat -> legacy_device_plug_status ;
@@ -2373,6 +2377,28 @@ drm_dp_mst_handle_conn_stat(struct drm_dp_mst_branch *mstb,
2373
2377
dowork = false;
2374
2378
}
2375
2379
2380
+ if (!old_input && old_ddps != port -> ddps && !port -> ddps ) {
2381
+ for (i = 0 ; i < mgr -> max_payloads ; i ++ ) {
2382
+ struct drm_dp_vcpi * vcpi = mgr -> proposed_vcpis [i ];
2383
+ struct drm_dp_mst_port * port_validated ;
2384
+
2385
+ if (!vcpi )
2386
+ continue ;
2387
+
2388
+ port_validated =
2389
+ container_of (vcpi , struct drm_dp_mst_port , vcpi );
2390
+ port_validated =
2391
+ drm_dp_mst_topology_get_port_validated (mgr , port_validated );
2392
+ if (!port_validated ) {
2393
+ mutex_lock (& mgr -> payload_lock );
2394
+ vcpi -> num_slots = 0 ;
2395
+ mutex_unlock (& mgr -> payload_lock );
2396
+ } else {
2397
+ drm_dp_mst_topology_put_port (port_validated );
2398
+ }
2399
+ }
2400
+ }
2401
+
2376
2402
if (port -> connector )
2377
2403
drm_modeset_unlock (& mgr -> base .lock );
2378
2404
else if (create_connector )
@@ -2718,9 +2744,11 @@ static void process_single_down_tx_qlock(struct drm_dp_mst_topology_mgr *mgr)
2718
2744
ret = process_single_tx_qlock (mgr , txmsg , false);
2719
2745
if (ret == 1 ) {
2720
2746
/* txmsg is sent it should be in the slots now */
2747
+ mgr -> is_waiting_for_dwn_reply = true;
2721
2748
list_del (& txmsg -> next );
2722
2749
} else if (ret ) {
2723
2750
DRM_DEBUG_KMS ("failed to send msg in q %d\n" , ret );
2751
+ mgr -> is_waiting_for_dwn_reply = false;
2724
2752
list_del (& txmsg -> next );
2725
2753
if (txmsg -> seqno != -1 )
2726
2754
txmsg -> dst -> tx_slots [txmsg -> seqno ] = NULL ;
@@ -2760,7 +2788,8 @@ static void drm_dp_queue_down_tx(struct drm_dp_mst_topology_mgr *mgr,
2760
2788
drm_dp_mst_dump_sideband_msg_tx (& p , txmsg );
2761
2789
}
2762
2790
2763
- if (list_is_singular (& mgr -> tx_msg_downq ))
2791
+ if (list_is_singular (& mgr -> tx_msg_downq ) &&
2792
+ !mgr -> is_waiting_for_dwn_reply )
2764
2793
process_single_down_tx_qlock (mgr );
2765
2794
mutex_unlock (& mgr -> qlock );
2766
2795
}
@@ -3678,6 +3707,7 @@ static int drm_dp_mst_handle_down_rep(struct drm_dp_mst_topology_mgr *mgr)
3678
3707
mutex_lock (& mgr -> qlock );
3679
3708
txmsg -> state = DRM_DP_SIDEBAND_TX_RX ;
3680
3709
mstb -> tx_slots [slot ] = NULL ;
3710
+ mgr -> is_waiting_for_dwn_reply = false;
3681
3711
mutex_unlock (& mgr -> qlock );
3682
3712
3683
3713
wake_up_all (& mgr -> tx_waitq );
@@ -3687,6 +3717,9 @@ static int drm_dp_mst_handle_down_rep(struct drm_dp_mst_topology_mgr *mgr)
3687
3717
no_msg :
3688
3718
drm_dp_mst_topology_put_mstb (mstb );
3689
3719
clear_down_rep_recv :
3720
+ mutex_lock (& mgr -> qlock );
3721
+ mgr -> is_waiting_for_dwn_reply = false;
3722
+ mutex_unlock (& mgr -> qlock );
3690
3723
memset (& mgr -> down_rep_recv , 0 , sizeof (struct drm_dp_sideband_msg_rx ));
3691
3724
3692
3725
return 0 ;
@@ -4497,7 +4530,7 @@ static void drm_dp_tx_work(struct work_struct *work)
4497
4530
struct drm_dp_mst_topology_mgr * mgr = container_of (work , struct drm_dp_mst_topology_mgr , tx_work );
4498
4531
4499
4532
mutex_lock (& mgr -> qlock );
4500
- if (!list_empty (& mgr -> tx_msg_downq ))
4533
+ if (!list_empty (& mgr -> tx_msg_downq ) && ! mgr -> is_waiting_for_dwn_reply )
4501
4534
process_single_down_tx_qlock (mgr );
4502
4535
mutex_unlock (& mgr -> qlock );
4503
4536
}
0 commit comments