176 lines
6.3 KiB
Diff
176 lines
6.3 KiB
Diff
From 7764ae0693eaf3aa29183be6c5e510b307b08810 Mon Sep 17 00:00:00 2001
|
|
From: Jianqin Xie <xiejianqin@hisilicon.com>
|
|
Date: Tue, 3 Aug 2021 14:47:56 +0800
|
|
Subject: [PATCH 074/108] scsi: hisi_sas: Directly snapshot registers when
|
|
executing a reset
|
|
|
|
mainline inclusion
|
|
from mainline-v5.13-rc1
|
|
commit 2c74cb1f9222ebfcc204c02018275ad167d25212
|
|
category: feature
|
|
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EKNE
|
|
|
|
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=2c74cb1f9222ebfcc204c02018275ad167d25212
|
|
|
|
----------------------------------------------------------------------
|
|
|
|
The debugfs snapshot should be executed before the reset occurs to ensure
|
|
that the register contents are saved properly.
|
|
|
|
As such, it is incorrect to queue the debugfs dump when running a reset as
|
|
the reset will occur prior to the snapshot work item is handler.
|
|
|
|
Therefore, directly snapshot registers in the reset work handler.
|
|
|
|
Link: https://lore.kernel.org/r/1617709711-195853-5-git-send-email-john.garry@huawei.com
|
|
Signed-off-by: Jianqin Xie <xiejianqin@hisilicon.com>
|
|
Signed-off-by: Luo Jiaxing <luojiaxing@huawei.com>
|
|
Signed-off-by: John Garry <john.garry@huawei.com>
|
|
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
|
|
Reviewed-by: Ouyangdelong <ouyangdelong@huawei.com>
|
|
Signed-off-by: Nifujia <nifujia1@hisilicon.com>
|
|
Signed-off-by: Zheng Zengkai <zhengzengkai@huawei.com>
|
|
Signed-off-by: YunYi Yang <yangyunyi2@huawei.com>
|
|
---
|
|
drivers/scsi/hisi_sas/hisi_sas.h | 1 +
|
|
drivers/scsi/hisi_sas/hisi_sas_main.c | 25 +++++++++++++++++++-----
|
|
drivers/scsi/hisi_sas/hisi_sas_v3_hw.c | 27 ++++++++++++++------------
|
|
3 files changed, 36 insertions(+), 17 deletions(-)
|
|
|
|
diff --git a/drivers/scsi/hisi_sas/hisi_sas.h b/drivers/scsi/hisi_sas/hisi_sas.h
|
|
index 27c061a401a9..47e767fb0acf 100644
|
|
--- a/drivers/scsi/hisi_sas/hisi_sas.h
|
|
+++ b/drivers/scsi/hisi_sas/hisi_sas.h
|
|
@@ -373,6 +373,7 @@ struct hisi_sas_hw {
|
|
const struct cpumask *(*get_managed_irq_aff)(struct hisi_hba
|
|
*hisi_hba, int queue);
|
|
void (*debugfs_work_handler)(struct work_struct *work);
|
|
+ void (*debugfs_snapshot_regs)(struct hisi_hba *hisi_hba);
|
|
int complete_hdr_size;
|
|
struct scsi_host_template *sht;
|
|
};
|
|
diff --git a/drivers/scsi/hisi_sas/hisi_sas_main.c b/drivers/scsi/hisi_sas/hisi_sas_main.c
|
|
index b7cc4ef60169..edda95fe48d3 100644
|
|
--- a/drivers/scsi/hisi_sas/hisi_sas_main.c
|
|
+++ b/drivers/scsi/hisi_sas/hisi_sas_main.c
|
|
@@ -1619,12 +1619,8 @@ void hisi_sas_controller_reset_done(struct hisi_hba *hisi_hba)
|
|
}
|
|
EXPORT_SYMBOL_GPL(hisi_sas_controller_reset_done);
|
|
|
|
-static int hisi_sas_controller_reset(struct hisi_hba *hisi_hba)
|
|
+static int hisi_sas_controller_prereset(struct hisi_hba *hisi_hba)
|
|
{
|
|
- struct device *dev = hisi_hba->dev;
|
|
- struct Scsi_Host *shost = hisi_hba->shost;
|
|
- int rc;
|
|
-
|
|
if (!hisi_hba->hw->soft_reset)
|
|
return -EINVAL;
|
|
|
|
@@ -1634,6 +1630,18 @@ static int hisi_sas_controller_reset(struct hisi_hba *hisi_hba)
|
|
if (hisi_sas_debugfs_enable && hisi_hba->debugfs_itct[0].itct)
|
|
hisi_hba->hw->debugfs_work_handler(&hisi_hba->debugfs_work);
|
|
|
|
+ if (hisi_sas_debugfs_enable && hisi_hba->debugfs_itct[0].itct)
|
|
+ hisi_hba->hw->debugfs_snapshot_regs(hisi_hba);
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static int hisi_sas_controller_reset(struct hisi_hba *hisi_hba)
|
|
+{
|
|
+ struct device *dev = hisi_hba->dev;
|
|
+ struct Scsi_Host *shost = hisi_hba->shost;
|
|
+ int rc;
|
|
+
|
|
dev_info(dev, "controller resetting...\n");
|
|
hisi_sas_controller_reset_prepare(hisi_hba);
|
|
|
|
@@ -2545,6 +2553,9 @@ void hisi_sas_rst_work_handler(struct work_struct *work)
|
|
struct hisi_hba *hisi_hba =
|
|
container_of(work, struct hisi_hba, rst_work);
|
|
|
|
+ if (hisi_sas_controller_prereset(hisi_hba))
|
|
+ return;
|
|
+
|
|
hisi_sas_controller_reset(hisi_hba);
|
|
}
|
|
EXPORT_SYMBOL_GPL(hisi_sas_rst_work_handler);
|
|
@@ -2554,8 +2565,12 @@ void hisi_sas_sync_rst_work_handler(struct work_struct *work)
|
|
struct hisi_sas_rst *rst =
|
|
container_of(work, struct hisi_sas_rst, work);
|
|
|
|
+ if (hisi_sas_controller_prereset(rst->hisi_hba))
|
|
+ goto rst_complete;
|
|
+
|
|
if (!hisi_sas_controller_reset(rst->hisi_hba))
|
|
rst->done = true;
|
|
+rst_complete:
|
|
complete(rst->completion);
|
|
}
|
|
EXPORT_SYMBOL_GPL(hisi_sas_sync_rst_work_handler);
|
|
diff --git a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c b/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
|
|
index 6f48312ee1d6..dfe2dba65dbd 100644
|
|
--- a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
|
|
+++ b/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
|
|
@@ -587,6 +587,7 @@ MODULE_PARM_DESC(auto_affine_msi_experimental, "Enable auto-affinity of MSI IRQs
|
|
"default is off");
|
|
|
|
static void debugfs_work_handler_v3_hw(struct work_struct *work);
|
|
+static void debugfs_snapshot_regs_v3_hw(struct hisi_hba *hisi_hba);
|
|
|
|
static u32 hisi_sas_read32(struct hisi_hba *hisi_hba, u32 off)
|
|
{
|
|
@@ -3599,6 +3600,7 @@ static const struct hisi_sas_hw hisi_sas_v3_hw = {
|
|
.wait_cmds_complete_timeout = wait_cmds_complete_timeout_v3_hw,
|
|
.get_managed_irq_aff = get_managed_irq_aff_v3_hw,
|
|
.debugfs_work_handler = debugfs_work_handler_v3_hw,
|
|
+ .debugfs_snapshot_regs = debugfs_snapshot_regs_v3_hw,
|
|
};
|
|
|
|
static struct Scsi_Host *
|
|
@@ -4085,6 +4087,19 @@ static void debugfs_create_files_v3_hw(struct hisi_hba *hisi_hba)
|
|
|
|
static void debugfs_snapshot_regs_v3_hw(struct hisi_hba *hisi_hba)
|
|
{
|
|
+ int debugfs_dump_index = hisi_hba->debugfs_dump_index;
|
|
+ struct device *dev = hisi_hba->dev;
|
|
+ u64 timestamp = local_clock();
|
|
+
|
|
+ if (debugfs_dump_index >= hisi_sas_debugfs_dump_count) {
|
|
+ dev_warn(dev, "dump count exceeded!\n");
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ do_div(timestamp, NSEC_PER_MSEC);
|
|
+ hisi_hba->debugfs_timestamp[debugfs_dump_index] = timestamp;
|
|
+ hisi_hba->debugfs_dump_index++;
|
|
+
|
|
debugfs_snapshot_prepare_v3_hw(hisi_hba);
|
|
|
|
debugfs_snapshot_global_reg_v3_hw(hisi_hba);
|
|
@@ -4821,20 +4836,8 @@ static void debugfs_work_handler_v3_hw(struct work_struct *work)
|
|
{
|
|
struct hisi_hba *hisi_hba =
|
|
container_of(work, struct hisi_hba, debugfs_work);
|
|
- int debugfs_dump_index = hisi_hba->debugfs_dump_index;
|
|
- struct device *dev = hisi_hba->dev;
|
|
- u64 timestamp = local_clock();
|
|
-
|
|
- if (debugfs_dump_index >= hisi_sas_debugfs_dump_count) {
|
|
- dev_warn(dev, "dump count exceeded!\n");
|
|
- return;
|
|
- }
|
|
-
|
|
- do_div(timestamp, NSEC_PER_MSEC);
|
|
- hisi_hba->debugfs_timestamp[debugfs_dump_index] = timestamp;
|
|
|
|
debugfs_snapshot_regs_v3_hw(hisi_hba);
|
|
- hisi_hba->debugfs_dump_index++;
|
|
}
|
|
|
|
static void debugfs_release_v3_hw(struct hisi_hba *hisi_hba, int dump_index)
|
|
--
|
|
2.27.0
|
|
|