Commit 39611e83 authored by Dan Williams's avatar Dan Williams

tools/testing/nvdimm: Make DSM failure code injection an override

In order to emulate the behavior of the NVDIMM_FAMILY_INTEL DSMs
nfit_test needs the ability to execute the DSM and then override the
return code.

Split the current return code injection from get_dimm() and apply at
after the function has executed to override the return status.
Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>
parent 099b07a2
...@@ -884,6 +884,16 @@ static int nd_intel_test_cmd_set_lss_status(struct nfit_test *t, ...@@ -884,6 +884,16 @@ static int nd_intel_test_cmd_set_lss_status(struct nfit_test *t,
return 0; return 0;
} }
static int override_return_code(int dimm, unsigned int func, int rc)
{
if ((1 << func) & dimm_fail_cmd_flags[dimm]) {
if (dimm_fail_cmd_code[dimm])
return dimm_fail_cmd_code[dimm];
return -EIO;
}
return rc;
}
static int get_dimm(struct nfit_mem *nfit_mem, unsigned int func) static int get_dimm(struct nfit_mem *nfit_mem, unsigned int func)
{ {
int i; int i;
...@@ -894,13 +904,6 @@ static int get_dimm(struct nfit_mem *nfit_mem, unsigned int func) ...@@ -894,13 +904,6 @@ static int get_dimm(struct nfit_mem *nfit_mem, unsigned int func)
break; break;
if (i >= ARRAY_SIZE(handle)) if (i >= ARRAY_SIZE(handle))
return -ENXIO; return -ENXIO;
if ((1 << func) & dimm_fail_cmd_flags[i]) {
if (dimm_fail_cmd_code[i])
return dimm_fail_cmd_code[i];
return -EIO;
}
return i; return i;
} }
...@@ -939,48 +942,59 @@ static int nfit_test_ctl(struct nvdimm_bus_descriptor *nd_desc, ...@@ -939,48 +942,59 @@ static int nfit_test_ctl(struct nvdimm_bus_descriptor *nd_desc,
switch (func) { switch (func) {
case ND_INTEL_ENABLE_LSS_STATUS: case ND_INTEL_ENABLE_LSS_STATUS:
return nd_intel_test_cmd_set_lss_status(t, rc = nd_intel_test_cmd_set_lss_status(t,
buf, buf_len); buf, buf_len);
break;
case ND_INTEL_FW_GET_INFO: case ND_INTEL_FW_GET_INFO:
return nd_intel_test_get_fw_info(t, buf, rc = nd_intel_test_get_fw_info(t, buf,
buf_len, i - t->dcr_idx); buf_len, i - t->dcr_idx);
break;
case ND_INTEL_FW_START_UPDATE: case ND_INTEL_FW_START_UPDATE:
return nd_intel_test_start_update(t, buf, rc = nd_intel_test_start_update(t, buf,
buf_len, i - t->dcr_idx); buf_len, i - t->dcr_idx);
break;
case ND_INTEL_FW_SEND_DATA: case ND_INTEL_FW_SEND_DATA:
return nd_intel_test_send_data(t, buf, rc = nd_intel_test_send_data(t, buf,
buf_len, i - t->dcr_idx); buf_len, i - t->dcr_idx);
break;
case ND_INTEL_FW_FINISH_UPDATE: case ND_INTEL_FW_FINISH_UPDATE:
return nd_intel_test_finish_fw(t, buf, rc = nd_intel_test_finish_fw(t, buf,
buf_len, i - t->dcr_idx); buf_len, i - t->dcr_idx);
break;
case ND_INTEL_FW_FINISH_QUERY: case ND_INTEL_FW_FINISH_QUERY:
return nd_intel_test_finish_query(t, buf, rc = nd_intel_test_finish_query(t, buf,
buf_len, i - t->dcr_idx); buf_len, i - t->dcr_idx);
break;
case ND_INTEL_SMART: case ND_INTEL_SMART:
return nfit_test_cmd_smart(buf, buf_len, rc = nfit_test_cmd_smart(buf, buf_len,
&t->smart[i - t->dcr_idx]); &t->smart[i - t->dcr_idx]);
break;
case ND_INTEL_SMART_THRESHOLD: case ND_INTEL_SMART_THRESHOLD:
return nfit_test_cmd_smart_threshold(buf, rc = nfit_test_cmd_smart_threshold(buf,
buf_len, buf_len,
&t->smart_threshold[i - &t->smart_threshold[i -
t->dcr_idx]); t->dcr_idx]);
break;
case ND_INTEL_SMART_SET_THRESHOLD: case ND_INTEL_SMART_SET_THRESHOLD:
return nfit_test_cmd_smart_set_threshold(buf, rc = nfit_test_cmd_smart_set_threshold(buf,
buf_len, buf_len,
&t->smart_threshold[i - &t->smart_threshold[i -
t->dcr_idx], t->dcr_idx],
&t->smart[i - t->dcr_idx], &t->smart[i - t->dcr_idx],
&t->pdev.dev, t->dimm_dev[i]); &t->pdev.dev, t->dimm_dev[i]);
break;
case ND_INTEL_SMART_INJECT: case ND_INTEL_SMART_INJECT:
return nfit_test_cmd_smart_inject(buf, rc = nfit_test_cmd_smart_inject(buf,
buf_len, buf_len,
&t->smart_threshold[i - &t->smart_threshold[i -
t->dcr_idx], t->dcr_idx],
&t->smart[i - t->dcr_idx], &t->smart[i - t->dcr_idx],
&t->pdev.dev, t->dimm_dev[i]); &t->pdev.dev, t->dimm_dev[i]);
break;
default: default:
return -ENOTTY; return -ENOTTY;
} }
return override_return_code(i, func, rc);
} }
if (!test_bit(cmd, &cmd_mask) if (!test_bit(cmd, &cmd_mask)
...@@ -1006,6 +1020,7 @@ static int nfit_test_ctl(struct nvdimm_bus_descriptor *nd_desc, ...@@ -1006,6 +1020,7 @@ static int nfit_test_ctl(struct nvdimm_bus_descriptor *nd_desc,
default: default:
return -ENOTTY; return -ENOTTY;
} }
return override_return_code(i, func, rc);
} else { } else {
struct ars_state *ars_state = &t->ars_state; struct ars_state *ars_state = &t->ars_state;
struct nd_cmd_pkg *call_pkg = buf; struct nd_cmd_pkg *call_pkg = buf;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment