From: Markus Armbruster Date: Fri, 15 Aug 2014 06:58:17 +0000 (+0200) Subject: boot: Fix boot order for SCSI target, lun > 9 X-Git-Tag: rel-1.7.5.1~6 X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=091f53e6cb8ee88577d1eb1be7285b9a42177e26;p=seabios.git boot: Fix boot order for SCSI target, lun > 9 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 (cherry picked from commit 275672eb70efdf81c51b997d41a4409b404aa8f6) --- diff --git a/src/boot.c b/src/boot.c index 133e206..e60ed3e 100644 --- a/src/boot.c +++ b/src/boot.c @@ -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)