diff options
author | Dan Williams <dan.j.williams@intel.com> | 2018-04-09 16:56:43 -0400 |
---|---|---|
committer | Dan Williams <dan.j.williams@intel.com> | 2018-04-16 11:18:51 -0400 |
commit | 55c72ab62e47fc584131901baddb2752e949ebcd (patch) | |
tree | 1041b1c8de977f10bd582e11a98342d2a512c980 | |
parent | e7c5a571a8d6a266aee9ca3f3f26e5afe3717eca (diff) |
tools/testing/nvdimm: allow custom error code injection
Given that libnvdimm driver stack takes specific actions on DIMM command
error codes like -EACCES, provide a facility to inject custom failures.
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
-rw-r--r-- | tools/testing/nvdimm/test/nfit.c | 38 |
1 files changed, 37 insertions, 1 deletions
diff --git a/tools/testing/nvdimm/test/nfit.c b/tools/testing/nvdimm/test/nfit.c index cb166be4918d..dc6cf5630280 100644 --- a/tools/testing/nvdimm/test/nfit.c +++ b/tools/testing/nvdimm/test/nfit.c | |||
@@ -138,6 +138,7 @@ static u32 handle[] = { | |||
138 | }; | 138 | }; |
139 | 139 | ||
140 | static unsigned long dimm_fail_cmd_flags[NUM_DCR]; | 140 | static unsigned long dimm_fail_cmd_flags[NUM_DCR]; |
141 | static int dimm_fail_cmd_code[NUM_DCR]; | ||
141 | 142 | ||
142 | struct nfit_test_fw { | 143 | struct nfit_test_fw { |
143 | enum intel_fw_update_state state; | 144 | enum intel_fw_update_state state; |
@@ -892,8 +893,11 @@ static int get_dimm(struct nfit_mem *nfit_mem, unsigned int func) | |||
892 | if (i >= ARRAY_SIZE(handle)) | 893 | if (i >= ARRAY_SIZE(handle)) |
893 | return -ENXIO; | 894 | return -ENXIO; |
894 | 895 | ||
895 | if ((1 << func) & dimm_fail_cmd_flags[i]) | 896 | if ((1 << func) & dimm_fail_cmd_flags[i]) { |
897 | if (dimm_fail_cmd_code[i]) | ||
898 | return dimm_fail_cmd_code[i]; | ||
896 | return -EIO; | 899 | return -EIO; |
900 | } | ||
897 | 901 | ||
898 | return i; | 902 | return i; |
899 | } | 903 | } |
@@ -1225,8 +1229,40 @@ static ssize_t fail_cmd_store(struct device *dev, struct device_attribute *attr, | |||
1225 | } | 1229 | } |
1226 | static DEVICE_ATTR_RW(fail_cmd); | 1230 | static DEVICE_ATTR_RW(fail_cmd); |
1227 | 1231 | ||
1232 | static ssize_t fail_cmd_code_show(struct device *dev, struct device_attribute *attr, | ||
1233 | char *buf) | ||
1234 | { | ||
1235 | int dimm = dimm_name_to_id(dev); | ||
1236 | |||
1237 | if (dimm < 0) | ||
1238 | return dimm; | ||
1239 | |||
1240 | return sprintf(buf, "%d\n", dimm_fail_cmd_code[dimm]); | ||
1241 | } | ||
1242 | |||
1243 | static ssize_t fail_cmd_code_store(struct device *dev, struct device_attribute *attr, | ||
1244 | const char *buf, size_t size) | ||
1245 | { | ||
1246 | int dimm = dimm_name_to_id(dev); | ||
1247 | unsigned long val; | ||
1248 | ssize_t rc; | ||
1249 | |||
1250 | if (dimm < 0) | ||
1251 | return dimm; | ||
1252 | |||
1253 | rc = kstrtol(buf, 0, &val); | ||
1254 | if (rc) | ||
1255 | return rc; | ||
1256 | |||
1257 | dimm_fail_cmd_code[dimm] = val; | ||
1258 | return size; | ||
1259 | } | ||
1260 | static DEVICE_ATTR_RW(fail_cmd_code); | ||
1261 | |||
1262 | |||
1228 | static struct attribute *nfit_test_dimm_attributes[] = { | 1263 | static struct attribute *nfit_test_dimm_attributes[] = { |
1229 | &dev_attr_fail_cmd.attr, | 1264 | &dev_attr_fail_cmd.attr, |
1265 | &dev_attr_fail_cmd_code.attr, | ||
1230 | &dev_attr_handle.attr, | 1266 | &dev_attr_handle.attr, |
1231 | NULL, | 1267 | NULL, |
1232 | }; | 1268 | }; |