From 7b6765ff1b13f088f2ac41556b8639a35bd6b893 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Mon, 16 Mar 2015 05:39:14 +0000 Subject: [PATCH] [usb] Add the concept of a USB bus maximum transfer size Signed-off-by: Michael Brown --- src/drivers/bus/usb.c | 4 +++- src/drivers/usb/xhci.c | 2 +- src/drivers/usb/xhci.h | 3 +++ src/include/ipxe/usb.h | 6 +++++- 4 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/drivers/bus/usb.c b/src/drivers/bus/usb.c index 22a57e6e..57a25332 100644 --- a/src/drivers/bus/usb.c +++ b/src/drivers/bus/usb.c @@ -1736,11 +1736,12 @@ void free_usb_hub ( struct usb_hub *hub ) { * * @v dev Underlying hardware device * @v ports Number of root hub ports + * @v mtu Largest transfer allowed on the bus * @v op Host controller operations * @ret bus USB bus, or NULL on allocation failure */ struct usb_bus * alloc_usb_bus ( struct device *dev, unsigned int ports, - struct usb_host_operations *op ) { + size_t mtu, struct usb_host_operations *op ) { struct usb_bus *bus; /* Allocate and initialise structure */ @@ -1749,6 +1750,7 @@ struct usb_bus * alloc_usb_bus ( struct device *dev, unsigned int ports, goto err_alloc_bus; bus->name = dev->name; bus->dev = dev; + bus->mtu = mtu; bus->op = op; INIT_LIST_HEAD ( &bus->devices ); INIT_LIST_HEAD ( &bus->hubs ); diff --git a/src/drivers/usb/xhci.c b/src/drivers/usb/xhci.c index 5d067bd0..34290774 100644 --- a/src/drivers/usb/xhci.c +++ b/src/drivers/usb/xhci.c @@ -3117,7 +3117,7 @@ static int xhci_probe ( struct pci_device *pci ) { goto err_reset; /* Allocate USB bus */ - xhci->bus = alloc_usb_bus ( &pci->dev, xhci->ports, + xhci->bus = alloc_usb_bus ( &pci->dev, xhci->ports, XHCI_MTU, &xhci_operations ); if ( ! xhci->bus ) { rc = -ENOMEM; diff --git a/src/drivers/usb/xhci.h b/src/drivers/usb/xhci.h index 269f50b8..30320807 100644 --- a/src/drivers/usb/xhci.h +++ b/src/drivers/usb/xhci.h @@ -24,6 +24,9 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); */ #define XHCI_MIN_ALIGN 64 +/** Maximum transfer size */ +#define XHCI_MTU 65536 + /** xHCI PCI BAR */ #define XHCI_BAR PCI_BASE_ADDRESS_0 diff --git a/src/include/ipxe/usb.h b/src/include/ipxe/usb.h index 59661f70..fd027d18 100644 --- a/src/include/ipxe/usb.h +++ b/src/include/ipxe/usb.h @@ -865,6 +865,9 @@ struct usb_bus { /** Host controller operations set */ struct usb_host_operations *op; + /** Largest transfer allowed on the bus */ + size_t mtu; + /** Root hub */ struct usb_hub *hub; @@ -1138,7 +1141,8 @@ extern void free_usb_hub ( struct usb_hub *hub ); extern void usb_port_changed ( struct usb_port *port ); -extern struct usb_bus * alloc_usb_bus ( struct device *dev, unsigned int ports, +extern struct usb_bus * alloc_usb_bus ( struct device *dev, + unsigned int ports, size_t mtu, struct usb_host_operations *op ); extern int register_usb_bus ( struct usb_bus *bus ); extern void unregister_usb_bus ( struct usb_bus *bus );