aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDan Williams <dan.j.williams@intel.com>2018-04-09 16:56:43 -0400
committerDan Williams <dan.j.williams@intel.com>2018-04-16 11:18:51 -0400
commit55c72ab62e47fc584131901baddb2752e949ebcd (patch)
tree1041b1c8de977f10bd582e11a98342d2a512c980
parente7c5a571a8d6a266aee9ca3f3f26e5afe3717eca (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.c38
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
140static unsigned long dimm_fail_cmd_flags[NUM_DCR]; 140static unsigned long dimm_fail_cmd_flags[NUM_DCR];
141static int dimm_fail_cmd_code[NUM_DCR];
141 142
142struct nfit_test_fw { 143struct 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}
1226static DEVICE_ATTR_RW(fail_cmd); 1230static DEVICE_ATTR_RW(fail_cmd);
1227 1231
1232static 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
1243static 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}
1260static DEVICE_ATTR_RW(fail_cmd_code);
1261
1262
1228static struct attribute *nfit_test_dimm_attributes[] = { 1263static 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};