diff -u -N -r linux-source-2.6.26.orig/drivers/serial/8250.c linux-source-2.6.26/drivers/serial/8250.c
--- linux-source-2.6.26.orig/drivers/serial/8250.c	2010-02-10 09:11:10.000000000 +0100
+++ linux-source-2.6.26/drivers/serial/8250.c	2010-02-17 11:20:36.000000000 +0100
@@ -38,6 +38,7 @@
 #include <linux/serial_core.h>
 #include <linux/serial.h>
 #include <linux/serial_8250.h>
+#include <linux/ninebit_ioctls.h>
 #include <linux/nmi.h>
 #include <linux/mutex.h>
 
@@ -129,6 +130,8 @@
 	unsigned char		mcr_mask;	/* mask of user bits */
 	unsigned char		mcr_force;	/* mask of forced bits */
 
+	unsigned char		ninebit;	/* Flag set and cleared for 9-bit comms */
+
 	/*
 	 * Some bits in registers are cleared on a read, so they must
 	 * be saved whenever the register is read but the bits will not
@@ -1290,11 +1293,18 @@
 receive_chars(struct uart_8250_port *up, unsigned int *status)
 {
 	struct tty_struct *tty = up->port.info->tty;
-	unsigned char ch, lsr = *status;
+	unsigned char ch, lsr = *status, addr = 0x00;
 	int max_count = 256;
 	char flag;
 
 	do {
+		// When in 9-bit mode, ignore the parity error since it is
+		// actually an indication of the ADDR bit and not an error
+		if (up->ninebit) {
+			addr = ((serial_inp(up, UART_LSR) & UART_LSR_PE) >> 2);
+			lsr &= ~UART_LSR_PE;
+		}
+
 		ch = serial_inp(up, UART_RX);
 		flag = TTY_NORMAL;
 		up->port.icount.rx++;
@@ -1340,6 +1350,8 @@
 		if (uart_handle_sysrq_char(&up->port, ch))
 			goto ignore_char;
 
+		if (up->ninebit)
+			uart_insert_char(&up->port, lsr, UART_LSR_OE, addr, flag);
 		uart_insert_char(&up->port, lsr, UART_LSR_OE, ch, flag);
 
 ignore_char:
@@ -1356,7 +1368,7 @@
 	struct circ_buf *xmit = &up->port.info->xmit;
 	int count;
 
-	if (up->port.x_char) {
+	if (up->port.x_char & !up->ninebit) {
 		serial_outp(up, UART_TX, up->port.x_char);
 		up->port.icount.tx++;
 		up->port.x_char = 0;
@@ -1373,6 +1385,18 @@
 
 	count = up->tx_loadsz;
 	do {
+		// When we are operating in 9-bit mode, we need to grab two bytes from the
+		// transmit buffer and use the first as the ADDR bit
+		if (up->ninebit) {
+			// Just write the LSB of the byte to SPR (called SCR for some reason...)
+			serial_out(up, UART_SCR, (xmit->buf[xmit->tail] & UART_SPR_TX_ADDR));
+			xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
+
+			// There weren't an even number of bytes in the buffer, we have no choice but to drop it
+			if (uart_circ_empty(xmit))
+				break;
+		}
+
 		serial_out(up, UART_TX, xmit->buf[xmit->tail]);
 		xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
 		up->port.icount.tx++;
@@ -2423,6 +2447,44 @@
 	return 0;
 }
 
+static int
+serial8250_ioctl(struct uart_port *port, unsigned int cmd, unsigned long arg)
+{
+	struct uart_8250_port *up = (struct uart_8250_port *)port;
+	void __user *user = (void __user *) arg;
+	int ninebit = up->ninebit;
+
+	switch (cmd)
+	{
+		// Retreive the current status of 9-bit mode for this port
+		case TIOC9BITGET:
+			if (copy_to_user(user, &ninebit, sizeof(int)))
+				return -EFAULT;
+			break;
+
+		// Enable 9-bit mode if it isn't already enabled
+		case TIOC9BITSET:
+			if (up->port.type != PORT_16C950)
+				return -ENOTTY;
+			serial_icr_write(up, UART_NMR, UART_NMR_ENABLE);
+			up->ninebit = 1;
+			break;
+
+		// Disable 9-bit mode
+		case TIOC9BITCLR:
+			if (up->port.type != PORT_16C950)
+				return -ENOTTY;
+			serial_icr_write(up, UART_NMR, (UART_NMR_ENABLE & UART_NMR_MASK));
+			up->ninebit = 0;
+			break;
+
+		default:
+			return -ENOIOCTLCMD;
+	}
+
+	return 0;
+}
+
 static const char *
 serial8250_type(struct uart_port *port)
 {
@@ -2451,6 +2513,7 @@
 	.request_port	= serial8250_request_port,
 	.config_port	= serial8250_config_port,
 	.verify_port	= serial8250_verify_port,
+	.ioctl 		= serial8250_ioctl,
 #ifdef CONFIG_CONSOLE_POLL
 	.poll_get_char = serial8250_get_poll_char,
 	.poll_put_char = serial8250_put_poll_char,
diff -u -N -r linux-source-2.6.26.orig/include/linux/ninebit_ioctls.h linux-source-2.6.26/include/linux/ninebit_ioctls.h
--- linux-source-2.6.26.orig/include/linux/ninebit_ioctls.h	1970-01-01 01:00:00.000000000 +0100
+++ linux-source-2.6.26/include/linux/ninebit_ioctls.h	2010-02-17 11:20:48.000000000 +0100
@@ -0,0 +1,23 @@
+/*
+ *	Sealevel Systems Linux 9-bit support for 16c950 UARTS.
+ *
+ *	This program is free software; you can redistribute it and/or
+ *	modify it under the terms of the GNU General Public License
+ *	as published by the Free Software Foundation; either version
+ *	2 of the License, or (at your option) any later version.
+ *
+ *	(c) Copyright 2009 Sealevel Systems Inc.
+ *
+ * 	$Id: sealevel-950-9-bit.patch,v 1.2 2009/08/28 13:43:54 thomasw Exp $
+ */
+#ifndef __SEALEVEL_NINEBIT_H__
+#define __SEALEVEL_NINEBIT_H__
+
+// These are the 9-bit specific ioctls used for configuration of
+// 9 bit mode of 950 UARTs.
+#define SEACOM_MAGIC	0xED
+#define TIOC9BITGET 	_IOR(SEACOM_MAGIC, 0, int)
+#define TIOC9BITSET 	_IO(SEACOM_MAGIC, 1)
+#define TIOC9BITCLR 	_IO(SEACOM_MAGIC, 2)
+
+#endif
diff -u -N -r linux-source-2.6.26.orig/include/linux/serial_reg.h linux-source-2.6.26/include/linux/serial_reg.h
--- linux-source-2.6.26.orig/include/linux/serial_reg.h	2008-07-13 23:51:29.000000000 +0200
+++ linux-source-2.6.26/include/linux/serial_reg.h	2010-02-17 11:22:07.000000000 +0100
@@ -259,7 +259,17 @@
 #define UART_ACR_ICRRD	0x40	/* ICR Read enable */
 #define UART_ACR_ASREN	0x80	/* Additional status enable */
 
+/*
+ * The 16C950 Nine-Bit Control Register
+ */
+#define UART_SPR_TX_ADDR	0x01
+#define UART_SPR_TX_ADDRMASK 	0xFE
 
+/*
+ * The 16C950 Nine-Bit Control Register
+ */
+#define UART_NMR_ENABLE		0x01
+#define UART_NMR_MASK		0xFE
 
 /*
  * These definitions are for the RSA-DV II/S card, from
