Skip to content

Commit ceeb03a

Browse files
IoanaCiorneidavem330
authored andcommitted
dpaa2-eth: add basic devlink support
Add basic support in dpaa2-eth for devlink. For the moment, just register the device with devlink, add the corresponding devlink port and implement the .info_get() callback. Signed-off-by: Ioana Ciornei <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent c50bf2b commit ceeb03a

File tree

4 files changed

+119
-1
lines changed

4 files changed

+119
-1
lines changed

drivers/net/ethernet/freescale/dpaa2/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
obj-$(CONFIG_FSL_DPAA2_ETH) += fsl-dpaa2-eth.o
77
obj-$(CONFIG_FSL_DPAA2_PTP_CLOCK) += fsl-dpaa2-ptp.o
88

9-
fsl-dpaa2-eth-objs := dpaa2-eth.o dpaa2-ethtool.o dpni.o dpaa2-mac.o dpmac.o
9+
fsl-dpaa2-eth-objs := dpaa2-eth.o dpaa2-ethtool.o dpni.o dpaa2-mac.o dpmac.o dpaa2-eth-devlink.o
1010
fsl-dpaa2-eth-${CONFIG_FSL_DPAA2_ETH_DCB} += dpaa2-eth-dcb.o
1111
fsl-dpaa2-eth-${CONFIG_DEBUG_FS} += dpaa2-eth-debugfs.o
1212
fsl-dpaa2-ptp-objs := dpaa2-ptp.o dprtc.o
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
2+
#include "dpaa2-eth.h"
3+
/* Copyright 2020 NXP
4+
*/
5+
6+
static int dpaa2_eth_dl_info_get(struct devlink *devlink,
7+
struct devlink_info_req *req,
8+
struct netlink_ext_ack *extack)
9+
{
10+
struct dpaa2_eth_devlink_priv *dl_priv = devlink_priv(devlink);
11+
struct dpaa2_eth_priv *priv = dl_priv->dpaa2_priv;
12+
char buf[10];
13+
int err;
14+
15+
err = devlink_info_driver_name_put(req, KBUILD_MODNAME);
16+
if (err)
17+
return err;
18+
19+
scnprintf(buf, 10, "%d.%d", priv->dpni_ver_major, priv->dpni_ver_minor);
20+
err = devlink_info_version_running_put(req, "dpni", buf);
21+
if (err)
22+
return err;
23+
24+
return 0;
25+
}
26+
27+
static const struct devlink_ops dpaa2_eth_devlink_ops = {
28+
.info_get = dpaa2_eth_dl_info_get,
29+
};
30+
31+
int dpaa2_eth_dl_register(struct dpaa2_eth_priv *priv)
32+
{
33+
struct net_device *net_dev = priv->net_dev;
34+
struct device *dev = net_dev->dev.parent;
35+
struct dpaa2_eth_devlink_priv *dl_priv;
36+
int err;
37+
38+
priv->devlink = devlink_alloc(&dpaa2_eth_devlink_ops, sizeof(*dl_priv));
39+
if (!priv->devlink) {
40+
dev_err(dev, "devlink_alloc failed\n");
41+
return -ENOMEM;
42+
}
43+
dl_priv = devlink_priv(priv->devlink);
44+
dl_priv->dpaa2_priv = priv;
45+
46+
err = devlink_register(priv->devlink, dev);
47+
if (err) {
48+
dev_err(dev, "devlink_register() = %d\n", err);
49+
goto devlink_free;
50+
}
51+
52+
return 0;
53+
54+
devlink_free:
55+
devlink_free(priv->devlink);
56+
57+
return err;
58+
}
59+
60+
void dpaa2_eth_dl_unregister(struct dpaa2_eth_priv *priv)
61+
{
62+
devlink_unregister(priv->devlink);
63+
devlink_free(priv->devlink);
64+
}
65+
66+
int dpaa2_eth_dl_port_add(struct dpaa2_eth_priv *priv)
67+
{
68+
struct devlink_port *devlink_port = &priv->devlink_port;
69+
struct devlink_port_attrs attrs = {};
70+
int err;
71+
72+
attrs.flavour = DEVLINK_PORT_FLAVOUR_PHYSICAL;
73+
devlink_port_attrs_set(devlink_port, &attrs);
74+
75+
err = devlink_port_register(priv->devlink, devlink_port, 0);
76+
if (err)
77+
return err;
78+
79+
devlink_port_type_eth_set(devlink_port, priv->net_dev);
80+
81+
return 0;
82+
}
83+
84+
void dpaa2_eth_dl_port_del(struct dpaa2_eth_priv *priv)
85+
{
86+
struct devlink_port *devlink_port = &priv->devlink_port;
87+
88+
devlink_port_type_clear(devlink_port);
89+
devlink_port_unregister(devlink_port);
90+
}

drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4223,6 +4223,14 @@ static int dpaa2_eth_probe(struct fsl_mc_device *dpni_dev)
42234223
if (err)
42244224
goto err_connect_mac;
42254225

4226+
err = dpaa2_eth_dl_register(priv);
4227+
if (err)
4228+
goto err_dl_register;
4229+
4230+
err = dpaa2_eth_dl_port_add(priv);
4231+
if (err)
4232+
goto err_dl_port_add;
4233+
42264234
err = register_netdev(net_dev);
42274235
if (err < 0) {
42284236
dev_err(dev, "register_netdev() failed\n");
@@ -4237,6 +4245,10 @@ static int dpaa2_eth_probe(struct fsl_mc_device *dpni_dev)
42374245
return 0;
42384246

42394247
err_netdev_reg:
4248+
dpaa2_eth_dl_port_del(priv);
4249+
err_dl_port_add:
4250+
dpaa2_eth_dl_unregister(priv);
4251+
err_dl_register:
42404252
dpaa2_eth_disconnect_mac(priv);
42414253
err_connect_mac:
42424254
if (priv->do_link_poll)
@@ -4291,6 +4303,9 @@ static int dpaa2_eth_remove(struct fsl_mc_device *ls_dev)
42914303

42924304
unregister_netdev(net_dev);
42934305

4306+
dpaa2_eth_dl_port_del(priv);
4307+
dpaa2_eth_dl_unregister(priv);
4308+
42944309
if (priv->do_link_poll)
42954310
kthread_stop(priv->poll_thread);
42964311
else

drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include <linux/if_vlan.h>
1212
#include <linux/fsl/mc.h>
1313
#include <linux/net_tstamp.h>
14+
#include <net/devlink.h>
1415

1516
#include <soc/fsl/dpaa2-io.h>
1617
#include <soc/fsl/dpaa2-fd.h>
@@ -503,6 +504,12 @@ struct dpaa2_eth_priv {
503504
* queue before transmit current packet.
504505
*/
505506
struct mutex onestep_tstamp_lock;
507+
struct devlink *devlink;
508+
struct devlink_port devlink_port;
509+
};
510+
511+
struct dpaa2_eth_devlink_priv {
512+
struct dpaa2_eth_priv *dpaa2_priv;
506513
};
507514

508515
#define TX_TSTAMP 0x1
@@ -636,4 +643,10 @@ void dpaa2_eth_set_rx_taildrop(struct dpaa2_eth_priv *priv,
636643

637644
extern const struct dcbnl_rtnl_ops dpaa2_eth_dcbnl_ops;
638645

646+
int dpaa2_eth_dl_register(struct dpaa2_eth_priv *priv);
647+
void dpaa2_eth_dl_unregister(struct dpaa2_eth_priv *priv);
648+
649+
int dpaa2_eth_dl_port_add(struct dpaa2_eth_priv *priv);
650+
void dpaa2_eth_dl_port_del(struct dpaa2_eth_priv *priv);
651+
639652
#endif /* __DPAA2_H */

0 commit comments

Comments
 (0)