Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 55c72ab6 authored by Dan Williams's avatar Dan Williams
Browse files

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: default avatarDan Williams <dan.j.williams@intel.com>
parent e7c5a571
Loading
Loading
Loading
Loading
+37 −1
Original line number Diff line number Diff line
@@ -138,6 +138,7 @@ static u32 handle[] = {
};

static unsigned long dimm_fail_cmd_flags[NUM_DCR];
static int dimm_fail_cmd_code[NUM_DCR];

struct nfit_test_fw {
	enum intel_fw_update_state state;
@@ -892,8 +893,11 @@ static int get_dimm(struct nfit_mem *nfit_mem, unsigned int func)
	if (i >= ARRAY_SIZE(handle))
		return -ENXIO;

	if ((1 << func) & dimm_fail_cmd_flags[i])
	if ((1 << func) & dimm_fail_cmd_flags[i]) {
		if (dimm_fail_cmd_code[i])
			return dimm_fail_cmd_code[i];
		return -EIO;
	}

	return i;
}
@@ -1225,8 +1229,40 @@ static ssize_t fail_cmd_store(struct device *dev, struct device_attribute *attr,
}
static DEVICE_ATTR_RW(fail_cmd);

static ssize_t fail_cmd_code_show(struct device *dev, struct device_attribute *attr,
		char *buf)
{
	int dimm = dimm_name_to_id(dev);

	if (dimm < 0)
		return dimm;

	return sprintf(buf, "%d\n", dimm_fail_cmd_code[dimm]);
}

static ssize_t fail_cmd_code_store(struct device *dev, struct device_attribute *attr,
		const char *buf, size_t size)
{
	int dimm = dimm_name_to_id(dev);
	unsigned long val;
	ssize_t rc;

	if (dimm < 0)
		return dimm;

	rc = kstrtol(buf, 0, &val);
	if (rc)
		return rc;

	dimm_fail_cmd_code[dimm] = val;
	return size;
}
static DEVICE_ATTR_RW(fail_cmd_code);


static struct attribute *nfit_test_dimm_attributes[] = {
	&dev_attr_fail_cmd.attr,
	&dev_attr_fail_cmd_code.attr,
	&dev_attr_handle.attr,
	NULL,
};