[SeaBIOS] Booting from USB thumbdrives, older drives boot, newer drives don't.

Dave Frodin dave at camp.se-eng.com
Fri Mar 2 23:10:33 CET 2012


Here are my latest results.
The sg_modes command has a "-a" option to dump out all of the supported page codes
   - it reports that none of the thumbdrives (tested 9) support page code = 4 
   - it reports that most of the thumbdrives (tested 9) support page code = 5
   - it commented that page code 5 is obsolete

the page_code=4 and 5 cyc/head info must be garbage
these are the types of values I get back. I haven't
found a spec yet for the page_code 5 geometry struct
so it could be bogus because of that.

                cyc[0]/cyc[1]/cyc[2]  head
                -------------------------------  
                page_code 4       page_code 5
================================================
old_sandisk   00/00/00  0         80/00/04  20
new_sandisk      stall            00/00/10  3F
verbatim      66/b5/02  f         f0/00/ff  20
wintec        00/00/80  0         13/88/10  3F

I think the booting drives boot because ...
  A) using page_code=5 got rid of the stall (even though the data is bogus)
  B) the MBR is at sector 0, and 0 is 0 no matter what the geometry
  C) perhaps there is code later in seabios that understands it's booting
     from a USB drive and knows better than us what to do and uses something
     like linear sectors.

Marc suggested that I leave the page_code set to 4 in order to preserve functionality for
drives that actually report valid CHS geometry, and to add code that would clear the stall
from the USB controller and thumbdrive.

Questions:
  1) Any recommendations on my direction?
  2) Is there any way to differentiate between a USB thumbdrive and
     a USB-to-SATA adapter?

dave

