This commit was manufactured by cvs2svn to create branch 'vserver'.
[linux-2.6.git] / drivers / message / i2o / driver.c
1 /*
2  *      Functions to handle I2O drivers (OSMs) and I2O bus type for sysfs
3  *
4  *      Copyright (C) 2004      Markus Lidel <Markus.Lidel@shadowconnect.com>
5  *
6  *      This program is free software; you can redistribute it and/or modify it
7  *      under the terms of the GNU General Public License as published by the
8  *      Free Software Foundation; either version 2 of the License, or (at your
9  *      option) any later version.
10  *
11  *      Fixes/additions:
12  *              Markus Lidel <Markus.Lidel@shadowconnect.com>
13  *                      initial version.
14  */
15
16 #include <linux/device.h>
17 #include <linux/module.h>
18 #include <linux/rwsem.h>
19 #include <linux/i2o.h>
20
21
22 /* max_drivers - Maximum I2O drivers (OSMs) which could be registered */
23 unsigned int i2o_max_drivers = I2O_MAX_DRIVERS;
24 module_param_named(max_drivers, i2o_max_drivers, uint, 0);
25 MODULE_PARM_DESC(max_drivers, "maximum number of OSM's to support");
26
27 /* I2O drivers lock and array */
28 static spinlock_t i2o_drivers_lock = SPIN_LOCK_UNLOCKED;
29 static struct i2o_driver **i2o_drivers;
30
31 /**
32  *      i2o_bus_match - Tell if a I2O device class id match the class ids of
33  *                      the I2O driver (OSM)
34  *
35  *      @dev: device which should be verified
36  *      @drv: the driver to match against
37  *
38  *      Used by the bus to check if the driver wants to handle the device.
39  *
40  *      Returns 1 if the class ids of the driver match the class id of the
41  *      device, otherwise 0.
42  */
43 static int i2o_bus_match(struct device *dev, struct device_driver *drv)
44 {
45         struct i2o_device *i2o_dev = to_i2o_device(dev);
46         struct i2o_driver *i2o_drv = to_i2o_driver(drv);
47         struct i2o_class_id *ids = i2o_drv->classes;
48
49         if (ids)
50                 while (ids->class_id != I2O_CLASS_END) {
51                         if (ids->class_id == i2o_dev->lct_data.class_id)
52                                 return 1;
53                         ids++;
54                 }
55         return 0;
56 };
57
58 /* I2O bus type */
59 struct bus_type i2o_bus_type = {
60         .name = "i2o",
61         .match = i2o_bus_match,
62 };
63
64 /**
65  *      i2o_driver_register - Register a I2O driver (OSM) in the I2O core
66  *      @drv: I2O driver which should be registered
67  *
68  *      Registers the OSM drv in the I2O core and creates an event queues if
69  *      necessary.
70  *
71  *      Returns 0 on success or negative error code on failure.
72  */
73 int i2o_driver_register(struct i2o_driver *drv)
74 {
75         struct i2o_controller *c;
76         int i;
77         int rc = 0;
78         unsigned long flags;
79
80         pr_debug("Register driver %s\n", drv->name);
81
82         if (drv->event) {
83                 drv->event_queue = create_workqueue(drv->name);
84                 if (!drv->event_queue) {
85                         printk(KERN_ERR "i2o: Could not initialize event queue "
86                                "for driver %s\n", drv->name);
87                         return -EFAULT;
88                 }
89                 pr_debug("Event queue initialized for driver %s\n", drv->name);
90         } else
91                 drv->event_queue = NULL;
92
93         drv->driver.name = drv->name;
94         drv->driver.bus = &i2o_bus_type;
95
96         spin_lock_irqsave(&i2o_drivers_lock, flags);
97
98         for (i = 0; i2o_drivers[i]; i++)
99                 if (i >= i2o_max_drivers) {
100                         printk(KERN_ERR "i2o: too many drivers registered, "
101                                "increase max_drivers\n");
102                         spin_unlock_irqrestore(&i2o_drivers_lock, flags);
103                         return -EFAULT;
104                 }
105
106         drv->context = i;
107         i2o_drivers[i] = drv;
108
109         spin_unlock_irqrestore(&i2o_drivers_lock, flags);
110
111         pr_debug("driver %s gets context id %d\n", drv->name, drv->context);
112
113         list_for_each_entry(c, &i2o_controllers, list) {
114                 struct i2o_device *i2o_dev;
115
116                 i2o_driver_notify_controller_add(drv, c);
117                 list_for_each_entry(i2o_dev, &c->devices, list)
118                         i2o_driver_notify_device_add(drv, i2o_dev);
119         }
120
121
122         rc = driver_register(&drv->driver);
123         if (rc)
124                 destroy_workqueue(drv->event_queue);
125
126         return rc;
127 };
128
129 /**
130  *      i2o_driver_unregister - Unregister a I2O driver (OSM) from the I2O core
131  *      @drv: I2O driver which should be unregistered
132  *
133  *      Unregisters the OSM drv from the I2O core and cleanup event queues if
134  *      necessary.
135  */
136 void i2o_driver_unregister(struct i2o_driver *drv)
137 {
138         struct i2o_controller *c;
139         unsigned long flags;
140
141         pr_debug("unregister driver %s\n", drv->name);
142
143         driver_unregister(&drv->driver);
144
145         list_for_each_entry(c, &i2o_controllers, list) {
146                 struct i2o_device *i2o_dev;
147
148                 list_for_each_entry(i2o_dev, &c->devices, list)
149                         i2o_driver_notify_device_remove(drv, i2o_dev);
150
151                 i2o_driver_notify_controller_remove(drv, c);
152         }
153
154         spin_lock_irqsave(&i2o_drivers_lock, flags);
155         i2o_drivers[drv->context] = NULL;
156         spin_unlock_irqrestore(&i2o_drivers_lock, flags);
157
158         if (drv->event_queue) {
159                 destroy_workqueue(drv->event_queue);
160                 drv->event_queue = NULL;
161                 pr_debug("event queue removed for %s\n", drv->name);
162         }
163 };
164
165 /**
166  *      i2o_driver_dispatch - dispatch an I2O reply message
167  *      @c: I2O controller of the message
168  *      @m: I2O message number
169  *      @msg: I2O message to be delivered
170  *
171  *      The reply is delivered to the driver from which the original message
172  *      was. This function is only called from interrupt context.
173  *
174  *      Returns 0 on success and the message should not be flushed. Returns > 0
175  *      on success and if the message should be flushed afterwords. Returns
176  *      negative error code on failure (the message will be flushed too).
177  */
178 int i2o_driver_dispatch(struct i2o_controller *c, u32 m,
179                         struct i2o_message *msg)
180 {
181         struct i2o_driver *drv;
182         u32 context = readl(&msg->u.s.icntxt);
183
184         if (likely(context < i2o_max_drivers)) {
185                 spin_lock(&i2o_drivers_lock);
186                 drv = i2o_drivers[context];
187                 spin_unlock(&i2o_drivers_lock);
188
189                 if (unlikely(!drv)) {
190                         printk(KERN_WARNING "i2o: Spurious reply to unknown "
191                                "driver %d\n", context);
192                         return -EIO;
193                 }
194
195                 if ((readl(&msg->u.head[1]) >> 24) == I2O_CMD_UTIL_EVT_REGISTER) {
196                         struct i2o_device *dev, *tmp;
197                         struct i2o_event *evt;
198                         u16 size;
199                         u16 tid;
200
201                         tid = readl(&msg->u.head[1]) & 0x1fff;
202
203                         pr_debug("%s: event received from device %d\n", c->name,
204                                  tid);
205
206                         /* cut of header from message size (in 32-bit words) */
207                         size = (readl(&msg->u.head[0]) >> 16) - 5;
208
209                         evt = kmalloc(size * 4 + sizeof(*evt), GFP_ATOMIC);
210                         if (!evt)
211                                 return -ENOMEM;
212                         memset(evt, 0, size * 4 + sizeof(*evt));
213
214                         evt->size = size;
215                         memcpy_fromio(&evt->tcntxt, &msg->u.s.tcntxt,
216                                       (size + 2) * 4);
217
218                         list_for_each_entry_safe(dev, tmp, &c->devices, list)
219                             if (dev->lct_data.tid == tid) {
220                                 evt->i2o_dev = dev;
221                                 break;
222                         }
223
224                         INIT_WORK(&evt->work, (void (*)(void *))drv->event,
225                                   evt);
226                         queue_work(drv->event_queue, &evt->work);
227                         return 1;
228                 }
229
230                 if (likely(drv->reply))
231                         return drv->reply(c, m, msg);
232                 else
233                         pr_debug("%s: Reply to driver %s, but no reply function"
234                                  " defined!\n", c->name, drv->name);
235                 return -EIO;
236         } else
237                 printk(KERN_WARNING "i2o: Spurious reply to unknown driver "
238                        "%d\n", readl(&msg->u.s.icntxt));
239         return -EIO;
240 }
241
242 /**
243  *      i2o_driver_notify_controller_add_all - Send notify of added controller
244  *                                             to all I2O drivers
245  *
246  *      Send notifications to all registered drivers that a new controller was
247  *      added.
248  */
249 void i2o_driver_notify_controller_add_all(struct i2o_controller *c) {
250         int i;
251         struct i2o_driver *drv;
252
253         for(i = 0; i < I2O_MAX_DRIVERS; i ++) {
254                 drv = i2o_drivers[i];
255
256                 if(drv)
257                         i2o_driver_notify_controller_add(drv, c);
258         }
259 }
260
261 /**
262  *      i2o_driver_notify_controller_remove_all - Send notify of removed
263  *                                                controller to all I2O drivers
264  *
265  *      Send notifications to all registered drivers that a controller was
266  *      removed.
267  */
268 void i2o_driver_notify_controller_remove_all(struct i2o_controller *c) {
269         int i;
270         struct i2o_driver *drv;
271
272         for(i = 0; i < I2O_MAX_DRIVERS; i ++) {
273                 drv = i2o_drivers[i];
274
275                 if(drv)
276                         i2o_driver_notify_controller_remove(drv, c);
277         }
278 }
279
280 /**
281  *      i2o_driver_notify_device_add_all - Send notify of added device to all
282  *                                         I2O drivers
283  *
284  *      Send notifications to all registered drivers that a device was added.
285  */
286 void i2o_driver_notify_device_add_all(struct i2o_device *i2o_dev) {
287         int i;
288         struct i2o_driver *drv;
289
290         for(i = 0; i < I2O_MAX_DRIVERS; i ++) {
291                 drv = i2o_drivers[i];
292
293                 if(drv)
294                         i2o_driver_notify_device_add(drv, i2o_dev);
295         }
296 }
297
298 /**
299  *      i2o_driver_notify_device_remove_all - Send notify of removed device to
300  *                                            all I2O drivers
301  *
302  *      Send notifications to all registered drivers that a device was removed.
303  */
304 void i2o_driver_notify_device_remove_all(struct i2o_device *i2o_dev) {
305         int i;
306         struct i2o_driver *drv;
307
308         for(i = 0; i < I2O_MAX_DRIVERS; i ++) {
309                 drv = i2o_drivers[i];
310
311                 if(drv)
312                         i2o_driver_notify_device_remove(drv, i2o_dev);
313         }
314 }
315
316 /**
317  *      i2o_driver_init - initialize I2O drivers (OSMs)
318  *
319  *      Registers the I2O bus and allocate memory for the array of OSMs.
320  *
321  *      Returns 0 on success or negative error code on failure.
322  */
323 int __init i2o_driver_init(void)
324 {
325         int rc = 0;
326
327         if ((i2o_max_drivers < 2) || (i2o_max_drivers > 64) ||
328             ((i2o_max_drivers ^ (i2o_max_drivers - 1)) !=
329              (2 * i2o_max_drivers - 1))) {
330                 printk(KERN_WARNING "i2o: max_drivers set to %d, but must be "
331                        ">=2 and <= 64 and a power of 2\n", i2o_max_drivers);
332                 i2o_max_drivers = I2O_MAX_DRIVERS;
333         }
334         printk(KERN_INFO "i2o: max_drivers=%d\n", i2o_max_drivers);
335
336         i2o_drivers =
337             kmalloc(i2o_max_drivers * sizeof(*i2o_drivers), GFP_KERNEL);
338         if (!i2o_drivers)
339                 return -ENOMEM;
340
341         memset(i2o_drivers, 0, i2o_max_drivers * sizeof(*i2o_drivers));
342
343         rc = bus_register(&i2o_bus_type);
344
345         if (rc < 0)
346                 kfree(i2o_drivers);
347
348         return rc;
349 };
350
351 /**
352  *      i2o_driver_exit - clean up I2O drivers (OSMs)
353  *
354  *      Unregisters the I2O bus and free driver array.
355  */
356 void __exit i2o_driver_exit(void)
357 {
358         bus_unregister(&i2o_bus_type);
359         kfree(i2o_drivers);
360 };
361
362 EXPORT_SYMBOL(i2o_driver_register);
363 EXPORT_SYMBOL(i2o_driver_unregister);
364 EXPORT_SYMBOL(i2o_driver_notify_controller_add_all);
365 EXPORT_SYMBOL(i2o_driver_notify_controller_remove_all);
366 EXPORT_SYMBOL(i2o_driver_notify_device_add_all);
367 EXPORT_SYMBOL(i2o_driver_notify_device_remove_all);