usb_c: Transition to Sink Ready on sender response timeout
Transition to pe_snk_ready state from pe_drs_send_swap_run, on sender response timeout Signed-off-by: Sam Hurst <sbh1187@gmail.com>
This commit is contained in:
parent
24e18d46f1
commit
3af2752680
|
@ -109,6 +109,10 @@ enum usbc_policy_notify_t {
|
||||||
POWER_CHANGE_1A5,
|
POWER_CHANGE_1A5,
|
||||||
/** Sink SubPower state a 5V / 3A */
|
/** Sink SubPower state a 5V / 3A */
|
||||||
POWER_CHANGE_3A0,
|
POWER_CHANGE_3A0,
|
||||||
|
/** Sender Response Timeout */
|
||||||
|
SENDER_RESPONSE_TIMEOUT,
|
||||||
|
/** Source Capabilities Received */
|
||||||
|
SOURCE_CAPABILITIES_RECEIVED,
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -702,10 +702,9 @@ void pe_drs_send_swap_run(void *obj)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Transition to PE_SNK_READY on SenderResponseTimer timeout */
|
||||||
if (usbc_timer_expired(&pe->pd_t_sender_response)) {
|
if (usbc_timer_expired(&pe->pd_t_sender_response)) {
|
||||||
/* Protocol Error */
|
pe_set_state(dev, PE_SNK_READY);
|
||||||
policy_notify(dev, PROTOCOL_ERROR);
|
|
||||||
pe_send_soft_reset(dev, PD_PACKET_SOP);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -177,6 +177,9 @@ void pe_snk_evaluate_capability_entry(void *obj)
|
||||||
|
|
||||||
LOG_INF("PE_SNK_Evaluate_Capability");
|
LOG_INF("PE_SNK_Evaluate_Capability");
|
||||||
|
|
||||||
|
/* Inform the DPM of the reception of the source capabilities */
|
||||||
|
policy_notify(dev, SOURCE_CAPABILITIES_RECEIVED);
|
||||||
|
|
||||||
header = prl_rx->emsg.header;
|
header = prl_rx->emsg.header;
|
||||||
|
|
||||||
/* Reset Hard Reset counter to zero */
|
/* Reset Hard Reset counter to zero */
|
||||||
|
@ -606,7 +609,12 @@ void pe_snk_get_source_cap_entry(void *obj)
|
||||||
|
|
||||||
LOG_INF("PE_SNK_Get_Source_Cap");
|
LOG_INF("PE_SNK_Get_Source_Cap");
|
||||||
|
|
||||||
/* Send a Get_Source_Cap Message */
|
/*
|
||||||
|
* On entry to the PE_SNK_Get_Source_Cap state the Policy Engine
|
||||||
|
* Shall request the Protocol Layer to send a get Source
|
||||||
|
* Capabilities message in order to retrieve the Source’s
|
||||||
|
* capabilities.
|
||||||
|
*/
|
||||||
pe_send_ctrl_msg(dev, PD_PACKET_SOP, PD_CTRL_GET_SOURCE_CAP);
|
pe_send_ctrl_msg(dev, PD_PACKET_SOP, PD_CTRL_GET_SOURCE_CAP);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -619,12 +627,34 @@ void pe_snk_get_source_cap_run(void *obj)
|
||||||
const struct device *dev = pe->dev;
|
const struct device *dev = pe->dev;
|
||||||
struct usbc_port_data *data = dev->data;
|
struct usbc_port_data *data = dev->data;
|
||||||
struct protocol_layer_rx_t *prl_rx = data->prl_rx;
|
struct protocol_layer_rx_t *prl_rx = data->prl_rx;
|
||||||
|
union pd_header header;
|
||||||
|
|
||||||
/* Wait until message is sent or dropped */
|
/* Wait until message is sent or dropped */
|
||||||
if (atomic_test_and_clear_bit(pe->flags, PE_FLAGS_TX_COMPLETE)) {
|
if (atomic_test_and_clear_bit(pe->flags, PE_FLAGS_TX_COMPLETE)) {
|
||||||
|
/* The Policy Engine Shall then start the SenderResponseTimer. */
|
||||||
|
usbc_timer_start(&pe->pd_t_sender_response);
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* The Policy Engine Shall transition to the PE_SNK_Evaluate_Capability
|
||||||
|
* State when:
|
||||||
|
* 1: In SPR Mode and SPR Source Capabilities were requested and
|
||||||
|
* a Source_Capabilities Message is received
|
||||||
|
*/
|
||||||
|
else if (atomic_test_and_clear_bit(pe->flags, PE_FLAGS_MSG_RECEIVED)) {
|
||||||
|
header = prl_rx->emsg.header;
|
||||||
|
|
||||||
|
if (received_control_message(dev, header, PD_DATA_SOURCE_CAP)) {
|
||||||
|
pe_set_state(dev, PE_SNK_EVALUATE_CAPABILITY);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* The Policy Engine Shall transition to the PE_SNK_Ready state when:
|
||||||
|
* 1: The SenderResponseTimer times out.
|
||||||
|
*/
|
||||||
|
else if (usbc_timer_expired(&pe->pd_t_sender_response)) {
|
||||||
pe_set_state(dev, PE_SNK_READY);
|
pe_set_state(dev, PE_SNK_READY);
|
||||||
} else if (atomic_test_and_clear_bit(pe->flags, PE_FLAGS_MSG_DISCARDED)) {
|
/* Inform the DPM of the sender response timeout */
|
||||||
pe_send_soft_reset(dev, prl_rx->emsg.type);
|
policy_notify(dev, SENDER_RESPONSE_TIMEOUT);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue