Re: [PATCH v3 5/6] scsi: ufs: add dme configuration primitives

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



>
>  /**
> + * ufshcd_dme_xxx_set - UIC command for DME_SET, DME_PEER_SET
> + * @hba: per adapter instance
> + * @attr_sel: uic command argument1
> + * @attr_set: attribute set type as uic command argument2
> + * @mib_val: setting value as uic command argument3
> + * @peer: indicate wherter peer or non-peer
> + *
> + * Returns 0 on success, non-zero value on failure
> + */
> +int ufshcd_dme_xxx_set(struct ufs_hba *hba, u32 attr_sel,
> +                      u8 attr_set, u32 mib_val, u8 peer)
> +{
> +       struct uic_command uic_cmd = {0};
> +       static const char *const action[] = {
> +               "dme-set",
> +               "dme-peer-set"
> +       };
> +       const char *set = action[!!peer];
> +       int ret;
> +
> +       uic_cmd.command = peer ?
> +               UIC_CMD_DME_PEER_SET : UIC_CMD_DME_SET;
> +       uic_cmd.argument1 = attr_sel;
> +       uic_cmd.argument2 = UIC_ARG_ATTR_SET(attr_set);
> +       uic_cmd.argument3 = mib_val;
> +
> +       ret = ufshcd_send_uic_cmd(hba, &uic_cmd);
> +
> +       dev_dbg(hba->dev, "%s: error code %d\n", set, ret);
> +
> +       return ret;
> +}
> +EXPORT_SYMBOL_GPL(ufshcd_dme_xxx_set);
> +
> +/**
> + * ufshcd_dme_xxx_get - UIC command for DME_GET, DME_PEER_GET
> + * @hba: per adapter instance
> + * @attr_sel: uic command argument1
> + * @mib_val: the value of the attribute as returned by the UIC command
> + * @peer: indicate wherter peer or non-peer
> + *
> + * Returns 0 on success, non-zero value on failure
> + */
> +int ufshcd_dme_xxx_get(struct ufs_hba *hba, u32 attr_sel,
> +                      u32 *mib_val, u8 peer)
> +{
> +       struct uic_command uic_cmd = {0};
> +       static const char *const action[] = {
> +               "dme-get",
> +               "dme-peer-get"
> +       };
> +       const char *get = action[!!peer];
> +       int ret;
> +
> +       uic_cmd.command = peer ?
> +               UIC_CMD_DME_PEER_GET : UIC_CMD_DME_GET;
> +       uic_cmd.argument1 = attr_sel;
> +
> +       ret = ufshcd_send_uic_cmd(hba, &uic_cmd);
> +
> +       if (mib_val)
> +               *mib_val = uic_cmd.argument3;
> +
> +       dev_dbg(hba->dev, "%s: error code %d\n", get, ret);
> +
> +       return ret;
> +}
> +EXPORT_SYMBOL_GPL(ufshcd_dme_xxx_get);
> +
> +/**
>   * ufshcd_make_hba_operational - Make UFS controller operational
>   * @hba: per adapter instance
>   *
> @@ -1531,6 +1613,8 @@ static void ufshcd_uic_cmd_compl(struct ufs_hba *hba)
>  {
>         hba->active_uic_cmd->argument2 |=
>                 ufshcd_get_uic_cmd_result(hba);
> +       hba->active_uic_cmd->argument3 =
> +               ufshcd_get_dme_attr_val(hba);
>         complete(&hba->active_uic_cmd->done);
>  }
>
> diff --git a/drivers/scsi/ufs/ufshcd.h b/drivers/scsi/ufs/ufshcd.h
> index 974bd07..93965b9 100644
> --- a/drivers/scsi/ufs/ufshcd.h
> +++ b/drivers/scsi/ufs/ufshcd.h
> @@ -217,6 +217,11 @@ int ufshcd_init(struct device *, struct ufs_hba ** , void __iomem * ,
>                         unsigned int);
>  void ufshcd_remove(struct ufs_hba *);
>
> +extern int ufshcd_dme_xxx_set(struct ufs_hba *hba, u32 attr_sel,
> +                             u8 attr_set, u32 mib_val, u8 peer);
> +extern int ufshcd_dme_xxx_get(struct ufs_hba *hba, u32 attr_sel,
> +                             u32 *mib_val, u8 peer);
> +
>  /**
>   * ufshcd_hba_stop - Send controller to reset state
>   * @hba: per adapter instance
> @@ -226,4 +231,29 @@ static inline void ufshcd_hba_stop(struct ufs_hba *hba)
>         ufshcd_writel(hba, CONTROLLER_DISABLE,  REG_CONTROLLER_ENABLE);
>  }
>
> +/* UIC command interfaces for DME primitives */
> +static inline int ufshcd_dme_set(struct ufs_hba *hba, u32 attr_sel,
> +                                u8 attr_set, u32 mib_val)
> +{
> +       return ufshcd_dme_xxx_set(hba, attr_sel, attr_set, mib_val, 0);
> +}
> +
> +static inline int ufshcd_dme_peer_set(struct ufs_hba *hba, u32 attr_sel,
> +                                     u8 attr_set, u32 mib_val)
> +{
> +       return ufshcd_dme_xxx_set(hba, attr_sel, attr_set, mib_val, 1);
> +}
> +
> +static inline int ufshcd_dme_get(struct ufs_hba *hba,
> +                                u32 attr_sel, u32 *mib_val)
> +{
> +       return ufshcd_dme_xxx_get(hba, attr_sel, mib_val, 0);
> +}
> +
> +static inline int ufshcd_dme_peer_get(struct ufs_hba *hba,
> +                                     u32 attr_sel, u32 *mib_val)
> +{
> +       return ufshcd_dme_xxx_get(hba, attr_sel, mib_val, 1);
> +}
> +

ufshcd_dme_xxx_get/set() are being used to configure attributes. So it
is better to rename them as ufshcd_dme_attr_get/set().

-- 
~Santosh
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]
  Powered by Linux