[usb] Report xHCI host controller events

Signed-off-by: Michael Brown <mcb30@ipxe.org>
pull/34/head
Michael Brown 2015-02-05 12:40:05 +00:00
parent cc5a27f9cb
commit 66048e3214
2 changed files with 41 additions and 0 deletions

View File

@ -1615,6 +1615,22 @@ static void xhci_port_status ( struct xhci_device *xhci,
usb_port_changed ( usb_port ( xhci->bus->hub, port->port ) ); 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 * Poll event ring
* *
@ -1656,6 +1672,10 @@ static void xhci_event_poll ( struct xhci_device *xhci ) {
xhci_port_status ( xhci, &trb->port ); xhci_port_status ( xhci, &trb->port );
break; break;
case XHCI_TRB_HOST_CONTROLLER:
xhci_host_controller ( xhci, &trb->host );
break;
default: default:
DBGC ( xhci, "XHCI %p unrecognised event %#x\n:", DBGC ( xhci, "XHCI %p unrecognised event %#x\n:",
xhci, event->cons ); xhci, event->cons );

View File

@ -649,6 +649,25 @@ struct xhci_trb_port_status {
/** A port status change transfer request block */ /** A port status change transfer request block */
#define XHCI_TRB_PORT_STATUS XHCI_TRB_TYPE ( 34 ) #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 */ /** A transfer request block */
union xhci_trb { union xhci_trb {
/** Template */ /** Template */
@ -683,6 +702,8 @@ union xhci_trb {
struct xhci_trb_complete complete; struct xhci_trb_complete complete;
/** Port status changed event */ /** Port status changed event */
struct xhci_trb_port_status port; struct xhci_trb_port_status port;
/** Host controller event */
struct xhci_trb_host_controller host;
} __attribute__ (( packed )); } __attribute__ (( packed ));
/** An input control context */ /** An input control context */