Skip to content

Commit 546aa0e

Browse files
AlanSterngregkh
authored andcommitted
usb-storage: Add quirk to defeat Kindle's automatic unload
Matthias reports that the Amazon Kindle automatically removes its emulated media if it doesn't receive another SCSI command within about one second after a SYNCHRONIZE CACHE. It does so even when the host has sent a PREVENT MEDIUM REMOVAL command. The reason for this behavior isn't clear, although it's not hard to make some guesses. At any rate, the results can be unexpected for anyone who tries to access the Kindle in an unusual fashion, and in theory they can lead to data loss (for example, if one file is closed and synchronized while other files are still in the middle of being written). To avoid such problems, this patch creates a new usb-storage quirks flag telling the driver always to issue a REQUEST SENSE following a SYNCHRONIZE CACHE command, and adds an unusual_devs entry for the Kindle with the flag set. This is sufficient to prevent the Kindle from doing its automatic unload, without interfering with proper operation. Another possible way to deal with this would be to increase the frequency of TEST UNIT READY polling that the kernel normally carries out for removable-media storage devices. However that would increase the overall load on the system and it is not as reliable, because the user can override the polling interval. Changing the driver's behavior is safer and has minimal overhead. CC: <[email protected]> Reported-and-tested-by: Matthias Schwarzott <[email protected]> Signed-off-by: Alan Stern <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent 98f153a commit 546aa0e

File tree

3 files changed

+21
-0
lines changed

3 files changed

+21
-0
lines changed

drivers/usb/storage/transport.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -656,6 +656,13 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us)
656656
need_auto_sense = 1;
657657
}
658658

659+
/* Some devices (Kindle) require another command after SYNC CACHE */
660+
if ((us->fflags & US_FL_SENSE_AFTER_SYNC) &&
661+
srb->cmnd[0] == SYNCHRONIZE_CACHE) {
662+
usb_stor_dbg(us, "-- sense after SYNC CACHE\n");
663+
need_auto_sense = 1;
664+
}
665+
659666
/*
660667
* If we have a failure, we're going to do a REQUEST_SENSE
661668
* automatically. Note that we differentiate between a command

drivers/usb/storage/unusual_devs.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2211,6 +2211,18 @@ UNUSUAL_DEV( 0x1908, 0x3335, 0x0200, 0x0200,
22112211
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
22122212
US_FL_NO_READ_DISC_INFO ),
22132213

2214+
/*
2215+
* Reported by Matthias Schwarzott <[email protected]>
2216+
* The Amazon Kindle treats SYNCHRONIZE CACHE as an indication that
2217+
* the host may be finished with it, and automatically ejects its
2218+
* emulated media unless it receives another command within one second.
2219+
*/
2220+
UNUSUAL_DEV( 0x1949, 0x0004, 0x0000, 0x9999,
2221+
"Amazon",
2222+
"Kindle",
2223+
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
2224+
US_FL_SENSE_AFTER_SYNC ),
2225+
22142226
/*
22152227
* Reported by Oliver Neukum <[email protected]>
22162228
* This device morphes spontaneously into another device if the access

include/linux/usb_usual.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,8 @@
8686
/* lies about caching, so always sync */ \
8787
US_FLAG(NO_SAME, 0x40000000) \
8888
/* Cannot handle WRITE_SAME */ \
89+
US_FLAG(SENSE_AFTER_SYNC, 0x80000000) \
90+
/* Do REQUEST_SENSE after SYNCHRONIZE_CACHE */ \
8991

9092
#define US_FLAG(name, value) US_FL_##name = value ,
9193
enum { US_DO_ALL_FLAGS };

0 commit comments

Comments
 (0)