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 filters out READ_DISC_INFO scsi commands. I know this sucks, but as discussed on linux-scsi list there is no other way to make this device work properly. Windows does not seem to send READ_DISC_INFO during normal interactions with a 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@xxxxxxxxxx> --- drivers/usb/storage/unusual_devs.h | 5 +++++ drivers/usb/storage/usb.c | 12 ++++++++++++ include/linux/usb_usual.h | 4 +++- 3 files changed, 20 insertions(+), 1 deletions(-) diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h index b6e0e0e..f002d9c 100644 --- a/drivers/usb/storage/unusual_devs.h +++ b/drivers/usb/storage/unusual_devs.h @@ -1872,6 +1872,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/drivers/usb/storage/usb.c b/drivers/usb/storage/usb.c index e9f9954..76708da 100644 --- a/drivers/usb/storage/usb.c +++ b/drivers/usb/storage/usb.c @@ -58,6 +58,7 @@ #include <linux/kthread.h> #include <linux/mutex.h> #include <linux/utsname.h> +#include <linux/cdrom.h> #include <scsi/scsi.h> #include <scsi/scsi_cmnd.h> @@ -332,6 +333,17 @@ static int usb_stor_control_thread(void * __us) us->srb->result = SAM_STAT_GOOD; } + /* Some cdrom faking devices cannot handle READ_DISC_INFO */ + else if ((us->srb->cmnd[0] == GPCMD_READ_DISC_INFO) && + (us->fflags & US_FL_NO_READ_DISC_INFO)) { + memset(us->srb->sense_buffer, 0, 18); + us->srb->sense_buffer[0] = 0x70; /* current error */ + us->srb->sense_buffer[2] = ILLEGAL_REQUEST; + us->srb->sense_buffer[7] = 0x0a; /* additional len */ + us->srb->sense_buffer[12] = 0x20; /* ASC */ + us->srb->result = SAM_STAT_CHECK_CONDITION; + } + /* we've got a command, let's do it! */ else { US_DEBUG(usb_stor_show_command(us->srb)); 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 -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html