Skip to content

Commit de118f2

Browse files
committed
drm: apple: afk: Allow replies after service 'teardown'
'teardown' on DCP's 'av' endpoint's DCPAVAudioInterface is send during the close afk_service_call. Signed-off-by: Janne Grunau <j@jannau.net>
1 parent 07e4bfb commit de118f2

4 files changed

Lines changed: 19 additions & 1 deletion

File tree

drivers/gpu/drm/apple/afk.c

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,7 @@ static void afk_recv_handle_init(struct apple_dcp_afkep *ep, u32 channel,
308308
ch_idx = ep->num_channels++;
309309
spin_lock_init(&ep->services[ch_idx].lock);
310310
ep->services[ch_idx].enabled = true;
311+
ep->services[ch_idx].torndown = false;
311312
ep->services[ch_idx].ops = ops;
312313
ep->services[ch_idx].ep = ep;
313314
ep->services[ch_idx].channel = channel;
@@ -340,7 +341,12 @@ static void afk_recv_handle_teardown(struct apple_dcp_afkep *ep, u32 channel)
340341

341342
// TODO: think through what locking is necessary
342343
spin_lock_irqsave(&service->lock, flags);
343-
service->enabled = false;
344+
/*
345+
* teardown must not disable the service since since it may be sent as
346+
* side effect of a COMMAND which for which a reply is expected.
347+
* Seen with DCP's "av" endpoint during the close afk_service_call.
348+
*/
349+
service->torndown = true;
344350
ops = service->ops;
345351
spin_unlock_irqrestore(&service->lock, flags);
346352

@@ -445,6 +451,12 @@ static void afk_recv_handle_std_service(struct apple_dcp_afkep *ep, u32 channel,
445451
ep->endpoint, channel);
446452
return;
447453
}
454+
if (service->torndown) {
455+
dev_warn(ep->dcp->dev,
456+
"AFK[ep:%02x]: std service notify on torn down service "
457+
"(chan:%u)\n", ep->endpoint, channel);
458+
return;
459+
}
448460

449461
if (type == EPIC_TYPE_NOTIFY && eshdr->category == EPIC_CAT_NOTIFY) {
450462
struct epic_std_service_ap_call *call = payload;

drivers/gpu/drm/apple/afk.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ struct apple_epic_service {
4646

4747
u32 channel;
4848
bool enabled;
49+
bool torndown;
4950

5051
void *cookie;
5152

drivers/gpu/drm/apple/av.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,8 @@ static void av_interface_teardown(struct apple_epic_service *service)
7474
struct apple_dcp *dcp = service->ep->dcp;
7575
struct audiosrv_data *asrv = dcp->audiosrv;
7676

77+
service->enabled = false;
78+
7779
mutex_lock(&asrv->plug_lock);
7880

7981
asrv->plugged = false;

drivers/gpu/drm/apple/epic/dpavservep.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ static void dcpavserv_init(struct apple_epic_service *service, const char *name,
3636
static void dcpavserv_teardown(struct apple_epic_service *service)
3737
{
3838
struct apple_dcp *dcp = service->ep->dcp;
39+
service->enabled = false;
40+
3941
if (dcp->dcpavserv.enabled) {
4042
dcp->dcpavserv.enabled = false;
4143
dcp->dcpavserv.service = NULL;
@@ -51,6 +53,7 @@ static void dcpdpserv_init(struct apple_epic_service *service, const char *name,
5153

5254
static void dcpdpserv_teardown(struct apple_epic_service *service)
5355
{
56+
service->enabled = false;
5457
}
5558

5659
struct dcpavserv_status_report {

0 commit comments

Comments
 (0)