xref: /openbmc/linux/drivers/net/ethernet/sfc/efx_devlink.c (revision fa34a5140a8e8f4120e86a1ae622b5df58414c3a)
1*fa34a514SAlejandro Lucero // SPDX-License-Identifier: GPL-2.0-only
2*fa34a514SAlejandro Lucero /****************************************************************************
3*fa34a514SAlejandro Lucero  * Driver for AMD network controllers and boards
4*fa34a514SAlejandro Lucero  * Copyright (C) 2023, Advanced Micro Devices, Inc.
5*fa34a514SAlejandro Lucero  *
6*fa34a514SAlejandro Lucero  * This program is free software; you can redistribute it and/or modify it
7*fa34a514SAlejandro Lucero  * under the terms of the GNU General Public License version 2 as published
8*fa34a514SAlejandro Lucero  * by the Free Software Foundation, incorporated herein by reference.
9*fa34a514SAlejandro Lucero  */
10*fa34a514SAlejandro Lucero 
11*fa34a514SAlejandro Lucero #include "net_driver.h"
12*fa34a514SAlejandro Lucero #include "efx_devlink.h"
13*fa34a514SAlejandro Lucero 
14*fa34a514SAlejandro Lucero struct efx_devlink {
15*fa34a514SAlejandro Lucero 	struct efx_nic *efx;
16*fa34a514SAlejandro Lucero };
17*fa34a514SAlejandro Lucero 
18*fa34a514SAlejandro Lucero static const struct devlink_ops sfc_devlink_ops = {
19*fa34a514SAlejandro Lucero };
20*fa34a514SAlejandro Lucero 
21*fa34a514SAlejandro Lucero void efx_fini_devlink_lock(struct efx_nic *efx)
22*fa34a514SAlejandro Lucero {
23*fa34a514SAlejandro Lucero 	if (efx->devlink)
24*fa34a514SAlejandro Lucero 		devl_lock(efx->devlink);
25*fa34a514SAlejandro Lucero }
26*fa34a514SAlejandro Lucero 
27*fa34a514SAlejandro Lucero void efx_fini_devlink_and_unlock(struct efx_nic *efx)
28*fa34a514SAlejandro Lucero {
29*fa34a514SAlejandro Lucero 	if (efx->devlink) {
30*fa34a514SAlejandro Lucero 		devl_unregister(efx->devlink);
31*fa34a514SAlejandro Lucero 		devl_unlock(efx->devlink);
32*fa34a514SAlejandro Lucero 		devlink_free(efx->devlink);
33*fa34a514SAlejandro Lucero 		efx->devlink = NULL;
34*fa34a514SAlejandro Lucero 	}
35*fa34a514SAlejandro Lucero }
36*fa34a514SAlejandro Lucero 
37*fa34a514SAlejandro Lucero int efx_probe_devlink_and_lock(struct efx_nic *efx)
38*fa34a514SAlejandro Lucero {
39*fa34a514SAlejandro Lucero 	struct efx_devlink *devlink_private;
40*fa34a514SAlejandro Lucero 
41*fa34a514SAlejandro Lucero 	if (efx->type->is_vf)
42*fa34a514SAlejandro Lucero 		return 0;
43*fa34a514SAlejandro Lucero 
44*fa34a514SAlejandro Lucero 	efx->devlink = devlink_alloc(&sfc_devlink_ops,
45*fa34a514SAlejandro Lucero 				     sizeof(struct efx_devlink),
46*fa34a514SAlejandro Lucero 				     &efx->pci_dev->dev);
47*fa34a514SAlejandro Lucero 	if (!efx->devlink)
48*fa34a514SAlejandro Lucero 		return -ENOMEM;
49*fa34a514SAlejandro Lucero 
50*fa34a514SAlejandro Lucero 	devl_lock(efx->devlink);
51*fa34a514SAlejandro Lucero 	devlink_private = devlink_priv(efx->devlink);
52*fa34a514SAlejandro Lucero 	devlink_private->efx = efx;
53*fa34a514SAlejandro Lucero 
54*fa34a514SAlejandro Lucero 	devl_register(efx->devlink);
55*fa34a514SAlejandro Lucero 
56*fa34a514SAlejandro Lucero 	return 0;
57*fa34a514SAlejandro Lucero }
58*fa34a514SAlejandro Lucero 
59*fa34a514SAlejandro Lucero void efx_probe_devlink_unlock(struct efx_nic *efx)
60*fa34a514SAlejandro Lucero {
61*fa34a514SAlejandro Lucero 	if (!efx->devlink)
62*fa34a514SAlejandro Lucero 		return;
63*fa34a514SAlejandro Lucero 
64*fa34a514SAlejandro Lucero 	devl_unlock(efx->devlink);
65*fa34a514SAlejandro Lucero }
66