Signed-off-by: Andrew Morton <akpm@osdl.org>
---

 25-akpm/drivers/message/i2o/block-osm.c  |   42 +++++++++++----------
 25-akpm/drivers/message/i2o/config-osm.c |   56 ++++++++++++++--------------
 25-akpm/drivers/message/i2o/device.c     |    8 ++--
 25-akpm/drivers/message/i2o/driver.c     |   12 +++---
 25-akpm/drivers/message/i2o/exec-osm.c   |   32 ++++++++--------
 25-akpm/drivers/message/i2o/iop.c        |   60 +++++++++++++++----------------
 25-akpm/drivers/message/i2o/scsi-osm.c   |   30 ++++++++-------
 25-akpm/include/linux/i2o.h              |    4 +-
 8 files changed, 125 insertions(+), 119 deletions(-)

diff -puN include/linux/i2o.h~i2o-build_99-gcc295-fixes include/linux/i2o.h
--- 25/include/linux/i2o.h~i2o-build_99-gcc295-fixes	2004-07-31 22:50:54.000000000 -0700
+++ 25-akpm/include/linux/i2o.h	2004-07-31 23:28:59.034854648 -0700
@@ -50,9 +50,9 @@ struct i2o_message
 			u32	function:8;
 			u32	icntxt; /* initiator context */
 			u32	tcntxt; /* transaction context */
-		};
+		} s;
 		u32	head[4];
-	};
+	} u;
 	/* List follows */
 	u32 body[0];
 };
diff -puN drivers/message/i2o/block-osm.c~i2o-build_99-gcc295-fixes drivers/message/i2o/block-osm.c
--- 25/drivers/message/i2o/block-osm.c~i2o-build_99-gcc295-fixes	2004-07-31 22:50:54.000000000 -0700
+++ 25-akpm/drivers/message/i2o/block-osm.c	2004-07-31 22:50:54.000000000 -0700
@@ -133,8 +133,10 @@ static struct i2o_driver i2o_block_drive
 	.event		= i2o_block_event,
 	.reply		= i2o_block_reply,
 	.classes	= i2o_block_class_id,
-	.driver.probe	= i2o_block_probe,
-	.driver.remove	= i2o_block_remove
+	.driver		= {
+				.probe = i2o_block_probe,
+				.remove = i2o_block_remove,
+			},
 };
 
 
@@ -384,9 +386,9 @@ static int i2o_block_device_flush(struct
 	if(m == I2O_QUEUE_EMPTY)
 		return -ETIMEDOUT;
 
-	writel(FIVE_WORD_MSG_SIZE|SGL_OFFSET_0, &msg->head[0]);
+	writel(FIVE_WORD_MSG_SIZE|SGL_OFFSET_0, &msg->u.head[0]);
 	writel(I2O_CMD_BLOCK_CFLUSH<<24|HOST_TID<<12|dev->lct_data.tid,
-	       &msg->head[1]);
+	       &msg->u.head[1]);
 	writel(60<<16, &msg->body[0]);
 	DBG("Flushing...\n");
 
@@ -412,9 +414,9 @@ static int i2o_block_device_mount(struct
 	if(m == I2O_QUEUE_EMPTY)
 		return -ETIMEDOUT;
 
-	writel(FIVE_WORD_MSG_SIZE|SGL_OFFSET_0, &msg->head[0]);
+	writel(FIVE_WORD_MSG_SIZE|SGL_OFFSET_0, &msg->u.head[0]);
 	writel(I2O_CMD_BLOCK_MMOUNT<<24|HOST_TID<<12|dev->lct_data.tid,
-	       &msg->head[1]);
+	       &msg->u.head[1]);
 	writel(-1, &msg->body[0]);
 	writel(0, &msg->body[1]);
 	DBG("Mounting...\n");
@@ -441,9 +443,9 @@ static int i2o_block_device_lock(struct 
 	if(m == I2O_QUEUE_EMPTY)
 		return -ETIMEDOUT;
 
-	writel(FIVE_WORD_MSG_SIZE|SGL_OFFSET_0, &msg->head[0]);
+	writel(FIVE_WORD_MSG_SIZE|SGL_OFFSET_0, &msg->u.head[0]);
 	writel(I2O_CMD_BLOCK_MLOCK<<24|HOST_TID<<12|dev->lct_data.tid,
-	       &msg->head[1]);
+	       &msg->u.head[1]);
 	writel(-1, &msg->body[0]);
 	DBG("Locking...\n");
 
@@ -469,9 +471,9 @@ static int i2o_block_device_unlock(struc
 	if(m == I2O_QUEUE_EMPTY)
 		return -ETIMEDOUT;
 
-	writel(FIVE_WORD_MSG_SIZE|SGL_OFFSET_0, &msg->head[0]);
+	writel(FIVE_WORD_MSG_SIZE|SGL_OFFSET_0, &msg->u.head[0]);
 	writel(I2O_CMD_BLOCK_MUNLOCK<<24|HOST_TID<<12|dev->lct_data.tid,
-	       &msg->head[1]);
+	       &msg->u.head[1]);
 	writel(media_id, &msg->body[0]);
 	DBG("Unlocking...\n");
 
