Skip to content

Commit 7ae6f2a

Browse files
committed
Merge branch 'qedr' into k.o/for-next
Signed-off-by: Doug Ledford <[email protected]>
2 parents 0d9c2ff + bd491d2 commit 7ae6f2a

File tree

11 files changed

+1208
-91
lines changed

11 files changed

+1208
-91
lines changed

MAINTAINERS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11068,6 +11068,7 @@ F: drivers/net/ethernet/qlogic/qede/
1106811068

1106911069
QLOGIC QL4xxx RDMA DRIVER
1107011070
M: Ram Amrani <[email protected]>
11071+
M: Michal Kalderon <[email protected]>
1107111072
M: Ariel Elior <[email protected]>
1107211073
1107311074
S: Supported

drivers/infiniband/hw/qedr/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
obj-$(CONFIG_INFINIBAND_QEDR) := qedr.o
22

3-
qedr-y := main.o verbs.o qedr_cm.o
3+
qedr-y := main.o verbs.o qedr_roce_cm.o qedr_iw_cm.o

drivers/infiniband/hw/qedr/main.c

Lines changed: 99 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,16 +33,20 @@
3333
#include <rdma/ib_verbs.h>
3434
#include <rdma/ib_addr.h>
3535
#include <rdma/ib_user_verbs.h>
36+
#include <rdma/iw_cm.h>
37+
#include <rdma/ib_mad.h>
3638
#include <linux/netdevice.h>
3739
#include <linux/iommu.h>
3840
#include <linux/pci.h>
3941
#include <net/addrconf.h>
42+
#include <linux/idr.h>
4043

4144
#include <linux/qed/qed_chain.h>
4245
#include <linux/qed/qed_if.h>
4346
#include "qedr.h"
4447
#include "verbs.h"
4548
#include <rdma/qedr-abi.h>
49+
#include "qedr_iw_cm.h"
4650

