usb: storage: fix multi-line comment style
No functional changes here, just making sure our storage driver uses a consistent multi-line comment style. Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com> Acked-by: Alan Stern <stern@rowland.harvard.edu> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
5b91dfe187
commit
f0183a338e
@@ -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,
|
|||||||
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)
|
|||||||
}
|
}
|
||||||
|
|
||||||
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)
|
|||||||
/* 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)
|
|||||||
|
|
||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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,
|
|||||||
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);
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
/* 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)
|
|||||||
}
|
}
|
||||||
|
|
||||||
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;
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
/* 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:
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
/* 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)
|
|||||||
/* 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,
|
|||||||
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,
|
|||||||
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)
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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)
|
|||||||
/* 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;
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
/* 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 {
|
|||||||
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)
|
|||||||
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)
|
|||||||
|
|
||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
/* 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)
|
|||||||
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)
|
|||||||
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.
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
/* Special Initializers for certain USB Mass Storage devices
|
/*
|
||||||
|
* Special Initializers for certain USB Mass Storage devices
|
||||||
*
|
*
|
||||||
* Current development and maintenance by:
|
* 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 @@
|
|||||||
#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)
|
|||||||
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;
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
/* Header file for Special Initializers for certain USB Mass Storage devices
|
/*
|
||||||
|
* Header file for Special Initializers for certain USB Mass Storage devices
|
||||||
*
|
*
|
||||||
* Current development and maintenance by:
|
* 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 @@
|
|||||||
#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 */
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
/* Transport & Protocol Driver for In-System Design, Inc. ISD200 ASIC
|
/*
|
||||||
|
* Transport & Protocol Driver for In-System Design, Inc. ISD200 ASIC
|
||||||
*
|
*
|
||||||
* Current development and maintenance:
|
* 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,
|
|||||||
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,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 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,
|
|||||||
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 )
|
|||||||
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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
/* 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)
|
|||||||
}
|
}
|
||||||
|
|
||||||
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;
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
/* 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)
|
|||||||
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)
|
|||||||
|
|
||||||
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);
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
/* 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)
|
|||||||
|
|
||||||
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);
|
|||||||
* 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,
|
|||||||
}
|
}
|
||||||
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,
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
/* 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:
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
/* Driver for Realtek RTS51xx USB card reader
|
/*
|
||||||
|
* Driver for Realtek RTS51xx USB card reader
|
||||||
*
|
*
|
||||||
* Copyright(c) 2009 Realtek Semiconductor Corp. All rights reserved.
|
* Copyright(c) 2009 Realtek Semiconductor Corp. All rights reserved.
|
||||||
*
|
*
|
||||||
@@ -267,8 +268,10 @@ static int rts51x_bulk_transport(struct us_data *us, u8 lun,
|
|||||||
if (bcs->Tag != us->tag)
|
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,
|
|||||||
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;
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
/* 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 @@
|
|||||||
#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)
|
|||||||
*/
|
*/
|
||||||
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)
|
|||||||
{
|
{
|
||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
/* 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)
|
|||||||
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)
|
|||||||
|
|
||||||
} 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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
|
|
||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 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 = {
|
|||||||
*/
|
*/
|
||||||
.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.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
/* 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:
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
/* Driver for SanDisk SDDR-09 SmartMedia reader
|
/*
|
||||||
|
* Driver for SanDisk SDDR-09 SmartMedia reader
|
||||||
*
|
*
|
||||||
* (c) 2000, 2001 Robert Baruch (autophile@starband.net)
|
* (c) 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,
|
|||||||
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,
|
|||||||
}
|
}
|
||||||
|
|
||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
|
|
||||||
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,
|
|||||||
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) {
|
|||||||
/* 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) {
|
|||||||
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)
|
|||||||
|
|
||||||
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)
|
|||||||
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)
|
|||||||
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 &&
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
/* 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,
|
|||||||
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) {
|
|||||||
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) {
|
|||||||
* 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)
|
|||||||
|
|
||||||
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)
|
|||||||
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)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 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)
|
|||||||
|
|
||||||
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;
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
/* Driver for SCM Microsystems (a.k.a. Shuttle) USB-ATAPI cable
|
/*
|
||||||
|
* Driver for SCM Microsystems (a.k.a. Shuttle) USB-ATAPI cable
|
||||||
*
|
*
|
||||||
* Current development and maintenance by:
|
* 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)
|
|||||||
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)
|
|||||||
|
|
||||||
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,
|
|||||||
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)
|
|||||||
|
|
||||||
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)) {
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
/* 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 @@
|
|||||||
* 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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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,
|
|||||||
}
|
}
|
||||||
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,
|
|||||||
|
|
||||||
/* 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,
|
|||||||
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);
|
|||||||
* 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)
|
|||||||
[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)
|
|||||||
|
|
||||||
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)
|
|||||||
}
|
}
|
||||||
|
|
||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
|
|
||||||
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 @@ Retry_Sense:
|
|||||||
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 @@ Retry_Sense:
|
|||||||
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 @@ Retry_Sense:
|
|||||||
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 @@ Retry_Sense:
|
|||||||
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 @@ Retry_Sense:
|
|||||||
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 @@ Retry_Sense:
|
|||||||
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 @@ Retry_Sense:
|
|||||||
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 @@ Retry_Sense:
|
|||||||
/* 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)
|
|||||||
|
|
||||||
/* 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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
}
|
}
|
||||||
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)
|
|||||||
/* 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)
|
|||||||
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)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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);
|
|||||||
* 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,
|
|||||||
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,
|
|||||||
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)
|
|||||||
}
|
}
|
||||||
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)
|
|||||||
}
|
}
|
||||||
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)
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
/* 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)
|
|||||||
|
|
||||||
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
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
/* Unusual Devices File for the Alauda-based card readers
|
/*
|
||||||
|
* Unusual Devices File for the Alauda-based card readers
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* 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
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
/* Unusual Devices File for devices based on the Cypress USB/ATA bridge
|
/*
|
||||||
|
* Unusual Devices File for devices based on the Cypress USB/ATA bridge
|
||||||
* with support for ATACB
|
* 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
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
/* Unusual Devices File for the Datafab USB Compact Flash reader
|
/*
|
||||||
|
* Unusual Devices File for the Datafab USB Compact Flash reader
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* 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,
|
|||||||
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"
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
/* 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 @@
|
|||||||
* 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 @@
|
|||||||
* <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 @@
|
|||||||
#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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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",
|
||||||
@@ -298,7 +313,8 @@ UNUSUAL_DEV( 0x0457, 0x0151, 0x0100, 0x0100,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
"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,
|
|||||||
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,
|
|||||||
"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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
"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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,7 +1200,8 @@ 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"
|
||||||
@@ -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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
"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,
|
|||||||
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,
|
|||||||
"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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
/* Unusual Devices File for the Freecom USB/IDE adaptor
|
/*
|
||||||
|
* Unusual Devices File for the Freecom USB/IDE adaptor
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* 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
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
/* Unusual Devices File for In-System Design, Inc. ISD200 ASIC
|
/*
|
||||||
|
* Unusual Devices File for In-System Design, Inc. ISD200 ASIC
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* 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
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
/* Unusual Devices File for the Lexar "Jumpshot" Compact Flash reader
|
/*
|
||||||
|
* Unusual Devices File for the Lexar "Jumpshot" Compact Flash reader
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* 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
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
/* Unusual Devices File for the Rio Karma
|
/*
|
||||||
|
* Unusual Devices File for the Rio Karma
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* 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
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
/* Unusual Devices File for the Maxtor OneTouch USB hard drive's button
|
/*
|
||||||
|
* Unusual Devices File for the Maxtor OneTouch USB hard drive's button
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* 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 @@
|
|||||||
#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,
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
/* Driver for Realtek RTS51xx USB card reader
|
/*
|
||||||
|
* Driver for Realtek RTS51xx USB card reader
|
||||||
*
|
*
|
||||||
* Copyright(c) 2009 Realtek Semiconductor Corp. All rights reserved.
|
* Copyright(c) 2009 Realtek Semiconductor Corp. All rights reserved.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
/* Unusual Devices File for SanDisk SDDR-09 SmartMedia reader
|
/*
|
||||||
|
* Unusual Devices File for SanDisk SDDR-09 SmartMedia reader
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* 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
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
/* Unusual Devices File for SanDisk SDDR-55 SmartMedia reader
|
/*
|
||||||
|
* Unusual Devices File for SanDisk SDDR-55 SmartMedia reader
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* 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
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
/* Driver for USB Attached SCSI devices - Unusual Devices File
|
/*
|
||||||
|
* Driver for USB Attached SCSI devices - Unusual Devices File
|
||||||
*
|
*
|
||||||
* (c) 2013 Hans de Goede <hdegoede@redhat.com>
|
* (c) 2013 Hans de Goede <hdegoede@redhat.com>
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
/* Unusual Devices File for SCM Microsystems (a.k.a. Shuttle) USB-ATAPI cable
|
/*
|
||||||
|
* Unusual Devices File for SCM Microsystems (a.k.a. Shuttle) USB-ATAPI cable
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* 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
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
/* 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");
|
|||||||
* 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)
|
|||||||
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)
|
|||||||
/* 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)
|
|||||||
/* 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,
|
|||||||
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)
|
|||||||
|
|
||||||
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)
|
|||||||
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)
|
|||||||
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 @@ SkipForAbort:
|
|||||||
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,
|
|||||||
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)
|
|||||||
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)
|
|||||||
/* 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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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,
|
|||||||
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;
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
/* 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 */
|
|||||||
|
|
||||||
/* 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) {
|
|||||||
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)
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
/* 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)
|
||||||
|
|||||||
Reference in New Issue
Block a user