@@ -499,9 +501,9 @@ static int i2o_block_device_power(struct
 	if(m == I2O_QUEUE_EMPTY)
 		return -ETIMEDOUT;
 
-	writel(FOUR_WORD_MSG_SIZE|SGL_OFFSET_0, &msg->head[0]);
+	writel(FOUR_WORD_MSG_SIZE|SGL_OFFSET_0, &msg->u.head[0]);
 	writel(I2O_CMD_BLOCK_POWER<<24|HOST_TID<<12|i2o_dev->lct_data.tid,
-	       &msg->head[1]);
+	       &msg->u.head[1]);
 	writel(op << 24, &msg->body[0]);
 	DBG("Power...\n");
 
@@ -746,8 +748,8 @@ static int i2o_block_transfer(struct req
 	}
 
 	/* Build the message based on the request. */
-	writel(i2o_block_driver.context, &msg->icntxt);
-	writel(tcntxt, &msg->tcntxt);
+	writel(i2o_block_driver.context, &msg->u.s.icntxt);
+	writel(tcntxt, &msg->u.s.tcntxt);
 	writel(req->nr_sectors << 9, &msg->body[1]);
 
 	writel((((u64)req->sector) << 9) & 0xffffffff, &msg->body[2]);
@@ -758,7 +760,7 @@ static int i2o_block_transfer(struct req
 	sg = ireq->sg_table;
 
 	if(rq_data_dir(req) == READ) {
-		writel(I2O_CMD_BLOCK_READ<<24|HOST_TID<<12|tid, &msg->head[1]);
+		writel(I2O_CMD_BLOCK_READ<<24|HOST_TID<<12|tid, &msg->u.head[1]);
 		sg_flags = 0x10000000;
 		switch(dev->rcache) {
 			case CACHE_NULL:
@@ -773,7 +775,7 @@ static int i2o_block_transfer(struct req
 				break;
 		}
 	} else {
-		writel(I2O_CMD_BLOCK_WRITE<<24|HOST_TID<<12|tid, &msg->head[1]);
+		writel(I2O_CMD_BLOCK_WRITE<<24|HOST_TID<<12|tid, &msg->u.head[1]);
 		sg_flags = 0x14000000;
 		switch(dev->wcache) {
 			case CACHE_NULL:
@@ -805,7 +807,7 @@ static int i2o_block_transfer(struct req
 		sg++;
 	}
 
-	writel(I2O_MESSAGE_SIZE(((unsigned long)mptr-(unsigned long)&msg->head[0])>>2) | SGL_OFFSET_8, &msg->head[0]);
+	writel(I2O_MESSAGE_SIZE(((unsigned long)mptr-(unsigned long)&msg->u.head[0])>>2) | SGL_OFFSET_8, &msg->u.head[0]);
 
 	i2o_msg_post(c,m);
 
@@ -845,7 +847,7 @@ static int i2o_block_reply(struct i2o_co
 	unsigned long flags;
 
 	/* FAILed message */
-	if(unlikely(readl(&msg->head[0]) & (1<<13))) {
+	if(unlikely(readl(&msg->u.head[0]) & (1<<13))) {
 		struct i2o_message *pmsg;
 		u32 pm;
 
@@ -863,7 +865,7 @@ static int i2o_block_reply(struct i2o_co
 		pm = readl(&msg->body[3]);
 		pmsg = c->in_queue.virt + pm;
 
-		req = i2o_cntxt_list_get(c, readl(&pmsg->tcntxt));
+		req = i2o_cntxt_list_get(c, readl(&pmsg->u.s.tcntxt));
 		if(unlikely(!req)) {
 			printk(KERN_ERR "block-osm: NULL reply received!\n");
 			return -1;
@@ -893,7 +895,7 @@ static int i2o_block_reply(struct i2o_co
 		return -1;
 	}
 
-	req = i2o_cntxt_list_get(c, readl(&msg->tcntxt));
+	req = i2o_cntxt_list_get(c, readl(&msg->u.s.tcntxt));
 	if(unlikely(!req)) {
 		printk(KERN_ERR "block-osm: NULL reply received!\n");
 		return -1;
diff -puN drivers/message/i2o/config-osm.c~i2o-build_99-gcc295-fixes drivers/message/i2o/config-osm.c
--- 25/drivers/message/i2o/config-osm.c~i2o-build_99-gcc295-fixes	2004-07-31 22:50:54.000000000 -0700
+++ 25-akpm/drivers/message/i2o/config-osm.c	2004-07-31 23:29:17.095109072 -0700
@@ -474,10 +474,10 @@ static int i2o_cfg_swdl(unsigned long ar
 
 	__copy_from_user(buffer.virt, kxfer.buf, fragsize);
 
-	writel(NINE_WORD_MSG_SIZE | SGL_OFFSET_7, &msg->head[0]);
-	writel(I2O_CMD_SW_DOWNLOAD<<24|HOST_TID<<12|ADAPTER_TID, &msg->head[1]);
-	writel(i2o_config_driver.context, &msg->head[2]);
-	writel(0, &msg->head[3]);
+	writel(NINE_WORD_MSG_SIZE | SGL_OFFSET_7, &msg->u.head[0]);
+	writel(I2O_CMD_SW_DOWNLOAD<<24|HOST_TID<<12|ADAPTER_TID, &msg->u.head[1]);
+	writel(i2o_config_driver.context, &msg->u.head[2]);
+	writel(0, &msg->u.head[3]);
 	writel((((u32)kxfer.flags)<<24) | (((u32)kxfer.sw_type)<<16) |
 		(((u32)maxfrag)<<8) | (((u32)curfrag)), &msg->body[0]);
 	writel(swlen, &msg->body[1]);
@@ -542,10 +542,10 @@ static int i2o_cfg_swul(unsigned long ar
 		return -ENOMEM;
 	}
 
-	writel(NINE_WORD_MSG_SIZE | SGL_OFFSET_7, &msg->head[0]);
-	writel(I2O_CMD_SW_UPLOAD<<24|HOST_TID<<12|ADAPTER_TID, &msg->head[1]);
-	writel(i2o_config_driver.context, &msg->head[2]);
-	writel(0, &msg->head[3]);
+	writel(NINE_WORD_MSG_SIZE | SGL_OFFSET_7, &msg->u.head[0]);
+	writel(I2O_CMD_SW_UPLOAD<<24|HOST_TID<<12|ADAPTER_TID, &msg->u.head[1]);
+	writel(i2o_config_driver.context, &msg->u.head[2]);
+	writel(0, &msg->u.head[3]);
 	writel((u32)kxfer.flags<<24|(u32)kxfer.sw_type<<16|(u32)maxfrag<<8|(u32)curfrag, &msg->body[0]);
 	writel(swlen, &msg->body[1]);
 	writel(kxfer.sw_id, &msg->body[2]);
@@ -593,10 +593,10 @@ static int i2o_cfg_swdel(unsigned long a
 	if(m == I2O_QUEUE_EMPTY)
 		return -EBUSY;
 
-	writel(SEVEN_WORD_MSG_SIZE | SGL_OFFSET_0, &msg->head[0]);
-	writel(I2O_CMD_SW_REMOVE<<24|HOST_TID<<12|ADAPTER_TID, &msg->head[1]);
-	writel(i2o_config_driver.context, &msg->head[2]);
-	writel(0, &msg->head[3]);
+	writel(SEVEN_WORD_MSG_SIZE | SGL_OFFSET_0, &msg->u.head[0]);
+	writel(I2O_CMD_SW_REMOVE<<24|HOST_TID<<12|ADAPTER_TID, &msg->u.head[1]);
+	writel(i2o_config_driver.context, &msg->u.head[2]);
+	writel(0, &msg->u.head[3]);
 	writel((u32)kxfer.flags<<24 | (u32)kxfer.sw_type<<16, &msg->body[0]);
 	writel(swlen, &msg->body[1]);
 	writel(kxfer.sw_id, &msg->body[2]);
@@ -627,10 +627,10 @@ static int i2o_cfg_validate(unsigned lon
 	if(m == I2O_QUEUE_EMPTY)
 		return -EBUSY;
 
-	writel(FOUR_WORD_MSG_SIZE|SGL_OFFSET_0, &msg->head[0]);
-	writel(I2O_CMD_CONFIG_VALIDATE<<24|HOST_TID<<12|iop, &msg->head[1]);
-	writel(i2o_config_driver.context, &msg->head[2]);
-	writel(0, &msg->head[3]);
+	writel(FOUR_WORD_MSG_SIZE|SGL_OFFSET_0, &msg->u.head[0]);
+	writel(I2O_CMD_CONFIG_VALIDATE<<24|HOST_TID<<12|iop, &msg->u.head[1]);
+	writel(i2o_config_driver.context, &msg->u.head[2]);
+	writel(0, &msg->u.head[3]);
 
 	token = i2o_msg_post_wait(c, m, 10);
 
@@ -669,11 +669,11 @@ static int i2o_cfg_evt_reg(unsigned long
 	if(m == I2O_QUEUE_EMPTY)
 		return -EBUSY;
 
-	writel(FOUR_WORD_MSG_SIZE|SGL_OFFSET_0, &msg->head[0]);
+	writel(FOUR_WORD_MSG_SIZE|SGL_OFFSET_0, &msg->u.head[0]);
 	writel(I2O_CMD_UTIL_EVT_REGISTER<<24|HOST_TID<<12|kdesc.tid,
-	       &msg->head[1]);
-	writel(i2o_config_driver.context, &msg->head[2]);
-	writel(i2o_cntxt_list_add(c, fp->private_data), &msg->head[3]);
+	       &msg->u.head[1]);
+	writel(i2o_config_driver.context, &msg->u.head[2]);
+	writel(i2o_cntxt_list_add(c, fp->private_data), &msg->u.head[3]);
 	writel(kdesc.evt_mask, &msg->body[0]);
 
 	i2o_msg_post(c, m);
@@ -772,10 +772,10 @@ static int i2o_cfg_passthru32(unsigned f
 	}
 	memset(reply, 0, reply_size);
 
-	sg_offset = (msg->head[0]>>4)&0x0f;
+	sg_offset = (msg->u.head[0]>>4)&0x0f;
 
-	writel(i2o_config_driver.context, &msg->icntxt);
-	writel(i2o_cntxt_list_add(c, reply), &msg->tcntxt);
+	writel(i2o_config_driver.context, &msg->u.s.icntxt);
+	writel(i2o_cntxt_list_add(c, reply), &msg->u.s.tcntxt);
 
 	memset(sg_list,0, sizeof(sg_list[0])*SG_TABLESIZE);
 	if(sg_offset) {
@@ -786,7 +786,7 @@ static int i2o_cfg_passthru32(unsigned f
 			goto cleanup;
 		}
 		// TODO 64bit fix
-		sg = (struct sg_simple_element*) ((&msg->head[0])+sg_offset);
+		sg = (struct sg_simple_element*) ((&msg->u.head[0])+sg_offset);
 		sg_count = (size - sg_offset*4) / sizeof(struct sg_simple_element);
 		if (sg_count > SG_TABLESIZE) {
 			printk(KERN_DEBUG"%s:IOCTL SG List too large (%u)\n", c->name,sg_count);
@@ -954,10 +954,10 @@ static int i2o_cfg_passthru(unsigned lon
 	}
 	memset(reply, 0, reply_size);
 
-	sg_offset = (msg->head[0]>>4)&0x0f;
+	sg_offset = (msg->u.head[0]>>4)&0x0f;
 
-	writel(i2o_config_driver.context, &msg->icntxt);
-	writel(i2o_cntxt_list_add(c, reply), &msg->tcntxt);
+	writel(i2o_config_driver.context, &msg->u.s.icntxt);
+	writel(i2o_cntxt_list_add(c, reply), &msg->u.s.tcntxt);
 
 	memset(sg_list,0, sizeof(sg_list[0])*SG_TABLESIZE);
 	if(sg_offset) {
@@ -968,7 +968,7 @@ static int i2o_cfg_passthru(unsigned lon
 			goto cleanup;
 		}
 		// TODO 64bit fix
-		sg = (struct sg_simple_element*) ((&msg->head[0])+sg_offset);
+		sg = (struct sg_simple_element*) ((&msg->u.head[0])+sg_offset);
 		sg_count = (size - sg_offset*4) / sizeof(struct sg_simple_element);
 		if (sg_count > SG_TABLESIZE) {
 			printk(KERN_DEBUG"%s:IOCTL SG List too large (%u)\n", c->name,sg_count);
diff -puN drivers/message/i2o/iop.c~i2o-build_99-gcc295-fixes drivers/message/i2o/iop.c
--- 25/drivers/message/i2o/iop.c~i2o-build_99-gcc295-fixes	2004-07-31 22:50:54.000000000 -0700
+++ 25-akpm/drivers/message/i2o/iop.c	2004-07-31 22:50:54.000000000 -0700
@@ -101,10 +101,10 @@ void i2o_msg_nop(struct i2o_controller *
 {
 	struct i2o_message *msg = c->in_queue.virt + m;
 
-	writel(THREE_WORD_MSG_SIZE|SGL_OFFSET_0, &msg->head[0]);
-	writel(I2O_CMD_UTIL_NOP<<24|HOST_TID<<12|ADAPTER_TID, &msg->head[1]);
-	writel(0, &msg->head[2]);
-	writel(0, &msg->head[3]);
+	writel(THREE_WORD_MSG_SIZE|SGL_OFFSET_0, &msg->u.head[0]);
+	writel(I2O_CMD_UTIL_NOP<<24|HOST_TID<<12|ADAPTER_TID, &msg->u.head[1]);
+	writel(0, &msg->u.head[2]);
+	writel(0, &msg->u.head[3]);
 	i2o_msg_post(c, m);
 };
 
@@ -346,8 +346,8 @@ static int i2o_iop_quiesce(struct i2o_co
 	if(m == I2O_QUEUE_EMPTY)
 		return -ETIMEDOUT;
 
-	writel(FOUR_WORD_MSG_SIZE|SGL_OFFSET_0, &msg->head[0]);
-	writel(I2O_CMD_SYS_QUIESCE<<24|HOST_TID<<12|ADAPTER_TID, &msg->head[1]);
+	writel(FOUR_WORD_MSG_SIZE|SGL_OFFSET_0, &msg->u.head[0]);
+	writel(I2O_CMD_SYS_QUIESCE<<24|HOST_TID<<12|ADAPTER_TID, &msg->u.head[1]);
 
 	/* Long timeout needed for quiesce if lots of devices */
 	if ((rc=i2o_msg_post_wait(c, m, 240)))
@@ -386,8 +386,8 @@ static int i2o_iop_enable(struct i2o_con
 	if(m == I2O_QUEUE_EMPTY)
 		return -ETIMEDOUT;
 
-	writel(FOUR_WORD_MSG_SIZE|SGL_OFFSET_0, &msg->head[0]);
-	writel(I2O_CMD_SYS_ENABLE<<24|HOST_TID<<12|ADAPTER_TID, &msg->head[1]);
+	writel(FOUR_WORD_MSG_SIZE|SGL_OFFSET_0, &msg->u.head[0]);
+	writel(I2O_CMD_SYS_ENABLE<<24|HOST_TID<<12|ADAPTER_TID, &msg->u.head[1]);
 
 	/* How long of a timeout do we need? */
 	if((rc = i2o_msg_post_wait(c, m, 240)))
@@ -507,9 +507,9 @@ static int i2o_iop_clear(struct i2o_cont
 	/* Quiesce all IOPs first */
 	i2o_iop_quiesce_all();
 
-	writel(FOUR_WORD_MSG_SIZE|SGL_OFFSET_0, &msg->head[0]);
+	writel(FOUR_WORD_MSG_SIZE|SGL_OFFSET_0, &msg->u.head[0]);
 	writel(I2O_CMD_ADAPTER_CLEAR<<24|HOST_TID<<12|ADAPTER_TID,
-	       &msg->head[1]);
+	       &msg->u.head[1]);
 
 	if ((rc=i2o_msg_post_wait(c, m, 30)))
 		printk(KERN_INFO "%s: Unable to clear (status=%#x).\n",
@@ -554,11 +554,11 @@ static int i2o_iop_reset(struct i2o_cont
 	/* Quiesce all IOPs first */
 	i2o_iop_quiesce_all();
 
-	writel(EIGHT_WORD_MSG_SIZE|SGL_OFFSET_0, &msg->head[0]);
+	writel(EIGHT_WORD_MSG_SIZE|SGL_OFFSET_0, &msg->u.head[0]);
 	writel(I2O_CMD_ADAPTER_RESET<<24|HOST_TID<<12|ADAPTER_TID,
-	       &msg->head[1]);
-	writel(i2o_exec_driver.context, &msg->icntxt);
-	writel(0, &msg->tcntxt); //FIXME: use reasonable transaction context
+	       &msg->u.head[1]);
+	writel(i2o_exec_driver.context, &msg->u.s.icntxt);
+	writel(0, &msg->u.s.tcntxt); //FIXME: use reasonable transaction context
 	writel(0, &msg->body[0]);
 	writel(0, &msg->body[1]);
 	writel(i2o_ptr_low((void *)c->status.phys), &msg->body[2]);
@@ -794,8 +794,8 @@ static int i2o_iop_systab_set(struct i2o
 		return -ENOMEM;
 	}
 
-	writel(I2O_MESSAGE_SIZE(12) | SGL_OFFSET_6, &msg->head[0]);
-	writel(I2O_CMD_SYS_TAB_SET<<24|HOST_TID<<12|ADAPTER_TID, &msg->head[1]);
+	writel(I2O_MESSAGE_SIZE(12) | SGL_OFFSET_6, &msg->u.head[0]);
+	writel(I2O_CMD_SYS_TAB_SET<<24|HOST_TID<<12|ADAPTER_TID, &msg->u.head[1]);
 
 	/*
  	 * Provide three SGL-elements:
@@ -869,10 +869,10 @@ int i2o_status_get(struct i2o_controller
 	if(m == I2O_QUEUE_EMPTY)
 		return -ETIMEDOUT;
 
-	writel(NINE_WORD_MSG_SIZE|SGL_OFFSET_0, &msg->head[0]);
-	writel(I2O_CMD_STATUS_GET<<24|HOST_TID<<12|ADAPTER_TID, &msg->head[1]);
-	writel(i2o_exec_driver.context, &msg->icntxt);
-	writel(0, &msg->tcntxt); // FIXME: use resonable transaction context
+	writel(NINE_WORD_MSG_SIZE|SGL_OFFSET_0, &msg->u.head[0]);
+	writel(I2O_CMD_STATUS_GET<<24|HOST_TID<<12|ADAPTER_TID, &msg->u.head[1]);
+	writel(i2o_exec_driver.context, &msg->u.s.icntxt);
+	writel(0, &msg->u.s.tcntxt); // FIXME: use resonable transaction context
 	writel(0, &msg->body[0]);
 	writel(0, &msg->body[1]);
 	writel(i2o_ptr_low((void *)c->status_block.phys), &msg->body[2]);
@@ -927,9 +927,9 @@ int i2o_hrt_get(struct i2o_controller *c
 		if(m == I2O_QUEUE_EMPTY)
 			return -ETIMEDOUT;
 
-		writel(SIX_WORD_MSG_SIZE| SGL_OFFSET_4, &msg->head[0]);
+		writel(SIX_WORD_MSG_SIZE| SGL_OFFSET_4, &msg->u.head[0]);
 		writel(I2O_CMD_HRT_GET<<24|HOST_TID<<12|ADAPTER_TID,
-		       &msg->head[1]);
+		       &msg->u.head[1]);
 		writel(0xd0000000 | c->hrt.len, &msg->body[0]);
 		writel(c->hrt.phys, &msg->body[1]);
 
@@ -982,11 +982,11 @@ int i2o_iop_init_outbound_queue(struct i
 	if(m == I2O_QUEUE_EMPTY)
 		return -ETIMEDOUT;
 
-	writel(EIGHT_WORD_MSG_SIZE| TRL_OFFSET_6, &msg->head[0]);
+	writel(EIGHT_WORD_MSG_SIZE| TRL_OFFSET_6, &msg->u.head[0]);
 	writel(I2O_CMD_OUTBOUND_INIT<<24|HOST_TID<<12|ADAPTER_TID,
-	       &msg->head[1]);
-	writel(i2o_exec_driver.context, &msg->icntxt);
-	writel(0x0106, &msg->tcntxt);		/* FIXME: why 0x0106, maybe in
+	       &msg->u.head[1]);
+	writel(i2o_exec_driver.context, &msg->u.s.icntxt);
+	writel(0x0106, &msg->u.s.tcntxt);		/* FIXME: why 0x0106, maybe in
 						   Spec? */
 	writel(PAGE_SIZE, &msg->body[0]);
 	writel(MSG_FRAME_SIZE<<16|0x80, &msg->body[1]);	/* Outbound msg frame
@@ -1166,11 +1166,11 @@ int i2o_event_register(struct i2o_device
 	if(m == I2O_QUEUE_EMPTY)
 		return -ETIMEDOUT;
 
-	writel(FIVE_WORD_MSG_SIZE|SGL_OFFSET_0, &msg->head[0]);
+	writel(FIVE_WORD_MSG_SIZE|SGL_OFFSET_0, &msg->u.head[0]);
 	writel(I2O_CMD_UTIL_EVT_REGISTER<<24|HOST_TID<<12|dev->lct_data.tid,
-	       &msg->head[1]);
-	writel(drv->context, &msg->icntxt);
-	writel(tcntxt, &msg->tcntxt);
+	       &msg->u.head[1]);
+	writel(drv->context, &msg->u.s.icntxt);
+	writel(tcntxt, &msg->u.s.tcntxt);
 	writel(evt_mask, &msg->body[0]);
 
 	i2o_msg_post(c, m);
diff -puN drivers/message/i2o/driver.c~i2o-build_99-gcc295-fixes drivers/message/i2o/driver.c
--- 25/drivers/message/i2o/driver.c~i2o-build_99-gcc295-fixes	2004-07-31 22:50:54.000000000 -0700
+++ 25-akpm/drivers/message/i2o/driver.c	2004-07-31 22:50:54.000000000 -0700
@@ -183,7 +183,7 @@ void i2o_driver_unregister(struct i2o_dr
 int i2o_driver_dispatch(struct i2o_controller *c, u32 m,struct i2o_message *msg)
 {
 	struct i2o_driver *drv;
-	u32 context = readl(&msg->icntxt);
+	u32 context = readl(&msg->u.s.icntxt);
 
 	if(likely(context < i2o_max_drivers)) {
 		spin_lock(&i2o_drivers_lock);
@@ -196,18 +196,18 @@ int i2o_driver_dispatch(struct i2o_contr
 			return -EIO;
 		}
 
-		if((readl(&msg->head[1])>>24) == I2O_CMD_UTIL_EVT_REGISTER) {
+		if((readl(&msg->u.head[1])>>24) == I2O_CMD_UTIL_EVT_REGISTER) {
 			struct i2o_device *dev, *tmp;
 			struct i2o_event *evt;
 			u16 size;
 			u16 tid;
 
-			tid = readl(&msg->head[1])&0x1fff;
+			tid = readl(&msg->u.head[1])&0x1fff;
 
 			DBG("%s: event received from device %d\n", c->name,tid);
 
 			/* cut of header from message size (in 32-bit words) */
-			size = (readl(&msg->head[0])>>16)-5;
+			size = (readl(&msg->u.head[0])>>16)-5;
 
 			evt = kmalloc(size*4 + sizeof(*evt), GFP_ATOMIC);
 			if(!evt)
@@ -215,7 +215,7 @@ int i2o_driver_dispatch(struct i2o_contr
 			memset(evt, 0, size*4 + sizeof(*evt));
 
 			evt->size = size;
-			memcpy_fromio(&evt->tcntxt, &msg->tcntxt, (size+2)*4);
+			memcpy_fromio(&evt->tcntxt, &msg->u.s.tcntxt, (size+2)*4);
 
 
 			list_for_each_entry_safe(dev, tmp, &c->devices, list)
@@ -237,7 +237,7 @@ int i2o_driver_dispatch(struct i2o_contr
 		return -EIO;
 	} else
 		printk(KERN_WARNING "i2o: Spurious reply to unknown driver "
-				    "%d\n", readl(&msg->icntxt));
+				    "%d\n", readl(&msg->u.s.icntxt));
 	return -EIO;
 }
 
diff -puN drivers/message/i2o/device.c~i2o-build_99-gcc295-fixes drivers/message/i2o/device.c
--- 25/drivers/message/i2o/device.c~i2o-build_99-gcc295-fixes	2004-07-31 22:50:54.000000000 -0700
+++ 25-akpm/drivers/message/i2o/device.c	2004-07-31 22:50:54.000000000 -0700
@@ -90,8 +90,8 @@ static inline int i2o_device_issue_claim
 	if(m == I2O_QUEUE_EMPTY)
 		return -ETIMEDOUT;
 
-	writel(FIVE_WORD_MSG_SIZE|SGL_OFFSET_0, &msg->head[0]);
-	writel(cmd<<24|HOST_TID<<12|dev->lct_data.tid, &msg->head[1]);
+	writel(FIVE_WORD_MSG_SIZE|SGL_OFFSET_0, &msg->u.head[0]);
+	writel(cmd<<24|HOST_TID<<12|dev->lct_data.tid, &msg->u.head[1]);
 	writel(type, &msg->body[0]);
 
 	return i2o_msg_post_wait(dev->iop, m, 60);
@@ -494,7 +494,7 @@ int i2o_parm_issue(struct i2o_device *i2
 	}
 
 	i = 0;
-	writel(cmd<<24 | HOST_TID<<12 | i2o_dev->lct_data.tid, &msg->head[1]);
+	writel(cmd<<24 | HOST_TID<<12 | i2o_dev->lct_data.tid, &msg->u.head[1]);
 	writel(0, &msg->body[i ++]);
 	writel(0x4C000000 | oplen, &msg->body[i ++]);	/* OperationList */
 	memcpy_toio(&msg->body[i], oplist, oplen);
@@ -503,7 +503,7 @@ int i2o_parm_issue(struct i2o_device *i2
 	writel(res.phys, &msg->body[i ++]);
 
 	writel(I2O_MESSAGE_SIZE(i+sizeof(struct i2o_message)/4)| SGL_OFFSET_5,
-	       &msg->head[0]);
+	       &msg->u.head[0]);
 
 	rc = i2o_msg_post_wait_mem(c, m, 10, &res);
 
diff -puN drivers/message/i2o/scsi-osm.c~i2o-build_99-gcc295-fixes drivers/message/i2o/scsi-osm.c
--- 25/drivers/message/i2o/scsi-osm.c~i2o-build_99-gcc295-fixes	2004-07-31 22:50:54.000000000 -0700
+++ 25-akpm/drivers/message/i2o/scsi-osm.c	2004-07-31 23:28:59.033854800 -0700
@@ -87,7 +87,7 @@ struct i2o_scsi_host {
 	struct list_head list;		/* node in in i2o_scsi_hosts */
 	struct Scsi_Host *scsi_host;	/* pointer to the SCSI host */
 	struct i2o_controller *iop;	/* pointer to the I2O controller */
-	struct i2o_device *channel[];	/* channel->i2o_dev mapping table */
+	struct i2o_device *channel[0];	/* channel->i2o_dev mapping table */
 };
 
 /*
@@ -122,8 +122,10 @@ static struct i2o_driver i2o_scsi_driver
 	.name		= "scsi-osm",
 	.reply		= i2o_scsi_reply,
 	.classes	= i2o_scsi_class_id,
-	.driver.probe	= i2o_scsi_probe,
-	.driver.remove	= i2o_scsi_remove
+	.driver		= {
+				.probe	= i2o_scsi_probe,
+				.remove	= i2o_scsi_remove,
+			},
 };
 
 /**
@@ -311,9 +313,9 @@ static int i2o_scsi_reply(struct i2o_con
 	struct device *dev;
 	u8 as,ds,st;
 
-	cmd = i2o_cntxt_list_get(c, readl(&msg->tcntxt));
+	cmd = i2o_cntxt_list_get(c, readl(&msg->u.s.tcntxt));
 
-	if(msg->head[0] & (1<<13)) {
+	if(msg->u.head[0] & (1<<13)) {
 		struct i2o_message *pmsg;	/* preserved message */
 		u32 pm;
 
@@ -323,9 +325,9 @@ static int i2o_scsi_reply(struct i2o_con
 
 		printk("IOP fail.\n");
 		printk("From %d To %d Cmd %d.\n",
-			(msg->head[1]>>12)&0xFFF,
-			msg->head[1]&0xFFF,
-			msg->head[1]>>24);
+			(msg->u.head[1]>>12)&0xFFF,
+			msg->u.head[1]&0xFFF,
+			msg->u.head[1]>>24);
 		printk("Failure Code %d.\n", msg->body[0]>>24);
 		if(msg->body[0]&(1<<16))
 			printk("Format error.\n");
@@ -338,7 +340,7 @@ static int i2o_scsi_reply(struct i2o_con
 
 		printk("Failing message is %p.\n", pmsg);
 
-		cmd = i2o_cntxt_list_get(c, readl(&pmsg->tcntxt));
+		cmd = i2o_cntxt_list_get(c, readl(&pmsg->u.s.tcntxt));
 		if(!cmd)
 			return 1;
 
@@ -553,11 +555,11 @@ static int i2o_scsi_queuecommand(struct 
 			return 0;
 	}
 
-	writel(I2O_CMD_SCSI_EXEC<<24|HOST_TID<<12|tid, &msg->head[1]);
-	writel(i2o_scsi_driver.context, &msg->icntxt);
+	writel(I2O_CMD_SCSI_EXEC<<24|HOST_TID<<12|tid, &msg->u.head[1]);
+	writel(i2o_scsi_driver.context, &msg->u.s.icntxt);
 
 	/* We want the SCSI control block back */
-	writel(i2o_cntxt_list_add(c, SCpnt), &msg->tcntxt);
+	writel(i2o_cntxt_list_add(c, SCpnt), &msg->u.s.tcntxt);
 
 	/* LSI_920_PCI_QUIRK
 	 *
@@ -615,7 +617,7 @@ static int i2o_scsi_queuecommand(struct 
 			sg++;
 		}
 
-		reqlen = mptr - &msg->head[0];
+		reqlen = mptr - &msg->u.head[0];
 		writel(len, lenptr);
 	} else {
 		len = SCpnt->request_bufflen;
@@ -640,7 +642,7 @@ static int i2o_scsi_queuecommand(struct 
 	}
 
 	/* Stick the headers on */
-	writel(reqlen<<16 | SGL_OFFSET_10, &msg->head[0]);
+	writel(reqlen<<16 | SGL_OFFSET_10, &msg->u.head[0]);
 
 	/* Queue the message */
 	i2o_msg_post(c,m);
diff -puN drivers/message/i2o/exec-osm.c~i2o-build_99-gcc295-fixes drivers/message/i2o/exec-osm.c
--- 25/drivers/message/i2o/exec-osm.c~i2o-build_99-gcc295-fixes	2004-07-31 22:50:54.000000000 -0700
+++ 25-akpm/drivers/message/i2o/exec-osm.c	2004-07-31 22:50:54.000000000 -0700
@@ -89,8 +89,10 @@ struct i2o_driver i2o_exec_driver = {
 	.reply		= i2o_exec_reply,
 	.event		= i2o_exec_event,
 	.classes	= i2o_exec_class_id,
-	.driver.probe	= i2o_exec_probe,
-	.driver.remove	= i2o_exec_remove
+	.driver		= {
+				.probe	= i2o_exec_probe,
+				.remove	= i2o_exec_remove,
+			},
 };
 
 
@@ -138,9 +140,9 @@ int i2o_msg_post_wait_mem(struct i2o_con
 	 * We will only use transaction contexts >= 0x80000000 for POST WAIT,
 	 * so we could find a POST WAIT reply easier in the reply handler.
 	 */
-	writel(i2o_exec_driver.context, &msg->icntxt);
-	iwait->tcntxt = tcntxt ++;
-	writel(iwait->tcntxt, &msg->tcntxt);
+	writel(i2o_exec_driver.context, &msg->u.s.icntxt);
+	iwait->tcntxt = tcntxt++;
+	writel(iwait->tcntxt, &msg->u.s.tcntxt);
 
 	/*
 	 * Post the message to the controller. At some point later it will
@@ -216,7 +218,7 @@ static int i2o_msg_post_wait_complete(st
 	int rc = 1;
 	u32 context;
 
-	context = readl(&msg->tcntxt);
+	context = readl(&msg->u.s.tcntxt);
 
 	/*
 	 * We need to search through the i2o_exec_wait_list to see if the given
@@ -347,7 +349,7 @@ static void i2o_exec_wait_free(struct i2
 static int i2o_exec_reply(struct i2o_controller *c, u32 m,
 			  struct i2o_message *msg)
 {
-	if (readl(&msg->head[0]) & MSG_FAIL) { // Fail bit is set
+	if (readl(&msg->u.head[0]) & MSG_FAIL) { // Fail bit is set
 		struct i2o_message *pmsg;	/* preserved message */
 		u32 pm;
 
@@ -364,10 +366,10 @@ static int i2o_exec_reply(struct i2o_con
 		return -1;
 	}
 
-	if(readl(&msg->tcntxt) & 0x80000000)
+	if(readl(&msg->u.s.tcntxt) & 0x80000000)
 		return i2o_msg_post_wait_complete(c, m, msg);
 
-	if((readl(&msg->head[1])>>24) == I2O_CMD_LCT_NOTIFY) {
+	if((readl(&msg->u.head[1])>>24) == I2O_CMD_LCT_NOTIFY) {
 		struct work_struct *work;
 
 		DBG("%s: LCT notify received\n", c->name);
@@ -430,9 +432,9 @@ int i2o_exec_lct_get(struct i2o_controll
 		if(m == I2O_QUEUE_EMPTY)
 			return -ETIMEDOUT;
 
-		writel(EIGHT_WORD_MSG_SIZE|SGL_OFFSET_6, &msg->head[0]);
+		writel(EIGHT_WORD_MSG_SIZE|SGL_OFFSET_6, &msg->u.head[0]);
 		writel(I2O_CMD_LCT_NOTIFY<<24|HOST_TID<<12|ADAPTER_TID,
-		       &msg->head[1]);
+		       &msg->u.head[1]);
 		writel(0xffffffff, &msg->body[0]);
 		writel(0x00000000, &msg->body[1]);
 		writel(0xd0000000|c->dlct.len, &msg->body[2]);
@@ -476,10 +478,10 @@ int i2o_exec_lct_notify(struct i2o_contr
 	if(m == I2O_QUEUE_EMPTY)
 		return -ETIMEDOUT;
 
-	writel(EIGHT_WORD_MSG_SIZE|SGL_OFFSET_6, &msg->head[0]);
-	writel(I2O_CMD_LCT_NOTIFY<<24|HOST_TID<<12|ADAPTER_TID, &msg->head[1]);
-	writel(i2o_exec_driver.context, &msg->icntxt);
-	writel(0, &msg->tcntxt);			/* FIXME */
+	writel(EIGHT_WORD_MSG_SIZE|SGL_OFFSET_6, &msg->u.head[0]);
+	writel(I2O_CMD_LCT_NOTIFY<<24|HOST_TID<<12|ADAPTER_TID, &msg->u.head[1]);
+	writel(i2o_exec_driver.context, &msg->u.s.icntxt);
+	writel(0, &msg->u.s.tcntxt);			/* FIXME */
 	writel(0xffffffff, &msg->body[0]);
 	writel(change_ind, &msg->body[1]);
 	writel(0xd0000000|c->dlct.len, &msg->body[2]);
_