ipq806x: convert to using qca8k
[openwrt/staging/blogic.git] / target / linux / ipq806x / patches-4.9 / 908-net-dsa-qca8k-add-offloading-hooks.patch
1 From 8402a58cd1968ce6893b17fa4615349015b333c8 Mon Sep 17 00:00:00 2001
2 From: John Crispin <john@phrozen.org>
3 Date: Tue, 1 Nov 2016 01:53:34 +0100
4 Subject: [PATCH 20/22] net: dsa: qca8k: add offloading hooks
5
6 Modify the driver to accomodate the requirements of the offloading code.
7 Do so by making the register access functions none static and calling the
8 init/exit functions.
9
10 Signed-off-by: John Crispin <john@phrozen.org>
11 ---
12 drivers/net/dsa/qca8k.c | 27 ++++++++++++---------------
13 drivers/net/dsa/qca8k.h | 24 ++++++++++++++++++++++++
14 2 files changed, 36 insertions(+), 15 deletions(-)
15
16 Index: linux-4.9.34/drivers/net/dsa/qca8k.c
17 ===================================================================
18 --- linux-4.9.34.orig/drivers/net/dsa/qca8k.c
19 +++ linux-4.9.34/drivers/net/dsa/qca8k.c
20 @@ -34,6 +34,9 @@
21 .name = (_n), \
22 }
23
24 +struct qca8k_priv *qca8k_priv = NULL;
25 +EXPORT_SYMBOL_GPL(qca8k_priv);
26 +
27 static const struct qca8k_mib_desc ar8327_mib[] = {
28 MIB_DESC(1, 0x00, "RxBroad"),
29 MIB_DESC(1, 0x04, "RxPause"),
30 @@ -146,7 +149,7 @@ qca8k_set_page(struct mii_bus *bus, u16
31 qca8k_current_page = page;
32 }
33
34 -static u32
35 +u32
36 qca8k_read(struct qca8k_priv *priv, u32 reg)
37 {
38 u16 r1, r2, page;
39 @@ -163,8 +166,9 @@ qca8k_read(struct qca8k_priv *priv, u32
40
41 return val;
42 }
43 +EXPORT_SYMBOL_GPL(qca8k_read);
44
45 -static void
46 +void
47 qca8k_write(struct qca8k_priv *priv, u32 reg, u32 val)
48 {
49 u16 r1, r2, page;
50 @@ -178,8 +182,9 @@ qca8k_write(struct qca8k_priv *priv, u32
51
52 mutex_unlock(&priv->bus->mdio_lock);
53 }
54 +EXPORT_SYMBOL_GPL(qca8k_write);
55
56 -static u32
57 +u32
58 qca8k_rmw(struct qca8k_priv *priv, u32 reg, u32 mask, u32 val)
59 {
60 u16 r1, r2, page;
61 @@ -199,18 +204,7 @@ qca8k_rmw(struct qca8k_priv *priv, u32 r
62
63 return ret;
64 }
65 -
66 -static void
67 -qca8k_reg_set(struct qca8k_priv *priv, u32 reg, u32 val)
68 -{
69 - qca8k_rmw(priv, reg, 0, val);
70 -}
71 -
72 -static void
73 -qca8k_reg_clear(struct qca8k_priv *priv, u32 reg, u32 val)
74 -{
75 - qca8k_rmw(priv, reg, val, 0);
76 -}
77 +EXPORT_SYMBOL_GPL(qca8k_rmw);
78
79 static int
80 qca8k_regmap_read(void *ctx, uint32_t reg, uint32_t *val)
81 @@ -1116,6 +1110,7 @@ qca8k_sw_probe(struct mdio_device *mdiod
82 {
83 struct qca8k_priv *priv;
84 u32 id;
85 + int ret;
86
87 /* allocate the private data struct so that we can probe the switches
88 * ID register
89 @@ -1143,7 +1138,12 @@ qca8k_sw_probe(struct mdio_device *mdiod
90 mutex_init(&priv->reg_mutex);
91 dev_set_drvdata(&mdiodev->dev, priv);
92
93 - return dsa_register_switch(priv->ds, priv->ds->dev->of_node);
94 +
95 + ret = dsa_register_switch(priv->ds, priv->ds->dev->of_node);
96 + if (!ret)
97 + qca8k_priv = priv;
98 +
99 + return ret;
100 }
101
102 static void
103 Index: linux-4.9.34/drivers/net/dsa/qca8k.h
104 ===================================================================
105 --- linux-4.9.34.orig/drivers/net/dsa/qca8k.h
106 +++ linux-4.9.34/drivers/net/dsa/qca8k.h
107 @@ -178,13 +178,17 @@ struct ar8xxx_port_status {
108 int enabled;
109 };
110
111 +struct qca8k_offload *offload;
112 +
113 struct qca8k_priv {
114 struct regmap *regmap;
115 struct mii_bus *bus;
116 struct ar8xxx_port_status port_sts[QCA8K_NUM_PORTS];
117 struct dsa_switch *ds;
118 struct mutex reg_mutex;
119 + struct qca8k_offload *offload;
120 };
121 +extern struct qca8k_priv *qca8k_priv;
122
123 struct qca8k_mib_desc {
124 unsigned int size;
125 @@ -200,4 +204,25 @@ struct qca8k_arl {
126 u8 mac[6];
127 };
128
129 +u32
130 +qca8k_rmw(struct qca8k_priv *priv, u32 reg, u32 mask, u32 val);
131 +
132 +u32
133 +qca8k_read(struct qca8k_priv *priv, u32 reg);
134 +
135 +void
136 +qca8k_write(struct qca8k_priv *priv, u32 reg, u32 val);
137 +
138 +static inline void
139 +qca8k_reg_set(struct qca8k_priv *priv, u32 reg, u32 val)
140 +{
141 + qca8k_rmw(priv, reg, 0, val);
142 +}
143 +
144 +static inline void
145 +qca8k_reg_clear(struct qca8k_priv *priv, u32 reg, u32 val)
146 +{
147 + qca8k_rmw(priv, reg, val, 0);
148 +}
149 +
150 #endif /* __QCA8K_H */