net: dsa: sja1105: Print the reset reason
authorVladimir Oltean <olteanv@gmail.com>
Tue, 12 Nov 2019 21:22:00 +0000 (23:22 +0200)
committerDavid S. Miller <davem@davemloft.net>
Wed, 13 Nov 2019 03:53:07 +0000 (19:53 -0800)
Sometimes it can be quite opaque even for me why the driver decided to
reset the switch. So instead of adding dump_stack() calls each time for
debugging, just add a reset reason to sja1105_static_config_reload
calls which gets printed to the console.

Signed-off-by: Vladimir Oltean <olteanv@gmail.com>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/dsa/sja1105/sja1105.h
drivers/net/dsa/sja1105/sja1105_main.c
drivers/net/dsa/sja1105/sja1105_ptp.c
drivers/net/dsa/sja1105/sja1105_tas.c

index 64b3ee7b97712010c3b4e399760b20cec329d4b0..1a3722971b615a8e75640e13ffb50afee082ee6f 100644 (file)
@@ -115,7 +115,15 @@ typedef enum {
 } sja1105_spi_rw_mode_t;
 
 /* From sja1105_main.c */
-int sja1105_static_config_reload(struct sja1105_private *priv);
+enum sja1105_reset_reason {
+       SJA1105_VLAN_FILTERING = 0,
+       SJA1105_RX_HWTSTAMPING,
+       SJA1105_AGEING_TIME,
+       SJA1105_SCHEDULING,
+};
+
+int sja1105_static_config_reload(struct sja1105_private *priv,
+                                enum sja1105_reset_reason reason);
 
 /* From sja1105_spi.c */
 int sja1105_xfer_buf(const struct sja1105_private *priv,
index 475cc2d8b0e83a49b6022c0b195b81b504303f69..b60224c5524433341d7af7cfc6927b9d152bd477 100644 (file)
@@ -1341,13 +1341,21 @@ static void sja1105_bridge_leave(struct dsa_switch *ds, int port,
        sja1105_bridge_member(ds, port, br, false);
 }
 
+static const char * const sja1105_reset_reasons[] = {
+       [SJA1105_VLAN_FILTERING] = "VLAN filtering",
+       [SJA1105_RX_HWTSTAMPING] = "RX timestamping",
+       [SJA1105_AGEING_TIME] = "Ageing time",
+       [SJA1105_SCHEDULING] = "Time-aware scheduling",
+};
+
 /* For situations where we need to change a setting at runtime that is only
  * available through the static configuration, resetting the switch in order
  * to upload the new static config is unavoidable. Back up the settings we
  * modify at runtime (currently only MAC) and restore them after uploading,
  * such that this operation is relatively seamless.
  */
-int sja1105_static_config_reload(struct sja1105_private *priv)
+int sja1105_static_config_reload(struct sja1105_private *priv,
+                                enum sja1105_reset_reason reason)
 {
        struct ptp_system_timestamp ptp_sts_before;
        struct ptp_system_timestamp ptp_sts_after;
@@ -1405,6 +1413,10 @@ int sja1105_static_config_reload(struct sja1105_private *priv)
 out_unlock_ptp:
        mutex_unlock(&priv->ptp_data.lock);
 
+       dev_info(priv->ds->dev,
+                "Reset switch and programmed static config. Reason: %s\n",
+                sja1105_reset_reasons[reason]);
+
        /* Configure the CGU (PLLs) for MII and RMII PHYs.
         * For these interfaces there is no dynamic configuration
         * needed, since PLLs have same settings at all speeds.
@@ -1599,7 +1611,7 @@ static int sja1105_vlan_filtering(struct dsa_switch *ds, int port, bool enabled)
        l2_lookup_params = table->entries;
        l2_lookup_params->shared_learn = !enabled;
 
-       rc = sja1105_static_config_reload(priv);
+       rc = sja1105_static_config_reload(priv, SJA1105_VLAN_FILTERING);
        if (rc)
                dev_err(ds->dev, "Failed to change VLAN Ethertype\n");
 
@@ -1871,7 +1883,7 @@ static int sja1105_set_ageing_time(struct dsa_switch *ds,
 
        l2_lookup_params->maxage = maxage;
 
-       return sja1105_static_config_reload(priv);
+       return sja1105_static_config_reload(priv, SJA1105_AGEING_TIME);
 }
 
 static int sja1105_port_setup_tc(struct dsa_switch *ds, int port,
index 0a35813f9328e7e79f742d03c9e1329b5e95dada..6b9b2bef8a7b89dc3f9786dfc6ce484ab0f259d6 100644 (file)
@@ -102,7 +102,7 @@ static int sja1105_change_rxtstamping(struct sja1105_private *priv,
                priv->tagger_data.stampable_skb = NULL;
        }
 
-       return sja1105_static_config_reload(priv);
+       return sja1105_static_config_reload(priv, SJA1105_RX_HWTSTAMPING);
 }
 
 int sja1105_hwtstamp_set(struct dsa_switch *ds, int port, struct ifreq *ifr)
index 33eca6a82ec5b543bf327c12300b5a72ef24a9d9..d846fb5c4e4db970dd1c95cc1ea279099b50fd2d 100644 (file)
@@ -352,7 +352,7 @@ int sja1105_setup_tc_taprio(struct dsa_switch *ds, int port,
                if (rc < 0)
                        return rc;
 
-               return sja1105_static_config_reload(priv);
+               return sja1105_static_config_reload(priv, SJA1105_SCHEDULING);
        }
 
        /* The cycle time extension is the amount of time the last cycle from
@@ -400,7 +400,7 @@ int sja1105_setup_tc_taprio(struct dsa_switch *ds, int port,
        if (rc < 0)
                return rc;
 
-       return sja1105_static_config_reload(priv);
+       return sja1105_static_config_reload(priv, SJA1105_SCHEDULING);
 }
 
 void sja1105_tas_setup(struct dsa_switch *ds)