]> xenbits.xensource.com Git - seabios.git/commitdiff
boot: Fix boot order for SCSI target, lun > 9
authorMarkus Armbruster <armbru@redhat.com>
Fri, 15 Aug 2014 06:58:17 +0000 (08:58 +0200)
committerGerd Hoffmann <kraxel@redhat.com>
Tue, 26 Aug 2014 08:16:08 +0000 (10:16 +0200)
We identify devices by their Open Firmware device paths.  The path
component for the logical unit on a bus is incorrect:
bootprio_find_scsi_device() and bootprio_find_usb() format target
(a.k.a. SCSI ID) and lun in decimal, while QEMU uses hexadecimal.
Bootorder list entries with target, lun > 9 aren't found (lucky case),
or attributed to the wrong logical unit (unlucky case).

The relevant spec[*] agrees with QEMU (and OVMF, for that matter).
Change %d to %x.

No actual impact on USB, because QEMU only uses LUN 0 there.

RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=1096560

[*] Open Firmware Recommended Practice: SCSI-3 Parallel Interface,
Version 1, Section 3.1 Physical Address Formats and Representations
http://www.openfirmware.org/1275/practice/spi/spi1_0.ps
IEEE Standard for Boot (Initialization Configuration) Firmware: Core
Requirements and Practices, IEEE Std 1275-1994, Annex E SCSI host
adapter package class, section E.2.1 Physical address formats and
representations

Signed-off-by: Markus Armbruster <armbru@redhat.com>
(cherry picked from commit 275672eb70efdf81c51b997d41a4409b404aa8f6)

src/boot.c

index 133e2063f2adffb30f804336318ceb38b87ef412..e60ed3e6f2e63a6d1b0ee45346904e0badcc6ce1 100644 (file)
@@ -145,7 +145,7 @@ int bootprio_find_scsi_device(struct pci_device *pci, int target, int lun)
     // Find scsi drive - for example: /pci@i0cf8/scsi@5/channel@0/disk@1,0
     char desc[256], *p;
     p = build_pci_path(desc, sizeof(desc), "*", pci);
-    snprintf(p, desc+sizeof(desc)-p, "/*@0/*@%d,%d", target, lun);
+    snprintf(p, desc+sizeof(desc)-p, "/*@0/*@%x,%x", target, lun);
     return find_prio(desc);
 }
 
@@ -224,7 +224,7 @@ int bootprio_find_usb(struct usbdevice_s *usbdev, int lun)
     char desc[256], *p;
     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,%d"
+    snprintf(p, desc+sizeof(desc)-p, "/storage@%x/*@0/*@0,%x"
              , usbdev->port+1, lun);
     int ret = find_prio(desc);
     if (ret >= 0)