mirror of https://gitee.com/openkylin/linux.git
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: Dan Williams <dan.j.williams@intel.com>
This commit is contained in:
parent
099b07a25f
commit
39611e83a2
|
@ -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)
|
||||||
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,
|
||||||
|
|
||||||
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,
|
||||||
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;
|
||||||
|
|
Loading…
Reference in New Issue