* [PATCH resend 1/4] scsi/sr: add no_read_disc_info scsi_device flag
@ 2010-07-22 15:11 Hans de Goede
2010-07-22 15:11 ` [PATCH resend 2/4] usb-storage: Add new no_read_disc_info quirk Hans de Goede
` (2 more replies)
0 siblings, 3 replies; 6+ messages in thread
From: Hans de Goede @ 2010-07-22 15:11 UTC (permalink / raw)
To: James.Bottomley-l3A5Bk7waGM, Tejun Heo, Alan Stern,
akpm-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b
Cc: linux-scsi-u79uwXL29TY76Z2rM5mHXA,
linux-usb-u79uwXL29TY76Z2rM5mHXA, Hans de Goede
Some USB devices emulate a usb-mass-storage attached (scsi) cdrom device,
usually this fake cdrom contains the windows software for the device.
While working on supporting Appotech ax3003 based photoframes, which do
this I discovered that they will go of into lala land when ever they
see a READ_DISC_INFO scsi command.
Thus this patch adds a scsi_device flag (which can then be set by the
usb-storage driver through an unsual-devs entry), to indicate this, and
makes the sr driver honor this flag.
I know this sucks, but as discussed on linux-scsi list there is no other
way to make this device work properly.
Looking at usb traces made under windows, windows never sends a
READ_DISC_INFO during normal interactions with a usb cdrom device. So as
this cdrom emulation thingie becomes more common we might see more of
this problem.
Signed-off-by: Hans de Goede <hdegoede-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
---
drivers/scsi/sr.c | 8 +++++++-
include/scsi/scsi_device.h | 1 +
2 files changed, 8 insertions(+), 1 deletions(-)
diff --git a/drivers/scsi/sr.c b/drivers/scsi/sr.c
index 0a90abc..18077b5 100644
--- a/drivers/scsi/sr.c
+++ b/drivers/scsi/sr.c
@@ -849,10 +849,16 @@ static void get_capabilities(struct scsi_cd *cd)
static int sr_packet(struct cdrom_device_info *cdi,
struct packet_command *cgc)
{
+ struct scsi_cd *cd = cdi->handle;
+ struct scsi_device *sdev = cd->device;
+
+ if (cgc->cmd[0] == GPCMD_READ_DISC_INFO && sdev->no_read_disc_info)
+ return -EDRIVE_CANT_DO_THIS;
+
if (cgc->timeout <= 0)
cgc->timeout = IOCTL_TIMEOUT;
- sr_do_ioctl(cdi->handle, cgc);
+ sr_do_ioctl(cd, cgc);
return cgc->stat;
}
diff --git a/include/scsi/scsi_device.h b/include/scsi/scsi_device.h
index d80b6db..e1b2db8 100644
--- a/include/scsi/scsi_device.h
+++ b/include/scsi/scsi_device.h
@@ -148,6 +148,7 @@ struct scsi_device {
unsigned retry_hwerror:1; /* Retry HARDWARE_ERROR */
unsigned last_sector_bug:1; /* do not use multisector accesses on
SD_LAST_BUGGY_SECTORS */
+ unsigned no_read_disc_info:1; /* Avoid READ_DISC_INFO cmds */
unsigned is_visible:1; /* is the device visible in sysfs */
DECLARE_BITMAP(supported_events, SDEV_EVT_MAXBITS); /* supported events */
--
1.7.0.1
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH resend 2/4] usb-storage: Add new no_read_disc_info quirk
2010-07-22 15:11 [PATCH resend 1/4] scsi/sr: add no_read_disc_info scsi_device flag Hans de Goede
@ 2010-07-22 15:11 ` Hans de Goede
2010-07-22 15:12 ` [PATCH resend 3/4] scsi/sd: Add a no_read_capacity_16 scsi_device flag Hans de Goede
[not found] ` <1279811521-11372-1-git-send-email-hdegoede-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2 siblings, 0 replies; 6+ messages in thread
From: Hans de Goede @ 2010-07-22 15:11 UTC (permalink / raw)
To: James.Bottomley, Tejun Heo, Alan Stern, akpm
Cc: linux-scsi, linux-usb, Hans de Goede
Appotech ax3003 (the larger brother of the ax203) based devices are even
more buggy then the ax203. They will go of into lala land when ever they
see a READ_DISC_INFO scsi command. So add a new US_FL which tells the
scsi sr driver to not issue any READ_DISC_INFO scsi commands.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
drivers/usb/storage/scsiglue.c | 4 ++++
drivers/usb/storage/unusual_devs.h | 5 +++++
include/linux/usb_usual.h | 4 +++-
3 files changed, 12 insertions(+), 1 deletions(-)
diff --git a/drivers/usb/storage/scsiglue.c b/drivers/usb/storage/scsiglue.c
index d8d98cf..4a30fbf 100644
--- a/drivers/usb/storage/scsiglue.c
+++ b/drivers/usb/storage/scsiglue.c
@@ -253,6 +253,10 @@ static int slave_configure(struct scsi_device *sdev)
* or to force 192-byte transfer lengths for MODE SENSE.
* But they do need to use MODE SENSE(10). */
sdev->use_10_for_ms = 1;
+
+ /* Some (fake) usb cdrom devices don't like READ_DISC_INFO */
+ if (us->fflags & US_FLAG_NO_READ_DISC_INFO)
+ sdev->no_read_disc_info = 1;
}
/* The CB and CBI transports have no way to pass LUN values
diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h
index 2c897ee..42a83c4 100644
--- a/drivers/usb/storage/unusual_devs.h
+++ b/drivers/usb/storage/unusual_devs.h
@@ -1858,6 +1858,11 @@ UNUSUAL_DEV( 0x1908, 0x1320, 0x0000, 0x0000,
"Photo Frame",
US_SC_DEVICE, US_PR_DEVICE, NULL,
US_FL_BAD_SENSE ),
+UNUSUAL_DEV( 0x1908, 0x3335, 0x0200, 0x0200,
+ "BUILDWIN",
+ "Photo Frame",
+ US_SC_DEVICE, US_PR_DEVICE, NULL,
+ US_FL_NO_READ_DISC_INFO ),
UNUSUAL_DEV( 0x2116, 0x0320, 0x0001, 0x0001,
"ST",
diff --git a/include/linux/usb_usual.h b/include/linux/usb_usual.h
index a4b947e..bff51d0 100644
--- a/include/linux/usb_usual.h
+++ b/include/linux/usb_usual.h
@@ -58,7 +58,9 @@
US_FLAG(CAPACITY_OK, 0x00010000) \
/* READ CAPACITY response is correct */ \
US_FLAG(BAD_SENSE, 0x00020000) \
- /* Bad Sense (never more than 18 bytes) */
+ /* Bad Sense (never more than 18 bytes) */ \
+ US_FLAG(NO_READ_DISC_INFO, 0x00040000) \
+ /* cannot handle READ_DISC_INFO */
#define US_FLAG(name, value) US_FL_##name = value ,
enum { US_DO_ALL_FLAGS };
--
1.7.0.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH resend 3/4] scsi/sd: Add a no_read_capacity_16 scsi_device flag
2010-07-22 15:11 [PATCH resend 1/4] scsi/sr: add no_read_disc_info scsi_device flag Hans de Goede
2010-07-22 15:11 ` [PATCH resend 2/4] usb-storage: Add new no_read_disc_info quirk Hans de Goede
@ 2010-07-22 15:12 ` Hans de Goede
2010-07-22 15:16 ` Sergei Shtylyov
[not found] ` <1279811521-11372-1-git-send-email-hdegoede-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2 siblings, 1 reply; 6+ messages in thread
From: Hans de Goede @ 2010-07-22 15:12 UTC (permalink / raw)
To: James.Bottomley, Tejun Heo, Alan Stern, akpm
Cc: linux-scsi, linux-usb, Hans de Goede
I know I know, I seem to have a nack 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: Hans de Goede <hdegoede@redhat.com>
---
drivers/scsi/sd.c | 12 ++++++++++++
include/scsi/scsi_device.h | 1 +
2 files changed, 13 insertions(+), 0 deletions(-)
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
index 8802e48..1ad339b 100644
--- a/drivers/scsi/sd.c
+++ b/drivers/scsi/sd.c
@@ -1450,6 +1450,9 @@ static int read_capacity_16(struct scsi_disk *sdkp, struct scsi_device *sdp,
unsigned long long lba;
unsigned sector_size;
+ if (sdp->no_read_capacity_16)
+ return -EINVAL;
+
do {
memset(cmd, 0, 16);
cmd[0] = SERVICE_ACTION_IN;
@@ -1578,6 +1581,15 @@ static int read_capacity_10(struct scsi_disk *sdkp, struct scsi_device *sdp,
sector_size = get_unaligned_be32(&buffer[4]);
lba = get_unaligned_be32(&buffer[0]);
+ if (sdp->no_read_capacity_16 && (lba == 0xffffffff)) {
+ /* Some buggy (usb cardreader) devices return an lba of
+ 0xffffffff when the want to report a size of 0 (with
+ which they really mean no media is present) */
+ sdkp->capacity = 0;
+ sdkp->hw_sector_size = sector_size;
+ return sector_size;
+ }
+
if ((sizeof(sdkp->capacity) == 4) && (lba == 0xffffffff)) {
sd_printk(KERN_ERR, sdkp, "Too big for this kernel. Use a "
"kernel compiled with support for large block "
diff --git a/include/scsi/scsi_device.h b/include/scsi/scsi_device.h
index e1b2db8..02bbbe5 100644
--- a/include/scsi/scsi_device.h
+++ b/include/scsi/scsi_device.h
@@ -149,6 +149,7 @@ struct scsi_device {
unsigned last_sector_bug:1; /* do not use multisector accesses on
SD_LAST_BUGGY_SECTORS */
unsigned no_read_disc_info:1; /* Avoid READ_DISC_INFO cmds */
+ unsigned no_read_capacity_16:1; /* Avoid READ_CAPACITY_16 cmds */
unsigned is_visible:1; /* is the device visible in sysfs */
DECLARE_BITMAP(supported_events, SDEV_EVT_MAXBITS); /* supported events */
--
1.7.0.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH resend 4/4] usb-storage: Add new no_read_capacity_16 quirk
[not found] ` <1279811521-11372-1-git-send-email-hdegoede-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
@ 2010-07-22 15:12 ` Hans de Goede
0 siblings, 0 replies; 6+ messages in thread
From: Hans de Goede @ 2010-07-22 15:12 UTC (permalink / raw)
To: James.Bottomley-l3A5Bk7waGM, Tejun Heo, Alan Stern,
akpm-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b
Cc: linux-scsi-u79uwXL29TY76Z2rM5mHXA,
linux-usb-u79uwXL29TY76Z2rM5mHXA, Hans de Goede
Some Rockbox based mp4 players will crash when ever they see a
read_capacity_16 scsi command. So add a new US_FL which tells the
scsi sd driver to not issue any read_capacity_16 scsi commands.
Signed-off-by: Hans de Goede <hdegoede-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
---
drivers/usb/storage/scsiglue.c | 4 ++++
drivers/usb/storage/unusual_devs.h | 3 ++-
include/linux/usb_usual.h | 4 +++-
3 files changed, 9 insertions(+), 2 deletions(-)
diff --git a/drivers/usb/storage/scsiglue.c b/drivers/usb/storage/scsiglue.c
index 4a30fbf..4d0c437 100644
--- a/drivers/usb/storage/scsiglue.c
+++ b/drivers/usb/storage/scsiglue.c
@@ -209,6 +209,10 @@ static int slave_configure(struct scsi_device *sdev)
if (us->fflags & US_FL_CAPACITY_HEURISTICS)
sdev->guess_capacity = 1;
+ /* Some devices cannot handle READ_CAPACITY_16 */
+ if (us->fflags & US_FL_NO_READ_CAPACITY_16)
+ sdev->no_read_capacity_16 = 1;
+
/* assume SPC3 or latter devices support sense size > 18 */
if (sdev->scsi_level > SCSI_SPC_2)
us->fflags |= US_FL_SANE_SENSE;
diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h
index 42a83c4..262ba6d 100644
--- a/drivers/usb/storage/unusual_devs.h
+++ b/drivers/usb/storage/unusual_devs.h
@@ -877,7 +877,8 @@ UNUSUAL_DEV( 0x071b, 0x3203, 0x0000, 0x0000,
"RockChip",
"MP3",
US_SC_DEVICE, US_PR_DEVICE, NULL,
- US_FL_NO_WP_DETECT | US_FL_MAX_SECTORS_64),
+ US_FL_NO_WP_DETECT | US_FL_MAX_SECTORS_64 |
+ US_FL_NO_READ_CAPACITY_16),
/* Reported by Jean-Baptiste Onofre <jb-0Op4vImcjdnk1uMJSBkQmQ@public.gmane.org>
* Support the following product :
diff --git a/include/linux/usb_usual.h b/include/linux/usb_usual.h
index bff51d0..d4ee5b8 100644
--- a/include/linux/usb_usual.h
+++ b/include/linux/usb_usual.h
@@ -60,7 +60,9 @@
US_FLAG(BAD_SENSE, 0x00020000) \
/* Bad Sense (never more than 18 bytes) */ \
US_FLAG(NO_READ_DISC_INFO, 0x00040000) \
- /* cannot handle READ_DISC_INFO */
+ /* cannot handle READ_DISC_INFO */ \
+ US_FLAG(NO_READ_CAPACITY_16, 0x00080000) \
+ /* cannot handle READ_CAPACITY_16 */
#define US_FLAG(name, value) US_FL_##name = value ,
enum { US_DO_ALL_FLAGS };
--
1.7.0.1
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH resend 3/4] scsi/sd: Add a no_read_capacity_16 scsi_device flag
2010-07-22 15:12 ` [PATCH resend 3/4] scsi/sd: Add a no_read_capacity_16 scsi_device flag Hans de Goede
@ 2010-07-22 15:16 ` Sergei Shtylyov
0 siblings, 0 replies; 6+ messages in thread
From: Sergei Shtylyov @ 2010-07-22 15:16 UTC (permalink / raw)
To: Hans de Goede
Cc: James.Bottomley, Tejun Heo, Alan Stern, akpm, linux-scsi,
linux-usb
Hello.
Hans de Goede wrote:
> I know I know, I seem to have a nack 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: Hans de Goede <hdegoede@redhat.com>
[...]
> diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
> index 8802e48..1ad339b 100644
> --- a/drivers/scsi/sd.c
> +++ b/drivers/scsi/sd.c
[...]
> @@ -1578,6 +1581,15 @@ static int read_capacity_10(struct scsi_disk *sdkp, struct scsi_device *sdp,
> sector_size = get_unaligned_be32(&buffer[4]);
> lba = get_unaligned_be32(&buffer[0]);
>
> + if (sdp->no_read_capacity_16 && (lba == 0xffffffff)) {
Parens around == are not necessary.
> + /* Some buggy (usb cardreader) devices return an lba of
> + 0xffffffff when the want to report a size of 0 (with
> + which they really mean no media is present) */
According to CodingStyle, the preferred format of the multi-line comments
is this:
/*
* bla
* bla
*/
WBR, Sergei
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH resend 4/4] usb-storage: Add new no_read_capacity_16 quirk
2010-07-23 8:52 [PATCH resend 1/4] scsi/sr: add no_read_disc_info scsi_device flag Hans de Goede
@ 2010-07-23 8:52 ` Hans de Goede
0 siblings, 0 replies; 6+ messages in thread
From: Hans de Goede @ 2010-07-23 8:52 UTC (permalink / raw)
To: James.Bottomley, Tejun Heo, Alan Stern, akpm
Cc: linux-scsi, linux-usb, Hans de Goede
Some Rockbox based mp4 players will crash when ever they see a
read_capacity_16 scsi command. So add a new US_FL which tells the
scsi sd driver to not issue any read_capacity_16 scsi commands.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
drivers/usb/storage/scsiglue.c | 4 ++++
drivers/usb/storage/unusual_devs.h | 3 ++-
include/linux/usb_usual.h | 4 +++-
3 files changed, 9 insertions(+), 2 deletions(-)
diff --git a/drivers/usb/storage/scsiglue.c b/drivers/usb/storage/scsiglue.c
index 4a30fbf..4d0c437 100644
--- a/drivers/usb/storage/scsiglue.c
+++ b/drivers/usb/storage/scsiglue.c
@@ -209,6 +209,10 @@ static int slave_configure(struct scsi_device *sdev)
if (us->fflags & US_FL_CAPACITY_HEURISTICS)
sdev->guess_capacity = 1;
+ /* Some devices cannot handle READ_CAPACITY_16 */
+ if (us->fflags & US_FL_NO_READ_CAPACITY_16)
+ sdev->no_read_capacity_16 = 1;
+
/* assume SPC3 or latter devices support sense size > 18 */
if (sdev->scsi_level > SCSI_SPC_2)
us->fflags |= US_FL_SANE_SENSE;
diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h
index 42a83c4..262ba6d 100644
--- a/drivers/usb/storage/unusual_devs.h
+++ b/drivers/usb/storage/unusual_devs.h
@@ -877,7 +877,8 @@ UNUSUAL_DEV( 0x071b, 0x3203, 0x0000, 0x0000,
"RockChip",
"MP3",
US_SC_DEVICE, US_PR_DEVICE, NULL,
- US_FL_NO_WP_DETECT | US_FL_MAX_SECTORS_64),
+ US_FL_NO_WP_DETECT | US_FL_MAX_SECTORS_64 |
+ US_FL_NO_READ_CAPACITY_16),
/* Reported by Jean-Baptiste Onofre <jb@nanthrax.net>
* Support the following product :
diff --git a/include/linux/usb_usual.h b/include/linux/usb_usual.h
index bff51d0..d4ee5b8 100644
--- a/include/linux/usb_usual.h
+++ b/include/linux/usb_usual.h
@@ -60,7 +60,9 @@
US_FLAG(BAD_SENSE, 0x00020000) \
/* Bad Sense (never more than 18 bytes) */ \
US_FLAG(NO_READ_DISC_INFO, 0x00040000) \
- /* cannot handle READ_DISC_INFO */
+ /* cannot handle READ_DISC_INFO */ \
+ US_FLAG(NO_READ_CAPACITY_16, 0x00080000) \
+ /* cannot handle READ_CAPACITY_16 */
#define US_FLAG(name, value) US_FL_##name = value ,
enum { US_DO_ALL_FLAGS };
--
1.7.0.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
end of thread, other threads:[~2010-07-23 8:49 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-07-22 15:11 [PATCH resend 1/4] scsi/sr: add no_read_disc_info scsi_device flag Hans de Goede
2010-07-22 15:11 ` [PATCH resend 2/4] usb-storage: Add new no_read_disc_info quirk Hans de Goede
2010-07-22 15:12 ` [PATCH resend 3/4] scsi/sd: Add a no_read_capacity_16 scsi_device flag Hans de Goede
2010-07-22 15:16 ` Sergei Shtylyov
[not found] ` <1279811521-11372-1-git-send-email-hdegoede-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2010-07-22 15:12 ` [PATCH resend 4/4] usb-storage: Add new no_read_capacity_16 quirk Hans de Goede
-- strict thread matches above, loose matches on Subject: below --
2010-07-23 8:52 [PATCH resend 1/4] scsi/sr: add no_read_disc_info scsi_device flag Hans de Goede
2010-07-23 8:52 ` [PATCH resend 4/4] usb-storage: Add new no_read_capacity_16 quirk Hans de Goede
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).