Skip to content

Commit

Permalink
scsi: ufs: ufshpb: Clean up the handler when device resets HPB inform…
Browse files Browse the repository at this point in the history
…ation

"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."

Clean up the handler and make the intent of this handler more readable, no
functional change.

Link: https://lore.kernel.org/r/20220505134707.35929-4-huobean@gmail.com
Reviewed-by: Keoseong Park <keosung.park@samsung.com>
Reviewed-by: Daejun Park <daejun7.park@samsung.com>
Signed-off-by: Bean Huo <beanhuo@micron.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
  • Loading branch information
Bean Huo authored and Martin K. Petersen committed May 11, 2022
1 parent 6f341ed commit a3f3c26
Showing 1 changed file with 23 additions and 12 deletions.
35 changes: 23 additions & 12 deletions drivers/scsi/ufs/ufshpb.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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.
Expand Down Expand Up @@ -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:
Expand Down

0 comments on commit a3f3c26

Please sign in to comment.