usb: pd: Send pending VDM message upon entering SNK/SRC_Ready
Entering SNK_Ready or SRC_Ready state from usbpd_set_state() is somewhat terminal as it is the end state of a contract negotiation. If there was a previous pending VDM message waiting to be sent, for example the start of a Discovery which was queued prior to a PR Swap, it would not get sent. Check for this and enqueue usbpd_sm once again so that it could be sent out. Otherwise, start the Discovery process in case we are in DFP mode, and do that for SNK_Ready as well. Change-Id: I4516ccb0deec8cdabdb62d539d7d2b66dc23f1ee Signed-off-by: Jack Pham <jackp@codeaurora.org>
This commit is contained in:
parent
7099c46a66
commit
e5f8604fdb
1 changed files with 15 additions and 8 deletions
|
@ -1140,14 +1140,13 @@ static void usbpd_set_state(struct usbpd *pd, enum usbpd_state next_state)
|
|||
|
||||
case PE_SRC_READY:
|
||||
pd->in_explicit_contract = true;
|
||||
if (pd->current_dr == DR_DFP) {
|
||||
/* don't start USB host until after SVDM discovery */
|
||||
if (pd->vdm_state == VDM_NONE)
|
||||
usbpd_send_svdm(pd, USBPD_SID,
|
||||
USBPD_SVDM_DISCOVER_IDENTITY,
|
||||
SVDM_CMD_TYPE_INITIATOR, 0,
|
||||
NULL, 0);
|
||||
}
|
||||
|
||||
if (pd->vdm_tx)
|
||||
kick_sm(pd, 0);
|
||||
else if (pd->current_dr == DR_DFP && pd->vdm_state == VDM_NONE)
|
||||
usbpd_send_svdm(pd, USBPD_SID,
|
||||
USBPD_SVDM_DISCOVER_IDENTITY,
|
||||
SVDM_CMD_TYPE_INITIATOR, 0, NULL, 0);
|
||||
|
||||
kobject_uevent(&pd->dev.kobj, KOBJ_CHANGE);
|
||||
complete(&pd->is_ready);
|
||||
|
@ -1282,6 +1281,14 @@ static void usbpd_set_state(struct usbpd *pd, enum usbpd_state next_state)
|
|||
|
||||
case PE_SNK_READY:
|
||||
pd->in_explicit_contract = true;
|
||||
|
||||
if (pd->vdm_tx)
|
||||
kick_sm(pd, 0);
|
||||
else if (pd->current_dr == DR_DFP && pd->vdm_state == VDM_NONE)
|
||||
usbpd_send_svdm(pd, USBPD_SID,
|
||||
USBPD_SVDM_DISCOVER_IDENTITY,
|
||||
SVDM_CMD_TYPE_INITIATOR, 0, NULL, 0);
|
||||
|
||||
kobject_uevent(&pd->dev.kobj, KOBJ_CHANGE);
|
||||
complete(&pd->is_ready);
|
||||
dual_role_instance_changed(pd->dual_role);
|
||||
|
|
Loading…
Add table
Reference in a new issue