[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 */