mirror of
https://github.com/team-infusion-developers/android_kernel_samsung_msm8976.git
synced 2024-11-01 02:21:16 +00:00
Merge "scsi: ufs: implement scsi host timeout handler"
This commit is contained in:
commit
4abde740f0
1 changed files with 36 additions and 0 deletions
|
@ -6734,6 +6734,41 @@ static int ufshcd_ioctl(struct scsi_device *dev, int cmd, void __user *buffer)
|
|||
return err;
|
||||
}
|
||||
|
||||
static enum blk_eh_timer_return ufshcd_eh_timed_out(struct scsi_cmnd *scmd)
|
||||
{
|
||||
unsigned long flags;
|
||||
struct Scsi_Host *host;
|
||||
struct ufs_hba *hba;
|
||||
int index;
|
||||
bool found = false;
|
||||
|
||||
if (!scmd || !scmd->device || !scmd->device->host)
|
||||
return BLK_EH_NOT_HANDLED;
|
||||
|
||||
host = scmd->device->host;
|
||||
hba = shost_priv(host);
|
||||
if (!hba)
|
||||
return BLK_EH_NOT_HANDLED;
|
||||
|
||||
spin_lock_irqsave(host->host_lock, flags);
|
||||
|
||||
for_each_set_bit(index, &hba->outstanding_reqs, hba->nutrs) {
|
||||
if (hba->lrb[index].cmd == scmd) {
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(host->host_lock, flags);
|
||||
|
||||
/*
|
||||
* Bypass SCSI error handling and reset the block layer timer if this
|
||||
* SCSI command was not actually dispatched to UFS driver, otherwise
|
||||
* let SCSI layer handle the error as usual.
|
||||
*/
|
||||
return found ? BLK_EH_NOT_HANDLED : BLK_EH_RESET_TIMER;
|
||||
}
|
||||
|
||||
static struct scsi_host_template ufshcd_driver_template = {
|
||||
.module = THIS_MODULE,
|
||||
.name = UFSHCD,
|
||||
|
@ -6746,6 +6781,7 @@ static struct scsi_host_template ufshcd_driver_template = {
|
|||
.eh_abort_handler = ufshcd_abort,
|
||||
.eh_device_reset_handler = ufshcd_eh_device_reset_handler,
|
||||
.eh_host_reset_handler = ufshcd_eh_host_reset_handler,
|
||||
.eh_timed_out = ufshcd_eh_timed_out,
|
||||
.ioctl = ufshcd_ioctl,
|
||||
.this_id = -1,
|
||||
.sg_tablesize = SG_ALL,
|
||||
|
|
Loading…
Reference in a new issue