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

Commit cc3d3458 authored by Dave Jiang's avatar Dave Jiang
Browse files

acpi/nfit: queue issuing of ars when an uc error notification comes in



When the ACPI UC error notifier gets called and ARS_REQ bit is set
with the passed in flag, we can receive -EBUSY if ARS_REQ bit is already
set for the nfit_spa->ars_state. When that happens, the ARS request is
dropped. That can potentially cause us to miss the unreported errors that
the on going ARS request does not receive. Add an ARS_REQ_REDO state that
will request short ARS upon ARS completion to grab any errors we missed.

Signed-off-by: default avatarDave Jiang <dave.jiang@intel.com>
Reviewed-by: default avatarVishal Verma <vishal.l.verma@intel.com>
parent 1e687220
Loading
Loading
Loading
Loading
+9 −3
Original line number Diff line number Diff line
@@ -2567,6 +2567,11 @@ static void ars_complete(struct acpi_nfit_desc *acpi_desc,
			test_bit(ARS_SHORT, &nfit_spa->ars_state)
			? "short" : "long");
	clear_bit(ARS_SHORT, &nfit_spa->ars_state);
	if (test_and_clear_bit(ARS_REQ_REDO, &nfit_spa->ars_state)) {
		set_bit(ARS_SHORT, &nfit_spa->ars_state);
		set_bit(ARS_REQ, &nfit_spa->ars_state);
		dev_dbg(dev, "ARS: processing scrub request received while in progress\n");
	} else
		set_bit(ARS_DONE, &nfit_spa->ars_state);
}

@@ -3242,9 +3247,10 @@ int acpi_nfit_ars_rescan(struct acpi_nfit_desc *acpi_desc, unsigned long flags)
		if (test_bit(ARS_FAILED, &nfit_spa->ars_state))
			continue;

		if (test_and_set_bit(ARS_REQ, &nfit_spa->ars_state))
		if (test_and_set_bit(ARS_REQ, &nfit_spa->ars_state)) {
			busy++;
		else {
			set_bit(ARS_REQ_REDO, &nfit_spa->ars_state);
		} else {
			if (test_bit(ARS_SHORT, &flags))
				set_bit(ARS_SHORT, &nfit_spa->ars_state);
			scheduled++;
+1 −0
Original line number Diff line number Diff line
@@ -119,6 +119,7 @@ enum nfit_dimm_notifiers {

enum nfit_ars_state {
	ARS_REQ,
	ARS_REQ_REDO,
	ARS_DONE,
	ARS_SHORT,
	ARS_FAILED,