1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0+
2*4882a593Smuzhiyun // Copyright (c) 2016-2017 Hisilicon Limited.
3*4882a593Smuzhiyun
4*4882a593Smuzhiyun #include "hnae3.h"
5*4882a593Smuzhiyun #include "hns3_enet.h"
6*4882a593Smuzhiyun
hns3_dcbnl_ieee_getets(struct net_device * ndev,struct ieee_ets * ets)7*4882a593Smuzhiyun static int hns3_dcbnl_ieee_getets(struct net_device *ndev, struct ieee_ets *ets)
8*4882a593Smuzhiyun {
9*4882a593Smuzhiyun struct hnae3_handle *h = hns3_get_handle(ndev);
10*4882a593Smuzhiyun
11*4882a593Smuzhiyun if (hns3_nic_resetting(ndev))
12*4882a593Smuzhiyun return -EBUSY;
13*4882a593Smuzhiyun
14*4882a593Smuzhiyun if (h->kinfo.dcb_ops->ieee_getets)
15*4882a593Smuzhiyun return h->kinfo.dcb_ops->ieee_getets(h, ets);
16*4882a593Smuzhiyun
17*4882a593Smuzhiyun return -EOPNOTSUPP;
18*4882a593Smuzhiyun }
19*4882a593Smuzhiyun
hns3_dcbnl_ieee_setets(struct net_device * ndev,struct ieee_ets * ets)20*4882a593Smuzhiyun static int hns3_dcbnl_ieee_setets(struct net_device *ndev, struct ieee_ets *ets)
21*4882a593Smuzhiyun {
22*4882a593Smuzhiyun struct hnae3_handle *h = hns3_get_handle(ndev);
23*4882a593Smuzhiyun
24*4882a593Smuzhiyun if (hns3_nic_resetting(ndev))
25*4882a593Smuzhiyun return -EBUSY;
26*4882a593Smuzhiyun
27*4882a593Smuzhiyun if (h->kinfo.dcb_ops->ieee_setets)
28*4882a593Smuzhiyun return h->kinfo.dcb_ops->ieee_setets(h, ets);
29*4882a593Smuzhiyun
30*4882a593Smuzhiyun return -EOPNOTSUPP;
31*4882a593Smuzhiyun }
32*4882a593Smuzhiyun
hns3_dcbnl_ieee_getpfc(struct net_device * ndev,struct ieee_pfc * pfc)33*4882a593Smuzhiyun static int hns3_dcbnl_ieee_getpfc(struct net_device *ndev, struct ieee_pfc *pfc)
34*4882a593Smuzhiyun {
35*4882a593Smuzhiyun struct hnae3_handle *h = hns3_get_handle(ndev);
36*4882a593Smuzhiyun
37*4882a593Smuzhiyun if (hns3_nic_resetting(ndev))
38*4882a593Smuzhiyun return -EBUSY;
39*4882a593Smuzhiyun
40*4882a593Smuzhiyun if (h->kinfo.dcb_ops->ieee_getpfc)
41*4882a593Smuzhiyun return h->kinfo.dcb_ops->ieee_getpfc(h, pfc);
42*4882a593Smuzhiyun
43*4882a593Smuzhiyun return -EOPNOTSUPP;
44*4882a593Smuzhiyun }
45*4882a593Smuzhiyun
hns3_dcbnl_ieee_setpfc(struct net_device * ndev,struct ieee_pfc * pfc)46*4882a593Smuzhiyun static int hns3_dcbnl_ieee_setpfc(struct net_device *ndev, struct ieee_pfc *pfc)
47*4882a593Smuzhiyun {
48*4882a593Smuzhiyun struct hnae3_handle *h = hns3_get_handle(ndev);
49*4882a593Smuzhiyun
50*4882a593Smuzhiyun if (hns3_nic_resetting(ndev))
51*4882a593Smuzhiyun return -EBUSY;
52*4882a593Smuzhiyun
53*4882a593Smuzhiyun if (h->kinfo.dcb_ops->ieee_setpfc)
54*4882a593Smuzhiyun return h->kinfo.dcb_ops->ieee_setpfc(h, pfc);
55*4882a593Smuzhiyun
56*4882a593Smuzhiyun return -EOPNOTSUPP;
57*4882a593Smuzhiyun }
58*4882a593Smuzhiyun
59*4882a593Smuzhiyun /* DCBX configuration */
hns3_dcbnl_getdcbx(struct net_device * ndev)60*4882a593Smuzhiyun static u8 hns3_dcbnl_getdcbx(struct net_device *ndev)
61*4882a593Smuzhiyun {
62*4882a593Smuzhiyun struct hnae3_handle *h = hns3_get_handle(ndev);
63*4882a593Smuzhiyun
64*4882a593Smuzhiyun if (h->kinfo.dcb_ops->getdcbx)
65*4882a593Smuzhiyun return h->kinfo.dcb_ops->getdcbx(h);
66*4882a593Smuzhiyun
67*4882a593Smuzhiyun return 0;
68*4882a593Smuzhiyun }
69*4882a593Smuzhiyun
70*4882a593Smuzhiyun /* return 0 if successful, otherwise fail */
hns3_dcbnl_setdcbx(struct net_device * ndev,u8 mode)71*4882a593Smuzhiyun static u8 hns3_dcbnl_setdcbx(struct net_device *ndev, u8 mode)
72*4882a593Smuzhiyun {
73*4882a593Smuzhiyun struct hnae3_handle *h = hns3_get_handle(ndev);
74*4882a593Smuzhiyun
75*4882a593Smuzhiyun if (h->kinfo.dcb_ops->setdcbx)
76*4882a593Smuzhiyun return h->kinfo.dcb_ops->setdcbx(h, mode);
77*4882a593Smuzhiyun
78*4882a593Smuzhiyun return 1;
79*4882a593Smuzhiyun }
80*4882a593Smuzhiyun
81*4882a593Smuzhiyun static const struct dcbnl_rtnl_ops hns3_dcbnl_ops = {
82*4882a593Smuzhiyun .ieee_getets = hns3_dcbnl_ieee_getets,
83*4882a593Smuzhiyun .ieee_setets = hns3_dcbnl_ieee_setets,
84*4882a593Smuzhiyun .ieee_getpfc = hns3_dcbnl_ieee_getpfc,
85*4882a593Smuzhiyun .ieee_setpfc = hns3_dcbnl_ieee_setpfc,
86*4882a593Smuzhiyun .getdcbx = hns3_dcbnl_getdcbx,
87*4882a593Smuzhiyun .setdcbx = hns3_dcbnl_setdcbx,
88*4882a593Smuzhiyun };
89*4882a593Smuzhiyun
90*4882a593Smuzhiyun /* hclge_dcbnl_setup - DCBNL setup
91*4882a593Smuzhiyun * @handle: the corresponding vport handle
92*4882a593Smuzhiyun * Set up DCBNL
93*4882a593Smuzhiyun */
hns3_dcbnl_setup(struct hnae3_handle * handle)94*4882a593Smuzhiyun void hns3_dcbnl_setup(struct hnae3_handle *handle)
95*4882a593Smuzhiyun {
96*4882a593Smuzhiyun struct net_device *dev = handle->kinfo.netdev;
97*4882a593Smuzhiyun
98*4882a593Smuzhiyun if ((!handle->kinfo.dcb_ops) || (handle->flags & HNAE3_SUPPORT_VF))
99*4882a593Smuzhiyun return;
100*4882a593Smuzhiyun
101*4882a593Smuzhiyun dev->dcbnl_ops = &hns3_dcbnl_ops;
102*4882a593Smuzhiyun }
103