----- Original Message -----
> From: "Dave Frodin" <dave at camp.se-eng.com>
> To: seabios at seabios.org
> Sent: Friday, March 2, 2012 8:53:54 AM
> Subject: Re: [SeaBIOS] Booting from USB thumbdrives, older drives boot,	newer drives don't.
> 
> Paolo,
> Thanks for the reply.
> I ran the sg_modes for pages 4 and 5 on 4 USB thumbdrives.
> sandisk_old is a 4GB Sandisk Cruzer (yes, the old is ver=8.02)
> sandisk_new is a 4GB Sandisk Cruzer
> transcend   is a 2GB drive
> verbatim    is a 2GB drive
> 
> If I use the unmodified "master" SeaBIOS ...
> 	sandisk_old   boots
> 	sandisk_new   stalls at mode sense
> 	transcend     stalls at mode sense
> 	verbatim      boots
> 
> If I change the mode page from 4 to 5 ...
> 	sandisk_old   boots
> 	sandisk_new   boots
> 	transcend     stalls at mode sense
> 	verbatim      boots
> 
> The mode page change from 4 to 5 allowed four of my none booting
> drives to boot. Hopefully these logs will be helpful.
> 
> Thanks again,
> dave
> 
> starting sandisk_old tests
>    sudo sg_modes -HHp 4 /dev/sdb
> 	SanDisk   Cruzer            8.02   peripheral_type: disk [0x0]
> 	Mode parameter header from MODE SENSE(10):
> 	00     00 46 00 00 00 00 00 00
> 	Mode data length=72, medium type=0x00, WP=0, DpoFua=0, longlba=0
> 	Block descriptor length=0
> 	>> page_code=0x0, page_control=0
> 	00     00 00
> 	Unexpectedly received extra mode page responses, ignore
> 
>    sudo sg_modes -HHp 5 /dev/sdb
> 	SanDisk   Cruzer            8.02   peripheral_type: disk [0x0]
> 	Mode parameter header from MODE SENSE(10):
> 	00     00 26 00 00 00 00 00 00
> 	Mode data length=40, medium type=0x00, WP=0, DpoFua=0, longlba=0
> 	Block descriptor length=0
> 	>> page_code=0x5, page_control=0
> 	00     05 1e 80 00 04 20 02 00  ef c0 00 00 00 00 00 00
> 	10     00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00
>  
> starting sandisk_new tests
>    sudo sg_modes -HHp 4 /dev/sdb
> 	SanDisk  Cruzer   1.26   peripheral_type: disk [0x0]
> 	invalid field in cdb (perhaps page 0x4 not supported)
> 
>    sudo sg_modes -HHp 5 /dev/sdb
> 	SanDisk  Cruzer   1.26   peripheral_type: disk [0x0]
> 	Mode parameter header from MODE SENSE(10):
> 	00     00 26 00 00 00 00 00 00
> 	Mode data length=40, medium type=0x00, WP=0, DpoFua=0, longlba=0
> 	Block descriptor length=0
> 	>> page_code=0x5, page_control=0
> 	00     05 1e 00 00 10 3f 02 00  1e 4f 00 00 00 00 00 00
> 	10     00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00
>  
> starting transcend
>    sudo sg_modes -HHp 4 /dev/sdb
> 	JetFlash  Transcend 2GB     8.07   peripheral_type: disk [0x0]
> 	Mode parameter header from MODE SENSE(10):
> 	00     00 06 00 00 00 00 00 00
> 	Mode data length=8, medium type=0x00, WP=0, DpoFua=0, longlba=0
> 	Block descriptor length=0
> 
>    sudo sg_modes -HHp 5 /dev/sdb
> 	JetFlash  Transcend 2GB     8.07   peripheral_type: disk [0x0]
> 	Mode parameter header from MODE SENSE(10):
> 	00     00 06 00 00 00 00 00 00
> 	Mode data length=8, medium type=0x00, WP=0, DpoFua=0, longlba=0
> 	Block descriptor length=0
> 
> 
> starting verbatim
>    sudo sg_modes -HHp 4 /dev/sdb
> 	Verbatim  STORE N GO        5.00   peripheral_type: disk [0x0]
> 	Mode parameter header from MODE SENSE(10):
> 	00     00 06 00 00 00 00 00 00
> 	Mode data length=8, medium type=0x00, WP=0, DpoFua=0, longlba=0
> 	Block descriptor length=0
> 
>    sudo sg_modes -HHp 5 /dev/sdb
> 	Verbatim  STORE N GO        5.00   peripheral_type: disk [0x0]
> 	Mode parameter header from MODE SENSE(10):
> 	00     00 26 00 00 00 00 00 00
> 	Mode data length=40, medium type=0x00, WP=0, DpoFua=0, longlba=0
> 	Block descriptor length=0
> 	>> page_code=0x5, page_control=0
> 	00     05 1e f0 00 ff 20 02 00  01 df 00 00 00 00 00 00
> 	10     00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00
> 
> 
> ----- Original Message -----
> > From: "Paolo Bonzini" <pbonzini at redhat.com>
> > To: seabios at seabios.org, dave at camp.se-eng.com
> > Sent: Friday, March 2, 2012 7:20:28 AM
> > Subject: Re: Booting from USB thumbdrives, older drives boot, newer
> > drives don't.
> > 
> > Il 02/03/2012 01:34, Dave Frodin ha scritto:
> > > On a related topic, I have a copy of the "Indispensable PC
> > > Hardware" book
> > > that lists the return values for the mode page 4 request. It list
> > > the cyc/head
> > > data as follows...
> > >  offset   value
> > > ==================
> > >    2     cyl(msb)
> > >    3     cyl
> > >    4     cyl(lsb)
> > >    5     heads
> > > 
> > > the struct in the blockcmd.h file shows...
> > >   struct cdbres_mode_sense_geom {
> > >     u8 unused_00[3];
> > >     u8 read_only;
> > >     u32 unused_04;
> > >     u8 page;
> > >     u8 length;
> > >     u8 cyl[3];
> > >     u8 heads;
> > >     u8 precomp[3];
> > >     u8 reduced[3];
> > >     u16 step_rate;
> > >     u8 landing[3];
> > >     u16 rpm;
> > >   } PACKED;
> > > which would put cyl[3] at offset 10 thru 12 and heads at offset
> > > 13.
> > > Am I missing something here?
> > 
> > The first eight bytes are not part of the page, they are common to
> > all
> > MODE SENSE responses.
> > 
> > Perhaps we could restrict the MODE SENSE to disks of 504MiB and
> > less.
> >  I
> > still have a couple of 256 MB pen drives around, I can test them.
> > 
> > Can you try "sg_modes -HHp 4 /dev/sda" (from Linux) on both those
> > that
> > fail and those that work?
> > 
> > Paolo
> > 
> 
> _______________________________________________
> SeaBIOS mailing list
> SeaBIOS at seabios.org
> http://www.seabios.org/mailman/listinfo/seabios
> 



More information about the SeaBIOS mailing list