summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMichael Brown2015-03-16 06:39:14 +0100
committerMichael Brown2015-03-16 16:40:53 +0100
commit7b6765ff1b13f088f2ac41556b8639a35bd6b893 (patch)
tree0b9fda41653e73a378aeb5fb99d473672722da34 /src
parent[libc] Add ffs(), ffsl(), and ffsll() (diff)
downloadipxe-7b6765ff1b13f088f2ac41556b8639a35bd6b893.tar.gz
ipxe-7b6765ff1b13f088f2ac41556b8639a35bd6b893.tar.xz
ipxe-7b6765ff1b13f088f2ac41556b8639a35bd6b893.zip
[usb] Add the concept of a USB bus maximum transfer size
Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src')
-rw-r--r--src/drivers/bus/usb.c4
-rw-r--r--src/drivers/usb/xhci.c2
-rw-r--r--src/drivers/usb/xhci.h3
-rw-r--r--src/include/ipxe/usb.h6
4 files changed, 12 insertions, 3 deletions
diff --git a/src/drivers/bus/usb.c b/src/drivers/bus/usb.c
index 22a57e6e5..57a253320 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 5d067bd05..34290774a 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 269f50b82..303208071 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 59661f701..fd027d188 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 );