Commit f0183a33 authored by Felipe Balbi's avatar Felipe Balbi Committed by Greg Kroah-Hartman

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: default avatarFelipe Balbi <felipe.balbi@linux.intel.com>
Acked-by: default avatarAlan Stern <stern@rowland.harvard.edu>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 5b91dfe1
...@@ -829,8 +829,10 @@ static int alauda_write_lba(struct us_data *us, u16 lba, ...@@ -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]; pba = MEDIA_INFO(us).lba_to_pba[zone][lba_offset];
if (pba == 1) { 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 printk(KERN_WARNING
"alauda_write_lba: avoid writing to pba 1\n"); "alauda_write_lba: avoid writing to pba 1\n");
return USB_STOR_TRANSPORT_GOOD; return USB_STOR_TRANSPORT_GOOD;
...@@ -977,10 +979,12 @@ static int alauda_read_data(struct us_data *us, unsigned long address, ...@@ -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", usb_stor_dbg(us, "Read %d zero pages (LBA %d) page %d\n",
pages, lba, page); pages, lba, page);
/* This is not really an error. It just means /*
that the block has never been written. * This is not really an error. It just means
Instead of returning USB_STOR_TRANSPORT_ERROR * that the block has never been written.
it is better to return all zero data. */ * Instead of returning USB_STOR_TRANSPORT_ERROR
* it is better to return all zero data.
*/
memset(buffer, 0, len); memset(buffer, 0, len);
} else { } else {
...@@ -1222,8 +1226,10 @@ static int alauda_transport(struct scsi_cmnd *srb, struct us_data *us) ...@@ -1222,8 +1226,10 @@ static int alauda_transport(struct scsi_cmnd *srb, struct us_data *us)
} }
if (srb->cmnd[0] == ALLOW_MEDIUM_REMOVAL) { 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; return USB_STOR_TRANSPORT_GOOD;
} }
......
...@@ -110,13 +110,17 @@ static void cypress_atacb_passthrough(struct scsi_cmnd *srb, struct us_data *us) ...@@ -110,13 +110,17 @@ static void cypress_atacb_passthrough(struct scsi_cmnd *srb, struct us_data *us)
/* first build the ATACB command */ /* first build the ATACB command */
srb->cmd_len = 16; srb->cmd_len = 16;
srb->cmnd[0] = 0x24; /* bVSCBSignature : vendor-specific command srb->cmnd[0] = 0x24; /*
this value can change, but most(all ?) manufacturers * bVSCBSignature : vendor-specific command
keep the cypress default : 0x24 */ * this value can change, but most(all ?) manufacturers
* keep the cypress default : 0x24
*/
srb->cmnd[1] = 0x24; /* bVSCBSubCommand : 0x24 for ATACB */ srb->cmnd[1] = 0x24; /* bVSCBSubCommand : 0x24 for ATACB */
srb->cmnd[3] = 0xff - 1; /* features, sector count, lba low, lba med srb->cmnd[3] = 0xff - 1; /*
lba high, device, command are valid */ * features, sector count, lba low, lba med
* lba high, device, command are valid
*/
srb->cmnd[4] = 1; /* TransferBlockCount : 512 */ srb->cmnd[4] = 1; /* TransferBlockCount : 512 */
if (save_cmnd[0] == ATA_16) { if (save_cmnd[0] == ATA_16) {
...@@ -155,8 +159,7 @@ static void cypress_atacb_passthrough(struct scsi_cmnd *srb, struct us_data *us) ...@@ -155,8 +159,7 @@ static void cypress_atacb_passthrough(struct scsi_cmnd *srb, struct us_data *us)
usb_stor_transparent_scsi_command(srb, 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 && if (srb->result == SAM_STAT_CHECK_CONDITION &&
memcmp(srb->sense_buffer, usb_stor_sense_invalidCDB, memcmp(srb->sense_buffer, usb_stor_sense_invalidCDB,
sizeof(usb_stor_sense_invalidCDB)) == 0) { sizeof(usb_stor_sense_invalidCDB)) == 0) {
...@@ -164,7 +167,8 @@ static void cypress_atacb_passthrough(struct scsi_cmnd *srb, struct us_data *us) ...@@ -164,7 +167,8 @@ static void cypress_atacb_passthrough(struct scsi_cmnd *srb, struct us_data *us)
goto end; 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 * build the special sense
*/ */
if ((srb->result != (DID_ERROR << 16) && if ((srb->result != (DID_ERROR << 16) &&
...@@ -176,11 +180,11 @@ static void cypress_atacb_passthrough(struct scsi_cmnd *srb, struct us_data *us) ...@@ -176,11 +180,11 @@ static void cypress_atacb_passthrough(struct scsi_cmnd *srb, struct us_data *us)
unsigned char *desc = sb + 8; unsigned char *desc = sb + 8;
int tmp_result; int tmp_result;
/* build the command for /* build the command for reading the ATA registers */
* reading the ATA registers */
scsi_eh_prep_cmnd(srb, &ses, NULL, 0, sizeof(regs)); 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, * the read taskfile bit, for not executing atacb command,
* but reading register selected in srb->cmnd[4] * but reading register selected in srb->cmnd[4]
*/ */
...@@ -204,7 +208,8 @@ static void cypress_atacb_passthrough(struct scsi_cmnd *srb, struct us_data *us) ...@@ -204,7 +208,8 @@ static void cypress_atacb_passthrough(struct scsi_cmnd *srb, struct us_data *us)
sb[2] = 0; /* ATA PASS THROUGH INFORMATION AVAILABLE */ sb[2] = 0; /* ATA PASS THROUGH INFORMATION AVAILABLE */
sb[3] = 0x1D; 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 * regs
* (see 11.1 Error translation ATA device error to SCSI error * (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.)
...@@ -258,7 +263,8 @@ static int cypress_probe(struct usb_interface *intf, ...@@ -258,7 +263,8 @@ static int cypress_probe(struct usb_interface *intf,
if (result) if (result)
return 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 * Filter out this revision from EEPROM default descriptor values
*/ */
device = interface_to_usbdev(intf); device = interface_to_usbdev(intf);
......
/* Driver for Datafab USB Compact Flash reader /*
* Driver for Datafab USB Compact Flash reader
* *
* datafab driver v0.1: * datafab driver v0.1:
* *
...@@ -693,18 +694,23 @@ static int datafab_transport(struct scsi_cmnd *srb, struct us_data *us) ...@@ -693,18 +694,23 @@ static int datafab_transport(struct scsi_cmnd *srb, struct us_data *us)
} }
if (srb->cmnd[0] == ALLOW_MEDIUM_REMOVAL) { 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; return USB_STOR_TRANSPORT_GOOD;
} }
if (srb->cmnd[0] == START_STOP) { 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"); 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); rc = datafab_id_device(us, info);
if (rc == USB_STOR_TRANSPORT_GOOD) { if (rc == USB_STOR_TRANSPORT_GOOD) {
info->sense_key = NO_SENSE; info->sense_key = NO_SENSE;
......
/* Driver for USB Mass Storage compliant devices /*
* Driver for USB Mass Storage compliant devices
* Debugging Functions Source Code File * Debugging Functions Source Code File
* *
* Current development and maintenance by: * Current development and maintenance by:
......
/* Driver for USB Mass Storage compliant devices /*
* Driver for USB Mass Storage compliant devices
* Debugging Functions Header File * Debugging Functions Header File
* *
* Current development and maintenance by: * 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) ...@@ -560,8 +560,10 @@ static int ene_send_scsi_cmd(struct us_data *us, u8 fDir, void *buf, int use_sg)
/* check bulk status */ /* check bulk status */
residue = le32_to_cpu(bcs->Residue); 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)) { if (residue && !(us->fflags & US_FL_IGNORE_RESIDUE)) {
residue = min(residue, transfer_length); residue = min(residue, transfer_length);
if (us->srb != NULL) if (us->srb != NULL)
...@@ -862,9 +864,6 @@ static int ms_read_readpage(struct us_data *us, u32 PhyBlockAddr, ...@@ -862,9 +864,6 @@ static int ms_read_readpage(struct us_data *us, u32 PhyBlockAddr,
u8 ExtBuf[4]; u8 ExtBuf[4];
u32 bn = PhyBlockAddr * 0x20 + PageNum; 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); result = ene_load_bincode(us, MS_RW_PATTERN);
if (result != USB_STOR_XFER_GOOD) if (result != USB_STOR_XFER_GOOD)
return USB_STOR_TRANSPORT_ERROR; return USB_STOR_TRANSPORT_ERROR;
...@@ -1141,8 +1140,6 @@ static int ms_read_copyblock(struct us_data *us, u16 oldphy, u16 newphy, ...@@ -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; struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
int result; int result;
/* printk(KERN_INFO "MS_ReaderCopyBlock --- PhyBlockAddr = %x,
PageNum = %x\n", PhyBlockAddr, PageNum); */
result = ene_load_bincode(us, MS_RW_PATTERN); result = ene_load_bincode(us, MS_RW_PATTERN);
if (result != USB_STOR_XFER_GOOD) if (result != USB_STOR_XFER_GOOD)
return USB_STOR_TRANSPORT_ERROR; return USB_STOR_TRANSPORT_ERROR;
...@@ -1176,8 +1173,6 @@ static int ms_read_eraseblock(struct us_data *us, u32 PhyBlockAddr) ...@@ -1176,8 +1173,6 @@ static int ms_read_eraseblock(struct us_data *us, u32 PhyBlockAddr)
int result; int result;
u32 bn = PhyBlockAddr; u32 bn = PhyBlockAddr;
/* printk(KERN_INFO "MS --- ms_read_eraseblock,
PhyBlockAddr = %x\n", PhyBlockAddr); */
result = ene_load_bincode(us, MS_RW_PATTERN); result = ene_load_bincode(us, MS_RW_PATTERN);
if (result != USB_STOR_XFER_GOOD) if (result != USB_STOR_XFER_GOOD)
return USB_STOR_TRANSPORT_ERROR; return USB_STOR_TRANSPORT_ERROR;
...@@ -1255,8 +1250,6 @@ static int ms_lib_overwrite_extra(struct us_data *us, u32 PhyBlockAddr, ...@@ -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; struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
int result; int result;
/* printk("MS --- MS_LibOverwriteExtra,
PhyBlockAddr = %x, PageNum = %x\n", PhyBlockAddr, PageNum); */
result = ene_load_bincode(us, MS_RW_PATTERN); result = ene_load_bincode(us, MS_RW_PATTERN);
if (result != USB_STOR_XFER_GOOD) if (result != USB_STOR_XFER_GOOD)
return USB_STOR_TRANSPORT_ERROR; return USB_STOR_TRANSPORT_ERROR;
...@@ -1342,7 +1335,6 @@ static int ms_lib_read_extra(struct us_data *us, u32 PhyBlock, ...@@ -1342,7 +1335,6 @@ static int ms_lib_read_extra(struct us_data *us, u32 PhyBlock,
int result; int result;
u8 ExtBuf[4]; u8 ExtBuf[4];
/* printk("MS_LibReadExtra --- PhyBlock = %x, PageNum = %x\n", PhyBlock, PageNum); */
memset(bcb, 0, sizeof(struct bulk_cb_wrap)); memset(bcb, 0, sizeof(struct bulk_cb_wrap));
bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN); bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
bcb->DataTransferLength = 0x4; bcb->DataTransferLength = 0x4;
...@@ -1541,9 +1533,6 @@ static int ms_lib_read_extrablock(struct us_data *us, u32 PhyBlock, ...@@ -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; struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
int result; int result;
/* printk("MS_LibReadExtraBlock --- PhyBlock = %x,
PageNum = %x, blen = %x\n", PhyBlock, PageNum, blen); */
/* Read Extra Data */ /* Read Extra Data */
memset(bcb, 0, sizeof(struct bulk_cb_wrap)); memset(bcb, 0, sizeof(struct bulk_cb_wrap));
bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN); bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
...@@ -2390,8 +2379,10 @@ static int ene_ub6250_reset_resume(struct usb_interface *iface) ...@@ -2390,8 +2379,10 @@ static int ene_ub6250_reset_resume(struct usb_interface *iface)
/* Report the reset to the SCSI core */ /* Report the reset to the SCSI core */
usb_stor_reset_resume(iface); 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->Power_IsResum = true;
/*info->SD_Status.Ready = 0; */ /*info->SD_Status.Ready = 0; */
info->SD_Status = *(struct SD_STATUS *)&tmp; info->SD_Status = *(struct SD_STATUS *)&tmp;
......
/* Driver for Freecom USB/IDE adaptor /*
* Driver for Freecom USB/IDE adaptor
* *
* Freecom v0.1: * Freecom v0.1:
* *
...@@ -84,25 +85,33 @@ struct freecom_status { ...@@ -84,25 +85,33 @@ struct freecom_status {
u8 Pad[60]; 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_INT_STATUS 0x02 /* INDEX_STAT */
#define FCM_STATUS_BUSY 0x80 #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_ATAPI 0x21
#define FCM_PACKET_STATUS 0x20 #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 #define FCM_PACKET_INPUT 0x81
/* Send data to the IDE interface. */ /* Send data to the IDE interface. */
#define FCM_PACKET_OUTPUT 0x01 #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_WRITE 0x40
#define FCM_PACKET_IDE_READ 0xC0 #define FCM_PACKET_IDE_READ 0xC0
...@@ -251,16 +260,20 @@ static int freecom_transport(struct scsi_cmnd *srb, struct us_data *us) ...@@ -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, result = usb_stor_bulk_transfer_buf (us, opipe, fcb,
FCM_PACKET_LENGTH, NULL); 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 * 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) { if (result != USB_STOR_XFER_GOOD) {
usb_stor_dbg(us, "freecom transport error\n"); usb_stor_dbg(us, "freecom transport error\n");
return USB_STOR_TRANSPORT_ERROR; 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, result = usb_stor_bulk_transfer_buf (us, ipipe, fst,
FCM_STATUS_PACKET_LENGTH, &partial); FCM_STATUS_PACKET_LENGTH, &partial);
usb_stor_dbg(us, "foo Status result %d %u\n", result, 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) ...@@ -269,7 +282,8 @@ static int freecom_transport(struct scsi_cmnd *srb, struct us_data *us)
US_DEBUG(pdump(us, (void *)fst, partial)); 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 * can legitimately take longer than this, so we use a different
* command that only waits for the interrupt and then sends status, * command that only waits for the interrupt and then sends status,
* without having to send a new ATAPI command to the device. * 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) ...@@ -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, result = usb_stor_bulk_transfer_buf (us, opipe, fcb,
FCM_PACKET_LENGTH, NULL); 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 * wrong in USB land. It returns the status in its own
* registers, which come back in the bulk pipe. * registers, which come back in the bulk pipe.
*/ */
...@@ -318,9 +333,11 @@ static int freecom_transport(struct scsi_cmnd *srb, struct us_data *us) ...@@ -318,9 +333,11 @@ static int freecom_transport(struct scsi_cmnd *srb, struct us_data *us)
return USB_STOR_TRANSPORT_FAILED; 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 * 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", usb_stor_dbg(us, "Device indicates that it has %d bytes available\n",
le16_to_cpu(fst->Count)); le16_to_cpu(fst->Count));
usb_stor_dbg(us, "SCSI requested %d\n", scsi_bufflen(srb)); 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) ...@@ -344,16 +361,20 @@ static int freecom_transport(struct scsi_cmnd *srb, struct us_data *us)
length); 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) { switch (us->srb->sc_data_direction) {
case DMA_FROM_DEVICE: case DMA_FROM_DEVICE:
/* catch bogus "read 0 length" case */ /* catch bogus "read 0 length" case */
if (!length) if (!length)
break; 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) { if ((fst->Status & DRQ_STAT) == 0 || (fst->Reason & 3) != 2) {
usb_stor_dbg(us, "SCSI wants data, drive doesn't have any\n"); usb_stor_dbg(us, "SCSI wants data, drive doesn't have any\n");
return USB_STOR_TRANSPORT_FAILED; return USB_STOR_TRANSPORT_FAILED;
...@@ -384,8 +405,10 @@ static int freecom_transport(struct scsi_cmnd *srb, struct us_data *us) ...@@ -384,8 +405,10 @@ static int freecom_transport(struct scsi_cmnd *srb, struct us_data *us)
/* catch bogus "write 0 length" case */ /* catch bogus "write 0 length" case */
if (!length) if (!length)
break; 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!! */ /* !!IMPLEMENT!! */
result = freecom_writedata (srb, us, ipipe, opipe, length); result = freecom_writedata (srb, us, ipipe, opipe, length);
if (result != USB_STOR_TRANSPORT_GOOD) if (result != USB_STOR_TRANSPORT_GOOD)
...@@ -431,7 +454,8 @@ static int init_freecom(struct us_data *us) ...@@ -431,7 +454,8 @@ static int init_freecom(struct us_data *us)
int result; int result;
char *buffer = us->iobuf; 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. * all our packets. No need to allocate any extra buffer space.
*/ */
...@@ -440,7 +464,8 @@ static int init_freecom(struct us_data *us) ...@@ -440,7 +464,8 @@ static int init_freecom(struct us_data *us)
buffer[32] = '\0'; buffer[32] = '\0';
usb_stor_dbg(us, "String returned from FC init is: %s\n", buffer); 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 * this "magic sequence", which they use in their Windows and MacOS
* drivers to make sure that all the attached perhiperals are * drivers to make sure that all the attached perhiperals are
* properly reset. * properly reset.
......
/* Special Initializers for certain USB Mass Storage devices /*
* Special Initializers for certain USB Mass Storage devices
* *
* Current development and maintenance by: * Current development and maintenance by:
* (c) 1999, 2000 Matthew Dharm (mdharm-usb@one-eyed-alien.net) * (c) 1999, 2000 Matthew Dharm (mdharm-usb@one-eyed-alien.net)
...@@ -42,8 +43,10 @@ ...@@ -42,8 +43,10 @@
#include "debug.h" #include "debug.h"
#include "transport.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 usb_stor_euscsi_init(struct us_data *us)
{ {
int result; int result;
...@@ -57,8 +60,10 @@ int usb_stor_euscsi_init(struct us_data *us) ...@@ -57,8 +60,10 @@ int usb_stor_euscsi_init(struct us_data *us)
return 0; 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) int usb_stor_ucr61s2b_init(struct us_data *us)
{ {
struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap*) us->iobuf; struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap*) us->iobuf;
......
/* 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: * Current development and maintenance by:
* (c) 1999, 2000 Matthew Dharm (mdharm-usb@one-eyed-alien.net) * (c) 1999, 2000 Matthew Dharm (mdharm-usb@one-eyed-alien.net)
...@@ -38,12 +39,16 @@ ...@@ -38,12 +39,16 @@
#include "usb.h" #include "usb.h"
#include "transport.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 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); int usb_stor_ucr61s2b_init(struct us_data *us);
/* This places the HUAWEI E220 devices in multi-port mode */ /* This places the HUAWEI E220 devices in multi-port mode */
......
/* Transport & Protocol Driver for In-System Design, Inc. ISD200 ASIC /*
* Transport & Protocol Driver for In-System Design, Inc. ISD200 ASIC
* *
* Current development and maintenance: * Current development and maintenance:
* (C) 2001-2002 Björn Stenberg (bjorn@haxx.se) * (C) 2001-2002 Björn Stenberg (bjorn@haxx.se)
...@@ -628,7 +629,8 @@ static void isd200_invoke_transport( struct us_data *us, ...@@ -628,7 +629,8 @@ static void isd200_invoke_transport( struct us_data *us,
srb->cmd_len = sizeof(ataCdb->generic); srb->cmd_len = sizeof(ataCdb->generic);
transferStatus = usb_stor_Bulk_transport(srb, us); 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 * short-circuit all other processing
*/ */
if (test_bit(US_FLIDX_TIMED_OUT, &us->dflags)) { if (test_bit(US_FLIDX_TIMED_OUT, &us->dflags)) {
...@@ -695,15 +697,18 @@ static void isd200_invoke_transport( struct us_data *us, ...@@ -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 * condition, show that in the result code
*/ */
if (transferStatus == USB_STOR_TRANSPORT_FAILED) if (transferStatus == USB_STOR_TRANSPORT_FAILED)
srb->result = SAM_STAT_CHECK_CONDITION; srb->result = SAM_STAT_CHECK_CONDITION;
return; 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: Handle_Abort:
srb->result = DID_ABORT << 16; srb->result = DID_ABORT << 16;
...@@ -965,19 +970,21 @@ static int isd200_try_enum(struct us_data *us, unsigned char master_slave, ...@@ -965,19 +970,21 @@ static int isd200_try_enum(struct us_data *us, unsigned char master_slave,
info->DeviceHead = master_slave; info->DeviceHead = master_slave;
break; 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 && else if (regs[ATA_REG_HCYL_OFFSET] == 0xEB &&
regs[ATA_REG_LCYL_OFFSET] == 0x14) { regs[ATA_REG_LCYL_OFFSET] == 0x14) {
/* It seems that the RICOH /*
MP6200A CD/RW drive will * It seems that the RICOH
report itself okay as a * MP6200A CD/RW drive will
slave when it is really a * report itself okay as a
master. So this check again * slave when it is really a
as a master device just to * master. So this check again
make sure it doesn't report * as a master device just to
itself okay as a master also * make sure it doesn't report
* itself okay as a master also
*/ */
if ((master_slave & ATA_ADDRESS_DEVHEAD_SLAVE) && if ((master_slave & ATA_ADDRESS_DEVHEAD_SLAVE) &&
!recheckAsMaster) { !recheckAsMaster) {
...@@ -1176,9 +1183,11 @@ static int isd200_get_inquiry_data( struct us_data *us ) ...@@ -1176,9 +1183,11 @@ static int isd200_get_inquiry_data( struct us_data *us )
if (id[ATA_ID_COMMAND_SET_2] & COMMANDSET_MEDIA_STATUS) { if (id[ATA_ID_COMMAND_SET_2] & COMMANDSET_MEDIA_STATUS) {
usb_stor_dbg(us, " Device supports Media Status Notification\n"); 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 * Indicate that it is enabled, even
* correctly. * though it is not.
* This allows the lock/unlock of the
* media to work correctly.
*/ */
info->DeviceFlags |= DF_MEDIA_STATUS_ENABLED; info->DeviceFlags |= DF_MEDIA_STATUS_ENABLED;
} }
......
/* Driver for Lexar "Jumpshot" Compact Flash reader /*
* Driver for Lexar "Jumpshot" Compact Flash reader
* *
* jumpshot driver v0.1: * jumpshot driver v0.1:
* *
...@@ -618,18 +619,23 @@ static int jumpshot_transport(struct scsi_cmnd *srb, struct us_data *us) ...@@ -618,18 +619,23 @@ static int jumpshot_transport(struct scsi_cmnd *srb, struct us_data *us)
} }
if (srb->cmnd[0] == ALLOW_MEDIUM_REMOVAL) { 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; return USB_STOR_TRANSPORT_GOOD;
} }
if (srb->cmnd[0] == START_STOP) { 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"); 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); rc = jumpshot_id_device(us, info);
if (rc == USB_STOR_TRANSPORT_GOOD) { if (rc == USB_STOR_TRANSPORT_GOOD) {
info->sense_key = NO_SENSE; info->sense_key = NO_SENSE;
......
/* Driver for Rio Karma /*
* Driver for Rio Karma
* *
* (c) 2006 Bob Copeland <me@bobcopeland.com> * (c) 2006 Bob Copeland <me@bobcopeland.com>
* (c) 2006 Keith Bennett <keith@mcs.st-and.ac.uk> * (c) 2006 Keith Bennett <keith@mcs.st-and.ac.uk>
......
...@@ -65,7 +65,8 @@ static int option_rezero(struct us_data *us) ...@@ -65,7 +65,8 @@ static int option_rezero(struct us_data *us)
goto out; 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. * care what that response is.
*/ */
usb_stor_bulk_transfer_buf(us, usb_stor_bulk_transfer_buf(us,
...@@ -140,7 +141,8 @@ int option_ms_init(struct us_data *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"); 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 * because some vendor/product IDs are ambiguous
*/ */
result = option_inquiry(us); result = option_inquiry(us);
......
/* Driver for USB Mass Storage compliant devices /*
* Driver for USB Mass Storage compliant devices
* *
* Current development and maintenance by: * Current development and maintenance by:
* (c) 1999-2002 Matthew Dharm (mdharm-usb@one-eyed-alien.net) * (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) ...@@ -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) 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 * UFI devices only accept 12 byte long commands
* *
* NOTE: This only works because a scsi_cmnd struct field contains * NOTE: This only works because a scsi_cmnd struct field contains
...@@ -127,7 +129,8 @@ EXPORT_SYMBOL_GPL(usb_stor_transparent_scsi_command); ...@@ -127,7 +129,8 @@ EXPORT_SYMBOL_GPL(usb_stor_transparent_scsi_command);
* Scatter-gather transfer buffer access routines * 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 * Update the **sgptr and *offset variables so that the next copy will
* pick up from where this one left off. * pick up from where this one left off.
*/ */
...@@ -175,7 +178,8 @@ unsigned int usb_stor_access_xfer_buf(unsigned char *buffer, ...@@ -175,7 +178,8 @@ unsigned int usb_stor_access_xfer_buf(unsigned char *buffer,
} }
EXPORT_SYMBOL_GPL(usb_stor_access_xfer_buf); 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. * SCSI residue.
*/ */
void usb_stor_set_xfer_buf(unsigned char *buffer, void usb_stor_set_xfer_buf(unsigned char *buffer,
......
/* Driver for USB Mass Storage compliant devices /*
* Driver for USB Mass Storage compliant devices
* Protocol Functions Header File * Protocol Functions Header File
* *
* Current development and maintenance by: * Current development and maintenance by:
......
/* Driver for Realtek RTS51xx USB card reader /*
* Driver for Realtek RTS51xx USB card reader
* *
* Copyright(c) 2009 Realtek Semiconductor Corp. All rights reserved. * Copyright(c) 2009 Realtek Semiconductor Corp. All rights reserved.
* *
...@@ -267,8 +268,10 @@ static int rts51x_bulk_transport(struct us_data *us, u8 lun, ...@@ -267,8 +268,10 @@ static int rts51x_bulk_transport(struct us_data *us, u8 lun,
if (bcs->Tag != us->tag) if (bcs->Tag != us->tag)
return USB_STOR_TRANSPORT_ERROR; 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) if (residue)
residue = residue < buf_len ? residue : buf_len; residue = residue < buf_len ? residue : buf_len;
...@@ -286,7 +289,8 @@ static int rts51x_bulk_transport(struct us_data *us, u8 lun, ...@@ -286,7 +289,8 @@ static int rts51x_bulk_transport(struct us_data *us, u8 lun,
return USB_STOR_TRANSPORT_FAILED; return USB_STOR_TRANSPORT_FAILED;
case US_BULK_STAT_PHASE: 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 * invoked by the invoke_transport() function
*/ */
return USB_STOR_TRANSPORT_ERROR; return USB_STOR_TRANSPORT_ERROR;
......
/* Driver for USB Mass Storage compliant devices /*
* Driver for USB Mass Storage compliant devices
* SCSI layer glue code * SCSI layer glue code
* *
* Current development and maintenance by: * Current development and maintenance by:
...@@ -58,7 +59,8 @@ ...@@ -58,7 +59,8 @@
#include "transport.h" #include "transport.h"
#include "protocol.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 * in all their devices
*/ */
#define VENDOR_ID_NOKIA 0x0421 #define VENDOR_ID_NOKIA 0x0421
...@@ -87,7 +89,8 @@ static int slave_alloc (struct scsi_device *sdev) ...@@ -87,7 +89,8 @@ static int slave_alloc (struct scsi_device *sdev)
*/ */
sdev->inquiry_len = 36; 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, * starting address of each scatter-gather element doesn't matter,
* the length of each element except the last must be divisible * the length of each element except the last must be divisible
* by the Bulk maxpacket value. There's currently no way to * by the Bulk maxpacket value. There's currently no way to
...@@ -115,7 +118,8 @@ static int slave_configure(struct scsi_device *sdev) ...@@ -115,7 +118,8 @@ static int slave_configure(struct scsi_device *sdev)
{ {
struct us_data *us = host_to_us(sdev->host); 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 * while others have trouble with more than 64K. At this time we
* are limiting both to 32K (64 sectores). * are limiting both to 32K (64 sectores).
*/ */
...@@ -128,19 +132,22 @@ static int slave_configure(struct scsi_device *sdev) ...@@ -128,19 +132,22 @@ static int slave_configure(struct scsi_device *sdev)
blk_queue_max_hw_sectors(sdev->request_queue, blk_queue_max_hw_sectors(sdev->request_queue,
max_sectors); max_sectors);
} else if (sdev->type == TYPE_TAPE) { } 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 * raise it to the maximum possible (4 GB / 512) and
* let the queue segment size sort out the real limit. * let the queue segment size sort out the real limit.
*/ */
blk_queue_max_hw_sectors(sdev->request_queue, 0x7FFFFF); blk_queue_max_hw_sectors(sdev->request_queue, 0x7FFFFF);
} else if (us->pusb_dev->speed >= USB_SPEED_SUPER) { } 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. * better throughput on most devices.
*/ */
blk_queue_max_hw_sectors(sdev->request_queue, 2048); 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 * They indicate this by setting their dma_mask to NULL. For
* such controllers we need to make sure the block layer sets * such controllers we need to make sure the block layer sets
* up bounce buffers in addressable memory. * up bounce buffers in addressable memory.
...@@ -148,17 +155,21 @@ static int slave_configure(struct scsi_device *sdev) ...@@ -148,17 +155,21 @@ static int slave_configure(struct scsi_device *sdev)
if (!us->pusb_dev->bus->controller->dma_mask) if (!us->pusb_dev->bus->controller->dma_mask)
blk_queue_bounce_limit(sdev->request_queue, BLK_BOUNCE_HIGH); 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 * 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) { 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 * all their devices -- primarily makers of cell phones
* and digital cameras. Since these devices always use * and digital cameras. Since these devices always use
* flash media and can be expected to have an even number * flash media and can be expected to have an even number
* of sectors, we will always enable the CAPACITY_HEURISTICS * 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)) { switch (le16_to_cpu(us->pusb_dev->descriptor.idVendor)) {
case VENDOR_ID_NOKIA: case VENDOR_ID_NOKIA:
case VENDOR_ID_NIKON: case VENDOR_ID_NIKON:
...@@ -170,28 +181,36 @@ static int slave_configure(struct scsi_device *sdev) ...@@ -170,28 +181,36 @@ static int slave_configure(struct scsi_device *sdev)
break; 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 * (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) if (us->subclass != USB_SC_SCSI && us->subclass != USB_SC_CYP_ATACB)
sdev->use_10_for_ms = 1; 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; 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 * which is the command used for checking if a device
* is write-protected. Now that we tell the sd driver * is write-protected. Now that we tell the sd driver
* to do a 192-byte transfer with this command the * to do a 192-byte transfer with this command the
* majority of devices work fine, but a few still can't * majority of devices work fine, but a few still can't
* handle it. The sd driver will simply assume those * 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) if (us->fflags & US_FL_NO_WP_DETECT)
sdev->skip_ms_page_3f = 1; 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; sdev->skip_ms_page_8 = 1;
/* Some devices don't handle VPD pages correctly */ /* Some devices don't handle VPD pages correctly */
...@@ -203,15 +222,19 @@ static int slave_configure(struct scsi_device *sdev) ...@@ -203,15 +222,19 @@ static int slave_configure(struct scsi_device *sdev)
/* Do not attempt to use WRITE SAME */ /* Do not attempt to use WRITE SAME */
sdev->no_write_same = 1; 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. * 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) if (us->fflags & US_FL_FIX_CAPACITY)
sdev->fix_capacity = 1; 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. * 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) if (us->fflags & US_FL_CAPACITY_HEURISTICS)
sdev->guess_capacity = 1; sdev->guess_capacity = 1;
...@@ -232,26 +255,34 @@ static int slave_configure(struct scsi_device *sdev) ...@@ -232,26 +255,34 @@ static int slave_configure(struct scsi_device *sdev)
if (sdev->scsi_level > SCSI_SPC_2) if (sdev->scsi_level > SCSI_SPC_2)
us->fflags |= US_FL_SANE_SENSE; 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, * Hardware Error) when any low-level error occurs,
* recoverable or not. Setting this flag tells the SCSI * recoverable or not. Setting this flag tells the SCSI
* midlayer to retry such commands, which frequently will * midlayer to retry such commands, which frequently will
* succeed and fix the error. The worst this can lead to * 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; 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; 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 * 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; 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 * 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 | if (!(us->fflags & (US_FL_FIX_CAPACITY | US_FL_CAPACITY_OK |
US_FL_SCM_MULT_TARG)) && US_FL_SCM_MULT_TARG)) &&
us->protocol == USB_PR_BULK) us->protocol == USB_PR_BULK)
...@@ -267,9 +298,11 @@ static int slave_configure(struct scsi_device *sdev) ...@@ -267,9 +298,11 @@ static int slave_configure(struct scsi_device *sdev)
} else { } 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. * 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; sdev->use_10_for_ms = 1;
/* Some (fake) usb cdrom devices don't like READ_DISC_INFO */ /* Some (fake) usb cdrom devices don't like READ_DISC_INFO */
...@@ -277,7 +310,8 @@ static int slave_configure(struct scsi_device *sdev) ...@@ -277,7 +310,8 @@ static int slave_configure(struct scsi_device *sdev)
sdev->no_read_disc_info = 1; 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 * 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 * bits don't get set to the LUN value if the device reports
* scsi_level == 0 (UNKNOWN). Hence such devices must necessarily * scsi_level == 0 (UNKNOWN). Hence such devices must necessarily
...@@ -287,13 +321,17 @@ static int slave_configure(struct scsi_device *sdev) ...@@ -287,13 +321,17 @@ static int slave_configure(struct scsi_device *sdev)
sdev->scsi_level == SCSI_UNKNOWN) sdev->scsi_level == SCSI_UNKNOWN)
us->max_lun = 0; 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) if (us->fflags & US_FL_NOT_LOCKABLE)
sdev->lockable = 0; 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; return 0;
} }
...@@ -367,8 +405,10 @@ static int command_abort(struct scsi_cmnd *srb) ...@@ -367,8 +405,10 @@ static int command_abort(struct scsi_cmnd *srb)
usb_stor_dbg(us, "%s called\n", __func__); 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)); scsi_lock(us_to_host(us));
/* Is this command still active? */ /* Is this command still active? */
...@@ -378,11 +418,13 @@ static int command_abort(struct scsi_cmnd *srb) ...@@ -378,11 +418,13 @@ static int command_abort(struct scsi_cmnd *srb)
return FAILED; 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 * a device reset isn't already in progress (to avoid interfering
* with the reset). Note that we must retain the host lock while * with the reset). Note that we must retain the host lock while
* calling usb_stor_stop_transport(); otherwise it might interfere * 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); set_bit(US_FLIDX_TIMED_OUT, &us->dflags);
if (!test_bit(US_FLIDX_RESETTING, &us->dflags)) { if (!test_bit(US_FLIDX_RESETTING, &us->dflags)) {
set_bit(US_FLIDX_ABORTING, &us->dflags); set_bit(US_FLIDX_ABORTING, &us->dflags);
...@@ -395,8 +437,10 @@ static int command_abort(struct scsi_cmnd *srb) ...@@ -395,8 +437,10 @@ static int command_abort(struct scsi_cmnd *srb)
return SUCCESS; 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) static int device_reset(struct scsi_cmnd *srb)
{ {
struct us_data *us = host_to_us(srb->device->host); struct us_data *us = host_to_us(srb->device->host);
...@@ -424,9 +468,11 @@ static int bus_reset(struct scsi_cmnd *srb) ...@@ -424,9 +468,11 @@ static int bus_reset(struct scsi_cmnd *srb)
return result < 0 ? FAILED : SUCCESS; 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. * 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) void usb_stor_report_device_reset(struct us_data *us)
{ {
int i; int i;
...@@ -439,9 +485,11 @@ void usb_stor_report_device_reset(struct us_data *us) ...@@ -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. * 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) void usb_stor_report_bus_reset(struct us_data *us)
{ {
struct Scsi_Host *host = us_to_host(us); struct Scsi_Host *host = us_to_host(us);
...@@ -590,7 +638,8 @@ static const struct scsi_host_template usb_stor_host_template = { ...@@ -590,7 +638,8 @@ static const struct scsi_host_template usb_stor_host_template = {
*/ */
.max_sectors = 240, .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 * periodically someone should test to see which setting is more
* optimal. * optimal.
*/ */
......
/* Driver for USB Mass Storage compliant devices /*
* Driver for USB Mass Storage compliant devices
* SCSI Connecting Glue Header File * SCSI Connecting Glue Header File
* *
* Current development and maintenance by: * Current development and maintenance by:
......
/* Driver for SanDisk SDDR-09 SmartMedia reader /*
* Driver for SanDisk SDDR-09 SmartMedia reader
* *
* (c) 2000, 2001 Robert Baruch (autophile@starband.net) * (c) 2000, 2001 Robert Baruch (autophile@starband.net)
* (c) 2002 Andries Brouwer (aeb@cwi.nl) * (c) 2002 Andries Brouwer (aeb@cwi.nl)
...@@ -799,10 +800,12 @@ sddr09_read_data(struct us_data *us, ...@@ -799,10 +800,12 @@ sddr09_read_data(struct us_data *us,
usb_stor_dbg(us, "Read %d zero pages (LBA %d) page %d\n", usb_stor_dbg(us, "Read %d zero pages (LBA %d) page %d\n",
pages, lba, page); pages, lba, page);
/* This is not really an error. It just means /*
that the block has never been written. * This is not really an error. It just means
Instead of returning an error * that the block has never been written.
it is better to return all zero data. */ * Instead of returning an error
* it is better to return all zero data.
*/
memset(buffer, 0, len); memset(buffer, 0, len);
...@@ -890,8 +893,10 @@ sddr09_write_lba(struct us_data *us, unsigned int lba, ...@@ -890,8 +893,10 @@ sddr09_write_lba(struct us_data *us, unsigned int lba,
} }
if (pba == 1) { 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"); printk(KERN_WARNING "sddr09: avoid writing to pba 1\n");
return 0; return 0;
} }
...@@ -979,18 +984,22 @@ sddr09_write_data(struct us_data *us, ...@@ -979,18 +984,22 @@ sddr09_write_data(struct us_data *us,
struct scatterlist *sg; struct scatterlist *sg;
int result; int result;
// Figure out the initial LBA and page /* Figure out the initial LBA and page */
lba = address >> info->blockshift; lba = address >> info->blockshift;
page = (address & info->blockmask); page = (address & info->blockmask);
maxlba = info->capacity >> (info->pageshift + info->blockshift); maxlba = info->capacity >> (info->pageshift + info->blockshift);
if (lba >= maxlba) if (lba >= maxlba)
return -EIO; 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); pagelen = (1 << info->pageshift) + (1 << CONTROL_SHIFT);
blocklen = (pagelen << info->blockshift); blocklen = (pagelen << info->blockshift);
...@@ -1000,9 +1009,11 @@ sddr09_write_data(struct us_data *us, ...@@ -1000,9 +1009,11 @@ sddr09_write_data(struct us_data *us,
return -ENOMEM; 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 * Since we don't write the user data directly to the device,
// at a time between the bounce buffer and the actual transfer buffer. * 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; len = min(sectors, (unsigned int) info->blocksize) * info->pagesize;
buffer = kmalloc(len, GFP_NOIO); buffer = kmalloc(len, GFP_NOIO);
...@@ -1018,7 +1029,7 @@ sddr09_write_data(struct us_data *us, ...@@ -1018,7 +1029,7 @@ sddr09_write_data(struct us_data *us,
while (sectors > 0) { 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); pages = min(sectors, info->blocksize - page);
len = (pages << info->pageshift); len = (pages << info->pageshift);
...@@ -1031,7 +1042,7 @@ sddr09_write_data(struct us_data *us, ...@@ -1031,7 +1042,7 @@ sddr09_write_data(struct us_data *us,
break; break;
} }
// Get the data from the transfer buffer /* Get the data from the transfer buffer */
usb_stor_access_xfer_buf(buffer, len, us->srb, usb_stor_access_xfer_buf(buffer, len, us->srb,
&sg, &offset, FROM_XFER_BUF); &sg, &offset, FROM_XFER_BUF);
...@@ -1168,9 +1179,11 @@ sddr09_get_cardinfo(struct us_data *us, unsigned char flags) { ...@@ -1168,9 +1179,11 @@ sddr09_get_cardinfo(struct us_data *us, unsigned char flags) {
/* Byte 1 is the device type */ /* Byte 1 is the device type */
cardinfo = nand_find_id(deviceID[1]); cardinfo = nand_find_id(deviceID[1]);
if (cardinfo) { if (cardinfo) {
/* MB or MiB? It is neither. A 16 MB card has /*
17301504 raw bytes, of which 16384000 are * MB or MiB? It is neither. A 16 MB card has
usable for user data. */ * 17301504 raw bytes, of which 16384000 are
* usable for user data.
*/
sprintf(blurbtxt + strlen(blurbtxt), sprintf(blurbtxt + strlen(blurbtxt),
", %d MB", 1<<(cardinfo->chipshift - 20)); ", %d MB", 1<<(cardinfo->chipshift - 20));
} else { } else {
...@@ -1211,14 +1224,18 @@ sddr09_read_map(struct us_data *us) { ...@@ -1211,14 +1224,18 @@ sddr09_read_map(struct us_data *us) {
if (!info->capacity) if (!info->capacity)
return -1; 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); numblocks = info->capacity >> (info->blockshift + info->pageshift);
// read 64 bytes for every block (actually 1 << CONTROL_SHIFT) /*
// but only use a 64 KB buffer * read 64 bytes for every block (actually 1 << CONTROL_SHIFT)
// buffer size used must be a multiple of (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 #define SDDR09_READ_MAP_BUFSZ 65536
alloc_blocks = min(numblocks, SDDR09_READ_MAP_BUFSZ >> CONTROL_SHIFT); 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) ...@@ -1575,8 +1592,10 @@ static int sddr09_transport(struct scsi_cmnd *srb, struct us_data *us)
havefakesense = 1; 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) { if (srb->cmnd[0] == INQUIRY) {
memcpy(ptr, inquiry_response, 8); memcpy(ptr, inquiry_response, 8);
...@@ -1628,8 +1647,10 @@ static int sddr09_transport(struct scsi_cmnd *srb, struct us_data *us) ...@@ -1628,8 +1647,10 @@ static int sddr09_transport(struct scsi_cmnd *srb, struct us_data *us)
if (srb->cmnd[0] == MODE_SENSE_10) { if (srb->cmnd[0] == MODE_SENSE_10) {
int modepage = (srb->cmnd[2] & 0x3F); 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 %% */ /* %% We should check DBD %% */
if (modepage == 0x01 || modepage == 0x3F) { if (modepage == 0x01 || modepage == 0x3F) {
usb_stor_dbg(us, "Dummy up request for mode page 0x%x\n", 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) ...@@ -1682,7 +1703,8 @@ static int sddr09_transport(struct scsi_cmnd *srb, struct us_data *us)
USB_STOR_TRANSPORT_ERROR); 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 * pass TEST_UNIT_READY and REQUEST_SENSE through
*/ */
if (srb->cmnd[0] != TEST_UNIT_READY && if (srb->cmnd[0] != TEST_UNIT_READY &&
......
/* Driver for SanDisk SDDR-55 SmartMedia reader /*
* Driver for SanDisk SDDR-55 SmartMedia reader
* *
* SDDR55 driver v0.1: * SDDR55 driver v0.1:
* *
...@@ -130,7 +131,8 @@ sddr55_bulk_transport(struct us_data *us, int direction, ...@@ -130,7 +131,8 @@ sddr55_bulk_transport(struct us_data *us, int direction,
return usb_stor_bulk_transfer_buf(us, pipe, data, len, NULL); 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 * return non zero if no card
*/ */
...@@ -714,15 +716,18 @@ static int sddr55_read_map(struct us_data *us) { ...@@ -714,15 +716,18 @@ static int sddr55_read_map(struct us_data *us) {
if (max_lba > 1000) if (max_lba > 1000)
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++) { for (i=0; i<numblocks; i++) {
int zone = i / 1024; int zone = i / 1024;
lba = short_pack(buffer[i * 2], buffer[i * 2 + 1]); 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 * go back to zero, but are within a higher
* block of LBA's. Also, there is a maximum of * block of LBA's. Also, there is a maximum of
* 1000 LBA's per zone. In other words, in PBA * 1000 LBA's per zone. In other words, in PBA
...@@ -733,7 +738,8 @@ static int sddr55_read_map(struct us_data *us) { ...@@ -733,7 +738,8 @@ static int sddr55_read_map(struct us_data *us) {
* are 24 spare blocks to use when blocks do go bad. * 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??) * CIS block. (Is this true for cards 8MB or less??)
* Record these in the physical to logical map * Record these in the physical to logical map
*/ */
...@@ -824,8 +830,10 @@ static int sddr55_transport(struct scsi_cmnd *srb, struct us_data *us) ...@@ -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); 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) { if (srb->cmnd[0] == INQUIRY) {
memcpy(ptr, inquiry_response, 8); memcpy(ptr, inquiry_response, 8);
...@@ -833,7 +841,8 @@ static int sddr55_transport(struct scsi_cmnd *srb, struct us_data *us) ...@@ -833,7 +841,8 @@ static int sddr55_transport(struct scsi_cmnd *srb, struct us_data *us)
return USB_STOR_TRANSPORT_GOOD; 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 * 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)) { 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) ...@@ -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) { if (info->fatal_error) {
set_sense_info (3, 0x31, 0); set_sense_info (3, 0x31, 0);
...@@ -868,12 +879,16 @@ static int sddr55_transport(struct scsi_cmnd *srb, struct us_data *us) ...@@ -868,12 +879,16 @@ static int sddr55_transport(struct scsi_cmnd *srb, struct us_data *us)
info->capacity = capacity; 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; 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 = (capacity / 256) * 250;
capacity /= PAGESIZE; capacity /= PAGESIZE;
......
/* 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: * Current development and maintenance by:
* (c) 2000, 2001 Robert Baruch (autophile@starband.net) * (c) 2000, 2001 Robert Baruch (autophile@starband.net)
...@@ -408,7 +409,8 @@ static int usbat_wait_not_busy(struct us_data *us, int minutes) ...@@ -408,7 +409,8 @@ static int usbat_wait_not_busy(struct us_data *us, int minutes)
int result; int result;
unsigned char *status = us->iobuf; 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, * 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 * doing a full blank on a CDRW at speed 1 will take about 75
* minutes! * minutes!
...@@ -1570,9 +1572,10 @@ static int usbat_hp8200e_transport(struct scsi_cmnd *srb, struct us_data *us) ...@@ -1570,9 +1572,10 @@ static int usbat_hp8200e_transport(struct scsi_cmnd *srb, struct us_data *us)
len = scsi_bufflen(srb); len = scsi_bufflen(srb);
/* Send A0 (ATA PACKET COMMAND). /*
Note: I guess we're never going to get any of the ATA * Send A0 (ATA PACKET COMMAND).
commands... just ATA Packet Commands. * Note: I guess we're never going to get any of the ATA
* commands... just ATA Packet Commands.
*/ */
registers[0] = USBAT_ATA_FEATURES; registers[0] = USBAT_ATA_FEATURES;
...@@ -1851,7 +1854,8 @@ static int usbat_probe(struct usb_interface *intf, ...@@ -1851,7 +1854,8 @@ static int usbat_probe(struct usb_interface *intf,
if (result) if (result)
return 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. * initialization routine; this is just a placeholder.
*/ */
us->transport_name = "Shuttle USBAT"; us->transport_name = "Shuttle USBAT";
......
...@@ -177,7 +177,8 @@ int sierra_ms_init(struct us_data *us) ...@@ -177,7 +177,8 @@ int sierra_ms_init(struct us_data *us)
debug_swoc(&us->pusb_dev->dev, swocInfo); 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 * then switch to modem mode
*/ */
if (!containsFullLinuxPackage(swocInfo)) { if (!containsFullLinuxPackage(swocInfo)) {
......
/* Driver for USB Mass Storage compliant devices /*
* Driver for USB Mass Storage compliant devices
* *
* Current development and maintenance by: * Current development and maintenance by:
* (c) 1999-2002 Matthew Dharm (mdharm-usb@one-eyed-alien.net) * (c) 1999-2002 Matthew Dharm (mdharm-usb@one-eyed-alien.net)
...@@ -109,7 +110,8 @@ ...@@ -109,7 +110,8 @@
* called more than once or from being called during usb_submit_urb(). * 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. * completes.
*/ */
static void usb_stor_blocking_completion(struct urb *urb) static void usb_stor_blocking_completion(struct urb *urb)
...@@ -119,7 +121,8 @@ 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); 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 * 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 * 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) ...@@ -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->context = &urb_done;
us->current_urb->transfer_flags = 0; 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 * hasn't been mapped for DMA. Yes, this is clunky, but it's
* easier than always having the caller tell us whether the * 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) if (us->current_urb->transfer_buffer == us->iobuf)
us->current_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; us->current_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
us->current_urb->transfer_dma = us->iobuf_dma; us->current_urb->transfer_dma = us->iobuf_dma;
...@@ -157,8 +162,10 @@ static int usb_stor_msg_common(struct us_data *us, int timeout) ...@@ -157,8 +162,10 @@ static int usb_stor_msg_common(struct us_data *us, int timeout)
return status; 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); set_bit(US_FLIDX_URB_ACTIVE, &us->dflags);
/* did an abort occur during the submission? */ /* did an abort occur during the submission? */
...@@ -220,7 +227,8 @@ int usb_stor_control_msg(struct us_data *us, unsigned int pipe, ...@@ -220,7 +227,8 @@ int usb_stor_control_msg(struct us_data *us, unsigned int pipe,
} }
EXPORT_SYMBOL_GPL(usb_stor_control_msg); 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 * 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. * 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, ...@@ -280,8 +288,10 @@ static int interpret_urb_result(struct us_data *us, unsigned int pipe,
/* stalled */ /* stalled */
case -EPIPE: 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)) { if (usb_pipecontrol(pipe)) {
usb_stor_dbg(us, "-- stall on control pipe\n"); usb_stor_dbg(us, "-- stall on control pipe\n");
return USB_STOR_XFER_STALLED; return USB_STOR_XFER_STALLED;
...@@ -433,8 +443,10 @@ static int usb_stor_bulk_transfer_sglist(struct us_data *us, unsigned int pipe, ...@@ -433,8 +443,10 @@ static int usb_stor_bulk_transfer_sglist(struct us_data *us, unsigned int pipe,
return USB_STOR_XFER_ERROR; 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); set_bit(US_FLIDX_SG_ACTIVE, &us->dflags);
/* did an abort occur during the submission? */ /* did an abort occur during the submission? */
...@@ -515,7 +527,8 @@ EXPORT_SYMBOL_GPL(usb_stor_bulk_transfer_sg); ...@@ -515,7 +527,8 @@ EXPORT_SYMBOL_GPL(usb_stor_bulk_transfer_sg);
* Transport routines * 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 * this routine was written to counteract some of the resulting
* problems. * problems.
*/ */
...@@ -533,7 +546,8 @@ static void last_sector_hacks(struct us_data *us, struct scsi_cmnd *srb) ...@@ -533,7 +546,8 @@ static void last_sector_hacks(struct us_data *us, struct scsi_cmnd *srb)
[12] = 0x14 /* Record Not Found */ [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 * capacity was already decremented or because the device is
* known to report the correct capacity, then we don't need * known to report the correct capacity, then we don't need
* to do anything. * to do anything.
...@@ -559,13 +573,15 @@ static void last_sector_hacks(struct us_data *us, struct scsi_cmnd *srb) ...@@ -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) { 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. * have the last-sector bug, so stop checking it.
*/ */
us->use_last_sector_hacks = 0; us->use_last_sector_hacks = 0;
} else { } 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 * is some normal sort of failure. After that, assume the
* capacity is wrong and we're trying to access the sector * capacity is wrong and we're trying to access the sector
* beyond the end. Replace the result code and sense data * 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) ...@@ -581,7 +597,8 @@ static void last_sector_hacks(struct us_data *us, struct scsi_cmnd *srb)
} }
done: 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 * because they get issued after device resets which might be
* caused by a failed last-sector access. * caused by a failed last-sector access.
*/ */
...@@ -589,7 +606,8 @@ static void last_sector_hacks(struct us_data *us, struct scsi_cmnd *srb) ...@@ -589,7 +606,8 @@ static void last_sector_hacks(struct us_data *us, struct scsi_cmnd *srb)
us->last_sector_retries = 0; 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 * This is used by the protocol layers to actually send the message to
* the device and receive the response. * the device and receive the response.
...@@ -603,7 +621,8 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us) ...@@ -603,7 +621,8 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us)
scsi_set_resid(srb, 0); scsi_set_resid(srb, 0);
result = us->transport(srb, us); 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 * short-circuit all other processing
*/ */
if (test_bit(US_FLIDX_TIMED_OUT, &us->dflags)) { 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) ...@@ -628,7 +647,8 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us)
srb->result = SAM_STAT_GOOD; 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 * 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. * 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) ...@@ -728,7 +748,8 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us)
goto Handle_Errors; 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 * trying to request it. When a transport failure happens
* using US_FS_SANE_SENSE, we always retry with a standard * using US_FS_SANE_SENSE, we always retry with a standard
* (small) sense request. This fixes some USB GSM modems * (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) ...@@ -746,7 +767,8 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us)
if (temp_result != USB_STOR_TRANSPORT_GOOD) { if (temp_result != USB_STOR_TRANSPORT_GOOD) {
usb_stor_dbg(us, "-- auto-sense failure\n"); 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 * multi-target device, since failure of an
* auto-sense is perfectly valid * auto-sense is perfectly valid
*/ */
...@@ -756,7 +778,8 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us) ...@@ -756,7 +778,8 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us)
return; 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. * assume this device supports requesting more in the future.
* The response code must be 70h through 73h inclusive. * 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) ...@@ -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"); usb_stor_dbg(us, "-- SANE_SENSE support enabled\n");
us->fflags |= US_FL_SANE_SENSE; 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. * because we didn't know it supported larger sense.
*/ */
usb_stor_dbg(us, "-- Sense data truncated to %i from %i\n", 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) ...@@ -795,13 +819,15 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us)
SCSI_SENSE_BUFFERSIZE, 4); SCSI_SENSE_BUFFERSIZE, 4);
fm_ili = (scdd ? scdd[3] : srb->sense_buffer[2]) & 0xA0; 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 * everything worked or that there was an unspecified
* problem. We have to decide which. * problem. We have to decide which.
*/ */
if (sshdr.sense_key == 0 && sshdr.asc == 0 && sshdr.ascq == 0 && if (sshdr.sense_key == 0 && sshdr.asc == 0 && sshdr.ascq == 0 &&
fm_ili == 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 * Zero out the sense buffer so the higher layers
* won't realize we did an unsolicited auto-sense. * 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) ...@@ -809,7 +835,8 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us)
srb->result = SAM_STAT_GOOD; srb->result = SAM_STAT_GOOD;
srb->sense_buffer[0] = 0x0; 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 * hardware error to prevent the higher layers from
* entering an infinite retry loop. * entering an infinite retry loop.
*/ */
...@@ -860,20 +887,26 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us) ...@@ -860,20 +887,26 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us)
last_sector_hacks(us, srb); last_sector_hacks(us, srb);
return; 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 * by issuing a port reset. If that fails, try a class-specific
* device reset. */ * device reset.
*/
Handle_Errors: 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)); scsi_lock(us_to_host(us));
set_bit(US_FLIDX_RESETTING, &us->dflags); set_bit(US_FLIDX_RESETTING, &us->dflags);
clear_bit(US_FLIDX_ABORTING, &us->dflags); clear_bit(US_FLIDX_ABORTING, &us->dflags);
scsi_unlock(us_to_host(us)); 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); mutex_unlock(&us->dev_mutex);
result = usb_stor_port_reset(us); result = usb_stor_port_reset(us);
mutex_lock(&us->dev_mutex); mutex_lock(&us->dev_mutex);
...@@ -891,10 +924,12 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us) ...@@ -891,10 +924,12 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us)
/* Stop the current URB transfer */ /* Stop the current URB transfer */
void usb_stor_stop_transport(struct us_data *us) 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 * let's wake it up. The test_and_clear_bit() call
* guarantees that if a URB has just been submitted, * 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)) { if (test_and_clear_bit(US_FLIDX_URB_ACTIVE, &us->dflags)) {
usb_stor_dbg(us, "-- cancelling URB\n"); usb_stor_dbg(us, "-- cancelling URB\n");
usb_unlink_urb(us->current_urb); usb_unlink_urb(us->current_urb);
...@@ -955,7 +990,8 @@ int usb_stor_CB_transport(struct scsi_cmnd *srb, struct us_data *us) ...@@ -955,7 +990,8 @@ int usb_stor_CB_transport(struct scsi_cmnd *srb, struct us_data *us)
/* STATUS STAGE */ /* 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. * we have to catch this at a higher level.
*/ */
if (us->protocol != USB_PR_CBI) if (us->protocol != USB_PR_CBI)
...@@ -967,7 +1003,8 @@ int usb_stor_CB_transport(struct scsi_cmnd *srb, struct us_data *us) ...@@ -967,7 +1003,8 @@ int usb_stor_CB_transport(struct scsi_cmnd *srb, struct us_data *us)
if (result != USB_STOR_XFER_GOOD) if (result != USB_STOR_XFER_GOOD)
return USB_STOR_TRANSPORT_ERROR; 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 * REQUEST_SENSE and INQUIRY don't affect the sense data on UFI
* devices, so we ignore the information for those commands. Note * 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) ...@@ -983,7 +1020,8 @@ int usb_stor_CB_transport(struct scsi_cmnd *srb, struct us_data *us)
return USB_STOR_TRANSPORT_GOOD; 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. * The first byte should always be a 0x0.
* *
* Some bogus devices don't follow that rule. They stuff the ASC * 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) ...@@ -1005,7 +1043,8 @@ int usb_stor_CB_transport(struct scsi_cmnd *srb, struct us_data *us)
} }
return USB_STOR_TRANSPORT_ERROR; 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) * following any data-in/out command failure (section 2.4.3.1.3)
*/ */
Failed: Failed:
...@@ -1107,9 +1146,11 @@ int usb_stor_Bulk_transport(struct scsi_cmnd *srb, struct us_data *us) ...@@ -1107,9 +1146,11 @@ int usb_stor_Bulk_transport(struct scsi_cmnd *srb, struct us_data *us)
/* DATA STAGE */ /* DATA STAGE */
/* send/receive data payload, if there is any */ /* 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 * 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)) if (unlikely(us->fflags & US_FL_GO_SLOW))
usleep_range(125, 150); usleep_range(125, 150);
...@@ -1121,7 +1162,8 @@ int usb_stor_Bulk_transport(struct scsi_cmnd *srb, struct us_data *us) ...@@ -1121,7 +1162,8 @@ int usb_stor_Bulk_transport(struct scsi_cmnd *srb, struct us_data *us)
if (result == USB_STOR_XFER_ERROR) if (result == USB_STOR_XFER_ERROR)
return USB_STOR_TRANSPORT_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 * amount requested, the spec requires us to transfer
* the CSW anyway. Since there's no point retrying the * the CSW anyway. Since there's no point retrying the
* the command, we'll return fake sense data indicating * 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) ...@@ -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. * an explanation of how this code works.
*/ */
...@@ -1165,7 +1208,8 @@ int usb_stor_Bulk_transport(struct scsi_cmnd *srb, struct us_data *us) ...@@ -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, result = usb_stor_bulk_transfer_buf(us, us->recv_bulk_pipe,
bcs, US_BULK_CS_WRAP_LEN, &cswlen); 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 * 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. * 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) ...@@ -1201,7 +1245,8 @@ int usb_stor_Bulk_transport(struct scsi_cmnd *srb, struct us_data *us)
return USB_STOR_TRANSPORT_ERROR; 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, * for validity against the spec. We store the first one we see,
* and check subsequent transfers for validity against this signature. * 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) ...@@ -1217,11 +1262,14 @@ int usb_stor_Bulk_transport(struct scsi_cmnd *srb, struct us_data *us)
return USB_STOR_TRANSPORT_ERROR; 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)) { 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 * by seeing what happens with INQUIRY and READ CAPACITY
* commands. * commands.
*/ */
...@@ -1259,7 +1307,8 @@ int usb_stor_Bulk_transport(struct scsi_cmnd *srb, struct us_data *us) ...@@ -1259,7 +1307,8 @@ int usb_stor_Bulk_transport(struct scsi_cmnd *srb, struct us_data *us)
return USB_STOR_TRANSPORT_FAILED; return USB_STOR_TRANSPORT_FAILED;
case US_BULK_STAT_PHASE: 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 * invoked by the invoke_transport() function
*/ */
return USB_STOR_TRANSPORT_ERROR; return USB_STOR_TRANSPORT_ERROR;
...@@ -1274,7 +1323,8 @@ EXPORT_SYMBOL_GPL(usb_stor_Bulk_transport); ...@@ -1274,7 +1323,8 @@ EXPORT_SYMBOL_GPL(usb_stor_Bulk_transport);
* Reset routines * 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 * It's handy that every transport mechanism uses the control endpoint for
* resets. * resets.
...@@ -1302,8 +1352,10 @@ static int usb_stor_reset_common(struct us_data *us, ...@@ -1302,8 +1352,10 @@ static int usb_stor_reset_common(struct us_data *us,
return result; 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, wait_event_interruptible_timeout(us->delay_wait,
test_bit(US_FLIDX_DISCONNECTING, &us->dflags), test_bit(US_FLIDX_DISCONNECTING, &us->dflags),
HZ*6); HZ*6);
...@@ -1328,8 +1380,7 @@ static int usb_stor_reset_common(struct us_data *us, ...@@ -1328,8 +1380,7 @@ static int usb_stor_reset_common(struct us_data *us,
return result; 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 #define CB_RESET_CMD_SIZE 12
int usb_stor_CB_reset(struct us_data *us) int usb_stor_CB_reset(struct us_data *us)
...@@ -1343,7 +1394,8 @@ 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); 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. * clearing the subsequent endpoint halts that may occur.
*/ */
int usb_stor_Bulk_reset(struct us_data *us) int usb_stor_Bulk_reset(struct us_data *us)
...@@ -1354,7 +1406,8 @@ 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); 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. * us->dev_mutex.
*/ */
int usb_stor_port_reset(struct us_data *us) int usb_stor_port_reset(struct us_data *us)
......
/* Driver for USB Mass Storage compliant devices /*
* Driver for USB Mass Storage compliant devices
* Transport Functions Header File * Transport Functions Header File
* *
* Current development and maintenance by: * Current development and maintenance by:
......
...@@ -799,7 +799,8 @@ static int uas_slave_alloc(struct scsi_device *sdev) ...@@ -799,7 +799,8 @@ static int uas_slave_alloc(struct scsi_device *sdev)
sdev->hostdata = devinfo; 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, * starting address of each scatter-gather element doesn't matter,
* the length of each element except the last must be divisible * the length of each element except the last must be divisible
* by the Bulk maxpacket value. There's currently no way to * by the Bulk maxpacket value. There's currently no way to
......
/* 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 * 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 * under the terms of the GNU General Public License as published by the
......
/* 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 * with support for ATACB
* *
* This program is free software; you can redistribute it and/or modify it * This program is free software; you can redistribute it and/or modify it
......
/* 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 * 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 * under the terms of the GNU General Public License as published by the
...@@ -79,7 +80,8 @@ UNUSUAL_DEV( 0x07c4, 0xa109, 0x0000, 0xffff, ...@@ -79,7 +80,8 @@ UNUSUAL_DEV( 0x07c4, 0xa109, 0x0000, 0xffff,
USB_SC_SCSI, USB_PR_DATAFAB, NULL, USB_SC_SCSI, USB_PR_DATAFAB, NULL,
0), 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 * in Germany this is sold by Hama with the productnumber 46952
* as "DualSlot CompactFlash(TM) & MStick Drive USB" * as "DualSlot CompactFlash(TM) & MStick Drive USB"
*/ */
......
/* Driver for USB Mass Storage compliant devices /*
* Driver for USB Mass Storage compliant devices
* Unusual Devices File * Unusual Devices File
* *
* Current development and maintenance by: * Current development and maintenance by:
...@@ -25,13 +26,15 @@ ...@@ -25,13 +26,15 @@
* 675 Mass Ave, Cambridge, MA 02139, USA. * 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 following thing for it to work:
* The UNUSUAL_DEV, COMPLIANT_DEV, and USUAL_DEV macros must be defined * The UNUSUAL_DEV, COMPLIANT_DEV, and USUAL_DEV macros must be defined
* before this file is included. * 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. * then by ProductID.
* *
* If you want to add an entry for this file, be sure to include the * If you want to add an entry for this file, be sure to include the
...@@ -47,13 +50,15 @@ ...@@ -47,13 +50,15 @@
* <usb-storage@lists.one-eyed-alien.net> * <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 * use the COMPLIANT_DEV macro instead of UNUSUAL_DEV. This is
* because such entries mark devices which actually work correctly, * because such entries mark devices which actually work correctly,
* as opposed to devices that do something strangely or wrongly. * 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 * this list for the sole purpose of switching them to a different
* mode. Existing userspace solutions are superior. * mode. Existing userspace solutions are superior.
* *
...@@ -66,8 +71,7 @@ ...@@ -66,8 +71,7 @@
#define NO_SDDR09 #define NO_SDDR09
#endif #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, UNUSUAL_DEV( 0x03eb, 0x2002, 0x0100, 0x0100,
"ATMEL", "ATMEL",
"SND1 Storage", "SND1 Storage",
...@@ -93,7 +97,8 @@ UNUSUAL_DEV( 0x03f0, 0x070c, 0x0000, 0x0000, ...@@ -93,7 +97,8 @@ UNUSUAL_DEV( 0x03f0, 0x070c, 0x0000, 0x0000,
USB_SC_DEVICE, USB_PR_DEVICE, NULL, USB_SC_DEVICE, USB_PR_DEVICE, NULL,
US_FL_SANE_SENSE ), 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. * HP r707 camera in "Disk" mode with 2.00.23 or 2.00.24 firmware.
*/ */
UNUSUAL_DEV( 0x03f0, 0x4002, 0x0001, 0x0001, UNUSUAL_DEV( 0x03f0, 0x4002, 0x0001, 0x0001,
...@@ -107,7 +112,8 @@ UNUSUAL_DEV( 0x03f3, 0x0001, 0x0000, 0x9999, ...@@ -107,7 +112,8 @@ UNUSUAL_DEV( 0x03f3, 0x0001, 0x0000, 0x9999,
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_euscsi_init, USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_euscsi_init,
US_FL_SCM_MULT_TARG ), 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) * and Olaf Hering <olh@suse.de> (different bcd's, same vendor/product)
* for USB floppies that need the SINGLE_LUN enforcement. * for USB floppies that need the SINGLE_LUN enforcement.
*/ */
...@@ -124,7 +130,8 @@ UNUSUAL_DEV( 0x040d, 0x6205, 0x0003, 0x0003, ...@@ -124,7 +130,8 @@ UNUSUAL_DEV( 0x040d, 0x6205, 0x0003, 0x0003,
USB_SC_DEVICE, USB_PR_DEVICE, NULL, USB_SC_DEVICE, USB_PR_DEVICE, NULL,
US_FL_IGNORE_RESIDUE ), 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 * Entry needed for flags: US_FL_FIX_INQUIRY because initial inquiry message
* always fails and confuses drive. * always fails and confuses drive.
*/ */
...@@ -167,8 +174,10 @@ UNUSUAL_DEV( 0x0420, 0x0001, 0x0100, 0x0100, ...@@ -167,8 +174,10 @@ UNUSUAL_DEV( 0x0420, 0x0001, 0x0100, 0x0100,
USB_SC_DEVICE, USB_PR_DEVICE, NULL, USB_SC_DEVICE, USB_PR_DEVICE, NULL,
US_FL_IGNORE_RESIDUE ), 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, UNUSUAL_DEV( 0x0421, 0x0019, 0x0592, 0x0610,
"Nokia", "Nokia",
"Nokia 6288", "Nokia 6288",
...@@ -196,16 +205,20 @@ UNUSUAL_DEV( 0x0421, 0x0434, 0x0100, 0x0100, ...@@ -196,16 +205,20 @@ UNUSUAL_DEV( 0x0421, 0x0434, 0x0100, 0x0100,
USB_SC_DEVICE, USB_PR_DEVICE, NULL, USB_SC_DEVICE, USB_PR_DEVICE, NULL,
US_FL_FIX_CAPACITY | US_FL_IGNORE_RESIDUE ), 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, UNUSUAL_DEV( 0x0421, 0x0444, 0x0100, 0x0100,
"Nokia", "Nokia",
"N91", "N91",
USB_SC_DEVICE, USB_PR_DEVICE, NULL, USB_SC_DEVICE, USB_PR_DEVICE, NULL,
US_FL_IGNORE_RESIDUE | US_FL_FIX_CAPACITY ), 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, UNUSUAL_DEV( 0x0421, 0x0446, 0x0100, 0x0100,
"Nokia", "Nokia",
"N80", "N80",
...@@ -269,8 +282,10 @@ UNUSUAL_DEV( 0x0436, 0x0005, 0x0100, 0x0100, ...@@ -269,8 +282,10 @@ UNUSUAL_DEV( 0x0436, 0x0005, 0x0100, 0x0100,
US_FL_SINGLE_LUN ), US_FL_SINGLE_LUN ),
#endif #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, UNUSUAL_DEV( 0x0451, 0x5416, 0x0100, 0x0100,
"Neuros Audio", "Neuros Audio",
"USB 2.0 HD 2.5", "USB 2.0 HD 2.5",
...@@ -288,17 +303,18 @@ UNUSUAL_DEV( 0x0457, 0x0150, 0x0100, 0x0100, ...@@ -288,17 +303,18 @@ UNUSUAL_DEV( 0x0457, 0x0150, 0x0100, 0x0100,
USB_SC_DEVICE, USB_PR_DEVICE, NULL, US_FL_NOT_LOCKABLE ), USB_SC_DEVICE, USB_PR_DEVICE, NULL, US_FL_NOT_LOCKABLE ),
/* /*
* Bohdan Linda <bohdan.linda@gmail.com> * Bohdan Linda <bohdan.linda@gmail.com>
* 1GB USB sticks MyFlash High Speed. I have restricted * 1GB USB sticks MyFlash High Speed. I have restricted
* the revision to my model only * the revision to my model only
*/ */
UNUSUAL_DEV( 0x0457, 0x0151, 0x0100, 0x0100, UNUSUAL_DEV( 0x0457, 0x0151, 0x0100, 0x0100,
"USB 2.0", "USB 2.0",
"Flash Disk", "Flash Disk",
USB_SC_DEVICE, USB_PR_DEVICE, NULL, USB_SC_DEVICE, USB_PR_DEVICE, NULL,
US_FL_NOT_LOCKABLE ), 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; * Obviously the PROM has not been customized by the VAR;
* the Vendor and Product string descriptors are: * the Vendor and Product string descriptors are:
* Generic Mass Storage (PROTOTYPE--Remember to change idVendor) * Generic Mass Storage (PROTOTYPE--Remember to change idVendor)
...@@ -347,24 +363,30 @@ UNUSUAL_DEV( 0x0482, 0x0107, 0x0100, 0x0100, ...@@ -347,24 +363,30 @@ UNUSUAL_DEV( 0x0482, 0x0107, 0x0100, 0x0100,
USB_SC_DEVICE, USB_PR_DEVICE, NULL, USB_SC_DEVICE, USB_PR_DEVICE, NULL,
US_FL_FIX_CAPACITY | US_FL_NOT_LOCKABLE), 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, UNUSUAL_DEV( 0x04a4, 0x0004, 0x0001, 0x0001,
"Hitachi", "Hitachi",
"DVD-CAM DZ-MV100A Camcorder", "DVD-CAM DZ-MV100A Camcorder",
USB_SC_SCSI, USB_PR_CB, NULL, US_FL_SINGLE_LUN), USB_SC_SCSI, USB_PR_CB, NULL, US_FL_SINGLE_LUN),
/* BENQ DC5330 /*
* BENQ DC5330
* Reported by Manuel Fombuena <mfombuena@ya.com> and * 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, UNUSUAL_DEV( 0x04a5, 0x3010, 0x0100, 0x0100,
"Tekom Technologies, Inc", "Tekom Technologies, Inc",
"300_CAMERA", "300_CAMERA",
USB_SC_DEVICE, USB_PR_DEVICE, NULL, USB_SC_DEVICE, USB_PR_DEVICE, NULL,
US_FL_IGNORE_RESIDUE ), 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, UNUSUAL_DEV( 0x04b0, 0x0301, 0x0010, 0x0010,
"NIKON", "NIKON",
"NIKON DSC E2000", "NIKON DSC E2000",
...@@ -378,21 +400,26 @@ UNUSUAL_DEV( 0x04b3, 0x4001, 0x0110, 0x0110, ...@@ -378,21 +400,26 @@ UNUSUAL_DEV( 0x04b3, 0x4001, 0x0110, 0x0110,
USB_SC_DEVICE, USB_PR_CB, NULL, USB_SC_DEVICE, USB_PR_CB, NULL,
US_FL_MAX_SECTORS_MIN), 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, UNUSUAL_DEV( 0x04b8, 0x0601, 0x0100, 0x0100,
"Epson", "Epson",
"875DC Storage", "875DC Storage",
USB_SC_SCSI, USB_PR_CB, NULL, US_FL_FIX_INQUIRY), 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, UNUSUAL_DEV( 0x04b8, 0x0602, 0x0110, 0x0110,
"Epson", "Epson",
"785EPX Storage", "785EPX Storage",
USB_SC_SCSI, USB_PR_BULK, NULL, US_FL_SINGLE_LUN), 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 * Pavel Machek <pavel@ucw.cz> reported that the extra US_FL_SINGLE_LUN
* flag be added */ * flag be added */
UNUSUAL_DEV( 0x04cb, 0x0100, 0x0000, 0x2210, UNUSUAL_DEV( 0x04cb, 0x0100, 0x0000, 0x2210,
...@@ -400,7 +427,8 @@ UNUSUAL_DEV( 0x04cb, 0x0100, 0x0000, 0x2210, ...@@ -400,7 +427,8 @@ UNUSUAL_DEV( 0x04cb, 0x0100, 0x0000, 0x2210,
"FinePix 1400Zoom", "FinePix 1400Zoom",
USB_SC_UFI, USB_PR_DEVICE, NULL, US_FL_FIX_INQUIRY | US_FL_SINGLE_LUN), 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 * The device reports one sector more and breaks when that sector is accessed
*/ */
UNUSUAL_DEV( 0x04ce, 0x0002, 0x026c, 0x026c, UNUSUAL_DEV( 0x04ce, 0x0002, 0x026c, 0x026c,
...@@ -409,7 +437,8 @@ UNUSUAL_DEV( 0x04ce, 0x0002, 0x026c, 0x026c, ...@@ -409,7 +437,8 @@ UNUSUAL_DEV( 0x04ce, 0x0002, 0x026c, 0x026c,
USB_SC_DEVICE, USB_PR_DEVICE, NULL, USB_SC_DEVICE, USB_PR_DEVICE, NULL,
US_FL_FIX_CAPACITY), 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> * Patch submitted by Sean Millichamp <sean@bruenor.org>
* This is to support the Panasonic PalmCam PV-SD4090 * This is to support the Panasonic PalmCam PV-SD4090
* This entry is needed because the device reports Sub=ff * This entry is needed because the device reports Sub=ff
...@@ -419,8 +448,10 @@ UNUSUAL_DEV( 0x04da, 0x0901, 0x0100, 0x0200, ...@@ -419,8 +448,10 @@ UNUSUAL_DEV( 0x04da, 0x0901, 0x0100, 0x0200,
"LS-120 Camera", "LS-120 Camera",
USB_SC_UFI, USB_PR_DEVICE, NULL, 0), 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, UNUSUAL_DEV( 0x04da, 0x0d05, 0x0000, 0x0000,
"Sharp CE-CW05", "Sharp CE-CW05",
"CD-R/RW Drive", "CD-R/RW Drive",
...@@ -440,7 +471,8 @@ UNUSUAL_DEV( 0x04da, 0x2373, 0x0000, 0x9999, ...@@ -440,7 +471,8 @@ UNUSUAL_DEV( 0x04da, 0x2373, 0x0000, 0x9999,
USB_SC_DEVICE, USB_PR_DEVICE, NULL, USB_SC_DEVICE, USB_PR_DEVICE, NULL,
US_FL_FIX_CAPACITY | US_FL_NOT_LOCKABLE ), 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. * Shuttle/SCM directly.
*/ */
UNUSUAL_DEV( 0x04e6, 0x0001, 0x0200, 0x0200, UNUSUAL_DEV( 0x04e6, 0x0001, 0x0200, 0x0200,
...@@ -536,7 +568,8 @@ UNUSUAL_DEV( 0x04e8, 0x5136, 0x0000, 0x9999, ...@@ -536,7 +568,8 @@ UNUSUAL_DEV( 0x04e8, 0x5136, 0x0000, 0x9999,
USB_SC_DEVICE, USB_PR_DEVICE, NULL, USB_SC_DEVICE, USB_PR_DEVICE, NULL,
US_FL_MAX_SECTORS_64), 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 * Device uses standards-violating 32-byte Bulk Command Block Wrappers and
* reports itself as "Proprietary SCSI Bulk." Cf. device entry 0x084d:0x0011. * reports itself as "Proprietary SCSI Bulk." Cf. device entry 0x084d:0x0011.
*/ */
...@@ -553,7 +586,8 @@ UNUSUAL_DEV( 0x050d, 0x0115, 0x0133, 0x0133, ...@@ -553,7 +586,8 @@ UNUSUAL_DEV( 0x050d, 0x0115, 0x0133, 0x0133,
USB_SC_SCSI, USB_PR_BULK, usb_stor_euscsi_init, USB_SC_SCSI, USB_PR_BULK, usb_stor_euscsi_init,
US_FL_SCM_MULT_TARG ), US_FL_SCM_MULT_TARG ),
/* Iomega Clik! Drive /*
* Iomega Clik! Drive
* Reported by David Chatenay <dchatenay@hotmail.com> * Reported by David Chatenay <dchatenay@hotmail.com>
* The reason this is needed is not fully known. * The reason this is needed is not fully known.
*/ */
...@@ -570,7 +604,8 @@ COMPLIANT_DEV(0x0525, 0xa4a5, 0x0000, 0x9999, ...@@ -570,7 +604,8 @@ COMPLIANT_DEV(0x0525, 0xa4a5, 0x0000, 0x9999,
USB_SC_DEVICE, USB_PR_DEVICE, NULL, USB_SC_DEVICE, USB_PR_DEVICE, NULL,
US_FL_CAPACITY_OK ), US_FL_CAPACITY_OK ),
/* Yakumo Mega Image 37 /*
* Yakumo Mega Image 37
* Submitted by Stephan Fuhrmann <atomenergie@t-online.de> */ * Submitted by Stephan Fuhrmann <atomenergie@t-online.de> */
UNUSUAL_DEV( 0x052b, 0x1801, 0x0100, 0x0100, UNUSUAL_DEV( 0x052b, 0x1801, 0x0100, 0x0100,
"Tekom Technologies, Inc", "Tekom Technologies, Inc",
...@@ -578,8 +613,10 @@ UNUSUAL_DEV( 0x052b, 0x1801, 0x0100, 0x0100, ...@@ -578,8 +613,10 @@ UNUSUAL_DEV( 0x052b, 0x1801, 0x0100, 0x0100,
USB_SC_DEVICE, USB_PR_DEVICE, NULL, USB_SC_DEVICE, USB_PR_DEVICE, NULL,
US_FL_IGNORE_RESIDUE ), 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, UNUSUAL_DEV( 0x052b, 0x1804, 0x0100, 0x0100,
"Tekom Technologies, Inc", "Tekom Technologies, Inc",
"300_CAMERA", "300_CAMERA",
...@@ -593,16 +630,20 @@ UNUSUAL_DEV( 0x052b, 0x1807, 0x0100, 0x0100, ...@@ -593,16 +630,20 @@ UNUSUAL_DEV( 0x052b, 0x1807, 0x0100, 0x0100,
USB_SC_DEVICE, USB_PR_DEVICE, NULL, USB_SC_DEVICE, USB_PR_DEVICE, NULL,
US_FL_IGNORE_RESIDUE ), 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, UNUSUAL_DEV( 0x052b, 0x1905, 0x0100, 0x0100,
"Tekom Technologies, Inc", "Tekom Technologies, Inc",
"400_CAMERA", "400_CAMERA",
USB_SC_DEVICE, USB_PR_DEVICE, NULL, USB_SC_DEVICE, USB_PR_DEVICE, NULL,
US_FL_IGNORE_RESIDUE ), 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, UNUSUAL_DEV( 0x052b, 0x1911, 0x0100, 0x0100,
"Tekom Technologies, Inc", "Tekom Technologies, Inc",
"400_CAMERA", "400_CAMERA",
...@@ -615,8 +656,10 @@ UNUSUAL_DEV( 0x054c, 0x0010, 0x0106, 0x0450, ...@@ -615,8 +656,10 @@ UNUSUAL_DEV( 0x054c, 0x0010, 0x0106, 0x0450,
USB_SC_SCSI, USB_PR_DEVICE, NULL, USB_SC_SCSI, USB_PR_DEVICE, NULL,
US_FL_SINGLE_LUN | US_FL_NOT_LOCKABLE | US_FL_NO_WP_DETECT ), 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, UNUSUAL_DEV( 0x054c, 0x0010, 0x0500, 0x0610,
"Sony", "Sony",
"DSC-T1/T5/H5", "DSC-T1/T5/H5",
...@@ -719,7 +762,8 @@ UNUSUAL_DEV( 0x057b, 0x0000, 0x0000, 0x0299, ...@@ -719,7 +762,8 @@ UNUSUAL_DEV( 0x057b, 0x0000, 0x0000, 0x0299,
USB_SC_DEVICE, USB_PR_CB, NULL, USB_SC_DEVICE, USB_PR_CB, NULL,
US_FL_SINGLE_LUN), 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 * This entry is needed only because the device reports
* bInterfaceClass = 0xff (vendor-specific) * bInterfaceClass = 0xff (vendor-specific)
*/ */
...@@ -741,7 +785,8 @@ UNUSUAL_DEV( 0x0595, 0x4343, 0x0000, 0x2210, ...@@ -741,7 +785,8 @@ UNUSUAL_DEV( 0x0595, 0x4343, 0x0000, 0x2210,
"Digital Camera EX-20 DSC", "Digital Camera EX-20 DSC",
USB_SC_8070, USB_PR_DEVICE, NULL, 0 ), 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 * 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 * 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 * Clear-Halt on the bulk endpoints. The SINGLE_LUN flag will prevent
...@@ -773,7 +818,8 @@ UNUSUAL_DEV( 0x059f, 0x0651, 0x0000, 0x0000, ...@@ -773,7 +818,8 @@ UNUSUAL_DEV( 0x059f, 0x0651, 0x0000, 0x0000,
USB_SC_DEVICE, USB_PR_DEVICE, NULL, USB_SC_DEVICE, USB_PR_DEVICE, NULL,
US_FL_NO_WP_DETECT ), 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 * Some versions of this device need the SubClass and Protocol overrides
* while others don't. * while others don't.
*/ */
...@@ -783,7 +829,8 @@ UNUSUAL_DEV( 0x05ab, 0x0060, 0x1104, 0x1110, ...@@ -783,7 +829,8 @@ UNUSUAL_DEV( 0x05ab, 0x0060, 0x1104, 0x1110,
USB_SC_SCSI, USB_PR_BULK, NULL, USB_SC_SCSI, USB_PR_BULK, NULL,
US_FL_NEED_OVERRIDE ), 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 * 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 * 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 * to change with firmware updates, I changed the range to maximum for all
...@@ -824,7 +871,8 @@ UNUSUAL_DEV( 0x05ac, 0x120a, 0x0000, 0x9999, ...@@ -824,7 +871,8 @@ UNUSUAL_DEV( 0x05ac, 0x120a, 0x0000, 0x9999,
USB_SC_DEVICE, USB_PR_DEVICE, NULL, USB_SC_DEVICE, USB_PR_DEVICE, NULL,
US_FL_FIX_CAPACITY ), US_FL_FIX_CAPACITY ),
/* Reported by Dan Williams <dcbw@redhat.com> /*
* Reported by Dan Williams <dcbw@redhat.com>
* Option N.V. mobile broadband modems * Option N.V. mobile broadband modems
* Ignore driver CD mode and force into modem mode by default. * Ignore driver CD mode and force into modem mode by default.
*/ */
...@@ -843,7 +891,8 @@ UNUSUAL_DEV( 0x05dc, 0xb002, 0x0000, 0x0113, ...@@ -843,7 +891,8 @@ UNUSUAL_DEV( 0x05dc, 0xb002, 0x0000, 0x0113,
USB_SC_DEVICE, USB_PR_DEVICE, NULL, USB_SC_DEVICE, USB_PR_DEVICE, NULL,
US_FL_FIX_INQUIRY ), 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 * converter chip, but it changes its ProductId depending
* on whether or not a disk or an optical device is enclosed * on whether or not a disk or an optical device is enclosed
* They were originally reported by Alexander Oltu * They were originally reported by Alexander Oltu
...@@ -873,8 +922,10 @@ UNUSUAL_DEV( 0x05e3, 0x0723, 0x9451, 0x9451, ...@@ -873,8 +922,10 @@ UNUSUAL_DEV( 0x05e3, 0x0723, 0x9451, 0x9451,
USB_SC_DEVICE, USB_PR_DEVICE, NULL, USB_SC_DEVICE, USB_PR_DEVICE, NULL,
US_FL_SANE_SENSE ), 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, UNUSUAL_DEV( 0x0636, 0x0003, 0x0000, 0x9999,
"Vivitar", "Vivitar",
"Vivicam 35Xx", "Vivicam 35Xx",
...@@ -908,8 +959,10 @@ UNUSUAL_DEV( 0x067b, 0x2317, 0x0001, 0x001, ...@@ -908,8 +959,10 @@ UNUSUAL_DEV( 0x067b, 0x2317, 0x0001, 0x001,
US_FL_NOT_LOCKABLE ), US_FL_NOT_LOCKABLE ),
/* Reported by Richard -=[]=- <micro_flyer@hotmail.com> */ /* 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, UNUSUAL_DEV( 0x067b, 0x2507, 0x0001, 0x0100,
"Prolific Technology Inc.", "Prolific Technology Inc.",
"Mass Storage Device", "Mass Storage Device",
...@@ -961,7 +1014,8 @@ UNUSUAL_DEV( 0x071b, 0x3203, 0x0000, 0x0000, ...@@ -961,7 +1014,8 @@ UNUSUAL_DEV( 0x071b, 0x3203, 0x0000, 0x0000,
US_FL_NO_WP_DETECT | US_FL_MAX_SECTORS_64 | US_FL_NO_WP_DETECT | US_FL_MAX_SECTORS_64 |
US_FL_NO_READ_CAPACITY_16), 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 : * Support the following product :
* "Dane-Elec MediaTouch" * "Dane-Elec MediaTouch"
*/ */
...@@ -971,7 +1025,8 @@ UNUSUAL_DEV( 0x071b, 0x32bb, 0x0000, 0x0000, ...@@ -971,7 +1025,8 @@ UNUSUAL_DEV( 0x071b, 0x32bb, 0x0000, 0x0000,
USB_SC_DEVICE, USB_PR_DEVICE, NULL, USB_SC_DEVICE, USB_PR_DEVICE, NULL,
US_FL_NO_WP_DETECT | US_FL_MAX_SECTORS_64), 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 * 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 * sectors (64kB) are read/written in a single command, and may be present
* at least in the following products: * at least in the following products:
...@@ -1040,7 +1095,8 @@ UNUSUAL_DEV( 0x07af, 0x0006, 0x0100, 0x0100, ...@@ -1040,7 +1095,8 @@ UNUSUAL_DEV( 0x07af, 0x0006, 0x0100, 0x0100,
US_FL_SINGLE_LUN ), US_FL_SINGLE_LUN ),
#endif #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, * 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. * based on the Datafab DF-UG-07 chip). Needed for US_FL_FIX_INQUIRY.
* Submitted by Marek Michalkiewicz <marekm@amelek.gda.pl>. * Submitted by Marek Michalkiewicz <marekm@amelek.gda.pl>.
...@@ -1052,7 +1108,8 @@ UNUSUAL_DEV( 0x07c4, 0xa400, 0x0000, 0xffff, ...@@ -1052,7 +1108,8 @@ UNUSUAL_DEV( 0x07c4, 0xa400, 0x0000, 0xffff,
USB_SC_DEVICE, USB_PR_DEVICE, NULL, USB_SC_DEVICE, USB_PR_DEVICE, NULL,
US_FL_FIX_INQUIRY | US_FL_FIX_CAPACITY ), 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) * and augmented by binbin <binbinsh@gmail.com> (Bugzilla #12882)
*/ */
UNUSUAL_DEV( 0x07c4, 0xa4a5, 0x0000, 0xffff, UNUSUAL_DEV( 0x07c4, 0xa4a5, 0x0000, 0xffff,
...@@ -1061,7 +1118,8 @@ UNUSUAL_DEV( 0x07c4, 0xa4a5, 0x0000, 0xffff, ...@@ -1061,7 +1118,8 @@ UNUSUAL_DEV( 0x07c4, 0xa4a5, 0x0000, 0xffff,
USB_SC_DEVICE, USB_PR_DEVICE, NULL, USB_SC_DEVICE, USB_PR_DEVICE, NULL,
US_FL_IGNORE_RESIDUE | US_FL_MAX_SECTORS_64 ), 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: * to the USB storage specification in two ways:
* - They tell us they are using transport protocol CBI. In reality they * - They tell us they are using transport protocol CBI. In reality they
* are using transport protocol CB. * are using transport protocol CB.
...@@ -1119,7 +1177,8 @@ UNUSUAL_DEV( 0x084b, 0xa001, 0x0000, 0x9999, ...@@ -1119,7 +1177,8 @@ UNUSUAL_DEV( 0x084b, 0xa001, 0x0000, 0x9999,
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_euscsi_init, USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_euscsi_init,
US_FL_SCM_MULT_TARG ), 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 * Flag will support Bulk devices which use a standards-violating 32-byte
* Command Block Wrapper. Here, the "DC2MEGA" cameras (several brands) with * Command Block Wrapper. Here, the "DC2MEGA" cameras (several brands) with
* Grandtech GT892x chip, which request "Proprietary SCSI Bulk" support. * Grandtech GT892x chip, which request "Proprietary SCSI Bulk" support.
...@@ -1131,7 +1190,8 @@ UNUSUAL_DEV( 0x084d, 0x0011, 0x0110, 0x0110, ...@@ -1131,7 +1190,8 @@ UNUSUAL_DEV( 0x084d, 0x0011, 0x0110, 0x0110,
USB_SC_DEVICE, USB_PR_DEVICE, NULL, USB_SC_DEVICE, USB_PR_DEVICE, NULL,
US_FL_BULK32), US_FL_BULK32),
/* Reported by <ttkspam@free.fr> /*
* Reported by <ttkspam@free.fr>
* The device reports a vendor-specific device class, requiring an * The device reports a vendor-specific device class, requiring an
* explicit vendor/product match. * explicit vendor/product match.
*/ */
...@@ -1140,11 +1200,12 @@ UNUSUAL_DEV( 0x0851, 0x1542, 0x0002, 0x0002, ...@@ -1140,11 +1200,12 @@ UNUSUAL_DEV( 0x0851, 0x1542, 0x0002, 0x0002,
"FW_Omega2", "FW_Omega2",
USB_SC_DEVICE, USB_PR_DEVICE, NULL, 0), 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 * PanDigital Digital Picture Frame. Does not like ALLOW_MEDIUM_REMOVAL
* on LUN 4. * on LUN 4.
* Note: Vend:Prod clash with "Ltd Maxell WS30 Slim Digital Camera" * Note: Vend:Prod clash with "Ltd Maxell WS30 Slim Digital Camera"
*/ */
UNUSUAL_DEV( 0x0851, 0x1543, 0x0200, 0x0200, UNUSUAL_DEV( 0x0851, 0x1543, 0x0200, 0x0200,
"PanDigital", "PanDigital",
"Photo Frame", "Photo Frame",
...@@ -1170,7 +1231,8 @@ UNUSUAL_DEV( 0x08bd, 0x1100, 0x0000, 0x0000, ...@@ -1170,7 +1231,8 @@ UNUSUAL_DEV( 0x08bd, 0x1100, 0x0000, 0x0000,
USB_SC_DEVICE, USB_PR_DEVICE, NULL, USB_SC_DEVICE, USB_PR_DEVICE, NULL,
US_FL_SINGLE_LUN), US_FL_SINGLE_LUN),
/* Submitted by Dylan Taft <d13f00l@gmail.com> /*
* Submitted by Dylan Taft <d13f00l@gmail.com>
* US_FL_IGNORE_RESIDUE Needed * US_FL_IGNORE_RESIDUE Needed
*/ */
UNUSUAL_DEV( 0x08ca, 0x3103, 0x0100, 0x0100, UNUSUAL_DEV( 0x08ca, 0x3103, 0x0100, 0x0100,
...@@ -1179,7 +1241,8 @@ UNUSUAL_DEV( 0x08ca, 0x3103, 0x0100, 0x0100, ...@@ -1179,7 +1241,8 @@ UNUSUAL_DEV( 0x08ca, 0x3103, 0x0100, 0x0100,
USB_SC_DEVICE, USB_PR_DEVICE, NULL, USB_SC_DEVICE, USB_PR_DEVICE, NULL,
US_FL_IGNORE_RESIDUE), 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. * bulk-only transport, but _some_ falsely report Control/Bulk instead.
* One example is "Trumpion Digital Research MYMP3". * One example is "Trumpion Digital Research MYMP3".
* Submitted by Bjoern Brill <brill(at)fs.math.uni-frankfurt.de> * Submitted by Bjoern Brill <brill(at)fs.math.uni-frankfurt.de>
...@@ -1190,7 +1253,8 @@ UNUSUAL_DEV( 0x090a, 0x1001, 0x0100, 0x0100, ...@@ -1190,7 +1253,8 @@ UNUSUAL_DEV( 0x090a, 0x1001, 0x0100, 0x0100,
USB_SC_DEVICE, USB_PR_BULK, NULL, USB_SC_DEVICE, USB_PR_BULK, NULL,
US_FL_NEED_OVERRIDE ), 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. * The device reports a subclass of RBC, which is wrong.
*/ */
UNUSUAL_DEV( 0x090a, 0x1050, 0x0100, 0x0100, UNUSUAL_DEV( 0x090a, 0x1050, 0x0100, 0x0100,
...@@ -1213,7 +1277,8 @@ UNUSUAL_DEV( 0x090c, 0x1132, 0x0000, 0xffff, ...@@ -1213,7 +1277,8 @@ UNUSUAL_DEV( 0x090c, 0x1132, 0x0000, 0xffff,
USB_SC_DEVICE, USB_PR_DEVICE, NULL, USB_SC_DEVICE, USB_PR_DEVICE, NULL,
US_FL_FIX_CAPACITY ), 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 * This card reader returns "Illegal Request, Logical Block Address
* Out of Range" for the first READ(10) after a new card is inserted. * Out of Range" for the first READ(10) after a new card is inserted.
*/ */
...@@ -1223,7 +1288,8 @@ UNUSUAL_DEV( 0x090c, 0x6000, 0x0100, 0x0100, ...@@ -1223,7 +1288,8 @@ UNUSUAL_DEV( 0x090c, 0x6000, 0x0100, 0x0100,
USB_SC_DEVICE, USB_PR_DEVICE, NULL, USB_SC_DEVICE, USB_PR_DEVICE, NULL,
US_FL_INITIAL_READ10 ), US_FL_INITIAL_READ10 ),
/* This Pentax still camera is not conformant /*
* This Pentax still camera is not conformant
* to the USB storage specification: - * to the USB storage specification: -
* - It does not like the INQUIRY command. So we must handle this command * - It does not like the INQUIRY command. So we must handle this command
* of the SCSI layer ourselves. * of the SCSI layer ourselves.
...@@ -1236,8 +1302,10 @@ UNUSUAL_DEV( 0x0a17, 0x0004, 0x1000, 0x1000, ...@@ -1236,8 +1302,10 @@ UNUSUAL_DEV( 0x0a17, 0x0004, 0x1000, 0x1000,
USB_SC_DEVICE, USB_PR_DEVICE, NULL, USB_SC_DEVICE, USB_PR_DEVICE, NULL,
US_FL_FIX_INQUIRY ), 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, UNUSUAL_DEV( 0x0ace, 0x2011, 0x0101, 0x0101,
"ZyXEL", "ZyXEL",
"G-220F USB-WLAN Install", "G-220F USB-WLAN Install",
...@@ -1250,7 +1318,8 @@ UNUSUAL_DEV( 0x0ace, 0x20ff, 0x0101, 0x0101, ...@@ -1250,7 +1318,8 @@ UNUSUAL_DEV( 0x0ace, 0x20ff, 0x0101, 0x0101,
USB_SC_DEVICE, USB_PR_DEVICE, NULL, USB_SC_DEVICE, USB_PR_DEVICE, NULL,
US_FL_IGNORE_DEVICE ), US_FL_IGNORE_DEVICE ),
/* Reported by Dan Williams <dcbw@redhat.com> /*
* Reported by Dan Williams <dcbw@redhat.com>
* Option N.V. mobile broadband modems * Option N.V. mobile broadband modems
* Ignore driver CD mode and force into modem mode by default. * Ignore driver CD mode and force into modem mode by default.
*/ */
...@@ -1262,20 +1331,24 @@ UNUSUAL_DEV( 0x0af0, 0x6971, 0x0000, 0x9999, ...@@ -1262,20 +1331,24 @@ UNUSUAL_DEV( 0x0af0, 0x6971, 0x0000, 0x9999,
USB_SC_DEVICE, USB_PR_DEVICE, option_ms_init, USB_SC_DEVICE, USB_PR_DEVICE, option_ms_init,
0), 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. * This device (wrongly) has a vendor-specific device descriptor.
* The entry is needed so usb-storage can bind to it's mass-storage * 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, UNUSUAL_DEV( 0x0af0, 0x7401, 0x0000, 0x0000,
"Option", "Option",
"GI 0401 SD-Card", "GI 0401 SD-Card",
USB_SC_DEVICE, USB_PR_DEVICE, NULL, USB_SC_DEVICE, USB_PR_DEVICE, NULL,
0 ), 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 devices (wrongly) have a vendor-specific device descriptor.
* These entries are needed so usb-storage can bind to their mass-storage * 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, UNUSUAL_DEV( 0x0af0, 0x7501, 0x0000, 0x0000,
"Option", "Option",
"GI 0431 SD-Card", "GI 0431 SD-Card",
...@@ -1419,7 +1492,8 @@ UNUSUAL_DEV( 0x0dc4, 0x0073, 0x0000, 0x0000, ...@@ -1419,7 +1492,8 @@ UNUSUAL_DEV( 0x0dc4, 0x0073, 0x0000, 0x0000,
USB_SC_DEVICE, USB_PR_DEVICE, NULL, USB_SC_DEVICE, USB_PR_DEVICE, NULL,
US_FL_FIX_CAPACITY), 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 * 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 * works for me. Can anybody correct these values? (I able to test corrected
* version.) * version.)
...@@ -1430,8 +1504,10 @@ UNUSUAL_DEV( 0x0dd8, 0x1060, 0x0000, 0xffff, ...@@ -1430,8 +1504,10 @@ UNUSUAL_DEV( 0x0dd8, 0x1060, 0x0000, 0xffff,
USB_SC_DEVICE, USB_PR_DEVICE, NULL, USB_SC_DEVICE, USB_PR_DEVICE, NULL,
US_FL_FIX_INQUIRY ), 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, UNUSUAL_DEV( 0x0dd8, 0xd202, 0x0000, 0x9999,
"Netac", "Netac",
"USB Flash Disk", "USB Flash Disk",
...@@ -1439,8 +1515,10 @@ UNUSUAL_DEV( 0x0dd8, 0xd202, 0x0000, 0x9999, ...@@ -1439,8 +1515,10 @@ UNUSUAL_DEV( 0x0dd8, 0xd202, 0x0000, 0x9999,
US_FL_IGNORE_RESIDUE ), 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, UNUSUAL_DEV( 0x0dda, 0x0001, 0x0012, 0x0012,
"WINWARD", "WINWARD",
"Music Disk", "Music Disk",
...@@ -1468,8 +1546,10 @@ UNUSUAL_DEV( 0x0ed1, 0x6660, 0x0100, 0x0300, ...@@ -1468,8 +1546,10 @@ UNUSUAL_DEV( 0x0ed1, 0x6660, 0x0100, 0x0300,
USB_SC_DEVICE, USB_PR_DEVICE, NULL, USB_SC_DEVICE, USB_PR_DEVICE, NULL,
US_FL_FIX_INQUIRY ), 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, UNUSUAL_DEV( 0x0ea0, 0x2168, 0x0110, 0x0110,
"Ours Technology", "Ours Technology",
"Flash Disk", "Flash Disk",
...@@ -1483,15 +1563,18 @@ UNUSUAL_DEV( 0x0ea0, 0x6828, 0x0110, 0x0110, ...@@ -1483,15 +1563,18 @@ UNUSUAL_DEV( 0x0ea0, 0x6828, 0x0110, 0x0110,
USB_SC_DEVICE, USB_PR_DEVICE, NULL, USB_SC_DEVICE, USB_PR_DEVICE, NULL,
US_FL_IGNORE_RESIDUE ), 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, UNUSUAL_DEV( 0x0ed1, 0x7636, 0x0103, 0x0103,
"Typhoon", "Typhoon",
"My DJ 1820", "My DJ 1820",
USB_SC_DEVICE, USB_PR_DEVICE, NULL, USB_SC_DEVICE, USB_PR_DEVICE, NULL,
US_FL_IGNORE_RESIDUE | US_FL_GO_SLOW | US_FL_MAX_SECTORS_64), 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> * Reported by Robert Spitzenpfeil <robert@spitzenpfeil.org>
* http://www.qbik.ch/usb/devices/showdev.php?id=1705 * http://www.qbik.ch/usb/devices/showdev.php?id=1705
* Updated to 103 device by MJ Ray mjr at phonecoop.coop * Updated to 103 device by MJ Ray mjr at phonecoop.coop
...@@ -1502,7 +1585,8 @@ UNUSUAL_DEV( 0x0f19, 0x0103, 0x0100, 0x0100, ...@@ -1502,7 +1585,8 @@ UNUSUAL_DEV( 0x0f19, 0x0103, 0x0100, 0x0100,
USB_SC_DEVICE, USB_PR_DEVICE, NULL, USB_SC_DEVICE, USB_PR_DEVICE, NULL,
US_FL_IGNORE_RESIDUE ), 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 * for MP3-Player AVOX WSX-300ER (bought in Japan). Reports lots of SCSI
* errors when trying to write. * errors when trying to write.
*/ */
...@@ -1540,8 +1624,10 @@ UNUSUAL_DEV( 0x0fce, 0xd0e1, 0x0000, 0x0000, ...@@ -1540,8 +1624,10 @@ UNUSUAL_DEV( 0x0fce, 0xd0e1, 0x0000, 0x0000,
USB_SC_DEVICE, USB_PR_DEVICE, NULL, USB_SC_DEVICE, USB_PR_DEVICE, NULL,
US_FL_IGNORE_DEVICE), 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, UNUSUAL_DEV( 0x0fce, 0xe030, 0x0000, 0x0000,
"Sony Ericsson", "Sony Ericsson",
"P990i", "P990i",
...@@ -1562,7 +1648,8 @@ UNUSUAL_DEV( 0x0fce, 0xe092, 0x0000, 0x0000, ...@@ -1562,7 +1648,8 @@ UNUSUAL_DEV( 0x0fce, 0xe092, 0x0000, 0x0000,
USB_SC_DEVICE, USB_PR_DEVICE, NULL, USB_SC_DEVICE, USB_PR_DEVICE, NULL,
US_FL_IGNORE_RESIDUE ), 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. * Tested on hardware version 1.10.
* Entry is needed only for the initializer function override. * Entry is needed only for the initializer function override.
* Devices with bcd > 110 seem to not need it while those * Devices with bcd > 110 seem to not need it while those
...@@ -1586,7 +1673,8 @@ UNUSUAL_DEV(0x1058, 0x070a, 0x0000, 0x9999, ...@@ -1586,7 +1673,8 @@ UNUSUAL_DEV(0x1058, 0x070a, 0x0000, 0x9999,
"My Passport HDD", "My Passport HDD",
USB_SC_DEVICE, USB_PR_DEVICE, NULL, US_FL_WRITE_CACHE), 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. * The device reports a vendor-specific bDeviceClass.
*/ */
UNUSUAL_DEV( 0x10d6, 0x2200, 0x0100, 0x0100, UNUSUAL_DEV( 0x10d6, 0x2200, 0x0100, 0x0100,
...@@ -1595,7 +1683,8 @@ UNUSUAL_DEV( 0x10d6, 0x2200, 0x0100, 0x0100, ...@@ -1595,7 +1683,8 @@ UNUSUAL_DEV( 0x10d6, 0x2200, 0x0100, 0x0100,
USB_SC_DEVICE, USB_PR_DEVICE, NULL, USB_SC_DEVICE, USB_PR_DEVICE, NULL,
0), 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. * Ignore driver CD mode and force into modem mode by default.
*/ */
UNUSUAL_DEV( 0x1186, 0x3e04, 0x0000, 0x0000, UNUSUAL_DEV( 0x1186, 0x3e04, 0x0000, 0x0000,
...@@ -1603,7 +1692,8 @@ UNUSUAL_DEV( 0x1186, 0x3e04, 0x0000, 0x0000, ...@@ -1603,7 +1692,8 @@ UNUSUAL_DEV( 0x1186, 0x3e04, 0x0000, 0x0000,
"USB Mass Storage", "USB Mass Storage",
USB_SC_DEVICE, USB_PR_DEVICE, option_ms_init, US_FL_IGNORE_DEVICE), 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, * Entry is needed for the initializer function override,
* which instructs the device to load as a modem * which instructs the device to load as a modem
* device. * device.
...@@ -1614,7 +1704,8 @@ UNUSUAL_DEV( 0x1199, 0x0fff, 0x0000, 0x9999, ...@@ -1614,7 +1704,8 @@ UNUSUAL_DEV( 0x1199, 0x0fff, 0x0000, 0x9999,
USB_SC_DEVICE, USB_PR_DEVICE, sierra_ms_init, USB_SC_DEVICE, USB_PR_DEVICE, sierra_ms_init,
0), 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 * The usb-storage module found on the Digitech GNX4 (and supposedly other
* devices) misbehaves and causes a bunch of invalid I/O errors. * devices) misbehaves and causes a bunch of invalid I/O errors.
*/ */
...@@ -1624,7 +1715,8 @@ UNUSUAL_DEV( 0x1210, 0x0003, 0x0100, 0x0100, ...@@ -1624,7 +1715,8 @@ UNUSUAL_DEV( 0x1210, 0x0003, 0x0100, 0x0100,
USB_SC_DEVICE, USB_PR_DEVICE, NULL, USB_SC_DEVICE, USB_PR_DEVICE, NULL,
US_FL_IGNORE_RESIDUE ), 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 * This brings the HUAWEI data card devices into multi-port mode
*/ */
UNUSUAL_DEV( 0x12d1, 0x1001, 0x0000, 0x0000, UNUSUAL_DEV( 0x12d1, 0x1001, 0x0000, 0x0000,
...@@ -1993,7 +2085,8 @@ UNUSUAL_DEV( 0x152d, 0x0567, 0x0114, 0x0116, ...@@ -1993,7 +2085,8 @@ UNUSUAL_DEV( 0x152d, 0x0567, 0x0114, 0x0116,
USB_SC_DEVICE, USB_PR_DEVICE, NULL, USB_SC_DEVICE, USB_PR_DEVICE, NULL,
US_FL_BROKEN_FUA ), 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 * JMicron responds to USN and several other SCSI ioctls with a
* residue that causes subsequent I/O requests to fail. */ * residue that causes subsequent I/O requests to fail. */
UNUSUAL_DEV( 0x152d, 0x2329, 0x0100, 0x0100, UNUSUAL_DEV( 0x152d, 0x2329, 0x0100, 0x0100,
...@@ -2009,7 +2102,8 @@ UNUSUAL_DEV( 0x152d, 0x2566, 0x0114, 0x0114, ...@@ -2009,7 +2102,8 @@ UNUSUAL_DEV( 0x152d, 0x2566, 0x0114, 0x0114,
USB_SC_DEVICE, USB_PR_DEVICE, NULL, USB_SC_DEVICE, USB_PR_DEVICE, NULL,
US_FL_BROKEN_FUA ), 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 */ * and Mac USB Dock USB-SCSI */
UNUSUAL_DEV( 0x1645, 0x0007, 0x0100, 0x0133, UNUSUAL_DEV( 0x1645, 0x0007, 0x0100, 0x0133,
"Entrega Technologies", "Entrega Technologies",
...@@ -2017,8 +2111,10 @@ UNUSUAL_DEV( 0x1645, 0x0007, 0x0100, 0x0133, ...@@ -2017,8 +2111,10 @@ UNUSUAL_DEV( 0x1645, 0x0007, 0x0100, 0x0133,
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_euscsi_init, USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_euscsi_init,
US_FL_SCM_MULT_TARG ), 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, UNUSUAL_DEV( 0x1652, 0x6600, 0x0201, 0x0201,
"Teac", "Teac",
"HD-35PUK-B", "HD-35PUK-B",
...@@ -2045,10 +2141,12 @@ UNUSUAL_DEV( 0x1822, 0x0001, 0x0000, 0x9999, ...@@ -2045,10 +2141,12 @@ UNUSUAL_DEV( 0x1822, 0x0001, 0x0000, 0x9999,
USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_euscsi_init, USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_euscsi_init,
US_FL_SCM_MULT_TARG ), 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 * These Appotech controllers are found in Picture Frames, they provide a
* (buggy) emulation of a cdrom drive which contains the windows software * (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, UNUSUAL_DEV( 0x1908, 0x1315, 0x0000, 0x0000,
"BUILDWIN", "BUILDWIN",
"Photo Frame", "Photo Frame",
...@@ -2065,19 +2163,22 @@ UNUSUAL_DEV( 0x1908, 0x3335, 0x0200, 0x0200, ...@@ -2065,19 +2163,22 @@ UNUSUAL_DEV( 0x1908, 0x3335, 0x0200, 0x0200,
USB_SC_DEVICE, USB_PR_DEVICE, NULL, USB_SC_DEVICE, USB_PR_DEVICE, NULL,
US_FL_NO_READ_DISC_INFO ), 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 * This device morphes spontaneously into another device if the access
* pattern of Windows isn't followed. Thus writable media would be dirty * 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 * if the initial instance is used. So the device is limited to its
* virtual CD. * 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, UNUSUAL_DEV( 0x19d2, 0x1225, 0x0000, 0xffff,
"ZTE,Incorporated", "ZTE,Incorporated",
"ZTE WCDMA Technologies MSM", "ZTE WCDMA Technologies MSM",
USB_SC_DEVICE, USB_PR_DEVICE, NULL, USB_SC_DEVICE, USB_PR_DEVICE, NULL,
US_FL_SINGLE_LUN ), 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). * This encrypted pen drive returns bogus data for the initial READ(10).
*/ */
UNUSUAL_DEV( 0x1b1c, 0x1ab5, 0x0200, 0x0200, UNUSUAL_DEV( 0x1b1c, 0x1ab5, 0x0200, 0x0200,
...@@ -2086,7 +2187,8 @@ UNUSUAL_DEV( 0x1b1c, 0x1ab5, 0x0200, 0x0200, ...@@ -2086,7 +2187,8 @@ UNUSUAL_DEV( 0x1b1c, 0x1ab5, 0x0200, 0x0200,
USB_SC_DEVICE, USB_PR_DEVICE, NULL, USB_SC_DEVICE, USB_PR_DEVICE, NULL,
US_FL_INITIAL_READ10 ), 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 * 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 * The usb-storage interface is a virtual windows driver CD, which the gm12u320
* driver automatically converts into framebuffer & kms dri device nodes. * driver automatically converts into framebuffer & kms dri device nodes.
...@@ -2097,9 +2199,11 @@ UNUSUAL_DEV( 0x1de1, 0xc102, 0x0000, 0xffff, ...@@ -2097,9 +2199,11 @@ UNUSUAL_DEV( 0x1de1, 0xc102, 0x0000, 0xffff,
USB_SC_DEVICE, USB_PR_DEVICE, NULL, USB_SC_DEVICE, USB_PR_DEVICE, NULL,
US_FL_IGNORE_DEVICE ), 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 * 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, UNUSUAL_DEV( 0x1e68, 0x001b, 0x0000, 0x0000,
"TrekStor GmbH & Co. KG", "TrekStor GmbH & Co. KG",
"DataStation maxi g.u", "DataStation maxi g.u",
...@@ -2126,7 +2230,8 @@ UNUSUAL_DEV( 0x2116, 0x0320, 0x0001, 0x0001, ...@@ -2126,7 +2230,8 @@ UNUSUAL_DEV( 0x2116, 0x0320, 0x0001, 0x0001,
USB_SC_DEVICE, USB_PR_DEVICE, NULL, USB_SC_DEVICE, USB_PR_DEVICE, NULL,
US_FL_FIX_CAPACITY), 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> * and Renato Perini <rperini@email.it>
*/ */
UNUSUAL_DEV( 0x22b8, 0x3010, 0x0001, 0x0001, UNUSUAL_DEV( 0x22b8, 0x3010, 0x0001, 0x0001,
...@@ -2153,7 +2258,8 @@ UNUSUAL_DEV( 0x2735, 0x100b, 0x0000, 0x9999, ...@@ -2153,7 +2258,8 @@ UNUSUAL_DEV( 0x2735, 0x100b, 0x0000, 0x9999,
USB_SC_DEVICE, USB_PR_DEVICE, NULL, USB_SC_DEVICE, USB_PR_DEVICE, NULL,
US_FL_GO_SLOW ), US_FL_GO_SLOW ),
/* Reported by Frederic Marchal <frederic.marchal@wowcompany.com> /*
* Reported by Frederic Marchal <frederic.marchal@wowcompany.com>
* Mio Moov 330 * Mio Moov 330
*/ */
UNUSUAL_DEV( 0x3340, 0xffff, 0x0000, 0x0000, UNUSUAL_DEV( 0x3340, 0xffff, 0x0000, 0x0000,
......
/* 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 * 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 * under the terms of the GNU General Public License as published by the
......
/* 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 * 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 * under the terms of the GNU General Public License as published by the
......
/* 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 * 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 * under the terms of the GNU General Public License as published by the
......
/* 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 * 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 * under the terms of the GNU General Public License as published by the
......
/* 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 * 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 * under the terms of the GNU General Public License as published by the
...@@ -18,7 +19,8 @@ ...@@ -18,7 +19,8 @@
#if defined(CONFIG_USB_STORAGE_ONETOUCH) || \ #if defined(CONFIG_USB_STORAGE_ONETOUCH) || \
defined(CONFIG_USB_STORAGE_ONETOUCH_MODULE) 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 * Needed for OneTouch extension to usb-storage
*/ */
UNUSUAL_DEV( 0x0d49, 0x7000, 0x0000, 0x9999, UNUSUAL_DEV( 0x0d49, 0x7000, 0x0000, 0x9999,
......
/* Driver for Realtek RTS51xx USB card reader /*
* Driver for Realtek RTS51xx USB card reader
* *
* Copyright(c) 2009 Realtek Semiconductor Corp. All rights reserved. * Copyright(c) 2009 Realtek Semiconductor Corp. All rights reserved.
* *
......
/* 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 * 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 * under the terms of the GNU General Public License as published by the
......
/* 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 * 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 * under the terms of the GNU General Public License as published by the
......
/* 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> * (c) 2013 Hans de Goede <hdegoede@redhat.com>
* *
......
/* 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 * 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 * under the terms of the GNU General Public License as published by the
......
/* Driver for USB Mass Storage compliant devices /*
* Driver for USB Mass Storage compliant devices
* *
* Current development and maintenance by: * Current development and maintenance by:
* (c) 1999-2003 Matthew Dharm (mdharm-usb@one-eyed-alien.net) * (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"); ...@@ -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. * 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 * 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 * has the US_FL_FIX_INQUIRY flag, then the vendor and product names
* normally generated by a device through the INQUIRY response will be * 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) ...@@ -191,8 +193,10 @@ int usb_stor_suspend(struct usb_interface *iface, pm_message_t message)
if (us->suspend_resume_hook) if (us->suspend_resume_hook)
(us->suspend_resume_hook)(us, US_SUSPEND); (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); mutex_unlock(&us->dev_mutex);
return 0; return 0;
...@@ -220,8 +224,10 @@ int usb_stor_reset_resume(struct usb_interface *iface) ...@@ -220,8 +224,10 @@ int usb_stor_reset_resume(struct usb_interface *iface)
/* Report the reset to the SCSI core */ /* Report the reset to the SCSI core */
usb_stor_report_bus_reset(us); 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; return 0;
} }
EXPORT_SYMBOL_GPL(usb_stor_reset_resume); EXPORT_SYMBOL_GPL(usb_stor_reset_resume);
...@@ -250,8 +256,10 @@ int usb_stor_post_reset(struct usb_interface *iface) ...@@ -250,8 +256,10 @@ int usb_stor_post_reset(struct usb_interface *iface)
/* Report the reset to the SCSI core */ /* Report the reset to the SCSI core */
usb_stor_report_bus_reset(us); 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); mutex_unlock(&us->dev_mutex);
return 0; return 0;
...@@ -274,15 +282,17 @@ void fill_inquiry_response(struct us_data *us, unsigned char *data, ...@@ -274,15 +282,17 @@ void fill_inquiry_response(struct us_data *us, unsigned char *data,
return; return;
memset(data+8, ' ', 28); memset(data+8, ' ', 28);
if (data[0]&0x20) { /* USB device currently not connected. Return if (data[0]&0x20) { /*
peripheral qualifier 001b ("...however, the * USB device currently not connected. Return
physical device is not currently connected * peripheral qualifier 001b ("...however, the
to this logical unit") and leave vendor and * physical device is not currently connected
product identification empty. ("If the target * to this logical unit") and leave vendor and
does store some of the INQUIRY data on the * product identification empty. ("If the target
device, it may return zeros or ASCII spaces * does store some of the INQUIRY data on the
(20h) in those fields until the data is * device, it may return zeros or ASCII spaces
available from the device."). */ * (20h) in those fields until the data is
* available from the device.").
*/
} else { } else {
u16 bcdDevice = le16_to_cpu(us->pusb_dev->descriptor.bcdDevice); u16 bcdDevice = le16_to_cpu(us->pusb_dev->descriptor.bcdDevice);
int n; int n;
...@@ -336,7 +346,8 @@ static int usb_stor_control_thread(void * __us) ...@@ -336,7 +346,8 @@ static int usb_stor_control_thread(void * __us)
scsi_unlock(host); scsi_unlock(host);
/* reject the command if the direction indicator /*
* reject the command if the direction indicator
* is UNKNOWN * is UNKNOWN
*/ */
if (us->srb->sc_data_direction == DMA_BIDIRECTIONAL) { if (us->srb->sc_data_direction == DMA_BIDIRECTIONAL) {
...@@ -344,7 +355,8 @@ static int usb_stor_control_thread(void * __us) ...@@ -344,7 +355,8 @@ static int usb_stor_control_thread(void * __us)
us->srb->result = DID_ERROR << 16; 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 * the maximum known LUN
*/ */
else if (us->srb->device->id && else if (us->srb->device->id &&
...@@ -362,8 +374,10 @@ static int usb_stor_control_thread(void * __us) ...@@ -362,8 +374,10 @@ static int usb_stor_control_thread(void * __us)
us->srb->result = DID_BAD_TARGET << 16; 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) && else if ((us->srb->cmnd[0] == INQUIRY) &&
(us->fflags & US_FL_FIX_INQUIRY)) { (us->fflags & US_FL_FIX_INQUIRY)) {
unsigned char data_ptr[36] = { unsigned char data_ptr[36] = {
...@@ -395,11 +409,13 @@ static int usb_stor_control_thread(void * __us) ...@@ -395,11 +409,13 @@ static int usb_stor_control_thread(void * __us)
usb_stor_dbg(us, "scsi command aborted\n"); 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 abort has finished. The proper test for this is
* the TIMED_OUT flag, not srb->result == DID_ABORT, because * the TIMED_OUT flag, not srb->result == DID_ABORT, because
* the timeout might have occurred after the command had * 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)) { if (test_bit(US_FLIDX_TIMED_OUT, &us->dflags)) {
complete(&(us->notify)); complete(&(us->notify));
...@@ -610,7 +626,8 @@ static int get_device_info(struct us_data *us, const struct usb_device_id *id, ...@@ -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), le16_to_cpu(dev->descriptor.idProduct),
us->fflags); 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 * unnecessary subclass or protocol override. This may stimulate
* reports from users that will help us remove unneeded entries * reports from users that will help us remove unneeded entries
* from the unusual_devs.h table. * from the unusual_devs.h table.
...@@ -782,8 +799,10 @@ static int usb_stor_acquire_resources(struct us_data *us) ...@@ -782,8 +799,10 @@ static int usb_stor_acquire_resources(struct us_data *us)
return -ENOMEM; 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) { if (us->unusual_dev->initFunction) {
p = us->unusual_dev->initFunction(us); p = us->unusual_dev->initFunction(us);
if (p) if (p)
...@@ -805,7 +824,8 @@ static int usb_stor_acquire_resources(struct us_data *us) ...@@ -805,7 +824,8 @@ static int usb_stor_acquire_resources(struct us_data *us)
/* Release all our dynamic resources */ /* Release all our dynamic resources */
static void usb_stor_release_resources(struct us_data *us) 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 * already have been removed and the DISCONNECTING flag set
* so that we won't accept any more commands. * so that we won't accept any more commands.
*/ */
...@@ -836,7 +856,8 @@ static void dissociate_dev(struct us_data *us) ...@@ -836,7 +856,8 @@ static void dissociate_dev(struct us_data *us)
usb_set_intfdata(us->pusb_intf, NULL); 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 * remove the host, and stop accepting new commands
*/ */
static void quiesce_and_remove_host(struct us_data *us) static void quiesce_and_remove_host(struct us_data *us)
...@@ -849,7 +870,8 @@ 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); 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. * or wait for the SCSI-scanning routine to stop.
*/ */
cancel_delayed_work_sync(&us->scan_dwork); cancel_delayed_work_sync(&us->scan_dwork);
...@@ -858,12 +880,14 @@ static void quiesce_and_remove_host(struct us_data *us) ...@@ -858,12 +880,14 @@ static void quiesce_and_remove_host(struct us_data *us)
if (test_bit(US_FLIDX_SCAN_PENDING, &us->dflags)) if (test_bit(US_FLIDX_SCAN_PENDING, &us->dflags))
usb_autopm_put_interface_no_suspend(us->pusb_intf); 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. * synchronized, disks spun down, etc.
*/ */
scsi_remove_host(host); 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. * reset delays.
*/ */
scsi_lock(host); scsi_lock(host);
...@@ -878,8 +902,10 @@ static void release_everything(struct us_data *us) ...@@ -878,8 +902,10 @@ static void release_everything(struct us_data *us)
usb_stor_release_resources(us); usb_stor_release_resources(us);
dissociate_dev(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)); scsi_host_put(us_to_host(us));
} }
...@@ -900,7 +926,8 @@ static void usb_stor_scan_dwork(struct work_struct *work) ...@@ -900,7 +926,8 @@ static void usb_stor_scan_dwork(struct work_struct *work)
us->max_lun = usb_stor_Bulk_max_lun(us); us->max_lun = usb_stor_Bulk_max_lun(us);
/* /*
* Allow proper scanning of devices that present more than 8 LUNs * 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) if (us->max_lun >= 8)
us_to_host(us)->max_lun = us->max_lun+1; us_to_host(us)->max_lun = us->max_lun+1;
...@@ -975,7 +1002,8 @@ int usb_stor_probe1(struct us_data **pus, ...@@ -975,7 +1002,8 @@ int usb_stor_probe1(struct us_data **pus,
get_transport(us); get_transport(us);
get_protocol(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. * or protocol settings.
*/ */
return 0; return 0;
......
/* Driver for USB Mass Storage compliant devices /*
* Driver for USB Mass Storage compliant devices
* Main Header File * Main Header File
* *
* Current development and maintenance by: * Current development and maintenance by:
...@@ -100,7 +101,8 @@ typedef void (*pm_hook)(struct us_data *, int); /* power management hook */ ...@@ -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 */ /* we allocate one of these for every device that we remember */
struct us_data { struct us_data {
/* The device we're working with /*
* The device we're working with
* It's important to note: * It's important to note:
* (o) you must hold dev_mutex to change pusb_dev * (o) you must hold dev_mutex to change pusb_dev
*/ */
...@@ -175,8 +177,10 @@ static inline struct us_data *host_to_us(struct Scsi_Host *host) { ...@@ -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, extern void fill_inquiry_response(struct us_data *us,
unsigned char *data, unsigned int data_len); 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_unlock(host) spin_unlock_irq(host->host_lock)
#define scsi_lock(host) spin_lock_irq(host->host_lock) #define scsi_lock(host) spin_lock_irq(host->host_lock)
......
/* Driver for USB Mass Storage devices /*
* Driver for USB Mass Storage devices
* Usual Tables File for usb-storage and libusual * Usual Tables File for usb-storage and libusual
* *
* Copyright (C) 2009 Alan Stern (stern@rowland.harvard.edu) * Copyright (C) 2009 Alan Stern (stern@rowland.harvard.edu)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment