|
@@ -2490,12 +2490,14 @@ static int nes_disconnect(struct nes_qp *nesqp, int abrupt)
|
|
int ret = 0;
|
|
int ret = 0;
|
|
struct nes_vnic *nesvnic;
|
|
struct nes_vnic *nesvnic;
|
|
struct nes_device *nesdev;
|
|
struct nes_device *nesdev;
|
|
|
|
+ struct nes_ib_device *nesibdev;
|
|
|
|
|
|
nesvnic = to_nesvnic(nesqp->ibqp.device);
|
|
nesvnic = to_nesvnic(nesqp->ibqp.device);
|
|
if (!nesvnic)
|
|
if (!nesvnic)
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
|
|
|
|
nesdev = nesvnic->nesdev;
|
|
nesdev = nesvnic->nesdev;
|
|
|
|
+ nesibdev = nesvnic->nesibdev;
|
|
|
|
|
|
nes_debug(NES_DBG_CM, "netdev refcnt = %u.\n",
|
|
nes_debug(NES_DBG_CM, "netdev refcnt = %u.\n",
|
|
atomic_read(&nesvnic->netdev->refcnt));
|
|
atomic_read(&nesvnic->netdev->refcnt));
|
|
@@ -2507,6 +2509,8 @@ static int nes_disconnect(struct nes_qp *nesqp, int abrupt)
|
|
} else {
|
|
} else {
|
|
/* Need to free the Last Streaming Mode Message */
|
|
/* Need to free the Last Streaming Mode Message */
|
|
if (nesqp->ietf_frame) {
|
|
if (nesqp->ietf_frame) {
|
|
|
|
+ if (nesqp->lsmm_mr)
|
|
|
|
+ nesibdev->ibdev.dereg_mr(nesqp->lsmm_mr);
|
|
pci_free_consistent(nesdev->pcidev,
|
|
pci_free_consistent(nesdev->pcidev,
|
|
nesqp->private_data_len+sizeof(struct ietf_mpa_frame),
|
|
nesqp->private_data_len+sizeof(struct ietf_mpa_frame),
|
|
nesqp->ietf_frame, nesqp->ietf_frame_pbase);
|
|
nesqp->ietf_frame, nesqp->ietf_frame_pbase);
|
|
@@ -2543,6 +2547,12 @@ int nes_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
|
|
u32 crc_value;
|
|
u32 crc_value;
|
|
int ret;
|
|
int ret;
|
|
int passive_state;
|
|
int passive_state;
|
|
|
|
+ struct nes_ib_device *nesibdev;
|
|
|
|
+ struct ib_mr *ibmr = NULL;
|
|
|
|
+ struct ib_phys_buf ibphysbuf;
|
|
|
|
+ struct nes_pd *nespd;
|
|
|
|
+
|
|
|
|
+
|
|
|
|
|
|
ibqp = nes_get_qp(cm_id->device, conn_param->qpn);
|
|
ibqp = nes_get_qp(cm_id->device, conn_param->qpn);
|
|
if (!ibqp)
|
|
if (!ibqp)
|
|
@@ -2601,6 +2611,26 @@ int nes_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
|
|
if (cm_id->remote_addr.sin_addr.s_addr !=
|
|
if (cm_id->remote_addr.sin_addr.s_addr !=
|
|
cm_id->local_addr.sin_addr.s_addr) {
|
|
cm_id->local_addr.sin_addr.s_addr) {
|
|
u64temp = (unsigned long)nesqp;
|
|
u64temp = (unsigned long)nesqp;
|
|
|
|
+ nesibdev = nesvnic->nesibdev;
|
|
|
|
+ nespd = nesqp->nespd;
|
|
|
|
+ ibphysbuf.addr = nesqp->ietf_frame_pbase;
|
|
|
|
+ ibphysbuf.size = conn_param->private_data_len +
|
|
|
|
+ sizeof(struct ietf_mpa_frame);
|
|
|
|
+ ibmr = nesibdev->ibdev.reg_phys_mr((struct ib_pd *)nespd,
|
|
|
|
+ &ibphysbuf, 1,
|
|
|
|
+ IB_ACCESS_LOCAL_WRITE,
|
|
|
|
+ (u64 *)&nesqp->ietf_frame);
|
|
|
|
+ if (!ibmr) {
|
|
|
|
+ nes_debug(NES_DBG_CM, "Unable to register memory region"
|
|
|
|
+ "for lSMM for cm_node = %p \n",
|
|
|
|
+ cm_node);
|
|
|
|
+ return -ENOMEM;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ ibmr->pd = &nespd->ibpd;
|
|
|
|
+ ibmr->device = nespd->ibpd.device;
|
|
|
|
+ nesqp->lsmm_mr = ibmr;
|
|
|
|
+
|
|
u64temp |= NES_SW_CONTEXT_ALIGN>>1;
|
|
u64temp |= NES_SW_CONTEXT_ALIGN>>1;
|
|
set_wqe_64bit_value(wqe->wqe_words,
|
|
set_wqe_64bit_value(wqe->wqe_words,
|
|
NES_IWARP_SQ_WQE_COMP_CTX_LOW_IDX,
|
|
NES_IWARP_SQ_WQE_COMP_CTX_LOW_IDX,
|
|
@@ -2611,14 +2641,13 @@ int nes_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
|
|
wqe->wqe_words[NES_IWARP_SQ_WQE_TOTAL_PAYLOAD_IDX] =
|
|
wqe->wqe_words[NES_IWARP_SQ_WQE_TOTAL_PAYLOAD_IDX] =
|
|
cpu_to_le32(conn_param->private_data_len +
|
|
cpu_to_le32(conn_param->private_data_len +
|
|
sizeof(struct ietf_mpa_frame));
|
|
sizeof(struct ietf_mpa_frame));
|
|
- wqe->wqe_words[NES_IWARP_SQ_WQE_FRAG0_LOW_IDX] =
|
|
|
|
- cpu_to_le32((u32)nesqp->ietf_frame_pbase);
|
|
|
|
- wqe->wqe_words[NES_IWARP_SQ_WQE_FRAG0_HIGH_IDX] =
|
|
|
|
- cpu_to_le32((u32)((u64)nesqp->ietf_frame_pbase >> 32));
|
|
|
|
|
|
+ set_wqe_64bit_value(wqe->wqe_words,
|
|
|
|
+ NES_IWARP_SQ_WQE_FRAG0_LOW_IDX,
|
|
|
|
+ (u64)nesqp->ietf_frame);
|
|
wqe->wqe_words[NES_IWARP_SQ_WQE_LENGTH0_IDX] =
|
|
wqe->wqe_words[NES_IWARP_SQ_WQE_LENGTH0_IDX] =
|
|
cpu_to_le32(conn_param->private_data_len +
|
|
cpu_to_le32(conn_param->private_data_len +
|
|
sizeof(struct ietf_mpa_frame));
|
|
sizeof(struct ietf_mpa_frame));
|
|
- wqe->wqe_words[NES_IWARP_SQ_WQE_STAG0_IDX] = 0;
|
|
|
|
|
|
+ wqe->wqe_words[NES_IWARP_SQ_WQE_STAG0_IDX] = ibmr->lkey;
|
|
|
|
|
|
nesqp->nesqp_context->ird_ord_sizes |=
|
|
nesqp->nesqp_context->ird_ord_sizes |=
|
|
cpu_to_le32(NES_QPCONTEXT_ORDIRD_LSMM_PRESENT |
|
|
cpu_to_le32(NES_QPCONTEXT_ORDIRD_LSMM_PRESENT |
|