cm.c revision de6eb66b56d9df5ce6bd254994f05e065214e8cd
1/*
2 * Copyright (c) 2004, 2005 Intel Corporation.  All rights reserved.
3 * Copyright (c) 2004 Topspin Corporation.  All rights reserved.
4 * Copyright (c) 2004, 2005 Voltaire Corporation.  All rights reserved.
5 * Copyright (c) 2005 Sun Microsystems, Inc. All rights reserved.
6 *
7 * This software is available to you under a choice of one of two
8 * licenses.  You may choose to be licensed under the terms of the GNU
9 * General Public License (GPL) Version 2, available from the file
10 * COPYING in the main directory of this source tree, or the
11 * OpenIB.org BSD license below:
12 *
13 *     Redistribution and use in source and binary forms, with or
14 *     without modification, are permitted provided that the following
15 *     conditions are met:
16 *
17 *      - Redistributions of source code must retain the above
18 *        copyright notice, this list of conditions and the following
19 *        disclaimer.
20 *
21 *      - Redistributions in binary form must reproduce the above
22 *        copyright notice, this list of conditions and the following
23 *        disclaimer in the documentation and/or other materials
24 *        provided with the distribution.
25 *
26 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
27 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
28 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
29 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
30 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
31 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
32 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
33 * SOFTWARE.
34 *
35 * $Id: cm.c 2821 2005-07-08 17:07:28Z sean.hefty $
36 */
37#include <linux/dma-mapping.h>
38#include <linux/err.h>
39#include <linux/idr.h>
40#include <linux/interrupt.h>
41#include <linux/pci.h>
42#include <linux/rbtree.h>
43#include <linux/spinlock.h>
44#include <linux/workqueue.h>
45
46#include <rdma/ib_cache.h>
47#include <rdma/ib_cm.h>
48#include "cm_msgs.h"
49
50MODULE_AUTHOR("Sean Hefty");
51MODULE_DESCRIPTION("InfiniBand CM");
52MODULE_LICENSE("Dual BSD/GPL");
53
54static void cm_add_one(struct ib_device *device);
55static void cm_remove_one(struct ib_device *device);
56
57static struct ib_client cm_client = {
58	.name   = "cm",
59	.add    = cm_add_one,
60	.remove = cm_remove_one
61};
62
63static struct ib_cm {
64	spinlock_t lock;
65	struct list_head device_list;
66	rwlock_t device_lock;
67	struct rb_root listen_service_table;
68	u64 listen_service_id;
69	/* struct rb_root peer_service_table; todo: fix peer to peer */
70	struct rb_root remote_qp_table;
71	struct rb_root remote_id_table;
72	struct rb_root remote_sidr_table;
73	struct idr local_id_table;
74	struct workqueue_struct *wq;
75} cm;
76
77struct cm_port {
78	struct cm_device *cm_dev;
79	struct ib_mad_agent *mad_agent;
80	u8 port_num;
81};
82
83struct cm_device {
84	struct list_head list;
85	struct ib_device *device;
86	__be64 ca_guid;
87	struct cm_port port[0];
88};
89
90struct cm_av {
91	struct cm_port *port;
92	union ib_gid dgid;
93	struct ib_ah_attr ah_attr;
94	u16 pkey_index;
95	u8 packet_life_time;
96};
97
98struct cm_work {
99	struct work_struct work;
100	struct list_head list;
101	struct cm_port *port;
102	struct ib_mad_recv_wc *mad_recv_wc;	/* Received MADs */
103	__be32 local_id;			/* Established / timewait */
104	__be32 remote_id;
105	struct ib_cm_event cm_event;
106	struct ib_sa_path_rec path[0];
107};
108
109struct cm_timewait_info {
110	struct cm_work work;			/* Must be first. */
111	struct rb_node remote_qp_node;
112	struct rb_node remote_id_node;
113	__be64 remote_ca_guid;
114	__be32 remote_qpn;
115	u8 inserted_remote_qp;
116	u8 inserted_remote_id;
117};
118
119struct cm_id_private {
120	struct ib_cm_id	id;
121
122	struct rb_node service_node;
123	struct rb_node sidr_id_node;
124	spinlock_t lock;
125	wait_queue_head_t wait;
126	atomic_t refcount;
127
128	struct ib_mad_send_buf *msg;
129	struct cm_timewait_info *timewait_info;
130	/* todo: use alternate port on send failure */
131	struct cm_av av;
132	struct cm_av alt_av;
133
134	void *private_data;
135	__be64 tid;
136	__be32 local_qpn;
137	__be32 remote_qpn;
138	enum ib_qp_type qp_type;
139	__be32 sq_psn;
140	__be32 rq_psn;
141	int timeout_ms;
142	enum ib_mtu path_mtu;
143	u8 private_data_len;
144	u8 max_cm_retries;
145	u8 peer_to_peer;
146	u8 responder_resources;
147	u8 initiator_depth;
148	u8 local_ack_timeout;
149	u8 retry_count;
150	u8 rnr_retry_count;
151	u8 service_timeout;
152
153	struct list_head work_list;
154	atomic_t work_count;
155};
156
157static void cm_work_handler(void *data);
158
159static inline void cm_deref_id(struct cm_id_private *cm_id_priv)
160{
161	if (atomic_dec_and_test(&cm_id_priv->refcount))
162		wake_up(&cm_id_priv->wait);
163}
164
165static int cm_alloc_msg(struct cm_id_private *cm_id_priv,
166			struct ib_mad_send_buf **msg)
167{
168	struct ib_mad_agent *mad_agent;
169	struct ib_mad_send_buf *m;
170	struct ib_ah *ah;
171
172	mad_agent = cm_id_priv->av.port->mad_agent;
173	ah = ib_create_ah(mad_agent->qp->pd, &cm_id_priv->av.ah_attr);
174	if (IS_ERR(ah))
175		return PTR_ERR(ah);
176
177	m = ib_create_send_mad(mad_agent, cm_id_priv->id.remote_cm_qpn,
178			       cm_id_priv->av.pkey_index,
179			       0, IB_MGMT_MAD_HDR, IB_MGMT_MAD_DATA,
180			       GFP_ATOMIC);
181	if (IS_ERR(m)) {
182		ib_destroy_ah(ah);
183		return PTR_ERR(m);
184	}
185
186	/* Timeout set by caller if response is expected. */
187	m->ah = ah;
188	m->retries = cm_id_priv->max_cm_retries;
189
190	atomic_inc(&cm_id_priv->refcount);
191	m->context[0] = cm_id_priv;
192	*msg = m;
193	return 0;
194}
195
196static int cm_alloc_response_msg(struct cm_port *port,
197				 struct ib_mad_recv_wc *mad_recv_wc,
198				 struct ib_mad_send_buf **msg)
199{
200	struct ib_mad_send_buf *m;
201	struct ib_ah *ah;
202
203	ah = ib_create_ah_from_wc(port->mad_agent->qp->pd, mad_recv_wc->wc,
204				  mad_recv_wc->recv_buf.grh, port->port_num);
205	if (IS_ERR(ah))
206		return PTR_ERR(ah);
207
208	m = ib_create_send_mad(port->mad_agent, 1, mad_recv_wc->wc->pkey_index,
209			       0, IB_MGMT_MAD_HDR, IB_MGMT_MAD_DATA,
210			       GFP_ATOMIC);
211	if (IS_ERR(m)) {
212		ib_destroy_ah(ah);
213		return PTR_ERR(m);
214	}
215	m->ah = ah;
216	*msg = m;
217	return 0;
218}
219
220static void cm_free_msg(struct ib_mad_send_buf *msg)
221{
222	ib_destroy_ah(msg->ah);
223	if (msg->context[0])
224		cm_deref_id(msg->context[0]);
225	ib_free_send_mad(msg);
226}
227
228static void * cm_copy_private_data(const void *private_data,
229				   u8 private_data_len)
230{
231	void *data;
232
233	if (!private_data || !private_data_len)
234		return NULL;
235
236	data = kmalloc(private_data_len, GFP_KERNEL);
237	if (!data)
238		return ERR_PTR(-ENOMEM);
239
240	memcpy(data, private_data, private_data_len);
241	return data;
242}
243
244static void cm_set_private_data(struct cm_id_private *cm_id_priv,
245				 void *private_data, u8 private_data_len)
246{
247	if (cm_id_priv->private_data && cm_id_priv->private_data_len)
248		kfree(cm_id_priv->private_data);
249
250	cm_id_priv->private_data = private_data;
251	cm_id_priv->private_data_len = private_data_len;
252}
253
254static void cm_set_ah_attr(struct ib_ah_attr *ah_attr, u8 port_num,
255			   u16 dlid, u8 sl, u16 src_path_bits)
256{
257	memset(ah_attr, 0, sizeof ah_attr);
258	ah_attr->dlid = dlid;
259	ah_attr->sl = sl;
260	ah_attr->src_path_bits = src_path_bits;
261	ah_attr->port_num = port_num;
262}
263
264static void cm_init_av_for_response(struct cm_port *port,
265				    struct ib_wc *wc, struct cm_av *av)
266{
267	av->port = port;
268	av->pkey_index = wc->pkey_index;
269	cm_set_ah_attr(&av->ah_attr, port->port_num, wc->slid,
270		       wc->sl, wc->dlid_path_bits);
271}
272
273static int cm_init_av_by_path(struct ib_sa_path_rec *path, struct cm_av *av)
274{
275	struct cm_device *cm_dev;
276	struct cm_port *port = NULL;
277	unsigned long flags;
278	int ret;
279	u8 p;
280
281	read_lock_irqsave(&cm.device_lock, flags);
282	list_for_each_entry(cm_dev, &cm.device_list, list) {
283		if (!ib_find_cached_gid(cm_dev->device, &path->sgid,
284					&p, NULL)) {
285			port = &cm_dev->port[p-1];
286			break;
287		}
288	}
289	read_unlock_irqrestore(&cm.device_lock, flags);
290
291	if (!port)
292		return -EINVAL;
293
294	ret = ib_find_cached_pkey(cm_dev->device, port->port_num,
295				  be16_to_cpu(path->pkey), &av->pkey_index);
296	if (ret)
297		return ret;
298
299	av->port = port;
300	cm_set_ah_attr(&av->ah_attr, av->port->port_num,
301		       be16_to_cpu(path->dlid), path->sl,
302		       be16_to_cpu(path->slid) & 0x7F);
303	av->packet_life_time = path->packet_life_time;
304	return 0;
305}
306
307static int cm_alloc_id(struct cm_id_private *cm_id_priv)
308{
309	unsigned long flags;
310	int ret;
311
312	do {
313		spin_lock_irqsave(&cm.lock, flags);
314		ret = idr_get_new_above(&cm.local_id_table, cm_id_priv, 1,
315					(__force int *) &cm_id_priv->id.local_id);
316		spin_unlock_irqrestore(&cm.lock, flags);
317	} while( (ret == -EAGAIN) && idr_pre_get(&cm.local_id_table, GFP_KERNEL) );
318	return ret;
319}
320
321static void cm_free_id(__be32 local_id)
322{
323	unsigned long flags;
324
325	spin_lock_irqsave(&cm.lock, flags);
326	idr_remove(&cm.local_id_table, (__force int) local_id);
327	spin_unlock_irqrestore(&cm.lock, flags);
328}
329
330static struct cm_id_private * cm_get_id(__be32 local_id, __be32 remote_id)
331{
332	struct cm_id_private *cm_id_priv;
333
334	cm_id_priv = idr_find(&cm.local_id_table, (__force int) local_id);
335	if (cm_id_priv) {
336		if (cm_id_priv->id.remote_id == remote_id)
337			atomic_inc(&cm_id_priv->refcount);
338		else
339			cm_id_priv = NULL;
340	}
341
342	return cm_id_priv;
343}
344
345static struct cm_id_private * cm_acquire_id(__be32 local_id, __be32 remote_id)
346{
347	struct cm_id_private *cm_id_priv;
348	unsigned long flags;
349
350	spin_lock_irqsave(&cm.lock, flags);
351	cm_id_priv = cm_get_id(local_id, remote_id);
352	spin_unlock_irqrestore(&cm.lock, flags);
353
354	return cm_id_priv;
355}
356
357static struct cm_id_private * cm_insert_listen(struct cm_id_private *cm_id_priv)
358{
359	struct rb_node **link = &cm.listen_service_table.rb_node;
360	struct rb_node *parent = NULL;
361	struct cm_id_private *cur_cm_id_priv;
362	__be64 service_id = cm_id_priv->id.service_id;
363	__be64 service_mask = cm_id_priv->id.service_mask;
364
365	while (*link) {
366		parent = *link;
367		cur_cm_id_priv = rb_entry(parent, struct cm_id_private,
368					  service_node);
369		if ((cur_cm_id_priv->id.service_mask & service_id) ==
370		    (service_mask & cur_cm_id_priv->id.service_id) &&
371		    (cm_id_priv->id.device == cur_cm_id_priv->id.device))
372			return cur_cm_id_priv;
373
374		if (cm_id_priv->id.device < cur_cm_id_priv->id.device)
375			link = &(*link)->rb_left;
376		else if (cm_id_priv->id.device > cur_cm_id_priv->id.device)
377			link = &(*link)->rb_right;
378		else if (service_id < cur_cm_id_priv->id.service_id)
379			link = &(*link)->rb_left;
380		else
381			link = &(*link)->rb_right;
382	}
383	rb_link_node(&cm_id_priv->service_node, parent, link);
384	rb_insert_color(&cm_id_priv->service_node, &cm.listen_service_table);
385	return NULL;
386}
387
388static struct cm_id_private * cm_find_listen(struct ib_device *device,
389					     __be64 service_id)
390{
391	struct rb_node *node = cm.listen_service_table.rb_node;
392	struct cm_id_private *cm_id_priv;
393
394	while (node) {
395		cm_id_priv = rb_entry(node, struct cm_id_private, service_node);
396		if ((cm_id_priv->id.service_mask & service_id) ==
397		     cm_id_priv->id.service_id &&
398		    (cm_id_priv->id.device == device))
399			return cm_id_priv;
400
401		if (device < cm_id_priv->id.device)
402			node = node->rb_left;
403		else if (device > cm_id_priv->id.device)
404			node = node->rb_right;
405		else if (service_id < cm_id_priv->id.service_id)
406			node = node->rb_left;
407		else
408			node = node->rb_right;
409	}
410	return NULL;
411}
412
413static struct cm_timewait_info * cm_insert_remote_id(struct cm_timewait_info
414						     *timewait_info)
415{
416	struct rb_node **link = &cm.remote_id_table.rb_node;
417	struct rb_node *parent = NULL;
418	struct cm_timewait_info *cur_timewait_info;
419	__be64 remote_ca_guid = timewait_info->remote_ca_guid;
420	__be32 remote_id = timewait_info->work.remote_id;
421
422	while (*link) {
423		parent = *link;
424		cur_timewait_info = rb_entry(parent, struct cm_timewait_info,
425					     remote_id_node);
426		if (remote_id < cur_timewait_info->work.remote_id)
427			link = &(*link)->rb_left;
428		else if (remote_id > cur_timewait_info->work.remote_id)
429			link = &(*link)->rb_right;
430		else if (remote_ca_guid < cur_timewait_info->remote_ca_guid)
431			link = &(*link)->rb_left;
432		else if (remote_ca_guid > cur_timewait_info->remote_ca_guid)
433			link = &(*link)->rb_right;
434		else
435			return cur_timewait_info;
436	}
437	timewait_info->inserted_remote_id = 1;
438	rb_link_node(&timewait_info->remote_id_node, parent, link);
439	rb_insert_color(&timewait_info->remote_id_node, &cm.remote_id_table);
440	return NULL;
441}
442
443static struct cm_timewait_info * cm_find_remote_id(__be64 remote_ca_guid,
444						   __be32 remote_id)
445{
446	struct rb_node *node = cm.remote_id_table.rb_node;
447	struct cm_timewait_info *timewait_info;
448
449	while (node) {
450		timewait_info = rb_entry(node, struct cm_timewait_info,
451					 remote_id_node);
452		if (remote_id < timewait_info->work.remote_id)
453			node = node->rb_left;
454		else if (remote_id > timewait_info->work.remote_id)
455			node = node->rb_right;
456		else if (remote_ca_guid < timewait_info->remote_ca_guid)
457			node = node->rb_left;
458		else if (remote_ca_guid > timewait_info->remote_ca_guid)
459			node = node->rb_right;
460		else
461			return timewait_info;
462	}
463	return NULL;
464}
465
466static struct cm_timewait_info * cm_insert_remote_qpn(struct cm_timewait_info
467						      *timewait_info)
468{
469	struct rb_node **link = &cm.remote_qp_table.rb_node;
470	struct rb_node *parent = NULL;
471	struct cm_timewait_info *cur_timewait_info;
472	__be64 remote_ca_guid = timewait_info->remote_ca_guid;
473	__be32 remote_qpn = timewait_info->remote_qpn;
474
475	while (*link) {
476		parent = *link;
477		cur_timewait_info = rb_entry(parent, struct cm_timewait_info,
478					     remote_qp_node);
479		if (remote_qpn < cur_timewait_info->remote_qpn)
480			link = &(*link)->rb_left;
481		else if (remote_qpn > cur_timewait_info->remote_qpn)
482			link = &(*link)->rb_right;
483		else if (remote_ca_guid < cur_timewait_info->remote_ca_guid)
484			link = &(*link)->rb_left;
485		else if (remote_ca_guid > cur_timewait_info->remote_ca_guid)
486			link = &(*link)->rb_right;
487		else
488			return cur_timewait_info;
489	}
490	timewait_info->inserted_remote_qp = 1;
491	rb_link_node(&timewait_info->remote_qp_node, parent, link);
492	rb_insert_color(&timewait_info->remote_qp_node, &cm.remote_qp_table);
493	return NULL;
494}
495
496static struct cm_id_private * cm_insert_remote_sidr(struct cm_id_private
497						    *cm_id_priv)
498{
499	struct rb_node **link = &cm.remote_sidr_table.rb_node;
500	struct rb_node *parent = NULL;
501	struct cm_id_private *cur_cm_id_priv;
502	union ib_gid *port_gid = &cm_id_priv->av.dgid;
503	__be32 remote_id = cm_id_priv->id.remote_id;
504
505	while (*link) {
506		parent = *link;
507		cur_cm_id_priv = rb_entry(parent, struct cm_id_private,
508					  sidr_id_node);
509		if (remote_id < cur_cm_id_priv->id.remote_id)
510			link = &(*link)->rb_left;
511		else if (remote_id > cur_cm_id_priv->id.remote_id)
512			link = &(*link)->rb_right;
513		else {
514			int cmp;
515			cmp = memcmp(port_gid, &cur_cm_id_priv->av.dgid,
516				     sizeof *port_gid);
517			if (cmp < 0)
518				link = &(*link)->rb_left;
519			else if (cmp > 0)
520				link = &(*link)->rb_right;
521			else
522				return cur_cm_id_priv;
523		}
524	}
525	rb_link_node(&cm_id_priv->sidr_id_node, parent, link);
526	rb_insert_color(&cm_id_priv->sidr_id_node, &cm.remote_sidr_table);
527	return NULL;
528}
529
530static void cm_reject_sidr_req(struct cm_id_private *cm_id_priv,
531			       enum ib_cm_sidr_status status)
532{
533	struct ib_cm_sidr_rep_param param;
534
535	memset(&param, 0, sizeof param);
536	param.status = status;
537	ib_send_cm_sidr_rep(&cm_id_priv->id, &param);
538}
539
540struct ib_cm_id *ib_create_cm_id(struct ib_device *device,
541				 ib_cm_handler cm_handler,
542				 void *context)
543{
544	struct cm_id_private *cm_id_priv;
545	int ret;
546
547	cm_id_priv = kzalloc(sizeof *cm_id_priv, GFP_KERNEL);
548	if (!cm_id_priv)
549		return ERR_PTR(-ENOMEM);
550
551	cm_id_priv->id.state = IB_CM_IDLE;
552	cm_id_priv->id.device = device;
553	cm_id_priv->id.cm_handler = cm_handler;
554	cm_id_priv->id.context = context;
555	cm_id_priv->id.remote_cm_qpn = 1;
556	ret = cm_alloc_id(cm_id_priv);
557	if (ret)
558		goto error;
559
560	spin_lock_init(&cm_id_priv->lock);
561	init_waitqueue_head(&cm_id_priv->wait);
562	INIT_LIST_HEAD(&cm_id_priv->work_list);
563	atomic_set(&cm_id_priv->work_count, -1);
564	atomic_set(&cm_id_priv->refcount, 1);
565	return &cm_id_priv->id;
566
567error:
568	kfree(cm_id_priv);
569	return ERR_PTR(-ENOMEM);
570}
571EXPORT_SYMBOL(ib_create_cm_id);
572
573static struct cm_work * cm_dequeue_work(struct cm_id_private *cm_id_priv)
574{
575	struct cm_work *work;
576
577	if (list_empty(&cm_id_priv->work_list))
578		return NULL;
579
580	work = list_entry(cm_id_priv->work_list.next, struct cm_work, list);
581	list_del(&work->list);
582	return work;
583}
584
585static void cm_free_work(struct cm_work *work)
586{
587	if (work->mad_recv_wc)
588		ib_free_recv_mad(work->mad_recv_wc);
589	kfree(work);
590}
591
592static inline int cm_convert_to_ms(int iba_time)
593{
594	/* approximate conversion to ms from 4.096us x 2^iba_time */
595	return 1 << max(iba_time - 8, 0);
596}
597
598static void cm_cleanup_timewait(struct cm_timewait_info *timewait_info)
599{
600	unsigned long flags;
601
602	if (!timewait_info->inserted_remote_id &&
603	    !timewait_info->inserted_remote_qp)
604	    return;
605
606	spin_lock_irqsave(&cm.lock, flags);
607	if (timewait_info->inserted_remote_id) {
608		rb_erase(&timewait_info->remote_id_node, &cm.remote_id_table);
609		timewait_info->inserted_remote_id = 0;
610	}
611
612	if (timewait_info->inserted_remote_qp) {
613		rb_erase(&timewait_info->remote_qp_node, &cm.remote_qp_table);
614		timewait_info->inserted_remote_qp = 0;
615	}
616	spin_unlock_irqrestore(&cm.lock, flags);
617}
618
619static struct cm_timewait_info * cm_create_timewait_info(__be32 local_id)
620{
621	struct cm_timewait_info *timewait_info;
622
623	timewait_info = kzalloc(sizeof *timewait_info, GFP_KERNEL);
624	if (!timewait_info)
625		return ERR_PTR(-ENOMEM);
626
627	timewait_info->work.local_id = local_id;
628	INIT_WORK(&timewait_info->work.work, cm_work_handler,
629		  &timewait_info->work);
630	timewait_info->work.cm_event.event = IB_CM_TIMEWAIT_EXIT;
631	return timewait_info;
632}
633
634static void cm_enter_timewait(struct cm_id_private *cm_id_priv)
635{
636	int wait_time;
637
638	/*
639	 * The cm_id could be destroyed by the user before we exit timewait.
640	 * To protect against this, we search for the cm_id after exiting
641	 * timewait before notifying the user that we've exited timewait.
642	 */
643	cm_id_priv->id.state = IB_CM_TIMEWAIT;
644	wait_time = cm_convert_to_ms(cm_id_priv->local_ack_timeout);
645	queue_delayed_work(cm.wq, &cm_id_priv->timewait_info->work.work,
646			   msecs_to_jiffies(wait_time));
647	cm_id_priv->timewait_info = NULL;
648}
649
650static void cm_reset_to_idle(struct cm_id_private *cm_id_priv)
651{
652	cm_id_priv->id.state = IB_CM_IDLE;
653	if (cm_id_priv->timewait_info) {
654		cm_cleanup_timewait(cm_id_priv->timewait_info);
655		kfree(cm_id_priv->timewait_info);
656		cm_id_priv->timewait_info = NULL;
657	}
658}
659
660void ib_destroy_cm_id(struct ib_cm_id *cm_id)
661{
662	struct cm_id_private *cm_id_priv;
663	struct cm_work *work;
664	unsigned long flags;
665
666	cm_id_priv = container_of(cm_id, struct cm_id_private, id);
667retest:
668	spin_lock_irqsave(&cm_id_priv->lock, flags);
669	switch (cm_id->state) {
670	case IB_CM_LISTEN:
671		cm_id->state = IB_CM_IDLE;
672		spin_unlock_irqrestore(&cm_id_priv->lock, flags);
673		spin_lock_irqsave(&cm.lock, flags);
674		rb_erase(&cm_id_priv->service_node, &cm.listen_service_table);
675		spin_unlock_irqrestore(&cm.lock, flags);
676		break;
677	case IB_CM_SIDR_REQ_SENT:
678		cm_id->state = IB_CM_IDLE;
679		ib_cancel_mad(cm_id_priv->av.port->mad_agent, cm_id_priv->msg);
680		spin_unlock_irqrestore(&cm_id_priv->lock, flags);
681		break;
682	case IB_CM_SIDR_REQ_RCVD:
683		spin_unlock_irqrestore(&cm_id_priv->lock, flags);
684		cm_reject_sidr_req(cm_id_priv, IB_SIDR_REJECT);
685		break;
686	case IB_CM_REQ_SENT:
687	case IB_CM_MRA_REQ_RCVD:
688	case IB_CM_REP_SENT:
689	case IB_CM_MRA_REP_RCVD:
690		ib_cancel_mad(cm_id_priv->av.port->mad_agent, cm_id_priv->msg);
691		/* Fall through */
692	case IB_CM_REQ_RCVD:
693	case IB_CM_MRA_REQ_SENT:
694	case IB_CM_REP_RCVD:
695	case IB_CM_MRA_REP_SENT:
696		spin_unlock_irqrestore(&cm_id_priv->lock, flags);
697		ib_send_cm_rej(cm_id, IB_CM_REJ_TIMEOUT,
698			       &cm_id_priv->av.port->cm_dev->ca_guid,
699			       sizeof cm_id_priv->av.port->cm_dev->ca_guid,
700			       NULL, 0);
701		break;
702	case IB_CM_ESTABLISHED:
703		spin_unlock_irqrestore(&cm_id_priv->lock, flags);
704		ib_send_cm_dreq(cm_id, NULL, 0);
705		goto retest;
706	case IB_CM_DREQ_SENT:
707		ib_cancel_mad(cm_id_priv->av.port->mad_agent, cm_id_priv->msg);
708		cm_enter_timewait(cm_id_priv);
709		spin_unlock_irqrestore(&cm_id_priv->lock, flags);
710		break;
711	case IB_CM_DREQ_RCVD:
712		spin_unlock_irqrestore(&cm_id_priv->lock, flags);
713		ib_send_cm_drep(cm_id, NULL, 0);
714		break;
715	default:
716		spin_unlock_irqrestore(&cm_id_priv->lock, flags);
717		break;
718	}
719
720	cm_free_id(cm_id->local_id);
721	atomic_dec(&cm_id_priv->refcount);
722	wait_event(cm_id_priv->wait, !atomic_read(&cm_id_priv->refcount));
723	while ((work = cm_dequeue_work(cm_id_priv)) != NULL)
724		cm_free_work(work);
725	if (cm_id_priv->private_data && cm_id_priv->private_data_len)
726		kfree(cm_id_priv->private_data);
727	kfree(cm_id_priv);
728}
729EXPORT_SYMBOL(ib_destroy_cm_id);
730
731int ib_cm_listen(struct ib_cm_id *cm_id,
732		 __be64 service_id,
733		 __be64 service_mask)
734{
735	struct cm_id_private *cm_id_priv, *cur_cm_id_priv;
736	unsigned long flags;
737	int ret = 0;
738
739	service_mask = service_mask ? service_mask :
740		       __constant_cpu_to_be64(~0ULL);
741	service_id &= service_mask;
742	if ((service_id & IB_SERVICE_ID_AGN_MASK) == IB_CM_ASSIGN_SERVICE_ID &&
743	    (service_id != IB_CM_ASSIGN_SERVICE_ID))
744		return -EINVAL;
745
746	cm_id_priv = container_of(cm_id, struct cm_id_private, id);
747	BUG_ON(cm_id->state != IB_CM_IDLE);
748
749	cm_id->state = IB_CM_LISTEN;
750
751	spin_lock_irqsave(&cm.lock, flags);
752	if (service_id == IB_CM_ASSIGN_SERVICE_ID) {
753		cm_id->service_id = cpu_to_be64(cm.listen_service_id++);
754		cm_id->service_mask = __constant_cpu_to_be64(~0ULL);
755	} else {
756		cm_id->service_id = service_id;
757		cm_id->service_mask = service_mask;
758	}
759	cur_cm_id_priv = cm_insert_listen(cm_id_priv);
760	spin_unlock_irqrestore(&cm.lock, flags);
761
762	if (cur_cm_id_priv) {
763		cm_id->state = IB_CM_IDLE;
764		ret = -EBUSY;
765	}
766	return ret;
767}
768EXPORT_SYMBOL(ib_cm_listen);
769
770static __be64 cm_form_tid(struct cm_id_private *cm_id_priv,
771			  enum cm_msg_sequence msg_seq)
772{
773	u64 hi_tid, low_tid;
774
775	hi_tid   = ((u64) cm_id_priv->av.port->mad_agent->hi_tid) << 32;
776	low_tid  = (u64) ((__force u32)cm_id_priv->id.local_id |
777			  (msg_seq << 30));
778	return cpu_to_be64(hi_tid | low_tid);
779}
780
781static void cm_format_mad_hdr(struct ib_mad_hdr *hdr,
782			      __be16 attr_id, __be64 tid)
783{
784	hdr->base_version  = IB_MGMT_BASE_VERSION;
785	hdr->mgmt_class	   = IB_MGMT_CLASS_CM;
786	hdr->class_version = IB_CM_CLASS_VERSION;
787	hdr->method	   = IB_MGMT_METHOD_SEND;
788	hdr->attr_id	   = attr_id;
789	hdr->tid	   = tid;
790}
791
792static void cm_format_req(struct cm_req_msg *req_msg,
793			  struct cm_id_private *cm_id_priv,
794			  struct ib_cm_req_param *param)
795{
796	cm_format_mad_hdr(&req_msg->hdr, CM_REQ_ATTR_ID,
797			  cm_form_tid(cm_id_priv, CM_MSG_SEQUENCE_REQ));
798
799	req_msg->local_comm_id = cm_id_priv->id.local_id;
800	req_msg->service_id = param->service_id;
801	req_msg->local_ca_guid = cm_id_priv->av.port->cm_dev->ca_guid;
802	cm_req_set_local_qpn(req_msg, cpu_to_be32(param->qp_num));
803	cm_req_set_resp_res(req_msg, param->responder_resources);
804	cm_req_set_init_depth(req_msg, param->initiator_depth);
805	cm_req_set_remote_resp_timeout(req_msg,
806				       param->remote_cm_response_timeout);
807	cm_req_set_qp_type(req_msg, param->qp_type);
808	cm_req_set_flow_ctrl(req_msg, param->flow_control);
809	cm_req_set_starting_psn(req_msg, cpu_to_be32(param->starting_psn));
810	cm_req_set_local_resp_timeout(req_msg,
811				      param->local_cm_response_timeout);
812	cm_req_set_retry_count(req_msg, param->retry_count);
813	req_msg->pkey = param->primary_path->pkey;
814	cm_req_set_path_mtu(req_msg, param->primary_path->mtu);
815	cm_req_set_rnr_retry_count(req_msg, param->rnr_retry_count);
816	cm_req_set_max_cm_retries(req_msg, param->max_cm_retries);
817	cm_req_set_srq(req_msg, param->srq);
818
819	req_msg->primary_local_lid = param->primary_path->slid;
820	req_msg->primary_remote_lid = param->primary_path->dlid;
821	req_msg->primary_local_gid = param->primary_path->sgid;
822	req_msg->primary_remote_gid = param->primary_path->dgid;
823	cm_req_set_primary_flow_label(req_msg, param->primary_path->flow_label);
824	cm_req_set_primary_packet_rate(req_msg, param->primary_path->rate);
825	req_msg->primary_traffic_class = param->primary_path->traffic_class;
826	req_msg->primary_hop_limit = param->primary_path->hop_limit;
827	cm_req_set_primary_sl(req_msg, param->primary_path->sl);
828	cm_req_set_primary_subnet_local(req_msg, 1); /* local only... */
829	cm_req_set_primary_local_ack_timeout(req_msg,
830		min(31, param->primary_path->packet_life_time + 1));
831
832	if (param->alternate_path) {
833		req_msg->alt_local_lid = param->alternate_path->slid;
834		req_msg->alt_remote_lid = param->alternate_path->dlid;
835		req_msg->alt_local_gid = param->alternate_path->sgid;
836		req_msg->alt_remote_gid = param->alternate_path->dgid;
837		cm_req_set_alt_flow_label(req_msg,
838					  param->alternate_path->flow_label);
839		cm_req_set_alt_packet_rate(req_msg, param->alternate_path->rate);
840		req_msg->alt_traffic_class = param->alternate_path->traffic_class;
841		req_msg->alt_hop_limit = param->alternate_path->hop_limit;
842		cm_req_set_alt_sl(req_msg, param->alternate_path->sl);
843		cm_req_set_alt_subnet_local(req_msg, 1); /* local only... */
844		cm_req_set_alt_local_ack_timeout(req_msg,
845			min(31, param->alternate_path->packet_life_time + 1));
846	}
847
848	if (param->private_data && param->private_data_len)
849		memcpy(req_msg->private_data, param->private_data,
850		       param->private_data_len);
851}
852
853static inline int cm_validate_req_param(struct ib_cm_req_param *param)
854{
855	/* peer-to-peer not supported */
856	if (param->peer_to_peer)
857		return -EINVAL;
858
859	if (!param->primary_path)
860		return -EINVAL;
861
862	if (param->qp_type != IB_QPT_RC && param->qp_type != IB_QPT_UC)
863		return -EINVAL;
864
865	if (param->private_data &&
866	    param->private_data_len > IB_CM_REQ_PRIVATE_DATA_SIZE)
867		return -EINVAL;
868
869	if (param->alternate_path &&
870	    (param->alternate_path->pkey != param->primary_path->pkey ||
871	     param->alternate_path->mtu != param->primary_path->mtu))
872		return -EINVAL;
873
874	return 0;
875}
876
877int ib_send_cm_req(struct ib_cm_id *cm_id,
878		   struct ib_cm_req_param *param)
879{
880	struct cm_id_private *cm_id_priv;
881	struct cm_req_msg *req_msg;
882	unsigned long flags;
883	int ret;
884
885	ret = cm_validate_req_param(param);
886	if (ret)
887		return ret;
888
889	/* Verify that we're not in timewait. */
890	cm_id_priv = container_of(cm_id, struct cm_id_private, id);
891	spin_lock_irqsave(&cm_id_priv->lock, flags);
892	if (cm_id->state != IB_CM_IDLE) {
893		spin_unlock_irqrestore(&cm_id_priv->lock, flags);
894		ret = -EINVAL;
895		goto out;
896	}
897	spin_unlock_irqrestore(&cm_id_priv->lock, flags);
898
899	cm_id_priv->timewait_info = cm_create_timewait_info(cm_id_priv->
900							    id.local_id);
901	if (IS_ERR(cm_id_priv->timewait_info))
902		goto out;
903
904	ret = cm_init_av_by_path(param->primary_path, &cm_id_priv->av);
905	if (ret)
906		goto error1;
907	if (param->alternate_path) {
908		ret = cm_init_av_by_path(param->alternate_path,
909					 &cm_id_priv->alt_av);
910		if (ret)
911			goto error1;
912	}
913	cm_id->service_id = param->service_id;
914	cm_id->service_mask = __constant_cpu_to_be64(~0ULL);
915	cm_id_priv->timeout_ms = cm_convert_to_ms(
916				    param->primary_path->packet_life_time) * 2 +
917				 cm_convert_to_ms(
918				    param->remote_cm_response_timeout);
919	cm_id_priv->max_cm_retries = param->max_cm_retries;
920	cm_id_priv->initiator_depth = param->initiator_depth;
921	cm_id_priv->responder_resources = param->responder_resources;
922	cm_id_priv->retry_count = param->retry_count;
923	cm_id_priv->path_mtu = param->primary_path->mtu;
924	cm_id_priv->qp_type = param->qp_type;
925
926	ret = cm_alloc_msg(cm_id_priv, &cm_id_priv->msg);
927	if (ret)
928		goto error1;
929
930	req_msg = (struct cm_req_msg *) cm_id_priv->msg->mad;
931	cm_format_req(req_msg, cm_id_priv, param);
932	cm_id_priv->tid = req_msg->hdr.tid;
933	cm_id_priv->msg->timeout_ms = cm_id_priv->timeout_ms;
934	cm_id_priv->msg->context[1] = (void *) (unsigned long) IB_CM_REQ_SENT;
935
936	cm_id_priv->local_qpn = cm_req_get_local_qpn(req_msg);
937	cm_id_priv->rq_psn = cm_req_get_starting_psn(req_msg);
938	cm_id_priv->local_ack_timeout =
939				cm_req_get_primary_local_ack_timeout(req_msg);
940
941	spin_lock_irqsave(&cm_id_priv->lock, flags);
942	ret = ib_post_send_mad(cm_id_priv->msg, NULL);
943	if (ret) {
944		spin_unlock_irqrestore(&cm_id_priv->lock, flags);
945		goto error2;
946	}
947	BUG_ON(cm_id->state != IB_CM_IDLE);
948	cm_id->state = IB_CM_REQ_SENT;
949	spin_unlock_irqrestore(&cm_id_priv->lock, flags);
950	return 0;
951
952error2:	cm_free_msg(cm_id_priv->msg);
953error1:	kfree(cm_id_priv->timewait_info);
954out:	return ret;
955}
956EXPORT_SYMBOL(ib_send_cm_req);
957
958static int cm_issue_rej(struct cm_port *port,
959			struct ib_mad_recv_wc *mad_recv_wc,
960			enum ib_cm_rej_reason reason,
961			enum cm_msg_response msg_rejected,
962			void *ari, u8 ari_length)
963{
964	struct ib_mad_send_buf *msg = NULL;
965	struct cm_rej_msg *rej_msg, *rcv_msg;
966	int ret;
967
968	ret = cm_alloc_response_msg(port, mad_recv_wc, &msg);
969	if (ret)
970		return ret;
971
972	/* We just need common CM header information.  Cast to any message. */
973	rcv_msg = (struct cm_rej_msg *) mad_recv_wc->recv_buf.mad;
974	rej_msg = (struct cm_rej_msg *) msg->mad;
975
976	cm_format_mad_hdr(&rej_msg->hdr, CM_REJ_ATTR_ID, rcv_msg->hdr.tid);
977	rej_msg->remote_comm_id = rcv_msg->local_comm_id;
978	rej_msg->local_comm_id = rcv_msg->remote_comm_id;
979	cm_rej_set_msg_rejected(rej_msg, msg_rejected);
980	rej_msg->reason = cpu_to_be16(reason);
981
982	if (ari && ari_length) {
983		cm_rej_set_reject_info_len(rej_msg, ari_length);
984		memcpy(rej_msg->ari, ari, ari_length);
985	}
986
987	ret = ib_post_send_mad(msg, NULL);
988	if (ret)
989		cm_free_msg(msg);
990
991	return ret;
992}
993
994static inline int cm_is_active_peer(__be64 local_ca_guid, __be64 remote_ca_guid,
995				    __be32 local_qpn, __be32 remote_qpn)
996{
997	return (be64_to_cpu(local_ca_guid) > be64_to_cpu(remote_ca_guid) ||
998		((local_ca_guid == remote_ca_guid) &&
999		 (be32_to_cpu(local_qpn) > be32_to_cpu(remote_qpn))));
1000}
1001
1002static inline void cm_format_paths_from_req(struct cm_req_msg *req_msg,
1003					    struct ib_sa_path_rec *primary_path,
1004					    struct ib_sa_path_rec *alt_path)
1005{
1006	memset(primary_path, 0, sizeof *primary_path);
1007	primary_path->dgid = req_msg->primary_local_gid;
1008	primary_path->sgid = req_msg->primary_remote_gid;
1009	primary_path->dlid = req_msg->primary_local_lid;
1010	primary_path->slid = req_msg->primary_remote_lid;
1011	primary_path->flow_label = cm_req_get_primary_flow_label(req_msg);
1012	primary_path->hop_limit = req_msg->primary_hop_limit;
1013	primary_path->traffic_class = req_msg->primary_traffic_class;
1014	primary_path->reversible = 1;
1015	primary_path->pkey = req_msg->pkey;
1016	primary_path->sl = cm_req_get_primary_sl(req_msg);
1017	primary_path->mtu_selector = IB_SA_EQ;
1018	primary_path->mtu = cm_req_get_path_mtu(req_msg);
1019	primary_path->rate_selector = IB_SA_EQ;
1020	primary_path->rate = cm_req_get_primary_packet_rate(req_msg);
1021	primary_path->packet_life_time_selector = IB_SA_EQ;
1022	primary_path->packet_life_time =
1023		cm_req_get_primary_local_ack_timeout(req_msg);
1024	primary_path->packet_life_time -= (primary_path->packet_life_time > 0);
1025
1026	if (req_msg->alt_local_lid) {
1027		memset(alt_path, 0, sizeof *alt_path);
1028		alt_path->dgid = req_msg->alt_local_gid;
1029		alt_path->sgid = req_msg->alt_remote_gid;
1030		alt_path->dlid = req_msg->alt_local_lid;
1031		alt_path->slid = req_msg->alt_remote_lid;
1032		alt_path->flow_label = cm_req_get_alt_flow_label(req_msg);
1033		alt_path->hop_limit = req_msg->alt_hop_limit;
1034		alt_path->traffic_class = req_msg->alt_traffic_class;
1035		alt_path->reversible = 1;
1036		alt_path->pkey = req_msg->pkey;
1037		alt_path->sl = cm_req_get_alt_sl(req_msg);
1038		alt_path->mtu_selector = IB_SA_EQ;
1039		alt_path->mtu = cm_req_get_path_mtu(req_msg);
1040		alt_path->rate_selector = IB_SA_EQ;
1041		alt_path->rate = cm_req_get_alt_packet_rate(req_msg);
1042		alt_path->packet_life_time_selector = IB_SA_EQ;
1043		alt_path->packet_life_time =
1044			cm_req_get_alt_local_ack_timeout(req_msg);
1045		alt_path->packet_life_time -= (alt_path->packet_life_time > 0);
1046	}
1047}
1048
1049static void cm_format_req_event(struct cm_work *work,
1050				struct cm_id_private *cm_id_priv,
1051				struct ib_cm_id *listen_id)
1052{
1053	struct cm_req_msg *req_msg;
1054	struct ib_cm_req_event_param *param;
1055
1056	req_msg = (struct cm_req_msg *)work->mad_recv_wc->recv_buf.mad;
1057	param = &work->cm_event.param.req_rcvd;
1058	param->listen_id = listen_id;
1059	param->port = cm_id_priv->av.port->port_num;
1060	param->primary_path = &work->path[0];
1061	if (req_msg->alt_local_lid)
1062		param->alternate_path = &work->path[1];
1063	else
1064		param->alternate_path = NULL;
1065	param->remote_ca_guid = req_msg->local_ca_guid;
1066	param->remote_qkey = be32_to_cpu(req_msg->local_qkey);
1067	param->remote_qpn = be32_to_cpu(cm_req_get_local_qpn(req_msg));
1068	param->qp_type = cm_req_get_qp_type(req_msg);
1069	param->starting_psn = be32_to_cpu(cm_req_get_starting_psn(req_msg));
1070	param->responder_resources = cm_req_get_init_depth(req_msg);
1071	param->initiator_depth = cm_req_get_resp_res(req_msg);
1072	param->local_cm_response_timeout =
1073					cm_req_get_remote_resp_timeout(req_msg);
1074	param->flow_control = cm_req_get_flow_ctrl(req_msg);
1075	param->remote_cm_response_timeout =
1076					cm_req_get_local_resp_timeout(req_msg);
1077	param->retry_count = cm_req_get_retry_count(req_msg);
1078	param->rnr_retry_count = cm_req_get_rnr_retry_count(req_msg);
1079	param->srq = cm_req_get_srq(req_msg);
1080	work->cm_event.private_data = &req_msg->private_data;
1081}
1082
1083static void cm_process_work(struct cm_id_private *cm_id_priv,
1084			    struct cm_work *work)
1085{
1086	unsigned long flags;
1087	int ret;
1088
1089	/* We will typically only have the current event to report. */
1090	ret = cm_id_priv->id.cm_handler(&cm_id_priv->id, &work->cm_event);
1091	cm_free_work(work);
1092
1093	while (!ret && !atomic_add_negative(-1, &cm_id_priv->work_count)) {
1094		spin_lock_irqsave(&cm_id_priv->lock, flags);
1095		work = cm_dequeue_work(cm_id_priv);
1096		spin_unlock_irqrestore(&cm_id_priv->lock, flags);
1097		BUG_ON(!work);
1098		ret = cm_id_priv->id.cm_handler(&cm_id_priv->id,
1099						&work->cm_event);
1100		cm_free_work(work);
1101	}
1102	cm_deref_id(cm_id_priv);
1103	if (ret)
1104		ib_destroy_cm_id(&cm_id_priv->id);
1105}
1106
1107static void cm_format_mra(struct cm_mra_msg *mra_msg,
1108			  struct cm_id_private *cm_id_priv,
1109			  enum cm_msg_response msg_mraed, u8 service_timeout,
1110			  const void *private_data, u8 private_data_len)
1111{
1112	cm_format_mad_hdr(&mra_msg->hdr, CM_MRA_ATTR_ID, cm_id_priv->tid);
1113	cm_mra_set_msg_mraed(mra_msg, msg_mraed);
1114	mra_msg->local_comm_id = cm_id_priv->id.local_id;
1115	mra_msg->remote_comm_id = cm_id_priv->id.remote_id;
1116	cm_mra_set_service_timeout(mra_msg, service_timeout);
1117
1118	if (private_data && private_data_len)
1119		memcpy(mra_msg->private_data, private_data, private_data_len);
1120}
1121
1122static void cm_format_rej(struct cm_rej_msg *rej_msg,
1123			  struct cm_id_private *cm_id_priv,
1124			  enum ib_cm_rej_reason reason,
1125			  void *ari,
1126			  u8 ari_length,
1127			  const void *private_data,
1128			  u8 private_data_len)
1129{
1130	cm_format_mad_hdr(&rej_msg->hdr, CM_REJ_ATTR_ID, cm_id_priv->tid);
1131	rej_msg->remote_comm_id = cm_id_priv->id.remote_id;
1132
1133	switch(cm_id_priv->id.state) {
1134	case IB_CM_REQ_RCVD:
1135		rej_msg->local_comm_id = 0;
1136		cm_rej_set_msg_rejected(rej_msg, CM_MSG_RESPONSE_REQ);
1137		break;
1138	case IB_CM_MRA_REQ_SENT:
1139		rej_msg->local_comm_id = cm_id_priv->id.local_id;
1140		cm_rej_set_msg_rejected(rej_msg, CM_MSG_RESPONSE_REQ);
1141		break;
1142	case IB_CM_REP_RCVD:
1143	case IB_CM_MRA_REP_SENT:
1144		rej_msg->local_comm_id = cm_id_priv->id.local_id;
1145		cm_rej_set_msg_rejected(rej_msg, CM_MSG_RESPONSE_REP);
1146		break;
1147	default:
1148		rej_msg->local_comm_id = cm_id_priv->id.local_id;
1149		cm_rej_set_msg_rejected(rej_msg, CM_MSG_RESPONSE_OTHER);
1150		break;
1151	}
1152
1153	rej_msg->reason = cpu_to_be16(reason);
1154	if (ari && ari_length) {
1155		cm_rej_set_reject_info_len(rej_msg, ari_length);
1156		memcpy(rej_msg->ari, ari, ari_length);
1157	}
1158
1159	if (private_data && private_data_len)
1160		memcpy(rej_msg->private_data, private_data, private_data_len);
1161}
1162
1163static void cm_dup_req_handler(struct cm_work *work,
1164			       struct cm_id_private *cm_id_priv)
1165{
1166	struct ib_mad_send_buf *msg = NULL;
1167	unsigned long flags;
1168	int ret;
1169
1170	/* Quick state check to discard duplicate REQs. */
1171	if (cm_id_priv->id.state == IB_CM_REQ_RCVD)
1172		return;
1173
1174	ret = cm_alloc_response_msg(work->port, work->mad_recv_wc, &msg);
1175	if (ret)
1176		return;
1177
1178	spin_lock_irqsave(&cm_id_priv->lock, flags);
1179	switch (cm_id_priv->id.state) {
1180	case IB_CM_MRA_REQ_SENT:
1181		cm_format_mra((struct cm_mra_msg *) msg->mad, cm_id_priv,
1182			      CM_MSG_RESPONSE_REQ, cm_id_priv->service_timeout,
1183			      cm_id_priv->private_data,
1184			      cm_id_priv->private_data_len);
1185		break;
1186	case IB_CM_TIMEWAIT:
1187		cm_format_rej((struct cm_rej_msg *) msg->mad, cm_id_priv,
1188			      IB_CM_REJ_STALE_CONN, NULL, 0, NULL, 0);
1189		break;
1190	default:
1191		goto unlock;
1192	}
1193	spin_unlock_irqrestore(&cm_id_priv->lock, flags);
1194
1195	ret = ib_post_send_mad(msg, NULL);
1196	if (ret)
1197		goto free;
1198	return;
1199
1200unlock:	spin_unlock_irqrestore(&cm_id_priv->lock, flags);
1201free:	cm_free_msg(msg);
1202}
1203
1204static struct cm_id_private * cm_match_req(struct cm_work *work,
1205					   struct cm_id_private *cm_id_priv)
1206{
1207	struct cm_id_private *listen_cm_id_priv, *cur_cm_id_priv;
1208	struct cm_timewait_info *timewait_info;
1209	struct cm_req_msg *req_msg;
1210	unsigned long flags;
1211
1212	req_msg = (struct cm_req_msg *)work->mad_recv_wc->recv_buf.mad;
1213
1214	/* Check for duplicate REQ and stale connections. */
1215	spin_lock_irqsave(&cm.lock, flags);
1216	timewait_info = cm_insert_remote_id(cm_id_priv->timewait_info);
1217	if (!timewait_info)
1218		timewait_info = cm_insert_remote_qpn(cm_id_priv->timewait_info);
1219
1220	if (timewait_info) {
1221		cur_cm_id_priv = cm_get_id(timewait_info->work.local_id,
1222					   timewait_info->work.remote_id);
1223		spin_unlock_irqrestore(&cm.lock, flags);
1224		if (cur_cm_id_priv) {
1225			cm_dup_req_handler(work, cur_cm_id_priv);
1226			cm_deref_id(cur_cm_id_priv);
1227		} else
1228			cm_issue_rej(work->port, work->mad_recv_wc,
1229				     IB_CM_REJ_STALE_CONN, CM_MSG_RESPONSE_REQ,
1230				     NULL, 0);
1231		goto error;
1232	}
1233
1234	/* Find matching listen request. */
1235	listen_cm_id_priv = cm_find_listen(cm_id_priv->id.device,
1236					   req_msg->service_id);
1237	if (!listen_cm_id_priv) {
1238		spin_unlock_irqrestore(&cm.lock, flags);
1239		cm_issue_rej(work->port, work->mad_recv_wc,
1240			     IB_CM_REJ_INVALID_SERVICE_ID, CM_MSG_RESPONSE_REQ,
1241			     NULL, 0);
1242		goto error;
1243	}
1244	atomic_inc(&listen_cm_id_priv->refcount);
1245	atomic_inc(&cm_id_priv->refcount);
1246	cm_id_priv->id.state = IB_CM_REQ_RCVD;
1247	atomic_inc(&cm_id_priv->work_count);
1248	spin_unlock_irqrestore(&cm.lock, flags);
1249	return listen_cm_id_priv;
1250
1251error:	cm_cleanup_timewait(cm_id_priv->timewait_info);
1252	return NULL;
1253}
1254
1255static int cm_req_handler(struct cm_work *work)
1256{
1257	struct ib_cm_id *cm_id;
1258	struct cm_id_private *cm_id_priv, *listen_cm_id_priv;
1259	struct cm_req_msg *req_msg;
1260	int ret;
1261
1262	req_msg = (struct cm_req_msg *)work->mad_recv_wc->recv_buf.mad;
1263
1264	cm_id = ib_create_cm_id(work->port->cm_dev->device, NULL, NULL);
1265	if (IS_ERR(cm_id))
1266		return PTR_ERR(cm_id);
1267
1268	cm_id_priv = container_of(cm_id, struct cm_id_private, id);
1269	cm_id_priv->id.remote_id = req_msg->local_comm_id;
1270	cm_init_av_for_response(work->port, work->mad_recv_wc->wc,
1271				&cm_id_priv->av);
1272	cm_id_priv->timewait_info = cm_create_timewait_info(cm_id_priv->
1273							    id.local_id);
1274	if (IS_ERR(cm_id_priv->timewait_info)) {
1275		ret = PTR_ERR(cm_id_priv->timewait_info);
1276		goto error1;
1277	}
1278	cm_id_priv->timewait_info->work.remote_id = req_msg->local_comm_id;
1279	cm_id_priv->timewait_info->remote_ca_guid = req_msg->local_ca_guid;
1280	cm_id_priv->timewait_info->remote_qpn = cm_req_get_local_qpn(req_msg);
1281
1282	listen_cm_id_priv = cm_match_req(work, cm_id_priv);
1283	if (!listen_cm_id_priv) {
1284		ret = -EINVAL;
1285		goto error2;
1286	}
1287
1288	cm_id_priv->id.cm_handler = listen_cm_id_priv->id.cm_handler;
1289	cm_id_priv->id.context = listen_cm_id_priv->id.context;
1290	cm_id_priv->id.service_id = req_msg->service_id;
1291	cm_id_priv->id.service_mask = __constant_cpu_to_be64(~0ULL);
1292
1293	cm_format_paths_from_req(req_msg, &work->path[0], &work->path[1]);
1294	ret = cm_init_av_by_path(&work->path[0], &cm_id_priv->av);
1295	if (ret)
1296		goto error3;
1297	if (req_msg->alt_local_lid) {
1298		ret = cm_init_av_by_path(&work->path[1], &cm_id_priv->alt_av);
1299		if (ret)
1300			goto error3;
1301	}
1302	cm_id_priv->tid = req_msg->hdr.tid;
1303	cm_id_priv->timeout_ms = cm_convert_to_ms(
1304					cm_req_get_local_resp_timeout(req_msg));
1305	cm_id_priv->max_cm_retries = cm_req_get_max_cm_retries(req_msg);
1306	cm_id_priv->remote_qpn = cm_req_get_local_qpn(req_msg);
1307	cm_id_priv->initiator_depth = cm_req_get_resp_res(req_msg);
1308	cm_id_priv->responder_resources = cm_req_get_init_depth(req_msg);
1309	cm_id_priv->path_mtu = cm_req_get_path_mtu(req_msg);
1310	cm_id_priv->sq_psn = cm_req_get_starting_psn(req_msg);
1311	cm_id_priv->local_ack_timeout =
1312				cm_req_get_primary_local_ack_timeout(req_msg);
1313	cm_id_priv->retry_count = cm_req_get_retry_count(req_msg);
1314	cm_id_priv->rnr_retry_count = cm_req_get_rnr_retry_count(req_msg);
1315	cm_id_priv->qp_type = cm_req_get_qp_type(req_msg);
1316
1317	cm_format_req_event(work, cm_id_priv, &listen_cm_id_priv->id);
1318	cm_process_work(cm_id_priv, work);
1319	cm_deref_id(listen_cm_id_priv);
1320	return 0;
1321
1322error3:	atomic_dec(&cm_id_priv->refcount);
1323	cm_deref_id(listen_cm_id_priv);
1324	cm_cleanup_timewait(cm_id_priv->timewait_info);
1325error2:	kfree(cm_id_priv->timewait_info);
1326	cm_id_priv->timewait_info = NULL;
1327error1:	ib_destroy_cm_id(&cm_id_priv->id);
1328	return ret;
1329}
1330
1331static void cm_format_rep(struct cm_rep_msg *rep_msg,
1332			  struct cm_id_private *cm_id_priv,
1333			  struct ib_cm_rep_param *param)
1334{
1335	cm_format_mad_hdr(&rep_msg->hdr, CM_REP_ATTR_ID, cm_id_priv->tid);
1336	rep_msg->local_comm_id = cm_id_priv->id.local_id;
1337	rep_msg->remote_comm_id = cm_id_priv->id.remote_id;
1338	cm_rep_set_local_qpn(rep_msg, cpu_to_be32(param->qp_num));
1339	cm_rep_set_starting_psn(rep_msg, cpu_to_be32(param->starting_psn));
1340	rep_msg->resp_resources = param->responder_resources;
1341	rep_msg->initiator_depth = param->initiator_depth;
1342	cm_rep_set_target_ack_delay(rep_msg, param->target_ack_delay);
1343	cm_rep_set_failover(rep_msg, param->failover_accepted);
1344	cm_rep_set_flow_ctrl(rep_msg, param->flow_control);
1345	cm_rep_set_rnr_retry_count(rep_msg, param->rnr_retry_count);
1346	cm_rep_set_srq(rep_msg, param->srq);
1347	rep_msg->local_ca_guid = cm_id_priv->av.port->cm_dev->ca_guid;
1348
1349	if (param->private_data && param->private_data_len)
1350		memcpy(rep_msg->private_data, param->private_data,
1351		       param->private_data_len);
1352}
1353
1354int ib_send_cm_rep(struct ib_cm_id *cm_id,
1355		   struct ib_cm_rep_param *param)
1356{
1357	struct cm_id_private *cm_id_priv;
1358	struct ib_mad_send_buf *msg;
1359	struct cm_rep_msg *rep_msg;
1360	unsigned long flags;
1361	int ret;
1362
1363	if (param->private_data &&
1364	    param->private_data_len > IB_CM_REP_PRIVATE_DATA_SIZE)
1365		return -EINVAL;
1366
1367	cm_id_priv = container_of(cm_id, struct cm_id_private, id);
1368	spin_lock_irqsave(&cm_id_priv->lock, flags);
1369	if (cm_id->state != IB_CM_REQ_RCVD &&
1370	    cm_id->state != IB_CM_MRA_REQ_SENT) {
1371		ret = -EINVAL;
1372		goto out;
1373	}
1374
1375	ret = cm_alloc_msg(cm_id_priv, &msg);
1376	if (ret)
1377		goto out;
1378
1379	rep_msg = (struct cm_rep_msg *) msg->mad;
1380	cm_format_rep(rep_msg, cm_id_priv, param);
1381	msg->timeout_ms = cm_id_priv->timeout_ms;
1382	msg->context[1] = (void *) (unsigned long) IB_CM_REP_SENT;
1383
1384	ret = ib_post_send_mad(msg, NULL);
1385	if (ret) {
1386		spin_unlock_irqrestore(&cm_id_priv->lock, flags);
1387		cm_free_msg(msg);
1388		return ret;
1389	}
1390
1391	cm_id->state = IB_CM_REP_SENT;
1392	cm_id_priv->msg = msg;
1393	cm_id_priv->initiator_depth = param->initiator_depth;
1394	cm_id_priv->responder_resources = param->responder_resources;
1395	cm_id_priv->rq_psn = cm_rep_get_starting_psn(rep_msg);
1396	cm_id_priv->local_qpn = cm_rep_get_local_qpn(rep_msg);
1397
1398out:	spin_unlock_irqrestore(&cm_id_priv->lock, flags);
1399	return ret;
1400}
1401EXPORT_SYMBOL(ib_send_cm_rep);
1402
1403static void cm_format_rtu(struct cm_rtu_msg *rtu_msg,
1404			  struct cm_id_private *cm_id_priv,
1405			  const void *private_data,
1406			  u8 private_data_len)
1407{
1408	cm_format_mad_hdr(&rtu_msg->hdr, CM_RTU_ATTR_ID, cm_id_priv->tid);
1409	rtu_msg->local_comm_id = cm_id_priv->id.local_id;
1410	rtu_msg->remote_comm_id = cm_id_priv->id.remote_id;
1411
1412	if (private_data && private_data_len)
1413		memcpy(rtu_msg->private_data, private_data, private_data_len);
1414}
1415
1416int ib_send_cm_rtu(struct ib_cm_id *cm_id,
1417		   const void *private_data,
1418		   u8 private_data_len)
1419{
1420	struct cm_id_private *cm_id_priv;
1421	struct ib_mad_send_buf *msg;
1422	unsigned long flags;
1423	void *data;
1424	int ret;
1425
1426	if (private_data && private_data_len > IB_CM_RTU_PRIVATE_DATA_SIZE)
1427		return -EINVAL;
1428
1429	data = cm_copy_private_data(private_data, private_data_len);
1430	if (IS_ERR(data))
1431		return PTR_ERR(data);
1432
1433	cm_id_priv = container_of(cm_id, struct cm_id_private, id);
1434	spin_lock_irqsave(&cm_id_priv->lock, flags);
1435	if (cm_id->state != IB_CM_REP_RCVD &&
1436	    cm_id->state != IB_CM_MRA_REP_SENT) {
1437		ret = -EINVAL;
1438		goto error;
1439	}
1440
1441	ret = cm_alloc_msg(cm_id_priv, &msg);
1442	if (ret)
1443		goto error;
1444
1445	cm_format_rtu((struct cm_rtu_msg *) msg->mad, cm_id_priv,
1446		      private_data, private_data_len);
1447
1448	ret = ib_post_send_mad(msg, NULL);
1449	if (ret) {
1450		spin_unlock_irqrestore(&cm_id_priv->lock, flags);
1451		cm_free_msg(msg);
1452		kfree(data);
1453		return ret;
1454	}
1455
1456	cm_id->state = IB_CM_ESTABLISHED;
1457	cm_set_private_data(cm_id_priv, data, private_data_len);
1458	spin_unlock_irqrestore(&cm_id_priv->lock, flags);
1459	return 0;
1460
1461error:	spin_unlock_irqrestore(&cm_id_priv->lock, flags);
1462	kfree(data);
1463	return ret;
1464}
1465EXPORT_SYMBOL(ib_send_cm_rtu);
1466
1467static void cm_format_rep_event(struct cm_work *work)
1468{
1469	struct cm_rep_msg *rep_msg;
1470	struct ib_cm_rep_event_param *param;
1471
1472	rep_msg = (struct cm_rep_msg *)work->mad_recv_wc->recv_buf.mad;
1473	param = &work->cm_event.param.rep_rcvd;
1474	param->remote_ca_guid = rep_msg->local_ca_guid;
1475	param->remote_qkey = be32_to_cpu(rep_msg->local_qkey);
1476	param->remote_qpn = be32_to_cpu(cm_rep_get_local_qpn(rep_msg));
1477	param->starting_psn = be32_to_cpu(cm_rep_get_starting_psn(rep_msg));
1478	param->responder_resources = rep_msg->initiator_depth;
1479	param->initiator_depth = rep_msg->resp_resources;
1480	param->target_ack_delay = cm_rep_get_target_ack_delay(rep_msg);
1481	param->failover_accepted = cm_rep_get_failover(rep_msg);
1482	param->flow_control = cm_rep_get_flow_ctrl(rep_msg);
1483	param->rnr_retry_count = cm_rep_get_rnr_retry_count(rep_msg);
1484	param->srq = cm_rep_get_srq(rep_msg);
1485	work->cm_event.private_data = &rep_msg->private_data;
1486}
1487
1488static void cm_dup_rep_handler(struct cm_work *work)
1489{
1490	struct cm_id_private *cm_id_priv;
1491	struct cm_rep_msg *rep_msg;
1492	struct ib_mad_send_buf *msg = NULL;
1493	unsigned long flags;
1494	int ret;
1495
1496	rep_msg = (struct cm_rep_msg *) work->mad_recv_wc->recv_buf.mad;
1497	cm_id_priv = cm_acquire_id(rep_msg->remote_comm_id,
1498				   rep_msg->local_comm_id);
1499	if (!cm_id_priv)
1500		return;
1501
1502	ret = cm_alloc_response_msg(work->port, work->mad_recv_wc, &msg);
1503	if (ret)
1504		goto deref;
1505
1506	spin_lock_irqsave(&cm_id_priv->lock, flags);
1507	if (cm_id_priv->id.state == IB_CM_ESTABLISHED)
1508		cm_format_rtu((struct cm_rtu_msg *) msg->mad, cm_id_priv,
1509			      cm_id_priv->private_data,
1510			      cm_id_priv->private_data_len);
1511	else if (cm_id_priv->id.state == IB_CM_MRA_REP_SENT)
1512		cm_format_mra((struct cm_mra_msg *) msg->mad, cm_id_priv,
1513			      CM_MSG_RESPONSE_REP, cm_id_priv->service_timeout,
1514			      cm_id_priv->private_data,
1515			      cm_id_priv->private_data_len);
1516	else
1517		goto unlock;
1518	spin_unlock_irqrestore(&cm_id_priv->lock, flags);
1519
1520	ret = ib_post_send_mad(msg, NULL);
1521	if (ret)
1522		goto free;
1523	goto deref;
1524
1525unlock:	spin_unlock_irqrestore(&cm_id_priv->lock, flags);
1526free:	cm_free_msg(msg);
1527deref:	cm_deref_id(cm_id_priv);
1528}
1529
1530static int cm_rep_handler(struct cm_work *work)
1531{
1532	struct cm_id_private *cm_id_priv;
1533	struct cm_rep_msg *rep_msg;
1534	unsigned long flags;
1535	int ret;
1536
1537	rep_msg = (struct cm_rep_msg *)work->mad_recv_wc->recv_buf.mad;
1538	cm_id_priv = cm_acquire_id(rep_msg->remote_comm_id, 0);
1539	if (!cm_id_priv) {
1540		cm_dup_rep_handler(work);
1541		return -EINVAL;
1542	}
1543
1544	cm_id_priv->timewait_info->work.remote_id = rep_msg->local_comm_id;
1545	cm_id_priv->timewait_info->remote_ca_guid = rep_msg->local_ca_guid;
1546	cm_id_priv->timewait_info->remote_qpn = cm_rep_get_local_qpn(rep_msg);
1547
1548	spin_lock_irqsave(&cm.lock, flags);
1549	/* Check for duplicate REP. */
1550	if (cm_insert_remote_id(cm_id_priv->timewait_info)) {
1551		spin_unlock_irqrestore(&cm.lock, flags);
1552		ret = -EINVAL;
1553		goto error;
1554	}
1555	/* Check for a stale connection. */
1556	if (cm_insert_remote_qpn(cm_id_priv->timewait_info)) {
1557		spin_unlock_irqrestore(&cm.lock, flags);
1558		cm_issue_rej(work->port, work->mad_recv_wc,
1559			     IB_CM_REJ_STALE_CONN, CM_MSG_RESPONSE_REP,
1560			     NULL, 0);
1561		ret = -EINVAL;
1562		goto error;
1563	}
1564	spin_unlock_irqrestore(&cm.lock, flags);
1565
1566	cm_format_rep_event(work);
1567
1568	spin_lock_irqsave(&cm_id_priv->lock, flags);
1569	switch (cm_id_priv->id.state) {
1570	case IB_CM_REQ_SENT:
1571	case IB_CM_MRA_REQ_RCVD:
1572		break;
1573	default:
1574		spin_unlock_irqrestore(&cm_id_priv->lock, flags);
1575		ret = -EINVAL;
1576		goto error;
1577	}
1578	cm_id_priv->id.state = IB_CM_REP_RCVD;
1579	cm_id_priv->id.remote_id = rep_msg->local_comm_id;
1580	cm_id_priv->remote_qpn = cm_rep_get_local_qpn(rep_msg);
1581	cm_id_priv->initiator_depth = rep_msg->resp_resources;
1582	cm_id_priv->responder_resources = rep_msg->initiator_depth;
1583	cm_id_priv->sq_psn = cm_rep_get_starting_psn(rep_msg);
1584	cm_id_priv->rnr_retry_count = cm_rep_get_rnr_retry_count(rep_msg);
1585
1586	/* todo: handle peer_to_peer */
1587
1588	ib_cancel_mad(cm_id_priv->av.port->mad_agent, cm_id_priv->msg);
1589	ret = atomic_inc_and_test(&cm_id_priv->work_count);
1590	if (!ret)
1591		list_add_tail(&work->list, &cm_id_priv->work_list);
1592	spin_unlock_irqrestore(&cm_id_priv->lock, flags);
1593
1594	if (ret)
1595		cm_process_work(cm_id_priv, work);
1596	else
1597		cm_deref_id(cm_id_priv);
1598	return 0;
1599
1600error:	cm_cleanup_timewait(cm_id_priv->timewait_info);
1601	cm_deref_id(cm_id_priv);
1602	return ret;
1603}
1604
1605static int cm_establish_handler(struct cm_work *work)
1606{
1607	struct cm_id_private *cm_id_priv;
1608	unsigned long flags;
1609	int ret;
1610
1611	/* See comment in ib_cm_establish about lookup. */
1612	cm_id_priv = cm_acquire_id(work->local_id, work->remote_id);
1613	if (!cm_id_priv)
1614		return -EINVAL;
1615
1616	spin_lock_irqsave(&cm_id_priv->lock, flags);
1617	if (cm_id_priv->id.state != IB_CM_ESTABLISHED) {
1618		spin_unlock_irqrestore(&cm_id_priv->lock, flags);
1619		goto out;
1620	}
1621
1622	ib_cancel_mad(cm_id_priv->av.port->mad_agent, cm_id_priv->msg);
1623	ret = atomic_inc_and_test(&cm_id_priv->work_count);
1624	if (!ret)
1625		list_add_tail(&work->list, &cm_id_priv->work_list);
1626	spin_unlock_irqrestore(&cm_id_priv->lock, flags);
1627
1628	if (ret)
1629		cm_process_work(cm_id_priv, work);
1630	else
1631		cm_deref_id(cm_id_priv);
1632	return 0;
1633out:
1634	cm_deref_id(cm_id_priv);
1635	return -EINVAL;
1636}
1637
1638static int cm_rtu_handler(struct cm_work *work)
1639{
1640	struct cm_id_private *cm_id_priv;
1641	struct cm_rtu_msg *rtu_msg;
1642	unsigned long flags;
1643	int ret;
1644
1645	rtu_msg = (struct cm_rtu_msg *)work->mad_recv_wc->recv_buf.mad;
1646	cm_id_priv = cm_acquire_id(rtu_msg->remote_comm_id,
1647				   rtu_msg->local_comm_id);
1648	if (!cm_id_priv)
1649		return -EINVAL;
1650
1651	work->cm_event.private_data = &rtu_msg->private_data;
1652
1653	spin_lock_irqsave(&cm_id_priv->lock, flags);
1654	if (cm_id_priv->id.state != IB_CM_REP_SENT &&
1655	    cm_id_priv->id.state != IB_CM_MRA_REP_RCVD) {
1656		spin_unlock_irqrestore(&cm_id_priv->lock, flags);
1657		goto out;
1658	}
1659	cm_id_priv->id.state = IB_CM_ESTABLISHED;
1660
1661	ib_cancel_mad(cm_id_priv->av.port->mad_agent, cm_id_priv->msg);
1662	ret = atomic_inc_and_test(&cm_id_priv->work_count);
1663	if (!ret)
1664		list_add_tail(&work->list, &cm_id_priv->work_list);
1665	spin_unlock_irqrestore(&cm_id_priv->lock, flags);
1666
1667	if (ret)
1668		cm_process_work(cm_id_priv, work);
1669	else
1670		cm_deref_id(cm_id_priv);
1671	return 0;
1672out:
1673	cm_deref_id(cm_id_priv);
1674	return -EINVAL;
1675}
1676
1677static void cm_format_dreq(struct cm_dreq_msg *dreq_msg,
1678			  struct cm_id_private *cm_id_priv,
1679			  const void *private_data,
1680			  u8 private_data_len)
1681{
1682	cm_format_mad_hdr(&dreq_msg->hdr, CM_DREQ_ATTR_ID,
1683			  cm_form_tid(cm_id_priv, CM_MSG_SEQUENCE_DREQ));
1684	dreq_msg->local_comm_id = cm_id_priv->id.local_id;
1685	dreq_msg->remote_comm_id = cm_id_priv->id.remote_id;
1686	cm_dreq_set_remote_qpn(dreq_msg, cm_id_priv->remote_qpn);
1687
1688	if (private_data && private_data_len)
1689		memcpy(dreq_msg->private_data, private_data, private_data_len);
1690}
1691
1692int ib_send_cm_dreq(struct ib_cm_id *cm_id,
1693		    const void *private_data,
1694		    u8 private_data_len)
1695{
1696	struct cm_id_private *cm_id_priv;
1697	struct ib_mad_send_buf *msg;
1698	unsigned long flags;
1699	int ret;
1700
1701	if (private_data && private_data_len > IB_CM_DREQ_PRIVATE_DATA_SIZE)
1702		return -EINVAL;
1703
1704	cm_id_priv = container_of(cm_id, struct cm_id_private, id);
1705	spin_lock_irqsave(&cm_id_priv->lock, flags);
1706	if (cm_id->state != IB_CM_ESTABLISHED) {
1707		ret = -EINVAL;
1708		goto out;
1709	}
1710
1711	ret = cm_alloc_msg(cm_id_priv, &msg);
1712	if (ret) {
1713		cm_enter_timewait(cm_id_priv);
1714		goto out;
1715	}
1716
1717	cm_format_dreq((struct cm_dreq_msg *) msg->mad, cm_id_priv,
1718		       private_data, private_data_len);
1719	msg->timeout_ms = cm_id_priv->timeout_ms;
1720	msg->context[1] = (void *) (unsigned long) IB_CM_DREQ_SENT;
1721
1722	ret = ib_post_send_mad(msg, NULL);
1723	if (ret) {
1724		cm_enter_timewait(cm_id_priv);
1725		spin_unlock_irqrestore(&cm_id_priv->lock, flags);
1726		cm_free_msg(msg);
1727		return ret;
1728	}
1729
1730	cm_id->state = IB_CM_DREQ_SENT;
1731	cm_id_priv->msg = msg;
1732out:	spin_unlock_irqrestore(&cm_id_priv->lock, flags);
1733	return ret;
1734}
1735EXPORT_SYMBOL(ib_send_cm_dreq);
1736
1737static void cm_format_drep(struct cm_drep_msg *drep_msg,
1738			  struct cm_id_private *cm_id_priv,
1739			  const void *private_data,
1740			  u8 private_data_len)
1741{
1742	cm_format_mad_hdr(&drep_msg->hdr, CM_DREP_ATTR_ID, cm_id_priv->tid);
1743	drep_msg->local_comm_id = cm_id_priv->id.local_id;
1744	drep_msg->remote_comm_id = cm_id_priv->id.remote_id;
1745
1746	if (private_data && private_data_len)
1747		memcpy(drep_msg->private_data, private_data, private_data_len);
1748}
1749
1750int ib_send_cm_drep(struct ib_cm_id *cm_id,
1751		    const void *private_data,
1752		    u8 private_data_len)
1753{
1754	struct cm_id_private *cm_id_priv;
1755	struct ib_mad_send_buf *msg;
1756	unsigned long flags;
1757	void *data;
1758	int ret;
1759
1760	if (private_data && private_data_len > IB_CM_DREP_PRIVATE_DATA_SIZE)
1761		return -EINVAL;
1762
1763	data = cm_copy_private_data(private_data, private_data_len);
1764	if (IS_ERR(data))
1765		return PTR_ERR(data);
1766
1767	cm_id_priv = container_of(cm_id, struct cm_id_private, id);
1768	spin_lock_irqsave(&cm_id_priv->lock, flags);
1769	if (cm_id->state != IB_CM_DREQ_RCVD) {
1770		spin_unlock_irqrestore(&cm_id_priv->lock, flags);
1771		kfree(data);
1772		return -EINVAL;
1773	}
1774
1775	cm_set_private_data(cm_id_priv, data, private_data_len);
1776	cm_enter_timewait(cm_id_priv);
1777
1778	ret = cm_alloc_msg(cm_id_priv, &msg);
1779	if (ret)
1780		goto out;
1781
1782	cm_format_drep((struct cm_drep_msg *) msg->mad, cm_id_priv,
1783		       private_data, private_data_len);
1784
1785	ret = ib_post_send_mad(msg, NULL);
1786	if (ret) {
1787		spin_unlock_irqrestore(&cm_id_priv->lock, flags);
1788		cm_free_msg(msg);
1789		return ret;
1790	}
1791
1792out:	spin_unlock_irqrestore(&cm_id_priv->lock, flags);
1793	return ret;
1794}
1795EXPORT_SYMBOL(ib_send_cm_drep);
1796
1797static int cm_dreq_handler(struct cm_work *work)
1798{
1799	struct cm_id_private *cm_id_priv;
1800	struct cm_dreq_msg *dreq_msg;
1801	struct ib_mad_send_buf *msg = NULL;
1802	unsigned long flags;
1803	int ret;
1804
1805	dreq_msg = (struct cm_dreq_msg *)work->mad_recv_wc->recv_buf.mad;
1806	cm_id_priv = cm_acquire_id(dreq_msg->remote_comm_id,
1807				   dreq_msg->local_comm_id);
1808	if (!cm_id_priv)
1809		return -EINVAL;
1810
1811	work->cm_event.private_data = &dreq_msg->private_data;
1812
1813	spin_lock_irqsave(&cm_id_priv->lock, flags);
1814	if (cm_id_priv->local_qpn != cm_dreq_get_remote_qpn(dreq_msg))
1815		goto unlock;
1816
1817	switch (cm_id_priv->id.state) {
1818	case IB_CM_REP_SENT:
1819	case IB_CM_DREQ_SENT:
1820		ib_cancel_mad(cm_id_priv->av.port->mad_agent, cm_id_priv->msg);
1821		break;
1822	case IB_CM_ESTABLISHED:
1823	case IB_CM_MRA_REP_RCVD:
1824		break;
1825	case IB_CM_TIMEWAIT:
1826		if (cm_alloc_response_msg(work->port, work->mad_recv_wc, &msg))
1827			goto unlock;
1828
1829		cm_format_drep((struct cm_drep_msg *) msg->mad, cm_id_priv,
1830			       cm_id_priv->private_data,
1831			       cm_id_priv->private_data_len);
1832		spin_unlock_irqrestore(&cm_id_priv->lock, flags);
1833
1834		if (ib_post_send_mad(msg, NULL))
1835			cm_free_msg(msg);
1836		goto deref;
1837	default:
1838		goto unlock;
1839	}
1840	cm_id_priv->id.state = IB_CM_DREQ_RCVD;
1841	cm_id_priv->tid = dreq_msg->hdr.tid;
1842	ret = atomic_inc_and_test(&cm_id_priv->work_count);
1843	if (!ret)
1844		list_add_tail(&work->list, &cm_id_priv->work_list);
1845	spin_unlock_irqrestore(&cm_id_priv->lock, flags);
1846
1847	if (ret)
1848		cm_process_work(cm_id_priv, work);
1849	else
1850		cm_deref_id(cm_id_priv);
1851	return 0;
1852
1853unlock:	spin_unlock_irqrestore(&cm_id_priv->lock, flags);
1854deref:	cm_deref_id(cm_id_priv);
1855	return -EINVAL;
1856}
1857
1858static int cm_drep_handler(struct cm_work *work)
1859{
1860	struct cm_id_private *cm_id_priv;
1861	struct cm_drep_msg *drep_msg;
1862	unsigned long flags;
1863	int ret;
1864
1865	drep_msg = (struct cm_drep_msg *)work->mad_recv_wc->recv_buf.mad;
1866	cm_id_priv = cm_acquire_id(drep_msg->remote_comm_id,
1867				   drep_msg->local_comm_id);
1868	if (!cm_id_priv)
1869		return -EINVAL;
1870
1871	work->cm_event.private_data = &drep_msg->private_data;
1872
1873	spin_lock_irqsave(&cm_id_priv->lock, flags);
1874	if (cm_id_priv->id.state != IB_CM_DREQ_SENT &&
1875	    cm_id_priv->id.state != IB_CM_DREQ_RCVD) {
1876		spin_unlock_irqrestore(&cm_id_priv->lock, flags);
1877		goto out;
1878	}
1879	cm_enter_timewait(cm_id_priv);
1880
1881	ib_cancel_mad(cm_id_priv->av.port->mad_agent, cm_id_priv->msg);
1882	ret = atomic_inc_and_test(&cm_id_priv->work_count);
1883	if (!ret)
1884		list_add_tail(&work->list, &cm_id_priv->work_list);
1885	spin_unlock_irqrestore(&cm_id_priv->lock, flags);
1886
1887	if (ret)
1888		cm_process_work(cm_id_priv, work);
1889	else
1890		cm_deref_id(cm_id_priv);
1891	return 0;
1892out:
1893	cm_deref_id(cm_id_priv);
1894	return -EINVAL;
1895}
1896
1897int ib_send_cm_rej(struct ib_cm_id *cm_id,
1898		   enum ib_cm_rej_reason reason,
1899		   void *ari,
1900		   u8 ari_length,
1901		   const void *private_data,
1902		   u8 private_data_len)
1903{
1904	struct cm_id_private *cm_id_priv;
1905	struct ib_mad_send_buf *msg;
1906	unsigned long flags;
1907	int ret;
1908
1909	if ((private_data && private_data_len > IB_CM_REJ_PRIVATE_DATA_SIZE) ||
1910	    (ari && ari_length > IB_CM_REJ_ARI_LENGTH))
1911		return -EINVAL;
1912
1913	cm_id_priv = container_of(cm_id, struct cm_id_private, id);
1914
1915	spin_lock_irqsave(&cm_id_priv->lock, flags);
1916	switch (cm_id->state) {
1917	case IB_CM_REQ_SENT:
1918	case IB_CM_MRA_REQ_RCVD:
1919	case IB_CM_REQ_RCVD:
1920	case IB_CM_MRA_REQ_SENT:
1921	case IB_CM_REP_RCVD:
1922	case IB_CM_MRA_REP_SENT:
1923		ret = cm_alloc_msg(cm_id_priv, &msg);
1924		if (!ret)
1925			cm_format_rej((struct cm_rej_msg *) msg->mad,
1926				      cm_id_priv, reason, ari, ari_length,
1927				      private_data, private_data_len);
1928
1929		cm_reset_to_idle(cm_id_priv);
1930		break;
1931	case IB_CM_REP_SENT:
1932	case IB_CM_MRA_REP_RCVD:
1933		ret = cm_alloc_msg(cm_id_priv, &msg);
1934		if (!ret)
1935			cm_format_rej((struct cm_rej_msg *) msg->mad,
1936				      cm_id_priv, reason, ari, ari_length,
1937				      private_data, private_data_len);
1938
1939		cm_enter_timewait(cm_id_priv);
1940		break;
1941	default:
1942		ret = -EINVAL;
1943		goto out;
1944	}
1945
1946	if (ret)
1947		goto out;
1948
1949	ret = ib_post_send_mad(msg, NULL);
1950	if (ret)
1951		cm_free_msg(msg);
1952
1953out:	spin_unlock_irqrestore(&cm_id_priv->lock, flags);
1954	return ret;
1955}
1956EXPORT_SYMBOL(ib_send_cm_rej);
1957
1958static void cm_format_rej_event(struct cm_work *work)
1959{
1960	struct cm_rej_msg *rej_msg;
1961	struct ib_cm_rej_event_param *param;
1962
1963	rej_msg = (struct cm_rej_msg *)work->mad_recv_wc->recv_buf.mad;
1964	param = &work->cm_event.param.rej_rcvd;
1965	param->ari = rej_msg->ari;
1966	param->ari_length = cm_rej_get_reject_info_len(rej_msg);
1967	param->reason = __be16_to_cpu(rej_msg->reason);
1968	work->cm_event.private_data = &rej_msg->private_data;
1969}
1970
1971static struct cm_id_private * cm_acquire_rejected_id(struct cm_rej_msg *rej_msg)
1972{
1973	struct cm_timewait_info *timewait_info;
1974	struct cm_id_private *cm_id_priv;
1975	unsigned long flags;
1976	__be32 remote_id;
1977
1978	remote_id = rej_msg->local_comm_id;
1979
1980	if (__be16_to_cpu(rej_msg->reason) == IB_CM_REJ_TIMEOUT) {
1981		spin_lock_irqsave(&cm.lock, flags);
1982		timewait_info = cm_find_remote_id( *((__be64 *) rej_msg->ari),
1983						  remote_id);
1984		if (!timewait_info) {
1985			spin_unlock_irqrestore(&cm.lock, flags);
1986			return NULL;
1987		}
1988		cm_id_priv = idr_find(&cm.local_id_table,
1989				      (__force int) timewait_info->work.local_id);
1990		if (cm_id_priv) {
1991			if (cm_id_priv->id.remote_id == remote_id)
1992				atomic_inc(&cm_id_priv->refcount);
1993			else
1994				cm_id_priv = NULL;
1995		}
1996		spin_unlock_irqrestore(&cm.lock, flags);
1997	} else if (cm_rej_get_msg_rejected(rej_msg) == CM_MSG_RESPONSE_REQ)
1998		cm_id_priv = cm_acquire_id(rej_msg->remote_comm_id, 0);
1999	else
2000		cm_id_priv = cm_acquire_id(rej_msg->remote_comm_id, remote_id);
2001
2002	return cm_id_priv;
2003}
2004
2005static int cm_rej_handler(struct cm_work *work)
2006{
2007	struct cm_id_private *cm_id_priv;
2008	struct cm_rej_msg *rej_msg;
2009	unsigned long flags;
2010	int ret;
2011
2012	rej_msg = (struct cm_rej_msg *)work->mad_recv_wc->recv_buf.mad;
2013	cm_id_priv = cm_acquire_rejected_id(rej_msg);
2014	if (!cm_id_priv)
2015		return -EINVAL;
2016
2017	cm_format_rej_event(work);
2018
2019	spin_lock_irqsave(&cm_id_priv->lock, flags);
2020	switch (cm_id_priv->id.state) {
2021	case IB_CM_REQ_SENT:
2022	case IB_CM_MRA_REQ_RCVD:
2023	case IB_CM_REP_SENT:
2024	case IB_CM_MRA_REP_RCVD:
2025		ib_cancel_mad(cm_id_priv->av.port->mad_agent, cm_id_priv->msg);
2026		/* fall through */
2027	case IB_CM_REQ_RCVD:
2028	case IB_CM_MRA_REQ_SENT:
2029		if (__be16_to_cpu(rej_msg->reason) == IB_CM_REJ_STALE_CONN)
2030			cm_enter_timewait(cm_id_priv);
2031		else
2032			cm_reset_to_idle(cm_id_priv);
2033		break;
2034	case IB_CM_DREQ_SENT:
2035		ib_cancel_mad(cm_id_priv->av.port->mad_agent, cm_id_priv->msg);
2036		/* fall through */
2037	case IB_CM_REP_RCVD:
2038	case IB_CM_MRA_REP_SENT:
2039	case IB_CM_ESTABLISHED:
2040		cm_enter_timewait(cm_id_priv);
2041		break;
2042	default:
2043		spin_unlock_irqrestore(&cm_id_priv->lock, flags);
2044		ret = -EINVAL;
2045		goto out;
2046	}
2047
2048	ret = atomic_inc_and_test(&cm_id_priv->work_count);
2049	if (!ret)
2050		list_add_tail(&work->list, &cm_id_priv->work_list);
2051	spin_unlock_irqrestore(&cm_id_priv->lock, flags);
2052
2053	if (ret)
2054		cm_process_work(cm_id_priv, work);
2055	else
2056		cm_deref_id(cm_id_priv);
2057	return 0;
2058out:
2059	cm_deref_id(cm_id_priv);
2060	return -EINVAL;
2061}
2062
2063int ib_send_cm_mra(struct ib_cm_id *cm_id,
2064		   u8 service_timeout,
2065		   const void *private_data,
2066		   u8 private_data_len)
2067{
2068	struct cm_id_private *cm_id_priv;
2069	struct ib_mad_send_buf *msg;
2070	void *data;
2071	unsigned long flags;
2072	int ret;
2073
2074	if (private_data && private_data_len > IB_CM_MRA_PRIVATE_DATA_SIZE)
2075		return -EINVAL;
2076
2077	data = cm_copy_private_data(private_data, private_data_len);
2078	if (IS_ERR(data))
2079		return PTR_ERR(data);
2080
2081	cm_id_priv = container_of(cm_id, struct cm_id_private, id);
2082
2083	spin_lock_irqsave(&cm_id_priv->lock, flags);
2084	switch(cm_id_priv->id.state) {
2085	case IB_CM_REQ_RCVD:
2086		ret = cm_alloc_msg(cm_id_priv, &msg);
2087		if (ret)
2088			goto error1;
2089
2090		cm_format_mra((struct cm_mra_msg *) msg->mad, cm_id_priv,
2091			      CM_MSG_RESPONSE_REQ, service_timeout,
2092			      private_data, private_data_len);
2093		ret = ib_post_send_mad(msg, NULL);
2094		if (ret)
2095			goto error2;
2096		cm_id->state = IB_CM_MRA_REQ_SENT;
2097		break;
2098	case IB_CM_REP_RCVD:
2099		ret = cm_alloc_msg(cm_id_priv, &msg);
2100		if (ret)
2101			goto error1;
2102
2103		cm_format_mra((struct cm_mra_msg *) msg->mad, cm_id_priv,
2104			      CM_MSG_RESPONSE_REP, service_timeout,
2105			      private_data, private_data_len);
2106		ret = ib_post_send_mad(msg, NULL);
2107		if (ret)
2108			goto error2;
2109		cm_id->state = IB_CM_MRA_REP_SENT;
2110		break;
2111	case IB_CM_ESTABLISHED:
2112		ret = cm_alloc_msg(cm_id_priv, &msg);
2113		if (ret)
2114			goto error1;
2115
2116		cm_format_mra((struct cm_mra_msg *) msg->mad, cm_id_priv,
2117			      CM_MSG_RESPONSE_OTHER, service_timeout,
2118			      private_data, private_data_len);
2119		ret = ib_post_send_mad(msg, NULL);
2120		if (ret)
2121			goto error2;
2122		cm_id->lap_state = IB_CM_MRA_LAP_SENT;
2123		break;
2124	default:
2125		ret = -EINVAL;
2126		goto error1;
2127	}
2128	cm_id_priv->service_timeout = service_timeout;
2129	cm_set_private_data(cm_id_priv, data, private_data_len);
2130	spin_unlock_irqrestore(&cm_id_priv->lock, flags);
2131	return 0;
2132
2133error1:	spin_unlock_irqrestore(&cm_id_priv->lock, flags);
2134	kfree(data);
2135	return ret;
2136
2137error2:	spin_unlock_irqrestore(&cm_id_priv->lock, flags);
2138	kfree(data);
2139	cm_free_msg(msg);
2140	return ret;
2141}
2142EXPORT_SYMBOL(ib_send_cm_mra);
2143
2144static struct cm_id_private * cm_acquire_mraed_id(struct cm_mra_msg *mra_msg)
2145{
2146	switch (cm_mra_get_msg_mraed(mra_msg)) {
2147	case CM_MSG_RESPONSE_REQ:
2148		return cm_acquire_id(mra_msg->remote_comm_id, 0);
2149	case CM_MSG_RESPONSE_REP:
2150	case CM_MSG_RESPONSE_OTHER:
2151		return cm_acquire_id(mra_msg->remote_comm_id,
2152				     mra_msg->local_comm_id);
2153	default:
2154		return NULL;
2155	}
2156}
2157
2158static int cm_mra_handler(struct cm_work *work)
2159{
2160	struct cm_id_private *cm_id_priv;
2161	struct cm_mra_msg *mra_msg;
2162	unsigned long flags;
2163	int timeout, ret;
2164
2165	mra_msg = (struct cm_mra_msg *)work->mad_recv_wc->recv_buf.mad;
2166	cm_id_priv = cm_acquire_mraed_id(mra_msg);
2167	if (!cm_id_priv)
2168		return -EINVAL;
2169
2170	work->cm_event.private_data = &mra_msg->private_data;
2171	work->cm_event.param.mra_rcvd.service_timeout =
2172					cm_mra_get_service_timeout(mra_msg);
2173	timeout = cm_convert_to_ms(cm_mra_get_service_timeout(mra_msg)) +
2174		  cm_convert_to_ms(cm_id_priv->av.packet_life_time);
2175
2176	spin_lock_irqsave(&cm_id_priv->lock, flags);
2177	switch (cm_id_priv->id.state) {
2178	case IB_CM_REQ_SENT:
2179		if (cm_mra_get_msg_mraed(mra_msg) != CM_MSG_RESPONSE_REQ ||
2180		    ib_modify_mad(cm_id_priv->av.port->mad_agent,
2181				  cm_id_priv->msg, timeout))
2182			goto out;
2183		cm_id_priv->id.state = IB_CM_MRA_REQ_RCVD;
2184		break;
2185	case IB_CM_REP_SENT:
2186		if (cm_mra_get_msg_mraed(mra_msg) != CM_MSG_RESPONSE_REP ||
2187		    ib_modify_mad(cm_id_priv->av.port->mad_agent,
2188				  cm_id_priv->msg, timeout))
2189			goto out;
2190		cm_id_priv->id.state = IB_CM_MRA_REP_RCVD;
2191		break;
2192	case IB_CM_ESTABLISHED:
2193		if (cm_mra_get_msg_mraed(mra_msg) != CM_MSG_RESPONSE_OTHER ||
2194		    cm_id_priv->id.lap_state != IB_CM_LAP_SENT ||
2195		    ib_modify_mad(cm_id_priv->av.port->mad_agent,
2196				  cm_id_priv->msg, timeout))
2197			goto out;
2198		cm_id_priv->id.lap_state = IB_CM_MRA_LAP_RCVD;
2199		break;
2200	default:
2201		goto out;
2202	}
2203
2204	cm_id_priv->msg->context[1] = (void *) (unsigned long)
2205				      cm_id_priv->id.state;
2206	ret = atomic_inc_and_test(&cm_id_priv->work_count);
2207	if (!ret)
2208		list_add_tail(&work->list, &cm_id_priv->work_list);
2209	spin_unlock_irqrestore(&cm_id_priv->lock, flags);
2210
2211	if (ret)
2212		cm_process_work(cm_id_priv, work);
2213	else
2214		cm_deref_id(cm_id_priv);
2215	return 0;
2216out:
2217	spin_unlock_irqrestore(&cm_id_priv->lock, flags);
2218	cm_deref_id(cm_id_priv);
2219	return -EINVAL;
2220}
2221
2222static void cm_format_lap(struct cm_lap_msg *lap_msg,
2223			  struct cm_id_private *cm_id_priv,
2224			  struct ib_sa_path_rec *alternate_path,
2225			  const void *private_data,
2226			  u8 private_data_len)
2227{
2228	cm_format_mad_hdr(&lap_msg->hdr, CM_LAP_ATTR_ID,
2229			  cm_form_tid(cm_id_priv, CM_MSG_SEQUENCE_LAP));
2230	lap_msg->local_comm_id = cm_id_priv->id.local_id;
2231	lap_msg->remote_comm_id = cm_id_priv->id.remote_id;
2232	cm_lap_set_remote_qpn(lap_msg, cm_id_priv->remote_qpn);
2233	/* todo: need remote CM response timeout */
2234	cm_lap_set_remote_resp_timeout(lap_msg, 0x1F);
2235	lap_msg->alt_local_lid = alternate_path->slid;
2236	lap_msg->alt_remote_lid = alternate_path->dlid;
2237	lap_msg->alt_local_gid = alternate_path->sgid;
2238	lap_msg->alt_remote_gid = alternate_path->dgid;
2239	cm_lap_set_flow_label(lap_msg, alternate_path->flow_label);
2240	cm_lap_set_traffic_class(lap_msg, alternate_path->traffic_class);
2241	lap_msg->alt_hop_limit = alternate_path->hop_limit;
2242	cm_lap_set_packet_rate(lap_msg, alternate_path->rate);
2243	cm_lap_set_sl(lap_msg, alternate_path->sl);
2244	cm_lap_set_subnet_local(lap_msg, 1); /* local only... */
2245	cm_lap_set_local_ack_timeout(lap_msg,
2246		min(31, alternate_path->packet_life_time + 1));
2247
2248	if (private_data && private_data_len)
2249		memcpy(lap_msg->private_data, private_data, private_data_len);
2250}
2251
2252int ib_send_cm_lap(struct ib_cm_id *cm_id,
2253		   struct ib_sa_path_rec *alternate_path,
2254		   const void *private_data,
2255		   u8 private_data_len)
2256{
2257	struct cm_id_private *cm_id_priv;
2258	struct ib_mad_send_buf *msg;
2259	unsigned long flags;
2260	int ret;
2261
2262	if (private_data && private_data_len > IB_CM_LAP_PRIVATE_DATA_SIZE)
2263		return -EINVAL;
2264
2265	cm_id_priv = container_of(cm_id, struct cm_id_private, id);
2266	spin_lock_irqsave(&cm_id_priv->lock, flags);
2267	if (cm_id->state != IB_CM_ESTABLISHED ||
2268	    cm_id->lap_state != IB_CM_LAP_IDLE) {
2269		ret = -EINVAL;
2270		goto out;
2271	}
2272
2273	ret = cm_alloc_msg(cm_id_priv, &msg);
2274	if (ret)
2275		goto out;
2276
2277	cm_format_lap((struct cm_lap_msg *) msg->mad, cm_id_priv,
2278		      alternate_path, private_data, private_data_len);
2279	msg->timeout_ms = cm_id_priv->timeout_ms;
2280	msg->context[1] = (void *) (unsigned long) IB_CM_ESTABLISHED;
2281
2282	ret = ib_post_send_mad(msg, NULL);
2283	if (ret) {
2284		spin_unlock_irqrestore(&cm_id_priv->lock, flags);
2285		cm_free_msg(msg);
2286		return ret;
2287	}
2288
2289	cm_id->lap_state = IB_CM_LAP_SENT;
2290	cm_id_priv->msg = msg;
2291
2292out:	spin_unlock_irqrestore(&cm_id_priv->lock, flags);
2293	return ret;
2294}
2295EXPORT_SYMBOL(ib_send_cm_lap);
2296
2297static void cm_format_path_from_lap(struct ib_sa_path_rec *path,
2298				    struct cm_lap_msg *lap_msg)
2299{
2300	memset(path, 0, sizeof *path);
2301	path->dgid = lap_msg->alt_local_gid;
2302	path->sgid = lap_msg->alt_remote_gid;
2303	path->dlid = lap_msg->alt_local_lid;
2304	path->slid = lap_msg->alt_remote_lid;
2305	path->flow_label = cm_lap_get_flow_label(lap_msg);
2306	path->hop_limit = lap_msg->alt_hop_limit;
2307	path->traffic_class = cm_lap_get_traffic_class(lap_msg);
2308	path->reversible = 1;
2309	/* pkey is same as in REQ */
2310	path->sl = cm_lap_get_sl(lap_msg);
2311	path->mtu_selector = IB_SA_EQ;
2312	/* mtu is same as in REQ */
2313	path->rate_selector = IB_SA_EQ;
2314	path->rate = cm_lap_get_packet_rate(lap_msg);
2315	path->packet_life_time_selector = IB_SA_EQ;
2316	path->packet_life_time = cm_lap_get_local_ack_timeout(lap_msg);
2317	path->packet_life_time -= (path->packet_life_time > 0);
2318}
2319
2320static int cm_lap_handler(struct cm_work *work)
2321{
2322	struct cm_id_private *cm_id_priv;
2323	struct cm_lap_msg *lap_msg;
2324	struct ib_cm_lap_event_param *param;
2325	struct ib_mad_send_buf *msg = NULL;
2326	unsigned long flags;
2327	int ret;
2328
2329	/* todo: verify LAP request and send reject APR if invalid. */
2330	lap_msg = (struct cm_lap_msg *)work->mad_recv_wc->recv_buf.mad;
2331	cm_id_priv = cm_acquire_id(lap_msg->remote_comm_id,
2332				   lap_msg->local_comm_id);
2333	if (!cm_id_priv)
2334		return -EINVAL;
2335
2336	param = &work->cm_event.param.lap_rcvd;
2337	param->alternate_path = &work->path[0];
2338	cm_format_path_from_lap(param->alternate_path, lap_msg);
2339	work->cm_event.private_data = &lap_msg->private_data;
2340
2341	spin_lock_irqsave(&cm_id_priv->lock, flags);
2342	if (cm_id_priv->id.state != IB_CM_ESTABLISHED)
2343		goto unlock;
2344
2345	switch (cm_id_priv->id.lap_state) {
2346	case IB_CM_LAP_IDLE:
2347		break;
2348	case IB_CM_MRA_LAP_SENT:
2349		if (cm_alloc_response_msg(work->port, work->mad_recv_wc, &msg))
2350			goto unlock;
2351
2352		cm_format_mra((struct cm_mra_msg *) msg->mad, cm_id_priv,
2353			      CM_MSG_RESPONSE_OTHER,
2354			      cm_id_priv->service_timeout,
2355			      cm_id_priv->private_data,
2356			      cm_id_priv->private_data_len);
2357		spin_unlock_irqrestore(&cm_id_priv->lock, flags);
2358
2359		if (ib_post_send_mad(msg, NULL))
2360			cm_free_msg(msg);
2361		goto deref;
2362	default:
2363		goto unlock;
2364	}
2365
2366	cm_id_priv->id.lap_state = IB_CM_LAP_RCVD;
2367	cm_id_priv->tid = lap_msg->hdr.tid;
2368	ret = atomic_inc_and_test(&cm_id_priv->work_count);
2369	if (!ret)
2370		list_add_tail(&work->list, &cm_id_priv->work_list);
2371	spin_unlock_irqrestore(&cm_id_priv->lock, flags);
2372
2373	if (ret)
2374		cm_process_work(cm_id_priv, work);
2375	else
2376		cm_deref_id(cm_id_priv);
2377	return 0;
2378
2379unlock:	spin_unlock_irqrestore(&cm_id_priv->lock, flags);
2380deref:	cm_deref_id(cm_id_priv);
2381	return -EINVAL;
2382}
2383
2384static void cm_format_apr(struct cm_apr_msg *apr_msg,
2385			  struct cm_id_private *cm_id_priv,
2386			  enum ib_cm_apr_status status,
2387			  void *info,
2388			  u8 info_length,
2389			  const void *private_data,
2390			  u8 private_data_len)
2391{
2392	cm_format_mad_hdr(&apr_msg->hdr, CM_APR_ATTR_ID, cm_id_priv->tid);
2393	apr_msg->local_comm_id = cm_id_priv->id.local_id;
2394	apr_msg->remote_comm_id = cm_id_priv->id.remote_id;
2395	apr_msg->ap_status = (u8) status;
2396
2397	if (info && info_length) {
2398		apr_msg->info_length = info_length;
2399		memcpy(apr_msg->info, info, info_length);
2400	}
2401
2402	if (private_data && private_data_len)
2403		memcpy(apr_msg->private_data, private_data, private_data_len);
2404}
2405
2406int ib_send_cm_apr(struct ib_cm_id *cm_id,
2407		   enum ib_cm_apr_status status,
2408		   void *info,
2409		   u8 info_length,
2410		   const void *private_data,
2411		   u8 private_data_len)
2412{
2413	struct cm_id_private *cm_id_priv;
2414	struct ib_mad_send_buf *msg;
2415	unsigned long flags;
2416	int ret;
2417
2418	if ((private_data && private_data_len > IB_CM_APR_PRIVATE_DATA_SIZE) ||
2419	    (info && info_length > IB_CM_APR_INFO_LENGTH))
2420		return -EINVAL;
2421
2422	cm_id_priv = container_of(cm_id, struct cm_id_private, id);
2423	spin_lock_irqsave(&cm_id_priv->lock, flags);
2424	if (cm_id->state != IB_CM_ESTABLISHED ||
2425	    (cm_id->lap_state != IB_CM_LAP_RCVD &&
2426	     cm_id->lap_state != IB_CM_MRA_LAP_SENT)) {
2427		ret = -EINVAL;
2428		goto out;
2429	}
2430
2431	ret = cm_alloc_msg(cm_id_priv, &msg);
2432	if (ret)
2433		goto out;
2434
2435	cm_format_apr((struct cm_apr_msg *) msg->mad, cm_id_priv, status,
2436		      info, info_length, private_data, private_data_len);
2437	ret = ib_post_send_mad(msg, NULL);
2438	if (ret) {
2439		spin_unlock_irqrestore(&cm_id_priv->lock, flags);
2440		cm_free_msg(msg);
2441		return ret;
2442	}
2443
2444	cm_id->lap_state = IB_CM_LAP_IDLE;
2445out:	spin_unlock_irqrestore(&cm_id_priv->lock, flags);
2446	return ret;
2447}
2448EXPORT_SYMBOL(ib_send_cm_apr);
2449
2450static int cm_apr_handler(struct cm_work *work)
2451{
2452	struct cm_id_private *cm_id_priv;
2453	struct cm_apr_msg *apr_msg;
2454	unsigned long flags;
2455	int ret;
2456
2457	apr_msg = (struct cm_apr_msg *)work->mad_recv_wc->recv_buf.mad;
2458	cm_id_priv = cm_acquire_id(apr_msg->remote_comm_id,
2459				   apr_msg->local_comm_id);
2460	if (!cm_id_priv)
2461		return -EINVAL; /* Unmatched reply. */
2462
2463	work->cm_event.param.apr_rcvd.ap_status = apr_msg->ap_status;
2464	work->cm_event.param.apr_rcvd.apr_info = &apr_msg->info;
2465	work->cm_event.param.apr_rcvd.info_len = apr_msg->info_length;
2466	work->cm_event.private_data = &apr_msg->private_data;
2467
2468	spin_lock_irqsave(&cm_id_priv->lock, flags);
2469	if (cm_id_priv->id.state != IB_CM_ESTABLISHED ||
2470	    (cm_id_priv->id.lap_state != IB_CM_LAP_SENT &&
2471	     cm_id_priv->id.lap_state != IB_CM_MRA_LAP_RCVD)) {
2472		spin_unlock_irqrestore(&cm_id_priv->lock, flags);
2473		goto out;
2474	}
2475	cm_id_priv->id.lap_state = IB_CM_LAP_IDLE;
2476	ib_cancel_mad(cm_id_priv->av.port->mad_agent, cm_id_priv->msg);
2477	cm_id_priv->msg = NULL;
2478
2479	ret = atomic_inc_and_test(&cm_id_priv->work_count);
2480	if (!ret)
2481		list_add_tail(&work->list, &cm_id_priv->work_list);
2482	spin_unlock_irqrestore(&cm_id_priv->lock, flags);
2483
2484	if (ret)
2485		cm_process_work(cm_id_priv, work);
2486	else
2487		cm_deref_id(cm_id_priv);
2488	return 0;
2489out:
2490	cm_deref_id(cm_id_priv);
2491	return -EINVAL;
2492}
2493
2494static int cm_timewait_handler(struct cm_work *work)
2495{
2496	struct cm_timewait_info *timewait_info;
2497	struct cm_id_private *cm_id_priv;
2498	unsigned long flags;
2499	int ret;
2500
2501	timewait_info = (struct cm_timewait_info *)work;
2502	cm_cleanup_timewait(timewait_info);
2503
2504	cm_id_priv = cm_acquire_id(timewait_info->work.local_id,
2505				   timewait_info->work.remote_id);
2506	if (!cm_id_priv)
2507		return -EINVAL;
2508
2509	spin_lock_irqsave(&cm_id_priv->lock, flags);
2510	if (cm_id_priv->id.state != IB_CM_TIMEWAIT ||
2511	    cm_id_priv->remote_qpn != timewait_info->remote_qpn) {
2512		spin_unlock_irqrestore(&cm_id_priv->lock, flags);
2513		goto out;
2514	}
2515	cm_id_priv->id.state = IB_CM_IDLE;
2516	ret = atomic_inc_and_test(&cm_id_priv->work_count);
2517	if (!ret)
2518		list_add_tail(&work->list, &cm_id_priv->work_list);
2519	spin_unlock_irqrestore(&cm_id_priv->lock, flags);
2520
2521	if (ret)
2522		cm_process_work(cm_id_priv, work);
2523	else
2524		cm_deref_id(cm_id_priv);
2525	return 0;
2526out:
2527	cm_deref_id(cm_id_priv);
2528	return -EINVAL;
2529}
2530
2531static void cm_format_sidr_req(struct cm_sidr_req_msg *sidr_req_msg,
2532			       struct cm_id_private *cm_id_priv,
2533			       struct ib_cm_sidr_req_param *param)
2534{
2535	cm_format_mad_hdr(&sidr_req_msg->hdr, CM_SIDR_REQ_ATTR_ID,
2536			  cm_form_tid(cm_id_priv, CM_MSG_SEQUENCE_SIDR));
2537	sidr_req_msg->request_id = cm_id_priv->id.local_id;
2538	sidr_req_msg->pkey = cpu_to_be16(param->pkey);
2539	sidr_req_msg->service_id = param->service_id;
2540
2541	if (param->private_data && param->private_data_len)
2542		memcpy(sidr_req_msg->private_data, param->private_data,
2543		       param->private_data_len);
2544}
2545
2546int ib_send_cm_sidr_req(struct ib_cm_id *cm_id,
2547			struct ib_cm_sidr_req_param *param)
2548{
2549	struct cm_id_private *cm_id_priv;
2550	struct ib_mad_send_buf *msg;
2551	unsigned long flags;
2552	int ret;
2553
2554	if (!param->path || (param->private_data &&
2555	     param->private_data_len > IB_CM_SIDR_REQ_PRIVATE_DATA_SIZE))
2556		return -EINVAL;
2557
2558	cm_id_priv = container_of(cm_id, struct cm_id_private, id);
2559	ret = cm_init_av_by_path(param->path, &cm_id_priv->av);
2560	if (ret)
2561		goto out;
2562
2563	cm_id->service_id = param->service_id;
2564	cm_id->service_mask = __constant_cpu_to_be64(~0ULL);
2565	cm_id_priv->timeout_ms = param->timeout_ms;
2566	cm_id_priv->max_cm_retries = param->max_cm_retries;
2567	ret = cm_alloc_msg(cm_id_priv, &msg);
2568	if (ret)
2569		goto out;
2570
2571	cm_format_sidr_req((struct cm_sidr_req_msg *) msg->mad, cm_id_priv,
2572			   param);
2573	msg->timeout_ms = cm_id_priv->timeout_ms;
2574	msg->context[1] = (void *) (unsigned long) IB_CM_SIDR_REQ_SENT;
2575
2576	spin_lock_irqsave(&cm_id_priv->lock, flags);
2577	if (cm_id->state == IB_CM_IDLE)
2578		ret = ib_post_send_mad(msg, NULL);
2579	else
2580		ret = -EINVAL;
2581
2582	if (ret) {
2583		spin_unlock_irqrestore(&cm_id_priv->lock, flags);
2584		cm_free_msg(msg);
2585		goto out;
2586	}
2587	cm_id->state = IB_CM_SIDR_REQ_SENT;
2588	cm_id_priv->msg = msg;
2589	spin_unlock_irqrestore(&cm_id_priv->lock, flags);
2590out:
2591	return ret;
2592}
2593EXPORT_SYMBOL(ib_send_cm_sidr_req);
2594
2595static void cm_format_sidr_req_event(struct cm_work *work,
2596				     struct ib_cm_id *listen_id)
2597{
2598	struct cm_sidr_req_msg *sidr_req_msg;
2599	struct ib_cm_sidr_req_event_param *param;
2600
2601	sidr_req_msg = (struct cm_sidr_req_msg *)
2602				work->mad_recv_wc->recv_buf.mad;
2603	param = &work->cm_event.param.sidr_req_rcvd;
2604	param->pkey = __be16_to_cpu(sidr_req_msg->pkey);
2605	param->listen_id = listen_id;
2606	param->port = work->port->port_num;
2607	work->cm_event.private_data = &sidr_req_msg->private_data;
2608}
2609
2610static int cm_sidr_req_handler(struct cm_work *work)
2611{
2612	struct ib_cm_id *cm_id;
2613	struct cm_id_private *cm_id_priv, *cur_cm_id_priv;
2614	struct cm_sidr_req_msg *sidr_req_msg;
2615	struct ib_wc *wc;
2616	unsigned long flags;
2617
2618	cm_id = ib_create_cm_id(work->port->cm_dev->device, NULL, NULL);
2619	if (IS_ERR(cm_id))
2620		return PTR_ERR(cm_id);
2621	cm_id_priv = container_of(cm_id, struct cm_id_private, id);
2622
2623	/* Record SGID/SLID and request ID for lookup. */
2624	sidr_req_msg = (struct cm_sidr_req_msg *)
2625				work->mad_recv_wc->recv_buf.mad;
2626	wc = work->mad_recv_wc->wc;
2627	cm_id_priv->av.dgid.global.subnet_prefix = cpu_to_be64(wc->slid);
2628	cm_id_priv->av.dgid.global.interface_id = 0;
2629	cm_init_av_for_response(work->port, work->mad_recv_wc->wc,
2630				&cm_id_priv->av);
2631	cm_id_priv->id.remote_id = sidr_req_msg->request_id;
2632	cm_id_priv->id.state = IB_CM_SIDR_REQ_RCVD;
2633	cm_id_priv->tid = sidr_req_msg->hdr.tid;
2634	atomic_inc(&cm_id_priv->work_count);
2635
2636	spin_lock_irqsave(&cm.lock, flags);
2637	cur_cm_id_priv = cm_insert_remote_sidr(cm_id_priv);
2638	if (cur_cm_id_priv) {
2639		spin_unlock_irqrestore(&cm.lock, flags);
2640		goto out; /* Duplicate message. */
2641	}
2642	cur_cm_id_priv = cm_find_listen(cm_id->device,
2643					sidr_req_msg->service_id);
2644	if (!cur_cm_id_priv) {
2645		rb_erase(&cm_id_priv->sidr_id_node, &cm.remote_sidr_table);
2646		spin_unlock_irqrestore(&cm.lock, flags);
2647		/* todo: reply with no match */
2648		goto out; /* No match. */
2649	}
2650	atomic_inc(&cur_cm_id_priv->refcount);
2651	spin_unlock_irqrestore(&cm.lock, flags);
2652
2653	cm_id_priv->id.cm_handler = cur_cm_id_priv->id.cm_handler;
2654	cm_id_priv->id.context = cur_cm_id_priv->id.context;
2655	cm_id_priv->id.service_id = sidr_req_msg->service_id;
2656	cm_id_priv->id.service_mask = __constant_cpu_to_be64(~0ULL);
2657
2658	cm_format_sidr_req_event(work, &cur_cm_id_priv->id);
2659	cm_process_work(cm_id_priv, work);
2660	cm_deref_id(cur_cm_id_priv);
2661	return 0;
2662out:
2663	ib_destroy_cm_id(&cm_id_priv->id);
2664	return -EINVAL;
2665}
2666
2667static void cm_format_sidr_rep(struct cm_sidr_rep_msg *sidr_rep_msg,
2668			       struct cm_id_private *cm_id_priv,
2669			       struct ib_cm_sidr_rep_param *param)
2670{
2671	cm_format_mad_hdr(&sidr_rep_msg->hdr, CM_SIDR_REP_ATTR_ID,
2672			  cm_id_priv->tid);
2673	sidr_rep_msg->request_id = cm_id_priv->id.remote_id;
2674	sidr_rep_msg->status = param->status;
2675	cm_sidr_rep_set_qpn(sidr_rep_msg, cpu_to_be32(param->qp_num));
2676	sidr_rep_msg->service_id = cm_id_priv->id.service_id;
2677	sidr_rep_msg->qkey = cpu_to_be32(param->qkey);
2678
2679	if (param->info && param->info_length)
2680		memcpy(sidr_rep_msg->info, param->info, param->info_length);
2681
2682	if (param->private_data && param->private_data_len)
2683		memcpy(sidr_rep_msg->private_data, param->private_data,
2684		       param->private_data_len);
2685}
2686
2687int ib_send_cm_sidr_rep(struct ib_cm_id *cm_id,
2688			struct ib_cm_sidr_rep_param *param)
2689{
2690	struct cm_id_private *cm_id_priv;
2691	struct ib_mad_send_buf *msg;
2692	unsigned long flags;
2693	int ret;
2694
2695	if ((param->info && param->info_length > IB_CM_SIDR_REP_INFO_LENGTH) ||
2696	    (param->private_data &&
2697	     param->private_data_len > IB_CM_SIDR_REP_PRIVATE_DATA_SIZE))
2698		return -EINVAL;
2699
2700	cm_id_priv = container_of(cm_id, struct cm_id_private, id);
2701	spin_lock_irqsave(&cm_id_priv->lock, flags);
2702	if (cm_id->state != IB_CM_SIDR_REQ_RCVD) {
2703		ret = -EINVAL;
2704		goto error;
2705	}
2706
2707	ret = cm_alloc_msg(cm_id_priv, &msg);
2708	if (ret)
2709		goto error;
2710
2711	cm_format_sidr_rep((struct cm_sidr_rep_msg *) msg->mad, cm_id_priv,
2712			   param);
2713	ret = ib_post_send_mad(msg, NULL);
2714	if (ret) {
2715		spin_unlock_irqrestore(&cm_id_priv->lock, flags);
2716		cm_free_msg(msg);
2717		return ret;
2718	}
2719	cm_id->state = IB_CM_IDLE;
2720	spin_unlock_irqrestore(&cm_id_priv->lock, flags);
2721
2722	spin_lock_irqsave(&cm.lock, flags);
2723	rb_erase(&cm_id_priv->sidr_id_node, &cm.remote_sidr_table);
2724	spin_unlock_irqrestore(&cm.lock, flags);
2725	return 0;
2726
2727error:	spin_unlock_irqrestore(&cm_id_priv->lock, flags);
2728	return ret;
2729}
2730EXPORT_SYMBOL(ib_send_cm_sidr_rep);
2731
2732static void cm_format_sidr_rep_event(struct cm_work *work)
2733{
2734	struct cm_sidr_rep_msg *sidr_rep_msg;
2735	struct ib_cm_sidr_rep_event_param *param;
2736
2737	sidr_rep_msg = (struct cm_sidr_rep_msg *)
2738				work->mad_recv_wc->recv_buf.mad;
2739	param = &work->cm_event.param.sidr_rep_rcvd;
2740	param->status = sidr_rep_msg->status;
2741	param->qkey = be32_to_cpu(sidr_rep_msg->qkey);
2742	param->qpn = be32_to_cpu(cm_sidr_rep_get_qpn(sidr_rep_msg));
2743	param->info = &sidr_rep_msg->info;
2744	param->info_len = sidr_rep_msg->info_length;
2745	work->cm_event.private_data = &sidr_rep_msg->private_data;
2746}
2747
2748static int cm_sidr_rep_handler(struct cm_work *work)
2749{
2750	struct cm_sidr_rep_msg *sidr_rep_msg;
2751	struct cm_id_private *cm_id_priv;
2752	unsigned long flags;
2753
2754	sidr_rep_msg = (struct cm_sidr_rep_msg *)
2755				work->mad_recv_wc->recv_buf.mad;
2756	cm_id_priv = cm_acquire_id(sidr_rep_msg->request_id, 0);
2757	if (!cm_id_priv)
2758		return -EINVAL; /* Unmatched reply. */
2759
2760	spin_lock_irqsave(&cm_id_priv->lock, flags);
2761	if (cm_id_priv->id.state != IB_CM_SIDR_REQ_SENT) {
2762		spin_unlock_irqrestore(&cm_id_priv->lock, flags);
2763		goto out;
2764	}
2765	cm_id_priv->id.state = IB_CM_IDLE;
2766	ib_cancel_mad(cm_id_priv->av.port->mad_agent, cm_id_priv->msg);
2767	spin_unlock_irqrestore(&cm_id_priv->lock, flags);
2768
2769	cm_format_sidr_rep_event(work);
2770	cm_process_work(cm_id_priv, work);
2771	return 0;
2772out:
2773	cm_deref_id(cm_id_priv);
2774	return -EINVAL;
2775}
2776
2777static void cm_process_send_error(struct ib_mad_send_buf *msg,
2778				  enum ib_wc_status wc_status)
2779{
2780	struct cm_id_private *cm_id_priv;
2781	struct ib_cm_event cm_event;
2782	enum ib_cm_state state;
2783	unsigned long flags;
2784	int ret;
2785
2786	memset(&cm_event, 0, sizeof cm_event);
2787	cm_id_priv = msg->context[0];
2788
2789	/* Discard old sends or ones without a response. */
2790	spin_lock_irqsave(&cm_id_priv->lock, flags);
2791	state = (enum ib_cm_state) (unsigned long) msg->context[1];
2792	if (msg != cm_id_priv->msg || state != cm_id_priv->id.state)
2793		goto discard;
2794
2795	switch (state) {
2796	case IB_CM_REQ_SENT:
2797	case IB_CM_MRA_REQ_RCVD:
2798		cm_reset_to_idle(cm_id_priv);
2799		cm_event.event = IB_CM_REQ_ERROR;
2800		break;
2801	case IB_CM_REP_SENT:
2802	case IB_CM_MRA_REP_RCVD:
2803		cm_reset_to_idle(cm_id_priv);
2804		cm_event.event = IB_CM_REP_ERROR;
2805		break;
2806	case IB_CM_DREQ_SENT:
2807		cm_enter_timewait(cm_id_priv);
2808		cm_event.event = IB_CM_DREQ_ERROR;
2809		break;
2810	case IB_CM_SIDR_REQ_SENT:
2811		cm_id_priv->id.state = IB_CM_IDLE;
2812		cm_event.event = IB_CM_SIDR_REQ_ERROR;
2813		break;
2814	default:
2815		goto discard;
2816	}
2817	spin_unlock_irqrestore(&cm_id_priv->lock, flags);
2818	cm_event.param.send_status = wc_status;
2819
2820	/* No other events can occur on the cm_id at this point. */
2821	ret = cm_id_priv->id.cm_handler(&cm_id_priv->id, &cm_event);
2822	cm_free_msg(msg);
2823	if (ret)
2824		ib_destroy_cm_id(&cm_id_priv->id);
2825	return;
2826discard:
2827	spin_unlock_irqrestore(&cm_id_priv->lock, flags);
2828	cm_free_msg(msg);
2829}
2830
2831static void cm_send_handler(struct ib_mad_agent *mad_agent,
2832			    struct ib_mad_send_wc *mad_send_wc)
2833{
2834	struct ib_mad_send_buf *msg = mad_send_wc->send_buf;
2835
2836	switch (mad_send_wc->status) {
2837	case IB_WC_SUCCESS:
2838	case IB_WC_WR_FLUSH_ERR:
2839		cm_free_msg(msg);
2840		break;
2841	default:
2842		if (msg->context[0] && msg->context[1])
2843			cm_process_send_error(msg, mad_send_wc->status);
2844		else
2845			cm_free_msg(msg);
2846		break;
2847	}
2848}
2849
2850static void cm_work_handler(void *data)
2851{
2852	struct cm_work *work = data;
2853	int ret;
2854
2855	switch (work->cm_event.event) {
2856	case IB_CM_REQ_RECEIVED:
2857		ret = cm_req_handler(work);
2858		break;
2859	case IB_CM_MRA_RECEIVED:
2860		ret = cm_mra_handler(work);
2861		break;
2862	case IB_CM_REJ_RECEIVED:
2863		ret = cm_rej_handler(work);
2864		break;
2865	case IB_CM_REP_RECEIVED:
2866		ret = cm_rep_handler(work);
2867		break;
2868	case IB_CM_RTU_RECEIVED:
2869		ret = cm_rtu_handler(work);
2870		break;
2871	case IB_CM_USER_ESTABLISHED:
2872		ret = cm_establish_handler(work);
2873		break;
2874	case IB_CM_DREQ_RECEIVED:
2875		ret = cm_dreq_handler(work);
2876		break;
2877	case IB_CM_DREP_RECEIVED:
2878		ret = cm_drep_handler(work);
2879		break;
2880	case IB_CM_SIDR_REQ_RECEIVED:
2881		ret = cm_sidr_req_handler(work);
2882		break;
2883	case IB_CM_SIDR_REP_RECEIVED:
2884		ret = cm_sidr_rep_handler(work);
2885		break;
2886	case IB_CM_LAP_RECEIVED:
2887		ret = cm_lap_handler(work);
2888		break;
2889	case IB_CM_APR_RECEIVED:
2890		ret = cm_apr_handler(work);
2891		break;
2892	case IB_CM_TIMEWAIT_EXIT:
2893		ret = cm_timewait_handler(work);
2894		break;
2895	default:
2896		ret = -EINVAL;
2897		break;
2898	}
2899	if (ret)
2900		cm_free_work(work);
2901}
2902
2903int ib_cm_establish(struct ib_cm_id *cm_id)
2904{
2905	struct cm_id_private *cm_id_priv;
2906	struct cm_work *work;
2907	unsigned long flags;
2908	int ret = 0;
2909
2910	work = kmalloc(sizeof *work, GFP_ATOMIC);
2911	if (!work)
2912		return -ENOMEM;
2913
2914	cm_id_priv = container_of(cm_id, struct cm_id_private, id);
2915	spin_lock_irqsave(&cm_id_priv->lock, flags);
2916	switch (cm_id->state)
2917	{
2918	case IB_CM_REP_SENT:
2919	case IB_CM_MRA_REP_RCVD:
2920		cm_id->state = IB_CM_ESTABLISHED;
2921		break;
2922	case IB_CM_ESTABLISHED:
2923		ret = -EISCONN;
2924		break;
2925	default:
2926		ret = -EINVAL;
2927		break;
2928	}
2929	spin_unlock_irqrestore(&cm_id_priv->lock, flags);
2930
2931	if (ret) {
2932		kfree(work);
2933		goto out;
2934	}
2935
2936	/*
2937	 * The CM worker thread may try to destroy the cm_id before it
2938	 * can execute this work item.  To prevent potential deadlock,
2939	 * we need to find the cm_id once we're in the context of the
2940	 * worker thread, rather than holding a reference on it.
2941	 */
2942	INIT_WORK(&work->work, cm_work_handler, work);
2943	work->local_id = cm_id->local_id;
2944	work->remote_id = cm_id->remote_id;
2945	work->mad_recv_wc = NULL;
2946	work->cm_event.event = IB_CM_USER_ESTABLISHED;
2947	queue_work(cm.wq, &work->work);
2948out:
2949	return ret;
2950}
2951EXPORT_SYMBOL(ib_cm_establish);
2952
2953static void cm_recv_handler(struct ib_mad_agent *mad_agent,
2954			    struct ib_mad_recv_wc *mad_recv_wc)
2955{
2956	struct cm_work *work;
2957	enum ib_cm_event_type event;
2958	int paths = 0;
2959
2960	switch (mad_recv_wc->recv_buf.mad->mad_hdr.attr_id) {
2961	case CM_REQ_ATTR_ID:
2962		paths = 1 + (((struct cm_req_msg *) mad_recv_wc->recv_buf.mad)->
2963						    alt_local_lid != 0);
2964		event = IB_CM_REQ_RECEIVED;
2965		break;
2966	case CM_MRA_ATTR_ID:
2967		event = IB_CM_MRA_RECEIVED;
2968		break;
2969	case CM_REJ_ATTR_ID:
2970		event = IB_CM_REJ_RECEIVED;
2971		break;
2972	case CM_REP_ATTR_ID:
2973		event = IB_CM_REP_RECEIVED;
2974		break;
2975	case CM_RTU_ATTR_ID:
2976		event = IB_CM_RTU_RECEIVED;
2977		break;
2978	case CM_DREQ_ATTR_ID:
2979		event = IB_CM_DREQ_RECEIVED;
2980		break;
2981	case CM_DREP_ATTR_ID:
2982		event = IB_CM_DREP_RECEIVED;
2983		break;
2984	case CM_SIDR_REQ_ATTR_ID:
2985		event = IB_CM_SIDR_REQ_RECEIVED;
2986		break;
2987	case CM_SIDR_REP_ATTR_ID:
2988		event = IB_CM_SIDR_REP_RECEIVED;
2989		break;
2990	case CM_LAP_ATTR_ID:
2991		paths = 1;
2992		event = IB_CM_LAP_RECEIVED;
2993		break;
2994	case CM_APR_ATTR_ID:
2995		event = IB_CM_APR_RECEIVED;
2996		break;
2997	default:
2998		ib_free_recv_mad(mad_recv_wc);
2999		return;
3000	}
3001
3002	work = kmalloc(sizeof *work + sizeof(struct ib_sa_path_rec) * paths,
3003		       GFP_KERNEL);
3004	if (!work) {
3005		ib_free_recv_mad(mad_recv_wc);
3006		return;
3007	}
3008
3009	INIT_WORK(&work->work, cm_work_handler, work);
3010	work->cm_event.event = event;
3011	work->mad_recv_wc = mad_recv_wc;
3012	work->port = (struct cm_port *)mad_agent->context;
3013	queue_work(cm.wq, &work->work);
3014}
3015
3016static int cm_init_qp_init_attr(struct cm_id_private *cm_id_priv,
3017				struct ib_qp_attr *qp_attr,
3018				int *qp_attr_mask)
3019{
3020	unsigned long flags;
3021	int ret;
3022
3023	spin_lock_irqsave(&cm_id_priv->lock, flags);
3024	switch (cm_id_priv->id.state) {
3025	case IB_CM_REQ_SENT:
3026	case IB_CM_MRA_REQ_RCVD:
3027	case IB_CM_REQ_RCVD:
3028	case IB_CM_MRA_REQ_SENT:
3029	case IB_CM_REP_RCVD:
3030	case IB_CM_MRA_REP_SENT:
3031	case IB_CM_REP_SENT:
3032	case IB_CM_MRA_REP_RCVD:
3033	case IB_CM_ESTABLISHED:
3034		*qp_attr_mask = IB_QP_STATE | IB_QP_ACCESS_FLAGS |
3035				IB_QP_PKEY_INDEX | IB_QP_PORT;
3036		qp_attr->qp_access_flags = IB_ACCESS_LOCAL_WRITE |
3037					   IB_ACCESS_REMOTE_WRITE;
3038		if (cm_id_priv->responder_resources)
3039			qp_attr->qp_access_flags |= IB_ACCESS_REMOTE_READ;
3040		qp_attr->pkey_index = cm_id_priv->av.pkey_index;
3041		qp_attr->port_num = cm_id_priv->av.port->port_num;
3042		ret = 0;
3043		break;
3044	default:
3045		ret = -EINVAL;
3046		break;
3047	}
3048	spin_unlock_irqrestore(&cm_id_priv->lock, flags);
3049	return ret;
3050}
3051
3052static int cm_init_qp_rtr_attr(struct cm_id_private *cm_id_priv,
3053			       struct ib_qp_attr *qp_attr,
3054			       int *qp_attr_mask)
3055{
3056	unsigned long flags;
3057	int ret;
3058
3059	spin_lock_irqsave(&cm_id_priv->lock, flags);
3060	switch (cm_id_priv->id.state) {
3061	case IB_CM_REQ_RCVD:
3062	case IB_CM_MRA_REQ_SENT:
3063	case IB_CM_REP_RCVD:
3064	case IB_CM_MRA_REP_SENT:
3065	case IB_CM_REP_SENT:
3066	case IB_CM_MRA_REP_RCVD:
3067	case IB_CM_ESTABLISHED:
3068		*qp_attr_mask = IB_QP_STATE | IB_QP_AV | IB_QP_PATH_MTU |
3069				IB_QP_DEST_QPN | IB_QP_RQ_PSN;
3070		qp_attr->ah_attr = cm_id_priv->av.ah_attr;
3071		qp_attr->path_mtu = cm_id_priv->path_mtu;
3072		qp_attr->dest_qp_num = be32_to_cpu(cm_id_priv->remote_qpn);
3073		qp_attr->rq_psn = be32_to_cpu(cm_id_priv->rq_psn);
3074		if (cm_id_priv->qp_type == IB_QPT_RC) {
3075			*qp_attr_mask |= IB_QP_MAX_DEST_RD_ATOMIC |
3076					 IB_QP_MIN_RNR_TIMER;
3077			qp_attr->max_dest_rd_atomic =
3078					cm_id_priv->responder_resources;
3079			qp_attr->min_rnr_timer = 0;
3080		}
3081		if (cm_id_priv->alt_av.ah_attr.dlid) {
3082			*qp_attr_mask |= IB_QP_ALT_PATH;
3083			qp_attr->alt_ah_attr = cm_id_priv->alt_av.ah_attr;
3084		}
3085		ret = 0;
3086		break;
3087	default:
3088		ret = -EINVAL;
3089		break;
3090	}
3091	spin_unlock_irqrestore(&cm_id_priv->lock, flags);
3092	return ret;
3093}
3094
3095static int cm_init_qp_rts_attr(struct cm_id_private *cm_id_priv,
3096			       struct ib_qp_attr *qp_attr,
3097			       int *qp_attr_mask)
3098{
3099	unsigned long flags;
3100	int ret;
3101
3102	spin_lock_irqsave(&cm_id_priv->lock, flags);
3103	switch (cm_id_priv->id.state) {
3104	case IB_CM_REP_RCVD:
3105	case IB_CM_MRA_REP_SENT:
3106	case IB_CM_REP_SENT:
3107	case IB_CM_MRA_REP_RCVD:
3108	case IB_CM_ESTABLISHED:
3109		*qp_attr_mask = IB_QP_STATE | IB_QP_SQ_PSN;
3110		qp_attr->sq_psn = be32_to_cpu(cm_id_priv->sq_psn);
3111		if (cm_id_priv->qp_type == IB_QPT_RC) {
3112			*qp_attr_mask |= IB_QP_TIMEOUT | IB_QP_RETRY_CNT |
3113					 IB_QP_RNR_RETRY |
3114					 IB_QP_MAX_QP_RD_ATOMIC;
3115			qp_attr->timeout = cm_id_priv->local_ack_timeout;
3116			qp_attr->retry_cnt = cm_id_priv->retry_count;
3117			qp_attr->rnr_retry = cm_id_priv->rnr_retry_count;
3118			qp_attr->max_rd_atomic = cm_id_priv->initiator_depth;
3119		}
3120		if (cm_id_priv->alt_av.ah_attr.dlid) {
3121			*qp_attr_mask |= IB_QP_PATH_MIG_STATE;
3122			qp_attr->path_mig_state = IB_MIG_REARM;
3123		}
3124		ret = 0;
3125		break;
3126	default:
3127		ret = -EINVAL;
3128		break;
3129	}
3130	spin_unlock_irqrestore(&cm_id_priv->lock, flags);
3131	return ret;
3132}
3133
3134int ib_cm_init_qp_attr(struct ib_cm_id *cm_id,
3135		       struct ib_qp_attr *qp_attr,
3136		       int *qp_attr_mask)
3137{
3138	struct cm_id_private *cm_id_priv;
3139	int ret;
3140
3141	cm_id_priv = container_of(cm_id, struct cm_id_private, id);
3142	switch (qp_attr->qp_state) {
3143	case IB_QPS_INIT:
3144		ret = cm_init_qp_init_attr(cm_id_priv, qp_attr, qp_attr_mask);
3145		break;
3146	case IB_QPS_RTR:
3147		ret = cm_init_qp_rtr_attr(cm_id_priv, qp_attr, qp_attr_mask);
3148		break;
3149	case IB_QPS_RTS:
3150		ret = cm_init_qp_rts_attr(cm_id_priv, qp_attr, qp_attr_mask);
3151		break;
3152	default:
3153		ret = -EINVAL;
3154		break;
3155	}
3156	return ret;
3157}
3158EXPORT_SYMBOL(ib_cm_init_qp_attr);
3159
3160static __be64 cm_get_ca_guid(struct ib_device *device)
3161{
3162	struct ib_device_attr *device_attr;
3163	__be64 guid;
3164	int ret;
3165
3166	device_attr = kmalloc(sizeof *device_attr, GFP_KERNEL);
3167	if (!device_attr)
3168		return 0;
3169
3170	ret = ib_query_device(device, device_attr);
3171	guid = ret ? 0 : device_attr->node_guid;
3172	kfree(device_attr);
3173	return guid;
3174}
3175
3176static void cm_add_one(struct ib_device *device)
3177{
3178	struct cm_device *cm_dev;
3179	struct cm_port *port;
3180	struct ib_mad_reg_req reg_req = {
3181		.mgmt_class = IB_MGMT_CLASS_CM,
3182		.mgmt_class_version = IB_CM_CLASS_VERSION
3183	};
3184	struct ib_port_modify port_modify = {
3185		.set_port_cap_mask = IB_PORT_CM_SUP
3186	};
3187	unsigned long flags;
3188	int ret;
3189	u8 i;
3190
3191	cm_dev = kmalloc(sizeof(*cm_dev) + sizeof(*port) *
3192			 device->phys_port_cnt, GFP_KERNEL);
3193	if (!cm_dev)
3194		return;
3195
3196	cm_dev->device = device;
3197	cm_dev->ca_guid = cm_get_ca_guid(device);
3198	if (!cm_dev->ca_guid)
3199		goto error1;
3200
3201	set_bit(IB_MGMT_METHOD_SEND, reg_req.method_mask);
3202	for (i = 1; i <= device->phys_port_cnt; i++) {
3203		port = &cm_dev->port[i-1];
3204		port->cm_dev = cm_dev;
3205		port->port_num = i;
3206		port->mad_agent = ib_register_mad_agent(device, i,
3207							IB_QPT_GSI,
3208							&reg_req,
3209							0,
3210							cm_send_handler,
3211							cm_recv_handler,
3212							port);
3213		if (IS_ERR(port->mad_agent))
3214			goto error2;
3215
3216		ret = ib_modify_port(device, i, 0, &port_modify);
3217		if (ret)
3218			goto error3;
3219	}
3220	ib_set_client_data(device, &cm_client, cm_dev);
3221
3222	write_lock_irqsave(&cm.device_lock, flags);
3223	list_add_tail(&cm_dev->list, &cm.device_list);
3224	write_unlock_irqrestore(&cm.device_lock, flags);
3225	return;
3226
3227error3:
3228	ib_unregister_mad_agent(port->mad_agent);
3229error2:
3230	port_modify.set_port_cap_mask = 0;
3231	port_modify.clr_port_cap_mask = IB_PORT_CM_SUP;
3232	while (--i) {
3233		port = &cm_dev->port[i-1];
3234		ib_modify_port(device, port->port_num, 0, &port_modify);
3235		ib_unregister_mad_agent(port->mad_agent);
3236	}
3237error1:
3238	kfree(cm_dev);
3239}
3240
3241static void cm_remove_one(struct ib_device *device)
3242{
3243	struct cm_device *cm_dev;
3244	struct cm_port *port;
3245	struct ib_port_modify port_modify = {
3246		.clr_port_cap_mask = IB_PORT_CM_SUP
3247	};
3248	unsigned long flags;
3249	int i;
3250
3251	cm_dev = ib_get_client_data(device, &cm_client);
3252	if (!cm_dev)
3253		return;
3254
3255	write_lock_irqsave(&cm.device_lock, flags);
3256	list_del(&cm_dev->list);
3257	write_unlock_irqrestore(&cm.device_lock, flags);
3258
3259	for (i = 1; i <= device->phys_port_cnt; i++) {
3260		port = &cm_dev->port[i-1];
3261		ib_modify_port(device, port->port_num, 0, &port_modify);
3262		ib_unregister_mad_agent(port->mad_agent);
3263	}
3264	kfree(cm_dev);
3265}
3266
3267static int __init ib_cm_init(void)
3268{
3269	int ret;
3270
3271	memset(&cm, 0, sizeof cm);
3272	INIT_LIST_HEAD(&cm.device_list);
3273	rwlock_init(&cm.device_lock);
3274	spin_lock_init(&cm.lock);
3275	cm.listen_service_table = RB_ROOT;
3276	cm.listen_service_id = __constant_be64_to_cpu(IB_CM_ASSIGN_SERVICE_ID);
3277	cm.remote_id_table = RB_ROOT;
3278	cm.remote_qp_table = RB_ROOT;
3279	cm.remote_sidr_table = RB_ROOT;
3280	idr_init(&cm.local_id_table);
3281	idr_pre_get(&cm.local_id_table, GFP_KERNEL);
3282
3283	cm.wq = create_workqueue("ib_cm");
3284	if (!cm.wq)
3285		return -ENOMEM;
3286
3287	ret = ib_register_client(&cm_client);
3288	if (ret)
3289		goto error;
3290
3291	return 0;
3292error:
3293	destroy_workqueue(cm.wq);
3294	return ret;
3295}
3296
3297static void __exit ib_cm_cleanup(void)
3298{
3299	flush_workqueue(cm.wq);
3300	destroy_workqueue(cm.wq);
3301	ib_unregister_client(&cm_client);
3302	idr_destroy(&cm.local_id_table);
3303}
3304
3305module_init(ib_cm_init);
3306module_exit(ib_cm_cleanup);
3307
3308