summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJack Pham <jackp@codeaurora.org>2016-11-05 10:55:38 -0700
committerJack Pham <jackp@codeaurora.org>2016-11-23 15:03:14 -0800
commit019cc2089be324bf435a6cebd75888ada22ee4c5 (patch)
tree59dcb0cdaa5016ab321cea2ad5aef275ea827758
parent8f5b031e11be5bfc3bd58a79a27ac25c8988ddaf (diff)
usb: pd: Reset msgid counters properly
Make sure to reset both Tx and Rx msgid counters when the protocol layer needs to be reset. This occurs after hard/soft reset as well as when starting up a new sink or source session. Put this in a common function pd_reset_protocol(). Change-Id: I643a60a28e6498ca16b6f46293b8aa05eff40266 Signed-off-by: Jack Pham <jackp@codeaurora.org>
-rw-r--r--drivers/usb/pd/policy_engine.c25
1 files changed, 15 insertions, 10 deletions
diff --git a/drivers/usb/pd/policy_engine.c b/drivers/usb/pd/policy_engine.c
index 0c9fe4131943..a14f407fa583 100644
--- a/drivers/usb/pd/policy_engine.c
+++ b/drivers/usb/pd/policy_engine.c
@@ -412,6 +412,17 @@ static struct usbpd_svid_handler *find_svid_handler(struct usbpd *pd, u16 svid)
return NULL;
}
+/* Reset protocol layer */
+static inline void pd_reset_protocol(struct usbpd *pd)
+{
+ /*
+ * first Rx ID should be 0; set this to a sentinel of -1 so that in
+ * phy_msg_received() we can check if we had seen it before.
+ */
+ pd->rx_msgid = -1;
+ pd->tx_msgid = 0;
+}
+
static int pd_send_msg(struct usbpd *pd, u8 hdr_type, const u32 *data,
size_t num_data, enum pd_msg_type type)
{
@@ -654,7 +665,7 @@ static void usbpd_set_state(struct usbpd *pd, enum usbpd_state next_state)
power_supply_set_property(pd->usb_psy,
POWER_SUPPLY_PROP_TYPEC_POWER_ROLE, &val);
- pd->rx_msgid = -1;
+ pd_reset_protocol(pd);
if (!pd->in_pr_swap) {
if (pd->pd_phy_opened) {
@@ -771,9 +782,7 @@ static void usbpd_set_state(struct usbpd *pd, enum usbpd_state next_state)
case PE_SRC_SEND_SOFT_RESET:
case PE_SNK_SEND_SOFT_RESET:
- /* Reset protocol layer */
- pd->tx_msgid = 0;
- pd->rx_msgid = -1;
+ pd_reset_protocol(pd);
ret = pd_send_msg(pd, MSG_SOFT_RESET, NULL, 0, SOP_MSG);
if (ret) {
@@ -815,9 +824,7 @@ static void usbpd_set_state(struct usbpd *pd, enum usbpd_state next_state)
if (!val.intval)
break;
- /* Reset protocol layer */
- pd->tx_msgid = 0;
- pd->rx_msgid = -1;
+ pd_reset_protocol(pd);
if (!pd->in_pr_swap) {
if (pd->pd_phy_opened) {
@@ -1894,9 +1901,7 @@ static void usbpd_sm(struct work_struct *w)
case PE_SRC_SOFT_RESET:
case PE_SNK_SOFT_RESET:
- /* Reset protocol layer */
- pd->tx_msgid = 0;
- pd->rx_msgid = -1;
+ pd_reset_protocol(pd);
ret = pd_send_msg(pd, MSG_ACCEPT, NULL, 0, SOP_MSG);
if (ret) {