• Hans de Goede's avatar
    scsi/sd: add a no_read_capacity_16 scsi_device flag · 5ce524bd
    Hans de Goede authored
    I seem to have a knack for digging up buggy usb devices which don't work
    with Linux, and I'm crazy enough to try to make them work.  So this time a
    friend of mine asked me to get an mp4 player (an mp3 player which can play
    videos on a small screen) to work with Linux.
    
    It is based on the well known rockbox chipset for which we already have an
    unusual devs entries to work around some of its bugs.  But this model
    comes with an additional twist.
    
    This model chokes on read_capacity_16 calls.  Now normally we don't make
    those calls, but this model comes with an sdcard slot and when there is no
    card in there (and shipped from the factory there is none), it reports a
    size of 0.  However this time the programmers actually got the
    read_capacity_10 response right!  So they substract one from the size as
    stored internally in the mp3 player before reporting it back, resulting in
    an answer of ...  0xffffffff sectors, causing sd.c to try a
    read_capacity_16, on which the device crashes.
    
    This patch adds a flag to scsi_device to indicate that a a device cannot
    handle read_capacity_16, and when this flag is set if a device reports an
    lba of 0xffffffff as answer to a read_capacity_10, assumes it tries to
    report a size of 0.
    Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
    Cc: James Bottomley <James.Bottomley@HansenPartnership.com>
    Cc: Alan Stern <stern@rowland.harvard.edu>
    Cc: Matthew Dharm <mdharm-usb@one-eyed-alien.net>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
    5ce524bd
sd.c 69.7 KB