Skip to content

Commit 1571e2f

Browse files
committed
Merge branch 'net-call-for-phys_port_name-into-devlink-directly-if-possible'
Jiri Pirko says: =================== net: call for phys_port_name into devlink directly if possible phys_port_name may be assembled by a helper in devlink. It is currently the case only for mlxsw driver. Benefit from the get_devlink_port ndo and call into devlink directly from dev_get_phys_port_name(). That saves the trip to the driver, simplifies the code and makes it similar to recently introduced ethtool-devlink compat helpers. Move bnxt, partly nfp and dsa to let devlink core generate the name too. =================== Signed-off-by: David S. Miller <[email protected]>
2 parents ede1fd1 + 746364f commit 1571e2f

File tree

16 files changed

+164
-94
lines changed

16 files changed

+164
-94
lines changed

drivers/net/ethernet/broadcom/bnxt/bnxt.c

Lines changed: 8 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -10048,23 +10048,6 @@ static int bnxt_bridge_setlink(struct net_device *dev, struct nlmsghdr *nlh,
1004810048
return rc;
1004910049
}
1005010050

10051-
static int bnxt_get_phys_port_name(struct net_device *dev, char *buf,
10052-
size_t len)
10053-
{
10054-
struct bnxt *bp = netdev_priv(dev);
10055-
int rc;
10056-
10057-
/* The PF and it's VF-reps only support the switchdev framework */
10058-
if (!BNXT_PF(bp))
10059-
return -EOPNOTSUPP;
10060-
10061-
rc = snprintf(buf, len, "p%d", bp->pf.port_id);
10062-
10063-
if (rc >= len)
10064-
return -EOPNOTSUPP;
10065-
return 0;
10066-
}
10067-
1006810051
int bnxt_get_port_parent_id(struct net_device *dev,
1006910052
struct netdev_phys_item_id *ppid)
1007010053
{
@@ -10083,6 +10066,13 @@ int bnxt_get_port_parent_id(struct net_device *dev,
1008310066
return 0;
1008410067
}
1008510068

10069+
static struct devlink_port *bnxt_get_devlink_port(struct net_device *dev)
10070+
{
10071+
struct bnxt *bp = netdev_priv(dev);
10072+
10073+
return &bp->dl_port;
10074+
}
10075+
1008610076
static const struct net_device_ops bnxt_netdev_ops = {
1008710077
.ndo_open = bnxt_open,
1008810078
.ndo_start_xmit = bnxt_start_xmit,
@@ -10115,7 +10105,7 @@ static const struct net_device_ops bnxt_netdev_ops = {
1011510105
.ndo_bridge_getlink = bnxt_bridge_getlink,
1011610106
.ndo_bridge_setlink = bnxt_bridge_setlink,
1011710107
.ndo_get_port_parent_id = bnxt_get_port_parent_id,
10118-
.ndo_get_phys_port_name = bnxt_get_phys_port_name
10108+
.ndo_get_devlink_port = bnxt_get_devlink_port,
1011910109
};
1012010110

1012110111
static void bnxt_remove_one(struct pci_dev *pdev)

drivers/net/ethernet/mellanox/mlxsw/core.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1796,16 +1796,18 @@ enum devlink_port_type mlxsw_core_port_type_get(struct mlxsw_core *mlxsw_core,
17961796
}
17971797
EXPORT_SYMBOL(mlxsw_core_port_type_get);
17981798

1799-
int mlxsw_core_port_get_phys_port_name(struct mlxsw_core *mlxsw_core,
1800-
u8 local_port, char *name, size_t len)
1799+
1800+
struct devlink_port *
1801+
mlxsw_core_port_devlink_port_get(struct mlxsw_core *mlxsw_core,
1802+
u8 local_port)
18011803
{
18021804
struct mlxsw_core_port *mlxsw_core_port =
18031805
&mlxsw_core->ports[local_port];
18041806
struct devlink_port *devlink_port = &mlxsw_core_port->devlink_port;
18051807

1806-
return devlink_port_get_phys_port_name(devlink_port, name, len);
1808+
return devlink_port;
18071809
}
1808-
EXPORT_SYMBOL(mlxsw_core_port_get_phys_port_name);
1810+
EXPORT_SYMBOL(mlxsw_core_port_devlink_port_get);
18091811

18101812
static void mlxsw_core_buf_dump_dbg(struct mlxsw_core *mlxsw_core,
18111813
const char *buf, size_t size)

drivers/net/ethernet/mellanox/mlxsw/core.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -176,8 +176,9 @@ void mlxsw_core_port_clear(struct mlxsw_core *mlxsw_core, u8 local_port,
176176
void *port_driver_priv);
177177
enum devlink_port_type mlxsw_core_port_type_get(struct mlxsw_core *mlxsw_core,
178178
u8 local_port);
179-
int mlxsw_core_port_get_phys_port_name(struct mlxsw_core *mlxsw_core,
180-
u8 local_port, char *name, size_t len);
179+
struct devlink_port *
180+
mlxsw_core_port_devlink_port_get(struct mlxsw_core *mlxsw_core,
181+
u8 local_port);
181182

182183
int mlxsw_core_schedule_dw(struct delayed_work *dwork, unsigned long delay);
183184
bool mlxsw_core_schedule_work(struct work_struct *work);

drivers/net/ethernet/mellanox/mlxsw/minimal.c

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -51,16 +51,6 @@ static int mlxsw_m_port_dummy_open_stop(struct net_device *dev)
5151
return 0;
5252
}
5353

54-
static int
55-
mlxsw_m_port_get_phys_port_name(struct net_device *dev, char *name, size_t len)
56-
{
57-
struct mlxsw_m_port *mlxsw_m_port = netdev_priv(dev);
58-
struct mlxsw_core *core = mlxsw_m_port->mlxsw_m->core;
59-
u8 local_port = mlxsw_m_port->local_port;
60-
61-
return mlxsw_core_port_get_phys_port_name(core, local_port, name, len);
62-
}
63-
6454
static int mlxsw_m_port_get_port_parent_id(struct net_device *dev,
6555
struct netdev_phys_item_id *ppid)
6656
{
@@ -73,11 +63,21 @@ static int mlxsw_m_port_get_port_parent_id(struct net_device *dev,
7363
return 0;
7464
}
7565

66+
static struct devlink_port *
67+
mlxsw_m_port_get_devlink_port(struct net_device *dev)
68+
{
69+
struct mlxsw_m_port *mlxsw_m_port = netdev_priv(dev);
70+
struct mlxsw_m *mlxsw_m = mlxsw_m_port->mlxsw_m;
71+
72+
return mlxsw_core_port_devlink_port_get(mlxsw_m->core,
73+
mlxsw_m_port->local_port);
74+
}
75+
7676
static const struct net_device_ops mlxsw_m_port_netdev_ops = {
7777
.ndo_open = mlxsw_m_port_dummy_open_stop,
7878
.ndo_stop = mlxsw_m_port_dummy_open_stop,
79-
.ndo_get_phys_port_name = mlxsw_m_port_get_phys_port_name,
8079
.ndo_get_port_parent_id = mlxsw_m_port_get_port_parent_id,
80+
.ndo_get_devlink_port = mlxsw_m_port_get_devlink_port,
8181
};
8282

8383
static int mlxsw_m_get_module_info(struct net_device *netdev,

drivers/net/ethernet/mellanox/mlxsw/spectrum.c

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1254,16 +1254,6 @@ static int mlxsw_sp_port_kill_vid(struct net_device *dev,
12541254
return 0;
12551255
}
12561256

1257-
static int mlxsw_sp_port_get_phys_port_name(struct net_device *dev, char *name,
1258-
size_t len)
1259-
{
1260-
struct mlxsw_sp_port *mlxsw_sp_port = netdev_priv(dev);
1261-
1262-
return mlxsw_core_port_get_phys_port_name(mlxsw_sp_port->mlxsw_sp->core,
1263-
mlxsw_sp_port->local_port,
1264-
name, len);
1265-
}
1266-
12671257
static struct mlxsw_sp_port_mall_tc_entry *
12681258
mlxsw_sp_port_mall_tc_entry_find(struct mlxsw_sp_port *port,
12691259
unsigned long cookie) {
@@ -1726,6 +1716,16 @@ static int mlxsw_sp_port_get_port_parent_id(struct net_device *dev,
17261716
return 0;
17271717
}
17281718

1719+
static struct devlink_port *
1720+
mlxsw_sp_port_get_devlink_port(struct net_device *dev)
1721+
{
1722+
struct mlxsw_sp_port *mlxsw_sp_port = netdev_priv(dev);
1723+
struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
1724+
1725+
return mlxsw_core_port_devlink_port_get(mlxsw_sp->core,
1726+
mlxsw_sp_port->local_port);
1727+
}
1728+
17291729
static const struct net_device_ops mlxsw_sp_port_netdev_ops = {
17301730
.ndo_open = mlxsw_sp_port_open,
17311731
.ndo_stop = mlxsw_sp_port_stop,
@@ -1739,9 +1739,9 @@ static const struct net_device_ops mlxsw_sp_port_netdev_ops = {
17391739
.ndo_get_offload_stats = mlxsw_sp_port_get_offload_stats,
17401740
.ndo_vlan_rx_add_vid = mlxsw_sp_port_add_vid,
17411741
.ndo_vlan_rx_kill_vid = mlxsw_sp_port_kill_vid,
1742-
.ndo_get_phys_port_name = mlxsw_sp_port_get_phys_port_name,
17431742
.ndo_set_features = mlxsw_sp_set_features,
17441743
.ndo_get_port_parent_id = mlxsw_sp_port_get_port_parent_id,
1744+
.ndo_get_devlink_port = mlxsw_sp_port_get_devlink_port,
17451745
};
17461746

17471747
static void mlxsw_sp_port_get_drvinfo(struct net_device *dev,

drivers/net/ethernet/mellanox/mlxsw/switchx2.c

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -379,16 +379,6 @@ mlxsw_sx_port_get_stats64(struct net_device *dev,
379379
stats->tx_dropped = tx_dropped;
380380
}
381381

382-
static int mlxsw_sx_port_get_phys_port_name(struct net_device *dev, char *name,
383-
size_t len)
384-
{
385-
struct mlxsw_sx_port *mlxsw_sx_port = netdev_priv(dev);
386-
387-
return mlxsw_core_port_get_phys_port_name(mlxsw_sx_port->mlxsw_sx->core,
388-
mlxsw_sx_port->local_port,
389-
name, len);
390-
}
391-
392382
static int mlxsw_sx_port_get_port_parent_id(struct net_device *dev,
393383
struct netdev_phys_item_id *ppid)
394384
{
@@ -401,14 +391,24 @@ static int mlxsw_sx_port_get_port_parent_id(struct net_device *dev,
401391
return 0;
402392
}
403393

394+
static struct devlink_port *
395+
mlxsw_sx_port_get_devlink_port(struct net_device *dev)
396+
{
397+
struct mlxsw_sx_port *mlxsw_sx_port = netdev_priv(dev);
398+
struct mlxsw_sx *mlxsw_sx = mlxsw_sx_port->mlxsw_sx;
399+
400+
return mlxsw_core_port_devlink_port_get(mlxsw_sx->core,
401+
mlxsw_sx_port->local_port);
402+
}
403+
404404
static const struct net_device_ops mlxsw_sx_port_netdev_ops = {
405405
.ndo_open = mlxsw_sx_port_open,
406406
.ndo_stop = mlxsw_sx_port_stop,
407407
.ndo_start_xmit = mlxsw_sx_port_xmit,
408408
.ndo_change_mtu = mlxsw_sx_port_change_mtu,
409409
.ndo_get_stats64 = mlxsw_sx_port_get_stats64,
410-
.ndo_get_phys_port_name = mlxsw_sx_port_get_phys_port_name,
411410
.ndo_get_port_parent_id = mlxsw_sx_port_get_port_parent_id,
411+
.ndo_get_devlink_port = mlxsw_sx_port_get_devlink_port,
412412
};
413413

414414
static void mlxsw_sx_port_get_drvinfo(struct net_device *dev,

drivers/net/ethernet/netronome/nfp/nfp_app.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -433,6 +433,6 @@ int nfp_app_nic_vnic_alloc(struct nfp_app *app, struct nfp_net *nn,
433433
int nfp_app_nic_vnic_init_phy_port(struct nfp_pf *pf, struct nfp_app *app,
434434
struct nfp_net *nn, unsigned int id);
435435

436-
struct devlink *nfp_devlink_get_devlink(struct net_device *netdev);
436+
struct devlink_port *nfp_devlink_get_devlink_port(struct net_device *netdev);
437437

438438
#endif

drivers/net/ethernet/netronome/nfp/nfp_devlink.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -386,13 +386,13 @@ void nfp_devlink_port_type_clear(struct nfp_port *port)
386386
devlink_port_type_clear(&port->dl_port);
387387
}
388388

389-
struct devlink *nfp_devlink_get_devlink(struct net_device *netdev)
389+
struct devlink_port *nfp_devlink_get_devlink_port(struct net_device *netdev)
390390
{
391-
struct nfp_app *app;
391+
struct nfp_port *port;
392392

393-
app = nfp_app_from_netdev(netdev);
394-
if (!app)
393+
port = nfp_port_from_netdev(netdev);
394+
if (!port)
395395
return NULL;
396396

397-
return priv_to_devlink(app->pf);
397+
return &port->dl_port;
398398
}

drivers/net/ethernet/netronome/nfp/nfp_net_common.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3324,8 +3324,11 @@ nfp_net_get_phys_port_name(struct net_device *netdev, char *name, size_t len)
33243324
struct nfp_net *nn = netdev_priv(netdev);
33253325
int n;
33263326

3327+
/* If port is defined, devlink_port is registered and devlink core
3328+
* is taking care of name formatting.
3329+
*/
33273330
if (nn->port)
3328-
return nfp_port_get_phys_port_name(netdev, name, len);
3331+
return -EOPNOTSUPP;
33293332

33303333
if (nn->dp.is_vf || nn->vnic_no_name)
33313334
return -EOPNOTSUPP;
@@ -3531,7 +3534,7 @@ const struct net_device_ops nfp_net_netdev_ops = {
35313534
.ndo_udp_tunnel_del = nfp_net_del_vxlan_port,
35323535
.ndo_bpf = nfp_net_xdp,
35333536
.ndo_get_port_parent_id = nfp_port_get_port_parent_id,
3534-
.ndo_get_devlink = nfp_devlink_get_devlink,
3537+
.ndo_get_devlink_port = nfp_devlink_get_devlink_port,
35353538
};
35363539

35373540
/**

drivers/net/ethernet/netronome/nfp/nfp_net_main.c

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -150,37 +150,39 @@ nfp_net_pf_init_vnic(struct nfp_pf *pf, struct nfp_net *nn, unsigned int id)
150150

151151
nn->id = id;
152152

153+
if (nn->port) {
154+
err = nfp_devlink_port_register(pf->app, nn->port);
155+
if (err)
156+
return err;
157+
}
158+
153159
err = nfp_net_init(nn);
154160
if (err)
155-
return err;
161+
goto err_devlink_port_clean;
156162

157163
nfp_net_debugfs_vnic_add(nn, pf->ddir);
158164

159-
if (nn->port) {
160-
err = nfp_devlink_port_register(pf->app, nn->port);
161-
if (err)
162-
goto err_dfs_clean;
165+
if (nn->port)
163166
nfp_devlink_port_type_eth_set(nn->port);
164-
}
165167

166168
nfp_net_info(nn);
167169

168170
if (nfp_net_is_data_vnic(nn)) {
169171
err = nfp_app_vnic_init(pf->app, nn);
170172
if (err)
171-
goto err_devlink_port_clean;
173+
goto err_devlink_port_type_clean;
172174
}
173175

174176
return 0;
175177

176-
err_devlink_port_clean:
177-
if (nn->port) {
178+
err_devlink_port_type_clean:
179+
if (nn->port)
178180
nfp_devlink_port_type_clear(nn->port);
179-
nfp_devlink_port_unregister(nn->port);
180-
}
181-
err_dfs_clean:
182181
nfp_net_debugfs_dir_clean(&nn->debugfs_dir);
183182
nfp_net_clean(nn);
183+
err_devlink_port_clean:
184+
if (nn->port)
185+
nfp_devlink_port_unregister(nn->port);
184186
return err;
185187
}
186188

@@ -223,12 +225,12 @@ static void nfp_net_pf_clean_vnic(struct nfp_pf *pf, struct nfp_net *nn)
223225
{
224226
if (nfp_net_is_data_vnic(nn))
225227
nfp_app_vnic_clean(pf->app, nn);
226-
if (nn->port) {
228+
if (nn->port)
227229
nfp_devlink_port_type_clear(nn->port);
228-
nfp_devlink_port_unregister(nn->port);
229-
}
230230
nfp_net_debugfs_dir_clean(&nn->debugfs_dir);
231231
nfp_net_clean(nn);
232+
if (nn->port)
233+
nfp_devlink_port_unregister(nn->port);
232234
}
233235

234236
static int nfp_net_pf_alloc_irqs(struct nfp_pf *pf)

drivers/net/ethernet/netronome/nfp/nfp_net_repr.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,7 @@ const struct net_device_ops nfp_repr_netdev_ops = {
273273
.ndo_set_features = nfp_port_set_features,
274274
.ndo_set_mac_address = eth_mac_addr,
275275
.ndo_get_port_parent_id = nfp_port_get_port_parent_id,
276-
.ndo_get_devlink = nfp_devlink_get_devlink,
276+
.ndo_get_devlink_port = nfp_devlink_get_devlink_port,
277277
};
278278

279279
void

include/linux/netdevice.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1250,8 +1250,8 @@ struct devlink;
12501250
* that got dropped are freed/returned via xdp_return_frame().
12511251
* Returns negative number, means general error invoking ndo, meaning
12521252
* no frames were xmit'ed and core-caller will free all frames.
1253-
* struct devlink *(*ndo_get_devlink)(struct net_device *dev);
1254-
* Get devlink instance associated with a given netdev.
1253+
* struct devlink_port *(*ndo_get_devlink_port)(struct net_device *dev);
1254+
* Get devlink port instance associated with a given netdev.
12551255
* Called with a reference on the netdevice and devlink locks only,
12561256
* rtnl_lock is not held.
12571257
*/
@@ -1451,7 +1451,7 @@ struct net_device_ops {
14511451
u32 flags);
14521452
int (*ndo_xsk_async_xmit)(struct net_device *dev,
14531453
u32 queue_id);
1454-
struct devlink * (*ndo_get_devlink)(struct net_device *dev);
1454+
struct devlink_port * (*ndo_get_devlink_port)(struct net_device *dev);
14551455
};
14561456

14571457
/**

0 commit comments

Comments
 (0)