aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/message/i2o/driver.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/message/i2o/driver.c')
-rw-r--r--drivers/message/i2o/driver.c24
1 files changed, 10 insertions, 14 deletions
diff --git a/drivers/message/i2o/driver.c b/drivers/message/i2o/driver.c
index 393be8e2914c..c32f9dbc5744 100644
--- a/drivers/message/i2o/driver.c
+++ b/drivers/message/i2o/driver.c
@@ -17,11 +17,12 @@
17#include <linux/module.h> 17#include <linux/module.h>
18#include <linux/rwsem.h> 18#include <linux/rwsem.h>
19#include <linux/i2o.h> 19#include <linux/i2o.h>
20#include "core.h"
20 21
21#define OSM_NAME "i2o" 22#define OSM_NAME "i2o"
22 23
23/* max_drivers - Maximum I2O drivers (OSMs) which could be registered */ 24/* max_drivers - Maximum I2O drivers (OSMs) which could be registered */
24unsigned int i2o_max_drivers = I2O_MAX_DRIVERS; 25static unsigned int i2o_max_drivers = I2O_MAX_DRIVERS;
25module_param_named(max_drivers, i2o_max_drivers, uint, 0); 26module_param_named(max_drivers, i2o_max_drivers, uint, 0);
26MODULE_PARM_DESC(max_drivers, "maximum number of OSM's to support"); 27MODULE_PARM_DESC(max_drivers, "maximum number of OSM's to support");
27 28
@@ -179,15 +180,10 @@ void i2o_driver_unregister(struct i2o_driver *drv)
179int i2o_driver_dispatch(struct i2o_controller *c, u32 m) 180int i2o_driver_dispatch(struct i2o_controller *c, u32 m)
180{ 181{
181 struct i2o_driver *drv; 182 struct i2o_driver *drv;
182 struct i2o_message __iomem *msg = i2o_msg_out_to_virt(c, m); 183 struct i2o_message *msg = i2o_msg_out_to_virt(c, m);
183 u32 context; 184 u32 context = le32_to_cpu(msg->u.s.icntxt);
184 unsigned long flags; 185 unsigned long flags;
185 186
186 if(unlikely(!msg))
187 return -EIO;
188
189 context = readl(&msg->u.s.icntxt);
190
191 if (unlikely(context >= i2o_max_drivers)) { 187 if (unlikely(context >= i2o_max_drivers)) {
192 osm_warn("%s: Spurious reply to unknown driver %d\n", c->name, 188 osm_warn("%s: Spurious reply to unknown driver %d\n", c->name,
193 context); 189 context);
@@ -204,11 +200,11 @@ int i2o_driver_dispatch(struct i2o_controller *c, u32 m)
204 return -EIO; 200 return -EIO;
205 } 201 }
206 202
207 if ((readl(&msg->u.head[1]) >> 24) == I2O_CMD_UTIL_EVT_REGISTER) { 203 if ((le32_to_cpu(msg->u.head[1]) >> 24) == I2O_CMD_UTIL_EVT_REGISTER) {
208 struct i2o_device *dev, *tmp; 204 struct i2o_device *dev, *tmp;
209 struct i2o_event *evt; 205 struct i2o_event *evt;
210 u16 size; 206 u16 size;
211 u16 tid = readl(&msg->u.head[1]) & 0xfff; 207 u16 tid = le32_to_cpu(msg->u.head[1]) & 0xfff;
212 208
213 osm_debug("event received from device %d\n", tid); 209 osm_debug("event received from device %d\n", tid);
214 210
@@ -216,16 +212,16 @@ int i2o_driver_dispatch(struct i2o_controller *c, u32 m)
216 return -EIO; 212 return -EIO;
217 213
218 /* cut of header from message size (in 32-bit words) */ 214 /* cut of header from message size (in 32-bit words) */
219 size = (readl(&msg->u.head[0]) >> 16) - 5; 215 size = (le32_to_cpu(msg->u.head[0]) >> 16) - 5;
220 216
221 evt = kmalloc(size * 4 + sizeof(*evt), GFP_ATOMIC | __GFP_ZERO); 217 evt = kmalloc(size * 4 + sizeof(*evt), GFP_ATOMIC | __GFP_ZERO);
222 if (!evt) 218 if (!evt)
223 return -ENOMEM; 219 return -ENOMEM;
224 220
225 evt->size = size; 221 evt->size = size;
226 evt->tcntxt = readl(&msg->u.s.tcntxt); 222 evt->tcntxt = le32_to_cpu(msg->u.s.tcntxt);
227 evt->event_indicator = readl(&msg->body[0]); 223 evt->event_indicator = le32_to_cpu(msg->body[0]);
228 memcpy_fromio(&evt->tcntxt, &msg->u.s.tcntxt, size * 4); 224 memcpy(&evt->tcntxt, &msg->u.s.tcntxt, size * 4);
229 225
230 list_for_each_entry_safe(dev, tmp, &c->devices, list) 226 list_for_each_entry_safe(dev, tmp, &c->devices, list)
231 if (dev->lct_data.tid == tid) { 227 if (dev->lct_data.tid == tid) {