未验证 提交 9ea181a0 编写于 作者: O openeuler-ci-bot 提交者: Gitee

!1005 scsi: hisi_sas: A group of SAS-related bugfixes

Merge Pull Request from: @xia-bing1 
 
This series contain some fixes including:
  -Add slave_destroy interface for v3 hw
  -Try more retries of START_STOP when resuming scsi device
  -Block requests before take debugfs snapshot
  -Check usage count only when the runtime PM status is RPM_SUSPENDING 
 
Link:https://gitee.com/openeuler/kernel/pulls/1005 

Reviewed-by: Yihang Li <liyihang9@huawei.com> 
Signed-off-by: Jialin Zhang <zhangjialin11@huawei.com> 
...@@ -2870,7 +2870,8 @@ static int slave_configure_v3_hw(struct scsi_device *sdev) ...@@ -2870,7 +2870,8 @@ static int slave_configure_v3_hw(struct scsi_device *sdev)
return 0; return 0;
if (!device_link_add(&sdev->sdev_gendev, dev, if (!device_link_add(&sdev->sdev_gendev, dev,
DL_FLAG_PM_RUNTIME | DL_FLAG_RPM_ACTIVE)) { DL_FLAG_STATELESS | DL_FLAG_PM_RUNTIME |
DL_FLAG_RPM_ACTIVE)) {
if (pm_runtime_enabled(dev)) { if (pm_runtime_enabled(dev)) {
dev_info(dev, "add device link failed, disable runtime PM for the host\n"); dev_info(dev, "add device link failed, disable runtime PM for the host\n");
pm_runtime_disable(dev); pm_runtime_disable(dev);
...@@ -2880,6 +2881,15 @@ static int slave_configure_v3_hw(struct scsi_device *sdev) ...@@ -2880,6 +2881,15 @@ static int slave_configure_v3_hw(struct scsi_device *sdev)
return 0; return 0;
} }
static void slave_destroy_v3_hw(struct scsi_device *sdev)
{
struct Scsi_Host *shost = dev_to_shost(&sdev->sdev_gendev);
struct hisi_hba *hisi_hba = shost_priv(shost);
struct device *dev = hisi_hba->dev;
device_link_remove(&sdev->sdev_gendev, dev);
}
static struct device_attribute *host_attrs_v3_hw[] = { static struct device_attribute *host_attrs_v3_hw[] = {
&dev_attr_phy_event_threshold, &dev_attr_phy_event_threshold,
&dev_attr_intr_conv_v3_hw, &dev_attr_intr_conv_v3_hw,
...@@ -3064,21 +3074,24 @@ static const struct hisi_sas_debugfs_reg debugfs_ras_reg = { ...@@ -3064,21 +3074,24 @@ static const struct hisi_sas_debugfs_reg debugfs_ras_reg = {
static void debugfs_snapshot_prepare_v3_hw(struct hisi_hba *hisi_hba) static void debugfs_snapshot_prepare_v3_hw(struct hisi_hba *hisi_hba)
{ {
set_bit(HISI_SAS_REJECT_CMD_BIT, &hisi_hba->flags); struct Scsi_Host *shost = hisi_hba->shost;
hisi_sas_write32(hisi_hba, DLVRY_QUEUE_ENABLE, 0);
scsi_block_requests(shost);
wait_cmds_complete_timeout_v3_hw(hisi_hba, 100, 5000); wait_cmds_complete_timeout_v3_hw(hisi_hba, 100, 5000);
set_bit(HISI_SAS_REJECT_CMD_BIT, &hisi_hba->flags);
hisi_sas_sync_irqs(hisi_hba); hisi_sas_sync_irqs(hisi_hba);
hisi_sas_write32(hisi_hba, DLVRY_QUEUE_ENABLE, 0);
} }
static void debugfs_snapshot_restore_v3_hw(struct hisi_hba *hisi_hba) static void debugfs_snapshot_restore_v3_hw(struct hisi_hba *hisi_hba)
{ {
struct Scsi_Host *shost = hisi_hba->shost;
hisi_sas_write32(hisi_hba, DLVRY_QUEUE_ENABLE, hisi_sas_write32(hisi_hba, DLVRY_QUEUE_ENABLE,
(u32)((1ULL << hisi_hba->queue_count) - 1)); (u32)((1ULL << hisi_hba->queue_count) - 1));
clear_bit(HISI_SAS_REJECT_CMD_BIT, &hisi_hba->flags); clear_bit(HISI_SAS_REJECT_CMD_BIT, &hisi_hba->flags);
scsi_unblock_requests(shost);
} }
static void read_iost_itct_cache_v3_hw(struct hisi_hba *hisi_hba, static void read_iost_itct_cache_v3_hw(struct hisi_hba *hisi_hba,
...@@ -3268,6 +3281,7 @@ static struct scsi_host_template sht_v3_hw = { ...@@ -3268,6 +3281,7 @@ static struct scsi_host_template sht_v3_hw = {
.eh_device_reset_handler = sas_eh_device_reset_handler, .eh_device_reset_handler = sas_eh_device_reset_handler,
.eh_target_reset_handler = sas_eh_target_reset_handler, .eh_target_reset_handler = sas_eh_target_reset_handler,
.slave_alloc = hisi_sas_slave_alloc, .slave_alloc = hisi_sas_slave_alloc,
.slave_destroy = slave_destroy_v3_hw,
.target_destroy = sas_target_destroy, .target_destroy = sas_target_destroy,
.ioctl = sas_ioctl, .ioctl = sas_ioctl,
#ifdef CONFIG_COMPAT #ifdef CONFIG_COMPAT
...@@ -5087,11 +5101,14 @@ static int _suspend_v3_hw(struct device *device) ...@@ -5087,11 +5101,14 @@ static int _suspend_v3_hw(struct device *device)
flush_workqueue(hisi_hba->wq); flush_workqueue(hisi_hba->wq);
interrupt_disable_v3_hw(hisi_hba); interrupt_disable_v3_hw(hisi_hba);
if (atomic_read(&device->power.usage_count)) { #ifdef CONFIG_PM
if ((device->power.runtime_status == RPM_SUSPENDING) &&
atomic_read(&device->power.usage_count)) {
dev_err(dev, "PM suspend: host status cannot be suspended\n"); dev_err(dev, "PM suspend: host status cannot be suspended\n");
rc = -EBUSY; rc = -EBUSY;
goto err_out; goto err_out;
} }
#endif
rc = disable_host_v3_hw(hisi_hba); rc = disable_host_v3_hw(hisi_hba);
if (rc) { if (rc) {
...@@ -5110,7 +5127,9 @@ static int _suspend_v3_hw(struct device *device) ...@@ -5110,7 +5127,9 @@ static int _suspend_v3_hw(struct device *device)
err_out_recover_host: err_out_recover_host:
enable_host_v3_hw(hisi_hba); enable_host_v3_hw(hisi_hba);
#ifdef CONFIG_PM
err_out: err_out:
#endif
interrupt_enable_v3_hw(hisi_hba); interrupt_enable_v3_hw(hisi_hba);
clear_bit(HISI_SAS_REJECT_CMD_BIT, &hisi_hba->flags); clear_bit(HISI_SAS_REJECT_CMD_BIT, &hisi_hba->flags);
clear_bit(HISI_SAS_RESET_BIT, &hisi_hba->flags); clear_bit(HISI_SAS_RESET_BIT, &hisi_hba->flags);
......
...@@ -3663,6 +3663,7 @@ static int sd_suspend_common(struct device *dev, bool ignore_stop_errors) ...@@ -3663,6 +3663,7 @@ static int sd_suspend_common(struct device *dev, bool ignore_stop_errors)
{ {
struct scsi_disk *sdkp = dev_get_drvdata(dev); struct scsi_disk *sdkp = dev_get_drvdata(dev);
struct scsi_sense_hdr sshdr; struct scsi_sense_hdr sshdr;
int retries;
int ret = 0; int ret = 0;
if (!sdkp) /* E.g.: runtime suspend following sd_remove() */ if (!sdkp) /* E.g.: runtime suspend following sd_remove() */
...@@ -3693,9 +3694,15 @@ static int sd_suspend_common(struct device *dev, bool ignore_stop_errors) ...@@ -3693,9 +3694,15 @@ static int sd_suspend_common(struct device *dev, bool ignore_stop_errors)
if (sdkp->device->manage_start_stop) { if (sdkp->device->manage_start_stop) {
sd_printk(KERN_NOTICE, sdkp, "Stopping disk\n"); sd_printk(KERN_NOTICE, sdkp, "Stopping disk\n");
/* an error is not worth aborting a system sleep */ /* an error is not worth aborting a system sleep */
ret = sd_start_stop_device(sdkp, 0); for (retries = 3; retries > 0; --retries) {
if (ignore_stop_errors) ret = sd_start_stop_device(sdkp, 0);
ret = 0; if (!ret)
break;
if (ignore_stop_errors) {
ret = 0;
break;
}
}
} }
return ret; return ret;
...@@ -3714,6 +3721,7 @@ static int sd_suspend_runtime(struct device *dev) ...@@ -3714,6 +3721,7 @@ static int sd_suspend_runtime(struct device *dev)
static int sd_resume(struct device *dev) static int sd_resume(struct device *dev)
{ {
struct scsi_disk *sdkp = dev_get_drvdata(dev); struct scsi_disk *sdkp = dev_get_drvdata(dev);
int retries;
int ret; int ret;
if (!sdkp) /* E.g.: runtime resume at the start of sd_probe() */ if (!sdkp) /* E.g.: runtime resume at the start of sd_probe() */
...@@ -3723,9 +3731,13 @@ static int sd_resume(struct device *dev) ...@@ -3723,9 +3731,13 @@ static int sd_resume(struct device *dev)
return 0; return 0;
sd_printk(KERN_NOTICE, sdkp, "Starting disk\n"); sd_printk(KERN_NOTICE, sdkp, "Starting disk\n");
ret = sd_start_stop_device(sdkp, 1); for (retries = 3; retries > 0; --retries) {
if (!ret) ret = sd_start_stop_device(sdkp, 1);
opal_unlock_from_suspend(sdkp->opal_dev); if (!ret) {
opal_unlock_from_suspend(sdkp->opal_dev);
break;
}
}
return ret; return ret;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册