diff options
Diffstat (limited to 'drivers/acpi/nfit/core.c')
| -rw-r--r-- | drivers/acpi/nfit/core.c | 48 | 
1 files changed, 37 insertions, 11 deletions
diff --git a/drivers/acpi/nfit/core.c b/drivers/acpi/nfit/core.c index d15814e1727f..7c479002e798 100644 --- a/drivers/acpi/nfit/core.c +++ b/drivers/acpi/nfit/core.c @@ -408,6 +408,8 @@ int acpi_nfit_ctl(struct nvdimm_bus_descriptor *nd_desc, struct nvdimm *nvdimm,  	const guid_t *guid;  	int rc, i; +	if (cmd_rc) +		*cmd_rc = -EINVAL;  	func = cmd;  	if (cmd == ND_CMD_CALL) {  		call_pkg = buf; @@ -518,6 +520,8 @@ int acpi_nfit_ctl(struct nvdimm_bus_descriptor *nd_desc, struct nvdimm *nvdimm,  		 * If we return an error (like elsewhere) then caller wouldn't  		 * be able to rely upon data returned to make calculation.  		 */ +		if (cmd_rc) +			*cmd_rc = 0;  		return 0;  	} @@ -1273,7 +1277,7 @@ static ssize_t scrub_show(struct device *dev,  		mutex_lock(&acpi_desc->init_mutex);  		rc = sprintf(buf, "%d%s", acpi_desc->scrub_count, -				work_busy(&acpi_desc->dwork.work) +				acpi_desc->scrub_busy  				&& !acpi_desc->cancel ? "+\n" : "\n");  		mutex_unlock(&acpi_desc->init_mutex);  	} @@ -2939,6 +2943,32 @@ static unsigned int __acpi_nfit_scrub(struct acpi_nfit_desc *acpi_desc,  	return 0;  } +static void __sched_ars(struct acpi_nfit_desc *acpi_desc, unsigned int tmo) +{ +	lockdep_assert_held(&acpi_desc->init_mutex); + +	acpi_desc->scrub_busy = 1; +	/* note this should only be set from within the workqueue */ +	if (tmo) +		acpi_desc->scrub_tmo = tmo; +	queue_delayed_work(nfit_wq, &acpi_desc->dwork, tmo * HZ); +} + +static void sched_ars(struct acpi_nfit_desc *acpi_desc) +{ +	__sched_ars(acpi_desc, 0); +} + +static void notify_ars_done(struct acpi_nfit_desc *acpi_desc) +{ +	lockdep_assert_held(&acpi_desc->init_mutex); + +	acpi_desc->scrub_busy = 0; +	acpi_desc->scrub_count++; +	if (acpi_desc->scrub_count_state) +		sysfs_notify_dirent(acpi_desc->scrub_count_state); +} +  static void acpi_nfit_scrub(struct work_struct *work)  {  	struct acpi_nfit_desc *acpi_desc; @@ -2949,14 +2979,10 @@ static void acpi_nfit_scrub(struct work_struct *work)  	mutex_lock(&acpi_desc->init_mutex);  	query_rc = acpi_nfit_query_poison(acpi_desc);  	tmo = __acpi_nfit_scrub(acpi_desc, query_rc); -	if (tmo) { -		queue_delayed_work(nfit_wq, &acpi_desc->dwork, tmo * HZ); -		acpi_desc->scrub_tmo = tmo; -	} else { -		acpi_desc->scrub_count++; -		if (acpi_desc->scrub_count_state) -			sysfs_notify_dirent(acpi_desc->scrub_count_state); -	} +	if (tmo) +		__sched_ars(acpi_desc, tmo); +	else +		notify_ars_done(acpi_desc);  	memset(acpi_desc->ars_status, 0, acpi_desc->max_ars);  	mutex_unlock(&acpi_desc->init_mutex);  } @@ -3037,7 +3063,7 @@ static int acpi_nfit_register_regions(struct acpi_nfit_desc *acpi_desc)  			break;  		} -	queue_delayed_work(nfit_wq, &acpi_desc->dwork, 0); +	sched_ars(acpi_desc);  	return 0;  } @@ -3239,7 +3265,7 @@ int acpi_nfit_ars_rescan(struct acpi_nfit_desc *acpi_desc, unsigned long flags)  		}  	}  	if (scheduled) { -		queue_delayed_work(nfit_wq, &acpi_desc->dwork, 0); +		sched_ars(acpi_desc);  		dev_dbg(dev, "ars_scan triggered\n");  	}  	mutex_unlock(&acpi_desc->init_mutex);  | 