4751
MODULE_DESCRIPTION("QLogic 40G/100G ROCE Driver");
4852
MODULE_AUTHOR("QLogic Corporation");
@@ -92,8 +96,84 @@ static struct net_device *qedr_get_netdev(struct ib_device *dev, u8 port_num)
9296
return qdev->ndev;
9397
}
9498

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+
95173
static int qedr_register_device(struct qedr_dev *dev)
96174
{
175+
int rc;
176+
97177
strlcpy(dev->ibdev.name, "qedr%d", IB_DEVICE_NAME_MAX);
98178

99179
dev->ibdev.node_guid = dev->attr.node_guid;
@@ -121,18 +201,21 @@ static int qedr_register_device(struct qedr_dev *dev)
121201
QEDR_UVERBS(POST_SEND) |
122202
QEDR_UVERBS(POST_RECV);
123203

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+
124212
dev->ibdev.phys_port_cnt = 1;
125213
dev->ibdev.num_comp_vectors = dev->num_cnq;
126-
dev->ibdev.node_type = RDMA_NODE_IB_CA;
127214

128215
dev->ibdev.query_device = qedr_query_device;
129216
dev->ibdev.query_port = qedr_query_port;
130217
dev->ibdev.modify_port = qedr_modify_port;
131218

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-
136219
dev->ibdev.alloc_ucontext = qedr_alloc_ucontext;
137220
dev->ibdev.dealloc_ucontext = qedr_dealloc_ucontext;
138221
dev->ibdev.mmap = qedr_mmap;
@@ -166,7 +249,7 @@ static int qedr_register_device(struct qedr_dev *dev)
166249
dev->ibdev.post_recv = qedr_post_recv;
167250

168251
dev->ibdev.process_mad = qedr_process_mad;
169-
dev->ibdev.get_port_immutable = qedr_port_immutable;
252+
170253
dev->ibdev.get_netdev = qedr_get_netdev;
171254

172255
dev->ibdev.dev.parent = &dev->pdev->dev;
@@ -217,6 +300,9 @@ static void qedr_free_resources(struct qedr_dev *dev)
217300
{
218301
int i;
219302

303+
if (IS_IWARP(dev))
304+
destroy_workqueue(dev->iwarp_wq);
305+
220306
for (i = 0; i < dev->num_cnq; i++) {
221307
qedr_free_mem_sb(dev, &dev->sb_array[i], dev->sb_start + i);
222308
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)
241327

242328
spin_lock_init(&dev->sgid_lock);
243329

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+
244336
/* Allocate Status blocks for CNQ */
245337
dev->sb_array = kcalloc(dev->num_cnq, sizeof(*dev->sb_array),
246338
GFP_KERNEL);
@@ -716,6 +808,7 @@ static int qedr_init_hw(struct qedr_dev *dev)
716808
in_params->events = &events;
717809
in_params->cq_mode = QED_RDMA_CQ_MODE_32_BITS;
718810
in_params->max_mtu = dev->ndev->mtu;
811+
dev->iwarp_max_mtu = dev->ndev->mtu;
719812
ether_addr_copy(&in_params->mac_addr[0], dev->ndev->dev_addr);
720813

721814
rc = dev->ops->rdma_init(dev->cdev, in_params);

drivers/infiniband/hw/qedr/qedr.h

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
#define __QEDR_H__
3434

3535
#include <linux/pci.h>
36+
#include <linux/idr.h>
3637
#include <rdma/ib_addr.h>
3738
#include <linux/qed/qed_if.h>
3839
#include <linux/qed/qed_chain.h>
@@ -43,6 +44,8 @@
4344

4445
#define QEDR_NODE_DESC "QLogic 579xx RoCE HCA"
4546
#define DP_NAME(dev) ((dev)->ibdev.name)
47+
#define IS_IWARP(_dev) ((_dev)->rdma_type == QED_RDMA_TYPE_IWARP)
48+
#define IS_ROCE(_dev) ((_dev)->rdma_type == QED_RDMA_TYPE_ROCE)
4649

4750
#define DP_DEBUG(dev, module, fmt, ...) \
4851
pr_debug("(%s) " module ": " fmt, \
@@ -56,6 +59,7 @@
5659
#define QEDR_MSG_SQ " SQ"
5760
#define QEDR_MSG_QP " QP"
5861
#define QEDR_MSG_GSI " GSI"
62+
#define QEDR_MSG_IWARP " IW"
5963

6064
#define QEDR_CQ_MAGIC_NUMBER (0x11223344)
6165

@@ -160,6 +164,11 @@ struct qedr_dev {
160164
struct qedr_cq *gsi_sqcq;
161165
struct qedr_cq *gsi_rqcq;
162166
struct qedr_qp *gsi_qp;
167+
enum qed_rdma_type rdma_type;
168+
spinlock_t idr_lock; /* Protect qpidr data-structure */
169+
struct idr qpidr;
170+
struct workqueue_struct *iwarp_wq;
171+
u16 iwarp_max_mtu;
163172

164173
unsigned long enet_state;
165174

@@ -317,6 +326,9 @@ struct qedr_qp_hwq_info {
317326
/* DB */
318327
void __iomem *db;
319328
union db_prod32 db_data;
329+
330+
void __iomem *iwarp_db2;
331+
union db_prod32 iwarp_db2_data;
320332
};
321333

322334
#define QEDR_INC_SW_IDX(p_info, index) \
@@ -337,7 +349,7 @@ enum qedr_qp_err_bitmap {
337349
struct qedr_qp {
338350
struct ib_qp ibqp; /* must be first */
339351
struct qedr_dev *dev;
340-
352+
struct qedr_iw_ep *ep;
341353
struct qedr_qp_hwq_info sq;
342354
struct qedr_qp_hwq_info rq;
343355

@@ -394,6 +406,8 @@ struct qedr_qp {
394406
/* Relevant to qps created from user space only (applications) */
395407
struct qedr_userq usq;
396408
struct qedr_userq urq;
409+
atomic_t refcnt;
410+
bool destroyed;
397411
};
398412

399413
struct qedr_ah {
@@ -474,6 +488,21 @@ static inline int qedr_get_dmac(struct qedr_dev *dev,
474488
return 0;
475489
}
476490

491+
struct qedr_iw_listener {
492+
struct qedr_dev *dev;
493+
struct iw_cm_id *cm_id;
494+
int backlog;
495+
void *qed_handle;
496+
};
497+
498+
struct qedr_iw_ep {
499+
struct qedr_dev *dev;
500+
struct iw_cm_id *cm_id;
501+
struct qedr_qp *qp;
502+
void *qed_context;
503+
u8 during_connect;
504+
};
505+
477506
static inline
478507
struct qedr_ucontext *get_qedr_ucontext(struct ib_ucontext *ibucontext)
479508
{

drivers/infiniband/hw/qedr/qedr_hsi_rdma.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -655,8 +655,10 @@ struct rdma_sq_rdma_wqe_1st {
655655
#define RDMA_SQ_RDMA_WQE_1ST_INLINE_FLG_SHIFT 4
656656
#define RDMA_SQ_RDMA_WQE_1ST_DIF_ON_HOST_FLG_MASK 0x1
657657
#define RDMA_SQ_RDMA_WQE_1ST_DIF_ON_HOST_FLG_SHIFT 5
658-
#define RDMA_SQ_RDMA_WQE_1ST_RESERVED0_MASK 0x3
659-
#define RDMA_SQ_RDMA_WQE_1ST_RESERVED0_SHIFT 6
658+
#define RDMA_SQ_RDMA_WQE_1ST_READ_INV_FLG_MASK 0x1
659+
#define RDMA_SQ_RDMA_WQE_1ST_READ_INV_FLG_SHIFT 6
660+
#define RDMA_SQ_RDMA_WQE_1ST_RESERVED0_MASK 0x1
661+
#define RDMA_SQ_RDMA_WQE_1ST_RESERVED0_SHIFT 7
660662
u8 wqe_size;
661663
u8 prev_wqe_size;
662664
};

0 commit comments

Comments
 (0)