lkml.org 
[lkml]   [2017]   [Nov]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.4 27/59] scsi: ufs: add capability to keep auto bkops always enabled
    Date
    4.4-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: "subhashj@codeaurora.org" <subhashj@codeaurora.org>


    [ Upstream commit 4e768e7645ec4ffa92ee163643777b261ae97142 ]

    UFS device requires to perform bkops (back ground operations) periodically
    but host can control (via auto-bkops parameter of device) when device can
    perform bkops based on its performance requirements. In general, host
    would like to enable the device's auto-bkops only when it's not doing any
    regular data transfer but sometimes device may not behave properly if host
    keeps the auto-bkops disabled. This change adds the capability to let the
    device auto-bkops always enabled except suspend.

    Reviewed-by: Sahitya Tummala <stummala@codeaurora.org>
    Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    drivers/scsi/ufs/ufshcd.c | 33 ++++++++++++++++++++++-----------
    drivers/scsi/ufs/ufshcd.h | 13 +++++++++++++
    2 files changed, 35 insertions(+), 11 deletions(-)

    --- a/drivers/scsi/ufs/ufshcd.c
    +++ b/drivers/scsi/ufs/ufshcd.c
    @@ -3340,18 +3340,25 @@ out:
    }

    /**
    - * ufshcd_force_reset_auto_bkops - force enable of auto bkops
    + * ufshcd_force_reset_auto_bkops - force reset auto bkops state
    * @hba: per adapter instance
    *
    * After a device reset the device may toggle the BKOPS_EN flag
    * to default value. The s/w tracking variables should be updated
    - * as well. Do this by forcing enable of auto bkops.
    + * as well. This function would change the auto-bkops state based on
    + * UFSHCD_CAP_KEEP_AUTO_BKOPS_ENABLED_EXCEPT_SUSPEND.
    */
    -static void ufshcd_force_reset_auto_bkops(struct ufs_hba *hba)
    +static void ufshcd_force_reset_auto_bkops(struct ufs_hba *hba)
    {
    - hba->auto_bkops_enabled = false;
    - hba->ee_ctrl_mask |= MASK_EE_URGENT_BKOPS;
    - ufshcd_enable_auto_bkops(hba);
    + if (ufshcd_keep_autobkops_enabled_except_suspend(hba)) {
    + hba->auto_bkops_enabled = false;
    + hba->ee_ctrl_mask |= MASK_EE_URGENT_BKOPS;
    + ufshcd_enable_auto_bkops(hba);
    + } else {
    + hba->auto_bkops_enabled = true;
    + hba->ee_ctrl_mask &= ~MASK_EE_URGENT_BKOPS;
    + ufshcd_disable_auto_bkops(hba);
    + }
    }

    static inline int ufshcd_get_bkops_status(struct ufs_hba *hba, u32 *status)
    @@ -5149,11 +5156,15 @@ static int ufshcd_resume(struct ufs_hba
    goto set_old_link_state;
    }

    - /*
    - * If BKOPs operations are urgently needed at this moment then
    - * keep auto-bkops enabled or else disable it.
    - */
    - ufshcd_urgent_bkops(hba);
    + if (ufshcd_keep_autobkops_enabled_except_suspend(hba))
    + ufshcd_enable_auto_bkops(hba);
    + else
    + /*
    + * If BKOPs operations are urgently needed at this moment then
    + * keep auto-bkops enabled or else disable it.
    + */
    + ufshcd_urgent_bkops(hba);
    +
    hba->clk_gating.is_suspended = false;

    if (ufshcd_is_clkscaling_enabled(hba))
    --- a/drivers/scsi/ufs/ufshcd.h
    +++ b/drivers/scsi/ufs/ufshcd.h
    @@ -528,6 +528,14 @@ struct ufs_hba {
    * CAUTION: Enabling this might reduce overall UFS throughput.
    */
    #define UFSHCD_CAP_INTR_AGGR (1 << 4)
    + /*
    + * This capability allows the device auto-bkops to be always enabled
    + * except during suspend (both runtime and suspend).
    + * Enabling this capability means that device will always be allowed
    + * to do background operation when it's active but it might degrade
    + * the performance of ongoing read/write operations.
    + */
    +#define UFSHCD_CAP_KEEP_AUTO_BKOPS_ENABLED_EXCEPT_SUSPEND (1 << 5)

    struct devfreq *devfreq;
    struct ufs_clk_scaling clk_scaling;
    @@ -623,6 +631,11 @@ static inline void *ufshcd_get_variant(s
    BUG_ON(!hba);
    return hba->priv;
    }
    +static inline bool ufshcd_keep_autobkops_enabled_except_suspend(
    + struct ufs_hba *hba)
    +{
    + return hba->caps & UFSHCD_CAP_KEEP_AUTO_BKOPS_ENABLED_EXCEPT_SUSPEND;
    +}

    extern int ufshcd_runtime_suspend(struct ufs_hba *hba);
    extern int ufshcd_runtime_resume(struct ufs_hba *hba);

    \
     
     \ /
      Last update: 2017-11-19 16:15    [W:4.150 / U:0.588 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site