Message ID | 20220424220713.1253049-4-huobean@gmail.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | Several changes for UFSHPB | expand |
>From: Bean Huo <beanhuo@micron.com> > >"When the device is powered off by the host, the device may restore L2P map data >upon power up or build from the host’s HPB READ command. In case device powered >up and lost HPB information, device can signal to the host through HPB Sense data, >by setting HPB Operation as ‘2’ which will inform the host that device reset HPB >information." > >This patch is to clean up the handler and make the intent of this handler more >readable, no functional change. > >Signed-off-by: Bean Huo <beanhuo@micron.com> Reviewed-by: Keoseong Park <keosung.park@samsung.com> Best Regards, Keoseong Park >--- > drivers/scsi/ufs/ufshpb.c | 35 +++++++++++++++++++++++------------ > 1 file changed, 23 insertions(+), 12 deletions(-) > >diff --git a/drivers/scsi/ufs/ufshpb.c b/drivers/scsi/ufs/ufshpb.c >index 167643969165..f1f30d4c3d65 100644 >--- a/drivers/scsi/ufs/ufshpb.c >+++ b/drivers/scsi/ufs/ufshpb.c >@@ -1225,7 +1225,10 @@ static void ufshpb_rsp_req_region_update(struct ufshpb_lu *hpb, > queue_work(ufshpb_wq, &hpb->map_work); > } > >-static void ufshpb_dev_reset_handler(struct ufshpb_lu *hpb) >+/* >+ * Set the flags of all active regions to RGN_FLAG_UPDATE to let host side reload L2P entries later >+ */ >+static void ufshpb_set_regions_update(struct ufshpb_lu *hpb) > { > struct victim_select_info *lru_info = &hpb->lru_info; > struct ufshpb_region *rgn; >@@ -1239,6 +1242,24 @@ static void ufshpb_dev_reset_handler(struct ufshpb_lu *hpb) > spin_unlock_irqrestore(&hpb->rgn_state_lock, flags); > } > >+static void ufshpb_dev_reset_handler(struct ufs_hba *hba) >+{ >+ struct scsi_device *sdev; >+ struct ufshpb_lu *hpb; >+ >+ __shost_for_each_device(sdev, hba->host) { >+ hpb = ufshpb_get_hpb_data(sdev); >+ if (hpb && hpb->is_hcm) >+ /* >+ * For the HPB host mode, in case device powered up and lost HPB >+ * information, we will set the region flag to be RGN_FLAG_UPDATE, >+ * it will let host reload its L2P entries(re-activate the region >+ * in the UFS device). >+ */ >+ ufshpb_set_regions_update(hpb); >+ } >+} >+ > /* > * This function will parse recommended active subregion information in sense > * data field of response UPIU with SAM_STAT_GOOD state. >@@ -1313,17 +1334,7 @@ void ufshpb_rsp_upiu(struct ufs_hba *hba, struct ufshcd_lrb *lrbp) > case HPB_RSP_DEV_RESET: > dev_warn(&hpb->sdev_ufs_lu->sdev_dev, > "UFS device lost HPB information during PM.\n"); >- >- if (hpb->is_hcm) { >- struct scsi_device *sdev; >- >- __shost_for_each_device(sdev, hba->host) { >- struct ufshpb_lu *h = sdev->hostdata; >- >- if (h) >- ufshpb_dev_reset_handler(h); >- } >- } >+ ufshpb_dev_reset_handler(hba); > > break; > default: >-- >2.34.1 > >
diff --git a/drivers/scsi/ufs/ufshpb.c b/drivers/scsi/ufs/ufshpb.c index 167643969165..f1f30d4c3d65 100644 --- a/drivers/scsi/ufs/ufshpb.c +++ b/drivers/scsi/ufs/ufshpb.c @@ -1225,7 +1225,10 @@ static void ufshpb_rsp_req_region_update(struct ufshpb_lu *hpb, queue_work(ufshpb_wq, &hpb->map_work); } -static void ufshpb_dev_reset_handler(struct ufshpb_lu *hpb) +/* + * Set the flags of all active regions to RGN_FLAG_UPDATE to let host side reload L2P entries later + */ +static void ufshpb_set_regions_update(struct ufshpb_lu *hpb) { struct victim_select_info *lru_info = &hpb->lru_info; struct ufshpb_region *rgn; @@ -1239,6 +1242,24 @@ static void ufshpb_dev_reset_handler(struct ufshpb_lu *hpb) spin_unlock_irqrestore(&hpb->rgn_state_lock, flags); } +static void ufshpb_dev_reset_handler(struct ufs_hba *hba) +{ + struct scsi_device *sdev; + struct ufshpb_lu *hpb; + + __shost_for_each_device(sdev, hba->host) { + hpb = ufshpb_get_hpb_data(sdev); + if (hpb && hpb->is_hcm) + /* + * For the HPB host mode, in case device powered up and lost HPB + * information, we will set the region flag to be RGN_FLAG_UPDATE, + * it will let host reload its L2P entries(re-activate the region + * in the UFS device). + */ + ufshpb_set_regions_update(hpb); + } +} + /* * This function will parse recommended active subregion information in sense * data field of response UPIU with SAM_STAT_GOOD state. @@ -1313,17 +1334,7 @@ void ufshpb_rsp_upiu(struct ufs_hba *hba, struct ufshcd_lrb *lrbp) case HPB_RSP_DEV_RESET: dev_warn(&hpb->sdev_ufs_lu->sdev_dev, "UFS device lost HPB information during PM.\n"); - - if (hpb->is_hcm) { - struct scsi_device *sdev; - - __shost_for_each_device(sdev, hba->host) { - struct ufshpb_lu *h = sdev->hostdata; - - if (h) - ufshpb_dev_reset_handler(h); - } - } + ufshpb_dev_reset_handler(hba); break; default: