net: mana: Add support for Multi Vports on Bare metal

To support Multi Vports on Bare metal, increase the device config response
version. And, skip the register HW vport, and register filter steps, when
the Bare metal hostmode is set.

Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
Link: https://patch.msgid.link/1747671636-5810-1-git-send-email-haiyangz@microsoft.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
Haiyang Zhang 2025-05-19 09:20:36 -07:00 committed by Paolo Abeni
parent 163786f71a
commit 290e5d3c49
2 changed files with 19 additions and 9 deletions

View file

@ -921,7 +921,7 @@ static void mana_pf_deregister_filter(struct mana_port_context *apc)
static int mana_query_device_cfg(struct mana_context *ac, u32 proto_major_ver, static int mana_query_device_cfg(struct mana_context *ac, u32 proto_major_ver,
u32 proto_minor_ver, u32 proto_micro_ver, u32 proto_minor_ver, u32 proto_micro_ver,
u16 *max_num_vports) u16 *max_num_vports, u8 *bm_hostmode)
{ {
struct gdma_context *gc = ac->gdma_dev->gdma_context; struct gdma_context *gc = ac->gdma_dev->gdma_context;
struct mana_query_device_cfg_resp resp = {}; struct mana_query_device_cfg_resp resp = {};
@ -932,7 +932,7 @@ static int mana_query_device_cfg(struct mana_context *ac, u32 proto_major_ver,
mana_gd_init_req_hdr(&req.hdr, MANA_QUERY_DEV_CONFIG, mana_gd_init_req_hdr(&req.hdr, MANA_QUERY_DEV_CONFIG,
sizeof(req), sizeof(resp)); sizeof(req), sizeof(resp));
req.hdr.resp.msg_version = GDMA_MESSAGE_V2; req.hdr.resp.msg_version = GDMA_MESSAGE_V3;
req.proto_major_ver = proto_major_ver; req.proto_major_ver = proto_major_ver;
req.proto_minor_ver = proto_minor_ver; req.proto_minor_ver = proto_minor_ver;
@ -956,11 +956,16 @@ static int mana_query_device_cfg(struct mana_context *ac, u32 proto_major_ver,
*max_num_vports = resp.max_num_vports; *max_num_vports = resp.max_num_vports;
if (resp.hdr.response.msg_version == GDMA_MESSAGE_V2) if (resp.hdr.response.msg_version >= GDMA_MESSAGE_V2)
gc->adapter_mtu = resp.adapter_mtu; gc->adapter_mtu = resp.adapter_mtu;
else else
gc->adapter_mtu = ETH_FRAME_LEN; gc->adapter_mtu = ETH_FRAME_LEN;
if (resp.hdr.response.msg_version >= GDMA_MESSAGE_V3)
*bm_hostmode = resp.bm_hostmode;
else
*bm_hostmode = 0;
debugfs_create_u16("adapter-MTU", 0400, gc->mana_pci_debugfs, &gc->adapter_mtu); debugfs_create_u16("adapter-MTU", 0400, gc->mana_pci_debugfs, &gc->adapter_mtu);
return 0; return 0;
@ -2441,7 +2446,7 @@ static void mana_destroy_vport(struct mana_port_context *apc)
mana_destroy_txq(apc); mana_destroy_txq(apc);
mana_uncfg_vport(apc); mana_uncfg_vport(apc);
if (gd->gdma_context->is_pf) if (gd->gdma_context->is_pf && !apc->ac->bm_hostmode)
mana_pf_deregister_hw_vport(apc); mana_pf_deregister_hw_vport(apc);
} }
@ -2453,7 +2458,7 @@ static int mana_create_vport(struct mana_port_context *apc,
apc->default_rxobj = INVALID_MANA_HANDLE; apc->default_rxobj = INVALID_MANA_HANDLE;
if (gd->gdma_context->is_pf) { if (gd->gdma_context->is_pf && !apc->ac->bm_hostmode) {
err = mana_pf_register_hw_vport(apc); err = mana_pf_register_hw_vport(apc);
if (err) if (err)
return err; return err;
@ -2689,7 +2694,7 @@ int mana_alloc_queues(struct net_device *ndev)
goto destroy_vport; goto destroy_vport;
} }
if (gd->gdma_context->is_pf) { if (gd->gdma_context->is_pf && !apc->ac->bm_hostmode) {
err = mana_pf_register_filter(apc); err = mana_pf_register_filter(apc);
if (err) if (err)
goto destroy_vport; goto destroy_vport;
@ -2751,7 +2756,7 @@ static int mana_dealloc_queues(struct net_device *ndev)
mana_chn_setxdp(apc, NULL); mana_chn_setxdp(apc, NULL);
if (gd->gdma_context->is_pf) if (gd->gdma_context->is_pf && !apc->ac->bm_hostmode)
mana_pf_deregister_filter(apc); mana_pf_deregister_filter(apc);
/* No packet can be transmitted now since apc->port_is_up is false. /* No packet can be transmitted now since apc->port_is_up is false.
@ -2998,6 +3003,7 @@ int mana_probe(struct gdma_dev *gd, bool resuming)
struct gdma_context *gc = gd->gdma_context; struct gdma_context *gc = gd->gdma_context;
struct mana_context *ac = gd->driver_data; struct mana_context *ac = gd->driver_data;
struct device *dev = gc->dev; struct device *dev = gc->dev;
u8 bm_hostmode = 0;
u16 num_ports = 0; u16 num_ports = 0;
int err; int err;
int i; int i;
@ -3026,10 +3032,12 @@ int mana_probe(struct gdma_dev *gd, bool resuming)
} }
err = mana_query_device_cfg(ac, MANA_MAJOR_VERSION, MANA_MINOR_VERSION, err = mana_query_device_cfg(ac, MANA_MAJOR_VERSION, MANA_MINOR_VERSION,
MANA_MICRO_VERSION, &num_ports); MANA_MICRO_VERSION, &num_ports, &bm_hostmode);
if (err) if (err)
goto out; goto out;
ac->bm_hostmode = bm_hostmode;
if (!resuming) { if (!resuming) {
ac->num_ports = num_ports; ac->num_ports = num_ports;
} else { } else {

View file

@ -408,6 +408,7 @@ struct mana_context {
struct gdma_dev *gdma_dev; struct gdma_dev *gdma_dev;
u16 num_ports; u16 num_ports;
u8 bm_hostmode;
struct mana_eq *eqs; struct mana_eq *eqs;
struct dentry *mana_eqs_debugfs; struct dentry *mana_eqs_debugfs;
@ -557,7 +558,8 @@ struct mana_query_device_cfg_resp {
u64 pf_cap_flags4; u64 pf_cap_flags4;
u16 max_num_vports; u16 max_num_vports;
u16 reserved; u8 bm_hostmode; /* response v3: Bare Metal Host Mode */
u8 reserved;
u32 max_num_eqs; u32 max_num_eqs;
/* response v2: */ /* response v2: */