aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/storage
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/usb/storage')
-rw-r--r--drivers/usb/storage/scsiglue.c12
-rw-r--r--drivers/usb/storage/unusual_devs.h60
-rw-r--r--drivers/usb/storage/usb.c29
-rw-r--r--drivers/usb/storage/usb.h4
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> */
116UNUSUAL_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> */
123UNUSUAL_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> */
116UNUSUAL_DEV( 0x0419, 0xaaf5, 0x0100, 0x0100, 129UNUSUAL_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> */
150UNUSUAL_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> */
137UNUSUAL_DEV( 0x0421, 0x0446, 0x0100, 0x0100, 158UNUSUAL_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> */
165UNUSUAL_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 */
144UNUSUAL_DEV( 0x0424, 0x0fdc, 0x0210, 0x0210, 172UNUSUAL_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>
477UNUSUAL_DEV( 0x054c, 0x0010, 0x0500, 0x0600, 505 * This entry is needed because the device reports Sub=ff */
506UNUSUAL_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 */
712UNUSUAL_DEV( 0x05e3, 0x0701, 0x0000, 0xffff, 745UNUSUAL_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
718UNUSUAL_DEV( 0x05e3, 0x0702, 0x0000, 0xffff, 751UNUSUAL_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 */
1234UNUSUAL_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> */
1200UNUSUAL_DEV( 0x0fce, 0xd008, 0x0000, 0x0000, 1241UNUSUAL_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 */
1274UNUSUAL_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> */
1231UNUSUAL_DEV( 0x2735, 0x100b, 0x0000, 0x9999, 1281UNUSUAL_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 */
837static void quiesce_and_remove_host(struct us_data *us) 844static 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