[usbdev] Add link state to handle resume to active
The new LinkResuming state gives a place for the FSM to park until it
sees a symbol that isn't part of the resume signaling. It's only after
seeing the end of resume that the module should begin tracking SOF.
Add the ability for software to direct the link state FSM to jump to
LinkResuming from LinkPowered. This enables software to recover an
active link state after going to deep sleep.
Convert the usbctrl wake_config regs to use the async attribute.
Prevent protocol engine from responding to transactions unless the link
is in one of the active states.
Signed-off-by: Alexander Williams <awill@google.com>
diff --git a/sw/device/lib/dif/dif_usbdev.c b/sw/device/lib/dif/dif_usbdev.c
index d4e2253..2aa08aa 100644
--- a/sw/device/lib/dif/dif_usbdev.c
+++ b/sw/device/lib/dif/dif_usbdev.c
@@ -725,20 +725,26 @@
USBDEV_USBSTAT_LINK_STATE_MASK, USBDEV_USBSTAT_LINK_STATE_OFFSET);
switch (val) {
- case USBDEV_USBSTAT_LINK_STATE_VALUE_DISCONNECT:
+ case USBDEV_USBSTAT_LINK_STATE_VALUE_DISCONNECTED:
*link_state = kDifUsbdevLinkStateDisconnected;
break;
case USBDEV_USBSTAT_LINK_STATE_VALUE_POWERED:
*link_state = kDifUsbdevLinkStatePowered;
break;
- case USBDEV_USBSTAT_LINK_STATE_VALUE_POWERED_SUSPEND:
- *link_state = kDifUsbdevLinkStatePoweredSuspend;
+ case USBDEV_USBSTAT_LINK_STATE_VALUE_POWERED_SUSPENDED:
+ *link_state = kDifUsbdevLinkStatePoweredSuspended;
break;
case USBDEV_USBSTAT_LINK_STATE_VALUE_ACTIVE:
*link_state = kDifUsbdevLinkStateActive;
break;
- case USBDEV_USBSTAT_LINK_STATE_VALUE_SUSPEND:
- *link_state = kDifUsbdevLinkStateSuspend;
+ case USBDEV_USBSTAT_LINK_STATE_VALUE_SUSPENDED:
+ *link_state = kDifUsbdevLinkStateSuspended;
+ break;
+ case USBDEV_USBSTAT_LINK_STATE_VALUE_ACTIVE_NOSOF:
+ *link_state = kDifUsbdevLinkStateActiveNoSof;
+ break;
+ case USBDEV_USBSTAT_LINK_STATE_VALUE_RESUMING:
+ *link_state = kDifUsbdevLinkStateResuming;
break;
default:
return kDifError;
diff --git a/sw/device/lib/dif/dif_usbdev.h b/sw/device/lib/dif/dif_usbdev.h
index 8322ea2..377effe 100644
--- a/sw/device/lib/dif/dif_usbdev.h
+++ b/sw/device/lib/dif/dif_usbdev.h
@@ -579,9 +579,11 @@
typedef enum dif_usbdev_link_state {
kDifUsbdevLinkStateDisconnected,
kDifUsbdevLinkStatePowered,
- kDifUsbdevLinkStatePoweredSuspend,
+ kDifUsbdevLinkStatePoweredSuspended,
kDifUsbdevLinkStateActive,
- kDifUsbdevLinkStateSuspend,
+ kDifUsbdevLinkStateSuspended,
+ kDifUsbdevLinkStateActiveNoSof,
+ kDifUsbdevLinkStateResuming,
} dif_usbdev_link_state_t;
/**