diff options
author | Andrew Lunn <andrew@lunn.ch> | 2019-04-28 13:37:16 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2019-04-28 19:41:01 -0400 |
commit | bdc6fe5bb1d1c245fc8eec6f83c77ca31fda7778 (patch) | |
tree | 0c7152ff7335f65b9a6264d487f0183befa51cd4 /net/dsa/dsa.c | |
parent | d3b8c04988ca1685700e345a82a1396df79e6291 (diff) |
dsa: Keep link list of tag drivers
Let the tag drivers register themselves with the DSA core, keeping
them in a linked list.
Signed-off-by: Andrew Lunn <andrew@lunn.ch>
v2
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/dsa/dsa.c')
-rw-r--r-- | net/dsa/dsa.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/net/dsa/dsa.c b/net/dsa/dsa.c index 34becafbd37b..32778df1be27 100644 --- a/net/dsa/dsa.c +++ b/net/dsa/dsa.c | |||
@@ -27,6 +27,9 @@ | |||
27 | 27 | ||
28 | #include "dsa_priv.h" | 28 | #include "dsa_priv.h" |
29 | 29 | ||
30 | static LIST_HEAD(dsa_tag_drivers_list); | ||
31 | static DEFINE_MUTEX(dsa_tag_drivers_lock); | ||
32 | |||
30 | static struct sk_buff *dsa_slave_notag_xmit(struct sk_buff *skb, | 33 | static struct sk_buff *dsa_slave_notag_xmit(struct sk_buff *skb, |
31 | struct net_device *dev) | 34 | struct net_device *dev) |
32 | { | 35 | { |
@@ -76,15 +79,40 @@ const struct dsa_device_ops *dsa_device_ops[DSA_TAG_LAST] = { | |||
76 | [DSA_TAG_PROTO_NONE] = &none_ops, | 79 | [DSA_TAG_PROTO_NONE] = &none_ops, |
77 | }; | 80 | }; |
78 | 81 | ||
82 | static void dsa_tag_driver_register(struct dsa_tag_driver *dsa_tag_driver, | ||
83 | struct module *owner) | ||
84 | { | ||
85 | dsa_tag_driver->owner = owner; | ||
86 | |||
87 | mutex_lock(&dsa_tag_drivers_lock); | ||
88 | list_add_tail(&dsa_tag_driver->list, &dsa_tag_drivers_list); | ||
89 | mutex_unlock(&dsa_tag_drivers_lock); | ||
90 | } | ||
91 | |||
79 | void dsa_tag_drivers_register(struct dsa_tag_driver *dsa_tag_driver_array[], | 92 | void dsa_tag_drivers_register(struct dsa_tag_driver *dsa_tag_driver_array[], |
80 | unsigned int count, struct module *owner) | 93 | unsigned int count, struct module *owner) |
81 | { | 94 | { |
95 | unsigned int i; | ||
96 | |||
97 | for (i = 0; i < count; i++) | ||
98 | dsa_tag_driver_register(dsa_tag_driver_array[i], owner); | ||
99 | } | ||
100 | |||
101 | static void dsa_tag_driver_unregister(struct dsa_tag_driver *dsa_tag_driver) | ||
102 | { | ||
103 | mutex_lock(&dsa_tag_drivers_lock); | ||
104 | list_del(&dsa_tag_driver->list); | ||
105 | mutex_unlock(&dsa_tag_drivers_lock); | ||
82 | } | 106 | } |
83 | EXPORT_SYMBOL_GPL(dsa_tag_drivers_register); | 107 | EXPORT_SYMBOL_GPL(dsa_tag_drivers_register); |
84 | 108 | ||
85 | void dsa_tag_drivers_unregister(struct dsa_tag_driver *dsa_tag_driver_array[], | 109 | void dsa_tag_drivers_unregister(struct dsa_tag_driver *dsa_tag_driver_array[], |
86 | unsigned int count) | 110 | unsigned int count) |
87 | { | 111 | { |
112 | unsigned int i; | ||
113 | |||
114 | for (i = 0; i < count; i++) | ||
115 | dsa_tag_driver_unregister(dsa_tag_driver_array[i]); | ||
88 | } | 116 | } |
89 | EXPORT_SYMBOL_GPL(dsa_tag_drivers_unregister); | 117 | EXPORT_SYMBOL_GPL(dsa_tag_drivers_unregister); |
90 | 118 | ||