From patchwork Thu Jan 25 09:39:18 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Asutosh Das (asd)" X-Patchwork-Id: 10183803 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id A5520601D5 for ; Thu, 25 Jan 2018 09:40:06 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 9C41428434 for ; Thu, 25 Jan 2018 09:40:06 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 9052E28A6E; Thu, 25 Jan 2018 09:40:06 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=2.0 tests=BAYES_00,RCVD_IN_DNSWL_HI autolearn=unavailable version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 098D828434 for ; Thu, 25 Jan 2018 09:40:06 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751105AbeAYJjr (ORCPT ); Thu, 25 Jan 2018 04:39:47 -0500 Received: from sabertooth01.qualcomm.com ([65.197.215.72]:48291 "EHLO sabertooth01.qualcomm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750769AbeAYJjo (ORCPT ); Thu, 25 Jan 2018 04:39:44 -0500 X-IronPort-AV: E=Sophos;i="5.46,411,1511856000"; d="scan'208";a="122928289" Received: from unknown (HELO ironmsg02-sd.qualcomm.com) ([10.53.140.142]) by sabertooth01.qualcomm.com with ESMTP; 25 Jan 2018 01:39:43 -0800 X-MGA-submission: =?us-ascii?q?MDFirR8GTW7q6xgoLtzWhl9Qfx8nYv8AHOQKRu?= =?us-ascii?q?WsKPAuVFv8M8yQQgRj1AenIgLi5ZSRrZ2tMhdfdKvicP/x1iOwJBJ4AK?= =?us-ascii?q?SiSXF09o8Hnw7Fias829ek65nvxhEksYihFZdIR79OJORPCpfMryziBz?= =?us-ascii?q?md?= Received: from asutoshd-linux.qualcomm.com ([10.206.24.163]) by ironmsg02-sd.qualcomm.com with ESMTP; 25 Jan 2018 01:39:39 -0800 Received: by asutoshd-linux.qualcomm.com (Postfix, from userid 92687) id BE3EE2243; Thu, 25 Jan 2018 15:09:37 +0530 (IST) From: Asutosh Das To: subhashj@codeaurora.org, cang@codeaurora.org, vivek.gautam@codeaurora.org, vinholikatti@gmail.com, jejb@linux.vnet.ibm.com, martin.petersen@oracle.com Cc: linux-scsi@vger.kernel.org, Venkat Gopalakrishnan , Asutosh Das , linux-kernel@vger.kernel.org (open list) Subject: [PATCH 1/1] scsi: ufs: Add LCC quirk for host and device Date: Thu, 25 Jan 2018 15:09:18 +0530 Message-Id: <1516873158-2900-1-git-send-email-asutoshd@codeaurora.org> X-Mailer: git-send-email 1.9.1 Sender: linux-scsi-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-scsi@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Subhash Jadavani LCC (Line Control Command) is being used for communication between UFS host and UFS device. But some hosts might have the issue with issuing the LCC commands to UFS device and in this case LCC could be explicitly disabled. But there could be a need where we don't want to disable the LCC on both host & device; hence this change splits the quirk in 2 parts one for host and one for device. Signed-off-by: Subhash Jadavani Signed-off-by: Venkat Gopalakrishnan Signed-off-by: Can Guo Signed-off-by: Asutosh Das --- drivers/scsi/ufs/ufshcd.c | 16 ++++++++++++++++ drivers/scsi/ufs/ufshcd.h | 11 +++++++++++ 2 files changed, 27 insertions(+) diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c index 8af2af3..d6fc88d 100644 --- a/drivers/scsi/ufs/ufshcd.c +++ b/drivers/scsi/ufs/ufshcd.c @@ -4121,6 +4121,11 @@ static int ufshcd_disable_tx_lcc(struct ufs_hba *hba, bool peer) return err; } +static inline int ufshcd_disable_host_tx_lcc(struct ufs_hba *hba) +{ + return ufshcd_disable_tx_lcc(hba, false); +} + static inline int ufshcd_disable_device_tx_lcc(struct ufs_hba *hba) { return ufshcd_disable_tx_lcc(hba, true); @@ -4171,6 +4176,17 @@ static int ufshcd_link_startup(struct ufs_hba *hba) /* failed to get the link up... retire */ goto out; + if (hba->quirks & UFSHCD_BROKEN_LCC_PROCESSING_ON_HOST) { + ret = ufshcd_disable_device_tx_lcc(hba); + if (ret) + goto out; + } + + if (hba->quirks & UFSHCD_BROKEN_LCC_PROCESSING_ON_DEVICE) { + ret = ufshcd_disable_host_tx_lcc(hba); + if (ret) + goto out; + } if (link_startup_again) { link_startup_again = false; retries = DME_LINKSTARTUP_RETRIES; diff --git a/drivers/scsi/ufs/ufshcd.h b/drivers/scsi/ufs/ufshcd.h index 1332e54..7a2dad3 100644 --- a/drivers/scsi/ufs/ufshcd.h +++ b/drivers/scsi/ufs/ufshcd.h @@ -591,6 +591,17 @@ struct ufs_hba { */ #define UFSHCD_QUIRK_PRDT_BYTE_GRAN 0x80 + /* + * If UFS device is having issue in processing LCC (Line Control + * Command) coming from UFS host controller then enable this quirk. + * When this quirk is enabled, host controller driver should disable + * the LCC transmission on UFS host controller (by clearing + * TX_LCC_ENABLE attribute of host to 0). + */ + #define UFSHCD_BROKEN_LCC_PROCESSING_ON_DEVICE 0x100 + + #define UFSHCD_BROKEN_LCC_PROCESSING_ON_HOST 0x200 + unsigned int quirks; /* Deviations from standard UFSHCI spec. */ /* Device deviations from standard UFS device spec. */