diff options
Diffstat (limited to 'drivers/usb/storage')
-rw-r--r-- | drivers/usb/storage/scsiglue.c | 12 | ||||
-rw-r--r-- | drivers/usb/storage/unusual_devs.h | 60 | ||||
-rw-r--r-- | drivers/usb/storage/usb.c | 29 | ||||
-rw-r--r-- | drivers/usb/storage/usb.h | 4 |
4 files changed, 79 insertions, 26 deletions
diff --git a/drivers/usb/storage/scsiglue.c b/drivers/usb/storage/scsiglue.c index 5715291ba540..a4b7df9ff8c1 100644 --- a/drivers/usb/storage/scsiglue.c +++ b/drivers/usb/storage/scsiglue.c | |||
@@ -112,13 +112,11 @@ static int slave_configure(struct scsi_device *sdev) | |||
112 | if (sdev->scsi_level < SCSI_2) | 112 | if (sdev->scsi_level < SCSI_2) |
113 | sdev->scsi_level = sdev->sdev_target->scsi_level = SCSI_2; | 113 | sdev->scsi_level = sdev->sdev_target->scsi_level = SCSI_2; |
114 | 114 | ||
115 | /* According to the technical support people at Genesys Logic, | 115 | /* Many devices have trouble transfering more than 32KB at a time, |
116 | * devices using their chips have problems transferring more than | 116 | * while others have trouble with more than 64K. At this time we |
117 | * 32 KB at a time. In practice people have found that 64 KB | 117 | * are limiting both to 32K (64 sectores). |
118 | * works okay and that's what Windows does. But we'll be | 118 | */ |
119 | * conservative; people can always use the sysfs interface to | 119 | if ((us->flags & US_FL_MAX_SECTORS_64) && |
120 | * increase max_sectors. */ | ||
121 | if (le16_to_cpu(us->pusb_dev->descriptor.idVendor) == USB_VENDOR_ID_GENESYS && | ||
122 | sdev->request_queue->max_sectors > 64) | 120 | sdev->request_queue->max_sectors > 64) |
123 | blk_queue_max_sectors(sdev->request_queue, 64); | 121 | blk_queue_max_sectors(sdev->request_queue, 64); |
124 | 122 | ||
diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h index c7e84e653df9..a5ca449f6e64 100644 --- a/drivers/usb/storage/unusual_devs.h +++ b/drivers/usb/storage/unusual_devs.h | |||
@@ -112,6 +112,19 @@ UNUSUAL_DEV( 0x0411, 0x001c, 0x0113, 0x0113, | |||
112 | US_SC_DEVICE, US_PR_DEVICE, NULL, | 112 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
113 | US_FL_FIX_INQUIRY ), | 113 | US_FL_FIX_INQUIRY ), |
114 | 114 | ||
115 | /* Submitted by Ernestas Vaiciukevicius <ernisv@gmail.com> */ | ||
116 | UNUSUAL_DEV( 0x0419, 0x0100, 0x0100, 0x0100, | ||
117 | "Samsung Info. Systems America, Inc.", | ||
118 | "MP3 Player", | ||
119 | US_SC_DEVICE, US_PR_DEVICE, NULL, | ||
120 | US_FL_IGNORE_RESIDUE ), | ||
121 | |||
122 | /* Reported by Orgad Shaneh <orgads@gmail.com> */ | ||
123 | UNUSUAL_DEV( 0x0419, 0xaace, 0x0100, 0x0100, | ||
124 | "Samsung", "MP3 Player", | ||
125 | US_SC_DEVICE, US_PR_DEVICE, NULL, | ||
126 | US_FL_IGNORE_RESIDUE ), | ||
127 | |||
115 | /* Reported by Christian Leber <christian@leber.de> */ | 128 | /* Reported by Christian Leber <christian@leber.de> */ |
116 | UNUSUAL_DEV( 0x0419, 0xaaf5, 0x0100, 0x0100, | 129 | UNUSUAL_DEV( 0x0419, 0xaaf5, 0x0100, 0x0100, |
117 | "TrekStor", | 130 | "TrekStor", |
@@ -132,6 +145,14 @@ UNUSUAL_DEV( 0x0420, 0x0001, 0x0100, 0x0100, | |||
132 | US_SC_DEVICE, US_PR_DEVICE, NULL, | 145 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
133 | US_FL_IGNORE_RESIDUE ), | 146 | US_FL_IGNORE_RESIDUE ), |
134 | 147 | ||
148 | /* Reported by Sumedha Swamy <sumedhaswamy@gmail.com> and | ||
149 | * Einar Th. Einarsson <einarthered@gmail.com> */ | ||
150 | UNUSUAL_DEV( 0x0421, 0x0444, 0x0100, 0x0100, | ||
151 | "Nokia", | ||
152 | "N91", | ||
153 | US_SC_DEVICE, US_PR_DEVICE, NULL, | ||
154 | US_FL_IGNORE_RESIDUE | US_FL_FIX_CAPACITY ), | ||
155 | |||
135 | /* Reported by Jiri Slaby <jirislaby@gmail.com> and | 156 | /* Reported by Jiri Slaby <jirislaby@gmail.com> and |
136 | * Rene C. Castberg <Rene@Castberg.org> */ | 157 | * Rene C. Castberg <Rene@Castberg.org> */ |
137 | UNUSUAL_DEV( 0x0421, 0x0446, 0x0100, 0x0100, | 158 | UNUSUAL_DEV( 0x0421, 0x0446, 0x0100, 0x0100, |
@@ -140,6 +161,13 @@ UNUSUAL_DEV( 0x0421, 0x0446, 0x0100, 0x0100, | |||
140 | US_SC_DEVICE, US_PR_DEVICE, NULL, | 161 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
141 | US_FL_IGNORE_RESIDUE | US_FL_FIX_CAPACITY ), | 162 | US_FL_IGNORE_RESIDUE | US_FL_FIX_CAPACITY ), |
142 | 163 | ||
164 | /* Reported by Matthew Bloch <matthew@bytemark.co.uk> */ | ||
165 | UNUSUAL_DEV( 0x0421, 0x044e, 0x0100, 0x0100, | ||
166 | "Nokia", | ||
167 | "E61", | ||
168 | US_SC_DEVICE, US_PR_DEVICE, NULL, | ||
169 | US_FL_IGNORE_RESIDUE | US_FL_FIX_CAPACITY ), | ||
170 | |||
143 | /* Reported by Olaf Hering <olh@suse.de> from novell bug #105878 */ | 171 | /* Reported by Olaf Hering <olh@suse.de> from novell bug #105878 */ |
144 | UNUSUAL_DEV( 0x0424, 0x0fdc, 0x0210, 0x0210, | 172 | UNUSUAL_DEV( 0x0424, 0x0fdc, 0x0210, 0x0210, |
145 | "SMSC", | 173 | "SMSC", |
@@ -473,10 +501,11 @@ UNUSUAL_DEV( 0x054c, 0x0010, 0x0106, 0x0450, | |||
473 | US_SC_SCSI, US_PR_DEVICE, NULL, | 501 | US_SC_SCSI, US_PR_DEVICE, NULL, |
474 | US_FL_SINGLE_LUN | US_FL_NOT_LOCKABLE | US_FL_NO_WP_DETECT ), | 502 | US_FL_SINGLE_LUN | US_FL_NOT_LOCKABLE | US_FL_NO_WP_DETECT ), |
475 | 503 | ||
476 | /* This entry is needed because the device reports Sub=ff */ | 504 | /* Submitted by Lars Jacob <jacob.lars@googlemail.com> |
477 | UNUSUAL_DEV( 0x054c, 0x0010, 0x0500, 0x0600, | 505 | * This entry is needed because the device reports Sub=ff */ |
506 | UNUSUAL_DEV( 0x054c, 0x0010, 0x0500, 0x0610, | ||
478 | "Sony", | 507 | "Sony", |
479 | "DSC-T1/T5", | 508 | "DSC-T1/T5/H5", |
480 | US_SC_8070, US_PR_DEVICE, NULL, | 509 | US_SC_8070, US_PR_DEVICE, NULL, |
481 | US_FL_SINGLE_LUN ), | 510 | US_FL_SINGLE_LUN ), |
482 | 511 | ||
@@ -708,18 +737,22 @@ UNUSUAL_DEV( 0x05dc, 0xb002, 0x0000, 0x0113, | |||
708 | * They were originally reported by Alexander Oltu | 737 | * They were originally reported by Alexander Oltu |
709 | * <alexander@all-2.com> and Peter Marks <peter.marks@turner.com> | 738 | * <alexander@all-2.com> and Peter Marks <peter.marks@turner.com> |
710 | * respectively. | 739 | * respectively. |
740 | * | ||
741 | * US_FL_GO_SLOW and US_FL_MAX_SECTORS_64 added by Phil Dibowitz | ||
742 | * <phil@ipom.com> as these flags were made and hard-coded | ||
743 | * special-cases were pulled from scsiglue.c. | ||
711 | */ | 744 | */ |
712 | UNUSUAL_DEV( 0x05e3, 0x0701, 0x0000, 0xffff, | 745 | UNUSUAL_DEV( 0x05e3, 0x0701, 0x0000, 0xffff, |
713 | "Genesys Logic", | 746 | "Genesys Logic", |
714 | "USB to IDE Optical", | 747 | "USB to IDE Optical", |
715 | US_SC_DEVICE, US_PR_DEVICE, NULL, | 748 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
716 | US_FL_GO_SLOW ), | 749 | US_FL_GO_SLOW | US_FL_MAX_SECTORS_64 ), |
717 | 750 | ||
718 | UNUSUAL_DEV( 0x05e3, 0x0702, 0x0000, 0xffff, | 751 | UNUSUAL_DEV( 0x05e3, 0x0702, 0x0000, 0xffff, |
719 | "Genesys Logic", | 752 | "Genesys Logic", |
720 | "USB to IDE Disk", | 753 | "USB to IDE Disk", |
721 | US_SC_DEVICE, US_PR_DEVICE, NULL, | 754 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
722 | US_FL_GO_SLOW ), | 755 | US_FL_GO_SLOW | US_FL_MAX_SECTORS_64 ), |
723 | 756 | ||
724 | /* Reported by Hanno Boeck <hanno@gmx.de> | 757 | /* Reported by Hanno Boeck <hanno@gmx.de> |
725 | * Taken from the Lycoris Kernel */ | 758 | * Taken from the Lycoris Kernel */ |
@@ -1196,6 +1229,14 @@ UNUSUAL_DEV( 0x0ea0, 0x6828, 0x0110, 0x0110, | |||
1196 | US_SC_DEVICE, US_PR_DEVICE, NULL, | 1229 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
1197 | US_FL_IGNORE_RESIDUE ), | 1230 | US_FL_IGNORE_RESIDUE ), |
1198 | 1231 | ||
1232 | /* Reported by Benjamin Schiller <sbenni@gmx.de> | ||
1233 | * It is also sold by Easylite as DJ 20 */ | ||
1234 | UNUSUAL_DEV( 0x0ed1, 0x7636, 0x0103, 0x0103, | ||
1235 | "Typhoon", | ||
1236 | "My DJ 1820", | ||
1237 | US_SC_DEVICE, US_PR_DEVICE, NULL, | ||
1238 | US_FL_IGNORE_RESIDUE | US_FL_GO_SLOW | US_FL_MAX_SECTORS_64), | ||
1239 | |||
1199 | /* Reported by Michael Stattmann <michael@stattmann.com> */ | 1240 | /* Reported by Michael Stattmann <michael@stattmann.com> */ |
1200 | UNUSUAL_DEV( 0x0fce, 0xd008, 0x0000, 0x0000, | 1241 | UNUSUAL_DEV( 0x0fce, 0xd008, 0x0000, 0x0000, |
1201 | "Sony Ericsson", | 1242 | "Sony Ericsson", |
@@ -1227,6 +1268,15 @@ UNUSUAL_DEV( 0x1370, 0x6828, 0x0110, 0x0110, | |||
1227 | US_SC_DEVICE, US_PR_DEVICE, NULL, | 1268 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
1228 | US_FL_IGNORE_RESIDUE ), | 1269 | US_FL_IGNORE_RESIDUE ), |
1229 | 1270 | ||
1271 | /* patch submitted by Davide Perini <perini.davide@dpsoftware.org> | ||
1272 | * and Renato Perini <rperini@email.it> | ||
1273 | */ | ||
1274 | UNUSUAL_DEV( 0x22b8, 0x3010, 0x0001, 0x0001, | ||
1275 | "Motorola", | ||
1276 | "RAZR V3x", | ||
1277 | US_SC_DEVICE, US_PR_DEVICE, NULL, | ||
1278 | US_FL_FIX_CAPACITY | US_FL_IGNORE_RESIDUE ), | ||
1279 | |||
1230 | /* Reported by Radovan Garabik <garabik@kassiopeia.juls.savba.sk> */ | 1280 | /* Reported by Radovan Garabik <garabik@kassiopeia.juls.savba.sk> */ |
1231 | UNUSUAL_DEV( 0x2735, 0x100b, 0x0000, 0x9999, | 1281 | UNUSUAL_DEV( 0x2735, 0x100b, 0x0000, 0x9999, |
1232 | "MPIO", | 1282 | "MPIO", |
diff --git a/drivers/usb/storage/usb.c b/drivers/usb/storage/usb.c index 1185acac4b21..5ee19be52f65 100644 --- a/drivers/usb/storage/usb.c +++ b/drivers/usb/storage/usb.c | |||
@@ -55,6 +55,7 @@ | |||
55 | #include <linux/slab.h> | 55 | #include <linux/slab.h> |
56 | #include <linux/kthread.h> | 56 | #include <linux/kthread.h> |
57 | #include <linux/mutex.h> | 57 | #include <linux/mutex.h> |
58 | #include <linux/utsrelease.h> | ||
58 | 59 | ||
59 | #include <scsi/scsi.h> | 60 | #include <scsi/scsi.h> |
60 | #include <scsi/scsi_cmnd.h> | 61 | #include <scsi/scsi_cmnd.h> |
@@ -373,8 +374,12 @@ static int usb_stor_control_thread(void * __us) | |||
373 | /* lock access to the state */ | 374 | /* lock access to the state */ |
374 | scsi_lock(host); | 375 | scsi_lock(host); |
375 | 376 | ||
377 | /* did the command already complete because of a disconnect? */ | ||
378 | if (!us->srb) | ||
379 | ; /* nothing to do */ | ||
380 | |||
376 | /* indicate that the command is done */ | 381 | /* indicate that the command is done */ |
377 | if (us->srb->result != DID_ABORT << 16) { | 382 | else if (us->srb->result != DID_ABORT << 16) { |
378 | US_DEBUGP("scsi cmd done, result=0x%x\n", | 383 | US_DEBUGP("scsi cmd done, result=0x%x\n", |
379 | us->srb->result); | 384 | us->srb->result); |
380 | us->srb->scsi_done(us->srb); | 385 | us->srb->scsi_done(us->srb); |
@@ -524,7 +529,8 @@ static void get_device_info(struct us_data *us, const struct usb_device_id *id) | |||
524 | if (msg >= 0 && !(us->flags & US_FL_NEED_OVERRIDE)) | 529 | if (msg >= 0 && !(us->flags & US_FL_NEED_OVERRIDE)) |
525 | printk(KERN_NOTICE USB_STORAGE "This device " | 530 | printk(KERN_NOTICE USB_STORAGE "This device " |
526 | "(%04x,%04x,%04x S %02x P %02x)" | 531 | "(%04x,%04x,%04x S %02x P %02x)" |
527 | " has %s in unusual_devs.h\n" | 532 | " has %s in unusual_devs.h (kernel" |
533 | " %s)\n" | ||
528 | " Please send a copy of this message to " | 534 | " Please send a copy of this message to " |
529 | "<linux-usb-devel@lists.sourceforge.net>\n", | 535 | "<linux-usb-devel@lists.sourceforge.net>\n", |
530 | le16_to_cpu(ddesc->idVendor), | 536 | le16_to_cpu(ddesc->idVendor), |
@@ -532,7 +538,8 @@ static void get_device_info(struct us_data *us, const struct usb_device_id *id) | |||
532 | le16_to_cpu(ddesc->bcdDevice), | 538 | le16_to_cpu(ddesc->bcdDevice), |
533 | idesc->bInterfaceSubClass, | 539 | idesc->bInterfaceSubClass, |
534 | idesc->bInterfaceProtocol, | 540 | idesc->bInterfaceProtocol, |
535 | msgs[msg]); | 541 | msgs[msg], |
542 | UTS_RELEASE); | ||
536 | } | 543 | } |
537 | } | 544 | } |
538 | 545 | ||
@@ -836,32 +843,34 @@ static void dissociate_dev(struct us_data *us) | |||
836 | * the host */ | 843 | * the host */ |
837 | static void quiesce_and_remove_host(struct us_data *us) | 844 | static void quiesce_and_remove_host(struct us_data *us) |
838 | { | 845 | { |
846 | struct Scsi_Host *host = us_to_host(us); | ||
847 | |||
839 | /* Prevent new USB transfers, stop the current command, and | 848 | /* Prevent new USB transfers, stop the current command, and |
840 | * interrupt a SCSI-scan or device-reset delay */ | 849 | * interrupt a SCSI-scan or device-reset delay */ |
850 | scsi_lock(host); | ||
841 | set_bit(US_FLIDX_DISCONNECTING, &us->flags); | 851 | set_bit(US_FLIDX_DISCONNECTING, &us->flags); |
852 | scsi_unlock(host); | ||
842 | usb_stor_stop_transport(us); | 853 | usb_stor_stop_transport(us); |
843 | wake_up(&us->delay_wait); | 854 | wake_up(&us->delay_wait); |
844 | 855 | ||
845 | /* It doesn't matter if the SCSI-scanning thread is still running. | 856 | /* It doesn't matter if the SCSI-scanning thread is still running. |
846 | * The thread will exit when it sees the DISCONNECTING flag. */ | 857 | * The thread will exit when it sees the DISCONNECTING flag. */ |
847 | 858 | ||
848 | /* Wait for the current command to finish, then remove the host */ | ||
849 | mutex_lock(&us->dev_mutex); | ||
850 | mutex_unlock(&us->dev_mutex); | ||
851 | |||
852 | /* queuecommand won't accept any new commands and the control | 859 | /* queuecommand won't accept any new commands and the control |
853 | * thread won't execute a previously-queued command. If there | 860 | * thread won't execute a previously-queued command. If there |
854 | * is such a command pending, complete it with an error. */ | 861 | * is such a command pending, complete it with an error. */ |
862 | mutex_lock(&us->dev_mutex); | ||
855 | if (us->srb) { | 863 | if (us->srb) { |
856 | us->srb->result = DID_NO_CONNECT << 16; | 864 | us->srb->result = DID_NO_CONNECT << 16; |
857 | scsi_lock(us_to_host(us)); | 865 | scsi_lock(host); |
858 | us->srb->scsi_done(us->srb); | 866 | us->srb->scsi_done(us->srb); |
859 | us->srb = NULL; | 867 | us->srb = NULL; |
860 | scsi_unlock(us_to_host(us)); | 868 | scsi_unlock(host); |
861 | } | 869 | } |
870 | mutex_unlock(&us->dev_mutex); | ||
862 | 871 | ||
863 | /* Now we own no commands so it's safe to remove the SCSI host */ | 872 | /* Now we own no commands so it's safe to remove the SCSI host */ |
864 | scsi_remove_host(us_to_host(us)); | 873 | scsi_remove_host(host); |
865 | } | 874 | } |
866 | 875 | ||
867 | /* Second stage of disconnect processing: deallocate all resources */ | 876 | /* Second stage of disconnect processing: deallocate all resources */ |
diff --git a/drivers/usb/storage/usb.h b/drivers/usb/storage/usb.h index 5284abe1b5eb..21f3ddbc9080 100644 --- a/drivers/usb/storage/usb.h +++ b/drivers/usb/storage/usb.h | |||
@@ -176,8 +176,4 @@ extern void fill_inquiry_response(struct us_data *us, | |||
176 | #define scsi_unlock(host) spin_unlock_irq(host->host_lock) | 176 | #define scsi_unlock(host) spin_unlock_irq(host->host_lock) |
177 | #define scsi_lock(host) spin_lock_irq(host->host_lock) | 177 | #define scsi_lock(host) spin_lock_irq(host->host_lock) |
178 | 178 | ||
179 | |||
180 | /* Vendor ID list for devices that require special handling */ | ||
181 | #define USB_VENDOR_ID_GENESYS 0x05e3 /* Genesys Logic */ | ||
182 | |||
183 | #endif | 179 | #endif |