* the switch doesn't confuse them with one another.
         */
        struct mutex mgmt_lock;
+       struct sja1105_tagger_data tagger_data;
 };
 
 #include "sja1105_dynamic_config.h"
 
 
 static int sja1105_probe(struct spi_device *spi)
 {
+       struct sja1105_tagger_data *tagger_data;
        struct device *dev = &spi->dev;
        struct sja1105_private *priv;
        struct dsa_switch *ds;
        ds->priv = priv;
        priv->ds = ds;
 
+       tagger_data = &priv->tagger_data;
+       skb_queue_head_init(&tagger_data->skb_rxtstamp_queue);
+
        /* Connections between dsa_port and sja1105_port */
        for (i = 0; i < SJA1105_NUM_PORTS; i++) {
                struct sja1105_port *sp = &priv->ports[i];
 
                ds->ports[i].priv = sp;
                sp->dp = &ds->ports[i];
+               sp->data = tagger_data;
        }
        mutex_init(&priv->mgmt_lock);
 
 
 #define SJA1105_META_SMAC                      0x222222222222ull
 #define SJA1105_META_DMAC                      0x0180C200000Eull
 
+/* Global tagger data: each struct sja1105_port has a reference to
+ * the structure defined in struct sja1105_private.
+ */
+struct sja1105_tagger_data {
+       struct sk_buff_head skb_rxtstamp_queue;
+       struct work_struct rxtstamp_work;
+       struct sk_buff *stampable_skb;
+       /* Protects concurrent access to the meta state machine
+        * from taggers running on multiple ports on SMP systems
+        */
+       spinlock_t meta_lock;
+       bool hwts_rx_en;
+};
+
 struct sja1105_port {
+       struct sja1105_tagger_data *data;
        struct dsa_port *dp;
        bool hwts_tx_en;
        int mgmt_slot;