Revert "[SL-UP] Circular callback fix (#85) (#36406)" (#36475)

This reverts commit 078bc30d3f9f5d46c989272b2a50b3f5e8eb2f55.
diff --git a/examples/all-clusters-app/all-clusters-common/src/fan-stub.cpp b/examples/all-clusters-app/all-clusters-common/src/fan-stub.cpp
index 06de80e..e0fb68c 100644
--- a/examples/all-clusters-app/all-clusters-common/src/fan-stub.cpp
+++ b/examples/all-clusters-app/all-clusters-common/src/fan-stub.cpp
@@ -19,6 +19,7 @@
 #include <app-common/zap-generated/cluster-objects.h>
 #include <app-common/zap-generated/ids/Attributes.h>
 #include <app-common/zap-generated/ids/Clusters.h>
+#include <app/AttributeAccessInterface.h>
 #include <app/AttributeAccessInterfaceRegistry.h>
 #include <app/clusters/fan-control-server/fan-control-server.h>
 #include <app/util/attribute-storage.h>
@@ -33,11 +34,13 @@
 using Protocols::InteractionModel::Status;
 
 namespace {
-class FanControlManager : public FanControlAttributeAccessInterface, public Delegate
+class FanControlManager : public AttributeAccessInterface, public Delegate
 {
 public:
     // Register for the FanControl cluster on all endpoints.
-    FanControlManager(EndpointId aEndpointId) : FanControlAttributeAccessInterface(aEndpointId), Delegate(aEndpointId) {}
+    FanControlManager(EndpointId aEndpointId) :
+        AttributeAccessInterface(Optional<EndpointId>(aEndpointId), FanControl::Id), Delegate(aEndpointId)
+    {}
 
     CHIP_ERROR Read(const ConcreteReadAttributePath & aPath, AttributeValueEncoder & aEncoder) override;
     Status HandleStep(StepDirectionEnum aDirection, bool aWrap, bool aLowestOff) override;
diff --git a/src/app/clusters/fan-control-server/fan-control-server.cpp b/src/app/clusters/fan-control-server/fan-control-server.cpp
index 4e10a1b..46f4c6d 100644
--- a/src/app/clusters/fan-control-server/fan-control-server.cpp
+++ b/src/app/clusters/fan-control-server/fan-control-server.cpp
@@ -24,7 +24,6 @@
 #include <app-common/zap-generated/cluster-objects.h>
 #include <app-common/zap-generated/ids/Attributes.h>
 #include <app-common/zap-generated/ids/Clusters.h>
-#include <app/AttributeAccessInterfaceRegistry.h>
 #include <app/CommandHandler.h>
 #include <app/ConcreteCommandPath.h>
 #include <app/clusters/fan-control-server/fan-control-server.h>
@@ -390,7 +389,7 @@
             // Plus 99 then integer divide by 100 instead of multiplying 0.01 to avoid floating point precision error
             uint8_t speedSetting = static_cast<uint8_t>((speedMax * percent + 99) / 100);
 
-            if (currentSpeedSetting != speedSetting)
+            if (currentSpeedSetting.IsNull() || speedSetting != currentSpeedSetting.Value())
             {
                 status = SpeedSetting::Set(attributePath.mEndpointId, speedSetting);
                 VerifyOrReturn(Status::Success == status,
@@ -414,67 +413,26 @@
                                ChipLogError(Zcl, "Failed to set FanMode to off with error: 0x%02x", to_underlying(status)));
             }
 
-            // Adjust PercentSetting from a speed value change for SpeedSetting only when the SpeedSetting change was received
-            // on a write command, not when it was changed by the server or the app logic. This avoids circular logic such as
-            //(with a SpeedMax of 10):
-            // 1. Client sets the PercetSetting to 25%
-            // 2. Server sets the SpeedSetting to 3 through the server callbackm, which sets the PercentSetting to 30%
-            // 3. Server sets the PercentSetting to 30% through the server callback
-        }
-        break;
-    }
-    default:
-        break;
-    }
-}
+            // Adjust PercentSetting from a speed value change for SpeedSetting
+            // percent = floor( speed/SpeedMax * 100 )
+            uint8_t speedMax;
+            status = SpeedMax::Get(attributePath.mEndpointId, &speedMax);
+            VerifyOrReturn(Status::Success == status,
+                           ChipLogError(Zcl, "Failed to get SpeedMax with error: 0x%02x", to_underlying(status)));
 
