Hi, Can Guo Actually, we already have DME_RESET, this is not enough for Qualcomm host? Thanks, //Bean > > Some UFS host controllers need their specific implementations of resetting to > get them into a good state. Provide a new vops to allow the platform driver to > implement this own reset operation. > > Signed-off-by: Can Guo <cang@xxxxxxxxxxxxxx> > --- > drivers/scsi/ufs/ufshcd.c | 16 ++++++++++++++++ drivers/scsi/ufs/ufshcd.h | 10 > ++++++++++ > 2 files changed, 26 insertions(+) > > diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c index > c28c144..161e3c4 100644 > --- a/drivers/scsi/ufs/ufshcd.c > +++ b/drivers/scsi/ufs/ufshcd.c > @@ -3859,6 +3859,14 @@ static int ufshcd_link_recovery(struct ufs_hba *hba) > ufshcd_set_eh_in_progress(hba); > spin_unlock_irqrestore(hba->host->host_lock, flags); > > + ret = ufshcd_vops_full_reset(hba); > + if (ret) > + dev_warn(hba->dev, "%s: full reset returned %d\n", > + __func__, ret); > + > + /* Reset the attached device */ > + ufshcd_vops_device_reset(hba); > + > ret = ufshcd_host_reset_and_restore(hba); > > spin_lock_irqsave(hba->host->host_lock, flags); @@ -6241,6 +6249,11 > @@ static int ufshcd_reset_and_restore(struct ufs_hba *hba) > int retries = MAX_HOST_RESET_RETRIES; > > do { > + err = ufshcd_vops_full_reset(hba); > + if (err) > + dev_warn(hba->dev, "%s: full reset returned %d\n", > + __func__, err); > + > /* Reset the attached device */ > ufshcd_vops_device_reset(hba); > > @@ -8384,6 +8397,9 @@ int ufshcd_init(struct ufs_hba *hba, void __iomem > *mmio_base, unsigned int irq) > goto exit_gating; > } > > + /* Reset controller to power on reset (POR) state */ > + ufshcd_vops_full_reset(hba); > + > /* Reset the attached device */ > ufshcd_vops_device_reset(hba); > > diff --git a/drivers/scsi/ufs/ufshcd.h b/drivers/scsi/ufs/ufshcd.h index > e0fe247..253b9ea 100644 > --- a/drivers/scsi/ufs/ufshcd.h > +++ b/drivers/scsi/ufs/ufshcd.h > @@ -296,6 +296,8 @@ struct ufs_pwr_mode_info { > * @apply_dev_quirks: called to apply device specific quirks > * @suspend: called during host controller PM callback > * @resume: called during host controller PM callback > + * @full_reset: called for handling variant specific implementations of > + * resetting the hci > * @dbg_register_dump: used to dump controller debug information > * @phy_initialization: used to initialize phys > * @device_reset: called to issue a reset pulse on the UFS device @@ -325,6 > +327,7 @@ struct ufs_hba_variant_ops { > int (*apply_dev_quirks)(struct ufs_hba *); > int (*suspend)(struct ufs_hba *, enum ufs_pm_op); > int (*resume)(struct ufs_hba *, enum ufs_pm_op); > + int (*full_reset)(struct ufs_hba *hba); > void (*dbg_register_dump)(struct ufs_hba *hba); > int (*phy_initialization)(struct ufs_hba *); > void (*device_reset)(struct ufs_hba *hba); > @@ -1076,6 +1079,13 @@ static inline int ufshcd_vops_resume(struct ufs_hba > *hba, enum ufs_pm_op op) > return 0; > } > > +static inline int ufshcd_vops_full_reset(struct ufs_hba *hba) { > + if (hba->vops && hba->vops->full_reset) > + return hba->vops->full_reset(hba); > + return 0; > +} > + > static inline void ufshcd_vops_dbg_register_dump(struct ufs_hba *hba) { > if (hba->vops && hba->vops->dbg_register_dump) > -- > The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, > a Linux Foundation Collaborative Project