xref: /openbmc/linux/drivers/net/ethernet/hisilicon/hns3/hns3_dcbnl.c (revision 5ee9cd065836e5934710ca35653bce7905add20b)
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