1d71d8381SJian Shen // SPDX-License-Identifier: GPL-2.0+
2d71d8381SJian Shen // Copyright (c) 2016-2017 Hisilicon Limited.
3424eb834SSalil Mehta
4424eb834SSalil Mehta #include "hnae3.h"
5424eb834SSalil Mehta #include "hns3_enet.h"
6424eb834SSalil Mehta
hns3_dcbnl_ieee_getets(struct net_device * ndev,struct ieee_ets * ets)79b2f3477SWeihang Li static int hns3_dcbnl_ieee_getets(struct net_device *ndev, struct ieee_ets *ets)
8424eb834SSalil Mehta {
9424eb834SSalil Mehta struct hnae3_handle *h = hns3_get_handle(ndev);
10424eb834SSalil Mehta
11257e4f29SHuazhong Tan if (hns3_nic_resetting(ndev))
12257e4f29SHuazhong Tan return -EBUSY;
13257e4f29SHuazhong Tan
14424eb834SSalil Mehta if (h->kinfo.dcb_ops->ieee_getets)
15424eb834SSalil Mehta return h->kinfo.dcb_ops->ieee_getets(h, ets);
16424eb834SSalil Mehta
17424eb834SSalil Mehta return -EOPNOTSUPP;
18424eb834SSalil Mehta }
19424eb834SSalil Mehta
hns3_dcbnl_ieee_setets(struct net_device * ndev,struct ieee_ets * ets)209b2f3477SWeihang Li static int hns3_dcbnl_ieee_setets(struct net_device *ndev, struct ieee_ets *ets)
21424eb834SSalil Mehta {
22424eb834SSalil Mehta struct hnae3_handle *h = hns3_get_handle(ndev);
23424eb834SSalil Mehta
24257e4f29SHuazhong Tan if (hns3_nic_resetting(ndev))
25257e4f29SHuazhong Tan return -EBUSY;
26257e4f29SHuazhong Tan
27424eb834SSalil Mehta if (h->kinfo.dcb_ops->ieee_setets)
28424eb834SSalil Mehta return h->kinfo.dcb_ops->ieee_setets(h, ets);
29424eb834SSalil Mehta
30424eb834SSalil Mehta return -EOPNOTSUPP;
31424eb834SSalil Mehta }
32424eb834SSalil Mehta
hns3_dcbnl_ieee_getpfc(struct net_device * ndev,struct ieee_pfc * pfc)339b2f3477SWeihang Li static int hns3_dcbnl_ieee_getpfc(struct net_device *ndev, struct ieee_pfc *pfc)
34424eb834SSalil Mehta {
35424eb834SSalil Mehta struct hnae3_handle *h = hns3_get_handle(ndev);
36424eb834SSalil Mehta
37257e4f29SHuazhong Tan if (hns3_nic_resetting(ndev))
38257e4f29SHuazhong Tan return -EBUSY;
39257e4f29SHuazhong Tan
40424eb834SSalil Mehta if (h->kinfo.dcb_ops->ieee_getpfc)
41424eb834SSalil Mehta return h->kinfo.dcb_ops->ieee_getpfc(h, pfc);
42424eb834SSalil Mehta
43424eb834SSalil Mehta return -EOPNOTSUPP;
44424eb834SSalil Mehta }
45424eb834SSalil Mehta
hns3_dcbnl_ieee_setpfc(struct net_device * ndev,struct ieee_pfc * pfc)469b2f3477SWeihang Li static int hns3_dcbnl_ieee_setpfc(struct net_device *ndev, struct ieee_pfc *pfc)
47424eb834SSalil Mehta {
48424eb834SSalil Mehta struct hnae3_handle *h = hns3_get_handle(ndev);
49424eb834SSalil Mehta
50257e4f29SHuazhong Tan if (hns3_nic_resetting(ndev))
51257e4f29SHuazhong Tan return -EBUSY;
52257e4f29SHuazhong Tan
53424eb834SSalil Mehta if (h->kinfo.dcb_ops->ieee_setpfc)
54424eb834SSalil Mehta return h->kinfo.dcb_ops->ieee_setpfc(h, pfc);
55424eb834SSalil Mehta
56424eb834SSalil Mehta return -EOPNOTSUPP;
57424eb834SSalil Mehta }
58424eb834SSalil Mehta
hns3_dcbnl_ieee_setapp(struct net_device * ndev,struct dcb_app * app)590ba22bcbSGuangbin Huang static int hns3_dcbnl_ieee_setapp(struct net_device *ndev, struct dcb_app *app)
600ba22bcbSGuangbin Huang {
610ba22bcbSGuangbin Huang struct hnae3_handle *h = hns3_get_handle(ndev);
620ba22bcbSGuangbin Huang
630ba22bcbSGuangbin Huang if (hns3_nic_resetting(ndev))
640ba22bcbSGuangbin Huang return -EBUSY;
650ba22bcbSGuangbin Huang
660ba22bcbSGuangbin Huang if (h->kinfo.dcb_ops->ieee_setapp)
670ba22bcbSGuangbin Huang return h->kinfo.dcb_ops->ieee_setapp(h, app);
680ba22bcbSGuangbin Huang
690ba22bcbSGuangbin Huang return -EOPNOTSUPP;
700ba22bcbSGuangbin Huang }
710ba22bcbSGuangbin Huang
hns3_dcbnl_ieee_delapp(struct net_device * ndev,struct dcb_app * app)720ba22bcbSGuangbin Huang static int hns3_dcbnl_ieee_delapp(struct net_device *ndev, struct dcb_app *app)
730ba22bcbSGuangbin Huang {
740ba22bcbSGuangbin Huang struct hnae3_handle *h = hns3_get_handle(ndev);
750ba22bcbSGuangbin Huang
760ba22bcbSGuangbin Huang if (hns3_nic_resetting(ndev))
770ba22bcbSGuangbin Huang return -EBUSY;
780ba22bcbSGuangbin Huang
79*a8cbdc98SJijie Shao if (h->kinfo.dcb_ops->ieee_delapp)
800ba22bcbSGuangbin Huang return h->kinfo.dcb_ops->ieee_delapp(h, app);
810ba22bcbSGuangbin Huang
820ba22bcbSGuangbin Huang return -EOPNOTSUPP;
830ba22bcbSGuangbin Huang }
840ba22bcbSGuangbin Huang
85424eb834SSalil Mehta /* DCBX configuration */
hns3_dcbnl_getdcbx(struct net_device * ndev)86424eb834SSalil Mehta static u8 hns3_dcbnl_getdcbx(struct net_device *ndev)
87424eb834SSalil Mehta {
88424eb834SSalil Mehta struct hnae3_handle *h = hns3_get_handle(ndev);
89424eb834SSalil Mehta
90424eb834SSalil Mehta if (h->kinfo.dcb_ops->getdcbx)
91424eb834SSalil Mehta return h->kinfo.dcb_ops->getdcbx(h);
92424eb834SSalil Mehta
93424eb834SSalil Mehta return 0;
94424eb834SSalil Mehta }
95424eb834SSalil Mehta
96424eb834SSalil Mehta /* return 0 if successful, otherwise fail */
hns3_dcbnl_setdcbx(struct net_device * ndev,u8 mode)97424eb834SSalil Mehta static u8 hns3_dcbnl_setdcbx(struct net_device *ndev, u8 mode)
98424eb834SSalil Mehta {
99424eb834SSalil Mehta struct hnae3_handle *h = hns3_get_handle(ndev);
100424eb834SSalil Mehta
101424eb834SSalil Mehta if (h->kinfo.dcb_ops->setdcbx)
102424eb834SSalil Mehta return h->kinfo.dcb_ops->setdcbx(h, mode);
103424eb834SSalil Mehta
104424eb834SSalil Mehta return 1;
105424eb834SSalil Mehta }
106424eb834SSalil Mehta
107424eb834SSalil Mehta static const struct dcbnl_rtnl_ops hns3_dcbnl_ops = {
108424eb834SSalil Mehta .ieee_getets = hns3_dcbnl_ieee_getets,
109424eb834SSalil Mehta .ieee_setets = hns3_dcbnl_ieee_setets,
110424eb834SSalil Mehta .ieee_getpfc = hns3_dcbnl_ieee_getpfc,
111424eb834SSalil Mehta .ieee_setpfc = hns3_dcbnl_ieee_setpfc,
1120ba22bcbSGuangbin Huang .ieee_setapp = hns3_dcbnl_ieee_setapp,
1130ba22bcbSGuangbin Huang .ieee_delapp = hns3_dcbnl_ieee_delapp,
114424eb834SSalil Mehta .getdcbx = hns3_dcbnl_getdcbx,
115424eb834SSalil Mehta .setdcbx = hns3_dcbnl_setdcbx,
116424eb834SSalil Mehta };
117424eb834SSalil Mehta
118424eb834SSalil Mehta /* hclge_dcbnl_setup - DCBNL setup
119424eb834SSalil Mehta * @handle: the corresponding vport handle
120424eb834SSalil Mehta * Set up DCBNL
121424eb834SSalil Mehta */
hns3_dcbnl_setup(struct hnae3_handle * handle)122424eb834SSalil Mehta void hns3_dcbnl_setup(struct hnae3_handle *handle)
123424eb834SSalil Mehta {
124424eb834SSalil Mehta struct net_device *dev = handle->kinfo.netdev;
125424eb834SSalil Mehta
126424eb834SSalil Mehta if ((!handle->kinfo.dcb_ops) || (handle->flags & HNAE3_SUPPORT_VF))
127424eb834SSalil Mehta return;
128424eb834SSalil Mehta
129424eb834SSalil Mehta dev->dcbnl_ops = &hns3_dcbnl_ops;
130424eb834SSalil Mehta }
131