• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /netgear-WNDR4500v2-V1.0.0.60_1.0.38/src/linux/linux-2.6/drivers/infiniband/core/

Lines Matching refs:cm_id_priv

164 static inline void cm_deref_id(struct cm_id_private *cm_id_priv)
166 if (atomic_dec_and_test(&cm_id_priv->refcount))
167 complete(&cm_id_priv->comp);
170 static int cm_alloc_msg(struct cm_id_private *cm_id_priv,
177 mad_agent = cm_id_priv->av.port->mad_agent;
178 ah = ib_create_ah(mad_agent->qp->pd, &cm_id_priv->av.ah_attr);
182 m = ib_create_send_mad(mad_agent, cm_id_priv->id.remote_cm_qpn,
183 cm_id_priv->av.pkey_index,
193 m->retries = cm_id_priv->max_cm_retries;
195 atomic_inc(&cm_id_priv->refcount);
196 m->context[0] = cm_id_priv;
248 static void cm_set_private_data(struct cm_id_private *cm_id_priv,
251 if (cm_id_priv->private_data && cm_id_priv->private_data_len)
252 kfree(cm_id_priv->private_data);
254 cm_id_priv->private_data = private_data;
255 cm_id_priv->private_data_len = private_data_len;
300 static int cm_alloc_id(struct cm_id_private *cm_id_priv)
308 ret = idr_get_new_above(&cm.local_id_table, cm_id_priv,
315 cm_id_priv->id.local_id = (__force __be32) (id ^ cm.random_id_operand);
331 struct cm_id_private *cm_id_priv;
333 cm_id_priv = idr_find(&cm.local_id_table,
335 if (cm_id_priv) {
336 if (cm_id_priv->id.remote_id == remote_id)
337 atomic_inc(&cm_id_priv->refcount);
339 cm_id_priv = NULL;
342 return cm_id_priv;
347 struct cm_id_private *cm_id_priv;
351 cm_id_priv = cm_get_id(local_id, remote_id);
354 return cm_id_priv;
392 static struct cm_id_private * cm_insert_listen(struct cm_id_private *cm_id_priv)
397 __be64 service_id = cm_id_priv->id.service_id;
398 __be64 service_mask = cm_id_priv->id.service_mask;
405 data_cmp = cm_compare_data(cm_id_priv->compare_data,
409 (cm_id_priv->id.device == cur_cm_id_priv->id.device) &&
413 if (cm_id_priv->id.device < cur_cm_id_priv->id.device)
415 else if (cm_id_priv->id.device > cur_cm_id_priv->id.device)
426 rb_link_node(&cm_id_priv->service_node, parent, link);
427 rb_insert_color(&cm_id_priv->service_node, &cm.listen_service_table);
436 struct cm_id_private *cm_id_priv;
440 cm_id_priv = rb_entry(node, struct cm_id_private, service_node);
442 cm_id_priv->compare_data);
443 if ((cm_id_priv->id.service_mask & service_id) ==
444 cm_id_priv->id.service_id &&
445 (cm_id_priv->id.device == device) && !data_cmp)
446 return cm_id_priv;
448 if (device < cm_id_priv->id.device)
450 else if (device > cm_id_priv->id.device)
452 else if (service_id < cm_id_priv->id.service_id)
454 else if (service_id > cm_id_priv->id.service_id)
548 *cm_id_priv)
553 union ib_gid *port_gid = &cm_id_priv->av.dgid;
554 __be32 remote_id = cm_id_priv->id.remote_id;
576 rb_link_node(&cm_id_priv->sidr_id_node, parent, link);
577 rb_insert_color(&cm_id_priv->sidr_id_node, &cm.remote_sidr_table);
581 static void cm_reject_sidr_req(struct cm_id_private *cm_id_priv,
588 ib_send_cm_sidr_rep(&cm_id_priv->id, &param);
595 struct cm_id_private *cm_id_priv;
598 cm_id_priv = kzalloc(sizeof *cm_id_priv, GFP_KERNEL);
599 if (!cm_id_priv)
602 cm_id_priv->id.state = IB_CM_IDLE;
603 cm_id_priv->id.device = device;
604 cm_id_priv->id.cm_handler = cm_handler;
605 cm_id_priv->id.context = context;
606 cm_id_priv->id.remote_cm_qpn = 1;
607 ret = cm_alloc_id(cm_id_priv);
611 spin_lock_init(&cm_id_priv->lock);
612 init_completion(&cm_id_priv->comp);
613 INIT_LIST_HEAD(&cm_id_priv->work_list);
614 atomic_set(&cm_id_priv->work_count, -1);
615 atomic_set(&cm_id_priv->refcount, 1);
616 return &cm_id_priv->id;
619 kfree(cm_id_priv);
624 static struct cm_work * cm_dequeue_work(struct cm_id_private *cm_id_priv)
628 if (list_empty(&cm_id_priv->work_list))
631 work = list_entry(cm_id_priv->work_list.next, struct cm_work, list);
676 static void cm_enter_timewait(struct cm_id_private *cm_id_priv)
682 cm_cleanup_timewait(cm_id_priv->timewait_info);
683 list_add_tail(&cm_id_priv->timewait_info->list, &cm.timewait_list);
691 cm_id_priv->id.state = IB_CM_TIMEWAIT;
692 wait_time = cm_convert_to_ms(cm_id_priv->av.packet_life_time + 1);
693 queue_delayed_work(cm.wq, &cm_id_priv->timewait_info->work.work,
695 cm_id_priv->timewait_info = NULL;
698 static void cm_reset_to_idle(struct cm_id_private *cm_id_priv)
702 cm_id_priv->id.state = IB_CM_IDLE;
703 if (cm_id_priv->timewait_info) {
705 cm_cleanup_timewait(cm_id_priv->timewait_info);
707 kfree(cm_id_priv->timewait_info);
708 cm_id_priv->timewait_info = NULL;
714 struct cm_id_private *cm_id_priv;
718 cm_id_priv = container_of(cm_id, struct cm_id_private, id);
720 spin_lock_irqsave(&cm_id_priv->lock, flags);
724 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
726 rb_erase(&cm_id_priv->service_node, &cm.listen_service_table);
731 ib_cancel_mad(cm_id_priv->av.port->mad_agent, cm_id_priv->msg);
732 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
735 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
736 cm_reject_sidr_req(cm_id_priv, IB_SIDR_REJECT);
739 ib_cancel_mad(cm_id_priv->av.port->mad_agent, cm_id_priv->msg);
740 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
742 &cm_id_priv->id.device->node_guid,
743 sizeof cm_id_priv->id.device->node_guid,
749 cm_reset_to_idle(cm_id_priv);
750 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
752 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
760 ib_cancel_mad(cm_id_priv->av.port->mad_agent, cm_id_priv->msg);
765 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
770 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
774 ib_cancel_mad(cm_id_priv->av.port->mad_agent, cm_id_priv->msg);
775 cm_enter_timewait(cm_id_priv);
776 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
779 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
783 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
788 cm_deref_id(cm_id_priv);
789 wait_for_completion(&cm_id_priv->comp);
790 while ((work = cm_dequeue_work(cm_id_priv)) != NULL)
792 kfree(cm_id_priv->compare_data);
793 kfree(cm_id_priv->private_data);
794 kfree(cm_id_priv);
806 struct cm_id_private *cm_id_priv, *cur_cm_id_priv;
817 cm_id_priv = container_of(cm_id, struct cm_id_private, id);
822 cm_id_priv->compare_data = kzalloc(sizeof *compare_data,
824 if (!cm_id_priv->compare_data)
826 cm_mask_copy(cm_id_priv->compare_data->data,
828 memcpy(cm_id_priv->compare_data->mask, compare_data->mask,
842 cur_cm_id_priv = cm_insert_listen(cm_id_priv);
847 kfree(cm_id_priv->compare_data);
848 cm_id_priv->compare_data = NULL;
855 static __be64 cm_form_tid(struct cm_id_private *cm_id_priv,
860 hi_tid = ((u64) cm_id_priv->av.port->mad_agent->hi_tid) << 32;
861 low_tid = (u64) ((__force u32)cm_id_priv->id.local_id |
878 struct cm_id_private *cm_id_priv,
882 cm_form_tid(cm_id_priv, CM_MSG_SEQUENCE_REQ));
884 req_msg->local_comm_id = cm_id_priv->id.local_id;
886 req_msg->local_ca_guid = cm_id_priv->id.device->node_guid;
965 struct cm_id_private *cm_id_priv;
975 cm_id_priv = container_of(cm_id, struct cm_id_private, id);
976 spin_lock_irqsave(&cm_id_priv->lock, flags);
978 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
982 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
984 cm_id_priv->timewait_info = cm_create_timewait_info(cm_id_priv->
986 if (IS_ERR(cm_id_priv->timewait_info)) {
987 ret = PTR_ERR(cm_id_priv->timewait_info);
991 ret = cm_init_av_by_path(param->primary_path, &cm_id_priv->av);
996 &cm_id_priv->alt_av);
1002 cm_id_priv->timeout_ms = cm_convert_to_ms(
1006 cm_id_priv->max_cm_retries = param->max_cm_retries;
1007 cm_id_priv->initiator_depth = param->initiator_depth;
1008 cm_id_priv->responder_resources = param->responder_resources;
1009 cm_id_priv->retry_count = param->retry_count;
1010 cm_id_priv->path_mtu = param->primary_path->mtu;
1011 cm_id_priv->pkey = param->primary_path->pkey;
1012 cm_id_priv->qp_type = param->qp_type;
1014 ret = cm_alloc_msg(cm_id_priv, &cm_id_priv->msg);
1018 req_msg = (struct cm_req_msg *) cm_id_priv->msg->mad;
1019 cm_format_req(req_msg, cm_id_priv, param);
1020 cm_id_priv->tid = req_msg->hdr.tid;
1021 cm_id_priv->msg->timeout_ms = cm_id_priv->timeout_ms;
1022 cm_id_priv->msg->context[1] = (void *) (unsigned long) IB_CM_REQ_SENT;
1024 cm_id_priv->local_qpn = cm_req_get_local_qpn(req_msg);
1025 cm_id_priv->rq_psn = cm_req_get_starting_psn(req_msg);
1027 spin_lock_irqsave(&cm_id_priv->lock, flags);
1028 ret = ib_post_send_mad(cm_id_priv->msg, NULL);
1030 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
1035 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
1038 error2: cm_free_msg(cm_id_priv->msg);
1039 error1: kfree(cm_id_priv->timewait_info);
1136 struct cm_id_private *cm_id_priv,
1145 param->port = cm_id_priv->av.port->port_num;
1169 static void cm_process_work(struct cm_id_private *cm_id_priv,
1176 ret = cm_id_priv->id.cm_handler(&cm_id_priv->id, &work->cm_event);
1179 while (!ret && !atomic_add_negative(-1, &cm_id_priv->work_count)) {
1180 spin_lock_irqsave(&cm_id_priv->lock, flags);
1181 work = cm_dequeue_work(cm_id_priv);
1182 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
1184 ret = cm_id_priv->id.cm_handler(&cm_id_priv->id,
1188 cm_deref_id(cm_id_priv);
1190 cm_destroy_id(&cm_id_priv->id, ret);
1194 struct cm_id_private *cm_id_priv,
1198 cm_format_mad_hdr(&mra_msg->hdr, CM_MRA_ATTR_ID, cm_id_priv->tid);
1200 mra_msg->local_comm_id = cm_id_priv->id.local_id;
1201 mra_msg->remote_comm_id = cm_id_priv->id.remote_id;
1209 struct cm_id_private *cm_id_priv,
1216 cm_format_mad_hdr(&rej_msg->hdr, CM_REJ_ATTR_ID, cm_id_priv->tid);
1217 rej_msg->remote_comm_id = cm_id_priv->id.remote_id;
1219 switch(cm_id_priv->id.state) {
1225 rej_msg->local_comm_id = cm_id_priv->id.local_id;
1230 rej_msg->local_comm_id = cm_id_priv->id.local_id;
1234 rej_msg->local_comm_id = cm_id_priv->id.local_id;
1250 struct cm_id_private *cm_id_priv)
1257 if (cm_id_priv->id.state == IB_CM_REQ_RCVD)
1264 spin_lock_irqsave(&cm_id_priv->lock, flags);
1265 switch (cm_id_priv->id.state) {
1267 cm_format_mra((struct cm_mra_msg *) msg->mad, cm_id_priv,
1268 CM_MSG_RESPONSE_REQ, cm_id_priv->service_timeout,
1269 cm_id_priv->private_data,
1270 cm_id_priv->private_data_len);
1273 cm_format_rej((struct cm_rej_msg *) msg->mad, cm_id_priv,
1279 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
1286 unlock: spin_unlock_irqrestore(&cm_id_priv->lock, flags);
1291 struct cm_id_private *cm_id_priv)
1302 timewait_info = cm_insert_remote_id(cm_id_priv->timewait_info);
1315 timewait_info = cm_insert_remote_qpn(cm_id_priv->timewait_info);
1317 cm_cleanup_timewait(cm_id_priv->timewait_info);
1326 listen_cm_id_priv = cm_find_listen(cm_id_priv->id.device,
1330 cm_cleanup_timewait(cm_id_priv->timewait_info);
1338 atomic_inc(&cm_id_priv->refcount);
1339 cm_id_priv->id.state = IB_CM_REQ_RCVD;
1340 atomic_inc(&cm_id_priv->work_count);
1349 struct cm_id_private *cm_id_priv, *listen_cm_id_priv;
1359 cm_id_priv = container_of(cm_id, struct cm_id_private, id);
1360 cm_id_priv->id.remote_id = req_msg->local_comm_id;
1363 &cm_id_priv->av);
1364 cm_id_priv->timewait_info = cm_create_timewait_info(cm_id_priv->
1366 if (IS_ERR(cm_id_priv->timewait_info)) {
1367 ret = PTR_ERR(cm_id_priv->timewait_info);
1370 cm_id_priv->timewait_info->work.remote_id = req_msg->local_comm_id;
1371 cm_id_priv->timewait_info->remote_ca_guid = req_msg->local_ca_guid;
1372 cm_id_priv->timewait_info->remote_qpn = cm_req_get_local_qpn(req_msg);
1374 listen_cm_id_priv = cm_match_req(work, cm_id_priv);
1377 kfree(cm_id_priv->timewait_info);
1381 cm_id_priv->id.cm_handler = listen_cm_id_priv->id.cm_handler;
1382 cm_id_priv->id.context = listen_cm_id_priv->id.context;
1383 cm_id_priv->id.service_id = req_msg->service_id;
1384 cm_id_priv->id.service_mask = __constant_cpu_to_be64(~0ULL);
1387 ret = cm_init_av_by_path(&work->path[0], &cm_id_priv->av);
1397 ret = cm_init_av_by_path(&work->path[1], &cm_id_priv->alt_av);
1405 cm_id_priv->tid = req_msg->hdr.tid;
1406 cm_id_priv->timeout_ms = cm_convert_to_ms(
1408 cm_id_priv->max_cm_retries = cm_req_get_max_cm_retries(req_msg);
1409 cm_id_priv->remote_qpn = cm_req_get_local_qpn(req_msg);
1410 cm_id_priv->initiator_depth = cm_req_get_resp_res(req_msg);
1411 cm_id_priv->responder_resources = cm_req_get_init_depth(req_msg);
1412 cm_id_priv->path_mtu = cm_req_get_path_mtu(req_msg);
1413 cm_id_priv->pkey = req_msg->pkey;
1414 cm_id_priv->sq_psn = cm_req_get_starting_psn(req_msg);
1415 cm_id_priv->retry_count = cm_req_get_retry_count(req_msg);
1416 cm_id_priv->rnr_retry_count = cm_req_get_rnr_retry_count(req_msg);
1417 cm_id_priv->qp_type = cm_req_get_qp_type(req_msg);
1419 cm_format_req_event(work, cm_id_priv, &listen_cm_id_priv->id);
1420 cm_process_work(cm_id_priv, work);
1425 atomic_dec(&cm_id_priv->refcount);
1433 struct cm_id_private *cm_id_priv,
1436 cm_format_mad_hdr(&rep_msg->hdr, CM_REP_ATTR_ID, cm_id_priv->tid);
1437 rep_msg->local_comm_id = cm_id_priv->id.local_id;
1438 rep_msg->remote_comm_id = cm_id_priv->id.remote_id;
1448 rep_msg->local_ca_guid = cm_id_priv->id.device->node_guid;
1458 struct cm_id_private *cm_id_priv;
1468 cm_id_priv = container_of(cm_id, struct cm_id_private, id);
1469 spin_lock_irqsave(&cm_id_priv->lock, flags);
1476 ret = cm_alloc_msg(cm_id_priv, &msg);
1481 cm_format_rep(rep_msg, cm_id_priv, param);
1482 msg->timeout_ms = cm_id_priv->timeout_ms;
1487 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
1493 cm_id_priv->msg = msg;
1494 cm_id_priv->initiator_depth = param->initiator_depth;
1495 cm_id_priv->responder_resources = param->responder_resources;
1496 cm_id_priv->rq_psn = cm_rep_get_starting_psn(rep_msg);
1497 cm_id_priv->local_qpn = cm_rep_get_local_qpn(rep_msg);
1499 out: spin_unlock_irqrestore(&cm_id_priv->lock, flags);
1505 struct cm_id_private *cm_id_priv,
1509 cm_format_mad_hdr(&rtu_msg->hdr, CM_RTU_ATTR_ID, cm_id_priv->tid);
1510 rtu_msg->local_comm_id = cm_id_priv->id.local_id;
1511 rtu_msg->remote_comm_id = cm_id_priv->id.remote_id;
1521 struct cm_id_private *cm_id_priv;
1534 cm_id_priv = container_of(cm_id, struct cm_id_private, id);
1535 spin_lock_irqsave(&cm_id_priv->lock, flags);
1542 ret = cm_alloc_msg(cm_id_priv, &msg);
1546 cm_format_rtu((struct cm_rtu_msg *) msg->mad, cm_id_priv,
1551 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
1558 cm_set_private_data(cm_id_priv, data, private_data_len);
1559 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
1562 error: spin_unlock_irqrestore(&cm_id_priv->lock, flags);
1591 struct cm_id_private *cm_id_priv;
1598 cm_id_priv = cm_acquire_id(rep_msg->remote_comm_id,
1600 if (!cm_id_priv)
1607 spin_lock_irqsave(&cm_id_priv->lock, flags);
1608 if (cm_id_priv->id.state == IB_CM_ESTABLISHED)
1609 cm_format_rtu((struct cm_rtu_msg *) msg->mad, cm_id_priv,
1610 cm_id_priv->private_data,
1611 cm_id_priv->private_data_len);
1612 else if (cm_id_priv->id.state == IB_CM_MRA_REP_SENT)
1613 cm_format_mra((struct cm_mra_msg *) msg->mad, cm_id_priv,
1614 CM_MSG_RESPONSE_REP, cm_id_priv->service_timeout,
1615 cm_id_priv->private_data,
1616 cm_id_priv->private_data_len);
1619 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
1626 unlock: spin_unlock_irqrestore(&cm_id_priv->lock, flags);
1628 deref: cm_deref_id(cm_id_priv);
1633 struct cm_id_private *cm_id_priv;
1639 cm_id_priv = cm_acquire_id(rep_msg->remote_comm_id, 0);
1640 if (!cm_id_priv) {
1647 spin_lock_irqsave(&cm_id_priv->lock, flags);
1648 switch (cm_id_priv->id.state) {
1653 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
1658 cm_id_priv->timewait_info->work.remote_id = rep_msg->local_comm_id;
1659 cm_id_priv->timewait_info->remote_ca_guid = rep_msg->local_ca_guid;
1660 cm_id_priv->timewait_info->remote_qpn = cm_rep_get_local_qpn(rep_msg);
1664 if (cm_insert_remote_id(cm_id_priv->timewait_info)) {
1666 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
1671 if (cm_insert_remote_qpn(cm_id_priv->timewait_info)) {
1672 rb_erase(&cm_id_priv->timewait_info->remote_id_node,
1674 cm_id_priv->timewait_info->inserted_remote_id = 0;
1676 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
1685 cm_id_priv->id.state = IB_CM_REP_RCVD;
1686 cm_id_priv->id.remote_id = rep_msg->local_comm_id;
1687 cm_id_priv->remote_qpn = cm_rep_get_local_qpn(rep_msg);
1688 cm_id_priv->initiator_depth = rep_msg->resp_resources;
1689 cm_id_priv->responder_resources = rep_msg->initiator_depth;
1690 cm_id_priv->sq_psn = cm_rep_get_starting_psn(rep_msg);
1691 cm_id_priv->rnr_retry_count = cm_rep_get_rnr_retry_count(rep_msg);
1695 ib_cancel_mad(cm_id_priv->av.port->mad_agent, cm_id_priv->msg);
1696 ret = atomic_inc_and_test(&cm_id_priv->work_count);
1698 list_add_tail(&work->list, &cm_id_priv->work_list);
1699 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
1702 cm_process_work(cm_id_priv, work);
1704 cm_deref_id(cm_id_priv);
1708 cm_deref_id(cm_id_priv);
1714 struct cm_id_private *cm_id_priv;
1719 cm_id_priv = cm_acquire_id(work->local_id, work->remote_id);
1720 if (!cm_id_priv)
1723 spin_lock_irqsave(&cm_id_priv->lock, flags);
1724 if (cm_id_priv->id.state != IB_CM_ESTABLISHED) {
1725 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
1729 ib_cancel_mad(cm_id_priv->av.port->mad_agent, cm_id_priv->msg);
1730 ret = atomic_inc_and_test(&cm_id_priv->work_count);
1732 list_add_tail(&work->list, &cm_id_priv->work_list);
1733 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
1736 cm_process_work(cm_id_priv, work);
1738 cm_deref_id(cm_id_priv);
1741 cm_deref_id(cm_id_priv);
1747 struct cm_id_private *cm_id_priv;
1753 cm_id_priv = cm_acquire_id(rtu_msg->remote_comm_id,
1755 if (!cm_id_priv)
1760 spin_lock_irqsave(&cm_id_priv->lock, flags);
1761 if (cm_id_priv->id.state != IB_CM_REP_SENT &&
1762 cm_id_priv->id.state != IB_CM_MRA_REP_RCVD) {
1763 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
1766 cm_id_priv->id.state = IB_CM_ESTABLISHED;
1768 ib_cancel_mad(cm_id_priv->av.port->mad_agent, cm_id_priv->msg);
1769 ret = atomic_inc_and_test(&cm_id_priv->work_count);
1771 list_add_tail(&work->list, &cm_id_priv->work_list);
1772 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
1775 cm_process_work(cm_id_priv, work);
1777 cm_deref_id(cm_id_priv);
1780 cm_deref_id(cm_id_priv);
1785 struct cm_id_private *cm_id_priv,
1790 cm_form_tid(cm_id_priv, CM_MSG_SEQUENCE_DREQ));
1791 dreq_msg->local_comm_id = cm_id_priv->id.local_id;
1792 dreq_msg->remote_comm_id = cm_id_priv->id.remote_id;
1793 cm_dreq_set_remote_qpn(dreq_msg, cm_id_priv->remote_qpn);
1803 struct cm_id_private *cm_id_priv;
1811 cm_id_priv = container_of(cm_id, struct cm_id_private, id);
1812 spin_lock_irqsave(&cm_id_priv->lock, flags);
1818 ret = cm_alloc_msg(cm_id_priv, &msg);
1820 cm_enter_timewait(cm_id_priv);
1824 cm_format_dreq((struct cm_dreq_msg *) msg->mad, cm_id_priv,
1826 msg->timeout_ms = cm_id_priv->timeout_ms;
1831 cm_enter_timewait(cm_id_priv);
1832 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
1838 cm_id_priv->msg = msg;
1839 out: spin_unlock_irqrestore(&cm_id_priv->lock, flags);
1845 struct cm_id_private *cm_id_priv,
1849 cm_format_mad_hdr(&drep_msg->hdr, CM_DREP_ATTR_ID, cm_id_priv->tid);
1850 drep_msg->local_comm_id = cm_id_priv->id.local_id;
1851 drep_msg->remote_comm_id = cm_id_priv->id.remote_id;
1861 struct cm_id_private *cm_id_priv;
1874 cm_id_priv = container_of(cm_id, struct cm_id_private, id);
1875 spin_lock_irqsave(&cm_id_priv->lock, flags);
1877 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
1882 cm_set_private_data(cm_id_priv, data, private_data_len);
1883 cm_enter_timewait(cm_id_priv);
1885 ret = cm_alloc_msg(cm_id_priv, &msg);
1889 cm_format_drep((struct cm_drep_msg *) msg->mad, cm_id_priv,
1894 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
1899 out: spin_unlock_irqrestore(&cm_id_priv->lock, flags);
1932 struct cm_id_private *cm_id_priv;
1939 cm_id_priv = cm_acquire_id(dreq_msg->remote_comm_id,
1941 if (!cm_id_priv) {
1948 spin_lock_irqsave(&cm_id_priv->lock, flags);
1949 if (cm_id_priv->local_qpn != cm_dreq_get_remote_qpn(dreq_msg))
1952 switch (cm_id_priv->id.state) {
1955 ib_cancel_mad(cm_id_priv->av.port->mad_agent, cm_id_priv->msg);
1964 cm_format_drep((struct cm_drep_msg *) msg->mad, cm_id_priv,
1965 cm_id_priv->private_data,
1966 cm_id_priv->private_data_len);
1967 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
1975 cm_id_priv->id.state = IB_CM_DREQ_RCVD;
1976 cm_id_priv->tid = dreq_msg->hdr.tid;
1977 ret = atomic_inc_and_test(&cm_id_priv->work_count);
1979 list_add_tail(&work->list, &cm_id_priv->work_list);
1980 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
1983 cm_process_work(cm_id_priv, work);
1985 cm_deref_id(cm_id_priv);
1988 unlock: spin_unlock_irqrestore(&cm_id_priv->lock, flags);
1989 deref: cm_deref_id(cm_id_priv);
1995 struct cm_id_private *cm_id_priv;
2001 cm_id_priv = cm_acquire_id(drep_msg->remote_comm_id,
2003 if (!cm_id_priv)
2008 spin_lock_irqsave(&cm_id_priv->lock, flags);
2009 if (cm_id_priv->id.state != IB_CM_DREQ_SENT &&
2010 cm_id_priv->id.state != IB_CM_DREQ_RCVD) {
2011 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
2014 cm_enter_timewait(cm_id_priv);
2016 ib_cancel_mad(cm_id_priv->av.port->mad_agent, cm_id_priv->msg);
2017 ret = atomic_inc_and_test(&cm_id_priv->work_count);
2019 list_add_tail(&work->list, &cm_id_priv->work_list);
2020 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
2023 cm_process_work(cm_id_priv, work);
2025 cm_deref_id(cm_id_priv);
2028 cm_deref_id(cm_id_priv);
2039 struct cm_id_private *cm_id_priv;
2048 cm_id_priv = container_of(cm_id, struct cm_id_private, id);
2050 spin_lock_irqsave(&cm_id_priv->lock, flags);
2058 ret = cm_alloc_msg(cm_id_priv, &msg);
2061 cm_id_priv, reason, ari, ari_length,
2064 cm_reset_to_idle(cm_id_priv);
2068 ret = cm_alloc_msg(cm_id_priv, &msg);
2071 cm_id_priv, reason, ari, ari_length,
2074 cm_enter_timewait(cm_id_priv);
2088 out: spin_unlock_irqrestore(&cm_id_priv->lock, flags);
2109 struct cm_id_private *cm_id_priv;
2123 cm_id_priv = idr_find(&cm.local_id_table, (__force int)
2126 if (cm_id_priv) {
2127 if (cm_id_priv->id.remote_id == remote_id)
2128 atomic_inc(&cm_id_priv->refcount);
2130 cm_id_priv = NULL;
2134 cm_id_priv = cm_acquire_id(rej_msg->remote_comm_id, 0);
2136 cm_id_priv = cm_acquire_id(rej_msg->remote_comm_id, remote_id);
2138 return cm_id_priv;
2143 struct cm_id_private *cm_id_priv;
2149 cm_id_priv = cm_acquire_rejected_id(rej_msg);
2150 if (!cm_id_priv)
2155 spin_lock_irqsave(&cm_id_priv->lock, flags);
2156 switch (cm_id_priv->id.state) {
2161 ib_cancel_mad(cm_id_priv->av.port->mad_agent, cm_id_priv->msg);
2166 cm_enter_timewait(cm_id_priv);
2168 cm_reset_to_idle(cm_id_priv);
2171 ib_cancel_mad(cm_id_priv->av.port->mad_agent, cm_id_priv->msg);
2176 cm_enter_timewait(cm_id_priv);
2179 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
2184 ret = atomic_inc_and_test(&cm_id_priv->work_count);
2186 list_add_tail(&work->list, &cm_id_priv->work_list);
2187 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
2190 cm_process_work(cm_id_priv, work);
2192 cm_deref_id(cm_id_priv);
2195 cm_deref_id(cm_id_priv);
2204 struct cm_id_private *cm_id_priv;
2217 cm_id_priv = container_of(cm_id, struct cm_id_private, id);
2219 spin_lock_irqsave(&cm_id_priv->lock, flags);
2220 switch(cm_id_priv->id.state) {
2222 ret = cm_alloc_msg(cm_id_priv, &msg);
2226 cm_format_mra((struct cm_mra_msg *) msg->mad, cm_id_priv,
2235 ret = cm_alloc_msg(cm_id_priv, &msg);
2239 cm_format_mra((struct cm_mra_msg *) msg->mad, cm_id_priv,
2248 ret = cm_alloc_msg(cm_id_priv, &msg);
2252 cm_format_mra((struct cm_mra_msg *) msg->mad, cm_id_priv,
2264 cm_id_priv->service_timeout = service_timeout;
2265 cm_set_private_data(cm_id_priv, data, private_data_len);
2266 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
2269 error1: spin_unlock_irqrestore(&cm_id_priv->lock, flags);
2273 error2: spin_unlock_irqrestore(&cm_id_priv->lock, flags);
2296 struct cm_id_private *cm_id_priv;
2302 cm_id_priv = cm_acquire_mraed_id(mra_msg);
2303 if (!cm_id_priv)
2310 cm_convert_to_ms(cm_id_priv->av.packet_life_time);
2312 spin_lock_irqsave(&cm_id_priv->lock, flags);
2313 switch (cm_id_priv->id.state) {
2316 ib_modify_mad(cm_id_priv->av.port->mad_agent,
2317 cm_id_priv->msg, timeout))
2319 cm_id_priv->id.state = IB_CM_MRA_REQ_RCVD;
2323 ib_modify_mad(cm_id_priv->av.port->mad_agent,
2324 cm_id_priv->msg, timeout))
2326 cm_id_priv->id.state = IB_CM_MRA_REP_RCVD;
2330 cm_id_priv->id.lap_state != IB_CM_LAP_SENT ||
2331 ib_modify_mad(cm_id_priv->av.port->mad_agent,
2332 cm_id_priv->msg, timeout))
2334 cm_id_priv->id.lap_state = IB_CM_MRA_LAP_RCVD;
2340 cm_id_priv->msg->context[1] = (void *) (unsigned long)
2341 cm_id_priv->id.state;
2342 ret = atomic_inc_and_test(&cm_id_priv->work_count);
2344 list_add_tail(&work->list, &cm_id_priv->work_list);
2345 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
2348 cm_process_work(cm_id_priv, work);
2350 cm_deref_id(cm_id_priv);
2353 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
2354 cm_deref_id(cm_id_priv);
2359 struct cm_id_private *cm_id_priv,
2365 cm_form_tid(cm_id_priv, CM_MSG_SEQUENCE_LAP));
2366 lap_msg->local_comm_id = cm_id_priv->id.local_id;
2367 lap_msg->remote_comm_id = cm_id_priv->id.remote_id;
2368 cm_lap_set_remote_qpn(lap_msg, cm_id_priv->remote_qpn);
2393 struct cm_id_private *cm_id_priv;
2401 cm_id_priv = container_of(cm_id, struct cm_id_private, id);
2402 spin_lock_irqsave(&cm_id_priv->lock, flags);
2410 ret = cm_init_av_by_path(alternate_path, &cm_id_priv->alt_av);
2414 ret = cm_alloc_msg(cm_id_priv, &msg);
2418 cm_format_lap((struct cm_lap_msg *) msg->mad, cm_id_priv,
2420 msg->timeout_ms = cm_id_priv->timeout_ms;
2425 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
2431 cm_id_priv->msg = msg;
2433 out: spin_unlock_irqrestore(&cm_id_priv->lock, flags);
2438 static void cm_format_path_from_lap(struct cm_id_private *cm_id_priv,
2451 path->pkey = cm_id_priv->pkey;
2454 path->mtu = cm_id_priv->path_mtu;
2464 struct cm_id_private *cm_id_priv;
2473 cm_id_priv = cm_acquire_id(lap_msg->remote_comm_id,
2475 if (!cm_id_priv)
2480 cm_format_path_from_lap(cm_id_priv, param->alternate_path, lap_msg);
2483 spin_lock_irqsave(&cm_id_priv->lock, flags);
2484 if (cm_id_priv->id.state != IB_CM_ESTABLISHED)
2487 switch (cm_id_priv->id.lap_state) {
2495 cm_format_mra((struct cm_mra_msg *) msg->mad, cm_id_priv,
2497 cm_id_priv->service_timeout,
2498 cm_id_priv->private_data,
2499 cm_id_priv->private_data_len);
2500 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
2509 cm_id_priv->id.lap_state = IB_CM_LAP_RCVD;
2510 cm_id_priv->tid = lap_msg->hdr.tid;
2513 &cm_id_priv->av);
2514 cm_init_av_by_path(param->alternate_path, &cm_id_priv->alt_av);
2515 ret = atomic_inc_and_test(&cm_id_priv->work_count);
2517 list_add_tail(&work->list, &cm_id_priv->work_list);
2518 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
2521 cm_process_work(cm_id_priv, work);
2523 cm_deref_id(cm_id_priv);
2526 unlock: spin_unlock_irqrestore(&cm_id_priv->lock, flags);
2527 deref: cm_deref_id(cm_id_priv);
2532 struct cm_id_private *cm_id_priv,
2539 cm_format_mad_hdr(&apr_msg->hdr, CM_APR_ATTR_ID, cm_id_priv->tid);
2540 apr_msg->local_comm_id = cm_id_priv->id.local_id;
2541 apr_msg->remote_comm_id = cm_id_priv->id.remote_id;
2560 struct cm_id_private *cm_id_priv;
2569 cm_id_priv = container_of(cm_id, struct cm_id_private, id);
2570 spin_lock_irqsave(&cm_id_priv->lock, flags);
2578 ret = cm_alloc_msg(cm_id_priv, &msg);
2582 cm_format_apr((struct cm_apr_msg *) msg->mad, cm_id_priv, status,
2586 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
2592 out: spin_unlock_irqrestore(&cm_id_priv->lock, flags);
2599 struct cm_id_private *cm_id_priv;
2605 cm_id_priv = cm_acquire_id(apr_msg->remote_comm_id,
2607 if (!cm_id_priv)
2615 spin_lock_irqsave(&cm_id_priv->lock, flags);
2616 if (cm_id_priv->id.state != IB_CM_ESTABLISHED ||
2617 (cm_id_priv->id.lap_state != IB_CM_LAP_SENT &&
2618 cm_id_priv->id.lap_state != IB_CM_MRA_LAP_RCVD)) {
2619 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
2622 cm_id_priv->id.lap_state = IB_CM_LAP_IDLE;
2623 ib_cancel_mad(cm_id_priv->av.port->mad_agent, cm_id_priv->msg);
2624 cm_id_priv->msg = NULL;
2626 ret = atomic_inc_and_test(&cm_id_priv->work_count);
2628 list_add_tail(&work->list, &cm_id_priv->work_list);
2629 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
2632 cm_process_work(cm_id_priv, work);
2634 cm_deref_id(cm_id_priv);
2637 cm_deref_id(cm_id_priv);
2644 struct cm_id_private *cm_id_priv;
2652 cm_id_priv = cm_acquire_id(timewait_info->work.local_id,
2654 if (!cm_id_priv)
2657 spin_lock_irq(&cm_id_priv->lock);
2658 if (cm_id_priv->id.state != IB_CM_TIMEWAIT ||
2659 cm_id_priv->remote_qpn != timewait_info->remote_qpn) {
2660 spin_unlock_irq(&cm_id_priv->lock);
2663 cm_id_priv->id.state = IB_CM_IDLE;
2664 ret = atomic_inc_and_test(&cm_id_priv->work_count);
2666 list_add_tail(&work->list, &cm_id_priv->work_list);
2667 spin_unlock_irq(&cm_id_priv->lock);
2670 cm_process_work(cm_id_priv, work);
2672 cm_deref_id(cm_id_priv);
2675 cm_deref_id(cm_id_priv);
2680 struct cm_id_private *cm_id_priv,
2684 cm_form_tid(cm_id_priv, CM_MSG_SEQUENCE_SIDR));
2685 sidr_req_msg->request_id = cm_id_priv->id.local_id;
2697 struct cm_id_private *cm_id_priv;
2706 cm_id_priv = container_of(cm_id, struct cm_id_private, id);
2707 ret = cm_init_av_by_path(param->path, &cm_id_priv->av);
2713 cm_id_priv->timeout_ms = param->timeout_ms;
2714 cm_id_priv->max_cm_retries = param->max_cm_retries;
2715 ret = cm_alloc_msg(cm_id_priv, &msg);
2719 cm_format_sidr_req((struct cm_sidr_req_msg *) msg->mad, cm_id_priv,
2721 msg->timeout_ms = cm_id_priv->timeout_ms;
2724 spin_lock_irqsave(&cm_id_priv->lock, flags);
2731 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
2736 cm_id_priv->msg = msg;
2737 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
2761 struct cm_id_private *cm_id_priv, *cur_cm_id_priv;
2769 cm_id_priv = container_of(cm_id, struct cm_id_private, id);
2775 cm_id_priv->av.dgid.global.subnet_prefix = cpu_to_be64(wc->slid);
2776 cm_id_priv->av.dgid.global.interface_id = 0;
2779 &cm_id_priv->av);
2780 cm_id_priv->id.remote_id = sidr_req_msg->request_id;
2781 cm_id_priv->id.state = IB_CM_SIDR_REQ_RCVD;
2782 cm_id_priv->tid = sidr_req_msg->hdr.tid;
2783 atomic_inc(&cm_id_priv->work_count);
2786 cur_cm_id_priv = cm_insert_remote_sidr(cm_id_priv);
2795 rb_erase(&cm_id_priv->sidr_id_node, &cm.remote_sidr_table);
2803 cm_id_priv->id.cm_handler = cur_cm_id_priv->id.cm_handler;
2804 cm_id_priv->id.context = cur_cm_id_priv->id.context;
2805 cm_id_priv->id.service_id = sidr_req_msg->service_id;
2806 cm_id_priv->id.service_mask = __constant_cpu_to_be64(~0ULL);
2809 cm_process_work(cm_id_priv, work);
2813 ib_destroy_cm_id(&cm_id_priv->id);
2818 struct cm_id_private *cm_id_priv,
2822 cm_id_priv->tid);
2823 sidr_rep_msg->request_id = cm_id_priv->id.remote_id;
2826 sidr_rep_msg->service_id = cm_id_priv->id.service_id;
2840 struct cm_id_private *cm_id_priv;
2850 cm_id_priv = container_of(cm_id, struct cm_id_private, id);
2851 spin_lock_irqsave(&cm_id_priv->lock, flags);
2857 ret = cm_alloc_msg(cm_id_priv, &msg);
2861 cm_format_sidr_rep((struct cm_sidr_rep_msg *) msg->mad, cm_id_priv,
2865 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
2870 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
2873 rb_erase(&cm_id_priv->sidr_id_node, &cm.remote_sidr_table);
2877 error: spin_unlock_irqrestore(&cm_id_priv->lock, flags);
2901 struct cm_id_private *cm_id_priv;
2906 cm_id_priv = cm_acquire_id(sidr_rep_msg->request_id, 0);
2907 if (!cm_id_priv)
2910 spin_lock_irqsave(&cm_id_priv->lock, flags);
2911 if (cm_id_priv->id.state != IB_CM_SIDR_REQ_SENT) {
2912 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
2915 cm_id_priv->id.state = IB_CM_IDLE;
2916 ib_cancel_mad(cm_id_priv->av.port->mad_agent, cm_id_priv->msg);
2917 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
2920 cm_process_work(cm_id_priv, work);
2923 cm_deref_id(cm_id_priv);
2930 struct cm_id_private *cm_id_priv;
2937 cm_id_priv = msg->context[0];
2940 spin_lock_irqsave(&cm_id_priv->lock, flags);
2942 if (msg != cm_id_priv->msg || state != cm_id_priv->id.state)
2948 cm_reset_to_idle(cm_id_priv);
2953 cm_reset_to_idle(cm_id_priv);
2957 cm_enter_timewait(cm_id_priv);
2961 cm_id_priv->id.state = IB_CM_IDLE;
2967 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
2971 ret = cm_id_priv->id.cm_handler(&cm_id_priv->id, &cm_event);
2974 ib_destroy_cm_id(&cm_id_priv->id);
2977 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
3055 struct cm_id_private *cm_id_priv;
3064 cm_id_priv = container_of(cm_id, struct cm_id_private, id);
3065 spin_lock_irqsave(&cm_id_priv->lock, flags);
3079 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
3104 struct cm_id_private *cm_id_priv;
3108 cm_id_priv = container_of(cm_id, struct cm_id_private, id);
3109 spin_lock_irqsave(&cm_id_priv->lock, flags);
3114 cm_id_priv->av = cm_id_priv->alt_av;
3117 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
3203 static int cm_init_qp_init_attr(struct cm_id_private *cm_id_priv,
3210 spin_lock_irqsave(&cm_id_priv->lock, flags);
3211 switch (cm_id_priv->id.state) {
3224 if (cm_id_priv->responder_resources)
3227 qp_attr->pkey_index = cm_id_priv->av.pkey_index;
3228 qp_attr->port_num = cm_id_priv->av.port->port_num;
3235 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
3239 static int cm_init_qp_rtr_attr(struct cm_id_private *cm_id_priv,
3246 spin_lock_irqsave(&cm_id_priv->lock, flags);
3247 switch (cm_id_priv->id.state) {
3257 qp_attr->ah_attr = cm_id_priv->av.ah_attr;
3258 qp_attr->path_mtu = cm_id_priv->path_mtu;
3259 qp_attr->dest_qp_num = be32_to_cpu(cm_id_priv->remote_qpn);
3260 qp_attr->rq_psn = be32_to_cpu(cm_id_priv->rq_psn);
3261 if (cm_id_priv->qp_type == IB_QPT_RC) {
3265 cm_id_priv->responder_resources;
3268 if (cm_id_priv->alt_av.ah_attr.dlid) {
3270 qp_attr->alt_port_num = cm_id_priv->alt_av.port->port_num;
3271 qp_attr->alt_pkey_index = cm_id_priv->alt_av.pkey_index;
3273 cm_id_priv->alt_av.packet_life_time + 1;
3274 qp_attr->alt_ah_attr = cm_id_priv->alt_av.ah_attr;
3282 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
3286 static int cm_init_qp_rts_attr(struct cm_id_private *cm_id_priv,
3293 spin_lock_irqsave(&cm_id_priv->lock, flags);
3294 switch (cm_id_priv->id.state) {
3304 if (cm_id_priv->id.lap_state == IB_CM_LAP_UNINIT) {
3306 qp_attr->sq_psn = be32_to_cpu(cm_id_priv->sq_psn);
3307 if (cm_id_priv->qp_type == IB_QPT_RC) {
3312 cm_id_priv->av.packet_life_time + 1;
3313 qp_attr->retry_cnt = cm_id_priv->retry_count;
3314 qp_attr->rnr_retry = cm_id_priv->rnr_retry_count;
3316 cm_id_priv->initiator_depth;
3318 if (cm_id_priv->alt_av.ah_attr.dlid) {
3324 qp_attr->alt_port_num = cm_id_priv->alt_av.port->port_num;
3325 qp_attr->alt_pkey_index = cm_id_priv->alt_av.pkey_index;
3327 cm_id_priv->alt_av.packet_life_time + 1;
3328 qp_attr->alt_ah_attr = cm_id_priv->alt_av.ah_attr;
3337 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
3345 struct cm_id_private *cm_id_priv;
3348 cm_id_priv = container_of(cm_id, struct cm_id_private, id);
3351 ret = cm_init_qp_init_attr(cm_id_priv, qp_attr, qp_attr_mask);
3354 ret = cm_init_qp_rtr_attr(cm_id_priv, qp_attr, qp_attr_mask);
3357 ret = cm_init_qp_rts_attr(cm_id_priv, qp_attr, qp_attr_mask);