Skip to content

Commit f756d0d

Browse files
Johan Carlssonkartben
authored andcommitted
usb-c: pe: set correct sink/src ready state.
policy engine errors were unconditionally setting the state back to sink ready. this fix sets the correct state based on the current power role. Signed-off-by: Johan Carlsson <johan.carlsson@teenage.engineering>
1 parent 9b021bc commit f756d0d

File tree

1 file changed

+23
-15
lines changed

1 file changed

+23
-15
lines changed

subsys/usb/usb_c/usbc_pe_common.c

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,20 @@ LOG_MODULE_DECLARE(usbc_stack, CONFIG_USBC_STACK_LOG_LEVEL);
1919

2020
static const struct smf_state pe_states[PE_STATE_COUNT];
2121

22+
/**
23+
* @brief Set the ready state for sink or source.
24+
*/
25+
static void pe_set_ready_state(const struct device *dev)
26+
{
27+
struct usbc_port_data *data = dev->data;
28+
29+
if (data->pe->power_role == TC_ROLE_SOURCE) {
30+
pe_set_state(dev, PE_SRC_READY);
31+
} else {
32+
pe_set_state(dev, PE_SNK_READY);
33+
}
34+
}
35+
2236
/**
2337
* @brief Handle common DPM requests
2438
*
@@ -315,7 +329,7 @@ void pe_report_error(const struct device *dev, const enum pe_error e,
315329
* Error during an Interruptible AMS.
316330
*/
317331
else {
318-
pe_set_state(dev, PE_SNK_READY);
332+
pe_set_ready_state(dev);
319333
}
320334
}
321335

@@ -775,7 +789,7 @@ static void pe_drs_evaluate_swap_run(void *obj)
775789
policy_notify(dev, (pe->data_role == TC_ROLE_UFP) ? DATA_ROLE_IS_UFP
776790
: DATA_ROLE_IS_DFP);
777791
}
778-
pe_set_state(dev, PE_SNK_READY);
792+
pe_set_ready_state(dev);
779793
} else if (atomic_test_and_clear_bit(pe->flags, PE_FLAGS_MSG_DISCARDED)) {
780794
/*
781795
* Inform Device Policy Manager that the message was
@@ -848,15 +862,15 @@ static void pe_drs_send_swap_run(void *obj)
848862
}
849863

850864
/* return to ready state */
851-
pe_set_state(dev, PE_SNK_READY);
865+
pe_set_ready_state(dev);
852866
return;
853867
} else if (atomic_test_and_clear_bit(pe->flags, PE_FLAGS_MSG_DISCARDED)) {
854868
/*
855869
* Inform Device Policy Manager that the message
856870
* was discarded
857871
*/
858872
policy_notify(dev, MSG_DISCARDED);
859-
pe_set_state(dev, PE_SNK_READY);
873+
pe_set_ready_state(dev);
860874
return;
861875
}
862876
}
@@ -912,19 +926,13 @@ void pe_get_sink_cap_run(void *obj)
912926
PD_CONVERT_BYTES_TO_PD_HEADER_COUNT(prl_rx->emsg.len);
913927

914928
policy_set_port_partner_snk_cap(dev, pdos, num_pdos);
915-
pe_set_state(dev, PE_SRC_READY);
916-
#else
917-
pe_set_state(dev, PE_SNK_READY);
918929
#endif
930+
pe_set_ready_state(dev);
919931
return;
920932
} else if (received_control_message(dev, header, PD_CTRL_REJECT) ||
921933
received_control_message(dev,
922934
header, PD_CTRL_NOT_SUPPORTED)) {
923-
#ifdef CONFIG_USBC_CSM_SOURCE_ONLY
924-
pe_set_state(dev, PE_SRC_READY);
925-
#else
926-
pe_set_state(dev, PE_SNK_READY);
927-
#endif
935+
pe_set_ready_state(dev);
928936
return;
929937
}
930938
/* Unexpected messages fall through to soft reset */
@@ -938,7 +946,7 @@ void pe_get_sink_cap_run(void *obj)
938946
*/
939947
else if (atomic_test_and_clear_bit(pe->flags, PE_FLAGS_MSG_DISCARDED)) {
940948
policy_notify(dev, MSG_DISCARDED);
941-
pe_set_state(dev, PE_SNK_READY);
949+
pe_set_ready_state(dev);
942950
return;
943951
}
944952
}
@@ -1057,7 +1065,7 @@ static void pe_send_soft_reset_run(void *obj)
10571065
if (atomic_test_and_clear_bit(pe->flags, PE_FLAGS_MSG_DISCARDED)) {
10581066
/* Inform Device Policy Manager that the message was discarded */
10591067
policy_notify(dev, MSG_DISCARDED);
1060-
pe_set_state(dev, PE_SNK_READY);
1068+
pe_set_ready_state(dev);
10611069
} else if (atomic_test_and_clear_bit(pe->flags, PE_FLAGS_MSG_RECEIVED)) {
10621070
/*
10631071
* The Policy Engine Shall transition to the PE_SNK_Wait_for_Capabilities
@@ -1109,7 +1117,7 @@ static void pe_send_not_supported_run(void *obj)
11091117
atomic_test_bit(pe->flags, PE_FLAGS_MSG_DISCARDED)) {
11101118
atomic_clear_bit(pe->flags, PE_FLAGS_TX_COMPLETE);
11111119
atomic_clear_bit(pe->flags, PE_FLAGS_MSG_DISCARDED);
1112-
pe_set_state(dev, PE_SNK_READY);
1120+
pe_set_ready_state(dev);
11131121
}
11141122
}
11151123

0 commit comments

Comments
 (0)