]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[usb] Report xHCI host controller events
authorMichael Brown <mcb30@ipxe.org>
Thu, 5 Feb 2015 12:40:05 +0000 (12:40 +0000)
committerMichael Brown <mcb30@ipxe.org>
Thu, 5 Feb 2015 12:40:05 +0000 (12:40 +0000)
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/drivers/usb/xhci.c
src/drivers/usb/xhci.h

index b36e77991aa5c950d2740b24d7aea08b7adbdc9d..cdebc47da2d42f326f21b35f11f96176e33effae 100644 (file)
@@ -1615,6 +1615,22 @@ static void xhci_port_status ( struct xhci_device *xhci,
        usb_port_changed ( usb_port ( xhci->bus->hub, port->port ) );
 }
 
+/**
+ * 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
  *
@@ -1656,6 +1672,10 @@ static void xhci_event_poll ( struct xhci_device *xhci ) {
                        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 );
index b9f6d9feba390efca364e4e9fcd44cb579e65124..7f768aa0a090b62f3a1589d224cbe0946b78142d 100644 (file)
@@ -649,6 +649,25 @@ struct xhci_trb_port_status {
 /** 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 @@ union xhci_trb {
        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 */