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