33
33
#include <rdma/ib_verbs.h>
34
34
#include <rdma/ib_addr.h>
35
35
#include <rdma/ib_user_verbs.h>
36
+ #include <rdma/iw_cm.h>
37
+ #include <rdma/ib_mad.h>
36
38
#include <linux/netdevice.h>
37
39
#include <linux/iommu.h>
38
40
#include <linux/pci.h>
39
41
#include <net/addrconf.h>
42
+ #include <linux/idr.h>
40
43
41
44
#include <linux/qed/qed_chain.h>
42
45
#include <linux/qed/qed_if.h>
43
46
#include "qedr.h"
44
47
#include "verbs.h"
45
48
#include <rdma/qedr-abi.h>
49
+ #include "qedr_iw_cm.h"
46
50
47
51
MODULE_DESCRIPTION ("QLogic 40G/100G ROCE Driver" );
48
52
MODULE_AUTHOR ("QLogic Corporation" );
@@ -92,8 +96,84 @@ static struct net_device *qedr_get_netdev(struct ib_device *dev, u8 port_num)
92
96
return qdev -> ndev ;
93
97
}
94
98
99
+ int qedr_roce_port_immutable (struct ib_device * ibdev , u8 port_num ,
100
+ struct ib_port_immutable * immutable )
101
+ {
102
+ struct ib_port_attr attr ;
103
+ int err ;
104
+
105
+ err = qedr_query_port (ibdev , port_num , & attr );
106
+ if (err )
107
+ return err ;
108
+
109
+ immutable -> pkey_tbl_len = attr .pkey_tbl_len ;
110
+ immutable -> gid_tbl_len = attr .gid_tbl_len ;
111
+ immutable -> core_cap_flags = RDMA_CORE_PORT_IBA_ROCE |
112
+ RDMA_CORE_PORT_IBA_ROCE_UDP_ENCAP ;
113
+ immutable -> max_mad_size = IB_MGMT_MAD_SIZE ;
114
+
115
+ return 0 ;
116
+ }
117
+
118
+ int qedr_iw_port_immutable (struct ib_device * ibdev , u8 port_num ,
119
+ struct ib_port_immutable * immutable )
120
+ {
121
+ struct ib_port_attr attr ;
122
+ int err ;
123
+
124
+ err = qedr_query_port (ibdev , port_num , & attr );
125
+ if (err )
126
+ return err ;
127
+
128
+ immutable -> pkey_tbl_len = 1 ;
129
+ immutable -> gid_tbl_len = 1 ;
130
+ immutable -> core_cap_flags = RDMA_CORE_PORT_IWARP ;
131
+ immutable -> max_mad_size = 0 ;
132
+
133
+ return 0 ;
134
+ }
135
+
136
+ int qedr_iw_register_device (struct qedr_dev * dev )
137
+ {
138
+ dev -> ibdev .node_type = RDMA_NODE_RNIC ;
139
+ dev -> ibdev .query_gid = qedr_iw_query_gid ;
140
+
141
+ dev -> ibdev .get_port_immutable = qedr_iw_port_immutable ;
142
+
143
+ dev -> ibdev .iwcm = kzalloc (sizeof (* dev -> ibdev .iwcm ), GFP_KERNEL );
144
+ if (!dev -> ibdev .iwcm )
145
+ return - ENOMEM ;
146
+
147
+ dev -> ibdev .iwcm -> connect = qedr_iw_connect ;
148
+ dev -> ibdev .iwcm -> accept = qedr_iw_accept ;
149
+ dev -> ibdev .iwcm -> reject = qedr_iw_reject ;
150
+ dev -> ibdev .iwcm -> create_listen = qedr_iw_create_listen ;
151
+ dev -> ibdev .iwcm -> destroy_listen = qedr_iw_destroy_listen ;
152
+ dev -> ibdev .iwcm -> add_ref = qedr_iw_qp_add_ref ;
153
+ dev -> ibdev .iwcm -> rem_ref = qedr_iw_qp_rem_ref ;
154
+ dev -> ibdev .iwcm -> get_qp = qedr_iw_get_qp ;
155
+
156
+ memcpy (dev -> ibdev .iwcm -> ifname ,
157
+ dev -> ndev -> name , sizeof (dev -> ibdev .iwcm -> ifname ));
158
+
159
+ return 0 ;
160
+ }
161
+
162
+ void qedr_roce_register_device (struct qedr_dev * dev )
163
+ {
164
+ dev -> ibdev .node_type = RDMA_NODE_IB_CA ;
165
+ dev -> ibdev .query_gid = qedr_query_gid ;
166
+
167
+ dev -> ibdev .add_gid = qedr_add_gid ;
168
+ dev -> ibdev .del_gid = qedr_del_gid ;
169
+
170
+ dev -> ibdev .get_port_immutable = qedr_roce_port_immutable ;
171
+ }
172
+
95
173
static int qedr_register_device (struct qedr_dev * dev )
96
174
{
175
+ int rc ;
176
+
97
177
strlcpy (dev -> ibdev .name , "qedr%d" , IB_DEVICE_NAME_MAX );
98
178
99
179
dev -> ibdev .node_guid = dev -> attr .node_guid ;
@@ -121,18 +201,21 @@ static int qedr_register_device(struct qedr_dev *dev)
121
201
QEDR_UVERBS (POST_SEND ) |
122
202
QEDR_UVERBS (POST_RECV );
123
203
204
+ if (IS_IWARP (dev )) {
205
+ rc = qedr_iw_register_device (dev );
206
+ if (rc )
207
+ return rc ;
208
+ } else {
209
+ qedr_roce_register_device (dev );
210
+ }
211
+
124
212
dev -> ibdev .phys_port_cnt = 1 ;
125
213
dev -> ibdev .num_comp_vectors = dev -> num_cnq ;
126
- dev -> ibdev .node_type = RDMA_NODE_IB_CA ;
127
214
128
215
dev -> ibdev .query_device = qedr_query_device ;
129
216
dev -> ibdev .query_port = qedr_query_port ;
130
217
dev -> ibdev .modify_port = qedr_modify_port ;
131
218
132
- dev -> ibdev .query_gid = qedr_query_gid ;
133
- dev -> ibdev .add_gid = qedr_add_gid ;
134
- dev -> ibdev .del_gid = qedr_del_gid ;
135
-
136
219
dev -> ibdev .alloc_ucontext = qedr_alloc_ucontext ;
137
220
dev -> ibdev .dealloc_ucontext = qedr_dealloc_ucontext ;
138
221
dev -> ibdev .mmap = qedr_mmap ;
@@ -166,7 +249,7 @@ static int qedr_register_device(struct qedr_dev *dev)
166
249
dev -> ibdev .post_recv = qedr_post_recv ;
167
250
168
251
dev -> ibdev .process_mad = qedr_process_mad ;
169
- dev -> ibdev . get_port_immutable = qedr_port_immutable ;
252
+
170
253
dev -> ibdev .get_netdev = qedr_get_netdev ;
171
254
172
255
dev -> ibdev .dev .parent = & dev -> pdev -> dev ;
@@ -217,6 +300,9 @@ static void qedr_free_resources(struct qedr_dev *dev)
217
300
{
218
301
int i ;
219
302
303
+ if (IS_IWARP (dev ))
304
+ destroy_workqueue (dev -> iwarp_wq );
305
+
220
306
for (i = 0 ; i < dev -> num_cnq ; i ++ ) {
221
307
qedr_free_mem_sb (dev , & dev -> sb_array [i ], dev -> sb_start + i );
222
308
dev -> ops -> common -> chain_free (dev -> cdev , & dev -> cnq_array [i ].pbl );
@@ -241,6 +327,12 @@ static int qedr_alloc_resources(struct qedr_dev *dev)
241
327
242
328
spin_lock_init (& dev -> sgid_lock );
243
329
330
+ if (IS_IWARP (dev )) {
331
+ spin_lock_init (& dev -> idr_lock );
332
+ idr_init (& dev -> qpidr );
333
+ dev -> iwarp_wq = create_singlethread_workqueue ("qedr_iwarpq" );
334
+ }
335
+
244
336
/* Allocate Status blocks for CNQ */
245
337
dev -> sb_array = kcalloc (dev -> num_cnq , sizeof (* dev -> sb_array ),
246
338
GFP_KERNEL );
@@ -716,6 +808,7 @@ static int qedr_init_hw(struct qedr_dev *dev)
716
808
in_params -> events = & events ;
717
809
in_params -> cq_mode = QED_RDMA_CQ_MODE_32_BITS ;
718
810
in_params -> max_mtu = dev -> ndev -> mtu ;
811
+ dev -> iwarp_max_mtu = dev -> ndev -> mtu ;
719
812
ether_addr_copy (& in_params -> mac_addr [0 ], dev -> ndev -> dev_addr );
720
813
721
814
rc = dev -> ops -> rdma_init (dev -> cdev , in_params );
0 commit comments