Skip to contentSkip to conversation

i40iw: Remove link dependency on i40e

PATCH New Devale Sindhu 2 participants 2 messages May 21, 2018

Subsystems (3)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 i40iw: Remove link dependency on i40e

From: Sindhu Devale <[email protected]>

Currently i40iw is dependent on i40e symbols i40e_register_client and i40e_unregister_client due to which i40iw cannot be loaded without i40e being loaded.

This patch allows rdma driver to build and load without linking to LAN driver and without LAN driver being loaded first. Once the LAN driver is loaded, the rdma driver is notified through the netdevice notifiers to register as client to the LAN driver. Add function pointers to IDC register/unregister in the private VSI structure. This allows a RDMA driver to build without linking to I40E.

---
 drivers/infiniband/hw/i40iw/i40iw.h           |  24 +++
 drivers/infiniband/hw/i40iw/i40iw_main.c      | 141 ++++++++++++++++--
 drivers/infiniband/hw/i40iw/i40iw_utils.c     |   5 +-
 drivers/net/ethernet/intel/i40e/i40e.h        |   1 +
 drivers/net/ethernet/intel/i40e/i40e_client.h |   9 ++
 drivers/net/ethernet/intel/i40e/i40e_main.c   |   6 +
 6 files changed, 173 insertions(+), 13 deletions(-)
drivers/infiniband/hw/i40iw/i40iw.h +24 -0
index d5d8c1be345a..c6398b73a8da 100644
@@ -119,6 +119,30 @@
 #define I40IW_CQP_COMPL_SQ_WQE_FLUSHED    3
 #define I40IW_CQP_COMPL_RQ_SQ_WQE_FLUSHED 4
 
+enum I40IW_IDC_STATE {
+	I40IW_STATE_INVALID,
+	I40IW_STATE_VALID,
+	I40IW_STATE_REG_FAILED
+};
+
+struct i40iw_peer {
+	struct module *module;
+#define MAX_PEER_NAME_SIZE 8
+	char name[MAX_PEER_NAME_SIZE];
+	enum I40IW_IDC_STATE state;
+	atomic_t ref_count;
+	int (*idc_reg_peer_driver)(struct i40e_client *i40iw_client);
+	int (*idc_unreg_peer_driver)(struct i40e_client *i40iw_client);
+};
+
+struct i40iw_peer_drv {
+	struct i40e_client i40iw_client;
+	struct i40iw_peer peer;
+};
+
+bool i40iw_is_new_peer(struct net_device *netdev);
+void i40iw_reg_peer(void);
+
 struct i40iw_cqp_compl_info {
 	u32 op_ret_val;
 	u16 maj_err_code;
drivers/infiniband/hw/i40iw/i40iw_main.c +129 -12

186 lines not on this page · raw message

drivers/infiniband/hw/i40iw/i40iw_utils.c +4 -1
index a9ea966877f2..264939942da0 100644
@@ -314,8 +314,11 @@ int i40iw_netdevice_event(struct notifier_block *notifier,
 	event_netdev = netdev_notifier_info_to_dev(ptr);
 
 	hdl = i40iw_find_netdev(event_netdev);
-	if (!hdl)
+	if (!hdl) {
+		if (i40iw_is_new_peer(event_netdev))
+			i40iw_reg_peer();
 		return NOTIFY_DONE;
+	}
 
 	iwdev = &hdl->device;
 	if (iwdev->init_state < RDMA_DEV_REGISTERED || iwdev->closing)
drivers/net/ethernet/intel/i40e/i40e.h +1 -0
index 7a80652e2500..e3171b696848 100644
@@ -789,6 +789,7 @@ struct i40e_vsi {
 } ____cacheline_internodealigned_in_smp;
 
 struct i40e_netdev_priv {
+	struct idc_srv_provider prov_callbacks;
 	struct i40e_vsi *vsi;
 };
 
drivers/net/ethernet/intel/i40e/i40e_client.h +9 -0
index 72994baf4941..95a47df9c104 100644
@@ -44,6 +44,15 @@ struct i40e_client;
 #define I40E_QUEUE_TYPE_PE_AEQ  0x80
 #define I40E_QUEUE_INVALID_IDX	0xFFFF
 
+#define IDC_SIGNATURE 0x494e54454c494443ULL	/* INTELIDC */
+struct idc_srv_provider {
+	u64 signature;
+	u8 version;
+	u8 rsvd[7];
+	int (*idc_reg_peer_driver)(struct i40e_client *client);
+	int (*idc_unreg_peer_driver)(struct i40e_client *client);
+};
+
 struct i40e_qv_info {
 	u32 v_idx; /* msix_vector */
 	u16 ceq_idx;
drivers/net/ethernet/intel/i40e/i40e_main.c +6 -0
index b5daa5c9c7de..984001ae7680 100644
@@ -11913,6 +11913,12 @@ static int i40e_config_netdev(struct i40e_vsi *vsi)
 	np = netdev_priv(netdev);
 	np->vsi = vsi;
 
+	np->prov_callbacks.signature = IDC_SIGNATURE;
+	np->prov_callbacks.version = 0;
+	memset(np->prov_callbacks.rsvd, 0, sizeof(np->prov_callbacks.rsvd));
+	np->prov_callbacks.idc_reg_peer_driver = i40e_register_client;
+	np->prov_callbacks.idc_unreg_peer_driver = i40e_unregister_client;
+
 	hw_enc_features = NETIF_F_SG			|
 			  NETIF_F_IP_CSUM		|
 			  NETIF_F_IPV6_CSUM		|
Signature · 1 line
2.17.0
#1 lore raw

PATCH 1/1 i40iw: Remove link dependency on i40e

Quoted 22 lines

-----Original Message-----
From: Intel-wired-lan [mailto:intel-wired-lan-bounces at osuosl.org] On Behalf Of Devale Sindhu
Sent: Monday, May 21, 2018 10:04 AM
To: intel-wired-lan at lists.osuosl.org
Cc: Devale, Sindhu <[email protected]>
Subject: [Intel-wired-lan] [PATCH] i40iw: Remove link dependency on i40e

From: Sindhu Devale <[email protected]>

Currently i40iw is dependent on i40e symbols i40e_register_client and i40e_unregister_client due to which i40iw cannot be loaded without i40e being loaded.

This patch allows rdma driver to build and load without linking to LAN driver and without LAN driver being loaded first. Once the LAN driver is loaded, the rdma driver is notified through the netdevice notifiers to register as client to the LAN driver. Add function pointers to IDC register/unregister in the private VSI structure. This allows a RDMA driver to build without linking to I40E.

Quoted 8 lines
---
 drivers/infiniband/hw/i40iw/i40iw.h           |  24 +++
 drivers/infiniband/hw/i40iw/i40iw_main.c      | 141 ++++++++++++++++--
 drivers/infiniband/hw/i40iw/i40iw_utils.c     |   5 +-
 drivers/net/ethernet/intel/i40e/i40e.h        |   1 +
 drivers/net/ethernet/intel/i40e/i40e_client.h |   9 ++
 drivers/net/ethernet/intel/i40e/i40e_main.c   |   6 +
 6 files changed, 173 insertions(+), 13 deletions(-)