qede_dcbnl.c (9417B)
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 13static 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 20static 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 27static 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 33static 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 43static 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 51static 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 61static 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 69static 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 77static 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 85static 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 92static 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 99static 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 106static 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 113static 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 120static 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 129static 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 138static 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 146static 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 154static 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 161static 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 168static 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 175static 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 183static 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 190static 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 198static 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 205static 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 214static 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 222static 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 230static 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 238static 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 246static 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 254static 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 262static 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 270static 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 278static 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 291static 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 299static 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 307static 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 347void qede_set_dcbnl_ops(struct net_device *dev) 348{ 349 dev->dcbnl_ops = &qede_dcbnl_ops; 350}