mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 16:48:26 +02:00 
			
		
		
		
	net: hns3: add support for registering devlink for VF
Add devlink register support for HNS3 ethernet VF driver. Signed-off-by: Yufeng Mo <moyufeng@huawei.com> Signed-off-by: Guangbin Huang <huangguangbin2@huawei.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									b741269b27
								
							
						
					
					
						commit
						cd6242991d
					
				
					 5 changed files with 81 additions and 1 deletions
				
			
		|  | @ -7,4 +7,4 @@ ccflags-y := -I $(srctree)/drivers/net/ethernet/hisilicon/hns3 | |||
| ccflags-y += -I $(srctree)/$(src) | ||||
| 
 | ||||
| obj-$(CONFIG_HNS3_HCLGEVF) += hclgevf.o | ||||
| hclgevf-objs = hclgevf_main.o hclgevf_cmd.o hclgevf_mbx.o | ||||
| hclgevf-objs = hclgevf_main.o hclgevf_cmd.o hclgevf_mbx.o  hclgevf_devlink.o | ||||
|  |  | |||
							
								
								
									
										54
									
								
								drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_devlink.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_devlink.c
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,54 @@ | |||
| // SPDX-License-Identifier: GPL-2.0+
 | ||||
| /* Copyright (c) 2021 Hisilicon Limited. */ | ||||
| 
 | ||||
| #include <net/devlink.h> | ||||
| 
 | ||||
| #include "hclgevf_devlink.h" | ||||
| 
 | ||||
| static const struct devlink_ops hclgevf_devlink_ops = { | ||||
| }; | ||||
| 
 | ||||
| int hclgevf_devlink_init(struct hclgevf_dev *hdev) | ||||
| { | ||||
| 	struct pci_dev *pdev = hdev->pdev; | ||||
| 	struct hclgevf_devlink_priv *priv; | ||||
| 	struct devlink *devlink; | ||||
| 	int ret; | ||||
| 
 | ||||
| 	devlink = devlink_alloc(&hclgevf_devlink_ops, | ||||
| 				sizeof(struct hclgevf_devlink_priv)); | ||||
| 	if (!devlink) | ||||
| 		return -ENOMEM; | ||||
| 
 | ||||
| 	priv = devlink_priv(devlink); | ||||
| 	priv->hdev = hdev; | ||||
| 
 | ||||
| 	ret = devlink_register(devlink, &pdev->dev); | ||||
| 	if (ret) { | ||||
| 		dev_err(&pdev->dev, "failed to register devlink, ret = %d\n", | ||||
| 			ret); | ||||
| 		goto out_reg_fail; | ||||
| 	} | ||||
| 
 | ||||
| 	hdev->devlink = devlink; | ||||
| 
 | ||||
| 	return 0; | ||||
| 
 | ||||
| out_reg_fail: | ||||
| 	devlink_free(devlink); | ||||
| 	return ret; | ||||
| } | ||||
| 
 | ||||
| void hclgevf_devlink_uninit(struct hclgevf_dev *hdev) | ||||
| { | ||||
| 	struct devlink *devlink = hdev->devlink; | ||||
| 
 | ||||
| 	if (!devlink) | ||||
| 		return; | ||||
| 
 | ||||
| 	devlink_unregister(devlink); | ||||
| 
 | ||||
| 	devlink_free(devlink); | ||||
| 
 | ||||
| 	hdev->devlink = NULL; | ||||
| } | ||||
							
								
								
									
										15
									
								
								drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_devlink.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_devlink.h
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,15 @@ | |||
| /* SPDX-License-Identifier: GPL-2.0+ */ | ||||
| /* Copyright (c) 2021 Hisilicon Limited. */ | ||||
| 
 | ||||
| #ifndef __HCLGEVF_DEVLINK_H | ||||
| #define __HCLGEVF_DEVLINK_H | ||||
| 
 | ||||
| #include "hclgevf_main.h" | ||||
| 
 | ||||
| struct hclgevf_devlink_priv { | ||||
| 	struct hclgevf_dev *hdev; | ||||
| }; | ||||
| 
 | ||||
| int hclgevf_devlink_init(struct hclgevf_dev *hdev); | ||||
| void hclgevf_devlink_uninit(struct hclgevf_dev *hdev); | ||||
| #endif | ||||
|  | @ -8,6 +8,7 @@ | |||
| #include "hclgevf_main.h" | ||||
| #include "hclge_mbx.h" | ||||
| #include "hnae3.h" | ||||
| #include "hclgevf_devlink.h" | ||||
| 
 | ||||
| #define HCLGEVF_NAME	"hclgevf" | ||||
| 
 | ||||
|  | @ -3337,6 +3338,10 @@ static int hclgevf_init_hdev(struct hclgevf_dev *hdev) | |||
| 	if (ret) | ||||
| 		return ret; | ||||
| 
 | ||||
| 	ret = hclgevf_devlink_init(hdev); | ||||
| 	if (ret) | ||||
| 		goto err_devlink_init; | ||||
| 
 | ||||
| 	ret = hclgevf_cmd_queue_init(hdev); | ||||
| 	if (ret) | ||||
| 		goto err_cmd_queue_init; | ||||
|  | @ -3441,6 +3446,8 @@ static int hclgevf_init_hdev(struct hclgevf_dev *hdev) | |||
| err_cmd_init: | ||||
| 	hclgevf_cmd_uninit(hdev); | ||||
| err_cmd_queue_init: | ||||
| 	hclgevf_devlink_uninit(hdev); | ||||
| err_devlink_init: | ||||
| 	hclgevf_pci_uninit(hdev); | ||||
| 	clear_bit(HCLGEVF_STATE_IRQ_INITED, &hdev->state); | ||||
| 	return ret; | ||||
|  | @ -3462,6 +3469,7 @@ static void hclgevf_uninit_hdev(struct hclgevf_dev *hdev) | |||
| 	} | ||||
| 
 | ||||
| 	hclgevf_cmd_uninit(hdev); | ||||
| 	hclgevf_devlink_uninit(hdev); | ||||
| 	hclgevf_pci_uninit(hdev); | ||||
| 	hclgevf_uninit_mac_list(hdev); | ||||
| } | ||||
|  |  | |||
|  | @ -6,6 +6,7 @@ | |||
| #include <linux/fs.h> | ||||
| #include <linux/if_vlan.h> | ||||
| #include <linux/types.h> | ||||
| #include <net/devlink.h> | ||||
| #include "hclge_mbx.h" | ||||
| #include "hclgevf_cmd.h" | ||||
| #include "hnae3.h" | ||||
|  | @ -330,6 +331,8 @@ struct hclgevf_dev { | |||
| 	u32 flag; | ||||
| 	unsigned long serv_processed_cnt; | ||||
| 	unsigned long last_serv_processed; | ||||
| 
 | ||||
| 	struct devlink *devlink; | ||||
| }; | ||||
| 
 | ||||
| static inline bool hclgevf_is_reset_pending(struct hclgevf_dev *hdev) | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Yufeng Mo
						Yufeng Mo