162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0+ 262306a36Sopenharmony_ci// Copyright (c) 2016-2017 Hisilicon Limited. 362306a36Sopenharmony_ci 462306a36Sopenharmony_ci#include "hnae3.h" 562306a36Sopenharmony_ci#include "hns3_enet.h" 662306a36Sopenharmony_ci 762306a36Sopenharmony_cistatic int hns3_dcbnl_ieee_getets(struct net_device *ndev, struct ieee_ets *ets) 862306a36Sopenharmony_ci{ 962306a36Sopenharmony_ci struct hnae3_handle *h = hns3_get_handle(ndev); 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci if (hns3_nic_resetting(ndev)) 1262306a36Sopenharmony_ci return -EBUSY; 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci if (h->kinfo.dcb_ops->ieee_getets) 1562306a36Sopenharmony_ci return h->kinfo.dcb_ops->ieee_getets(h, ets); 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci return -EOPNOTSUPP; 1862306a36Sopenharmony_ci} 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_cistatic int hns3_dcbnl_ieee_setets(struct net_device *ndev, struct ieee_ets *ets) 2162306a36Sopenharmony_ci{ 2262306a36Sopenharmony_ci struct hnae3_handle *h = hns3_get_handle(ndev); 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci if (hns3_nic_resetting(ndev)) 2562306a36Sopenharmony_ci return -EBUSY; 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci if (h->kinfo.dcb_ops->ieee_setets) 2862306a36Sopenharmony_ci return h->kinfo.dcb_ops->ieee_setets(h, ets); 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci return -EOPNOTSUPP; 3162306a36Sopenharmony_ci} 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_cistatic int hns3_dcbnl_ieee_getpfc(struct net_device *ndev, struct ieee_pfc *pfc) 3462306a36Sopenharmony_ci{ 3562306a36Sopenharmony_ci struct hnae3_handle *h = hns3_get_handle(ndev); 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci if (hns3_nic_resetting(ndev)) 3862306a36Sopenharmony_ci return -EBUSY; 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci if (h->kinfo.dcb_ops->ieee_getpfc) 4162306a36Sopenharmony_ci return h->kinfo.dcb_ops->ieee_getpfc(h, pfc); 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci return -EOPNOTSUPP; 4462306a36Sopenharmony_ci} 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_cistatic int hns3_dcbnl_ieee_setpfc(struct net_device *ndev, struct ieee_pfc *pfc) 4762306a36Sopenharmony_ci{ 4862306a36Sopenharmony_ci struct hnae3_handle *h = hns3_get_handle(ndev); 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci if (hns3_nic_resetting(ndev)) 5162306a36Sopenharmony_ci return -EBUSY; 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ci if (h->kinfo.dcb_ops->ieee_setpfc) 5462306a36Sopenharmony_ci return h->kinfo.dcb_ops->ieee_setpfc(h, pfc); 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_ci return -EOPNOTSUPP; 5762306a36Sopenharmony_ci} 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_cistatic int hns3_dcbnl_ieee_setapp(struct net_device *ndev, struct dcb_app *app) 6062306a36Sopenharmony_ci{ 6162306a36Sopenharmony_ci struct hnae3_handle *h = hns3_get_handle(ndev); 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ci if (hns3_nic_resetting(ndev)) 6462306a36Sopenharmony_ci return -EBUSY; 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ci if (h->kinfo.dcb_ops->ieee_setapp) 6762306a36Sopenharmony_ci return h->kinfo.dcb_ops->ieee_setapp(h, app); 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci return -EOPNOTSUPP; 7062306a36Sopenharmony_ci} 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_cistatic int hns3_dcbnl_ieee_delapp(struct net_device *ndev, struct dcb_app *app) 7362306a36Sopenharmony_ci{ 7462306a36Sopenharmony_ci struct hnae3_handle *h = hns3_get_handle(ndev); 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_ci if (hns3_nic_resetting(ndev)) 7762306a36Sopenharmony_ci return -EBUSY; 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_ci if (h->kinfo.dcb_ops->ieee_delapp) 8062306a36Sopenharmony_ci return h->kinfo.dcb_ops->ieee_delapp(h, app); 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_ci return -EOPNOTSUPP; 8362306a36Sopenharmony_ci} 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ci/* DCBX configuration */ 8662306a36Sopenharmony_cistatic u8 hns3_dcbnl_getdcbx(struct net_device *ndev) 8762306a36Sopenharmony_ci{ 8862306a36Sopenharmony_ci struct hnae3_handle *h = hns3_get_handle(ndev); 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_ci if (h->kinfo.dcb_ops->getdcbx) 9162306a36Sopenharmony_ci return h->kinfo.dcb_ops->getdcbx(h); 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_ci return 0; 9462306a36Sopenharmony_ci} 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_ci/* return 0 if successful, otherwise fail */ 9762306a36Sopenharmony_cistatic u8 hns3_dcbnl_setdcbx(struct net_device *ndev, u8 mode) 9862306a36Sopenharmony_ci{ 9962306a36Sopenharmony_ci struct hnae3_handle *h = hns3_get_handle(ndev); 10062306a36Sopenharmony_ci 10162306a36Sopenharmony_ci if (h->kinfo.dcb_ops->setdcbx) 10262306a36Sopenharmony_ci return h->kinfo.dcb_ops->setdcbx(h, mode); 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_ci return 1; 10562306a36Sopenharmony_ci} 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_cistatic const struct dcbnl_rtnl_ops hns3_dcbnl_ops = { 10862306a36Sopenharmony_ci .ieee_getets = hns3_dcbnl_ieee_getets, 10962306a36Sopenharmony_ci .ieee_setets = hns3_dcbnl_ieee_setets, 11062306a36Sopenharmony_ci .ieee_getpfc = hns3_dcbnl_ieee_getpfc, 11162306a36Sopenharmony_ci .ieee_setpfc = hns3_dcbnl_ieee_setpfc, 11262306a36Sopenharmony_ci .ieee_setapp = hns3_dcbnl_ieee_setapp, 11362306a36Sopenharmony_ci .ieee_delapp = hns3_dcbnl_ieee_delapp, 11462306a36Sopenharmony_ci .getdcbx = hns3_dcbnl_getdcbx, 11562306a36Sopenharmony_ci .setdcbx = hns3_dcbnl_setdcbx, 11662306a36Sopenharmony_ci}; 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_ci/* hclge_dcbnl_setup - DCBNL setup 11962306a36Sopenharmony_ci * @handle: the corresponding vport handle 12062306a36Sopenharmony_ci * Set up DCBNL 12162306a36Sopenharmony_ci */ 12262306a36Sopenharmony_civoid hns3_dcbnl_setup(struct hnae3_handle *handle) 12362306a36Sopenharmony_ci{ 12462306a36Sopenharmony_ci struct net_device *dev = handle->kinfo.netdev; 12562306a36Sopenharmony_ci 12662306a36Sopenharmony_ci if ((!handle->kinfo.dcb_ops) || (handle->flags & HNAE3_SUPPORT_VF)) 12762306a36Sopenharmony_ci return; 12862306a36Sopenharmony_ci 12962306a36Sopenharmony_ci dev->dcbnl_ops = &hns3_dcbnl_ops; 13062306a36Sopenharmony_ci} 131