diff -urN /usr/src/linux-2.4.21-4.EL/drivers/char/ipmi.orig/ipmi_kcs_intf.c /usr/src/linux-2.4.21-4.EL/drivers/char/ipmi/ipmi_kcs_intf.c
--- /usr/src/linux-2.4.21-4.EL/drivers/char/ipmi.orig/ipmi_kcs_intf.c	2003-10-03 16:28:49.000000000 -0500
+++ /usr/src/linux-2.4.21-4.EL/drivers/char/ipmi/ipmi_kcs_intf.c	2004-08-09 07:42:49.000000000 -0500
@@ -118,6 +118,9 @@
 	/* zero if no irq; */
 	int                 irq;
 
+	/* The port or memory address status register offset/alignment */
+	int                 offset;
+
 	/* The physical and remapped memory addresses of a KCS interface. */
 	unsigned long	    physaddr;
 	unsigned char	    *addr;
@@ -775,6 +778,7 @@
 
 extern int kcs_dbg;
 static int ipmi_kcs_detect_hardware(unsigned int port,
+				    int offset,
 				    unsigned char *addr,
 				    struct kcs_data *data)
 {
@@ -789,9 +793,9 @@
 	   test that first. */
 
 	if (port) {
-		if (inb(port+1) == 0xff) return -ENODEV; 
+		if (inb(port+offset) == 0xff) return -ENODEV; 
 	} else { 
-		if (readb(addr+1) == 0xff) return -ENODEV; 
+		if (readb(addr+offset) == 0xff) return -ENODEV; 
 	}
 
 	/* Do a Get Device ID command, since it comes back with some
@@ -853,15 +857,17 @@
 static int kcs_trydefaults = 1;
 static unsigned long kcs_addrs[KCS_MAX_PARMS] = { 0, 0, 0, 0 };
 static int kcs_ports[KCS_MAX_PARMS] = { 0, 0, 0, 0 };
+static int kcs_offsets[KCS_MAX_PARMS] = { 1, 1, 1, 1 };
 static int kcs_irqs[KCS_MAX_PARMS] = { 0, 0, 0, 0 };
 
 MODULE_PARM(kcs_trydefaults, "i");
 MODULE_PARM(kcs_addrs, "1-4l");
 MODULE_PARM(kcs_irqs, "1-4i");
 MODULE_PARM(kcs_ports, "1-4i");
+MODULE_PARM(kcs_offsets, "1-4i");
 
 /* Returns 0 if initialized, or negative on an error. */
-static int init_one_kcs(int kcs_port, 
+static int init_one_kcs(int kcs_port, int kcs_offset,
 			int irq, 
 			unsigned long kcs_physaddr,
 			struct kcs_info **kcs)
@@ -893,30 +899,65 @@
 	new_kcs->addr = NULL;
 	new_kcs->physaddr = kcs_physaddr;
 	new_kcs->port = kcs_port;
+	new_kcs->offset = kcs_offset;
+	rv = (kcs_offset == 1 ? 2 : 1);
 
 	if (kcs_port) {
-		if (request_region(kcs_port, 2, DEVICE_NAME) == NULL) {
+		if (request_region(kcs_port, rv, DEVICE_NAME) == NULL) {
 			kfree(new_kcs);
 			printk(KERN_ERR 
 			       "ipmi_kcs: can't reserve port @ 0x%4.4x\n",
 		       	       kcs_port);
 			return -EIO;
 		}
+		else if (rv == 1 && request_region(kcs_port+kcs_offset, 1, DEVICE_NAME) == NULL) {
+			release_region(kcs_port, 1);
+			kfree(new_kcs);
+			printk(KERN_ERR 
+			       "ipmi_kcs: can't reserve port @ 0x%4.4x\n",
+		       	       kcs_port+kcs_offset);
+			return -EIO;
+		}
 	} else {
-		if (request_mem_region(kcs_physaddr, 2, DEVICE_NAME) == NULL) {
+		if (request_mem_region(kcs_physaddr, rv, DEVICE_NAME) == NULL) {
 			kfree(new_kcs);
 			printk(KERN_ERR 
 			       "ipmi_kcs: can't reserve memory @ 0x%lx\n",
 		       	       kcs_physaddr);
 			return -EIO;
+		} 
+		else if (rv == 1 && request_mem_region(kcs_physaddr+kcs_offset, 1, DEVICE_NAME) == NULL) {
+			release_mem_region(kcs_physaddr, 1);
+			kfree(new_kcs);
+			printk(KERN_ERR 
+			       "ipmi_kcs: can't reserve memory @ 0x%lx\n",
+		       	       kcs_physaddr+kcs_offset);
+			return -EIO;
 		}
-		if ((new_kcs->addr = ioremap(kcs_physaddr, 2)) == NULL) {
+		
+		if ((new_kcs->addr = ioremap(kcs_physaddr, rv)) == NULL) {
+			if (rv != 1)
+				release_mem_region(kcs_physaddr, rv);
+			else {
+				release_mem_region(kcs_physaddr+kcs_offset, 1);
+				release_mem_region(kcs_physaddr, 1);
+			}
 			kfree(new_kcs);
 			printk(KERN_ERR 
 			       "ipmi_kcs: can't remap memory at 0x%lx\n",
 		       	       kcs_physaddr);
 			return -EIO;
 		}
+		else if (rv == 1 && ioremap(kcs_physaddr+kcs_offset, 1) == NULL) {
+			iounmap(new_kcs->addr);
+			release_mem_region(kcs_physaddr+kcs_offset, 1);
+			release_mem_region(kcs_physaddr, 1);
+			kfree(new_kcs);
+			printk(KERN_ERR 
+			       "ipmi_kcs: can't remap memory at 0x%lx\n",
+		       	       kcs_physaddr+kcs_offset);
+			return -EIO;
+		}
 	}
 
 	new_kcs->kcs_sm = kmalloc(kcs_size(), GFP_KERNEL);
@@ -925,11 +966,11 @@
 		rv = -ENOMEM;
 		goto out_err;
 	}
-	init_kcs_data(new_kcs->kcs_sm, kcs_port, new_kcs->addr);
+	init_kcs_data(new_kcs->kcs_sm, kcs_port, kcs_offset, new_kcs->addr);
 	spin_lock_init(&(new_kcs->kcs_lock));
 	spin_lock_init(&(new_kcs->msg_lock));
 
-	rv = ipmi_kcs_detect_hardware(kcs_port, new_kcs->addr, new_kcs->kcs_sm);
+	rv = ipmi_kcs_detect_hardware(kcs_port, kcs_offset, new_kcs->addr, new_kcs->kcs_sm);
 	if (rv) {
 		if (kcs_port) 
 			printk(KERN_ERR 
@@ -1013,12 +1054,27 @@
 	return 0;
 
  out_err:
-	if (kcs_port) 
-		release_region (kcs_port, 2);
-	if (new_kcs->addr) 
+	if (kcs_port) {
+		if (kcs_offset == 1)
+			release_region (kcs_port, 2);
+		else {
+			release_region (kcs_port, 1);
+			release_region (kcs_port+kcs_offset, 1);
+		}
+	}
+	if (new_kcs->addr) {
 		iounmap(new_kcs->addr);
-	if (kcs_physaddr) 
-		release_mem_region(kcs_physaddr, 2);
+		if (kcs_offset != 1)
+			iounmap(new_kcs->addr+kcs_offset);
+	}
+	if (kcs_physaddr) {
+		if (kcs_offset == 1)
+			release_mem_region(kcs_physaddr, 2);
+		else {
+			release_mem_region(kcs_physaddr, 1);
+			release_mem_region(kcs_physaddr+kcs_offset, 1);
+		}
+	}
 	if (new_kcs->kcs_sm)
 		kfree(new_kcs->kcs_sm);
 	kfree(new_kcs);
@@ -1095,6 +1151,7 @@
 
 	for (i=0; i < KCS_MAX_PARMS; i++) {
 		rv = init_one_kcs(kcs_ports[i], 
+				  kcs_offsets[i], 
 				  kcs_irqs[i], 
 				  0, 
 				  &(kcs_infos[pos]));
@@ -1102,6 +1159,7 @@
 			pos++;
 
 		rv = init_one_kcs(0, 
+				  kcs_offsets[i], 
 				  kcs_irqs[i], 
 				  kcs_addrs[i], 
 				  &(kcs_infos[pos]));
@@ -1115,8 +1173,8 @@
 	if (kcs_trydefaults) {
 #ifdef CONFIG_ACPI
 		if ((physaddr = acpi_find_bmc())) {
-			if (!check_mem_region(physaddr, 2)) {
-				rv = init_one_kcs(0, 
+			if (!check_mem_region(physaddr, 1)) {
+				rv = init_one_kcs(0, kcs_offsets[0],
 						  0, 
 						  physaddr, 
 						  &(kcs_infos[pos]));
@@ -1125,8 +1183,8 @@
 			}
 		}
 #endif
-		if (!check_region(DEFAULT_IO_PORT, 2)) {
-			rv = init_one_kcs(DEFAULT_IO_PORT, 
+		if (!check_region(DEFAULT_IO_PORT, 1)) {
+			rv = init_one_kcs(DEFAULT_IO_PORT, kcs_offsets[0],
 					  0, 
 					  0, 
 					  &(kcs_infos[pos]));
@@ -1166,14 +1224,25 @@
 		printk(KERN_INFO 
 		       "ipmi_kcs: Releasing BMC @ port=0x%x\n",
 		       to_clean->port);
-		release_region (to_clean->port, 2);
+		if (to_clean->offset == 1)
+			release_region (to_clean->port, 2);
+		else {
+			release_region (to_clean->port, 1);
+			release_region (to_clean->port + to_clean->offset, 1);
+		}
 	}
 	if (to_clean->addr) {
 		printk(KERN_INFO 
 		       "ipmi_kcs: Releasing BMC @ addr=0x%lx\n",
 		       to_clean->physaddr);
 		iounmap(to_clean->addr);
-		release_mem_region(to_clean->physaddr, 2);
+		if (to_clean->offset == 1)
+			release_mem_region(to_clean->physaddr, 2);
+		else {
+			iounmap(to_clean->addr + to_clean->offset);
+			release_mem_region(to_clean->physaddr, 1);
+			release_mem_region(to_clean->physaddr + to_clean->offset, 1);
+		}
 	}
 
 	spin_unlock(&(to_clean->msg_lock));
diff -urN /usr/src/linux-2.4.21-4.EL/drivers/char/ipmi.orig/ipmi_kcs_sm.c /usr/src/linux-2.4.21-4.EL/drivers/char/ipmi/ipmi_kcs_sm.c
--- /usr/src/linux-2.4.21-4.EL/drivers/char/ipmi.orig/ipmi_kcs_sm.c	2003-06-13 09:51:33.000000000 -0500
+++ /usr/src/linux-2.4.21-4.EL/drivers/char/ipmi/ipmi_kcs_sm.c	2004-06-28 09:31:29.000000000 -0500
@@ -99,6 +99,7 @@
 {
 	enum kcs_states state;
 	unsigned int    port;
+	int			    offset;
 	unsigned char	*addr;
 	unsigned char   write_data[MAX_KCS_WRITE_SIZE];
 	int             write_pos;
@@ -113,10 +114,12 @@
 	long          obf_timeout;
 };
 
-void init_kcs_data(struct kcs_data *kcs, unsigned int port, unsigned char *addr)
+void init_kcs_data(struct kcs_data *kcs, 
+		unsigned int port, int offset, unsigned char *addr)
 {
 	kcs->state = KCS_IDLE;
 	kcs->port = port;
+	kcs->offset = offset;
 	kcs->addr = addr;
 	kcs->write_pos = 0;
 	kcs->write_count = 0;
@@ -133,9 +136,9 @@
 static inline unsigned char read_status(struct kcs_data *kcs)
 {
         if (kcs->port)
-		return inb(kcs->port + 1);
+		return inb(kcs->port + kcs->offset);
         else
-		return readb(kcs->addr + 1);
+		return readb(kcs->addr + kcs->offset);
 }
 
 static inline unsigned char read_data(struct kcs_data *kcs)
@@ -149,9 +152,9 @@
 static inline void write_cmd(struct kcs_data *kcs, unsigned char data)
 {
         if (kcs->port)
-		outb(data, kcs->port + 1);
+		outb(data, kcs->port + kcs->offset);
         else
-		writeb(data, kcs->addr + 1);
+		writeb(data, kcs->addr + kcs->offset);
 }
 
 static inline void write_data(struct kcs_data *kcs, unsigned char data)
@@ -472,7 +475,7 @@
 	}
 
 	if (kcs->state == KCS_HOSED) {
-		init_kcs_data(kcs, kcs->port, kcs->addr);
+		init_kcs_data(kcs, kcs->port, kcs->offset, kcs->addr);
 		return KCS_SM_HOSED;
 	}
 
diff -urN /usr/src/linux-2.4.21-4.EL/drivers/char/ipmi.orig/ipmi_kcs_sm.h /usr/src/linux-2.4.21-4.EL/drivers/char/ipmi/ipmi_kcs_sm.h
--- /usr/src/linux-2.4.21-4.EL/drivers/char/ipmi.orig/ipmi_kcs_sm.h	2003-06-13 09:51:33.000000000 -0500
+++ /usr/src/linux-2.4.21-4.EL/drivers/char/ipmi/ipmi_kcs_sm.h	2004-06-28 09:30:29.000000000 -0500
@@ -35,6 +35,7 @@
 
 void init_kcs_data(struct kcs_data *kcs,
 		   unsigned int    port,
+		   			int    offset,
 		   unsigned char   *addr);
 
 /* Start a new transaction in the state machine.  This will return -2
