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