@@ -375,6 +375,7 @@ struct mana_port_context {
unsigned int num_queues;
mana_handle_t port_handle;
+ refcount_t port_use_count;
u16 port_idx;
@@ -567,4 +568,7 @@ struct mana_adev {
struct gdma_dev *mdev;
};
+int mana_cfg_vport(struct mana_port_context *apc, u32 protection_dom_id,
+ u32 doorbell_pg_id);
+void mana_uncfg_vport(struct mana_port_context *apc);
#endif /* _MANA_H */
@@ -530,13 +530,26 @@ static int mana_query_vport_cfg(struct mana_port_context *apc, u32 vport_index,
return 0;
}
-static int mana_cfg_vport(struct mana_port_context *apc, u32 protection_dom_id,
- u32 doorbell_pg_id)
+void mana_uncfg_vport(struct mana_port_context *apc)
+{
+ refcount_dec(&apc->port_use_count);
+}
+EXPORT_SYMBOL_GPL(mana_uncfg_vport);
+
+int mana_cfg_vport(struct mana_port_context *apc, u32 protection_dom_id,
+ u32 doorbell_pg_id)
{
struct mana_config_vport_resp resp = {};
struct mana_config_vport_req req = {};
int err;
+ /* Ethernet driver and IB driver can't take the port at the same time */
+ refcount_inc(&apc->port_use_count);
+ if (refcount_read(&apc->port_use_count) > 2) {
+ refcount_dec(&apc->port_use_count);
+ return -ENODEV;
+ }
+
mana_gd_init_req_hdr(&req.hdr, MANA_CONFIG_VPORT_TX,
sizeof(req), sizeof(resp));
req.vport = apc->port_handle;
@@ -563,9 +576,13 @@ static int mana_cfg_vport(struct mana_port_context *apc, u32 protection_dom_id,
apc->tx_shortform_allowed = resp.short_form_allowed;
apc->tx_vp_offset = resp.tx_vport_offset;
+
+ netdev_info(apc->ndev, "Configured vPort %llu PD %u DB %u\n",
+ apc->port_handle, protection_dom_id, doorbell_pg_id);
out:
return err;
}
+EXPORT_SYMBOL_GPL(mana_cfg_vport);
static int mana_cfg_vport_steering(struct mana_port_context *apc,
enum TRI_STATE rx,
@@ -626,6 +643,9 @@ static int mana_cfg_vport_steering(struct mana_port_context *apc,
resp.hdr.status);
err = -EPROTO;
}
+
+ netdev_info(ndev, "Configured steering vPort %llu entries %u\n",
+ apc->port_handle, num_entries);
out:
kfree(req);
return err;
@@ -1678,6 +1698,8 @@ static void mana_destroy_vport(struct mana_port_context *apc)
}
mana_destroy_txq(apc);
+
+ mana_uncfg_vport(apc);
}
static int mana_create_vport(struct mana_port_context *apc,
@@ -1928,6 +1950,7 @@ static int mana_probe_port(struct mana_context *ac, int port_idx,
apc->num_queues = gc->max_num_queues;
apc->port_handle = INVALID_MANA_HANDLE;
apc->port_idx = port_idx;
+ refcount_set(&apc->port_use_count, 1);
ndev->netdev_ops = &mana_devops;
ndev->ethtool_ops = &mana_ethtool_ops;