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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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