usb: storage: fix multi-line comment style
No functional changes here, just making sure our storage driver uses a consistent multi-line comment style. Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com> Acked-by: Alan Stern <stern@rowland.harvard.edu> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
5b91dfe187
commit
f0183a338e
42 changed files with 829 additions and 455 deletions
|
@ -829,8 +829,10 @@ static int alauda_write_lba(struct us_data *us, u16 lba,
|
|||
|
||||
pba = MEDIA_INFO(us).lba_to_pba[zone][lba_offset];
|
||||
if (pba == 1) {
|
||||
/* Maybe it is impossible to write to PBA 1.
|
||||
Fake success, but don't do anything. */
|
||||
/*
|
||||
* Maybe it is impossible to write to PBA 1.
|
||||
* Fake success, but don't do anything.
|
||||
*/
|
||||
printk(KERN_WARNING
|
||||
"alauda_write_lba: avoid writing to pba 1\n");
|
||||
return USB_STOR_TRANSPORT_GOOD;
|
||||
|
@ -977,10 +979,12 @@ static int alauda_read_data(struct us_data *us, unsigned long address,
|
|||
usb_stor_dbg(us, "Read %d zero pages (LBA %d) page %d\n",
|
||||
pages, lba, page);
|
||||
|
||||
/* This is not really an error. It just means
|
||||
that the block has never been written.
|
||||
Instead of returning USB_STOR_TRANSPORT_ERROR
|
||||
it is better to return all zero data. */
|
||||
/*
|
||||
* This is not really an error. It just means
|
||||
* that the block has never been written.
|
||||
* Instead of returning USB_STOR_TRANSPORT_ERROR
|
||||
* it is better to return all zero data.
|
||||
*/
|
||||
|
||||
memset(buffer, 0, len);
|
||||
} else {
|
||||
|
@ -1222,8 +1226,10 @@ static int alauda_transport(struct scsi_cmnd *srb, struct us_data *us)
|
|||
}
|
||||
|
||||
if (srb->cmnd[0] == ALLOW_MEDIUM_REMOVAL) {
|
||||
/* sure. whatever. not like we can stop the user from popping
|
||||
the media out of the device (no locking doors, etc) */
|
||||
/*
|
||||
* sure. whatever. not like we can stop the user from popping
|
||||
* the media out of the device (no locking doors, etc)
|
||||
*/
|
||||
return USB_STOR_TRANSPORT_GOOD;
|
||||
}
|
||||
|
||||
|
|
|
@ -110,13 +110,17 @@ static void cypress_atacb_passthrough(struct scsi_cmnd *srb, struct us_data *us)
|
|||
/* first build the ATACB command */
|
||||
srb->cmd_len = 16;
|
||||
|
||||
srb->cmnd[0] = 0x24; /* bVSCBSignature : vendor-specific command
|
||||
this value can change, but most(all ?) manufacturers
|
||||
keep the cypress default : 0x24 */
|
||||
srb->cmnd[0] = 0x24; /*
|
||||
* bVSCBSignature : vendor-specific command
|
||||
* this value can change, but most(all ?) manufacturers
|
||||
* keep the cypress default : 0x24
|
||||
*/
|
||||
srb->cmnd[1] = 0x24; /* bVSCBSubCommand : 0x24 for ATACB */
|
||||
|
||||
srb->cmnd[3] = 0xff - 1; /* features, sector count, lba low, lba med
|
||||
lba high, device, command are valid */
|
||||
srb->cmnd[3] = 0xff - 1; /*
|
||||
* features, sector count, lba low, lba med
|
||||
* lba high, device, command are valid
|
||||
*/
|
||||
srb->cmnd[4] = 1; /* TransferBlockCount : 512 */
|
||||
|
||||
if (save_cmnd[0] == ATA_16) {
|
||||
|
@ -155,8 +159,7 @@ static void cypress_atacb_passthrough(struct scsi_cmnd *srb, struct us_data *us)
|
|||
|
||||
usb_stor_transparent_scsi_command(srb, us);
|
||||
|
||||
/* if the device doesn't support ATACB
|
||||
*/
|
||||
/* if the device doesn't support ATACB */
|
||||
if (srb->result == SAM_STAT_CHECK_CONDITION &&
|
||||
memcmp(srb->sense_buffer, usb_stor_sense_invalidCDB,
|
||||
sizeof(usb_stor_sense_invalidCDB)) == 0) {
|
||||
|
@ -164,7 +167,8 @@ static void cypress_atacb_passthrough(struct scsi_cmnd *srb, struct us_data *us)
|
|||
goto end;
|
||||
}
|
||||
|
||||
/* if ck_cond flags is set, and there wasn't critical error,
|
||||
/*
|
||||
* if ck_cond flags is set, and there wasn't critical error,
|
||||
* build the special sense
|
||||
*/
|
||||
if ((srb->result != (DID_ERROR << 16) &&
|
||||
|
@ -176,11 +180,11 @@ static void cypress_atacb_passthrough(struct scsi_cmnd *srb, struct us_data *us)
|
|||
unsigned char *desc = sb + 8;
|
||||
int tmp_result;
|
||||
|
||||
/* build the command for
|
||||
* reading the ATA registers */
|
||||
/* build the command for reading the ATA registers */
|
||||
scsi_eh_prep_cmnd(srb, &ses, NULL, 0, sizeof(regs));
|
||||
|
||||
/* we use the same command as before, but we set
|
||||
/*
|
||||
* we use the same command as before, but we set
|
||||
* the read taskfile bit, for not executing atacb command,
|
||||
* but reading register selected in srb->cmnd[4]
|
||||
*/
|
||||
|
@ -204,10 +208,11 @@ static void cypress_atacb_passthrough(struct scsi_cmnd *srb, struct us_data *us)
|
|||
sb[2] = 0; /* ATA PASS THROUGH INFORMATION AVAILABLE */
|
||||
sb[3] = 0x1D;
|
||||
|
||||
/* XXX we should generate sk, asc, ascq from status and error
|
||||
/*
|
||||
* XXX we should generate sk, asc, ascq from status and error
|
||||
* regs
|
||||
* (see 11.1 Error translation ATA device error to SCSI error
|
||||
* map, and ata_to_sense_error from libata.)
|
||||
* map, and ata_to_sense_error from libata.)
|
||||
*/
|
||||
|
||||
/* Sense data is current and format is descriptor. */
|
||||
|
@ -258,7 +263,8 @@ static int cypress_probe(struct usb_interface *intf,
|
|||
if (result)
|
||||
return result;
|
||||
|
||||
/* Among CY7C68300 chips, the A revision does not support Cypress ATACB
|
||||
/*
|
||||
* Among CY7C68300 chips, the A revision does not support Cypress ATACB
|
||||
* Filter out this revision from EEPROM default descriptor values
|
||||
*/
|
||||
device = interface_to_usbdev(intf);
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
/* Driver for Datafab USB Compact Flash reader
|
||||
/*
|
||||
* Driver for Datafab USB Compact Flash reader
|
||||
*
|
||||
* datafab driver v0.1:
|
||||
*
|
||||
|
@ -693,18 +694,23 @@ static int datafab_transport(struct scsi_cmnd *srb, struct us_data *us)
|
|||
}
|
||||
|
||||
if (srb->cmnd[0] == ALLOW_MEDIUM_REMOVAL) {
|
||||
// sure. whatever. not like we can stop the user from
|
||||
// popping the media out of the device (no locking doors, etc)
|
||||
//
|
||||
/*
|
||||
* sure. whatever. not like we can stop the user from
|
||||
* popping the media out of the device (no locking doors, etc)
|
||||
*/
|
||||
return USB_STOR_TRANSPORT_GOOD;
|
||||
}
|
||||
|
||||
if (srb->cmnd[0] == START_STOP) {
|
||||
/* this is used by sd.c'check_scsidisk_media_change to detect
|
||||
media change */
|
||||
/*
|
||||
* this is used by sd.c'check_scsidisk_media_change to detect
|
||||
* media change
|
||||
*/
|
||||
usb_stor_dbg(us, "START_STOP\n");
|
||||
/* the first datafab_id_device after a media change returns
|
||||
an error (determined experimentally) */
|
||||
/*
|
||||
* the first datafab_id_device after a media change returns
|
||||
* an error (determined experimentally)
|
||||
*/
|
||||
rc = datafab_id_device(us, info);
|
||||
if (rc == USB_STOR_TRANSPORT_GOOD) {
|
||||
info->sense_key = NO_SENSE;
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
/* Driver for USB Mass Storage compliant devices
|
||||
/*
|
||||
* Driver for USB Mass Storage compliant devices
|
||||
* Debugging Functions Source Code File
|
||||
*
|
||||
* Current development and maintenance by:
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
/* Driver for USB Mass Storage compliant devices
|
||||
/*
|
||||
* Driver for USB Mass Storage compliant devices
|
||||
* Debugging Functions Header File
|
||||
*
|
||||
* Current development and maintenance by:
|
||||
|
|
|
@ -560,8 +560,10 @@ static int ene_send_scsi_cmd(struct us_data *us, u8 fDir, void *buf, int use_sg)
|
|||
/* check bulk status */
|
||||
residue = le32_to_cpu(bcs->Residue);
|
||||
|
||||
/* try to compute the actual residue, based on how much data
|
||||
* was really transferred and what the device tells us */
|
||||
/*
|
||||
* try to compute the actual residue, based on how much data
|
||||
* was really transferred and what the device tells us
|
||||
*/
|
||||
if (residue && !(us->fflags & US_FL_IGNORE_RESIDUE)) {
|
||||
residue = min(residue, transfer_length);
|
||||
if (us->srb != NULL)
|
||||
|
@ -862,9 +864,6 @@ static int ms_read_readpage(struct us_data *us, u32 PhyBlockAddr,
|
|||
u8 ExtBuf[4];
|
||||
u32 bn = PhyBlockAddr * 0x20 + PageNum;
|
||||
|
||||
/* printk(KERN_INFO "MS --- MS_ReaderReadPage,
|
||||
PhyBlockAddr = %x, PageNum = %x\n", PhyBlockAddr, PageNum); */
|
||||
|
||||
result = ene_load_bincode(us, MS_RW_PATTERN);
|
||||
if (result != USB_STOR_XFER_GOOD)
|
||||
return USB_STOR_TRANSPORT_ERROR;
|
||||
|
@ -1141,8 +1140,6 @@ static int ms_read_copyblock(struct us_data *us, u16 oldphy, u16 newphy,
|
|||
struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
|
||||
int result;
|
||||
|
||||
/* printk(KERN_INFO "MS_ReaderCopyBlock --- PhyBlockAddr = %x,
|
||||
PageNum = %x\n", PhyBlockAddr, PageNum); */
|
||||
result = ene_load_bincode(us, MS_RW_PATTERN);
|
||||
if (result != USB_STOR_XFER_GOOD)
|
||||
return USB_STOR_TRANSPORT_ERROR;
|
||||
|
@ -1176,8 +1173,6 @@ static int ms_read_eraseblock(struct us_data *us, u32 PhyBlockAddr)
|
|||
int result;
|
||||
u32 bn = PhyBlockAddr;
|
||||
|
||||
/* printk(KERN_INFO "MS --- ms_read_eraseblock,
|
||||
PhyBlockAddr = %x\n", PhyBlockAddr); */
|
||||
result = ene_load_bincode(us, MS_RW_PATTERN);
|
||||
if (result != USB_STOR_XFER_GOOD)
|
||||
return USB_STOR_TRANSPORT_ERROR;
|
||||
|
@ -1255,8 +1250,6 @@ static int ms_lib_overwrite_extra(struct us_data *us, u32 PhyBlockAddr,
|
|||
struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
|
||||
int result;
|
||||
|
||||
/* printk("MS --- MS_LibOverwriteExtra,
|
||||
PhyBlockAddr = %x, PageNum = %x\n", PhyBlockAddr, PageNum); */
|
||||
result = ene_load_bincode(us, MS_RW_PATTERN);
|
||||
if (result != USB_STOR_XFER_GOOD)
|
||||
return USB_STOR_TRANSPORT_ERROR;
|
||||
|
@ -1342,7 +1335,6 @@ static int ms_lib_read_extra(struct us_data *us, u32 PhyBlock,
|
|||
int result;
|
||||
u8 ExtBuf[4];
|
||||
|
||||
/* printk("MS_LibReadExtra --- PhyBlock = %x, PageNum = %x\n", PhyBlock, PageNum); */
|
||||
memset(bcb, 0, sizeof(struct bulk_cb_wrap));
|
||||
bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
|
||||
bcb->DataTransferLength = 0x4;
|
||||
|
@ -1541,9 +1533,6 @@ static int ms_lib_read_extrablock(struct us_data *us, u32 PhyBlock,
|
|||
struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
|
||||
int result;
|
||||
|
||||
/* printk("MS_LibReadExtraBlock --- PhyBlock = %x,
|
||||
PageNum = %x, blen = %x\n", PhyBlock, PageNum, blen); */
|
||||
|
||||
/* Read Extra Data */
|
||||
memset(bcb, 0, sizeof(struct bulk_cb_wrap));
|
||||
bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
|
||||
|
@ -2390,8 +2379,10 @@ static int ene_ub6250_reset_resume(struct usb_interface *iface)
|
|||
/* Report the reset to the SCSI core */
|
||||
usb_stor_reset_resume(iface);
|
||||
|
||||
/* FIXME: Notify the subdrivers that they need to reinitialize
|
||||
* the device */
|
||||
/*
|
||||
* FIXME: Notify the subdrivers that they need to reinitialize
|
||||
* the device
|
||||
*/
|
||||
info->Power_IsResum = true;
|
||||
/*info->SD_Status.Ready = 0; */
|
||||
info->SD_Status = *(struct SD_STATUS *)&tmp;
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
/* Driver for Freecom USB/IDE adaptor
|
||||
/*
|
||||
* Driver for Freecom USB/IDE adaptor
|
||||
*
|
||||
* Freecom v0.1:
|
||||
*
|
||||
|
@ -84,25 +85,33 @@ struct freecom_status {
|
|||
u8 Pad[60];
|
||||
};
|
||||
|
||||
/* Freecom stuffs the interrupt status in the INDEX_STAT bit of the ide
|
||||
* register. */
|
||||
/*
|
||||
* Freecom stuffs the interrupt status in the INDEX_STAT bit of the ide
|
||||
* register.
|
||||
*/
|
||||
#define FCM_INT_STATUS 0x02 /* INDEX_STAT */
|
||||
#define FCM_STATUS_BUSY 0x80
|
||||
|
||||
/* These are the packet types. The low bit indicates that this command
|
||||
* should wait for an interrupt. */
|
||||
/*
|
||||
* These are the packet types. The low bit indicates that this command
|
||||
* should wait for an interrupt.
|
||||
*/
|
||||
#define FCM_PACKET_ATAPI 0x21
|
||||
#define FCM_PACKET_STATUS 0x20
|
||||
|
||||
/* Receive data from the IDE interface. The ATAPI packet has already
|
||||
* waited, so the data should be immediately available. */
|
||||
/*
|
||||
* Receive data from the IDE interface. The ATAPI packet has already
|
||||
* waited, so the data should be immediately available.
|
||||
*/
|
||||
#define FCM_PACKET_INPUT 0x81
|
||||
|
||||
/* Send data to the IDE interface. */
|
||||
#define FCM_PACKET_OUTPUT 0x01
|
||||
|
||||
/* Write a value to an ide register. Or the ide register to write after
|
||||
* munging the address a bit. */
|
||||
/*
|
||||
* Write a value to an ide register. Or the ide register to write after
|
||||
* munging the address a bit.
|
||||
*/
|
||||
#define FCM_PACKET_IDE_WRITE 0x40
|
||||
#define FCM_PACKET_IDE_READ 0xC0
|
||||
|
||||
|
@ -251,16 +260,20 @@ static int freecom_transport(struct scsi_cmnd *srb, struct us_data *us)
|
|||
result = usb_stor_bulk_transfer_buf (us, opipe, fcb,
|
||||
FCM_PACKET_LENGTH, NULL);
|
||||
|
||||
/* The Freecom device will only fail if there is something wrong in
|
||||
/*
|
||||
* The Freecom device will only fail if there is something wrong in
|
||||
* USB land. It returns the status in its own registers, which
|
||||
* come back in the bulk pipe. */
|
||||
* come back in the bulk pipe.
|
||||
*/
|
||||
if (result != USB_STOR_XFER_GOOD) {
|
||||
usb_stor_dbg(us, "freecom transport error\n");
|
||||
return USB_STOR_TRANSPORT_ERROR;
|
||||
}
|
||||
|
||||
/* There are times we can optimize out this status read, but it
|
||||
* doesn't hurt us to always do it now. */
|
||||
/*
|
||||
* There are times we can optimize out this status read, but it
|
||||
* doesn't hurt us to always do it now.
|
||||
*/
|
||||
result = usb_stor_bulk_transfer_buf (us, ipipe, fst,
|
||||
FCM_STATUS_PACKET_LENGTH, &partial);
|
||||
usb_stor_dbg(us, "foo Status result %d %u\n", result, partial);
|
||||
|
@ -269,7 +282,8 @@ static int freecom_transport(struct scsi_cmnd *srb, struct us_data *us)
|
|||
|
||||
US_DEBUG(pdump(us, (void *)fst, partial));
|
||||
|
||||
/* The firmware will time-out commands after 20 seconds. Some commands
|
||||
/*
|
||||
* The firmware will time-out commands after 20 seconds. Some commands
|
||||
* can legitimately take longer than this, so we use a different
|
||||
* command that only waits for the interrupt and then sends status,
|
||||
* without having to send a new ATAPI command to the device.
|
||||
|
@ -291,7 +305,8 @@ static int freecom_transport(struct scsi_cmnd *srb, struct us_data *us)
|
|||
result = usb_stor_bulk_transfer_buf (us, opipe, fcb,
|
||||
FCM_PACKET_LENGTH, NULL);
|
||||
|
||||
/* The Freecom device will only fail if there is something
|
||||
/*
|
||||
* The Freecom device will only fail if there is something
|
||||
* wrong in USB land. It returns the status in its own
|
||||
* registers, which come back in the bulk pipe.
|
||||
*/
|
||||
|
@ -318,9 +333,11 @@ static int freecom_transport(struct scsi_cmnd *srb, struct us_data *us)
|
|||
return USB_STOR_TRANSPORT_FAILED;
|
||||
}
|
||||
|
||||
/* The device might not have as much data available as we
|
||||
/*
|
||||
* The device might not have as much data available as we
|
||||
* requested. If you ask for more than the device has, this reads
|
||||
* and such will hang. */
|
||||
* and such will hang.
|
||||
*/
|
||||
usb_stor_dbg(us, "Device indicates that it has %d bytes available\n",
|
||||
le16_to_cpu(fst->Count));
|
||||
usb_stor_dbg(us, "SCSI requested %d\n", scsi_bufflen(srb));
|
||||
|
@ -344,16 +361,20 @@ static int freecom_transport(struct scsi_cmnd *srb, struct us_data *us)
|
|||
length);
|
||||
}
|
||||
|
||||
/* What we do now depends on what direction the data is supposed to
|
||||
* move in. */
|
||||
/*
|
||||
* What we do now depends on what direction the data is supposed to
|
||||
* move in.
|
||||
*/
|
||||
|
||||
switch (us->srb->sc_data_direction) {
|
||||
case DMA_FROM_DEVICE:
|
||||
/* catch bogus "read 0 length" case */
|
||||
if (!length)
|
||||
break;
|
||||
/* Make sure that the status indicates that the device
|
||||
* wants data as well. */
|
||||
/*
|
||||
* Make sure that the status indicates that the device
|
||||
* wants data as well.
|
||||
*/
|
||||
if ((fst->Status & DRQ_STAT) == 0 || (fst->Reason & 3) != 2) {
|
||||
usb_stor_dbg(us, "SCSI wants data, drive doesn't have any\n");
|
||||
return USB_STOR_TRANSPORT_FAILED;
|
||||
|
@ -384,8 +405,10 @@ static int freecom_transport(struct scsi_cmnd *srb, struct us_data *us)
|
|||
/* catch bogus "write 0 length" case */
|
||||
if (!length)
|
||||
break;
|
||||
/* Make sure the status indicates that the device wants to
|
||||
* send us data. */
|
||||
/*
|
||||
* Make sure the status indicates that the device wants to
|
||||
* send us data.
|
||||
*/
|
||||
/* !!IMPLEMENT!! */
|
||||
result = freecom_writedata (srb, us, ipipe, opipe, length);
|
||||
if (result != USB_STOR_TRANSPORT_GOOD)
|
||||
|
@ -431,7 +454,8 @@ static int init_freecom(struct us_data *us)
|
|||
int result;
|
||||
char *buffer = us->iobuf;
|
||||
|
||||
/* The DMA-mapped I/O buffer is 64 bytes long, just right for
|
||||
/*
|
||||
* The DMA-mapped I/O buffer is 64 bytes long, just right for
|
||||
* all our packets. No need to allocate any extra buffer space.
|
||||
*/
|
||||
|
||||
|
@ -440,7 +464,8 @@ static int init_freecom(struct us_data *us)
|
|||
buffer[32] = '\0';
|
||||
usb_stor_dbg(us, "String returned from FC init is: %s\n", buffer);
|
||||
|
||||
/* Special thanks to the people at Freecom for providing me with
|
||||
/*
|
||||
* Special thanks to the people at Freecom for providing me with
|
||||
* this "magic sequence", which they use in their Windows and MacOS
|
||||
* drivers to make sure that all the attached perhiperals are
|
||||
* properly reset.
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
/* Special Initializers for certain USB Mass Storage devices
|
||||
/*
|
||||
* Special Initializers for certain USB Mass Storage devices
|
||||
*
|
||||
* Current development and maintenance by:
|
||||
* (c) 1999, 2000 Matthew Dharm (mdharm-usb@one-eyed-alien.net)
|
||||
|
@ -42,8 +43,10 @@
|
|||
#include "debug.h"
|
||||
#include "transport.h"
|
||||
|
||||
/* This places the Shuttle/SCM USB<->SCSI bridge devices in multi-target
|
||||
* mode */
|
||||
/*
|
||||
* This places the Shuttle/SCM USB<->SCSI bridge devices in multi-target
|
||||
* mode
|
||||
*/
|
||||
int usb_stor_euscsi_init(struct us_data *us)
|
||||
{
|
||||
int result;
|
||||
|
@ -57,8 +60,10 @@ int usb_stor_euscsi_init(struct us_data *us)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* This function is required to activate all four slots on the UCR-61S2B
|
||||
* flash reader */
|
||||
/*
|
||||
* This function is required to activate all four slots on the UCR-61S2B
|
||||
* flash reader
|
||||
*/
|
||||
int usb_stor_ucr61s2b_init(struct us_data *us)
|
||||
{
|
||||
struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap*) us->iobuf;
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
/* Header file for Special Initializers for certain USB Mass Storage devices
|
||||
/*
|
||||
* Header file for Special Initializers for certain USB Mass Storage devices
|
||||
*
|
||||
* Current development and maintenance by:
|
||||
* (c) 1999, 2000 Matthew Dharm (mdharm-usb@one-eyed-alien.net)
|
||||
|
@ -38,12 +39,16 @@
|
|||
#include "usb.h"
|
||||
#include "transport.h"
|
||||
|
||||
/* This places the Shuttle/SCM USB<->SCSI bridge devices in multi-target
|
||||
* mode */
|
||||
/*
|
||||
* This places the Shuttle/SCM USB<->SCSI bridge devices in multi-target
|
||||
* mode
|
||||
*/
|
||||
int usb_stor_euscsi_init(struct us_data *us);
|
||||
|
||||
/* This function is required to activate all four slots on the UCR-61S2B
|
||||
* flash reader */
|
||||
/*
|
||||
* This function is required to activate all four slots on the UCR-61S2B
|
||||
* flash reader
|
||||
*/
|
||||
int usb_stor_ucr61s2b_init(struct us_data *us);
|
||||
|
||||
/* This places the HUAWEI E220 devices in multi-port mode */
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
/* Transport & Protocol Driver for In-System Design, Inc. ISD200 ASIC
|
||||
/*
|
||||
* Transport & Protocol Driver for In-System Design, Inc. ISD200 ASIC
|
||||
*
|
||||
* Current development and maintenance:
|
||||
* (C) 2001-2002 Björn Stenberg (bjorn@haxx.se)
|
||||
|
@ -628,7 +629,8 @@ static void isd200_invoke_transport( struct us_data *us,
|
|||
srb->cmd_len = sizeof(ataCdb->generic);
|
||||
transferStatus = usb_stor_Bulk_transport(srb, us);
|
||||
|
||||
/* if the command gets aborted by the higher layers, we need to
|
||||
/*
|
||||
* if the command gets aborted by the higher layers, we need to
|
||||
* short-circuit all other processing
|
||||
*/
|
||||
if (test_bit(US_FLIDX_TIMED_OUT, &us->dflags)) {
|
||||
|
@ -695,15 +697,18 @@ static void isd200_invoke_transport( struct us_data *us,
|
|||
}
|
||||
}
|
||||
|
||||
/* Regardless of auto-sense, if we _know_ we have an error
|
||||
/*
|
||||
* Regardless of auto-sense, if we _know_ we have an error
|
||||
* condition, show that in the result code
|
||||
*/
|
||||
if (transferStatus == USB_STOR_TRANSPORT_FAILED)
|
||||
srb->result = SAM_STAT_CHECK_CONDITION;
|
||||
return;
|
||||
|
||||
/* abort processing: the bulk-only transport requires a reset
|
||||
* following an abort */
|
||||
/*
|
||||
* abort processing: the bulk-only transport requires a reset
|
||||
* following an abort
|
||||
*/
|
||||
Handle_Abort:
|
||||
srb->result = DID_ABORT << 16;
|
||||
|
||||
|
@ -965,20 +970,22 @@ static int isd200_try_enum(struct us_data *us, unsigned char master_slave,
|
|||
info->DeviceHead = master_slave;
|
||||
break;
|
||||
}
|
||||
/* check Cylinder High/Low to
|
||||
determine if it is an ATAPI device
|
||||
*/
|
||||
/*
|
||||
* check Cylinder High/Low to
|
||||
* determine if it is an ATAPI device
|
||||
*/
|
||||
else if (regs[ATA_REG_HCYL_OFFSET] == 0xEB &&
|
||||
regs[ATA_REG_LCYL_OFFSET] == 0x14) {
|
||||
/* It seems that the RICOH
|
||||
MP6200A CD/RW drive will
|
||||
report itself okay as a
|
||||
slave when it is really a
|
||||
master. So this check again
|
||||
as a master device just to
|
||||
make sure it doesn't report
|
||||
itself okay as a master also
|
||||
*/
|
||||
/*
|
||||
* It seems that the RICOH
|
||||
* MP6200A CD/RW drive will
|
||||
* report itself okay as a
|
||||
* slave when it is really a
|
||||
* master. So this check again
|
||||
* as a master device just to
|
||||
* make sure it doesn't report
|
||||
* itself okay as a master also
|
||||
*/
|
||||
if ((master_slave & ATA_ADDRESS_DEVHEAD_SLAVE) &&
|
||||
!recheckAsMaster) {
|
||||
usb_stor_dbg(us, " Identified ATAPI device as slave. Rechecking again as master\n");
|
||||
|
@ -1176,9 +1183,11 @@ static int isd200_get_inquiry_data( struct us_data *us )
|
|||
if (id[ATA_ID_COMMAND_SET_2] & COMMANDSET_MEDIA_STATUS) {
|
||||
usb_stor_dbg(us, " Device supports Media Status Notification\n");
|
||||
|
||||
/* Indicate that it is enabled, even though it is not
|
||||
* This allows the lock/unlock of the media to work
|
||||
* correctly.
|
||||
/*
|
||||
* Indicate that it is enabled, even
|
||||
* though it is not.
|
||||
* This allows the lock/unlock of the
|
||||
* media to work correctly.
|
||||
*/
|
||||
info->DeviceFlags |= DF_MEDIA_STATUS_ENABLED;
|
||||
}
|
||||
|
@ -1197,7 +1206,7 @@ static int isd200_get_inquiry_data( struct us_data *us )
|
|||
usb_stor_dbg(us, "Protocol changed to: %s\n",
|
||||
us->protocol_name);
|
||||
|
||||
/* Free driver structure */
|
||||
/* Free driver structure */
|
||||
us->extra_destructor(info);
|
||||
kfree(info);
|
||||
us->extra = NULL;
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
/* Driver for Lexar "Jumpshot" Compact Flash reader
|
||||
/*
|
||||
* Driver for Lexar "Jumpshot" Compact Flash reader
|
||||
*
|
||||
* jumpshot driver v0.1:
|
||||
*
|
||||
|
@ -618,18 +619,23 @@ static int jumpshot_transport(struct scsi_cmnd *srb, struct us_data *us)
|
|||
}
|
||||
|
||||
if (srb->cmnd[0] == ALLOW_MEDIUM_REMOVAL) {
|
||||
// sure. whatever. not like we can stop the user from popping
|
||||
// the media out of the device (no locking doors, etc)
|
||||
//
|
||||
/*
|
||||
* sure. whatever. not like we can stop the user from popping
|
||||
* the media out of the device (no locking doors, etc)
|
||||
*/
|
||||
return USB_STOR_TRANSPORT_GOOD;
|
||||
}
|
||||
|
||||
if (srb->cmnd[0] == START_STOP) {
|
||||
/* this is used by sd.c'check_scsidisk_media_change to detect
|
||||
media change */
|
||||
/*
|
||||
* this is used by sd.c'check_scsidisk_media_change to detect
|
||||
* media change
|
||||
*/
|
||||
usb_stor_dbg(us, "START_STOP\n");
|
||||
/* the first jumpshot_id_device after a media change returns
|
||||
an error (determined experimentally) */
|
||||
/*
|
||||
* the first jumpshot_id_device after a media change returns
|
||||
* an error (determined experimentally)
|
||||
*/
|
||||
rc = jumpshot_id_device(us, info);
|
||||
if (rc == USB_STOR_TRANSPORT_GOOD) {
|
||||
info->sense_key = NO_SENSE;
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
/* Driver for Rio Karma
|
||||
/*
|
||||
* Driver for Rio Karma
|
||||
*
|
||||
* (c) 2006 Bob Copeland <me@bobcopeland.com>
|
||||
* (c) 2006 Keith Bennett <keith@mcs.st-and.ac.uk>
|
||||
|
|
|
@ -65,7 +65,8 @@ static int option_rezero(struct us_data *us)
|
|||
goto out;
|
||||
}
|
||||
|
||||
/* Some of the devices need to be asked for a response, but we don't
|
||||
/*
|
||||
* Some of the devices need to be asked for a response, but we don't
|
||||
* care what that response is.
|
||||
*/
|
||||
usb_stor_bulk_transfer_buf(us,
|
||||
|
@ -140,7 +141,8 @@ int option_ms_init(struct us_data *us)
|
|||
|
||||
usb_stor_dbg(us, "Option MS: %s\n", "option_ms_init called");
|
||||
|
||||
/* Additional test for vendor information via INQUIRY,
|
||||
/*
|
||||
* Additional test for vendor information via INQUIRY,
|
||||
* because some vendor/product IDs are ambiguous
|
||||
*/
|
||||
result = option_inquiry(us);
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
/* Driver for USB Mass Storage compliant devices
|
||||
/*
|
||||
* Driver for USB Mass Storage compliant devices
|
||||
*
|
||||
* Current development and maintenance by:
|
||||
* (c) 1999-2002 Matthew Dharm (mdharm-usb@one-eyed-alien.net)
|
||||
|
@ -75,7 +76,8 @@ void usb_stor_pad12_command(struct scsi_cmnd *srb, struct us_data *us)
|
|||
|
||||
void usb_stor_ufi_command(struct scsi_cmnd *srb, struct us_data *us)
|
||||
{
|
||||
/* fix some commands -- this is a form of mode translation
|
||||
/*
|
||||
* fix some commands -- this is a form of mode translation
|
||||
* UFI devices only accept 12 byte long commands
|
||||
*
|
||||
* NOTE: This only works because a scsi_cmnd struct field contains
|
||||
|
@ -127,7 +129,8 @@ EXPORT_SYMBOL_GPL(usb_stor_transparent_scsi_command);
|
|||
* Scatter-gather transfer buffer access routines
|
||||
***********************************************************************/
|
||||
|
||||
/* Copy a buffer of length buflen to/from the srb's transfer buffer.
|
||||
/*
|
||||
* Copy a buffer of length buflen to/from the srb's transfer buffer.
|
||||
* Update the **sgptr and *offset variables so that the next copy will
|
||||
* pick up from where this one left off.
|
||||
*/
|
||||
|
@ -175,7 +178,8 @@ unsigned int usb_stor_access_xfer_buf(unsigned char *buffer,
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(usb_stor_access_xfer_buf);
|
||||
|
||||
/* Store the contents of buffer into srb's transfer buffer and set the
|
||||
/*
|
||||
* Store the contents of buffer into srb's transfer buffer and set the
|
||||
* SCSI residue.
|
||||
*/
|
||||
void usb_stor_set_xfer_buf(unsigned char *buffer,
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
/* Driver for USB Mass Storage compliant devices
|
||||
/*
|
||||
* Driver for USB Mass Storage compliant devices
|
||||
* Protocol Functions Header File
|
||||
*
|
||||
* Current development and maintenance by:
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
/* Driver for Realtek RTS51xx USB card reader
|
||||
/*
|
||||
* Driver for Realtek RTS51xx USB card reader
|
||||
*
|
||||
* Copyright(c) 2009 Realtek Semiconductor Corp. All rights reserved.
|
||||
*
|
||||
|
@ -267,8 +268,10 @@ static int rts51x_bulk_transport(struct us_data *us, u8 lun,
|
|||
if (bcs->Tag != us->tag)
|
||||
return USB_STOR_TRANSPORT_ERROR;
|
||||
|
||||
/* try to compute the actual residue, based on how much data
|
||||
* was really transferred and what the device tells us */
|
||||
/*
|
||||
* try to compute the actual residue, based on how much data
|
||||
* was really transferred and what the device tells us
|
||||
*/
|
||||
if (residue)
|
||||
residue = residue < buf_len ? residue : buf_len;
|
||||
|
||||
|
@ -286,7 +289,8 @@ static int rts51x_bulk_transport(struct us_data *us, u8 lun,
|
|||
return USB_STOR_TRANSPORT_FAILED;
|
||||
|
||||
case US_BULK_STAT_PHASE:
|
||||
/* phase error -- note that a transport reset will be
|
||||
/*
|
||||
* phase error -- note that a transport reset will be
|
||||
* invoked by the invoke_transport() function
|
||||
*/
|
||||
return USB_STOR_TRANSPORT_ERROR;
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
/* Driver for USB Mass Storage compliant devices
|
||||
/*
|
||||
* Driver for USB Mass Storage compliant devices
|
||||
* SCSI layer glue code
|
||||
*
|
||||
* Current development and maintenance by:
|
||||
|
@ -58,7 +59,8 @@
|
|||
#include "transport.h"
|
||||
#include "protocol.h"
|
||||
|
||||
/* Vendor IDs for companies that seem to include the READ CAPACITY bug
|
||||
/*
|
||||
* Vendor IDs for companies that seem to include the READ CAPACITY bug
|
||||
* in all their devices
|
||||
*/
|
||||
#define VENDOR_ID_NOKIA 0x0421
|
||||
|
@ -87,7 +89,8 @@ static int slave_alloc (struct scsi_device *sdev)
|
|||
*/
|
||||
sdev->inquiry_len = 36;
|
||||
|
||||
/* USB has unusual DMA-alignment requirements: Although the
|
||||
/*
|
||||
* USB has unusual DMA-alignment requirements: Although the
|
||||
* starting address of each scatter-gather element doesn't matter,
|
||||
* the length of each element except the last must be divisible
|
||||
* by the Bulk maxpacket value. There's currently no way to
|
||||
|
@ -115,7 +118,8 @@ static int slave_configure(struct scsi_device *sdev)
|
|||
{
|
||||
struct us_data *us = host_to_us(sdev->host);
|
||||
|
||||
/* Many devices have trouble transferring more than 32KB at a time,
|
||||
/*
|
||||
* Many devices have trouble transferring more than 32KB at a time,
|
||||
* while others have trouble with more than 64K. At this time we
|
||||
* are limiting both to 32K (64 sectores).
|
||||
*/
|
||||
|
@ -128,19 +132,22 @@ static int slave_configure(struct scsi_device *sdev)
|
|||
blk_queue_max_hw_sectors(sdev->request_queue,
|
||||
max_sectors);
|
||||
} else if (sdev->type == TYPE_TAPE) {
|
||||
/* Tapes need much higher max_sector limits, so just
|
||||
/*
|
||||
* Tapes need much higher max_sector limits, so just
|
||||
* raise it to the maximum possible (4 GB / 512) and
|
||||
* let the queue segment size sort out the real limit.
|
||||
*/
|
||||
blk_queue_max_hw_sectors(sdev->request_queue, 0x7FFFFF);
|
||||
} else if (us->pusb_dev->speed >= USB_SPEED_SUPER) {
|
||||
/* USB3 devices will be limited to 2048 sectors. This gives us
|
||||
/*
|
||||
* USB3 devices will be limited to 2048 sectors. This gives us
|
||||
* better throughput on most devices.
|
||||
*/
|
||||
blk_queue_max_hw_sectors(sdev->request_queue, 2048);
|
||||
}
|
||||
|
||||
/* Some USB host controllers can't do DMA; they have to use PIO.
|
||||
/*
|
||||
* Some USB host controllers can't do DMA; they have to use PIO.
|
||||
* They indicate this by setting their dma_mask to NULL. For
|
||||
* such controllers we need to make sure the block layer sets
|
||||
* up bounce buffers in addressable memory.
|
||||
|
@ -148,17 +155,21 @@ static int slave_configure(struct scsi_device *sdev)
|
|||
if (!us->pusb_dev->bus->controller->dma_mask)
|
||||
blk_queue_bounce_limit(sdev->request_queue, BLK_BOUNCE_HIGH);
|
||||
|
||||
/* We can't put these settings in slave_alloc() because that gets
|
||||
/*
|
||||
* We can't put these settings in slave_alloc() because that gets
|
||||
* called before the device type is known. Consequently these
|
||||
* settings can't be overridden via the scsi devinfo mechanism. */
|
||||
* settings can't be overridden via the scsi devinfo mechanism.
|
||||
*/
|
||||
if (sdev->type == TYPE_DISK) {
|
||||
|
||||
/* Some vendors seem to put the READ CAPACITY bug into
|
||||
/*
|
||||
* Some vendors seem to put the READ CAPACITY bug into
|
||||
* all their devices -- primarily makers of cell phones
|
||||
* and digital cameras. Since these devices always use
|
||||
* flash media and can be expected to have an even number
|
||||
* of sectors, we will always enable the CAPACITY_HEURISTICS
|
||||
* flag unless told otherwise. */
|
||||
* flag unless told otherwise.
|
||||
*/
|
||||
switch (le16_to_cpu(us->pusb_dev->descriptor.idVendor)) {
|
||||
case VENDOR_ID_NOKIA:
|
||||
case VENDOR_ID_NIKON:
|
||||
|
@ -170,28 +181,36 @@ static int slave_configure(struct scsi_device *sdev)
|
|||
break;
|
||||
}
|
||||
|
||||
/* Disk-type devices use MODE SENSE(6) if the protocol
|
||||
/*
|
||||
* Disk-type devices use MODE SENSE(6) if the protocol
|
||||
* (SubClass) is Transparent SCSI, otherwise they use
|
||||
* MODE SENSE(10). */
|
||||
* MODE SENSE(10).
|
||||
*/
|
||||
if (us->subclass != USB_SC_SCSI && us->subclass != USB_SC_CYP_ATACB)
|
||||
sdev->use_10_for_ms = 1;
|
||||
|
||||
/* Many disks only accept MODE SENSE transfer lengths of
|
||||
* 192 bytes (that's what Windows uses). */
|
||||
/*
|
||||
*Many disks only accept MODE SENSE transfer lengths of
|
||||
* 192 bytes (that's what Windows uses).
|
||||
*/
|
||||
sdev->use_192_bytes_for_3f = 1;
|
||||
|
||||
/* Some devices don't like MODE SENSE with page=0x3f,
|
||||
/*
|
||||
* Some devices don't like MODE SENSE with page=0x3f,
|
||||
* which is the command used for checking if a device
|
||||
* is write-protected. Now that we tell the sd driver
|
||||
* to do a 192-byte transfer with this command the
|
||||
* majority of devices work fine, but a few still can't
|
||||
* handle it. The sd driver will simply assume those
|
||||
* devices are write-enabled. */
|
||||
* devices are write-enabled.
|
||||
*/
|
||||
if (us->fflags & US_FL_NO_WP_DETECT)
|
||||
sdev->skip_ms_page_3f = 1;
|
||||
|
||||
/* A number of devices have problems with MODE SENSE for
|
||||
* page x08, so we will skip it. */
|
||||
/*
|
||||
* A number of devices have problems with MODE SENSE for
|
||||
* page x08, so we will skip it.
|
||||
*/
|
||||
sdev->skip_ms_page_8 = 1;
|
||||
|
||||
/* Some devices don't handle VPD pages correctly */
|
||||
|
@ -203,15 +222,19 @@ static int slave_configure(struct scsi_device *sdev)
|
|||
/* Do not attempt to use WRITE SAME */
|
||||
sdev->no_write_same = 1;
|
||||
|
||||
/* Some disks return the total number of blocks in response
|
||||
/*
|
||||
* Some disks return the total number of blocks in response
|
||||
* to READ CAPACITY rather than the highest block number.
|
||||
* If this device makes that mistake, tell the sd driver. */
|
||||
* If this device makes that mistake, tell the sd driver.
|
||||
*/
|
||||
if (us->fflags & US_FL_FIX_CAPACITY)
|
||||
sdev->fix_capacity = 1;
|
||||
|
||||
/* A few disks have two indistinguishable version, one of
|
||||
/*
|
||||
* A few disks have two indistinguishable version, one of
|
||||
* which reports the correct capacity and the other does not.
|
||||
* The sd driver has to guess which is the case. */
|
||||
* The sd driver has to guess which is the case.
|
||||
*/
|
||||
if (us->fflags & US_FL_CAPACITY_HEURISTICS)
|
||||
sdev->guess_capacity = 1;
|
||||
|
||||
|
@ -232,26 +255,34 @@ static int slave_configure(struct scsi_device *sdev)
|
|||
if (sdev->scsi_level > SCSI_SPC_2)
|
||||
us->fflags |= US_FL_SANE_SENSE;
|
||||
|
||||
/* USB-IDE bridges tend to report SK = 0x04 (Non-recoverable
|
||||
/*
|
||||
* USB-IDE bridges tend to report SK = 0x04 (Non-recoverable
|
||||
* Hardware Error) when any low-level error occurs,
|
||||
* recoverable or not. Setting this flag tells the SCSI
|
||||
* midlayer to retry such commands, which frequently will
|
||||
* succeed and fix the error. The worst this can lead to
|
||||
* is an occasional series of retries that will all fail. */
|
||||
* is an occasional series of retries that will all fail.
|
||||
*/
|
||||
sdev->retry_hwerror = 1;
|
||||
|
||||
/* USB disks should allow restart. Some drives spin down
|
||||
* automatically, requiring a START-STOP UNIT command. */
|
||||
/*
|
||||
* USB disks should allow restart. Some drives spin down
|
||||
* automatically, requiring a START-STOP UNIT command.
|
||||
*/
|
||||
sdev->allow_restart = 1;
|
||||
|
||||
/* Some USB cardreaders have trouble reading an sdcard's last
|
||||
/*
|
||||
* Some USB cardreaders have trouble reading an sdcard's last
|
||||
* sector in a larger then 1 sector read, since the performance
|
||||
* impact is negligible we set this flag for all USB disks */
|
||||
* impact is negligible we set this flag for all USB disks
|
||||
*/
|
||||
sdev->last_sector_bug = 1;
|
||||
|
||||
/* Enable last-sector hacks for single-target devices using
|
||||
/*
|
||||
* Enable last-sector hacks for single-target devices using
|
||||
* the Bulk-only transport, unless we already know the
|
||||
* capacity will be decremented or is correct. */
|
||||
* capacity will be decremented or is correct.
|
||||
*/
|
||||
if (!(us->fflags & (US_FL_FIX_CAPACITY | US_FL_CAPACITY_OK |
|
||||
US_FL_SCM_MULT_TARG)) &&
|
||||
us->protocol == USB_PR_BULK)
|
||||
|
@ -267,9 +298,11 @@ static int slave_configure(struct scsi_device *sdev)
|
|||
|
||||
} else {
|
||||
|
||||
/* Non-disk-type devices don't need to blacklist any pages
|
||||
/*
|
||||
* Non-disk-type devices don't need to blacklist any pages
|
||||
* or to force 192-byte transfer lengths for MODE SENSE.
|
||||
* But they do need to use MODE SENSE(10). */
|
||||
* 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 */
|
||||
|
@ -277,7 +310,8 @@ static int slave_configure(struct scsi_device *sdev)
|
|||
sdev->no_read_disc_info = 1;
|
||||
}
|
||||
|
||||
/* The CB and CBI transports have no way to pass LUN values
|
||||
/*
|
||||
* The CB and CBI transports have no way to pass LUN values
|
||||
* other than the bits in the second byte of a CDB. But those
|
||||
* bits don't get set to the LUN value if the device reports
|
||||
* scsi_level == 0 (UNKNOWN). Hence such devices must necessarily
|
||||
|
@ -287,13 +321,17 @@ static int slave_configure(struct scsi_device *sdev)
|
|||
sdev->scsi_level == SCSI_UNKNOWN)
|
||||
us->max_lun = 0;
|
||||
|
||||
/* Some devices choke when they receive a PREVENT-ALLOW MEDIUM
|
||||
* REMOVAL command, so suppress those commands. */
|
||||
/*
|
||||
* Some devices choke when they receive a PREVENT-ALLOW MEDIUM
|
||||
* REMOVAL command, so suppress those commands.
|
||||
*/
|
||||
if (us->fflags & US_FL_NOT_LOCKABLE)
|
||||
sdev->lockable = 0;
|
||||
|
||||
/* this is to satisfy the compiler, tho I don't think the
|
||||
* return code is ever checked anywhere. */
|
||||
/*
|
||||
* this is to satisfy the compiler, tho I don't think the
|
||||
* return code is ever checked anywhere.
|
||||
*/
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -367,8 +405,10 @@ static int command_abort(struct scsi_cmnd *srb)
|
|||
|
||||
usb_stor_dbg(us, "%s called\n", __func__);
|
||||
|
||||
/* us->srb together with the TIMED_OUT, RESETTING, and ABORTING
|
||||
* bits are protected by the host lock. */
|
||||
/*
|
||||
* us->srb together with the TIMED_OUT, RESETTING, and ABORTING
|
||||
* bits are protected by the host lock.
|
||||
*/
|
||||
scsi_lock(us_to_host(us));
|
||||
|
||||
/* Is this command still active? */
|
||||
|
@ -378,11 +418,13 @@ static int command_abort(struct scsi_cmnd *srb)
|
|||
return FAILED;
|
||||
}
|
||||
|
||||
/* Set the TIMED_OUT bit. Also set the ABORTING bit, but only if
|
||||
/*
|
||||
* Set the TIMED_OUT bit. Also set the ABORTING bit, but only if
|
||||
* a device reset isn't already in progress (to avoid interfering
|
||||
* with the reset). Note that we must retain the host lock while
|
||||
* calling usb_stor_stop_transport(); otherwise it might interfere
|
||||
* with an auto-reset that begins as soon as we release the lock. */
|
||||
* with an auto-reset that begins as soon as we release the lock.
|
||||
*/
|
||||
set_bit(US_FLIDX_TIMED_OUT, &us->dflags);
|
||||
if (!test_bit(US_FLIDX_RESETTING, &us->dflags)) {
|
||||
set_bit(US_FLIDX_ABORTING, &us->dflags);
|
||||
|
@ -395,8 +437,10 @@ static int command_abort(struct scsi_cmnd *srb)
|
|||
return SUCCESS;
|
||||
}
|
||||
|
||||
/* This invokes the transport reset mechanism to reset the state of the
|
||||
* device */
|
||||
/*
|
||||
* This invokes the transport reset mechanism to reset the state of the
|
||||
* device
|
||||
*/
|
||||
static int device_reset(struct scsi_cmnd *srb)
|
||||
{
|
||||
struct us_data *us = host_to_us(srb->device->host);
|
||||
|
@ -424,9 +468,11 @@ static int bus_reset(struct scsi_cmnd *srb)
|
|||
return result < 0 ? FAILED : SUCCESS;
|
||||
}
|
||||
|
||||
/* Report a driver-initiated device reset to the SCSI layer.
|
||||
/*
|
||||
* Report a driver-initiated device reset to the SCSI layer.
|
||||
* Calling this for a SCSI-initiated reset is unnecessary but harmless.
|
||||
* The caller must own the SCSI host lock. */
|
||||
* The caller must own the SCSI host lock.
|
||||
*/
|
||||
void usb_stor_report_device_reset(struct us_data *us)
|
||||
{
|
||||
int i;
|
||||
|
@ -439,9 +485,11 @@ void usb_stor_report_device_reset(struct us_data *us)
|
|||
}
|
||||
}
|
||||
|
||||
/* Report a driver-initiated bus reset to the SCSI layer.
|
||||
/*
|
||||
* Report a driver-initiated bus reset to the SCSI layer.
|
||||
* Calling this for a SCSI-initiated reset is unnecessary but harmless.
|
||||
* The caller must not own the SCSI host lock. */
|
||||
* The caller must not own the SCSI host lock.
|
||||
*/
|
||||
void usb_stor_report_bus_reset(struct us_data *us)
|
||||
{
|
||||
struct Scsi_Host *host = us_to_host(us);
|
||||
|
@ -590,7 +638,8 @@ static const struct scsi_host_template usb_stor_host_template = {
|
|||
*/
|
||||
.max_sectors = 240,
|
||||
|
||||
/* merge commands... this seems to help performance, but
|
||||
/*
|
||||
* merge commands... this seems to help performance, but
|
||||
* periodically someone should test to see which setting is more
|
||||
* optimal.
|
||||
*/
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
/* Driver for USB Mass Storage compliant devices
|
||||
/*
|
||||
* Driver for USB Mass Storage compliant devices
|
||||
* SCSI Connecting Glue Header File
|
||||
*
|
||||
* Current development and maintenance by:
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
/* Driver for SanDisk SDDR-09 SmartMedia reader
|
||||
/*
|
||||
* Driver for SanDisk SDDR-09 SmartMedia reader
|
||||
*
|
||||
* (c) 2000, 2001 Robert Baruch (autophile@starband.net)
|
||||
* (c) 2002 Andries Brouwer (aeb@cwi.nl)
|
||||
|
@ -799,10 +800,12 @@ sddr09_read_data(struct us_data *us,
|
|||
usb_stor_dbg(us, "Read %d zero pages (LBA %d) page %d\n",
|
||||
pages, lba, page);
|
||||
|
||||
/* This is not really an error. It just means
|
||||
that the block has never been written.
|
||||
Instead of returning an error
|
||||
it is better to return all zero data. */
|
||||
/*
|
||||
* This is not really an error. It just means
|
||||
* that the block has never been written.
|
||||
* Instead of returning an error
|
||||
* it is better to return all zero data.
|
||||
*/
|
||||
|
||||
memset(buffer, 0, len);
|
||||
|
||||
|
@ -890,8 +893,10 @@ sddr09_write_lba(struct us_data *us, unsigned int lba,
|
|||
}
|
||||
|
||||
if (pba == 1) {
|
||||
/* Maybe it is impossible to write to PBA 1.
|
||||
Fake success, but don't do anything. */
|
||||
/*
|
||||
* Maybe it is impossible to write to PBA 1.
|
||||
* Fake success, but don't do anything.
|
||||
*/
|
||||
printk(KERN_WARNING "sddr09: avoid writing to pba 1\n");
|
||||
return 0;
|
||||
}
|
||||
|
@ -979,18 +984,22 @@ sddr09_write_data(struct us_data *us,
|
|||
struct scatterlist *sg;
|
||||
int result;
|
||||
|
||||
// Figure out the initial LBA and page
|
||||
/* Figure out the initial LBA and page */
|
||||
lba = address >> info->blockshift;
|
||||
page = (address & info->blockmask);
|
||||
maxlba = info->capacity >> (info->pageshift + info->blockshift);
|
||||
if (lba >= maxlba)
|
||||
return -EIO;
|
||||
|
||||
// blockbuffer is used for reading in the old data, overwriting
|
||||
// with the new data, and performing ECC calculations
|
||||
/*
|
||||
* blockbuffer is used for reading in the old data, overwriting
|
||||
* with the new data, and performing ECC calculations
|
||||
*/
|
||||
|
||||
/* TODO: instead of doing kmalloc/kfree for each write,
|
||||
add a bufferpointer to the info structure */
|
||||
/*
|
||||
* TODO: instead of doing kmalloc/kfree for each write,
|
||||
* add a bufferpointer to the info structure
|
||||
*/
|
||||
|
||||
pagelen = (1 << info->pageshift) + (1 << CONTROL_SHIFT);
|
||||
blocklen = (pagelen << info->blockshift);
|
||||
|
@ -1000,9 +1009,11 @@ sddr09_write_data(struct us_data *us,
|
|||
return -ENOMEM;
|
||||
}
|
||||
|
||||
// Since we don't write the user data directly to the device,
|
||||
// we have to create a bounce buffer and move the data a piece
|
||||
// at a time between the bounce buffer and the actual transfer buffer.
|
||||
/*
|
||||
* Since we don't write the user data directly to the device,
|
||||
* we have to create a bounce buffer and move the data a piece
|
||||
* at a time between the bounce buffer and the actual transfer buffer.
|
||||
*/
|
||||
|
||||
len = min(sectors, (unsigned int) info->blocksize) * info->pagesize;
|
||||
buffer = kmalloc(len, GFP_NOIO);
|
||||
|
@ -1018,7 +1029,7 @@ sddr09_write_data(struct us_data *us,
|
|||
|
||||
while (sectors > 0) {
|
||||
|
||||
// Write as many sectors as possible in this block
|
||||
/* Write as many sectors as possible in this block */
|
||||
|
||||
pages = min(sectors, info->blocksize - page);
|
||||
len = (pages << info->pageshift);
|
||||
|
@ -1031,7 +1042,7 @@ sddr09_write_data(struct us_data *us,
|
|||
break;
|
||||
}
|
||||
|
||||
// Get the data from the transfer buffer
|
||||
/* Get the data from the transfer buffer */
|
||||
usb_stor_access_xfer_buf(buffer, len, us->srb,
|
||||
&sg, &offset, FROM_XFER_BUF);
|
||||
|
||||
|
@ -1168,9 +1179,11 @@ sddr09_get_cardinfo(struct us_data *us, unsigned char flags) {
|
|||
/* Byte 1 is the device type */
|
||||
cardinfo = nand_find_id(deviceID[1]);
|
||||
if (cardinfo) {
|
||||
/* MB or MiB? It is neither. A 16 MB card has
|
||||
17301504 raw bytes, of which 16384000 are
|
||||
usable for user data. */
|
||||
/*
|
||||
* MB or MiB? It is neither. A 16 MB card has
|
||||
* 17301504 raw bytes, of which 16384000 are
|
||||
* usable for user data.
|
||||
*/
|
||||
sprintf(blurbtxt + strlen(blurbtxt),
|
||||
", %d MB", 1<<(cardinfo->chipshift - 20));
|
||||
} else {
|
||||
|
@ -1211,14 +1224,18 @@ sddr09_read_map(struct us_data *us) {
|
|||
if (!info->capacity)
|
||||
return -1;
|
||||
|
||||
// size of a block is 1 << (blockshift + pageshift) bytes
|
||||
// divide into the total capacity to get the number of blocks
|
||||
/*
|
||||
* size of a block is 1 << (blockshift + pageshift) bytes
|
||||
* divide into the total capacity to get the number of blocks
|
||||
*/
|
||||
|
||||
numblocks = info->capacity >> (info->blockshift + info->pageshift);
|
||||
|
||||
// read 64 bytes for every block (actually 1 << CONTROL_SHIFT)
|
||||
// but only use a 64 KB buffer
|
||||
// buffer size used must be a multiple of (1 << CONTROL_SHIFT)
|
||||
/*
|
||||
* read 64 bytes for every block (actually 1 << CONTROL_SHIFT)
|
||||
* but only use a 64 KB buffer
|
||||
* buffer size used must be a multiple of (1 << CONTROL_SHIFT)
|
||||
*/
|
||||
#define SDDR09_READ_MAP_BUFSZ 65536
|
||||
|
||||
alloc_blocks = min(numblocks, SDDR09_READ_MAP_BUFSZ >> CONTROL_SHIFT);
|
||||
|
@ -1575,8 +1592,10 @@ static int sddr09_transport(struct scsi_cmnd *srb, struct us_data *us)
|
|||
|
||||
havefakesense = 1;
|
||||
|
||||
/* Dummy up a response for INQUIRY since SDDR09 doesn't
|
||||
respond to INQUIRY commands */
|
||||
/*
|
||||
* Dummy up a response for INQUIRY since SDDR09 doesn't
|
||||
* respond to INQUIRY commands
|
||||
*/
|
||||
|
||||
if (srb->cmnd[0] == INQUIRY) {
|
||||
memcpy(ptr, inquiry_response, 8);
|
||||
|
@ -1628,8 +1647,10 @@ static int sddr09_transport(struct scsi_cmnd *srb, struct us_data *us)
|
|||
if (srb->cmnd[0] == MODE_SENSE_10) {
|
||||
int modepage = (srb->cmnd[2] & 0x3F);
|
||||
|
||||
/* They ask for the Read/Write error recovery page,
|
||||
or for all pages. */
|
||||
/*
|
||||
* They ask for the Read/Write error recovery page,
|
||||
* or for all pages.
|
||||
*/
|
||||
/* %% We should check DBD %% */
|
||||
if (modepage == 0x01 || modepage == 0x3F) {
|
||||
usb_stor_dbg(us, "Dummy up request for mode page 0x%x\n",
|
||||
|
@ -1682,7 +1703,8 @@ static int sddr09_transport(struct scsi_cmnd *srb, struct us_data *us)
|
|||
USB_STOR_TRANSPORT_ERROR);
|
||||
}
|
||||
|
||||
/* catch-all for all other commands, except
|
||||
/*
|
||||
* catch-all for all other commands, except
|
||||
* pass TEST_UNIT_READY and REQUEST_SENSE through
|
||||
*/
|
||||
if (srb->cmnd[0] != TEST_UNIT_READY &&
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
/* Driver for SanDisk SDDR-55 SmartMedia reader
|
||||
/*
|
||||
* Driver for SanDisk SDDR-55 SmartMedia reader
|
||||
*
|
||||
* SDDR55 driver v0.1:
|
||||
*
|
||||
|
@ -130,7 +131,8 @@ sddr55_bulk_transport(struct us_data *us, int direction,
|
|||
return usb_stor_bulk_transfer_buf(us, pipe, data, len, NULL);
|
||||
}
|
||||
|
||||
/* check if card inserted, if there is, update read_only status
|
||||
/*
|
||||
* check if card inserted, if there is, update read_only status
|
||||
* return non zero if no card
|
||||
*/
|
||||
|
||||
|
@ -714,15 +716,18 @@ static int sddr55_read_map(struct us_data *us) {
|
|||
if (max_lba > 1000)
|
||||
max_lba = 1000;
|
||||
|
||||
// Each block is 64 bytes of control data, so block i is located in
|
||||
// scatterlist block i*64/128k = i*(2^6)*(2^-17) = i*(2^-11)
|
||||
/*
|
||||
* Each block is 64 bytes of control data, so block i is located in
|
||||
* scatterlist block i*64/128k = i*(2^6)*(2^-17) = i*(2^-11)
|
||||
*/
|
||||
|
||||
for (i=0; i<numblocks; i++) {
|
||||
int zone = i / 1024;
|
||||
|
||||
lba = short_pack(buffer[i * 2], buffer[i * 2 + 1]);
|
||||
|
||||
/* Every 1024 physical blocks ("zone"), the LBA numbers
|
||||
/*
|
||||
* Every 1024 physical blocks ("zone"), the LBA numbers
|
||||
* go back to zero, but are within a higher
|
||||
* block of LBA's. Also, there is a maximum of
|
||||
* 1000 LBA's per zone. In other words, in PBA
|
||||
|
@ -733,7 +738,8 @@ static int sddr55_read_map(struct us_data *us) {
|
|||
* are 24 spare blocks to use when blocks do go bad.
|
||||
*/
|
||||
|
||||
/* SDDR55 returns 0xffff for a bad block, and 0x400 for the
|
||||
/*
|
||||
* SDDR55 returns 0xffff for a bad block, and 0x400 for the
|
||||
* CIS block. (Is this true for cards 8MB or less??)
|
||||
* Record these in the physical to logical map
|
||||
*/
|
||||
|
@ -824,8 +830,10 @@ static int sddr55_transport(struct scsi_cmnd *srb, struct us_data *us)
|
|||
|
||||
memset (info->sense_data, 0, sizeof info->sense_data);
|
||||
|
||||
/* Dummy up a response for INQUIRY since SDDR55 doesn't
|
||||
respond to INQUIRY commands */
|
||||
/*
|
||||
* Dummy up a response for INQUIRY since SDDR55 doesn't
|
||||
* respond to INQUIRY commands
|
||||
*/
|
||||
|
||||
if (srb->cmnd[0] == INQUIRY) {
|
||||
memcpy(ptr, inquiry_response, 8);
|
||||
|
@ -833,7 +841,8 @@ static int sddr55_transport(struct scsi_cmnd *srb, struct us_data *us)
|
|||
return USB_STOR_TRANSPORT_GOOD;
|
||||
}
|
||||
|
||||
/* only check card status if the map isn't allocated, ie no card seen yet
|
||||
/*
|
||||
* only check card status if the map isn't allocated, ie no card seen yet
|
||||
* or if it's been over half a second since we last accessed it
|
||||
*/
|
||||
if (info->lba_to_pba == NULL || time_after(jiffies, info->last_access + HZ/2)) {
|
||||
|
@ -849,8 +858,10 @@ static int sddr55_transport(struct scsi_cmnd *srb, struct us_data *us)
|
|||
}
|
||||
}
|
||||
|
||||
/* if we detected a problem with the map when writing,
|
||||
don't allow any more access */
|
||||
/*
|
||||
* if we detected a problem with the map when writing,
|
||||
* don't allow any more access
|
||||
*/
|
||||
if (info->fatal_error) {
|
||||
|
||||
set_sense_info (3, 0x31, 0);
|
||||
|
@ -868,12 +879,16 @@ static int sddr55_transport(struct scsi_cmnd *srb, struct us_data *us)
|
|||
|
||||
info->capacity = capacity;
|
||||
|
||||
/* figure out the maximum logical block number, allowing for
|
||||
* the fact that only 250 out of every 256 are used */
|
||||
/*
|
||||
* figure out the maximum logical block number, allowing for
|
||||
* the fact that only 250 out of every 256 are used
|
||||
*/
|
||||
info->max_log_blks = ((info->capacity >> (info->pageshift + info->blockshift)) / 256) * 250;
|
||||
|
||||
/* Last page in the card, adjust as we only use 250 out of
|
||||
* every 256 pages */
|
||||
/*
|
||||
* Last page in the card, adjust as we only use 250 out of
|
||||
* every 256 pages
|
||||
*/
|
||||
capacity = (capacity / 256) * 250;
|
||||
|
||||
capacity /= PAGESIZE;
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
/* Driver for SCM Microsystems (a.k.a. Shuttle) USB-ATAPI cable
|
||||
/*
|
||||
* Driver for SCM Microsystems (a.k.a. Shuttle) USB-ATAPI cable
|
||||
*
|
||||
* Current development and maintenance by:
|
||||
* (c) 2000, 2001 Robert Baruch (autophile@starband.net)
|
||||
|
@ -408,7 +409,8 @@ static int usbat_wait_not_busy(struct us_data *us, int minutes)
|
|||
int result;
|
||||
unsigned char *status = us->iobuf;
|
||||
|
||||
/* Synchronizing cache on a CDR could take a heck of a long time,
|
||||
/*
|
||||
* Synchronizing cache on a CDR could take a heck of a long time,
|
||||
* but probably not more than 10 minutes or so. On the other hand,
|
||||
* doing a full blank on a CDRW at speed 1 will take about 75
|
||||
* minutes!
|
||||
|
@ -1570,9 +1572,10 @@ static int usbat_hp8200e_transport(struct scsi_cmnd *srb, struct us_data *us)
|
|||
|
||||
len = scsi_bufflen(srb);
|
||||
|
||||
/* Send A0 (ATA PACKET COMMAND).
|
||||
Note: I guess we're never going to get any of the ATA
|
||||
commands... just ATA Packet Commands.
|
||||
/*
|
||||
* Send A0 (ATA PACKET COMMAND).
|
||||
* Note: I guess we're never going to get any of the ATA
|
||||
* commands... just ATA Packet Commands.
|
||||
*/
|
||||
|
||||
registers[0] = USBAT_ATA_FEATURES;
|
||||
|
@ -1851,7 +1854,8 @@ static int usbat_probe(struct usb_interface *intf,
|
|||
if (result)
|
||||
return result;
|
||||
|
||||
/* The actual transport will be determined later by the
|
||||
/*
|
||||
* The actual transport will be determined later by the
|
||||
* initialization routine; this is just a placeholder.
|
||||
*/
|
||||
us->transport_name = "Shuttle USBAT";
|
||||
|
|
|
@ -177,7 +177,8 @@ int sierra_ms_init(struct us_data *us)
|
|||
|
||||
debug_swoc(&us->pusb_dev->dev, swocInfo);
|
||||
|
||||
/* If there is not Linux software on the TRU-Install device
|
||||
/*
|
||||
* If there is not Linux software on the TRU-Install device
|
||||
* then switch to modem mode
|
||||
*/
|
||||
if (!containsFullLinuxPackage(swocInfo)) {
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
/* Driver for USB Mass Storage compliant devices
|
||||
/*
|
||||
* Driver for USB Mass Storage compliant devices
|
||||
*
|
||||
* Current development and maintenance by:
|
||||
* (c) 1999-2002 Matthew Dharm (mdharm-usb@one-eyed-alien.net)
|
||||
|
@ -109,7 +110,8 @@
|
|||
* called more than once or from being called during usb_submit_urb().
|
||||
*/
|
||||
|
||||
/* This is the completion handler which will wake us up when an URB
|
||||
/*
|
||||
* This is the completion handler which will wake us up when an URB
|
||||
* completes.
|
||||
*/
|
||||
static void usb_stor_blocking_completion(struct urb *urb)
|
||||
|
@ -119,7 +121,8 @@ static void usb_stor_blocking_completion(struct urb *urb)
|
|||
complete(urb_done_ptr);
|
||||
}
|
||||
|
||||
/* This is the common part of the URB message submission code
|
||||
/*
|
||||
* This is the common part of the URB message submission code
|
||||
*
|
||||
* All URBs from the usb-storage driver involved in handling a queued scsi
|
||||
* command _must_ pass through this function (or something like it) for the
|
||||
|
@ -142,10 +145,12 @@ static int usb_stor_msg_common(struct us_data *us, int timeout)
|
|||
us->current_urb->context = &urb_done;
|
||||
us->current_urb->transfer_flags = 0;
|
||||
|
||||
/* we assume that if transfer_buffer isn't us->iobuf then it
|
||||
/*
|
||||
* we assume that if transfer_buffer isn't us->iobuf then it
|
||||
* hasn't been mapped for DMA. Yes, this is clunky, but it's
|
||||
* easier than always having the caller tell us whether the
|
||||
* transfer buffer has already been mapped. */
|
||||
* transfer buffer has already been mapped.
|
||||
*/
|
||||
if (us->current_urb->transfer_buffer == us->iobuf)
|
||||
us->current_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
|
||||
us->current_urb->transfer_dma = us->iobuf_dma;
|
||||
|
@ -157,8 +162,10 @@ static int usb_stor_msg_common(struct us_data *us, int timeout)
|
|||
return status;
|
||||
}
|
||||
|
||||
/* since the URB has been submitted successfully, it's now okay
|
||||
* to cancel it */
|
||||
/*
|
||||
* since the URB has been submitted successfully, it's now okay
|
||||
* to cancel it
|
||||
*/
|
||||
set_bit(US_FLIDX_URB_ACTIVE, &us->dflags);
|
||||
|
||||
/* did an abort occur during the submission? */
|
||||
|
@ -220,7 +227,8 @@ int usb_stor_control_msg(struct us_data *us, unsigned int pipe,
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(usb_stor_control_msg);
|
||||
|
||||
/* This is a version of usb_clear_halt() that allows early termination and
|
||||
/*
|
||||
* This is a version of usb_clear_halt() that allows early termination and
|
||||
* doesn't read the status from the device -- this is because some devices
|
||||
* crash their internal firmware when the status is requested after a halt.
|
||||
*
|
||||
|
@ -280,8 +288,10 @@ static int interpret_urb_result(struct us_data *us, unsigned int pipe,
|
|||
|
||||
/* stalled */
|
||||
case -EPIPE:
|
||||
/* for control endpoints, (used by CB[I]) a stall indicates
|
||||
* a failed command */
|
||||
/*
|
||||
* for control endpoints, (used by CB[I]) a stall indicates
|
||||
* a failed command
|
||||
*/
|
||||
if (usb_pipecontrol(pipe)) {
|
||||
usb_stor_dbg(us, "-- stall on control pipe\n");
|
||||
return USB_STOR_XFER_STALLED;
|
||||
|
@ -433,8 +443,10 @@ static int usb_stor_bulk_transfer_sglist(struct us_data *us, unsigned int pipe,
|
|||
return USB_STOR_XFER_ERROR;
|
||||
}
|
||||
|
||||
/* since the block has been initialized successfully, it's now
|
||||
* okay to cancel it */
|
||||
/*
|
||||
* since the block has been initialized successfully, it's now
|
||||
* okay to cancel it
|
||||
*/
|
||||
set_bit(US_FLIDX_SG_ACTIVE, &us->dflags);
|
||||
|
||||
/* did an abort occur during the submission? */
|
||||
|
@ -515,7 +527,8 @@ EXPORT_SYMBOL_GPL(usb_stor_bulk_transfer_sg);
|
|||
* Transport routines
|
||||
***********************************************************************/
|
||||
|
||||
/* There are so many devices that report the capacity incorrectly,
|
||||
/*
|
||||
* There are so many devices that report the capacity incorrectly,
|
||||
* this routine was written to counteract some of the resulting
|
||||
* problems.
|
||||
*/
|
||||
|
@ -533,7 +546,8 @@ static void last_sector_hacks(struct us_data *us, struct scsi_cmnd *srb)
|
|||
[12] = 0x14 /* Record Not Found */
|
||||
};
|
||||
|
||||
/* If last-sector problems can't occur, whether because the
|
||||
/*
|
||||
* If last-sector problems can't occur, whether because the
|
||||
* capacity was already decremented or because the device is
|
||||
* known to report the correct capacity, then we don't need
|
||||
* to do anything.
|
||||
|
@ -559,13 +573,15 @@ static void last_sector_hacks(struct us_data *us, struct scsi_cmnd *srb)
|
|||
|
||||
if (srb->result == SAM_STAT_GOOD && scsi_get_resid(srb) == 0) {
|
||||
|
||||
/* The command succeeded. We know this device doesn't
|
||||
/*
|
||||
* The command succeeded. We know this device doesn't
|
||||
* have the last-sector bug, so stop checking it.
|
||||
*/
|
||||
us->use_last_sector_hacks = 0;
|
||||
|
||||
} else {
|
||||
/* The command failed. Allow up to 3 retries in case this
|
||||
/*
|
||||
* The command failed. Allow up to 3 retries in case this
|
||||
* is some normal sort of failure. After that, assume the
|
||||
* capacity is wrong and we're trying to access the sector
|
||||
* beyond the end. Replace the result code and sense data
|
||||
|
@ -581,7 +597,8 @@ static void last_sector_hacks(struct us_data *us, struct scsi_cmnd *srb)
|
|||
}
|
||||
|
||||
done:
|
||||
/* Don't reset the retry counter for TEST UNIT READY commands,
|
||||
/*
|
||||
* Don't reset the retry counter for TEST UNIT READY commands,
|
||||
* because they get issued after device resets which might be
|
||||
* caused by a failed last-sector access.
|
||||
*/
|
||||
|
@ -589,7 +606,8 @@ static void last_sector_hacks(struct us_data *us, struct scsi_cmnd *srb)
|
|||
us->last_sector_retries = 0;
|
||||
}
|
||||
|
||||
/* Invoke the transport and basic error-handling/recovery methods
|
||||
/*
|
||||
* Invoke the transport and basic error-handling/recovery methods
|
||||
*
|
||||
* This is used by the protocol layers to actually send the message to
|
||||
* the device and receive the response.
|
||||
|
@ -603,7 +621,8 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us)
|
|||
scsi_set_resid(srb, 0);
|
||||
result = us->transport(srb, us);
|
||||
|
||||
/* if the command gets aborted by the higher layers, we need to
|
||||
/*
|
||||
* if the command gets aborted by the higher layers, we need to
|
||||
* short-circuit all other processing
|
||||
*/
|
||||
if (test_bit(US_FLIDX_TIMED_OUT, &us->dflags)) {
|
||||
|
@ -628,7 +647,8 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us)
|
|||
|
||||
srb->result = SAM_STAT_GOOD;
|
||||
|
||||
/* Determine if we need to auto-sense
|
||||
/*
|
||||
* Determine if we need to auto-sense
|
||||
*
|
||||
* I normally don't use a flag like this, but it's almost impossible
|
||||
* to understand what's going on here if I don't.
|
||||
|
@ -728,7 +748,8 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us)
|
|||
goto Handle_Errors;
|
||||
}
|
||||
|
||||
/* Some devices claim to support larger sense but fail when
|
||||
/*
|
||||
* Some devices claim to support larger sense but fail when
|
||||
* trying to request it. When a transport failure happens
|
||||
* using US_FS_SANE_SENSE, we always retry with a standard
|
||||
* (small) sense request. This fixes some USB GSM modems
|
||||
|
@ -746,7 +767,8 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us)
|
|||
if (temp_result != USB_STOR_TRANSPORT_GOOD) {
|
||||
usb_stor_dbg(us, "-- auto-sense failure\n");
|
||||
|
||||
/* we skip the reset if this happens to be a
|
||||
/*
|
||||
* we skip the reset if this happens to be a
|
||||
* multi-target device, since failure of an
|
||||
* auto-sense is perfectly valid
|
||||
*/
|
||||
|
@ -756,7 +778,8 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us)
|
|||
return;
|
||||
}
|
||||
|
||||
/* If the sense data returned is larger than 18-bytes then we
|
||||
/*
|
||||
* If the sense data returned is larger than 18-bytes then we
|
||||
* assume this device supports requesting more in the future.
|
||||
* The response code must be 70h through 73h inclusive.
|
||||
*/
|
||||
|
@ -767,7 +790,8 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us)
|
|||
usb_stor_dbg(us, "-- SANE_SENSE support enabled\n");
|
||||
us->fflags |= US_FL_SANE_SENSE;
|
||||
|
||||
/* Indicate to the user that we truncated their sense
|
||||
/*
|
||||
* Indicate to the user that we truncated their sense
|
||||
* because we didn't know it supported larger sense.
|
||||
*/
|
||||
usb_stor_dbg(us, "-- Sense data truncated to %i from %i\n",
|
||||
|
@ -795,13 +819,15 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us)
|
|||
SCSI_SENSE_BUFFERSIZE, 4);
|
||||
fm_ili = (scdd ? scdd[3] : srb->sense_buffer[2]) & 0xA0;
|
||||
|
||||
/* We often get empty sense data. This could indicate that
|
||||
/*
|
||||
* We often get empty sense data. This could indicate that
|
||||
* everything worked or that there was an unspecified
|
||||
* problem. We have to decide which.
|
||||
*/
|
||||
if (sshdr.sense_key == 0 && sshdr.asc == 0 && sshdr.ascq == 0 &&
|
||||
fm_ili == 0) {
|
||||
/* If things are really okay, then let's show that.
|
||||
/*
|
||||
* If things are really okay, then let's show that.
|
||||
* Zero out the sense buffer so the higher layers
|
||||
* won't realize we did an unsolicited auto-sense.
|
||||
*/
|
||||
|
@ -809,7 +835,8 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us)
|
|||
srb->result = SAM_STAT_GOOD;
|
||||
srb->sense_buffer[0] = 0x0;
|
||||
|
||||
/* If there was a problem, report an unspecified
|
||||
/*
|
||||
* If there was a problem, report an unspecified
|
||||
* hardware error to prevent the higher layers from
|
||||
* entering an infinite retry loop.
|
||||
*/
|
||||
|
@ -860,20 +887,26 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us)
|
|||
last_sector_hacks(us, srb);
|
||||
return;
|
||||
|
||||
/* Error and abort processing: try to resynchronize with the device
|
||||
/*
|
||||
* Error and abort processing: try to resynchronize with the device
|
||||
* by issuing a port reset. If that fails, try a class-specific
|
||||
* device reset. */
|
||||
* device reset.
|
||||
*/
|
||||
Handle_Errors:
|
||||
|
||||
/* Set the RESETTING bit, and clear the ABORTING bit so that
|
||||
* the reset may proceed. */
|
||||
/*
|
||||
* Set the RESETTING bit, and clear the ABORTING bit so that
|
||||
* the reset may proceed.
|
||||
*/
|
||||
scsi_lock(us_to_host(us));
|
||||
set_bit(US_FLIDX_RESETTING, &us->dflags);
|
||||
clear_bit(US_FLIDX_ABORTING, &us->dflags);
|
||||
scsi_unlock(us_to_host(us));
|
||||
|
||||
/* We must release the device lock because the pre_reset routine
|
||||
* will want to acquire it. */
|
||||
/*
|
||||
* We must release the device lock because the pre_reset routine
|
||||
* will want to acquire it.
|
||||
*/
|
||||
mutex_unlock(&us->dev_mutex);
|
||||
result = usb_stor_port_reset(us);
|
||||
mutex_lock(&us->dev_mutex);
|
||||
|
@ -891,10 +924,12 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us)
|
|||
/* Stop the current URB transfer */
|
||||
void usb_stor_stop_transport(struct us_data *us)
|
||||
{
|
||||
/* If the state machine is blocked waiting for an URB,
|
||||
/*
|
||||
* If the state machine is blocked waiting for an URB,
|
||||
* let's wake it up. The test_and_clear_bit() call
|
||||
* guarantees that if a URB has just been submitted,
|
||||
* it won't be cancelled more than once. */
|
||||
* it won't be cancelled more than once.
|
||||
*/
|
||||
if (test_and_clear_bit(US_FLIDX_URB_ACTIVE, &us->dflags)) {
|
||||
usb_stor_dbg(us, "-- cancelling URB\n");
|
||||
usb_unlink_urb(us->current_urb);
|
||||
|
@ -955,7 +990,8 @@ int usb_stor_CB_transport(struct scsi_cmnd *srb, struct us_data *us)
|
|||
|
||||
/* STATUS STAGE */
|
||||
|
||||
/* NOTE: CB does not have a status stage. Silly, I know. So
|
||||
/*
|
||||
* NOTE: CB does not have a status stage. Silly, I know. So
|
||||
* we have to catch this at a higher level.
|
||||
*/
|
||||
if (us->protocol != USB_PR_CBI)
|
||||
|
@ -967,7 +1003,8 @@ int usb_stor_CB_transport(struct scsi_cmnd *srb, struct us_data *us)
|
|||
if (result != USB_STOR_XFER_GOOD)
|
||||
return USB_STOR_TRANSPORT_ERROR;
|
||||
|
||||
/* UFI gives us ASC and ASCQ, like a request sense
|
||||
/*
|
||||
* UFI gives us ASC and ASCQ, like a request sense
|
||||
*
|
||||
* REQUEST_SENSE and INQUIRY don't affect the sense data on UFI
|
||||
* devices, so we ignore the information for those commands. Note
|
||||
|
@ -983,7 +1020,8 @@ int usb_stor_CB_transport(struct scsi_cmnd *srb, struct us_data *us)
|
|||
return USB_STOR_TRANSPORT_GOOD;
|
||||
}
|
||||
|
||||
/* If not UFI, we interpret the data as a result code
|
||||
/*
|
||||
* If not UFI, we interpret the data as a result code
|
||||
* The first byte should always be a 0x0.
|
||||
*
|
||||
* Some bogus devices don't follow that rule. They stuff the ASC
|
||||
|
@ -1005,7 +1043,8 @@ int usb_stor_CB_transport(struct scsi_cmnd *srb, struct us_data *us)
|
|||
}
|
||||
return USB_STOR_TRANSPORT_ERROR;
|
||||
|
||||
/* the CBI spec requires that the bulk pipe must be cleared
|
||||
/*
|
||||
* the CBI spec requires that the bulk pipe must be cleared
|
||||
* following any data-in/out command failure (section 2.4.3.1.3)
|
||||
*/
|
||||
Failed:
|
||||
|
@ -1107,9 +1146,11 @@ int usb_stor_Bulk_transport(struct scsi_cmnd *srb, struct us_data *us)
|
|||
/* DATA STAGE */
|
||||
/* send/receive data payload, if there is any */
|
||||
|
||||
/* Some USB-IDE converter chips need a 100us delay between the
|
||||
/*
|
||||
* Some USB-IDE converter chips need a 100us delay between the
|
||||
* command phase and the data phase. Some devices need a little
|
||||
* more than that, probably because of clock rate inaccuracies. */
|
||||
* more than that, probably because of clock rate inaccuracies.
|
||||
*/
|
||||
if (unlikely(us->fflags & US_FL_GO_SLOW))
|
||||
usleep_range(125, 150);
|
||||
|
||||
|
@ -1121,7 +1162,8 @@ int usb_stor_Bulk_transport(struct scsi_cmnd *srb, struct us_data *us)
|
|||
if (result == USB_STOR_XFER_ERROR)
|
||||
return USB_STOR_TRANSPORT_ERROR;
|
||||
|
||||
/* If the device tried to send back more data than the
|
||||
/*
|
||||
* If the device tried to send back more data than the
|
||||
* amount requested, the spec requires us to transfer
|
||||
* the CSW anyway. Since there's no point retrying the
|
||||
* the command, we'll return fake sense data indicating
|
||||
|
@ -1156,7 +1198,8 @@ int usb_stor_Bulk_transport(struct scsi_cmnd *srb, struct us_data *us)
|
|||
}
|
||||
}
|
||||
|
||||
/* See flow chart on pg 15 of the Bulk Only Transport spec for
|
||||
/*
|
||||
* See flow chart on pg 15 of the Bulk Only Transport spec for
|
||||
* an explanation of how this code works.
|
||||
*/
|
||||
|
||||
|
@ -1165,7 +1208,8 @@ int usb_stor_Bulk_transport(struct scsi_cmnd *srb, struct us_data *us)
|
|||
result = usb_stor_bulk_transfer_buf(us, us->recv_bulk_pipe,
|
||||
bcs, US_BULK_CS_WRAP_LEN, &cswlen);
|
||||
|
||||
/* Some broken devices add unnecessary zero-length packets to the
|
||||
/*
|
||||
* Some broken devices add unnecessary zero-length packets to the
|
||||
* end of their data transfers. Such packets show up as 0-length
|
||||
* CSWs. If we encounter such a thing, try to read the CSW again.
|
||||
*/
|
||||
|
@ -1201,7 +1245,8 @@ int usb_stor_Bulk_transport(struct scsi_cmnd *srb, struct us_data *us)
|
|||
return USB_STOR_TRANSPORT_ERROR;
|
||||
}
|
||||
|
||||
/* Some broken devices report odd signatures, so we do not check them
|
||||
/*
|
||||
* Some broken devices report odd signatures, so we do not check them
|
||||
* for validity against the spec. We store the first one we see,
|
||||
* and check subsequent transfers for validity against this signature.
|
||||
*/
|
||||
|
@ -1217,11 +1262,14 @@ int usb_stor_Bulk_transport(struct scsi_cmnd *srb, struct us_data *us)
|
|||
return USB_STOR_TRANSPORT_ERROR;
|
||||
}
|
||||
|
||||
/* try to compute the actual residue, based on how much data
|
||||
* was really transferred and what the device tells us */
|
||||
/*
|
||||
* try to compute the actual residue, based on how much data
|
||||
* was really transferred and what the device tells us
|
||||
*/
|
||||
if (residue && !(us->fflags & US_FL_IGNORE_RESIDUE)) {
|
||||
|
||||
/* Heuristically detect devices that generate bogus residues
|
||||
/*
|
||||
* Heuristically detect devices that generate bogus residues
|
||||
* by seeing what happens with INQUIRY and READ CAPACITY
|
||||
* commands.
|
||||
*/
|
||||
|
@ -1259,7 +1307,8 @@ int usb_stor_Bulk_transport(struct scsi_cmnd *srb, struct us_data *us)
|
|||
return USB_STOR_TRANSPORT_FAILED;
|
||||
|
||||
case US_BULK_STAT_PHASE:
|
||||
/* phase error -- note that a transport reset will be
|
||||
/*
|
||||
* phase error -- note that a transport reset will be
|
||||
* invoked by the invoke_transport() function
|
||||
*/
|
||||
return USB_STOR_TRANSPORT_ERROR;
|
||||
|
@ -1274,7 +1323,8 @@ EXPORT_SYMBOL_GPL(usb_stor_Bulk_transport);
|
|||
* Reset routines
|
||||
***********************************************************************/
|
||||
|
||||
/* This is the common part of the device reset code.
|
||||
/*
|
||||
* This is the common part of the device reset code.
|
||||
*
|
||||
* It's handy that every transport mechanism uses the control endpoint for
|
||||
* resets.
|
||||
|
@ -1302,8 +1352,10 @@ static int usb_stor_reset_common(struct us_data *us,
|
|||
return result;
|
||||
}
|
||||
|
||||
/* Give the device some time to recover from the reset,
|
||||
* but don't delay disconnect processing. */
|
||||
/*
|
||||
* Give the device some time to recover from the reset,
|
||||
* but don't delay disconnect processing.
|
||||
*/
|
||||
wait_event_interruptible_timeout(us->delay_wait,
|
||||
test_bit(US_FLIDX_DISCONNECTING, &us->dflags),
|
||||
HZ*6);
|
||||
|
@ -1328,8 +1380,7 @@ static int usb_stor_reset_common(struct us_data *us,
|
|||
return result;
|
||||
}
|
||||
|
||||
/* This issues a CB[I] Reset to the device in question
|
||||
*/
|
||||
/* This issues a CB[I] Reset to the device in question */
|
||||
#define CB_RESET_CMD_SIZE 12
|
||||
|
||||
int usb_stor_CB_reset(struct us_data *us)
|
||||
|
@ -1343,7 +1394,8 @@ int usb_stor_CB_reset(struct us_data *us)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(usb_stor_CB_reset);
|
||||
|
||||
/* This issues a Bulk-only Reset to the device in question, including
|
||||
/*
|
||||
* This issues a Bulk-only Reset to the device in question, including
|
||||
* clearing the subsequent endpoint halts that may occur.
|
||||
*/
|
||||
int usb_stor_Bulk_reset(struct us_data *us)
|
||||
|
@ -1354,7 +1406,8 @@ int usb_stor_Bulk_reset(struct us_data *us)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(usb_stor_Bulk_reset);
|
||||
|
||||
/* Issue a USB port reset to the device. The caller must not hold
|
||||
/*
|
||||
* Issue a USB port reset to the device. The caller must not hold
|
||||
* us->dev_mutex.
|
||||
*/
|
||||
int usb_stor_port_reset(struct us_data *us)
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
/* Driver for USB Mass Storage compliant devices
|
||||
/*
|
||||
* Driver for USB Mass Storage compliant devices
|
||||
* Transport Functions Header File
|
||||
*
|
||||
* Current development and maintenance by:
|
||||
|
|
|
@ -799,7 +799,8 @@ static int uas_slave_alloc(struct scsi_device *sdev)
|
|||
|
||||
sdev->hostdata = devinfo;
|
||||
|
||||
/* USB has unusual DMA-alignment requirements: Although the
|
||||
/*
|
||||
* USB has unusual DMA-alignment requirements: Although the
|
||||
* starting address of each scatter-gather element doesn't matter,
|
||||
* the length of each element except the last must be divisible
|
||||
* by the Bulk maxpacket value. There's currently no way to
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
/* Unusual Devices File for the Alauda-based card readers
|
||||
/*
|
||||
* Unusual Devices File for the Alauda-based card readers
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
/* Unusual Devices File for devices based on the Cypress USB/ATA bridge
|
||||
/*
|
||||
* Unusual Devices File for devices based on the Cypress USB/ATA bridge
|
||||
* with support for ATACB
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
/* Unusual Devices File for the Datafab USB Compact Flash reader
|
||||
/*
|
||||
* Unusual Devices File for the Datafab USB Compact Flash reader
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
|
@ -79,7 +80,8 @@ UNUSUAL_DEV( 0x07c4, 0xa109, 0x0000, 0xffff,
|
|||
USB_SC_SCSI, USB_PR_DATAFAB, NULL,
|
||||
0),
|
||||
|
||||
/* Reported by Felix Moeller <felix@derklecks.de>
|
||||
/*
|
||||
* Reported by Felix Moeller <felix@derklecks.de>
|
||||
* in Germany this is sold by Hama with the productnumber 46952
|
||||
* as "DualSlot CompactFlash(TM) & MStick Drive USB"
|
||||
*/
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
/* Driver for USB Mass Storage compliant devices
|
||||
/*
|
||||
* Driver for USB Mass Storage compliant devices
|
||||
* Unusual Devices File
|
||||
*
|
||||
* Current development and maintenance by:
|
||||
|
@ -25,13 +26,15 @@
|
|||
* 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
/* IMPORTANT NOTE: This file must be included in another file which does
|
||||
/*
|
||||
* IMPORTANT NOTE: This file must be included in another file which does
|
||||
* the following thing for it to work:
|
||||
* The UNUSUAL_DEV, COMPLIANT_DEV, and USUAL_DEV macros must be defined
|
||||
* before this file is included.
|
||||
*/
|
||||
|
||||
/* If you edit this file, please try to keep it sorted first by VendorID,
|
||||
/*
|
||||
* If you edit this file, please try to keep it sorted first by VendorID,
|
||||
* then by ProductID.
|
||||
*
|
||||
* If you want to add an entry for this file, be sure to include the
|
||||
|
@ -47,13 +50,15 @@
|
|||
* <usb-storage@lists.one-eyed-alien.net>
|
||||
*/
|
||||
|
||||
/* Note: If you add an entry only in order to set the CAPACITY_OK flag,
|
||||
/*
|
||||
* Note: If you add an entry only in order to set the CAPACITY_OK flag,
|
||||
* use the COMPLIANT_DEV macro instead of UNUSUAL_DEV. This is
|
||||
* because such entries mark devices which actually work correctly,
|
||||
* as opposed to devices that do something strangely or wrongly.
|
||||
*/
|
||||
|
||||
/* In-kernel mode switching is deprecated. Do not add new devices to
|
||||
/*
|
||||
* In-kernel mode switching is deprecated. Do not add new devices to
|
||||
* this list for the sole purpose of switching them to a different
|
||||
* mode. Existing userspace solutions are superior.
|
||||
*
|
||||
|
@ -66,8 +71,7 @@
|
|||
#define NO_SDDR09
|
||||
#endif
|
||||
|
||||
/* patch submitted by Vivian Bregier <Vivian.Bregier@imag.fr>
|
||||
*/
|
||||
/* patch submitted by Vivian Bregier <Vivian.Bregier@imag.fr> */
|
||||
UNUSUAL_DEV( 0x03eb, 0x2002, 0x0100, 0x0100,
|
||||
"ATMEL",
|
||||
"SND1 Storage",
|
||||
|
@ -93,7 +97,8 @@ UNUSUAL_DEV( 0x03f0, 0x070c, 0x0000, 0x0000,
|
|||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_SANE_SENSE ),
|
||||
|
||||
/* Reported by Grant Grundler <grundler@parisc-linux.org>
|
||||
/*
|
||||
* Reported by Grant Grundler <grundler@parisc-linux.org>
|
||||
* HP r707 camera in "Disk" mode with 2.00.23 or 2.00.24 firmware.
|
||||
*/
|
||||
UNUSUAL_DEV( 0x03f0, 0x4002, 0x0001, 0x0001,
|
||||
|
@ -107,7 +112,8 @@ UNUSUAL_DEV( 0x03f3, 0x0001, 0x0000, 0x9999,
|
|||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_euscsi_init,
|
||||
US_FL_SCM_MULT_TARG ),
|
||||
|
||||
/* Reported by Sebastian Kapfer <sebastian_kapfer@gmx.net>
|
||||
/*
|
||||
* Reported by Sebastian Kapfer <sebastian_kapfer@gmx.net>
|
||||
* and Olaf Hering <olh@suse.de> (different bcd's, same vendor/product)
|
||||
* for USB floppies that need the SINGLE_LUN enforcement.
|
||||
*/
|
||||
|
@ -124,7 +130,8 @@ UNUSUAL_DEV( 0x040d, 0x6205, 0x0003, 0x0003,
|
|||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_IGNORE_RESIDUE ),
|
||||
|
||||
/* Deduced by Jonathan Woithe <jwoithe@just42.net>
|
||||
/*
|
||||
* Deduced by Jonathan Woithe <jwoithe@just42.net>
|
||||
* Entry needed for flags: US_FL_FIX_INQUIRY because initial inquiry message
|
||||
* always fails and confuses drive.
|
||||
*/
|
||||
|
@ -167,8 +174,10 @@ UNUSUAL_DEV( 0x0420, 0x0001, 0x0100, 0x0100,
|
|||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_IGNORE_RESIDUE ),
|
||||
|
||||
/* Reported by Andrew Nayenko <relan@bk.ru>
|
||||
* Updated for new firmware by Phillip Potter <phillipinda@hotmail.com> */
|
||||
/*
|
||||
* Reported by Andrew Nayenko <relan@bk.ru>
|
||||
* Updated for new firmware by Phillip Potter <phillipinda@hotmail.com>
|
||||
*/
|
||||
UNUSUAL_DEV( 0x0421, 0x0019, 0x0592, 0x0610,
|
||||
"Nokia",
|
||||
"Nokia 6288",
|
||||
|
@ -196,16 +205,20 @@ UNUSUAL_DEV( 0x0421, 0x0434, 0x0100, 0x0100,
|
|||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_FIX_CAPACITY | US_FL_IGNORE_RESIDUE ),
|
||||
|
||||
/* Reported by Sumedha Swamy <sumedhaswamy@gmail.com> and
|
||||
* Einar Th. Einarsson <einarthered@gmail.com> */
|
||||
/*
|
||||
* Reported by Sumedha Swamy <sumedhaswamy@gmail.com> and
|
||||
* Einar Th. Einarsson <einarthered@gmail.com>
|
||||
*/
|
||||
UNUSUAL_DEV( 0x0421, 0x0444, 0x0100, 0x0100,
|
||||
"Nokia",
|
||||
"N91",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_IGNORE_RESIDUE | US_FL_FIX_CAPACITY ),
|
||||
|
||||
/* Reported by Jiri Slaby <jirislaby@gmail.com> and
|
||||
* Rene C. Castberg <Rene@Castberg.org> */
|
||||
/*
|
||||
* Reported by Jiri Slaby <jirislaby@gmail.com> and
|
||||
* Rene C. Castberg <Rene@Castberg.org>
|
||||
*/
|
||||
UNUSUAL_DEV( 0x0421, 0x0446, 0x0100, 0x0100,
|
||||
"Nokia",
|
||||
"N80",
|
||||
|
@ -269,8 +282,10 @@ UNUSUAL_DEV( 0x0436, 0x0005, 0x0100, 0x0100,
|
|||
US_FL_SINGLE_LUN ),
|
||||
#endif
|
||||
|
||||
/* Patch submitted by Daniel Drake <dsd@gentoo.org>
|
||||
* Device reports nonsense bInterfaceProtocol 6 when connected over USB2 */
|
||||
/*
|
||||
* Patch submitted by Daniel Drake <dsd@gentoo.org>
|
||||
* Device reports nonsense bInterfaceProtocol 6 when connected over USB2
|
||||
*/
|
||||
UNUSUAL_DEV( 0x0451, 0x5416, 0x0100, 0x0100,
|
||||
"Neuros Audio",
|
||||
"USB 2.0 HD 2.5",
|
||||
|
@ -288,17 +303,18 @@ UNUSUAL_DEV( 0x0457, 0x0150, 0x0100, 0x0100,
|
|||
USB_SC_DEVICE, USB_PR_DEVICE, NULL, US_FL_NOT_LOCKABLE ),
|
||||
|
||||
/*
|
||||
* Bohdan Linda <bohdan.linda@gmail.com>
|
||||
* 1GB USB sticks MyFlash High Speed. I have restricted
|
||||
* the revision to my model only
|
||||
*/
|
||||
* Bohdan Linda <bohdan.linda@gmail.com>
|
||||
* 1GB USB sticks MyFlash High Speed. I have restricted
|
||||
* the revision to my model only
|
||||
*/
|
||||
UNUSUAL_DEV( 0x0457, 0x0151, 0x0100, 0x0100,
|
||||
"USB 2.0",
|
||||
"Flash Disk",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_NOT_LOCKABLE ),
|
||||
|
||||
/* Reported by Tamas Kerecsen <kerecsen@bigfoot.com>
|
||||
/*
|
||||
* Reported by Tamas Kerecsen <kerecsen@bigfoot.com>
|
||||
* Obviously the PROM has not been customized by the VAR;
|
||||
* the Vendor and Product string descriptors are:
|
||||
* Generic Mass Storage (PROTOTYPE--Remember to change idVendor)
|
||||
|
@ -347,24 +363,30 @@ UNUSUAL_DEV( 0x0482, 0x0107, 0x0100, 0x0100,
|
|||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_FIX_CAPACITY | US_FL_NOT_LOCKABLE),
|
||||
|
||||
/* Reported by Paul Stewart <stewart@wetlogic.net>
|
||||
* This entry is needed because the device reports Sub=ff */
|
||||
/*
|
||||
* Reported by Paul Stewart <stewart@wetlogic.net>
|
||||
* This entry is needed because the device reports Sub=ff
|
||||
*/
|
||||
UNUSUAL_DEV( 0x04a4, 0x0004, 0x0001, 0x0001,
|
||||
"Hitachi",
|
||||
"DVD-CAM DZ-MV100A Camcorder",
|
||||
USB_SC_SCSI, USB_PR_CB, NULL, US_FL_SINGLE_LUN),
|
||||
|
||||
/* BENQ DC5330
|
||||
/*
|
||||
* BENQ DC5330
|
||||
* Reported by Manuel Fombuena <mfombuena@ya.com> and
|
||||
* Frank Copeland <fjc@thingy.apana.org.au> */
|
||||
* Frank Copeland <fjc@thingy.apana.org.au>
|
||||
*/
|
||||
UNUSUAL_DEV( 0x04a5, 0x3010, 0x0100, 0x0100,
|
||||
"Tekom Technologies, Inc",
|
||||
"300_CAMERA",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_IGNORE_RESIDUE ),
|
||||
|
||||
/* Patch for Nikon coolpix 2000
|
||||
* Submitted by Fabien Cosse <fabien.cosse@wanadoo.fr>*/
|
||||
/*
|
||||
* Patch for Nikon coolpix 2000
|
||||
* Submitted by Fabien Cosse <fabien.cosse@wanadoo.fr>
|
||||
*/
|
||||
UNUSUAL_DEV( 0x04b0, 0x0301, 0x0010, 0x0010,
|
||||
"NIKON",
|
||||
"NIKON DSC E2000",
|
||||
|
@ -378,21 +400,26 @@ UNUSUAL_DEV( 0x04b3, 0x4001, 0x0110, 0x0110,
|
|||
USB_SC_DEVICE, USB_PR_CB, NULL,
|
||||
US_FL_MAX_SECTORS_MIN),
|
||||
|
||||
/* Reported by Simon Levitt <simon@whattf.com>
|
||||
* This entry needs Sub and Proto fields */
|
||||
/*
|
||||
* Reported by Simon Levitt <simon@whattf.com>
|
||||
* This entry needs Sub and Proto fields
|
||||
*/
|
||||
UNUSUAL_DEV( 0x04b8, 0x0601, 0x0100, 0x0100,
|
||||
"Epson",
|
||||
"875DC Storage",
|
||||
USB_SC_SCSI, USB_PR_CB, NULL, US_FL_FIX_INQUIRY),
|
||||
|
||||
/* Reported by Khalid Aziz <khalid@gonehiking.org>
|
||||
* This entry is needed because the device reports Sub=ff */
|
||||
/*
|
||||
* Reported by Khalid Aziz <khalid@gonehiking.org>
|
||||
* This entry is needed because the device reports Sub=ff
|
||||
*/
|
||||
UNUSUAL_DEV( 0x04b8, 0x0602, 0x0110, 0x0110,
|
||||
"Epson",
|
||||
"785EPX Storage",
|
||||
USB_SC_SCSI, USB_PR_BULK, NULL, US_FL_SINGLE_LUN),
|
||||
|
||||
/* Not sure who reported this originally but
|
||||
/*
|
||||
* Not sure who reported this originally but
|
||||
* Pavel Machek <pavel@ucw.cz> reported that the extra US_FL_SINGLE_LUN
|
||||
* flag be added */
|
||||
UNUSUAL_DEV( 0x04cb, 0x0100, 0x0000, 0x2210,
|
||||
|
@ -400,7 +427,8 @@ UNUSUAL_DEV( 0x04cb, 0x0100, 0x0000, 0x2210,
|
|||
"FinePix 1400Zoom",
|
||||
USB_SC_UFI, USB_PR_DEVICE, NULL, US_FL_FIX_INQUIRY | US_FL_SINGLE_LUN),
|
||||
|
||||
/* Reported by Ondrej Zary <linux@rainbow-software.org>
|
||||
/*
|
||||
* Reported by Ondrej Zary <linux@rainbow-software.org>
|
||||
* The device reports one sector more and breaks when that sector is accessed
|
||||
*/
|
||||
UNUSUAL_DEV( 0x04ce, 0x0002, 0x026c, 0x026c,
|
||||
|
@ -409,7 +437,8 @@ UNUSUAL_DEV( 0x04ce, 0x0002, 0x026c, 0x026c,
|
|||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_FIX_CAPACITY),
|
||||
|
||||
/* Reported by Kriston Fincher <kriston@airmail.net>
|
||||
/*
|
||||
* Reported by Kriston Fincher <kriston@airmail.net>
|
||||
* Patch submitted by Sean Millichamp <sean@bruenor.org>
|
||||
* This is to support the Panasonic PalmCam PV-SD4090
|
||||
* This entry is needed because the device reports Sub=ff
|
||||
|
@ -419,8 +448,10 @@ UNUSUAL_DEV( 0x04da, 0x0901, 0x0100, 0x0200,
|
|||
"LS-120 Camera",
|
||||
USB_SC_UFI, USB_PR_DEVICE, NULL, 0),
|
||||
|
||||
/* From Yukihiro Nakai, via zaitcev@yahoo.com.
|
||||
* This is needed for CB instead of CBI */
|
||||
/*
|
||||
* From Yukihiro Nakai, via zaitcev@yahoo.com.
|
||||
* This is needed for CB instead of CBI
|
||||
*/
|
||||
UNUSUAL_DEV( 0x04da, 0x0d05, 0x0000, 0x0000,
|
||||
"Sharp CE-CW05",
|
||||
"CD-R/RW Drive",
|
||||
|
@ -440,7 +471,8 @@ UNUSUAL_DEV( 0x04da, 0x2373, 0x0000, 0x9999,
|
|||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_FIX_CAPACITY | US_FL_NOT_LOCKABLE ),
|
||||
|
||||
/* Most of the following entries were developed with the help of
|
||||
/*
|
||||
* Most of the following entries were developed with the help of
|
||||
* Shuttle/SCM directly.
|
||||
*/
|
||||
UNUSUAL_DEV( 0x04e6, 0x0001, 0x0200, 0x0200,
|
||||
|
@ -536,7 +568,8 @@ UNUSUAL_DEV( 0x04e8, 0x5136, 0x0000, 0x9999,
|
|||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_MAX_SECTORS_64),
|
||||
|
||||
/* Entry and supporting patch by Theodore Kilgore <kilgota@auburn.edu>.
|
||||
/*
|
||||
* Entry and supporting patch by Theodore Kilgore <kilgota@auburn.edu>.
|
||||
* Device uses standards-violating 32-byte Bulk Command Block Wrappers and
|
||||
* reports itself as "Proprietary SCSI Bulk." Cf. device entry 0x084d:0x0011.
|
||||
*/
|
||||
|
@ -553,7 +586,8 @@ UNUSUAL_DEV( 0x050d, 0x0115, 0x0133, 0x0133,
|
|||
USB_SC_SCSI, USB_PR_BULK, usb_stor_euscsi_init,
|
||||
US_FL_SCM_MULT_TARG ),
|
||||
|
||||
/* Iomega Clik! Drive
|
||||
/*
|
||||
* Iomega Clik! Drive
|
||||
* Reported by David Chatenay <dchatenay@hotmail.com>
|
||||
* The reason this is needed is not fully known.
|
||||
*/
|
||||
|
@ -570,7 +604,8 @@ COMPLIANT_DEV(0x0525, 0xa4a5, 0x0000, 0x9999,
|
|||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_CAPACITY_OK ),
|
||||
|
||||
/* Yakumo Mega Image 37
|
||||
/*
|
||||
* Yakumo Mega Image 37
|
||||
* Submitted by Stephan Fuhrmann <atomenergie@t-online.de> */
|
||||
UNUSUAL_DEV( 0x052b, 0x1801, 0x0100, 0x0100,
|
||||
"Tekom Technologies, Inc",
|
||||
|
@ -578,8 +613,10 @@ UNUSUAL_DEV( 0x052b, 0x1801, 0x0100, 0x0100,
|
|||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_IGNORE_RESIDUE ),
|
||||
|
||||
/* Another Yakumo camera.
|
||||
* Reported by Michele Alzetta <michele.alzetta@aliceposta.it> */
|
||||
/*
|
||||
* Another Yakumo camera.
|
||||
* Reported by Michele Alzetta <michele.alzetta@aliceposta.it>
|
||||
*/
|
||||
UNUSUAL_DEV( 0x052b, 0x1804, 0x0100, 0x0100,
|
||||
"Tekom Technologies, Inc",
|
||||
"300_CAMERA",
|
||||
|
@ -593,16 +630,20 @@ UNUSUAL_DEV( 0x052b, 0x1807, 0x0100, 0x0100,
|
|||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_IGNORE_RESIDUE ),
|
||||
|
||||
/* Yakumo Mega Image 47
|
||||
* Reported by Bjoern Paetzel <kolrabi@kolrabi.de> */
|
||||
/*
|
||||
* Yakumo Mega Image 47
|
||||
* Reported by Bjoern Paetzel <kolrabi@kolrabi.de>
|
||||
*/
|
||||
UNUSUAL_DEV( 0x052b, 0x1905, 0x0100, 0x0100,
|
||||
"Tekom Technologies, Inc",
|
||||
"400_CAMERA",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_IGNORE_RESIDUE ),
|
||||
|
||||
/* Reported by Paul Ortyl <ortylp@3miasto.net>
|
||||
* Note that it's similar to the device above, only different prodID */
|
||||
/*
|
||||
* Reported by Paul Ortyl <ortylp@3miasto.net>
|
||||
* Note that it's similar to the device above, only different prodID
|
||||
*/
|
||||
UNUSUAL_DEV( 0x052b, 0x1911, 0x0100, 0x0100,
|
||||
"Tekom Technologies, Inc",
|
||||
"400_CAMERA",
|
||||
|
@ -615,8 +656,10 @@ UNUSUAL_DEV( 0x054c, 0x0010, 0x0106, 0x0450,
|
|||
USB_SC_SCSI, USB_PR_DEVICE, NULL,
|
||||
US_FL_SINGLE_LUN | US_FL_NOT_LOCKABLE | US_FL_NO_WP_DETECT ),
|
||||
|
||||
/* Submitted by Lars Jacob <jacob.lars@googlemail.com>
|
||||
* This entry is needed because the device reports Sub=ff */
|
||||
/*
|
||||
* Submitted by Lars Jacob <jacob.lars@googlemail.com>
|
||||
* This entry is needed because the device reports Sub=ff
|
||||
*/
|
||||
UNUSUAL_DEV( 0x054c, 0x0010, 0x0500, 0x0610,
|
||||
"Sony",
|
||||
"DSC-T1/T5/H5",
|
||||
|
@ -719,7 +762,8 @@ UNUSUAL_DEV( 0x057b, 0x0000, 0x0000, 0x0299,
|
|||
USB_SC_DEVICE, USB_PR_CB, NULL,
|
||||
US_FL_SINGLE_LUN),
|
||||
|
||||
/* Reported by Johann Cardon <johann.cardon@free.fr>
|
||||
/*
|
||||
* Reported by Johann Cardon <johann.cardon@free.fr>
|
||||
* This entry is needed only because the device reports
|
||||
* bInterfaceClass = 0xff (vendor-specific)
|
||||
*/
|
||||
|
@ -741,7 +785,8 @@ UNUSUAL_DEV( 0x0595, 0x4343, 0x0000, 0x2210,
|
|||
"Digital Camera EX-20 DSC",
|
||||
USB_SC_8070, USB_PR_DEVICE, NULL, 0 ),
|
||||
|
||||
/* Reported by Andre Welter <a.r.welter@gmx.de>
|
||||
/*
|
||||
* Reported by Andre Welter <a.r.welter@gmx.de>
|
||||
* This antique device predates the release of the Bulk-only Transport
|
||||
* spec, and if it gets a Get-Max-LUN then it requires the host to do a
|
||||
* Clear-Halt on the bulk endpoints. The SINGLE_LUN flag will prevent
|
||||
|
@ -773,7 +818,8 @@ UNUSUAL_DEV( 0x059f, 0x0651, 0x0000, 0x0000,
|
|||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_NO_WP_DETECT ),
|
||||
|
||||
/* Submitted by Joel Bourquard <numlock@freesurf.ch>
|
||||
/*
|
||||
* Submitted by Joel Bourquard <numlock@freesurf.ch>
|
||||
* Some versions of this device need the SubClass and Protocol overrides
|
||||
* while others don't.
|
||||
*/
|
||||
|
@ -783,7 +829,8 @@ UNUSUAL_DEV( 0x05ab, 0x0060, 0x1104, 0x1110,
|
|||
USB_SC_SCSI, USB_PR_BULK, NULL,
|
||||
US_FL_NEED_OVERRIDE ),
|
||||
|
||||
/* Submitted by Sven Anderson <sven-linux@anderson.de>
|
||||
/*
|
||||
* Submitted by Sven Anderson <sven-linux@anderson.de>
|
||||
* There are at least four ProductIDs used for iPods, so I added 0x1202 and
|
||||
* 0x1204. They just need the US_FL_FIX_CAPACITY. As the bcdDevice appears
|
||||
* to change with firmware updates, I changed the range to maximum for all
|
||||
|
@ -824,7 +871,8 @@ UNUSUAL_DEV( 0x05ac, 0x120a, 0x0000, 0x9999,
|
|||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_FIX_CAPACITY ),
|
||||
|
||||
/* Reported by Dan Williams <dcbw@redhat.com>
|
||||
/*
|
||||
* Reported by Dan Williams <dcbw@redhat.com>
|
||||
* Option N.V. mobile broadband modems
|
||||
* Ignore driver CD mode and force into modem mode by default.
|
||||
*/
|
||||
|
@ -843,7 +891,8 @@ UNUSUAL_DEV( 0x05dc, 0xb002, 0x0000, 0x0113,
|
|||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_FIX_INQUIRY ),
|
||||
|
||||
/* The following two entries are for a Genesys USB to IDE
|
||||
/*
|
||||
* The following two entries are for a Genesys USB to IDE
|
||||
* converter chip, but it changes its ProductId depending
|
||||
* on whether or not a disk or an optical device is enclosed
|
||||
* They were originally reported by Alexander Oltu
|
||||
|
@ -873,8 +922,10 @@ UNUSUAL_DEV( 0x05e3, 0x0723, 0x9451, 0x9451,
|
|||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_SANE_SENSE ),
|
||||
|
||||
/* Reported by Hanno Boeck <hanno@gmx.de>
|
||||
* Taken from the Lycoris Kernel */
|
||||
/*
|
||||
* Reported by Hanno Boeck <hanno@gmx.de>
|
||||
* Taken from the Lycoris Kernel
|
||||
*/
|
||||
UNUSUAL_DEV( 0x0636, 0x0003, 0x0000, 0x9999,
|
||||
"Vivitar",
|
||||
"Vivicam 35Xx",
|
||||
|
@ -908,8 +959,10 @@ UNUSUAL_DEV( 0x067b, 0x2317, 0x0001, 0x001,
|
|||
US_FL_NOT_LOCKABLE ),
|
||||
|
||||
/* Reported by Richard -=[]=- <micro_flyer@hotmail.com> */
|
||||
/* Change to bcdDeviceMin (0x0100 to 0x0001) reported by
|
||||
* Thomas Bartosik <tbartdev@gmx-topmail.de> */
|
||||
/*
|
||||
* Change to bcdDeviceMin (0x0100 to 0x0001) reported by
|
||||
* Thomas Bartosik <tbartdev@gmx-topmail.de>
|
||||
*/
|
||||
UNUSUAL_DEV( 0x067b, 0x2507, 0x0001, 0x0100,
|
||||
"Prolific Technology Inc.",
|
||||
"Mass Storage Device",
|
||||
|
@ -961,7 +1014,8 @@ UNUSUAL_DEV( 0x071b, 0x3203, 0x0000, 0x0000,
|
|||
US_FL_NO_WP_DETECT | US_FL_MAX_SECTORS_64 |
|
||||
US_FL_NO_READ_CAPACITY_16),
|
||||
|
||||
/* Reported by Jean-Baptiste Onofre <jb@nanthrax.net>
|
||||
/*
|
||||
* Reported by Jean-Baptiste Onofre <jb@nanthrax.net>
|
||||
* Support the following product :
|
||||
* "Dane-Elec MediaTouch"
|
||||
*/
|
||||
|
@ -971,7 +1025,8 @@ UNUSUAL_DEV( 0x071b, 0x32bb, 0x0000, 0x0000,
|
|||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_NO_WP_DETECT | US_FL_MAX_SECTORS_64),
|
||||
|
||||
/* Reported by Massimiliano Ghilardi <massimiliano.ghilardi@gmail.com>
|
||||
/*
|
||||
* Reported by Massimiliano Ghilardi <massimiliano.ghilardi@gmail.com>
|
||||
* This USB MP3/AVI player device fails and disconnects if more than 128
|
||||
* sectors (64kB) are read/written in a single command, and may be present
|
||||
* at least in the following products:
|
||||
|
@ -1040,7 +1095,8 @@ UNUSUAL_DEV( 0x07af, 0x0006, 0x0100, 0x0100,
|
|||
US_FL_SINGLE_LUN ),
|
||||
#endif
|
||||
|
||||
/* Datafab KECF-USB / Sagatek DCS-CF / Simpletech Flashlink UCF-100
|
||||
/*
|
||||
* Datafab KECF-USB / Sagatek DCS-CF / Simpletech Flashlink UCF-100
|
||||
* Only revision 1.13 tested (same for all of the above devices,
|
||||
* based on the Datafab DF-UG-07 chip). Needed for US_FL_FIX_INQUIRY.
|
||||
* Submitted by Marek Michalkiewicz <marekm@amelek.gda.pl>.
|
||||
|
@ -1052,7 +1108,8 @@ UNUSUAL_DEV( 0x07c4, 0xa400, 0x0000, 0xffff,
|
|||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_FIX_INQUIRY | US_FL_FIX_CAPACITY ),
|
||||
|
||||
/* Reported by Rauch Wolke <rauchwolke@gmx.net>
|
||||
/*
|
||||
* Reported by Rauch Wolke <rauchwolke@gmx.net>
|
||||
* and augmented by binbin <binbinsh@gmail.com> (Bugzilla #12882)
|
||||
*/
|
||||
UNUSUAL_DEV( 0x07c4, 0xa4a5, 0x0000, 0xffff,
|
||||
|
@ -1061,7 +1118,8 @@ UNUSUAL_DEV( 0x07c4, 0xa4a5, 0x0000, 0xffff,
|
|||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_IGNORE_RESIDUE | US_FL_MAX_SECTORS_64 ),
|
||||
|
||||
/* Casio QV 2x00/3x00/4000/8000 digital still cameras are not conformant
|
||||
/*
|
||||
* Casio QV 2x00/3x00/4000/8000 digital still cameras are not conformant
|
||||
* to the USB storage specification in two ways:
|
||||
* - They tell us they are using transport protocol CBI. In reality they
|
||||
* are using transport protocol CB.
|
||||
|
@ -1119,7 +1177,8 @@ UNUSUAL_DEV( 0x084b, 0xa001, 0x0000, 0x9999,
|
|||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_euscsi_init,
|
||||
US_FL_SCM_MULT_TARG ),
|
||||
|
||||
/* Entry and supporting patch by Theodore Kilgore <kilgota@auburn.edu>.
|
||||
/*
|
||||
* Entry and supporting patch by Theodore Kilgore <kilgota@auburn.edu>.
|
||||
* Flag will support Bulk devices which use a standards-violating 32-byte
|
||||
* Command Block Wrapper. Here, the "DC2MEGA" cameras (several brands) with
|
||||
* Grandtech GT892x chip, which request "Proprietary SCSI Bulk" support.
|
||||
|
@ -1131,7 +1190,8 @@ UNUSUAL_DEV( 0x084d, 0x0011, 0x0110, 0x0110,
|
|||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_BULK32),
|
||||
|
||||
/* Reported by <ttkspam@free.fr>
|
||||
/*
|
||||
* Reported by <ttkspam@free.fr>
|
||||
* The device reports a vendor-specific device class, requiring an
|
||||
* explicit vendor/product match.
|
||||
*/
|
||||
|
@ -1140,11 +1200,12 @@ UNUSUAL_DEV( 0x0851, 0x1542, 0x0002, 0x0002,
|
|||
"FW_Omega2",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, NULL, 0),
|
||||
|
||||
/* Andrew Lunn <andrew@lunn.ch>
|
||||
/*
|
||||
* Andrew Lunn <andrew@lunn.ch>
|
||||
* PanDigital Digital Picture Frame. Does not like ALLOW_MEDIUM_REMOVAL
|
||||
* on LUN 4.
|
||||
* Note: Vend:Prod clash with "Ltd Maxell WS30 Slim Digital Camera"
|
||||
*/
|
||||
*/
|
||||
UNUSUAL_DEV( 0x0851, 0x1543, 0x0200, 0x0200,
|
||||
"PanDigital",
|
||||
"Photo Frame",
|
||||
|
@ -1170,7 +1231,8 @@ UNUSUAL_DEV( 0x08bd, 0x1100, 0x0000, 0x0000,
|
|||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_SINGLE_LUN),
|
||||
|
||||
/* Submitted by Dylan Taft <d13f00l@gmail.com>
|
||||
/*
|
||||
* Submitted by Dylan Taft <d13f00l@gmail.com>
|
||||
* US_FL_IGNORE_RESIDUE Needed
|
||||
*/
|
||||
UNUSUAL_DEV( 0x08ca, 0x3103, 0x0100, 0x0100,
|
||||
|
@ -1179,7 +1241,8 @@ UNUSUAL_DEV( 0x08ca, 0x3103, 0x0100, 0x0100,
|
|||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_IGNORE_RESIDUE),
|
||||
|
||||
/* Entry needed for flags. Moreover, all devices with this ID use
|
||||
/*
|
||||
* Entry needed for flags. Moreover, all devices with this ID use
|
||||
* bulk-only transport, but _some_ falsely report Control/Bulk instead.
|
||||
* One example is "Trumpion Digital Research MYMP3".
|
||||
* Submitted by Bjoern Brill <brill(at)fs.math.uni-frankfurt.de>
|
||||
|
@ -1190,7 +1253,8 @@ UNUSUAL_DEV( 0x090a, 0x1001, 0x0100, 0x0100,
|
|||
USB_SC_DEVICE, USB_PR_BULK, NULL,
|
||||
US_FL_NEED_OVERRIDE ),
|
||||
|
||||
/* Reported by Filippo Bardelli <filibard@libero.it>
|
||||
/*
|
||||
* Reported by Filippo Bardelli <filibard@libero.it>
|
||||
* The device reports a subclass of RBC, which is wrong.
|
||||
*/
|
||||
UNUSUAL_DEV( 0x090a, 0x1050, 0x0100, 0x0100,
|
||||
|
@ -1213,7 +1277,8 @@ UNUSUAL_DEV( 0x090c, 0x1132, 0x0000, 0xffff,
|
|||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_FIX_CAPACITY ),
|
||||
|
||||
/* Reported by Paul Hartman <paul.hartman+linux@gmail.com>
|
||||
/*
|
||||
* Reported by Paul Hartman <paul.hartman+linux@gmail.com>
|
||||
* This card reader returns "Illegal Request, Logical Block Address
|
||||
* Out of Range" for the first READ(10) after a new card is inserted.
|
||||
*/
|
||||
|
@ -1223,7 +1288,8 @@ UNUSUAL_DEV( 0x090c, 0x6000, 0x0100, 0x0100,
|
|||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_INITIAL_READ10 ),
|
||||
|
||||
/* This Pentax still camera is not conformant
|
||||
/*
|
||||
* This Pentax still camera is not conformant
|
||||
* to the USB storage specification: -
|
||||
* - It does not like the INQUIRY command. So we must handle this command
|
||||
* of the SCSI layer ourselves.
|
||||
|
@ -1236,8 +1302,10 @@ UNUSUAL_DEV( 0x0a17, 0x0004, 0x1000, 0x1000,
|
|||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_FIX_INQUIRY ),
|
||||
|
||||
/* These are virtual windows driver CDs, which the zd1211rw driver
|
||||
* automatically converts into WLAN devices. */
|
||||
/*
|
||||
* These are virtual windows driver CDs, which the zd1211rw driver
|
||||
* automatically converts into WLAN devices.
|
||||
*/
|
||||
UNUSUAL_DEV( 0x0ace, 0x2011, 0x0101, 0x0101,
|
||||
"ZyXEL",
|
||||
"G-220F USB-WLAN Install",
|
||||
|
@ -1250,7 +1318,8 @@ UNUSUAL_DEV( 0x0ace, 0x20ff, 0x0101, 0x0101,
|
|||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_IGNORE_DEVICE ),
|
||||
|
||||
/* Reported by Dan Williams <dcbw@redhat.com>
|
||||
/*
|
||||
* Reported by Dan Williams <dcbw@redhat.com>
|
||||
* Option N.V. mobile broadband modems
|
||||
* Ignore driver CD mode and force into modem mode by default.
|
||||
*/
|
||||
|
@ -1262,20 +1331,24 @@ UNUSUAL_DEV( 0x0af0, 0x6971, 0x0000, 0x9999,
|
|||
USB_SC_DEVICE, USB_PR_DEVICE, option_ms_init,
|
||||
0),
|
||||
|
||||
/* Reported by F. Aben <f.aben@option.com>
|
||||
/*
|
||||
* Reported by F. Aben <f.aben@option.com>
|
||||
* This device (wrongly) has a vendor-specific device descriptor.
|
||||
* The entry is needed so usb-storage can bind to it's mass-storage
|
||||
* interface as an interface driver */
|
||||
* interface as an interface driver
|
||||
*/
|
||||
UNUSUAL_DEV( 0x0af0, 0x7401, 0x0000, 0x0000,
|
||||
"Option",
|
||||
"GI 0401 SD-Card",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
0 ),
|
||||
|
||||
/* Reported by Jan Dumon <j.dumon@option.com>
|
||||
/*
|
||||
* Reported by Jan Dumon <j.dumon@option.com>
|
||||
* These devices (wrongly) have a vendor-specific device descriptor.
|
||||
* These entries are needed so usb-storage can bind to their mass-storage
|
||||
* interface as an interface driver */
|
||||
* interface as an interface driver
|
||||
*/
|
||||
UNUSUAL_DEV( 0x0af0, 0x7501, 0x0000, 0x0000,
|
||||
"Option",
|
||||
"GI 0431 SD-Card",
|
||||
|
@ -1419,7 +1492,8 @@ UNUSUAL_DEV( 0x0dc4, 0x0073, 0x0000, 0x0000,
|
|||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_FIX_CAPACITY),
|
||||
|
||||
/* Reported by Lubomir Blaha <tritol@trilogic.cz>
|
||||
/*
|
||||
* Reported by Lubomir Blaha <tritol@trilogic.cz>
|
||||
* I _REALLY_ don't know what 3rd, 4th number and all defines mean, but this
|
||||
* works for me. Can anybody correct these values? (I able to test corrected
|
||||
* version.)
|
||||
|
@ -1430,8 +1504,10 @@ UNUSUAL_DEV( 0x0dd8, 0x1060, 0x0000, 0xffff,
|
|||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_FIX_INQUIRY ),
|
||||
|
||||
/* Reported by Edward Chapman (taken from linux-usb mailing list)
|
||||
Netac OnlyDisk Mini U2CV2 512MB USB 2.0 Flash Drive */
|
||||
/*
|
||||
* Reported by Edward Chapman (taken from linux-usb mailing list)
|
||||
* Netac OnlyDisk Mini U2CV2 512MB USB 2.0 Flash Drive
|
||||
*/
|
||||
UNUSUAL_DEV( 0x0dd8, 0xd202, 0x0000, 0x9999,
|
||||
"Netac",
|
||||
"USB Flash Disk",
|
||||
|
@ -1439,8 +1515,10 @@ UNUSUAL_DEV( 0x0dd8, 0xd202, 0x0000, 0x9999,
|
|||
US_FL_IGNORE_RESIDUE ),
|
||||
|
||||
|
||||
/* Patch by Stephan Walter <stephan.walter@epfl.ch>
|
||||
* I don't know why, but it works... */
|
||||
/*
|
||||
* Patch by Stephan Walter <stephan.walter@epfl.ch>
|
||||
* I don't know why, but it works...
|
||||
*/
|
||||
UNUSUAL_DEV( 0x0dda, 0x0001, 0x0012, 0x0012,
|
||||
"WINWARD",
|
||||
"Music Disk",
|
||||
|
@ -1468,8 +1546,10 @@ UNUSUAL_DEV( 0x0ed1, 0x6660, 0x0100, 0x0300,
|
|||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_FIX_INQUIRY ),
|
||||
|
||||
/* Submitted by Daniel Drake <dsd@gentoo.org>
|
||||
* Reported by dayul on the Gentoo Forums */
|
||||
/*
|
||||
* Submitted by Daniel Drake <dsd@gentoo.org>
|
||||
* Reported by dayul on the Gentoo Forums
|
||||
*/
|
||||
UNUSUAL_DEV( 0x0ea0, 0x2168, 0x0110, 0x0110,
|
||||
"Ours Technology",
|
||||
"Flash Disk",
|
||||
|
@ -1483,15 +1563,18 @@ UNUSUAL_DEV( 0x0ea0, 0x6828, 0x0110, 0x0110,
|
|||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_IGNORE_RESIDUE ),
|
||||
|
||||
/* Reported by Benjamin Schiller <sbenni@gmx.de>
|
||||
* It is also sold by Easylite as DJ 20 */
|
||||
/*
|
||||
* Reported by Benjamin Schiller <sbenni@gmx.de>
|
||||
* It is also sold by Easylite as DJ 20
|
||||
*/
|
||||
UNUSUAL_DEV( 0x0ed1, 0x7636, 0x0103, 0x0103,
|
||||
"Typhoon",
|
||||
"My DJ 1820",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_IGNORE_RESIDUE | US_FL_GO_SLOW | US_FL_MAX_SECTORS_64),
|
||||
|
||||
/* Patch by Leonid Petrov mail at lpetrov.net
|
||||
/*
|
||||
* Patch by Leonid Petrov mail at lpetrov.net
|
||||
* Reported by Robert Spitzenpfeil <robert@spitzenpfeil.org>
|
||||
* http://www.qbik.ch/usb/devices/showdev.php?id=1705
|
||||
* Updated to 103 device by MJ Ray mjr at phonecoop.coop
|
||||
|
@ -1502,7 +1585,8 @@ UNUSUAL_DEV( 0x0f19, 0x0103, 0x0100, 0x0100,
|
|||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_IGNORE_RESIDUE ),
|
||||
|
||||
/* David Kuehling <dvdkhlng@gmx.de>:
|
||||
/*
|
||||
* David Kuehling <dvdkhlng@gmx.de>:
|
||||
* for MP3-Player AVOX WSX-300ER (bought in Japan). Reports lots of SCSI
|
||||
* errors when trying to write.
|
||||
*/
|
||||
|
@ -1540,8 +1624,10 @@ UNUSUAL_DEV( 0x0fce, 0xd0e1, 0x0000, 0x0000,
|
|||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_IGNORE_DEVICE),
|
||||
|
||||
/* Reported by Jan Mate <mate@fiit.stuba.sk>
|
||||
* and by Soeren Sonnenburg <kernel@nn7.de> */
|
||||
/*
|
||||
* Reported by Jan Mate <mate@fiit.stuba.sk>
|
||||
* and by Soeren Sonnenburg <kernel@nn7.de>
|
||||
*/
|
||||
UNUSUAL_DEV( 0x0fce, 0xe030, 0x0000, 0x0000,
|
||||
"Sony Ericsson",
|
||||
"P990i",
|
||||
|
@ -1562,7 +1648,8 @@ UNUSUAL_DEV( 0x0fce, 0xe092, 0x0000, 0x0000,
|
|||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_IGNORE_RESIDUE ),
|
||||
|
||||
/* Reported by Kevin Cernekee <kpc-usbdev@gelato.uiuc.edu>
|
||||
/*
|
||||
* Reported by Kevin Cernekee <kpc-usbdev@gelato.uiuc.edu>
|
||||
* Tested on hardware version 1.10.
|
||||
* Entry is needed only for the initializer function override.
|
||||
* Devices with bcd > 110 seem to not need it while those
|
||||
|
@ -1586,7 +1673,8 @@ UNUSUAL_DEV(0x1058, 0x070a, 0x0000, 0x9999,
|
|||
"My Passport HDD",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, NULL, US_FL_WRITE_CACHE),
|
||||
|
||||
/* Reported by Fabio Venturi <f.venturi@tdnet.it>
|
||||
/*
|
||||
* Reported by Fabio Venturi <f.venturi@tdnet.it>
|
||||
* The device reports a vendor-specific bDeviceClass.
|
||||
*/
|
||||
UNUSUAL_DEV( 0x10d6, 0x2200, 0x0100, 0x0100,
|
||||
|
@ -1595,7 +1683,8 @@ UNUSUAL_DEV( 0x10d6, 0x2200, 0x0100, 0x0100,
|
|||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
0),
|
||||
|
||||
/* Reported by Pascal Terjan <pterjan@mandriva.com>
|
||||
/*
|
||||
* Reported by Pascal Terjan <pterjan@mandriva.com>
|
||||
* Ignore driver CD mode and force into modem mode by default.
|
||||
*/
|
||||
UNUSUAL_DEV( 0x1186, 0x3e04, 0x0000, 0x0000,
|
||||
|
@ -1603,7 +1692,8 @@ UNUSUAL_DEV( 0x1186, 0x3e04, 0x0000, 0x0000,
|
|||
"USB Mass Storage",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, option_ms_init, US_FL_IGNORE_DEVICE),
|
||||
|
||||
/* Reported by Kevin Lloyd <linux@sierrawireless.com>
|
||||
/*
|
||||
* Reported by Kevin Lloyd <linux@sierrawireless.com>
|
||||
* Entry is needed for the initializer function override,
|
||||
* which instructs the device to load as a modem
|
||||
* device.
|
||||
|
@ -1614,7 +1704,8 @@ UNUSUAL_DEV( 0x1199, 0x0fff, 0x0000, 0x9999,
|
|||
USB_SC_DEVICE, USB_PR_DEVICE, sierra_ms_init,
|
||||
0),
|
||||
|
||||
/* Reported by Jaco Kroon <jaco@kroon.co.za>
|
||||
/*
|
||||
* Reported by Jaco Kroon <jaco@kroon.co.za>
|
||||
* The usb-storage module found on the Digitech GNX4 (and supposedly other
|
||||
* devices) misbehaves and causes a bunch of invalid I/O errors.
|
||||
*/
|
||||
|
@ -1624,7 +1715,8 @@ UNUSUAL_DEV( 0x1210, 0x0003, 0x0100, 0x0100,
|
|||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_IGNORE_RESIDUE ),
|
||||
|
||||
/* Reported by fangxiaozhi <huananhu@huawei.com>
|
||||
/*
|
||||
* Reported by fangxiaozhi <huananhu@huawei.com>
|
||||
* This brings the HUAWEI data card devices into multi-port mode
|
||||
*/
|
||||
UNUSUAL_DEV( 0x12d1, 0x1001, 0x0000, 0x0000,
|
||||
|
@ -1993,7 +2085,8 @@ UNUSUAL_DEV( 0x152d, 0x0567, 0x0114, 0x0116,
|
|||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_BROKEN_FUA ),
|
||||
|
||||
/* Reported by Alexandre Oliva <oliva@lsd.ic.unicamp.br>
|
||||
/*
|
||||
* Reported by Alexandre Oliva <oliva@lsd.ic.unicamp.br>
|
||||
* JMicron responds to USN and several other SCSI ioctls with a
|
||||
* residue that causes subsequent I/O requests to fail. */
|
||||
UNUSUAL_DEV( 0x152d, 0x2329, 0x0100, 0x0100,
|
||||
|
@ -2009,7 +2102,8 @@ UNUSUAL_DEV( 0x152d, 0x2566, 0x0114, 0x0114,
|
|||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_BROKEN_FUA ),
|
||||
|
||||
/* Entrega Technologies U1-SC25 (later Xircom PortGear PGSCSI)
|
||||
/*
|
||||
* Entrega Technologies U1-SC25 (later Xircom PortGear PGSCSI)
|
||||
* and Mac USB Dock USB-SCSI */
|
||||
UNUSUAL_DEV( 0x1645, 0x0007, 0x0100, 0x0133,
|
||||
"Entrega Technologies",
|
||||
|
@ -2017,8 +2111,10 @@ UNUSUAL_DEV( 0x1645, 0x0007, 0x0100, 0x0133,
|
|||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_euscsi_init,
|
||||
US_FL_SCM_MULT_TARG ),
|
||||
|
||||
/* Reported by Robert Schedel <r.schedel@yahoo.de>
|
||||
* Note: this is a 'super top' device like the above 14cd/6600 device */
|
||||
/*
|
||||
* Reported by Robert Schedel <r.schedel@yahoo.de>
|
||||
* Note: this is a 'super top' device like the above 14cd/6600 device
|
||||
*/
|
||||
UNUSUAL_DEV( 0x1652, 0x6600, 0x0201, 0x0201,
|
||||
"Teac",
|
||||
"HD-35PUK-B",
|
||||
|
@ -2045,10 +2141,12 @@ UNUSUAL_DEV( 0x1822, 0x0001, 0x0000, 0x9999,
|
|||
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_euscsi_init,
|
||||
US_FL_SCM_MULT_TARG ),
|
||||
|
||||
/* Reported by Hans de Goede <hdegoede@redhat.com>
|
||||
/*
|
||||
* Reported by Hans de Goede <hdegoede@redhat.com>
|
||||
* These Appotech controllers are found in Picture Frames, they provide a
|
||||
* (buggy) emulation of a cdrom drive which contains the windows software
|
||||
* Uploading of pictures happens over the corresponding /dev/sg device. */
|
||||
* Uploading of pictures happens over the corresponding /dev/sg device.
|
||||
*/
|
||||
UNUSUAL_DEV( 0x1908, 0x1315, 0x0000, 0x0000,
|
||||
"BUILDWIN",
|
||||
"Photo Frame",
|
||||
|
@ -2065,19 +2163,22 @@ UNUSUAL_DEV( 0x1908, 0x3335, 0x0200, 0x0200,
|
|||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_NO_READ_DISC_INFO ),
|
||||
|
||||
/* Reported by Oliver Neukum <oneukum@suse.com>
|
||||
/*
|
||||
* Reported by Oliver Neukum <oneukum@suse.com>
|
||||
* This device morphes spontaneously into another device if the access
|
||||
* pattern of Windows isn't followed. Thus writable media would be dirty
|
||||
* if the initial instance is used. So the device is limited to its
|
||||
* virtual CD.
|
||||
* And yes, the concept that BCD goes up to 9 is not heeded */
|
||||
* And yes, the concept that BCD goes up to 9 is not heeded
|
||||
*/
|
||||
UNUSUAL_DEV( 0x19d2, 0x1225, 0x0000, 0xffff,
|
||||
"ZTE,Incorporated",
|
||||
"ZTE WCDMA Technologies MSM",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_SINGLE_LUN ),
|
||||
|
||||
/* Reported by Sven Geggus <sven-usbst@geggus.net>
|
||||
/*
|
||||
* Reported by Sven Geggus <sven-usbst@geggus.net>
|
||||
* This encrypted pen drive returns bogus data for the initial READ(10).
|
||||
*/
|
||||
UNUSUAL_DEV( 0x1b1c, 0x1ab5, 0x0200, 0x0200,
|
||||
|
@ -2086,7 +2187,8 @@ UNUSUAL_DEV( 0x1b1c, 0x1ab5, 0x0200, 0x0200,
|
|||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_INITIAL_READ10 ),
|
||||
|
||||
/* Reported by Hans de Goede <hdegoede@redhat.com>
|
||||
/*
|
||||
* Reported by Hans de Goede <hdegoede@redhat.com>
|
||||
* These are mini projectors using USB for both power and video data transport
|
||||
* The usb-storage interface is a virtual windows driver CD, which the gm12u320
|
||||
* driver automatically converts into framebuffer & kms dri device nodes.
|
||||
|
@ -2097,9 +2199,11 @@ UNUSUAL_DEV( 0x1de1, 0xc102, 0x0000, 0xffff,
|
|||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_IGNORE_DEVICE ),
|
||||
|
||||
/* Patch by Richard Schütz <r.schtz@t-online.de>
|
||||
/*
|
||||
* Patch by Richard Schütz <r.schtz@t-online.de>
|
||||
* This external hard drive enclosure uses a JMicron chip which
|
||||
* needs the US_FL_IGNORE_RESIDUE flag to work properly. */
|
||||
* needs the US_FL_IGNORE_RESIDUE flag to work properly.
|
||||
*/
|
||||
UNUSUAL_DEV( 0x1e68, 0x001b, 0x0000, 0x0000,
|
||||
"TrekStor GmbH & Co. KG",
|
||||
"DataStation maxi g.u",
|
||||
|
@ -2126,7 +2230,8 @@ UNUSUAL_DEV( 0x2116, 0x0320, 0x0001, 0x0001,
|
|||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_FIX_CAPACITY),
|
||||
|
||||
/* patch submitted by Davide Perini <perini.davide@dpsoftware.org>
|
||||
/*
|
||||
* patch submitted by Davide Perini <perini.davide@dpsoftware.org>
|
||||
* and Renato Perini <rperini@email.it>
|
||||
*/
|
||||
UNUSUAL_DEV( 0x22b8, 0x3010, 0x0001, 0x0001,
|
||||
|
@ -2153,7 +2258,8 @@ UNUSUAL_DEV( 0x2735, 0x100b, 0x0000, 0x9999,
|
|||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_GO_SLOW ),
|
||||
|
||||
/* Reported by Frederic Marchal <frederic.marchal@wowcompany.com>
|
||||
/*
|
||||
* Reported by Frederic Marchal <frederic.marchal@wowcompany.com>
|
||||
* Mio Moov 330
|
||||
*/
|
||||
UNUSUAL_DEV( 0x3340, 0xffff, 0x0000, 0x0000,
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
/* Unusual Devices File for the Freecom USB/IDE adaptor
|
||||
/*
|
||||
* Unusual Devices File for the Freecom USB/IDE adaptor
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
/* Unusual Devices File for In-System Design, Inc. ISD200 ASIC
|
||||
/*
|
||||
* Unusual Devices File for In-System Design, Inc. ISD200 ASIC
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
/* Unusual Devices File for the Lexar "Jumpshot" Compact Flash reader
|
||||
/*
|
||||
* Unusual Devices File for the Lexar "Jumpshot" Compact Flash reader
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
/* Unusual Devices File for the Rio Karma
|
||||
/*
|
||||
* Unusual Devices File for the Rio Karma
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
/* Unusual Devices File for the Maxtor OneTouch USB hard drive's button
|
||||
/*
|
||||
* Unusual Devices File for the Maxtor OneTouch USB hard drive's button
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
|
@ -18,7 +19,8 @@
|
|||
#if defined(CONFIG_USB_STORAGE_ONETOUCH) || \
|
||||
defined(CONFIG_USB_STORAGE_ONETOUCH_MODULE)
|
||||
|
||||
/* Submitted by: Nick Sillik <n.sillik@temple.edu>
|
||||
/*
|
||||
* Submitted by: Nick Sillik <n.sillik@temple.edu>
|
||||
* Needed for OneTouch extension to usb-storage
|
||||
*/
|
||||
UNUSUAL_DEV( 0x0d49, 0x7000, 0x0000, 0x9999,
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
/* Driver for Realtek RTS51xx USB card reader
|
||||
/*
|
||||
* Driver for Realtek RTS51xx USB card reader
|
||||
*
|
||||
* Copyright(c) 2009 Realtek Semiconductor Corp. All rights reserved.
|
||||
*
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
/* Unusual Devices File for SanDisk SDDR-09 SmartMedia reader
|
||||
/*
|
||||
* Unusual Devices File for SanDisk SDDR-09 SmartMedia reader
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
/* Unusual Devices File for SanDisk SDDR-55 SmartMedia reader
|
||||
/*
|
||||
* Unusual Devices File for SanDisk SDDR-55 SmartMedia reader
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
/* Driver for USB Attached SCSI devices - Unusual Devices File
|
||||
/*
|
||||
* Driver for USB Attached SCSI devices - Unusual Devices File
|
||||
*
|
||||
* (c) 2013 Hans de Goede <hdegoede@redhat.com>
|
||||
*
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
/* Unusual Devices File for SCM Microsystems (a.k.a. Shuttle) USB-ATAPI cable
|
||||
/*
|
||||
* Unusual Devices File for SCM Microsystems (a.k.a. Shuttle) USB-ATAPI cable
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
/* Driver for USB Mass Storage compliant devices
|
||||
/*
|
||||
* Driver for USB Mass Storage compliant devices
|
||||
*
|
||||
* Current development and maintenance by:
|
||||
* (c) 1999-2003 Matthew Dharm (mdharm-usb@one-eyed-alien.net)
|
||||
|
@ -97,7 +98,8 @@ MODULE_PARM_DESC(quirks, "supplemental list of device IDs and their quirks");
|
|||
* with the entries in usb_storage_usb_ids[], defined in usual-tables.c.
|
||||
*/
|
||||
|
||||
/* The vendor name should be kept at eight characters or less, and
|
||||
/*
|
||||
*The vendor name should be kept at eight characters or less, and
|
||||
* the product name should be kept at 16 characters or less. If a device
|
||||
* has the US_FL_FIX_INQUIRY flag, then the vendor and product names
|
||||
* normally generated by a device through the INQUIRY response will be
|
||||
|
@ -191,8 +193,10 @@ int usb_stor_suspend(struct usb_interface *iface, pm_message_t message)
|
|||
if (us->suspend_resume_hook)
|
||||
(us->suspend_resume_hook)(us, US_SUSPEND);
|
||||
|
||||
/* When runtime PM is working, we'll set a flag to indicate
|
||||
* whether we should autoresume when a SCSI request arrives. */
|
||||
/*
|
||||
* When runtime PM is working, we'll set a flag to indicate
|
||||
* whether we should autoresume when a SCSI request arrives.
|
||||
*/
|
||||
|
||||
mutex_unlock(&us->dev_mutex);
|
||||
return 0;
|
||||
|
@ -220,8 +224,10 @@ int usb_stor_reset_resume(struct usb_interface *iface)
|
|||
/* Report the reset to the SCSI core */
|
||||
usb_stor_report_bus_reset(us);
|
||||
|
||||
/* FIXME: Notify the subdrivers that they need to reinitialize
|
||||
* the device */
|
||||
/*
|
||||
* FIXME: Notify the subdrivers that they need to reinitialize
|
||||
* the device
|
||||
*/
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(usb_stor_reset_resume);
|
||||
|
@ -250,8 +256,10 @@ int usb_stor_post_reset(struct usb_interface *iface)
|
|||
/* Report the reset to the SCSI core */
|
||||
usb_stor_report_bus_reset(us);
|
||||
|
||||
/* FIXME: Notify the subdrivers that they need to reinitialize
|
||||
* the device */
|
||||
/*
|
||||
* FIXME: Notify the subdrivers that they need to reinitialize
|
||||
* the device
|
||||
*/
|
||||
|
||||
mutex_unlock(&us->dev_mutex);
|
||||
return 0;
|
||||
|
@ -274,15 +282,17 @@ void fill_inquiry_response(struct us_data *us, unsigned char *data,
|
|||
return;
|
||||
|
||||
memset(data+8, ' ', 28);
|
||||
if (data[0]&0x20) { /* USB device currently not connected. Return
|
||||
peripheral qualifier 001b ("...however, the
|
||||
physical device is not currently connected
|
||||
to this logical unit") and leave vendor and
|
||||
product identification empty. ("If the target
|
||||
does store some of the INQUIRY data on the
|
||||
device, it may return zeros or ASCII spaces
|
||||
(20h) in those fields until the data is
|
||||
available from the device."). */
|
||||
if (data[0]&0x20) { /*
|
||||
* USB device currently not connected. Return
|
||||
* peripheral qualifier 001b ("...however, the
|
||||
* physical device is not currently connected
|
||||
* to this logical unit") and leave vendor and
|
||||
* product identification empty. ("If the target
|
||||
* does store some of the INQUIRY data on the
|
||||
* device, it may return zeros or ASCII spaces
|
||||
* (20h) in those fields until the data is
|
||||
* available from the device.").
|
||||
*/
|
||||
} else {
|
||||
u16 bcdDevice = le16_to_cpu(us->pusb_dev->descriptor.bcdDevice);
|
||||
int n;
|
||||
|
@ -336,7 +346,8 @@ static int usb_stor_control_thread(void * __us)
|
|||
|
||||
scsi_unlock(host);
|
||||
|
||||
/* reject the command if the direction indicator
|
||||
/*
|
||||
* reject the command if the direction indicator
|
||||
* is UNKNOWN
|
||||
*/
|
||||
if (us->srb->sc_data_direction == DMA_BIDIRECTIONAL) {
|
||||
|
@ -344,7 +355,8 @@ static int usb_stor_control_thread(void * __us)
|
|||
us->srb->result = DID_ERROR << 16;
|
||||
}
|
||||
|
||||
/* reject if target != 0 or if LUN is higher than
|
||||
/*
|
||||
* reject if target != 0 or if LUN is higher than
|
||||
* the maximum known LUN
|
||||
*/
|
||||
else if (us->srb->device->id &&
|
||||
|
@ -362,8 +374,10 @@ static int usb_stor_control_thread(void * __us)
|
|||
us->srb->result = DID_BAD_TARGET << 16;
|
||||
}
|
||||
|
||||
/* Handle those devices which need us to fake
|
||||
* their inquiry data */
|
||||
/*
|
||||
* Handle those devices which need us to fake
|
||||
* their inquiry data
|
||||
*/
|
||||
else if ((us->srb->cmnd[0] == INQUIRY) &&
|
||||
(us->fflags & US_FL_FIX_INQUIRY)) {
|
||||
unsigned char data_ptr[36] = {
|
||||
|
@ -395,11 +409,13 @@ static int usb_stor_control_thread(void * __us)
|
|||
usb_stor_dbg(us, "scsi command aborted\n");
|
||||
}
|
||||
|
||||
/* If an abort request was received we need to signal that
|
||||
/*
|
||||
* If an abort request was received we need to signal that
|
||||
* the abort has finished. The proper test for this is
|
||||
* the TIMED_OUT flag, not srb->result == DID_ABORT, because
|
||||
* the timeout might have occurred after the command had
|
||||
* already completed with a different result code. */
|
||||
* already completed with a different result code.
|
||||
*/
|
||||
if (test_bit(US_FLIDX_TIMED_OUT, &us->dflags)) {
|
||||
complete(&(us->notify));
|
||||
|
||||
|
@ -610,7 +626,8 @@ static int get_device_info(struct us_data *us, const struct usb_device_id *id,
|
|||
le16_to_cpu(dev->descriptor.idProduct),
|
||||
us->fflags);
|
||||
|
||||
/* Log a message if a non-generic unusual_dev entry contains an
|
||||
/*
|
||||
* Log a message if a non-generic unusual_dev entry contains an
|
||||
* unnecessary subclass or protocol override. This may stimulate
|
||||
* reports from users that will help us remove unneeded entries
|
||||
* from the unusual_devs.h table.
|
||||
|
@ -782,8 +799,10 @@ static int usb_stor_acquire_resources(struct us_data *us)
|
|||
return -ENOMEM;
|
||||
}
|
||||
|
||||
/* Just before we start our control thread, initialize
|
||||
* the device if it needs initialization */
|
||||
/*
|
||||
* Just before we start our control thread, initialize
|
||||
* the device if it needs initialization
|
||||
*/
|
||||
if (us->unusual_dev->initFunction) {
|
||||
p = us->unusual_dev->initFunction(us);
|
||||
if (p)
|
||||
|
@ -805,7 +824,8 @@ static int usb_stor_acquire_resources(struct us_data *us)
|
|||
/* Release all our dynamic resources */
|
||||
static void usb_stor_release_resources(struct us_data *us)
|
||||
{
|
||||
/* Tell the control thread to exit. The SCSI host must
|
||||
/*
|
||||
* Tell the control thread to exit. The SCSI host must
|
||||
* already have been removed and the DISCONNECTING flag set
|
||||
* so that we won't accept any more commands.
|
||||
*/
|
||||
|
@ -836,7 +856,8 @@ static void dissociate_dev(struct us_data *us)
|
|||
usb_set_intfdata(us->pusb_intf, NULL);
|
||||
}
|
||||
|
||||
/* First stage of disconnect processing: stop SCSI scanning,
|
||||
/*
|
||||
* First stage of disconnect processing: stop SCSI scanning,
|
||||
* remove the host, and stop accepting new commands
|
||||
*/
|
||||
static void quiesce_and_remove_host(struct us_data *us)
|
||||
|
@ -849,7 +870,8 @@ static void quiesce_and_remove_host(struct us_data *us)
|
|||
wake_up(&us->delay_wait);
|
||||
}
|
||||
|
||||
/* Prevent SCSI scanning (if it hasn't started yet)
|
||||
/*
|
||||
* Prevent SCSI scanning (if it hasn't started yet)
|
||||
* or wait for the SCSI-scanning routine to stop.
|
||||
*/
|
||||
cancel_delayed_work_sync(&us->scan_dwork);
|
||||
|
@ -858,12 +880,14 @@ static void quiesce_and_remove_host(struct us_data *us)
|
|||
if (test_bit(US_FLIDX_SCAN_PENDING, &us->dflags))
|
||||
usb_autopm_put_interface_no_suspend(us->pusb_intf);
|
||||
|
||||
/* Removing the host will perform an orderly shutdown: caches
|
||||
/*
|
||||
* Removing the host will perform an orderly shutdown: caches
|
||||
* synchronized, disks spun down, etc.
|
||||
*/
|
||||
scsi_remove_host(host);
|
||||
|
||||
/* Prevent any new commands from being accepted and cut short
|
||||
/*
|
||||
* Prevent any new commands from being accepted and cut short
|
||||
* reset delays.
|
||||
*/
|
||||
scsi_lock(host);
|
||||
|
@ -878,8 +902,10 @@ static void release_everything(struct us_data *us)
|
|||
usb_stor_release_resources(us);
|
||||
dissociate_dev(us);
|
||||
|
||||
/* Drop our reference to the host; the SCSI core will free it
|
||||
* (and "us" along with it) when the refcount becomes 0. */
|
||||
/*
|
||||
* Drop our reference to the host; the SCSI core will free it
|
||||
* (and "us" along with it) when the refcount becomes 0.
|
||||
*/
|
||||
scsi_host_put(us_to_host(us));
|
||||
}
|
||||
|
||||
|
@ -900,7 +926,8 @@ static void usb_stor_scan_dwork(struct work_struct *work)
|
|||
us->max_lun = usb_stor_Bulk_max_lun(us);
|
||||
/*
|
||||
* Allow proper scanning of devices that present more than 8 LUNs
|
||||
* While not affecting other devices that may need the previous behavior
|
||||
* While not affecting other devices that may need the previous
|
||||
* behavior
|
||||
*/
|
||||
if (us->max_lun >= 8)
|
||||
us_to_host(us)->max_lun = us->max_lun+1;
|
||||
|
@ -975,7 +1002,8 @@ int usb_stor_probe1(struct us_data **pus,
|
|||
get_transport(us);
|
||||
get_protocol(us);
|
||||
|
||||
/* Give the caller a chance to fill in specialized transport
|
||||
/*
|
||||
* Give the caller a chance to fill in specialized transport
|
||||
* or protocol settings.
|
||||
*/
|
||||
return 0;
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
/* Driver for USB Mass Storage compliant devices
|
||||
/*
|
||||
* Driver for USB Mass Storage compliant devices
|
||||
* Main Header File
|
||||
*
|
||||
* Current development and maintenance by:
|
||||
|
@ -100,7 +101,8 @@ typedef void (*pm_hook)(struct us_data *, int); /* power management hook */
|
|||
|
||||
/* we allocate one of these for every device that we remember */
|
||||
struct us_data {
|
||||
/* The device we're working with
|
||||
/*
|
||||
* The device we're working with
|
||||
* It's important to note:
|
||||
* (o) you must hold dev_mutex to change pusb_dev
|
||||
*/
|
||||
|
@ -125,7 +127,7 @@ struct us_data {
|
|||
u8 max_lun;
|
||||
|
||||
u8 ifnum; /* interface number */
|
||||
u8 ep_bInterval; /* interrupt interval */
|
||||
u8 ep_bInterval; /* interrupt interval */
|
||||
|
||||
/* function pointers for this device */
|
||||
trans_cmnd transport; /* transport function */
|
||||
|
@ -175,8 +177,10 @@ static inline struct us_data *host_to_us(struct Scsi_Host *host) {
|
|||
extern void fill_inquiry_response(struct us_data *us,
|
||||
unsigned char *data, unsigned int data_len);
|
||||
|
||||
/* The scsi_lock() and scsi_unlock() macros protect the sm_state and the
|
||||
* single queue element srb for write access */
|
||||
/*
|
||||
* The scsi_lock() and scsi_unlock() macros protect the sm_state and the
|
||||
* single queue element srb for write access
|
||||
*/
|
||||
#define scsi_unlock(host) spin_unlock_irq(host->host_lock)
|
||||
#define scsi_lock(host) spin_lock_irq(host->host_lock)
|
||||
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
/* Driver for USB Mass Storage devices
|
||||
/*
|
||||
* Driver for USB Mass Storage devices
|
||||
* Usual Tables File for usb-storage and libusual
|
||||
*
|
||||
* Copyright (C) 2009 Alan Stern (stern@rowland.harvard.edu)
|
||||
|
|
Loading…
Reference in a new issue