summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDiana Z <dzigterman@chromium.org>2021-12-03 10:58:05 -0700
committerCommit Bot <commit-bot@chromium.org>2021-12-07 19:50:42 +0000
commitcd70a21773c7aee45fdb152c1da2830670aa25f6 (patch)
tree624cd1c0057ef2547ba56099532ead27ad238fa3
parent448e1a573b70a5f4db5c780448aa00eec55559eb (diff)
downloadchrome-ec-cd70a21773c7aee45fdb152c1da2830670aa25f6.tar.gz
TCPMv2: Refactor retimer update for USB MUX task
Now that mux sets may be completed in the USB_MUX task on boards which enable it, refactor the retimer update mux get to wait when sets are pending. When sets are pending, the HOOKS task can come in later and fill in the last_result with the mux state. Additionally, set and validate cur_port any time an op comes in and is then processed by the PD task. BRANCH=None BUG=b:208355638 TEST=on brya, ensure retimer FW update passes Signed-off-by: Diana Z <dzigterman@chromium.org> Change-Id: Ied8ed1d90d1a2ea90b79ff4021ed77b858a65431 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3315216 Reviewed-by: Abe Levkoy <alevkoy@chromium.org>
-rw-r--r--common/usbc/usb_retimer_fw_update.c40
1 files changed, 34 insertions, 6 deletions
diff --git a/common/usbc/usb_retimer_fw_update.c b/common/usbc/usb_retimer_fw_update.c
index 1ff198c78f..87a8f786c5 100644
--- a/common/usbc/usb_retimer_fw_update.c
+++ b/common/usbc/usb_retimer_fw_update.c
@@ -96,8 +96,29 @@ static inline mux_state_t retimer_fw_update_usb_mux_get(int port)
return usb_mux_get(port) & USB_RETIMER_FW_UPDATE_MUX_MASK;
}
+/* Allow mux results to be filled in during HOOKS if needed */
+static void last_result_mux_get(void);
+DECLARE_DEFERRED(last_result_mux_get);
+
+static void last_result_mux_get(void)
+{
+ if (!usb_mux_set_completed(cur_port)) {
+ hook_call_deferred(&last_result_mux_get_data, 20 * MSEC);
+ return;
+ }
+
+ last_result = retimer_fw_update_usb_mux_get(cur_port);
+}
+
void usb_retimer_fw_update_process_op_cb(int port)
{
+ bool result_mux_get = false;
+
+ if (port != cur_port) {
+ CPRINTS("Unexpected FW op: port %d, cur %d", port, cur_port);
+ return;
+ }
+
switch (last_op) {
case USB_RETIMER_FW_UPDATE_SUSPEND_PD:
last_result = 0;
@@ -123,30 +144,37 @@ void usb_retimer_fw_update_process_op_cb(int port)
pd_set_suspend(port, RESUME);
break;
case USB_RETIMER_FW_UPDATE_GET_MUX:
- last_result = retimer_fw_update_usb_mux_get(port);
+ result_mux_get = true;
break;
case USB_RETIMER_FW_UPDATE_SET_USB:
usb_mux_set(port, USB_PD_MUX_USB_ENABLED,
USB_SWITCH_CONNECT, pd_get_polarity(port));
- last_result = retimer_fw_update_usb_mux_get(port);
+ result_mux_get = true;
break;
case USB_RETIMER_FW_UPDATE_SET_SAFE:
usb_mux_set_safe_mode(port);
- last_result = retimer_fw_update_usb_mux_get(port);
+ result_mux_get = true;
break;
case USB_RETIMER_FW_UPDATE_SET_TBT:
usb_mux_set(port, USB_PD_MUX_TBT_COMPAT_ENABLED,
USB_SWITCH_CONNECT, pd_get_polarity(port));
- last_result = retimer_fw_update_usb_mux_get(port);
+ result_mux_get = true;
break;
case USB_RETIMER_FW_UPDATE_DISCONNECT:
usb_mux_set(port, USB_PD_MUX_NONE,
USB_SWITCH_DISCONNECT, pd_get_polarity(port));
- last_result = retimer_fw_update_usb_mux_get(port);
+ result_mux_get = true;
break;
default:
break;
}
+
+ /*
+ * Fill in our mux result if available, or set up a deferred retrieval
+ * if the set is still pending.
+ */
+ if (result_mux_get)
+ last_result_mux_get();
}
void usb_retimer_fw_update_process_op(int port, int op)
@@ -158,6 +186,7 @@ void usb_retimer_fw_update_process_op(int port, int op)
* not change cur_port if retimer scan is in progress
*/
last_op = op;
+ cur_port = port;
switch (op) {
case USB_RETIMER_FW_UPDATE_QUERY_PORT:
@@ -169,7 +198,6 @@ void usb_retimer_fw_update_process_op(int port, int op)
break;
case USB_RETIMER_FW_UPDATE_SUSPEND_PD:
case USB_RETIMER_FW_UPDATE_RESUME_PD:
- cur_port = port;
tc_usb_firmware_fw_update_run(port);
break;
case USB_RETIMER_FW_UPDATE_SET_USB: