Received: by 2002:ac0:a5b6:0:0:0:0:0 with SMTP id m51-v6csp577846imm; Fri, 1 Jun 2018 06:12:46 -0700 (PDT) X-Google-Smtp-Source: ADUXVKL2C/KDk2NS2T/MYLZ8RSbeAsQQ0UTDWHgEbt5XVVW9WquDUcfmghqhX/d1mBIxKK/Ooe0J X-Received: by 2002:a17:902:6bca:: with SMTP id m10-v6mr11084701plt.6.1527858766008; Fri, 01 Jun 2018 06:12:46 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1527858765; cv=none; d=google.com; s=arc-20160816; b=Ll0Wh45q3k7Xv8/jocfN9ObUkOK/lEHMRuc5IDedCt6YL84eaP6/3VyeApuf6gwPjD 7bORQALE781pcR5LgaujL+Iy9zGRsz7q8ivMtZuvUuo6tPek9O0zwn7j7bzbvvsMG3W9 RjVDikuL6Xa+8CjZeDHpYy2ePLF+dR7fPAwNbgHuskiwgBI0KnyF7tKB6DcrFgmgWc0Z gjx7eDBDYYHBmeqzKwXbOyaSzdNgeWh1B6lOo56rTN7ocTnoHXWaXAZawAVE3kx4ZJbr hVnUhc8t2BbC6Pig5nn370OZxuwfAJ555SUPcQoxQ61klC0B/5lj6r/PSHG9quYqWz/1 QETA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-language:thread-index :content-transfer-encoding:mime-version:message-id:date:subject :in-reply-to:references:cc:to:from:dmarc-filter:dkim-signature :dkim-signature:arc-authentication-results; bh=cThMVzp1uoYoIG/V0Ft/9jqDBbgIyXQqMTID/CSGeTU=; b=h725y43HrrOic+jr97uZpnkA9O9TeagcfMg1FRw5W8QiYhIVs2W16OxQWAlhZR3q0E D2YKpZ/IRIrygi7ATRY11wtzsnyHc7kOlk6b6BhsM7tTWMyYTbUTqkIBxfyw5Jcs8p79 dX4lNtKPol8nVNfgaWc0mlGVH5TuSy/bOd2VncTQfRUbL2okoCGokI+NYUOk8m3ZtPZ7 Ue03TP1UR65sfbsaDFbWPByduDqwwyVAnBghTlVuYwz+cESS/3dP6rBIR2Rv4b/Ng+WK QNk3fpAzsELEWd6RGgBqjn2HJ4PvXvOkmeOA32cfpSmPHFDcXIKolQ9+70sgkI2SDsIF uczA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@codeaurora.org header.s=default header.b=OCm0SvmD; dkim=pass header.i=@codeaurora.org header.s=default header.b=ChTEtybr; 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 m13-v6si635697pfh.92.2018.06.01.06.12.31; Fri, 01 Jun 2018 06:12:45 -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=OCm0SvmD; dkim=pass header.i=@codeaurora.org header.s=default header.b=ChTEtybr; 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 S1751733AbeFANMG (ORCPT + 99 others); Fri, 1 Jun 2018 09:12:06 -0400 Received: from smtp.codeaurora.org ([198.145.29.96]:45600 "EHLO smtp.codeaurora.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750852AbeFANMC (ORCPT ); Fri, 1 Jun 2018 09:12:02 -0400 Received: by smtp.codeaurora.org (Postfix, from userid 1000) id 1461360769; Fri, 1 Jun 2018 13:12:02 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1527858722; bh=Z4E6C3reOs90G7DLOXzaNwQ1OmsTac2WiXmlEac8hqc=; h=From:To:Cc:References:In-Reply-To:Subject:Date:From; b=OCm0SvmDedJbdpOwCPq25CwOHKURYckQQOoDSj0ufiS2mJalXKBv02iNmfs7aZCgG kd95OxVP9bjGcxAiB+ogfnV0Hgc0r/o7vj7wxyJPMC1HnPRGH7KsELL79F61RScHkR CYTKVJP0D98TlV26cT9QzoibzSewx0OBiHqrPo/g= 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=-0.6 required=2.0 tests=ALL_TRUSTED,BAYES_00, DKIM_SIGNED,TVD_RCVD_SINGLE,T_DKIM_INVALID autolearn=no autolearn_force=no version=3.4.0 Received: from SAYALIL (blr-c-bdr-fw-01_globalnat_allzones-outside.qualcomm.com [103.229.19.19]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) (Authenticated sender: sayalil@smtp.codeaurora.org) by smtp.codeaurora.org (Postfix) with ESMTPSA id 3B58D60452; Fri, 1 Jun 2018 13:11:56 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1527858720; bh=Z4E6C3reOs90G7DLOXzaNwQ1OmsTac2WiXmlEac8hqc=; h=From:To:Cc:References:In-Reply-To:Subject:Date:From; b=ChTEtybrf4spPq4oW5g2zfbJR4ygNbxZVUdtx4JovZWwAP6AnIkzw9QTWFlVp14wC uIIfq+WvoBpqWfCieRH9nbp9CefwPwvMtQnwxF+zNN86W6hZYw4qdjNA58PkCKeY0F aAjjuB8LRaXmmCS2rlvaN33y9dLyt6vqLXfoMkCs= DMARC-Filter: OpenDMARC Filter v1.3.2 smtp.codeaurora.org 3B58D60452 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=sayalil@codeaurora.org From: "sayali" To: "'Adrian Hunter'" , , , , , , , , , Cc: , "'open list'" References: <1527849774-7623-1-git-send-email-sayalil@codeaurora.org> <1527849774-7623-2-git-send-email-sayalil@codeaurora.org> In-Reply-To: Subject: RE: [PATCH V1 1/3] scsi: ufs: set the device reference clock setting Date: Fri, 1 Jun 2018 18:41:54 +0530 Message-ID: <001201d3f9aa$20146380$603d2a80$@codeaurora.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Mailer: Microsoft Outlook 16.0 Thread-Index: AQKGja9h2+sAa9B7VDYjBpPLWNjYigKV7YTZAxm7W6CiuLkNkA== Content-Language: en-us Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Adrain, Updated my comments inline. Please check. Thanks, Sayali -----Original Message----- From: Adrian Hunter [mailto:adrian.hunter@intel.com]=20 Sent: Friday, June 01, 2018 5:59 PM To: Sayali Lokhande ; subhashj@codeaurora.org; = cang@codeaurora.org; vivek.gautam@codeaurora.org; rnayak@codeaurora.org; = vinholikatti@gmail.com; jejb@linux.vnet.ibm.com; = martin.petersen@oracle.com; asutoshd@codeaurora.org; = evgreen@chromium.org Cc: linux-scsi@vger.kernel.org; open list Subject: Re: [PATCH V1 1/3] scsi: ufs: set the device reference clock = setting On 01/06/18 13:42, Sayali Lokhande wrote: > From: Subhash Jadavani >=20 > UFS host supplies the reference clock to UFS device and UFS device=20 > specification allows host to provide one of the 4 frequencies (19.2=20 > MHz, > 26 MHz, 38.4 MHz, 52 MHz) for reference clock. Host should set the=20 > device reference clock frequency setting in the device based on what=20 > frequency it is supplying to UFS device. >=20 > Signed-off-by: Subhash Jadavani > [cang@codeaurora.org: Resolved trivial merge conflicts] > Signed-off-by: Can Guo > Signed-off-by: Sayali Lokhande > --- > drivers/scsi/ufs/ufs.h | 9 +++++++ > drivers/scsi/ufs/ufshcd.c | 62=20 > +++++++++++++++++++++++++++++++++++++++++++++++ > drivers/scsi/ufs/ufshcd.h | 1 + > 3 files changed, 72 insertions(+) >=20 > diff --git a/drivers/scsi/ufs/ufs.h b/drivers/scsi/ufs/ufs.h index=20 > 14e5bf7..e15deb0 100644 > --- a/drivers/scsi/ufs/ufs.h > +++ b/drivers/scsi/ufs/ufs.h > @@ -378,6 +378,15 @@ enum query_opcode { > UPIU_QUERY_OPCODE_TOGGLE_FLAG =3D 0x8, > }; > =20 > +/* bRefClkFreq attribute values */ > +enum ref_clk_freq { > + REF_CLK_FREQ_19_2_MHZ =3D 0x0, > + REF_CLK_FREQ_26_MHZ =3D 0x1, > + REF_CLK_FREQ_38_4_MHZ =3D 0x2, > + REF_CLK_FREQ_52_MHZ =3D 0x3, > + REF_CLK_FREQ_MAX =3D REF_CLK_FREQ_52_MHZ, > +}; > + > /* Query response result code */ > enum { > QUERY_RESULT_SUCCESS =3D 0x00, > diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c=20 > index c5b1bf1..3669bc4 100644 > --- a/drivers/scsi/ufs/ufshcd.c > +++ b/drivers/scsi/ufs/ufshcd.c > @@ -6297,6 +6297,63 @@ static void ufshcd_def_desc_sizes(struct=20 > ufs_hba *hba) } > =20 > /** > + * ufshcd_set_dev_ref_clk - set the device bRefClkFreq > + * @hba: per-adapter instance > + * @ref_clk_freq: refrerence clock frequency to be set > + * > + * Read the current value of the bRefClkFreq attribute from device=20 > +and update it > + * if host is supplying different reference clock frequency than one=20 > +mentioned > + * in bRefClkFreq attribute. > + * > + * Returns zero on success, non-zero error value on failure. > + */ > +static int ufshcd_set_dev_ref_clk(struct ufs_hba *hba, u32=20 > +ref_clk_freq) { > + int err =3D 0; > + int ref_clk =3D -1; > + static const char * const ref_clk_freqs[] =3D {"19.2 MHz", "26 MHz", > + "38.4 MHz", "52 MHz"}; > + > + hba->dev_ref_clk_freq =3D ref_clk_freq; > + err =3D ufshcd_query_attr_retry(hba, UPIU_QUERY_OPCODE_READ_ATTR, > + QUERY_ATTR_IDN_REF_CLK_FREQ, 0, 0, &ref_clk); > + > + if (err) { > + dev_err(hba->dev, "%s: failed reading bRefClkFreq. err =3D %d\n", > + __func__, err); > + goto out; > + } > + > + if ((ref_clk < 0) || (ref_clk > REF_CLK_FREQ_52_MHZ)) { If you used u32 ref_clk then you wouldn't have to check < 0, also you = should use REF_CLK_FREQ_MAX not REF_CLK_FREQ_52_MHZ, but really why is = this check needed anyway? [Sayali] Here ref_clk is defined as integer with value -1. We are then = reading bRefClkFreq attribute from device into ref_clk and hence the = sanity check is required before we update/write bRefClkFreq attribute. > + dev_err(hba->dev, "%s: invalid ref_clk setting =3D %d\n", > + __func__, ref_clk); > + err =3D -EINVAL; > + goto out; > + } > + > + if (ref_clk =3D=3D hba->dev_ref_clk_freq) > + goto out; /* nothing to update */ > + > + err =3D ufshcd_query_attr_retry(hba, UPIU_QUERY_OPCODE_WRITE_ATTR, > + QUERY_ATTR_IDN_REF_CLK_FREQ, 0, 0, > + &hba->dev_ref_clk_freq); > + > + if (err) > + dev_err(hba->dev, "%s: bRefClkFreq setting to %s failed\n", > + __func__, ref_clk_freqs[hba->dev_ref_clk_freq]); > + else > + /* > + * It is good to print this out here to debug any later failures > + * related to gear switch. > + */ > + dev_info(hba->dev, "%s: bRefClkFreq setting to %s succeeded\n", > + __func__, ref_clk_freqs[hba->dev_ref_clk_freq]); Why not make this dev_dbg and print always even when there is no update. [Sayali] Agreed. Will update in next patchsets. > + > +out: > + return err; > +} > + > +/** > * ufshcd_probe_hba - probe hba to detect device and initialize > * @hba: per-adapter instance > * > @@ -6361,6 +6418,11 @@ static int ufshcd_probe_hba(struct ufs_hba = *hba) > "%s: Failed getting max supported power mode\n", > __func__); > } else { > + /* > + * Set the right value to bRefClkFreq before attempting to > + * switch to HS gears. > + */ > + ufshcd_set_dev_ref_clk(hba, REF_CLK_FREQ_19_2_MHZ); > ret =3D ufshcd_config_pwr_mode(hba, &hba->max_pwr_info.info); > if (ret) { > dev_err(hba->dev, "%s: Failed setting power mode, err =3D %d\n",=20 > diff --git a/drivers/scsi/ufs/ufshcd.h b/drivers/scsi/ufs/ufshcd.h=20 > index 8110dcd..b026ad8 100644 > --- a/drivers/scsi/ufs/ufshcd.h > +++ b/drivers/scsi/ufs/ufshcd.h > @@ -548,6 +548,7 @@ struct ufs_hba { > void *priv; > unsigned int irq; > bool is_irq_enabled; > + u32 dev_ref_clk_freq; > =20 > /* Interrupt aggregation support is broken */ > #define UFSHCD_QUIRK_BROKEN_INTR_AGGR 0x1 >=20