From: Brian King <brking@us.ibm.com>

The attached patch should fix your compile problems on ia32.  I would
prefer to apply the patch and allow ipr to compile on ia32, as I actually
do quite a bit of running on it.


---

 25-akpm/drivers/scsi/ipr.c |   57 ++++++++++++++++++++++-----------------------
 25-akpm/drivers/scsi/ipr.h |   10 +++----
 2 files changed, 34 insertions(+), 33 deletions(-)

diff -puN drivers/scsi/ipr.c~ipr-gcc-attribute-fixes drivers/scsi/ipr.c
--- 25/drivers/scsi/ipr.c~ipr-gcc-attribute-fixes	2004-05-19 18:45:32.662395384 -0700
+++ 25-akpm/drivers/scsi/ipr.c	2004-05-19 18:45:32.674393560 -0700
@@ -736,13 +736,13 @@ static void ipr_send_hcam(struct ipr_ioa
 		ioarcb->cmd_pkt.request_type = IPR_RQTYPE_HCAM;
 		ioarcb->cmd_pkt.cdb[0] = IPR_HOST_CONTROLLED_ASYNC;
 		ioarcb->cmd_pkt.cdb[1] = type;
-		ioarcb->cmd_pkt.cdb[7] = (IPR_HOSTRCB_SZ >> 8) & 0xff;
-		ioarcb->cmd_pkt.cdb[8] = IPR_HOSTRCB_SZ & 0xff;
+		ioarcb->cmd_pkt.cdb[7] = (sizeof(hostrcb->hcam) >> 8) & 0xff;
+		ioarcb->cmd_pkt.cdb[8] = sizeof(hostrcb->hcam) & 0xff;
 
-		ioarcb->read_data_transfer_length = cpu_to_be32(IPR_HOSTRCB_SZ);
+		ioarcb->read_data_transfer_length = cpu_to_be32(sizeof(hostrcb->hcam));
 		ioarcb->read_ioadl_len = cpu_to_be32(sizeof(struct ipr_ioadl_desc));
 		ipr_cmd->ioadl[0].flags_and_data_len =
-			cpu_to_be32(IPR_IOADL_FLAGS_READ_LAST | IPR_HOSTRCB_SZ);
+			cpu_to_be32(IPR_IOADL_FLAGS_READ_LAST | sizeof(hostrcb->hcam));
 		ipr_cmd->ioadl[0].address = cpu_to_be32(hostrcb->hostrcb_dma);
 
 		if (type == IPR_HCAM_CDB_OP_CODE_CONFIG_CHANGE)
@@ -794,7 +794,7 @@ static void ipr_handle_config_change(str
 	struct ipr_config_table_entry *cfgte;
 	u32 is_ndn = 1;
 
-	cfgte = &hostrcb->ccn.cfgte;
+	cfgte = &hostrcb->hcam.ccn.cfgte;
 
 	list_for_each_entry(res, &ioa_cfg->used_res_q, queue) {
 		if (!memcmp(&res->cfgte.res_addr, &cfgte->res_addr,
@@ -822,7 +822,7 @@ static void ipr_handle_config_change(str
 
 	memcpy(&res->cfgte, cfgte, sizeof(struct ipr_config_table_entry));
 
-	if (hostrcb->notify_type == IPR_HOST_RCB_NOTIF_TYPE_REM_ENTRY) {
+	if (hostrcb->hcam.notify_type == IPR_HOST_RCB_NOTIF_TYPE_REM_ENTRY) {
 		if (res->sdev) {
 			res->sdev->hostdata = NULL;
 			res->del_from_ml = 1;
@@ -902,7 +902,7 @@ static void ipr_log_vpd(struct ipr_std_i
 static void ipr_log_cache_error(struct ipr_ioa_cfg *ioa_cfg,
 				struct ipr_hostrcb *hostrcb)
 {
-	struct ipr_hostrcb_type_02_error *error = &hostrcb->error.type_02_error;
+	struct ipr_hostrcb_type_02_error *error = &hostrcb->hcam.error.type_02_error;
 
 	ipr_err("-----Current Configuration-----\n");
 	ipr_err("Cache Directory Card Information:\n");
@@ -938,13 +938,13 @@ static void ipr_log_config_error(struct 
 	int errors_logged, i;
 	struct ipr_hostrcb_device_data_entry *dev_entry;
 
-	errors_logged = be32_to_cpu(hostrcb->error.type_03_error.errors_logged);
+	errors_logged = be32_to_cpu(hostrcb->hcam.error.type_03_error.errors_logged);
 
 	ipr_err("Device Errors Detected/Logged: %d/%d\n",
-		be32_to_cpu(hostrcb->error.type_03_error.errors_detected),
+		be32_to_cpu(hostrcb->hcam.error.type_03_error.errors_detected),
 		errors_logged);
 
-	dev_entry = hostrcb->error.type_03_error.dev_entry;
+	dev_entry = hostrcb->hcam.error.type_03_error.dev_entry;
 
 	for (i = 0; i < errors_logged; i++, dev_entry++) {
 		ipr_err_separator;
@@ -996,7 +996,7 @@ static void ipr_log_array_error(struct i
 
 	memset(zero_sn, '0', IPR_SERIAL_NUM_LEN);
 
-	error = &hostrcb->error.type_04_error;
+	error = &hostrcb->hcam.error.type_04_error;
 
 	ipr_err_separator;
 
@@ -1064,7 +1064,7 @@ static void ipr_log_generic_error(struct
 				  struct ipr_hostrcb *hostrcb)
 {
 	int i;
-	int ioa_data_len = be32_to_cpu(hostrcb->length);
+	int ioa_data_len = be32_to_cpu(hostrcb->hcam.length);
 
 	if (ioa_data_len == 0)
 		return;
@@ -1074,10 +1074,10 @@ static void ipr_log_generic_error(struct
 
 	for (i = 0; i < ioa_data_len / 4; i += 4) {
 		ipr_err("%08X: %08X %08X %08X %08X\n", i*4,
-			be32_to_cpu(hostrcb->raw.data[i]),
-			be32_to_cpu(hostrcb->raw.data[i+1]),
-			be32_to_cpu(hostrcb->raw.data[i+2]),
-			be32_to_cpu(hostrcb->raw.data[i+3]));
+			be32_to_cpu(hostrcb->hcam.raw.data[i]),
+			be32_to_cpu(hostrcb->hcam.raw.data[i+1]),
+			be32_to_cpu(hostrcb->hcam.raw.data[i+2]),
+			be32_to_cpu(hostrcb->hcam.raw.data[i+3]));
 	}
 }
 
@@ -1119,19 +1119,19 @@ static void ipr_handle_log_data(struct i
 	u32 ioasc;
 	int error_index;
 
-	if (hostrcb->notify_type != IPR_HOST_RCB_NOTIF_TYPE_ERROR_LOG_ENTRY)
+	if (hostrcb->hcam.notify_type != IPR_HOST_RCB_NOTIF_TYPE_ERROR_LOG_ENTRY)
 		return;
 
-	if (hostrcb->notifications_lost == IPR_HOST_RCB_NOTIFICATIONS_LOST)
+	if (hostrcb->hcam.notifications_lost == IPR_HOST_RCB_NOTIFICATIONS_LOST)
 		dev_err(&ioa_cfg->pdev->dev, "Error notifications lost\n");
 
-	ioasc = be32_to_cpu(hostrcb->error.failing_dev_ioasc);
+	ioasc = be32_to_cpu(hostrcb->hcam.error.failing_dev_ioasc);
 
 	if (ioasc == IPR_IOASC_BUS_WAS_RESET ||
 	    ioasc == IPR_IOASC_BUS_WAS_RESET_BY_OTHER) {
 		/* Tell the midlayer we had a bus reset so it will handle the UA properly */
 		scsi_report_bus_reset(ioa_cfg->host,
-				      hostrcb->error.failing_dev_res_addr.bus);
+				      hostrcb->hcam.error.failing_dev_res_addr.bus);
 	}
 
 	error_index = ipr_get_error(ioasc);
@@ -1139,8 +1139,8 @@ static void ipr_handle_log_data(struct i
 	if (!ipr_error_table[error_index].log_hcam)
 		return;
 
-	if (ipr_is_device(&hostrcb->error.failing_dev_res_addr)) {
-		ipr_res_err(ioa_cfg, hostrcb->error.failing_dev_res_addr,
+	if (ipr_is_device(&hostrcb->hcam.error.failing_dev_res_addr)) {
+		ipr_res_err(ioa_cfg, hostrcb->hcam.error.failing_dev_res_addr,
 			    "%s\n", ipr_error_table[error_index].error);
 	} else {
 		dev_err(&ioa_cfg->pdev->dev, "%s\n",
@@ -1153,7 +1153,7 @@ static void ipr_handle_log_data(struct i
 	if (ioa_cfg->log_level < IPR_DEFAULT_LOG_LEVEL)
 		return;
 
-	switch (hostrcb->overlay_id) {
+	switch (hostrcb->hcam.overlay_id) {
 	case IPR_HOST_RCB_OVERLAY_ID_1:
 		ipr_log_generic_error(ioa_cfg, hostrcb);
 		break;
@@ -1173,7 +1173,7 @@ static void ipr_handle_log_data(struct i
 	default:
 		dev_err(&ioa_cfg->pdev->dev,
 			"Unknown error received. Overlay ID: %d\n",
-			hostrcb->overlay_id);
+			hostrcb->hcam.overlay_id);
 		break;
 	}
 }
@@ -4886,12 +4886,12 @@ static void ipr_get_unit_check_buffer(st
 	hostrcb = list_entry(ioa_cfg->hostrcb_free_q.next,
 			     struct ipr_hostrcb, queue);
 	list_del(&hostrcb->queue);
-	memset(hostrcb, 0, IPR_HOSTRCB_SZ);
+	memset(&hostrcb->hcam, 0, sizeof(hostrcb->hcam));
 
 	rc = ipr_get_ldump_data_section(ioa_cfg,
 					be32_to_cpu(sdt.entry[0].bar_str_offset),
-					(u32 *)hostrcb,
-					min(length, (int)IPR_HOSTRCB_SZ) / sizeof(u32));
+					(u32 *)&hostrcb->hcam,
+					min(length, (int)sizeof(hostrcb->hcam)) / sizeof(u32));
 
 	if (!rc)
 		ipr_handle_log_data(ioa_cfg, hostrcb);
@@ -5531,7 +5531,8 @@ static int __devinit ipr_alloc_mem(struc
 			goto cleanup;
 
 		memset(ioa_cfg->hostrcb[i], 0, sizeof(struct ipr_hostrcb));
-		ioa_cfg->hostrcb[i]->hostrcb_dma = ioa_cfg->hostrcb_dma[i];
+		ioa_cfg->hostrcb[i]->hostrcb_dma =
+			ioa_cfg->hostrcb_dma[i] + offsetof(struct ipr_hostrcb, hcam);
 		list_add_tail(&ioa_cfg->hostrcb[i]->queue, &ioa_cfg->hostrcb_free_q);
 	}
 
diff -puN drivers/scsi/ipr.h~ipr-gcc-attribute-fixes drivers/scsi/ipr.h
--- 25/drivers/scsi/ipr.h~ipr-gcc-attribute-fixes	2004-05-19 18:45:32.664395080 -0700
+++ 25-akpm/drivers/scsi/ipr.h	2004-05-19 18:46:10.604627288 -0700
@@ -624,7 +624,7 @@ struct ipr_hostrcb_raw {
 	u32 data[sizeof(struct ipr_hostrcb_error)/sizeof(u32)];
 }__attribute__((packed, aligned (4)));
 
-struct ipr_hostrcb {
+struct ipr_hcam {
 	u8 op_code;
 #define IPR_HOST_RCB_OP_CODE_CONFIG_CHANGE			0xE1
 #define IPR_HOST_RCB_OP_CODE_LOG_DATA				0xE2
@@ -663,13 +663,13 @@ struct ipr_hostrcb {
 		struct ipr_hostrcb_cfg_ch_not ccn;
 		struct ipr_hostrcb_raw raw;
 	};
+}__attribute__((packed, aligned (4)));
 
-	/* Driver added data */
+struct ipr_hostrcb {
+	struct ipr_hcam hcam;
 	u32 hostrcb_dma;
 	struct list_head queue;
-}__attribute__((packed, aligned (4)));
-
-#define IPR_HOSTRCB_SZ offsetof(struct ipr_hostrcb, hostrcb_dma)
+};
 
 /* IPR smart dump table structures */
 struct ipr_sdt_entry {

_