1 | // SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) |
2 | /* QLogic qede NIC Driver |
3 | * Copyright (c) 2015 QLogic Corporation |
4 | * Copyright (c) 2019-2020 Marvell International Ltd. |
5 | */ |
6 | |
7 | #include <linux/types.h> |
8 | #include <linux/netdevice.h> |
9 | #include <linux/rtnetlink.h> |
10 | #include <net/dcbnl.h> |
11 | #include "qede.h" |
12 | |
13 | static u8 qede_dcbnl_getstate(struct net_device *netdev) |
14 | { |
15 | struct qede_dev *edev = netdev_priv(dev: netdev); |
16 | |
17 | return edev->ops->dcb->getstate(edev->cdev); |
18 | } |
19 | |
20 | static u8 qede_dcbnl_setstate(struct net_device *netdev, u8 state) |
21 | { |
22 | struct qede_dev *edev = netdev_priv(dev: netdev); |
23 | |
24 | return edev->ops->dcb->setstate(edev->cdev, state); |
25 | } |
26 | |
27 | static void qede_dcbnl_getpermhwaddr(struct net_device *netdev, |
28 | u8 *perm_addr) |
29 | { |
30 | memcpy(perm_addr, netdev->dev_addr, netdev->addr_len); |
31 | } |
32 | |
33 | static void qede_dcbnl_getpgtccfgtx(struct net_device *netdev, int prio, |
34 | u8 *prio_type, u8 *pgid, u8 *bw_pct, |
35 | u8 *up_map) |
36 | { |
37 | struct qede_dev *edev = netdev_priv(dev: netdev); |
38 | |
39 | edev->ops->dcb->getpgtccfgtx(edev->cdev, prio, prio_type, |
40 | pgid, bw_pct, up_map); |
41 | } |
42 | |
43 | static void qede_dcbnl_getpgbwgcfgtx(struct net_device *netdev, |
44 | int pgid, u8 *bw_pct) |
45 | { |
46 | struct qede_dev *edev = netdev_priv(dev: netdev); |
47 | |
48 | edev->ops->dcb->getpgbwgcfgtx(edev->cdev, pgid, bw_pct); |
49 | } |
50 | |
51 | static void qede_dcbnl_getpgtccfgrx(struct net_device *netdev, int prio, |
52 | u8 *prio_type, u8 *pgid, u8 *bw_pct, |
53 | u8 *up_map) |
54 | { |
55 | struct qede_dev *edev = netdev_priv(dev: netdev); |
56 | |
57 | edev->ops->dcb->getpgtccfgrx(edev->cdev, prio, prio_type, pgid, bw_pct, |
58 | up_map); |
59 | } |
60 | |
61 | static void qede_dcbnl_getpgbwgcfgrx(struct net_device *netdev, |
62 | int pgid, u8 *bw_pct) |
63 | { |
64 | struct qede_dev *edev = netdev_priv(dev: netdev); |
65 | |
66 | edev->ops->dcb->getpgbwgcfgrx(edev->cdev, pgid, bw_pct); |
67 | } |
68 | |
69 | static void qede_dcbnl_getpfccfg(struct net_device *netdev, int prio, |
70 | u8 *setting) |
71 | { |
72 | struct qede_dev *edev = netdev_priv(dev: netdev); |
73 | |
74 | edev->ops->dcb->getpfccfg(edev->cdev, prio, setting); |
75 | } |
76 | |
77 | static void qede_dcbnl_setpfccfg(struct net_device *netdev, int prio, |
78 | u8 setting) |
79 | { |
80 | struct qede_dev *edev = netdev_priv(dev: netdev); |
81 | |
82 | edev->ops->dcb->setpfccfg(edev->cdev, prio, setting); |
83 | } |
84 | |
85 | static u8 qede_dcbnl_getcap(struct net_device *netdev, int capid, u8 *cap) |
86 | { |
87 | struct qede_dev *edev = netdev_priv(dev: netdev); |
88 | |
89 | return edev->ops->dcb->getcap(edev->cdev, capid, cap); |
90 | } |
91 | |
92 | static int qede_dcbnl_getnumtcs(struct net_device *netdev, int tcid, u8 *num) |
93 | { |
94 | struct qede_dev *edev = netdev_priv(dev: netdev); |
95 | |
96 | return edev->ops->dcb->getnumtcs(edev->cdev, tcid, num); |
97 | } |
98 | |
99 | static u8 qede_dcbnl_getpfcstate(struct net_device *netdev) |
100 | { |
101 | struct qede_dev *edev = netdev_priv(dev: netdev); |
102 | |
103 | return edev->ops->dcb->getpfcstate(edev->cdev); |
104 | } |
105 | |
106 | static int qede_dcbnl_getapp(struct net_device *netdev, u8 idtype, u16 id) |
107 | { |
108 | struct qede_dev *edev = netdev_priv(dev: netdev); |
109 | |
110 | return edev->ops->dcb->getapp(edev->cdev, idtype, id); |
111 | } |
112 | |
113 | static u8 qede_dcbnl_getdcbx(struct net_device *netdev) |
114 | { |
115 | struct qede_dev *edev = netdev_priv(dev: netdev); |
116 | |
117 | return edev->ops->dcb->getdcbx(edev->cdev); |
118 | } |
119 | |
120 | static void qede_dcbnl_setpgtccfgtx(struct net_device *netdev, int prio, |
121 | u8 pri_type, u8 pgid, u8 bw_pct, u8 up_map) |
122 | { |
123 | struct qede_dev *edev = netdev_priv(dev: netdev); |
124 | |
125 | return edev->ops->dcb->setpgtccfgtx(edev->cdev, prio, pri_type, pgid, |
126 | bw_pct, up_map); |
127 | } |
128 | |
129 | static void qede_dcbnl_setpgtccfgrx(struct net_device *netdev, int prio, |
130 | u8 pri_type, u8 pgid, u8 bw_pct, u8 up_map) |
131 | { |
132 | struct qede_dev *edev = netdev_priv(dev: netdev); |
133 | |
134 | return edev->ops->dcb->setpgtccfgrx(edev->cdev, prio, pri_type, pgid, |
135 | bw_pct, up_map); |
136 | } |
137 | |
138 | static void qede_dcbnl_setpgbwgcfgtx(struct net_device *netdev, int pgid, |
139 | u8 bw_pct) |
140 | { |
141 | struct qede_dev *edev = netdev_priv(dev: netdev); |
142 | |
143 | return edev->ops->dcb->setpgbwgcfgtx(edev->cdev, pgid, bw_pct); |
144 | } |
145 | |
146 | static void qede_dcbnl_setpgbwgcfgrx(struct net_device *netdev, int pgid, |
147 | u8 bw_pct) |
148 | { |
149 | struct qede_dev *edev = netdev_priv(dev: netdev); |
150 | |
151 | return edev->ops->dcb->setpgbwgcfgrx(edev->cdev, pgid, bw_pct); |
152 | } |
153 | |
154 | static u8 qede_dcbnl_setall(struct net_device *netdev) |
155 | { |
156 | struct qede_dev *edev = netdev_priv(dev: netdev); |
157 | |
158 | return edev->ops->dcb->setall(edev->cdev); |
159 | } |
160 | |
161 | static int qede_dcbnl_setnumtcs(struct net_device *netdev, int tcid, u8 num) |
162 | { |
163 | struct qede_dev *edev = netdev_priv(dev: netdev); |
164 | |
165 | return edev->ops->dcb->setnumtcs(edev->cdev, tcid, num); |
166 | } |
167 | |
168 | static void qede_dcbnl_setpfcstate(struct net_device *netdev, u8 state) |
169 | { |
170 | struct qede_dev *edev = netdev_priv(dev: netdev); |
171 | |
172 | return edev->ops->dcb->setpfcstate(edev->cdev, state); |
173 | } |
174 | |
175 | static int qede_dcbnl_setapp(struct net_device *netdev, u8 idtype, u16 idval, |
176 | u8 up) |
177 | { |
178 | struct qede_dev *edev = netdev_priv(dev: netdev); |
179 | |
180 | return edev->ops->dcb->setapp(edev->cdev, idtype, idval, up); |
181 | } |
182 | |
183 | static u8 qede_dcbnl_setdcbx(struct net_device *netdev, u8 state) |
184 | { |
185 | struct qede_dev *edev = netdev_priv(dev: netdev); |
186 | |
187 | return edev->ops->dcb->setdcbx(edev->cdev, state); |
188 | } |
189 | |
190 | static u8 qede_dcbnl_getfeatcfg(struct net_device *netdev, int featid, |
191 | u8 *flags) |
192 | { |
193 | struct qede_dev *edev = netdev_priv(dev: netdev); |
194 | |
195 | return edev->ops->dcb->getfeatcfg(edev->cdev, featid, flags); |
196 | } |
197 | |
198 | static u8 qede_dcbnl_setfeatcfg(struct net_device *netdev, int featid, u8 flags) |
199 | { |
200 | struct qede_dev *edev = netdev_priv(dev: netdev); |
201 | |
202 | return edev->ops->dcb->setfeatcfg(edev->cdev, featid, flags); |
203 | } |
204 | |
205 | static int qede_dcbnl_peer_getappinfo(struct net_device *netdev, |
206 | struct dcb_peer_app_info *info, |
207 | u16 *count) |
208 | { |
209 | struct qede_dev *edev = netdev_priv(dev: netdev); |
210 | |
211 | return edev->ops->dcb->peer_getappinfo(edev->cdev, info, count); |
212 | } |
213 | |
214 | static int qede_dcbnl_peer_getapptable(struct net_device *netdev, |
215 | struct dcb_app *app) |
216 | { |
217 | struct qede_dev *edev = netdev_priv(dev: netdev); |
218 | |
219 | return edev->ops->dcb->peer_getapptable(edev->cdev, app); |
220 | } |
221 | |
222 | static int qede_dcbnl_cee_peer_getpfc(struct net_device *netdev, |
223 | struct cee_pfc *pfc) |
224 | { |
225 | struct qede_dev *edev = netdev_priv(dev: netdev); |
226 | |
227 | return edev->ops->dcb->cee_peer_getpfc(edev->cdev, pfc); |
228 | } |
229 | |
230 | static int qede_dcbnl_cee_peer_getpg(struct net_device *netdev, |
231 | struct cee_pg *pg) |
232 | { |
233 | struct qede_dev *edev = netdev_priv(dev: netdev); |
234 | |
235 | return edev->ops->dcb->cee_peer_getpg(edev->cdev, pg); |
236 | } |
237 | |
238 | static int qede_dcbnl_ieee_getpfc(struct net_device *netdev, |
239 | struct ieee_pfc *pfc) |
240 | { |
241 | struct qede_dev *edev = netdev_priv(dev: netdev); |
242 | |
243 | return edev->ops->dcb->ieee_getpfc(edev->cdev, pfc); |
244 | } |
245 | |
246 | static int qede_dcbnl_ieee_setpfc(struct net_device *netdev, |
247 | struct ieee_pfc *pfc) |
248 | { |
249 | struct qede_dev *edev = netdev_priv(dev: netdev); |
250 | |
251 | return edev->ops->dcb->ieee_setpfc(edev->cdev, pfc); |
252 | } |
253 | |
254 | static int qede_dcbnl_ieee_getets(struct net_device *netdev, |
255 | struct ieee_ets *ets) |
256 | { |
257 | struct qede_dev *edev = netdev_priv(dev: netdev); |
258 | |
259 | return edev->ops->dcb->ieee_getets(edev->cdev, ets); |
260 | } |
261 | |
262 | static int qede_dcbnl_ieee_setets(struct net_device *netdev, |
263 | struct ieee_ets *ets) |
264 | { |
265 | struct qede_dev *edev = netdev_priv(dev: netdev); |
266 | |
267 | return edev->ops->dcb->ieee_setets(edev->cdev, ets); |
268 | } |
269 | |
270 | static int qede_dcbnl_ieee_getapp(struct net_device *netdev, |
271 | struct dcb_app *app) |
272 | { |
273 | struct qede_dev *edev = netdev_priv(dev: netdev); |
274 | |
275 | return edev->ops->dcb->ieee_getapp(edev->cdev, app); |
276 | } |
277 | |
278 | static int qede_dcbnl_ieee_setapp(struct net_device *netdev, |
279 | struct dcb_app *app) |
280 | { |
281 | struct qede_dev *edev = netdev_priv(dev: netdev); |
282 | int err; |
283 | |
284 | err = dcb_ieee_setapp(netdev, app); |
285 | if (err) |
286 | return err; |
287 | |
288 | return edev->ops->dcb->ieee_setapp(edev->cdev, app); |
289 | } |
290 | |
291 | static int qede_dcbnl_ieee_peer_getpfc(struct net_device *netdev, |
292 | struct ieee_pfc *pfc) |
293 | { |
294 | struct qede_dev *edev = netdev_priv(dev: netdev); |
295 | |
296 | return edev->ops->dcb->ieee_peer_getpfc(edev->cdev, pfc); |
297 | } |
298 | |
299 | static int qede_dcbnl_ieee_peer_getets(struct net_device *netdev, |
300 | struct ieee_ets *ets) |
301 | { |
302 | struct qede_dev *edev = netdev_priv(dev: netdev); |
303 | |
304 | return edev->ops->dcb->ieee_peer_getets(edev->cdev, ets); |
305 | } |
306 | |
307 | static const struct dcbnl_rtnl_ops qede_dcbnl_ops = { |
308 | .ieee_getpfc = qede_dcbnl_ieee_getpfc, |
309 | .ieee_setpfc = qede_dcbnl_ieee_setpfc, |
310 | .ieee_getets = qede_dcbnl_ieee_getets, |
311 | .ieee_setets = qede_dcbnl_ieee_setets, |
312 | .ieee_getapp = qede_dcbnl_ieee_getapp, |
313 | .ieee_setapp = qede_dcbnl_ieee_setapp, |
314 | .ieee_peer_getpfc = qede_dcbnl_ieee_peer_getpfc, |
315 | .ieee_peer_getets = qede_dcbnl_ieee_peer_getets, |
316 | .getstate = qede_dcbnl_getstate, |
317 | .setstate = qede_dcbnl_setstate, |
318 | .getpermhwaddr = qede_dcbnl_getpermhwaddr, |
319 | .getpgtccfgtx = qede_dcbnl_getpgtccfgtx, |
320 | .getpgbwgcfgtx = qede_dcbnl_getpgbwgcfgtx, |
321 | .getpgtccfgrx = qede_dcbnl_getpgtccfgrx, |
322 | .getpgbwgcfgrx = qede_dcbnl_getpgbwgcfgrx, |
323 | .getpfccfg = qede_dcbnl_getpfccfg, |
324 | .setpfccfg = qede_dcbnl_setpfccfg, |
325 | .getcap = qede_dcbnl_getcap, |
326 | .getnumtcs = qede_dcbnl_getnumtcs, |
327 | .getpfcstate = qede_dcbnl_getpfcstate, |
328 | .getapp = qede_dcbnl_getapp, |
329 | .getdcbx = qede_dcbnl_getdcbx, |
330 | .setpgtccfgtx = qede_dcbnl_setpgtccfgtx, |
331 | .setpgtccfgrx = qede_dcbnl_setpgtccfgrx, |
332 | .setpgbwgcfgtx = qede_dcbnl_setpgbwgcfgtx, |
333 | .setpgbwgcfgrx = qede_dcbnl_setpgbwgcfgrx, |
334 | .setall = qede_dcbnl_setall, |
335 | .setnumtcs = qede_dcbnl_setnumtcs, |
336 | .setpfcstate = qede_dcbnl_setpfcstate, |
337 | .setapp = qede_dcbnl_setapp, |
338 | .setdcbx = qede_dcbnl_setdcbx, |
339 | .setfeatcfg = qede_dcbnl_setfeatcfg, |
340 | .getfeatcfg = qede_dcbnl_getfeatcfg, |
341 | .peer_getappinfo = qede_dcbnl_peer_getappinfo, |
342 | .peer_getapptable = qede_dcbnl_peer_getapptable, |
343 | .cee_peer_getpfc = qede_dcbnl_cee_peer_getpfc, |
344 | .cee_peer_getpg = qede_dcbnl_cee_peer_getpg, |
345 | }; |
346 | |
347 | void qede_set_dcbnl_ops(struct net_device *dev) |
348 | { |
349 | dev->dcbnl_ops = &qede_dcbnl_ops; |
350 | } |
351 | |