[usb] Report xHCI host controller events
Signed-off-by: Michael Brown <mcb30@ipxe.org>
diff --git a/src/drivers/usb/xhci.c b/src/drivers/usb/xhci.c
index b36e779..cdebc47 100644
--- a/src/drivers/usb/xhci.c
+++ b/src/drivers/usb/xhci.c
@@ -1616,6 +1616,22 @@
}
/**
+ * Handle host controller event
+ *
+ * @v xhci xHCI device
+ * @v host Host controller event
+ */
+static void xhci_host_controller ( struct xhci_device *xhci,
+ struct xhci_trb_host_controller *host ) {
+ int rc;
+
+ /* Construct error */
+ rc = -ECODE ( host->code );
+ DBGC ( xhci, "XHCI %p host controller event (code %d): %s\n",
+ xhci, host->code, strerror ( rc ) );
+}
+
+/**
* Poll event ring
*
* @v xhci xHCI device
@@ -1656,6 +1672,10 @@
xhci_port_status ( xhci, &trb->port );
break;
+ case XHCI_TRB_HOST_CONTROLLER:
+ xhci_host_controller ( xhci, &trb->host );
+ break;
+
default:
DBGC ( xhci, "XHCI %p unrecognised event %#x\n:",
xhci, event->cons );
diff --git a/src/drivers/usb/xhci.h b/src/drivers/usb/xhci.h
index b9f6d9f..7f768aa 100644
--- a/src/drivers/usb/xhci.h
+++ b/src/drivers/usb/xhci.h
@@ -649,6 +649,25 @@
/** A port status change transfer request block */
#define XHCI_TRB_PORT_STATUS XHCI_TRB_TYPE ( 34 )
+/** A port status change transfer request block */
+struct xhci_trb_host_controller {
+ /** Reserved */
+ uint64_t reserved_a;
+ /** Reserved */
+ uint8_t reserved_b[3];
+ /** Completion code */
+ uint8_t code;
+ /** Flags */
+ uint8_t flags;
+ /** Type */
+ uint8_t type;
+ /** Reserved */
+ uint16_t reserved_c;
+} __attribute__ (( packed ));
+
+/** A port status change transfer request block */
+#define XHCI_TRB_HOST_CONTROLLER XHCI_TRB_TYPE ( 37 )
+
/** A transfer request block */
union xhci_trb {
/** Template */
@@ -683,6 +702,8 @@
struct xhci_trb_complete complete;
/** Port status changed event */
struct xhci_trb_port_status port;
+ /** Host controller event */
+ struct xhci_trb_host_controller host;
} __attribute__ (( packed ));
/** An input control context */