Received: by 2002:a25:31c3:0:0:0:0:0 with SMTP id x186csp260893ybx; Thu, 31 Oct 2019 20:01:03 -0700 (PDT) X-Google-Smtp-Source: APXvYqxngttVnpZeNK/nnN4ivPsX7k0kQmWjL+lCWsuBTj+v8r3mEvrSIYKxgfqD77dd0QvlDvAC X-Received: by 2002:a17:906:8046:: with SMTP id x6mr7418563ejw.221.1572577263720; Thu, 31 Oct 2019 20:01:03 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1572577263; cv=none; d=google.com; s=arc-20160816; b=pAX6deXJbta+8PGxXypekHdpjz+8P3YQMT07vjY7v25er2mLW3yuwC5GYUSEIwBuSx +dBdR1/2Rybr9iLcxWG0YrJewQZcgiA4ecrxYyscpaLeQJCDeRYrr6jKhlYXejYKTtp0 5iyzb3/GLM/KGwumOtZ+q0O2jAwAQYLnEJFjtT6vdsgXotiTDCX9+wIhDBmgnAeDjH7M Y1OgSrPFqm5L3C7Eo/x4QmxOgTlC282PYL8BKsF7PhOlLo418RK+6vvBhI7yJtIP6TKM vihftQBhZem7Aciyz2CsyikQVtfdYAkRJ/A2k+S+gn/t/NvXVLGESljkgqSFNko0VEDd IcVg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dmarc-filter:dkim-signature:dkim-signature; bh=7pRpjWu6usHNRXC5ZEgnypTU8kvzROECRfIPmzWg+Qk=; b=cBGZL/vI9fneclvZa81vKq47fglJYUDhblpY8VIF3Ky30WQLYDCOfGTWxjWFMVPZCU PiHFPlpyPuoNLKttxyQv9uDJOLy7UtqpOOelzO4Hl24/MKhr+y5XblaVQI9IhRXX/4Pf wVXwvMhFVPoZYJZ6fj25nOr0NdjWfhCEtlMpDND0lXMI+ujmCRW78oF3YzoNOBtrW5ns eCtgUVpObvltpObtNdgPk+y4vWY+ba9F37ZRxJv+u1ij7ZvHCHAAdri+4eo7ng/lZ9ZG x9jlvKZKBX5krguWCVlZnMTuXDYTUtyjVE5uCcgTVPpsb7xU1jxGOj7b8ASOy7tF1T+j XIZw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@codeaurora.org header.s=default header.b=WcXfqTa9; dkim=pass header.i=@codeaurora.org header.s=default header.b=AcnIQkFY; 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 q18si5633578eda.291.2019.10.31.20.00.40; Thu, 31 Oct 2019 20:01:03 -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=WcXfqTa9; dkim=pass header.i=@codeaurora.org header.s=default header.b=AcnIQkFY; 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 S1729091AbfKACwl (ORCPT + 99 others); Thu, 31 Oct 2019 22:52:41 -0400 Received: from smtp.codeaurora.org ([198.145.29.96]:41664 "EHLO smtp.codeaurora.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727332AbfKACwk (ORCPT ); Thu, 31 Oct 2019 22:52:40 -0400 Received: by smtp.codeaurora.org (Postfix, from userid 1000) id BA17660BEB; Fri, 1 Nov 2019 02:52:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1572576759; bh=x58V+NunLYh/zmTR/UxfKwPy55GnEu+CaVGBp6CoDvI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=WcXfqTa9eSjKVggL6ZlpbI/Lw6rJMVwrnTUraKve080xqM0rFB3aBMMbwjX5lsVPG XfW+4AuQTQ4vchi8o+FDVVsoi+eRbDylSjxgovVxnJof/uQIVdeSftRPVAvTBB03lD 2qGPbIYUuZ79iGeZzK4aZPfn2s2fzuEePI9BbPBA= 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.7 required=2.0 tests=ALL_TRUSTED,BAYES_00, DKIM_INVALID,DKIM_SIGNED,SPF_NONE autolearn=no autolearn_force=no version=3.4.0 Received: from pacamara-linux.qualcomm.com (i-global254.qualcomm.com [199.106.103.254]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: cang@smtp.codeaurora.org) by smtp.codeaurora.org (Postfix) with ESMTPSA id D0FEC60913; Fri, 1 Nov 2019 02:52:36 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1572576757; bh=x58V+NunLYh/zmTR/UxfKwPy55GnEu+CaVGBp6CoDvI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=AcnIQkFYMc3hFZoMM+IOHQ4rLINNZxhYtZqCdbDffMO+AwKZ77baNi9dRrrw9lH1d pXOTBU6RGQ2184iXz0dJZiGeoWN4Ac/5N/ikI70nlNJ2PFlNplDGTosKkGO30oaK1j H1kg9oI8TAGFqrsWvdMYNbSdXWp3VymwGwrobMZA= DMARC-Filter: OpenDMARC Filter v1.3.2 smtp.codeaurora.org D0FEC60913 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=cang@codeaurora.org From: Can Guo To: asutoshd@codeaurora.org, nguyenb@codeaurora.org, rnayak@codeaurora.org, linux-scsi@vger.kernel.org, kernel-team@android.com, saravanak@google.com, salyzyn@google.com, cang@codeaurora.org Cc: Alim Akhtar , Avri Altman , Pedro Sousa , "James E.J. Bottomley" , "Martin K. Petersen" , Stanley Chu , Bean Huo , Tomas Winkler , Subhash Jadavani , Bjorn Andersson , Arnd Bergmann , linux-kernel@vger.kernel.org (open list) Subject: [PATCH v2 2/2] scsi: ufs: Do not rely on prefetched data Date: Thu, 31 Oct 2019 19:52:05 -0700 Message-Id: <1572576725-31092-3-git-send-email-cang@codeaurora.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1572576725-31092-1-git-send-email-cang@codeaurora.org> References: <1572576725-31092-1-git-send-email-cang@codeaurora.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org We were setting bActiveICCLevel attribute for UFS device only once but type of this attribute has changed from persistent to volatile since UFS device specification v2.1. This attribute is set to the default value after power cycle or hardware reset event. It isn't safe to rely on prefetched data (only used for bActiveICCLevel attribute now). Hence this change removes the code related to data prefetching and set this parameter on every attempt to probe the UFS device. Signed-off-by: Can Guo --- drivers/scsi/ufs/ufshcd.c | 30 +++++++++++++++--------------- drivers/scsi/ufs/ufshcd.h | 13 ------------- 2 files changed, 15 insertions(+), 28 deletions(-) diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c index 54ae643..fe31586 100644 --- a/drivers/scsi/ufs/ufshcd.c +++ b/drivers/scsi/ufs/ufshcd.c @@ -6424,11 +6424,12 @@ static u32 ufshcd_find_max_sup_active_icc_level(struct ufs_hba *hba, return icc_level; } -static void ufshcd_init_icc_levels(struct ufs_hba *hba) +static void ufshcd_set_active_icc_lvl(struct ufs_hba *hba) { int ret; int buff_len = hba->desc_size.pwr_desc; u8 *desc_buf; + u32 icc_level; desc_buf = kmalloc(buff_len, GFP_KERNEL); if (!desc_buf) @@ -6442,20 +6443,17 @@ static void ufshcd_init_icc_levels(struct ufs_hba *hba) goto out; } - hba->init_prefetch_data.icc_level = - ufshcd_find_max_sup_active_icc_level(hba, - desc_buf, buff_len); - dev_dbg(hba->dev, "%s: setting icc_level 0x%x", - __func__, hba->init_prefetch_data.icc_level); + icc_level = ufshcd_find_max_sup_active_icc_level(hba, desc_buf, + buff_len); + dev_dbg(hba->dev, "%s: setting icc_level 0x%x", __func__, icc_level); ret = ufshcd_query_attr_retry(hba, UPIU_QUERY_OPCODE_WRITE_ATTR, - QUERY_ATTR_IDN_ACTIVE_ICC_LVL, 0, 0, - &hba->init_prefetch_data.icc_level); + QUERY_ATTR_IDN_ACTIVE_ICC_LVL, 0, 0, &icc_level); if (ret) dev_err(hba->dev, "%s: Failed configuring bActiveICCLevel = %d ret = %d", - __func__, hba->init_prefetch_data.icc_level , ret); + __func__, icc_level, ret); out: kfree(desc_buf); @@ -6963,6 +6961,14 @@ static int ufshcd_probe_hba(struct ufs_hba *hba) } } + /* + * bActiveICCLevel is volatile for UFS device (as per latest v2.1 spec) + * and for removable UFS card as well, hence always set the parameter. + * Note: Error handler may issue the device reset hence resetting + * bActiveICCLevel as well so it is always safe to set this here. + */ + ufshcd_set_active_icc_lvl(hba); + /* set the state as operational after switching to desired gear */ hba->ufshcd_state = UFSHCD_STATE_OPERATIONAL; @@ -6979,9 +6985,6 @@ static int ufshcd_probe_hba(struct ufs_hba *hba) QUERY_FLAG_IDN_PWR_ON_WPE, &flag)) hba->dev_info.f_power_on_wp_en = flag; - if (!hba->is_init_prefetch) - ufshcd_init_icc_levels(hba); - /* Add required well known logical units to scsi mid layer */ if (ufshcd_scsi_add_wlus(hba)) goto out; @@ -7006,9 +7009,6 @@ static int ufshcd_probe_hba(struct ufs_hba *hba) pm_runtime_put_sync(hba->dev); } - if (!hba->is_init_prefetch) - hba->is_init_prefetch = true; - out: /* * If we failed to initialize the device or the device is not diff --git a/drivers/scsi/ufs/ufshcd.h b/drivers/scsi/ufs/ufshcd.h index e0fe247..3089b81 100644 --- a/drivers/scsi/ufs/ufshcd.h +++ b/drivers/scsi/ufs/ufshcd.h @@ -405,15 +405,6 @@ struct ufs_clk_scaling { bool is_suspended; }; -/** - * struct ufs_init_prefetch - contains data that is pre-fetched once during - * initialization - * @icc_level: icc level which was read during initialization - */ -struct ufs_init_prefetch { - u32 icc_level; -}; - #define UFS_ERR_REG_HIST_LENGTH 8 /** * struct ufs_err_reg_hist - keeps history of errors @@ -505,8 +496,6 @@ struct ufs_stats { * @intr_mask: Interrupt Mask Bits * @ee_ctrl_mask: Exception event control mask * @is_powered: flag to check if HBA is powered - * @is_init_prefetch: flag to check if data was pre-fetched in initialization - * @init_prefetch_data: data pre-fetched during initialization * @eh_work: Worker to handle UFS errors that require s/w attention * @eeh_work: Worker to handle exception events * @errors: HBA errors @@ -657,8 +646,6 @@ struct ufs_hba { u32 intr_mask; u16 ee_ctrl_mask; bool is_powered; - bool is_init_prefetch; - struct ufs_init_prefetch init_prefetch_data; /* Work Queues */ struct work_struct eh_work; -- The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project