Received: by 10.213.65.68 with SMTP id h4csp46986imn; Mon, 12 Mar 2018 06:18:53 -0700 (PDT) X-Google-Smtp-Source: AG47ELuHrJPL2y9fMRjl+Zd+Rk7ErZmtcmO5JEiRWVdf7Ux+zjoGcBTUg/mQC8LUbWhPW4KkLOAk X-Received: by 10.99.182.10 with SMTP id j10mr6624978pgf.122.1520860733345; Mon, 12 Mar 2018 06:18:53 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1520860733; cv=none; d=google.com; s=arc-20160816; b=jtKtn/HZlCRDZiOdQWNATnTfGK0wlm2Mg88meo7iQxRZRmK8Bsv0pNDCwE0fKhu42w zAi7aNUmDQ0Jiihj6/eKCrDF96BMF0WdMJ2nK4YtBpmFeZoOOhiq24bDQ5iSDCVFIT3J YwsP/Q+8JWC6EAb9/0jmW49jVwgv7jGvxC3aeV5fQQEjJYd9/lCppnXGvsYKMOK2s21B PtLvpq6mprt0iQ+4+EyzYPvgf2Uh1Elh3tytK2FIOrFjphHvo5r14NFPoPt+nasVk3XW pJ3zMhTWIfTlRiThlYNlVRt4sLEiB060rAMStgP14lTay+RY6k1DWho+xlfz6n7KyDfT VQuw== 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 :references:in-reply-to:message-id:date:subject:cc:to:from :dmarc-filter:dkim-signature:dkim-signature :arc-authentication-results; bh=f6rz+QZ+P8KbWFsOYQQ4QRHxb2nKocdy1OSrotCsp7s=; b=KdiKvxMCDPuAk9xYmWqcK3PUx4uDP47/DUFGDw9XiGltqfOVKg/kzpKorRhMESgq2/ m16s10UhuDp1xWpMSuZ3fv4EbvjRIKX0ZgxRPAFL6sKl2et0F4lVO8ZCboTdGAZ6OOx4 nI8KXckr1f8jg2Q1wabX/AOsBArcBuKnM2+N+DugeVM1mazd9OkcfAtu1WLa7usDjgtt Ht7KCQwGtiNwzhXgPRIr9jzW8nnnTjXqYd+w35VGIgfO59ClDA6rxJJRnbpoFTOBl1mQ xGgkJi0awrYoWCy0eNvI6uF6/gQwv8AGwMch0bBU21qz4Psxx5p5hDmLdwLMgn7nQEXd cjbw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@codeaurora.org header.s=default header.b=XQ8j7FTu; dkim=pass header.i=@codeaurora.org header.s=default header.b=VbDnWanq; 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 7-v6si829545ple.604.2018.03.12.06.18.39; Mon, 12 Mar 2018 06:18:53 -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; dkim=pass header.i=@codeaurora.org header.s=default header.b=XQ8j7FTu; dkim=pass header.i=@codeaurora.org header.s=default header.b=VbDnWanq; 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 S932313AbeCLNPt (ORCPT + 99 others); Mon, 12 Mar 2018 09:15:49 -0400 Received: from smtp.codeaurora.org ([198.145.29.96]:42018 "EHLO smtp.codeaurora.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932222AbeCLNPp (ORCPT ); Mon, 12 Mar 2018 09:15:45 -0400 Received: by smtp.codeaurora.org (Postfix, from userid 1000) id 4E50E6070A; Mon, 12 Mar 2018 13:15:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1520860544; bh=VWpTw5l6Y8RJ+QZeaI8GY1fCQLI88IhVq2axlgotOTY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=XQ8j7FTuSBzcs+U9WiS++9XM9JvBwJo28UsUm54chh+fDmqtdw4fq+MrIUzqFByZZ XuYB8zXgeUjJPB5oHt4+CwUUqXuzM2cFf2HrQLt9q/c1qeHXS30fxphVKn7qkAjH+l PuGL1P92Z8iVLzGemGMJzb7PSFQy4IuKFU467dLQ= X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on pdx-caf-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.8 required=2.0 tests=ALL_TRUSTED,BAYES_00, DKIM_SIGNED,T_DKIM_INVALID autolearn=no autolearn_force=no version=3.4.0 Received: from absahu-linux.qualcomm.com (blr-c-bdr-fw-01_globalnat_allzones-outside.qualcomm.com [103.229.19.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: absahu@smtp.codeaurora.org) by smtp.codeaurora.org (Postfix) with ESMTPSA id 43F4E60849; Mon, 12 Mar 2018 13:15:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1520860543; bh=VWpTw5l6Y8RJ+QZeaI8GY1fCQLI88IhVq2axlgotOTY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=VbDnWanqvIpsgHZFbOy5hzdhKobmqL8yhrrgQioDEbBwB7nW4HHCA2ybqAPiV3zEK e7l4bTjCjtBfyfXWfQIYBaXreBSt4OZNsIhNp4w6jbIfqizWtgmjbidZztl8553VXF Z0NWh7vd7siE4bOqbXr6SgMiJxTREcVJ/ZzezHLk= DMARC-Filter: OpenDMARC Filter v1.3.2 smtp.codeaurora.org 43F4E60849 Authentication-Results: pdx-caf-mail.web.codeaurora.org; dmarc=none (p=none dis=none) header.from=codeaurora.org Authentication-Results: pdx-caf-mail.web.codeaurora.org; spf=none smtp.mailfrom=absahu@codeaurora.org From: Abhishek Sahu To: Andy Gross , Wolfram Sang Cc: David Brown , Sricharan R , Austin Christ , linux-arm-msm@vger.kernel.org, linux-soc@vger.kernel.org, linux-i2c@vger.kernel.org, linux-kernel@vger.kernel.org, Abhishek Sahu Subject: [PATCH v2 07/13] i2c: qup: proper error handling for i2c error in BAM mode Date: Mon, 12 Mar 2018 18:44:56 +0530 Message-Id: <1520860502-14886-8-git-send-email-absahu@codeaurora.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1520860502-14886-1-git-send-email-absahu@codeaurora.org> References: <1520860502-14886-1-git-send-email-absahu@codeaurora.org> 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 Currently the i2c error handling in BAM mode is not working properly in stress condition. 1. After an error, the FIFO are being written with FLUSH and EOT tags which should not be required since already these tags have been written in BAM descriptor itself. 2. QUP state is being moved to RESET in IRQ handler in case of error. When QUP HW encounters an error in BAM mode then it moves the QUP STATE to PAUSE state. In this case, I2C_FLUSH command needs to be executed while moving to RUN_STATE by writing to the QUP_STATE register with the I2C_FLUSH bit set to 1. 3. In Error case, sometimes, QUP generates more than one interrupt which will trigger the complete again. After an error, the flush operation will be scheduled after doing reinit_completion which should be triggered by BAM IRQ callback. If the second QUP IRQ comes during this time then it will call the complete and the transfer function will assume the all the BAM HW descriptors have been completed. 4. The release DMA is being called after each error which will free the DMA tx and rx channels. The error like NACK is very common in I2C transfer and every time this will be overhead. Now, since the error handling is proper so this release channel can be completely avoided. Signed-off-by: Abhishek Sahu Reviewed-by: Sricharan R Reviewed-by: Austin Christ --- * Changes from v1: None drivers/i2c/busses/i2c-qup.c | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/drivers/i2c/busses/i2c-qup.c b/drivers/i2c/busses/i2c-qup.c index 73a2880..d16361d 100644 --- a/drivers/i2c/busses/i2c-qup.c +++ b/drivers/i2c/busses/i2c-qup.c @@ -219,9 +219,24 @@ static irqreturn_t qup_i2c_interrupt(int irq, void *dev) if (bus_err) writel(bus_err, qup->base + QUP_I2C_STATUS); + /* + * Check for BAM mode and returns if already error has come for current + * transfer. In Error case, sometimes, QUP generates more than one + * interrupt. + */ + if (qup->use_dma && (qup->qup_err || qup->bus_err)) + return IRQ_HANDLED; + /* Reset the QUP State in case of error */ if (qup_err || bus_err) { - writel(QUP_RESET_STATE, qup->base + QUP_STATE); + /* + * Don’t reset the QUP state in case of BAM mode. The BAM + * flush operation needs to be scheduled in transfer function + * which will clear the remaining schedule descriptors in BAM + * HW FIFO and generates the BAM interrupt. + */ + if (!qup->use_dma) + writel(QUP_RESET_STATE, qup->base + QUP_STATE); goto done; } @@ -847,20 +862,12 @@ static int qup_i2c_bam_do_xfer(struct qup_i2c_dev *qup, struct i2c_msg *msg, goto desc_err; } - if (rx_cnt) - writel(QUP_BAM_INPUT_EOT, - qup->base + QUP_OUT_FIFO_BASE); - - writel(QUP_BAM_FLUSH_STOP, qup->base + QUP_OUT_FIFO_BASE); - qup_i2c_flush(qup); /* wait for remaining interrupts to occur */ if (!wait_for_completion_timeout(&qup->xfer, HZ)) dev_err(qup->dev, "flush timed out\n"); - qup_i2c_rel_dma(qup); - ret = (qup->bus_err & QUP_I2C_NACK_FLAG) ? -ENXIO : -EIO; } -- QUALCOMM INDIA, on behalf of Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by The Linux Foundation