[SeaBIOS] [PATCH] scsi: do not send MODE SENSE except to QEMU disks
Dave Frodin
dave at camp.se-eng.com
Mon Mar 5 16:09:06 CET 2012
Paolo,
I tested your patch.
It works with all 14 USB thumbdrives and with a USB-to-SATA
adapter we dug up.
Dave
----- Original Message -----
> From: "Paolo Bonzini" <pbonzini at redhat.com>
> To: seabios at seabios.org
> Cc: "Dave Frodin" <dave at camp.se-eng.com>
> Sent: Monday, March 5, 2012 4:29:12 AM
> Subject: [PATCH] scsi: do not send MODE SENSE except to QEMU disks
>
> This is the simplest way to avoid breaking boot on USB sticks that
> stall when asked for the MODE SENSE page 4. Some old sticks do
> not support the MODE SENSE command at all and just return a
> "medium may have changed" unit attention condition when SeaBIOS
> sends it!
>
> Reported-by: Dave Frodin <dave at camp.se-eng.com>
> Signed-off-by: Paolo Bonzini <pbonzini at redhat.com>
> ---
> src/blockcmd.c | 36 +++++++++++++++++++++++-------------
> 1 files changed, 23 insertions(+), 13 deletions(-)
>
> diff --git a/src/blockcmd.c b/src/blockcmd.c
> index 2769573..b4a1e37 100644
> --- a/src/blockcmd.c
> +++ b/src/blockcmd.c
> @@ -139,19 +139,29 @@ scsi_init_drive(struct drive_s *drive, const
> char *s, int prio)
> dprintf(1, "%s blksize=%d sectors=%d\n"
> , s, drive->blksize, (unsigned)drive->sectors);
>
> - struct cdbres_mode_sense_geom geomdata;
> - ret = cdb_mode_sense_geom(&dop, &geomdata);
> - if (ret == 0) {
> - u32 cylinders;
> - cylinders = geomdata.cyl[0] << 16;
> - cylinders |= geomdata.cyl[1] << 8;
> - cylinders |= geomdata.cyl[2];
> - if (cylinders && geomdata.heads &&
> - drive->sectors <= 0xFFFFFFFFULL &&
> - ((u32)drive->sectors % (geomdata.heads * cylinders) ==
> 0)) {
> - drive->pchs.cylinders = cylinders;
> - drive->pchs.heads = geomdata.heads;
> - drive->pchs.spt = (u32)drive->sectors / (geomdata.heads
> * cylinders);
> + // We do not recover from USB stalls, so try to be safe and
> avoid
> + // sending the command if the (obsolete, but still provided by
> QEMU)
> + // fixed disk geometry page may not be supported.
> + //
> + // We could also send the command only to small disks (e.g.
> <504MiB)
> + // but some old USB keys only support a very small subset of
> SCSI which
> + // does not even include the MODE SENSE command!
> + //
> + if (! CONFIG_COREBOOT && memcmp(vendor, "QEMU ", 8) == 0) {
> + struct cdbres_mode_sense_geom geomdata;
> + ret = cdb_mode_sense_geom(&dop, &geomdata);
> + if (ret == 0) {
> + u32 cylinders;
> + cylinders = geomdata.cyl[0] << 16;
> + cylinders |= geomdata.cyl[1] << 8;
> + cylinders |= geomdata.cyl[2];
> + if (cylinders && geomdata.heads &&
> + drive->sectors <= 0xFFFFFFFFULL &&
> + ((u32)drive->sectors % (geomdata.heads * cylinders)
> == 0)) {
> + drive->pchs.cylinders = cylinders;
> + drive->pchs.heads = geomdata.heads;
> + drive->pchs.spt = (u32)drive->sectors /
> (geomdata.heads * cylinders);
> + }
> }
> }
>
> --
> 1.7.7.6
>
>
More information about the SeaBIOS
mailing list