vserver 2.0 rc7
[linux-2.6.git] / drivers / infiniband / core / mad.c
1 /*
2  * Copyright (c) 2004, 2005 Voltaire, Inc. All rights reserved.
3  *
4  * This software is available to you under a choice of one of two
5  * licenses.  You may choose to be licensed under the terms of the GNU
6  * General Public License (GPL) Version 2, available from the file
7  * COPYING in the main directory of this source tree, or the
8  * OpenIB.org BSD license below:
9  *
10  *     Redistribution and use in source and binary forms, with or
11  *     without modification, are permitted provided that the following
12  *     conditions are met:
13  *
14  *      - Redistributions of source code must retain the above
15  *        copyright notice, this list of conditions and the following
16  *        disclaimer.
17  *
18  *      - Redistributions in binary form must reproduce the above
19  *        copyright notice, this list of conditions and the following
20  *        disclaimer in the documentation and/or other materials
21  *        provided with the distribution.
22  *
23  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
27  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
28  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
29  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
30  * SOFTWARE.
31  *
32  * $Id: mad.c 1389 2004-12-27 22:56:47Z roland $
33  */
34
35 #include <linux/dma-mapping.h>
36
37 #include "mad_priv.h"
38 #include "smi.h"
39 #include "agent.h"
40
41 MODULE_LICENSE("Dual BSD/GPL");
42 MODULE_DESCRIPTION("kernel IB MAD API");
43 MODULE_AUTHOR("Hal Rosenstock");
44 MODULE_AUTHOR("Sean Hefty");
45
46
47 kmem_cache_t *ib_mad_cache;
48 static struct list_head ib_mad_port_list;
49 static u32 ib_mad_client_id = 0;
50
51 /* Port list lock */
52 static spinlock_t ib_mad_port_list_lock;
53
54
55 /* Forward declarations */
56 static int method_in_use(struct ib_mad_mgmt_method_table **method,
57                          struct ib_mad_reg_req *mad_reg_req);
58 static void remove_mad_reg_req(struct ib_mad_agent_private *priv);
59 static struct ib_mad_agent_private *find_mad_agent(
60                                         struct ib_mad_port_private *port_priv,
61                                         struct ib_mad *mad, int solicited);
62 static int ib_mad_post_receive_mads(struct ib_mad_qp_info *qp_info,
63                                     struct ib_mad_private *mad);
64 static void cancel_mads(struct ib_mad_agent_private *mad_agent_priv);
65 static void ib_mad_complete_send_wr(struct ib_mad_send_wr_private *mad_send_wr,
66                                     struct ib_mad_send_wc *mad_send_wc);
67 static void timeout_sends(void *data);
68 static void cancel_sends(void *data);
69 static void local_completions(void *data);
70 static int solicited_mad(struct ib_mad *mad);
71 static int add_nonoui_reg_req(struct ib_mad_reg_req *mad_reg_req,
72                               struct ib_mad_agent_private *agent_priv,
73                               u8 mgmt_class);
74 static int add_oui_reg_req(struct ib_mad_reg_req *mad_reg_req,
75                            struct ib_mad_agent_private *agent_priv);
76
77 /*
78  * Returns a ib_mad_port_private structure or NULL for a device/port
79  * Assumes ib_mad_port_list_lock is being held
80  */
81 static inline struct ib_mad_port_private *
82 __ib_get_mad_port(struct ib_device *device, int port_num)
83 {
84         struct ib_mad_port_private *entry;
85
86         list_for_each_entry(entry, &ib_mad_port_list, port_list) {
87                 if (entry->device == device && entry->port_num == port_num)
88                         return entry;
89         }
90         return NULL;
91 }
92
93 /*
94  * Wrapper function to return a ib_mad_port_private structure or NULL
95  * for a device/port
96  */
97 static inline struct ib_mad_port_private *
98 ib_get_mad_port(struct ib_device *device, int port_num)
99 {
100         struct ib_mad_port_private *entry;
101         unsigned long flags;
102
103         spin_lock_irqsave(&ib_mad_port_list_lock, flags);
104         entry = __ib_get_mad_port(device, port_num);
105         spin_unlock_irqrestore(&ib_mad_port_list_lock, flags);
106
107         return entry;
108 }
109
110 static inline u8 convert_mgmt_class(u8 mgmt_class)
111 {
112         /* Alias IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE to 0 */
113         return mgmt_class == IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE ?
114                 0 : mgmt_class;
115 }
116
117 static int get_spl_qp_index(enum ib_qp_type qp_type)
118 {
119         switch (qp_type)
120         {
121         case IB_QPT_SMI:
122                 return 0;
123         case IB_QPT_GSI:
124                 return 1;
125         default:
126                 return -1;
127         }
128 }
129
130 static int vendor_class_index(u8 mgmt_class)
131 {
132         return mgmt_class - IB_MGMT_CLASS_VENDOR_RANGE2_START;
133 }
134
135 static int is_vendor_class(u8 mgmt_class)
136 {
137         if ((mgmt_class < IB_MGMT_CLASS_VENDOR_RANGE2_START) ||
138             (mgmt_class > IB_MGMT_CLASS_VENDOR_RANGE2_END))
139                 return 0;
140         return 1;
141 }
142
143 static int is_vendor_oui(char *oui)
144 {
145         if (oui[0] || oui[1] || oui[2])
146                 return 1;
147         return 0;
148 }
149
150 static int is_vendor_method_in_use(
151                 struct ib_mad_mgmt_vendor_class *vendor_class,
152                 struct ib_mad_reg_req *mad_reg_req)
153 {
154         struct ib_mad_mgmt_method_table *method;
155         int i;
156
157         for (i = 0; i < MAX_MGMT_OUI; i++) {
158                 if (!memcmp(vendor_class->oui[i], mad_reg_req->oui, 3)) {
159                         method = vendor_class->method_table[i];
160                         if (method) {
161                                 if (method_in_use(&method, mad_reg_req))
162                                         return 1;
163                                 else
164                                         break;
165                         }
166                 }
167         }
168         return 0;
169 }
170
171 /*
172  * ib_register_mad_agent - Register to send/receive MADs
173  */
174 struct ib_mad_agent *ib_register_mad_agent(struct ib_device *device,
175                                            u8 port_num,
176                                            enum ib_qp_type qp_type,
177                                            struct ib_mad_reg_req *mad_reg_req,
178                                            u8 rmpp_version,
179                                            ib_mad_send_handler send_handler,
180                                            ib_mad_recv_handler recv_handler,
181                                            void *context)
182 {
183         struct ib_mad_port_private *port_priv;
184         struct ib_mad_agent *ret = ERR_PTR(-EINVAL);
185         struct ib_mad_agent_private *mad_agent_priv;
186         struct ib_mad_reg_req *reg_req = NULL;
187         struct ib_mad_mgmt_class_table *class;
188         struct ib_mad_mgmt_vendor_class_table *vendor;
189         struct ib_mad_mgmt_vendor_class *vendor_class;
190         struct ib_mad_mgmt_method_table *method;
191         int ret2, qpn;
192         unsigned long flags;
193         u8 mgmt_class, vclass;
194
195         /* Validate parameters */
196         qpn = get_spl_qp_index(qp_type);
197         if (qpn == -1)
198                 goto error1;
199
200         if (rmpp_version)
201                 goto error1;    /* XXX: until RMPP implemented */
202
203         /* Validate MAD registration request if supplied */
204         if (mad_reg_req) {
205                 if (mad_reg_req->mgmt_class_version >= MAX_MGMT_VERSION)
206                         goto error1;
207                 if (!recv_handler)
208                         goto error1;
209                 if (mad_reg_req->mgmt_class >= MAX_MGMT_CLASS) {
210                         /*
211                          * IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE is the only
212                          * one in this range currently allowed
213                          */
214                         if (mad_reg_req->mgmt_class !=
215                             IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE)
216                                 goto error1;
217                 } else if (mad_reg_req->mgmt_class == 0) {
218                         /*
219                          * Class 0 is reserved in IBA and is used for
220                          * aliasing of IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE
221                          */
222                         goto error1;
223                 } else if (is_vendor_class(mad_reg_req->mgmt_class)) {
224                         /*
225                          * If class is in "new" vendor range,
226                          * ensure supplied OUI is not zero
227                          */
228                         if (!is_vendor_oui(mad_reg_req->oui))
229                                 goto error1;
230                 }
231                 /* Make sure class supplied is consistent with QP type */
232                 if (qp_type == IB_QPT_SMI) {
233                         if ((mad_reg_req->mgmt_class !=
234                                         IB_MGMT_CLASS_SUBN_LID_ROUTED) &&
235                             (mad_reg_req->mgmt_class !=
236                                         IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE))
237                                 goto error1;
238                 } else {
239                         if ((mad_reg_req->mgmt_class ==
240                                         IB_MGMT_CLASS_SUBN_LID_ROUTED) ||
241                             (mad_reg_req->mgmt_class ==
242                                         IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE))
243                                 goto error1;
244                 }
245         } else {
246                 /* No registration request supplied */
247                 if (!send_handler)
248                         goto error1;
249         }
250
251         /* Validate device and port */
252         port_priv = ib_get_mad_port(device, port_num);
253         if (!port_priv) {
254                 ret = ERR_PTR(-ENODEV);
255                 goto error1;
256         }
257
258         /* Allocate structures */
259         mad_agent_priv = kmalloc(sizeof *mad_agent_priv, GFP_KERNEL);
260         if (!mad_agent_priv) {
261                 ret = ERR_PTR(-ENOMEM);
262                 goto error1;
263         }
264
265         if (mad_reg_req) {
266                 reg_req = kmalloc(sizeof *reg_req, GFP_KERNEL);
267                 if (!reg_req) {
268                         ret = ERR_PTR(-ENOMEM);
269                         goto error2;
270                 }
271                 /* Make a copy of the MAD registration request */
272                 memcpy(reg_req, mad_reg_req, sizeof *reg_req);
273         }
274
275         /* Now, fill in the various structures */
276         memset(mad_agent_priv, 0, sizeof *mad_agent_priv);
277         mad_agent_priv->qp_info = &port_priv->qp_info[qpn];
278         mad_agent_priv->reg_req = reg_req;
279         mad_agent_priv->rmpp_version = rmpp_version;
280         mad_agent_priv->agent.device = device;
281         mad_agent_priv->agent.recv_handler = recv_handler;
282         mad_agent_priv->agent.send_handler = send_handler;
283         mad_agent_priv->agent.context = context;
284         mad_agent_priv->agent.qp = port_priv->qp_info[qpn].qp;
285         mad_agent_priv->agent.port_num = port_num;
286
287         spin_lock_irqsave(&port_priv->reg_lock, flags);
288         mad_agent_priv->agent.hi_tid = ++ib_mad_client_id;
289
290         /*
291          * Make sure MAD registration (if supplied)
292          * is non overlapping with any existing ones
293          */
294         if (mad_reg_req) {
295                 mgmt_class = convert_mgmt_class(mad_reg_req->mgmt_class);
296                 if (!is_vendor_class(mgmt_class)) {
297                         class = port_priv->version[mad_reg_req->
298                                                    mgmt_class_version].class;
299                         if (class) {
300                                 method = class->method_table[mgmt_class];
301                                 if (method) {
302                                         if (method_in_use(&method,
303                                                            mad_reg_req))
304                                                 goto error3;
305                                 }
306                         }
307                         ret2 = add_nonoui_reg_req(mad_reg_req, mad_agent_priv,
308                                                   mgmt_class);
309                 } else {
310                         /* "New" vendor class range */
311                         vendor = port_priv->version[mad_reg_req->
312                                                     mgmt_class_version].vendor;
313                         if (vendor) {
314                                 vclass = vendor_class_index(mgmt_class);
315                                 vendor_class = vendor->vendor_class[vclass];
316                                 if (vendor_class) {
317                                         if (is_vendor_method_in_use(
318                                                         vendor_class,
319                                                         mad_reg_req))
320                                                 goto error3;
321                                 }
322                         }
323                         ret2 = add_oui_reg_req(mad_reg_req, mad_agent_priv);
324                 }
325                 if (ret2) {
326                         ret = ERR_PTR(ret2);
327                         goto error3;
328                 }
329         }
330
331         /* Add mad agent into port's agent list */
332         list_add_tail(&mad_agent_priv->agent_list, &port_priv->agent_list);
333         spin_unlock_irqrestore(&port_priv->reg_lock, flags);
334
335         spin_lock_init(&mad_agent_priv->lock);
336         INIT_LIST_HEAD(&mad_agent_priv->send_list);
337         INIT_LIST_HEAD(&mad_agent_priv->wait_list);
338         INIT_WORK(&mad_agent_priv->timed_work, timeout_sends, mad_agent_priv);
339         INIT_LIST_HEAD(&mad_agent_priv->local_list);
340         INIT_WORK(&mad_agent_priv->local_work, local_completions,
341                    mad_agent_priv);
342         INIT_LIST_HEAD(&mad_agent_priv->canceled_list);
343         INIT_WORK(&mad_agent_priv->canceled_work, cancel_sends, mad_agent_priv);
344         atomic_set(&mad_agent_priv->refcount, 1);
345         init_waitqueue_head(&mad_agent_priv->wait);
346
347         return &mad_agent_priv->agent;
348
349 error3:
350         spin_unlock_irqrestore(&port_priv->reg_lock, flags);
351         kfree(reg_req);
352 error2:
353         kfree(mad_agent_priv);
354 error1:
355         return ret;
356 }
357 EXPORT_SYMBOL(ib_register_mad_agent);
358
359 static inline int is_snooping_sends(int mad_snoop_flags)
360 {
361         return (mad_snoop_flags &
362                 (/*IB_MAD_SNOOP_POSTED_SENDS |
363                  IB_MAD_SNOOP_RMPP_SENDS |*/
364                  IB_MAD_SNOOP_SEND_COMPLETIONS /*|
365                  IB_MAD_SNOOP_RMPP_SEND_COMPLETIONS*/));
366 }
367
368 static inline int is_snooping_recvs(int mad_snoop_flags)
369 {
370         return (mad_snoop_flags &
371                 (IB_MAD_SNOOP_RECVS /*|
372                  IB_MAD_SNOOP_RMPP_RECVS*/));
373 }
374
375 static int register_snoop_agent(struct ib_mad_qp_info *qp_info,
376                                 struct ib_mad_snoop_private *mad_snoop_priv)
377 {
378         struct ib_mad_snoop_private **new_snoop_table;
379         unsigned long flags;
380         int i;
381
382         spin_lock_irqsave(&qp_info->snoop_lock, flags);
383         /* Check for empty slot in array. */
384         for (i = 0; i < qp_info->snoop_table_size; i++)
385                 if (!qp_info->snoop_table[i])
386                         break;
387
388         if (i == qp_info->snoop_table_size) {
389                 /* Grow table. */
390                 new_snoop_table = kmalloc(sizeof mad_snoop_priv *
391                                           qp_info->snoop_table_size + 1,
392                                           GFP_ATOMIC);
393                 if (!new_snoop_table) {
394                         i = -ENOMEM;
395                         goto out;
396                 }
397                 if (qp_info->snoop_table) {
398                         memcpy(new_snoop_table, qp_info->snoop_table,
399                                sizeof mad_snoop_priv *
400                                qp_info->snoop_table_size);
401                         kfree(qp_info->snoop_table);
402                 }
403                 qp_info->snoop_table = new_snoop_table;
404                 qp_info->snoop_table_size++;
405         }
406         qp_info->snoop_table[i] = mad_snoop_priv;
407         atomic_inc(&qp_info->snoop_count);
408 out:
409         spin_unlock_irqrestore(&qp_info->snoop_lock, flags);
410         return i;
411 }
412
413 struct ib_mad_agent *ib_register_mad_snoop(struct ib_device *device,
414                                            u8 port_num,
415                                            enum ib_qp_type qp_type,
416                                            int mad_snoop_flags,
417                                            ib_mad_snoop_handler snoop_handler,
418                                            ib_mad_recv_handler recv_handler,
419                                            void *context)
420 {
421         struct ib_mad_port_private *port_priv;
422         struct ib_mad_agent *ret;
423         struct ib_mad_snoop_private *mad_snoop_priv;
424         int qpn;
425
426         /* Validate parameters */
427         if ((is_snooping_sends(mad_snoop_flags) && !snoop_handler) ||
428             (is_snooping_recvs(mad_snoop_flags) && !recv_handler)) {
429                 ret = ERR_PTR(-EINVAL);
430                 goto error1;
431         }
432         qpn = get_spl_qp_index(qp_type);
433         if (qpn == -1) {
434                 ret = ERR_PTR(-EINVAL);
435                 goto error1;
436         }
437         port_priv = ib_get_mad_port(device, port_num);
438         if (!port_priv) {
439                 ret = ERR_PTR(-ENODEV);
440                 goto error1;
441         }
442         /* Allocate structures */
443         mad_snoop_priv = kmalloc(sizeof *mad_snoop_priv, GFP_KERNEL);
444         if (!mad_snoop_priv) {
445                 ret = ERR_PTR(-ENOMEM);
446                 goto error1;
447         }
448
449         /* Now, fill in the various structures */
450         memset(mad_snoop_priv, 0, sizeof *mad_snoop_priv);
451         mad_snoop_priv->qp_info = &port_priv->qp_info[qpn];
452         mad_snoop_priv->agent.device = device;
453         mad_snoop_priv->agent.recv_handler = recv_handler;
454         mad_snoop_priv->agent.snoop_handler = snoop_handler;
455         mad_snoop_priv->agent.context = context;
456         mad_snoop_priv->agent.qp = port_priv->qp_info[qpn].qp;
457         mad_snoop_priv->agent.port_num = port_num;
458         mad_snoop_priv->mad_snoop_flags = mad_snoop_flags;
459         init_waitqueue_head(&mad_snoop_priv->wait);
460         mad_snoop_priv->snoop_index = register_snoop_agent(
461                                                 &port_priv->qp_info[qpn],
462                                                 mad_snoop_priv);
463         if (mad_snoop_priv->snoop_index < 0) {
464                 ret = ERR_PTR(mad_snoop_priv->snoop_index);
465                 goto error2;
466         }
467
468         atomic_set(&mad_snoop_priv->refcount, 1);
469         return &mad_snoop_priv->agent;
470
471 error2:
472         kfree(mad_snoop_priv);
473 error1:
474         return ret;
475 }
476 EXPORT_SYMBOL(ib_register_mad_snoop);
477
478 static void unregister_mad_agent(struct ib_mad_agent_private *mad_agent_priv)
479 {
480         struct ib_mad_port_private *port_priv;
481         unsigned long flags;
482
483         /* Note that we could still be handling received MADs */
484
485         /*
486          * Canceling all sends results in dropping received response
487          * MADs, preventing us from queuing additional work
488          */
489         cancel_mads(mad_agent_priv);
490
491         port_priv = mad_agent_priv->qp_info->port_priv;
492
493         cancel_delayed_work(&mad_agent_priv->timed_work);
494         flush_workqueue(port_priv->wq);
495
496         spin_lock_irqsave(&port_priv->reg_lock, flags);
497         remove_mad_reg_req(mad_agent_priv);
498         list_del(&mad_agent_priv->agent_list);
499         spin_unlock_irqrestore(&port_priv->reg_lock, flags);
500
501         /* XXX: Cleanup pending RMPP receives for this agent */
502
503         atomic_dec(&mad_agent_priv->refcount);
504         wait_event(mad_agent_priv->wait,
505                    !atomic_read(&mad_agent_priv->refcount));
506
507         if (mad_agent_priv->reg_req)
508                 kfree(mad_agent_priv->reg_req);
509         kfree(mad_agent_priv);
510 }
511
512 static void unregister_mad_snoop(struct ib_mad_snoop_private *mad_snoop_priv)
513 {
514         struct ib_mad_qp_info *qp_info;
515         unsigned long flags;
516
517         qp_info = mad_snoop_priv->qp_info;
518         spin_lock_irqsave(&qp_info->snoop_lock, flags);
519         qp_info->snoop_table[mad_snoop_priv->snoop_index] = NULL;
520         atomic_dec(&qp_info->snoop_count);
521         spin_unlock_irqrestore(&qp_info->snoop_lock, flags);
522
523         atomic_dec(&mad_snoop_priv->refcount);
524         wait_event(mad_snoop_priv->wait,
525                    !atomic_read(&mad_snoop_priv->refcount));
526
527         kfree(mad_snoop_priv);
528 }
529
530 /*
531  * ib_unregister_mad_agent - Unregisters a client from using MAD services
532  */
533 int ib_unregister_mad_agent(struct ib_mad_agent *mad_agent)
534 {
535         struct ib_mad_agent_private *mad_agent_priv;
536         struct ib_mad_snoop_private *mad_snoop_priv;
537
538         /* If the TID is zero, the agent can only snoop. */
539         if (mad_agent->hi_tid) {
540                 mad_agent_priv = container_of(mad_agent,
541                                               struct ib_mad_agent_private,
542                                               agent);
543                 unregister_mad_agent(mad_agent_priv);
544         } else {
545                 mad_snoop_priv = container_of(mad_agent,
546                                               struct ib_mad_snoop_private,
547                                               agent);
548                 unregister_mad_snoop(mad_snoop_priv);
549         }
550         return 0;
551 }
552 EXPORT_SYMBOL(ib_unregister_mad_agent);
553
554 static void dequeue_mad(struct ib_mad_list_head *mad_list)
555 {
556         struct ib_mad_queue *mad_queue;
557         unsigned long flags;
558
559         BUG_ON(!mad_list->mad_queue);
560         mad_queue = mad_list->mad_queue;
561         spin_lock_irqsave(&mad_queue->lock, flags);
562         list_del(&mad_list->list);
563         mad_queue->count--;
564         spin_unlock_irqrestore(&mad_queue->lock, flags);
565 }
566
567 static void snoop_send(struct ib_mad_qp_info *qp_info,
568                        struct ib_send_wr *send_wr,
569                        struct ib_mad_send_wc *mad_send_wc,
570                        int mad_snoop_flags)
571 {
572         struct ib_mad_snoop_private *mad_snoop_priv;
573         unsigned long flags;
574         int i;
575
576         spin_lock_irqsave(&qp_info->snoop_lock, flags);
577         for (i = 0; i < qp_info->snoop_table_size; i++) {
578                 mad_snoop_priv = qp_info->snoop_table[i];
579                 if (!mad_snoop_priv ||
580                     !(mad_snoop_priv->mad_snoop_flags & mad_snoop_flags))
581                         continue;
582
583                 atomic_inc(&mad_snoop_priv->refcount);
584                 spin_unlock_irqrestore(&qp_info->snoop_lock, flags);
585                 mad_snoop_priv->agent.snoop_handler(&mad_snoop_priv->agent,
586                                                     send_wr, mad_send_wc);
587                 if (atomic_dec_and_test(&mad_snoop_priv->refcount))
588                         wake_up(&mad_snoop_priv->wait);
589                 spin_lock_irqsave(&qp_info->snoop_lock, flags);
590         }
591         spin_unlock_irqrestore(&qp_info->snoop_lock, flags);
592 }
593
594 static void snoop_recv(struct ib_mad_qp_info *qp_info,
595                        struct ib_mad_recv_wc *mad_recv_wc,
596                        int mad_snoop_flags)
597 {
598         struct ib_mad_snoop_private *mad_snoop_priv;
599         unsigned long flags;
600         int i;
601
602         spin_lock_irqsave(&qp_info->snoop_lock, flags);
603         for (i = 0; i < qp_info->snoop_table_size; i++) {
604                 mad_snoop_priv = qp_info->snoop_table[i];
605                 if (!mad_snoop_priv ||
606                     !(mad_snoop_priv->mad_snoop_flags & mad_snoop_flags))
607                         continue;
608
609                 atomic_inc(&mad_snoop_priv->refcount);
610                 spin_unlock_irqrestore(&qp_info->snoop_lock, flags);
611                 mad_snoop_priv->agent.recv_handler(&mad_snoop_priv->agent,
612                                                    mad_recv_wc);
613                 if (atomic_dec_and_test(&mad_snoop_priv->refcount))
614                         wake_up(&mad_snoop_priv->wait);
615                 spin_lock_irqsave(&qp_info->snoop_lock, flags);
616         }
617         spin_unlock_irqrestore(&qp_info->snoop_lock, flags);
618 }
619
620 static void build_smp_wc(u64 wr_id, u16 slid, u16 pkey_index, u8 port_num,
621                          struct ib_wc *wc)
622 {
623         memset(wc, 0, sizeof *wc);
624         wc->wr_id = wr_id;
625         wc->status = IB_WC_SUCCESS;
626         wc->opcode = IB_WC_RECV;
627         wc->pkey_index = pkey_index;
628         wc->byte_len = sizeof(struct ib_mad) + sizeof(struct ib_grh);
629         wc->src_qp = IB_QP0;
630         wc->qp_num = IB_QP0;
631         wc->slid = slid;
632         wc->sl = 0;
633         wc->dlid_path_bits = 0;
634         wc->port_num = port_num;
635 }
636
637 /*
638  * Return 0 if SMP is to be sent
639  * Return 1 if SMP was consumed locally (whether or not solicited)
640  * Return < 0 if error
641  */
642 static int handle_outgoing_dr_smp(struct ib_mad_agent_private *mad_agent_priv,
643                                   struct ib_smp *smp,
644                                   struct ib_send_wr *send_wr)
645 {
646         int ret, solicited;
647         unsigned long flags;
648         struct ib_mad_local_private *local;
649         struct ib_mad_private *mad_priv;
650         struct ib_mad_port_private *port_priv;
651         struct ib_mad_agent_private *recv_mad_agent = NULL;
652         struct ib_device *device = mad_agent_priv->agent.device;
653         u8 port_num = mad_agent_priv->agent.port_num;
654         struct ib_wc mad_wc;
655
656         if (!smi_handle_dr_smp_send(smp, device->node_type, port_num)) {
657                 ret = -EINVAL;
658                 printk(KERN_ERR PFX "Invalid directed route\n");
659                 goto out;
660         }
661         /* Check to post send on QP or process locally */
662         ret = smi_check_local_dr_smp(smp, device, port_num);
663         if (!ret || !device->process_mad)
664                 goto out;
665
666         local = kmalloc(sizeof *local, GFP_ATOMIC);
667         if (!local) {
668                 ret = -ENOMEM;
669                 printk(KERN_ERR PFX "No memory for ib_mad_local_private\n");
670                 goto out;
671         }
672         local->mad_priv = NULL;
673         local->recv_mad_agent = NULL;
674         mad_priv = kmem_cache_alloc(ib_mad_cache, GFP_ATOMIC);
675         if (!mad_priv) {
676                 ret = -ENOMEM;
677                 printk(KERN_ERR PFX "No memory for local response MAD\n");
678                 kfree(local);
679                 goto out;
680         }
681
682         build_smp_wc(send_wr->wr_id, smp->dr_slid, send_wr->wr.ud.pkey_index,
683                      send_wr->wr.ud.port_num, &mad_wc);
684
685         /* No GRH for DR SMP */
686         ret = device->process_mad(device, 0, port_num, &mad_wc, NULL,
687                                   (struct ib_mad *)smp,
688                                   (struct ib_mad *)&mad_priv->mad);
689         switch (ret)
690         {
691         case IB_MAD_RESULT_SUCCESS | IB_MAD_RESULT_REPLY:
692                 /*
693                  * See if response is solicited and
694                  * there is a recv handler
695                  */
696                 if (solicited_mad(&mad_priv->mad.mad) &&
697                     mad_agent_priv->agent.recv_handler) {
698                         local->mad_priv = mad_priv;
699                         local->recv_mad_agent = mad_agent_priv;
700                         /*
701                          * Reference MAD agent until receive
702                          * side of local completion handled
703                          */
704                         atomic_inc(&mad_agent_priv->refcount);
705                 } else
706                         kmem_cache_free(ib_mad_cache, mad_priv);
707                 break;
708         case IB_MAD_RESULT_SUCCESS | IB_MAD_RESULT_CONSUMED:
709                 kmem_cache_free(ib_mad_cache, mad_priv);
710                 break;
711         case IB_MAD_RESULT_SUCCESS:
712                 /* Treat like an incoming receive MAD */
713                 solicited = solicited_mad(&mad_priv->mad.mad);
714                 port_priv = ib_get_mad_port(mad_agent_priv->agent.device,
715                                             mad_agent_priv->agent.port_num);
716                 if (port_priv) {
717                         mad_priv->mad.mad.mad_hdr.tid =
718                                 ((struct ib_mad *)smp)->mad_hdr.tid;
719                         recv_mad_agent = find_mad_agent(port_priv,
720                                                        &mad_priv->mad.mad,
721                                                         solicited);
722                 }
723                 if (!port_priv || !recv_mad_agent) {
724                         kmem_cache_free(ib_mad_cache, mad_priv);
725                         kfree(local);
726                         ret = 0;
727                         goto out;
728                 }
729                 local->mad_priv = mad_priv;
730                 local->recv_mad_agent = recv_mad_agent;
731                 break;
732         default:
733                 kmem_cache_free(ib_mad_cache, mad_priv);
734                 kfree(local);
735                 ret = -EINVAL;
736                 goto out;
737         }
738
739         local->send_wr = *send_wr;
740         local->send_wr.sg_list = local->sg_list;
741         memcpy(local->sg_list, send_wr->sg_list,
742                sizeof *send_wr->sg_list * send_wr->num_sge);
743         local->send_wr.next = NULL;
744         local->tid = send_wr->wr.ud.mad_hdr->tid;
745         local->wr_id = send_wr->wr_id;
746         /* Reference MAD agent until send side of local completion handled */
747         atomic_inc(&mad_agent_priv->refcount);
748         /* Queue local completion to local list */
749         spin_lock_irqsave(&mad_agent_priv->lock, flags);
750         list_add_tail(&local->completion_list, &mad_agent_priv->local_list);
751         spin_unlock_irqrestore(&mad_agent_priv->lock, flags);
752         queue_work(mad_agent_priv->qp_info->port_priv->wq,
753                   &mad_agent_priv->local_work);
754         ret = 1;
755 out:
756         return ret;
757 }
758
759 static int ib_send_mad(struct ib_mad_agent_private *mad_agent_priv,
760                        struct ib_mad_send_wr_private *mad_send_wr)
761 {
762         struct ib_mad_qp_info *qp_info;
763         struct ib_send_wr *bad_send_wr;
764         unsigned long flags;
765         int ret;
766
767         /* Replace user's WR ID with our own to find WR upon completion */
768         qp_info = mad_agent_priv->qp_info;
769         mad_send_wr->wr_id = mad_send_wr->send_wr.wr_id;
770         mad_send_wr->send_wr.wr_id = (unsigned long)&mad_send_wr->mad_list;
771         mad_send_wr->mad_list.mad_queue = &qp_info->send_queue;
772
773         spin_lock_irqsave(&qp_info->send_queue.lock, flags);
774         if (qp_info->send_queue.count++ < qp_info->send_queue.max_active) {
775                 list_add_tail(&mad_send_wr->mad_list.list,
776                               &qp_info->send_queue.list);
777                 spin_unlock_irqrestore(&qp_info->send_queue.lock, flags);
778                 ret = ib_post_send(mad_agent_priv->agent.qp,
779                                    &mad_send_wr->send_wr, &bad_send_wr);
780                 if (ret) {
781                         printk(KERN_ERR PFX "ib_post_send failed: %d\n", ret);
782                         dequeue_mad(&mad_send_wr->mad_list);
783                 }
784         } else {
785                 list_add_tail(&mad_send_wr->mad_list.list,
786                               &qp_info->overflow_list);
787                 spin_unlock_irqrestore(&qp_info->send_queue.lock, flags);
788                 ret = 0;
789         }
790         return ret;
791 }
792
793 /*
794  * ib_post_send_mad - Posts MAD(s) to the send queue of the QP associated
795  *  with the registered client
796  */
797 int ib_post_send_mad(struct ib_mad_agent *mad_agent,
798                      struct ib_send_wr *send_wr,
799                      struct ib_send_wr **bad_send_wr)
800 {
801         int ret = -EINVAL;
802         struct ib_mad_agent_private *mad_agent_priv;
803
804         /* Validate supplied parameters */
805         if (!bad_send_wr)
806                 goto error1;
807
808         if (!mad_agent || !send_wr)
809                 goto error2;
810
811         if (!mad_agent->send_handler)
812                 goto error2;
813
814         mad_agent_priv = container_of(mad_agent,
815                                       struct ib_mad_agent_private,
816                                       agent);
817
818         /* Walk list of send WRs and post each on send list */
819         while (send_wr) {
820                 unsigned long                   flags;
821                 struct ib_send_wr               *next_send_wr;
822                 struct ib_mad_send_wr_private   *mad_send_wr;
823                 struct ib_smp                   *smp;
824
825                 /* Validate more parameters */
826                 if (send_wr->num_sge > IB_MAD_SEND_REQ_MAX_SG)
827                         goto error2;
828
829                 if (send_wr->wr.ud.timeout_ms && !mad_agent->recv_handler)
830                         goto error2;
831
832                 if (!send_wr->wr.ud.mad_hdr) {
833                         printk(KERN_ERR PFX "MAD header must be supplied "
834                                "in WR %p\n", send_wr);
835                         goto error2;
836                 }
837
838                 /*
839                  * Save pointer to next work request to post in case the
840                  * current one completes, and the user modifies the work
841                  * request associated with the completion
842                  */
843                 next_send_wr = (struct ib_send_wr *)send_wr->next;
844
845                 smp = (struct ib_smp *)send_wr->wr.ud.mad_hdr;
846                 if (smp->mgmt_class == IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE) {
847                         ret = handle_outgoing_dr_smp(mad_agent_priv, smp,
848                                                      send_wr);
849                         if (ret < 0)            /* error */
850                                 goto error2;
851                         else if (ret == 1)      /* locally consumed */
852                                 goto next;
853                 }
854
855                 /* Allocate MAD send WR tracking structure */
856                 mad_send_wr = kmalloc(sizeof *mad_send_wr, GFP_ATOMIC);
857                 if (!mad_send_wr) {
858                         printk(KERN_ERR PFX "No memory for "
859                                "ib_mad_send_wr_private\n");
860                         ret = -ENOMEM;
861                         goto error2;
862                 }
863
864                 mad_send_wr->send_wr = *send_wr;
865                 mad_send_wr->send_wr.sg_list = mad_send_wr->sg_list;
866                 memcpy(mad_send_wr->sg_list, send_wr->sg_list,
867                        sizeof *send_wr->sg_list * send_wr->num_sge);
868                 mad_send_wr->send_wr.next = NULL;
869                 mad_send_wr->tid = send_wr->wr.ud.mad_hdr->tid;
870                 mad_send_wr->agent = mad_agent;
871                 /* Timeout will be updated after send completes */
872                 mad_send_wr->timeout = msecs_to_jiffies(send_wr->wr.
873                                                         ud.timeout_ms);
874                 mad_send_wr->retry = 0;
875                 /* One reference for each work request to QP + response */
876                 mad_send_wr->refcount = 1 + (mad_send_wr->timeout > 0);
877                 mad_send_wr->status = IB_WC_SUCCESS;
878
879                 /* Reference MAD agent until send completes */
880                 atomic_inc(&mad_agent_priv->refcount);
881                 spin_lock_irqsave(&mad_agent_priv->lock, flags);
882                 list_add_tail(&mad_send_wr->agent_list,
883                               &mad_agent_priv->send_list);
884                 spin_unlock_irqrestore(&mad_agent_priv->lock, flags);
885
886                 ret = ib_send_mad(mad_agent_priv, mad_send_wr);
887                 if (ret) {
888                         /* Fail send request */
889                         spin_lock_irqsave(&mad_agent_priv->lock, flags);
890                         list_del(&mad_send_wr->agent_list);
891                         spin_unlock_irqrestore(&mad_agent_priv->lock, flags);
892                         atomic_dec(&mad_agent_priv->refcount);
893                         goto error2;
894                 }
895 next:
896                 send_wr = next_send_wr;
897         }
898         return 0;
899
900 error2:
901         *bad_send_wr = send_wr;
902 error1:
903         return ret;
904 }
905 EXPORT_SYMBOL(ib_post_send_mad);
906
907 /*
908  * ib_free_recv_mad - Returns data buffers used to receive
909  *  a MAD to the access layer
910  */
911 void ib_free_recv_mad(struct ib_mad_recv_wc *mad_recv_wc)
912 {
913         struct ib_mad_recv_buf *entry;
914         struct ib_mad_private_header *mad_priv_hdr;
915         struct ib_mad_private *priv;
916
917         mad_priv_hdr = container_of(mad_recv_wc,
918                                     struct ib_mad_private_header,
919                                     recv_wc);
920         priv = container_of(mad_priv_hdr, struct ib_mad_private, header);
921
922         /*
923          * Walk receive buffer list associated with this WC
924          * No need to remove them from list of receive buffers
925          */
926         list_for_each_entry(entry, &mad_recv_wc->recv_buf.list, list) {
927                 /* Free previous receive buffer */
928                 kmem_cache_free(ib_mad_cache, priv);
929                 mad_priv_hdr = container_of(mad_recv_wc,
930                                             struct ib_mad_private_header,
931                                             recv_wc);
932                 priv = container_of(mad_priv_hdr, struct ib_mad_private,
933                                     header);
934         }
935
936         /* Free last buffer */
937         kmem_cache_free(ib_mad_cache, priv);
938 }
939 EXPORT_SYMBOL(ib_free_recv_mad);
940
941 void ib_coalesce_recv_mad(struct ib_mad_recv_wc *mad_recv_wc,
942                           void *buf)
943 {
944         printk(KERN_ERR PFX "ib_coalesce_recv_mad() not implemented yet\n");
945 }
946 EXPORT_SYMBOL(ib_coalesce_recv_mad);
947
948 struct ib_mad_agent *ib_redirect_mad_qp(struct ib_qp *qp,
949                                         u8 rmpp_version,
950                                         ib_mad_send_handler send_handler,
951                                         ib_mad_recv_handler recv_handler,
952                                         void *context)
953 {
954         return ERR_PTR(-EINVAL);        /* XXX: for now */
955 }
956 EXPORT_SYMBOL(ib_redirect_mad_qp);
957
958 int ib_process_mad_wc(struct ib_mad_agent *mad_agent,
959                       struct ib_wc *wc)
960 {
961         printk(KERN_ERR PFX "ib_process_mad_wc() not implemented yet\n");
962         return 0;
963 }
964 EXPORT_SYMBOL(ib_process_mad_wc);
965
966 static int method_in_use(struct ib_mad_mgmt_method_table **method,
967                          struct ib_mad_reg_req *mad_reg_req)
968 {
969         int i;
970
971         for (i = find_first_bit(mad_reg_req->method_mask, IB_MGMT_MAX_METHODS);
972              i < IB_MGMT_MAX_METHODS;
973              i = find_next_bit(mad_reg_req->method_mask, IB_MGMT_MAX_METHODS,
974                                1+i)) {
975                 if ((*method)->agent[i]) {
976                         printk(KERN_ERR PFX "Method %d already in use\n", i);
977                         return -EINVAL;
978                 }
979         }
980         return 0;
981 }
982
983 static int allocate_method_table(struct ib_mad_mgmt_method_table **method)
984 {
985         /* Allocate management method table */
986         *method = kmalloc(sizeof **method, GFP_ATOMIC);
987         if (!*method) {
988                 printk(KERN_ERR PFX "No memory for "
989                        "ib_mad_mgmt_method_table\n");
990                 return -ENOMEM;
991         }
992         /* Clear management method table */
993         memset(*method, 0, sizeof **method);
994
995         return 0;
996 }
997
998 /*
999  * Check to see if there are any methods still in use
1000  */
1001 static int check_method_table(struct ib_mad_mgmt_method_table *method)
1002 {
1003         int i;
1004
1005         for (i = 0; i < IB_MGMT_MAX_METHODS; i++)
1006                 if (method->agent[i])
1007                         return 1;
1008         return 0;
1009 }
1010
1011 /*
1012  * Check to see if there are any method tables for this class still in use
1013  */
1014 static int check_class_table(struct ib_mad_mgmt_class_table *class)
1015 {
1016         int i;
1017
1018         for (i = 0; i < MAX_MGMT_CLASS; i++)
1019                 if (class->method_table[i])
1020                         return 1;
1021         return 0;
1022 }
1023
1024 static int check_vendor_class(struct ib_mad_mgmt_vendor_class *vendor_class)
1025 {
1026         int i;
1027
1028         for (i = 0; i < MAX_MGMT_OUI; i++)
1029                 if (vendor_class->method_table[i])
1030                         return 1;
1031         return 0;
1032 }
1033
1034 static int find_vendor_oui(struct ib_mad_mgmt_vendor_class *vendor_class,
1035                            char *oui)
1036 {
1037         int i;
1038
1039         for (i = 0; i < MAX_MGMT_OUI; i++)
1040                 /* Is there matching OUI for this vendor class ? */
1041                 if (!memcmp(vendor_class->oui[i], oui, 3))
1042                         return i;
1043
1044         return -1;
1045 }
1046
1047 static int check_vendor_table(struct ib_mad_mgmt_vendor_class_table *vendor)
1048 {
1049         int i;
1050
1051         for (i = 0; i < MAX_MGMT_VENDOR_RANGE2; i++)
1052                 if (vendor->vendor_class[i])
1053                         return 1;
1054
1055         return 0;
1056 }
1057
1058 static void remove_methods_mad_agent(struct ib_mad_mgmt_method_table *method,
1059                                      struct ib_mad_agent_private *agent)
1060 {
1061         int i;
1062
1063         /* Remove any methods for this mad agent */
1064         for (i = 0; i < IB_MGMT_MAX_METHODS; i++) {
1065                 if (method->agent[i] == agent) {
1066                         method->agent[i] = NULL;
1067                 }
1068         }
1069 }
1070
1071 static int add_nonoui_reg_req(struct ib_mad_reg_req *mad_reg_req,
1072                               struct ib_mad_agent_private *agent_priv,
1073                               u8 mgmt_class)
1074 {
1075         struct ib_mad_port_private *port_priv;
1076         struct ib_mad_mgmt_class_table **class;
1077         struct ib_mad_mgmt_method_table **method;
1078         int i, ret;
1079
1080         port_priv = agent_priv->qp_info->port_priv;
1081         class = &port_priv->version[mad_reg_req->mgmt_class_version].class;
1082         if (!*class) {
1083                 /* Allocate management class table for "new" class version */
1084                 *class = kmalloc(sizeof **class, GFP_ATOMIC);
1085                 if (!*class) {
1086                         printk(KERN_ERR PFX "No memory for "
1087                                "ib_mad_mgmt_class_table\n");
1088                         ret = -ENOMEM;
1089                         goto error1;
1090                 }
1091                 /* Clear management class table */
1092                 memset(*class, 0, sizeof(**class));
1093                 /* Allocate method table for this management class */
1094                 method = &(*class)->method_table[mgmt_class];
1095                 if ((ret = allocate_method_table(method)))
1096                         goto error2;
1097         } else {
1098                 method = &(*class)->method_table[mgmt_class];
1099                 if (!*method) {
1100                         /* Allocate method table for this management class */
1101                         if ((ret = allocate_method_table(method)))
1102                                 goto error1;
1103                 }
1104         }
1105
1106         /* Now, make sure methods are not already in use */
1107         if (method_in_use(method, mad_reg_req))
1108                 goto error3;
1109
1110         /* Finally, add in methods being registered */
1111         for (i = find_first_bit(mad_reg_req->method_mask,
1112                                 IB_MGMT_MAX_METHODS);
1113              i < IB_MGMT_MAX_METHODS;
1114              i = find_next_bit(mad_reg_req->method_mask, IB_MGMT_MAX_METHODS,
1115                                1+i)) {
1116                 (*method)->agent[i] = agent_priv;
1117         }
1118         return 0;
1119
1120 error3:
1121         /* Remove any methods for this mad agent */
1122         remove_methods_mad_agent(*method, agent_priv);
1123         /* Now, check to see if there are any methods in use */
1124         if (!check_method_table(*method)) {
1125                 /* If not, release management method table */
1126                 kfree(*method);
1127                 *method = NULL;
1128         }
1129         ret = -EINVAL;
1130         goto error1;
1131 error2:
1132         kfree(*class);
1133         *class = NULL;
1134 error1:
1135         return ret;
1136 }
1137
1138 static int add_oui_reg_req(struct ib_mad_reg_req *mad_reg_req,
1139                            struct ib_mad_agent_private *agent_priv)
1140 {
1141         struct ib_mad_port_private *port_priv;
1142         struct ib_mad_mgmt_vendor_class_table **vendor_table;
1143         struct ib_mad_mgmt_vendor_class_table *vendor = NULL;
1144         struct ib_mad_mgmt_vendor_class *vendor_class = NULL;
1145         struct ib_mad_mgmt_method_table **method;
1146         int i, ret = -ENOMEM;
1147         u8 vclass;
1148
1149         /* "New" vendor (with OUI) class */
1150         vclass = vendor_class_index(mad_reg_req->mgmt_class);
1151         port_priv = agent_priv->qp_info->port_priv;
1152         vendor_table = &port_priv->version[
1153                                 mad_reg_req->mgmt_class_version].vendor;
1154         if (!*vendor_table) {
1155                 /* Allocate mgmt vendor class table for "new" class version */
1156                 vendor = kmalloc(sizeof *vendor, GFP_ATOMIC);
1157                 if (!vendor) {
1158                         printk(KERN_ERR PFX "No memory for "
1159                                "ib_mad_mgmt_vendor_class_table\n");
1160                         goto error1;
1161                 }
1162                 /* Clear management vendor class table */
1163                 memset(vendor, 0, sizeof(*vendor));
1164                 *vendor_table = vendor;
1165         }
1166         if (!(*vendor_table)->vendor_class[vclass]) {
1167                 /* Allocate table for this management vendor class */
1168                 vendor_class = kmalloc(sizeof *vendor_class, GFP_ATOMIC);
1169                 if (!vendor_class) {
1170                         printk(KERN_ERR PFX "No memory for "
1171                                "ib_mad_mgmt_vendor_class\n");
1172                         goto error2;
1173                 }
1174                 memset(vendor_class, 0, sizeof(*vendor_class));
1175                 (*vendor_table)->vendor_class[vclass] = vendor_class;
1176         }
1177         for (i = 0; i < MAX_MGMT_OUI; i++) {
1178                 /* Is there matching OUI for this vendor class ? */
1179                 if (!memcmp((*vendor_table)->vendor_class[vclass]->oui[i],
1180                             mad_reg_req->oui, 3)) {
1181                         method = &(*vendor_table)->vendor_class[
1182                                                 vclass]->method_table[i];
1183                         BUG_ON(!*method);
1184                         goto check_in_use;
1185                 }
1186         }
1187         for (i = 0; i < MAX_MGMT_OUI; i++) {
1188                 /* OUI slot available ? */
1189                 if (!is_vendor_oui((*vendor_table)->vendor_class[
1190                                 vclass]->oui[i])) {
1191                         method = &(*vendor_table)->vendor_class[
1192                                 vclass]->method_table[i];
1193                         BUG_ON(*method);
1194                         /* Allocate method table for this OUI */
1195                         if ((ret = allocate_method_table(method)))
1196                                 goto error3;
1197                         memcpy((*vendor_table)->vendor_class[vclass]->oui[i],
1198                                mad_reg_req->oui, 3);
1199                         goto check_in_use;
1200                 }
1201         }
1202         printk(KERN_ERR PFX "All OUI slots in use\n");
1203         goto error3;
1204
1205 check_in_use:
1206         /* Now, make sure methods are not already in use */
1207         if (method_in_use(method, mad_reg_req))
1208                 goto error4;
1209
1210         /* Finally, add in methods being registered */
1211         for (i = find_first_bit(mad_reg_req->method_mask,
1212                                 IB_MGMT_MAX_METHODS);
1213              i < IB_MGMT_MAX_METHODS;
1214              i = find_next_bit(mad_reg_req->method_mask, IB_MGMT_MAX_METHODS,
1215                                1+i)) {
1216                 (*method)->agent[i] = agent_priv;
1217         }
1218         return 0;
1219
1220 error4:
1221         /* Remove any methods for this mad agent */
1222         remove_methods_mad_agent(*method, agent_priv);
1223         /* Now, check to see if there are any methods in use */
1224         if (!check_method_table(*method)) {
1225                 /* If not, release management method table */
1226                 kfree(*method);
1227                 *method = NULL;
1228         }
1229         ret = -EINVAL;
1230 error3:
1231         if (vendor_class) {
1232                 (*vendor_table)->vendor_class[vclass] = NULL;
1233                 kfree(vendor_class);
1234         }
1235 error2:
1236         if (vendor) {
1237                 *vendor_table = NULL;
1238                 kfree(vendor);
1239         }
1240 error1:
1241         return ret;
1242 }
1243
1244 static void remove_mad_reg_req(struct ib_mad_agent_private *agent_priv)
1245 {
1246         struct ib_mad_port_private *port_priv;
1247         struct ib_mad_mgmt_class_table *class;
1248         struct ib_mad_mgmt_method_table *method;
1249         struct ib_mad_mgmt_vendor_class_table *vendor;
1250         struct ib_mad_mgmt_vendor_class *vendor_class;
1251         int index;
1252         u8 mgmt_class;
1253
1254         /*
1255          * Was MAD registration request supplied
1256          * with original registration ?
1257          */
1258         if (!agent_priv->reg_req) {
1259                 goto out;
1260         }
1261
1262         port_priv = agent_priv->qp_info->port_priv;
1263         mgmt_class = convert_mgmt_class(agent_priv->reg_req->mgmt_class);
1264         class = port_priv->version[
1265                         agent_priv->reg_req->mgmt_class_version].class;
1266         if (!class)
1267                 goto vendor_check;
1268
1269         method = class->method_table[mgmt_class];
1270         if (method) {
1271                 /* Remove any methods for this mad agent */
1272                 remove_methods_mad_agent(method, agent_priv);
1273                 /* Now, check to see if there are any methods still in use */
1274                 if (!check_method_table(method)) {
1275                         /* If not, release management method table */
1276                          kfree(method);
1277                          class->method_table[mgmt_class] = NULL;
1278                          /* Any management classes left ? */
1279                         if (!check_class_table(class)) {
1280                                 /* If not, release management class table */
1281                                 kfree(class);
1282                                 port_priv->version[
1283                                         agent_priv->reg_req->
1284                                         mgmt_class_version].class = NULL;
1285                         }
1286                 }
1287         }
1288
1289 vendor_check:
1290         if (!is_vendor_class(mgmt_class))
1291                 goto out;
1292
1293         /* normalize mgmt_class to vendor range 2 */
1294         mgmt_class = vendor_class_index(agent_priv->reg_req->mgmt_class);
1295         vendor = port_priv->version[
1296                         agent_priv->reg_req->mgmt_class_version].vendor;
1297
1298         if (!vendor)
1299                 goto out;
1300
1301         vendor_class = vendor->vendor_class[mgmt_class];
1302         if (vendor_class) {
1303                 index = find_vendor_oui(vendor_class, agent_priv->reg_req->oui);
1304                 if (index < 0)
1305                         goto out;
1306                 method = vendor_class->method_table[index];
1307                 if (method) {
1308                         /* Remove any methods for this mad agent */
1309                         remove_methods_mad_agent(method, agent_priv);
1310                         /*
1311                          * Now, check to see if there are
1312                          * any methods still in use
1313                          */
1314                         if (!check_method_table(method)) {
1315                                 /* If not, release management method table */
1316                                 kfree(method);
1317                                 vendor_class->method_table[index] = NULL;
1318                                 memset(vendor_class->oui[index], 0, 3);
1319                                 /* Any OUIs left ? */
1320                                 if (!check_vendor_class(vendor_class)) {
1321                                         /* If not, release vendor class table */
1322                                         kfree(vendor_class);
1323                                         vendor->vendor_class[mgmt_class] = NULL;
1324                                         /* Any other vendor classes left ? */
1325                                         if (!check_vendor_table(vendor)) {
1326                                                 kfree(vendor);
1327                                                 port_priv->version[
1328                                                         agent_priv->reg_req->
1329                                                         mgmt_class_version].
1330                                                         vendor = NULL;
1331                                         }
1332                                 }
1333                         }
1334                 }
1335         }
1336
1337 out:
1338         return;
1339 }
1340
1341 static int response_mad(struct ib_mad *mad)
1342 {
1343         /* Trap represses are responses although response bit is reset */
1344         return ((mad->mad_hdr.method == IB_MGMT_METHOD_TRAP_REPRESS) ||
1345                 (mad->mad_hdr.method & IB_MGMT_METHOD_RESP));
1346 }
1347
1348 static int solicited_mad(struct ib_mad *mad)
1349 {
1350         /* CM MADs are never solicited */
1351         if (mad->mad_hdr.mgmt_class == IB_MGMT_CLASS_CM) {
1352                 return 0;
1353         }
1354
1355         /* XXX: Determine whether MAD is using RMPP */
1356
1357         /* Not using RMPP */
1358         /* Is this MAD a response to a previous MAD ? */
1359         return response_mad(mad);
1360 }
1361
1362 static struct ib_mad_agent_private *
1363 find_mad_agent(struct ib_mad_port_private *port_priv,
1364                struct ib_mad *mad,
1365                int solicited)
1366 {
1367         struct ib_mad_agent_private *mad_agent = NULL;
1368         unsigned long flags;
1369
1370         spin_lock_irqsave(&port_priv->reg_lock, flags);
1371
1372         /*
1373          * Whether MAD was solicited determines type of routing to
1374          * MAD client.
1375          */
1376         if (solicited) {
1377                 u32 hi_tid;
1378                 struct ib_mad_agent_private *entry;
1379
1380                 /*
1381                  * Routing is based on high 32 bits of transaction ID
1382                  * of MAD.
1383                  */
1384                 hi_tid = be64_to_cpu(mad->mad_hdr.tid) >> 32;
1385                 list_for_each_entry(entry, &port_priv->agent_list,
1386                                     agent_list) {
1387                         if (entry->agent.hi_tid == hi_tid) {
1388                                 mad_agent = entry;
1389                                 break;
1390                         }
1391                 }
1392         } else {
1393                 struct ib_mad_mgmt_class_table *class;
1394                 struct ib_mad_mgmt_method_table *method;
1395                 struct ib_mad_mgmt_vendor_class_table *vendor;
1396                 struct ib_mad_mgmt_vendor_class *vendor_class;
1397                 struct ib_vendor_mad *vendor_mad;
1398                 int index;
1399
1400                 /*
1401                  * Routing is based on version, class, and method
1402                  * For "newer" vendor MADs, also based on OUI
1403                  */
1404                 if (mad->mad_hdr.class_version >= MAX_MGMT_VERSION)
1405                         goto out;
1406                 if (!is_vendor_class(mad->mad_hdr.mgmt_class)) {
1407                         class = port_priv->version[
1408                                         mad->mad_hdr.class_version].class;
1409                         if (!class)
1410                                 goto out;
1411                         method = class->method_table[convert_mgmt_class(
1412                                                         mad->mad_hdr.mgmt_class)];
1413                         if (method)
1414                                 mad_agent = method->agent[mad->mad_hdr.method &
1415                                                           ~IB_MGMT_METHOD_RESP];
1416                 } else {
1417                         vendor = port_priv->version[
1418                                         mad->mad_hdr.class_version].vendor;
1419                         if (!vendor)
1420                                 goto out;
1421                         vendor_class = vendor->vendor_class[vendor_class_index(
1422                                                 mad->mad_hdr.mgmt_class)];
1423                         if (!vendor_class)
1424                                 goto out;
1425                         /* Find matching OUI */
1426                         vendor_mad = (struct ib_vendor_mad *)mad;
1427                         index = find_vendor_oui(vendor_class, vendor_mad->oui);
1428                         if (index == -1)
1429                                 goto out;
1430                         method = vendor_class->method_table[index];
1431                         if (method) {
1432                                 mad_agent = method->agent[mad->mad_hdr.method &
1433                                                           ~IB_MGMT_METHOD_RESP];
1434                         }
1435                 }
1436         }
1437
1438         if (mad_agent) {
1439                 if (mad_agent->agent.recv_handler)
1440                         atomic_inc(&mad_agent->refcount);
1441                 else {
1442                         printk(KERN_NOTICE PFX "No receive handler for client "
1443                                "%p on port %d\n",
1444                                &mad_agent->agent, port_priv->port_num);
1445                         mad_agent = NULL;
1446                 }
1447         }
1448 out:
1449         spin_unlock_irqrestore(&port_priv->reg_lock, flags);
1450
1451         return mad_agent;
1452 }
1453
1454 static int validate_mad(struct ib_mad *mad, u32 qp_num)
1455 {
1456         int valid = 0;
1457
1458         /* Make sure MAD base version is understood */
1459         if (mad->mad_hdr.base_version != IB_MGMT_BASE_VERSION) {
1460                 printk(KERN_ERR PFX "MAD received with unsupported base "
1461                        "version %d\n", mad->mad_hdr.base_version);
1462                 goto out;
1463         }
1464
1465         /* Filter SMI packets sent to other than QP0 */
1466         if ((mad->mad_hdr.mgmt_class == IB_MGMT_CLASS_SUBN_LID_ROUTED) ||
1467             (mad->mad_hdr.mgmt_class == IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE)) {
1468                 if (qp_num == 0)
1469                         valid = 1;
1470         } else {
1471                 /* Filter GSI packets sent to QP0 */
1472                 if (qp_num != 0)
1473                         valid = 1;
1474         }
1475
1476 out:
1477         return valid;
1478 }
1479
1480 /*
1481  * Return start of fully reassembled MAD, or NULL, if MAD isn't assembled yet
1482  */
1483 static struct ib_mad_private *
1484 reassemble_recv(struct ib_mad_agent_private *mad_agent_priv,
1485                 struct ib_mad_private *recv)
1486 {
1487         /* Until we have RMPP, all receives are reassembled!... */
1488         INIT_LIST_HEAD(&recv->header.recv_wc.recv_buf.list);
1489         return recv;
1490 }
1491
1492 static struct ib_mad_send_wr_private*
1493 find_send_req(struct ib_mad_agent_private *mad_agent_priv,
1494               u64 tid)
1495 {
1496         struct ib_mad_send_wr_private *mad_send_wr;
1497
1498         list_for_each_entry(mad_send_wr, &mad_agent_priv->wait_list,
1499                             agent_list) {
1500                 if (mad_send_wr->tid == tid)
1501                         return mad_send_wr;
1502         }
1503
1504         /*
1505          * It's possible to receive the response before we've
1506          * been notified that the send has completed
1507          */
1508         list_for_each_entry(mad_send_wr, &mad_agent_priv->send_list,
1509                             agent_list) {
1510                 if (mad_send_wr->tid == tid && mad_send_wr->timeout) {
1511                         /* Verify request has not been canceled */
1512                         return (mad_send_wr->status == IB_WC_SUCCESS) ?
1513                                 mad_send_wr : NULL;
1514                 }
1515         }
1516         return NULL;
1517 }
1518
1519 static void ib_mad_complete_recv(struct ib_mad_agent_private *mad_agent_priv,
1520                                  struct ib_mad_private *recv,
1521                                  int solicited)
1522 {
1523         struct ib_mad_send_wr_private *mad_send_wr;
1524         struct ib_mad_send_wc mad_send_wc;
1525         unsigned long flags;
1526
1527         /* Fully reassemble receive before processing */
1528         recv = reassemble_recv(mad_agent_priv, recv);
1529         if (!recv) {
1530                 if (atomic_dec_and_test(&mad_agent_priv->refcount))
1531                         wake_up(&mad_agent_priv->wait);
1532                 return;
1533         }
1534
1535         /* Complete corresponding request */
1536         if (solicited) {
1537                 spin_lock_irqsave(&mad_agent_priv->lock, flags);
1538                 mad_send_wr = find_send_req(mad_agent_priv,
1539                                             recv->mad.mad.mad_hdr.tid);
1540                 if (!mad_send_wr) {
1541                         spin_unlock_irqrestore(&mad_agent_priv->lock, flags);
1542                         ib_free_recv_mad(&recv->header.recv_wc);
1543                         if (atomic_dec_and_test(&mad_agent_priv->refcount))
1544                                 wake_up(&mad_agent_priv->wait);
1545                         return;
1546                 }
1547                 /* Timeout = 0 means that we won't wait for a response */
1548                 mad_send_wr->timeout = 0;
1549                 spin_unlock_irqrestore(&mad_agent_priv->lock, flags);
1550
1551                 /* Defined behavior is to complete response before request */
1552                 recv->header.recv_wc.wc->wr_id = mad_send_wr->wr_id;
1553                 mad_agent_priv->agent.recv_handler(
1554                                                 &mad_agent_priv->agent,
1555                                                 &recv->header.recv_wc);
1556                 atomic_dec(&mad_agent_priv->refcount);
1557
1558                 mad_send_wc.status = IB_WC_SUCCESS;
1559                 mad_send_wc.vendor_err = 0;
1560                 mad_send_wc.wr_id = mad_send_wr->wr_id;
1561                 ib_mad_complete_send_wr(mad_send_wr, &mad_send_wc);
1562         } else {
1563                 mad_agent_priv->agent.recv_handler(
1564                                                 &mad_agent_priv->agent,
1565                                                 &recv->header.recv_wc);
1566                 if (atomic_dec_and_test(&mad_agent_priv->refcount))
1567                         wake_up(&mad_agent_priv->wait);
1568         }
1569 }
1570
1571 static void ib_mad_recv_done_handler(struct ib_mad_port_private *port_priv,
1572                                      struct ib_wc *wc)
1573 {
1574         struct ib_mad_qp_info *qp_info;
1575         struct ib_mad_private_header *mad_priv_hdr;
1576         struct ib_mad_private *recv, *response;
1577         struct ib_mad_list_head *mad_list;
1578         struct ib_mad_agent_private *mad_agent;
1579         int solicited;
1580
1581         response = kmem_cache_alloc(ib_mad_cache, GFP_KERNEL);
1582         if (!response)
1583                 printk(KERN_ERR PFX "ib_mad_recv_done_handler no memory "
1584                        "for response buffer\n");
1585
1586         mad_list = (struct ib_mad_list_head *)(unsigned long)wc->wr_id;
1587         qp_info = mad_list->mad_queue->qp_info;
1588         dequeue_mad(mad_list);
1589
1590         mad_priv_hdr = container_of(mad_list, struct ib_mad_private_header,
1591                                     mad_list);
1592         recv = container_of(mad_priv_hdr, struct ib_mad_private, header);
1593         dma_unmap_single(port_priv->device->dma_device,
1594                          pci_unmap_addr(&recv->header, mapping),
1595                          sizeof(struct ib_mad_private) -
1596                          sizeof(struct ib_mad_private_header),
1597                          DMA_FROM_DEVICE);
1598
1599         /* Setup MAD receive work completion from "normal" work completion */
1600         recv->header.wc = *wc;
1601         recv->header.recv_wc.wc = &recv->header.wc;
1602         recv->header.recv_wc.mad_len = sizeof(struct ib_mad);
1603         recv->header.recv_wc.recv_buf.mad = &recv->mad.mad;
1604         recv->header.recv_wc.recv_buf.grh = &recv->grh;
1605
1606         if (atomic_read(&qp_info->snoop_count))
1607                 snoop_recv(qp_info, &recv->header.recv_wc, IB_MAD_SNOOP_RECVS);
1608
1609         /* Validate MAD */
1610         if (!validate_mad(&recv->mad.mad, qp_info->qp->qp_num))
1611                 goto out;
1612
1613         if (recv->mad.mad.mad_hdr.mgmt_class ==
1614             IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE) {
1615                 if (!smi_handle_dr_smp_recv(&recv->mad.smp,
1616                                             port_priv->device->node_type,
1617                                             port_priv->port_num,
1618                                             port_priv->device->phys_port_cnt))
1619                         goto out;
1620                 if (!smi_check_forward_dr_smp(&recv->mad.smp))
1621                         goto local;
1622                 if (!smi_handle_dr_smp_send(&recv->mad.smp,
1623                                             port_priv->device->node_type,
1624                                             port_priv->port_num))
1625                         goto out;
1626                 if (!smi_check_local_dr_smp(&recv->mad.smp,
1627                                             port_priv->device,
1628                                             port_priv->port_num))
1629                         goto out;
1630         }
1631
1632 local:
1633         /* Give driver "right of first refusal" on incoming MAD */
1634         if (port_priv->device->process_mad) {
1635                 int ret;
1636
1637                 if (!response) {
1638                         printk(KERN_ERR PFX "No memory for response MAD\n");
1639                         /*
1640                          * Is it better to assume that
1641                          * it wouldn't be processed ?
1642                          */
1643                         goto out;
1644                 }
1645
1646                 ret = port_priv->device->process_mad(port_priv->device, 0,
1647                                                      port_priv->port_num,
1648                                                      wc, &recv->grh,
1649                                                      &recv->mad.mad,
1650                                                      &response->mad.mad);
1651                 if (ret & IB_MAD_RESULT_SUCCESS) {
1652                         if (ret & IB_MAD_RESULT_CONSUMED)
1653                                 goto out;
1654                         if (ret & IB_MAD_RESULT_REPLY) {
1655                                 /* Send response */
1656                                 if (!agent_send(response, &recv->grh, wc,
1657                                                 port_priv->device,
1658                                                 port_priv->port_num))
1659                                         response = NULL;
1660                                 goto out;
1661                         }
1662                 }
1663         }
1664
1665         /* Determine corresponding MAD agent for incoming receive MAD */
1666         solicited = solicited_mad(&recv->mad.mad);
1667         mad_agent = find_mad_agent(port_priv, &recv->mad.mad, solicited);
1668         if (mad_agent) {
1669                 ib_mad_complete_recv(mad_agent, recv, solicited);
1670                 /*
1671                  * recv is freed up in error cases in ib_mad_complete_recv
1672                  * or via recv_handler in ib_mad_complete_recv()
1673                  */
1674                 recv = NULL;
1675         }
1676
1677 out:
1678         /* Post another receive request for this QP */
1679         if (response) {
1680                 ib_mad_post_receive_mads(qp_info, response);
1681                 if (recv)
1682                         kmem_cache_free(ib_mad_cache, recv);
1683         } else
1684                 ib_mad_post_receive_mads(qp_info, recv);
1685 }
1686
1687 static void adjust_timeout(struct ib_mad_agent_private *mad_agent_priv)
1688 {
1689         struct ib_mad_send_wr_private *mad_send_wr;
1690         unsigned long delay;
1691
1692         if (list_empty(&mad_agent_priv->wait_list)) {
1693                 cancel_delayed_work(&mad_agent_priv->timed_work);
1694         } else {
1695                 mad_send_wr = list_entry(mad_agent_priv->wait_list.next,
1696                                          struct ib_mad_send_wr_private,
1697                                          agent_list);
1698
1699                 if (time_after(mad_agent_priv->timeout,
1700                                mad_send_wr->timeout)) {
1701                         mad_agent_priv->timeout = mad_send_wr->timeout;
1702                         cancel_delayed_work(&mad_agent_priv->timed_work);
1703                         delay = mad_send_wr->timeout - jiffies;
1704                         if ((long)delay <= 0)
1705                                 delay = 1;
1706                         queue_delayed_work(mad_agent_priv->qp_info->
1707                                            port_priv->wq,
1708                                            &mad_agent_priv->timed_work, delay);
1709                 }
1710         }
1711 }
1712
1713 static void wait_for_response(struct ib_mad_agent_private *mad_agent_priv,
1714                               struct ib_mad_send_wr_private *mad_send_wr )
1715 {
1716         struct ib_mad_send_wr_private *temp_mad_send_wr;
1717         struct list_head *list_item;
1718         unsigned long delay;
1719
1720         list_del(&mad_send_wr->agent_list);
1721
1722         delay = mad_send_wr->timeout;
1723         mad_send_wr->timeout += jiffies;
1724
1725         list_for_each_prev(list_item, &mad_agent_priv->wait_list) {
1726                 temp_mad_send_wr = list_entry(list_item,
1727                                               struct ib_mad_send_wr_private,
1728                                               agent_list);
1729                 if (time_after(mad_send_wr->timeout,
1730                                temp_mad_send_wr->timeout))
1731                         break;
1732         }
1733         list_add(&mad_send_wr->agent_list, list_item);
1734
1735         /* Reschedule a work item if we have a shorter timeout */
1736         if (mad_agent_priv->wait_list.next == &mad_send_wr->agent_list) {
1737                 cancel_delayed_work(&mad_agent_priv->timed_work);
1738                 queue_delayed_work(mad_agent_priv->qp_info->port_priv->wq,
1739                                    &mad_agent_priv->timed_work, delay);
1740         }
1741 }
1742
1743 /*
1744  * Process a send work completion
1745  */
1746 static void ib_mad_complete_send_wr(struct ib_mad_send_wr_private *mad_send_wr,
1747                                     struct ib_mad_send_wc *mad_send_wc)
1748 {
1749         struct ib_mad_agent_private     *mad_agent_priv;
1750         unsigned long                   flags;
1751
1752         mad_agent_priv = container_of(mad_send_wr->agent,
1753                                       struct ib_mad_agent_private, agent);
1754
1755         spin_lock_irqsave(&mad_agent_priv->lock, flags);
1756         if (mad_send_wc->status != IB_WC_SUCCESS &&
1757             mad_send_wr->status == IB_WC_SUCCESS) {
1758                 mad_send_wr->status = mad_send_wc->status;
1759                 mad_send_wr->refcount -= (mad_send_wr->timeout > 0);
1760         }
1761
1762         if (--mad_send_wr->refcount > 0) {
1763                 if (mad_send_wr->refcount == 1 && mad_send_wr->timeout &&
1764                     mad_send_wr->status == IB_WC_SUCCESS) {
1765                         wait_for_response(mad_agent_priv, mad_send_wr);
1766                 }
1767                 spin_unlock_irqrestore(&mad_agent_priv->lock, flags);
1768                 return;
1769         }
1770
1771         /* Remove send from MAD agent and notify client of completion */
1772         list_del(&mad_send_wr->agent_list);
1773         adjust_timeout(mad_agent_priv);
1774         spin_unlock_irqrestore(&mad_agent_priv->lock, flags);
1775
1776         if (mad_send_wr->status != IB_WC_SUCCESS )
1777                 mad_send_wc->status = mad_send_wr->status;
1778         mad_agent_priv->agent.send_handler(&mad_agent_priv->agent,
1779                                             mad_send_wc);
1780
1781         /* Release reference on agent taken when sending */
1782         if (atomic_dec_and_test(&mad_agent_priv->refcount))
1783                 wake_up(&mad_agent_priv->wait);
1784
1785         kfree(mad_send_wr);
1786 }
1787
1788 static void ib_mad_send_done_handler(struct ib_mad_port_private *port_priv,
1789                                      struct ib_wc *wc)
1790 {
1791         struct ib_mad_send_wr_private   *mad_send_wr, *queued_send_wr;
1792         struct ib_mad_list_head         *mad_list;
1793         struct ib_mad_qp_info           *qp_info;
1794         struct ib_mad_queue             *send_queue;
1795         struct ib_send_wr               *bad_send_wr;
1796         unsigned long flags;
1797         int ret;
1798
1799         mad_list = (struct ib_mad_list_head *)(unsigned long)wc->wr_id;
1800         mad_send_wr = container_of(mad_list, struct ib_mad_send_wr_private,
1801                                    mad_list);
1802         send_queue = mad_list->mad_queue;
1803         qp_info = send_queue->qp_info;
1804
1805 retry:
1806         queued_send_wr = NULL;
1807         spin_lock_irqsave(&send_queue->lock, flags);
1808         list_del(&mad_list->list);
1809
1810         /* Move queued send to the send queue */
1811         if (send_queue->count-- > send_queue->max_active) {
1812                 mad_list = container_of(qp_info->overflow_list.next,
1813                                         struct ib_mad_list_head, list);
1814                 queued_send_wr = container_of(mad_list,
1815                                         struct ib_mad_send_wr_private,
1816                                         mad_list);
1817                 list_del(&mad_list->list);
1818                 list_add_tail(&mad_list->list, &send_queue->list);
1819         }
1820         spin_unlock_irqrestore(&send_queue->lock, flags);
1821
1822         /* Restore client wr_id in WC and complete send */
1823         wc->wr_id = mad_send_wr->wr_id;
1824         if (atomic_read(&qp_info->snoop_count))
1825                 snoop_send(qp_info, &mad_send_wr->send_wr,
1826                            (struct ib_mad_send_wc *)wc,
1827                            IB_MAD_SNOOP_SEND_COMPLETIONS);
1828         ib_mad_complete_send_wr(mad_send_wr, (struct ib_mad_send_wc *)wc);
1829
1830         if (queued_send_wr) {
1831                 ret = ib_post_send(qp_info->qp, &queued_send_wr->send_wr,
1832                                 &bad_send_wr);
1833                 if (ret) {
1834                         printk(KERN_ERR PFX "ib_post_send failed: %d\n", ret);
1835                         mad_send_wr = queued_send_wr;
1836                         wc->status = IB_WC_LOC_QP_OP_ERR;
1837                         goto retry;
1838                 }
1839         }
1840 }
1841
1842 static void mark_sends_for_retry(struct ib_mad_qp_info *qp_info)
1843 {
1844         struct ib_mad_send_wr_private *mad_send_wr;
1845         struct ib_mad_list_head *mad_list;
1846         unsigned long flags;
1847
1848         spin_lock_irqsave(&qp_info->send_queue.lock, flags);
1849         list_for_each_entry(mad_list, &qp_info->send_queue.list, list) {
1850                 mad_send_wr = container_of(mad_list,
1851                                            struct ib_mad_send_wr_private,
1852                                            mad_list);
1853                 mad_send_wr->retry = 1;
1854         }
1855         spin_unlock_irqrestore(&qp_info->send_queue.lock, flags);
1856 }
1857
1858 static void mad_error_handler(struct ib_mad_port_private *port_priv,
1859                               struct ib_wc *wc)
1860 {
1861         struct ib_mad_list_head *mad_list;
1862         struct ib_mad_qp_info *qp_info;
1863         struct ib_mad_send_wr_private *mad_send_wr;
1864         int ret;
1865
1866         /* Determine if failure was a send or receive */
1867         mad_list = (struct ib_mad_list_head *)(unsigned long)wc->wr_id;
1868         qp_info = mad_list->mad_queue->qp_info;
1869         if (mad_list->mad_queue == &qp_info->recv_queue)
1870                 /*
1871                  * Receive errors indicate that the QP has entered the error
1872                  * state - error handling/shutdown code will cleanup
1873                  */
1874                 return;
1875
1876         /*
1877          * Send errors will transition the QP to SQE - move
1878          * QP to RTS and repost flushed work requests
1879          */
1880         mad_send_wr = container_of(mad_list, struct ib_mad_send_wr_private,
1881                                    mad_list);
1882         if (wc->status == IB_WC_WR_FLUSH_ERR) {
1883                 if (mad_send_wr->retry) {
1884                         /* Repost send */
1885                         struct ib_send_wr *bad_send_wr;
1886
1887                         mad_send_wr->retry = 0;
1888                         ret = ib_post_send(qp_info->qp, &mad_send_wr->send_wr,
1889                                         &bad_send_wr);
1890                         if (ret)
1891                                 ib_mad_send_done_handler(port_priv, wc);
1892                 } else
1893                         ib_mad_send_done_handler(port_priv, wc);
1894         } else {
1895                 struct ib_qp_attr *attr;
1896
1897                 /* Transition QP to RTS and fail offending send */
1898                 attr = kmalloc(sizeof *attr, GFP_KERNEL);
1899                 if (attr) {
1900                         attr->qp_state = IB_QPS_RTS;
1901                         attr->cur_qp_state = IB_QPS_SQE;
1902                         ret = ib_modify_qp(qp_info->qp, attr,
1903                                            IB_QP_STATE | IB_QP_CUR_STATE);
1904                         kfree(attr);
1905                         if (ret)
1906                                 printk(KERN_ERR PFX "mad_error_handler - "
1907                                        "ib_modify_qp to RTS : %d\n", ret);
1908                         else
1909                                 mark_sends_for_retry(qp_info);
1910                 }
1911                 ib_mad_send_done_handler(port_priv, wc);
1912         }
1913 }
1914
1915 /*
1916  * IB MAD completion callback
1917  */
1918 static void ib_mad_completion_handler(void *data)
1919 {
1920         struct ib_mad_port_private *port_priv;
1921         struct ib_wc wc;
1922
1923         port_priv = (struct ib_mad_port_private *)data;
1924         ib_req_notify_cq(port_priv->cq, IB_CQ_NEXT_COMP);
1925
1926         while (ib_poll_cq(port_priv->cq, 1, &wc) == 1) {
1927                 if (wc.status == IB_WC_SUCCESS) {
1928                         switch (wc.opcode) {
1929                         case IB_WC_SEND:
1930                                 ib_mad_send_done_handler(port_priv, &wc);
1931                                 break;
1932                         case IB_WC_RECV:
1933                                 ib_mad_recv_done_handler(port_priv, &wc);
1934                                 break;
1935                         default:
1936                                 BUG_ON(1);
1937                                 break;
1938                         }
1939                 } else
1940                         mad_error_handler(port_priv, &wc);
1941         }
1942 }
1943
1944 static void cancel_mads(struct ib_mad_agent_private *mad_agent_priv)
1945 {
1946         unsigned long flags;
1947         struct ib_mad_send_wr_private *mad_send_wr, *temp_mad_send_wr;
1948         struct ib_mad_send_wc mad_send_wc;
1949         struct list_head cancel_list;
1950
1951         INIT_LIST_HEAD(&cancel_list);
1952
1953         spin_lock_irqsave(&mad_agent_priv->lock, flags);
1954         list_for_each_entry_safe(mad_send_wr, temp_mad_send_wr,
1955                                  &mad_agent_priv->send_list, agent_list) {
1956                 if (mad_send_wr->status == IB_WC_SUCCESS) {
1957                         mad_send_wr->status = IB_WC_WR_FLUSH_ERR;
1958                         mad_send_wr->refcount -= (mad_send_wr->timeout > 0);
1959                 }
1960         }
1961
1962         /* Empty wait list to prevent receives from finding a request */
1963         list_splice_init(&mad_agent_priv->wait_list, &cancel_list);
1964         spin_unlock_irqrestore(&mad_agent_priv->lock, flags);
1965
1966         /* Report all cancelled requests */
1967         mad_send_wc.status = IB_WC_WR_FLUSH_ERR;
1968         mad_send_wc.vendor_err = 0;
1969
1970         list_for_each_entry_safe(mad_send_wr, temp_mad_send_wr,
1971                                  &cancel_list, agent_list) {
1972                 mad_send_wc.wr_id = mad_send_wr->wr_id;
1973                 mad_agent_priv->agent.send_handler(&mad_agent_priv->agent,
1974                                                    &mad_send_wc);
1975
1976                 list_del(&mad_send_wr->agent_list);
1977                 kfree(mad_send_wr);
1978                 atomic_dec(&mad_agent_priv->refcount);
1979         }
1980 }
1981
1982 static struct ib_mad_send_wr_private*
1983 find_send_by_wr_id(struct ib_mad_agent_private *mad_agent_priv,
1984                    u64 wr_id)
1985 {
1986         struct ib_mad_send_wr_private *mad_send_wr;
1987
1988         list_for_each_entry(mad_send_wr, &mad_agent_priv->wait_list,
1989                             agent_list) {
1990                 if (mad_send_wr->wr_id == wr_id)
1991                         return mad_send_wr;
1992         }
1993
1994         list_for_each_entry(mad_send_wr, &mad_agent_priv->send_list,
1995                             agent_list) {
1996                 if (mad_send_wr->wr_id == wr_id)
1997                         return mad_send_wr;
1998         }
1999         return NULL;
2000 }
2001
2002 void cancel_sends(void *data)
2003 {
2004         struct ib_mad_agent_private *mad_agent_priv;
2005         struct ib_mad_send_wr_private *mad_send_wr;
2006         struct ib_mad_send_wc mad_send_wc;
2007         unsigned long flags;
2008
2009         mad_agent_priv = data;
2010
2011         mad_send_wc.status = IB_WC_WR_FLUSH_ERR;
2012         mad_send_wc.vendor_err = 0;
2013
2014         spin_lock_irqsave(&mad_agent_priv->lock, flags);
2015         while (!list_empty(&mad_agent_priv->canceled_list)) {
2016                 mad_send_wr = list_entry(mad_agent_priv->canceled_list.next,
2017                                          struct ib_mad_send_wr_private,
2018                                          agent_list);
2019
2020                 list_del(&mad_send_wr->agent_list);
2021                 spin_unlock_irqrestore(&mad_agent_priv->lock, flags);
2022
2023                 mad_send_wc.wr_id = mad_send_wr->wr_id;
2024                 mad_agent_priv->agent.send_handler(&mad_agent_priv->agent,
2025                                                    &mad_send_wc);
2026
2027                 kfree(mad_send_wr);
2028                 if (atomic_dec_and_test(&mad_agent_priv->refcount))
2029                         wake_up(&mad_agent_priv->wait);
2030                 spin_lock_irqsave(&mad_agent_priv->lock, flags);
2031         }
2032         spin_unlock_irqrestore(&mad_agent_priv->lock, flags);
2033 }
2034
2035 void ib_cancel_mad(struct ib_mad_agent *mad_agent,
2036                   u64 wr_id)
2037 {
2038         struct ib_mad_agent_private *mad_agent_priv;
2039         struct ib_mad_send_wr_private *mad_send_wr;
2040         unsigned long flags;
2041
2042         mad_agent_priv = container_of(mad_agent, struct ib_mad_agent_private,
2043                                       agent);
2044         spin_lock_irqsave(&mad_agent_priv->lock, flags);
2045         mad_send_wr = find_send_by_wr_id(mad_agent_priv, wr_id);
2046         if (!mad_send_wr) {
2047                 spin_unlock_irqrestore(&mad_agent_priv->lock, flags);
2048                 goto out;
2049         }
2050
2051         if (mad_send_wr->status == IB_WC_SUCCESS)
2052                 mad_send_wr->refcount -= (mad_send_wr->timeout > 0);
2053
2054         if (mad_send_wr->refcount != 0) {
2055                 mad_send_wr->status = IB_WC_WR_FLUSH_ERR;
2056                 spin_unlock_irqrestore(&mad_agent_priv->lock, flags);
2057                 goto out;
2058         }
2059
2060         list_del(&mad_send_wr->agent_list);
2061         list_add_tail(&mad_send_wr->agent_list, &mad_agent_priv->canceled_list);
2062         adjust_timeout(mad_agent_priv);
2063         spin_unlock_irqrestore(&mad_agent_priv->lock, flags);
2064
2065         queue_work(mad_agent_priv->qp_info->port_priv->wq,
2066                    &mad_agent_priv->canceled_work);
2067 out:
2068         return;
2069 }
2070 EXPORT_SYMBOL(ib_cancel_mad);
2071
2072 static void local_completions(void *data)
2073 {
2074         struct ib_mad_agent_private *mad_agent_priv;
2075         struct ib_mad_local_private *local;
2076         struct ib_mad_agent_private *recv_mad_agent;
2077         unsigned long flags;
2078         struct ib_wc wc;
2079         struct ib_mad_send_wc mad_send_wc;
2080
2081         mad_agent_priv = (struct ib_mad_agent_private *)data;
2082
2083         spin_lock_irqsave(&mad_agent_priv->lock, flags);
2084         while (!list_empty(&mad_agent_priv->local_list)) {
2085                 local = list_entry(mad_agent_priv->local_list.next,
2086                                    struct ib_mad_local_private,
2087                                    completion_list);
2088                 spin_unlock_irqrestore(&mad_agent_priv->lock, flags);
2089                 if (local->mad_priv) {
2090                         recv_mad_agent = local->recv_mad_agent;
2091                         if (!recv_mad_agent) {
2092                                 printk(KERN_ERR PFX "No receive MAD agent for local completion\n");
2093                                 kmem_cache_free(ib_mad_cache, local->mad_priv);
2094                                 goto local_send_completion;
2095                         }
2096
2097                         /*
2098                          * Defined behavior is to complete response
2099                          * before request
2100                          */
2101                         build_smp_wc(local->wr_id, IB_LID_PERMISSIVE,
2102                                      0 /* pkey index */,
2103                                      recv_mad_agent->agent.port_num, &wc);
2104
2105                         local->mad_priv->header.recv_wc.wc = &wc;
2106                         local->mad_priv->header.recv_wc.mad_len =
2107                                                 sizeof(struct ib_mad);
2108                         INIT_LIST_HEAD(&local->mad_priv->header.recv_wc.recv_buf.list);
2109                         local->mad_priv->header.recv_wc.recv_buf.grh = NULL;
2110                         local->mad_priv->header.recv_wc.recv_buf.mad =
2111                                                 &local->mad_priv->mad.mad;
2112                         if (atomic_read(&recv_mad_agent->qp_info->snoop_count))
2113                                 snoop_recv(recv_mad_agent->qp_info,
2114                                           &local->mad_priv->header.recv_wc,
2115                                            IB_MAD_SNOOP_RECVS);
2116                         recv_mad_agent->agent.recv_handler(
2117                                                 &recv_mad_agent->agent,
2118                                                 &local->mad_priv->header.recv_wc);
2119                         spin_lock_irqsave(&recv_mad_agent->lock, flags);
2120                         atomic_dec(&recv_mad_agent->refcount);
2121                         spin_unlock_irqrestore(&recv_mad_agent->lock, flags);
2122                 }
2123
2124 local_send_completion:
2125                 /* Complete send */
2126                 mad_send_wc.status = IB_WC_SUCCESS;
2127                 mad_send_wc.vendor_err = 0;
2128                 mad_send_wc.wr_id = local->wr_id;
2129                 if (atomic_read(&mad_agent_priv->qp_info->snoop_count))
2130                         snoop_send(mad_agent_priv->qp_info, &local->send_wr,
2131                                   &mad_send_wc,
2132                                    IB_MAD_SNOOP_SEND_COMPLETIONS);
2133                 mad_agent_priv->agent.send_handler(&mad_agent_priv->agent,
2134                                                    &mad_send_wc);
2135
2136                 spin_lock_irqsave(&mad_agent_priv->lock, flags);
2137                 list_del(&local->completion_list);
2138                 atomic_dec(&mad_agent_priv->refcount);
2139                 kfree(local);
2140         }
2141         spin_unlock_irqrestore(&mad_agent_priv->lock, flags);
2142 }
2143
2144 static void timeout_sends(void *data)
2145 {
2146         struct ib_mad_agent_private *mad_agent_priv;
2147         struct ib_mad_send_wr_private *mad_send_wr;
2148         struct ib_mad_send_wc mad_send_wc;
2149         unsigned long flags, delay;
2150
2151         mad_agent_priv = (struct ib_mad_agent_private *)data;
2152
2153         mad_send_wc.status = IB_WC_RESP_TIMEOUT_ERR;
2154         mad_send_wc.vendor_err = 0;
2155
2156         spin_lock_irqsave(&mad_agent_priv->lock, flags);
2157         while (!list_empty(&mad_agent_priv->wait_list)) {
2158                 mad_send_wr = list_entry(mad_agent_priv->wait_list.next,
2159                                          struct ib_mad_send_wr_private,
2160                                          agent_list);
2161
2162                 if (time_after(mad_send_wr->timeout, jiffies)) {
2163                         delay = mad_send_wr->timeout - jiffies;
2164                         if ((long)delay <= 0)
2165                                 delay = 1;
2166                         queue_delayed_work(mad_agent_priv->qp_info->
2167                                            port_priv->wq,
2168                                            &mad_agent_priv->timed_work, delay);
2169                         break;
2170                 }
2171
2172                 list_del(&mad_send_wr->agent_list);
2173                 spin_unlock_irqrestore(&mad_agent_priv->lock, flags);
2174
2175                 mad_send_wc.wr_id = mad_send_wr->wr_id;
2176                 mad_agent_priv->agent.send_handler(&mad_agent_priv->agent,
2177                                                    &mad_send_wc);
2178
2179                 kfree(mad_send_wr);
2180                 atomic_dec(&mad_agent_priv->refcount);
2181                 spin_lock_irqsave(&mad_agent_priv->lock, flags);
2182         }
2183         spin_unlock_irqrestore(&mad_agent_priv->lock, flags);
2184 }
2185
2186 static void ib_mad_thread_completion_handler(struct ib_cq *cq)
2187 {
2188         struct ib_mad_port_private *port_priv = cq->cq_context;
2189
2190         queue_work(port_priv->wq, &port_priv->work);
2191 }
2192
2193 /*
2194  * Allocate receive MADs and post receive WRs for them
2195  */
2196 static int ib_mad_post_receive_mads(struct ib_mad_qp_info *qp_info,
2197                                     struct ib_mad_private *mad)
2198 {
2199         unsigned long flags;
2200         int post, ret;
2201         struct ib_mad_private *mad_priv;
2202         struct ib_sge sg_list;
2203         struct ib_recv_wr recv_wr, *bad_recv_wr;
2204         struct ib_mad_queue *recv_queue = &qp_info->recv_queue;
2205
2206         /* Initialize common scatter list fields */
2207         sg_list.length = sizeof *mad_priv - sizeof mad_priv->header;
2208         sg_list.lkey = (*qp_info->port_priv->mr).lkey;
2209
2210         /* Initialize common receive WR fields */
2211         recv_wr.next = NULL;
2212         recv_wr.sg_list = &sg_list;
2213         recv_wr.num_sge = 1;
2214
2215         do {
2216                 /* Allocate and map receive buffer */
2217                 if (mad) {
2218                         mad_priv = mad;
2219                         mad = NULL;
2220                 } else {
2221                         mad_priv = kmem_cache_alloc(ib_mad_cache, GFP_KERNEL);
2222                         if (!mad_priv) {
2223                                 printk(KERN_ERR PFX "No memory for receive buffer\n");
2224                                 ret = -ENOMEM;
2225                                 break;
2226                         }
2227                 }
2228                 sg_list.addr = dma_map_single(qp_info->port_priv->
2229                                                 device->dma_device,
2230                                         &mad_priv->grh,
2231                                         sizeof *mad_priv -
2232                                                 sizeof mad_priv->header,
2233                                         DMA_FROM_DEVICE);
2234                 pci_unmap_addr_set(&mad_priv->header, mapping, sg_list.addr);
2235                 recv_wr.wr_id = (unsigned long)&mad_priv->header.mad_list;
2236                 mad_priv->header.mad_list.mad_queue = recv_queue;
2237
2238                 /* Post receive WR */
2239                 spin_lock_irqsave(&recv_queue->lock, flags);
2240                 post = (++recv_queue->count < recv_queue->max_active);
2241                 list_add_tail(&mad_priv->header.mad_list.list, &recv_queue->list);
2242                 spin_unlock_irqrestore(&recv_queue->lock, flags);
2243                 ret = ib_post_recv(qp_info->qp, &recv_wr, &bad_recv_wr);
2244                 if (ret) {
2245                         spin_lock_irqsave(&recv_queue->lock, flags);
2246                         list_del(&mad_priv->header.mad_list.list);
2247                         recv_queue->count--;
2248                         spin_unlock_irqrestore(&recv_queue->lock, flags);
2249                         dma_unmap_single(qp_info->port_priv->device->dma_device,
2250                                          pci_unmap_addr(&mad_priv->header,
2251                                                         mapping),
2252                                          sizeof *mad_priv -
2253                                            sizeof mad_priv->header,
2254                                          DMA_FROM_DEVICE);
2255                         kmem_cache_free(ib_mad_cache, mad_priv);
2256                         printk(KERN_ERR PFX "ib_post_recv failed: %d\n", ret);
2257                         break;
2258                 }
2259         } while (post);
2260
2261         return ret;
2262 }
2263
2264 /*
2265  * Return all the posted receive MADs
2266  */
2267 static void cleanup_recv_queue(struct ib_mad_qp_info *qp_info)
2268 {
2269         struct ib_mad_private_header *mad_priv_hdr;
2270         struct ib_mad_private *recv;
2271         struct ib_mad_list_head *mad_list;
2272
2273         while (!list_empty(&qp_info->recv_queue.list)) {
2274
2275                 mad_list = list_entry(qp_info->recv_queue.list.next,
2276                                       struct ib_mad_list_head, list);
2277                 mad_priv_hdr = container_of(mad_list,
2278                                             struct ib_mad_private_header,
2279                                             mad_list);
2280                 recv = container_of(mad_priv_hdr, struct ib_mad_private,
2281                                     header);
2282
2283                 /* Remove from posted receive MAD list */
2284                 list_del(&mad_list->list);
2285
2286                 dma_unmap_single(qp_info->port_priv->device->dma_device,
2287                                  pci_unmap_addr(&recv->header, mapping),
2288                                  sizeof(struct ib_mad_private) -
2289                                  sizeof(struct ib_mad_private_header),
2290                                  DMA_FROM_DEVICE);
2291                 kmem_cache_free(ib_mad_cache, recv);
2292         }
2293
2294         qp_info->recv_queue.count = 0;
2295 }
2296
2297 /*
2298  * Start the port
2299  */
2300 static int ib_mad_port_start(struct ib_mad_port_private *port_priv)
2301 {
2302         int ret, i;
2303         struct ib_qp_attr *attr;
2304         struct ib_qp *qp;
2305
2306         attr = kmalloc(sizeof *attr, GFP_KERNEL);
2307         if (!attr) {
2308                 printk(KERN_ERR PFX "Couldn't kmalloc ib_qp_attr\n");
2309                 return -ENOMEM;
2310         }
2311
2312         for (i = 0; i < IB_MAD_QPS_CORE; i++) {
2313                 qp = port_priv->qp_info[i].qp;
2314                 /*
2315                  * PKey index for QP1 is irrelevant but
2316                  * one is needed for the Reset to Init transition
2317                  */
2318                 attr->qp_state = IB_QPS_INIT;
2319                 attr->pkey_index = 0;
2320                 attr->qkey = (qp->qp_num == 0) ? 0 : IB_QP1_QKEY;
2321                 ret = ib_modify_qp(qp, attr, IB_QP_STATE |
2322                                              IB_QP_PKEY_INDEX | IB_QP_QKEY);
2323                 if (ret) {
2324                         printk(KERN_ERR PFX "Couldn't change QP%d state to "
2325                                "INIT: %d\n", i, ret);
2326                         goto out;
2327                 }
2328
2329                 attr->qp_state = IB_QPS_RTR;
2330                 ret = ib_modify_qp(qp, attr, IB_QP_STATE);
2331                 if (ret) {
2332                         printk(KERN_ERR PFX "Couldn't change QP%d state to "
2333                                "RTR: %d\n", i, ret);
2334                         goto out;
2335                 }
2336
2337                 attr->qp_state = IB_QPS_RTS;
2338                 attr->sq_psn = IB_MAD_SEND_Q_PSN;
2339                 ret = ib_modify_qp(qp, attr, IB_QP_STATE | IB_QP_SQ_PSN);
2340                 if (ret) {
2341                         printk(KERN_ERR PFX "Couldn't change QP%d state to "
2342                                "RTS: %d\n", i, ret);
2343                         goto out;
2344                 }
2345         }
2346
2347         ret = ib_req_notify_cq(port_priv->cq, IB_CQ_NEXT_COMP);
2348         if (ret) {
2349                 printk(KERN_ERR PFX "Failed to request completion "
2350                        "notification: %d\n", ret);
2351                 goto out;
2352         }
2353
2354         for (i = 0; i < IB_MAD_QPS_CORE; i++) {
2355                 ret = ib_mad_post_receive_mads(&port_priv->qp_info[i], NULL);
2356                 if (ret) {
2357                         printk(KERN_ERR PFX "Couldn't post receive WRs\n");
2358                         goto out;
2359                 }
2360         }
2361 out:
2362         kfree(attr);
2363         return ret;
2364 }
2365
2366 static void qp_event_handler(struct ib_event *event, void *qp_context)
2367 {
2368         struct ib_mad_qp_info   *qp_info = qp_context;
2369
2370         /* It's worse than that! He's dead, Jim! */
2371         printk(KERN_ERR PFX "Fatal error (%d) on MAD QP (%d)\n",
2372                 event->event, qp_info->qp->qp_num);
2373 }
2374
2375 static void init_mad_queue(struct ib_mad_qp_info *qp_info,
2376                            struct ib_mad_queue *mad_queue)
2377 {
2378         mad_queue->qp_info = qp_info;
2379         mad_queue->count = 0;
2380         spin_lock_init(&mad_queue->lock);
2381         INIT_LIST_HEAD(&mad_queue->list);
2382 }
2383
2384 static void init_mad_qp(struct ib_mad_port_private *port_priv,
2385                         struct ib_mad_qp_info *qp_info)
2386 {
2387         qp_info->port_priv = port_priv;
2388         init_mad_queue(qp_info, &qp_info->send_queue);
2389         init_mad_queue(qp_info, &qp_info->recv_queue);
2390         INIT_LIST_HEAD(&qp_info->overflow_list);
2391         spin_lock_init(&qp_info->snoop_lock);
2392         qp_info->snoop_table = NULL;
2393         qp_info->snoop_table_size = 0;
2394         atomic_set(&qp_info->snoop_count, 0);
2395 }
2396
2397 static int create_mad_qp(struct ib_mad_qp_info *qp_info,
2398                          enum ib_qp_type qp_type)
2399 {
2400         struct ib_qp_init_attr  qp_init_attr;
2401         int ret;
2402
2403         memset(&qp_init_attr, 0, sizeof qp_init_attr);
2404         qp_init_attr.send_cq = qp_info->port_priv->cq;
2405         qp_init_attr.recv_cq = qp_info->port_priv->cq;
2406         qp_init_attr.sq_sig_type = IB_SIGNAL_ALL_WR;
2407         qp_init_attr.cap.max_send_wr = IB_MAD_QP_SEND_SIZE;
2408         qp_init_attr.cap.max_recv_wr = IB_MAD_QP_RECV_SIZE;
2409         qp_init_attr.cap.max_send_sge = IB_MAD_SEND_REQ_MAX_SG;
2410         qp_init_attr.cap.max_recv_sge = IB_MAD_RECV_REQ_MAX_SG;
2411         qp_init_attr.qp_type = qp_type;
2412         qp_init_attr.port_num = qp_info->port_priv->port_num;
2413         qp_init_attr.qp_context = qp_info;
2414         qp_init_attr.event_handler = qp_event_handler;
2415         qp_info->qp = ib_create_qp(qp_info->port_priv->pd, &qp_init_attr);
2416         if (IS_ERR(qp_info->qp)) {
2417                 printk(KERN_ERR PFX "Couldn't create ib_mad QP%d\n",
2418                        get_spl_qp_index(qp_type));
2419                 ret = PTR_ERR(qp_info->qp);
2420                 goto error;
2421         }
2422         /* Use minimum queue sizes unless the CQ is resized */
2423         qp_info->send_queue.max_active = IB_MAD_QP_SEND_SIZE;
2424         qp_info->recv_queue.max_active = IB_MAD_QP_RECV_SIZE;
2425         return 0;
2426
2427 error:
2428         return ret;
2429 }
2430
2431 static void destroy_mad_qp(struct ib_mad_qp_info *qp_info)
2432 {
2433         ib_destroy_qp(qp_info->qp);
2434         if (qp_info->snoop_table)
2435                 kfree(qp_info->snoop_table);
2436 }
2437
2438 /*
2439  * Open the port
2440  * Create the QP, PD, MR, and CQ if needed
2441  */
2442 static int ib_mad_port_open(struct ib_device *device,
2443                             int port_num)
2444 {
2445         int ret, cq_size;
2446         struct ib_mad_port_private *port_priv;
2447         unsigned long flags;
2448         char name[sizeof "ib_mad123"];
2449
2450         /* First, check if port already open at MAD layer */
2451         port_priv = ib_get_mad_port(device, port_num);
2452         if (port_priv) {
2453                 printk(KERN_DEBUG PFX "%s port %d already open\n",
2454                        device->name, port_num);
2455                 return 0;
2456         }
2457
2458         /* Create new device info */
2459         port_priv = kmalloc(sizeof *port_priv, GFP_KERNEL);
2460         if (!port_priv) {
2461                 printk(KERN_ERR PFX "No memory for ib_mad_port_private\n");
2462                 return -ENOMEM;
2463         }
2464         memset(port_priv, 0, sizeof *port_priv);
2465         port_priv->device = device;
2466         port_priv->port_num = port_num;
2467         spin_lock_init(&port_priv->reg_lock);
2468         INIT_LIST_HEAD(&port_priv->agent_list);
2469         init_mad_qp(port_priv, &port_priv->qp_info[0]);
2470         init_mad_qp(port_priv, &port_priv->qp_info[1]);
2471
2472         cq_size = (IB_MAD_QP_SEND_SIZE + IB_MAD_QP_RECV_SIZE) * 2;
2473         port_priv->cq = ib_create_cq(port_priv->device,
2474                                      (ib_comp_handler)
2475                                         ib_mad_thread_completion_handler,
2476                                      NULL, port_priv, cq_size);
2477         if (IS_ERR(port_priv->cq)) {
2478                 printk(KERN_ERR PFX "Couldn't create ib_mad CQ\n");
2479                 ret = PTR_ERR(port_priv->cq);
2480                 goto error3;
2481         }
2482
2483         port_priv->pd = ib_alloc_pd(device);
2484         if (IS_ERR(port_priv->pd)) {
2485                 printk(KERN_ERR PFX "Couldn't create ib_mad PD\n");
2486                 ret = PTR_ERR(port_priv->pd);
2487                 goto error4;
2488         }
2489
2490         port_priv->mr = ib_get_dma_mr(port_priv->pd, IB_ACCESS_LOCAL_WRITE);
2491         if (IS_ERR(port_priv->mr)) {
2492                 printk(KERN_ERR PFX "Couldn't get ib_mad DMA MR\n");
2493                 ret = PTR_ERR(port_priv->mr);
2494                 goto error5;
2495         }
2496
2497         ret = create_mad_qp(&port_priv->qp_info[0], IB_QPT_SMI);
2498         if (ret)
2499                 goto error6;
2500         ret = create_mad_qp(&port_priv->qp_info[1], IB_QPT_GSI);
2501         if (ret)
2502                 goto error7;
2503
2504         snprintf(name, sizeof name, "ib_mad%d", port_num);
2505         port_priv->wq = create_singlethread_workqueue(name);
2506         if (!port_priv->wq) {
2507                 ret = -ENOMEM;
2508                 goto error8;
2509         }
2510         INIT_WORK(&port_priv->work, ib_mad_completion_handler, port_priv);
2511
2512         ret = ib_mad_port_start(port_priv);
2513         if (ret) {
2514                 printk(KERN_ERR PFX "Couldn't start port\n");
2515                 goto error9;
2516         }
2517
2518         spin_lock_irqsave(&ib_mad_port_list_lock, flags);
2519         list_add_tail(&port_priv->port_list, &ib_mad_port_list);
2520         spin_unlock_irqrestore(&ib_mad_port_list_lock, flags);
2521         return 0;
2522
2523 error9:
2524         destroy_workqueue(port_priv->wq);
2525 error8:
2526         destroy_mad_qp(&port_priv->qp_info[1]);
2527 error7:
2528         destroy_mad_qp(&port_priv->qp_info[0]);
2529 error6:
2530         ib_dereg_mr(port_priv->mr);
2531 error5:
2532         ib_dealloc_pd(port_priv->pd);
2533 error4:
2534         ib_destroy_cq(port_priv->cq);
2535         cleanup_recv_queue(&port_priv->qp_info[1]);
2536         cleanup_recv_queue(&port_priv->qp_info[0]);
2537 error3:
2538         kfree(port_priv);
2539
2540         return ret;
2541 }
2542
2543 /*
2544  * Close the port
2545  * If there are no classes using the port, free the port
2546  * resources (CQ, MR, PD, QP) and remove the port's info structure
2547  */
2548 static int ib_mad_port_close(struct ib_device *device, int port_num)
2549 {
2550         struct ib_mad_port_private *port_priv;
2551         unsigned long flags;
2552
2553         spin_lock_irqsave(&ib_mad_port_list_lock, flags);
2554         port_priv = __ib_get_mad_port(device, port_num);
2555         if (port_priv == NULL) {
2556                 spin_unlock_irqrestore(&ib_mad_port_list_lock, flags);
2557                 printk(KERN_ERR PFX "Port %d not found\n", port_num);
2558                 return -ENODEV;
2559         }
2560         list_del(&port_priv->port_list);
2561         spin_unlock_irqrestore(&ib_mad_port_list_lock, flags);
2562
2563         /* Stop processing completions. */
2564         flush_workqueue(port_priv->wq);
2565         destroy_workqueue(port_priv->wq);
2566         destroy_mad_qp(&port_priv->qp_info[1]);
2567         destroy_mad_qp(&port_priv->qp_info[0]);
2568         ib_dereg_mr(port_priv->mr);
2569         ib_dealloc_pd(port_priv->pd);
2570         ib_destroy_cq(port_priv->cq);
2571         cleanup_recv_queue(&port_priv->qp_info[1]);
2572         cleanup_recv_queue(&port_priv->qp_info[0]);
2573         /* XXX: Handle deallocation of MAD registration tables */
2574
2575         kfree(port_priv);
2576
2577         return 0;
2578 }
2579
2580 static void ib_mad_init_device(struct ib_device *device)
2581 {
2582         int ret, num_ports, cur_port, i, ret2;
2583
2584         if (device->node_type == IB_NODE_SWITCH) {
2585                 num_ports = 1;
2586                 cur_port = 0;
2587         } else {
2588                 num_ports = device->phys_port_cnt;
2589                 cur_port = 1;
2590         }
2591         for (i = 0; i < num_ports; i++, cur_port++) {
2592                 ret = ib_mad_port_open(device, cur_port);
2593                 if (ret) {
2594                         printk(KERN_ERR PFX "Couldn't open %s port %d\n",
2595                                device->name, cur_port);
2596                         goto error_device_open;
2597                 }
2598                 ret = ib_agent_port_open(device, cur_port);
2599                 if (ret) {
2600                         printk(KERN_ERR PFX "Couldn't open %s port %d "
2601                                "for agents\n",
2602                                device->name, cur_port);
2603                         goto error_device_open;
2604                 }
2605         }
2606
2607         goto error_device_query;
2608
2609 error_device_open:
2610         while (i > 0) {
2611                 cur_port--;
2612                 ret2 = ib_agent_port_close(device, cur_port);
2613                 if (ret2) {
2614                         printk(KERN_ERR PFX "Couldn't close %s port %d "
2615                                "for agents\n",
2616                                device->name, cur_port);
2617                 }
2618                 ret2 = ib_mad_port_close(device, cur_port);
2619                 if (ret2) {
2620                         printk(KERN_ERR PFX "Couldn't close %s port %d\n",
2621                                device->name, cur_port);
2622                 }
2623                 i--;
2624         }
2625
2626 error_device_query:
2627         return;
2628 }
2629
2630 static void ib_mad_remove_device(struct ib_device *device)
2631 {
2632         int ret = 0, i, num_ports, cur_port, ret2;
2633
2634         if (device->node_type == IB_NODE_SWITCH) {
2635                 num_ports = 1;
2636                 cur_port = 0;
2637         } else {
2638                 num_ports = device->phys_port_cnt;
2639                 cur_port = 1;
2640         }
2641         for (i = 0; i < num_ports; i++, cur_port++) {
2642                 ret2 = ib_agent_port_close(device, cur_port);
2643                 if (ret2) {
2644                         printk(KERN_ERR PFX "Couldn't close %s port %d "
2645                                "for agents\n",
2646                                device->name, cur_port);
2647                         if (!ret)
2648                                 ret = ret2;
2649                 }
2650                 ret2 = ib_mad_port_close(device, cur_port);
2651                 if (ret2) {
2652                         printk(KERN_ERR PFX "Couldn't close %s port %d\n",
2653                                device->name, cur_port);
2654                         if (!ret)
2655                                 ret = ret2;
2656                 }
2657         }
2658 }
2659
2660 static struct ib_client mad_client = {
2661         .name   = "mad",
2662         .add = ib_mad_init_device,
2663         .remove = ib_mad_remove_device
2664 };
2665
2666 static int __init ib_mad_init_module(void)
2667 {
2668         int ret;
2669
2670         spin_lock_init(&ib_mad_port_list_lock);
2671         spin_lock_init(&ib_agent_port_list_lock);
2672
2673         ib_mad_cache = kmem_cache_create("ib_mad",
2674                                          sizeof(struct ib_mad_private),
2675                                          0,
2676                                          SLAB_HWCACHE_ALIGN,
2677                                          NULL,
2678                                          NULL);
2679         if (!ib_mad_cache) {
2680                 printk(KERN_ERR PFX "Couldn't create ib_mad cache\n");
2681                 ret = -ENOMEM;
2682                 goto error1;
2683         }
2684
2685         INIT_LIST_HEAD(&ib_mad_port_list);
2686
2687         if (ib_register_client(&mad_client)) {
2688                 printk(KERN_ERR PFX "Couldn't register ib_mad client\n");
2689                 ret = -EINVAL;
2690                 goto error2;
2691         }
2692
2693         return 0;
2694
2695 error2:
2696         kmem_cache_destroy(ib_mad_cache);
2697 error1:
2698         return ret;
2699 }
2700
2701 static void __exit ib_mad_cleanup_module(void)
2702 {
2703         ib_unregister_client(&mad_client);
2704
2705         if (kmem_cache_destroy(ib_mad_cache)) {
2706                 printk(KERN_DEBUG PFX "Failed to destroy ib_mad cache\n");
2707         }
2708 }
2709
2710 module_init(ib_mad_init_module);
2711 module_exit(ib_mad_cleanup_module);