linux-arm-msm.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Santosh Y <santoshsy@gmail.com>
To: Dolev Raviv <draviv@codeaurora.org>
Cc: Jej B <James.Bottomley@hansenpartnership.com>,
	linux-scsi <linux-scsi@vger.kernel.org>,
	linux-scsi-owner@vger.kernel.org,
	Sujit Reddy Thumma <sthumma@codeaurora.org>,
	linux-arm-msm@vger.kernel.org,
	Raviv Shvili <rshvili@codeaurora.org>
Subject: Re: [PATCH V1 3/4] scsi: ufs: Logical Unit (LU) command queue depth
Date: Wed, 4 Jun 2014 09:01:39 +0530	[thread overview]
Message-ID: <CALMYJDtsgtko06Uh4xk8Mu6d1kBq=_AXca6pdKy7MoT--OAfwA@mail.gmail.com> (raw)
In-Reply-To: <1401175312-17753-4-git-send-email-draviv@codeaurora.org>

On Tue, May 27, 2014 at 12:51 PM, Dolev Raviv <draviv@codeaurora.org> wrote:
> Some of the UFS devices may support different number of commands
> that can be queued per LU. At the current implementation,
> SW configure each of the UFS devices LU's according to the
> controller capability.
>
> In this patch the queue depth available per LU is read and updated in
> the LU's SW structure.
>
> Signed-off-by: Dolev Raviv <draviv@codeaurora.org>
> Signed-off-by: Raviv Shvili <rshvili@codeaurora.org>
> ---
>  drivers/scsi/ufs/ufs.h    | 21 +++++++++++++++++++++
>  drivers/scsi/ufs/ufshcd.c | 45 ++++++++++++++++++++++++++++++++++++++++++++-
>  2 files changed, 65 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/scsi/ufs/ufs.h b/drivers/scsi/ufs/ufs.h
> index 1545cd7..fafcf5e 100644
> --- a/drivers/scsi/ufs/ufs.h
> +++ b/drivers/scsi/ufs/ufs.h
> @@ -132,6 +132,27 @@ enum desc_idn {
>         QUERY_DESC_IDN_RFU_2            = 0x9,
>  };
>
> +#define UNIT_DESC_MAX_SIZE       0x22
> +/* Unit descriptor parameters offsets in bytes*/
> +enum unit_desc_param {
> +       UNIT_DESC_PARAM_LEN                     = 0x0,
> +       UNIT_DESC_PARAM_TYPE                    = 0x1,
> +       UNIT_DESC_PARAM_UNIT_INDEX              = 0x2,
> +       UNIT_DESC_PARAM_LU_ENABLE               = 0x3,
> +       UNIT_DESC_PARAM_BOOT_LUN_ID             = 0x4,
> +       UNIT_DESC_PARAM_LU_WR_PROTECT           = 0x5,
> +       UNIT_DESC_PARAM_LU_Q_DEPTH              = 0x6,
> +       UNIT_DESC_PARAM_MEM_TYPE                = 0x8,
> +       UNIT_DESC_PARAM_DATA_RELIABILITY        = 0x9,
> +       UNIT_DESC_PARAM_LOGICAL_BLK_SIZE        = 0xA,
> +       UNIT_DESC_PARAM_LOGICAL_BLK_COUNT       = 0xB,
> +       UNIT_DESC_PARAM_ERASE_BLK_SIZE          = 0x13,
> +       UNIT_DESC_PARAM_PROVISIONING_TYPE       = 0x17,
> +       UNIT_DESC_PARAM_PHY_MEM_RSRC_CNT        = 0x18,
> +       UNIT_DESC_PARAM_CTX_CAPABILITIES        = 0x20,
> +       UNIT_DESC_PARAM_LARGE_UNIT_SIZE_M1      = 0x22,
> +};
> +
>  /* Exception event mask values */
>  enum {
>         MASK_EE_STATUS          = 0xFFFF,
> diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
> index f3768ec..b301ed8 100644
> --- a/drivers/scsi/ufs/ufshcd.c
> +++ b/drivers/scsi/ufs/ufshcd.c
> @@ -110,6 +110,8 @@ static void ufshcd_tmc_handler(struct ufs_hba *hba);
>  static void ufshcd_async_scan(void *data, async_cookie_t cookie);
>  static int ufshcd_reset_and_restore(struct ufs_hba *hba);
>  static int ufshcd_clear_tm_cmd(struct ufs_hba *hba, int tag);
> +static int ufshcd_read_sdev_qdepth(struct ufs_hba *hba,
> +                                       struct scsi_device *sdev);
>
>  /*
>   * ufshcd_wait_for_register - wait for register value to change
> @@ -1978,6 +1980,7 @@ static int ufshcd_verify_dev_init(struct ufs_hba *hba)
>  static int ufshcd_slave_alloc(struct scsi_device *sdev)
>  {
>         struct ufs_hba *hba;
> +       int lun_qdepth;
>
>         hba = shost_priv(sdev->host);
>         sdev->tagged_supported = 1;
> @@ -1988,6 +1991,14 @@ static int ufshcd_slave_alloc(struct scsi_device *sdev)
>
>         /* allow SCSI layer to restart the device in case of errors */
>         sdev->allow_restart = 1;
> +       lun_qdepth = ufshcd_read_sdev_qdepth(hba, sdev);
> +       if (lun_qdepth == 0 || lun_qdepth > hba->nutrs) {
> +               dev_info(hba->dev, "%s, lun %d queue depth is %d\n", __func__,
> +                               sdev->lun, lun_qdepth);
> +               lun_qdepth = hba->nutrs;
> +       } else if (lun_qdepth < 0) {
> +               lun_qdepth = 1;
> +       }
>
>         /*
>          * Inform SCSI Midlayer that the LUN queue depth is same as the
> @@ -1996,7 +2007,7 @@ static int ufshcd_slave_alloc(struct scsi_device *sdev)
>          * SAM_STAT_TASK_SET_FULL, the LUN queue depth will be adjusted
>          * with scsi_adjust_queue_depth.
>          */
> -       scsi_activate_tcq(sdev, hba->nutrs);
> +       scsi_activate_tcq(sdev, lun_qdepth);
>         return 0;
>  }
>
> @@ -3071,6 +3082,38 @@ static int ufshcd_eh_host_reset_handler(struct scsi_cmnd *cmd)
>  }
>
>  /**
> + * ufshcd_read_sdev_qdepth - read the lun command queue depth
> + * @hba: Pointer to adapter instance
> + * @sdev: pointer to SCSI device
> + *
> + * Return in case of success the lun's queue depth else error.
> + */
> +static int ufshcd_read_sdev_qdepth(struct ufs_hba *hba,
> +                               struct scsi_device *sdev)
> +{
> +       int ret;
> +       int buff_len = UNIT_DESC_MAX_SIZE;
> +       u8 desc_buf[UNIT_DESC_MAX_SIZE];
> +
> +       ret = ufshcd_query_descriptor(hba, UPIU_QUERY_OPCODE_READ_DESC,
> +                       QUERY_DESC_IDN_UNIT, sdev->lun, 0, desc_buf, &buff_len);
> +
> +       if (ret || (buff_len < UNIT_DESC_PARAM_LU_Q_DEPTH)) {
> +               dev_err(hba->dev,
> +                       "%s:Failed reading unit descriptor. len = %d ret = %d"
> +                       , __func__, buff_len, ret);
> +               if (!ret)
> +                       ret = -EINVAL;
> +
> +               goto out;
> +       }
> +
> +       ret = desc_buf[UNIT_DESC_PARAM_LU_Q_DEPTH] & 0xFF;
> +out:
> +       return ret;
> +}
> +
> +/**
>   * ufshcd_async_scan - asynchronous execution for link startup
>   * @data: data pointer to pass to this function
>   * @cookie: cookie data
> --
> 1.8.5.2
>

Acked-by: Santosh Y <santoshsy@gmail.com>



-- 
~Santosh

  reply	other threads:[~2014-06-04  3:32 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-05-27  7:21 [PATCH V1 0/4] LU queue depth manament Dolev Raviv
2014-05-27  7:21 ` [PATCH V1 1/4] scsi: ufs: query descriptor API Dolev Raviv
2014-06-04  3:31   ` Santosh Y
2014-05-27  7:21 ` [PATCH V1 2/4] scsi: ufs: device query status and size check Dolev Raviv
2014-06-04  3:31   ` Santosh Y
2014-05-27  7:21 ` [PATCH V1 3/4] scsi: ufs: Logical Unit (LU) command queue depth Dolev Raviv
2014-06-04  3:31   ` Santosh Y [this message]
2014-05-27  7:21 ` [PATCH V1 4/4] scsi: ufs: Fix queue depth handling for best effort cases Dolev Raviv
2014-06-04  3:31   ` Santosh Y

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CALMYJDtsgtko06Uh4xk8Mu6d1kBq=_AXca6pdKy7MoT--OAfwA@mail.gmail.com' \
    --to=santoshsy@gmail.com \
    --cc=James.Bottomley@hansenpartnership.com \
    --cc=draviv@codeaurora.org \
    --cc=linux-arm-msm@vger.kernel.org \
    --cc=linux-scsi-owner@vger.kernel.org \
    --cc=linux-scsi@vger.kernel.org \
    --cc=rshvili@codeaurora.org \
    --cc=sthumma@codeaurora.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).