Received: by 2002:a05:6a10:9848:0:0:0:0 with SMTP id x8csp3413066pxf; Mon, 22 Mar 2021 06:01:56 -0700 (PDT) X-Google-Smtp-Source: ABdhPJw6PlPu1NddpQJUxVE6bOlOvvZCGETMOJZS5NLcFbnYSpE8h4EBgmfHCTOJxg0LVqJVUmLi X-Received: by 2002:a05:6402:b2a:: with SMTP id bo10mr25002070edb.144.1616418116275; Mon, 22 Mar 2021 06:01:56 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1616418116; cv=none; d=google.com; s=arc-20160816; b=S17Qema36jEKJV1HlYImjcFB9UK663mkRHvE1aQ16bpzs3WPF9Z6NFxI7uLymGA+Se Jj9t1fG8fr7SFeFp0bFAS539Lf8T/Dc53MYULSGDVtw+lPTpOMkvESo5g2rWxHenO9e7 QREo3fh3X9nYDM3bLXOYsYf2MGm35U89XTnz2R5FS24id1tTaT2kjrtn1lPOtIj2WNZa v4ctHMw4k1eX4lyPddW7YX8tgTb+xsQbqlySUC6gWsD6pM3jRBe+Pahw9mhAzC0NLaYP akIf4L2bi2o1pwVVDIz+jW1CCFgyYJrJ2dlhFcjGwPozVJLjLoeL2b1x/4EmQpdzmJRw 7byw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=osElIaoH8xPDMuuyTzTT4KWFinwM35TQcB2TZChK+Oo=; b=ylX/a5QvTFKgjCuNlubH5xeh/oNu12n4E44wTUQj/QDvHwzCtCDNui0k7xauvUuRhE 0PM4d6hUNxNoeAGZFe/QHqsnx81ixvwaXzWpZENx4ASgUG272QWST5nLewBhJc235dKZ yiYyvueK+5IqNO7XwHVsqIAjTkOnC7fEp7s+4n9tmJH/t3ZNboTdHqDKbQzQW/0vVCBM 8GhHDgfU6yQVpNE7u53sdM4Ai6NGpUP9gbeDsms6Vm1gULhHFDRZjfoFEnN8vHIbcPbj ka51GIgOJ/tUQhvf57Qq3WGybOs5E1DKks94aK/0nD3OaiAXv9kZ9cK4ifzhyUgIXYnn Vigw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=zX9RW2Eq; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id y3si11238068edo.515.2021.03.22.06.01.33; Mon, 22 Mar 2021 06:01:56 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=zX9RW2Eq; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232334AbhCVNAj (ORCPT + 99 others); Mon, 22 Mar 2021 09:00:39 -0400 Received: from mail.kernel.org ([198.145.29.99]:40066 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232767AbhCVMsM (ORCPT ); Mon, 22 Mar 2021 08:48:12 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id A39AA619C0; Mon, 22 Mar 2021 12:44:09 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1616417050; bh=gKFKmJmz7gWC8mnLNoc9cdcCFERF3Ke9B1hJzweRw6A=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=zX9RW2Eq2VA5U4F0S7Z8d66kGZAIXFgmt71ael14z4rybv+pzC2JSiEBCJahmBqpd I8VDl83k1iSMiEOmCnoyc2RrkZleapHaG5ruXA4mOQDCmxGCDgXkLJrIO4q/qn+R8F 0RDg+s5N66GUMQHgrFsrB0OqokMYER8lUJ8aFiUk= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Alan Stern , Matthias Schwarzott Subject: [PATCH 5.4 34/60] usb-storage: Add quirk to defeat Kindles automatic unload Date: Mon, 22 Mar 2021 13:28:22 +0100 Message-Id: <20210322121923.515744316@linuxfoundation.org> X-Mailer: git-send-email 2.31.0 In-Reply-To: <20210322121922.372583154@linuxfoundation.org> References: <20210322121922.372583154@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Alan Stern commit 546aa0e4ea6ed81b6c51baeebc4364542fa3f3a7 upstream. 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: Reported-and-tested-by: Matthias Schwarzott Signed-off-by: Alan Stern Link: https://lore.kernel.org/r/20210317190654.GA497856@rowland.harvard.edu Signed-off-by: Greg Kroah-Hartman --- drivers/usb/storage/transport.c | 7 +++++++ drivers/usb/storage/unusual_devs.h | 12 ++++++++++++ include/linux/usb_usual.h | 2 ++ 3 files changed, 21 insertions(+) --- a/drivers/usb/storage/transport.c +++ b/drivers/usb/storage/transport.c @@ -651,6 +651,13 @@ void usb_stor_invoke_transport(struct sc need_auto_sense = 1; } + /* Some devices (Kindle) require another command after SYNC CACHE */ + if ((us->fflags & US_FL_SENSE_AFTER_SYNC) && + srb->cmnd[0] == SYNCHRONIZE_CACHE) { + usb_stor_dbg(us, "-- sense after SYNC CACHE\n"); + need_auto_sense = 1; + } + /* * If we have a failure, we're going to do a REQUEST_SENSE * automatically. Note that we differentiate between a command --- a/drivers/usb/storage/unusual_devs.h +++ b/drivers/usb/storage/unusual_devs.h @@ -2212,6 +2212,18 @@ UNUSUAL_DEV( 0x1908, 0x3335, 0x0200, 0x0 US_FL_NO_READ_DISC_INFO ), /* + * Reported by Matthias Schwarzott + * The Amazon Kindle treats SYNCHRONIZE CACHE as an indication that + * the host may be finished with it, and automatically ejects its + * emulated media unless it receives another command within one second. + */ +UNUSUAL_DEV( 0x1949, 0x0004, 0x0000, 0x9999, + "Amazon", + "Kindle", + USB_SC_DEVICE, USB_PR_DEVICE, NULL, + US_FL_SENSE_AFTER_SYNC ), + +/* * Reported by Oliver Neukum * This device morphes spontaneously into another device if the access * pattern of Windows isn't followed. Thus writable media would be dirty --- a/include/linux/usb_usual.h +++ b/include/linux/usb_usual.h @@ -86,6 +86,8 @@ /* lies about caching, so always sync */ \ US_FLAG(NO_SAME, 0x40000000) \ /* Cannot handle WRITE_SAME */ \ + US_FLAG(SENSE_AFTER_SYNC, 0x80000000) \ + /* Do REQUEST_SENSE after SYNCHRONIZE_CACHE */ \ #define US_FLAG(name, value) US_FL_##name = value , enum { US_DO_ALL_FLAGS };