diff options
author | Diana Z <dzigterman@chromium.org> | 2021-12-03 10:58:05 -0700 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2021-12-07 19:50:42 +0000 |
commit | cd70a21773c7aee45fdb152c1da2830670aa25f6 (patch) | |
tree | 624cd1c0057ef2547ba56099532ead27ad238fa3 | |
parent | 448e1a573b70a5f4db5c780448aa00eec55559eb (diff) | |
download | chrome-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.c | 40 |
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: |