diff options
author | Aseda Aboagye <aaboagye@google.com> | 2018-03-23 17:34:11 -0700 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2018-04-25 23:00:01 -0700 |
commit | 36980ec169795231ba5ddaba86decb2e05512581 (patch) | |
tree | 8088d09341c695b3fa4e7b97d30d80457677f516 /include/usb_pd.h | |
parent | d268930c7522f788efd5c507ad6dbcef2aab364a (diff) | |
download | chrome-ec-36980ec169795231ba5ddaba86decb2e05512581.tar.gz |
pd: Properly assign data role on reset
According to PD spec:
- Data role shall not be reset on soft reset.
- Data role shall be reset to power-role default on hard reset.
Implement the above. Even if both ports follow spec, it's still possible
for a data role conflict to occur if, for example, data role swap occurs
(data role mismatches power role default) followed by a hardware reset
of one port (such that data role gets reset to power role default).
Handle such cases by taking error recovery actions.
BUG=b:71333840,chromium:805040
TEST=Connect scarlet to powered Apple accessory, verify scarlet comes up
in SNK-DFP after soft reset and issuing "reboot" on EC console. After
issuing a hard reset, the port comes up in SNK-UFP (which is the
power-role default).
BRANCH=None
Signed-off-by: Shawn Nematbakhsh <shawnn@chromium.org>
Signed-off-by: Aseda Aboagye <aaboagye@google.com>
Change-Id: I65139f277d59a0612f8323d711080f52425ff5e7
Reviewed-on: https://chromium-review.googlesource.com/885462
Commit-Ready: Aseda Aboagye <aaboagye@chromium.org>
Tested-by: Aseda Aboagye <aaboagye@chromium.org>
Reviewed-by: Jett Rink <jettrink@chromium.org>
Reviewed-by: Vincent Palatin <vpalatin@chromium.org>
Diffstat (limited to 'include/usb_pd.h')
-rw-r--r-- | include/usb_pd.h | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/include/usb_pd.h b/include/usb_pd.h index 33a8c79121..acad78fb42 100644 --- a/include/usb_pd.h +++ b/include/usb_pd.h @@ -737,6 +737,7 @@ enum pd_states { /* Per-port battery backed RAM flags */ #define PD_BBRMFLG_EXPLICIT_CONTRACT (1 << 0) #define PD_BBRMFLG_POWER_ROLE (1 << 1) +#define PD_BBRMFLG_DATA_ROLE (1 << 2) enum pd_cc_states { PD_CC_NONE, @@ -915,11 +916,12 @@ enum pd_data_msg_type { ((id) << 9) | ((cnt) << 12) | ((ext) << 15)) /* Used for processing pd header */ -#define PD_HEADER_EXT(header) (((header) >> 15) & 1) -#define PD_HEADER_CNT(header) (((header) >> 12) & 7) -#define PD_HEADER_TYPE(header) ((header) & 0xF) -#define PD_HEADER_ID(header) (((header) >> 9) & 7) -#define PD_HEADER_REV(header) (((header) >> 6) & 3) +#define PD_HEADER_EXT(header) (((header) >> 15) & 1) +#define PD_HEADER_CNT(header) (((header) >> 12) & 7) +#define PD_HEADER_TYPE(header) ((header) & 0xF) +#define PD_HEADER_ID(header) (((header) >> 9) & 7) +#define PD_HEADER_REV(header) (((header) >> 6) & 3) +#define PD_HEADER_DROLE(header) (((header) >> 5) & 1) /* Used for processing pd extended header */ #define PD_EXT_HEADER_CHUNKED(header) (((header) >> 15) & 1) |