diff options
Diffstat (limited to 'drivers/misc/cxl/sysfs.c')
-rw-r--r-- | drivers/misc/cxl/sysfs.c | 27 |
1 files changed, 23 insertions, 4 deletions
diff --git a/drivers/misc/cxl/sysfs.c b/drivers/misc/cxl/sysfs.c index b043c20f158f..a8b6d6a635e9 100644 --- a/drivers/misc/cxl/sysfs.c +++ b/drivers/misc/cxl/sysfs.c | |||
@@ -75,12 +75,31 @@ static ssize_t reset_adapter_store(struct device *device, | |||
75 | int val; | 75 | int val; |
76 | 76 | ||
77 | rc = sscanf(buf, "%i", &val); | 77 | rc = sscanf(buf, "%i", &val); |
78 | if ((rc != 1) || (val != 1)) | 78 | if ((rc != 1) || (val != 1 && val != -1)) |
79 | return -EINVAL; | 79 | return -EINVAL; |
80 | 80 | ||
81 | if ((rc = cxl_ops->adapter_reset(adapter))) | 81 | /* |
82 | return rc; | 82 | * See if we can lock the context mapping that's only allowed |
83 | return count; | 83 | * when there are no contexts attached to the adapter. Once |
84 | * taken this will also prevent any context from getting activated. | ||
85 | */ | ||
86 | if (val == 1) { | ||
87 | rc = cxl_adapter_context_lock(adapter); | ||
88 | if (rc) | ||
89 | goto out; | ||
90 | |||
91 | rc = cxl_ops->adapter_reset(adapter); | ||
92 | /* In case reset failed release context lock */ | ||
93 | if (rc) | ||
94 | cxl_adapter_context_unlock(adapter); | ||
95 | |||
96 | } else if (val == -1) { | ||
97 | /* Perform a forced adapter reset */ | ||
98 | rc = cxl_ops->adapter_reset(adapter); | ||
99 | } | ||
100 | |||
101 | out: | ||
102 | return rc ? rc : count; | ||
84 | } | 103 | } |
85 | 104 | ||
86 | static ssize_t load_image_on_perst_show(struct device *device, | 105 | static ssize_t load_image_on_perst_show(struct device *device, |