| // SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) |
| /* QLogic qede NIC Driver |
| * Copyright (c) 2015 QLogic Corporation |
| * Copyright (c) 2019-2020 Marvell International Ltd. |
| */ |
| |
| #include <linux/types.h> |
| #include <linux/netdevice.h> |
| #include <linux/rtnetlink.h> |
| #include <net/dcbnl.h> |
| #include "qede.h" |
| |
| static u8 qede_dcbnl_getstate(struct net_device *netdev) |
| { |
| struct qede_dev *edev = netdev_priv(netdev); |
| |
| return edev->ops->dcb->getstate(edev->cdev); |
| } |
| |
| static u8 qede_dcbnl_setstate(struct net_device *netdev, u8 state) |
| { |
| struct qede_dev *edev = netdev_priv(netdev); |
| |
| return edev->ops->dcb->setstate(edev->cdev, state); |
| } |
| |
| static void qede_dcbnl_getpermhwaddr(struct net_device *netdev, |
| u8 *perm_addr) |
| { |
| memcpy(perm_addr, netdev->dev_addr, netdev->addr_len); |
| } |
| |
| static void qede_dcbnl_getpgtccfgtx(struct net_device *netdev, int prio, |
| u8 *prio_type, u8 *pgid, u8 *bw_pct, |
| u8 *up_map) |
| { |
| struct qede_dev *edev = netdev_priv(netdev); |
| |
| edev->ops->dcb->getpgtccfgtx(edev->cdev, prio, prio_type, |
| pgid, bw_pct, up_map); |
| } |
| |
| static void qede_dcbnl_getpgbwgcfgtx(struct net_device *netdev, |
| int pgid, u8 *bw_pct) |
| { |
| struct qede_dev *edev = netdev_priv(netdev); |
| |
| edev->ops->dcb->getpgbwgcfgtx(edev->cdev, pgid, bw_pct); |
| } |
| |
| static void qede_dcbnl_getpgtccfgrx(struct net_device *netdev, int prio, |
| u8 *prio_type, u8 *pgid, u8 *bw_pct, |
| u8 *up_map) |
| { |
| struct qede_dev *edev = netdev_priv(netdev); |
| |
| edev->ops->dcb->getpgtccfgrx(edev->cdev, prio, prio_type, pgid, bw_pct, |
| up_map); |
| } |
| |
| static void qede_dcbnl_getpgbwgcfgrx(struct net_device *netdev, |
| int pgid, u8 *bw_pct) |
| { |
| struct qede_dev *edev = netdev_priv(netdev); |
| |
| edev->ops->dcb->getpgbwgcfgrx(edev->cdev, pgid, bw_pct); |
| } |
| |
| static void qede_dcbnl_getpfccfg(struct net_device *netdev, int prio, |
| u8 *setting) |
| { |
| struct qede_dev *edev = netdev_priv(netdev); |
| |
| edev->ops->dcb->getpfccfg(edev->cdev, prio, setting); |
| } |
| |
| static void qede_dcbnl_setpfccfg(struct net_device *netdev, int prio, |
| u8 setting) |
| { |
| struct qede_dev *edev = netdev_priv(netdev); |
| |
| edev->ops->dcb->setpfccfg(edev->cdev, prio, setting); |
| } |
| |
| static u8 qede_dcbnl_getcap(struct net_device *netdev, int capid, u8 *cap) |
| { |
| struct qede_dev *edev = netdev_priv(netdev); |
| |
| return edev->ops->dcb->getcap(edev->cdev, capid, cap); |
| } |
| |
| static int qede_dcbnl_getnumtcs(struct net_device *netdev, int tcid, u8 *num) |
| { |
| struct qede_dev *edev = netdev_priv(netdev); |
| |
| return edev->ops->dcb->getnumtcs(edev->cdev, tcid, num); |
| } |
| |
| static u8 qede_dcbnl_getpfcstate(struct net_device *netdev) |
| { |
| struct qede_dev *edev = netdev_priv(netdev); |
| |
| return edev->ops->dcb->getpfcstate(edev->cdev); |
| } |
| |
| static int qede_dcbnl_getapp(struct net_device *netdev, u8 idtype, u16 id) |
| { |
| struct qede_dev *edev = netdev_priv(netdev); |
| |
| return edev->ops->dcb->getapp(edev->cdev, idtype, id); |
| } |
| |
| static u8 qede_dcbnl_getdcbx(struct net_device *netdev) |
| { |
| struct qede_dev *edev = netdev_priv(netdev); |
| |
| return edev->ops->dcb->getdcbx(edev->cdev); |
| } |
| |
| static void qede_dcbnl_setpgtccfgtx(struct net_device *netdev, int prio, |
| u8 pri_type, u8 pgid, u8 bw_pct, u8 up_map) |
| { |
| struct qede_dev *edev = netdev_priv(netdev); |
| |
| return edev->ops->dcb->setpgtccfgtx(edev->cdev, prio, pri_type, pgid, |
| bw_pct, up_map); |
| } |
| |
| static void qede_dcbnl_setpgtccfgrx(struct net_device *netdev, int prio, |
| u8 pri_type, u8 pgid, u8 bw_pct, u8 up_map) |
| { |
| struct qede_dev *edev = netdev_priv(netdev); |
| |
| return edev->ops->dcb->setpgtccfgrx(edev->cdev, prio, pri_type, pgid, |
| bw_pct, up_map); |
| } |
| |
| static void qede_dcbnl_setpgbwgcfgtx(struct net_device *netdev, int pgid, |
| u8 bw_pct) |
| { |
| struct qede_dev *edev = netdev_priv(netdev); |
| |
| return edev->ops->dcb->setpgbwgcfgtx(edev->cdev, pgid, bw_pct); |
| } |
| |
| static void qede_dcbnl_setpgbwgcfgrx(struct net_device *netdev, int pgid, |
| u8 bw_pct) |
| { |
| struct qede_dev *edev = netdev_priv(netdev); |
| |
| return edev->ops->dcb->setpgbwgcfgrx(edev->cdev, pgid, bw_pct); |
| } |
| |
| static u8 qede_dcbnl_setall(struct net_device *netdev) |
| { |
| struct qede_dev *edev = netdev_priv(netdev); |
| |
| return edev->ops->dcb->setall(edev->cdev); |
| } |
| |
| static int qede_dcbnl_setnumtcs(struct net_device *netdev, int tcid, u8 num) |
| { |
| struct qede_dev *edev = netdev_priv(netdev); |
| |
| return edev->ops->dcb->setnumtcs(edev->cdev, tcid, num); |
| } |
| |
| static void qede_dcbnl_setpfcstate(struct net_device *netdev, u8 state) |
| { |
| struct qede_dev *edev = netdev_priv(netdev); |
| |
| return edev->ops->dcb->setpfcstate(edev->cdev, state); |
| } |
| |
| static int qede_dcbnl_setapp(struct net_device *netdev, u8 idtype, u16 idval, |
| u8 up) |
| { |
| struct qede_dev *edev = netdev_priv(netdev); |
| |
| return edev->ops->dcb->setapp(edev->cdev, idtype, idval, up); |
| } |
| |
| static u8 qede_dcbnl_setdcbx(struct net_device *netdev, u8 state) |
| { |
| struct qede_dev *edev = netdev_priv(netdev); |
| |
| return edev->ops->dcb->setdcbx(edev->cdev, state); |
| } |
| |
| static u8 qede_dcbnl_getfeatcfg(struct net_device *netdev, int featid, |
| u8 *flags) |
| { |
| struct qede_dev *edev = netdev_priv(netdev); |
| |
| return edev->ops->dcb->getfeatcfg(edev->cdev, featid, flags); |
| } |
| |
| static u8 qede_dcbnl_setfeatcfg(struct net_device *netdev, int featid, u8 flags) |
| { |
| struct qede_dev *edev = netdev_priv(netdev); |
| |
| return edev->ops->dcb->setfeatcfg(edev->cdev, featid, flags); |
| } |
| |
| static int qede_dcbnl_peer_getappinfo(struct net_device *netdev, |
| struct dcb_peer_app_info *info, |
| u16 *count) |
| { |
| struct qede_dev *edev = netdev_priv(netdev); |
| |
| return edev->ops->dcb->peer_getappinfo(edev->cdev, info, count); |
| } |
| |
| static int qede_dcbnl_peer_getapptable(struct net_device *netdev, |
| struct dcb_app *app) |
| { |
| struct qede_dev *edev = netdev_priv(netdev); |
| |
| return edev->ops->dcb->peer_getapptable(edev->cdev, app); |
| } |
| |
| static int qede_dcbnl_cee_peer_getpfc(struct net_device *netdev, |
| struct cee_pfc *pfc) |
| { |
| struct qede_dev *edev = netdev_priv(netdev); |
| |
| return edev->ops->dcb->cee_peer_getpfc(edev->cdev, pfc); |
| } |
| |
| static int qede_dcbnl_cee_peer_getpg(struct net_device *netdev, |
| struct cee_pg *pg) |
| { |
| struct qede_dev *edev = netdev_priv(netdev); |
| |
| return edev->ops->dcb->cee_peer_getpg(edev->cdev, pg); |
| } |
| |
| static int qede_dcbnl_ieee_getpfc(struct net_device *netdev, |
| struct ieee_pfc *pfc) |
| { |
| struct qede_dev *edev = netdev_priv(netdev); |
| |
| return edev->ops->dcb->ieee_getpfc(edev->cdev, pfc); |
| } |
| |
| static int qede_dcbnl_ieee_setpfc(struct net_device *netdev, |
| struct ieee_pfc *pfc) |
| { |
| struct qede_dev *edev = netdev_priv(netdev); |
| |
| return edev->ops->dcb->ieee_setpfc(edev->cdev, pfc); |
| } |
| |
| static int qede_dcbnl_ieee_getets(struct net_device *netdev, |
| struct ieee_ets *ets) |
| { |
| struct qede_dev *edev = netdev_priv(netdev); |
| |
| return edev->ops->dcb->ieee_getets(edev->cdev, ets); |
| } |
| |
| static int qede_dcbnl_ieee_setets(struct net_device *netdev, |
| struct ieee_ets *ets) |
| { |
| struct qede_dev *edev = netdev_priv(netdev); |
| |
| return edev->ops->dcb->ieee_setets(edev->cdev, ets); |
| } |
| |
| static int qede_dcbnl_ieee_getapp(struct net_device *netdev, |
| struct dcb_app *app) |
| { |
| struct qede_dev *edev = netdev_priv(netdev); |
| |
| return edev->ops->dcb->ieee_getapp(edev->cdev, app); |
| } |
| |
| static int qede_dcbnl_ieee_setapp(struct net_device *netdev, |
| struct dcb_app *app) |
| { |
| struct qede_dev *edev = netdev_priv(netdev); |
| int err; |
| |
| err = dcb_ieee_setapp(netdev, app); |
| if (err) |
| return err; |
| |
| return edev->ops->dcb->ieee_setapp(edev->cdev, app); |
| } |
| |
| static int qede_dcbnl_ieee_peer_getpfc(struct net_device *netdev, |
| struct ieee_pfc *pfc) |
| { |
| struct qede_dev *edev = netdev_priv(netdev); |
| |
| return edev->ops->dcb->ieee_peer_getpfc(edev->cdev, pfc); |
| } |
| |
| static int qede_dcbnl_ieee_peer_getets(struct net_device *netdev, |
| struct ieee_ets *ets) |
| { |
| struct qede_dev *edev = netdev_priv(netdev); |
| |
| return edev->ops->dcb->ieee_peer_getets(edev->cdev, ets); |
| } |
| |
| static const struct dcbnl_rtnl_ops qede_dcbnl_ops = { |
| .ieee_getpfc = qede_dcbnl_ieee_getpfc, |
| .ieee_setpfc = qede_dcbnl_ieee_setpfc, |
| .ieee_getets = qede_dcbnl_ieee_getets, |
| .ieee_setets = qede_dcbnl_ieee_setets, |
| .ieee_getapp = qede_dcbnl_ieee_getapp, |
| .ieee_setapp = qede_dcbnl_ieee_setapp, |
| .ieee_peer_getpfc = qede_dcbnl_ieee_peer_getpfc, |
| .ieee_peer_getets = qede_dcbnl_ieee_peer_getets, |
| .getstate = qede_dcbnl_getstate, |
| .setstate = qede_dcbnl_setstate, |
| .getpermhwaddr = qede_dcbnl_getpermhwaddr, |
| .getpgtccfgtx = qede_dcbnl_getpgtccfgtx, |
| .getpgbwgcfgtx = qede_dcbnl_getpgbwgcfgtx, |
| .getpgtccfgrx = qede_dcbnl_getpgtccfgrx, |
| .getpgbwgcfgrx = qede_dcbnl_getpgbwgcfgrx, |
| .getpfccfg = qede_dcbnl_getpfccfg, |
| .setpfccfg = qede_dcbnl_setpfccfg, |
| .getcap = qede_dcbnl_getcap, |
| .getnumtcs = qede_dcbnl_getnumtcs, |
| .getpfcstate = qede_dcbnl_getpfcstate, |
| .getapp = qede_dcbnl_getapp, |
| .getdcbx = qede_dcbnl_getdcbx, |
| .setpgtccfgtx = qede_dcbnl_setpgtccfgtx, |
| .setpgtccfgrx = qede_dcbnl_setpgtccfgrx, |
| .setpgbwgcfgtx = qede_dcbnl_setpgbwgcfgtx, |
| .setpgbwgcfgrx = qede_dcbnl_setpgbwgcfgrx, |
| .setall = qede_dcbnl_setall, |
| .setnumtcs = qede_dcbnl_setnumtcs, |
| .setpfcstate = qede_dcbnl_setpfcstate, |
| .setapp = qede_dcbnl_setapp, |
| .setdcbx = qede_dcbnl_setdcbx, |
| .setfeatcfg = qede_dcbnl_setfeatcfg, |
| .getfeatcfg = qede_dcbnl_getfeatcfg, |
| .peer_getappinfo = qede_dcbnl_peer_getappinfo, |
| .peer_getapptable = qede_dcbnl_peer_getapptable, |
| .cee_peer_getpfc = qede_dcbnl_cee_peer_getpfc, |
| .cee_peer_getpg = qede_dcbnl_cee_peer_getpg, |
| }; |
| |
| void qede_set_dcbnl_ops(struct net_device *dev) |
| { |
| dev->dcbnl_ops = &qede_dcbnl_ops; |
| } |