Commit 844d7edc authored by Vladimir Oltean's avatar Vladimir Oltean Committed by David S. Miller

net: dsa: sja1105: Add a global sja1105_tagger_data structure

This will be used to keep state for RX timestamping. It is global
because the switch serializes timestampable and meta frames when
trapping them towards the CPU port (lower port indices have higher
priority) and therefore having one state machine per port would create
unnecessary complications.
Signed-off-by: default avatarVladimir Oltean <olteanv@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent e53e18a6
...@@ -103,6 +103,7 @@ struct sja1105_private { ...@@ -103,6 +103,7 @@ struct sja1105_private {
* the switch doesn't confuse them with one another. * the switch doesn't confuse them with one another.
*/ */
struct mutex mgmt_lock; struct mutex mgmt_lock;
struct sja1105_tagger_data tagger_data;
}; };
#include "sja1105_dynamic_config.h" #include "sja1105_dynamic_config.h"
......
...@@ -1828,6 +1828,7 @@ static int sja1105_check_device_id(struct sja1105_private *priv) ...@@ -1828,6 +1828,7 @@ static int sja1105_check_device_id(struct sja1105_private *priv)
static int sja1105_probe(struct spi_device *spi) static int sja1105_probe(struct spi_device *spi)
{ {
struct sja1105_tagger_data *tagger_data;
struct device *dev = &spi->dev; struct device *dev = &spi->dev;
struct sja1105_private *priv; struct sja1105_private *priv;
struct dsa_switch *ds; struct dsa_switch *ds;
...@@ -1882,12 +1883,16 @@ static int sja1105_probe(struct spi_device *spi) ...@@ -1882,12 +1883,16 @@ static int sja1105_probe(struct spi_device *spi)
ds->priv = priv; ds->priv = priv;
priv->ds = ds; priv->ds = ds;
tagger_data = &priv->tagger_data;
skb_queue_head_init(&tagger_data->skb_rxtstamp_queue);
/* Connections between dsa_port and sja1105_port */ /* Connections between dsa_port and sja1105_port */
for (i = 0; i < SJA1105_NUM_PORTS; i++) { for (i = 0; i < SJA1105_NUM_PORTS; i++) {
struct sja1105_port *sp = &priv->ports[i]; struct sja1105_port *sp = &priv->ports[i];
ds->ports[i].priv = sp; ds->ports[i].priv = sp;
sp->dp = &ds->ports[i]; sp->dp = &ds->ports[i];
sp->data = tagger_data;
} }
mutex_init(&priv->mgmt_lock); mutex_init(&priv->mgmt_lock);
......
...@@ -31,7 +31,22 @@ ...@@ -31,7 +31,22 @@
#define SJA1105_META_SMAC 0x222222222222ull #define SJA1105_META_SMAC 0x222222222222ull
#define SJA1105_META_DMAC 0x0180C200000Eull #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_port {
struct sja1105_tagger_data *data;
struct dsa_port *dp; struct dsa_port *dp;
bool hwts_tx_en; bool hwts_tx_en;
int mgmt_slot; int mgmt_slot;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment