4242#include <linux/io-mapping.h>
4343#include <linux/delay.h>
4444#include <linux/kmod.h>
45+ #include <net/devlink.h>
4546
4647#include <linux/mlx4/device.h>
4748#include <linux/mlx4/doorbell.h>
@@ -2881,8 +2882,13 @@ static void mlx4_enable_msi_x(struct mlx4_dev *dev)
28812882
28822883static int mlx4_init_port_info (struct mlx4_dev * dev , int port )
28832884{
2885+ struct devlink * devlink = priv_to_devlink (mlx4_priv (dev ));
28842886 struct mlx4_port_info * info = & mlx4_priv (dev )-> port [port ];
2885- int err = 0 ;
2887+ int err ;
2888+
2889+ err = devlink_port_register (devlink , & info -> devlink_port , port );
2890+ if (err )
2891+ return err ;
28862892
28872893 info -> dev = dev ;
28882894 info -> port = port ;
@@ -2907,6 +2913,7 @@ static int mlx4_init_port_info(struct mlx4_dev *dev, int port)
29072913 err = device_create_file (& dev -> persist -> pdev -> dev , & info -> port_attr );
29082914 if (err ) {
29092915 mlx4_err (dev , "Failed to create file for port %d\n" , port );
2916+ devlink_port_unregister (& info -> devlink_port );
29102917 info -> port = -1 ;
29112918 }
29122919
@@ -3680,21 +3687,23 @@ static int __mlx4_init_one(struct pci_dev *pdev, int pci_dev_data,
36803687
36813688static int mlx4_init_one (struct pci_dev * pdev , const struct pci_device_id * id )
36823689{
3690+ struct devlink * devlink ;
36833691 struct mlx4_priv * priv ;
36843692 struct mlx4_dev * dev ;
36853693 int ret ;
36863694
36873695 printk_once (KERN_INFO "%s" , mlx4_version );
36883696
3689- priv = kzalloc ( sizeof (* priv ), GFP_KERNEL );
3690- if (!priv )
3697+ devlink = devlink_alloc ( NULL , sizeof (* priv ));
3698+ if (!devlink )
36913699 return - ENOMEM ;
3700+ priv = devlink_priv (devlink );
36923701
36933702 dev = & priv -> dev ;
36943703 dev -> persist = kzalloc (sizeof (* dev -> persist ), GFP_KERNEL );
36953704 if (!dev -> persist ) {
3696- kfree ( priv ) ;
3697- return - ENOMEM ;
3705+ ret = - ENOMEM ;
3706+ goto err_devlink_free ;
36983707 }
36993708 dev -> persist -> pdev = pdev ;
37003709 dev -> persist -> dev = dev ;
@@ -3703,14 +3712,23 @@ static int mlx4_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
37033712 mutex_init (& dev -> persist -> device_state_mutex );
37043713 mutex_init (& dev -> persist -> interface_state_mutex );
37053714
3715+ ret = devlink_register (devlink , & pdev -> dev );
3716+ if (ret )
3717+ goto err_persist_free ;
3718+
37063719 ret = __mlx4_init_one (pdev , id -> driver_data , priv );
3707- if (ret ) {
3708- kfree (dev -> persist );
3709- kfree (priv );
3710- } else {
3711- pci_save_state (pdev );
3712- }
3720+ if (ret )
3721+ goto err_devlink_unregister ;
37133722
3723+ pci_save_state (pdev );
3724+ return 0 ;
3725+
3726+ err_devlink_unregister :
3727+ devlink_unregister (devlink );
3728+ err_persist_free :
3729+ kfree (dev -> persist );
3730+ err_devlink_free :
3731+ devlink_free (devlink );
37143732 return ret ;
37153733}
37163734
@@ -3811,6 +3829,7 @@ static void mlx4_remove_one(struct pci_dev *pdev)
38113829 struct mlx4_dev_persistent * persist = pci_get_drvdata (pdev );
38123830 struct mlx4_dev * dev = persist -> dev ;
38133831 struct mlx4_priv * priv = mlx4_priv (dev );
3832+ struct devlink * devlink = priv_to_devlink (priv );
38143833 int active_vfs = 0 ;
38153834
38163835 mutex_lock (& persist -> interface_state_mutex );
@@ -3841,8 +3860,9 @@ static void mlx4_remove_one(struct pci_dev *pdev)
38413860
38423861 pci_release_regions (pdev );
38433862 pci_disable_device (pdev );
3863+ devlink_unregister (devlink );
38443864 kfree (dev -> persist );
3845- kfree ( priv );
3865+ devlink_free ( devlink );
38463866 pci_set_drvdata (pdev , NULL );
38473867}
38483868
0 commit comments