mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	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
					
				
					 1 changed files with 32 additions and 17 deletions
				
			
		| 
						 | 
					@ -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 a new issue