aboutsummaryrefslogtreecommitdiff
path: root/payloads/libpayload/include/usb/usb.h
diff options
context:
space:
mode:
Diffstat (limited to 'payloads/libpayload/include/usb/usb.h')
-rw-r--r--payloads/libpayload/include/usb/usb.h19
1 files changed, 18 insertions, 1 deletions
diff --git a/payloads/libpayload/include/usb/usb.h b/payloads/libpayload/include/usb/usb.h
index fc3ce5a50f..3aac2aee6c 100644
--- a/payloads/libpayload/include/usb/usb.h
+++ b/payloads/libpayload/include/usb/usb.h
@@ -115,7 +115,7 @@ struct usbdev {
typedef enum { OHCI = 0, UHCI = 1, EHCI = 2, XHCI = 3} hc_type;
struct usbdev_hc {
- struct usbdev_hc *next;
+ hci_t *next;
pcidev_t bus_address;
u32 reg_base;
hc_type type;
@@ -143,6 +143,20 @@ struct usbdev_hc {
void (*destroy_intr_queue) (endpoint_t *ep, void *queue);
u8* (*poll_intr_queue) (void *queue);
void *instance;
+
+ /* set_address(): Tell the usb device its address and
+ return it. xHCI controllers want to
+ do this by themself. Also, the usbdev
+ structure has to be allocated and
+ initialized. */
+ int (*set_address) (hci_t *controller, int speed, int hubport, int hubaddr);
+ /* finish_device_config(): Another hook for xHCI,
+ returns 0 on success. */
+ int (*finish_device_config) (usbdev_t *dev);
+ /* destroy_device(): Finally, destroy all structures that
+ were allocated during set_address()
+ and finish_device_config(). */
+ void (*destroy_device) (hci_t *controller, int devaddr);
};
typedef struct {
@@ -250,6 +264,9 @@ gen_bmRequestType (dev_req_dir dir, dev_req_type type, dev_req_recp recp)
return (dir << 7) | (type << 5) | recp;
}
+/* default "set address" handler */
+int generic_set_address (hci_t *controller, int speed, int hubport, int hubaddr);
+
void usb_detach_device(hci_t *controller, int devno);
int usb_attach_device(hci_t *controller, int hubaddress, int port, int speed);