@@ -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) > 1) {
+ 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;
@@ -566,6 +579,7 @@ static int mana_cfg_vport(struct mana_port_context *apc, u32 protection_dom_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,
@@ -1678,6 +1692,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,