1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (c) 2022, Microsoft Corporation. All rights reserved.
7 #include <net/mana/mana_auxiliary.h>
8 #include <net/addrconf.h>
10 MODULE_DESCRIPTION("Microsoft Azure Network Adapter IB driver");
11 MODULE_LICENSE("GPL");
12 MODULE_IMPORT_NS("NET_MANA");
14 static const struct ib_device_ops mana_ib_dev_ops
= {
16 .driver_id
= RDMA_DRIVER_MANA
,
17 .uverbs_abi_ver
= MANA_IB_UVERBS_ABI_VERSION
,
19 .add_gid
= mana_ib_gd_add_gid
,
20 .alloc_pd
= mana_ib_alloc_pd
,
21 .alloc_ucontext
= mana_ib_alloc_ucontext
,
22 .create_cq
= mana_ib_create_cq
,
23 .create_qp
= mana_ib_create_qp
,
24 .create_rwq_ind_table
= mana_ib_create_rwq_ind_table
,
25 .create_wq
= mana_ib_create_wq
,
26 .dealloc_pd
= mana_ib_dealloc_pd
,
27 .dealloc_ucontext
= mana_ib_dealloc_ucontext
,
28 .del_gid
= mana_ib_gd_del_gid
,
29 .dereg_mr
= mana_ib_dereg_mr
,
30 .destroy_cq
= mana_ib_destroy_cq
,
31 .destroy_qp
= mana_ib_destroy_qp
,
32 .destroy_rwq_ind_table
= mana_ib_destroy_rwq_ind_table
,
33 .destroy_wq
= mana_ib_destroy_wq
,
34 .disassociate_ucontext
= mana_ib_disassociate_ucontext
,
35 .get_link_layer
= mana_ib_get_link_layer
,
36 .get_port_immutable
= mana_ib_get_port_immutable
,
38 .modify_qp
= mana_ib_modify_qp
,
39 .modify_wq
= mana_ib_modify_wq
,
40 .query_device
= mana_ib_query_device
,
41 .query_gid
= mana_ib_query_gid
,
42 .query_pkey
= mana_ib_query_pkey
,
43 .query_port
= mana_ib_query_port
,
44 .reg_user_mr
= mana_ib_reg_user_mr
,
46 INIT_RDMA_OBJ_SIZE(ib_cq
, mana_ib_cq
, ibcq
),
47 INIT_RDMA_OBJ_SIZE(ib_pd
, mana_ib_pd
, ibpd
),
48 INIT_RDMA_OBJ_SIZE(ib_qp
, mana_ib_qp
, ibqp
),
49 INIT_RDMA_OBJ_SIZE(ib_ucontext
, mana_ib_ucontext
, ibucontext
),
50 INIT_RDMA_OBJ_SIZE(ib_rwq_ind_table
, mana_ib_rwq_ind_table
,
54 static int mana_ib_probe(struct auxiliary_device
*adev
,
55 const struct auxiliary_device_id
*id
)
57 struct mana_adev
*madev
= container_of(adev
, struct mana_adev
, adev
);
58 struct gdma_dev
*mdev
= madev
->mdev
;
59 struct net_device
*ndev
;
60 struct mana_context
*mc
;
61 struct mana_ib_dev
*dev
;
62 u8 mac_addr
[ETH_ALEN
];
65 mc
= mdev
->driver_data
;
67 dev
= ib_alloc_device(mana_ib_dev
, ib_dev
);
71 ib_set_device_ops(&dev
->ib_dev
, &mana_ib_dev_ops
);
73 dev
->ib_dev
.phys_port_cnt
= mc
->num_ports
;
75 ibdev_dbg(&dev
->ib_dev
, "mdev=%p id=%d num_ports=%d\n", mdev
,
76 mdev
->dev_id
.as_uint32
, dev
->ib_dev
.phys_port_cnt
);
78 dev
->ib_dev
.node_type
= RDMA_NODE_IB_CA
;
81 * num_comp_vectors needs to set to the max MSIX index
82 * when interrupts and event queues are implemented
84 dev
->ib_dev
.num_comp_vectors
= mdev
->gdma_context
->max_num_queues
;
85 dev
->ib_dev
.dev
.parent
= mdev
->gdma_context
->dev
;
87 rcu_read_lock(); /* required to get primary netdev */
88 ndev
= mana_get_primary_netdev_rcu(mc
, 0);
92 ibdev_err(&dev
->ib_dev
, "Failed to get netdev for IB port 1");
95 ether_addr_copy(mac_addr
, ndev
->dev_addr
);
96 addrconf_addr_eui48((u8
*)&dev
->ib_dev
.node_guid
, ndev
->dev_addr
);
97 ret
= ib_device_set_netdev(&dev
->ib_dev
, ndev
, 1);
100 ibdev_err(&dev
->ib_dev
, "Failed to set ib netdev, ret %d", ret
);
104 ret
= mana_gd_register_device(&mdev
->gdma_context
->mana_ib
);
106 ibdev_err(&dev
->ib_dev
, "Failed to register device, ret %d",
110 dev
->gdma_dev
= &mdev
->gdma_context
->mana_ib
;
112 ret
= mana_ib_gd_query_adapter_caps(dev
);
114 ibdev_err(&dev
->ib_dev
, "Failed to query device caps, ret %d",
116 goto deregister_device
;
119 ret
= mana_ib_create_eqs(dev
);
121 ibdev_err(&dev
->ib_dev
, "Failed to create EQs, ret %d", ret
);
122 goto deregister_device
;
125 ret
= mana_ib_gd_create_rnic_adapter(dev
);
129 xa_init_flags(&dev
->qp_table_wq
, XA_FLAGS_LOCK_IRQ
);
130 ret
= mana_ib_gd_config_mac(dev
, ADDR_OP_ADD
, mac_addr
);
132 ibdev_err(&dev
->ib_dev
, "Failed to add Mac address, ret %d",
137 ret
= ib_register_device(&dev
->ib_dev
, "mana_%d",
138 mdev
->gdma_context
->dev
);
142 dev_set_drvdata(&adev
->dev
, dev
);
147 xa_destroy(&dev
->qp_table_wq
);
148 mana_ib_gd_destroy_rnic_adapter(dev
);
150 mana_ib_destroy_eqs(dev
);
152 mana_gd_deregister_device(dev
->gdma_dev
);
154 ib_dealloc_device(&dev
->ib_dev
);
158 static void mana_ib_remove(struct auxiliary_device
*adev
)
160 struct mana_ib_dev
*dev
= dev_get_drvdata(&adev
->dev
);
162 ib_unregister_device(&dev
->ib_dev
);
163 xa_destroy(&dev
->qp_table_wq
);
164 mana_ib_gd_destroy_rnic_adapter(dev
);
165 mana_ib_destroy_eqs(dev
);
166 mana_gd_deregister_device(dev
->gdma_dev
);
167 ib_dealloc_device(&dev
->ib_dev
);
170 static const struct auxiliary_device_id mana_id_table
[] = {
177 MODULE_DEVICE_TABLE(auxiliary
, mana_id_table
);
179 static struct auxiliary_driver mana_driver
= {
181 .probe
= mana_ib_probe
,
182 .remove
= mana_ib_remove
,
183 .id_table
= mana_id_table
,
186 module_auxiliary_driver(mana_driver
);