]> xenbits.xensource.com Git - seabios.git/commitdiff
usb: add hub portmap
authorGerd Hoffmann <kraxel@redhat.com>
Tue, 18 Jul 2017 11:15:25 +0000 (13:15 +0200)
committerGerd Hoffmann <kraxel@redhat.com>
Tue, 25 Jul 2017 11:00:50 +0000 (13:00 +0200)
Allow usb hubs to map (software) ports to physical ports via op
callback.  This is needed to make bootorder work in case there
isn't a simple linear mapping.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
src/boot.c
src/hw/usb.h

index 59623fb63dfa48cc878eb36a38bf2dc8b790b17e..834ac3f3c55d1161311de5422c1b979127a9b8c9 100644 (file)
@@ -207,6 +207,13 @@ int bootprio_find_named_rom(const char *name, int instance)
     return find_prio(desc);
 }
 
+static int usb_portmap(struct usbdevice_s *usbdev)
+{
+    if (usbdev->hub->op->portmap)
+        return usbdev->hub->op->portmap(usbdev->hub, usbdev->port);
+    return usbdev->port + 1;
+}
+
 static char *
 build_usb_path(char *buf, int max, struct usbhub_s *hub)
 {
@@ -214,7 +221,7 @@ build_usb_path(char *buf, int max, struct usbhub_s *hub)
         // Root hub - nothing to add.
         return buf;
     char *p = build_usb_path(buf, max, hub->usbdev->hub);
-    p += snprintf(p, buf+max-p, "/hub@%x", hub->usbdev->port+1);
+    p += snprintf(p, buf+max-p, "/hub@%x", usb_portmap(hub->usbdev));
     return p;
 }
 
@@ -227,12 +234,12 @@ int bootprio_find_usb(struct usbdevice_s *usbdev, int lun)
     p = build_pci_path(desc, sizeof(desc), "usb", usbdev->hub->cntl->pci);
     p = build_usb_path(p, desc+sizeof(desc)-p, usbdev->hub);
     snprintf(p, desc+sizeof(desc)-p, "/storage@%x/*@0/*@0,%x"
-             , usbdev->port+1, lun);
+             , usb_portmap(usbdev), lun);
     int ret = find_prio(desc);
     if (ret >= 0)
         return ret;
     // Try usb-host/redir - for example: /pci@i0cf8/usb@1,2/usb-host@1
-    snprintf(p, desc+sizeof(desc)-p, "/usb-*@%x", usbdev->port+1);
+    snprintf(p, desc+sizeof(desc)-p, "/usb-*@%x", usb_portmap(usbdev));
     return find_prio(desc);
 }
 
index 94e12b20dd8bb9fb8893e3d1167eec559a673bed..2cfb5721775af804f272a260725b5ddb73f82d09 100644 (file)
@@ -56,6 +56,7 @@ struct usbhub_s {
 struct usbhub_op_s {
     int (*detect)(struct usbhub_s *hub, u32 port);
     int (*reset)(struct usbhub_s *hub, u32 port);
+    int (*portmap)(struct usbhub_s *hub, u32 port);
     void (*disconnect)(struct usbhub_s *hub, u32 port);
 };