Received: by 10.192.165.148 with SMTP id m20csp2527902imm; Sun, 22 Apr 2018 08:55:22 -0700 (PDT) X-Google-Smtp-Source: AIpwx49cD+A2015Quv1ms6zqT/gC4vnJnlmhXLZTtlroxDk0ym5zDJBR2PPlNZb+tKMVTNTl3ArR X-Received: by 10.99.126.71 with SMTP id o7mr14329519pgn.366.1524412522585; Sun, 22 Apr 2018 08:55:22 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1524412522; cv=none; d=google.com; s=arc-20160816; b=yPJLGYZj0p5MlDimoKjAmIX1U6I1khc6gegi7wC0ixE370XOEsqbMLR/rkwuk/UQEC MX23C0/ug+x8/BQ/ZNkyZtFAtMPw3QGlHkhoZ1i2ej0GkPOjW10eenjkK52jAWZZ8vyr Xw84u7Gk1SgZq/BD8f6hDuByXKJTmPXF6DKwdaHte3cMoOB+GX4Ck1jBsZepbAdzfoWM OUPsO0aOD3uU2KAv4HjMPBm4HEljqZ85aUPirYpdaHDkdJilBstmj8Pf4JxU4ymFXssD pmP86IMp5YktRt2GpBshhZ8WyHvlhJ4VBJhpipNrdQ0m4kD+yD2gDqEU54zEM7o6syis M3Jg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:user-agent:references :in-reply-to:message-id:date:subject:cc:to:from :arc-authentication-results; bh=r1PWk9rHjUsKMlol5WUOX43RRvtQnqx+H+ag+yhuafg=; b=eH5co3qmGnV91MehpQaIIRb72E+/WVLUAkiG3oOWh3R3ZvtQBK/EXwBQQWuZTZ7O1G qkmPw0RifhBEauFGmJSqqf5xOgpaeHj+BLbJUbbVJUfaFZFefCpYC09KHiN66A7lbgRq ZSDOL6vf4eMPGgCaUG/raTbxm9iaXSayOaPxEVwmhfpqyrr8+X5zIkbLuAjIawMBqf6l 4PsuvJBJqtMiyjV6keHXWwnv82XqWlVhkGibcNUe5mL0akqdc9zot6cRNx4gmZAFcRQ1 bNQVM/7QVgyT/r0t/8MnZ5lJHu7qhZQVn168x2H7RhxVR5fHhYmnvrf97WD7vE65jnan U3pg== ARC-Authentication-Results: i=1; mx.google.com; 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 o11si8437380pgc.274.2018.04.22.08.55.08; Sun, 22 Apr 2018 08:55:22 -0700 (PDT) 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; 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 S1754593AbeDVPyF (ORCPT + 99 others); Sun, 22 Apr 2018 11:54:05 -0400 Received: from mail.linuxfoundation.org ([140.211.169.12]:47162 "EHLO mail.linuxfoundation.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754457AbeDVOAA (ORCPT ); Sun, 22 Apr 2018 10:00:00 -0400 Received: from localhost (LFbn-1-12247-202.w90-92.abo.wanadoo.fr [90.92.61.202]) by mail.linuxfoundation.org (Postfix) with ESMTPSA id 6C56192F; Sun, 22 Apr 2018 13:59:59 +0000 (UTC) From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Maxime Jayat , Ludovic Desroches , Vinod Koul Subject: [PATCH 4.16 119/196] dmaengine: at_xdmac: fix rare residue corruption Date: Sun, 22 Apr 2018 15:52:19 +0200 Message-Id: <20180422135110.396852301@linuxfoundation.org> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180422135104.278511750@linuxfoundation.org> References: <20180422135104.278511750@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 4.16-stable review patch. If anyone has any objections, please let me know. ------------------ From: Maxime Jayat commit c5637476bbf9bb86c7f0413b8f4822a73d8d2d07 upstream. Despite the efforts made to correctly read the NDA and CUBC registers, the order in which the registers are read could sometimes lead to an inconsistent state. Re-using the timeline from the comments, this following timing of registers reads could lead to reading NDA with value "@desc2" and CUBC with value "MAX desc1": INITD -------- ------------ |____________________| _______________________ _______________ NDA @desc2 \/ @desc3 _______________________/\_______________ __________ ___________ _______________ CUBC 0 \/ MAX desc1 \/ MAX desc2 __________/\___________/\_______________ | | | | Events:(1)(2) (3)(4) (1) check_nda = @desc2 (2) initd = 1 (3) cur_ubc = MAX desc1 (4) cur_nda = @desc2 This is allowed by the condition ((check_nda == cur_nda) && initd), despite cur_ubc and cur_nda being in the precise state we don't want. This error leads to incorrect residue computation. Fix it by inversing the order in which CUBC and INITD are read. This makes sure that NDA and CUBC are always read together either _before_ INITD goes to 0 or _after_ it is back at 1. The case where NDA is read before INITD is at 0 and CUBC is read after INITD is back at 1 will be rejected by check_nda and cur_nda being different. Fixes: 53398f488821 ("dmaengine: at_xdmac: fix residue corruption") Cc: stable@vger.kernel.org Signed-off-by: Maxime Jayat Acked-by: Ludovic Desroches Signed-off-by: Vinod Koul Signed-off-by: Greg Kroah-Hartman --- drivers/dma/at_xdmac.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) --- a/drivers/dma/at_xdmac.c +++ b/drivers/dma/at_xdmac.c @@ -1471,10 +1471,10 @@ at_xdmac_tx_status(struct dma_chan *chan for (retry = 0; retry < AT_XDMAC_RESIDUE_MAX_RETRIES; retry++) { check_nda = at_xdmac_chan_read(atchan, AT_XDMAC_CNDA) & 0xfffffffc; rmb(); - initd = !!(at_xdmac_chan_read(atchan, AT_XDMAC_CC) & AT_XDMAC_CC_INITD); - rmb(); cur_ubc = at_xdmac_chan_read(atchan, AT_XDMAC_CUBC); rmb(); + initd = !!(at_xdmac_chan_read(atchan, AT_XDMAC_CC) & AT_XDMAC_CC_INITD); + rmb(); cur_nda = at_xdmac_chan_read(atchan, AT_XDMAC_CNDA) & 0xfffffffc; rmb();