Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp3503937imu; Mon, 7 Jan 2019 04:42:49 -0800 (PST) X-Google-Smtp-Source: ALg8bN4y+ChYsAHTH1cW74zp0z0j1OmAo9809gz5GR/bvefesJrxB/VNdVZQbewysBDONxwbX3ec X-Received: by 2002:a17:902:a6:: with SMTP id a35mr61310999pla.201.1546864969363; Mon, 07 Jan 2019 04:42:49 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1546864969; cv=none; d=google.com; s=arc-20160816; b=Hq6F3Azet4+i36PKbPdoogYuB4PjbKRrw2TCu/6cI3sEwoGrSX6uFyl7mm1DEd5ZUF FlEYTwm1AHEYn8RUf7QqxhRUo+X88BZIhPUXlx+ZrQeZT6tVYxhWDEUnA0La580X0/wt prWVmsu9/cpEbn19kno9J1M9Ro9seIM78J9NkKWIJbcrUWfNqwWaWVhRQD8JZbtzJO5c pwzR+945IKVke4RW9Jlny00X9uqMI95HlsRr3s6uiQ5HGZq74qHDh6WSxFkJRmKHr17o OGdYyhG+mome3UY1K7fN3jhQcJVPtc6k13C8gZPUe7UNAYVufhr7lGqSto8yzwOQVqFV 2wkw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=tIi0HO3uvHR4WpHzftpTSIWCgyNhUruQtsqzwJ/ZGk4=; b=T6mx2bwl5rvpIoQBXuLvQ1UH4E0snixTnorMU+4aD6qJinlE09PhB4RcPO7QJQlW34 8bDZf+0ertORjgG6g78aAaXqZDbrT9AZ/QzxuKtUwvzZVMOKpIyU6qx/G3/BiGG0xgZp 8X5wM0oJQ9JPAnPrGov1qkRqKsPTM9ly2ZLMg82so8j8pbBoAGdYeybb+zxPG10cGvqj UPzjoEoEVum8z2pO/q1p9y87Or5UTu/5oWT8yGND8V+AOy6GxQJdF+QQRSSO1ADFJAFt w4gKQEZgKRc7rEvsRQUUdeGqdQ3khRYhab/Vt0JjXVOWbS99jlMi0HK8HUYuYoxTVyNf uXYw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=uBjb3s3i; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id l3si3128165pld.229.2019.01.07.04.42.33; Mon, 07 Jan 2019 04:42:49 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=uBjb3s3i; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727754AbfAGMkk (ORCPT + 99 others); Mon, 7 Jan 2019 07:40:40 -0500 Received: from mail.kernel.org ([198.145.29.99]:55588 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727477AbfAGMki (ORCPT ); Mon, 7 Jan 2019 07:40:38 -0500 Received: from localhost (5356596B.cm-6-7b.dynamic.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id AE2042173C; Mon, 7 Jan 2019 12:40:36 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1546864837; bh=lBgs3AQnMe0zN+iXblwyGSK7VBQ9ALzBa6m1VGDx3IA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=uBjb3s3i4zOfCkby2H3bYY4oIhSI+KLQGqnU5FaRcoC339ReQdfjgwZGo6HB0TjKw cZHEypqgf48SyYGvW2aywbybzxQWRkHndhaNh52dsEMVHRkA31SDJ14lI7UPc7TBA6 31CBTmEHW6DYTYguvPsvYZGfH0dLvnA+OhM21Omk= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Lukas Wunner , Mathias Duckeck , Frank Pavlic , Martin Sperl , =?UTF-8?q?Noralf=20Tr=C3=B8nnes?= , Mark Brown Subject: [PATCH 4.20 082/145] spi: bcm2835: Avoid finishing transfer prematurely in IRQ mode Date: Mon, 7 Jan 2019 13:31:59 +0100 Message-Id: <20190107104447.944106075@linuxfoundation.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190107104437.308206189@linuxfoundation.org> References: <20190107104437.308206189@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review X-Patchwork-Hint: ignore MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 4.20-stable review patch. If anyone has any objections, please let me know. ------------------ From: Lukas Wunner commit 56c1723426d3cfd4723bfbfce531d7b38bae6266 upstream. The IRQ handler bcm2835_spi_interrupt() first reads as much as possible from the RX FIFO, then writes as much as possible to the TX FIFO. Afterwards it decides whether the transfer is finished by checking if the TX FIFO is empty. If very few bytes were written to the TX FIFO, they may already have been transmitted by the time the FIFO's emptiness is checked. As a result, the transfer will be declared finished and the chip will be reset without reading the corresponding received bytes from the RX FIFO. The odds of this happening increase with a high clock frequency (such that the TX FIFO drains quickly) and either passing "threadirqs" on the command line or enabling CONFIG_PREEMPT_RT_BASE (such that the IRQ handler may be preempted between filling the TX FIFO and checking its emptiness). Fix by instead checking whether rx_len has reached zero, which means that the transfer has been received in full. This is also more efficient as it avoids one bus read access per interrupt. Note that bcm2835_spi_transfer_one_poll() likewise uses rx_len to determine whether the transfer has finished. Signed-off-by: Lukas Wunner Fixes: e34ff011c70e ("spi: bcm2835: move to the transfer_one driver model") Cc: stable@vger.kernel.org # v4.1+ Cc: Mathias Duckeck Cc: Frank Pavlic Cc: Martin Sperl Cc: Noralf Trønnes Signed-off-by: Mark Brown Signed-off-by: Greg Kroah-Hartman --- drivers/spi/spi-bcm2835.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) --- a/drivers/spi/spi-bcm2835.c +++ b/drivers/spi/spi-bcm2835.c @@ -155,8 +155,7 @@ static irqreturn_t bcm2835_spi_interrupt /* Write as many bytes as possible to FIFO */ bcm2835_wr_fifo(bs); - /* based on flags decide if we can finish the transfer */ - if (bcm2835_rd(bs, BCM2835_SPI_CS) & BCM2835_SPI_CS_DONE) { + if (!bs->rx_len) { /* Transfer complete - reset SPI HW */ bcm2835_spi_reset_hw(master); /* wake up the framework */