|
@@ -41,6 +41,7 @@
|
|
|
#include <linux/string.h>
|
|
|
#include <linux/delay.h>
|
|
|
#include <linux/atomic.h>
|
|
|
+#include <rdma/ib_cache.h>
|
|
|
#include <scsi/scsi_proto.h>
|
|
|
#include <scsi/scsi_tcq.h>
|
|
|
#include <target/target_core_base.h>
|
|
@@ -1057,7 +1058,12 @@ static int srpt_init_ch_qp(struct srpt_rdma_ch *ch, struct ib_qp *qp)
|
|
|
attr->qp_state = IB_QPS_INIT;
|
|
|
attr->qp_access_flags = IB_ACCESS_LOCAL_WRITE;
|
|
|
attr->port_num = ch->sport->port;
|
|
|
- attr->pkey_index = 0;
|
|
|
+
|
|
|
+ ret = ib_find_cached_pkey(ch->sport->sdev->device, ch->sport->port,
|
|
|
+ ch->pkey, &attr->pkey_index);
|
|
|
+ if (ret < 0)
|
|
|
+ pr_err("Translating pkey %#x failed (%d) - using index 0\n",
|
|
|
+ ch->pkey, ret);
|
|
|
|
|
|
ret = ib_modify_qp(qp, attr,
|
|
|
IB_QP_STATE | IB_QP_ACCESS_FLAGS | IB_QP_PORT |
|
|
@@ -1994,9 +2000,10 @@ static int srpt_cm_req_recv(struct ib_cm_id *cm_id,
|
|
|
|
|
|
it_iu_len = be32_to_cpu(req->req_it_iu_len);
|
|
|
|
|
|
- pr_info("Received SRP_LOGIN_REQ with i_port_id %pI6, t_port_id %pI6 and it_iu_len %d on port %d (guid=%pI6)\n",
|
|
|
+ pr_info("Received SRP_LOGIN_REQ with i_port_id %pI6, t_port_id %pI6 and it_iu_len %d on port %d (guid=%pI6); pkey %#04x\n",
|
|
|
req->initiator_port_id, req->target_port_id, it_iu_len,
|
|
|
- param->port, &sport->gid);
|
|
|
+ param->port, &sport->gid,
|
|
|
+ be16_to_cpu(param->primary_path->pkey));
|
|
|
|
|
|
rsp = kzalloc(sizeof(*rsp), GFP_KERNEL);
|
|
|
rej = kzalloc(sizeof(*rej), GFP_KERNEL);
|
|
@@ -2073,6 +2080,7 @@ static int srpt_cm_req_recv(struct ib_cm_id *cm_id,
|
|
|
|
|
|
init_rcu_head(&ch->rcu);
|
|
|
kref_init(&ch->kref);
|
|
|
+ ch->pkey = be16_to_cpu(param->primary_path->pkey);
|
|
|
ch->zw_cqe.done = srpt_zerolength_write_done;
|
|
|
INIT_WORK(&ch->release_work, srpt_release_channel_work);
|
|
|
memcpy(ch->i_port_id, req->initiator_port_id, 16);
|