net: dsa: sja1105: fix broken connection with the sja1110 tagger
[linux-2.6-microblaze.git] / drivers / net / dsa / sja1105 / sja1105_main.c
index c21822b..b513713 100644 (file)
@@ -2705,6 +2705,22 @@ static void sja1105_port_deferred_xmit(struct kthread_work *work)
        kfree(xmit_work);
 }
 
+static int sja1105_connect_tag_protocol(struct dsa_switch *ds,
+                                       enum dsa_tag_protocol proto)
+{
+       struct sja1105_private *priv = ds->priv;
+       struct sja1105_tagger_data *tagger_data;
+
+       if (proto != priv->info->tag_proto)
+               return -EPROTONOSUPPORT;
+
+       tagger_data = sja1105_tagger_data(ds);
+       tagger_data->xmit_work_fn = sja1105_port_deferred_xmit;
+       tagger_data->meta_tstamp_handler = sja1110_process_meta_tstamp;
+
+       return 0;
+}
+
 /* The MAXAGE setting belongs to the L2 Forwarding Parameters table,
  * which cannot be reconfigured at runtime. So a switch reset is required.
  */
@@ -3005,47 +3021,6 @@ static int sja1105_port_bridge_flags(struct dsa_switch *ds, int port,
        return 0;
 }
 
-static void sja1105_teardown_ports(struct sja1105_private *priv)
-{
-       struct sja1105_tagger_data *tagger_data = &priv->tagger_data;
-
-       kthread_destroy_worker(tagger_data->xmit_worker);
-}
-
-static int sja1105_setup_ports(struct sja1105_private *priv)
-{
-       struct sja1105_tagger_data *tagger_data = &priv->tagger_data;
-       struct dsa_switch *ds = priv->ds;
-       struct kthread_worker *worker;
-       int port;
-
-       worker = kthread_create_worker(0, "dsa%d:%d_xmit", ds->dst->index,
-                                      ds->index);
-       if (IS_ERR(worker)) {
-               dev_err(ds->dev,
-                       "failed to create deferred xmit thread: %pe\n",
-                       worker);
-               return PTR_ERR(worker);
-       }
-
-       tagger_data->xmit_worker = worker;
-       tagger_data->xmit_work_fn = sja1105_port_deferred_xmit;
-
-       /* Connections between dsa_port and sja1105_port */
-       for (port = 0; port < ds->num_ports; port++) {
-               struct sja1105_port *sp = &priv->ports[port];
-               struct dsa_port *dp = dsa_to_port(ds, port);
-
-               if (!dsa_port_is_user(dp))
-                       continue;
-
-               dp->priv = sp;
-               sp->data = tagger_data;
-       }
-
-       return 0;
-}
-
 /* The programming model for the SJA1105 switch is "all-at-once" via static
  * configuration tables. Some of these can be dynamically modified at runtime,
  * but not the xMII mode parameters table.
@@ -3091,10 +3066,6 @@ static int sja1105_setup(struct dsa_switch *ds)
                }
        }
 
-       rc = sja1105_setup_ports(priv);
-       if (rc)
-               goto out_static_config_free;
-
        sja1105_tas_setup(ds);
        sja1105_flower_setup(ds);
 
@@ -3151,7 +3122,6 @@ out_ptp_clock_unregister:
 out_flower_teardown:
        sja1105_flower_teardown(ds);
        sja1105_tas_teardown(ds);
-       sja1105_teardown_ports(priv);
 out_static_config_free:
        sja1105_static_config_free(&priv->static_config);
 
@@ -3171,12 +3141,12 @@ static void sja1105_teardown(struct dsa_switch *ds)
        sja1105_ptp_clock_unregister(ds);
        sja1105_flower_teardown(ds);
        sja1105_tas_teardown(ds);
-       sja1105_teardown_ports(priv);
        sja1105_static_config_free(&priv->static_config);
 }
 
 static const struct dsa_switch_ops sja1105_switch_ops = {
        .get_tag_protocol       = sja1105_get_tag_protocol,
+       .connect_tag_protocol   = sja1105_connect_tag_protocol,
        .setup                  = sja1105_setup,
        .teardown               = sja1105_teardown,
        .set_ageing_time        = sja1105_set_ageing_time,
@@ -3357,6 +3327,7 @@ static int sja1105_probe(struct spi_device *spi)
        mutex_init(&priv->ptp_data.lock);
        mutex_init(&priv->dynamic_config_lock);
        mutex_init(&priv->mgmt_lock);
+       spin_lock_init(&priv->ts_id_lock);
 
        rc = sja1105_parse_dt(priv);
        if (rc < 0) {