# HG changeset patch # User Rob Landley # Date 1260282970 21600 # Node ID 4e798d7aa5f9725b2893b1d4448a098d3a714502 # Parent 43efbc4c4838e3943136c4b6b213ae2dacc135bc Move to 2.6.32 kernel, updating patches. (With a much less ugly fix for powerpc, and allowing arm to use more qemu -cpu options.) diff -r 43efbc4c4838 -r 4e798d7aa5f9 download.sh --- a/download.sh Tue Dec 08 05:37:27 2009 -0600 +++ b/download.sh Tue Dec 08 08:36:10 2009 -0600 @@ -30,8 +30,8 @@ # Building a cross compile toolchain requires linux headers, uClibc, # binutils, and gcc. -URL=http://kernel.org/pub/linux/kernel/v2.6/linux-2.6.31.6.tar.bz2 \ -SHA1=00967b9eb7e2bd635425b684968761569a69479e \ +URL=http://kernel.org/pub/linux/kernel/v2.6/linux-2.6.32.tar.bz2 \ +SHA1=410b4fc818023bfef60064e973ff0ab46d3bfb19 \ UNSTABLE=http://kernel.org/pub/linux/kernel/v2.6/testing/linux-2.6.32-rc7.tar.bz2 \ download || dienow diff -r 43efbc4c4838 -r 4e798d7aa5f9 sources/patches/linux-2.6.25-rc1-noperl.patch --- a/sources/patches/linux-2.6.25-rc1-noperl.patch Tue Dec 08 05:37:27 2009 -0600 +++ b/sources/patches/linux-2.6.25-rc1-noperl.patch Tue Dec 08 08:36:10 2009 -0600 @@ -3,9 +3,6 @@ Replace kernel/timeconst.pl with kernel/timeconst.sh. The new shell script is much simpler, about 1/4 the size, and runs on Red Hat 9 from 2003. -Peter Anvin added this perl to 2.6.25. Before that, the kernel had never -required perl to build. - Signed-off-by: Rob Landley -- @@ -17,7 +14,7 @@ diff -ruN linux-2.6.30/kernel/Makefile linux-2.6.30.new/kernel/Makefile --- linux-2.6.30/kernel/Makefile 2009-06-09 22:05:27.000000000 -0500 +++ linux-2.6.30.new/kernel/Makefile 2009-06-22 14:29:16.000000000 -0500 -@@ -127,7 +127,7 @@ +@@ -123,7 +123,7 @@ $(obj)/time.o: $(obj)/timeconst.h quiet_cmd_timeconst = TIMEC $@ diff -r 43efbc4c4838 -r 4e798d7aa5f9 sources/patches/linux-2.6.28-perl2.patch --- a/sources/patches/linux-2.6.28-perl2.patch Tue Dec 08 05:37:27 2009 -0600 +++ b/sources/patches/linux-2.6.28-perl2.patch Tue Dec 08 08:36:10 2009 -0600 @@ -8,10 +8,6 @@ Signed-off-by: Rob Landley --- -Changes from previous version (http://lkml.org/lkml/2009/1/2/22): - -Updated for Mike Frysinger's Jan 2 commit adding asm/inline/volatile. - scripts/Makefile.headersinst | 6 ++-- scripts/headers_install.pl | 49 --------------------------------- scripts/headers_install.sh | 39 ++++++++++++++++++++++++++ @@ -43,7 +39,7 @@ - -my ($readdir, $installdir, $arch, @files) = @ARGV; - --my $unifdef = "scripts/unifdef -U__KERNEL__"; +-my $unifdef = "scripts/unifdef -U__KERNEL__ -D__EXPORTED_HEADERS__"; - -foreach my $file (@files) { - local *INFILE; @@ -109,7 +105,7 @@ + -e 's@^#include @@' \ + -e 's/(^|[ \t])(inline|asm|volatile)([ \t(]|$)/\1__\2__\3/g' \ + "$INDIR/$i" | -+ scripts/unifdef -U__KERNEL__ - > "$OUTDIR/$i" ++ scripts/unifdef -U__KERNEL__ -D__EXPORTED_HEADERS__ - > "$OUTDIR/$i" +done + +exit 0 diff -r 43efbc4c4838 -r 4e798d7aa5f9 sources/patches/linux-2.6.28-perl3.patch --- a/sources/patches/linux-2.6.28-perl3.patch Tue Dec 08 05:37:27 2009 -0600 +++ b/sources/patches/linux-2.6.28-perl3.patch Tue Dec 08 08:36:10 2009 -0600 @@ -7,10 +7,6 @@ Signed-off-by: Rob Landley --- -Changes from previous version (http://lkml.org/lkml/2009/1/2/24): - -None, just a rediff. - arch/x86/kernel/cpu/Makefile | 4 +-- arch/x86/kernel/cpu/mkcapflags.pl | 32 ---------------------------- arch/x86/kernel/cpu/mkcapflags.sh | 28 ++++++++++++++++++++++++ diff -r 43efbc4c4838 -r 4e798d7aa5f9 sources/patches/linux-2.6.29-armv6-armv7-for-versatilepb.patch --- a/sources/patches/linux-2.6.29-armv6-armv7-for-versatilepb.patch Tue Dec 08 05:37:27 2009 -0600 +++ b/sources/patches/linux-2.6.29-armv6-armv7-for-versatilepb.patch Tue Dec 08 08:36:10 2009 -0600 @@ -1,8 +1,7 @@ -diff --git a/arch/arm/mach-versatile/Kconfig b/arch/arm/mach-versatile/Kconfig -index c781f30..95096af 100644 ---- a/arch/arm/mach-versatile/Kconfig -+++ b/arch/arm/mach-versatile/Kconfig -@@ -3,14 +3,12 @@ menu "Versatile platform type" +diff -ru linux/arch/arm/mach-versatile/Kconfig linux2/arch/arm/mach-versatile/Kconfig +--- linux/arch/arm/mach-versatile/Kconfig 2009-12-02 21:51:21.000000000 -0600 ++++ linux2/arch/arm/mach-versatile/Kconfig 2009-12-08 04:29:50.000000000 -0600 +@@ -3,14 +3,12 @@ config ARCH_VERSATILE_PB bool "Support Versatile/PB platform" @@ -17,11 +16,28 @@ help Include support for the ARM(R) Versatile/AP platform. -diff --git a/arch/arm/mm/Kconfig b/arch/arm/mm/Kconfig -index 2097956..2a64c95 100644 ---- a/arch/arm/mm/Kconfig -+++ b/arch/arm/mm/Kconfig -@@ -170,7 +170,7 @@ config CPU_ARM925T +diff -ru linux/arch/arm/mm/Kconfig linux2/arch/arm/mm/Kconfig +--- linux/arch/arm/mm/Kconfig 2009-12-02 21:51:21.000000000 -0600 ++++ linux2/arch/arm/mm/Kconfig 2009-12-08 04:29:50.000000000 -0600 +@@ -111,7 +111,7 @@ + + # ARM920T + config CPU_ARM920T +- bool "Support ARM920T processor" if ARCH_INTEGRATOR ++ bool "Support ARM920T processor" if ARCH_INTEGRATOR || ARCH_VERSATILE_PB || ARCH_VERSATILE_AB + select CPU_32v4T + select CPU_ABRT_EV4T + select CPU_PABRT_LEGACY +@@ -129,7 +129,7 @@ + + # ARM922T + config CPU_ARM922T +- bool "Support ARM922T processor" if ARCH_INTEGRATOR ++ bool "Support ARM922T processor" if ARCH_INTEGRATOR || ARCH_VERSATILE_PB || ARCH_VERSATILE_AB + select CPU_32v4T + select CPU_ABRT_EV4T + select CPU_PABRT_LEGACY +@@ -167,7 +167,7 @@ # ARM926T config CPU_ARM926T @@ -29,8 +45,8 @@ + bool "Support ARM926T processor" if ARCH_INTEGRATOR || MACH_REALVIEW_EB || ARCH_VERSATILE_PB || ARCH_VERSATILE_AB select CPU_32v5 select CPU_ABRT_EV5TJ - select CPU_PABRT_NOIFAR -@@ -178,6 +178,7 @@ config CPU_ARM926T + select CPU_PABRT_LEGACY +@@ -175,6 +175,7 @@ select CPU_CP15_MMU select CPU_COPY_V4WB if MMU select CPU_TLB_V4WBI if MMU @@ -38,7 +54,7 @@ help This is a variant of the ARM920. It has slightly different instruction sequences for cache and TLB operations. Curiously, -@@ -391,7 +392,7 @@ config CPU_FEROCEON_OLD_ID +@@ -388,7 +389,7 @@ # ARMv6 config CPU_V6 @@ -46,8 +62,8 @@ + bool "Support ARM V6 processor" if ARCH_INTEGRATOR || MACH_REALVIEW_EB || MACH_REALVIEW_PBX || ARCH_VERSATILE_PB || ARCH_VERSATILE_AB select CPU_32v6 select CPU_ABRT_EV6 - select CPU_PABRT_NOIFAR -@@ -416,7 +417,7 @@ config CPU_32v6K + select CPU_PABRT_V6 +@@ -413,7 +414,7 @@ # ARMv7 config CPU_V7 diff -r 43efbc4c4838 -r 4e798d7aa5f9 sources/patches/linux-dnsdomainname.patch --- a/sources/patches/linux-dnsdomainname.patch Tue Dec 08 05:37:27 2009 -0600 +++ b/sources/patches/linux-dnsdomainname.patch Tue Dec 08 08:36:10 2009 -0600 @@ -2,18 +2,18 @@ # for a command at an absolute path, then runs it out of $PATH, but for us # /bin isn't necessarily in $PATH. -diff -r 2684e5fca56c scripts/mkcompile_h ---- a/scripts/mkcompile_h Tue Jan 13 14:53:16 2009 -0800 -+++ b/scripts/mkcompile_h Fri Jan 16 02:26:34 2009 -0600 -@@ -65,9 +65,9 @@ +diff -ru linux.bak/scripts/mkcompile_h linux/scripts/mkcompile_h +--- linux.bak/scripts/mkcompile_h 2009-12-05 15:06:52.000000000 -0600 ++++ linux/scripts/mkcompile_h 2009-12-05 15:15:37.000000000 -0600 +@@ -67,9 +67,9 @@ echo \#define LINUX_COMPILE_BY \"`whoami`\" echo \#define LINUX_COMPILE_HOST \"`hostname | $UTS_TRUNCATE`\" - if [ -x /bin/dnsdomainname ]; then + if [ ! -z "$(which dnsdomainname)" ]; then - echo \#define LINUX_COMPILE_DOMAIN \"`dnsdomainname | $UTS_TRUNCATE`\" + domain=`dnsdomainname 2> /dev/null` - elif [ -x /bin/domainname ]; then + elif [ ! -z "$(which domainname)" ]; then - echo \#define LINUX_COMPILE_DOMAIN \"`domainname | $UTS_TRUNCATE`\" - else - echo \#define LINUX_COMPILE_DOMAIN + domain=`domainname 2> /dev/null` + fi + diff -r 43efbc4c4838 -r 4e798d7aa5f9 sources/patches/linux-revertppcserial.patch --- a/sources/patches/linux-revertppcserial.patch Tue Dec 08 05:37:27 2009 -0600 +++ b/sources/patches/linux-revertppcserial.patch Tue Dec 08 08:36:10 2009 -0600 @@ -1,561 +1,12 @@ -Revert commit f751928e0ddf54ea4fe5546f35e99efc5b5d9938 which breaks -CONFIG_SERIAL_PMACZILOG irq handling, and thus the PPC serial console panics -as soon as init launches. - -See: - http://lists.ozlabs.org/pipermail/linuxppc-dev/2009-October/076727.html - http://lists.ozlabs.org/pipermail/linuxppc-dev/2009-October/077059.html - -diff -ru linux/drivers/serial/jsm/jsm_tty.c linux2/drivers/serial/jsm/jsm_tty.c ---- linux/drivers/serial/jsm/jsm_tty.c 2009-01-02 12:19:42.000000000 -0600 -+++ linux2/drivers/serial/jsm/jsm_tty.c 2009-10-21 18:03:31.000000000 -0500 -@@ -272,7 +272,7 @@ - jsm_printk(CLOSE, INFO, &channel->ch_bd->pci_dev, "start\n"); - - bd = channel->ch_bd; -- ts = port->info->port.tty->termios; -+ ts = channel->uart_port.info->port.tty->termios; - - channel->ch_flags &= ~(CH_STOPI); - diff -ru linux/drivers/serial/serial_core.c linux2/drivers/serial/serial_core.c ---- linux/drivers/serial/serial_core.c 2009-01-02 12:19:42.000000000 -0600 -+++ linux2/drivers/serial/serial_core.c 2009-10-21 18:03:31.000000000 -0500 -@@ -50,7 +50,7 @@ - - #define HIGH_BITS_OFFSET ((sizeof(long)-sizeof(int))*8) - --#define uart_users(state) ((state)->count + (state)->info.port.blocked_open) -+#define uart_users(state) ((state)->count + ((state)->info ? (state)->info->port.blocked_open : 0)) - - #ifdef CONFIG_SERIAL_CORE_CONSOLE - #define uart_console(port) ((port)->cons && (port)->cons->index == (port)->line) -@@ -94,7 +94,7 @@ - struct uart_state *state = tty->driver_data; - struct uart_port *port = state->port; - -- if (!uart_circ_empty(&state->info.xmit) && state->info.xmit.buf && -+ if (!uart_circ_empty(&state->info->xmit) && state->info->xmit.buf && - !tty->stopped && !tty->hw_stopped) - port->ops->start_tx(port); - } +--- linux/drivers/serial/serial_core.c 2009-12-02 21:51:21.000000000 -0600 ++++ linux2/drivers/serial/serial_core.c 2009-12-08 06:17:06.000000000 -0600 @@ -113,7 +113,7 @@ static void uart_tasklet_action(unsigned long data) { struct uart_state *state = (struct uart_state *)data; -- tty_wakeup(state->info.port.tty); -+ tty_wakeup(state->info->port.tty); +- tty_wakeup(state->port.tty); ++ if (state->port.tty) tty_wakeup(state->port.tty); } static inline void -@@ -139,7 +139,7 @@ - */ - static int uart_startup(struct uart_state *state, int init_hw) - { -- struct uart_info *info = &state->info; -+ struct uart_info *info = state->info; - struct uart_port *port = state->port; - unsigned long page; - int retval = 0; -@@ -212,15 +212,14 @@ - */ - static void uart_shutdown(struct uart_state *state) - { -- struct uart_info *info = &state->info; -+ struct uart_info *info = state->info; - struct uart_port *port = state->port; -- struct tty_struct *tty = info->port.tty; - - /* - * Set the TTY IO error marker - */ -- if (tty) -- set_bit(TTY_IO_ERROR, &tty->flags); -+ if (info->port.tty) -+ set_bit(TTY_IO_ERROR, &info->port.tty->flags); - - if (info->flags & UIF_INITIALIZED) { - info->flags &= ~UIF_INITIALIZED; -@@ -228,7 +227,7 @@ - /* - * Turn off DTR and RTS early. - */ -- if (!tty || (tty->termios->c_cflag & HUPCL)) -+ if (!info->port.tty || (info->port.tty->termios->c_cflag & HUPCL)) - uart_clear_mctrl(port, TIOCM_DTR | TIOCM_RTS); - - /* -@@ -428,7 +427,7 @@ - static void - uart_change_speed(struct uart_state *state, struct ktermios *old_termios) - { -- struct tty_struct *tty = state->info.port.tty; -+ struct tty_struct *tty = state->info->port.tty; - struct uart_port *port = state->port; - struct ktermios *termios; - -@@ -445,14 +444,14 @@ - * Set flags based on termios cflag - */ - if (termios->c_cflag & CRTSCTS) -- state->info.flags |= UIF_CTS_FLOW; -+ state->info->flags |= UIF_CTS_FLOW; - else -- state->info.flags &= ~UIF_CTS_FLOW; -+ state->info->flags &= ~UIF_CTS_FLOW; - - if (termios->c_cflag & CLOCAL) -- state->info.flags &= ~UIF_CHECK_CD; -+ state->info->flags &= ~UIF_CHECK_CD; - else -- state->info.flags |= UIF_CHECK_CD; -+ state->info->flags |= UIF_CHECK_CD; - - port->ops->set_termios(port, termios, old_termios); - } -@@ -480,7 +479,7 @@ - { - struct uart_state *state = tty->driver_data; - -- return __uart_put_char(state->port, &state->info.xmit, ch); -+ return __uart_put_char(state->port, &state->info->xmit, ch); - } - - static void uart_flush_chars(struct tty_struct *tty) -@@ -501,13 +500,13 @@ - * This means you called this function _after_ the port was - * closed. No cookie for you. - */ -- if (!state) { -+ if (!state || !state->info) { - WARN_ON(1); - return -EL3HLT; - } - - port = state->port; -- circ = &state->info.xmit; -+ circ = &state->info->xmit; - - if (!circ->buf) - return 0; -@@ -538,7 +537,7 @@ - int ret; - - spin_lock_irqsave(&state->port->lock, flags); -- ret = uart_circ_chars_free(&state->info.xmit); -+ ret = uart_circ_chars_free(&state->info->xmit); - spin_unlock_irqrestore(&state->port->lock, flags); - return ret; - } -@@ -550,7 +549,7 @@ - int ret; - - spin_lock_irqsave(&state->port->lock, flags); -- ret = uart_circ_chars_pending(&state->info.xmit); -+ ret = uart_circ_chars_pending(&state->info->xmit); - spin_unlock_irqrestore(&state->port->lock, flags); - return ret; - } -@@ -565,7 +564,7 @@ - * This means you called this function _after_ the port was - * closed. No cookie for you. - */ -- if (!state) { -+ if (!state || !state->info) { - WARN_ON(1); - return; - } -@@ -574,7 +573,7 @@ - pr_debug("uart_flush_buffer(%d) called\n", tty->index); - - spin_lock_irqsave(&port->lock, flags); -- uart_circ_clear(&state->info.xmit); -+ uart_circ_clear(&state->info->xmit); - if (port->ops->flush_buffer) - port->ops->flush_buffer(port); - spin_unlock_irqrestore(&port->lock, flags); -@@ -838,15 +837,15 @@ - state->closing_wait = closing_wait; - if (new_serial.xmit_fifo_size) - port->fifosize = new_serial.xmit_fifo_size; -- if (state->info.port.tty) -- state->info.port.tty->low_latency = -+ if (state->info->port.tty) -+ state->info->port.tty->low_latency = - (port->flags & UPF_LOW_LATENCY) ? 1 : 0; - - check_and_exit: - retval = 0; - if (port->type == PORT_UNKNOWN) - goto exit; -- if (state->info.flags & UIF_INITIALIZED) { -+ if (state->info->flags & UIF_INITIALIZED) { - if (((old_flags ^ port->flags) & UPF_SPD_MASK) || - old_custom_divisor != port->custom_divisor) { - /* -@@ -859,7 +858,7 @@ - printk(KERN_NOTICE - "%s sets custom speed on %s. This " - "is deprecated.\n", current->comm, -- tty_name(state->info.port.tty, buf)); -+ tty_name(state->info->port.tty, buf)); - } - uart_change_speed(state, NULL); - } -@@ -890,8 +889,8 @@ - * interrupt happens). - */ - if (port->x_char || -- ((uart_circ_chars_pending(&state->info.xmit) > 0) && -- !state->info.port.tty->stopped && !state->info.port.tty->hw_stopped)) -+ ((uart_circ_chars_pending(&state->info->xmit) > 0) && -+ !state->info->port.tty->stopped && !state->info->port.tty->hw_stopped)) - result &= ~TIOCSER_TEMT; - - return put_user(result, value); -@@ -1018,7 +1017,7 @@ - port->ops->enable_ms(port); - spin_unlock_irq(&port->lock); - -- add_wait_queue(&state->info.delta_msr_wait, &wait); -+ add_wait_queue(&state->info->delta_msr_wait, &wait); - for (;;) { - spin_lock_irq(&port->lock); - memcpy(&cnow, &port->icount, sizeof(struct uart_icount)); -@@ -1046,7 +1045,7 @@ - } - - current->state = TASK_RUNNING; -- remove_wait_queue(&state->info.delta_msr_wait, &wait); -+ remove_wait_queue(&state->info->delta_msr_wait, &wait); - - return ret; - } -@@ -1242,7 +1241,7 @@ - */ - if (!(old_termios->c_cflag & CLOCAL) && - (tty->termios->c_cflag & CLOCAL)) -- wake_up_interruptible(&info->port.open_wait); -+ wake_up_interruptible(&state->info->port.open_wait); - #endif - } - -@@ -1304,7 +1303,7 @@ - * At this point, we stop accepting input. To do this, we - * disable the receive line status interrupts. - */ -- if (state->info.flags & UIF_INITIALIZED) { -+ if (state->info->flags & UIF_INITIALIZED) { - unsigned long flags; - spin_lock_irqsave(&port->lock, flags); - port->ops->stop_rx(port); -@@ -1323,9 +1322,9 @@ - tty_ldisc_flush(tty); - - tty->closing = 0; -- state->info.port.tty = NULL; -+ state->info->port.tty = NULL; - -- if (state->info.port.blocked_open) { -+ if (state->info->port.blocked_open) { - if (state->close_delay) - msleep_interruptible(state->close_delay); - } else if (!uart_console(port)) { -@@ -1335,8 +1334,8 @@ - /* - * Wake up anyone trying to open this port. - */ -- state->info.flags &= ~UIF_NORMAL_ACTIVE; -- wake_up_interruptible(&state->info.port.open_wait); -+ state->info->flags &= ~UIF_NORMAL_ACTIVE; -+ wake_up_interruptible(&state->info->port.open_wait); - - done: - mutex_unlock(&state->mutex); -@@ -1410,20 +1409,19 @@ - static void uart_hangup(struct tty_struct *tty) - { - struct uart_state *state = tty->driver_data; -- struct uart_info *info = &state->info; - - BUG_ON(!kernel_locked()); - pr_debug("uart_hangup(%d)\n", state->port->line); - - mutex_lock(&state->mutex); -- if (info->flags & UIF_NORMAL_ACTIVE) { -+ if (state->info && state->info->flags & UIF_NORMAL_ACTIVE) { - uart_flush_buffer(tty); - uart_shutdown(state); - state->count = 0; -- info->flags &= ~UIF_NORMAL_ACTIVE; -- info->port.tty = NULL; -- wake_up_interruptible(&info->port.open_wait); -- wake_up_interruptible(&info->delta_msr_wait); -+ state->info->flags &= ~UIF_NORMAL_ACTIVE; -+ state->info->port.tty = NULL; -+ wake_up_interruptible(&state->info->port.open_wait); -+ wake_up_interruptible(&state->info->delta_msr_wait); - } - mutex_unlock(&state->mutex); - } -@@ -1436,7 +1434,7 @@ - */ - static void uart_update_termios(struct uart_state *state) - { -- struct tty_struct *tty = state->info.port.tty; -+ struct tty_struct *tty = state->info->port.tty; - struct uart_port *port = state->port; - - if (uart_console(port) && port->cons->cflag) { -@@ -1471,7 +1469,7 @@ - uart_block_til_ready(struct file *filp, struct uart_state *state) - { - DECLARE_WAITQUEUE(wait, current); -- struct uart_info *info = &state->info; -+ struct uart_info *info = state->info; - struct uart_port *port = state->port; - unsigned int mctrl; - -@@ -1565,6 +1563,28 @@ - ret = -ENXIO; - goto err_unlock; - } -+ -+ /* BKL: RACE HERE - LEAK */ -+ /* We should move this into the uart_state structure and kill off -+ this whole complexity */ -+ if (!state->info) { -+ state->info = kzalloc(sizeof(struct uart_info), GFP_KERNEL); -+ if (state->info) { -+ init_waitqueue_head(&state->info->port.open_wait); -+ init_waitqueue_head(&state->info->delta_msr_wait); -+ -+ /* -+ * Link the info into the other structures. -+ */ -+ state->port->info = state->info; -+ -+ tasklet_init(&state->info->tlet, uart_tasklet_action, -+ (unsigned long)state); -+ } else { -+ ret = -ENOMEM; -+ goto err_unlock; -+ } -+ } - return state; - - err_unlock: -@@ -1621,10 +1641,9 @@ - * Any failures from here onwards should not touch the count. - */ - tty->driver_data = state; -- state->port->info = &state->info; - tty->low_latency = (state->port->flags & UPF_LOW_LATENCY) ? 1 : 0; - tty->alt_speed = 0; -- state->info.port.tty = tty; -+ state->info->port.tty = tty; - - /* - * If the port is in the middle of closing, bail out now. -@@ -1657,8 +1676,8 @@ - /* - * If this is the first open to succeed, adjust things to suit. - */ -- if (retval == 0 && !(state->info.flags & UIF_NORMAL_ACTIVE)) { -- state->info.flags |= UIF_NORMAL_ACTIVE; -+ if (retval == 0 && !(state->info->flags & UIF_NORMAL_ACTIVE)) { -+ state->info->flags |= UIF_NORMAL_ACTIVE; - - uart_update_termios(state); - } -@@ -2009,11 +2028,11 @@ - } - port->suspended = 1; - -- if (state->info.flags & UIF_INITIALIZED) { -+ if (state->info && state->info->flags & UIF_INITIALIZED) { - const struct uart_ops *ops = port->ops; - int tries; - -- state->info.flags = (state->info.flags & ~UIF_INITIALIZED) -+ state->info->flags = (state->info->flags & ~UIF_INITIALIZED) - | UIF_SUSPENDED; - - spin_lock_irq(&port->lock); -@@ -2088,15 +2107,15 @@ - /* - * If that's unset, use the tty termios setting. - */ -- if (state->info.port.tty && termios.c_cflag == 0) -- termios = *state->info.port.tty->termios; -+ if (state->info && state->info->port.tty && termios.c_cflag == 0) -+ termios = *state->info->port.tty->termios; - - uart_change_pm(state, 0); - port->ops->set_termios(port, &termios, NULL); - console_start(port->cons); - } - -- if (state->info.flags & UIF_SUSPENDED) { -+ if (state->info && state->info->flags & UIF_SUSPENDED) { - const struct uart_ops *ops = port->ops; - int ret; - -@@ -2111,7 +2130,7 @@ - ops->set_mctrl(port, port->mctrl); - ops->start_tx(port); - spin_unlock_irq(&port->lock); -- state->info.flags |= UIF_INITIALIZED; -+ state->info->flags |= UIF_INITIALIZED; - } else { - /* - * Failed to resume - maybe hardware went away? -@@ -2121,7 +2140,7 @@ - uart_shutdown(state); - } - -- state->info.flags &= ~UIF_SUSPENDED; -+ state->info->flags &= ~UIF_SUSPENDED; - } - - mutex_unlock(&state->mutex); -@@ -2364,12 +2383,8 @@ - - state->close_delay = 500; /* .5 seconds */ - state->closing_wait = 30000; /* 30 seconds */ -- mutex_init(&state->mutex); - -- tty_port_init(&state->info.port); -- init_waitqueue_head(&state->info.delta_msr_wait); -- tasklet_init(&state->info.tlet, uart_tasklet_action, -- (unsigned long)state); -+ mutex_init(&state->mutex); - } - - retval = tty_register_driver(normal); -@@ -2440,7 +2455,7 @@ - state->pm_state = -1; - - port->cons = drv->cons; -- port->info = &state->info; -+ port->info = state->info; - - /* - * If this port is a console, then the spinlock is already -@@ -2512,11 +2527,18 @@ - */ - tty_unregister_device(drv->tty_driver, port->line); - -- info = &state->info; -+ info = state->info; - if (info && info->port.tty) - tty_vhangup(info->port.tty); - - /* -+ * All users of this port should now be disconnected from -+ * this driver, and the port shut down. We should be the -+ * only thread fiddling with this port from now on. -+ */ -+ state->info = NULL; -+ -+ /* - * Free the port IO and memory resources, if any. - */ - if (port->type != PORT_UNKNOWN) -diff -ru linux/include/linux/serial_core.h linux2/include/linux/serial_core.h ---- linux/include/linux/serial_core.h 2009-01-02 12:19:42.000000000 -0600 -+++ linux2/include/linux/serial_core.h 2009-10-21 18:03:31.000000000 -0500 -@@ -316,13 +316,35 @@ - }; - - /* -+ * This is the state information which is persistent across opens. -+ * The low level driver must not to touch any elements contained -+ * within. -+ */ -+struct uart_state { -+ unsigned int close_delay; /* msec */ -+ unsigned int closing_wait; /* msec */ -+ -+#define USF_CLOSING_WAIT_INF (0) -+#define USF_CLOSING_WAIT_NONE (~0U) -+ -+ int count; -+ int pm_state; -+ struct uart_info *info; -+ struct uart_port *port; -+ -+ struct mutex mutex; -+}; -+ -+#define UART_XMIT_SIZE PAGE_SIZE -+ -+typedef unsigned int __bitwise__ uif_t; -+ -+/* - * This is the state information which is only valid when the port -- * is open; it may be cleared the core driver once the device has -+ * is open; it may be freed by the core driver once the device has - * been closed. Either the low level driver or the core can modify - * stuff here. - */ --typedef unsigned int __bitwise__ uif_t; -- - struct uart_info { - struct tty_port port; - struct circ_buf xmit; -@@ -344,29 +366,6 @@ - wait_queue_head_t delta_msr_wait; - }; - --/* -- * This is the state information which is persistent across opens. -- * The low level driver must not to touch any elements contained -- * within. -- */ --struct uart_state { -- unsigned int close_delay; /* msec */ -- unsigned int closing_wait; /* msec */ -- --#define USF_CLOSING_WAIT_INF (0) --#define USF_CLOSING_WAIT_NONE (~0U) -- -- int count; -- int pm_state; -- struct uart_info info; -- struct uart_port *port; -- -- struct mutex mutex; --}; -- --#define UART_XMIT_SIZE PAGE_SIZE -- -- - /* number of characters left in xmit buffer before we ask for more */ - #define WAKEUP_CHARS 256 - -@@ -440,13 +439,8 @@ - #define uart_circ_chars_free(circ) \ - (CIRC_SPACE((circ)->head, (circ)->tail, UART_XMIT_SIZE)) - --static inline int uart_tx_stopped(struct uart_port *port) --{ -- struct tty_struct *tty = port->info->port.tty; -- if(tty->stopped || tty->hw_stopped) -- return 1; -- return 0; --} -+#define uart_tx_stopped(portp) \ -+ ((portp)->info->port.tty->stopped || (portp)->info->port.tty->hw_stopped) - - /* - * The following are helper functions for the low level drivers. -@@ -457,7 +451,7 @@ - #ifdef SUPPORT_SYSRQ - if (port->sysrq) { - if (ch && time_before(jiffies, port->sysrq)) { -- handle_sysrq(ch, port->info->port.tty); -+ handle_sysrq(ch, port->info ? port->info->port.tty : NULL); - port->sysrq = 0; - return 1; - } diff -r 43efbc4c4838 -r 4e798d7aa5f9 sources/patches/squashfs-tools-4.0-uclibc-get_nprocs.patch --- a/sources/patches/squashfs-tools-4.0-uclibc-get_nprocs.patch Tue Dec 08 05:37:27 2009 -0600 +++ b/sources/patches/squashfs-tools-4.0-uclibc-get_nprocs.patch Tue Dec 08 08:36:10 2009 -0600 @@ -1,3 +1,5 @@ +uclibc does not have get_nprocs() so build of squashfs host tool fails + --- a/squashfs-tools/mksquashfs.c Wed Dec 2 10:30:31 2009 +++ b/squashfs-tools/mksquashfs.c Wed Dec 2 10:31:34 2009 @@ -3705,7 +3705,7 @@ diff -r 43efbc4c4838 -r 4e798d7aa5f9 sources/patches/uClibc-fixm68k.patch --- a/sources/patches/uClibc-fixm68k.patch Tue Dec 08 05:37:27 2009 -0600 +++ b/sources/patches/uClibc-fixm68k.patch Tue Dec 08 08:36:10 2009 -0600 @@ -1,12 +1,14 @@ --- uClibc/Rules.mak 2008-09-28 02:10:20.000000000 -0500 +++ alt-uClibc/Rules.mak 2008-09-30 16:56:19.000000000 -0500 -@@ -144,7 +144,9 @@ +@@ -144,7 +144,11 @@ # Flags in OPTIMIZATION are used only for non-debug builds OPTIMIZATION:= # Use '-Os' optimization if available, else use -O2, allow Config to override ++ifneq ($(TARGET_ARCH),alpha) +ifneq ($(TARGET_ARCH),m68k) OPTIMIZATION+=$(call check_gcc,-Os,-O2) +endif ++endif # Use the gcc 3.4 -funit-at-a-time optimization when available OPTIMIZATION+=$(call check_gcc,-funit-at-a-time,)