-CHIP_ERROR FanControlAttributeAccessInterface::Write(const ConcreteDataAttributePath & aPath, AttributeValueDecoder & aDecoder)
-{
-    Status status = Status::Success;
-    switch (aPath.mAttributeId)
-    {
-    case SpeedSetting::Id: {
-        DataModel::Nullable<uint8_t> speedSetting;
-        ReturnErrorOnFailure(aDecoder.Decode(speedSetting));
+            DataModel::Nullable<Percent> currentPercentSetting;
+            status = PercentSetting::Get(attributePath.mEndpointId, currentPercentSetting);
+            VerifyOrReturn(Status::Success == status,
+                           ChipLogError(Zcl, "Failed to get PercentSetting with error: 0x%02x", to_underlying(status)));
 
-        DataModel::Nullable<uint8_t> currentSpeedSetting;
-        status = SpeedSetting::Get(aPath.mEndpointId, currentSpeedSetting);
-        ReturnLogErrorOnFailure(StatusIB(status).ToChipError());
+            float speed            = speedSetting.Value();
+            Percent percentSetting = static_cast<Percent>(speed / speedMax * 100);
 
-        if (speedSetting != currentSpeedSetting)
-        {
-            status = SpeedSetting::Set(aPath.mEndpointId, speedSetting);
-            ReturnLogErrorOnFailure(StatusIB(status).ToChipError());
-            // Skip the last step if we are writing NULL
-            VerifyOrReturnValue(!speedSetting.IsNull(), CHIP_NO_ERROR);
-
-            if (SupportsMultiSpeed(aPath.mEndpointId))
+            if (currentPercentSetting.IsNull() || percentSetting != currentPercentSetting.Value())
             {
-                // If SpeedSetting is set to 0, the server SHALL set the FanMode attribute value to Off.
-                if (speedSetting.Value() == 0)
-                {
-                    status = SetFanModeToOff(aPath.mEndpointId);
-                    ReturnLogErrorOnFailure(StatusIB(status).ToChipError());
-                }
-
-                // Adjust PercentSetting from a speed value change for SpeedSetting
-                // percent = floor( speed/SpeedMax * 100 )
-                uint8_t speedMax;
-                status = SpeedMax::Get(aPath.mEndpointId, &speedMax);
-                ReturnLogErrorOnFailure(StatusIB(status).ToChipError());
-
-                DataModel::Nullable<Percent> currentPercentSetting;
-                status = PercentSetting::Get(aPath.mEndpointId, currentPercentSetting);
-                ReturnLogErrorOnFailure(StatusIB(status).ToChipError());
-
-                float speed            = speedSetting.Value();
-                Percent percentSetting = static_cast<Percent>(speed / speedMax * 100);
-
-                if (currentPercentSetting != percentSetting)
-                {
-                    status = PercentSetting::Set(aPath.mEndpointId, percentSetting);
-                    ReturnLogErrorOnFailure(StatusIB(status).ToChipError());
-                }
+                status = PercentSetting::Set(attributePath.mEndpointId, percentSetting);
+                VerifyOrReturn(Status::Success == status,
+                               ChipLogError(Zcl, "Failed to set PercentSetting with error: 0x%02x", to_underlying(status)));
             }
         }
         break;
@@ -482,7 +440,6 @@
     default:
         break;
     }
-    return CHIP_NO_ERROR;
 }
 
 bool emberAfFanControlClusterStepCallback(app::CommandHandler * commandObj, const app::ConcreteCommandPath & commandPath,
diff --git a/src/app/clusters/fan-control-server/fan-control-server.h b/src/app/clusters/fan-control-server/fan-control-server.h
index 9996749..5721e34 100644
--- a/src/app/clusters/fan-control-server/fan-control-server.h
+++ b/src/app/clusters/fan-control-server/fan-control-server.h
@@ -19,7 +19,6 @@
 
 #include "fan-control-delegate.h"
 #include <app-common/zap-generated/cluster-objects.h>
-#include <app/AttributeAccessInterface.h>
 #include <app/util/af-types.h>
 
 namespace chip {
@@ -27,15 +26,6 @@
 namespace Clusters {
 namespace FanControl {
 
-class FanControlAttributeAccessInterface : public AttributeAccessInterface
-{
-public:
-    FanControlAttributeAccessInterface(EndpointId aEndpoint) : AttributeAccessInterface(Optional<EndpointId>(aEndpoint), Id) {}
-
-    CHIP_ERROR Write(const ConcreteDataAttributePath & aPath, AttributeValueDecoder & aDecoder) override;
-    CHIP_ERROR Read(const ConcreteReadAttributePath & aPath, AttributeValueEncoder & aEncoder) override { return CHIP_NO_ERROR; }
-};
-
 void SetDefaultDelegate(EndpointId aEndpoint, Delegate * aDelegate);
 Delegate * GetDelegate(EndpointId aEndpoint);
 
diff --git a/src/app/util/util.cpp b/src/app/util/util.cpp
index 3c6acab..3072e8a 100644
--- a/src/app/util/util.cpp
+++ b/src/app/util/util.cpp
@@ -107,10 +107,10 @@
 void MatterProxyValidPluginServerInitCallback() {}
 void MatterProxyDiscoveryPluginServerInitCallback() {}
 void MatterProxyConfigurationPluginServerInitCallback() {}
+void MatterFanControlPluginServerInitCallback() {}
 void MatterActivatedCarbonFilterMonitoringPluginServerInitCallback() {}
 void MatterHepaFilterMonitoringPluginServerInitCallback() {}
 void MatterAirQualityPluginServerInitCallback() {}
-void MatterFanControlPluginServerInitCallback() {}
 void MatterCarbonMonoxideConcentrationMeasurementPluginServerInitCallback() {}
 void MatterCarbonDioxideConcentrationMeasurementPluginServerInitCallback() {}
 void MatterFormaldehydeConcentrationMeasurementPluginServerInitCallback() {}