|
@@ -41,7 +41,7 @@ enum policy_engine_state {
|
41
|
41
|
PESinkTransitionDefault,
|
42
|
42
|
PESinkSoftReset,
|
43
|
43
|
PESinkSendSoftReset,
|
44
|
|
- PESinkSendReject,
|
|
44
|
+ PESinkSendNotSupported,
|
45
|
45
|
PESinkSourceUnresponsive
|
46
|
46
|
};
|
47
|
47
|
|
|
@@ -332,42 +332,42 @@ static enum policy_engine_state pe_sink_ready(struct pdb_config *cfg)
|
332
|
332
|
chPoolFree(&pdb_msg_pool, cfg->pe._message);
|
333
|
333
|
cfg->pe._message = NULL;
|
334
|
334
|
return PESinkReady;
|
335
|
|
- /* Reject DR_Swap messages */
|
|
335
|
+ /* DR_Swap messages are not supported */
|
336
|
336
|
} else if (PD_MSGTYPE_GET(cfg->pe._message) == PD_MSGTYPE_DR_SWAP
|
337
|
337
|
&& PD_NUMOBJ_GET(cfg->pe._message) == 0) {
|
338
|
338
|
chPoolFree(&pdb_msg_pool, cfg->pe._message);
|
339
|
339
|
cfg->pe._message = NULL;
|
340
|
|
- return PESinkSendReject;
|
341
|
|
- /* Reject Get_Source_Cap messages */
|
|
340
|
+ return PESinkSendNotSupported;
|
|
341
|
+ /* Get_Source_Cap messages are not supported */
|
342
|
342
|
} else if (PD_MSGTYPE_GET(cfg->pe._message) == PD_MSGTYPE_GET_SOURCE_CAP
|
343
|
343
|
&& PD_NUMOBJ_GET(cfg->pe._message) == 0) {
|
344
|
344
|
chPoolFree(&pdb_msg_pool, cfg->pe._message);
|
345
|
345
|
cfg->pe._message = NULL;
|
346
|
|
- return PESinkSendReject;
|
347
|
|
- /* Reject PR_Swap messages */
|
|
346
|
+ return PESinkSendNotSupported;
|
|
347
|
+ /* PR_Swap messages are not supported */
|
348
|
348
|
} else if (PD_MSGTYPE_GET(cfg->pe._message) == PD_MSGTYPE_PR_SWAP
|
349
|
349
|
&& PD_NUMOBJ_GET(cfg->pe._message) == 0) {
|
350
|
350
|
chPoolFree(&pdb_msg_pool, cfg->pe._message);
|
351
|
351
|
cfg->pe._message = NULL;
|
352
|
|
- return PESinkSendReject;
|
353
|
|
- /* Reject VCONN_Swap messages */
|
|
352
|
+ return PESinkSendNotSupported;
|
|
353
|
+ /* VCONN_Swap messages are not supported */
|
354
|
354
|
} else if (PD_MSGTYPE_GET(cfg->pe._message) == PD_MSGTYPE_VCONN_SWAP
|
355
|
355
|
&& PD_NUMOBJ_GET(cfg->pe._message) == 0) {
|
356
|
356
|
chPoolFree(&pdb_msg_pool, cfg->pe._message);
|
357
|
357
|
cfg->pe._message = NULL;
|
358
|
|
- return PESinkSendReject;
|
359
|
|
- /* Reject Request messages */
|
|
358
|
+ return PESinkSendNotSupported;
|
|
359
|
+ /* Request messages are not supported */
|
360
|
360
|
} else if (PD_MSGTYPE_GET(cfg->pe._message) == PD_MSGTYPE_REQUEST
|
361
|
361
|
&& PD_NUMOBJ_GET(cfg->pe._message) > 0) {
|
362
|
362
|
chPoolFree(&pdb_msg_pool, cfg->pe._message);
|
363
|
363
|
cfg->pe._message = NULL;
|
364
|
|
- return PESinkSendReject;
|
365
|
|
- /* Reject Sink_Capabilities messages */
|
|
364
|
+ return PESinkSendNotSupported;
|
|
365
|
+ /* Sink_Capabilities messages are not supported */
|
366
|
366
|
} else if (PD_MSGTYPE_GET(cfg->pe._message) == PD_MSGTYPE_SINK_CAPABILITIES
|
367
|
367
|
&& PD_NUMOBJ_GET(cfg->pe._message) > 0) {
|
368
|
368
|
chPoolFree(&pdb_msg_pool, cfg->pe._message);
|
369
|
369
|
cfg->pe._message = NULL;
|
370
|
|
- return PESinkSendReject;
|
|
370
|
+ return PESinkSendNotSupported;
|
371
|
371
|
/* Handle GotoMin messages */
|
372
|
372
|
} else if (PD_MSGTYPE_GET(cfg->pe._message) == PD_MSGTYPE_GOTOMIN
|
373
|
373
|
&& PD_NUMOBJ_GET(cfg->pe._message) == 0) {
|
|
@@ -381,10 +381,10 @@ static enum policy_engine_state pe_sink_ready(struct pdb_config *cfg)
|
381
|
381
|
cfg->pe._message = NULL;
|
382
|
382
|
return PESinkTransitionSink;
|
383
|
383
|
} else {
|
384
|
|
- /* We don't support GiveBack, so send a Reject */
|
|
384
|
+ /* GiveBack is not supported */
|
385
|
385
|
chPoolFree(&pdb_msg_pool, cfg->pe._message);
|
386
|
386
|
cfg->pe._message = NULL;
|
387
|
|
- return PESinkSendReject;
|
|
387
|
+ return PESinkSendNotSupported;
|
388
|
388
|
}
|
389
|
389
|
/* Evaluate new Source_Capabilities */
|
390
|
390
|
} else if (PD_MSGTYPE_GET(cfg->pe._message) == PD_MSGTYPE_SOURCE_CAPABILITIES
|
|
@@ -598,22 +598,28 @@ static enum policy_engine_state pe_sink_send_soft_reset(struct pdb_config *cfg)
|
598
|
598
|
return PESinkHardReset;
|
599
|
599
|
}
|
600
|
600
|
|
601
|
|
-static enum policy_engine_state pe_sink_send_reject(struct pdb_config *cfg)
|
|
601
|
+static enum policy_engine_state pe_sink_send_not_supported(struct pdb_config *cfg)
|
602
|
602
|
{
|
603
|
603
|
/* Get a message object */
|
604
|
|
- union pd_msg *reject = chPoolAlloc(&pdb_msg_pool);
|
605
|
|
- /* Make a Reject message */
|
606
|
|
- reject->hdr = cfg->pe.hdr_template | PD_MSGTYPE_REJECT | PD_NUMOBJ(0);
|
|
604
|
+ union pd_msg *not_supported = chPoolAlloc(&pdb_msg_pool);
|
|
605
|
+
|
|
606
|
+ if ((cfg->pe.hdr_template & PD_HDR_SPECREV) == PD_SPECREV_2_0) {
|
|
607
|
+ /* Make a Reject message */
|
|
608
|
+ not_supported->hdr = cfg->pe.hdr_template | PD_MSGTYPE_REJECT | PD_NUMOBJ(0);
|
|
609
|
+ } else if ((cfg->pe.hdr_template & PD_HDR_SPECREV) == PD_SPECREV_3_0) {
|
|
610
|
+ /* Make a Not_Supported message */
|
|
611
|
+ not_supported->hdr = cfg->pe.hdr_template | PD_MSGTYPE_NOT_SUPPORTED | PD_NUMOBJ(0);
|
|
612
|
+ }
|
607
|
613
|
|
608
|
614
|
/* Transmit the message */
|
609
|
|
- chMBPost(&cfg->prl.tx_mailbox, (msg_t) reject, TIME_IMMEDIATE);
|
|
615
|
+ chMBPost(&cfg->prl.tx_mailbox, (msg_t) not_supported, TIME_IMMEDIATE);
|
610
|
616
|
chEvtSignal(cfg->prl.tx_thread, PDB_EVT_PRLTX_MSG_TX);
|
611
|
617
|
eventmask_t evt = chEvtWaitAny(PDB_EVT_PE_TX_DONE | PDB_EVT_PE_TX_ERR
|
612
|
618
|
| PDB_EVT_PE_RESET);
|
613
|
619
|
|
614
|
|
- /* Free the Reject message */
|
615
|
|
- chPoolFree(&pdb_msg_pool, reject);
|
616
|
|
- reject = NULL;
|
|
620
|
+ /* Free the message */
|
|
621
|
+ chPoolFree(&pdb_msg_pool, not_supported);
|
|
622
|
+ not_supported = NULL;
|
617
|
623
|
|
618
|
624
|
/* If we got reset signaling, transition to default */
|
619
|
625
|
if (evt & PDB_EVT_PE_RESET) {
|
|
@@ -708,8 +714,8 @@ static THD_FUNCTION(PolicyEngine, vcfg) {
|
708
|
714
|
case PESinkSendSoftReset:
|
709
|
715
|
state = pe_sink_send_soft_reset(cfg);
|
710
|
716
|
break;
|
711
|
|
- case PESinkSendReject:
|
712
|
|
- state = pe_sink_send_reject(cfg);
|
|
717
|
+ case PESinkSendNotSupported:
|
|
718
|
+ state = pe_sink_send_not_supported(cfg);
|
713
|
719
|
break;
|
714
|
720
|
case PESinkSourceUnresponsive:
|
715
|
721
|
state = pe_sink_source_unresponsive(cfg);
|