Skip to content

Commit 09d4d08

Browse files
jpirkodavem330
authored andcommitted
mlx4: Implement devlink interface
Implement newly introduced devlink interface. Add devlink port instances for every port and set the port types accordingly. Signed-off-by: Jiri Pirko <jiri@mellanox.com> v2->v3: -add dev param to devlink_register (api change) Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent bfcd3a4 commit 09d4d08

File tree

6 files changed

+60
-13
lines changed

6 files changed

+60
-13
lines changed

drivers/infiniband/hw/mlx4/main.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
#include <linux/if_vlan.h>
4242
#include <net/ipv6.h>
4343
#include <net/addrconf.h>
44+
#include <net/devlink.h>
4445

4546
#include <rdma/ib_smi.h>
4647
#include <rdma/ib_user_verbs.h>
@@ -2519,6 +2520,9 @@ static void *mlx4_ib_add(struct mlx4_dev *dev)
25192520
}
25202521

25212522
ibdev->ib_active = true;
2523+
mlx4_foreach_port(i, dev, MLX4_PORT_TYPE_IB)
2524+
devlink_port_type_ib_set(mlx4_get_devlink_port(dev, i),
2525+
&ibdev->ib_dev);
25222526

25232527
if (mlx4_is_mfunc(ibdev->dev))
25242528
init_pkeys(ibdev);
@@ -2643,7 +2647,10 @@ static void mlx4_ib_remove(struct mlx4_dev *dev, void *ibdev_ptr)
26432647
{
26442648
struct mlx4_ib_dev *ibdev = ibdev_ptr;
26452649
int p;
2650+
int i;
26462651

2652+
mlx4_foreach_port(i, dev, MLX4_PORT_TYPE_IB)
2653+
devlink_port_type_clear(mlx4_get_devlink_port(dev, i));
26472654
ibdev->ib_active = false;
26482655
flush_workqueue(wq);
26492656

drivers/net/ethernet/mellanox/mlx4/en_netdev.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
#include <net/ip.h>
4141
#include <net/busy_poll.h>
4242
#include <net/vxlan.h>
43+
#include <net/devlink.h>
4344

4445
#include <linux/mlx4/driver.h>
4546
#include <linux/mlx4/device.h>
@@ -2033,8 +2034,11 @@ void mlx4_en_destroy_netdev(struct net_device *dev)
20332034
en_dbg(DRV, priv, "Destroying netdev on port:%d\n", priv->port);
20342035

20352036
/* Unregister device - this will close the port if it was up */
2036-
if (priv->registered)
2037+
if (priv->registered) {
2038+
devlink_port_type_clear(mlx4_get_devlink_port(mdev->dev,
2039+
priv->port));
20372040
unregister_netdev(dev);
2041+
}
20382042

20392043
if (priv->allocated)
20402044
mlx4_free_hwq_res(mdev->dev, &priv->res, MLX4_EN_PAGE_SIZE);
@@ -3051,6 +3055,8 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port,
30513055
}
30523056

30533057
priv->registered = 1;
3058+
devlink_port_type_eth_set(mlx4_get_devlink_port(mdev->dev, priv->port),
3059+
dev);
30543060

30553061
return 0;
30563062

drivers/net/ethernet/mellanox/mlx4/intf.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
#include <linux/slab.h>
3535
#include <linux/export.h>
3636
#include <linux/errno.h>
37+
#include <net/devlink.h>
3738

3839
#include "mlx4.h"
3940

@@ -249,3 +250,11 @@ void *mlx4_get_protocol_dev(struct mlx4_dev *dev, enum mlx4_protocol proto, int
249250
return result;
250251
}
251252
EXPORT_SYMBOL_GPL(mlx4_get_protocol_dev);
253+
254+
struct devlink_port *mlx4_get_devlink_port(struct mlx4_dev *dev, int port)
255+
{
256+
struct mlx4_port_info *info = &mlx4_priv(dev)->port[port];
257+
258+
return &info->devlink_port;
259+
}
260+
EXPORT_SYMBOL_GPL(mlx4_get_devlink_port);

drivers/net/ethernet/mellanox/mlx4/main.c

Lines changed: 32 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
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

28822883
static 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

36813688
static 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

drivers/net/ethernet/mellanox/mlx4/mlx4.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
#include <linux/workqueue.h>
4646
#include <linux/interrupt.h>
4747
#include <linux/spinlock.h>
48+
#include <net/devlink.h>
4849

4950
#include <linux/mlx4/device.h>
5051
#include <linux/mlx4/driver.h>
@@ -828,6 +829,7 @@ struct mlx4_port_info {
828829
struct mlx4_roce_gid_table gid_table;
829830
int base_qpn;
830831
struct cpu_rmap *rmap;
832+
struct devlink_port devlink_port;
831833
};
832834

833835
struct mlx4_sense {

include/linux/mlx4/driver.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
#ifndef MLX4_DRIVER_H
3434
#define MLX4_DRIVER_H
3535

36+
#include <net/devlink.h>
3637
#include <linux/mlx4/device.h>
3738

3839
struct mlx4_dev;
@@ -89,6 +90,8 @@ int mlx4_port_map_set(struct mlx4_dev *dev, struct mlx4_port_map *v2p);
8990

9091
void *mlx4_get_protocol_dev(struct mlx4_dev *dev, enum mlx4_protocol proto, int port);
9192

93+
struct devlink_port *mlx4_get_devlink_port(struct mlx4_dev *dev, int port);
94+
9295
static inline u64 mlx4_mac_to_u64(u8 *addr)
9396
{
9497
u64 mac = 0;

0 commit comments

Comments
 (0)