Lines Matching +full:port +full:- +full:id

1 // SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
23 static u32 nfp_abm_portid(enum nfp_repr_type rtype, unsigned int id) in nfp_abm_portid() argument
26 FIELD_PREP(NFP_ABM_PORTID_ID, id); in nfp_abm_portid()
34 struct nfp_port *port; in nfp_abm_setup_tc() local
36 port = nfp_port_from_netdev(netdev); in nfp_abm_setup_tc()
37 if (!port || port->type != NFP_PORT_PF_PORT) in nfp_abm_setup_tc()
38 return -EOPNOTSUPP; in nfp_abm_setup_tc()
42 return nfp_abm_setup_root(netdev, repr->app_priv, type_data); in nfp_abm_setup_tc()
44 return nfp_abm_setup_tc_mq(netdev, repr->app_priv, type_data); in nfp_abm_setup_tc()
46 return nfp_abm_setup_tc_red(netdev, repr->app_priv, type_data); in nfp_abm_setup_tc()
48 return nfp_abm_setup_tc_gred(netdev, repr->app_priv, type_data); in nfp_abm_setup_tc()
52 return -EOPNOTSUPP; in nfp_abm_setup_tc()
61 u8 port; in nfp_abm_repr_get() local
64 port = FIELD_GET(NFP_ABM_PORTID_ID, port_id); in nfp_abm_repr_get()
66 reprs = rcu_dereference(app->reprs[rtype]); in nfp_abm_repr_get()
70 if (port >= reprs->num_reprs) in nfp_abm_repr_get()
73 return rcu_dereference(reprs->reprs[port]); in nfp_abm_repr_get()
84 struct nfp_port *port; in nfp_abm_spawn_repr() local
93 txqs = alink->vnic->max_rx_rings; in nfp_abm_spawn_repr()
98 return -ENOMEM; in nfp_abm_spawn_repr()
100 repr->app_priv = alink; in nfp_abm_spawn_repr()
102 port = nfp_port_alloc(app, ptype, netdev); in nfp_abm_spawn_repr()
103 if (IS_ERR(port)) { in nfp_abm_spawn_repr()
104 err = PTR_ERR(port); in nfp_abm_spawn_repr()
109 port->eth_forced = true; in nfp_abm_spawn_repr()
110 err = nfp_port_init_phy_port(app->pf, app, port, alink->id); in nfp_abm_spawn_repr()
114 port->pf_id = alink->abm->pf_id; in nfp_abm_spawn_repr()
115 port->pf_split = app->pf->max_data_vnics > 1; in nfp_abm_spawn_repr()
116 port->pf_split_id = alink->id; in nfp_abm_spawn_repr()
117 port->vnic = alink->vnic->dp.ctrl_bar; in nfp_abm_spawn_repr()
120 SET_NETDEV_DEV(netdev, &alink->vnic->pdev->dev); in nfp_abm_spawn_repr()
123 err = nfp_repr_init(app, netdev, nfp_abm_portid(rtype, alink->id), in nfp_abm_spawn_repr()
124 port, alink->vnic->dp.netdev); in nfp_abm_spawn_repr()
129 WARN(nfp_repr_get_locked(app, reprs, alink->id), "duplicate repr"); in nfp_abm_spawn_repr()
131 rcu_assign_pointer(reprs->reprs[alink->id], netdev); in nfp_abm_spawn_repr()
134 nfp_info(app->cpp, "%s Port %d Representor(%s) created\n", in nfp_abm_spawn_repr()
136 alink->id, netdev->name); in nfp_abm_spawn_repr()
141 nfp_port_free(port); in nfp_abm_spawn_repr()
155 netdev = nfp_repr_get_locked(app, reprs, alink->id); in nfp_abm_kill_repr()
159 rcu_assign_pointer(reprs->reprs[alink->id], NULL); in nfp_abm_kill_repr()
169 nfp_abm_kill_repr(abm->app, alink, NFP_REPR_TYPE_PF); in nfp_abm_kill_reprs()
170 nfp_abm_kill_repr(abm->app, alink, NFP_REPR_TYPE_PHYS_PORT); in nfp_abm_kill_reprs()
175 struct nfp_pf *pf = abm->app->pf; in nfp_abm_kill_reprs_all()
178 list_for_each_entry(nn, &pf->vnics, vnic_list) in nfp_abm_kill_reprs_all()
179 nfp_abm_kill_reprs(abm, (struct nfp_abm_link *)nn->app_priv); in nfp_abm_kill_reprs_all()
184 struct nfp_abm *abm = app->priv; in nfp_abm_eswitch_mode_get()
186 return abm->eswitch_mode; in nfp_abm_eswitch_mode_get()
194 abm->eswitch_mode = DEVLINK_ESWITCH_MODE_LEGACY; in nfp_abm_eswitch_set_legacy()
200 if (abm->eswitch_mode != DEVLINK_ESWITCH_MODE_LEGACY) in nfp_abm_eswitch_clean_up()
206 struct nfp_app *app = abm->app; in nfp_abm_eswitch_set_switchdev()
207 struct nfp_pf *pf = app->pf; in nfp_abm_eswitch_set_switchdev()
211 if (!abm->red_support) in nfp_abm_eswitch_set_switchdev()
212 return -EOPNOTSUPP; in nfp_abm_eswitch_set_switchdev()
218 list_for_each_entry(nn, &pf->vnics, vnic_list) { in nfp_abm_eswitch_set_switchdev()
219 struct nfp_abm_link *alink = nn->app_priv; in nfp_abm_eswitch_set_switchdev()
230 abm->eswitch_mode = DEVLINK_ESWITCH_MODE_SWITCHDEV; in nfp_abm_eswitch_set_switchdev()
241 struct nfp_abm *abm = app->priv; in nfp_abm_eswitch_mode_set()
243 if (abm->eswitch_mode == mode) in nfp_abm_eswitch_mode_set()
252 return -EINVAL; in nfp_abm_eswitch_mode_set()
258 unsigned int id) in nfp_abm_vnic_set_mac() argument
260 struct nfp_eth_table_port *eth_port = &pf->eth_tbl->ports[id]; in nfp_abm_vnic_set_mac()
266 if (id > pf->eth_tbl->count) { in nfp_abm_vnic_set_mac()
267 nfp_warn(pf->cpp, "No entry for persistent MAC address\n"); in nfp_abm_vnic_set_mac()
268 eth_hw_addr_random(nn->dp.netdev); in nfp_abm_vnic_set_mac()
273 eth_port->eth_index, abm->pf_id); in nfp_abm_vnic_set_mac()
275 nsp = nfp_nsp_open(pf->cpp); in nfp_abm_vnic_set_mac()
277 nfp_warn(pf->cpp, "Failed to access the NSP for persistent MAC address: %ld\n", in nfp_abm_vnic_set_mac()
279 eth_hw_addr_random(nn->dp.netdev); in nfp_abm_vnic_set_mac()
284 nfp_warn(pf->cpp, "NSP doesn't support PF MAC generation\n"); in nfp_abm_vnic_set_mac()
285 eth_hw_addr_random(nn->dp.netdev); in nfp_abm_vnic_set_mac()
293 nfp_warn(pf->cpp, "Reading persistent MAC address failed: %d\n", in nfp_abm_vnic_set_mac()
295 eth_hw_addr_random(nn->dp.netdev); in nfp_abm_vnic_set_mac()
302 nfp_warn(pf->cpp, "Can't parse persistent MAC address (%s)\n", in nfp_abm_vnic_set_mac()
304 eth_hw_addr_random(nn->dp.netdev); in nfp_abm_vnic_set_mac()
308 eth_hw_addr_set(nn->dp.netdev, mac_addr); in nfp_abm_vnic_set_mac()
309 ether_addr_copy(nn->dp.netdev->perm_addr, mac_addr); in nfp_abm_vnic_set_mac()
313 nfp_abm_vnic_alloc(struct nfp_app *app, struct nfp_net *nn, unsigned int id) in nfp_abm_vnic_alloc() argument
315 struct nfp_eth_table_port *eth_port = &app->pf->eth_tbl->ports[id]; in nfp_abm_vnic_alloc()
316 struct nfp_abm *abm = app->priv; in nfp_abm_vnic_alloc()
322 return -ENOMEM; in nfp_abm_vnic_alloc()
323 nn->app_priv = alink; in nfp_abm_vnic_alloc()
324 alink->abm = abm; in nfp_abm_vnic_alloc()
325 alink->vnic = nn; in nfp_abm_vnic_alloc()
326 alink->id = id; in nfp_abm_vnic_alloc()
327 alink->total_queues = alink->vnic->max_rx_rings; in nfp_abm_vnic_alloc()
329 INIT_LIST_HEAD(&alink->dscp_map); in nfp_abm_vnic_alloc()
335 alink->prio_map = kzalloc(abm->prio_map_len, GFP_KERNEL); in nfp_abm_vnic_alloc()
336 if (!alink->prio_map) { in nfp_abm_vnic_alloc()
337 err = -ENOMEM; in nfp_abm_vnic_alloc()
341 /* This is a multi-host app, make sure MAC/PHY is up, but don't in nfp_abm_vnic_alloc()
344 err = nfp_eth_set_configured(app->cpp, eth_port->index, true); in nfp_abm_vnic_alloc()
348 netif_keep_dst(nn->dp.netdev); in nfp_abm_vnic_alloc()
350 nfp_abm_vnic_set_mac(app->pf, abm, nn, id); in nfp_abm_vnic_alloc()
351 INIT_RADIX_TREE(&alink->qdiscs, GFP_KERNEL); in nfp_abm_vnic_alloc()
356 kfree(alink->prio_map); in nfp_abm_vnic_alloc()
364 struct nfp_abm_link *alink = nn->app_priv; in nfp_abm_vnic_free()
366 nfp_abm_kill_reprs(alink->abm, alink); in nfp_abm_vnic_free()
367 WARN(!radix_tree_empty(&alink->qdiscs), "left over qdiscs\n"); in nfp_abm_vnic_free()
368 kfree(alink->prio_map); in nfp_abm_vnic_free()
374 struct nfp_abm_link *alink = nn->app_priv; in nfp_abm_vnic_init()
376 if (nfp_abm_has_prio(alink->abm)) in nfp_abm_vnic_init()
377 return nfp_abm_ctrl_prio_map_update(alink, alink->prio_map); in nfp_abm_vnic_init()
382 nfp_abm_port_get_stats(struct nfp_app *app, struct nfp_port *port, u64 *data) in nfp_abm_port_get_stats() argument
384 struct nfp_repr *repr = netdev_priv(port->netdev); in nfp_abm_port_get_stats()
388 if (port->type != NFP_PORT_PF_PORT) in nfp_abm_port_get_stats()
390 alink = repr->app_priv; in nfp_abm_port_get_stats()
391 for (i = 0; i < alink->vnic->dp.num_r_vecs; i++) { in nfp_abm_port_get_stats()
399 nfp_abm_port_get_stats_count(struct nfp_app *app, struct nfp_port *port) in nfp_abm_port_get_stats_count() argument
401 struct nfp_repr *repr = netdev_priv(port->netdev); in nfp_abm_port_get_stats_count()
404 if (port->type != NFP_PORT_PF_PORT) in nfp_abm_port_get_stats_count()
406 alink = repr->app_priv; in nfp_abm_port_get_stats_count()
407 return alink->vnic->dp.num_r_vecs * 2; in nfp_abm_port_get_stats_count()
411 nfp_abm_port_get_stats_strings(struct nfp_app *app, struct nfp_port *port, in nfp_abm_port_get_stats_strings() argument
414 struct nfp_repr *repr = netdev_priv(port->netdev); in nfp_abm_port_get_stats_strings()
418 if (port->type != NFP_PORT_PF_PORT) in nfp_abm_port_get_stats_strings()
420 alink = repr->app_priv; in nfp_abm_port_get_stats_strings()
421 for (i = 0; i < alink->vnic->dp.num_r_vecs; i++) { in nfp_abm_port_get_stats_strings()
432 if (!abm->red_support) in nfp_abm_fw_init_reset()
435 for (i = 0; i < abm->num_bands * NFP_NET_MAX_RX_RINGS; i++) { in nfp_abm_fw_init_reset()
445 struct nfp_pf *pf = app->pf; in nfp_abm_init()
450 if (!pf->eth_tbl) { in nfp_abm_init()
451 nfp_err(pf->cpp, "ABM NIC requires ETH table\n"); in nfp_abm_init()
452 return -EINVAL; in nfp_abm_init()
454 if (pf->max_data_vnics != pf->eth_tbl->count) { in nfp_abm_init()
455 nfp_err(pf->cpp, "ETH entries don't match vNICs (%d vs %d)\n", in nfp_abm_init()
456 pf->max_data_vnics, pf->eth_tbl->count); in nfp_abm_init()
457 return -EINVAL; in nfp_abm_init()
459 if (!pf->mac_stats_bar) { in nfp_abm_init()
460 nfp_warn(app->cpp, "ABM NIC requires mac_stats symbol\n"); in nfp_abm_init()
461 return -EINVAL; in nfp_abm_init()
466 return -ENOMEM; in nfp_abm_init()
467 app->priv = abm; in nfp_abm_init()
468 abm->app = app; in nfp_abm_init()
474 err = -ENOMEM; in nfp_abm_init()
475 abm->num_thresholds = array_size(abm->num_bands, NFP_NET_MAX_RX_RINGS); in nfp_abm_init()
476 abm->threshold_undef = bitmap_zalloc(abm->num_thresholds, GFP_KERNEL); in nfp_abm_init()
477 if (!abm->threshold_undef) in nfp_abm_init()
480 abm->thresholds = kvcalloc(abm->num_thresholds, in nfp_abm_init()
481 sizeof(*abm->thresholds), GFP_KERNEL); in nfp_abm_init()
482 if (!abm->thresholds) in nfp_abm_init()
485 abm->actions = kvcalloc(abm->num_thresholds, sizeof(*abm->actions), in nfp_abm_init()
487 if (!abm->actions) in nfp_abm_init()
495 err = -ENOMEM; in nfp_abm_init()
496 reprs = nfp_reprs_alloc(pf->max_data_vnics); in nfp_abm_init()
499 RCU_INIT_POINTER(app->reprs[NFP_REPR_TYPE_PHYS_PORT], reprs); in nfp_abm_init()
501 reprs = nfp_reprs_alloc(pf->max_data_vnics); in nfp_abm_init()
504 RCU_INIT_POINTER(app->reprs[NFP_REPR_TYPE_PF], reprs); in nfp_abm_init()
511 kvfree(abm->actions); in nfp_abm_init()
513 kvfree(abm->thresholds); in nfp_abm_init()
515 bitmap_free(abm->threshold_undef); in nfp_abm_init()
518 app->priv = NULL; in nfp_abm_init()
524 struct nfp_abm *abm = app->priv; in nfp_abm_clean()
529 bitmap_free(abm->threshold_undef); in nfp_abm_clean()
530 kvfree(abm->actions); in nfp_abm_clean()
531 kvfree(abm->thresholds); in nfp_abm_clean()
533 app->priv = NULL; in nfp_abm_clean()
537 .id = NFP_APP_ACTIVE_BUFFER_MGMT_NIC,