summaryrefslogtreecommitdiff
path: root/drivers/net/ethernet/huawei/hinic/hinic_main.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/ethernet/huawei/hinic/hinic_main.c')
-rw-r--r--drivers/net/ethernet/huawei/hinic/hinic_main.c28
1 files changed, 26 insertions, 2 deletions
diff --git a/drivers/net/ethernet/huawei/hinic/hinic_main.c b/drivers/net/ethernet/huawei/hinic/hinic_main.c
index 834a20a0043c..c4c6f9c29f0e 100644
--- a/drivers/net/ethernet/huawei/hinic/hinic_main.c
+++ b/drivers/net/ethernet/huawei/hinic/hinic_main.c
@@ -18,6 +18,7 @@
#include <linux/semaphore.h>
#include <linux/workqueue.h>
#include <net/ip.h>
+#include <net/devlink.h>
#include <linux/bitops.h>
#include <linux/bitmap.h>
#include <linux/delay.h>
@@ -25,6 +26,7 @@
#include "hinic_hw_qp.h"
#include "hinic_hw_dev.h"
+#include "hinic_devlink.h"
#include "hinic_port.h"
#include "hinic_tx.h"
#include "hinic_rx.h"
@@ -1075,9 +1077,11 @@ static int nic_dev_init(struct pci_dev *pdev)
struct hinic_rx_mode_work *rx_mode_work;
struct hinic_txq_stats *tx_stats;
struct hinic_rxq_stats *rx_stats;
+ struct hinic_devlink_priv *priv;
struct hinic_dev *nic_dev;
struct net_device *netdev;
struct hinic_hwdev *hwdev;
+ struct devlink *devlink;
int err, num_qps;
hwdev = hinic_init_hwdev(pdev);
@@ -1086,6 +1090,16 @@ static int nic_dev_init(struct pci_dev *pdev)
return PTR_ERR(hwdev);
}
+ devlink = hinic_devlink_alloc();
+ if (!devlink) {
+ dev_err(&pdev->dev, "Hinic devlink alloc failed\n");
+ err = -ENOMEM;
+ goto err_devlink_alloc;
+ }
+
+ priv = devlink_priv(devlink);
+ priv->hwdev = hwdev;
+
num_qps = hinic_hwdev_num_qps(hwdev);
if (num_qps <= 0) {
dev_err(&pdev->dev, "Invalid number of QPS\n");
@@ -1121,6 +1135,7 @@ static int nic_dev_init(struct pci_dev *pdev)
nic_dev->sriov_info.hwdev = hwdev;
nic_dev->sriov_info.pdev = pdev;
nic_dev->max_qps = num_qps;
+ nic_dev->devlink = devlink;
hinic_set_ethtool_ops(netdev);
@@ -1146,6 +1161,10 @@ static int nic_dev_init(struct pci_dev *pdev)
goto err_workq;
}
+ err = hinic_devlink_register(devlink, &pdev->dev);
+ if (err)
+ goto err_devlink_reg;
+
pci_set_drvdata(pdev, netdev);
err = hinic_port_get_mac(nic_dev, netdev->dev_addr);
@@ -1223,9 +1242,11 @@ err_set_features:
cancel_work_sync(&rx_mode_work->work);
err_set_mtu:
-err_get_mac:
+ hinic_port_del_mac(nic_dev, netdev->dev_addr, 0);
err_add_mac:
+err_get_mac:
pci_set_drvdata(pdev, NULL);
+err_devlink_reg:
destroy_workqueue(nic_dev->workq);
err_workq:
@@ -1234,6 +1255,7 @@ err_vlan_bitmap:
err_alloc_etherdev:
err_num_qps:
+err_devlink_alloc:
hinic_free_hwdev(hwdev);
return err;
}
@@ -1342,9 +1364,11 @@ static void hinic_remove(struct pci_dev *pdev)
pci_set_drvdata(pdev, NULL);
+ hinic_devlink_unregister(nic_dev->devlink);
+
destroy_workqueue(nic_dev->workq);
- hinic_vf_func_free(nic_dev->hwdev);
+ hinic_devlink_free(nic_dev->devlink);
hinic_free_hwdev(nic_dev->hwdev);