> > /** > + * 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