| // SPDX-License-Identifier: GPL-2.0+ |
| // Copyright (c) 2016-2017 Hisilicon Limited. |
| |
| #include "hnae3.h" |
| #include "hns3_enet.h" |
| |
| static int hns3_dcbnl_ieee_getets(struct net_device *ndev, struct ieee_ets *ets) |
| { |
| struct hnae3_handle *h = hns3_get_handle(ndev); |
| |
| if (hns3_nic_resetting(ndev)) |
| return -EBUSY; |
| |
| if (h->kinfo.dcb_ops->ieee_getets) |
| return h->kinfo.dcb_ops->ieee_getets(h, ets); |
| |
| return -EOPNOTSUPP; |
| } |
| |
| static int hns3_dcbnl_ieee_setets(struct net_device *ndev, struct ieee_ets *ets) |
| { |
| struct hnae3_handle *h = hns3_get_handle(ndev); |
| |
| if (hns3_nic_resetting(ndev)) |
| return -EBUSY; |
| |
| if (h->kinfo.dcb_ops->ieee_setets) |
| return h->kinfo.dcb_ops->ieee_setets(h, ets); |
| |
| return -EOPNOTSUPP; |
| } |
| |
| static int hns3_dcbnl_ieee_getpfc(struct net_device *ndev, struct ieee_pfc *pfc) |
| { |
| struct hnae3_handle *h = hns3_get_handle(ndev); |
| |
| if (hns3_nic_resetting(ndev)) |
| return -EBUSY; |
| |
| if (h->kinfo.dcb_ops->ieee_getpfc) |
| return h->kinfo.dcb_ops->ieee_getpfc(h, pfc); |
| |
| return -EOPNOTSUPP; |
| } |
| |
| static int hns3_dcbnl_ieee_setpfc(struct net_device *ndev, struct ieee_pfc *pfc) |
| { |
| struct hnae3_handle *h = hns3_get_handle(ndev); |
| |
| if (hns3_nic_resetting(ndev)) |
| return -EBUSY; |
| |
| if (h->kinfo.dcb_ops->ieee_setpfc) |
| return h->kinfo.dcb_ops->ieee_setpfc(h, pfc); |
| |
| return -EOPNOTSUPP; |
| } |
| |
| /* DCBX configuration */ |
| static u8 hns3_dcbnl_getdcbx(struct net_device *ndev) |
| { |
| struct hnae3_handle *h = hns3_get_handle(ndev); |
| |
| if (h->kinfo.dcb_ops->getdcbx) |
| return h->kinfo.dcb_ops->getdcbx(h); |
| |
| return 0; |
| } |
| |
| /* return 0 if successful, otherwise fail */ |
| static u8 hns3_dcbnl_setdcbx(struct net_device *ndev, u8 mode) |
| { |
| struct hnae3_handle *h = hns3_get_handle(ndev); |
| |
| if (h->kinfo.dcb_ops->setdcbx) |
| return h->kinfo.dcb_ops->setdcbx(h, mode); |
| |
| return 1; |
| } |
| |
| static const struct dcbnl_rtnl_ops hns3_dcbnl_ops = { |
| .ieee_getets = hns3_dcbnl_ieee_getets, |
| .ieee_setets = hns3_dcbnl_ieee_setets, |
| .ieee_getpfc = hns3_dcbnl_ieee_getpfc, |
| .ieee_setpfc = hns3_dcbnl_ieee_setpfc, |
| .getdcbx = hns3_dcbnl_getdcbx, |
| .setdcbx = hns3_dcbnl_setdcbx, |
| }; |
| |
| /* hclge_dcbnl_setup - DCBNL setup |
| * @handle: the corresponding vport handle |
| * Set up DCBNL |
| */ |
| void hns3_dcbnl_setup(struct hnae3_handle *handle) |
| { |
| struct net_device *dev = handle->kinfo.netdev; |
| |
| if ((!handle->kinfo.dcb_ops) || (handle->flags & HNAE3_SUPPORT_VF)) |
| return; |
| |
| dev->dcbnl_ops = &hns3_dcbnl_ops; |
| } |