Received: by 2002:a05:6a10:6d10:0:0:0:0 with SMTP id gq16csp3617473pxb; Tue, 19 Apr 2022 06:41:44 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzY/jtuZ5Ligld+5O2O21TuALs1v7pIKvSJurLPbvxCtnCre55L1IfDf3zOj3fXEnujA93/ X-Received: by 2002:a05:6402:1148:b0:416:a4fb:3c2e with SMTP id g8-20020a056402114800b00416a4fb3c2emr17568411edw.182.1650375704489; Tue, 19 Apr 2022 06:41:44 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1650375704; cv=none; d=google.com; s=arc-20160816; b=mtO/FqUpujob1QThuAYS2TcEocqQ3F9AwA2OJwd/mjYhbP2Px1WQrng9MpLk+M4mWr OJlsBcPbQfdLxkOc8c+jD5+NjYv+BsP3ahCJiYKH78+3n+03zvbRsdrZGJhsChUIFdCT BqZVXYujyCXGZnNmTQKiEGytVF1VqphygYP9dvfMEJOwECeEm+k9EBg5sbiAWgYRm9Ld YEnvm4SyZAVw3u3zxJ4TzKMomPxbSnnE+z903xmmuoPOr6TS+rqdYw86P27vOBI/GzWx zbEuVNrcbg/fRYw2WRyrlDxPtEeyWBFhYgKdgQi+/rUwzgUZJ1ITRnrfCaxh6+eRu2r5 ZUYQ== 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=qqRTkR9JM+g0UnHOQVCGd3lEbyFO7Pm6jCOpwoFwh7A=; b=HABaVsx+9wyRbmPMqGmo67GJItQYdTMFSIUSo3/isIBz8Hx70ZueHG16FBM5BFbmc0 xekTWtIXbCsEXE/5ix0Abhlg7jQ+fQQ+I+jxVa3LvxFMPgaYlI+7MzVBIZ3G1E7JDb03 RCJMyE2hVkTSSPjT9IAQBe0l/uNmy/oyXLR3doxI26vGquY946iOghUQTK6p9KaiiVVQ rxk3+qEEPMy7oszgIMCaDWhNHCfzTg/bQp4HtEfAGTQG36hsYBUa8aXFJp2er4p5Fc5U ETd2lqQ3ZIgObBNDE55nHKApYKEbvjt/wsGLM8pgCrdKJH5JFTNMyI7hunVuDPu2zBxz 6Etg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=nnJ+57sQ; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 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 out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id e8-20020a056402088800b0041cd9ecd96asi7549407edy.625.2022.04.19.06.41.18; Tue, 19 Apr 2022 06:41:44 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=nnJ+57sQ; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 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 S1344599AbiDROaR (ORCPT + 99 others); Mon, 18 Apr 2022 10:30:17 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34588 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1344649AbiDROSM (ORCPT ); Mon, 18 Apr 2022 10:18:12 -0400 Received: from ams.source.kernel.org (ams.source.kernel.org [IPv6:2604:1380:4601:e00::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C6FAA4AE06; Mon, 18 Apr 2022 06:14:04 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id B1CD0B80ED9; Mon, 18 Apr 2022 13:14:02 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id E179EC385A1; Mon, 18 Apr 2022 13:14:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1650287641; bh=qt6zVlScKlgp/UWRwAPjnLop5XpVwyg8xY7P3/aVvDE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=nnJ+57sQLw9TTWi6ZLCIS85lyH4woaMMUSSsAu275DVhtNex7QseKDJS4tubirERM WhEGz4EURSL58aVLHg2l0LOCbS64XjPUHbwu/eghY5IOS/gMJWwVqdeGmPSwOp6Ont jO9HxVYZtSbAOkVmLdgfE6rIjrfdOgCTWgJdEOLw= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, =?UTF-8?q?Martin=20Povi=C5=A1er?= , Sven Peter , Wolfram Sang Subject: [PATCH 4.9 217/218] i2c: pasemi: Wait for write xfers to finish Date: Mon, 18 Apr 2022 14:14:43 +0200 Message-Id: <20220418121208.591340114@linuxfoundation.org> X-Mailer: git-send-email 2.35.3 In-Reply-To: <20220418121158.636999985@linuxfoundation.org> References: <20220418121158.636999985@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-7.7 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_HI, SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Martin Povišer commit bd8963e602c77adc76dbbbfc3417c3cf14fed76b upstream. Wait for completion of write transfers before returning from the driver. At first sight it may seem advantageous to leave write transfers queued for the controller to carry out on its own time, but there's a couple of issues with it: * Driver doesn't check for FIFO space. * The queued writes can complete while the driver is in its I2C read transfer path which means it will get confused by the raising of XEN (the 'transaction ended' signal). This can cause a spurious ENODATA error due to premature reading of the MRXFIFO register. Adding the wait fixes some unreliability issues with the driver. There's some efficiency cost to it (especially with pasemi_smb_waitready doing its polling), but that will be alleviated once the driver receives interrupt support. Fixes: beb58aa39e6e ("i2c: PA Semi SMBus driver") Signed-off-by: Martin Povišer Reviewed-by: Sven Peter Signed-off-by: Wolfram Sang Signed-off-by: Greg Kroah-Hartman --- drivers/i2c/busses/i2c-pasemi.c | 6 ++++++ 1 file changed, 6 insertions(+) --- a/drivers/i2c/busses/i2c-pasemi.c +++ b/drivers/i2c/busses/i2c-pasemi.c @@ -145,6 +145,12 @@ static int pasemi_i2c_xfer_msg(struct i2 TXFIFO_WR(smbus, msg->buf[msg->len-1] | (stop ? MTXFIFO_STOP : 0)); + + if (stop) { + err = pasemi_smb_waitready(smbus); + if (err) + goto reset_out; + } } return 0;