diff between linux-mips, tagged linux_2_4_29
authorWaldemar Brodkorb <mail@waldemar-brodkorb.de>
Sat, 26 Mar 2005 20:56:20 +0000 (20:56 +0000)
committerWaldemar Brodkorb <mail@waldemar-brodkorb.de>
Sat, 26 Mar 2005 20:56:20 +0000 (20:56 +0000)
SVN-Revision: 465

openwrt/package/linux/kernel-patches/000-linux-mips-cvs

index 8a4a7d6ae4fbea431309c7df09d4ba6e89e58dc5..83bb0e258b117d4e5bfcf2bbce88522c4b5fe7a5 100644 (file)
@@ -1,301 +1,6 @@
-diff -Nur linux-2.4.29/arch/i386/kernel/acpi.c linux-mips/arch/i386/kernel/acpi.c
---- linux-2.4.29/arch/i386/kernel/acpi.c       2004-11-17 12:54:21.000000000 +0100
-+++ linux-mips/arch/i386/kernel/acpi.c 2005-03-26 11:47:12.638577463 +0100
-@@ -55,6 +55,7 @@
- acpi_interrupt_flags acpi_sci_flags __initdata;
- int acpi_sci_override_gsi __initdata;
-+int acpi_skip_timer_override __initdata;
- /* --------------------------------------------------------------------------
-                               Boot-time Configuration
-    -------------------------------------------------------------------------- */
-@@ -320,6 +321,12 @@
-               return 0;
-       }
-+      if (acpi_skip_timer_override &&
-+              intsrc->bus_irq == 0 && intsrc->global_irq == 2) {
-+              printk(PREFIX "BIOS IRQ0 pin2 override ignored.\n");
-+              return 0;
-+      }
-+
-       mp_override_legacy_irq (
-               intsrc->bus_irq,
-               intsrc->flags.polarity,
-@@ -433,6 +440,10 @@
-               return result;
-       }
-+#ifdef CONFIG_X86_IOAPIC
-+      check_acpi_pci();
-+#endif
-+      
-       result = acpi_blacklisted();
-       if (result) {
-               printk(KERN_NOTICE PREFIX "BIOS listed in blacklist, disabling ACPI support\n");
-diff -Nur linux-2.4.29/arch/i386/kernel/earlyquirk.c linux-mips/arch/i386/kernel/earlyquirk.c
---- linux-2.4.29/arch/i386/kernel/earlyquirk.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-mips/arch/i386/kernel/earlyquirk.c   2005-03-18 13:13:20.000000000 +0100
-@@ -0,0 +1,53 @@
-+/* 
-+ * Do early PCI probing for bug detection when the main PCI subsystem is 
-+ * not up yet.
-+ */
-+#include <linux/init.h>
-+#include <linux/kernel.h>
-+#include <linux/pci.h>
-+#include <asm/pci-direct.h>
-+#include <asm/acpi.h>
-+
-+#ifdef CONFIG_ACPI
-+static int __init check_bridge(int vendor, int device) 
-+{
-+      /* According to Nvidia all timer overrides are bogus. Just ignore
-+         them all. */
-+      if (vendor == PCI_VENDOR_ID_NVIDIA) { 
-+              acpi_skip_timer_override = 1;           
-+      }
-+      return 0;
-+}
-+   
-+void __init check_acpi_pci(void) 
-+{ 
-+      int num,slot,func; 
-+
-+      /* Assume the machine supports type 1. If not it will 
-+         always read ffffffff and should not have any side effect. */
-+
-+      /* Poor man's PCI discovery */
-+      for (num = 0; num < 32; num++) { 
-+              for (slot = 0; slot < 32; slot++) { 
-+                      for (func = 0; func < 8; func++) { 
-+                              u32 class;
-+                              u32 vendor;
-+                              class = read_pci_config(num,slot,func,
-+                                                      PCI_CLASS_REVISION);
-+                              if (class == 0xffffffff)
-+                                      break; 
-+
-+                              if ((class >> 16) != PCI_CLASS_BRIDGE_PCI)
-+                                      continue; 
-+                              
-+                              vendor = read_pci_config(num, slot, func, 
-+                                                       PCI_VENDOR_ID);
-+                              
-+                              if (check_bridge(vendor&0xffff, vendor >> 16))
-+                                      return; 
-+                      } 
-+                      
-+              }
-+      }
-+}
-+#endif /* CONFIG_ACPI */
-diff -Nur linux-2.4.29/arch/i386/kernel/Makefile linux-mips/arch/i386/kernel/Makefile
---- linux-2.4.29/arch/i386/kernel/Makefile     2003-11-28 19:26:19.000000000 +0100
-+++ linux-mips/arch/i386/kernel/Makefile       2005-03-26 11:47:12.567589113 +0100
-@@ -40,7 +40,7 @@
- obj-$(CONFIG_ACPI_SLEEP)      += acpi_wakeup.o
- obj-$(CONFIG_SMP)             += smp.o smpboot.o trampoline.o
- obj-$(CONFIG_X86_LOCAL_APIC)  += mpparse.o apic.o nmi.o
--obj-$(CONFIG_X86_IO_APIC)     += io_apic.o
-+obj-$(CONFIG_X86_IO_APIC)     += io_apic.o earlyquirk.o
- obj-$(CONFIG_X86_VISWS_APIC)  += visws_apic.o
- obj-$(CONFIG_EDD)                     += edd.o
-diff -Nur linux-2.4.29/arch/i386/kernel/pci-irq.c linux-mips/arch/i386/kernel/pci-irq.c
---- linux-2.4.29/arch/i386/kernel/pci-irq.c    2005-01-19 15:09:25.000000000 +0100
-+++ linux-mips/arch/i386/kernel/pci-irq.c      2005-03-26 11:47:12.808549566 +0100
-@@ -1120,13 +1120,15 @@
- void pcibios_enable_irq(struct pci_dev *dev)
- {
-       u8 pin;
--      extern int interrupt_line_quirk;
-+      extern int via_interrupt_line_quirk;
-       struct pci_dev *temp_dev;
-       
-       pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin);
-       if (pin && !pcibios_lookup_irq(dev, 1) && !dev->irq) {
-               char *msg;
-+              pin--;          /* interrupt pins are numbered starting from 1 */
-+
-               /* With IDE legacy devices the IRQ lookup failure is not a problem.. */
-               if (dev->class >> 8 == PCI_CLASS_STORAGE_IDE && !(dev->class & 0x5))
-                       return;
-@@ -1134,46 +1136,43 @@
-               if (io_apic_assign_pci_irqs) {
-                       int irq;
--                      if (pin) {
--                              pin--;          /* interrupt pins are numbered starting from 1 */
--                              irq = IO_APIC_get_PCI_irq_vector(dev->bus->number, PCI_SLOT(dev->devfn), pin);
--                              /*
--                               * Busses behind bridges are typically not listed in the MP-table.
--                               * In this case we have to look up the IRQ based on the parent bus,
--                               * parent slot, and pin number. The SMP code detects such bridged
--                               * busses itself so we should get into this branch reliably.
--                               */
--                              temp_dev = dev;
--                              while (irq < 0 && dev->bus->parent) { /* go back to the bridge */
--                                      struct pci_dev * bridge = dev->bus->self;
-+                      irq = IO_APIC_get_PCI_irq_vector(dev->bus->number, PCI_SLOT(dev->devfn), pin);
-+                      /*
-+                       * Busses behind bridges are typically not listed in the MP-table.
-+                       * In this case we have to look up the IRQ based on the parent bus,
-+                       * parent slot, and pin number. The SMP code detects such bridged
-+                       * busses itself so we should get into this branch reliably.
-+                       */
-+                      temp_dev = dev;
-+                      while (irq < 0 && dev->bus->parent) { /* go back to the bridge */
-+                              struct pci_dev * bridge = dev->bus->self;
--                                      pin = (pin + PCI_SLOT(dev->devfn)) % 4;
--                                      irq = IO_APIC_get_PCI_irq_vector(bridge->bus->number, 
--                                                      PCI_SLOT(bridge->devfn), pin);
--                                      if (irq >= 0)
--                                              printk(KERN_WARNING "PCI: using PPB(B%d,I%d,P%d) to get irq %d\n", 
--                                                      bridge->bus->number, PCI_SLOT(bridge->devfn), pin, irq);
--                                      dev = bridge;
--                              }
--                              dev = temp_dev;
--                              if (irq >= 0) {
--                                      printk(KERN_INFO "PCI->APIC IRQ transform: (B%d,I%d,P%d) -> %d\n",
--                                              dev->bus->number, PCI_SLOT(dev->devfn), pin, irq);
--                                      dev->irq = irq;
--                                      return;
--                              } else
--                                      msg = " Probably buggy MP table.";
-+                              pin = (pin + PCI_SLOT(dev->devfn)) % 4;
-+                              irq = IO_APIC_get_PCI_irq_vector(bridge->bus->number, 
-+                                              PCI_SLOT(bridge->devfn), pin);
-+                              if (irq >= 0)
-+                                      printk(KERN_WARNING "PCI: using PPB(B%d,I%d,P%d) to get irq %d\n", 
-+                                              bridge->bus->number, PCI_SLOT(bridge->devfn), pin, irq);
-+                              dev = bridge;
-                       }
-+                      dev = temp_dev;
-+                      if (irq >= 0) {
-+                              printk(KERN_INFO "PCI->APIC IRQ transform: (B%d,I%d,P%d) -> %d\n",
-+                                      dev->bus->number, PCI_SLOT(dev->devfn), pin, irq);
-+                              dev->irq = irq;
-+                              return;
-+                      } else
-+                              msg = " Probably buggy MP table.";
-               } else if (pci_probe & PCI_BIOS_IRQ_SCAN)
-                       msg = "";
-               else
-                       msg = " Please try using pci=biosirq.";
-               printk(KERN_WARNING "PCI: No IRQ known for interrupt pin %c of device %s.%s\n",
--                     'A' + pin - 1, dev->slot_name, msg);
-+                     'A' + pin, dev->slot_name, msg);
-       }
-       /* VIA bridges use interrupt line for apic/pci steering across
-          the V-Link */
--      else if (interrupt_line_quirk)
-+      else if (via_interrupt_line_quirk)
-               pci_write_config_byte(dev, PCI_INTERRUPT_LINE, dev->irq & 15);
-               
- }
-diff -Nur linux-2.4.29/arch/i386/kernel/setup.c linux-mips/arch/i386/kernel/setup.c
---- linux-2.4.29/arch/i386/kernel/setup.c      2004-08-08 01:26:04.000000000 +0200
-+++ linux-mips/arch/i386/kernel/setup.c        2005-03-26 11:47:12.810549238 +0100
-@@ -354,7 +354,8 @@
- struct resource standard_io_resources[] = {
-       { "dma1", 0x00, 0x1f, IORESOURCE_BUSY },
-       { "pic1", 0x20, 0x3f, IORESOURCE_BUSY },
--      { "timer", 0x40, 0x5f, IORESOURCE_BUSY },
-+      { "timer0", 0x40, 0x43, IORESOURCE_BUSY },
-+      { "timer1", 0x50, 0x53, IORESOURCE_BUSY },
-       { "keyboard", 0x60, 0x6f, IORESOURCE_BUSY },
-       { "dma page reg", 0x80, 0x8f, IORESOURCE_BUSY },
-       { "pic2", 0xa0, 0xbf, IORESOURCE_BUSY },
-diff -Nur linux-2.4.29/arch/i386/lib/usercopy.c linux-mips/arch/i386/lib/usercopy.c
---- linux-2.4.29/arch/i386/lib/usercopy.c      2003-06-13 16:51:29.000000000 +0200
-+++ linux-mips/arch/i386/lib/usercopy.c        2005-03-26 11:47:12.859541197 +0100
-@@ -14,6 +14,7 @@
- unsigned long
- __generic_copy_to_user(void *to, const void *from, unsigned long n)
- {
-+      BUG_ON((long) n < 0);
-       if (access_ok(VERIFY_WRITE, to, n))
-       {
-               if(n<512)
-@@ -27,6 +28,7 @@
- unsigned long
- __generic_copy_from_user(void *to, const void *from, unsigned long n)
- {
-+      BUG_ON((long) n < 0);
-       if (access_ok(VERIFY_READ, from, n))
-       {
-               if(n<512)
-@@ -44,6 +46,7 @@
- unsigned long
- __generic_copy_to_user(void *to, const void *from, unsigned long n)
- {
-+      BUG_ON((long) n < 0);
-       prefetch(from);
-       if (access_ok(VERIFY_WRITE, to, n))
-               __copy_user(to,from,n);
-@@ -53,6 +56,7 @@
- unsigned long
- __generic_copy_from_user(void *to, const void *from, unsigned long n)
- {
-+      BUG_ON((long) n < 0);
-       prefetchw(to);
-       if (access_ok(VERIFY_READ, from, n))
-               __copy_user_zeroing(to,from,n);
-diff -Nur linux-2.4.29/arch/ia64/ia32/sys_ia32.c linux-mips/arch/ia64/ia32/sys_ia32.c
---- linux-2.4.29/arch/ia64/ia32/sys_ia32.c     2005-01-19 15:09:26.000000000 +0100
-+++ linux-mips/arch/ia64/ia32/sys_ia32.c       2005-03-26 11:47:12.934528890 +0100
-@@ -1649,7 +1649,8 @@
-  *            IPV6_AUTHHDR    ipv6 auth exthdr        32-bit clean
-  */
- static void
--cmsg32_recvmsg_fixup (struct msghdr *kmsg, unsigned long orig_cmsg_uptr)
-+cmsg32_recvmsg_fixup (struct msghdr *kmsg, unsigned long orig_cmsg_uptr,
-+              __kernel_size_t orig_cmsg_len)
- {
-       unsigned char *workbuf, *wp;
-       unsigned long bufsz, space_avail;
-@@ -1683,6 +1684,9 @@
-                       goto fail2;
-               clen64 = kcmsg32->cmsg_len;
-+              if ((clen64 < CMSG_ALIGN(sizeof(*ucmsg))) ||
-+                              (clen64 > (orig_cmsg_len + wp - workbuf)))
-+                      break;
-               copy_from_user(CMSG32_DATA(kcmsg32), CMSG_DATA(ucmsg),
-                              clen64 - CMSG_ALIGN(sizeof(*ucmsg)));
-               clen32 = ((clen64 - CMSG_ALIGN(sizeof(*ucmsg))) +
-@@ -1812,6 +1816,7 @@
-       struct iovec *iov=iovstack;
-       struct msghdr msg_sys;
-       unsigned long cmsg_ptr;
-+      __kernel_size_t cmsg_len;
-       int err, iov_size, total_len, len;
-       struct scm_cookie scm;
-@@ -1856,6 +1861,7 @@
-       total_len=err;
-       cmsg_ptr = (unsigned long)msg_sys.msg_control;
-+      cmsg_len = msg_sys.msg_controllen;
-       msg_sys.msg_flags = 0;
-       if (sock->file->f_flags & O_NONBLOCK)
-@@ -1882,7 +1888,8 @@
-                        * fix it up before we tack on more stuff.
-                        */
-                       if ((unsigned long) msg_sys.msg_control != cmsg_ptr)
--                              cmsg32_recvmsg_fixup(&msg_sys, cmsg_ptr);
-+                              cmsg32_recvmsg_fixup(&msg_sys, cmsg_ptr,
-+                                              cmsg_len);
-                       /* Wheee... */
-                       if (sock->passcred)
 diff -Nur linux-2.4.29/arch/mips/au1000/common/au1xxx_irqmap.c linux-mips/arch/mips/au1000/common/au1xxx_irqmap.c
 --- linux-2.4.29/arch/mips/au1000/common/au1xxx_irqmap.c       2005-01-19 15:09:26.000000000 +0100
-+++ linux-mips/arch/mips/au1000/common/au1xxx_irqmap.c 2005-01-31 12:59:30.000000000 +0100
++++ linux-mips/arch/mips/au1000/common/au1xxx_irqmap.c 2005-01-30 09:01:27.000000000 +0100
 @@ -172,14 +172,14 @@
        { AU1550_PSC1_INT, INTC_INT_HIGH_LEVEL, 0},
        { AU1550_PSC2_INT, INTC_INT_HIGH_LEVEL, 0},
@@ -344,7 +49,7 @@ diff -Nur linux-2.4.29/arch/mips/au1000/common/au1xxx_irqmap.c linux-mips/arch/m
        { AU1200_LCD_INT, INTC_INT_HIGH_LEVEL, 0},
 diff -Nur linux-2.4.29/arch/mips/au1000/common/cputable.c linux-mips/arch/mips/au1000/common/cputable.c
 --- linux-2.4.29/arch/mips/au1000/common/cputable.c    2005-01-19 15:09:26.000000000 +0100
-+++ linux-mips/arch/mips/au1000/common/cputable.c      2005-01-31 12:59:30.000000000 +0100
++++ linux-mips/arch/mips/au1000/common/cputable.c      2005-01-30 09:01:27.000000000 +0100
 @@ -39,7 +39,8 @@
      { 0xffffffff, 0x02030203, "Au1100 BD", 0, 1 },
      { 0xffffffff, 0x02030204, "Au1100 BE", 0, 1 },
@@ -357,7 +62,7 @@ diff -Nur linux-2.4.29/arch/mips/au1000/common/cputable.c linux-mips/arch/mips/a
  
 diff -Nur linux-2.4.29/arch/mips/au1000/common/dbdma.c linux-mips/arch/mips/au1000/common/dbdma.c
 --- linux-2.4.29/arch/mips/au1000/common/dbdma.c       2005-01-19 15:09:26.000000000 +0100
-+++ linux-mips/arch/mips/au1000/common/dbdma.c 2005-03-26 11:47:17.214826394 +0100
++++ linux-mips/arch/mips/au1000/common/dbdma.c 2005-02-08 07:28:37.000000000 +0100
 @@ -41,6 +41,8 @@
  #include <asm/au1xxx_dbdma.h>
  #include <asm/system.h>
@@ -1060,7 +765,7 @@ diff -Nur linux-2.4.29/arch/mips/au1000/common/gpio.c linux-mips/arch/mips/au100
 +EXPORT_SYMBOL(au1xxx_gpio_read);
 diff -Nur linux-2.4.29/arch/mips/au1000/common/irq.c linux-mips/arch/mips/au1000/common/irq.c
 --- linux-2.4.29/arch/mips/au1000/common/irq.c 2005-01-19 15:09:26.000000000 +0100
-+++ linux-mips/arch/mips/au1000/common/irq.c   2005-03-26 11:47:17.215826230 +0100
++++ linux-mips/arch/mips/au1000/common/irq.c   2005-03-13 08:56:57.000000000 +0100
 @@ -303,8 +303,30 @@
  };
  
@@ -1130,7 +835,7 @@ diff -Nur linux-2.4.29/arch/mips/au1000/common/irq.c linux-mips/arch/mips/au1000
  
 diff -Nur linux-2.4.29/arch/mips/au1000/common/Makefile linux-mips/arch/mips/au1000/common/Makefile
 --- linux-2.4.29/arch/mips/au1000/common/Makefile      2005-01-19 15:09:26.000000000 +0100
-+++ linux-mips/arch/mips/au1000/common/Makefile        2005-01-31 12:59:30.000000000 +0100
++++ linux-mips/arch/mips/au1000/common/Makefile        2005-01-30 09:01:27.000000000 +0100
 @@ -19,9 +19,9 @@
  export-objs           = prom.o clocks.o power.o usbdev.o
  
@@ -1164,7 +869,7 @@ diff -Nur linux-2.4.29/arch/mips/au1000/common/pci_fixup.c linux-mips/arch/mips/
  
 diff -Nur linux-2.4.29/arch/mips/au1000/common/pci_ops.c linux-mips/arch/mips/au1000/common/pci_ops.c
 --- linux-2.4.29/arch/mips/au1000/common/pci_ops.c     2004-02-18 14:36:30.000000000 +0100
-+++ linux-mips/arch/mips/au1000/common/pci_ops.c       2005-03-26 11:47:17.258819174 +0100
++++ linux-mips/arch/mips/au1000/common/pci_ops.c       2005-02-27 23:14:24.000000000 +0100
 @@ -162,6 +162,7 @@
  static int config_access(unsigned char access_type, struct pci_dev *dev, 
                         unsigned char where, u32 * data)
@@ -1208,7 +913,7 @@ diff -Nur linux-2.4.29/arch/mips/au1000/common/pci_ops.c linux-mips/arch/mips/au
  
 diff -Nur linux-2.4.29/arch/mips/au1000/common/power.c linux-mips/arch/mips/au1000/common/power.c
 --- linux-2.4.29/arch/mips/au1000/common/power.c       2005-01-19 15:09:26.000000000 +0100
-+++ linux-mips/arch/mips/au1000/common/power.c 2005-01-31 12:59:30.000000000 +0100
++++ linux-mips/arch/mips/au1000/common/power.c 2005-01-30 09:01:27.000000000 +0100
 @@ -50,7 +50,6 @@
  
  static void calibrate_delay(void);
@@ -1421,17 +1126,8 @@ diff -Nur linux-2.4.29/arch/mips/au1000/common/power.c linux-mips/arch/mips/au10
  
 diff -Nur linux-2.4.29/arch/mips/au1000/common/reset.c linux-mips/arch/mips/au1000/common/reset.c
 --- linux-2.4.29/arch/mips/au1000/common/reset.c       2005-01-19 15:09:26.000000000 +0100
-+++ linux-mips/arch/mips/au1000/common/reset.c 2005-03-26 11:47:17.264818189 +0100
-@@ -37,8 +37,6 @@
- #include <asm/system.h>
- #include <asm/au1000.h>
--extern int au_sleep(void);
--
- void au1000_restart(char *command)
- {
-       /* Set all integrated peripherals to disabled states */
-@@ -144,6 +142,26 @@
++++ linux-mips/arch/mips/au1000/common/reset.c 2005-02-27 23:11:54.000000000 +0100
+@@ -144,6 +144,26 @@
                au_writel(0x00, 0xb1900064); /* sys_auxpll */
                au_writel(0x00, 0xb1900100); /* sys_pininputen */
                break;
@@ -1458,53 +1154,9 @@ diff -Nur linux-2.4.29/arch/mips/au1000/common/reset.c linux-mips/arch/mips/au10
  
        default:
                break;
-@@ -163,32 +181,23 @@
- void au1000_halt(void)
- {
--#if defined(CONFIG_MIPS_PB1550)
--      /* power off system */
--      printk("\n** Powering off Pb1550\n");
--      au_writew(au_readw(0xAF00001C) | (3<<14), 0xAF00001C); 
--      au_sync();
--      while(1); /* should not get here */
--#endif
--      printk(KERN_NOTICE "\n** You can safely turn off the power\n");
--#ifdef CONFIG_MIPS_MIRAGE
--      au_writel((1 << 26) | (1 << 10), GPIO2_OUTPUT);
--#endif
--#ifdef CONFIG_PM
--      au_sleep();
--
--      /* should not get here */
--      printk(KERN_ERR "Unable to put cpu in sleep mode\n");
--      while(1);
--#else
--      while (1)
-+      /* Use WAIT in a low-power infinite spin loop */
-+      while (1) {
-               __asm__(".set\tmips3\n\t"
-                       "wait\n\t"
-                       ".set\tmips0");
--#endif
-+      }
- }
- void au1000_power_off(void)
- {
-+      extern void board_power_off (void);
-+
-+      printk(KERN_NOTICE "\n** You can safely turn off the power\n");
-+
-+      /* Give board a chance to power-off */
-+      board_power_off();
-+
-+      /* If board can't power-off, spin forever */
-       au1000_halt();
- }
 diff -Nur linux-2.4.29/arch/mips/au1000/common/setup.c linux-mips/arch/mips/au1000/common/setup.c
 --- linux-2.4.29/arch/mips/au1000/common/setup.c       2005-01-19 15:09:26.000000000 +0100
-+++ linux-mips/arch/mips/au1000/common/setup.c 2005-01-31 12:59:30.000000000 +0100
++++ linux-mips/arch/mips/au1000/common/setup.c 2005-01-30 09:01:27.000000000 +0100
 @@ -174,6 +174,40 @@
        initrd_end = (unsigned long)&__rd_end;
  #endif
@@ -1601,7 +1253,7 @@ diff -Nur linux-2.4.29/arch/mips/au1000/common/setup.c linux-mips/arch/mips/au10
  #endif
 diff -Nur linux-2.4.29/arch/mips/au1000/common/sleeper.S linux-mips/arch/mips/au1000/common/sleeper.S
 --- linux-2.4.29/arch/mips/au1000/common/sleeper.S     2004-02-18 14:36:30.000000000 +0100
-+++ linux-mips/arch/mips/au1000/common/sleeper.S       2005-01-31 12:59:30.000000000 +0100
++++ linux-mips/arch/mips/au1000/common/sleeper.S       2005-01-30 09:01:27.000000000 +0100
 @@ -15,17 +15,48 @@
  #include <asm/addrspace.h>
  #include <asm/regdef.h>
@@ -1872,7 +1524,7 @@ diff -Nur linux-2.4.29/arch/mips/au1000/common/sleeper.S linux-mips/arch/mips/au
 +
 diff -Nur linux-2.4.29/arch/mips/au1000/common/time.c linux-mips/arch/mips/au1000/common/time.c
 --- linux-2.4.29/arch/mips/au1000/common/time.c        2005-01-19 15:09:26.000000000 +0100
-+++ linux-mips/arch/mips/au1000/common/time.c  2005-03-26 11:47:17.265818025 +0100
++++ linux-mips/arch/mips/au1000/common/time.c  2005-03-13 08:56:57.000000000 +0100
 @@ -50,7 +50,6 @@
  #include <linux/mc146818rtc.h>
  #include <linux/timex.h>
@@ -1911,7 +1563,7 @@ diff -Nur linux-2.4.29/arch/mips/au1000/common/time.c linux-mips/arch/mips/au100
  
 diff -Nur linux-2.4.29/arch/mips/au1000/db1x00/board_setup.c linux-mips/arch/mips/au1000/db1x00/board_setup.c
 --- linux-2.4.29/arch/mips/au1000/db1x00/board_setup.c 2005-01-19 15:09:26.000000000 +0100
-+++ linux-mips/arch/mips/au1000/db1x00/board_setup.c   2005-03-26 11:47:17.271817041 +0100
++++ linux-mips/arch/mips/au1000/db1x00/board_setup.c   2005-01-30 09:06:19.000000000 +0100
 @@ -46,10 +46,22 @@
  #include <asm/au1000.h>
  #include <asm/db1x00.h>
@@ -1938,21 +1590,7 @@ diff -Nur linux-2.4.29/arch/mips/au1000/db1x00/board_setup.c linux-mips/arch/mip
  
  void board_reset (void)
  {
-@@ -57,6 +69,13 @@
-       au_writel(0x00000000, 0xAE00001C);
- }
-+void board_power_off (void)
-+{
-+#ifdef CONFIG_MIPS_MIRAGE
-+      au_writel((1 << 26) | (1 << 10), GPIO2_OUTPUT);
-+#endif
-+}
-+
- void __init board_setup(void)
- {
-       u32 pin_func;
-@@ -108,8 +127,42 @@
+@@ -108,8 +120,42 @@
        au_writel(0x02000200, GPIO2_OUTPUT);
  #endif
  
@@ -1997,7 +1635,7 @@ diff -Nur linux-2.4.29/arch/mips/au1000/db1x00/board_setup.c linux-mips/arch/mip
  #endif
 diff -Nur linux-2.4.29/arch/mips/au1000/db1x00/irqmap.c linux-mips/arch/mips/au1000/db1x00/irqmap.c
 --- linux-2.4.29/arch/mips/au1000/db1x00/irqmap.c      2005-01-19 15:09:26.000000000 +0100
-+++ linux-mips/arch/mips/au1000/db1x00/irqmap.c        2005-01-31 12:59:30.000000000 +0100
++++ linux-mips/arch/mips/au1000/db1x00/irqmap.c        2005-01-30 09:06:19.000000000 +0100
 @@ -53,6 +53,7 @@
  #ifdef CONFIG_MIPS_DB1550
        { AU1000_GPIO_3, INTC_INT_LOW_LEVEL, 0 }, // PCMCIA Card 0 IRQ#
@@ -2008,7 +1646,7 @@ diff -Nur linux-2.4.29/arch/mips/au1000/db1x00/irqmap.c linux-mips/arch/mips/au1
        { AU1000_GPIO_1, INTC_INT_LOW_LEVEL, 0 }, // PCMCIA Card 0 STSCHG#
 diff -Nur linux-2.4.29/arch/mips/au1000/db1x00/Makefile linux-mips/arch/mips/au1000/db1x00/Makefile
 --- linux-2.4.29/arch/mips/au1000/db1x00/Makefile      2005-01-19 15:09:26.000000000 +0100
-+++ linux-mips/arch/mips/au1000/db1x00/Makefile        2005-01-31 12:59:30.000000000 +0100
++++ linux-mips/arch/mips/au1000/db1x00/Makefile        2005-01-30 09:06:19.000000000 +0100
 @@ -17,4 +17,11 @@
  obj-y := init.o board_setup.o irqmap.o
  obj-$(CONFIG_WM97XX_COMODULE) += mirage_ts.o
@@ -2692,8 +2330,8 @@ diff -Nur linux-2.4.29/arch/mips/au1000/ficmmp/au1xxx_dock.c linux-mips/arch/mip
 +module_exit(au1xxx_dock_exit);
 diff -Nur linux-2.4.29/arch/mips/au1000/ficmmp/board_setup.c linux-mips/arch/mips/au1000/ficmmp/board_setup.c
 --- linux-2.4.29/arch/mips/au1000/ficmmp/board_setup.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-mips/arch/mips/au1000/ficmmp/board_setup.c   2005-03-19 08:17:51.000000000 +0100
-@@ -0,0 +1,226 @@
++++ linux-mips/arch/mips/au1000/ficmmp/board_setup.c   2005-03-13 09:04:16.000000000 +0100
+@@ -0,0 +1,222 @@
 +/*
 + *
 + * BRIEF MODULE DESCRIPTION
@@ -2770,10 +2408,6 @@ diff -Nur linux-2.4.29/arch/mips/au1000/ficmmp/board_setup.c linux-mips/arch/mip
 +      au_writel(0, 0xAD80001C);
 +}
 +
-+void board_power_off (void)
-+{
-+}
-+
 +void __init board_setup(void)
 +{
 +      char *argptr = NULL;
@@ -3096,18 +2730,8 @@ diff -Nur linux-2.4.29/arch/mips/au1000/ficmmp/Makefile linux-mips/arch/mips/au1
 +include $(TOPDIR)/Rules.make
 diff -Nur linux-2.4.29/arch/mips/au1000/hydrogen3/board_setup.c linux-mips/arch/mips/au1000/hydrogen3/board_setup.c
 --- linux-2.4.29/arch/mips/au1000/hydrogen3/board_setup.c      2005-01-19 15:09:26.000000000 +0100
-+++ linux-mips/arch/mips/au1000/hydrogen3/board_setup.c        2005-03-26 11:47:17.377799647 +0100
-@@ -51,12 +51,19 @@
- {
- }
-+void board_power_off (void)
-+{
-+}
-+
- void __init board_setup(void)
- {
-       u32 pin_func;
++++ linux-mips/arch/mips/au1000/hydrogen3/board_setup.c        2005-01-30 09:07:57.000000000 +0100
+@@ -57,6 +57,9 @@
  
        rtc_ops = &no_rtc_ops;
  
@@ -3431,7 +3055,7 @@ diff -Nur linux-2.4.29/arch/mips/au1000/hydrogen3/buttons.c linux-mips/arch/mips
 +module_exit(hydrogen3_buttons_exit);
 diff -Nur linux-2.4.29/arch/mips/au1000/hydrogen3/Makefile linux-mips/arch/mips/au1000/hydrogen3/Makefile
 --- linux-2.4.29/arch/mips/au1000/hydrogen3/Makefile   2005-01-19 15:09:26.000000000 +0100
-+++ linux-mips/arch/mips/au1000/hydrogen3/Makefile     2005-03-26 11:47:17.372800467 +0100
++++ linux-mips/arch/mips/au1000/hydrogen3/Makefile     2005-02-11 22:09:55.000000000 +0100
 @@ -14,6 +14,11 @@
  
  O_TARGET := hydrogen3.o
@@ -3572,37 +3196,9 @@ diff -Nur linux-2.4.29/arch/mips/au1000/mtx-1/irqmap.c linux-mips/arch/mips/au10
        };
        const long min_idsel = 0, max_idsel = 3, irqs_per_slot = 4;
        return PCI_IRQ_TABLE_LOOKUP;
-diff -Nur linux-2.4.29/arch/mips/au1000/pb1000/board_setup.c linux-mips/arch/mips/au1000/pb1000/board_setup.c
---- linux-2.4.29/arch/mips/au1000/pb1000/board_setup.c 2005-01-19 15:09:26.000000000 +0100
-+++ linux-mips/arch/mips/au1000/pb1000/board_setup.c   2005-03-26 11:47:17.413793739 +0100
-@@ -58,6 +58,10 @@
- {
- }
-+void board_power_off (void)
-+{
-+}
-+
- void __init board_setup(void)
- {
-       u32 pin_func, static_cfg0;
-diff -Nur linux-2.4.29/arch/mips/au1000/pb1100/board_setup.c linux-mips/arch/mips/au1000/pb1100/board_setup.c
---- linux-2.4.29/arch/mips/au1000/pb1100/board_setup.c 2005-01-19 15:09:26.000000000 +0100
-+++ linux-mips/arch/mips/au1000/pb1100/board_setup.c   2005-03-26 11:47:17.418792919 +0100
-@@ -62,6 +62,10 @@
-     au_writel(0x00000000, 0xAE00001C);
- }
-+void board_power_off (void)
-+{
-+}
-+
- void __init board_setup(void)
- {
-       u32 pin_func;
 diff -Nur linux-2.4.29/arch/mips/au1000/pb1100/Makefile linux-mips/arch/mips/au1000/pb1100/Makefile
 --- linux-2.4.29/arch/mips/au1000/pb1100/Makefile      2003-08-25 13:44:39.000000000 +0200
-+++ linux-mips/arch/mips/au1000/pb1100/Makefile        2005-01-31 12:59:30.000000000 +0100
++++ linux-mips/arch/mips/au1000/pb1100/Makefile        2005-01-30 09:10:29.000000000 +0100
 @@ -16,4 +16,10 @@
  
  obj-y := init.o board_setup.o irqmap.o
@@ -3746,8 +3342,8 @@ diff -Nur linux-2.4.29/arch/mips/au1000/pb1100/mmc_support.c linux-mips/arch/mip
 +
 diff -Nur linux-2.4.29/arch/mips/au1000/pb1200/board_setup.c linux-mips/arch/mips/au1000/pb1200/board_setup.c
 --- linux-2.4.29/arch/mips/au1000/pb1200/board_setup.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-mips/arch/mips/au1000/pb1200/board_setup.c   2005-03-19 08:17:51.000000000 +0100
-@@ -0,0 +1,221 @@
++++ linux-mips/arch/mips/au1000/pb1200/board_setup.c   2005-03-13 09:04:16.000000000 +0100
+@@ -0,0 +1,216 @@
 +/*
 + *
 + * BRIEF MODULE DESCRIPTION
@@ -3831,11 +3427,6 @@ diff -Nur linux-2.4.29/arch/mips/au1000/pb1200/board_setup.c linux-mips/arch/mip
 +      bcsr->resets = 0;
 +}
 +
-+void board_power_off (void)
-+{
-+      bcsr->resets = 0xC000;
-+}
-+
 +void __init board_setup(void)
 +{
 +      char *argptr = NULL;
@@ -4403,24 +3994,10 @@ diff -Nur linux-2.4.29/arch/mips/au1000/pb1200/mmc_support.c linux-mips/arch/mip
 +EXPORT_SYMBOL(mmc_power_on);
 +EXPORT_SYMBOL(mmc_power_off);
 +
-diff -Nur linux-2.4.29/arch/mips/au1000/pb1500/board_setup.c linux-mips/arch/mips/au1000/pb1500/board_setup.c
---- linux-2.4.29/arch/mips/au1000/pb1500/board_setup.c 2005-01-19 15:09:26.000000000 +0100
-+++ linux-mips/arch/mips/au1000/pb1500/board_setup.c   2005-03-26 11:47:17.496780119 +0100
-@@ -62,6 +62,10 @@
-     au_writel(0x00000000, 0xAE00001C);
- }
-+void board_power_off (void)
-+{
-+}
-+
- void __init board_setup(void)
- {
-       u32 pin_func;
 diff -Nur linux-2.4.29/arch/mips/au1000/pb1550/board_setup.c linux-mips/arch/mips/au1000/pb1550/board_setup.c
 --- linux-2.4.29/arch/mips/au1000/pb1550/board_setup.c 2005-01-19 15:09:26.000000000 +0100
-+++ linux-mips/arch/mips/au1000/pb1550/board_setup.c   2005-03-26 11:47:17.496780119 +0100
-@@ -48,12 +48,31 @@
++++ linux-mips/arch/mips/au1000/pb1550/board_setup.c   2005-01-30 09:01:28.000000000 +0100
+@@ -48,6 +48,16 @@
  
  extern struct rtc_ops no_rtc_ops;
  
@@ -4437,22 +4014,7 @@ diff -Nur linux-2.4.29/arch/mips/au1000/pb1550/board_setup.c linux-mips/arch/mip
  void board_reset (void)
  {
      /* Hit BCSR.SYSTEM_CONTROL[SW_RST] */
-       au_writew(au_readw(0xAF00001C) & ~(1<<15), 0xAF00001C);
- }
-+void board_power_off (void)
-+{
-+      /* power off system */
-+      printk("\n** Powering off Pb1550\n");
-+      au_writew(au_readw(0xAF00001C) | (3<<14), 0xAF00001C); 
-+      au_sync();
-+      while(1); /* should not get here */
-+}
-+
- void __init board_setup(void)
- {
-       u32 pin_func;
-@@ -78,5 +97,36 @@
+@@ -78,5 +88,36 @@
        au_writel(0, (u32)bcsr|0x10); /* turn off pcmcia power */
        au_sync();
  
@@ -4491,7 +4053,7 @@ diff -Nur linux-2.4.29/arch/mips/au1000/pb1550/board_setup.c linux-mips/arch/mip
  }
 diff -Nur linux-2.4.29/arch/mips/au1000/pb1550/irqmap.c linux-mips/arch/mips/au1000/pb1550/irqmap.c
 --- linux-2.4.29/arch/mips/au1000/pb1550/irqmap.c      2005-01-19 15:09:26.000000000 +0100
-+++ linux-mips/arch/mips/au1000/pb1550/irqmap.c        2005-01-31 12:59:30.000000000 +0100
++++ linux-mips/arch/mips/au1000/pb1550/irqmap.c        2005-01-30 09:01:28.000000000 +0100
 @@ -50,6 +50,9 @@
  au1xxx_irq_map_t au1xxx_irq_map[] = {
        { AU1000_GPIO_0, INTC_INT_LOW_LEVEL, 0 },
@@ -4504,7 +4066,7 @@ diff -Nur linux-2.4.29/arch/mips/au1000/pb1550/irqmap.c linux-mips/arch/mips/au1
  int au1xxx_nr_irqs = sizeof(au1xxx_irq_map)/sizeof(au1xxx_irq_map_t);
 diff -Nur linux-2.4.29/arch/mips/config-shared.in linux-mips/arch/mips/config-shared.in
 --- linux-2.4.29/arch/mips/config-shared.in    2005-01-19 15:09:27.000000000 +0100
-+++ linux-mips/arch/mips/config-shared.in      2005-01-31 12:59:28.000000000 +0100
++++ linux-mips/arch/mips/config-shared.in      2005-01-30 09:01:26.000000000 +0100
 @@ -21,16 +21,19 @@
  comment 'Machine selection'
  dep_bool 'Support for Acer PICA 1 chipset (EXPERIMENTAL)' CONFIG_ACER_PICA_61 $CONFIG_EXPERIMENTAL
@@ -4627,17 +4189,7 @@ diff -Nur linux-2.4.29/arch/mips/config-shared.in linux-mips/arch/mips/config-sh
       "$CONFIG_NINO" = "y" -o \
 diff -Nur linux-2.4.29/arch/mips/defconfig linux-mips/arch/mips/defconfig
 --- linux-2.4.29/arch/mips/defconfig   2005-01-19 15:09:27.000000000 +0100
-+++ linux-mips/arch/mips/defconfig     2005-03-26 11:47:13.509434535 +0100
-@@ -30,8 +30,8 @@
- # CONFIG_MIPS_PB1000 is not set
- # CONFIG_MIPS_PB1100 is not set
- # CONFIG_MIPS_PB1500 is not set
--# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_PB1550 is not set
-+# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_XXS1500 is not set
- # CONFIG_MIPS_MTX1 is not set
- # CONFIG_COGENT_CSB250 is not set
++++ linux-mips/arch/mips/defconfig     2005-01-09 20:33:59.000000000 +0100
 @@ -235,11 +235,6 @@
  #
  # CONFIG_IPX is not set
@@ -4650,7 +4202,7 @@ diff -Nur linux-2.4.29/arch/mips/defconfig linux-mips/arch/mips/defconfig
  # CONFIG_DECNET is not set
  # CONFIG_BRIDGE is not set
  # CONFIG_X25 is not set
-@@ -319,9 +314,11 @@
+@@ -319,6 +314,7 @@
  # CONFIG_SCSI_MEGARAID is not set
  # CONFIG_SCSI_MEGARAID2 is not set
  # CONFIG_SCSI_SATA is not set
@@ -4658,31 +4210,9 @@ diff -Nur linux-2.4.29/arch/mips/defconfig linux-mips/arch/mips/defconfig
  # CONFIG_SCSI_SATA_SVW is not set
  # CONFIG_SCSI_ATA_PIIX is not set
  # CONFIG_SCSI_SATA_NV is not set
-+# CONFIG_SCSI_SATA_QSTOR is not set
- # CONFIG_SCSI_SATA_PROMISE is not set
- # CONFIG_SCSI_SATA_SX4 is not set
- # CONFIG_SCSI_SATA_SIL is not set
-@@ -465,7 +462,6 @@
- # CONFIG_SERIAL is not set
- # CONFIG_SERIAL_EXTENDED is not set
- # CONFIG_SERIAL_NONSTANDARD is not set
--# CONFIG_MIPS_HYDROGEN3_BUTTONS is not set
- CONFIG_UNIX98_PTYS=y
- CONFIG_UNIX98_PTY_COUNT=256
 diff -Nur linux-2.4.29/arch/mips/defconfig-atlas linux-mips/arch/mips/defconfig-atlas
 --- linux-2.4.29/arch/mips/defconfig-atlas     2005-01-19 15:09:27.000000000 +0100
-+++ linux-mips/arch/mips/defconfig-atlas       2005-03-26 11:47:13.579423048 +0100
-@@ -28,8 +28,8 @@
- # CONFIG_MIPS_PB1000 is not set
- # CONFIG_MIPS_PB1100 is not set
- # CONFIG_MIPS_PB1500 is not set
--# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_PB1550 is not set
-+# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_XXS1500 is not set
- # CONFIG_MIPS_MTX1 is not set
- # CONFIG_COGENT_CSB250 is not set
++++ linux-mips/arch/mips/defconfig-atlas       2005-01-09 20:33:59.000000000 +0100
 @@ -235,11 +235,6 @@
  #
  # CONFIG_IPX is not set
@@ -4695,7 +4225,7 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-atlas linux-mips/arch/mips/defconfig-
  # CONFIG_DECNET is not set
  # CONFIG_BRIDGE is not set
  # CONFIG_X25 is not set
-@@ -317,9 +312,11 @@
+@@ -317,6 +312,7 @@
  # CONFIG_SCSI_MEGARAID is not set
  # CONFIG_SCSI_MEGARAID2 is not set
  # CONFIG_SCSI_SATA is not set
@@ -4703,50 +4233,10 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-atlas linux-mips/arch/mips/defconfig-
  # CONFIG_SCSI_SATA_SVW is not set
  # CONFIG_SCSI_ATA_PIIX is not set
  # CONFIG_SCSI_SATA_NV is not set
-+# CONFIG_SCSI_SATA_QSTOR is not set
- # CONFIG_SCSI_SATA_PROMISE is not set
- # CONFIG_SCSI_SATA_SX4 is not set
- # CONFIG_SCSI_SATA_SIL is not set
-@@ -528,7 +525,6 @@
- CONFIG_SERIAL_CONSOLE=y
- # CONFIG_SERIAL_EXTENDED is not set
- # CONFIG_SERIAL_NONSTANDARD is not set
--# CONFIG_MIPS_HYDROGEN3_BUTTONS is not set
- CONFIG_UNIX98_PTYS=y
- CONFIG_UNIX98_PTY_COUNT=256
 diff -Nur linux-2.4.29/arch/mips/defconfig-bosporus linux-mips/arch/mips/defconfig-bosporus
 --- linux-2.4.29/arch/mips/defconfig-bosporus  2005-01-19 15:09:27.000000000 +0100
-+++ linux-mips/arch/mips/defconfig-bosporus    2005-03-26 11:47:13.674407459 +0100
-@@ -30,8 +30,8 @@
- # CONFIG_MIPS_PB1000 is not set
- # CONFIG_MIPS_PB1100 is not set
- # CONFIG_MIPS_PB1500 is not set
--# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_PB1550 is not set
-+# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_XXS1500 is not set
- # CONFIG_MIPS_MTX1 is not set
- # CONFIG_COGENT_CSB250 is not set
-@@ -208,9 +208,7 @@
- CONFIG_MTD_BOSPORUS=y
- # CONFIG_MTD_XXS1500 is not set
- # CONFIG_MTD_MTX1 is not set
--# CONFIG_MTD_DB1X00 is not set
- # CONFIG_MTD_PB1550 is not set
--# CONFIG_MTD_HYDROGEN3 is not set
- # CONFIG_MTD_MIRAGE is not set
- # CONFIG_MTD_CSTM_MIPS_IXX is not set
- # CONFIG_MTD_OCELOT is not set
-@@ -229,7 +227,6 @@
- #
- # Disk-On-Chip Device Drivers
- #
--# CONFIG_MTD_DOC1000 is not set
- # CONFIG_MTD_DOC2000 is not set
- # CONFIG_MTD_DOC2001 is not set
- # CONFIG_MTD_DOCPROBE is not set
-@@ -373,11 +370,6 @@
++++ linux-mips/arch/mips/defconfig-bosporus    2005-01-30 09:01:26.000000000 +0100
+@@ -373,11 +373,6 @@
  #
  # CONFIG_IPX is not set
  # CONFIG_ATALK is not set
@@ -4758,7 +4248,7 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-bosporus linux-mips/arch/mips/defconf
  # CONFIG_DECNET is not set
  # CONFIG_BRIDGE is not set
  # CONFIG_X25 is not set
-@@ -457,9 +449,11 @@
+@@ -457,6 +452,7 @@
  # CONFIG_SCSI_MEGARAID is not set
  # CONFIG_SCSI_MEGARAID2 is not set
  # CONFIG_SCSI_SATA is not set
@@ -4766,31 +4256,18 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-bosporus linux-mips/arch/mips/defconf
  # CONFIG_SCSI_SATA_SVW is not set
  # CONFIG_SCSI_ATA_PIIX is not set
  # CONFIG_SCSI_SATA_NV is not set
-+# CONFIG_SCSI_SATA_QSTOR is not set
- # CONFIG_SCSI_SATA_PROMISE is not set
- # CONFIG_SCSI_SATA_SX4 is not set
- # CONFIG_SCSI_SATA_SIL is not set
-@@ -681,7 +675,6 @@
- # CONFIG_AU1X00_USB_TTY is not set
- # CONFIG_AU1X00_USB_RAW is not set
- # CONFIG_TXX927_SERIAL is not set
--# CONFIG_MIPS_HYDROGEN3_BUTTONS is not set
- CONFIG_UNIX98_PTYS=y
- CONFIG_UNIX98_PTY_COUNT=256
+@@ -899,7 +895,7 @@
+ # CONFIG_USB_UHCI is not set
+ # CONFIG_USB_UHCI_ALT is not set
+ CONFIG_USB_OHCI=y
+-
++CONFIG_USB_NON_PCI_OHCI=y
+ #
+ # USB Device Class drivers
+ #
 diff -Nur linux-2.4.29/arch/mips/defconfig-capcella linux-mips/arch/mips/defconfig-capcella
 --- linux-2.4.29/arch/mips/defconfig-capcella  2005-01-19 15:09:27.000000000 +0100
-+++ linux-mips/arch/mips/defconfig-capcella    2005-03-26 11:47:13.739396793 +0100
-@@ -30,8 +30,8 @@
- # CONFIG_MIPS_PB1000 is not set
- # CONFIG_MIPS_PB1100 is not set
- # CONFIG_MIPS_PB1500 is not set
--# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_PB1550 is not set
-+# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_XXS1500 is not set
- # CONFIG_MIPS_MTX1 is not set
- # CONFIG_COGENT_CSB250 is not set
++++ linux-mips/arch/mips/defconfig-capcella    2005-01-09 20:33:59.000000000 +0100
 @@ -228,11 +228,6 @@
  #
  # CONFIG_IPX is not set
@@ -4803,27 +4280,9 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-capcella linux-mips/arch/mips/defconf
  # CONFIG_DECNET is not set
  # CONFIG_BRIDGE is not set
  # CONFIG_X25 is not set
-@@ -472,7 +467,6 @@
- CONFIG_SERIAL_CONSOLE=y
- # CONFIG_SERIAL_EXTENDED is not set
- # CONFIG_SERIAL_NONSTANDARD is not set
--# CONFIG_MIPS_HYDROGEN3_BUTTONS is not set
- # CONFIG_VR41XX_KIU is not set
- CONFIG_UNIX98_PTYS=y
- CONFIG_UNIX98_PTY_COUNT=256
 diff -Nur linux-2.4.29/arch/mips/defconfig-cobalt linux-mips/arch/mips/defconfig-cobalt
 --- linux-2.4.29/arch/mips/defconfig-cobalt    2005-01-19 15:09:28.000000000 +0100
-+++ linux-mips/arch/mips/defconfig-cobalt      2005-03-26 11:47:13.804386126 +0100
-@@ -28,8 +28,8 @@
- # CONFIG_MIPS_PB1000 is not set
- # CONFIG_MIPS_PB1100 is not set
- # CONFIG_MIPS_PB1500 is not set
--# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_PB1550 is not set
-+# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_XXS1500 is not set
- # CONFIG_MIPS_MTX1 is not set
- # CONFIG_COGENT_CSB250 is not set
++++ linux-mips/arch/mips/defconfig-cobalt      2005-01-09 20:33:59.000000000 +0100
 @@ -222,11 +222,6 @@
  #
  # CONFIG_IPX is not set
@@ -4836,27 +4295,9 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-cobalt linux-mips/arch/mips/defconfig
  # CONFIG_DECNET is not set
  # CONFIG_BRIDGE is not set
  # CONFIG_X25 is not set
-@@ -505,7 +500,6 @@
- CONFIG_SERIAL_CONSOLE=y
- # CONFIG_SERIAL_EXTENDED is not set
- # CONFIG_SERIAL_NONSTANDARD is not set
--# CONFIG_MIPS_HYDROGEN3_BUTTONS is not set
- CONFIG_UNIX98_PTYS=y
- CONFIG_UNIX98_PTY_COUNT=16
 diff -Nur linux-2.4.29/arch/mips/defconfig-csb250 linux-mips/arch/mips/defconfig-csb250
 --- linux-2.4.29/arch/mips/defconfig-csb250    2005-01-19 15:09:28.000000000 +0100
-+++ linux-mips/arch/mips/defconfig-csb250      2005-03-26 11:47:13.887372506 +0100
-@@ -30,8 +30,8 @@
- # CONFIG_MIPS_PB1000 is not set
- # CONFIG_MIPS_PB1100 is not set
- # CONFIG_MIPS_PB1500 is not set
--# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_PB1550 is not set
-+# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_XXS1500 is not set
- # CONFIG_MIPS_MTX1 is not set
- CONFIG_COGENT_CSB250=y
++++ linux-mips/arch/mips/defconfig-csb250      2005-01-09 20:33:59.000000000 +0100
 @@ -268,11 +268,6 @@
  #
  # CONFIG_IPX is not set
@@ -4869,48 +4310,31 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-csb250 linux-mips/arch/mips/defconfig
  # CONFIG_DECNET is not set
  # CONFIG_BRIDGE is not set
  # CONFIG_X25 is not set
-@@ -556,7 +551,6 @@
- # CONFIG_AU1X00_USB_TTY is not set
- # CONFIG_AU1X00_USB_RAW is not set
- # CONFIG_TXX927_SERIAL is not set
--# CONFIG_MIPS_HYDROGEN3_BUTTONS is not set
- CONFIG_UNIX98_PTYS=y
- CONFIG_UNIX98_PTY_COUNT=256
 diff -Nur linux-2.4.29/arch/mips/defconfig-db1000 linux-mips/arch/mips/defconfig-db1000
 --- linux-2.4.29/arch/mips/defconfig-db1000    2005-01-19 15:09:28.000000000 +0100
-+++ linux-mips/arch/mips/defconfig-db1000      2005-03-26 11:47:13.987356097 +0100
-@@ -30,8 +30,8 @@
++++ linux-mips/arch/mips/defconfig-db1000      2005-02-03 07:35:29.000000000 +0100
+@@ -22,16 +22,19 @@
+ #
+ # CONFIG_ACER_PICA_61 is not set
+ # CONFIG_MIPS_BOSPORUS is not set
++# CONFIG_MIPS_FICMMP is not set
+ # CONFIG_MIPS_MIRAGE is not set
+ CONFIG_MIPS_DB1000=y
+ # CONFIG_MIPS_DB1100 is not set
+ # CONFIG_MIPS_DB1500 is not set
+ # CONFIG_MIPS_DB1550 is not set
++# CONFIG_MIPS_DB1200 is not set
  # CONFIG_MIPS_PB1000 is not set
  # CONFIG_MIPS_PB1100 is not set
  # CONFIG_MIPS_PB1500 is not set
 -# CONFIG_MIPS_HYDROGEN3 is not set
  # CONFIG_MIPS_PB1550 is not set
++# CONFIG_MIPS_PB1200 is not set
 +# CONFIG_MIPS_HYDROGEN3 is not set
  # CONFIG_MIPS_XXS1500 is not set
  # CONFIG_MIPS_MTX1 is not set
  # CONFIG_COGENT_CSB250 is not set
-@@ -214,11 +214,7 @@
- # CONFIG_MTD_BOSPORUS is not set
- # CONFIG_MTD_XXS1500 is not set
- # CONFIG_MTD_MTX1 is not set
--CONFIG_MTD_DB1X00=y
--CONFIG_MTD_DB1X00_BOOT=y
--CONFIG_MTD_DB1X00_USER=y
- # CONFIG_MTD_PB1550 is not set
--# CONFIG_MTD_HYDROGEN3 is not set
- # CONFIG_MTD_MIRAGE is not set
- # CONFIG_MTD_CSTM_MIPS_IXX is not set
- # CONFIG_MTD_OCELOT is not set
-@@ -237,7 +233,6 @@
- #
- # Disk-On-Chip Device Drivers
- #
--# CONFIG_MTD_DOC1000 is not set
- # CONFIG_MTD_DOC2000 is not set
- # CONFIG_MTD_DOC2001 is not set
- # CONFIG_MTD_DOCPROBE is not set
-@@ -342,11 +337,6 @@
+@@ -342,11 +345,6 @@
  #
  # CONFIG_IPX is not set
  # CONFIG_ATALK is not set
@@ -4922,48 +4346,31 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-db1000 linux-mips/arch/mips/defconfig
  # CONFIG_DECNET is not set
  # CONFIG_BRIDGE is not set
  # CONFIG_X25 is not set
-@@ -636,7 +626,6 @@
- # CONFIG_AU1X00_USB_TTY is not set
- # CONFIG_AU1X00_USB_RAW is not set
- # CONFIG_TXX927_SERIAL is not set
--# CONFIG_MIPS_HYDROGEN3_BUTTONS is not set
- CONFIG_UNIX98_PTYS=y
- CONFIG_UNIX98_PTY_COUNT=256
 diff -Nur linux-2.4.29/arch/mips/defconfig-db1100 linux-mips/arch/mips/defconfig-db1100
 --- linux-2.4.29/arch/mips/defconfig-db1100    2005-01-19 15:09:28.000000000 +0100
-+++ linux-mips/arch/mips/defconfig-db1100      2005-03-26 11:47:14.088339523 +0100
-@@ -30,8 +30,8 @@
++++ linux-mips/arch/mips/defconfig-db1100      2005-02-03 07:35:29.000000000 +0100
+@@ -22,16 +22,19 @@
+ #
+ # CONFIG_ACER_PICA_61 is not set
+ # CONFIG_MIPS_BOSPORUS is not set
++# CONFIG_MIPS_FICMMP is not set
+ # CONFIG_MIPS_MIRAGE is not set
+ # CONFIG_MIPS_DB1000 is not set
+ CONFIG_MIPS_DB1100=y
+ # CONFIG_MIPS_DB1500 is not set
+ # CONFIG_MIPS_DB1550 is not set
++# CONFIG_MIPS_DB1200 is not set
  # CONFIG_MIPS_PB1000 is not set
  # CONFIG_MIPS_PB1100 is not set
  # CONFIG_MIPS_PB1500 is not set
 -# CONFIG_MIPS_HYDROGEN3 is not set
  # CONFIG_MIPS_PB1550 is not set
++# CONFIG_MIPS_PB1200 is not set
 +# CONFIG_MIPS_HYDROGEN3 is not set
  # CONFIG_MIPS_XXS1500 is not set
  # CONFIG_MIPS_MTX1 is not set
  # CONFIG_COGENT_CSB250 is not set
-@@ -214,11 +214,7 @@
- # CONFIG_MTD_BOSPORUS is not set
- # CONFIG_MTD_XXS1500 is not set
- # CONFIG_MTD_MTX1 is not set
--CONFIG_MTD_DB1X00=y
--# CONFIG_MTD_DB1X00_BOOT is not set
--CONFIG_MTD_DB1X00_USER=y
- # CONFIG_MTD_PB1550 is not set
--# CONFIG_MTD_HYDROGEN3 is not set
- # CONFIG_MTD_MIRAGE is not set
- # CONFIG_MTD_CSTM_MIPS_IXX is not set
- # CONFIG_MTD_OCELOT is not set
-@@ -237,7 +233,6 @@
- #
- # Disk-On-Chip Device Drivers
- #
--# CONFIG_MTD_DOC1000 is not set
- # CONFIG_MTD_DOC2000 is not set
- # CONFIG_MTD_DOC2001 is not set
- # CONFIG_MTD_DOCPROBE is not set
-@@ -342,11 +337,6 @@
+@@ -342,11 +345,6 @@
  #
  # CONFIG_IPX is not set
  # CONFIG_ATALK is not set
@@ -4975,34 +4382,10 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-db1100 linux-mips/arch/mips/defconfig
  # CONFIG_DECNET is not set
  # CONFIG_BRIDGE is not set
  # CONFIG_X25 is not set
-@@ -636,7 +626,6 @@
- # CONFIG_AU1X00_USB_TTY is not set
- # CONFIG_AU1X00_USB_RAW is not set
- # CONFIG_TXX927_SERIAL is not set
--# CONFIG_MIPS_HYDROGEN3_BUTTONS is not set
- CONFIG_UNIX98_PTYS=y
- CONFIG_UNIX98_PTY_COUNT=256
-@@ -884,6 +873,7 @@
- # CONFIG_FB_PM2 is not set
- # CONFIG_FB_PM3 is not set
- # CONFIG_FB_CYBER2000 is not set
-+CONFIG_FB_AU1100=y
- # CONFIG_FB_MATROX is not set
- # CONFIG_FB_ATY is not set
- # CONFIG_FB_RADEON is not set
-@@ -895,7 +885,6 @@
- # CONFIG_FB_VOODOO1 is not set
- # CONFIG_FB_TRIDENT is not set
- # CONFIG_FB_E1356 is not set
--CONFIG_FB_AU1100=y
- # CONFIG_FB_IT8181 is not set
- # CONFIG_FB_VIRTUAL is not set
- CONFIG_FBCON_ADVANCED=y
 diff -Nur linux-2.4.29/arch/mips/defconfig-db1200 linux-mips/arch/mips/defconfig-db1200
 --- linux-2.4.29/arch/mips/defconfig-db1200    1970-01-01 01:00:00.000000000 +0100
-+++ linux-mips/arch/mips/defconfig-db1200      2005-03-26 11:47:14.182324098 +0100
-@@ -0,0 +1,1032 @@
++++ linux-mips/arch/mips/defconfig-db1200      2005-01-30 09:01:26.000000000 +0100
+@@ -0,0 +1,1051 @@
 +#
 +# Automatically generated make config: don't edit
 +#
@@ -5027,15 +4410,18 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-db1200 linux-mips/arch/mips/defconfig
 +#
 +# CONFIG_ACER_PICA_61 is not set
 +# CONFIG_MIPS_BOSPORUS is not set
++# CONFIG_MIPS_FICMMP is not set
 +# CONFIG_MIPS_MIRAGE is not set
 +# CONFIG_MIPS_DB1000 is not set
 +# CONFIG_MIPS_DB1100 is not set
 +# CONFIG_MIPS_DB1500 is not set
 +# CONFIG_MIPS_DB1550 is not set
++CONFIG_MIPS_DB1200=y
 +# CONFIG_MIPS_PB1000 is not set
 +# CONFIG_MIPS_PB1100 is not set
 +# CONFIG_MIPS_PB1500 is not set
 +# CONFIG_MIPS_PB1550 is not set
++# CONFIG_MIPS_PB1200 is not set
 +# CONFIG_MIPS_HYDROGEN3 is not set
 +# CONFIG_MIPS_XXS1500 is not set
 +# CONFIG_MIPS_MTX1 is not set
@@ -5082,6 +4468,10 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-db1200 linux-mips/arch/mips/defconfig
 +# CONFIG_HIGHMEM is not set
 +CONFIG_RWSEM_GENERIC_SPINLOCK=y
 +# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set
++CONFIG_SOC_AU1X00=y
++CONFIG_SOC_AU1200=y
++CONFIG_NONCOHERENT_IO=y
++CONFIG_PC_KEYB=y
 +# CONFIG_MIPS_AU1000 is not set
 +
 +#
@@ -5140,6 +4530,7 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-db1200 linux-mips/arch/mips/defconfig
 +# CONFIG_TCIC is not set
 +# CONFIG_I82092 is not set
 +# CONFIG_I82365 is not set
++CONFIG_PCMCIA_AU1X00=m
 +
 +#
 +# PCI Hotplug Support
@@ -5166,6 +4557,7 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-db1200 linux-mips/arch/mips/defconfig
 +# CONFIG_OOM_KILLER is not set
 +CONFIG_CMDLINE_BOOL=y
 +CONFIG_CMDLINE="mem=96M"
++# CONFIG_PM is not set
 +
 +#
 +# Memory Technology Devices (MTD)
@@ -5387,7 +4779,6 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-db1200 linux-mips/arch/mips/defconfig
 +# CONFIG_SCSI_SATA_SVW is not set
 +# CONFIG_SCSI_ATA_PIIX is not set
 +# CONFIG_SCSI_SATA_NV is not set
-+# CONFIG_SCSI_SATA_QSTOR is not set
 +# CONFIG_SCSI_SATA_PROMISE is not set
 +# CONFIG_SCSI_SATA_SX4 is not set
 +# CONFIG_SCSI_SATA_SIL is not set
@@ -5476,6 +4867,7 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-db1200 linux-mips/arch/mips/defconfig
 +# Ethernet (10 or 100Mbit)
 +#
 +CONFIG_NET_ETHERNET=y
++# CONFIG_MIPS_AU1X00_ENET is not set
 +# CONFIG_SUNLANCE is not set
 +# CONFIG_HAPPYMEAL is not set
 +# CONFIG_SUNBMAC is not set
@@ -5588,7 +4980,12 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-db1200 linux-mips/arch/mips/defconfig
 +# CONFIG_SERIAL_TX3912_CONSOLE is not set
 +# CONFIG_SERIAL_TXX9 is not set
 +# CONFIG_SERIAL_TXX9_CONSOLE is not set
++CONFIG_AU1X00_UART=y
++CONFIG_AU1X00_SERIAL_CONSOLE=y
++# CONFIG_AU1X00_USB_TTY is not set
++# CONFIG_AU1X00_USB_RAW is not set
 +# CONFIG_TXX927_SERIAL is not set
++# CONFIG_MIPS_HYDROGEN3_BUTTONS is not set
 +CONFIG_UNIX98_PTYS=y
 +CONFIG_UNIX98_PTY_COUNT=256
 +
@@ -5673,6 +5070,8 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-db1200 linux-mips/arch/mips/defconfig
 +#
 +# CONFIG_PCMCIA_SERIAL_CS is not set
 +# CONFIG_SYNCLINK_CS is not set
++# CONFIG_AU1X00_GPIO is not set
++# CONFIG_TS_AU1X00_ADS7846 is not set
 +
 +#
 +# File systems
@@ -5894,6 +5293,9 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-db1200 linux-mips/arch/mips/defconfig
 +# CONFIG_SOUND_ICH is not set
 +# CONFIG_SOUND_RME96XX is not set
 +# CONFIG_SOUND_SONICVIBES is not set
++# CONFIG_SOUND_AU1X00 is not set
++CONFIG_SOUND_AU1550_PSC=y
++# CONFIG_SOUND_AU1550_I2S is not set
 +# CONFIG_SOUND_TRIDENT is not set
 +# CONFIG_SOUND_MSNDCLAS is not set
 +# CONFIG_SOUND_MSNDPIN is not set
@@ -6037,18 +5439,29 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-db1200 linux-mips/arch/mips/defconfig
 +# CONFIG_FW_LOADER is not set
 diff -Nur linux-2.4.29/arch/mips/defconfig-db1500 linux-mips/arch/mips/defconfig-db1500
 --- linux-2.4.29/arch/mips/defconfig-db1500    2005-01-19 15:09:28.000000000 +0100
-+++ linux-mips/arch/mips/defconfig-db1500      2005-03-26 11:47:14.271309493 +0100
-@@ -30,8 +30,8 @@
++++ linux-mips/arch/mips/defconfig-db1500      2005-02-03 07:35:29.000000000 +0100
+@@ -22,16 +22,19 @@
+ #
+ # CONFIG_ACER_PICA_61 is not set
+ # CONFIG_MIPS_BOSPORUS is not set
++# CONFIG_MIPS_FICMMP is not set
+ # CONFIG_MIPS_MIRAGE is not set
+ # CONFIG_MIPS_DB1000 is not set
+ # CONFIG_MIPS_DB1100 is not set
+ CONFIG_MIPS_DB1500=y
+ # CONFIG_MIPS_DB1550 is not set
++# CONFIG_MIPS_DB1200 is not set
  # CONFIG_MIPS_PB1000 is not set
  # CONFIG_MIPS_PB1100 is not set
  # CONFIG_MIPS_PB1500 is not set
 -# CONFIG_MIPS_HYDROGEN3 is not set
  # CONFIG_MIPS_PB1550 is not set
++# CONFIG_MIPS_PB1200 is not set
 +# CONFIG_MIPS_HYDROGEN3 is not set
  # CONFIG_MIPS_XXS1500 is not set
  # CONFIG_MIPS_MTX1 is not set
  # CONFIG_COGENT_CSB250 is not set
-@@ -267,11 +267,6 @@
+@@ -267,11 +270,6 @@
  #
  # CONFIG_IPX is not set
  # CONFIG_ATALK is not set
@@ -6060,48 +5473,31 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-db1500 linux-mips/arch/mips/defconfig
  # CONFIG_DECNET is not set
  # CONFIG_BRIDGE is not set
  # CONFIG_X25 is not set
-@@ -555,7 +550,6 @@
- # CONFIG_AU1X00_USB_TTY is not set
- # CONFIG_AU1X00_USB_RAW is not set
- # CONFIG_TXX927_SERIAL is not set
--# CONFIG_MIPS_HYDROGEN3_BUTTONS is not set
- CONFIG_UNIX98_PTYS=y
- CONFIG_UNIX98_PTY_COUNT=256
 diff -Nur linux-2.4.29/arch/mips/defconfig-db1550 linux-mips/arch/mips/defconfig-db1550
 --- linux-2.4.29/arch/mips/defconfig-db1550    2005-01-19 15:09:28.000000000 +0100
-+++ linux-mips/arch/mips/defconfig-db1550      2005-03-26 11:47:14.372292920 +0100
-@@ -30,8 +30,8 @@
++++ linux-mips/arch/mips/defconfig-db1550      2005-02-03 07:35:29.000000000 +0100
+@@ -22,16 +22,19 @@
+ #
+ # CONFIG_ACER_PICA_61 is not set
+ # CONFIG_MIPS_BOSPORUS is not set
++# CONFIG_MIPS_FICMMP is not set
+ # CONFIG_MIPS_MIRAGE is not set
+ # CONFIG_MIPS_DB1000 is not set
+ # CONFIG_MIPS_DB1100 is not set
+ # CONFIG_MIPS_DB1500 is not set
+ CONFIG_MIPS_DB1550=y
++# CONFIG_MIPS_DB1200 is not set
  # CONFIG_MIPS_PB1000 is not set
  # CONFIG_MIPS_PB1100 is not set
  # CONFIG_MIPS_PB1500 is not set
 -# CONFIG_MIPS_HYDROGEN3 is not set
  # CONFIG_MIPS_PB1550 is not set
++# CONFIG_MIPS_PB1200 is not set
 +# CONFIG_MIPS_HYDROGEN3 is not set
  # CONFIG_MIPS_XXS1500 is not set
  # CONFIG_MIPS_MTX1 is not set
  # CONFIG_COGENT_CSB250 is not set
-@@ -213,11 +213,9 @@
- # CONFIG_MTD_BOSPORUS is not set
- # CONFIG_MTD_XXS1500 is not set
- # CONFIG_MTD_MTX1 is not set
--# CONFIG_MTD_DB1X00 is not set
- CONFIG_MTD_PB1550=y
- CONFIG_MTD_PB1550_BOOT=y
- CONFIG_MTD_PB1550_USER=y
--# CONFIG_MTD_HYDROGEN3 is not set
- # CONFIG_MTD_MIRAGE is not set
- # CONFIG_MTD_CSTM_MIPS_IXX is not set
- # CONFIG_MTD_OCELOT is not set
-@@ -236,7 +234,6 @@
- #
- # Disk-On-Chip Device Drivers
- #
--# CONFIG_MTD_DOC1000 is not set
- # CONFIG_MTD_DOC2000 is not set
- # CONFIG_MTD_DOC2001 is not set
- # CONFIG_MTD_DOCPROBE is not set
-@@ -343,11 +340,6 @@
+@@ -343,11 +346,6 @@
  #
  # CONFIG_IPX is not set
  # CONFIG_ATALK is not set
@@ -6113,27 +5509,9 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-db1550 linux-mips/arch/mips/defconfig
  # CONFIG_DECNET is not set
  # CONFIG_BRIDGE is not set
  # CONFIG_X25 is not set
-@@ -633,7 +625,6 @@
- # CONFIG_AU1X00_USB_TTY is not set
- # CONFIG_AU1X00_USB_RAW is not set
- # CONFIG_TXX927_SERIAL is not set
--# CONFIG_MIPS_HYDROGEN3_BUTTONS is not set
- CONFIG_UNIX98_PTYS=y
- CONFIG_UNIX98_PTY_COUNT=256
 diff -Nur linux-2.4.29/arch/mips/defconfig-ddb5476 linux-mips/arch/mips/defconfig-ddb5476
 --- linux-2.4.29/arch/mips/defconfig-ddb5476   2005-01-19 15:09:28.000000000 +0100
-+++ linux-mips/arch/mips/defconfig-ddb5476     2005-03-26 11:47:14.442281433 +0100
-@@ -28,8 +28,8 @@
- # CONFIG_MIPS_PB1000 is not set
- # CONFIG_MIPS_PB1100 is not set
- # CONFIG_MIPS_PB1500 is not set
--# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_PB1550 is not set
-+# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_XXS1500 is not set
- # CONFIG_MIPS_MTX1 is not set
- # CONFIG_COGENT_CSB250 is not set
++++ linux-mips/arch/mips/defconfig-ddb5476     2005-01-09 20:33:59.000000000 +0100
 @@ -226,11 +226,6 @@
  #
  # CONFIG_IPX is not set
@@ -6146,27 +5524,9 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-ddb5476 linux-mips/arch/mips/defconfi
  # CONFIG_DECNET is not set
  # CONFIG_BRIDGE is not set
  # CONFIG_X25 is not set
-@@ -517,7 +512,6 @@
- CONFIG_SERIAL_CONSOLE=y
- # CONFIG_SERIAL_EXTENDED is not set
- # CONFIG_SERIAL_NONSTANDARD is not set
--# CONFIG_MIPS_HYDROGEN3_BUTTONS is not set
- CONFIG_UNIX98_PTYS=y
- CONFIG_UNIX98_PTY_COUNT=256
 diff -Nur linux-2.4.29/arch/mips/defconfig-ddb5477 linux-mips/arch/mips/defconfig-ddb5477
 --- linux-2.4.29/arch/mips/defconfig-ddb5477   2005-01-19 15:09:28.000000000 +0100
-+++ linux-mips/arch/mips/defconfig-ddb5477     2005-03-26 11:47:14.507270767 +0100
-@@ -28,8 +28,8 @@
- # CONFIG_MIPS_PB1000 is not set
- # CONFIG_MIPS_PB1100 is not set
- # CONFIG_MIPS_PB1500 is not set
--# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_PB1550 is not set
-+# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_XXS1500 is not set
- # CONFIG_MIPS_MTX1 is not set
- # CONFIG_COGENT_CSB250 is not set
++++ linux-mips/arch/mips/defconfig-ddb5477     2005-01-09 20:33:59.000000000 +0100
 @@ -226,11 +226,6 @@
  #
  # CONFIG_IPX is not set
@@ -6179,27 +5539,9 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-ddb5477 linux-mips/arch/mips/defconfi
  # CONFIG_DECNET is not set
  # CONFIG_BRIDGE is not set
  # CONFIG_X25 is not set
-@@ -434,7 +429,6 @@
- CONFIG_SERIAL_CONSOLE=y
- # CONFIG_SERIAL_EXTENDED is not set
- # CONFIG_SERIAL_NONSTANDARD is not set
--# CONFIG_MIPS_HYDROGEN3_BUTTONS is not set
- CONFIG_UNIX98_PTYS=y
- CONFIG_UNIX98_PTY_COUNT=256
 diff -Nur linux-2.4.29/arch/mips/defconfig-decstation linux-mips/arch/mips/defconfig-decstation
 --- linux-2.4.29/arch/mips/defconfig-decstation        2005-01-19 15:09:28.000000000 +0100
-+++ linux-mips/arch/mips/defconfig-decstation  2005-03-26 11:47:14.573259936 +0100
-@@ -30,8 +30,8 @@
- # CONFIG_MIPS_PB1000 is not set
- # CONFIG_MIPS_PB1100 is not set
- # CONFIG_MIPS_PB1500 is not set
--# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_PB1550 is not set
-+# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_XXS1500 is not set
- # CONFIG_MIPS_MTX1 is not set
- # CONFIG_COGENT_CSB250 is not set
++++ linux-mips/arch/mips/defconfig-decstation  2005-01-09 20:33:59.000000000 +0100
 @@ -223,11 +223,6 @@
  #
  # CONFIG_IPX is not set
@@ -6212,7 +5554,7 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-decstation linux-mips/arch/mips/defco
  # CONFIG_DECNET is not set
  # CONFIG_BRIDGE is not set
  # CONFIG_X25 is not set
-@@ -306,9 +301,11 @@
+@@ -306,6 +301,7 @@
  # CONFIG_SCSI_MEGARAID is not set
  # CONFIG_SCSI_MEGARAID2 is not set
  # CONFIG_SCSI_SATA is not set
@@ -6220,31 +5562,9 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-decstation linux-mips/arch/mips/defco
  # CONFIG_SCSI_SATA_SVW is not set
  # CONFIG_SCSI_ATA_PIIX is not set
  # CONFIG_SCSI_SATA_NV is not set
-+# CONFIG_SCSI_SATA_QSTOR is not set
- # CONFIG_SCSI_SATA_PROMISE is not set
- # CONFIG_SCSI_SATA_SX4 is not set
- # CONFIG_SCSI_SATA_SIL is not set
-@@ -477,7 +474,6 @@
- CONFIG_SERIAL_DEC_CONSOLE=y
- CONFIG_DZ=y
- CONFIG_ZS=y
--# CONFIG_MIPS_HYDROGEN3_BUTTONS is not set
- CONFIG_UNIX98_PTYS=y
- CONFIG_UNIX98_PTY_COUNT=256
 diff -Nur linux-2.4.29/arch/mips/defconfig-e55 linux-mips/arch/mips/defconfig-e55
 --- linux-2.4.29/arch/mips/defconfig-e55       2005-01-19 15:09:28.000000000 +0100
-+++ linux-mips/arch/mips/defconfig-e55 2005-03-26 11:47:14.632250255 +0100
-@@ -30,8 +30,8 @@
- # CONFIG_MIPS_PB1000 is not set
- # CONFIG_MIPS_PB1100 is not set
- # CONFIG_MIPS_PB1500 is not set
--# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_PB1550 is not set
-+# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_XXS1500 is not set
- # CONFIG_MIPS_MTX1 is not set
- # CONFIG_COGENT_CSB250 is not set
++++ linux-mips/arch/mips/defconfig-e55 2005-01-09 20:33:59.000000000 +0100
 @@ -222,11 +222,6 @@
  #
  # CONFIG_IPX is not set
@@ -6257,57 +5577,10 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-e55 linux-mips/arch/mips/defconfig-e5
  # CONFIG_DECNET is not set
  # CONFIG_BRIDGE is not set
  # CONFIG_X25 is not set
-@@ -426,7 +421,6 @@
- # CONFIG_SERIAL_MULTIPORT is not set
- # CONFIG_HUB6 is not set
- # CONFIG_SERIAL_NONSTANDARD is not set
--# CONFIG_MIPS_HYDROGEN3_BUTTONS is not set
- # CONFIG_VR41XX_KIU is not set
- CONFIG_UNIX98_PTYS=y
- CONFIG_UNIX98_PTY_COUNT=256
 diff -Nur linux-2.4.29/arch/mips/defconfig-eagle linux-mips/arch/mips/defconfig-eagle
 --- linux-2.4.29/arch/mips/defconfig-eagle     2005-01-19 15:09:28.000000000 +0100
-+++ linux-mips/arch/mips/defconfig-eagle       2005-03-26 11:47:14.721235650 +0100
-@@ -30,8 +30,8 @@
- # CONFIG_MIPS_PB1000 is not set
- # CONFIG_MIPS_PB1100 is not set
- # CONFIG_MIPS_PB1500 is not set
--# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_PB1550 is not set
-+# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_XXS1500 is not set
- # CONFIG_MIPS_MTX1 is not set
- # CONFIG_COGENT_CSB250 is not set
-@@ -208,8 +208,8 @@
- # Mapping drivers for chip access
- #
- CONFIG_MTD_PHYSMAP=y
--CONFIG_MTD_PHYSMAP_START=1c000000
--CONFIG_MTD_PHYSMAP_LEN=2000000
-+CONFIG_MTD_PHYSMAP_START=0x1c000000
-+CONFIG_MTD_PHYSMAP_LEN=0x2000000
- CONFIG_MTD_PHYSMAP_BUSWIDTH=4
- # CONFIG_MTD_PB1000 is not set
- # CONFIG_MTD_PB1500 is not set
-@@ -217,9 +217,7 @@
- # CONFIG_MTD_BOSPORUS is not set
- # CONFIG_MTD_XXS1500 is not set
- # CONFIG_MTD_MTX1 is not set
--# CONFIG_MTD_DB1X00 is not set
- # CONFIG_MTD_PB1550 is not set
--# CONFIG_MTD_HYDROGEN3 is not set
- # CONFIG_MTD_MIRAGE is not set
- # CONFIG_MTD_CSTM_MIPS_IXX is not set
- # CONFIG_MTD_OCELOT is not set
-@@ -238,7 +236,6 @@
- #
- # Disk-On-Chip Device Drivers
- #
--# CONFIG_MTD_DOC1000 is not set
- # CONFIG_MTD_DOC2000 is not set
- # CONFIG_MTD_DOC2001 is not set
- # CONFIG_MTD_DOCPROBE is not set
-@@ -327,11 +324,6 @@
++++ linux-mips/arch/mips/defconfig-eagle       2005-01-09 20:33:59.000000000 +0100
+@@ -327,11 +327,6 @@
  #
  # CONFIG_IPX is not set
  # CONFIG_ATALK is not set
@@ -6319,27 +5592,9 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-eagle linux-mips/arch/mips/defconfig-
  # CONFIG_DECNET is not set
  # CONFIG_BRIDGE is not set
  # CONFIG_X25 is not set
-@@ -587,7 +579,6 @@
- CONFIG_SERIAL_CONSOLE=y
- # CONFIG_SERIAL_EXTENDED is not set
- # CONFIG_SERIAL_NONSTANDARD is not set
--# CONFIG_MIPS_HYDROGEN3_BUTTONS is not set
- # CONFIG_VR41XX_KIU is not set
- CONFIG_UNIX98_PTYS=y
- CONFIG_UNIX98_PTY_COUNT=256
 diff -Nur linux-2.4.29/arch/mips/defconfig-ev64120 linux-mips/arch/mips/defconfig-ev64120
 --- linux-2.4.29/arch/mips/defconfig-ev64120   2005-01-19 15:09:28.000000000 +0100
-+++ linux-mips/arch/mips/defconfig-ev64120     2005-03-26 11:47:14.780225968 +0100
-@@ -30,8 +30,8 @@
- # CONFIG_MIPS_PB1000 is not set
- # CONFIG_MIPS_PB1100 is not set
- # CONFIG_MIPS_PB1500 is not set
--# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_PB1550 is not set
-+# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_XXS1500 is not set
- # CONFIG_MIPS_MTX1 is not set
- # CONFIG_COGENT_CSB250 is not set
++++ linux-mips/arch/mips/defconfig-ev64120     2005-01-09 20:33:59.000000000 +0100
 @@ -230,11 +230,6 @@
  #
  # CONFIG_IPX is not set
@@ -6352,27 +5607,9 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-ev64120 linux-mips/arch/mips/defconfi
  # CONFIG_DECNET is not set
  # CONFIG_BRIDGE is not set
  # CONFIG_X25 is not set
-@@ -443,7 +438,6 @@
- # CONFIG_SERIAL_CONSOLE is not set
- # CONFIG_SERIAL_EXTENDED is not set
- # CONFIG_SERIAL_NONSTANDARD is not set
--# CONFIG_MIPS_HYDROGEN3_BUTTONS is not set
- CONFIG_UNIX98_PTYS=y
- CONFIG_UNIX98_PTY_COUNT=256
 diff -Nur linux-2.4.29/arch/mips/defconfig-ev96100 linux-mips/arch/mips/defconfig-ev96100
 --- linux-2.4.29/arch/mips/defconfig-ev96100   2005-01-19 15:09:28.000000000 +0100
-+++ linux-mips/arch/mips/defconfig-ev96100     2005-03-26 11:47:14.833217271 +0100
-@@ -30,8 +30,8 @@
- # CONFIG_MIPS_PB1000 is not set
- # CONFIG_MIPS_PB1100 is not set
- # CONFIG_MIPS_PB1500 is not set
--# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_PB1550 is not set
-+# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_XXS1500 is not set
- # CONFIG_MIPS_MTX1 is not set
- # CONFIG_COGENT_CSB250 is not set
++++ linux-mips/arch/mips/defconfig-ev96100     2005-01-09 20:33:59.000000000 +0100
 @@ -232,11 +232,6 @@
  #
  # CONFIG_IPX is not set
@@ -6385,18 +5622,10 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-ev96100 linux-mips/arch/mips/defconfi
  # CONFIG_DECNET is not set
  # CONFIG_BRIDGE is not set
  # CONFIG_X25 is not set
-@@ -441,7 +436,6 @@
- CONFIG_SERIAL_CONSOLE=y
- # CONFIG_SERIAL_EXTENDED is not set
- # CONFIG_SERIAL_NONSTANDARD is not set
--# CONFIG_MIPS_HYDROGEN3_BUTTONS is not set
- CONFIG_UNIX98_PTYS=y
- CONFIG_UNIX98_PTY_COUNT=256
 diff -Nur linux-2.4.29/arch/mips/defconfig-ficmmp linux-mips/arch/mips/defconfig-ficmmp
 --- linux-2.4.29/arch/mips/defconfig-ficmmp    1970-01-01 01:00:00.000000000 +0100
-+++ linux-mips/arch/mips/defconfig-ficmmp      2005-03-26 11:47:14.922202667 +0100
-@@ -0,0 +1,862 @@
++++ linux-mips/arch/mips/defconfig-ficmmp      2005-02-03 07:35:29.000000000 +0100
+@@ -0,0 +1,880 @@
 +#
 +# Automatically generated make config: don't edit
 +#
@@ -6421,15 +5650,18 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-ficmmp linux-mips/arch/mips/defconfig
 +#
 +# CONFIG_ACER_PICA_61 is not set
 +# CONFIG_MIPS_BOSPORUS is not set
++CONFIG_MIPS_FICMMP=y
 +# CONFIG_MIPS_MIRAGE is not set
 +# CONFIG_MIPS_DB1000 is not set
 +# CONFIG_MIPS_DB1100 is not set
 +# CONFIG_MIPS_DB1500 is not set
 +# CONFIG_MIPS_DB1550 is not set
++# CONFIG_MIPS_DB1200 is not set
 +# CONFIG_MIPS_PB1000 is not set
 +# CONFIG_MIPS_PB1100 is not set
 +# CONFIG_MIPS_PB1500 is not set
 +# CONFIG_MIPS_PB1550 is not set
++# CONFIG_MIPS_PB1200 is not set
 +# CONFIG_MIPS_HYDROGEN3 is not set
 +# CONFIG_MIPS_XXS1500 is not set
 +# CONFIG_MIPS_MTX1 is not set
@@ -6476,6 +5708,10 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-ficmmp linux-mips/arch/mips/defconfig
 +# CONFIG_HIGHMEM is not set
 +CONFIG_RWSEM_GENERIC_SPINLOCK=y
 +# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set
++CONFIG_SOC_AU1X00=y
++CONFIG_SOC_AU1200=y
++CONFIG_NONCOHERENT_IO=y
++CONFIG_PC_KEYB=y
 +# CONFIG_MIPS_AU1000 is not set
 +
 +#
@@ -6541,6 +5777,7 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-ficmmp linux-mips/arch/mips/defconfig
 +# CONFIG_OOM_KILLER is not set
 +CONFIG_CMDLINE_BOOL=y
 +CONFIG_CMDLINE="ide3=dma mem=96M root=/dev/hda2 rootflags=data=journal"
++# CONFIG_PM is not set
 +
 +#
 +# Memory Technology Devices (MTD)
@@ -6757,7 +5994,6 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-ficmmp linux-mips/arch/mips/defconfig
 +# CONFIG_SCSI_SATA_SVW is not set
 +# CONFIG_SCSI_ATA_PIIX is not set
 +# CONFIG_SCSI_SATA_NV is not set
-+# CONFIG_SCSI_SATA_QSTOR is not set
 +# CONFIG_SCSI_SATA_PROMISE is not set
 +# CONFIG_SCSI_SATA_SX4 is not set
 +# CONFIG_SCSI_SATA_SIL is not set
@@ -6818,6 +6054,7 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-ficmmp linux-mips/arch/mips/defconfig
 +# Ethernet (10 or 100Mbit)
 +#
 +CONFIG_NET_ETHERNET=y
++# CONFIG_MIPS_AU1X00_ENET is not set
 +# CONFIG_SUNLANCE is not set
 +# CONFIG_SUNBMAC is not set
 +# CONFIG_SUNQE is not set
@@ -6923,7 +6160,12 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-ficmmp linux-mips/arch/mips/defconfig
 +# CONFIG_SERIAL_TX3912_CONSOLE is not set
 +# CONFIG_SERIAL_TXX9 is not set
 +# CONFIG_SERIAL_TXX9_CONSOLE is not set
++CONFIG_AU1X00_UART=y
++CONFIG_AU1X00_SERIAL_CONSOLE=y
++# CONFIG_AU1X00_USB_TTY is not set
++# CONFIG_AU1X00_USB_RAW is not set
 +# CONFIG_TXX927_SERIAL is not set
++# CONFIG_MIPS_HYDROGEN3_BUTTONS is not set
 +CONFIG_UNIX98_PTYS=y
 +CONFIG_UNIX98_PTY_COUNT=256
 +
@@ -7007,6 +6249,8 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-ficmmp linux-mips/arch/mips/defconfig
 +# Direct Rendering Manager (XFree86 DRI support)
 +#
 +# CONFIG_DRM is not set
++# CONFIG_AU1X00_GPIO is not set
++# CONFIG_TS_AU1X00_ADS7846 is not set
 +
 +#
 +# File systems
@@ -7211,6 +6455,9 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-ficmmp linux-mips/arch/mips/defconfig
 +# CONFIG_SOUND_ICH is not set
 +# CONFIG_SOUND_RME96XX is not set
 +# CONFIG_SOUND_SONICVIBES is not set
++# CONFIG_SOUND_AU1X00 is not set
++# CONFIG_SOUND_AU1550_PSC is not set
++# CONFIG_SOUND_AU1550_I2S is not set
 +# CONFIG_SOUND_TRIDENT is not set
 +# CONFIG_SOUND_MSNDCLAS is not set
 +# CONFIG_SOUND_MSNDPIN is not set
@@ -7261,47 +6508,8 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-ficmmp linux-mips/arch/mips/defconfig
 +CONFIG_ZLIB_DEFLATE=m
 diff -Nur linux-2.4.29/arch/mips/defconfig-hp-lj linux-mips/arch/mips/defconfig-hp-lj
 --- linux-2.4.29/arch/mips/defconfig-hp-lj     2005-01-19 15:09:28.000000000 +0100
-+++ linux-mips/arch/mips/defconfig-hp-lj       2005-03-26 11:47:14.993191016 +0100
-@@ -30,8 +30,8 @@
- # CONFIG_MIPS_PB1000 is not set
- # CONFIG_MIPS_PB1100 is not set
- # CONFIG_MIPS_PB1500 is not set
--# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_PB1550 is not set
-+# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_XXS1500 is not set
- # CONFIG_MIPS_MTX1 is not set
- # CONFIG_COGENT_CSB250 is not set
-@@ -184,8 +184,8 @@
- # Mapping drivers for chip access
- #
- CONFIG_MTD_PHYSMAP=y
--CONFIG_MTD_PHYSMAP_START=10040000
--CONFIG_MTD_PHYSMAP_LEN=00fc0000
-+CONFIG_MTD_PHYSMAP_START=0x10040000
-+CONFIG_MTD_PHYSMAP_LEN=0x00fc0000
- CONFIG_MTD_PHYSMAP_BUSWIDTH=4
- # CONFIG_MTD_PB1000 is not set
- # CONFIG_MTD_PB1500 is not set
-@@ -193,9 +193,7 @@
- # CONFIG_MTD_BOSPORUS is not set
- # CONFIG_MTD_XXS1500 is not set
- # CONFIG_MTD_MTX1 is not set
--# CONFIG_MTD_DB1X00 is not set
- # CONFIG_MTD_PB1550 is not set
--# CONFIG_MTD_HYDROGEN3 is not set
- # CONFIG_MTD_MIRAGE is not set
- # CONFIG_MTD_CSTM_MIPS_IXX is not set
- # CONFIG_MTD_OCELOT is not set
-@@ -214,7 +212,6 @@
- #
- # Disk-On-Chip Device Drivers
- #
--# CONFIG_MTD_DOC1000 is not set
- # CONFIG_MTD_DOC2000 is not set
- # CONFIG_MTD_DOC2001 is not set
- # CONFIG_MTD_DOCPROBE is not set
-@@ -304,11 +301,6 @@
++++ linux-mips/arch/mips/defconfig-hp-lj       2005-01-09 20:33:59.000000000 +0100
+@@ -304,11 +304,6 @@
  #
  # CONFIG_IPX is not set
  # CONFIG_ATALK is not set
@@ -7313,46 +6521,80 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-hp-lj linux-mips/arch/mips/defconfig-
  # CONFIG_DECNET is not set
  # CONFIG_BRIDGE is not set
  # CONFIG_X25 is not set
-@@ -604,7 +596,6 @@
- CONFIG_SERIAL_CONSOLE=y
- # CONFIG_SERIAL_EXTENDED is not set
- # CONFIG_SERIAL_NONSTANDARD is not set
--# CONFIG_MIPS_HYDROGEN3_BUTTONS is not set
- # CONFIG_UNIX98_PTYS is not set
- #
 diff -Nur linux-2.4.29/arch/mips/defconfig-hydrogen3 linux-mips/arch/mips/defconfig-hydrogen3
 --- linux-2.4.29/arch/mips/defconfig-hydrogen3 2005-01-19 15:09:28.000000000 +0100
-+++ linux-mips/arch/mips/defconfig-hydrogen3   2005-03-26 11:47:15.093174606 +0100
-@@ -30,8 +30,8 @@
++++ linux-mips/arch/mips/defconfig-hydrogen3   2005-01-30 09:01:26.000000000 +0100
+@@ -22,6 +22,7 @@
+ #
+ # CONFIG_ACER_PICA_61 is not set
+ # CONFIG_MIPS_BOSPORUS is not set
++# CONFIG_MIPS_FICMMP is not set
+ # CONFIG_MIPS_MIRAGE is not set
+ # CONFIG_MIPS_DB1000 is not set
+ # CONFIG_MIPS_DB1100 is not set
+@@ -30,9 +31,11 @@
  # CONFIG_MIPS_PB1000 is not set
  # CONFIG_MIPS_PB1100 is not set
  # CONFIG_MIPS_PB1500 is not set
 -CONFIG_MIPS_HYDROGEN3=y
  # CONFIG_MIPS_PB1550 is not set
++# CONFIG_MIPS_PB1200 is not set
 +CONFIG_MIPS_HYDROGEN3=y
  # CONFIG_MIPS_XXS1500 is not set
++# CONFIG_MIPS_EP1000 is not set
  # CONFIG_MIPS_MTX1 is not set
  # CONFIG_COGENT_CSB250 is not set
-@@ -214,9 +214,7 @@
- # CONFIG_MTD_BOSPORUS is not set
- # CONFIG_MTD_XXS1500 is not set
- # CONFIG_MTD_MTX1 is not set
+ # CONFIG_BAGET_MIPS is not set
+@@ -185,6 +188,7 @@
+ CONFIG_MTD_BLOCK=y
+ # CONFIG_FTL is not set
+ # CONFIG_NFTL is not set
++# CONFIG_INFTL is not set
+ #
+ # RAM/ROM/Flash chip drivers
+@@ -196,6 +200,7 @@
+ # CONFIG_MTD_CFI_INTELEXT is not set
+ CONFIG_MTD_CFI_AMDSTD=y
+ # CONFIG_MTD_CFI_STAA is not set
++CONFIG_MTD_CFI_UTIL=y
+ # CONFIG_MTD_RAM is not set
+ # CONFIG_MTD_ROM is not set
+ # CONFIG_MTD_ABSENT is not set
+@@ -207,17 +212,12 @@
+ #
+ # Mapping drivers for chip access
+ #
++# CONFIG_MTD_COMPLEX_MAPPINGS is not set
+ # CONFIG_MTD_PHYSMAP is not set
+-# CONFIG_MTD_PB1000 is not set
+-# CONFIG_MTD_PB1500 is not set
+-# CONFIG_MTD_PB1100 is not set
+-# CONFIG_MTD_BOSPORUS is not set
+-# CONFIG_MTD_XXS1500 is not set
+-# CONFIG_MTD_MTX1 is not set
 -# CONFIG_MTD_DB1X00 is not set
  # CONFIG_MTD_PB1550 is not set
 -CONFIG_MTD_HYDROGEN3=y
- # CONFIG_MTD_MIRAGE is not set
+-# CONFIG_MTD_MIRAGE is not set
++# CONFIG_MTD_DB1550 is not set
++# CONFIG_MTD_PB1200 is not set
++# CONFIG_MTD_XXS1500 is not set
  # CONFIG_MTD_CSTM_MIPS_IXX is not set
  # CONFIG_MTD_OCELOT is not set
-@@ -235,7 +233,6 @@
+ # CONFIG_MTD_LASAT is not set
+@@ -235,9 +235,9 @@
  #
  # Disk-On-Chip Device Drivers
  #
 -# CONFIG_MTD_DOC1000 is not set
  # CONFIG_MTD_DOC2000 is not set
  # CONFIG_MTD_DOC2001 is not set
++# CONFIG_MTD_DOC2001PLUS is not set
  # CONFIG_MTD_DOCPROBE is not set
-@@ -340,11 +337,6 @@
+ #
+@@ -340,11 +340,6 @@
  #
  # CONFIG_IPX is not set
  # CONFIG_ATALK is not set
@@ -7364,7 +6606,23 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-hydrogen3 linux-mips/arch/mips/defcon
  # CONFIG_DECNET is not set
  # CONFIG_BRIDGE is not set
  # CONFIG_X25 is not set
-@@ -590,7 +582,6 @@
+@@ -386,6 +381,7 @@
+ #
+ # Please see Documentation/ide.txt for help/info on IDE drives
+ #
++# CONFIG_BLK_DEV_IDE_AU1XXX is not set
+ # CONFIG_BLK_DEV_HD_IDE is not set
+ # CONFIG_BLK_DEV_HD is not set
+ # CONFIG_BLK_DEV_IDE_SATA is not set
+@@ -403,6 +399,7 @@
+ #
+ # IDE chipset support/bugfixes
+ #
++# CONFIG_BLK_DEV_IDE_AU1XXX is not set
+ # CONFIG_BLK_DEV_CMD640 is not set
+ # CONFIG_BLK_DEV_CMD640_ENHANCED is not set
+ # CONFIG_BLK_DEV_ISAPNP is not set
+@@ -590,7 +587,6 @@
  # CONFIG_AU1X00_USB_TTY is not set
  # CONFIG_AU1X00_USB_RAW is not set
  # CONFIG_TXX927_SERIAL is not set
@@ -7372,15 +6630,34 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-hydrogen3 linux-mips/arch/mips/defcon
  CONFIG_UNIX98_PTYS=y
  CONFIG_UNIX98_PTY_COUNT=256
  
-@@ -838,6 +829,7 @@
+@@ -677,6 +673,12 @@
+ # CONFIG_SYNCLINK_CS is not set
+ # CONFIG_AU1X00_GPIO is not set
+ # CONFIG_TS_AU1X00_ADS7846 is not set
++# CONFIG_AU1550_PSC_SPI is not set
++# CONFIG_AU1XXX_MAE is not set
++# CONFIG_AU1XXX_AES is not set
++# CONFIG_AU1XXX_CIM is not set
++# CONFIG_AU1XXX_AES_TEST is not set
++CONFIG_AU1XXX_BUTTONS=y
+ #
+ # File systems
+@@ -838,18 +840,20 @@
  # CONFIG_FB_PM2 is not set
  # CONFIG_FB_PM3 is not set
  # CONFIG_FB_CYBER2000 is not set
 +CONFIG_FB_AU1100=y
++# CONFIG_FOCUS_ENHANCEMENTS is not set
  # CONFIG_FB_MATROX is not set
  # CONFIG_FB_ATY is not set
  # CONFIG_FB_RADEON is not set
-@@ -849,7 +841,6 @@
+ # CONFIG_FB_ATY128 is not set
+ # CONFIG_FB_INTEL is not set
+ # CONFIG_FB_SIS is not set
++# CONFIG_FB_SMI501 is not set
+ # CONFIG_FB_NEOMAGIC is not set
+ # CONFIG_FB_3DFX is not set
  # CONFIG_FB_VOODOO1 is not set
  # CONFIG_FB_TRIDENT is not set
  # CONFIG_FB_E1356 is not set
@@ -7388,19 +6665,21 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-hydrogen3 linux-mips/arch/mips/defcon
  # CONFIG_FB_IT8181 is not set
  # CONFIG_FB_VIRTUAL is not set
  CONFIG_FBCON_ADVANCED=y
+@@ -923,9 +927,11 @@
+ # USB Host Controller Drivers
+ #
+ # CONFIG_USB_EHCI_HCD is not set
++# CONFIG_USB_NON_PCI_EHCI is not set
+ # CONFIG_USB_UHCI is not set
+ # CONFIG_USB_UHCI_ALT is not set
+ CONFIG_USB_OHCI=y
++CONFIG_USB_NON_PCI_OHCI=y
+ #
+ # USB Device Class drivers
 diff -Nur linux-2.4.29/arch/mips/defconfig-ip22 linux-mips/arch/mips/defconfig-ip22
 --- linux-2.4.29/arch/mips/defconfig-ip22      2005-01-19 15:09:28.000000000 +0100
-+++ linux-mips/arch/mips/defconfig-ip22        2005-03-26 11:47:15.165162791 +0100
-@@ -30,8 +30,8 @@
- # CONFIG_MIPS_PB1000 is not set
- # CONFIG_MIPS_PB1100 is not set
- # CONFIG_MIPS_PB1500 is not set
--# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_PB1550 is not set
-+# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_XXS1500 is not set
- # CONFIG_MIPS_MTX1 is not set
- # CONFIG_COGENT_CSB250 is not set
++++ linux-mips/arch/mips/defconfig-ip22        2005-01-09 20:33:59.000000000 +0100
 @@ -235,11 +235,6 @@
  #
  # CONFIG_IPX is not set
@@ -7413,7 +6692,7 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-ip22 linux-mips/arch/mips/defconfig-i
  # CONFIG_DECNET is not set
  # CONFIG_BRIDGE is not set
  # CONFIG_X25 is not set
-@@ -319,9 +314,11 @@
+@@ -319,6 +314,7 @@
  # CONFIG_SCSI_MEGARAID is not set
  # CONFIG_SCSI_MEGARAID2 is not set
  # CONFIG_SCSI_SATA is not set
@@ -7421,61 +6700,10 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-ip22 linux-mips/arch/mips/defconfig-i
  # CONFIG_SCSI_SATA_SVW is not set
  # CONFIG_SCSI_ATA_PIIX is not set
  # CONFIG_SCSI_SATA_NV is not set
-+# CONFIG_SCSI_SATA_QSTOR is not set
- # CONFIG_SCSI_SATA_PROMISE is not set
- # CONFIG_SCSI_SATA_SX4 is not set
- # CONFIG_SCSI_SATA_SIL is not set
-@@ -465,7 +462,6 @@
- # CONFIG_SERIAL is not set
- # CONFIG_SERIAL_EXTENDED is not set
- # CONFIG_SERIAL_NONSTANDARD is not set
--# CONFIG_MIPS_HYDROGEN3_BUTTONS is not set
- CONFIG_UNIX98_PTYS=y
- CONFIG_UNIX98_PTY_COUNT=256
 diff -Nur linux-2.4.29/arch/mips/defconfig-it8172 linux-mips/arch/mips/defconfig-it8172
 --- linux-2.4.29/arch/mips/defconfig-it8172    2005-01-19 15:09:28.000000000 +0100
-+++ linux-mips/arch/mips/defconfig-it8172      2005-03-26 11:47:15.242150156 +0100
-@@ -30,8 +30,8 @@
- # CONFIG_MIPS_PB1000 is not set
- # CONFIG_MIPS_PB1100 is not set
- # CONFIG_MIPS_PB1500 is not set
--# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_PB1550 is not set
-+# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_XXS1500 is not set
- # CONFIG_MIPS_MTX1 is not set
- # CONFIG_COGENT_CSB250 is not set
-@@ -186,8 +186,8 @@
- # Mapping drivers for chip access
- #
- CONFIG_MTD_PHYSMAP=y
--CONFIG_MTD_PHYSMAP_START=8000000
--CONFIG_MTD_PHYSMAP_LEN=2000000
-+CONFIG_MTD_PHYSMAP_START=0x8000000
-+CONFIG_MTD_PHYSMAP_LEN=0x2000000
- CONFIG_MTD_PHYSMAP_BUSWIDTH=4
- # CONFIG_MTD_PB1000 is not set
- # CONFIG_MTD_PB1500 is not set
-@@ -195,9 +195,7 @@
- # CONFIG_MTD_BOSPORUS is not set
- # CONFIG_MTD_XXS1500 is not set
- # CONFIG_MTD_MTX1 is not set
--# CONFIG_MTD_DB1X00 is not set
- # CONFIG_MTD_PB1550 is not set
--# CONFIG_MTD_HYDROGEN3 is not set
- # CONFIG_MTD_MIRAGE is not set
- # CONFIG_MTD_CSTM_MIPS_IXX is not set
- # CONFIG_MTD_OCELOT is not set
-@@ -216,7 +214,6 @@
- #
- # Disk-On-Chip Device Drivers
- #
--# CONFIG_MTD_DOC1000 is not set
- # CONFIG_MTD_DOC2000 is not set
- # CONFIG_MTD_DOC2001 is not set
- # CONFIG_MTD_DOCPROBE is not set
-@@ -304,11 +301,6 @@
++++ linux-mips/arch/mips/defconfig-it8172      2005-01-09 20:33:59.000000000 +0100
+@@ -304,11 +304,6 @@
  #
  # CONFIG_IPX is not set
  # CONFIG_ATALK is not set
@@ -7487,27 +6715,9 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-it8172 linux-mips/arch/mips/defconfig
  # CONFIG_DECNET is not set
  # CONFIG_BRIDGE is not set
  # CONFIG_X25 is not set
-@@ -592,7 +584,6 @@
- CONFIG_PC_KEYB=y
- # CONFIG_IT8172_SCR0 is not set
- # CONFIG_IT8172_SCR1 is not set
--# CONFIG_MIPS_HYDROGEN3_BUTTONS is not set
- CONFIG_UNIX98_PTYS=y
- CONFIG_UNIX98_PTY_COUNT=256
 diff -Nur linux-2.4.29/arch/mips/defconfig-ivr linux-mips/arch/mips/defconfig-ivr
 --- linux-2.4.29/arch/mips/defconfig-ivr       2005-01-19 15:09:28.000000000 +0100
-+++ linux-mips/arch/mips/defconfig-ivr 2005-03-26 11:47:15.318137685 +0100
-@@ -30,8 +30,8 @@
- # CONFIG_MIPS_PB1000 is not set
- # CONFIG_MIPS_PB1100 is not set
- # CONFIG_MIPS_PB1500 is not set
--# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_PB1550 is not set
-+# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_XXS1500 is not set
- # CONFIG_MIPS_MTX1 is not set
- # CONFIG_COGENT_CSB250 is not set
++++ linux-mips/arch/mips/defconfig-ivr 2005-01-09 20:33:59.000000000 +0100
 @@ -226,11 +226,6 @@
  #
  # CONFIG_IPX is not set
@@ -7520,27 +6730,9 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-ivr linux-mips/arch/mips/defconfig-iv
  # CONFIG_DECNET is not set
  # CONFIG_BRIDGE is not set
  # CONFIG_X25 is not set
-@@ -516,7 +511,6 @@
- CONFIG_QTRONIX_KEYBOARD=y
- CONFIG_IT8172_CIR=y
- # CONFIG_IT8172_SCR0 is not set
--# CONFIG_MIPS_HYDROGEN3_BUTTONS is not set
- CONFIG_UNIX98_PTYS=y
- CONFIG_UNIX98_PTY_COUNT=256
 diff -Nur linux-2.4.29/arch/mips/defconfig-jmr3927 linux-mips/arch/mips/defconfig-jmr3927
 --- linux-2.4.29/arch/mips/defconfig-jmr3927   2005-01-19 15:09:28.000000000 +0100
-+++ linux-mips/arch/mips/defconfig-jmr3927     2005-03-26 11:47:15.384126854 +0100
-@@ -28,8 +28,8 @@
- # CONFIG_MIPS_PB1000 is not set
- # CONFIG_MIPS_PB1100 is not set
- # CONFIG_MIPS_PB1500 is not set
--# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_PB1550 is not set
-+# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_XXS1500 is not set
- # CONFIG_MIPS_MTX1 is not set
- # CONFIG_COGENT_CSB250 is not set
++++ linux-mips/arch/mips/defconfig-jmr3927     2005-01-09 20:33:59.000000000 +0100
 @@ -225,11 +225,6 @@
  #
  # CONFIG_IPX is not set
@@ -7553,46 +6745,10 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-jmr3927 linux-mips/arch/mips/defconfi
  # CONFIG_DECNET is not set
  # CONFIG_BRIDGE is not set
  # CONFIG_X25 is not set
-@@ -454,7 +449,6 @@
- # CONFIG_SERIAL_TXX9_CONSOLE is not set
- CONFIG_TXX927_SERIAL=y
- CONFIG_TXX927_SERIAL_CONSOLE=y
--# CONFIG_MIPS_HYDROGEN3_BUTTONS is not set
- # CONFIG_UNIX98_PTYS is not set
- #
 diff -Nur linux-2.4.29/arch/mips/defconfig-lasat linux-mips/arch/mips/defconfig-lasat
 --- linux-2.4.29/arch/mips/defconfig-lasat     2005-01-19 15:09:28.000000000 +0100
-+++ linux-mips/arch/mips/defconfig-lasat       2005-03-26 11:47:15.455115204 +0100
-@@ -30,8 +30,8 @@
- # CONFIG_MIPS_PB1000 is not set
- # CONFIG_MIPS_PB1100 is not set
- # CONFIG_MIPS_PB1500 is not set
--# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_PB1550 is not set
-+# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_XXS1500 is not set
- # CONFIG_MIPS_MTX1 is not set
- # CONFIG_COGENT_CSB250 is not set
-@@ -198,9 +198,7 @@
- # CONFIG_MTD_BOSPORUS is not set
- # CONFIG_MTD_XXS1500 is not set
- # CONFIG_MTD_MTX1 is not set
--# CONFIG_MTD_DB1X00 is not set
- # CONFIG_MTD_PB1550 is not set
--# CONFIG_MTD_HYDROGEN3 is not set
- # CONFIG_MTD_MIRAGE is not set
- # CONFIG_MTD_CSTM_MIPS_IXX is not set
- # CONFIG_MTD_OCELOT is not set
-@@ -219,7 +217,6 @@
- #
- # Disk-On-Chip Device Drivers
- #
--# CONFIG_MTD_DOC1000 is not set
- # CONFIG_MTD_DOC2000 is not set
- # CONFIG_MTD_DOC2001 is not set
- # CONFIG_MTD_DOCPROBE is not set
-@@ -303,11 +300,6 @@
++++ linux-mips/arch/mips/defconfig-lasat       2005-01-09 20:33:59.000000000 +0100
+@@ -303,11 +303,6 @@
  #
  # CONFIG_IPX is not set
  # CONFIG_ATALK is not set
@@ -7604,27 +6760,9 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-lasat linux-mips/arch/mips/defconfig-
  # CONFIG_DECNET is not set
  # CONFIG_BRIDGE is not set
  # CONFIG_X25 is not set
-@@ -584,7 +576,6 @@
- CONFIG_SERIAL_CONSOLE=y
- # CONFIG_SERIAL_EXTENDED is not set
- # CONFIG_SERIAL_NONSTANDARD is not set
--# CONFIG_MIPS_HYDROGEN3_BUTTONS is not set
- CONFIG_UNIX98_PTYS=y
- CONFIG_UNIX98_PTY_COUNT=256
 diff -Nur linux-2.4.29/arch/mips/defconfig-malta linux-mips/arch/mips/defconfig-malta
 --- linux-2.4.29/arch/mips/defconfig-malta     2005-01-19 15:09:28.000000000 +0100
-+++ linux-mips/arch/mips/defconfig-malta       2005-03-26 11:47:15.526103553 +0100
-@@ -30,8 +30,8 @@
- # CONFIG_MIPS_PB1000 is not set
- # CONFIG_MIPS_PB1100 is not set
- # CONFIG_MIPS_PB1500 is not set
--# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_PB1550 is not set
-+# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_XXS1500 is not set
- # CONFIG_MIPS_MTX1 is not set
- # CONFIG_COGENT_CSB250 is not set
++++ linux-mips/arch/mips/defconfig-malta       2005-01-09 20:33:59.000000000 +0100
 @@ -237,11 +237,6 @@
  #
  # CONFIG_IPX is not set
@@ -7637,7 +6775,7 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-malta linux-mips/arch/mips/defconfig-
  # CONFIG_DECNET is not set
  # CONFIG_BRIDGE is not set
  # CONFIG_X25 is not set
-@@ -319,9 +314,11 @@
+@@ -319,6 +314,7 @@
  # CONFIG_SCSI_MEGARAID is not set
  # CONFIG_SCSI_MEGARAID2 is not set
  # CONFIG_SCSI_SATA is not set
@@ -7645,50 +6783,10 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-malta linux-mips/arch/mips/defconfig-
  # CONFIG_SCSI_SATA_SVW is not set
  # CONFIG_SCSI_ATA_PIIX is not set
  # CONFIG_SCSI_SATA_NV is not set
-+# CONFIG_SCSI_SATA_QSTOR is not set
- # CONFIG_SCSI_SATA_PROMISE is not set
- # CONFIG_SCSI_SATA_SX4 is not set
- # CONFIG_SCSI_SATA_SIL is not set
-@@ -524,7 +521,6 @@
- CONFIG_SERIAL_CONSOLE=y
- # CONFIG_SERIAL_EXTENDED is not set
- # CONFIG_SERIAL_NONSTANDARD is not set
--# CONFIG_MIPS_HYDROGEN3_BUTTONS is not set
- CONFIG_UNIX98_PTYS=y
- CONFIG_UNIX98_PTY_COUNT=256
 diff -Nur linux-2.4.29/arch/mips/defconfig-mirage linux-mips/arch/mips/defconfig-mirage
 --- linux-2.4.29/arch/mips/defconfig-mirage    2005-01-19 15:09:28.000000000 +0100
-+++ linux-mips/arch/mips/defconfig-mirage      2005-03-26 11:47:15.615088948 +0100
-@@ -30,8 +30,8 @@
- # CONFIG_MIPS_PB1000 is not set
- # CONFIG_MIPS_PB1100 is not set
- # CONFIG_MIPS_PB1500 is not set
--# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_PB1550 is not set
-+# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_XXS1500 is not set
- # CONFIG_MIPS_MTX1 is not set
- # CONFIG_COGENT_CSB250 is not set
-@@ -209,9 +209,7 @@
- # CONFIG_MTD_BOSPORUS is not set
- # CONFIG_MTD_XXS1500 is not set
- # CONFIG_MTD_MTX1 is not set
--# CONFIG_MTD_DB1X00 is not set
- # CONFIG_MTD_PB1550 is not set
--# CONFIG_MTD_HYDROGEN3 is not set
- CONFIG_MTD_MIRAGE=y
- # CONFIG_MTD_CSTM_MIPS_IXX is not set
- # CONFIG_MTD_OCELOT is not set
-@@ -230,7 +228,6 @@
- #
- # Disk-On-Chip Device Drivers
- #
--# CONFIG_MTD_DOC1000 is not set
- # CONFIG_MTD_DOC2000 is not set
- # CONFIG_MTD_DOC2001 is not set
- # CONFIG_MTD_DOCPROBE is not set
-@@ -335,11 +332,6 @@
++++ linux-mips/arch/mips/defconfig-mirage      2005-01-30 09:01:26.000000000 +0100
+@@ -335,11 +335,6 @@
  #
  # CONFIG_IPX is not set
  # CONFIG_ATALK is not set
@@ -7700,27 +6798,18 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-mirage linux-mips/arch/mips/defconfig
  # CONFIG_DECNET is not set
  # CONFIG_BRIDGE is not set
  # CONFIG_X25 is not set
-@@ -560,7 +552,6 @@
- # CONFIG_AU1X00_USB_TTY is not set
- # CONFIG_AU1X00_USB_RAW is not set
- # CONFIG_TXX927_SERIAL is not set
--# CONFIG_MIPS_HYDROGEN3_BUTTONS is not set
- CONFIG_UNIX98_PTYS=y
- CONFIG_UNIX98_PTY_COUNT=256
+@@ -863,7 +858,7 @@
+ # CONFIG_USB_UHCI is not set
+ # CONFIG_USB_UHCI_ALT is not set
+ CONFIG_USB_OHCI=y
+-
++CONFIG_USB_NON_PCI_OHCI=y
+ #
+ # USB Device Class drivers
+ #
 diff -Nur linux-2.4.29/arch/mips/defconfig-mpc30x linux-mips/arch/mips/defconfig-mpc30x
 --- linux-2.4.29/arch/mips/defconfig-mpc30x    2005-01-19 15:09:28.000000000 +0100
-+++ linux-mips/arch/mips/defconfig-mpc30x      2005-03-26 11:47:15.680078282 +0100
-@@ -30,8 +30,8 @@
- # CONFIG_MIPS_PB1000 is not set
- # CONFIG_MIPS_PB1100 is not set
- # CONFIG_MIPS_PB1500 is not set
--# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_PB1550 is not set
-+# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_XXS1500 is not set
- # CONFIG_MIPS_MTX1 is not set
- # CONFIG_COGENT_CSB250 is not set
++++ linux-mips/arch/mips/defconfig-mpc30x      2005-01-09 20:33:59.000000000 +0100
 @@ -228,11 +228,6 @@
  #
  # CONFIG_IPX is not set
@@ -7733,46 +6822,10 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-mpc30x linux-mips/arch/mips/defconfig
  # CONFIG_DECNET is not set
  # CONFIG_BRIDGE is not set
  # CONFIG_X25 is not set
-@@ -400,7 +395,6 @@
- CONFIG_SERIAL_CONSOLE=y
- # CONFIG_SERIAL_EXTENDED is not set
- # CONFIG_SERIAL_NONSTANDARD is not set
--# CONFIG_MIPS_HYDROGEN3_BUTTONS is not set
- # CONFIG_VR41XX_KIU is not set
- CONFIG_UNIX98_PTYS=y
- CONFIG_UNIX98_PTY_COUNT=256
 diff -Nur linux-2.4.29/arch/mips/defconfig-mtx-1 linux-mips/arch/mips/defconfig-mtx-1
 --- linux-2.4.29/arch/mips/defconfig-mtx-1     2005-01-19 15:09:28.000000000 +0100
-+++ linux-mips/arch/mips/defconfig-mtx-1       2005-03-26 11:47:15.793059739 +0100
-@@ -30,8 +30,8 @@
- # CONFIG_MIPS_PB1000 is not set
- # CONFIG_MIPS_PB1100 is not set
- # CONFIG_MIPS_PB1500 is not set
--# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_PB1550 is not set
-+# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_XXS1500 is not set
- CONFIG_MIPS_MTX1=y
- # CONFIG_COGENT_CSB250 is not set
-@@ -193,9 +193,7 @@
- # CONFIG_MTD_BOSPORUS is not set
- # CONFIG_MTD_XXS1500 is not set
- CONFIG_MTD_MTX1=y
--# CONFIG_MTD_DB1X00 is not set
- # CONFIG_MTD_PB1550 is not set
--# CONFIG_MTD_HYDROGEN3 is not set
- # CONFIG_MTD_MIRAGE is not set
- # CONFIG_MTD_CSTM_MIPS_IXX is not set
- # CONFIG_MTD_OCELOT is not set
-@@ -214,7 +212,6 @@
- #
- # Disk-On-Chip Device Drivers
- #
--# CONFIG_MTD_DOC1000 is not set
- # CONFIG_MTD_DOC2000 is not set
- # CONFIG_MTD_DOC2001 is not set
- # CONFIG_MTD_DOCPROBE is not set
-@@ -371,11 +368,6 @@
++++ linux-mips/arch/mips/defconfig-mtx-1       2005-01-20 03:19:22.000000000 +0100
+@@ -371,11 +371,6 @@
  #
  # CONFIG_IPX is not set
  # CONFIG_ATALK is not set
@@ -7784,7 +6837,7 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-mtx-1 linux-mips/arch/mips/defconfig-
  # CONFIG_DECNET is not set
  CONFIG_BRIDGE=m
  # CONFIG_X25 is not set
-@@ -479,9 +471,11 @@
+@@ -479,6 +474,7 @@
  # CONFIG_SCSI_MEGARAID is not set
  # CONFIG_SCSI_MEGARAID2 is not set
  # CONFIG_SCSI_SATA is not set
@@ -7792,31 +6845,9 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-mtx-1 linux-mips/arch/mips/defconfig-
  # CONFIG_SCSI_SATA_SVW is not set
  # CONFIG_SCSI_ATA_PIIX is not set
  # CONFIG_SCSI_SATA_NV is not set
-+# CONFIG_SCSI_SATA_QSTOR is not set
- # CONFIG_SCSI_SATA_PROMISE is not set
- # CONFIG_SCSI_SATA_SX4 is not set
- # CONFIG_SCSI_SATA_SIL is not set
-@@ -700,7 +694,6 @@
- # CONFIG_AU1X00_USB_TTY is not set
- # CONFIG_AU1X00_USB_RAW is not set
- # CONFIG_TXX927_SERIAL is not set
--# CONFIG_MIPS_HYDROGEN3_BUTTONS is not set
- CONFIG_UNIX98_PTYS=y
- CONFIG_UNIX98_PTY_COUNT=256
 diff -Nur linux-2.4.29/arch/mips/defconfig-nino linux-mips/arch/mips/defconfig-nino
 --- linux-2.4.29/arch/mips/defconfig-nino      2005-01-19 15:09:28.000000000 +0100
-+++ linux-mips/arch/mips/defconfig-nino        2005-03-26 11:47:15.849050550 +0100
-@@ -30,8 +30,8 @@
- # CONFIG_MIPS_PB1000 is not set
- # CONFIG_MIPS_PB1100 is not set
- # CONFIG_MIPS_PB1500 is not set
--# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_PB1550 is not set
-+# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_XXS1500 is not set
- # CONFIG_MIPS_MTX1 is not set
- # CONFIG_COGENT_CSB250 is not set
++++ linux-mips/arch/mips/defconfig-nino        2005-01-09 20:33:59.000000000 +0100
 @@ -226,11 +226,6 @@
  #
  # CONFIG_IPX is not set
@@ -7829,46 +6860,10 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-nino linux-mips/arch/mips/defconfig-n
  # CONFIG_DECNET is not set
  # CONFIG_BRIDGE is not set
  # CONFIG_X25 is not set
-@@ -339,7 +334,6 @@
- # CONFIG_SERIAL_TXX9 is not set
- # CONFIG_SERIAL_TXX9_CONSOLE is not set
- # CONFIG_TXX927_SERIAL is not set
--# CONFIG_MIPS_HYDROGEN3_BUTTONS is not set
- # CONFIG_UNIX98_PTYS is not set
- #
 diff -Nur linux-2.4.29/arch/mips/defconfig-ocelot linux-mips/arch/mips/defconfig-ocelot
 --- linux-2.4.29/arch/mips/defconfig-ocelot    2005-01-19 15:09:28.000000000 +0100
-+++ linux-mips/arch/mips/defconfig-ocelot      2005-03-26 11:47:15.909040704 +0100
-@@ -28,8 +28,8 @@
- # CONFIG_MIPS_PB1000 is not set
- # CONFIG_MIPS_PB1100 is not set
- # CONFIG_MIPS_PB1500 is not set
--# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_PB1550 is not set
-+# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_XXS1500 is not set
- # CONFIG_MIPS_MTX1 is not set
- # CONFIG_COGENT_CSB250 is not set
-@@ -194,9 +194,7 @@
- # CONFIG_MTD_BOSPORUS is not set
- # CONFIG_MTD_XXS1500 is not set
- # CONFIG_MTD_MTX1 is not set
--# CONFIG_MTD_DB1X00 is not set
- # CONFIG_MTD_PB1550 is not set
--# CONFIG_MTD_HYDROGEN3 is not set
- # CONFIG_MTD_MIRAGE is not set
- # CONFIG_MTD_CSTM_MIPS_IXX is not set
- CONFIG_MTD_OCELOT=y
-@@ -215,7 +213,6 @@
- #
- # Disk-On-Chip Device Drivers
- #
--# CONFIG_MTD_DOC1000 is not set
- CONFIG_MTD_DOC2000=y
- # CONFIG_MTD_DOC2001 is not set
- CONFIG_MTD_DOCPROBE=y
-@@ -307,11 +304,6 @@
++++ linux-mips/arch/mips/defconfig-ocelot      2005-01-09 20:33:59.000000000 +0100
+@@ -307,11 +307,6 @@
  #
  # CONFIG_IPX is not set
  # CONFIG_ATALK is not set
@@ -7880,27 +6875,9 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-ocelot linux-mips/arch/mips/defconfig
  # CONFIG_DECNET is not set
  # CONFIG_BRIDGE is not set
  # CONFIG_X25 is not set
-@@ -513,7 +505,6 @@
- CONFIG_SERIAL_CONSOLE=y
- # CONFIG_SERIAL_EXTENDED is not set
- # CONFIG_SERIAL_NONSTANDARD is not set
--# CONFIG_MIPS_HYDROGEN3_BUTTONS is not set
- CONFIG_UNIX98_PTYS=y
- CONFIG_UNIX98_PTY_COUNT=256
 diff -Nur linux-2.4.29/arch/mips/defconfig-osprey linux-mips/arch/mips/defconfig-osprey
 --- linux-2.4.29/arch/mips/defconfig-osprey    2005-01-19 15:09:28.000000000 +0100
-+++ linux-mips/arch/mips/defconfig-osprey      2005-03-26 11:47:15.963031843 +0100
-@@ -30,8 +30,8 @@
- # CONFIG_MIPS_PB1000 is not set
- # CONFIG_MIPS_PB1100 is not set
- # CONFIG_MIPS_PB1500 is not set
--# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_PB1550 is not set
-+# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_XXS1500 is not set
- # CONFIG_MIPS_MTX1 is not set
- # CONFIG_COGENT_CSB250 is not set
++++ linux-mips/arch/mips/defconfig-osprey      2005-01-09 20:33:59.000000000 +0100
 @@ -227,11 +227,6 @@
  #
  # CONFIG_IPX is not set
@@ -7913,46 +6890,31 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-osprey linux-mips/arch/mips/defconfig
  # CONFIG_DECNET is not set
  # CONFIG_BRIDGE is not set
  # CONFIG_X25 is not set
-@@ -388,7 +383,6 @@
- # CONFIG_SERIAL_MULTIPORT is not set
- # CONFIG_HUB6 is not set
- # CONFIG_SERIAL_NONSTANDARD is not set
--# CONFIG_MIPS_HYDROGEN3_BUTTONS is not set
- # CONFIG_VR41XX_KIU is not set
- CONFIG_UNIX98_PTYS=y
- CONFIG_UNIX98_PTY_COUNT=256
 diff -Nur linux-2.4.29/arch/mips/defconfig-pb1000 linux-mips/arch/mips/defconfig-pb1000
 --- linux-2.4.29/arch/mips/defconfig-pb1000    2005-01-19 15:09:28.000000000 +0100
-+++ linux-mips/arch/mips/defconfig-pb1000      2005-03-26 11:47:16.057016418 +0100
-@@ -30,8 +30,8 @@
++++ linux-mips/arch/mips/defconfig-pb1000      2005-02-03 07:35:29.000000000 +0100
+@@ -22,16 +22,19 @@
+ #
+ # CONFIG_ACER_PICA_61 is not set
+ # CONFIG_MIPS_BOSPORUS is not set
++# CONFIG_MIPS_FICMMP is not set
+ # CONFIG_MIPS_MIRAGE is not set
+ # CONFIG_MIPS_DB1000 is not set
+ # CONFIG_MIPS_DB1100 is not set
+ # CONFIG_MIPS_DB1500 is not set
+ # CONFIG_MIPS_DB1550 is not set
++# CONFIG_MIPS_DB1200 is not set
  CONFIG_MIPS_PB1000=y
  # CONFIG_MIPS_PB1100 is not set
  # CONFIG_MIPS_PB1500 is not set
 -# CONFIG_MIPS_HYDROGEN3 is not set
  # CONFIG_MIPS_PB1550 is not set
++# CONFIG_MIPS_PB1200 is not set
 +# CONFIG_MIPS_HYDROGEN3 is not set
  # CONFIG_MIPS_XXS1500 is not set
  # CONFIG_MIPS_MTX1 is not set
  # CONFIG_COGENT_CSB250 is not set
-@@ -215,9 +215,7 @@
- # CONFIG_MTD_BOSPORUS is not set
- # CONFIG_MTD_XXS1500 is not set
- # CONFIG_MTD_MTX1 is not set
--# CONFIG_MTD_DB1X00 is not set
- # CONFIG_MTD_PB1550 is not set
--# CONFIG_MTD_HYDROGEN3 is not set
- # CONFIG_MTD_MIRAGE is not set
- # CONFIG_MTD_CSTM_MIPS_IXX is not set
- # CONFIG_MTD_OCELOT is not set
-@@ -236,7 +234,6 @@
- #
- # Disk-On-Chip Device Drivers
- #
--# CONFIG_MTD_DOC1000 is not set
- # CONFIG_MTD_DOC2000 is not set
- # CONFIG_MTD_DOC2001 is not set
- # CONFIG_MTD_DOCPROBE is not set
-@@ -324,11 +321,6 @@
+@@ -324,11 +327,6 @@
  #
  # CONFIG_IPX is not set
  # CONFIG_ATALK is not set
@@ -7964,15 +6926,7 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-pb1000 linux-mips/arch/mips/defconfig
  # CONFIG_DECNET is not set
  # CONFIG_BRIDGE is not set
  # CONFIG_X25 is not set
-@@ -622,7 +614,6 @@
- # CONFIG_AU1X00_USB_TTY is not set
- # CONFIG_AU1X00_USB_RAW is not set
- # CONFIG_TXX927_SERIAL is not set
--# CONFIG_MIPS_HYDROGEN3_BUTTONS is not set
- CONFIG_UNIX98_PTYS=y
- CONFIG_UNIX98_PTY_COUNT=256
-@@ -707,7 +698,7 @@
+@@ -707,7 +705,7 @@
  #
  # CONFIG_PCMCIA_SERIAL_CS is not set
  # CONFIG_SYNCLINK_CS is not set
@@ -7983,36 +6937,29 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-pb1000 linux-mips/arch/mips/defconfig
  #
 diff -Nur linux-2.4.29/arch/mips/defconfig-pb1100 linux-mips/arch/mips/defconfig-pb1100
 --- linux-2.4.29/arch/mips/defconfig-pb1100    2005-01-19 15:09:28.000000000 +0100
-+++ linux-mips/arch/mips/defconfig-pb1100      2005-03-26 11:47:16.158999680 +0100
-@@ -30,8 +30,8 @@
++++ linux-mips/arch/mips/defconfig-pb1100      2005-02-03 07:35:29.000000000 +0100
+@@ -22,16 +22,19 @@
+ #
+ # CONFIG_ACER_PICA_61 is not set
+ # CONFIG_MIPS_BOSPORUS is not set
++# CONFIG_MIPS_FICMMP is not set
+ # CONFIG_MIPS_MIRAGE is not set
+ # CONFIG_MIPS_DB1000 is not set
+ # CONFIG_MIPS_DB1100 is not set
+ # CONFIG_MIPS_DB1500 is not set
+ # CONFIG_MIPS_DB1550 is not set
++# CONFIG_MIPS_DB1200 is not set
  # CONFIG_MIPS_PB1000 is not set
  CONFIG_MIPS_PB1100=y
  # CONFIG_MIPS_PB1500 is not set
 -# CONFIG_MIPS_HYDROGEN3 is not set
  # CONFIG_MIPS_PB1550 is not set
++# CONFIG_MIPS_PB1200 is not set
 +# CONFIG_MIPS_HYDROGEN3 is not set
  # CONFIG_MIPS_XXS1500 is not set
  # CONFIG_MIPS_MTX1 is not set
  # CONFIG_COGENT_CSB250 is not set
-@@ -198,9 +198,7 @@
- # CONFIG_MTD_MTX1 is not set
- CONFIG_MTD_PB1500_BOOT=y
- CONFIG_MTD_PB1500_USER=y
--# CONFIG_MTD_DB1X00 is not set
- # CONFIG_MTD_PB1550 is not set
--# CONFIG_MTD_HYDROGEN3 is not set
- # CONFIG_MTD_MIRAGE is not set
- # CONFIG_MTD_CSTM_MIPS_IXX is not set
- # CONFIG_MTD_OCELOT is not set
-@@ -219,7 +217,6 @@
- #
- # Disk-On-Chip Device Drivers
- #
--# CONFIG_MTD_DOC1000 is not set
- # CONFIG_MTD_DOC2000 is not set
- # CONFIG_MTD_DOC2001 is not set
- # CONFIG_MTD_DOCPROBE is not set
-@@ -324,11 +321,6 @@
+@@ -324,11 +327,6 @@
  #
  # CONFIG_IPX is not set
  # CONFIG_ATALK is not set
@@ -8024,34 +6971,10 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-pb1100 linux-mips/arch/mips/defconfig
  # CONFIG_DECNET is not set
  # CONFIG_BRIDGE is not set
  # CONFIG_X25 is not set
-@@ -613,7 +605,6 @@
- # CONFIG_AU1X00_USB_TTY is not set
- # CONFIG_AU1X00_USB_RAW is not set
- # CONFIG_TXX927_SERIAL is not set
--# CONFIG_MIPS_HYDROGEN3_BUTTONS is not set
- CONFIG_UNIX98_PTYS=y
- CONFIG_UNIX98_PTY_COUNT=256
-@@ -859,6 +850,7 @@
- # CONFIG_FB_PM2 is not set
- # CONFIG_FB_PM3 is not set
- # CONFIG_FB_CYBER2000 is not set
-+CONFIG_FB_AU1100=y
- # CONFIG_FB_MATROX is not set
- # CONFIG_FB_ATY is not set
- # CONFIG_FB_RADEON is not set
-@@ -870,7 +862,6 @@
- # CONFIG_FB_VOODOO1 is not set
- # CONFIG_FB_TRIDENT is not set
- # CONFIG_FB_E1356 is not set
--CONFIG_FB_AU1100=y
- # CONFIG_FB_IT8181 is not set
- # CONFIG_FB_VIRTUAL is not set
- CONFIG_FBCON_ADVANCED=y
 diff -Nur linux-2.4.29/arch/mips/defconfig-pb1200 linux-mips/arch/mips/defconfig-pb1200
 --- linux-2.4.29/arch/mips/defconfig-pb1200    1970-01-01 01:00:00.000000000 +0100
-+++ linux-mips/arch/mips/defconfig-pb1200      2005-03-26 11:47:16.258983270 +0100
-@@ -0,0 +1,1060 @@
++++ linux-mips/arch/mips/defconfig-pb1200      2005-01-30 09:01:27.000000000 +0100
+@@ -0,0 +1,1063 @@
 +#
 +# Automatically generated make config: don't edit
 +#
@@ -8076,15 +6999,18 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-pb1200 linux-mips/arch/mips/defconfig
 +#
 +# CONFIG_ACER_PICA_61 is not set
 +# CONFIG_MIPS_BOSPORUS is not set
++# CONFIG_MIPS_FICMMP is not set
 +# CONFIG_MIPS_MIRAGE is not set
 +# CONFIG_MIPS_DB1000 is not set
 +# CONFIG_MIPS_DB1100 is not set
 +# CONFIG_MIPS_DB1500 is not set
 +# CONFIG_MIPS_DB1550 is not set
++# CONFIG_MIPS_DB1200 is not set
 +# CONFIG_MIPS_PB1000 is not set
 +# CONFIG_MIPS_PB1100 is not set
 +# CONFIG_MIPS_PB1500 is not set
 +# CONFIG_MIPS_PB1550 is not set
++CONFIG_MIPS_PB1200=y
 +# CONFIG_MIPS_HYDROGEN3 is not set
 +# CONFIG_MIPS_XXS1500 is not set
 +# CONFIG_MIPS_MTX1 is not set
@@ -8442,7 +7368,6 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-pb1200 linux-mips/arch/mips/defconfig
 +# CONFIG_SCSI_SATA_SVW is not set
 +# CONFIG_SCSI_ATA_PIIX is not set
 +# CONFIG_SCSI_SATA_NV is not set
-+# CONFIG_SCSI_SATA_QSTOR is not set
 +# CONFIG_SCSI_SATA_PROMISE is not set
 +# CONFIG_SCSI_SATA_SX4 is not set
 +# CONFIG_SCSI_SATA_SIL is not set
@@ -8656,6 +7581,7 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-pb1200 linux-mips/arch/mips/defconfig
 +# CONFIG_AU1X00_USB_TTY is not set
 +# CONFIG_AU1X00_USB_RAW is not set
 +# CONFIG_TXX927_SERIAL is not set
++# CONFIG_MIPS_HYDROGEN3_BUTTONS is not set
 +CONFIG_UNIX98_PTYS=y
 +CONFIG_UNIX98_PTY_COUNT=256
 +
@@ -9114,36 +8040,29 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-pb1200 linux-mips/arch/mips/defconfig
 +# CONFIG_FW_LOADER is not set
 diff -Nur linux-2.4.29/arch/mips/defconfig-pb1500 linux-mips/arch/mips/defconfig-pb1500
 --- linux-2.4.29/arch/mips/defconfig-pb1500    2005-01-19 15:09:28.000000000 +0100
-+++ linux-mips/arch/mips/defconfig-pb1500      2005-03-26 11:47:16.365965712 +0100
-@@ -30,8 +30,8 @@
++++ linux-mips/arch/mips/defconfig-pb1500      2005-02-03 07:35:29.000000000 +0100
+@@ -22,16 +22,19 @@
+ #
+ # CONFIG_ACER_PICA_61 is not set
+ # CONFIG_MIPS_BOSPORUS is not set
++# CONFIG_MIPS_FICMMP is not set
+ # CONFIG_MIPS_MIRAGE is not set
+ # CONFIG_MIPS_DB1000 is not set
+ # CONFIG_MIPS_DB1100 is not set
+ # CONFIG_MIPS_DB1500 is not set
+ # CONFIG_MIPS_DB1550 is not set
++# CONFIG_MIPS_DB1200 is not set
  # CONFIG_MIPS_PB1000 is not set
  # CONFIG_MIPS_PB1100 is not set
  CONFIG_MIPS_PB1500=y
 -# CONFIG_MIPS_HYDROGEN3 is not set
  # CONFIG_MIPS_PB1550 is not set
++# CONFIG_MIPS_PB1200 is not set
 +# CONFIG_MIPS_HYDROGEN3 is not set
  # CONFIG_MIPS_XXS1500 is not set
  # CONFIG_MIPS_MTX1 is not set
  # CONFIG_COGENT_CSB250 is not set
-@@ -215,9 +215,7 @@
- # CONFIG_MTD_MTX1 is not set
- CONFIG_MTD_PB1500_BOOT=y
- # CONFIG_MTD_PB1500_USER is not set
--# CONFIG_MTD_DB1X00 is not set
- # CONFIG_MTD_PB1550 is not set
--# CONFIG_MTD_HYDROGEN3 is not set
- # CONFIG_MTD_MIRAGE is not set
- # CONFIG_MTD_CSTM_MIPS_IXX is not set
- # CONFIG_MTD_OCELOT is not set
-@@ -236,7 +234,6 @@
- #
- # Disk-On-Chip Device Drivers
- #
--# CONFIG_MTD_DOC1000 is not set
- # CONFIG_MTD_DOC2000 is not set
- # CONFIG_MTD_DOC2001 is not set
- # CONFIG_MTD_DOCPROBE is not set
-@@ -341,11 +338,6 @@
+@@ -341,11 +344,6 @@
  #
  # CONFIG_IPX is not set
  # CONFIG_ATALK is not set
@@ -9155,48 +8074,31 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-pb1500 linux-mips/arch/mips/defconfig
  # CONFIG_DECNET is not set
  # CONFIG_BRIDGE is not set
  # CONFIG_X25 is not set
-@@ -675,7 +667,6 @@
- # CONFIG_AU1X00_USB_TTY is not set
- # CONFIG_AU1X00_USB_RAW is not set
- # CONFIG_TXX927_SERIAL is not set
--# CONFIG_MIPS_HYDROGEN3_BUTTONS is not set
- CONFIG_UNIX98_PTYS=y
- CONFIG_UNIX98_PTY_COUNT=256
 diff -Nur linux-2.4.29/arch/mips/defconfig-pb1550 linux-mips/arch/mips/defconfig-pb1550
 --- linux-2.4.29/arch/mips/defconfig-pb1550    2005-01-19 15:09:29.000000000 +0100
-+++ linux-mips/arch/mips/defconfig-pb1550      2005-03-26 11:47:16.471948318 +0100
-@@ -30,8 +30,8 @@
++++ linux-mips/arch/mips/defconfig-pb1550      2005-02-03 07:35:29.000000000 +0100
+@@ -22,16 +22,19 @@
+ #
+ # CONFIG_ACER_PICA_61 is not set
+ # CONFIG_MIPS_BOSPORUS is not set
++# CONFIG_MIPS_FICMMP is not set
+ # CONFIG_MIPS_MIRAGE is not set
+ # CONFIG_MIPS_DB1000 is not set
+ # CONFIG_MIPS_DB1100 is not set
+ # CONFIG_MIPS_DB1500 is not set
+ # CONFIG_MIPS_DB1550 is not set
++# CONFIG_MIPS_DB1200 is not set
  # CONFIG_MIPS_PB1000 is not set
  # CONFIG_MIPS_PB1100 is not set
  # CONFIG_MIPS_PB1500 is not set
 -# CONFIG_MIPS_HYDROGEN3 is not set
  CONFIG_MIPS_PB1550=y
++# CONFIG_MIPS_PB1200 is not set
 +# CONFIG_MIPS_HYDROGEN3 is not set
  # CONFIG_MIPS_XXS1500 is not set
  # CONFIG_MIPS_MTX1 is not set
  # CONFIG_COGENT_CSB250 is not set
-@@ -213,11 +213,9 @@
- # CONFIG_MTD_BOSPORUS is not set
- # CONFIG_MTD_XXS1500 is not set
- # CONFIG_MTD_MTX1 is not set
--# CONFIG_MTD_DB1X00 is not set
- CONFIG_MTD_PB1550=y
- CONFIG_MTD_PB1550_BOOT=y
- CONFIG_MTD_PB1550_USER=y
--# CONFIG_MTD_HYDROGEN3 is not set
- # CONFIG_MTD_MIRAGE is not set
- # CONFIG_MTD_CSTM_MIPS_IXX is not set
- # CONFIG_MTD_OCELOT is not set
-@@ -236,7 +234,6 @@
- #
- # Disk-On-Chip Device Drivers
- #
--# CONFIG_MTD_DOC1000 is not set
- # CONFIG_MTD_DOC2000 is not set
- # CONFIG_MTD_DOC2001 is not set
- # CONFIG_MTD_DOCPROBE is not set
-@@ -343,11 +340,6 @@
+@@ -343,11 +346,6 @@
  #
  # CONFIG_IPX is not set
  # CONFIG_ATALK is not set
@@ -9208,27 +8110,9 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-pb1550 linux-mips/arch/mips/defconfig
  # CONFIG_DECNET is not set
  # CONFIG_BRIDGE is not set
  # CONFIG_X25 is not set
-@@ -633,7 +625,6 @@
- # CONFIG_AU1X00_USB_TTY is not set
- # CONFIG_AU1X00_USB_RAW is not set
- # CONFIG_TXX927_SERIAL is not set
--# CONFIG_MIPS_HYDROGEN3_BUTTONS is not set
- CONFIG_UNIX98_PTYS=y
- CONFIG_UNIX98_PTY_COUNT=256
 diff -Nur linux-2.4.29/arch/mips/defconfig-rbtx4927 linux-mips/arch/mips/defconfig-rbtx4927
 --- linux-2.4.29/arch/mips/defconfig-rbtx4927  2005-01-19 15:09:29.000000000 +0100
-+++ linux-mips/arch/mips/defconfig-rbtx4927    2005-03-26 11:47:16.531938472 +0100
-@@ -28,8 +28,8 @@
- # CONFIG_MIPS_PB1000 is not set
- # CONFIG_MIPS_PB1100 is not set
- # CONFIG_MIPS_PB1500 is not set
--# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_PB1550 is not set
-+# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_XXS1500 is not set
- # CONFIG_MIPS_MTX1 is not set
- # CONFIG_COGENT_CSB250 is not set
++++ linux-mips/arch/mips/defconfig-rbtx4927    2005-01-09 20:33:59.000000000 +0100
 @@ -223,11 +223,6 @@
  #
  # CONFIG_IPX is not set
@@ -9241,27 +8125,9 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-rbtx4927 linux-mips/arch/mips/defconf
  # CONFIG_DECNET is not set
  # CONFIG_BRIDGE is not set
  # CONFIG_X25 is not set
-@@ -466,7 +461,6 @@
- CONFIG_SERIAL_TXX9=y
- CONFIG_SERIAL_TXX9_CONSOLE=y
- # CONFIG_TXX927_SERIAL is not set
--# CONFIG_MIPS_HYDROGEN3_BUTTONS is not set
- # CONFIG_UNIX98_PTYS is not set
- #
 diff -Nur linux-2.4.29/arch/mips/defconfig-rm200 linux-mips/arch/mips/defconfig-rm200
 --- linux-2.4.29/arch/mips/defconfig-rm200     2005-01-19 15:09:29.000000000 +0100
-+++ linux-mips/arch/mips/defconfig-rm200       2005-03-26 11:47:16.579930595 +0100
-@@ -30,8 +30,8 @@
- # CONFIG_MIPS_PB1000 is not set
- # CONFIG_MIPS_PB1100 is not set
- # CONFIG_MIPS_PB1500 is not set
--# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_PB1550 is not set
-+# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_XXS1500 is not set
- # CONFIG_MIPS_MTX1 is not set
- # CONFIG_COGENT_CSB250 is not set
++++ linux-mips/arch/mips/defconfig-rm200       2005-01-09 20:33:59.000000000 +0100
 @@ -229,11 +229,6 @@
  #
  # CONFIG_IPX is not set
@@ -9274,27 +8140,9 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-rm200 linux-mips/arch/mips/defconfig-
  # CONFIG_DECNET is not set
  # CONFIG_BRIDGE is not set
  # CONFIG_X25 is not set
-@@ -340,7 +335,6 @@
- # CONFIG_SERIAL is not set
- # CONFIG_SERIAL_EXTENDED is not set
- # CONFIG_SERIAL_NONSTANDARD is not set
--# CONFIG_MIPS_HYDROGEN3_BUTTONS is not set
- CONFIG_UNIX98_PTYS=y
- CONFIG_UNIX98_PTY_COUNT=256
 diff -Nur linux-2.4.29/arch/mips/defconfig-sb1250-swarm linux-mips/arch/mips/defconfig-sb1250-swarm
 --- linux-2.4.29/arch/mips/defconfig-sb1250-swarm      2005-01-19 15:09:29.000000000 +0100
-+++ linux-mips/arch/mips/defconfig-sb1250-swarm        2005-03-26 11:47:16.645919765 +0100
-@@ -30,8 +30,8 @@
- # CONFIG_MIPS_PB1000 is not set
- # CONFIG_MIPS_PB1100 is not set
- # CONFIG_MIPS_PB1500 is not set
--# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_PB1550 is not set
-+# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_XXS1500 is not set
- # CONFIG_MIPS_MTX1 is not set
- # CONFIG_COGENT_CSB250 is not set
++++ linux-mips/arch/mips/defconfig-sb1250-swarm        2005-01-09 20:33:59.000000000 +0100
 @@ -90,6 +90,7 @@
  # CONFIG_SIBYTE_TBPROF is not set
  CONFIG_SIBYTE_GENBUS_IDE=y
@@ -9315,48 +8163,9 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-sb1250-swarm linux-mips/arch/mips/def
  # CONFIG_DECNET is not set
  # CONFIG_BRIDGE is not set
  # CONFIG_X25 is not set
-@@ -469,7 +465,6 @@
- CONFIG_SIBYTE_SB1250_DUART=y
- CONFIG_SIBYTE_SB1250_DUART_CONSOLE=y
- CONFIG_SERIAL_CONSOLE=y
--# CONFIG_MIPS_HYDROGEN3_BUTTONS is not set
- CONFIG_UNIX98_PTYS=y
- CONFIG_UNIX98_PTY_COUNT=256
-diff -Nur linux-2.4.29/arch/mips/defconfig-sead linux-mips/arch/mips/defconfig-sead
---- linux-2.4.29/arch/mips/defconfig-sead      2005-01-19 15:09:29.000000000 +0100
-+++ linux-mips/arch/mips/defconfig-sead        2005-03-26 11:47:16.686913037 +0100
-@@ -28,8 +28,8 @@
- # CONFIG_MIPS_PB1000 is not set
- # CONFIG_MIPS_PB1100 is not set
- # CONFIG_MIPS_PB1500 is not set
--# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_PB1550 is not set
-+# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_XXS1500 is not set
- # CONFIG_MIPS_MTX1 is not set
- # CONFIG_COGENT_CSB250 is not set
-@@ -244,7 +244,6 @@
- CONFIG_SERIAL_CONSOLE=y
- # CONFIG_SERIAL_EXTENDED is not set
- # CONFIG_SERIAL_NONSTANDARD is not set
--# CONFIG_MIPS_HYDROGEN3_BUTTONS is not set
- # CONFIG_UNIX98_PTYS is not set
- #
 diff -Nur linux-2.4.29/arch/mips/defconfig-stretch linux-mips/arch/mips/defconfig-stretch
 --- linux-2.4.29/arch/mips/defconfig-stretch   2005-01-19 15:09:29.000000000 +0100
-+++ linux-mips/arch/mips/defconfig-stretch     2005-03-26 11:47:16.751902371 +0100
-@@ -30,8 +30,8 @@
- # CONFIG_MIPS_PB1000 is not set
- # CONFIG_MIPS_PB1100 is not set
- # CONFIG_MIPS_PB1500 is not set
--# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_PB1550 is not set
-+# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_XXS1500 is not set
- # CONFIG_MIPS_MTX1 is not set
- # CONFIG_COGENT_CSB250 is not set
++++ linux-mips/arch/mips/defconfig-stretch     2005-01-09 20:33:59.000000000 +0100
 @@ -240,11 +240,6 @@
  #
  # CONFIG_IPX is not set
@@ -9369,7 +8178,7 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-stretch linux-mips/arch/mips/defconfi
  # CONFIG_DECNET is not set
  # CONFIG_BRIDGE is not set
  # CONFIG_X25 is not set
-@@ -324,9 +319,11 @@
+@@ -324,6 +319,7 @@
  # CONFIG_SCSI_MEGARAID is not set
  # CONFIG_SCSI_MEGARAID2 is not set
  # CONFIG_SCSI_SATA is not set
@@ -9377,31 +8186,9 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-stretch linux-mips/arch/mips/defconfi
  # CONFIG_SCSI_SATA_SVW is not set
  # CONFIG_SCSI_ATA_PIIX is not set
  # CONFIG_SCSI_SATA_NV is not set
-+# CONFIG_SCSI_SATA_QSTOR is not set
- # CONFIG_SCSI_SATA_PROMISE is not set
- # CONFIG_SCSI_SATA_SX4 is not set
- # CONFIG_SCSI_SATA_SIL is not set
-@@ -516,7 +513,6 @@
- # CONFIG_SERIAL_TXX9 is not set
- # CONFIG_SERIAL_TXX9_CONSOLE is not set
- # CONFIG_TXX927_SERIAL is not set
--# CONFIG_MIPS_HYDROGEN3_BUTTONS is not set
- CONFIG_UNIX98_PTYS=y
- CONFIG_UNIX98_PTY_COUNT=256
 diff -Nur linux-2.4.29/arch/mips/defconfig-tb0226 linux-mips/arch/mips/defconfig-tb0226
 --- linux-2.4.29/arch/mips/defconfig-tb0226    2005-01-19 15:09:29.000000000 +0100
-+++ linux-mips/arch/mips/defconfig-tb0226      2005-03-26 11:47:16.828889735 +0100
-@@ -30,8 +30,8 @@
- # CONFIG_MIPS_PB1000 is not set
- # CONFIG_MIPS_PB1100 is not set
- # CONFIG_MIPS_PB1500 is not set
--# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_PB1550 is not set
-+# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_XXS1500 is not set
- # CONFIG_MIPS_MTX1 is not set
- # CONFIG_COGENT_CSB250 is not set
++++ linux-mips/arch/mips/defconfig-tb0226      2005-01-09 20:34:00.000000000 +0100
 @@ -228,11 +228,6 @@
  #
  # CONFIG_IPX is not set
@@ -9414,7 +8201,7 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-tb0226 linux-mips/arch/mips/defconfig
  # CONFIG_DECNET is not set
  # CONFIG_BRIDGE is not set
  # CONFIG_X25 is not set
-@@ -312,9 +307,11 @@
+@@ -312,6 +307,7 @@
  # CONFIG_SCSI_MEGARAID is not set
  # CONFIG_SCSI_MEGARAID2 is not set
  # CONFIG_SCSI_SATA is not set
@@ -9422,31 +8209,9 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-tb0226 linux-mips/arch/mips/defconfig
  # CONFIG_SCSI_SATA_SVW is not set
  # CONFIG_SCSI_ATA_PIIX is not set
  # CONFIG_SCSI_SATA_NV is not set
-+# CONFIG_SCSI_SATA_QSTOR is not set
- # CONFIG_SCSI_SATA_PROMISE is not set
- # CONFIG_SCSI_SATA_SX4 is not set
- # CONFIG_SCSI_SATA_SIL is not set
-@@ -518,7 +515,6 @@
- CONFIG_SERIAL_CONSOLE=y
- # CONFIG_SERIAL_EXTENDED is not set
- # CONFIG_SERIAL_NONSTANDARD is not set
--# CONFIG_MIPS_HYDROGEN3_BUTTONS is not set
- # CONFIG_VR41XX_KIU is not set
- CONFIG_UNIX98_PTYS=y
- CONFIG_UNIX98_PTY_COUNT=256
 diff -Nur linux-2.4.29/arch/mips/defconfig-tb0229 linux-mips/arch/mips/defconfig-tb0229
 --- linux-2.4.29/arch/mips/defconfig-tb0229    2005-01-19 15:09:29.000000000 +0100
-+++ linux-mips/arch/mips/defconfig-tb0229      2005-03-26 11:47:16.893879069 +0100
-@@ -30,8 +30,8 @@
- # CONFIG_MIPS_PB1000 is not set
- # CONFIG_MIPS_PB1100 is not set
- # CONFIG_MIPS_PB1500 is not set
--# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_PB1550 is not set
-+# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_XXS1500 is not set
- # CONFIG_MIPS_MTX1 is not set
- # CONFIG_COGENT_CSB250 is not set
++++ linux-mips/arch/mips/defconfig-tb0229      2005-01-09 20:34:00.000000000 +0100
 @@ -230,11 +230,6 @@
  #
  # CONFIG_IPX is not set
@@ -9459,46 +8224,10 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-tb0229 linux-mips/arch/mips/defconfig
  # CONFIG_DECNET is not set
  # CONFIG_BRIDGE is not set
  # CONFIG_X25 is not set
-@@ -445,7 +440,6 @@
- CONFIG_SERIAL_CONSOLE=y
- # CONFIG_SERIAL_EXTENDED is not set
- # CONFIG_SERIAL_NONSTANDARD is not set
--# CONFIG_MIPS_HYDROGEN3_BUTTONS is not set
- # CONFIG_VR41XX_KIU is not set
- CONFIG_UNIX98_PTYS=y
- CONFIG_UNIX98_PTY_COUNT=256
 diff -Nur linux-2.4.29/arch/mips/defconfig-ti1500 linux-mips/arch/mips/defconfig-ti1500
 --- linux-2.4.29/arch/mips/defconfig-ti1500    2005-01-19 15:09:29.000000000 +0100
-+++ linux-mips/arch/mips/defconfig-ti1500      2005-03-26 11:47:16.995862331 +0100
-@@ -30,8 +30,8 @@
- # CONFIG_MIPS_PB1000 is not set
- # CONFIG_MIPS_PB1100 is not set
- # CONFIG_MIPS_PB1500 is not set
--# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_PB1550 is not set
-+# CONFIG_MIPS_HYDROGEN3 is not set
- CONFIG_MIPS_XXS1500=y
- # CONFIG_MIPS_MTX1 is not set
- # CONFIG_COGENT_CSB250 is not set
-@@ -213,9 +213,7 @@
- # CONFIG_MTD_BOSPORUS is not set
- CONFIG_MTD_XXS1500=y
- # CONFIG_MTD_MTX1 is not set
--# CONFIG_MTD_DB1X00 is not set
- # CONFIG_MTD_PB1550 is not set
--# CONFIG_MTD_HYDROGEN3 is not set
- # CONFIG_MTD_MIRAGE is not set
- # CONFIG_MTD_CSTM_MIPS_IXX is not set
- # CONFIG_MTD_OCELOT is not set
-@@ -234,7 +232,6 @@
- #
- # Disk-On-Chip Device Drivers
- #
--# CONFIG_MTD_DOC1000 is not set
- # CONFIG_MTD_DOC2000 is not set
- # CONFIG_MTD_DOC2001 is not set
- # CONFIG_MTD_DOCPROBE is not set
-@@ -339,11 +336,6 @@
++++ linux-mips/arch/mips/defconfig-ti1500      2005-01-09 20:34:00.000000000 +0100
+@@ -339,11 +339,6 @@
  #
  # CONFIG_IPX is not set
  # CONFIG_ATALK is not set
@@ -9510,27 +8239,9 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-ti1500 linux-mips/arch/mips/defconfig
  # CONFIG_DECNET is not set
  # CONFIG_BRIDGE is not set
  # CONFIG_X25 is not set
-@@ -600,7 +592,6 @@
- # CONFIG_AU1X00_USB_TTY is not set
- # CONFIG_AU1X00_USB_RAW is not set
- # CONFIG_TXX927_SERIAL is not set
--# CONFIG_MIPS_HYDROGEN3_BUTTONS is not set
- CONFIG_UNIX98_PTYS=y
- CONFIG_UNIX98_PTY_COUNT=256
 diff -Nur linux-2.4.29/arch/mips/defconfig-workpad linux-mips/arch/mips/defconfig-workpad
 --- linux-2.4.29/arch/mips/defconfig-workpad   2005-01-19 15:09:29.000000000 +0100
-+++ linux-mips/arch/mips/defconfig-workpad     2005-03-26 11:47:17.054852650 +0100
-@@ -30,8 +30,8 @@
- # CONFIG_MIPS_PB1000 is not set
- # CONFIG_MIPS_PB1100 is not set
- # CONFIG_MIPS_PB1500 is not set
--# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_PB1550 is not set
-+# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_XXS1500 is not set
- # CONFIG_MIPS_MTX1 is not set
- # CONFIG_COGENT_CSB250 is not set
++++ linux-mips/arch/mips/defconfig-workpad     2005-01-09 20:34:00.000000000 +0100
 @@ -222,11 +222,6 @@
  #
  # CONFIG_IPX is not set
@@ -9543,46 +8254,10 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-workpad linux-mips/arch/mips/defconfi
  # CONFIG_DECNET is not set
  # CONFIG_BRIDGE is not set
  # CONFIG_X25 is not set
-@@ -426,7 +421,6 @@
- # CONFIG_SERIAL_MULTIPORT is not set
- # CONFIG_HUB6 is not set
- # CONFIG_SERIAL_NONSTANDARD is not set
--# CONFIG_MIPS_HYDROGEN3_BUTTONS is not set
- # CONFIG_VR41XX_KIU is not set
- CONFIG_UNIX98_PTYS=y
- CONFIG_UNIX98_PTY_COUNT=256
 diff -Nur linux-2.4.29/arch/mips/defconfig-xxs1500 linux-mips/arch/mips/defconfig-xxs1500
 --- linux-2.4.29/arch/mips/defconfig-xxs1500   2005-01-19 15:09:29.000000000 +0100
-+++ linux-mips/arch/mips/defconfig-xxs1500     2005-03-26 11:47:17.143838045 +0100
-@@ -30,8 +30,8 @@
- # CONFIG_MIPS_PB1000 is not set
- # CONFIG_MIPS_PB1100 is not set
- # CONFIG_MIPS_PB1500 is not set
--# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_PB1550 is not set
-+# CONFIG_MIPS_HYDROGEN3 is not set
- CONFIG_MIPS_XXS1500=y
- # CONFIG_MIPS_MTX1 is not set
- # CONFIG_COGENT_CSB250 is not set
-@@ -213,9 +213,7 @@
- # CONFIG_MTD_BOSPORUS is not set
- CONFIG_MTD_XXS1500=y
- # CONFIG_MTD_MTX1 is not set
--# CONFIG_MTD_DB1X00 is not set
- # CONFIG_MTD_PB1550 is not set
--# CONFIG_MTD_HYDROGEN3 is not set
- # CONFIG_MTD_MIRAGE is not set
- # CONFIG_MTD_CSTM_MIPS_IXX is not set
- # CONFIG_MTD_OCELOT is not set
-@@ -234,7 +232,6 @@
- #
- # Disk-On-Chip Device Drivers
- #
--# CONFIG_MTD_DOC1000 is not set
- # CONFIG_MTD_DOC2000 is not set
- # CONFIG_MTD_DOC2001 is not set
- # CONFIG_MTD_DOCPROBE is not set
-@@ -339,11 +336,6 @@
++++ linux-mips/arch/mips/defconfig-xxs1500     2005-01-09 20:34:00.000000000 +0100
+@@ -339,11 +339,6 @@
  #
  # CONFIG_IPX is not set
  # CONFIG_ATALK is not set
@@ -9594,27 +8269,9 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-xxs1500 linux-mips/arch/mips/defconfi
  # CONFIG_DECNET is not set
  # CONFIG_BRIDGE is not set
  # CONFIG_X25 is not set
-@@ -671,7 +663,6 @@
- # CONFIG_AU1X00_USB_TTY is not set
- # CONFIG_AU1X00_USB_RAW is not set
- # CONFIG_TXX927_SERIAL is not set
--# CONFIG_MIPS_HYDROGEN3_BUTTONS is not set
- CONFIG_UNIX98_PTYS=y
- CONFIG_UNIX98_PTY_COUNT=256
 diff -Nur linux-2.4.29/arch/mips/defconfig-yosemite linux-mips/arch/mips/defconfig-yosemite
 --- linux-2.4.29/arch/mips/defconfig-yosemite  2005-01-19 15:09:29.000000000 +0100
-+++ linux-mips/arch/mips/defconfig-yosemite    2005-03-26 11:47:17.208827379 +0100
-@@ -30,8 +30,8 @@
- # CONFIG_MIPS_PB1000 is not set
- # CONFIG_MIPS_PB1100 is not set
- # CONFIG_MIPS_PB1500 is not set
--# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_PB1550 is not set
-+# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_XXS1500 is not set
- # CONFIG_MIPS_MTX1 is not set
- # CONFIG_COGENT_CSB250 is not set
++++ linux-mips/arch/mips/defconfig-yosemite    2005-01-09 20:34:00.000000000 +0100
 @@ -227,11 +227,6 @@
  #
  # CONFIG_IPX is not set
@@ -9627,7 +8284,7 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-yosemite linux-mips/arch/mips/defconf
  # CONFIG_DECNET is not set
  # CONFIG_BRIDGE is not set
  # CONFIG_X25 is not set
-@@ -310,9 +305,11 @@
+@@ -310,6 +305,7 @@
  # CONFIG_SCSI_MEGARAID is not set
  # CONFIG_SCSI_MEGARAID2 is not set
  # CONFIG_SCSI_SATA is not set
@@ -9635,21 +8292,9 @@ diff -Nur linux-2.4.29/arch/mips/defconfig-yosemite linux-mips/arch/mips/defconf
  # CONFIG_SCSI_SATA_SVW is not set
  # CONFIG_SCSI_ATA_PIIX is not set
  # CONFIG_SCSI_SATA_NV is not set
-+# CONFIG_SCSI_SATA_QSTOR is not set
- # CONFIG_SCSI_SATA_PROMISE is not set
- # CONFIG_SCSI_SATA_SX4 is not set
- # CONFIG_SCSI_SATA_SIL is not set
-@@ -477,7 +474,6 @@
- # CONFIG_SERIAL_TXX9 is not set
- # CONFIG_SERIAL_TXX9_CONSOLE is not set
- # CONFIG_TXX927_SERIAL is not set
--# CONFIG_MIPS_HYDROGEN3_BUTTONS is not set
- CONFIG_UNIX98_PTYS=y
- CONFIG_UNIX98_PTY_COUNT=256
 diff -Nur linux-2.4.29/arch/mips/kernel/cpu-probe.c linux-mips/arch/mips/kernel/cpu-probe.c
 --- linux-2.4.29/arch/mips/kernel/cpu-probe.c  2005-01-19 15:09:29.000000000 +0100
-+++ linux-mips/arch/mips/kernel/cpu-probe.c    2005-01-31 12:59:30.000000000 +0100
++++ linux-mips/arch/mips/kernel/cpu-probe.c    2005-01-30 09:01:28.000000000 +0100
 @@ -105,6 +105,7 @@
        case CPU_AU1100:
        case CPU_AU1500:
@@ -9831,7 +8476,7 @@ diff -Nur linux-2.4.29/arch/mips/kernel/head.S linux-mips/arch/mips/kernel/head.
  
 diff -Nur linux-2.4.29/arch/mips/kernel/scall_o32.S linux-mips/arch/mips/kernel/scall_o32.S
 --- linux-2.4.29/arch/mips/kernel/scall_o32.S  2005-01-19 15:09:29.000000000 +0100
-+++ linux-mips/arch/mips/kernel/scall_o32.S    2005-03-26 11:47:17.566768632 +0100
++++ linux-mips/arch/mips/kernel/scall_o32.S    2005-02-07 22:21:53.000000000 +0100
 @@ -121,15 +121,14 @@
  
  trace_a_syscall:
@@ -9981,7 +8626,7 @@ diff -Nur linux-2.4.29/arch/mips/lib/rtc-std.c linux-mips/arch/mips/lib/rtc-std.
 -EXPORT_SYMBOL(rtc_ops);
 diff -Nur linux-2.4.29/arch/mips/Makefile linux-mips/arch/mips/Makefile
 --- linux-2.4.29/arch/mips/Makefile    2005-01-19 15:09:26.000000000 +0100
-+++ linux-mips/arch/mips/Makefile      2005-01-31 12:59:28.000000000 +0100
++++ linux-mips/arch/mips/Makefile      2005-01-30 09:01:26.000000000 +0100
 @@ -211,7 +211,7 @@
  endif
  
@@ -10098,7 +8743,7 @@ diff -Nur linux-2.4.29/arch/mips/mm/cerr-sb1.c linux-mips/arch/mips/mm/cerr-sb1.
                        prom_printf("[Bank %d Set 0x%02x]  LRU > %d %d %d %d > MRU\n",
 diff -Nur linux-2.4.29/arch/mips/mm/c-r4k.c linux-mips/arch/mips/mm/c-r4k.c
 --- linux-2.4.29/arch/mips/mm/c-r4k.c  2005-01-19 15:09:29.000000000 +0100
-+++ linux-mips/arch/mips/mm/c-r4k.c    2005-03-26 11:47:17.585765515 +0100
++++ linux-mips/arch/mips/mm/c-r4k.c    2005-02-06 22:55:42.000000000 +0100
 @@ -867,9 +867,16 @@
         * normally they'd suffer from aliases but magic in the hardware deals
         * with that for us so we don't need to take care ourselves.
@@ -10543,18 +9188,8 @@ diff -Nur linux-2.4.29/arch/mips/mm/tlb-r4k.c linux-mips/arch/mips/mm/tlb-r4k.c
         * You should never change this register:
 diff -Nur linux-2.4.29/arch/mips64/defconfig linux-mips/arch/mips64/defconfig
 --- linux-2.4.29/arch/mips64/defconfig 2005-01-19 15:09:30.000000000 +0100
-+++ linux-mips/arch/mips64/defconfig   2005-03-26 11:47:17.749738603 +0100
-@@ -30,8 +30,8 @@
- # CONFIG_MIPS_PB1000 is not set
- # CONFIG_MIPS_PB1100 is not set
- # CONFIG_MIPS_PB1500 is not set
--# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_PB1550 is not set
-+# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_XXS1500 is not set
- # CONFIG_MIPS_MTX1 is not set
- # CONFIG_COGENT_CSB250 is not set
-@@ -470,9 +470,11 @@
++++ linux-mips/arch/mips64/defconfig   2005-01-20 03:19:22.000000000 +0100
+@@ -470,6 +470,7 @@
  # CONFIG_SCSI_MEGARAID is not set
  # CONFIG_SCSI_MEGARAID2 is not set
  # CONFIG_SCSI_SATA is not set
@@ -10562,31 +9197,9 @@ diff -Nur linux-2.4.29/arch/mips64/defconfig linux-mips/arch/mips64/defconfig
  # CONFIG_SCSI_SATA_SVW is not set
  # CONFIG_SCSI_ATA_PIIX is not set
  # CONFIG_SCSI_SATA_NV is not set
-+# CONFIG_SCSI_SATA_QSTOR is not set
- # CONFIG_SCSI_SATA_PROMISE is not set
- # CONFIG_SCSI_SATA_SX4 is not set
- # CONFIG_SCSI_SATA_SIL is not set
-@@ -658,7 +660,6 @@
- CONFIG_SERIAL_CONSOLE=y
- # CONFIG_SERIAL_EXTENDED is not set
- # CONFIG_SERIAL_NONSTANDARD is not set
--# CONFIG_MIPS_HYDROGEN3_BUTTONS is not set
- CONFIG_UNIX98_PTYS=y
- CONFIG_UNIX98_PTY_COUNT=256
 diff -Nur linux-2.4.29/arch/mips64/defconfig-atlas linux-mips/arch/mips64/defconfig-atlas
 --- linux-2.4.29/arch/mips64/defconfig-atlas   2005-01-19 15:09:30.000000000 +0100
-+++ linux-mips/arch/mips64/defconfig-atlas     2005-03-26 11:47:17.816727608 +0100
-@@ -28,8 +28,8 @@
- # CONFIG_MIPS_PB1000 is not set
- # CONFIG_MIPS_PB1100 is not set
- # CONFIG_MIPS_PB1500 is not set
--# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_PB1550 is not set
-+# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_XXS1500 is not set
- # CONFIG_MIPS_MTX1 is not set
- # CONFIG_COGENT_CSB250 is not set
++++ linux-mips/arch/mips64/defconfig-atlas     2005-01-09 20:34:01.000000000 +0100
 @@ -232,11 +232,6 @@
  #
  # CONFIG_IPX is not set
@@ -10599,7 +9212,7 @@ diff -Nur linux-2.4.29/arch/mips64/defconfig-atlas linux-mips/arch/mips64/defcon
  # CONFIG_DECNET is not set
  # CONFIG_BRIDGE is not set
  # CONFIG_X25 is not set
-@@ -314,9 +309,11 @@
+@@ -314,6 +309,7 @@
  # CONFIG_SCSI_MEGARAID is not set
  # CONFIG_SCSI_MEGARAID2 is not set
  # CONFIG_SCSI_SATA is not set
@@ -10607,31 +9220,9 @@ diff -Nur linux-2.4.29/arch/mips64/defconfig-atlas linux-mips/arch/mips64/defcon
  # CONFIG_SCSI_SATA_SVW is not set
  # CONFIG_SCSI_ATA_PIIX is not set
  # CONFIG_SCSI_SATA_NV is not set
-+# CONFIG_SCSI_SATA_QSTOR is not set
- # CONFIG_SCSI_SATA_PROMISE is not set
- # CONFIG_SCSI_SATA_SX4 is not set
- # CONFIG_SCSI_SATA_SIL is not set
-@@ -474,7 +471,6 @@
- CONFIG_SERIAL_CONSOLE=y
- # CONFIG_SERIAL_EXTENDED is not set
- # CONFIG_SERIAL_NONSTANDARD is not set
--# CONFIG_MIPS_HYDROGEN3_BUTTONS is not set
- CONFIG_UNIX98_PTYS=y
- CONFIG_UNIX98_PTY_COUNT=256
 diff -Nur linux-2.4.29/arch/mips64/defconfig-decstation linux-mips/arch/mips64/defconfig-decstation
 --- linux-2.4.29/arch/mips64/defconfig-decstation      2005-01-19 15:09:30.000000000 +0100
-+++ linux-mips/arch/mips64/defconfig-decstation        2005-03-26 11:47:17.884716450 +0100
-@@ -28,8 +28,8 @@
- # CONFIG_MIPS_PB1000 is not set
- # CONFIG_MIPS_PB1100 is not set
- # CONFIG_MIPS_PB1500 is not set
--# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_PB1550 is not set
-+# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_XXS1500 is not set
- # CONFIG_MIPS_MTX1 is not set
- # CONFIG_COGENT_CSB250 is not set
++++ linux-mips/arch/mips64/defconfig-decstation        2005-01-09 20:34:01.000000000 +0100
 @@ -224,11 +224,6 @@
  #
  # CONFIG_IPX is not set
@@ -10644,7 +9235,7 @@ diff -Nur linux-2.4.29/arch/mips64/defconfig-decstation linux-mips/arch/mips64/d
  # CONFIG_DECNET is not set
  # CONFIG_BRIDGE is not set
  # CONFIG_X25 is not set
-@@ -307,9 +302,11 @@
+@@ -307,6 +302,7 @@
  # CONFIG_SCSI_MEGARAID is not set
  # CONFIG_SCSI_MEGARAID2 is not set
  # CONFIG_SCSI_SATA is not set
@@ -10652,31 +9243,9 @@ diff -Nur linux-2.4.29/arch/mips64/defconfig-decstation linux-mips/arch/mips64/d
  # CONFIG_SCSI_SATA_SVW is not set
  # CONFIG_SCSI_ATA_PIIX is not set
  # CONFIG_SCSI_SATA_NV is not set
-+# CONFIG_SCSI_SATA_QSTOR is not set
- # CONFIG_SCSI_SATA_PROMISE is not set
- # CONFIG_SCSI_SATA_SX4 is not set
- # CONFIG_SCSI_SATA_SIL is not set
-@@ -477,7 +474,6 @@
- CONFIG_SERIAL_DEC_CONSOLE=y
- # CONFIG_DZ is not set
- CONFIG_ZS=y
--# CONFIG_MIPS_HYDROGEN3_BUTTONS is not set
- CONFIG_UNIX98_PTYS=y
- CONFIG_UNIX98_PTY_COUNT=256
 diff -Nur linux-2.4.29/arch/mips64/defconfig-ip22 linux-mips/arch/mips64/defconfig-ip22
 --- linux-2.4.29/arch/mips64/defconfig-ip22    2005-01-19 15:09:31.000000000 +0100
-+++ linux-mips/arch/mips64/defconfig-ip22      2005-03-26 11:47:17.955704799 +0100
-@@ -30,8 +30,8 @@
- # CONFIG_MIPS_PB1000 is not set
- # CONFIG_MIPS_PB1100 is not set
- # CONFIG_MIPS_PB1500 is not set
--# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_PB1550 is not set
-+# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_XXS1500 is not set
- # CONFIG_MIPS_MTX1 is not set
- # CONFIG_COGENT_CSB250 is not set
++++ linux-mips/arch/mips64/defconfig-ip22      2005-01-09 20:34:01.000000000 +0100
 @@ -235,11 +235,6 @@
  #
  # CONFIG_IPX is not set
@@ -10689,7 +9258,7 @@ diff -Nur linux-2.4.29/arch/mips64/defconfig-ip22 linux-mips/arch/mips64/defconf
  # CONFIG_DECNET is not set
  # CONFIG_BRIDGE is not set
  # CONFIG_X25 is not set
-@@ -319,9 +314,11 @@
+@@ -319,6 +314,7 @@
  # CONFIG_SCSI_MEGARAID is not set
  # CONFIG_SCSI_MEGARAID2 is not set
  # CONFIG_SCSI_SATA is not set
@@ -10697,32 +9266,10 @@ diff -Nur linux-2.4.29/arch/mips64/defconfig-ip22 linux-mips/arch/mips64/defconf
  # CONFIG_SCSI_SATA_SVW is not set
  # CONFIG_SCSI_ATA_PIIX is not set
  # CONFIG_SCSI_SATA_NV is not set
-+# CONFIG_SCSI_SATA_QSTOR is not set
- # CONFIG_SCSI_SATA_PROMISE is not set
- # CONFIG_SCSI_SATA_SX4 is not set
- # CONFIG_SCSI_SATA_SIL is not set
-@@ -488,7 +485,6 @@
- # CONFIG_SERIAL_TXX9_CONSOLE is not set
- # CONFIG_TXX927_SERIAL is not set
- CONFIG_IP22_SERIAL=y
--# CONFIG_MIPS_HYDROGEN3_BUTTONS is not set
- CONFIG_UNIX98_PTYS=y
- CONFIG_UNIX98_PTY_COUNT=256
 diff -Nur linux-2.4.29/arch/mips64/defconfig-ip27 linux-mips/arch/mips64/defconfig-ip27
 --- linux-2.4.29/arch/mips64/defconfig-ip27    2005-01-19 15:09:31.000000000 +0100
-+++ linux-mips/arch/mips64/defconfig-ip27      2005-03-26 11:47:18.038691179 +0100
-@@ -30,8 +30,8 @@
- # CONFIG_MIPS_PB1000 is not set
- # CONFIG_MIPS_PB1100 is not set
- # CONFIG_MIPS_PB1500 is not set
--# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_PB1550 is not set
-+# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_XXS1500 is not set
- # CONFIG_MIPS_MTX1 is not set
- # CONFIG_COGENT_CSB250 is not set
-@@ -470,9 +470,11 @@
++++ linux-mips/arch/mips64/defconfig-ip27      2005-01-20 03:19:22.000000000 +0100
+@@ -470,6 +470,7 @@
  # CONFIG_SCSI_MEGARAID is not set
  # CONFIG_SCSI_MEGARAID2 is not set
  # CONFIG_SCSI_SATA is not set
@@ -10730,31 +9277,9 @@ diff -Nur linux-2.4.29/arch/mips64/defconfig-ip27 linux-mips/arch/mips64/defconf
  # CONFIG_SCSI_SATA_SVW is not set
  # CONFIG_SCSI_ATA_PIIX is not set
  # CONFIG_SCSI_SATA_NV is not set
-+# CONFIG_SCSI_SATA_QSTOR is not set
- # CONFIG_SCSI_SATA_PROMISE is not set
- # CONFIG_SCSI_SATA_SX4 is not set
- # CONFIG_SCSI_SATA_SIL is not set
-@@ -658,7 +660,6 @@
- CONFIG_SERIAL_CONSOLE=y
- # CONFIG_SERIAL_EXTENDED is not set
- # CONFIG_SERIAL_NONSTANDARD is not set
--# CONFIG_MIPS_HYDROGEN3_BUTTONS is not set
- CONFIG_UNIX98_PTYS=y
- CONFIG_UNIX98_PTY_COUNT=256
 diff -Nur linux-2.4.29/arch/mips64/defconfig-jaguar linux-mips/arch/mips64/defconfig-jaguar
 --- linux-2.4.29/arch/mips64/defconfig-jaguar  2005-01-19 15:09:31.000000000 +0100
-+++ linux-mips/arch/mips64/defconfig-jaguar    2005-03-26 11:47:18.091682482 +0100
-@@ -30,8 +30,8 @@
- # CONFIG_MIPS_PB1000 is not set
- # CONFIG_MIPS_PB1100 is not set
- # CONFIG_MIPS_PB1500 is not set
--# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_PB1550 is not set
-+# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_XXS1500 is not set
- # CONFIG_MIPS_MTX1 is not set
- # CONFIG_COGENT_CSB250 is not set
++++ linux-mips/arch/mips64/defconfig-jaguar    2005-01-09 20:34:01.000000000 +0100
 @@ -227,11 +227,6 @@
  #
  # CONFIG_IPX is not set
@@ -10767,27 +9292,9 @@ diff -Nur linux-2.4.29/arch/mips64/defconfig-jaguar linux-mips/arch/mips64/defco
  # CONFIG_DECNET is not set
  # CONFIG_BRIDGE is not set
  # CONFIG_X25 is not set
-@@ -403,7 +398,6 @@
- # CONFIG_SERIAL_TXX9 is not set
- # CONFIG_SERIAL_TXX9_CONSOLE is not set
- # CONFIG_TXX927_SERIAL is not set
--# CONFIG_MIPS_HYDROGEN3_BUTTONS is not set
- CONFIG_UNIX98_PTYS=y
- CONFIG_UNIX98_PTY_COUNT=256
 diff -Nur linux-2.4.29/arch/mips64/defconfig-malta linux-mips/arch/mips64/defconfig-malta
 --- linux-2.4.29/arch/mips64/defconfig-malta   2005-01-19 15:09:31.000000000 +0100
-+++ linux-mips/arch/mips64/defconfig-malta     2005-03-26 11:47:18.150672800 +0100
-@@ -30,8 +30,8 @@
- # CONFIG_MIPS_PB1000 is not set
- # CONFIG_MIPS_PB1100 is not set
- # CONFIG_MIPS_PB1500 is not set
--# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_PB1550 is not set
-+# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_XXS1500 is not set
- # CONFIG_MIPS_MTX1 is not set
- # CONFIG_COGENT_CSB250 is not set
++++ linux-mips/arch/mips64/defconfig-malta     2005-01-09 20:34:01.000000000 +0100
 @@ -235,11 +235,6 @@
  #
  # CONFIG_IPX is not set
@@ -10800,7 +9307,7 @@ diff -Nur linux-2.4.29/arch/mips64/defconfig-malta linux-mips/arch/mips64/defcon
  # CONFIG_DECNET is not set
  # CONFIG_BRIDGE is not set
  # CONFIG_X25 is not set
-@@ -317,9 +312,11 @@
+@@ -317,6 +312,7 @@
  # CONFIG_SCSI_MEGARAID is not set
  # CONFIG_SCSI_MEGARAID2 is not set
  # CONFIG_SCSI_SATA is not set
@@ -10808,31 +9315,9 @@ diff -Nur linux-2.4.29/arch/mips64/defconfig-malta linux-mips/arch/mips64/defcon
  # CONFIG_SCSI_SATA_SVW is not set
  # CONFIG_SCSI_ATA_PIIX is not set
  # CONFIG_SCSI_SATA_NV is not set
-+# CONFIG_SCSI_SATA_QSTOR is not set
- # CONFIG_SCSI_SATA_PROMISE is not set
- # CONFIG_SCSI_SATA_SX4 is not set
- # CONFIG_SCSI_SATA_SIL is not set
-@@ -477,7 +474,6 @@
- CONFIG_SERIAL_CONSOLE=y
- # CONFIG_SERIAL_EXTENDED is not set
- # CONFIG_SERIAL_NONSTANDARD is not set
--# CONFIG_MIPS_HYDROGEN3_BUTTONS is not set
- CONFIG_UNIX98_PTYS=y
- CONFIG_UNIX98_PTY_COUNT=256
 diff -Nur linux-2.4.29/arch/mips64/defconfig-ocelotc linux-mips/arch/mips64/defconfig-ocelotc
 --- linux-2.4.29/arch/mips64/defconfig-ocelotc 2005-01-19 15:09:31.000000000 +0100
-+++ linux-mips/arch/mips64/defconfig-ocelotc   2005-03-26 11:47:18.209663119 +0100
-@@ -30,8 +30,8 @@
- # CONFIG_MIPS_PB1000 is not set
- # CONFIG_MIPS_PB1100 is not set
- # CONFIG_MIPS_PB1500 is not set
--# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_PB1550 is not set
-+# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_XXS1500 is not set
- # CONFIG_MIPS_MTX1 is not set
- # CONFIG_COGENT_CSB250 is not set
++++ linux-mips/arch/mips64/defconfig-ocelotc   2005-01-09 20:34:01.000000000 +0100
 @@ -231,11 +231,6 @@
  #
  # CONFIG_IPX is not set
@@ -10845,27 +9330,9 @@ diff -Nur linux-2.4.29/arch/mips64/defconfig-ocelotc linux-mips/arch/mips64/defc
  # CONFIG_DECNET is not set
  # CONFIG_BRIDGE is not set
  # CONFIG_X25 is not set
-@@ -453,7 +448,6 @@
- # CONFIG_SERIAL_TXX9 is not set
- # CONFIG_SERIAL_TXX9_CONSOLE is not set
- # CONFIG_TXX927_SERIAL is not set
--# CONFIG_MIPS_HYDROGEN3_BUTTONS is not set
- CONFIG_UNIX98_PTYS=y
- CONFIG_UNIX98_PTY_COUNT=256
 diff -Nur linux-2.4.29/arch/mips64/defconfig-sb1250-swarm linux-mips/arch/mips64/defconfig-sb1250-swarm
 --- linux-2.4.29/arch/mips64/defconfig-sb1250-swarm    2005-01-19 15:09:31.000000000 +0100
-+++ linux-mips/arch/mips64/defconfig-sb1250-swarm      2005-03-26 11:47:18.269653273 +0100
-@@ -30,8 +30,8 @@
- # CONFIG_MIPS_PB1000 is not set
- # CONFIG_MIPS_PB1100 is not set
- # CONFIG_MIPS_PB1500 is not set
--# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_PB1550 is not set
-+# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_XXS1500 is not set
- # CONFIG_MIPS_MTX1 is not set
- # CONFIG_COGENT_CSB250 is not set
++++ linux-mips/arch/mips64/defconfig-sb1250-swarm      2005-01-09 20:34:01.000000000 +0100
 @@ -90,6 +90,7 @@
  # CONFIG_SIBYTE_TBPROF is not set
  CONFIG_SIBYTE_GENBUS_IDE=y
@@ -10886,38 +9353,9 @@ diff -Nur linux-2.4.29/arch/mips64/defconfig-sb1250-swarm linux-mips/arch/mips64
  # CONFIG_DECNET is not set
  # CONFIG_BRIDGE is not set
  # CONFIG_X25 is not set
-@@ -432,7 +428,6 @@
- CONFIG_SIBYTE_SB1250_DUART=y
- CONFIG_SIBYTE_SB1250_DUART_CONSOLE=y
- CONFIG_SERIAL_CONSOLE=y
--# CONFIG_MIPS_HYDROGEN3_BUTTONS is not set
- CONFIG_UNIX98_PTYS=y
- CONFIG_UNIX98_PTY_COUNT=256
-diff -Nur linux-2.4.29/arch/mips64/defconfig-sead linux-mips/arch/mips64/defconfig-sead
---- linux-2.4.29/arch/mips64/defconfig-sead    2005-01-19 15:09:31.000000000 +0100
-+++ linux-mips/arch/mips64/defconfig-sead      2005-03-26 11:47:18.311646381 +0100
-@@ -28,8 +28,8 @@
- # CONFIG_MIPS_PB1000 is not set
- # CONFIG_MIPS_PB1100 is not set
- # CONFIG_MIPS_PB1500 is not set
--# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_PB1550 is not set
-+# CONFIG_MIPS_HYDROGEN3 is not set
- # CONFIG_MIPS_XXS1500 is not set
- # CONFIG_MIPS_MTX1 is not set
- # CONFIG_COGENT_CSB250 is not set
-@@ -242,7 +242,6 @@
- CONFIG_SERIAL_CONSOLE=y
- # CONFIG_SERIAL_EXTENDED is not set
- # CONFIG_SERIAL_NONSTANDARD is not set
--# CONFIG_MIPS_HYDROGEN3_BUTTONS is not set
- # CONFIG_UNIX98_PTYS is not set
- #
 diff -Nur linux-2.4.29/arch/mips64/kernel/binfmt_elfn32.c linux-mips/arch/mips64/kernel/binfmt_elfn32.c
 --- linux-2.4.29/arch/mips64/kernel/binfmt_elfn32.c    2003-08-25 13:44:40.000000000 +0200
-+++ linux-mips/arch/mips64/kernel/binfmt_elfn32.c      2005-01-31 12:59:30.000000000 +0100
++++ linux-mips/arch/mips64/kernel/binfmt_elfn32.c      2005-01-26 03:40:47.000000000 +0100
 @@ -116,4 +116,7 @@
  #undef MODULE_DESCRIPTION
  #undef MODULE_AUTHOR
@@ -10928,7 +9366,7 @@ diff -Nur linux-2.4.29/arch/mips64/kernel/binfmt_elfn32.c linux-mips/arch/mips64
  #include "../../../fs/binfmt_elf.c"
 diff -Nur linux-2.4.29/arch/mips64/kernel/binfmt_elfo32.c linux-mips/arch/mips64/kernel/binfmt_elfo32.c
 --- linux-2.4.29/arch/mips64/kernel/binfmt_elfo32.c    2003-08-25 13:44:40.000000000 +0200
-+++ linux-mips/arch/mips64/kernel/binfmt_elfo32.c      2005-01-31 12:59:30.000000000 +0100
++++ linux-mips/arch/mips64/kernel/binfmt_elfo32.c      2005-01-26 03:40:47.000000000 +0100
 @@ -137,4 +137,7 @@
  #undef MODULE_DESCRIPTION
  #undef MODULE_AUTHOR
@@ -11026,7 +9464,7 @@ diff -Nur linux-2.4.29/arch/mips64/kernel/head.S linux-mips/arch/mips64/kernel/h
  
 diff -Nur linux-2.4.29/arch/mips64/kernel/ioctl32.c linux-mips/arch/mips64/kernel/ioctl32.c
 --- linux-2.4.29/arch/mips64/kernel/ioctl32.c  2005-01-19 15:09:31.000000000 +0100
-+++ linux-mips/arch/mips64/kernel/ioctl32.c    2005-01-31 12:59:30.000000000 +0100
++++ linux-mips/arch/mips64/kernel/ioctl32.c    2005-01-26 03:36:17.000000000 +0100
 @@ -2352,7 +2352,7 @@
        IOCTL32_HANDLER(AUTOFS_IOC_SETTIMEOUT32, ioc_settimeout),
        IOCTL32_DEFAULT(AUTOFS_IOC_EXPIRE),
@@ -11036,151 +9474,10 @@ diff -Nur linux-2.4.29/arch/mips64/kernel/ioctl32.c linux-mips/arch/mips64/kerne
        IOCTL32_DEFAULT(AUTOFS_IOC_ASKREGHOST),
        IOCTL32_DEFAULT(AUTOFS_IOC_TOGGLEREGHOST),
        IOCTL32_DEFAULT(AUTOFS_IOC_ASKUMOUNT),
-diff -Nur linux-2.4.29/arch/mips64/kernel/linux32.c linux-mips/arch/mips64/kernel/linux32.c
---- linux-2.4.29/arch/mips64/kernel/linux32.c  2005-01-19 15:09:32.000000000 +0100
-+++ linux-mips/arch/mips64/kernel/linux32.c    2005-03-26 11:47:18.669587634 +0100
-@@ -1088,11 +1088,9 @@
-               i--;
-       }
--      inode = file->f_dentry->d_inode;
-       /* VERIFY_WRITE actually means a read, as we write to user space */
--      retval = locks_verify_area((type == VERIFY_WRITE
--                                  ? FLOCK_VERIFY_READ : FLOCK_VERIFY_WRITE),
--                                 inode, file, file->f_pos, tot_len);
-+      retval = rw_verify_area((type == VERIFY_WRITE ? READ : WRITE),
-+                                 file, &file->f_pos, tot_len);
-       if (retval) {
-               if (iov != iovstack)
-                       kfree(iov);
-@@ -1189,72 +1187,19 @@
-    lseek back to original location.  They fail just like lseek does on
-    non-seekable files.  */
--asmlinkage ssize_t sys32_pread(unsigned int fd, char * buf,
--                             size_t count, u32 unused, u64 a4, u64 a5)
-+asmlinkage ssize_t sys32_pread(unsigned int fd, char *buf,
-+                                 size_t count, u32 unused, u64 a4, u64 a5)
- {
--      ssize_t ret;
--      struct file * file;
--      ssize_t (*read)(struct file *, char *, size_t, loff_t *);
--      loff_t pos;
--
--      ret = -EBADF;
--      file = fget(fd);
--      if (!file)
--              goto bad_file;
--      if (!(file->f_mode & FMODE_READ))
--              goto out;
--      pos = merge_64(a4, a5);
--      ret = locks_verify_area(FLOCK_VERIFY_READ, file->f_dentry->d_inode,
--                              file, pos, count);
--      if (ret)
--              goto out;
--      ret = -EINVAL;
--      if (!file->f_op || !(read = file->f_op->read))
--              goto out;
--      if (pos < 0)
--              goto out;
--      ret = read(file, buf, count, &pos);
--      if (ret > 0)
--              dnotify_parent(file->f_dentry, DN_ACCESS);
--out:
--      fput(file);
--bad_file:
--      return ret;
-+      return sys_pread(fd, buf, count, merge_64(a4, a5));
- }
- asmlinkage ssize_t sys32_pwrite(unsigned int fd, const char * buf,
-                               size_t count, u32 unused, u64 a4, u64 a5)
- {
--      ssize_t ret;
--      struct file * file;
--      ssize_t (*write)(struct file *, const char *, size_t, loff_t *);
--      loff_t pos;
-+      return sys_pwrite(fd, buf, count, merge_64(a4, a5));
-+}
--      ret = -EBADF;
--      file = fget(fd);
--      if (!file)
--              goto bad_file;
--      if (!(file->f_mode & FMODE_WRITE))
--              goto out;
--      pos = merge_64(a4, a5);
--      ret = locks_verify_area(FLOCK_VERIFY_WRITE, file->f_dentry->d_inode,
--                              file, pos, count);
--      if (ret)
--              goto out;
--      ret = -EINVAL;
--      if (!file->f_op || !(write = file->f_op->write))
--              goto out;
--      if (pos < 0)
--              goto out;
--      ret = write(file, buf, count, &pos);
--      if (ret > 0)
--              dnotify_parent(file->f_dentry, DN_MODIFY);
--out:
--      fput(file);
--bad_file:
--      return ret;
--}
- /*
-  * Ooo, nasty.  We need here to frob 32-bit unsigned longs to
-  * 64-bit unsigned longs.
-@@ -2792,7 +2737,8 @@
-  *            IPV6_RTHDR      ipv6 routing exthdr     32-bit clean
-  *            IPV6_AUTHHDR    ipv6 auth exthdr        32-bit clean
-  */
--static void cmsg32_recvmsg_fixup(struct msghdr *kmsg, unsigned long orig_cmsg_uptr)
-+static void cmsg32_recvmsg_fixup(struct msghdr *kmsg,
-+              unsigned long orig_cmsg_uptr, __kernel_size_t orig_cmsg_len)
- {
-       unsigned char *workbuf, *wp;
-       unsigned long bufsz, space_avail;
-@@ -2823,6 +2769,9 @@
-               __get_user(kcmsg32->cmsg_type, &ucmsg->cmsg_type);
-               clen64 = kcmsg32->cmsg_len;
-+              if ((clen64 < CMSG_ALIGN(sizeof(*ucmsg))) ||
-+                              (clen64 > (orig_cmsg_len + wp - workbuf)))
-+                      break;
-               copy_from_user(CMSG32_DATA(kcmsg32), CMSG_DATA(ucmsg),
-                              clen64 - CMSG_ALIGN(sizeof(*ucmsg)));
-               clen32 = ((clen64 - CMSG_ALIGN(sizeof(*ucmsg))) +
-@@ -2908,6 +2857,7 @@
-       struct sockaddr *uaddr;
-       int *uaddr_len;
-       unsigned long cmsg_ptr;
-+      __kernel_size_t cmsg_len;
-       int err, total_len, len = 0;
-       if(msghdr_from_user32_to_kern(&kern_msg, user_msg))
-@@ -2923,6 +2873,7 @@
-       total_len = err;
-       cmsg_ptr = (unsigned long) kern_msg.msg_control;
-+      cmsg_len = kern_msg.msg_controllen;
-       kern_msg.msg_flags = 0;
-       sock = sockfd_lookup(fd, &err);
-@@ -2948,7 +2899,8 @@
-                                * to fix it up before we tack on more stuff.
-                                */
-                               if((unsigned long) kern_msg.msg_control != cmsg_ptr)
--                                      cmsg32_recvmsg_fixup(&kern_msg, cmsg_ptr);
-+                                      cmsg32_recvmsg_fixup(&kern_msg,
-+                                                      cmsg_ptr, cmsg_len);
-                               /* Wheee... */
-                               if(sock->passcred)
-diff -Nur linux-2.4.29/arch/mips64/kernel/scall_64.S linux-mips/arch/mips64/kernel/scall_64.S
---- linux-2.4.29/arch/mips64/kernel/scall_64.S 2005-01-19 15:09:32.000000000 +0100
-+++ linux-mips/arch/mips64/kernel/scall_64.S   2005-03-26 11:47:18.698582876 +0100
-@@ -102,15 +102,14 @@
+diff -Nur linux-2.4.29/arch/mips64/kernel/scall_64.S linux-mips/arch/mips64/kernel/scall_64.S
+--- linux-2.4.29/arch/mips64/kernel/scall_64.S 2005-01-19 15:09:32.000000000 +0100
++++ linux-mips/arch/mips64/kernel/scall_64.S   2005-02-07 22:21:54.000000000 +0100
+@@ -102,15 +102,14 @@
  
  trace_a_syscall:
        SAVE_STATIC
@@ -11200,7 +9497,7 @@ diff -Nur linux-2.4.29/arch/mips64/kernel/scall_64.S linux-mips/arch/mips64/kern
        sltu    t0, t0, v0
 diff -Nur linux-2.4.29/arch/mips64/kernel/scall_n32.S linux-mips/arch/mips64/kernel/scall_n32.S
 --- linux-2.4.29/arch/mips64/kernel/scall_n32.S        2005-01-19 15:09:32.000000000 +0100
-+++ linux-mips/arch/mips64/kernel/scall_n32.S  2005-03-26 11:47:18.734576968 +0100
++++ linux-mips/arch/mips64/kernel/scall_n32.S  2005-02-07 22:21:54.000000000 +0100
 @@ -106,15 +106,14 @@
  
  trace_a_syscall:
@@ -11221,7 +9518,7 @@ diff -Nur linux-2.4.29/arch/mips64/kernel/scall_n32.S linux-mips/arch/mips64/ker
        sltu    t0, t0, v0
 diff -Nur linux-2.4.29/arch/mips64/kernel/scall_o32.S linux-mips/arch/mips64/kernel/scall_o32.S
 --- linux-2.4.29/arch/mips64/kernel/scall_o32.S        2005-01-19 15:09:32.000000000 +0100
-+++ linux-mips/arch/mips64/kernel/scall_o32.S  2005-03-26 11:47:18.788568107 +0100
++++ linux-mips/arch/mips64/kernel/scall_o32.S  2005-02-14 04:52:57.000000000 +0100
 @@ -118,9 +118,8 @@
        sd      a6, PT_R10(sp)
        sd      a7, PT_R11(sp)
@@ -11271,7 +9568,7 @@ diff -Nur linux-2.4.29/arch/mips64/kernel/setup.c linux-mips/arch/mips64/kernel/
  
 diff -Nur linux-2.4.29/arch/mips64/kernel/signal_n32.c linux-mips/arch/mips64/kernel/signal_n32.c
 --- linux-2.4.29/arch/mips64/kernel/signal_n32.c       2005-01-19 15:09:33.000000000 +0100
-+++ linux-mips/arch/mips64/kernel/signal_n32.c 2005-03-26 11:47:18.811564333 +0100
++++ linux-mips/arch/mips64/kernel/signal_n32.c 2005-02-07 22:10:53.000000000 +0100
 @@ -68,7 +68,7 @@
  };
  
@@ -11390,7 +9687,7 @@ diff -Nur linux-2.4.29/arch/mips64/mm/cerr-sb1.c linux-mips/arch/mips64/mm/cerr-
                        prom_printf("[Bank %d Set 0x%02x]  LRU > %d %d %d %d > MRU\n",
 diff -Nur linux-2.4.29/arch/mips64/mm/c-r4k.c linux-mips/arch/mips64/mm/c-r4k.c
 --- linux-2.4.29/arch/mips64/mm/c-r4k.c        2005-01-19 15:09:33.000000000 +0100
-+++ linux-mips/arch/mips64/mm/c-r4k.c  2005-03-26 11:47:18.942542836 +0100
++++ linux-mips/arch/mips64/mm/c-r4k.c  2005-02-06 22:55:42.000000000 +0100
 @@ -867,9 +867,16 @@
         * normally they'd suffer from aliases but magic in the hardware deals
         * with that for us so we don't need to take care ourselves.
@@ -11834,1598 +10131,6 @@ diff -Nur linux-2.4.29/arch/mips64/mm/tlb-r4k.c linux-mips/arch/mips64/mm/tlb-r4
        probe_tlb(config);
        write_c0_pagemask(PM_DEFAULT_MASK);
        write_c0_wired(0);
-diff -Nur linux-2.4.29/arch/parisc/kernel/sys_parisc32.c linux-mips/arch/parisc/kernel/sys_parisc32.c
---- linux-2.4.29/arch/parisc/kernel/sys_parisc32.c     2005-01-19 15:09:35.000000000 +0100
-+++ linux-mips/arch/parisc/kernel/sys_parisc32.c       2005-03-26 11:47:18.967538734 +0100
-@@ -1671,11 +1671,9 @@
-               i--;
-       }
--      inode = file->f_dentry->d_inode;
-       /* VERIFY_WRITE actually means a read, as we write to user space */
--      retval = locks_verify_area((type == VERIFY_WRITE
--                                  ? FLOCK_VERIFY_READ : FLOCK_VERIFY_WRITE),
--                                 inode, file, file->f_pos, tot_len);
-+      retval = rw_verify_area((type == VERIFY_WRITE ? READ : WRITE),
-+                                 file, &file->f_pos, tot_len);
-       if (retval) {
-               if (iov != iovstack)
-                       kfree(iov);
-@@ -2108,7 +2106,8 @@
-  *            IPV6_RTHDR      ipv6 routing exthdr     32-bit clean
-  *            IPV6_AUTHHDR    ipv6 auth exthdr        32-bit clean
-  */
--static void cmsg32_recvmsg_fixup(struct msghdr *kmsg, unsigned long orig_cmsg_uptr)
-+static void cmsg32_recvmsg_fixup(struct msghdr *kmsg,
-+              unsigned long orig_cmsg_uptr, __kernel_size_t orig_cmsg_len)
- {
-       unsigned char *workbuf, *wp;
-       unsigned long bufsz, space_avail;
-@@ -2139,6 +2138,9 @@
-               __get_user(kcmsg32->cmsg_type, &ucmsg->cmsg_type);
-               clen64 = kcmsg32->cmsg_len;
-+              if ((clen64 < CMSG_ALIGN(sizeof(*ucmsg))) ||
-+                              (clen64 > (orig_cmsg_len + wp - workbuf)))
-+                      break;
-               copy_from_user(CMSG32_DATA(kcmsg32), CMSG_DATA(ucmsg),
-                              clen64 - CMSG_ALIGN(sizeof(*ucmsg)));
-               clen32 = ((clen64 - CMSG_ALIGN(sizeof(*ucmsg))) +
-@@ -2224,6 +2226,7 @@
-       struct sockaddr *uaddr;
-       int *uaddr_len;
-       unsigned long cmsg_ptr;
-+      __kernel_size_t cmsg_len;
-       int err, total_len, len = 0;
-       if(msghdr_from_user32_to_kern(&kern_msg, user_msg))
-@@ -2239,6 +2242,7 @@
-       total_len = err;
-       cmsg_ptr = (unsigned long) kern_msg.msg_control;
-+      cmsg_len = kern_msg.msg_controllen;
-       kern_msg.msg_flags = 0;
-       sock = sockfd_lookup(fd, &err);
-@@ -2264,7 +2268,8 @@
-                                * to fix it up before we tack on more stuff.
-                                */
-                               if((unsigned long) kern_msg.msg_control != cmsg_ptr)
--                                      cmsg32_recvmsg_fixup(&kern_msg, cmsg_ptr);
-+                                      cmsg32_recvmsg_fixup(&kern_msg,
-+                                                      cmsg_ptr, cmsg_len);
-                               /* Wheee... */
-                               if(sock->passcred)
-diff -Nur linux-2.4.29/arch/ppc/kernel/cputable.c linux-mips/arch/ppc/kernel/cputable.c
---- linux-2.4.29/arch/ppc/kernel/cputable.c    2004-11-17 12:54:21.000000000 +0100
-+++ linux-mips/arch/ppc/kernel/cputable.c      2005-03-26 11:47:18.990534959 +0100
-@@ -480,8 +480,8 @@
-         32, 32,
-         0, /*__setup_cpu_440 */
-     },
--    { /* 440GX Rev. B1 (2.1) */
--        0xf0000fff, 0x50000852, "440GX Rev. B1 (2.1)",
-+    { /* 440GX Rev. C */
-+        0xf0000fff, 0x50000892, "440GX Rev. C",
-         CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB,
-         PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU,
-         32, 32,
-diff -Nur linux-2.4.29/arch/ppc/kernel/head_8xx.S linux-mips/arch/ppc/kernel/head_8xx.S
---- linux-2.4.29/arch/ppc/kernel/head_8xx.S    2004-02-18 14:36:30.000000000 +0100
-+++ linux-mips/arch/ppc/kernel/head_8xx.S      2005-03-26 11:47:18.992534631 +0100
-@@ -338,13 +338,13 @@
- 3:
-       lwz     r21, 0(r20)     /* Get the level 1 entry */
-       rlwinm. r20, r21,0,0,19 /* Extract page descriptor page address */
--      beq     2f              /* If zero, don't try to find a pte */
-       /* We have a pte table, so load the MI_TWC with the attributes
-        * for this "segment."
-        */
-       tophys(r21,r21)
-       ori     r21,r21,1               /* Set valid bit */
-+      beq-    2f                      /* If zero, don't try to find a pte */
- #ifdef CONFIG_8xx_CPU6
-       li      r3, 0x2b80
-       stw     r3, 12(r0)
-@@ -369,7 +369,7 @@
-        * set.  All other Linux PTE bits control the behavior
-        * of the MMU.
-        */
--      li      r21, 0x00f0
-+2:    li      r21, 0x00f0
-       rlwimi  r20, r21, 0, 24, 28     /* Set 24-27, clear 28 */
- #ifdef CONFIG_8xx_CPU6
-@@ -388,15 +388,6 @@
- #endif
-       rfi
--2:    mfspr   r20, M_TW       /* Restore registers */
--      lwz     r21, 0(r0)
--      mtcr    r21
--      lwz     r21, 4(r0)
--#ifdef CONFIG_8xx_CPU6
--      lwz     r3, 8(r0)
--#endif
--      b       InstructionAccess
--
-       . = 0x1200
- DataStoreTLBMiss:
- #ifdef CONFIG_8xx_CPU6
-@@ -422,12 +413,12 @@
- 3:
-       lwz     r21, 0(r20)     /* Get the level 1 entry */
-       rlwinm. r20, r21,0,0,19 /* Extract page descriptor page address */
--      beq     2f              /* If zero, don't try to find a pte */
-       /* We have a pte table, so load fetch the pte from the table.
-        */
-       tophys(r21, r21)
-       ori     r21, r21, 1     /* Set valid bit in physical L2 page */
-+      beq-    2f              /* If zero, don't try to find a pte */
- #ifdef CONFIG_8xx_CPU6
-       li      r3, 0x3b80
-       stw     r3, 12(r0)
-@@ -461,7 +452,7 @@
-        * set.  All other Linux PTE bits control the behavior
-        * of the MMU.
-        */
--      li      r21, 0x00f0
-+2:    li      r21, 0x00f0
-       rlwimi  r20, r21, 0, 24, 28     /* Set 24-27, clear 28 */
- #ifdef CONFIG_8xx_CPU6
-@@ -480,24 +471,6 @@
- #endif
-       rfi
--2:
--      /* Copy 20 msb from MD_EPN to DAR since the dcxx instructions fail
--       * to update DAR when they cause a DTLB miss.
--       */
--      mfspr   r21, MD_EPN
--      mfspr   r20, DAR
--      rlwimi  r20, r21, 0, 0, 19
--      mtspr   DAR, r20
--
--      mfspr   r20, M_TW       /* Restore registers */
--      lwz     r21, 0(r0)
--      mtcr    r21
--      lwz     r21, 4(r0)
--#ifdef CONFIG_8xx_CPU6
--      lwz     r3, 8(r0)
--#endif
--      b       DataAccess
--
- /* This is an instruction TLB error on the MPC8xx.  This could be due
-  * to many reasons, such as executing guarded memory or illegal instruction
-  * addresses.  There is nothing to do but handle a big time error fault.
-diff -Nur linux-2.4.29/arch/ppc64/kernel/sys_ppc32.c linux-mips/arch/ppc64/kernel/sys_ppc32.c
---- linux-2.4.29/arch/ppc64/kernel/sys_ppc32.c 2005-01-19 15:09:37.000000000 +0100
-+++ linux-mips/arch/ppc64/kernel/sys_ppc32.c   2005-03-26 11:47:19.016530693 +0100
-@@ -183,11 +183,9 @@
-               i--;
-       }
--      inode = file->f_dentry->d_inode;
-       /* VERIFY_WRITE actually means a read, as we write to user space */
--      retval = locks_verify_area((type == VERIFY_WRITE
--                                  ? FLOCK_VERIFY_READ : FLOCK_VERIFY_WRITE),
--                                 inode, file, file->f_pos, tot_len);
-+      retval = rw_verify_area((type == VERIFY_WRITE ? READ : WRITE),
-+                                 file, &file->f_pos, tot_len);
-       if (retval) {
-               if (iov != iovstack)
-                       kfree(iov);
-@@ -3666,7 +3664,8 @@
-  *            IPV6_RTHDR      ipv6 routing exthdr     32-bit clean
-  *            IPV6_AUTHHDR    ipv6 auth exthdr        32-bit clean
-  */
--static void cmsg32_recvmsg_fixup(struct msghdr *kmsg, unsigned long orig_cmsg_uptr)
-+static void cmsg32_recvmsg_fixup(struct msghdr *kmsg,
-+              unsigned long orig_cmsg_uptr, __kernel_size_t orig_cmsg_len)
- {
-       unsigned char *workbuf, *wp;
-       unsigned long bufsz, space_avail;
-@@ -3697,6 +3696,9 @@
-               __get_user(kcmsg32->cmsg_type, &ucmsg->cmsg_type);
-               clen64 = kcmsg32->cmsg_len;
-+              if ((clen64 < CMSG_ALIGN(sizeof(*ucmsg))) ||
-+                              (clen64 > (orig_cmsg_len + wp - workbuf)))
-+                      break;
-               copy_from_user(CMSG32_DATA(kcmsg32), CMSG_DATA(ucmsg),
-                              clen64 - CMSG_ALIGN(sizeof(*ucmsg)));
-               clen32 = ((clen64 - CMSG_ALIGN(sizeof(*ucmsg))) +
-@@ -3753,6 +3755,7 @@
-       struct sockaddr *uaddr;
-       int *uaddr_len;
-       unsigned long cmsg_ptr;
-+      __kernel_size_t cmsg_len;
-       int err, total_len, len = 0;
-       
-       PPCDBG(PPCDBG_SYS32, "sys32_recvmsg - entered - fd=%x, user_msg@=%p, user_flags=%x \n", fd, user_msg, user_flags);
-@@ -3770,6 +3773,7 @@
-       total_len = err;
-       cmsg_ptr = (unsigned long) kern_msg.msg_control;
-+      cmsg_len = kern_msg.msg_controllen;
-       kern_msg.msg_flags = 0;
-       sock = sockfd_lookup(fd, &err);
-@@ -3795,7 +3799,8 @@
-                                * to fix it up before we tack on more stuff.
-                                */
-                               if((unsigned long) kern_msg.msg_control != cmsg_ptr)
--                                      cmsg32_recvmsg_fixup(&kern_msg, cmsg_ptr);
-+                                      cmsg32_recvmsg_fixup(&kern_msg,
-+                                                      cmsg_ptr, cmsg_len);
-                               /* Wheee... */
-                               if(sock->passcred)
-diff -Nur linux-2.4.29/arch/s390x/kernel/linux32.c linux-mips/arch/s390x/kernel/linux32.c
---- linux-2.4.29/arch/s390x/kernel/linux32.c   2005-01-19 15:09:38.000000000 +0100
-+++ linux-mips/arch/s390x/kernel/linux32.c     2005-03-26 11:47:19.529446512 +0100
-@@ -1108,7 +1108,6 @@
-       unsigned long tot_len;
-       struct iovec iovstack[UIO_FASTIOV];
-       struct iovec *iov=iovstack, *ivp;
--      struct inode *inode;
-       long retval, i;
-       io_fn_t fn;
-       iov_fn_t fnv;
-@@ -1145,11 +1144,9 @@
-               i--;
-       }
--      inode = file->f_dentry->d_inode;
-       /* VERIFY_WRITE actually means a read, as we write to user space */
--      retval = locks_verify_area((type == VERIFY_WRITE
--                                  ? FLOCK_VERIFY_READ : FLOCK_VERIFY_WRITE),
--                                 inode, file, file->f_pos, tot_len);
-+      retval = rw_verify_area((type == VERIFY_WRITE ? READ : WRITE),
-+                                 file, &file->f_pos, tot_len);
-       if (retval)
-               goto out;
-@@ -2600,7 +2597,8 @@
-  *            IPV6_RTHDR      ipv6 routing exthdr     32-bit clean
-  *            IPV6_AUTHHDR    ipv6 auth exthdr        32-bit clean
-  */
--static void cmsg32_recvmsg_fixup(struct msghdr *kmsg, unsigned long orig_cmsg_uptr)
-+static void cmsg32_recvmsg_fixup(struct msghdr *kmsg,
-+              unsigned long orig_cmsg_uptr, __kernel_size_t orig_cmsg_len)
- {
-       unsigned char *workbuf, *wp;
-       unsigned long bufsz, space_avail;
-@@ -2631,6 +2629,9 @@
-               __get_user(kcmsg32->cmsg_type, &ucmsg->cmsg_type);
-               clen64 = kcmsg32->cmsg_len;
-+              if ((clen64 < CMSG_ALIGN(sizeof(*ucmsg))) ||
-+                              (clen64 > (orig_cmsg_len + wp - workbuf)))
-+                      break;
-               copy_from_user(CMSG32_DATA(kcmsg32), CMSG_DATA(ucmsg),
-                              clen64 - CMSG_ALIGN(sizeof(*ucmsg)));
-               clen32 = ((clen64 - CMSG_ALIGN(sizeof(*ucmsg))) +
-@@ -2890,7 +2891,8 @@
- static __inline__ void
- scm_recv32(struct socket *sock, struct msghdr *msg,
--              struct scm_cookie *scm, int flags, unsigned long cmsg_ptr)
-+              struct scm_cookie *scm, int flags, unsigned long cmsg_ptr,
-+              __kernel_size_t cmsg_len)
- {
-       if(!msg->msg_control)
-       {
-@@ -2905,7 +2907,7 @@
-        * to fix it up before we tack on more stuff.
-        */
-       if((unsigned long) msg->msg_control != cmsg_ptr)
--              cmsg32_recvmsg_fixup(msg, cmsg_ptr);
-+              cmsg32_recvmsg_fixup(msg, cmsg_ptr, cmsg_len);
-       /* Wheee... */
-       if(sock->passcred)
-               put_cmsg32(msg,
-@@ -2919,14 +2921,14 @@
- static int  
- sock_recvmsg32(struct socket *sock, struct msghdr *msg, int size, int flags,
--               unsigned long cmsg_ptr)
-+               unsigned long cmsg_ptr, __kernel_size_t cmsg_len)
- {
-       struct scm_cookie scm;
-       memset(&scm, 0, sizeof(scm));
-       size = sock->ops->recvmsg(sock, msg, size, flags, &scm);
-       if (size >= 0)
--              scm_recv32(sock, msg, &scm, flags, cmsg_ptr);
-+              scm_recv32(sock, msg, &scm, flags, cmsg_ptr, cmsg_len);
-       return size;
- }
-@@ -2943,6 +2945,7 @@
-       struct iovec *iov=iovstack;
-       struct msghdr msg_sys;
-       unsigned long cmsg_ptr;
-+      __kernel_size_t cmsg_len;
-       int err, iov_size, total_len, len;
-       /* kernel mode address */
-@@ -2986,11 +2989,12 @@
-       total_len=err;
-       cmsg_ptr = (unsigned long)msg_sys.msg_control;
-+      cmsg_len = msg_sys.msg_controllen;
-       msg_sys.msg_flags = 0;
-       
-       if (sock->file->f_flags & O_NONBLOCK)
-               flags |= MSG_DONTWAIT;
--      err = sock_recvmsg32(sock, &msg_sys, total_len, flags, cmsg_ptr);
-+      err = sock_recvmsg32(sock, &msg_sys, total_len, flags, cmsg_ptr, cmsg_len);
-       if (err < 0)
-               goto out_freeiov;
-       len = err;
-diff -Nur linux-2.4.29/arch/sparc/kernel/muldiv.c linux-mips/arch/sparc/kernel/muldiv.c
---- linux-2.4.29/arch/sparc/kernel/muldiv.c    1998-01-13 00:15:43.000000000 +0100
-+++ linux-mips/arch/sparc/kernel/muldiv.c      2005-03-26 11:47:19.631429774 +0100
-@@ -4,6 +4,9 @@
-  *
-  * Copyright (C) 1996 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
-  * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu)
-+ *
-+ * 2004-12-25 Krzysztof Helt (krzysztof.h1@wp.pl) 
-+ *            - fixed registers constrains in inline assembly declarations
-  */
- #include <linux/kernel.h>
-@@ -125,7 +128,7 @@
-                       "mov    %%o0, %0\n\t"
-                       "mov    %%o1, %1\n\t"
-                       : "=r" (rs1), "=r" (rs2)
--                      :
-+                      : "0" (rs1), "1" (rs2)
-                       : "o0", "o1", "o2", "o3", "o4", "o5", "o7", "cc");
- #ifdef DEBUG_MULDIV
-               printk ("0x%x%08x\n", rs2, rs1);
-@@ -145,7 +148,7 @@
-                       "mov    %%o0, %0\n\t"
-                       "mov    %%o1, %1\n\t"
-                       : "=r" (rs1), "=r" (rs2)
--                      :
-+                      : "0" (rs1), "1" (rs2)
-                       : "o0", "o1", "o2", "o3", "o4", "o5", "o7", "cc");
- #ifdef DEBUG_MULDIV
-               printk ("0x%x%08x\n", rs2, rs1);
-@@ -174,7 +177,7 @@
-                       "mov    %%o1, %0\n\t"
-                       "mov    %%o0, %1\n\t"
-                       : "=r" (rs1), "=r" (rs2)
--                      : "r" (regs->y)
-+                      : "r" (regs->y), "0" (rs1), "1" (rs2)
-                       : "o0", "o1", "o2", "o3", "o4", "o5", "o7",
-                         "g1", "g2", "g3", "cc");
- #ifdef DEBUG_MULDIV
-@@ -203,7 +206,7 @@
-                       "mov    %%o1, %0\n\t"
-                       "mov    %%o0, %1\n\t"
-                       : "=r" (rs1), "=r" (rs2)
--                      : "r" (regs->y)
-+                      : "r" (regs->y), "0" (rs1), "1" (rs2)
-                       : "o0", "o1", "o2", "o3", "o4", "o5", "o7",
-                         "g1", "g2", "g3", "cc");
- #ifdef DEBUG_MULDIV
-diff -Nur linux-2.4.29/arch/sparc/kernel/process.c linux-mips/arch/sparc/kernel/process.c
---- linux-2.4.29/arch/sparc/kernel/process.c   2004-08-08 01:26:04.000000000 +0200
-+++ linux-mips/arch/sparc/kernel/process.c     2005-03-26 11:47:19.632429610 +0100
-@@ -512,6 +512,11 @@
-               }
-       }
-+#ifdef CONFIG_SMP
-+      /* FPU must be disabled on SMP. */
-+      childregs->psr &= ~PSR_EF;
-+#endif
-+
-       /* Set the return value for the child. */
-       childregs->u_regs[UREG_I0] = current->pid;
-       childregs->u_regs[UREG_I1] = 1;
-diff -Nur linux-2.4.29/arch/sparc64/kernel/ioctl32.c linux-mips/arch/sparc64/kernel/ioctl32.c
---- linux-2.4.29/arch/sparc64/kernel/ioctl32.c 2005-01-19 15:09:39.000000000 +0100
-+++ linux-mips/arch/sparc64/kernel/ioctl32.c   2005-03-26 11:47:19.641428133 +0100
-@@ -562,6 +562,8 @@
-       if (!(current->thread.flags & SPARC_FLAG_32BIT))
-               usp += STACK_BIAS;
-+      else
-+              usp &= 0xffffffffUL;
-       return (void *) (usp - len);
- }
-@@ -696,6 +698,7 @@
-       set_fs (old_fs);
-       if (!err) {
-               switch (cmd) {
-+              case TUNSETIFF:
-               case SIOCGIFFLAGS:
-               case SIOCGIFMETRIC:
-               case SIOCGIFMTU:
-diff -Nur linux-2.4.29/arch/sparc64/kernel/pci_schizo.c linux-mips/arch/sparc64/kernel/pci_schizo.c
---- linux-2.4.29/arch/sparc64/kernel/pci_schizo.c      2004-11-17 12:54:21.000000000 +0100
-+++ linux-mips/arch/sparc64/kernel/pci_schizo.c        2005-03-26 11:47:19.646427312 +0100
-@@ -388,9 +388,9 @@
-       return ret;
- }
--static unsigned int __init schizo_irq_build(struct pci_pbm_info *pbm,
--                                          struct pci_dev *pdev,
--                                          unsigned int ino)
-+static unsigned int schizo_irq_build(struct pci_pbm_info *pbm,
-+                                   struct pci_dev *pdev,
-+                                   unsigned int ino)
- {
-       struct ino_bucket *bucket;
-       unsigned long imap, iclr;
-@@ -444,19 +444,57 @@
- static unsigned long stc_tag_buf[16];
- static unsigned long stc_line_buf[16];
--/* These offsets look weird because I keep in pbm->controller_regs
-- * the second PROM register property minus 0x10000 which is the
-- * base of the Safari and UPA64S registers of SCHIZO.
-- */
--#define SCHIZO_PBM_A_REGS_OFF (0x600000UL - 0x400000UL)
--#define SCHIZO_PBM_B_REGS_OFF (0x700000UL - 0x400000UL)
-+#define SCHIZO_UE_INO         0x30 /* Uncorrectable ECC error */
-+#define SCHIZO_CE_INO         0x31 /* Correctable ECC error */
-+#define SCHIZO_PCIERR_A_INO   0x32 /* PBM A PCI bus error */
-+#define SCHIZO_PCIERR_B_INO   0x33 /* PBM B PCI bus error */
-+#define SCHIZO_SERR_INO               0x34 /* Safari interface error */
-+
-+struct pci_pbm_info *pbm_for_ino(struct pci_controller_info *p, u32 ino)
-+{
-+      ino &= IMAP_INO;
-+      if (p->pbm_A.ino_bitmap & (1UL << ino))
-+              return &p->pbm_A;
-+      if (p->pbm_B.ino_bitmap & (1UL << ino))
-+              return &p->pbm_B;
-+
-+      printk("PCI%d: No ino_bitmap entry for ino[%x], bitmaps "
-+             "PBM_A[%016lx] PBM_B[%016lx]",
-+             p->index, ino,
-+             p->pbm_A.ino_bitmap,
-+             p->pbm_B.ino_bitmap);
-+      printk("PCI%d: Using PBM_A, report this problem immediately.\n",
-+             p->index);
-+
-+      return &p->pbm_A;
-+}
--static void schizo_clear_other_err_intr(int irq)
-+static void schizo_clear_other_err_intr(struct pci_controller_info *p, int irq)
- {
--      struct ino_bucket *bucket = __bucket(irq);
--      unsigned long iclr = bucket->iclr;
-+      struct pci_pbm_info *pbm;
-+      struct ino_bucket *bucket;
-+      unsigned long iclr;
-+
-+      /* Do not clear the interrupt for the other PCI bus.
-+       *
-+       * This "ACK both PBM IRQs" only needs to be performed
-+       * for chip-wide error interrupts.
-+       */
-+      if ((irq & IMAP_INO) == SCHIZO_PCIERR_A_INO ||
-+          (irq & IMAP_INO) == SCHIZO_PCIERR_B_INO)
-+              return;
-+
-+      pbm = pbm_for_ino(p, irq);
-+      if (pbm == &p->pbm_A)
-+              pbm = &p->pbm_B;
-+      else
-+              pbm = &p->pbm_A;
-+
-+      irq = schizo_irq_build(pbm, NULL,
-+                             (pbm->portid << 6) | (irq & IMAP_INO));
-+      bucket = __bucket(irq);
-+      iclr = bucket->iclr;
--      iclr += (SCHIZO_PBM_B_REGS_OFF - SCHIZO_PBM_A_REGS_OFF);
-       upa_writel(ICLR_IDLE, iclr);
- }
-@@ -790,7 +828,7 @@
-       /* Interrogate IOMMU for error status. */
-       schizo_check_iommu_error(p, UE_ERR);
--      schizo_clear_other_err_intr(irq);
-+      schizo_clear_other_err_intr(p, irq);
- }
- #define SCHIZO_CE_AFSR        0x10040UL
-@@ -879,7 +917,7 @@
-               printk("(none)");
-       printk("]\n");
--      schizo_clear_other_err_intr(irq);
-+      schizo_clear_other_err_intr(p, irq);
- }
- #define SCHIZO_PCI_AFSR       0x2010UL
-@@ -914,9 +952,9 @@
- #define SCHIZO_PCICTRL_SBH_ERR        (1UL << 35UL) /* Safari */
- #define SCHIZO_PCICTRL_SERR   (1UL << 34UL) /* Safari/Tomatillo */
- #define SCHIZO_PCICTRL_PCISPD (1UL << 33UL) /* Safari */
--#define SCHIZO_PCICTRL_MRM_PREF       (1UL << 28UL) /* Tomatillo */
--#define SCHIZO_PCICTRL_RDO_PREF       (1UL << 27UL) /* Tomatillo */
--#define SCHIZO_PCICTRL_RDL_PREF       (1UL << 26UL) /* Tomatillo */
-+#define SCHIZO_PCICTRL_MRM_PREF       (1UL << 30UL) /* Tomatillo */
-+#define SCHIZO_PCICTRL_RDO_PREF       (1UL << 29UL) /* Tomatillo */
-+#define SCHIZO_PCICTRL_RDL_PREF       (1UL << 28UL) /* Tomatillo */
- #define SCHIZO_PCICTRL_PTO    (3UL << 24UL) /* Safari/Tomatillo */
- #define SCHIZO_PCICTRL_PTO_SHIFT 24UL
- #define SCHIZO_PCICTRL_TRWSW  (7UL << 21UL) /* Tomatillo */
-@@ -1094,7 +1132,7 @@
-       if (error_bits & (SCHIZO_PCIAFSR_PPERR | SCHIZO_PCIAFSR_SPERR))
-               pci_scan_for_parity_error(p, pbm, pbm->pci_bus);
--      schizo_clear_other_err_intr(irq);
-+      schizo_clear_other_err_intr(p, irq);
- }
- #define SCHIZO_SAFARI_ERRLOG  0x10018UL
-@@ -1149,7 +1187,7 @@
-               printk("PCI%d: Unexpected Safari/JBUS error interrupt, errlog[%016lx]\n",
-                      p->index, errlog);
--              schizo_clear_other_err_intr(irq);
-+              schizo_clear_other_err_intr(p, irq);
-               return;
-       }
-@@ -1157,7 +1195,7 @@
-              p->index);
-       schizo_check_iommu_error(p, SAFARI_ERR);
--      schizo_clear_other_err_intr(irq);
-+      schizo_clear_other_err_intr(p, irq);
- }
- /* Nearly identical to PSYCHO equivalents... */
-@@ -1171,26 +1209,6 @@
- #define SCHIZO_SAFARI_IRQCTRL 0x10010UL
- #define  SCHIZO_SAFIRQCTRL_EN  0x8000000000000000UL
--#define SCHIZO_UE_INO         0x30 /* Uncorrectable ECC error */
--#define SCHIZO_CE_INO         0x31 /* Correctable ECC error */
--#define SCHIZO_PCIERR_A_INO   0x32 /* PBM A PCI bus error */
--#define SCHIZO_PCIERR_B_INO   0x33 /* PBM B PCI bus error */
--#define SCHIZO_SERR_INO               0x34 /* Safari interface error */
--
--struct pci_pbm_info *pbm_for_ino(struct pci_controller_info *p, u32 ino)
--{
--      ino &= IMAP_INO;
--      if (p->pbm_A.ino_bitmap & (1UL << ino))
--              return &p->pbm_A;
--      if (p->pbm_B.ino_bitmap & (1UL << ino))
--              return &p->pbm_B;
--      prom_printf("TOMATILLO%d: No entry in ino bitmap for %d\n",
--                  p->index, ino);
--      prom_halt();
--      /* NOTREACHED */
--      return NULL;
--}
--
- /* How the Tomatillo IRQs are routed around is pure guesswork here.
-  *
-  * All the Tomatillo devices I see in prtconf dumps seem to have only
-@@ -1964,7 +1982,7 @@
-       tmp &= ~SCHIZO_PCICTRL_PTO;
-       if (pbm->chip_type == PBM_CHIP_TYPE_TOMATILLO &&
--          pbm->chip_version == 0x2)
-+          pbm->chip_version >= 0x2)
-               tmp |= 0x3UL << SCHIZO_PCICTRL_PTO_SHIFT;
-       else
-               tmp |= 0x1UL << SCHIZO_PCICTRL_PTO_SHIFT;
-@@ -1972,8 +1990,16 @@
-       if (!prom_getbool(pbm->prom_node, "no-bus-parking"))
-               tmp |= SCHIZO_PCICTRL_PARK;
-+      if (pbm->chip_type == PBM_CHIP_TYPE_TOMATILLO &&
-+          pbm->chip_version <= 0x1)
-+              tmp |= (1UL << 61);
-+      else
-+              tmp &= ~(1UL << 61);
-+
-       if (pbm->chip_type == PBM_CHIP_TYPE_TOMATILLO)
--              tmp |= SCHIZO_PCICTRL_MRM_PREF;
-+              tmp |= (SCHIZO_PCICTRL_MRM_PREF |
-+                      SCHIZO_PCICTRL_RDO_PREF |
-+                      SCHIZO_PCICTRL_RDL_PREF);
-       schizo_write(pbm->pbm_regs + SCHIZO_PCI_CTRL, tmp);
-diff -Nur linux-2.4.29/arch/sparc64/kernel/smp.c linux-mips/arch/sparc64/kernel/smp.c
---- linux-2.4.29/arch/sparc64/kernel/smp.c     2005-01-19 15:09:39.000000000 +0100
-+++ linux-mips/arch/sparc64/kernel/smp.c       2005-03-26 11:47:19.647427148 +0100
-@@ -1034,7 +1034,7 @@
- void smp_capture(void)
- {
-       if (smp_processors_ready) {
--              int result = __atomic_add(1, &smp_capture_depth);
-+              int result = atomic_add_ret(1, &smp_capture_depth);
-               membar("#StoreStore | #LoadStore");
-               if (result == 1) {
-diff -Nur linux-2.4.29/arch/sparc64/kernel/sparc64_ksyms.c linux-mips/arch/sparc64/kernel/sparc64_ksyms.c
---- linux-2.4.29/arch/sparc64/kernel/sparc64_ksyms.c   2004-11-17 12:54:21.000000000 +0100
-+++ linux-mips/arch/sparc64/kernel/sparc64_ksyms.c     2005-03-26 11:47:19.648426984 +0100
-@@ -173,18 +173,21 @@
- EXPORT_SYMBOL(__up);
- /* Atomic counter implementation. */
--EXPORT_SYMBOL(__atomic_add);
--EXPORT_SYMBOL(__atomic_sub);
-+EXPORT_SYMBOL(atomic_add);
-+EXPORT_SYMBOL(atomic_add_ret);
-+EXPORT_SYMBOL(atomic_sub);
-+EXPORT_SYMBOL(atomic_sub_ret);
- #ifdef CONFIG_SMP
- EXPORT_SYMBOL(atomic_dec_and_lock);
- #endif
- /* Atomic bit operations. */
--EXPORT_SYMBOL(___test_and_set_bit);
--EXPORT_SYMBOL(___test_and_clear_bit);
--EXPORT_SYMBOL(___test_and_change_bit);
--EXPORT_SYMBOL(___test_and_set_le_bit);
--EXPORT_SYMBOL(___test_and_clear_le_bit);
-+EXPORT_SYMBOL(test_and_set_bit);
-+EXPORT_SYMBOL(test_and_clear_bit);
-+EXPORT_SYMBOL(test_and_change_bit);
-+EXPORT_SYMBOL(set_bit);
-+EXPORT_SYMBOL(clear_bit);
-+EXPORT_SYMBOL(change_bit);
- EXPORT_SYMBOL(ivector_table);
- EXPORT_SYMBOL(enable_irq);
-diff -Nur linux-2.4.29/arch/sparc64/kernel/sys_sparc32.c linux-mips/arch/sparc64/kernel/sys_sparc32.c
---- linux-2.4.29/arch/sparc64/kernel/sys_sparc32.c     2005-01-19 15:09:39.000000000 +0100
-+++ linux-mips/arch/sparc64/kernel/sys_sparc32.c       2005-03-26 11:47:19.669423538 +0100
-@@ -505,25 +505,32 @@
-       return err;
- }
--static int do_sys32_msgsnd (int first, int second, int third, void *uptr)
-+static int do_sys32_msgsnd(int first, int second, int third, void *uptr)
- {
--      struct msgbuf *p = kmalloc (second + sizeof (struct msgbuf), GFP_USER);
--      struct msgbuf32 *up = (struct msgbuf32 *)uptr;
-+      struct msgbuf *p;
-+      struct msgbuf32 *up;
-       mm_segment_t old_fs;
-       int err;
-+      if (second < 0)
-+              return -EINVAL;
-+
-+      p = kmalloc(second + sizeof (struct msgbuf), GFP_USER);
-       if (!p)
-               return -ENOMEM;
-+
-+      up = (struct msgbuf32 *)uptr;
-       err = -EFAULT;
--      if (get_user (p->mtype, &up->mtype) ||
--          __copy_from_user (p->mtext, &up->mtext, second))
-+      if (get_user(p->mtype, &up->mtype) ||
-+          __copy_from_user(p->mtext, up->mtext, second))
-               goto out;
--      old_fs = get_fs ();
--      set_fs (KERNEL_DS);
--      err = sys_msgsnd (first, p, second, third);
--      set_fs (old_fs);
-+
-+      old_fs = get_fs();
-+      set_fs(KERNEL_DS);
-+      err = sys_msgsnd(first, p, second, third);
-+      set_fs(old_fs);
- out:
--      kfree (p);
-+      kfree(p);
-       return err;
- }
-@@ -535,6 +542,9 @@
-       mm_segment_t old_fs;
-       int err;
-+      if (second < 0)
-+              return -EINVAL;
-+
-       if (!version) {
-               struct ipc_kludge *uipck = (struct ipc_kludge *)uptr;
-               struct ipc_kludge ipck;
-@@ -560,7 +570,7 @@
-               goto free_then_out;
-       up = (struct msgbuf32 *)uptr;
-       if (put_user (p->mtype, &up->mtype) ||
--          __copy_to_user (&up->mtext, p->mtext, err))
-+          __copy_to_user (up->mtext, p->mtext, err))
-               err = -EFAULT;
- free_then_out:
-       kfree (p);
-@@ -647,18 +657,18 @@
-       return err;
- }
--static int do_sys32_shmat (int first, int second, int third, int version, void *uptr)
-+static int do_sys32_shmat(int first, int second, u32 third, int version, void *uptr)
- {
-       unsigned long raddr;
--      u32 *uaddr = (u32 *)A((u32)third);
-+      u32 *uaddr = (u32 *)A(third);
-       int err = -EINVAL;
-       if (version == 1)
-               goto out;
--      err = sys_shmat (first, uptr, second, &raddr);
-+      err = sys_shmat(first, uptr, second, &raddr);
-       if (err)
-               goto out;
--      err = put_user (raddr, uaddr);
-+      err = put_user(raddr, uaddr);
- out:
-       return err;
- }
-@@ -770,6 +780,8 @@
-       if (!(current->thread.flags & SPARC_FLAG_32BIT))
-               usp += STACK_BIAS;
-+      else
-+              usp &= 0xffffffffUL;
-       return (void *) (usp - len);
- }
-@@ -795,9 +807,11 @@
-       return sys_semtimedop(semid, tsems, nsems, t64);
- }
--asmlinkage int sys32_ipc (u32 call, int first, int second, int third, u32 ptr, u32 fifth)
-+asmlinkage int sys32_ipc (u32 call, u32 first, u32 second, u32 third, s32 __ptr, s32 __fifth)
- {
-       int version, err;
-+      u32 ptr = (u32) __ptr;
-+      u32 fifth = (u32) __fifth;
-       version = call >> 16; /* hack for backward compatibility */
-       call &= 0xffff;
-@@ -806,15 +820,23 @@
-               switch (call) {
-               case SEMOP:
-                       /* struct sembuf is the same on 32 and 64bit :)) */
--                      err = sys_semtimedop (first, (struct sembuf *)AA(ptr), second, NULL);
-+                      err = sys_semtimedop((int)first,
-+                                           (struct sembuf *)A(ptr),
-+                                           second, NULL);
-                       goto out;
-               case SEMTIMEDOP:
--                      err = sys32_semtimedop (first, (struct sembuf *)AA(ptr), second, (const struct timespec32 *) AA(fifth));
-+                      err = sys32_semtimedop((int)first,
-+                                             (struct sembuf *)A(ptr),
-+                                             second,
-+                                             (const struct timespec32 *)
-+                                             A(third));
-               case SEMGET:
--                      err = sys_semget (first, second, third);
-+                      err = sys_semget((key_t)first, (int)second,
-+                                       (int)third);
-                       goto out;
-               case SEMCTL:
--                      err = do_sys32_semctl (first, second, third, (void *)AA(ptr));
-+                      err = do_sys32_semctl((int)first, (int)second,
-+                                            (int)third, (void *) A(ptr));
-                       goto out;
-               default:
-                       err = -ENOSYS;
-@@ -823,17 +845,20 @@
-       if (call <= MSGCTL) 
-               switch (call) {
-               case MSGSND:
--                      err = do_sys32_msgsnd (first, second, third, (void *)AA(ptr));
-+                      err = do_sys32_msgsnd((int)first, (int)second,
-+                                            (int)third, (void *)A(ptr));
-                       goto out;
-               case MSGRCV:
--                      err = do_sys32_msgrcv (first, second, fifth, third,
--                                             version, (void *)AA(ptr));
-+                      err = do_sys32_msgrcv((int)first, (int)second,
-+                                            (int)fifth, (int)third,
-+                                            version, (void *)A(ptr));
-                       goto out;
-               case MSGGET:
--                      err = sys_msgget ((key_t) first, second);
-+                      err = sys_msgget((key_t)first, (int)second);
-                       goto out;
-               case MSGCTL:
--                      err = do_sys32_msgctl (first, second, (void *)AA(ptr));
-+                      err = do_sys32_msgctl((int)first, (int)second,
-+                                            (void *)A(ptr));
-                       goto out;
-               default:
-                       err = -ENOSYS;
-@@ -842,17 +867,18 @@
-       if (call <= SHMCTL) 
-               switch (call) {
-               case SHMAT:
--                      err = do_sys32_shmat (first, second, third,
--                                            version, (void *)AA(ptr));
-+                      err = do_sys32_shmat((int)first, (int)second, third,
-+                                           version, (void *)A(ptr));
-                       goto out;
-               case SHMDT: 
--                      err = sys_shmdt ((char *)AA(ptr));
-+                      err = sys_shmdt((char *)A(ptr));
-                       goto out;
-               case SHMGET:
--                      err = sys_shmget (first, second, third);
-+                      err = sys_shmget((key_t)first, second, (int)third);
-                       goto out;
-               case SHMCTL:
--                      err = do_sys32_shmctl (first, second, (void *)AA(ptr));
-+                      err = do_sys32_shmctl((int)first, (int)second,
-+                                            (void *)A(ptr));
-                       goto out;
-               default:
-                       err = -ENOSYS;
-@@ -1093,7 +1119,6 @@
-       __kernel_ssize_t32 tot_len;
-       struct iovec iovstack[UIO_FASTIOV];
-       struct iovec *iov=iovstack, *ivp;
--      struct inode *inode;
-       long retval, i;
-       io_fn_t fn;
-       iov_fn_t fnv;
-@@ -1140,11 +1165,9 @@
-               i--;
-       }
--      inode = file->f_dentry->d_inode;
-       /* VERIFY_WRITE actually means a read, as we write to user space */
--      retval = locks_verify_area((type == VERIFY_WRITE
--                                  ? FLOCK_VERIFY_READ : FLOCK_VERIFY_WRITE),
--                                 inode, file, file->f_pos, tot_len);
-+      retval = rw_verify_area((type == VERIFY_WRITE ? READ : WRITE),
-+                                 file, &file->f_pos, tot_len);
-       if (retval)
-               goto out;
-@@ -2160,9 +2183,6 @@
-                       timeout = (timespec_to_jiffies(&ts)
-                                  + (ts.tv_sec || ts.tv_nsec));
--              current->state = TASK_INTERRUPTIBLE;
--              timeout = schedule_timeout(timeout);
--
-               if (timeout) {
-                       /* None ready -- temporarily unblock those we're
-                        * interested while we are sleeping in so that we'll
-@@ -2648,7 +2668,8 @@
-  *            IPV6_RTHDR      ipv6 routing exthdr     32-bit clean
-  *            IPV6_AUTHHDR    ipv6 auth exthdr        32-bit clean
-  */
--static void cmsg32_recvmsg_fixup(struct msghdr *kmsg, unsigned long orig_cmsg_uptr)
-+static void cmsg32_recvmsg_fixup(struct msghdr *kmsg,
-+              unsigned long orig_cmsg_uptr, __kernel_size_t orig_cmsg_len)
- {
-       unsigned char *workbuf, *wp;
-       unsigned long bufsz, space_avail;
-@@ -2679,6 +2700,9 @@
-               __get_user(kcmsg32->cmsg_type, &ucmsg->cmsg_type);
-               clen64 = kcmsg32->cmsg_len;
-+              if ((clen64 < CMSG_ALIGN(sizeof(*ucmsg))) ||
-+                              (clen64 > (orig_cmsg_len + wp - workbuf)))
-+                      break;
-               if (kcmsg32->cmsg_level == SOL_SOCKET &&
-                       kcmsg32->cmsg_type == SO_TIMESTAMP) {
-                       struct timeval tv;
-@@ -2782,6 +2806,7 @@
-       struct sockaddr *uaddr;
-       int *uaddr_len;
-       unsigned long cmsg_ptr;
-+      __kernel_size_t cmsg_len;
-       int err, total_len, len = 0;
-       if(msghdr_from_user32_to_kern(&kern_msg, user_msg))
-@@ -2797,6 +2822,7 @@
-       total_len = err;
-       cmsg_ptr = (unsigned long) kern_msg.msg_control;
-+      cmsg_len = kern_msg.msg_controllen;
-       kern_msg.msg_flags = 0;
-       sock = sockfd_lookup(fd, &err);
-@@ -2822,7 +2848,8 @@
-                                * to fix it up before we tack on more stuff.
-                                */
-                               if((unsigned long) kern_msg.msg_control != cmsg_ptr)
--                                      cmsg32_recvmsg_fixup(&kern_msg, cmsg_ptr);
-+                                      cmsg32_recvmsg_fixup(&kern_msg,
-+                                                      cmsg_ptr, cmsg_len);
-                               /* Wheee... */
-                               if(sock->passcred)
-diff -Nur linux-2.4.29/arch/sparc64/kernel/time.c linux-mips/arch/sparc64/kernel/time.c
---- linux-2.4.29/arch/sparc64/kernel/time.c    2004-11-17 12:54:21.000000000 +0100
-+++ linux-mips/arch/sparc64/kernel/time.c      2005-03-26 11:47:19.670423374 +0100
-@@ -770,6 +770,7 @@
-                   strcmp(model, "mk48t59") &&
-                   strcmp(model, "m5819") &&
-                   strcmp(model, "m5819p") &&
-+                  strcmp(model, "m5823") &&
-                   strcmp(model, "ds1287")) {
-                       if (cbus != NULL) {
-                               prom_printf("clock_probe: Central bus lacks timer chip.\n");
-@@ -829,7 +830,8 @@
-                       if (!strcmp(model, "ds1287") ||
-                           !strcmp(model, "m5819") ||
--                          !strcmp(model, "m5819p")) {
-+                          !strcmp(model, "m5819p") ||
-+                          !strcmp(model, "m5823")) {
-                               ds1287_regs = edev->resource[0].start;
-                       } else {
-                               mstk48t59_regs = edev->resource[0].start;
-@@ -850,7 +852,8 @@
-                       }
-                       if (!strcmp(model, "ds1287") ||
-                           !strcmp(model, "m5819") ||
--                          !strcmp(model, "m5819p")) {
-+                          !strcmp(model, "m5819p") ||
-+                          !strcmp(model, "m5823")) {
-                               ds1287_regs = isadev->resource.start;
-                       } else {
-                               mstk48t59_regs = isadev->resource.start;
-diff -Nur linux-2.4.29/arch/sparc64/lib/atomic.S linux-mips/arch/sparc64/lib/atomic.S
---- linux-2.4.29/arch/sparc64/lib/atomic.S     2001-12-21 18:41:53.000000000 +0100
-+++ linux-mips/arch/sparc64/lib/atomic.S       2005-03-26 11:47:19.671423210 +0100
-@@ -4,33 +4,83 @@
-  * Copyright (C) 1999 David S. Miller (davem@redhat.com)
-  */
-+#include <linux/config.h>
- #include <asm/asi.h>
-+      /* On SMP we need to use memory barriers to ensure
-+       * correct memory operation ordering, nop these out
-+       * for uniprocessor.
-+       */
-+#ifdef CONFIG_SMP
-+#define ATOMIC_PRE_BARRIER    membar #StoreLoad | #LoadLoad
-+#define ATOMIC_POST_BARRIER   membar #StoreLoad | #StoreStore
-+#else
-+#define ATOMIC_PRE_BARRIER    nop
-+#define ATOMIC_POST_BARRIER   nop
-+#endif
-+
-       .text
--      .align  64
-       .globl  atomic_impl_begin, atomic_impl_end
--
--      .globl  __atomic_add
- atomic_impl_begin:
--__atomic_add: /* %o0 = increment, %o1 = atomic_ptr */
--      lduw    [%o1], %g5
-+      /* Two versions of the atomic routines, one that
-+       * does not return a value and does not perform
-+       * memory barriers, and a second which returns
-+       * a value and does the barriers.
-+       */
-+      .globl  atomic_add
-+      .type   atomic_add,#function
-+atomic_add: /* %o0 = increment, %o1 = atomic_ptr */
-+1:    lduw    [%o1], %g5
-+      add     %g5, %o0, %g7
-+      cas     [%o1], %g5, %g7
-+      cmp     %g5, %g7
-+      bne,pn  %icc, 1b
-+       nop
-+      retl
-+       nop
-+      .size   atomic_add, .-atomic_add
-+
-+      .globl  atomic_sub
-+      .type   atomic_sub,#function
-+atomic_sub: /* %o0 = decrement, %o1 = atomic_ptr */
-+1:    lduw    [%o1], %g5
-+      sub     %g5, %o0, %g7
-+      cas     [%o1], %g5, %g7
-+      cmp     %g5, %g7
-+      bne,pn  %icc, 1b
-+       nop
-+      retl
-+       nop
-+      .size   atomic_sub, .-atomic_sub
-+
-+      .globl  atomic_add_ret
-+      .type   atomic_add_ret,#function
-+atomic_add_ret: /* %o0 = increment, %o1 = atomic_ptr */
-+      ATOMIC_PRE_BARRIER
-+1:    lduw    [%o1], %g5
-       add     %g5, %o0, %g7
-       cas     [%o1], %g5, %g7
-       cmp     %g5, %g7
--      bne,pn  %icc, __atomic_add
--       membar #StoreLoad | #StoreStore
-+      bne,pn  %icc, 1b
-+       add    %g7, %o0, %g7
-+      ATOMIC_POST_BARRIER
-       retl
--       add    %g7, %o0, %o0
-+       sra    %g7, 0, %o0
-+      .size   atomic_add_ret, .-atomic_add_ret
--      .globl  __atomic_sub
--__atomic_sub: /* %o0 = increment, %o1 = atomic_ptr */
--      lduw    [%o1], %g5
-+      .globl  atomic_sub_ret
-+      .type   atomic_sub_ret,#function
-+atomic_sub_ret: /* %o0 = decrement, %o1 = atomic_ptr */
-+      ATOMIC_PRE_BARRIER
-+1:    lduw    [%o1], %g5
-       sub     %g5, %o0, %g7
-       cas     [%o1], %g5, %g7
-       cmp     %g5, %g7
--      bne,pn  %icc, __atomic_sub
--       membar #StoreLoad | #StoreStore
-+      bne,pn  %icc, 1b
-+       sub    %g7, %o0, %g7
-+      ATOMIC_POST_BARRIER
-       retl
--       sub    %g7, %o0, %o0
-+       sra    %g7, 0, %o0
-+      .size   atomic_sub_ret, .-atomic_sub_ret
- atomic_impl_end:
-diff -Nur linux-2.4.29/arch/sparc64/lib/bitops.S linux-mips/arch/sparc64/lib/bitops.S
---- linux-2.4.29/arch/sparc64/lib/bitops.S     2001-12-21 18:41:53.000000000 +0100
-+++ linux-mips/arch/sparc64/lib/bitops.S       2005-03-26 11:47:19.683421241 +0100
-@@ -4,107 +4,149 @@
-  * Copyright (C) 2000 David S. Miller (davem@redhat.com)
-  */
-+#include <linux/config.h>
- #include <asm/asi.h>
-+      /* On SMP we need to use memory barriers to ensure
-+       * correct memory operation ordering, nop these out
-+       * for uniprocessor.
-+       */
-+#ifdef CONFIG_SMP
-+#define BITOP_PRE_BARRIER     membar #StoreLoad | #LoadLoad
-+#define BITOP_POST_BARRIER    membar #StoreLoad | #StoreStore
-+#else
-+#define BITOP_PRE_BARRIER     nop
-+#define BITOP_POST_BARRIER    nop
-+#endif
-+
-       .text
--      .align  64
-+
-       .globl  __bitops_begin
- __bitops_begin:
--      .globl  ___test_and_set_bit
--___test_and_set_bit:  /* %o0=nr, %o1=addr */
-+
-+      .globl  test_and_set_bit
-+      .type   test_and_set_bit,#function
-+test_and_set_bit:     /* %o0=nr, %o1=addr */
-+      BITOP_PRE_BARRIER
-       srlx    %o0, 6, %g1
-       mov     1, %g5
-       sllx    %g1, 3, %g3
-       and     %o0, 63, %g2
-       sllx    %g5, %g2, %g5
-       add     %o1, %g3, %o1
--      ldx     [%o1], %g7
--1:    andcc   %g7, %g5, %o0
--      bne,pn  %xcc, 2f
--       xor    %g7, %g5, %g1
-+1:    ldx     [%o1], %g7
-+      or      %g7, %g5, %g1
-       casx    [%o1], %g7, %g1
-       cmp     %g7, %g1
--      bne,a,pn %xcc, 1b
--       ldx    [%o1], %g7
--2:    retl
--       membar #StoreLoad | #StoreStore
--
--      .globl  ___test_and_clear_bit
--___test_and_clear_bit:        /* %o0=nr, %o1=addr */
-+      bne,pn  %xcc, 1b
-+       and    %g7, %g5, %g2
-+      BITOP_POST_BARRIER
-+      clr     %o0
-+      retl
-+       movrne %g2, 1, %o0
-+      .size   test_and_set_bit, .-test_and_set_bit
-+
-+      .globl  test_and_clear_bit
-+      .type   test_and_clear_bit,#function
-+test_and_clear_bit:   /* %o0=nr, %o1=addr */
-+      BITOP_PRE_BARRIER
-       srlx    %o0, 6, %g1
-       mov     1, %g5
-       sllx    %g1, 3, %g3
-       and     %o0, 63, %g2
-       sllx    %g5, %g2, %g5
-       add     %o1, %g3, %o1
--      ldx     [%o1], %g7
--1:    andcc   %g7, %g5, %o0
--      be,pn   %xcc, 2f
--       xor    %g7, %g5, %g1
-+1:    ldx     [%o1], %g7
-+      andn    %g7, %g5, %g1
-       casx    [%o1], %g7, %g1
-       cmp     %g7, %g1
--      bne,a,pn %xcc, 1b
--       ldx    [%o1], %g7
--2:    retl
--       membar #StoreLoad | #StoreStore
--
--      .globl  ___test_and_change_bit
--___test_and_change_bit:       /* %o0=nr, %o1=addr */
-+      bne,pn  %xcc, 1b
-+       and    %g7, %g5, %g2
-+      BITOP_POST_BARRIER
-+      clr     %o0
-+      retl
-+       movrne %g2, 1, %o0
-+      .size   test_and_clear_bit, .-test_and_clear_bit
-+
-+      .globl  test_and_change_bit
-+      .type   test_and_change_bit,#function
-+test_and_change_bit:  /* %o0=nr, %o1=addr */
-+      BITOP_PRE_BARRIER
-+      srlx    %o0, 6, %g1
-+      mov     1, %g5
-+      sllx    %g1, 3, %g3
-+      and     %o0, 63, %g2
-+      sllx    %g5, %g2, %g5
-+      add     %o1, %g3, %o1
-+1:    ldx     [%o1], %g7
-+      xor     %g7, %g5, %g1
-+      casx    [%o1], %g7, %g1
-+      cmp     %g7, %g1
-+      bne,pn  %xcc, 1b
-+       and    %g7, %g5, %g2
-+      BITOP_POST_BARRIER
-+      clr     %o0
-+      retl
-+       movrne %g2, 1, %o0
-+      .size   test_and_change_bit, .-test_and_change_bit
-+
-+      .globl  set_bit
-+      .type   set_bit,#function
-+set_bit:              /* %o0=nr, %o1=addr */
-+      srlx    %o0, 6, %g1
-+      mov     1, %g5
-+      sllx    %g1, 3, %g3
-+      and     %o0, 63, %g2
-+      sllx    %g5, %g2, %g5
-+      add     %o1, %g3, %o1
-+1:    ldx     [%o1], %g7
-+      or      %g7, %g5, %g1
-+      casx    [%o1], %g7, %g1
-+      cmp     %g7, %g1
-+      bne,pn  %xcc, 1b
-+       nop
-+      retl
-+       nop
-+      .size   set_bit, .-set_bit
-+
-+      .globl  clear_bit
-+      .type   clear_bit,#function
-+clear_bit:            /* %o0=nr, %o1=addr */
-+      srlx    %o0, 6, %g1
-+      mov     1, %g5
-+      sllx    %g1, 3, %g3
-+      and     %o0, 63, %g2
-+      sllx    %g5, %g2, %g5
-+      add     %o1, %g3, %o1
-+1:    ldx     [%o1], %g7
-+      andn    %g7, %g5, %g1
-+      casx    [%o1], %g7, %g1
-+      cmp     %g7, %g1
-+      bne,pn  %xcc, 1b
-+       nop
-+      retl
-+       nop
-+      .size   clear_bit, .-clear_bit
-+
-+      .globl  change_bit
-+      .type   change_bit,#function
-+change_bit:           /* %o0=nr, %o1=addr */
-       srlx    %o0, 6, %g1
-       mov     1, %g5
-       sllx    %g1, 3, %g3
-       and     %o0, 63, %g2
-       sllx    %g5, %g2, %g5
-       add     %o1, %g3, %o1
--      ldx     [%o1], %g7
--1:    and     %g7, %g5, %o0
-+1:    ldx     [%o1], %g7
-       xor     %g7, %g5, %g1
-       casx    [%o1], %g7, %g1
-       cmp     %g7, %g1
--      bne,a,pn %xcc, 1b
--       ldx    [%o1], %g7
--2:    retl
--       membar #StoreLoad | #StoreStore
--      nop
--
--      .globl  ___test_and_set_le_bit
--___test_and_set_le_bit:       /* %o0=nr, %o1=addr */
--      srlx    %o0, 5, %g1
--      mov     1, %g5
--      sllx    %g1, 2, %g3
--      and     %o0, 31, %g2
--      sllx    %g5, %g2, %g5
--      add     %o1, %g3, %o1
--      lduwa   [%o1] ASI_PL, %g7
--1:    andcc   %g7, %g5, %o0
--      bne,pn  %icc, 2f
--       xor    %g7, %g5, %g1
--      casa    [%o1] ASI_PL, %g7, %g1
--      cmp     %g7, %g1
--      bne,a,pn %icc, 1b
--       lduwa  [%o1] ASI_PL, %g7
--2:    retl
--       membar #StoreLoad | #StoreStore
--
--      .globl  ___test_and_clear_le_bit
--___test_and_clear_le_bit:     /* %o0=nr, %o1=addr */
--      srlx    %o0, 5, %g1
--      mov     1, %g5
--      sllx    %g1, 2, %g3
--      and     %o0, 31, %g2
--      sllx    %g5, %g2, %g5
--      add     %o1, %g3, %o1
--      lduwa   [%o1] ASI_PL, %g7
--1:    andcc   %g7, %g5, %o0
--      be,pn   %icc, 2f
--       xor    %g7, %g5, %g1
--      casa    [%o1] ASI_PL, %g7, %g1
--      cmp     %g7, %g1
--      bne,a,pn %icc, 1b
--       lduwa  [%o1] ASI_PL, %g7
--2:    retl
--       membar #StoreLoad | #StoreStore
-+      bne,pn  %xcc, 1b
-+       nop
-+      retl
-+       nop
-+      .size   change_bit, .-change_bit
-       .globl  __bitops_end
- __bitops_end:
-diff -Nur linux-2.4.29/arch/sparc64/lib/debuglocks.c linux-mips/arch/sparc64/lib/debuglocks.c
---- linux-2.4.29/arch/sparc64/lib/debuglocks.c 2001-12-21 18:41:53.000000000 +0100
-+++ linux-mips/arch/sparc64/lib/debuglocks.c   2005-03-26 11:47:19.684421077 +0100
-@@ -162,6 +162,7 @@
- runlock_again:
-       /* Spin trying to decrement the counter using casx.  */
-       __asm__ __volatile__(
-+"     membar  #StoreLoad | #LoadLoad\n"
- "     ldx     [%0], %%g5\n"
- "     sub     %%g5, 1, %%g7\n"
- "     casx    [%0], %%g5, %%g7\n"
-@@ -276,6 +277,7 @@
-       current->thread.smp_lock_count--;
- wlock_again:
-       __asm__ __volatile__(
-+"     membar  #StoreLoad | #LoadLoad\n"
- "     mov     1, %%g3\n"
- "     sllx    %%g3, 63, %%g3\n"
- "     ldx     [%0], %%g5\n"
-diff -Nur linux-2.4.29/arch/sparc64/lib/rwlock.S linux-mips/arch/sparc64/lib/rwlock.S
---- linux-2.4.29/arch/sparc64/lib/rwlock.S     2000-09-09 02:55:17.000000000 +0200
-+++ linux-mips/arch/sparc64/lib/rwlock.S       2005-03-26 11:47:19.689420256 +0100
-@@ -24,12 +24,13 @@
- 99:   retl
-        nop
- __read_unlock: /* %o0 = lock_ptr */
-+      membar          #StoreLoad | #LoadLoad
-       lduw            [%o0], %g5
-       sub             %g5, 1, %g7
-       cas             [%o0], %g5, %g7
-       cmp             %g5, %g7
-       be,pt           %xcc, 99b
--       membar         #StoreLoad | #StoreStore
-+       nop
-       ba,a,pt         %xcc, __read_unlock
- __read_wait_for_writer:
-diff -Nur linux-2.4.29/arch/x86_64/ia32/socket32.c linux-mips/arch/x86_64/ia32/socket32.c
---- linux-2.4.29/arch/x86_64/ia32/socket32.c   2005-01-19 15:09:39.000000000 +0100
-+++ linux-mips/arch/x86_64/ia32/socket32.c     2005-03-26 11:47:19.905384811 +0100
-@@ -302,7 +302,8 @@
-  *            IPV6_RTHDR      ipv6 routing exthdr     32-bit clean
-  *            IPV6_AUTHHDR    ipv6 auth exthdr        32-bit clean
-  */
--static void cmsg32_recvmsg_fixup(struct msghdr *kmsg, unsigned long orig_cmsg_uptr)
-+static void cmsg32_recvmsg_fixup(struct msghdr *kmsg,
-+              unsigned long orig_cmsg_uptr, __kernel_size_t orig_cmsg_len)
- {
-       unsigned char *workbuf, *wp;
-       unsigned long bufsz, space_avail;
-@@ -333,6 +334,9 @@
-               __get_user(kcmsg32->cmsg_type, &ucmsg->cmsg_type);
-               clen64 = kcmsg32->cmsg_len;
-+              if ((clen64 < CMSG_ALIGN(sizeof(*ucmsg))) ||
-+                              (clen64 > (orig_cmsg_len + wp - workbuf)))
-+                      break;
-               copy_from_user(CMSG32_DATA(kcmsg32), CMSG_DATA(ucmsg),
-                              clen64 - CMSG_ALIGN(sizeof(*ucmsg)));
-               clen32 = ((clen64 - CMSG_ALIGN(sizeof(*ucmsg))) +
-@@ -418,6 +422,7 @@
-       struct sockaddr *uaddr;
-       int *uaddr_len;
-       unsigned long cmsg_ptr;
-+      __kernel_size_t cmsg_len;
-       int err, total_len, len = 0;
-       if(msghdr_from_user32_to_kern(&kern_msg, user_msg))
-@@ -433,6 +438,7 @@
-       total_len = err;
-       cmsg_ptr = (unsigned long) kern_msg.msg_control;
-+      cmsg_len = kern_msg.msg_controllen;
-       kern_msg.msg_flags = 0;
-       sock = sockfd_lookup(fd, &err);
-@@ -458,7 +464,8 @@
-                                * to fix it up before we tack on more stuff.
-                                */
-                               if((unsigned long) kern_msg.msg_control != cmsg_ptr)
--                                      cmsg32_recvmsg_fixup(&kern_msg, cmsg_ptr);
-+                                      cmsg32_recvmsg_fixup(&kern_msg,
-+                                                      cmsg_ptr, cmsg_len);
-                               /* Wheee... */
-                               if(sock->passcred)
-diff -Nur linux-2.4.29/arch/x86_64/kernel/acpi.c linux-mips/arch/x86_64/kernel/acpi.c
---- linux-2.4.29/arch/x86_64/kernel/acpi.c     2004-08-08 01:26:04.000000000 +0200
-+++ linux-mips/arch/x86_64/kernel/acpi.c       2005-03-26 11:47:19.976373161 +0100
-@@ -53,6 +53,7 @@
- acpi_interrupt_flags acpi_sci_flags __initdata;
- int acpi_sci_override_gsi __initdata;
-+int acpi_skip_timer_override __initdata;
- /* --------------------------------------------------------------------------
-                               Boot-time Configuration
-    -------------------------------------------------------------------------- */
-@@ -333,6 +334,12 @@
-               return 0;
-       }
-+      if (acpi_skip_timer_override &&
-+              intsrc->bus_irq == 0 && intsrc->global_irq == 2) {
-+              printk(PREFIX "BIOS IRQ0 pin2 override ignored.\n");
-+              return 0;
-+      }
-+
-       mp_override_legacy_irq (
-               intsrc->bus_irq,
-               intsrc->flags.polarity,
-diff -Nur linux-2.4.29/arch/x86_64/kernel/io_apic.c linux-mips/arch/x86_64/kernel/io_apic.c
---- linux-2.4.29/arch/x86_64/kernel/io_apic.c  2004-08-08 01:26:04.000000000 +0200
-+++ linux-mips/arch/x86_64/kernel/io_apic.c    2005-03-26 11:47:19.977372996 +0100
-@@ -259,10 +259,14 @@
-                               case PCI_VENDOR_ID_VIA:
-                                       return;
-                               case PCI_VENDOR_ID_NVIDIA: 
-+#ifdef CONFIG_ACPI
-+                              /* All timer overrides on Nvidia
-+                                 seem to be wrong. Skip them. */
-+                                      acpi_skip_timer_override = 1;
-                                       printk(KERN_INFO 
--     "PCI bridge %02x:%02x from %x found. Setting \"noapic\". Overwrite with \"apic\"\n",
--                                             num,slot,vendor); 
--                                      skip_ioapic_setup = 1;
-+                      "Nvidia board detected. Ignoring ACPI timer override.\n");
-+#endif
-+                                      /* RED-PEN skip them on mptables too? */
-                                       return;
-                               } 
-diff -Nur linux-2.4.29/arch/x86_64/kernel/pci-irq.c linux-mips/arch/x86_64/kernel/pci-irq.c
---- linux-2.4.29/arch/x86_64/kernel/pci-irq.c  2003-08-25 13:44:40.000000000 +0200
-+++ linux-mips/arch/x86_64/kernel/pci-irq.c    2005-03-26 11:47:20.061359212 +0100
-@@ -742,7 +742,7 @@
- void pcibios_enable_irq(struct pci_dev *dev)
- {
-               u8 pin;
--      extern int interrupt_line_quirk;
-+      extern int via_interrupt_line_quirk;
-               pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin);
-       if (pin && !pcibios_lookup_irq(dev, 1) && !dev->irq) {
-@@ -762,6 +762,6 @@
-       }
-       /* VIA bridges use interrupt line for apic/pci steering across
-          the V-Link */
--      else if (interrupt_line_quirk)
-+      else if (via_interrupt_line_quirk)
-               pci_write_config_byte(dev, PCI_INTERRUPT_LINE, dev->irq);
- }
-diff -Nur linux-2.4.29/arch/x86_64/kernel/setup.c linux-mips/arch/x86_64/kernel/setup.c
---- linux-2.4.29/arch/x86_64/kernel/setup.c    2005-01-19 15:09:39.000000000 +0100
-+++ linux-mips/arch/x86_64/kernel/setup.c      2005-03-26 11:47:20.069357900 +0100
-@@ -93,7 +93,8 @@
- struct resource standard_io_resources[] = {
-       { "dma1", 0x00, 0x1f, IORESOURCE_BUSY },
-       { "pic1", 0x20, 0x3f, IORESOURCE_BUSY },
--      { "timer", 0x40, 0x5f, IORESOURCE_BUSY },
-+      { "timer0", 0x40, 0x43, IORESOURCE_BUSY },
-+      { "timer1", 0x50, 0x53, IORESOURCE_BUSY },
-       { "keyboard", 0x60, 0x6f, IORESOURCE_BUSY },
-       { "dma page reg", 0x80, 0x8f, IORESOURCE_BUSY },
-       { "pic2", 0xa0, 0xbf, IORESOURCE_BUSY },
-diff -Nur linux-2.4.29/Documentation/Changes linux-mips/Documentation/Changes
---- linux-2.4.29/Documentation/Changes 2005-01-19 15:09:22.000000000 +0100
-+++ linux-mips/Documentation/Changes   2005-03-26 11:47:05.688718095 +0100
-@@ -341,7 +341,7 @@
- JFSutils
- ---------
--o  <http://oss.software.ibm.com/jfs/>
-+o  <http://jfs.sourceforge.net/>
- Reiserfsprogs
- -------------
-diff -Nur linux-2.4.29/Documentation/Configure.help linux-mips/Documentation/Configure.help
---- linux-2.4.29/Documentation/Configure.help  2005-01-19 15:09:22.000000000 +0100
-+++ linux-mips/Documentation/Configure.help    2005-03-26 11:47:12.272637522 +0100
-@@ -9345,6 +9345,11 @@
-   If unsure, say N.
-+CONFIG_SCSI_SATA_QSTOR
-+  This option enables support for Pacific Digital Serial ATA QStor.
-+
-+  If unsure, say N.
-+
- CONFIG_SCSI_SATA_SX4
-   This option enables support for Promise Serial ATA SX4.
-diff -Nur linux-2.4.29/Documentation/filesystems/jfs.txt linux-mips/Documentation/filesystems/jfs.txt
---- linux-2.4.29/Documentation/filesystems/jfs.txt     2003-11-28 19:26:19.000000000 +0100
-+++ linux-mips/Documentation/filesystems/jfs.txt       2005-03-26 11:47:12.320629645 +0100
-@@ -1,13 +1,6 @@
- IBM's Journaled File System (JFS) for Linux
--JFS Homepage:  http://oss.software.ibm.com/jfs/
--
--Team members
--------------
--Dave Kleikamp      shaggy@austin.ibm.com  
--Dave Blaschke      blaschke@us.ibm.com
--Steve Best         sbest@us.ibm.com
--Barry Arndt        barndt@us.ibm.com
-+JFS Homepage:  http://jfs.sourceforge.net/
- The following mount options are supported:
-@@ -15,7 +8,8 @@
-               ASCII.  The default is compiled into the kernel as
-               CONFIG_NLS_DEFAULT.  Use iocharset=utf8 for UTF8
-               translations.  This requires CONFIG_NLS_UTF8 to be set
--              in the kernel .config file.
-+              in the kernel .config file.  Specify iocharset=none for
-+              no conversion (default linux-2.6 behavior).
- resize=value  Resize the volume to <value> blocks.  JFS only supports
-               growing a volume, not shrinking it.  This option is only
-@@ -51,4 +45,4 @@
- Please send bugs, comments, cards and letters to shaggy@austin.ibm.com.
- The JFS mailing list can be subscribed to by using the link labeled
--"Mail list Subscribe" at our web page http://oss.software.ibm.com/jfs/.
-+"Mail list Subscribe" at our web page http://jfs.sourceforge.net/.
-diff -Nur linux-2.4.29/Documentation/i2c/writing-clients linux-mips/Documentation/i2c/writing-clients
---- linux-2.4.29/Documentation/i2c/writing-clients     2004-11-17 12:54:20.000000000 +0100
-+++ linux-mips/Documentation/i2c/writing-clients       2005-03-26 11:47:12.338626691 +0100
-@@ -380,9 +380,6 @@
- For now, you can ignore the `flags' parameter. It is there for future use.
--  /* Unique ID allocation */
--  static int foo_id = 0;
--
-   int foo_detect_client(struct i2c_adapter *adapter, int address, 
-                         unsigned short flags, int kind)
-   {
-@@ -518,7 +515,6 @@
-     data->type = kind;
-     /* SENSORS ONLY END */
--    new_client->id = foo_id++; /* Automatically unique */
-     data->valid = 0; /* Only if you use this field */
-     init_MUTEX(&data->update_lock); /* Only if you use this field */
-diff -Nur linux-2.4.29/drivers/acpi/pci_irq.c linux-mips/drivers/acpi/pci_irq.c
---- linux-2.4.29/drivers/acpi/pci_irq.c        2004-08-08 01:26:04.000000000 +0200
-+++ linux-mips/drivers/acpi/pci_irq.c  2005-03-26 11:47:20.083355602 +0100
-@@ -335,6 +335,7 @@
- {
-       int                     irq = 0;
-       u8                      pin = 0;
-+      extern int via_interrupt_line_quirk;
-       ACPI_FUNCTION_TRACE("acpi_pci_irq_enable");
-@@ -383,6 +384,9 @@
-               }
-       }
-+      if (via_interrupt_line_quirk)
-+              pci_write_config_byte(dev, PCI_INTERRUPT_LINE, irq & 15);
-+
-       dev->irq = irq;
-       ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device %s using IRQ %d\n", dev->slot_name, dev->irq));
-diff -Nur linux-2.4.29/drivers/block/nbd.c linux-mips/drivers/block/nbd.c
---- linux-2.4.29/drivers/block/nbd.c   2003-08-25 13:44:41.000000000 +0200
-+++ linux-mips/drivers/block/nbd.c     2005-03-26 11:47:20.373308014 +0100
-@@ -408,10 +408,7 @@
-       int dev, error, temp;
-       struct request sreq ;
--      /* Anyone capable of this syscall can do *real bad* things */
--      if (!capable(CAP_SYS_ADMIN))
--              return -EPERM;
-       if (!inode)
-               return -EINVAL;
-       dev = MINOR(inode->i_rdev);
-@@ -419,6 +416,20 @@
-               return -ENODEV;
-       lo = &nbd_dev[dev];
-+
-+      /* these are innocent, but.... */
-+      switch (cmd) {
-+      case BLKGETSIZE:
-+              return put_user(nbd_bytesizes[dev] >> 9, (unsigned long *) arg);
-+      case BLKGETSIZE64:
-+              return put_user((u64)nbd_bytesizes[dev], (u64 *) arg);
-+      }
-+
-+      /* ... anyone capable of any of the below ioctls can do *real bad* 
-+         things */
-+      if (!capable(CAP_SYS_ADMIN))
-+              return -EPERM;
-+
-       switch (cmd) {
-       case NBD_DISCONNECT:
-               printk("NBD_DISCONNECT\n");
-@@ -524,10 +535,6 @@
-                      dev, lo->queue_head.next, lo->queue_head.prev, requests_in, requests_out);
-               return 0;
- #endif
--      case BLKGETSIZE:
--              return put_user(nbd_bytesizes[dev] >> 9, (unsigned long *) arg);
--      case BLKGETSIZE64:
--              return put_user((u64)nbd_bytesizes[dev], (u64 *) arg);
-       }
-       return -EINVAL;
- }
 diff -Nur linux-2.4.29/drivers/char/au1000_gpio.c linux-mips/drivers/char/au1000_gpio.c
 --- linux-2.4.29/drivers/char/au1000_gpio.c    2003-08-25 13:44:41.000000000 +0200
 +++ linux-mips/drivers/char/au1000_gpio.c      2003-12-20 14:18:51.000000000 +0100
@@ -13440,7 +10145,7 @@ diff -Nur linux-2.4.29/drivers/char/au1000_gpio.c linux-mips/drivers/char/au1000
  };
 diff -Nur linux-2.4.29/drivers/char/au1550_psc_spi.c linux-mips/drivers/char/au1550_psc_spi.c
 --- linux-2.4.29/drivers/char/au1550_psc_spi.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-mips/drivers/char/au1550_psc_spi.c   2005-03-26 11:47:20.510285533 +0100
++++ linux-mips/drivers/char/au1550_psc_spi.c   2005-02-11 21:37:24.000000000 +0100
 @@ -0,0 +1,466 @@
 +/*
 + *  Driver for Alchemy Au1550 SPI on the PSC.
@@ -13910,7 +10615,7 @@ diff -Nur linux-2.4.29/drivers/char/au1550_psc_spi.c linux-mips/drivers/char/au1
 +module_exit(au1550spi_exit);
 diff -Nur linux-2.4.29/drivers/char/Config.in linux-mips/drivers/char/Config.in
 --- linux-2.4.29/drivers/char/Config.in        2004-08-08 01:26:04.000000000 +0200
-+++ linux-mips/drivers/char/Config.in  2005-03-26 11:47:20.469292261 +0100
++++ linux-mips/drivers/char/Config.in  2005-02-11 22:09:56.000000000 +0100
 @@ -313,14 +313,11 @@
  if [ "$CONFIG_OBSOLETE" = "y" -a "$CONFIG_ALPHA_BOOK1" = "y" ]; then
     bool 'Tadpole ANA H8 Support (OBSOLETE)'  CONFIG_H8
@@ -15936,72 +12641,9 @@ diff -Nur linux-2.4.29/drivers/char/ip27-rtc.c linux-mips/drivers/char/ip27-rtc.
 +MODULE_AUTHOR("Ralf Baechle <ralf@linux-mips.org>");
 +MODULE_DESCRIPTION("SGI IP27 M48T35 RTC driver");
 +MODULE_LICENSE("GPL");
-diff -Nur linux-2.4.29/drivers/char/lcd.c linux-mips/drivers/char/lcd.c
---- linux-2.4.29/drivers/char/lcd.c    2005-01-19 15:09:46.000000000 +0100
-+++ linux-mips/drivers/char/lcd.c      2005-03-26 11:47:20.582273718 +0100
-@@ -386,6 +386,8 @@
-               int ctr=0;
-+              if (!capable(CAP_SYS_ADMIN)) return -EPERM;
-+
-                   // Chip Erase Sequence
-               WRITE_FLASH( kFlash_Addr1, kFlash_Data1 );
-               WRITE_FLASH( kFlash_Addr2, kFlash_Data2 );
-@@ -422,6 +424,8 @@
-                 struct lcd_display display;
-+              if (!capable(CAP_SYS_ADMIN)) return -EPERM;
-+
-                 if(copy_from_user(&display, (struct lcd_display*)arg, sizeof(struct lcd_display)))
-                 return -EFAULT;
-               rom = (unsigned char *) kmalloc((128),GFP_ATOMIC);
-@@ -434,8 +438,10 @@
-               save_flags(flags);
-               for (i=0; i<FLASH_SIZE; i=i+128) {
--                      if(copy_from_user(rom, display.RomImage + i, 128))
-+                      if(copy_from_user(rom, display.RomImage + i, 128)) {
-+                         kfree(rom);
-                          return -EFAULT;
-+                      }
-                       burn_addr = kFlashBase + i;
-                       cli();
-                       for ( index = 0; index < ( 128 ) ; index++ ) 
-diff -Nur linux-2.4.29/drivers/char/lp.c linux-mips/drivers/char/lp.c
---- linux-2.4.29/drivers/char/lp.c     2005-01-19 15:09:46.000000000 +0100
-+++ linux-mips/drivers/char/lp.c       2005-03-26 11:47:20.584273390 +0100
-@@ -314,12 +314,14 @@
-       if (copy_size > LP_BUFFER_SIZE)
-               copy_size = LP_BUFFER_SIZE;
--      if (copy_from_user (kbuf, buf, copy_size))
--              return -EFAULT;
--
-       if (down_interruptible (&lp_table[minor].port_mutex))
-               return -EINTR;
-+      if (copy_from_user (kbuf, buf, copy_size)) {
-+              retv = -EFAULT;
-+              goto out_unlock;
-+      }
-+
-       /* Claim Parport or sleep until it becomes available
-        */
-       lp_claim_parport_or_block (&lp_table[minor]);
-@@ -398,7 +400,7 @@
-               lp_table[minor].current_mode = IEEE1284_MODE_COMPAT;
-               lp_release_parport (&lp_table[minor]);
-       }
--
-+out_unlock:
-       up (&lp_table[minor].port_mutex);
-       return retv;
 diff -Nur linux-2.4.29/drivers/char/Makefile linux-mips/drivers/char/Makefile
 --- linux-2.4.29/drivers/char/Makefile 2004-08-08 01:26:04.000000000 +0200
-+++ linux-mips/drivers/char/Makefile   2005-03-26 11:47:20.471291933 +0100
++++ linux-mips/drivers/char/Makefile   2005-02-11 22:09:56.000000000 +0100
 @@ -48,7 +48,12 @@
      KEYBD    =
    endif
@@ -16173,34 +12815,6 @@ diff -Nur linux-2.4.29/drivers/char/serial.c linux-mips/drivers/char/serial.c
  
  /*
   * We used to support using pause I/O for certain machines.  We
-diff -Nur linux-2.4.29/drivers/char/synclinkmp.c linux-mips/drivers/char/synclinkmp.c
---- linux-2.4.29/drivers/char/synclinkmp.c     2005-01-19 15:09:53.000000000 +0100
-+++ linux-mips/drivers/char/synclinkmp.c       2005-03-26 11:47:20.653262067 +0100
-@@ -1,5 +1,5 @@
- /*
-- * $Id$
-+ * $Id$
-  *
-  * Device driver for Microgate SyncLink Multiport
-  * high speed multiprotocol serial adapter.
-@@ -504,7 +504,7 @@
- MODULE_PARM(dosyncppp,"1-" __MODULE_STRING(MAX_DEVICES) "i");
- static char *driver_name = "SyncLink MultiPort driver";
--static char *driver_version = "$Revision$";
-+static char *driver_version = "$Revision$";
- static int __devinit synclinkmp_init_one(struct pci_dev *dev,const struct pci_device_id *ent);
- static void __devexit synclinkmp_remove_one(struct pci_dev *dev);
-@@ -4482,7 +4482,7 @@
-        * 07..05  Reserved, must be 0
-        * 04..00  RRC<4..0> Rx FIFO trigger active 0x00 = 1 byte
-        */
--      write_reg(info, TRC0, 0x00);
-+      write_reg(info, RRC, 0x00);
-       /* TRC0 Transmit Ready Control 0
-        *
 diff -Nur linux-2.4.29/drivers/char/victor_mpc30x_keymap.map linux-mips/drivers/char/victor_mpc30x_keymap.map
 --- linux-2.4.29/drivers/char/victor_mpc30x_keymap.map 1970-01-01 01:00:00.000000000 +0100
 +++ linux-mips/drivers/char/victor_mpc30x_keymap.map   2004-02-05 18:04:42.000000000 +0100
@@ -16330,7 +12944,7 @@ diff -Nur linux-2.4.29/drivers/char/vr41xx_keyb.c linux-mips/drivers/char/vr41xx
  
 diff -Nur linux-2.4.29/drivers/i2c/Config.in linux-mips/drivers/i2c/Config.in
 --- linux-2.4.29/drivers/i2c/Config.in 2004-04-14 15:05:29.000000000 +0200
-+++ linux-mips/drivers/i2c/Config.in   2005-03-26 11:47:20.974209393 +0100
++++ linux-mips/drivers/i2c/Config.in   2005-02-11 20:49:04.000000000 +0100
 @@ -57,6 +57,10 @@
     if [ "$CONFIG_SGI_IP22" = "y" ]; then
        dep_tristate 'I2C SGI interfaces' CONFIG_I2C_ALGO_SGI $CONFIG_I2C
@@ -16344,7 +12958,7 @@ diff -Nur linux-2.4.29/drivers/i2c/Config.in linux-mips/drivers/i2c/Config.in
  # This is needed for automatic patch generation: sensors code ends here
 diff -Nur linux-2.4.29/drivers/i2c/i2c-algo-au1550.c linux-mips/drivers/i2c/i2c-algo-au1550.c
 --- linux-2.4.29/drivers/i2c/i2c-algo-au1550.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-mips/drivers/i2c/i2c-algo-au1550.c   2005-03-26 11:47:21.004204470 +0100
++++ linux-mips/drivers/i2c/i2c-algo-au1550.c   2005-02-11 20:49:04.000000000 +0100
 @@ -0,0 +1,340 @@
 +/*
 + * i2c-algo-au1550.c: SMBus (i2c) driver algorithms for Alchemy PSC interface
@@ -16686,70 +13300,9 @@ diff -Nur linux-2.4.29/drivers/i2c/i2c-algo-au1550.c linux-mips/drivers/i2c/i2c-
 +MODULE_AUTHOR("Dan Malek <dan@embeddededge.com>");
 +MODULE_DESCRIPTION("SMBus Au1550 algorithm");
 +MODULE_LICENSE("GPL");
-diff -Nur linux-2.4.29/drivers/i2c/i2c-algo-bit.c linux-mips/drivers/i2c/i2c-algo-bit.c
---- linux-2.4.29/drivers/i2c/i2c-algo-bit.c    2004-02-18 14:36:31.000000000 +0100
-+++ linux-mips/drivers/i2c/i2c-algo-bit.c      2005-03-26 11:47:21.069193803 +0100
-@@ -28,14 +28,12 @@
- #include <linux/delay.h>
- #include <linux/slab.h>
- #include <linux/init.h>
--#include <asm/uaccess.h>
--#include <linux/ioport.h>
- #include <linux/errno.h>
- #include <linux/sched.h>
--
- #include <linux/i2c.h>
- #include <linux/i2c-algo-bit.h>
-+
- /* ----- global defines ----------------------------------------------- */
- #define DEB(x) if (i2c_debug>=1) x;
- #define DEB2(x) if (i2c_debug>=2) x;
-@@ -522,8 +520,8 @@
- static u32 bit_func(struct i2c_adapter *adap)
- {
--      return I2C_FUNC_SMBUS_EMUL | I2C_FUNC_10BIT_ADDR | 
--             I2C_FUNC_PROTOCOL_MANGLING;
-+      return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL |
-+             I2C_FUNC_10BIT_ADDR | I2C_FUNC_PROTOCOL_MANGLING;
- }
-diff -Nur linux-2.4.29/drivers/i2c/i2c-algo-pcf.c linux-mips/drivers/i2c/i2c-algo-pcf.c
---- linux-2.4.29/drivers/i2c/i2c-algo-pcf.c    2004-02-18 14:36:31.000000000 +0100
-+++ linux-mips/drivers/i2c/i2c-algo-pcf.c      2005-03-26 11:47:21.128184122 +0100
-@@ -32,15 +32,13 @@
- #include <linux/delay.h>
- #include <linux/slab.h>
- #include <linux/init.h>
--#include <asm/uaccess.h>
--#include <linux/ioport.h>
- #include <linux/errno.h>
- #include <linux/sched.h>
--
- #include <linux/i2c.h>
- #include <linux/i2c-algo-pcf.h>
- #include "i2c-pcf8584.h"
-+
- /* ----- global defines ----------------------------------------------- */
- #define DEB(x) if (i2c_debug>=1) x
- #define DEB2(x) if (i2c_debug>=2) x
-@@ -435,8 +433,8 @@
- static u32 pcf_func(struct i2c_adapter *adap)
- {
--      return I2C_FUNC_SMBUS_EMUL | I2C_FUNC_10BIT_ADDR | 
--             I2C_FUNC_PROTOCOL_MANGLING; 
-+      return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL |
-+             I2C_FUNC_10BIT_ADDR | I2C_FUNC_PROTOCOL_MANGLING;
- }
- /* -----exported algorithm data: -------------------------------------        */
 diff -Nur linux-2.4.29/drivers/i2c/i2c-au1550.c linux-mips/drivers/i2c/i2c-au1550.c
 --- linux-2.4.29/drivers/i2c/i2c-au1550.c      1970-01-01 01:00:00.000000000 +0100
-+++ linux-mips/drivers/i2c/i2c-au1550.c        2005-03-26 11:47:21.146181168 +0100
++++ linux-mips/drivers/i2c/i2c-au1550.c        2005-02-11 20:49:04.000000000 +0100
 @@ -0,0 +1,154 @@
 +/*
 + * i2c-au1550.c: SMBus (i2c) adapter for Alchemy PSC interface
@@ -16931,7 +13484,7 @@ diff -Nur linux-2.4.29/drivers/i2c/i2c-core.c linux-mips/drivers/i2c/i2c-core.c
        sensors_init();
 diff -Nur linux-2.4.29/drivers/i2c/Makefile linux-mips/drivers/i2c/Makefile
 --- linux-2.4.29/drivers/i2c/Makefile  2004-02-18 14:36:31.000000000 +0100
-+++ linux-mips/drivers/i2c/Makefile    2005-03-26 11:47:20.975209228 +0100
++++ linux-mips/drivers/i2c/Makefile    2005-02-11 20:49:04.000000000 +0100
 @@ -6,7 +6,7 @@
  
  export-objs   := i2c-core.o i2c-algo-bit.o i2c-algo-pcf.o \
@@ -16949,95 +13502,6 @@ diff -Nur linux-2.4.29/drivers/i2c/Makefile linux-mips/drivers/i2c/Makefile
  
  # This is needed for automatic patch generation: sensors code starts here
  # This is needed for automatic patch generation: sensors code ends here
-diff -Nur linux-2.4.29/drivers/ide/ide-cd.c linux-mips/drivers/ide/ide-cd.c
---- linux-2.4.29/drivers/ide/ide-cd.c  2003-11-28 19:26:20.000000000 +0100
-+++ linux-mips/drivers/ide/ide-cd.c    2005-03-26 11:47:21.315153436 +0100
-@@ -2206,25 +2206,31 @@
-       /* Read the multisession information. */
-       if (toc->hdr.first_track != CDROM_LEADOUT) {
-               /* Read the multisession information. */
--              stat = cdrom_read_tocentry(drive, 0, 1, 1, (char *)&ms_tmp,
-+              stat = cdrom_read_tocentry(drive, 0, 0, 1, (char *)&ms_tmp,
-                                          sizeof(ms_tmp), sense);
-               if (stat) return stat;
-+      
-+              toc->last_session_lba = be32_to_cpu(ms_tmp.ent.addr.lba);
-       } else {
--              ms_tmp.ent.addr.msf.minute = 0;
--              ms_tmp.ent.addr.msf.second = 2;
--              ms_tmp.ent.addr.msf.frame  = 0;
-               ms_tmp.hdr.first_track = ms_tmp.hdr.last_track = CDROM_LEADOUT;
-+              toc->last_session_lba = msf_to_lba(0, 2, 0); /* 0m 2s 0f */
-       }
- #if ! STANDARD_ATAPI
--      if (CDROM_CONFIG_FLAGS(drive)->tocaddr_as_bcd)
-+      if (CDROM_CONFIG_FLAGS(drive)->tocaddr_as_bcd) {
-+              /* Re-read multisession information using MSF format */
-+              stat = cdrom_read_tocentry(drive, 0, 1, 1, (char *)&ms_tmp,
-+                                         sizeof(ms_tmp), sense);
-+              if (stat)
-+                      return stat;
-+
-               msf_from_bcd (&ms_tmp.ent.addr.msf);
-+              toc->last_session_lba = msf_to_lba(ms_tmp.ent.addr.msf.minute,
-+                                                 ms_tmp.ent.addr.msf.second,
-+                                                 ms_tmp.ent.addr.msf.frame);
-+      }
- #endif  /* not STANDARD_ATAPI */
--      toc->last_session_lba = msf_to_lba (ms_tmp.ent.addr.msf.minute,
--                                          ms_tmp.ent.addr.msf.second,
--                                          ms_tmp.ent.addr.msf.frame);
--
-       toc->xa_flag = (ms_tmp.hdr.first_track != ms_tmp.hdr.last_track);
-       /* Now try to get the total cdrom capacity. */
-diff -Nur linux-2.4.29/drivers/isdn/hisax/ipacx.c linux-mips/drivers/isdn/hisax/ipacx.c
---- linux-2.4.29/drivers/isdn/hisax/ipacx.c    2002-11-29 00:53:13.000000000 +0100
-+++ linux-mips/drivers/isdn/hisax/ipacx.c      2005-03-26 11:47:21.653097971 +0100
-@@ -152,7 +152,13 @@
-               case (HW_RESET | REQUEST):
-               case (HW_ENABLE | REQUEST):
--                      ph_command(cs, IPACX_CMD_TIM);
-+                      if ((cs->dc.isac.ph_state == IPACX_IND_RES) ||
-+                      (cs->dc.isac.ph_state == IPACX_IND_DR) ||
-+                              (cs->dc.isac.ph_state == IPACX_IND_DC))
-+                              ph_command(cs, IPACX_CMD_TIM);
-+                      else
-+                              ph_command(cs, IPACX_CMD_RES);
-+
-                       break;
-               case (HW_INFO3 | REQUEST):
-diff -Nur linux-2.4.29/drivers/md/lvm-snap.c linux-mips/drivers/md/lvm-snap.c
---- linux-2.4.29/drivers/md/lvm-snap.c 2004-04-14 15:05:30.000000000 +0200
-+++ linux-mips/drivers/md/lvm-snap.c   2005-03-26 11:47:21.896058096 +0100
-@@ -119,7 +119,6 @@
-       unsigned long mask = lv->lv_snapshot_hash_mask;
-       int chunk_size = lv->lv_chunk_size;
-       lv_block_exception_t *ret;
--      int i = 0;
-       hash_table =
-           &hash_table[hashfn(org_dev, org_start, mask, chunk_size)];
-@@ -132,15 +131,9 @@
-               exception = list_entry(next, lv_block_exception_t, hash);
-               if (exception->rsector_org == org_start &&
-                   exception->rdev_org == org_dev) {
--                      if (i) {
--                              /* fun, isn't it? :) */
--                              list_del(next);
--                              list_add(next, hash_table);
--                      }
-                       ret = exception;
-                       break;
-               }
--              i++;
-       }
-       return ret;
- }
 diff -Nur linux-2.4.29/drivers/media/video/indycam.c linux-mips/drivers/media/video/indycam.c
 --- linux-2.4.29/drivers/media/video/indycam.c 2004-02-18 14:36:31.000000000 +0100
 +++ linux-mips/drivers/media/video/indycam.c   2004-12-09 21:32:05.000000000 +0100
@@ -17447,7 +13911,7 @@ diff -Nur linux-2.4.29/drivers/mtd/maps/Config.in linux-mips/drivers/mtd/maps/Co
        hex '    Physical start address of flash mapping' CONFIG_MTD_CSTM_MIPS_IXX_START 0x8000000
 diff -Nur linux-2.4.29/drivers/mtd/maps/db1x00-flash.c linux-mips/drivers/mtd/maps/db1x00-flash.c
 --- linux-2.4.29/drivers/mtd/maps/db1x00-flash.c       1970-01-01 01:00:00.000000000 +0100
-+++ linux-mips/drivers/mtd/maps/db1x00-flash.c 2005-03-26 11:47:22.085027082 +0100
++++ linux-mips/drivers/mtd/maps/db1x00-flash.c 2005-02-03 07:35:29.000000000 +0100
 @@ -0,0 +1,283 @@
 +/*
 + * Flash memory access on Alchemy Db1xxx boards
@@ -19876,729 +16340,6 @@ diff -Nur linux-2.4.29/drivers/net/defxx.h linux-mips/drivers/net/defxx.h
        struct pci_dev *                pci_dev;
        u32                             full_duplex_enb;                                /* FDDI Full Duplex enable (1 == on, 2 == off) */
        u32                             req_ttrt;                                       /* requested TTRT value (in 80ns units) */
-diff -Nur linux-2.4.29/drivers/net/e1000/e1000_ethtool.c linux-mips/drivers/net/e1000/e1000_ethtool.c
---- linux-2.4.29/drivers/net/e1000/e1000_ethtool.c     2005-01-19 15:09:56.000000000 +0100
-+++ linux-mips/drivers/net/e1000/e1000_ethtool.c       2005-03-26 11:47:31.355505582 +0100
-@@ -1309,7 +1309,7 @@
-       struct e1000_desc_ring *txdr = &adapter->test_tx_ring;
-       struct e1000_desc_ring *rxdr = &adapter->test_rx_ring;
-       struct pci_dev *pdev = adapter->pdev;
--      int i;
-+      int i, ret_val;
-       E1000_WRITE_REG(&adapter->hw, RDT, rxdr->count - 1);
-@@ -1329,11 +1329,12 @@
-                                           rxdr->buffer_info[i].length,
-                                           PCI_DMA_FROMDEVICE);
--              if (!e1000_check_lbtest_frame(rxdr->buffer_info[i++].skb, 1024))
--                      return 0;
--      } while (i < 64);
-+              ret_val = e1000_check_lbtest_frame(rxdr->buffer_info[i].skb,
-+                                                 1024);
-+              i++;
-+      } while (ret_val != 0 && i < 64);
--      return 13;
-+      return ret_val;
- }
- static int
-diff -Nur linux-2.4.29/drivers/net/e1000/e1000.h linux-mips/drivers/net/e1000/e1000.h
---- linux-2.4.29/drivers/net/e1000/e1000.h     2005-01-19 15:09:56.000000000 +0100
-+++ linux-mips/drivers/net/e1000/e1000.h       2005-03-26 11:47:30.488647853 +0100
-@@ -140,6 +140,7 @@
- #define E1000_RX_BUFFER_WRITE 16      /* Must be power of 2 */
- #define AUTO_ALL_MODES       0
-+#define E1000_EEPROM_82544_APM 0x0004
- #define E1000_EEPROM_APME    0x0400
- #ifndef E1000_MASTER_SLAVE
-@@ -211,6 +212,7 @@
-       /* TX */
-       struct e1000_desc_ring tx_ring;
-+      struct e1000_buffer previous_buffer_info;
-       spinlock_t tx_lock;
-       uint32_t txd_cmd;
-       uint32_t tx_int_delay;
-@@ -224,6 +226,7 @@
-       uint32_t tx_fifo_size;
-       atomic_t tx_fifo_stall;
-       boolean_t pcix_82544;
-+      boolean_t detect_tx_hung;
-       /* RX */
-       struct e1000_desc_ring rx_ring;
-diff -Nur linux-2.4.29/drivers/net/e1000/e1000_hw.c linux-mips/drivers/net/e1000/e1000_hw.c
---- linux-2.4.29/drivers/net/e1000/e1000_hw.c  2005-01-19 15:09:56.000000000 +0100
-+++ linux-mips/drivers/net/e1000/e1000_hw.c    2005-03-26 11:47:31.359504925 +0100
-@@ -1573,7 +1573,8 @@
-             if(mii_status_reg & MII_SR_LINK_STATUS) break;
-             msec_delay(100);
-         }
--        if((i == 0) && (hw->phy_type == e1000_phy_m88)) {
-+        if((i == 0) &&
-+           (hw->phy_type == e1000_phy_m88)) {
-             /* We didn't get link.  Reset the DSP and wait again for link. */
-             ret_val = e1000_phy_reset_dsp(hw);
-             if(ret_val) {
-@@ -2504,7 +2505,7 @@
-         }
-     }
--    ret_val = e1000_read_phy_reg_ex(hw, IGP01E1000_PHY_PAGE_SELECT & reg_addr,
-+    ret_val = e1000_read_phy_reg_ex(hw, MAX_PHY_REG_ADDRESS & reg_addr,
-                                     phy_data);
-     return ret_val;
-@@ -2610,7 +2611,7 @@
-         }
-     }
--    ret_val = e1000_write_phy_reg_ex(hw, IGP01E1000_PHY_PAGE_SELECT & reg_addr,
-+    ret_val = e1000_write_phy_reg_ex(hw, MAX_PHY_REG_ADDRESS & reg_addr,
-                                      phy_data);
-     return ret_val;
-@@ -2956,8 +2957,7 @@
-     /* Check polarity status */
-     ret_val = e1000_check_polarity(hw, &polarity);
-     if(ret_val)
--        return ret_val;
--
-+        return ret_val; 
-     phy_info->cable_polarity = polarity;
-     ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_STATUS, &phy_data);
-@@ -2967,9 +2967,9 @@
-     phy_info->mdix_mode = (phy_data & M88E1000_PSSR_MDIX) >>
-                           M88E1000_PSSR_MDIX_SHIFT;
--    if(phy_data & M88E1000_PSSR_1000MBS) {
--        /* Cable Length Estimation and Local/Remote Receiver Informatoion
--         * are only valid at 1000 Mbps
-+    if ((phy_data & M88E1000_PSSR_SPEED) == M88E1000_PSSR_1000MBS) {
-+        /* Cable Length Estimation and Local/Remote Receiver Information
-+         * are only valid at 1000 Mbps.
-          */
-         phy_info->cable_length = ((phy_data & M88E1000_PSSR_CABLE_LENGTH) >>
-                                   M88E1000_PSSR_CABLE_LENGTH_SHIFT);
-@@ -4641,41 +4641,44 @@
- {
-     uint32_t status;
--    if(hw->mac_type < e1000_82543) {
-+    switch (hw->mac_type) {
-+    case e1000_82542_rev2_0:
-+    case e1000_82542_rev2_1:
-         hw->bus_type = e1000_bus_type_unknown;
-         hw->bus_speed = e1000_bus_speed_unknown;
-         hw->bus_width = e1000_bus_width_unknown;
--        return;
--    }
--
--    status = E1000_READ_REG(hw, STATUS);
--    hw->bus_type = (status & E1000_STATUS_PCIX_MODE) ?
--                   e1000_bus_type_pcix : e1000_bus_type_pci;
-+        break;
-+    default:
-+        status = E1000_READ_REG(hw, STATUS);
-+        hw->bus_type = (status & E1000_STATUS_PCIX_MODE) ?
-+                       e1000_bus_type_pcix : e1000_bus_type_pci;
--    if(hw->device_id == E1000_DEV_ID_82546EB_QUAD_COPPER) {
--        hw->bus_speed = (hw->bus_type == e1000_bus_type_pci) ?
--                        e1000_bus_speed_66 : e1000_bus_speed_120;
--    } else if(hw->bus_type == e1000_bus_type_pci) {
--        hw->bus_speed = (status & E1000_STATUS_PCI66) ?
--                        e1000_bus_speed_66 : e1000_bus_speed_33;
--    } else {
--        switch (status & E1000_STATUS_PCIX_SPEED) {
--        case E1000_STATUS_PCIX_SPEED_66:
--            hw->bus_speed = e1000_bus_speed_66;
--            break;
--        case E1000_STATUS_PCIX_SPEED_100:
--            hw->bus_speed = e1000_bus_speed_100;
--            break;
--        case E1000_STATUS_PCIX_SPEED_133:
--            hw->bus_speed = e1000_bus_speed_133;
--            break;
--        default:
--            hw->bus_speed = e1000_bus_speed_reserved;
--            break;
-+        if(hw->device_id == E1000_DEV_ID_82546EB_QUAD_COPPER) {
-+            hw->bus_speed = (hw->bus_type == e1000_bus_type_pci) ?
-+                            e1000_bus_speed_66 : e1000_bus_speed_120;
-+        } else if(hw->bus_type == e1000_bus_type_pci) {
-+            hw->bus_speed = (status & E1000_STATUS_PCI66) ?
-+                            e1000_bus_speed_66 : e1000_bus_speed_33;
-+        } else {
-+            switch (status & E1000_STATUS_PCIX_SPEED) {
-+            case E1000_STATUS_PCIX_SPEED_66:
-+                hw->bus_speed = e1000_bus_speed_66;
-+                break;
-+            case E1000_STATUS_PCIX_SPEED_100:
-+                hw->bus_speed = e1000_bus_speed_100;
-+                break;
-+            case E1000_STATUS_PCIX_SPEED_133:
-+                hw->bus_speed = e1000_bus_speed_133;
-+                break;
-+            default:
-+                hw->bus_speed = e1000_bus_speed_reserved;
-+                break;
-+            }
-         }
-+        hw->bus_width = (status & E1000_STATUS_BUS64) ?
-+                        e1000_bus_width_64 : e1000_bus_width_32;
-+        break;
-     }
--    hw->bus_width = (status & E1000_STATUS_BUS64) ?
--                    e1000_bus_width_64 : e1000_bus_width_32;
- }
- /******************************************************************************
-  * Reads a value from one of the devices registers using port I/O (as opposed
-@@ -4740,6 +4743,7 @@
-     uint16_t agc_value = 0;
-     uint16_t cur_agc, min_agc = IGP01E1000_AGC_LENGTH_TABLE_SIZE;
-     uint16_t i, phy_data;
-+    uint16_t cable_length;
-     DEBUGFUNC("e1000_get_cable_length");
-@@ -4751,10 +4755,11 @@
-                                      &phy_data);
-         if(ret_val)
-             return ret_val;
-+        cable_length = (phy_data & M88E1000_PSSR_CABLE_LENGTH) >>
-+                       M88E1000_PSSR_CABLE_LENGTH_SHIFT;
-         /* Convert the enum value to ranged values */
--        switch((phy_data & M88E1000_PSSR_CABLE_LENGTH) >>
--               M88E1000_PSSR_CABLE_LENGTH_SHIFT) {
-+        switch (cable_length) {
-         case e1000_cable_length_50:
-             *min_length = 0;
-             *max_length = e1000_igp_cable_length_50;
-@@ -4921,8 +4926,7 @@
-             return ret_val;
-         hw->speed_downgraded = (phy_data & IGP01E1000_PLHR_SS_DOWNGRADE) ? 1 : 0;
--    }
--    else if(hw->phy_type == e1000_phy_m88) {
-+    } else if(hw->phy_type == e1000_phy_m88) {
-         ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_STATUS,
-                                      &phy_data);
-         if(ret_val)
-diff -Nur linux-2.4.29/drivers/net/e1000/e1000_hw.h linux-mips/drivers/net/e1000/e1000_hw.h
---- linux-2.4.29/drivers/net/e1000/e1000_hw.h  2005-01-19 15:09:56.000000000 +0100
-+++ linux-mips/drivers/net/e1000/e1000_hw.h    2005-03-26 11:47:31.362504433 +0100
-@@ -36,7 +36,6 @@
- #include "e1000_osdep.h"
--
- /* Forward declarations of structures used by the shared code */
- struct e1000_hw;
- struct e1000_hw_stats;
-@@ -370,6 +369,7 @@
- #define E1000_DEV_ID_82546GB_SERDES      0x107B
- #define E1000_DEV_ID_82546GB_PCIE        0x108A
- #define E1000_DEV_ID_82547EI             0x1019
-+
- #define NODE_ADDRESS_SIZE 6
- #define ETH_LENGTH_OF_ADDRESS 6
-@@ -1735,6 +1735,9 @@
- #define PHY_1000T_STATUS 0x0A /* 1000Base-T Status Reg */
- #define PHY_EXT_STATUS   0x0F /* Extended Status Reg */
-+#define MAX_PHY_REG_ADDRESS        0x1F  /* 5 bit address bus (0-0x1F) */
-+#define MAX_PHY_MULTI_PAGE_REG     0xF   /* Registers equal on all pages */
-+
- /* M88E1000 Specific Registers */
- #define M88E1000_PHY_SPEC_CTRL     0x10  /* PHY Specific Control Register */
- #define M88E1000_PHY_SPEC_STATUS   0x11  /* PHY Specific Status Register */
-@@ -1795,8 +1798,7 @@
- #define IGP01E1000_ANALOG_REGS_PAGE  0x20C0
--#define MAX_PHY_REG_ADDRESS 0x1F        /* 5 bit address bus (0-0x1F) */
--#define MAX_PHY_MULTI_PAGE_REG  0xF     /*Registers that are equal on all pages*/
-+
- /* PHY Control Register */
- #define MII_CR_SPEED_SELECT_MSB 0x0040  /* bits 6,13: 10=1000, 01=100, 00=10 */
- #define MII_CR_COLL_TEST_ENABLE 0x0080  /* Collision test enable */
-@@ -2099,7 +2101,11 @@
- #define IGP01E1000_ANALOG_FUSE_FINE_1               0x0080
- #define IGP01E1000_ANALOG_FUSE_FINE_10              0x0500
-+
- /* Bit definitions for valid PHY IDs. */
-+/* I = Integrated
-+ * E = External
-+ */
- #define M88E1000_E_PHY_ID  0x01410C50
- #define M88E1000_I_PHY_ID  0x01410C30
- #define M88E1011_I_PHY_ID  0x01410C20
-diff -Nur linux-2.4.29/drivers/net/e1000/e1000_main.c linux-mips/drivers/net/e1000/e1000_main.c
---- linux-2.4.29/drivers/net/e1000/e1000_main.c        2005-01-19 15:09:56.000000000 +0100
-+++ linux-mips/drivers/net/e1000/e1000_main.c  2005-03-26 11:47:31.364504105 +0100
-@@ -34,6 +34,14 @@
-  * - if_mii support and associated kcompat for older kernels
-  * - More errlogging support from Jon Mason <jonmason@us.ibm.com>
-  * - Fix TSO issues on PPC64 machines -- Jon Mason <jonmason@us.ibm.com>
-+ * 5.7.1      12/16/04
-+ * - Resurrect 82547EI/GI related fix in e1000_intr to avoid deadlocks. This
-+ *   fix was removed as it caused system instability. The suspected cause of 
-+ *   this is the called to e1000_irq_disable in e1000_intr. Inlined the 
-+ *   required piece of e1000_irq_disable into e1000_intr.
-+ * 5.7.0      12/10/04
-+ * - include fix to the condition that determines when to quit NAPI - Robert Olsson
-+ * - use netif_poll_{disable/enable} to synchronize between NAPI and i/f up/down
-  * 5.6.5      11/01/04
-  * - Enabling NETIF_F_SG without checksum offload is illegal - 
-      John Mason <jdmason@us.ibm.com>
-@@ -41,8 +49,13 @@
-  * - Remove redundant initialization - Jamal Hadi
-  * - Reset buffer_info->dma in tx resource cleanup logic
-  * 5.6.2      10/12/04
-+ * - Avoid filling tx_ring completely - shemminger@osdl.org
-+ * - Replace schedule_timeout() with msleep()/msleep_interruptible() -
-+ *   nacc@us.ibm.com
-  * - Sparse cleanup - shemminger@osdl.org
-  * - Fix tx resource cleanup logic
-+ * - LLTX support - ak@suse.de and hadi@cyberus.ca
-+ * - {set, get}_wol is now symmetric for 82545EM adapters
-  */
- char e1000_driver_name[] = "e1000";
-@@ -52,7 +65,7 @@
- #else
- #define DRIVERNAPI "-NAPI"
- #endif
--char e1000_driver_version[] = "5.6.10.1-k1"DRIVERNAPI;
-+char e1000_driver_version[] = "5.7.6-k1"DRIVERNAPI;
- char e1000_copyright[] = "Copyright (c) 1999-2004 Intel Corporation.";
- /* e1000_pci_tbl - PCI Device ID Table
-@@ -76,6 +89,7 @@
-       INTEL_E1000_ETHERNET_DEVICE(0x1011),
-       INTEL_E1000_ETHERNET_DEVICE(0x1012),
-       INTEL_E1000_ETHERNET_DEVICE(0x1013),
-+      INTEL_E1000_ETHERNET_DEVICE(0x1014),
-       INTEL_E1000_ETHERNET_DEVICE(0x1015),
-       INTEL_E1000_ETHERNET_DEVICE(0x1016),
-       INTEL_E1000_ETHERNET_DEVICE(0x1017),
-@@ -303,6 +317,9 @@
-       mod_timer(&adapter->watchdog_timer, jiffies);
-       e1000_irq_enable(adapter);
-+#ifdef CONFIG_E1000_NAPI
-+      netif_poll_enable(netdev);
-+#endif
-       return 0;
- }
-@@ -316,6 +333,10 @@
-       del_timer_sync(&adapter->tx_fifo_stall_timer);
-       del_timer_sync(&adapter->watchdog_timer);
-       del_timer_sync(&adapter->phy_info_timer);
-+
-+#ifdef CONFIG_E1000_NAPI
-+      netif_poll_disable(netdev);
-+#endif
-       adapter->link_speed = 0;
-       adapter->link_duplex = 0;
-       netif_carrier_off(netdev);
-@@ -409,6 +430,7 @@
-       int i;
-       int err;
-       uint16_t eeprom_data;
-+      uint16_t eeprom_apme_mask = E1000_EEPROM_APME;
-       if((err = pci_enable_device(pdev)))
-               return err;
-@@ -505,9 +527,6 @@
-       }
- #ifdef NETIF_F_TSO
--      /* Disbaled for now until root-cause is found for
--       * hangs reported against non-IA archs.  TSO can be
--       * enabled using ethtool -K eth<x> tso on */
-       if((adapter->hw.mac_type >= e1000_82544) &&
-          (adapter->hw.mac_type != e1000_82547))
-               netdev->features |= NETIF_F_TSO;
-@@ -576,6 +595,11 @@
-       case e1000_82542_rev2_1:
-       case e1000_82543:
-               break;
-+      case e1000_82544:
-+              e1000_read_eeprom(&adapter->hw,
-+                      EEPROM_INIT_CONTROL2_REG, 1, &eeprom_data);
-+              eeprom_apme_mask = E1000_EEPROM_82544_APM;
-+              break;
-       case e1000_82546:
-       case e1000_82546_rev_3:
-               if((E1000_READ_REG(&adapter->hw, STATUS) & E1000_STATUS_FUNC_1)
-@@ -590,7 +614,7 @@
-                       EEPROM_INIT_CONTROL3_PORT_A, 1, &eeprom_data);
-               break;
-       }
--      if(eeprom_data & E1000_EEPROM_APME)
-+      if(eeprom_data & eeprom_apme_mask)
-               adapter->wol |= E1000_WUFC_MAG;
-       /* reset the hardware with the new settings */
-@@ -797,6 +821,31 @@
- }
- /**
-+ * e1000_check_64k_bound - check that memory doesn't cross 64kB boundary
-+ * @adapter: address of board private structure
-+ * @begin: address of beginning of memory
-+ * @end: address of end of memory
-+ **/
-+static inline boolean_t
-+e1000_check_64k_bound(struct e1000_adapter *adapter,
-+                    void *start, unsigned long len)
-+{
-+      unsigned long begin = (unsigned long) start;
-+      unsigned long end = begin + len;
-+
-+      /* first rev 82545 and 82546 need to not allow any memory
-+       * write location to cross a 64k boundary due to errata 23 */
-+      if (adapter->hw.mac_type == e1000_82545 ||
-+          adapter->hw.mac_type == e1000_82546 ) {
-+
-+              /* check buffer doesn't cross 64kB */
-+              return ((begin ^ (end - 1)) >> 16) != 0 ? FALSE : TRUE;
-+      }
-+
-+      return TRUE;
-+}
-+
-+/**
-  * e1000_setup_tx_resources - allocate Tx resources (Descriptors)
-  * @adapter: board private structure
-  *
-@@ -826,11 +875,42 @@
-       txdr->desc = pci_alloc_consistent(pdev, txdr->size, &txdr->dma);
-       if(!txdr->desc) {
-+setup_tx_desc_die:
-               DPRINTK(PROBE, ERR, 
-               "Unable to Allocate Memory for the Transmit descriptor ring\n");
-               vfree(txdr->buffer_info);
-               return -ENOMEM;
-       }
-+
-+      /* fix for errata 23, cant cross 64kB boundary */
-+      if (!e1000_check_64k_bound(adapter, txdr->desc, txdr->size)) {
-+              void *olddesc = txdr->desc;
-+              dma_addr_t olddma = txdr->dma;
-+              DPRINTK(TX_ERR,ERR,"txdr align check failed: %u bytes at %p\n",
-+                      txdr->size, txdr->desc);
-+              /* try again, without freeing the previous */
-+              txdr->desc = pci_alloc_consistent(pdev, txdr->size, &txdr->dma);
-+              /* failed allocation, critial failure */
-+              if(!txdr->desc) {
-+                      pci_free_consistent(pdev, txdr->size, olddesc, olddma);
-+                      goto setup_tx_desc_die;
-+              }
-+
-+              if (!e1000_check_64k_bound(adapter, txdr->desc, txdr->size)) {
-+                      /* give up */
-+                      pci_free_consistent(pdev, txdr->size,
-+                           txdr->desc, txdr->dma);
-+                      pci_free_consistent(pdev, txdr->size, olddesc, olddma);
-+                      DPRINTK(PROBE, ERR,
-+                       "Unable to Allocate aligned Memory for the Transmit"
-+                       " descriptor ring\n");
-+                      vfree(txdr->buffer_info);
-+                      return -ENOMEM;
-+              } else {
-+                      /* free old, move on with the new one since its okay */
-+                      pci_free_consistent(pdev, txdr->size, olddesc, olddma);
-+              }
-+      }
-       memset(txdr->desc, 0, txdr->size);
-       txdr->next_to_use = 0;
-@@ -948,11 +1028,43 @@
-       rxdr->desc = pci_alloc_consistent(pdev, rxdr->size, &rxdr->dma);
-       if(!rxdr->desc) {
-+setup_rx_desc_die:
-               DPRINTK(PROBE, ERR, 
--              "Unable to Allocate Memory for the Recieve descriptor ring\n");
-+              "Unble to Allocate Memory for the Recieve descriptor ring\n");
-               vfree(rxdr->buffer_info);
-               return -ENOMEM;
-       }
-+
-+      /* fix for errata 23, cant cross 64kB boundary */
-+      if (!e1000_check_64k_bound(adapter, rxdr->desc, rxdr->size)) {
-+              void *olddesc = rxdr->desc;
-+              dma_addr_t olddma = rxdr->dma;
-+              DPRINTK(RX_ERR,ERR,
-+                      "rxdr align check failed: %u bytes at %p\n",
-+                      rxdr->size, rxdr->desc);
-+              /* try again, without freeing the previous */
-+              rxdr->desc = pci_alloc_consistent(pdev, rxdr->size, &rxdr->dma);
-+              /* failed allocation, critial failure */
-+              if(!rxdr->desc) {
-+                      pci_free_consistent(pdev, rxdr->size, olddesc, olddma);
-+                      goto setup_rx_desc_die;
-+              }
-+
-+              if (!e1000_check_64k_bound(adapter, rxdr->desc, rxdr->size)) {
-+                      /* give up */
-+                      pci_free_consistent(pdev, rxdr->size,
-+                           rxdr->desc, rxdr->dma);
-+                      pci_free_consistent(pdev, rxdr->size, olddesc, olddma);
-+                      DPRINTK(PROBE, ERR, 
-+                              "Unable to Allocate aligned Memory for the"
-+                              " Receive descriptor ring\n");
-+                      vfree(rxdr->buffer_info);
-+                      return -ENOMEM;
-+              } else {
-+                      /* free old, move on with the new one since its okay */
-+                      pci_free_consistent(pdev, rxdr->size, olddesc, olddma);
-+              }
-+      }
-       memset(rxdr->desc, 0, rxdr->size);
-       rxdr->next_to_clean = 0;
-@@ -1086,6 +1198,7 @@
-                       struct e1000_buffer *buffer_info)
- {
-       struct pci_dev *pdev = adapter->pdev;
-+
-       if(buffer_info->dma) {
-               pci_unmap_page(pdev,
-                              buffer_info->dma,
-@@ -1114,6 +1227,11 @@
-       /* Free all the Tx ring sk_buffs */
-+      if (likely(adapter->previous_buffer_info.skb != NULL)) {
-+              e1000_unmap_and_free_tx_resource(adapter, 
-+                              &adapter->previous_buffer_info);
-+      }
-+
-       for(i = 0; i < tx_ring->count; i++) {
-               buffer_info = &tx_ring->buffer_info[i];
-               e1000_unmap_and_free_tx_resource(adapter, buffer_info);
-@@ -1415,7 +1533,6 @@
-       struct e1000_adapter *adapter = (struct e1000_adapter *) data;
-       struct net_device *netdev = adapter->netdev;
-       struct e1000_desc_ring *txdr = &adapter->tx_ring;
--      unsigned int i;
-       uint32_t link;
-       e1000_check_for_link(&adapter->hw);
-@@ -1495,12 +1612,8 @@
-       /* Cause software interrupt to ensure rx ring is cleaned */
-       E1000_WRITE_REG(&adapter->hw, ICS, E1000_ICS_RXDMT0);
--      /* Early detection of hung controller */
--      i = txdr->next_to_clean;
--      if(txdr->buffer_info[i].dma &&
--         time_after(jiffies, txdr->buffer_info[i].time_stamp + HZ) &&
--         !(E1000_READ_REG(&adapter->hw, STATUS) & E1000_STATUS_TXOFF))
--              netif_stop_queue(netdev);
-+      /* Force detection of hung controller every watchdog period*/
-+      adapter->detect_tx_hung = TRUE;
-       /* Reset the timer */
-       mod_timer(&adapter->watchdog_timer, jiffies + 2 * HZ);
-@@ -2132,10 +2245,28 @@
-               __netif_rx_schedule(netdev);
-       }
- #else
-+      /* Writing IMC and IMS is needed for 82547.
-+         Due to Hub Link bus being occupied, an interrupt
-+         de-assertion message is not able to be sent.
-+         When an interrupt assertion message is generated later,
-+         two messages are re-ordered and sent out.
-+         That causes APIC to think 82547 is in de-assertion
-+         state, while 82547 is in assertion state, resulting
-+         in dead lock. Writing IMC forces 82547 into
-+         de-assertion state.
-+      */
-+      if(hw->mac_type == e1000_82547 || hw->mac_type == e1000_82547_rev_2){
-+              atomic_inc(&adapter->irq_sem);
-+              E1000_WRITE_REG(&adapter->hw, IMC, ~0);
-+      }
-+
-       for(i = 0; i < E1000_MAX_INTR; i++)
-               if(unlikely(!e1000_clean_rx_irq(adapter) &
-                  !e1000_clean_tx_irq(adapter)))
-                       break;
-+
-+      if(hw->mac_type == e1000_82547 || hw->mac_type == e1000_82547_rev_2)
-+              e1000_irq_enable(adapter);
- #endif
-       return IRQ_HANDLED;
-@@ -2155,24 +2286,21 @@
-       int tx_cleaned;
-       int work_done = 0;
-       
--      if (!netif_carrier_ok(netdev))
--              goto quit_polling;
--
-       tx_cleaned = e1000_clean_tx_irq(adapter);
-       e1000_clean_rx_irq(adapter, &work_done, work_to_do);
-       *budget -= work_done;
-       netdev->quota -= work_done;
-       
--      /* if no Rx and Tx cleanup work was done, exit the polling mode */
--      if(!tx_cleaned || (work_done < work_to_do) || 
-+      /* if no Tx and not enough Rx work done, exit the polling mode */
-+      if((!tx_cleaned && (work_done < work_to_do)) || 
-                               !netif_running(netdev)) {
--quit_polling: netif_rx_complete(netdev);
-+              netif_rx_complete(netdev);
-               e1000_irq_enable(adapter);
-               return 0;
-       }
--      return (work_done >= work_to_do);
-+      return 1;
- }
- #endif
-@@ -2196,11 +2324,34 @@
-       eop_desc = E1000_TX_DESC(*tx_ring, eop);
-       while(eop_desc->upper.data & cpu_to_le32(E1000_TXD_STAT_DD)) {
-+              /* pre-mature writeback of Tx descriptors     */
-+              /* clear (free buffers and unmap pci_mapping) */
-+              /* previous_buffer_info                       */
-+              if (likely(adapter->previous_buffer_info.skb != NULL)) {
-+                      e1000_unmap_and_free_tx_resource(adapter, 
-+                                      &adapter->previous_buffer_info);
-+              }
-+
-               for(cleaned = FALSE; !cleaned; ) {
-                       tx_desc = E1000_TX_DESC(*tx_ring, i);
-                       buffer_info = &tx_ring->buffer_info[i];
-+                      cleaned = (i == eop);
-+
-+                      /* pre-mature writeback of Tx descriptors */
-+                      /* save the cleaning of the this for the  */
-+                      /* next iteration                         */
-+                      if (cleaned) {
-+                              memcpy(&adapter->previous_buffer_info,
-+                                      buffer_info,
-+                                      sizeof(struct e1000_buffer));
-+                              memset(buffer_info,
-+                                      0,
-+                                      sizeof(struct e1000_buffer));
-+                      } else {
-+                              e1000_unmap_and_free_tx_resource(adapter, 
-+                                                      buffer_info);
-+                      }
--                      e1000_unmap_and_free_tx_resource(adapter, buffer_info);
-                       tx_desc->buffer_addr = 0;
-                       tx_desc->lower.data = 0;
-                       tx_desc->upper.data = 0;
-@@ -2222,6 +2373,16 @@
-               netif_wake_queue(netdev);
-       spin_unlock(&adapter->tx_lock);
-+ 
-+      if(adapter->detect_tx_hung) {
-+              /* detect a transmit hang in hardware, this serializes the
-+               * check with the clearing of time_stamp and movement of i */
-+              adapter->detect_tx_hung = FALSE;
-+              if(tx_ring->buffer_info[i].dma &&
-+                 time_after(jiffies, tx_ring->buffer_info[i].time_stamp + HZ) &&
-+                 !(E1000_READ_REG(&adapter->hw, STATUS) & E1000_STATUS_TXOFF))
-+                      netif_stop_queue(netdev);
-+      }
-       return cleaned;
- }
-@@ -2389,20 +2550,43 @@
-       struct e1000_buffer *buffer_info;
-       struct sk_buff *skb;
-       int reserve_len = 2;
--      unsigned int i;
-+      unsigned int i, bufsz;
-       i = rx_ring->next_to_use;
-       buffer_info = &rx_ring->buffer_info[i];
-       while(!buffer_info->skb) {
-+              bufsz = adapter->rx_buffer_len + reserve_len;
--              skb = dev_alloc_skb(adapter->rx_buffer_len + reserve_len);
--
-+              skb = dev_alloc_skb(bufsz);
-               if(unlikely(!skb)) {
-                       /* Better luck next round */
-                       break;
-               }
-+              /* fix for errata 23, cant cross 64kB boundary */
-+              if (!e1000_check_64k_bound(adapter, skb->data, bufsz)) {
-+                      struct sk_buff *oldskb = skb;
-+                      DPRINTK(RX_ERR,ERR,
-+                              "skb align check failed: %u bytes at %p\n",
-+                              bufsz, skb->data);
-+                      /* try again, without freeing the previous */
-+                      skb = dev_alloc_skb(bufsz);
-+                      if (!skb) {
-+                              dev_kfree_skb(oldskb);
-+                              break;
-+                      }
-+                      if (!e1000_check_64k_bound(adapter, skb->data, bufsz)) {
-+                              /* give up */
-+                              dev_kfree_skb(skb);
-+                              dev_kfree_skb(oldskb);
-+                              break; /* while !buffer_info->skb */
-+                      } else {
-+                              /* move on with the new one */
-+                              dev_kfree_skb(oldskb);
-+                      }
-+              }
-+
-               /* Make buffer alignment 2 beyond a 16 byte boundary
-                * this will result in a 16 byte aligned IP header after
-                * the 14 byte MAC header is removed
-@@ -2418,6 +2602,25 @@
-                                                 adapter->rx_buffer_len,
-                                                 PCI_DMA_FROMDEVICE);
-+              /* fix for errata 23, cant cross 64kB boundary */
-+              if(!e1000_check_64k_bound(adapter,
-+                                             (void *)(unsigned long)buffer_info->dma,
-+                                             adapter->rx_buffer_len)) {
-+                      DPRINTK(RX_ERR,ERR,
-+                              "dma align check failed: %u bytes at %ld\n",
-+                              adapter->rx_buffer_len, (unsigned long)buffer_info->dma);
-+
-+                      dev_kfree_skb(skb);
-+                      buffer_info->skb = NULL;
-+
-+                      pci_unmap_single(pdev,
-+                                       buffer_info->dma,
-+                                       adapter->rx_buffer_len,
-+                                       PCI_DMA_FROMDEVICE);
-+
-+                      break; /* while !buffer_info->skb */
-+              }
-+
-               rx_desc = E1000_RX_DESC(*rx_ring, i);
-               rx_desc->buffer_addr = cpu_to_le64(buffer_info->dma);
 diff -Nur linux-2.4.29/drivers/net/hamradio/hdlcdrv.c linux-mips/drivers/net/hamradio/hdlcdrv.c
 --- linux-2.4.29/drivers/net/hamradio/hdlcdrv.c        2002-02-25 20:37:59.000000000 +0100
 +++ linux-mips/drivers/net/hamradio/hdlcdrv.c  2004-05-04 14:04:27.000000000 +0200
@@ -20613,7 +16354,7 @@ diff -Nur linux-2.4.29/drivers/net/hamradio/hdlcdrv.c linux-mips/drivers/net/ham
        if (s->skb)
 diff -Nur linux-2.4.29/drivers/net/irda/au1k_ir.c linux-mips/drivers/net/irda/au1k_ir.c
 --- linux-2.4.29/drivers/net/irda/au1k_ir.c    2004-02-18 14:36:31.000000000 +0100
-+++ linux-mips/drivers/net/irda/au1k_ir.c      2005-03-26 11:47:31.367503613 +0100
++++ linux-mips/drivers/net/irda/au1k_ir.c      2005-02-03 07:35:29.000000000 +0100
 @@ -81,10 +81,6 @@
  
  #define RUN_AT(x) (jiffies + (x))
@@ -20625,2002 +16366,886 @@ diff -Nur linux-2.4.29/drivers/net/irda/au1k_ir.c linux-mips/drivers/net/irda/au
  static spinlock_t ir_lock = SPIN_LOCK_UNLOCKED;
  
  /*
-diff -Nur linux-2.4.29/drivers/net/sk98lin/skvpd.c linux-mips/drivers/net/sk98lin/skvpd.c
---- linux-2.4.29/drivers/net/sk98lin/skvpd.c   2004-04-14 15:05:30.000000000 +0200
-+++ linux-mips/drivers/net/sk98lin/skvpd.c     2005-03-26 11:47:31.369503284 +0100
-@@ -466,6 +466,15 @@
-       
-       pAC->vpd.vpd_size = vpd_size;
-+      /* Asus K8V Se Deluxe bugfix. Correct VPD content */
-+      /* MBo April 2004 */
-+      if( ((unsigned char)pAC->vpd.vpd_buf[0x3f] == 0x38) &&
-+          ((unsigned char)pAC->vpd.vpd_buf[0x40] == 0x3c) &&
-+          ((unsigned char)pAC->vpd.vpd_buf[0x41] == 0x45) ) {
-+              printk(KERN_INFO "sk98lin : humm... Asus mainboard with buggy VPD ? correcting data.\n");
-+              (unsigned char)pAC->vpd.vpd_buf[0x40] = 0x38;
-+      }
-+
-       /* find the end tag of the RO area */
-       if (!(r = vpd_find_para(pAC, VPD_RV, &rp))) {
-               SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_ERR | SK_DBGCAT_FATAL,
-diff -Nur linux-2.4.29/drivers/net/tg3.c linux-mips/drivers/net/tg3.c
---- linux-2.4.29/drivers/net/tg3.c     2005-01-19 15:09:56.000000000 +0100
-+++ linux-mips/drivers/net/tg3.c       2005-03-26 11:47:30.480649166 +0100
-@@ -59,8 +59,8 @@
- #define DRV_MODULE_NAME               "tg3"
- #define PFX DRV_MODULE_NAME   ": "
--#define DRV_MODULE_VERSION    "3.15"
--#define DRV_MODULE_RELDATE    "January 6, 2005"
-+#define DRV_MODULE_VERSION    "3.24"
-+#define DRV_MODULE_RELDATE    "March 4, 2005"
- #define TG3_DEF_MAC_MODE      0
- #define TG3_DEF_RX_MODE               0
-@@ -575,9 +575,10 @@
-       if (tp->tg3_flags2 & TG3_FLG2_NO_ETH_WIRE_SPEED)
-               return;
+diff -Nur linux-2.4.29/drivers/pci/pci.c linux-mips/drivers/pci/pci.c
+--- linux-2.4.29/drivers/pci/pci.c     2004-11-17 12:54:21.000000000 +0100
++++ linux-mips/drivers/pci/pci.c       2004-11-19 01:28:41.000000000 +0100
+@@ -1281,11 +1281,17 @@
+ {
+       unsigned int buses;
+       unsigned short cr;
++      unsigned short bctl;
+       struct pci_bus *child;
+       int is_cardbus = (dev->hdr_type == PCI_HEADER_TYPE_CARDBUS);
  
--      tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x7007);
--      tg3_readphy(tp, MII_TG3_AUX_CTRL, &val);
--      tg3_writephy(tp, MII_TG3_AUX_CTRL, (val | (1 << 15) | (1 << 4)));
-+      if (!tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x7007) &&
-+          !tg3_readphy(tp, MII_TG3_AUX_CTRL, &val))
-+              tg3_writephy(tp, MII_TG3_AUX_CTRL,
-+                           (val | (1 << 15) | (1 << 4)));
+       pci_read_config_dword(dev, PCI_PRIMARY_BUS, &buses);
+       DBG("Scanning behind PCI bridge %s, config %06x, pass %d\n", dev->slot_name, buses & 0xffffff, pass);
++      /* Disable MasterAbortMode during probing to avoid reporting
++           of bus errors (in some architectures) */
++      pci_read_config_word(dev, PCI_BRIDGE_CONTROL, &bctl);
++      pci_write_config_word(dev, PCI_BRIDGE_CONTROL, 
++                            bctl & ~PCI_BRIDGE_CTL_MASTER_ABORT);
+       if ((buses & 0xffff00) && !pcibios_assign_all_busses()) {
+               /*
+                * Bus already configured by firmware, process it in the first
+@@ -1351,6 +1357,7 @@
+               pci_write_config_byte(dev, PCI_SUBORDINATE_BUS, max);
+               pci_write_config_word(dev, PCI_COMMAND, cr);
+       }
++      pci_write_config_word(dev, PCI_BRIDGE_CONTROL, bctl);
+       sprintf(child->name, (is_cardbus ? "PCI CardBus #%02x" : "PCI Bus #%02x"), child->number);
+       return max;
  }
+diff -Nur linux-2.4.29/drivers/pcmcia/au1000_db1x00.c linux-mips/drivers/pcmcia/au1000_db1x00.c
+--- linux-2.4.29/drivers/pcmcia/au1000_db1x00.c        2005-01-19 15:09:57.000000000 +0100
++++ linux-mips/drivers/pcmcia/au1000_db1x00.c  2005-02-03 07:35:30.000000000 +0100
+@@ -1,6 +1,6 @@
+ /*
+  *
+- * Alchemy Semi Db1x00 boards specific pcmcia routines.
++ * AMD Alchemy DUAL-SLOT Db1x00 boards' specific pcmcia routines.
+  *
+  * Copyright 2002 MontaVista Software Inc.
+  * Author: MontaVista Software, Inc.
+@@ -54,9 +54,20 @@
+ #include <asm/au1000.h>
+ #include <asm/au1000_pcmcia.h>
  
- static int tg3_bmcr_reset(struct tg3 *tp)
-@@ -618,9 +619,10 @@
-       while (limit--) {
-               u32 tmp32;
--              tg3_readphy(tp, 0x16, &tmp32);
--              if ((tmp32 & 0x1000) == 0)
--                      break;
-+              if (!tg3_readphy(tp, 0x16, &tmp32)) {
-+                      if ((tmp32 & 0x1000) == 0)
-+                              break;
-+              }
-       }
-       if (limit <= 0)
-               return -EBUSY;
-@@ -672,9 +674,9 @@
-               for (i = 0; i < 6; i += 2) {
-                       u32 low, high;
--                      tg3_readphy(tp, MII_TG3_DSP_RW_PORT, &low);
--                      tg3_readphy(tp, MII_TG3_DSP_RW_PORT, &high);
--                      if (tg3_wait_macro_done(tp)) {
-+                      if (tg3_readphy(tp, MII_TG3_DSP_RW_PORT, &low) ||
-+                          tg3_readphy(tp, MII_TG3_DSP_RW_PORT, &high) ||
-+                          tg3_wait_macro_done(tp)) {
-                               *resetp = 1;
-                               return -EBUSY;
-                       }
-@@ -730,7 +732,9 @@
-               }
++#if defined(CONFIG_MIPS_PB1200)
++#include <asm/pb1200.h>
++#elif defined(CONFIG_MIPS_DB1200)
++#include <asm/db1200.h>
++#else
+ #include <asm/db1x00.h>
++#endif
  
-               /* Disable transmitter and interrupt.  */
--              tg3_readphy(tp, MII_TG3_EXT_CTRL, &reg32);
-+              if (tg3_readphy(tp, MII_TG3_EXT_CTRL, &reg32))
-+                      continue;
+-static BCSR * const bcsr = (BCSR *)BCSR_KSEG1_ADDR;
++#define PCMCIA_MAX_SOCK 1
++#define PCMCIA_NUM_SOCKS (PCMCIA_MAX_SOCK+1)
 +
-               reg32 |= 0x3000;
-               tg3_writephy(tp, MII_TG3_EXT_CTRL, reg32);
++/* VPP/VCC */
++#define SET_VCC_VPP(VCC, VPP, SLOT)\
++    ((((VCC)<<2) | ((VPP)<<0)) << ((SLOT)*8))
  
-@@ -739,7 +743,9 @@
-                            BMCR_FULLDPLX | TG3_BMCR_SPEED1000);
+ static int db1x00_pcmcia_init(struct pcmcia_init *init)
+ {
+@@ -76,7 +87,7 @@
+ db1x00_pcmcia_socket_state(unsigned sock, struct pcmcia_state *state)
+ {
+       u32 inserted;
+-      unsigned char vs;
++      u16 vs;
  
-               /* Set to master mode.  */
--              tg3_readphy(tp, MII_TG3_CTRL, &phy9_orig);
-+              if (tg3_readphy(tp, MII_TG3_CTRL, &phy9_orig))
-+                      continue;
-+
-               tg3_writephy(tp, MII_TG3_CTRL,
-                            (MII_TG3_CTRL_AS_MASTER |
-                             MII_TG3_CTRL_ENABLE_AS_MASTER));
-@@ -777,9 +783,11 @@
+       if(sock > PCMCIA_MAX_SOCK) return -1;
  
-       tg3_writephy(tp, MII_TG3_CTRL, phy9_orig);
--      tg3_readphy(tp, MII_TG3_EXT_CTRL, &reg32);
--      reg32 &= ~0x3000;
--      tg3_writephy(tp, MII_TG3_EXT_CTRL, reg32);
-+      if (!tg3_readphy(tp, MII_TG3_EXT_CTRL, &reg32)) {
-+              reg32 &= ~0x3000;
-+              tg3_writephy(tp, MII_TG3_EXT_CTRL, reg32);
-+      } else if (!err)
-+              err = -EBUSY;
+@@ -87,11 +98,11 @@
  
-       return err;
- }
-@@ -843,9 +851,9 @@
-               u32 phy_reg;
-               /* Set bit 14 with read-modify-write to preserve other bits */
--              tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x0007);
--              tg3_readphy(tp, MII_TG3_AUX_CTRL, &phy_reg);
--              tg3_writephy(tp, MII_TG3_AUX_CTRL, phy_reg | 0x4000);
-+              if (!tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x0007) &&
-+                  !tg3_readphy(tp, MII_TG3_AUX_CTRL, &phy_reg))
-+                      tg3_writephy(tp, MII_TG3_AUX_CTRL, phy_reg | 0x4000);
+       if (sock == 0) {
+               vs = bcsr->status & 0x3;
+-              inserted = !(bcsr->status & (1<<4));
++              inserted = BOARD_CARD_INSERTED(0);
        }
-       tg3_phy_set_wirespeed(tp);
-       return 0;
-@@ -877,7 +885,7 @@
-                             GRC_LCLCTRL_GPIO_OUTPUT1));
-                       udelay(100);
-               } else {
--                      int no_gpio2;
-+                      u32 no_gpio2;
-                       u32 grc_local_ctrl;
-                       if (tp_peer != tp &&
-@@ -885,8 +893,8 @@
-                               return;
-                       /* On 5753 and variants, GPIO2 cannot be used. */
--                      no_gpio2 = (tp->nic_sram_data_cfg &
--                                  NIC_SRAM_DATA_CFG_NO_GPIO2) != 0;
-+                      no_gpio2 = tp->nic_sram_data_cfg &
-+                                  NIC_SRAM_DATA_CFG_NO_GPIO2;
-                       grc_local_ctrl = GRC_LCLCTRL_GPIO_OE0 |
-                                        GRC_LCLCTRL_GPIO_OE1 |
-@@ -898,29 +906,17 @@
-                                                   GRC_LCLCTRL_GPIO_OUTPUT2);
-                       }
-                       tw32_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl |
--                             grc_local_ctrl);
-+                                              grc_local_ctrl);
-                       udelay(100);
--                      grc_local_ctrl = GRC_LCLCTRL_GPIO_OE0 |
--                                       GRC_LCLCTRL_GPIO_OE1 |
--                                       GRC_LCLCTRL_GPIO_OE2 |
--                                       GRC_LCLCTRL_GPIO_OUTPUT0 |
--                                       GRC_LCLCTRL_GPIO_OUTPUT1 |
--                                       GRC_LCLCTRL_GPIO_OUTPUT2;
--                      if (no_gpio2) {
--                              grc_local_ctrl &= ~(GRC_LCLCTRL_GPIO_OE2 |
--                                                  GRC_LCLCTRL_GPIO_OUTPUT2);
--                      }
-+                      grc_local_ctrl |= GRC_LCLCTRL_GPIO_OUTPUT0;
-+
-                       tw32_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl |
--                             grc_local_ctrl);
-+                                              grc_local_ctrl);
-                       udelay(100);
--                      grc_local_ctrl = GRC_LCLCTRL_GPIO_OE0 |
--                                       GRC_LCLCTRL_GPIO_OE1 |
--                                       GRC_LCLCTRL_GPIO_OE2 |
--                                       GRC_LCLCTRL_GPIO_OUTPUT0 |
--                                       GRC_LCLCTRL_GPIO_OUTPUT1;
-                       if (!no_gpio2) {
-+                              grc_local_ctrl &= ~GRC_LCLCTRL_GPIO_OUTPUT2;
-                               tw32_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl |
-                                      grc_local_ctrl);
-                               udelay(100);
-@@ -1240,7 +1236,7 @@
-       };
- }
--static int tg3_phy_copper_begin(struct tg3 *tp)
-+static void tg3_phy_copper_begin(struct tg3 *tp)
- {
-       u32 new_adv;
-       int i;
-@@ -1355,15 +1351,16 @@
-               if (tp->link_config.duplex == DUPLEX_FULL)
-                       bmcr |= BMCR_FULLDPLX;
--              tg3_readphy(tp, MII_BMCR, &orig_bmcr);
--              if (bmcr != orig_bmcr) {
-+              if (!tg3_readphy(tp, MII_BMCR, &orig_bmcr) &&
-+                  (bmcr != orig_bmcr)) {
-                       tg3_writephy(tp, MII_BMCR, BMCR_LOOPBACK);
-                       for (i = 0; i < 1500; i++) {
-                               u32 tmp;
-                               udelay(10);
--                              tg3_readphy(tp, MII_BMSR, &tmp);
--                              tg3_readphy(tp, MII_BMSR, &tmp);
-+                              if (tg3_readphy(tp, MII_BMSR, &tmp) ||
-+                                  tg3_readphy(tp, MII_BMSR, &tmp))
-+                                      continue;
-                               if (!(tmp & BMSR_LSTATUS)) {
-                                       udelay(40);
-                                       break;
-@@ -1376,8 +1373,6 @@
-               tg3_writephy(tp, MII_BMCR,
-                            BMCR_ANENABLE | BMCR_ANRESTART);
+       else {
+               vs = (bcsr->status & 0xC)>>2;
+-              inserted = !(bcsr->status & (1<<5));
++              inserted = BOARD_CARD_INSERTED(1);
        }
--
--      return 0;
- }
  
- static int tg3_init_5401phy_dsp(struct tg3 *tp)
-@@ -1412,7 +1407,9 @@
- {
-       u32 adv_reg, all_mask;
--      tg3_readphy(tp, MII_ADVERTISE, &adv_reg);
-+      if (tg3_readphy(tp, MII_ADVERTISE, &adv_reg))
-+              return 0;
-+
-       all_mask = (ADVERTISE_10HALF | ADVERTISE_10FULL |
-                   ADVERTISE_100HALF | ADVERTISE_100FULL);
-       if ((adv_reg & all_mask) != all_mask)
-@@ -1420,7 +1417,9 @@
-       if (!(tp->tg3_flags & TG3_FLAG_10_100_ONLY)) {
-               u32 tg3_ctrl;
--              tg3_readphy(tp, MII_TG3_CTRL, &tg3_ctrl);
-+              if (tg3_readphy(tp, MII_TG3_CTRL, &tg3_ctrl))
-+                      return 0;
-+
-               all_mask = (MII_TG3_CTRL_ADV_1000_HALF |
-                           MII_TG3_CTRL_ADV_1000_FULL);
-               if ((tg3_ctrl & all_mask) != all_mask)
-@@ -1460,8 +1459,8 @@
-            GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) &&
-           netif_carrier_ok(tp->dev)) {
-               tg3_readphy(tp, MII_BMSR, &bmsr);
--              tg3_readphy(tp, MII_BMSR, &bmsr);
--              if (!(bmsr & BMSR_LSTATUS))
-+              if (!tg3_readphy(tp, MII_BMSR, &bmsr) &&
-+                  !(bmsr & BMSR_LSTATUS))
-                       force_reset = 1;
-       }
-       if (force_reset)
-@@ -1469,9 +1468,8 @@
+       DEBUG(KERN_DEBUG "db1x00 socket %d: inserted %d, vs %d\n", 
+@@ -144,16 +155,9 @@
+       if(info->sock > PCMCIA_MAX_SOCK) return -1;
  
-       if ((tp->phy_id & PHY_ID_MASK) == PHY_ID_BCM5401) {
-               tg3_readphy(tp, MII_BMSR, &bmsr);
--              tg3_readphy(tp, MII_BMSR, &bmsr);
+       if(info->sock == 0)
+-#ifdef CONFIG_MIPS_DB1550
+-              info->irq = AU1000_GPIO_3;
++              info->irq = BOARD_PC0_INT;
+       else 
+-              info->irq = AU1000_GPIO_5;
+-#else
+-              info->irq = AU1000_GPIO_2;
+-      else 
+-              info->irq = AU1000_GPIO_5;
+-#endif
 -
--              if (!(tp->tg3_flags & TG3_FLAG_INIT_COMPLETE))
-+              if (tg3_readphy(tp, MII_BMSR, &bmsr) ||
-+                  !(tp->tg3_flags & TG3_FLAG_INIT_COMPLETE))
-                       bmsr = 0;
-               if (!(bmsr & BMSR_LSTATUS)) {
-@@ -1482,8 +1480,8 @@
-                       tg3_readphy(tp, MII_BMSR, &bmsr);
-                       for (i = 0; i < 1000; i++) {
-                               udelay(10);
--                              tg3_readphy(tp, MII_BMSR, &bmsr);
--                              if (bmsr & BMSR_LSTATUS) {
-+                              if (!tg3_readphy(tp, MII_BMSR, &bmsr) &&
-+                                  (bmsr & BMSR_LSTATUS)) {
-                                       udelay(40);
-                                       break;
-                               }
-@@ -1545,8 +1543,8 @@
-       bmsr = 0;
-       for (i = 0; i < 100; i++) {
-               tg3_readphy(tp, MII_BMSR, &bmsr);
--              tg3_readphy(tp, MII_BMSR, &bmsr);
--              if (bmsr & BMSR_LSTATUS)
-+              if (!tg3_readphy(tp, MII_BMSR, &bmsr) &&
-+                  (bmsr & BMSR_LSTATUS))
-                       break;
-               udelay(40);
-       }
-@@ -1557,8 +1555,8 @@
-               tg3_readphy(tp, MII_TG3_AUX_STAT, &aux_stat);
-               for (i = 0; i < 2000; i++) {
-                       udelay(10);
--                      tg3_readphy(tp, MII_TG3_AUX_STAT, &aux_stat);
--                      if (aux_stat)
-+                      if (!tg3_readphy(tp, MII_TG3_AUX_STAT, &aux_stat) &&
-+                          aux_stat)
-                               break;
-               }
-@@ -1569,7 +1567,8 @@
-               bmcr = 0;
-               for (i = 0; i < 200; i++) {
-                       tg3_readphy(tp, MII_BMCR, &bmcr);
--                      tg3_readphy(tp, MII_BMCR, &bmcr);
-+                      if (tg3_readphy(tp, MII_BMCR, &bmcr))
-+                              continue;
-                       if (bmcr && bmcr != 0x7fff)
-                               break;
-                       udelay(10);
-@@ -1606,10 +1605,13 @@
-           (tp->link_config.autoneg == AUTONEG_ENABLE)) {
-               u32 local_adv, remote_adv;
--              tg3_readphy(tp, MII_ADVERTISE, &local_adv);
-+              if (tg3_readphy(tp, MII_ADVERTISE, &local_adv))
-+                      local_adv = 0;
-               local_adv &= (ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM);
--              tg3_readphy(tp, MII_LPA, &remote_adv);
-+              if (tg3_readphy(tp, MII_LPA, &remote_adv))
-+                      remote_adv = 0;
-+
-               remote_adv &= (LPA_PAUSE_CAP | LPA_PAUSE_ASYM);
-               /* If we are not advertising full pause capability,
-@@ -1628,8 +1630,8 @@
-               tg3_phy_copper_begin(tp);
-               tg3_readphy(tp, MII_BMSR, &tmp);
--              tg3_readphy(tp, MII_BMSR, &tmp);
--              if (tmp & BMSR_LSTATUS)
-+              if (!tg3_readphy(tp, MII_BMSR, &tmp) &&
-+                  (tmp & BMSR_LSTATUS))
-                       current_link_up = 1;
-       }
-@@ -2130,8 +2132,9 @@
-               if (tr32(TG3PCI_DUAL_MAC_CTRL) & DUAL_MAC_CTRL_ID)
-                       port_a = 0;
--              serdes_cfg = tr32(MAC_SERDES_CFG) &
--                      ((1 << 23) | (1 << 22) | (1 << 21) | (1 << 20));
-+              /* preserve bits 0-11,13,14 for signal pre-emphasis */
-+              /* preserve bits 20-23 for voltage regulator */
-+              serdes_cfg = tr32(MAC_SERDES_CFG) & 0x00f06fff;
-       }
-       sg_dig_ctrl = tr32(SG_DIG_CTRL);
-@@ -2142,9 +2145,9 @@
-                               u32 val = serdes_cfg;
-                               if (port_a)
--                                      val |= 0xc010880;
-+                                      val |= 0xc010000;
-                               else
--                                      val |= 0x4010880;
-+                                      val |= 0x4010000;
-                               tw32_f(MAC_SERDES_CFG, val);
-                       }
-                       tw32_f(SG_DIG_CTRL, 0x01388400);
-@@ -2167,7 +2170,7 @@
-       if (sg_dig_ctrl != expected_sg_dig_ctrl) {
-               if (workaround)
--                      tw32_f(MAC_SERDES_CFG, serdes_cfg | 0xc011880);
-+                      tw32_f(MAC_SERDES_CFG, serdes_cfg | 0xc011000);
-               tw32_f(SG_DIG_CTRL, expected_sg_dig_ctrl | (1 << 30));
-               udelay(5);
-               tw32_f(SG_DIG_CTRL, expected_sg_dig_ctrl);
-@@ -2208,9 +2211,9 @@
-                                       u32 val = serdes_cfg;
-                                       if (port_a)
--                                              val |= 0xc010880;
-+                                              val |= 0xc010000;
-                                       else
--                                              val |= 0x4010880;
-+                                              val |= 0x4010000;
-                                       tw32_f(MAC_SERDES_CFG, val);
-                               }
-@@ -2218,8 +2221,12 @@
-                               tw32_f(SG_DIG_CTRL, 0x01388400);
-                               udelay(40);
-+                              /* Link parallel detection - link is up */
-+                              /* only if we have PCS_SYNC and not */
-+                              /* receiving config code words */
-                               mac_status = tr32(MAC_STATUS);
--                              if (mac_status & MAC_STATUS_PCS_SYNCED) {
-+                              if ((mac_status & MAC_STATUS_PCS_SYNCED) &&
-+                                  !(mac_status & MAC_STATUS_RCVD_CFG)) {
-                                       tg3_setup_flow_control(tp, 0, 0);
-                                       current_link_up = 1;
-                               }
-@@ -2690,7 +2697,11 @@
-               len = ((desc->idx_len & RXD_LEN_MASK) >> RXD_LEN_SHIFT) - 4; /* omit crc */
--              if (len > RX_COPY_THRESHOLD) {
-+              if (len > RX_COPY_THRESHOLD 
-+                      && tp->rx_offset == 2
-+                      /* rx_offset != 2 iff this is a 5701 card running
-+                       * in PCI-X mode [see tg3_get_invariants()] */
-+              ) {
-                       int skb_size;
-                       skb_size = tg3_alloc_rx_skb(tp, opaque_key,
-@@ -3085,11 +3096,19 @@
-               skb->nh.iph->check = 0;
-               skb->nh.iph->tot_len = ntohs(mss + ip_tcp_len + tcp_opt_len);
--              skb->h.th->check = ~csum_tcpudp_magic(skb->nh.iph->saddr,
--                                                    skb->nh.iph->daddr,
--                                                    0, IPPROTO_TCP, 0);
-+              if (tp->tg3_flags2 & TG3_FLG2_HW_TSO) {
-+                      skb->h.th->check = 0;
-+                      base_flags &= ~TXD_FLAG_TCPUDP_CSUM;
-+              }
-+              else {
-+                      skb->h.th->check =
-+                              ~csum_tcpudp_magic(skb->nh.iph->saddr,
-+                                                 skb->nh.iph->daddr,
-+                                                 0, IPPROTO_TCP, 0);
-+              }
--              if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) {
-+              if ((tp->tg3_flags2 & TG3_FLG2_HW_TSO) ||
-+                  (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705)) {
-                       if (tcp_opt_len || skb->nh.iph->ihl > 5) {
-                               int tsflags;
-@@ -3156,7 +3175,7 @@
-                               would_hit_hwbug = entry + 1;
-                       }
--                      if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750)
-+                      if (tp->tg3_flags2 & TG3_FLG2_HW_TSO)
-                               tg3_set_txd(tp, entry, mapping, len,
-                                           base_flags, (i == last)|(mss << 1));
-                       else
-@@ -3655,8 +3674,9 @@
- /* tp->lock is held. */
- static void tg3_write_sig_pre_reset(struct tg3 *tp, int kind)
- {
--      tg3_write_mem(tp, NIC_SRAM_FIRMWARE_MBOX,
--                    NIC_SRAM_FIRMWARE_MBOX_MAGIC1);
-+      if (!(tp->tg3_flags2 & TG3_FLG2_SUN_570X))
-+              tg3_write_mem(tp, NIC_SRAM_FIRMWARE_MBOX,
-+                            NIC_SRAM_FIRMWARE_MBOX_MAGIC1);
-       if (tp->tg3_flags2 & TG3_FLG2_ASF_NEW_HANDSHAKE) {
-               switch (kind) {
-@@ -3860,19 +3880,20 @@
-               tw32_f(MAC_MODE, 0);
-       udelay(40);
--      /* Wait for firmware initialization to complete. */
--      for (i = 0; i < 100000; i++) {
--              tg3_read_mem(tp, NIC_SRAM_FIRMWARE_MBOX, &val);
--              if (val == ~NIC_SRAM_FIRMWARE_MBOX_MAGIC1)
--                      break;
--              udelay(10);
--      }
--      if (i >= 100000 &&
--          !(tp->tg3_flags2 & TG3_FLG2_SUN_570X)) {
--              printk(KERN_ERR PFX "tg3_reset_hw timed out for %s, "
--                     "firmware will not restart magic=%08x\n",
--                     tp->dev->name, val);
--              return -ENODEV;
-+      if (!(tp->tg3_flags2 & TG3_FLG2_SUN_570X)) {
-+              /* Wait for firmware initialization to complete. */
-+              for (i = 0; i < 100000; i++) {
-+                      tg3_read_mem(tp, NIC_SRAM_FIRMWARE_MBOX, &val);
-+                      if (val == ~NIC_SRAM_FIRMWARE_MBOX_MAGIC1)
-+                              break;
-+                      udelay(10);
-+              }
-+              if (i >= 100000) {
-+                      printk(KERN_ERR PFX "tg3_reset_hw timed out for %s, "
-+                             "firmware will not restart magic=%08x\n",
-+                             tp->dev->name, val);
-+                      return -ENODEV;
-+              }
-       }
-       if ((tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS) &&
-@@ -4747,7 +4768,7 @@
-       unsigned long cpu_base, cpu_scratch_base, cpu_scratch_size;
-       int err, i;
--      if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750)
-+      if (tp->tg3_flags2 & TG3_FLG2_HW_TSO)
-               return 0;
-       if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) {
-@@ -4831,9 +4852,8 @@
-               tw32(MAC_ADDR_0_LOW + (i * 8), addr_low);
-       }
--      if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5700 &&
--          GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5701 &&
--          GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5705) {
-+      if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703 ||
-+          GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704) {
-               for (i = 0; i < 12; i++) {
-                       tw32(MAC_EXTADDR_0_HIGH + (i * 8), addr_high);
-                       tw32(MAC_EXTADDR_0_LOW + (i * 8), addr_low);
-@@ -4879,7 +4899,8 @@
-                     (bdinfo_addr + TG3_BDINFO_MAXLEN_FLAGS),
-                      maxlen_flags);
--      if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5705)
-+      if ((GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5705) &&
-+          (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5750))
-               tg3_write_mem(tp,
-                             (bdinfo_addr + TG3_BDINFO_NIC_ADDR),
-                             nic_addr);
-@@ -5181,7 +5202,7 @@
-       }
++              info->irq = BOARD_PC1_INT;
+       return 0;
+ }
  
- #if TG3_TSO_SUPPORT != 0
--      if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750)
-+      if (tp->tg3_flags2 & TG3_FLG2_HW_TSO)
-               rdmac_mode |= (1 << 27);
- #endif
+diff -Nur linux-2.4.29/drivers/pcmcia/Config.in linux-mips/drivers/pcmcia/Config.in
+--- linux-2.4.29/drivers/pcmcia/Config.in      2004-02-18 14:36:31.000000000 +0100
++++ linux-mips/drivers/pcmcia/Config.in        2004-02-22 06:21:34.000000000 +0100
+@@ -30,16 +30,14 @@
+       dep_tristate '  M8xx support' CONFIG_PCMCIA_M8XX $CONFIG_PCMCIA
+    fi
+    if [ "$CONFIG_SOC_AU1X00" = "y" ]; then
+-      dep_tristate '  Au1x00 PCMCIA support' CONFIG_PCMCIA_AU1X00 $CONFIG_PCMCIA 
+-      if [ "$CONFIG_PCMCIA_AU1X00" != "n" ]; then
+-        bool '  Pb1x00 board support' CONFIG_PCMCIA_PB1X00
+-        bool '  Db1x00 board support' CONFIG_PCMCIA_DB1X00
+-        bool '  XXS1500 board support' CONFIG_PCMCIA_XXS1500
+-      fi
++      dep_tristate '  Au1x00 PCMCIA support' CONFIG_PCMCIA_AU1X00 $CONFIG_PCMCIA
+    fi
+    if [ "$CONFIG_SIBYTE_SB1xxx_SOC" = "y" ]; then
+       dep_bool '  SiByte PCMCIA support' CONFIG_PCMCIA_SIBYTE $CONFIG_PCMCIA $CONFIG_BLK_DEV_IDE_SIBYTE
+    fi
++   if [ "$CONFIG_VRC4171" = "y" -o "$CONFIG_VRC4171" = "m" ]; then
++      dep_tristate '  NEC VRC4171 Card Controllers support' CONFIG_PCMCIA_VRC4171 $CONFIG_PCMCIA
++   fi
+    if [ "$CONFIG_VRC4173" = "y" -o "$CONFIG_VRC4173" = "m" ]; then
+       dep_tristate '  NEC VRC4173 CARDU support' CONFIG_PCMCIA_VRC4173 $CONFIG_PCMCIA
+    fi
+diff -Nur linux-2.4.29/drivers/pcmcia/Makefile linux-mips/drivers/pcmcia/Makefile
+--- linux-2.4.29/drivers/pcmcia/Makefile       2004-02-18 14:36:31.000000000 +0100
++++ linux-mips/drivers/pcmcia/Makefile 2005-02-03 07:35:30.000000000 +0100
+@@ -61,9 +61,18 @@
  
-@@ -5331,7 +5352,7 @@
-       tw32(RCVDBDI_MODE, RCVDBDI_MODE_ENABLE | RCVDBDI_MODE_INV_RING_SZ);
-       tw32(SNDDATAI_MODE, SNDDATAI_MODE_ENABLE);
- #if TG3_TSO_SUPPORT != 0
--      if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750)
-+      if (tp->tg3_flags2 & TG3_FLG2_HW_TSO)
-               tw32(SNDDATAI_MODE, SNDDATAI_MODE_ENABLE | 0x8);
- #endif
-       tw32(SNDBDI_MODE, SNDBDI_MODE_ENABLE | SNDBDI_MODE_ATTN_ENABLE);
-@@ -5381,8 +5402,10 @@
-       udelay(10);
-       if (tp->tg3_flags2 & TG3_FLG2_PHY_SERDES) {
--              if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704) {
-+              if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704) &&
-+                      !(tp->tg3_flags2 & TG3_FLG2_SERDES_PREEMPHASIS)) {
-                       /* Set drive transmission level to 1.2V  */
-+                      /* only if the signal pre-emphasis bit is not set  */
-                       val = tr32(MAC_SERDES_CFG);
-                       val &= 0xfffff000;
-                       val |= 0x880;
-@@ -5411,9 +5434,10 @@
-               u32 tmp;
-               /* Clear CRC stats. */
--              tg3_readphy(tp, 0x1e, &tmp);
--              tg3_writephy(tp, 0x1e, tmp | 0x8000);
--              tg3_readphy(tp, 0x14, &tmp);
-+              if (!tg3_readphy(tp, 0x1e, &tmp)) {
-+                      tg3_writephy(tp, 0x1e, tmp | 0x8000);
-+                      tg3_readphy(tp, 0x14, &tmp);
-+              }
-       }
+ obj-$(CONFIG_PCMCIA_AU1X00)                   += au1x00_ss.o
+ au1000_ss-objs-y                              := au1000_generic.o
+-au1000_ss-objs-$(CONFIG_PCMCIA_PB1X00)                += au1000_pb1x00.o
+-au1000_ss-objs-$(CONFIG_PCMCIA_DB1X00)                += au1000_db1x00.o
+-au1000_ss-objs-$(CONFIG_PCMCIA_XXS1500)       += au1000_xxs1500.o
++au1000_ss-objs-$(CONFIG_MIPS_PB1000)          += au1000_pb1x00.o
++au1000_ss-objs-$(CONFIG_MIPS_PB1100)          += au1000_pb1x00.o
++au1000_ss-objs-$(CONFIG_MIPS_PB1500)          += au1000_pb1x00.o
++au1000_ss-objs-$(CONFIG_MIPS_PB1550)          += au1000_pb1550.o
++au1000_ss-objs-$(CONFIG_MIPS_PB1200)          += au1000_db1x00.o
++au1000_ss-objs-$(CONFIG_MIPS_DB1000)          += au1000_db1x00.o
++au1000_ss-objs-$(CONFIG_MIPS_DB1100)          += au1000_db1x00.o
++au1000_ss-objs-$(CONFIG_MIPS_DB1500)          += au1000_db1x00.o
++au1000_ss-objs-$(CONFIG_MIPS_DB1550)          += au1000_db1x00.o
++au1000_ss-objs-$(CONFIG_MIPS_DB1200)          += au1000_db1x00.o
++au1000_ss-objs-$(CONFIG_MIPS_HYDROGEN3)               += au1000_hydrogen3.o
++au1000_ss-objs-$(CONFIG_MIPS_XXS1500)                 += au1000_xxs1500.o
  
-       __tg3_set_rx_mode(tp->dev);
-@@ -6003,9 +6027,11 @@
-               u32 val;
-               spin_lock_irqsave(&tp->lock, flags);
--              tg3_readphy(tp, 0x1e, &val);
--              tg3_writephy(tp, 0x1e, val | 0x8000);
--              tg3_readphy(tp, 0x14, &val);
-+              if (!tg3_readphy(tp, 0x1e, &val)) {
-+                      tg3_writephy(tp, 0x1e, val | 0x8000);
-+                      tg3_readphy(tp, 0x14, &val);
-+              } else
-+                      val = 0;
-               spin_unlock_irqrestore(&tp->lock, flags);
+ obj-$(CONFIG_PCMCIA_SA1100)   += sa1100_cs.o
+ obj-$(CONFIG_PCMCIA_M8XX)     += m8xx_pcmcia.o
+@@ -89,6 +98,7 @@
+ sa1100_cs-objs-$(CONFIG_SA1100_XP860)         += sa1100_xp860.o sa1111_generic.o
+ sa1100_cs-objs-$(CONFIG_SA1100_YOPY)          += sa1100_yopy.o
  
-               tp->phy_crc_errors += val;
-@@ -6349,11 +6375,13 @@
++obj-$(CONFIG_PCMCIA_VRC4171)  += vrc4171_card.o
+ obj-$(CONFIG_PCMCIA_VRC4173)  += vrc4173_cardu.o
  
- static int tg3_get_eeprom_len(struct net_device *dev)
- {
--      return EEPROM_CHIP_SIZE;
-+      struct tg3 *tp = netdev_priv(dev);
+ include $(TOPDIR)/Rules.make
+diff -Nur linux-2.4.29/drivers/pcmcia/vrc4171_card.c linux-mips/drivers/pcmcia/vrc4171_card.c
+--- linux-2.4.29/drivers/pcmcia/vrc4171_card.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-mips/drivers/pcmcia/vrc4171_card.c   2004-01-19 16:54:58.000000000 +0100
+@@ -0,0 +1,886 @@
++/*
++ * vrc4171_card.c, NEC VRC4171 Card Controller driver for Socket Services.
++ *
++ * Copyright (C) 2003  Yoichi Yuasa <yuasa@hh.iij4u.or.jp>
++ *
++ *  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.
++ *
++ *  This program is distributed in the hope that it will be useful,
++ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
++ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ *  GNU General Public License for more details.
++ *
++ *  You should have received a copy of the GNU General Public License
++ *  along with this program; if not, write to the Free Software
++ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
++ */
++#include <linux/init.h>
++#include <linux/ioport.h>
++#include <linux/irq.h>
++#include <linux/module.h>
++#include <linux/spinlock.h>
++#include <linux/sched.h>
++#include <linux/types.h>
 +
-+      return tp->nvram_size;
- }
--static int tg3_nvram_read_using_eeprom(struct tg3 *tp,
--                                      u32 offset, u32 *val);
-+static int tg3_nvram_read(struct tg3 *tp, u32 offset, u32 *val);
++#include <asm/io.h>
++#include <asm/vr41xx/vrc4171.h>
 +
- static int tg3_get_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom, u8 *data)
- {
-       struct tg3 *tp = dev->priv;
-@@ -6365,10 +6393,7 @@
-       len = eeprom->len;
-       eeprom->len = 0;
--      ret = tg3_nvram_read_using_eeprom(tp, 0, &eeprom->magic);
--      if (ret)
--              return ret;
--      eeprom->magic = swab32(eeprom->magic);
-+      eeprom->magic = TG3_EEPROM_MAGIC;
-       if (offset & 3) {
-               /* adjustments to start on required 4 byte boundary */
-@@ -6378,9 +6403,10 @@
-                       /* i.e. offset=1 len=2 */
-                       b_count = len;
-               }
--              ret = tg3_nvram_read_using_eeprom(tp, offset-b_offset, &val);
-+              ret = tg3_nvram_read(tp, offset-b_offset, &val);
-               if (ret)
-                       return ret;
-+              val = cpu_to_le32(val);
-               memcpy(data, ((char*)&val) + b_offset, b_count);
-               len -= b_count;
-               offset += b_count;
-@@ -6390,12 +6416,13 @@
-       /* read bytes upto the last 4 byte boundary */
-       pd = &data[eeprom->len];
-       for (i = 0; i < (len - (len & 3)); i += 4) {
--              ret = tg3_nvram_read_using_eeprom(tp, offset + i, 
--                              (u32*)(pd + i));
-+              ret = tg3_nvram_read(tp, offset + i, &val);
-               if (ret) {
-                       eeprom->len += i;
-                       return ret;
-               }
-+              val = cpu_to_le32(val);
-+              memcpy(pd + i, &val, 4);
-       }
-       eeprom->len += i;
-@@ -6404,15 +6431,72 @@
-               pd = &data[eeprom->len];
-               b_count = len & 3;
-               b_offset = offset + len - b_count;
--              ret = tg3_nvram_read_using_eeprom(tp, b_offset, &val);
-+              ret = tg3_nvram_read(tp, b_offset, &val);
-               if (ret)
-                       return ret;
-+              val = cpu_to_le32(val);
-               memcpy(pd, ((char*)&val), b_count);
-               eeprom->len += b_count;
-       }
-       return 0;
- }
-+static int tg3_nvram_write_block(struct tg3 *tp, u32 offset, u32 len, u8 *buf); 
++#include <pcmcia/ss.h>
 +
-+static int tg3_set_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom, u8 *data)
-+{
-+      struct tg3 *tp = netdev_priv(dev);
-+      int ret;
-+      u32 offset, len, b_offset, odd_len, start, end;
-+      u8 *buf;
++#include "i82365.h"
 +
-+      if (eeprom->magic != TG3_EEPROM_MAGIC)
-+              return -EINVAL;
++MODULE_DESCRIPTION("NEC VRC4171 Card Controllers driver for Socket Services");
++MODULE_AUTHOR("Yoichi Yuasa <yuasa@hh.iij4u.or.jp>");
++MODULE_LICENSE("GPL");
 +
-+      offset = eeprom->offset;
-+      len = eeprom->len;
-+
-+      if ((b_offset = (offset & 3))) {
-+              /* adjustments to start on required 4 byte boundary */
-+              ret = tg3_nvram_read(tp, offset-b_offset, &start);
-+              if (ret)
-+                      return ret;
-+              start = cpu_to_le32(start);
-+              len += b_offset;
-+              offset &= ~3;
-+      }
++#define CARD_MAX_SLOTS                2
++#define CARD_SLOTA            0
++#define CARD_SLOTB            1
++#define CARD_SLOTB_OFFSET     0x40
 +
-+      odd_len = 0;
-+      if ((len & 3) && ((len > 4) || (b_offset == 0))) {
-+              /* adjustments to end on required 4 byte boundary */
-+              odd_len = 1;
-+              len = (len + 3) & ~3;
-+              ret = tg3_nvram_read(tp, offset+len-4, &end);
-+              if (ret)
-+                      return ret;
-+              end = cpu_to_le32(end);
-+      }
++#define CARD_MEM_START                0x10000000
++#define CARD_MEM_END          0x13ffffff
++#define CARD_MAX_MEM_OFFSET   0x3ffffff
++#define CARD_MAX_MEM_SPEED    1000
 +
-+      buf = data;
-+      if (b_offset || odd_len) {
-+              buf = kmalloc(len, GFP_KERNEL);
-+              if (buf == 0)
-+                      return -ENOMEM;
-+              if (b_offset)
-+                      memcpy(buf, &start, 4);
-+              if (odd_len)
-+                      memcpy(buf+len-4, &end, 4);
-+              memcpy(buf + b_offset, data, eeprom->len);
-+      }
++#define CARD_CONTROLLER_INDEX 0x03e0
++#define CARD_CONTROLLER_DATA  0x03e1
++#define CARD_CONTROLLER_SIZE  2
++ /* Power register */
++  #define VPP_GET_VCC         0x01
++  #define POWER_ENABLE                0x10
++ #define CARD_VOLTAGE_SENSE   0x1f
++  #define VCC_3VORXV_CAPABLE  0x00
++  #define VCC_XV_ONLY         0x01
++  #define VCC_3V_CAPABLE      0x02
++  #define VCC_5V_ONLY         0x03
++ #define CARD_VOLTAGE_SELECT  0x2f
++  #define VCC_3V              0x01
++  #define VCC_5V              0x00
++  #define VCC_XV              0x02
++  #define VCC_STATUS_3V               0x02
++  #define VCC_STATUS_5V               0x01
++  #define VCC_STATUS_XV               0x03
++ #define GLOBAL_CONTROL               0x1e
++  #define EXWRBK              0x04
++  #define IRQPM_EN            0x08
++  #define CLRPMIRQ            0x10
 +
-+      ret = tg3_nvram_write_block(tp, offset, len, buf);
++#define IO_MAX_MAPS   2
++#define MEM_MAX_MAPS  5
 +
-+      if (buf != data)
-+              kfree(buf);
++enum {
++      SLOTB_PROBE = 0,
++      SLOTB_NOPROBE_IO,
++      SLOTB_NOPROBE_MEM,
++      SLOTB_NOPROBE_ALL
++};
 +
-+      return ret;
-+}
++typedef struct vrc4171_socket {
++      int noprobe;
++      void (*handler)(void *, unsigned int);
++      void *info;
++      socket_cap_t cap;
++      spinlock_t event_lock;
++      uint16_t events;
++      struct socket_info_t *pcmcia_socket;
++      struct tq_struct tq_task;
++      char name[24];
++      int csc_irq;
++      int io_irq;
++} vrc4171_socket_t;
 +
- static int tg3_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
- {
-       struct tg3 *tp = netdev_priv(dev);
-@@ -6561,10 +6645,10 @@
-       int r;
-   
-       spin_lock_irq(&tp->lock);
--      tg3_readphy(tp, MII_BMCR, &bmcr);
--      tg3_readphy(tp, MII_BMCR, &bmcr);
-       r = -EINVAL;
--      if (bmcr & BMCR_ANENABLE) {
-+      tg3_readphy(tp, MII_BMCR, &bmcr);
-+      if (!tg3_readphy(tp, MII_BMCR, &bmcr) &&
-+          (bmcr & BMCR_ANENABLE)) {
-               tg3_writephy(tp, MII_BMCR, bmcr | BMCR_ANRESTART);
-               r = 0;
-       }
-@@ -6812,6 +6896,7 @@
-       .get_link               = ethtool_op_get_link,
-       .get_eeprom_len         = tg3_get_eeprom_len,
-       .get_eeprom             = tg3_get_eeprom,
-+      .set_eeprom             = tg3_set_eeprom,
-       .get_ringparam          = tg3_get_ringparam,
-       .set_ringparam          = tg3_set_ringparam,
-       .get_pauseparam         = tg3_get_pauseparam,
-@@ -6831,6 +6916,103 @@
-       .get_ethtool_stats      = tg3_get_ethtool_stats,
- };
-+static void __devinit tg3_get_eeprom_size(struct tg3 *tp)
-+{
-+      u32 cursize, val;
-+
-+      tp->nvram_size = EEPROM_CHIP_SIZE;
-+
-+      if (tg3_nvram_read(tp, 0, &val) != 0)
-+              return;
-+
-+      if (swab32(val) != TG3_EEPROM_MAGIC)
-+              return;
-+
-+      /*
-+       * Size the chip by reading offsets at increasing powers of two.
-+       * When we encounter our validation signature, we know the addressing
-+       * has wrapped around, and thus have our chip size.
-+       */
-+      cursize = 0x800;
-+
-+      while (cursize < tp->nvram_size) {
-+              if (tg3_nvram_read(tp, cursize, &val) != 0)
-+                      return;
-+
-+              if (swab32(val) == TG3_EEPROM_MAGIC)
-+                      break;
++static vrc4171_socket_t vrc4171_sockets[CARD_MAX_SLOTS];
++static int vrc4171_slotb = SLOTB_IS_NONE;
++static unsigned int vrc4171_irq;
++static uint16_t vrc4171_irq_mask = 0xdeb8;
 +
-+              cursize <<= 1;
-+      }
++extern struct socket_info_t *pcmcia_register_socket(int slot,
++                                                    struct pccard_operations *vtable,
++                                                    int use_bus_pm);
++extern void pcmcia_unregister_socket(struct socket_info_t *s);
 +
-+      tp->nvram_size = cursize;
-+}
-+              
-+static void __devinit tg3_get_nvram_size(struct tg3 *tp)
++static inline uint8_t exca_read_byte(int slot, uint8_t index)
 +{
-+      u32 val;
++      if (slot == CARD_SLOTB)
++              index += CARD_SLOTB_OFFSET;
 +
-+      if (tg3_nvram_read(tp, 0xf0, &val) == 0) {
-+              if (val != 0) {
-+                      tp->nvram_size = (val >> 16) * 1024;
-+                      return;
-+              }
-+      }
-+      tp->nvram_size = 0x20000;
++      outb(index, CARD_CONTROLLER_INDEX);
++      return inb(CARD_CONTROLLER_DATA);
 +}
 +
-+static void __devinit tg3_get_nvram_info(struct tg3 *tp)
++static inline uint16_t exca_read_word(int slot, uint8_t index)
 +{
-+      u32 nvcfg1;
-+
-+      nvcfg1 = tr32(NVRAM_CFG1);
-+      if (nvcfg1 & NVRAM_CFG1_FLASHIF_ENAB) {
-+              tp->tg3_flags2 |= TG3_FLG2_FLASH;
-+      }
-+      else {
-+              nvcfg1 &= ~NVRAM_CFG1_COMPAT_BYPASS;
-+              tw32(NVRAM_CFG1, nvcfg1);
-+      }
-+
-+      if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750) {
-+              switch (nvcfg1 & NVRAM_CFG1_VENDOR_MASK) {
-+                      case FLASH_VENDOR_ATMEL_FLASH_BUFFERED:
-+                              tp->nvram_jedecnum = JEDEC_ATMEL;
-+                              tp->nvram_pagesize = ATMEL_AT45DB0X1B_PAGE_SIZE;
-+                              tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED;
-+                              break;
-+                      case FLASH_VENDOR_ATMEL_FLASH_UNBUFFERED:
-+                              tp->nvram_jedecnum = JEDEC_ATMEL;
-+                              tp->nvram_pagesize = ATMEL_AT25F512_PAGE_SIZE;
-+                              break;
-+                      case FLASH_VENDOR_ATMEL_EEPROM:
-+                              tp->nvram_jedecnum = JEDEC_ATMEL;
-+                              tp->nvram_pagesize = ATMEL_AT24C512_CHIP_SIZE;
-+                              tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED;
-+                              break;
-+                      case FLASH_VENDOR_ST:
-+                              tp->nvram_jedecnum = JEDEC_ST;
-+                              tp->nvram_pagesize = ST_M45PEX0_PAGE_SIZE;
-+                              tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED;
-+                              break;
-+                      case FLASH_VENDOR_SAIFUN:
-+                              tp->nvram_jedecnum = JEDEC_SAIFUN;
-+                              tp->nvram_pagesize = SAIFUN_SA25F0XX_PAGE_SIZE;
-+                              break;
-+                      case FLASH_VENDOR_SST_SMALL:
-+                      case FLASH_VENDOR_SST_LARGE:
-+                              tp->nvram_jedecnum = JEDEC_SST;
-+                              tp->nvram_pagesize = SST_25VF0X0_PAGE_SIZE;
-+                              break;
-+              }
-+      }
-+      else {
-+              tp->nvram_jedecnum = JEDEC_ATMEL;
-+              tp->nvram_pagesize = ATMEL_AT45DB0X1B_PAGE_SIZE;
-+              tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED;
-+      }
-+}
++      uint16_t data;
 +
- /* Chips other than 5700/5701 use the NVRAM for fetching info. */
- static void __devinit tg3_nvram_init(struct tg3 *tp)
- {
-@@ -6855,32 +7037,27 @@
-       if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5700 &&
-           GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5701) {
--              u32 nvcfg1;
-+              tp->tg3_flags |= TG3_FLAG_NVRAM;
-               if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750) {
-                       u32 nvaccess = tr32(NVRAM_ACCESS);
--                      tw32_f(NVRAM_ACCESS, nvaccess | ACCESS_ENABLE);
-+                      tw32(NVRAM_ACCESS, nvaccess | ACCESS_ENABLE);
-               }
--              nvcfg1 = tr32(NVRAM_CFG1);
--
--              tp->tg3_flags |= TG3_FLAG_NVRAM;
--              if (nvcfg1 & NVRAM_CFG1_FLASHIF_ENAB) {
--                      if (nvcfg1 & NVRAM_CFG1_BUFFERED_MODE)
--                              tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED;
--              } else {
--                      nvcfg1 &= ~NVRAM_CFG1_COMPAT_BYPASS;
--                      tw32(NVRAM_CFG1, nvcfg1);
--              }
-+              tg3_get_nvram_info(tp);
-+              tg3_get_nvram_size(tp);
-               if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750) {
-                       u32 nvaccess = tr32(NVRAM_ACCESS);
--                      tw32_f(NVRAM_ACCESS, nvaccess & ~ACCESS_ENABLE);
-+                      tw32(NVRAM_ACCESS, nvaccess & ~ACCESS_ENABLE);
-               }
++      if (slot == CARD_SLOTB)
++              index += CARD_SLOTB_OFFSET;
 +
-       } else {
-               tp->tg3_flags &= ~(TG3_FLAG_NVRAM | TG3_FLAG_NVRAM_BUFFERED);
++      outb(index++, CARD_CONTROLLER_INDEX);
++      data = inb(CARD_CONTROLLER_DATA);
 +
-+              tg3_get_eeprom_size(tp);
-       }
- }
-@@ -6918,11 +7095,30 @@
-       return 0;
- }
--static int __devinit tg3_nvram_read(struct tg3 *tp,
--                                  u32 offset, u32 *val)
-+#define NVRAM_CMD_TIMEOUT 10000
++      outb(index, CARD_CONTROLLER_INDEX);
++      data |= ((uint16_t)inb(CARD_CONTROLLER_DATA)) << 8;
 +
-+static int tg3_nvram_exec_cmd(struct tg3 *tp, u32 nvram_cmd)
- {
-       int i;
-+      tw32(NVRAM_CMD, nvram_cmd);
-+      for (i = 0; i < NVRAM_CMD_TIMEOUT; i++) {
-+              udelay(10);
-+              if (tr32(NVRAM_CMD) & NVRAM_CMD_DONE) {
-+                      udelay(10);
-+                      break;
-+              }
-+      }
-+      if (i == NVRAM_CMD_TIMEOUT) {
-+              return -EBUSY;
-+      }
-+      return 0;
++      return data;
 +}
 +
-+static int tg3_nvram_read(struct tg3 *tp, u32 offset, u32 *val)
++static inline uint8_t exca_write_byte(int slot, uint8_t index, uint8_t data)
 +{
-+      int ret;
++      if (slot == CARD_SLOTB)
++              index += CARD_SLOTB_OFFSET;
 +
-       if (tp->tg3_flags2 & TG3_FLG2_SUN_570X) {
-               printk(KERN_ERR PFX "Attempt to do nvram_read on Sun 570X\n");
-               return -EINVAL;
-@@ -6931,10 +7127,14 @@
-       if (!(tp->tg3_flags & TG3_FLAG_NVRAM))
-               return tg3_nvram_read_using_eeprom(tp, offset, val);
--      if (tp->tg3_flags & TG3_FLAG_NVRAM_BUFFERED)
--              offset = ((offset / NVRAM_BUFFERED_PAGE_SIZE) <<
--                        NVRAM_BUFFERED_PAGE_POS) +
--                      (offset % NVRAM_BUFFERED_PAGE_SIZE);
-+      if ((tp->tg3_flags & TG3_FLAG_NVRAM_BUFFERED) &&
-+              (tp->tg3_flags2 & TG3_FLG2_FLASH) &&
-+              (tp->nvram_jedecnum == JEDEC_ATMEL)) {
-+
-+              offset = ((offset / tp->nvram_pagesize) <<
-+                        ATMEL_AT45DB0X1B_PAGE_POS) +
-+                      (offset % tp->nvram_pagesize);
-+      }
-       if (offset > NVRAM_ADDR_MSK)
-               return -EINVAL;
-@@ -6948,19 +7148,11 @@
-       }
-       tw32(NVRAM_ADDR, offset);
--      tw32(NVRAM_CMD,
--           NVRAM_CMD_RD | NVRAM_CMD_GO |
--           NVRAM_CMD_FIRST | NVRAM_CMD_LAST | NVRAM_CMD_DONE);
-+      ret = tg3_nvram_exec_cmd(tp, NVRAM_CMD_RD | NVRAM_CMD_GO |
-+              NVRAM_CMD_FIRST | NVRAM_CMD_LAST | NVRAM_CMD_DONE);
--      /* Wait for done bit to clear. */
--      for (i = 0; i < 1000; i++) {
--              udelay(10);
--              if (tr32(NVRAM_CMD) & NVRAM_CMD_DONE) {
--                      udelay(10);
--                      *val = swab32(tr32(NVRAM_RDDATA));
--                      break;
--              }
--      }
-+      if (ret == 0)
-+              *val = swab32(tr32(NVRAM_RDDATA));
-       tg3_nvram_unlock(tp);
-@@ -6970,10 +7162,268 @@
-               tw32_f(NVRAM_ACCESS, nvaccess & ~ACCESS_ENABLE);
-       }
--      if (i >= 1000)
--              return -EBUSY;
-+      return ret;
-+}
--      return 0;
-+static int tg3_nvram_write_block_using_eeprom(struct tg3 *tp,
-+                                  u32 offset, u32 len, u8 *buf)
-+{
-+      int i, j, rc = 0;
-+      u32 val;
++      outb(index, CARD_CONTROLLER_INDEX);
++      outb(data, CARD_CONTROLLER_DATA);
 +
-+      for (i = 0; i < len; i += 4) {
-+              u32 addr, data;
++      return data;
++}
 +
-+              addr = offset + i;
++static inline uint16_t exca_write_word(int slot, uint8_t index, uint16_t data)
++{
++      if (slot == CARD_SLOTB)
++              index += CARD_SLOTB_OFFSET;
 +
-+              memcpy(&data, buf + i, 4);
++      outb(index++, CARD_CONTROLLER_INDEX);
++      outb(data, CARD_CONTROLLER_DATA);
 +
-+              tw32(GRC_EEPROM_DATA, cpu_to_le32(data));
++      outb(index, CARD_CONTROLLER_INDEX);
++      outb((uint8_t)(data >> 8), CARD_CONTROLLER_DATA);
 +
-+              val = tr32(GRC_EEPROM_ADDR);
-+              tw32(GRC_EEPROM_ADDR, val | EEPROM_ADDR_COMPLETE);
++      return data;
++}
 +
-+              val &= ~(EEPROM_ADDR_ADDR_MASK | EEPROM_ADDR_DEVID_MASK |
-+                      EEPROM_ADDR_READ);
-+              tw32(GRC_EEPROM_ADDR, val |
-+                      (0 << EEPROM_ADDR_DEVID_SHIFT) |
-+                      (addr & EEPROM_ADDR_ADDR_MASK) |
-+                      EEPROM_ADDR_START |
-+                      EEPROM_ADDR_WRITE);
-+              
-+              for (j = 0; j < 10000; j++) {
-+                      val = tr32(GRC_EEPROM_ADDR);
++static inline int search_nonuse_irq(void)
++{
++      int i;
 +
-+                      if (val & EEPROM_ADDR_COMPLETE)
-+                              break;
-+                      udelay(100);
-+              }
-+              if (!(val & EEPROM_ADDR_COMPLETE)) {
-+                      rc = -EBUSY;
-+                      break;
++      for (i = 0; i < 16; i++) {
++              if (vrc4171_irq_mask & (1 << i)) {
++                      vrc4171_irq_mask &= ~(1 << i);
++                      return i;
 +              }
 +      }
 +
-+      return rc;
++      return -1;
 +}
 +
-+/* offset and length are dword aligned */
-+static int tg3_nvram_write_block_unbuffered(struct tg3 *tp, u32 offset, u32 len,
-+              u8 *buf)
++static int pccard_init(unsigned int slot)
 +{
-+      int ret = 0;
-+      u32 pagesize = tp->nvram_pagesize;
-+      u32 pagemask = pagesize - 1;
-+      u32 nvram_cmd;
-+      u8 *tmp;
++      vrc4171_socket_t *socket = &vrc4171_sockets[slot];
 +
-+      tmp = kmalloc(pagesize, GFP_KERNEL);
-+      if (tmp == NULL)
-+              return -ENOMEM;
++      socket->cap.features |= SS_CAP_PCCARD | SS_CAP_PAGE_REGS;
++      socket->cap.irq_mask = 0;
++      socket->cap.pci_irq = vrc4171_irq;
++      socket->cap.map_size = 0x1000;
++      socket->events = 0;
++      spin_lock_init(socket->event_lock);
++      socket->csc_irq = search_nonuse_irq();
++      socket->io_irq = search_nonuse_irq();
 +
-+      while (len) {
-+              int j;
-+              u32 phy_addr, page_off, size, nvaccess;
++      return 0;
++}
 +
-+              phy_addr = offset & ~pagemask;
-+      
-+              for (j = 0; j < pagesize; j += 4) {
-+                      if ((ret = tg3_nvram_read(tp, phy_addr + j,
-+                                              (u32 *) (tmp + j))))
-+                              break;
-+              }
-+              if (ret)
-+                      break;
++static int pccard_suspend(unsigned int slot)
++{
++      return -EINVAL;
++}
 +
-+              page_off = offset & pagemask;
-+              size = pagesize;
-+              if (len < size)
-+                      size = len;
++static int pccard_register_callback(unsigned int slot,
++                                    void (*handler)(void *, unsigned int),
++                                    void *info)
++{
++      vrc4171_socket_t *socket;
 +
-+              len -= size;
++      if (slot >= CARD_MAX_SLOTS)
++              return -EINVAL;
 +
-+              memcpy(tmp + page_off, buf, size);
++      socket = &vrc4171_sockets[slot];
 +
-+              offset = offset + (pagesize - page_off);
++      socket->handler = handler;
++      socket->info = info;
 +
-+              nvaccess = tr32(NVRAM_ACCESS);
-+              tw32_f(NVRAM_ACCESS, nvaccess | ACCESS_ENABLE);
++      if (handler)
++              MOD_INC_USE_COUNT;
++      else
++              MOD_DEC_USE_COUNT;
 +
-+              /*
-+               * Before we can erase the flash page, we need
-+               * to issue a special "write enable" command.
-+               */
-+              nvram_cmd = NVRAM_CMD_WREN | NVRAM_CMD_GO | NVRAM_CMD_DONE;
++      return 0;
++}
 +
-+              if (tg3_nvram_exec_cmd(tp, nvram_cmd))
-+                      break;
++static int pccard_inquire_socket(unsigned int slot, socket_cap_t *cap)
++{
++      vrc4171_socket_t *socket;
 +
-+              /* Erase the target page */
-+              tw32(NVRAM_ADDR, phy_addr);
++      if (slot >= CARD_MAX_SLOTS || cap == NULL)
++              return -EINVAL;
 +
-+              nvram_cmd = NVRAM_CMD_GO | NVRAM_CMD_DONE | NVRAM_CMD_WR |
-+                      NVRAM_CMD_FIRST | NVRAM_CMD_LAST | NVRAM_CMD_ERASE;
++      socket = &vrc4171_sockets[slot];
 +
-+              if (tg3_nvram_exec_cmd(tp, nvram_cmd))
-+                      break;
++      *cap = socket->cap;
 +
-+              /* Issue another write enable to start the write. */
-+              nvram_cmd = NVRAM_CMD_WREN | NVRAM_CMD_GO | NVRAM_CMD_DONE;
++      return 0;
++}
 +
-+              if (tg3_nvram_exec_cmd(tp, nvram_cmd))
-+                      break;
++static int pccard_get_status(unsigned int slot, u_int *value)
++{
++      uint8_t status, sense;
++      u_int val = 0;
 +
-+              for (j = 0; j < pagesize; j += 4) {
-+                      u32 data;
++      if (slot >= CARD_MAX_SLOTS || value == NULL)
++              return -EINVAL;
 +
-+                      data = *((u32 *) (tmp + j));
-+                      tw32(NVRAM_WRDATA, cpu_to_be32(data));
++      status = exca_read_byte(slot, I365_STATUS);
++      if (exca_read_byte(slot, I365_INTCTL) & I365_PC_IOCARD) {
++              if (status & I365_CS_STSCHG)
++                      val |= SS_STSCHG;
++      } else {
++              if (!(status & I365_CS_BVD1))
++                      val |= SS_BATDEAD;
++              else if ((status & (I365_CS_BVD1 | I365_CS_BVD2)) == I365_CS_BVD1)
++                      val |= SS_BATWARN;
++      }
++      if ((status & I365_CS_DETECT) == I365_CS_DETECT)
++              val |= SS_DETECT;
++      if (status & I365_CS_WRPROT)
++              val |= SS_WRPROT;
++      if (status & I365_CS_READY)
++              val |= SS_READY;
++      if (status & I365_CS_POWERON)
++              val |= SS_POWERON;
 +
-+                      tw32(NVRAM_ADDR, phy_addr + j);
++      sense = exca_read_byte(slot, CARD_VOLTAGE_SENSE);
++      switch (sense) {
++      case VCC_3VORXV_CAPABLE:
++              val |= SS_3VCARD | SS_XVCARD;
++              break;
++      case VCC_XV_ONLY:
++              val |= SS_XVCARD;
++              break;
++      case VCC_3V_CAPABLE:
++              val |= SS_3VCARD;
++              break;
++      default:
++              /* 5V only */
++              break;
++      }
 +
-+                      nvram_cmd = NVRAM_CMD_GO | NVRAM_CMD_DONE |
-+                              NVRAM_CMD_WR;
++      *value = val;
 +
-+                      if (j == 0)
-+                              nvram_cmd |= NVRAM_CMD_FIRST;
-+                      else if (j == (pagesize - 4))
-+                              nvram_cmd |= NVRAM_CMD_LAST;
++      return 0;
++}
 +
-+                      if ((ret = tg3_nvram_exec_cmd(tp, nvram_cmd)))
-+                              break;
-+              }
-+              if (ret)
-+                      break;
++static inline u_char get_Vcc_value(uint8_t voltage)
++{
++      switch (voltage) {
++      case VCC_STATUS_3V:
++              return 33;
++      case VCC_STATUS_5V:
++              return 50;
++      default:
++              break;
 +      }
 +
-+      nvram_cmd = NVRAM_CMD_WRDI | NVRAM_CMD_GO | NVRAM_CMD_DONE;
-+      tg3_nvram_exec_cmd(tp, nvram_cmd);
++      return 0;
++}
 +
-+      kfree(tmp);
++static inline u_char get_Vpp_value(uint8_t power, u_char Vcc)
++{
++      if ((power & 0x03) == 0x01 || (power & 0x03) == 0x02)
++              return Vcc;
 +
-+      return ret;
++      return 0;
 +}
 +
-+/* offset and length are dword aligned */
-+static int tg3_nvram_write_block_buffered(struct tg3 *tp, u32 offset, u32 len,
-+              u8 *buf)
++static int pccard_get_socket(unsigned int slot, socket_state_t *state)
 +{
-+      int i, ret = 0;
++      vrc4171_socket_t *socket;
++      uint8_t power, voltage, control, cscint;
 +
-+      for (i = 0; i < len; i += 4, offset += 4) {
-+              u32 data, page_off, phy_addr, nvram_cmd;
++      if (slot >= CARD_MAX_SLOTS || state == NULL)
++              return -EINVAL;
 +
-+              memcpy(&data, buf + i, 4);
-+              tw32(NVRAM_WRDATA, cpu_to_be32(data));
++      socket = &vrc4171_sockets[slot];
 +
-+              page_off = offset % tp->nvram_pagesize;
++      power = exca_read_byte(slot, I365_POWER);
++      voltage = exca_read_byte(slot, CARD_VOLTAGE_SELECT);
 +
-+              if ((tp->tg3_flags2 & TG3_FLG2_FLASH) &&
-+                      (tp->nvram_jedecnum == JEDEC_ATMEL)) {
++      state->Vcc = get_Vcc_value(voltage);
++      state->Vpp = get_Vpp_value(power, state->Vcc);
 +
-+                      phy_addr = ((offset / tp->nvram_pagesize) <<
-+                                  ATMEL_AT45DB0X1B_PAGE_POS) + page_off;
-+              }
-+              else {
-+                      phy_addr = offset;
-+              }
++      state->flags = 0;
++      if (power & POWER_ENABLE)
++              state->flags |= SS_PWR_AUTO;
++      if (power & I365_PWR_OUT)
++              state->flags |= SS_OUTPUT_ENA;
++
++      control = exca_read_byte(slot, I365_INTCTL);
++      if (control & I365_PC_IOCARD)
++              state->flags |= SS_IOCARD;
++      if (!(control & I365_PC_RESET))
++              state->flags |= SS_RESET;
++
++        cscint = exca_read_byte(slot, I365_CSCINT);
++      state->csc_mask = 0;
++      if (state->flags & SS_IOCARD) {
++              if (cscint & I365_CSC_STSCHG)
++                      state->flags |= SS_STSCHG;
++      } else {
++              if (cscint & I365_CSC_BVD1)  
++                      state->csc_mask |= SS_BATDEAD;
++              if (cscint & I365_CSC_BVD2)  
++                      state->csc_mask |= SS_BATWARN;
++      }
++      if (cscint & I365_CSC_READY)
++              state->csc_mask |= SS_READY;
++      if (cscint & I365_CSC_DETECT)
++              state->csc_mask |= SS_DETECT;
++
++      return 0;
++}
 +
-+              tw32(NVRAM_ADDR, phy_addr);
++static inline uint8_t set_Vcc_value(u_char Vcc)
++{
++      switch (Vcc) {
++      case 33:
++              return VCC_3V;
++      case 50:
++              return VCC_5V;
++      }
 +
-+              nvram_cmd = NVRAM_CMD_GO | NVRAM_CMD_DONE | NVRAM_CMD_WR;
++      /* Small voltage is chosen for safety. */
++      return VCC_3V;
++}
 +
-+              if ((page_off == 0) || (i == 0))
-+                      nvram_cmd |= NVRAM_CMD_FIRST;
-+              else if (page_off == (tp->nvram_pagesize - 4))
-+                      nvram_cmd |= NVRAM_CMD_LAST;
++static int pccard_set_socket(unsigned int slot, socket_state_t *state)
++{
++      vrc4171_socket_t *socket;
++      uint8_t voltage, power, control, cscint;
 +
-+              if (i == (len - 4))
-+                      nvram_cmd |= NVRAM_CMD_LAST;
++      if (slot >= CARD_MAX_SLOTS ||
++          (state->Vpp != state->Vcc && state->Vpp != 0) ||
++          (state->Vcc != 50 && state->Vcc != 33 && state->Vcc != 0))
++              return -EINVAL;
 +
-+              if ((tp->nvram_jedecnum == JEDEC_ST) &&
-+                      (nvram_cmd & NVRAM_CMD_FIRST)) {
++      socket = &vrc4171_sockets[slot];
 +
-+                      if ((ret = tg3_nvram_exec_cmd(tp,
-+                              NVRAM_CMD_WREN | NVRAM_CMD_GO |
-+                              NVRAM_CMD_DONE)))
++      spin_lock_irq(&socket->event_lock);
 +
-+                              break;
-+              }
-+              if (!(tp->tg3_flags2 & TG3_FLG2_FLASH)) {
-+                      /* We always do complete word writes to eeprom. */
-+                      nvram_cmd |= (NVRAM_CMD_FIRST | NVRAM_CMD_LAST);
-+              }
++      voltage = set_Vcc_value(state->Vcc);
++      exca_write_byte(slot, CARD_VOLTAGE_SELECT, voltage);
 +
-+              if ((ret = tg3_nvram_exec_cmd(tp, nvram_cmd)))
-+                      break;
++      power = POWER_ENABLE;
++      if (state->Vpp == state->Vcc)
++              power |= VPP_GET_VCC;
++      if (state->flags & SS_OUTPUT_ENA)
++              power |= I365_PWR_OUT;
++      exca_write_byte(slot, I365_POWER, power);
++
++      control = 0;
++      if (state->io_irq != 0)
++              control |= socket->io_irq;
++      if (state->flags & SS_IOCARD)
++              control |= I365_PC_IOCARD;
++      if (state->flags & SS_RESET)
++              control &= ~I365_PC_RESET;
++      else
++              control |= I365_PC_RESET;
++      exca_write_byte(slot, I365_INTCTL, control);
++
++        cscint = 0;
++        exca_write_byte(slot, I365_CSCINT, cscint);
++      exca_read_byte(slot, I365_CSC); /* clear CardStatus change */
++      if (state->csc_mask != 0)
++              cscint |= socket->csc_irq << 8;
++      if (state->flags & SS_IOCARD) {
++              if (state->csc_mask & SS_STSCHG)
++                      cscint |= I365_CSC_STSCHG;
++      } else {
++              if (state->csc_mask & SS_BATDEAD)
++                      cscint |= I365_CSC_BVD1;
++              if (state->csc_mask & SS_BATWARN)
++                      cscint |= I365_CSC_BVD2;
 +      }
-+      return ret;
++      if (state->csc_mask & SS_READY)
++              cscint |= I365_CSC_READY;
++      if (state->csc_mask & SS_DETECT)
++              cscint |= I365_CSC_DETECT;
++        exca_write_byte(slot, I365_CSCINT, cscint);
++
++      spin_unlock_irq(&socket->event_lock);
++
++      return 0;
 +}
 +
-+/* offset and length are dword aligned */
-+static int tg3_nvram_write_block(struct tg3 *tp, u32 offset, u32 len, u8 *buf)
++static int pccard_get_io_map(unsigned int slot, struct pccard_io_map *io)
 +{
-+      int ret;
++      vrc4171_socket_t *socket;
++      uint8_t ioctl, addrwin;
++      u_char map;
 +
-+      if (tp->tg3_flags2 & TG3_FLG2_SUN_570X) {
-+              printk(KERN_ERR PFX "Attempt to do nvram_write on Sun 570X\n");
++      if (slot >= CARD_MAX_SLOTS || io == NULL ||
++          io->map >= IO_MAX_MAPS)
 +              return -EINVAL;
-+      }
 +
-+      if (tp->tg3_flags & TG3_FLAG_EEPROM_WRITE_PROT) {
-+              tw32_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl |
-+                     GRC_LCLCTRL_GPIO_OE1);
-+              udelay(40);
-+      }
++      socket = &vrc4171_sockets[slot];
++      map = io->map;
 +
-+      if (!(tp->tg3_flags & TG3_FLAG_NVRAM)) {
-+              ret = tg3_nvram_write_block_using_eeprom(tp, offset, len, buf);
-+      }
-+      else {
-+              u32 grc_mode;
++      io->start = exca_read_word(slot, I365_IO(map)+I365_W_START);
++      io->stop = exca_read_word(slot, I365_IO(map)+I365_W_STOP);
 +
-+              tg3_nvram_lock(tp);
++      ioctl = exca_read_byte(slot, I365_IOCTL);
++      if (io->flags & I365_IOCTL_WAIT(map))
++              io->speed = 1;
++      else
++              io->speed = 0;
 +
-+              if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750) {
-+                      u32 nvaccess = tr32(NVRAM_ACCESS);
++      io->flags = 0;
++      if (ioctl & I365_IOCTL_16BIT(map))
++              io->flags |= MAP_16BIT;
++      if (ioctl & I365_IOCTL_IOCS16(map))
++              io->flags |= MAP_AUTOSZ;
++      if (ioctl & I365_IOCTL_0WS(map))
++              io->flags |= MAP_0WS;
 +
-+                      tw32(NVRAM_ACCESS, nvaccess | ACCESS_ENABLE);
++      addrwin = exca_read_byte(slot, I365_ADDRWIN);
++      if (addrwin & I365_ENA_IO(map))
++              io->flags |= MAP_ACTIVE;
 +
-+                      tw32(NVRAM_WRITE1, 0x406);
-+              }
++      return 0;
++}
 +
-+              grc_mode = tr32(GRC_MODE);
-+              tw32(GRC_MODE, grc_mode | GRC_MODE_NVRAM_WR_ENABLE);
++static int pccard_set_io_map(unsigned int slot, struct pccard_io_map *io)
++{
++      vrc4171_socket_t *socket;
++      uint8_t ioctl, addrwin;
++      u_char map;
 +
-+              if ((tp->tg3_flags & TG3_FLAG_NVRAM_BUFFERED) ||
-+                      !(tp->tg3_flags2 & TG3_FLG2_FLASH)) {
++      if (slot >= CARD_MAX_SLOTS ||
++          io == NULL || io->map >= IO_MAX_MAPS ||
++          io->start > 0xffff || io->stop > 0xffff || io->start > io->stop)
++              return -EINVAL;
 +
-+                      ret = tg3_nvram_write_block_buffered(tp, offset, len,
-+                              buf);
-+              }
-+              else {
-+                      ret = tg3_nvram_write_block_unbuffered(tp, offset, len,
-+                              buf);
-+              }
++      socket = &vrc4171_sockets[slot];
++      map = io->map;
 +
-+              grc_mode = tr32(GRC_MODE);
-+              tw32(GRC_MODE, grc_mode & ~GRC_MODE_NVRAM_WR_ENABLE);
++      addrwin = exca_read_byte(slot, I365_ADDRWIN);
++      if (addrwin & I365_ENA_IO(map)) {
++              addrwin &= ~I365_ENA_IO(map);
++              exca_write_byte(slot, I365_ADDRWIN, addrwin);
++      }
 +
-+              if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750) {
-+                      u32 nvaccess = tr32(NVRAM_ACCESS);
++      exca_write_word(slot, I365_IO(map)+I365_W_START, io->start);
++      exca_write_word(slot, I365_IO(map)+I365_W_STOP, io->stop);
 +
-+                      tw32(NVRAM_ACCESS, nvaccess & ~ACCESS_ENABLE);
-+              }
-+              tg3_nvram_unlock(tp);
-+      }
++      ioctl = 0;
++      if (io->speed > 0)
++              ioctl |= I365_IOCTL_WAIT(map);
++      if (io->flags & MAP_16BIT)
++              ioctl |= I365_IOCTL_16BIT(map);
++      if (io->flags & MAP_AUTOSZ)
++              ioctl |= I365_IOCTL_IOCS16(map);
++      if (io->flags & MAP_0WS)
++              ioctl |= I365_IOCTL_0WS(map);
++      exca_write_byte(slot, I365_IOCTL, ioctl);
 +
-+      if (tp->tg3_flags & TG3_FLAG_EEPROM_WRITE_PROT) {
-+              tw32_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl |
-+                     GRC_LCLCTRL_GPIO_OE1 | GRC_LCLCTRL_GPIO_OUTPUT1);
-+              udelay(40);
++      if (io->flags & MAP_ACTIVE) {
++              addrwin |= I365_ENA_IO(map);
++              exca_write_byte(slot, I365_ADDRWIN, addrwin);
 +      }
 +
-+      return ret;
- }
- struct subsys_tbl_ent {
-@@ -7047,11 +7497,19 @@
-       tg3_read_mem(tp, NIC_SRAM_DATA_SIG, &val);
-       if (val == NIC_SRAM_DATA_SIG_MAGIC) {
-               u32 nic_cfg, led_cfg;
--              u32 nic_phy_id, cfg2;
-+              u32 nic_phy_id, ver, cfg2 = 0;
-               tg3_read_mem(tp, NIC_SRAM_DATA_CFG, &nic_cfg);
-               tp->nic_sram_data_cfg = nic_cfg;
-+              tg3_read_mem(tp, NIC_SRAM_DATA_VER, &ver);
-+              ver >>= NIC_SRAM_DATA_VER_SHIFT;
-+              if ((GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5700) &&
-+                  (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5701) &&
-+                  (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5703) &&
-+                  (ver > 0) && (ver < 0x100))
-+                      tg3_read_mem(tp, NIC_SRAM_DATA_CFG_2, &cfg2);
-+
-               eeprom_signature_found = 1;
-               if ((nic_cfg & NIC_SRAM_DATA_CFG_PHY_TYPE_MASK) ==
-@@ -7070,8 +7528,7 @@
-                       eeprom_phy_id = 0;
-               if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750) {
--                      tg3_read_mem(tp, NIC_SRAM_DATA_CFG_2, &led_cfg);
--                      led_cfg &= (NIC_SRAM_DATA_CFG_LED_MODE_MASK |
-+                      led_cfg = cfg2 & (NIC_SRAM_DATA_CFG_LED_MODE_MASK |
-                                   SHASTA_EXT_LED_MODE_MASK);
-               } else
-                       led_cfg = nic_cfg & NIC_SRAM_DATA_CFG_LED_MODE_MASK;
-@@ -7116,9 +7573,8 @@
-                   tp->pdev->subsystem_vendor == PCI_VENDOR_ID_DELL)
-                       tp->led_ctrl = LED_CTRL_MODE_PHY_2;
--              if (((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703) ||
--                   (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704) ||
--                   (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705)) &&
-+              if ((GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5700) &&
-+                  (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5701) &&
-                   (nic_cfg & NIC_SRAM_DATA_CFG_EEPROM_WP))
-                       tp->tg3_flags |= TG3_FLAG_EEPROM_WRITE_PROT;
-@@ -7130,9 +7586,13 @@
-               if (nic_cfg & NIC_SRAM_DATA_CFG_FIBER_WOL)
-                       tp->tg3_flags |= TG3_FLAG_SERDES_WOL_CAP;
--              tg3_read_mem(tp, NIC_SRAM_DATA_PHY_ID, &cfg2);
-               if (cfg2 & (1 << 17))
-                       tp->tg3_flags2 |= TG3_FLG2_CAPACITIVE_COUPLING;
-+
-+              /* serdes signal pre-emphasis in register 0x590 set by */
-+              /* bootcode if bit 18 is set */
-+              if (cfg2 & (1 << 18))
-+                      tp->tg3_flags2 |= TG3_FLG2_SERDES_PREEMPHASIS;
-       }
-       /* Reading the PHY ID register can conflict with ASF
-@@ -7188,9 +7648,8 @@
-               u32 bmsr, adv_reg, tg3_ctrl;
-               tg3_readphy(tp, MII_BMSR, &bmsr);
--              tg3_readphy(tp, MII_BMSR, &bmsr);
--
--              if (bmsr & BMSR_LSTATUS)
-+              if (!tg3_readphy(tp, MII_BMSR, &bmsr) &&
-+                  (bmsr & BMSR_LSTATUS))
-                       goto skip_phy_reset;
-                   
-               err = tg3_phy_reset(tp);
-@@ -7414,6 +7873,9 @@
-       tp->pci_hdr_type     = (cacheline_sz_reg >> 16) & 0xff;
-       tp->pci_bist         = (cacheline_sz_reg >> 24) & 0xff;
-+      if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750)
-+              tp->tg3_flags2 |= TG3_FLG2_HW_TSO;
-+
-       if (pci_find_capability(tp->pdev, PCI_CAP_ID_EXP) != 0)
-               tp->tg3_flags2 |= TG3_FLG2_PCI_EXPRESS;
-@@ -8302,11 +8764,13 @@
-       }
- #if TG3_TSO_SUPPORT != 0
--      if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 ||
-+      if (tp->tg3_flags2 & TG3_FLG2_HW_TSO) {
-+              tp->tg3_flags2 |= TG3_FLG2_TSO_CAPABLE;
-+      }
-+      else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 ||
-           GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701 ||
-           tp->pci_chip_rev_id == CHIPREV_ID_5705_A0 ||
--          ((tp->tg3_flags & TG3_FLAG_ENABLE_ASF) != 0 &&
--           GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5750)) {
-+          (tp->tg3_flags & TG3_FLAG_ENABLE_ASF) != 0) {
-               tp->tg3_flags2 &= ~TG3_FLG2_TSO_CAPABLE;
-       } else {
-               tp->tg3_flags2 |= TG3_FLG2_TSO_CAPABLE;
-diff -Nur linux-2.4.29/drivers/net/tg3.h linux-mips/drivers/net/tg3.h
---- linux-2.4.29/drivers/net/tg3.h     2004-11-17 12:54:21.000000000 +0100
-+++ linux-mips/drivers/net/tg3.h       2005-03-26 11:47:30.485648346 +0100
-@@ -1274,6 +1274,7 @@
- #define  GRC_MODE_HOST_STACKUP                0x00010000
- #define  GRC_MODE_HOST_SENDBDS                0x00020000
- #define  GRC_MODE_NO_TX_PHDR_CSUM     0x00100000
-+#define  GRC_MODE_NVRAM_WR_ENABLE     0x00200000
- #define  GRC_MODE_NO_RX_PHDR_CSUM     0x00800000
- #define  GRC_MODE_IRQ_ON_TX_CPU_ATTN  0x01000000
- #define  GRC_MODE_IRQ_ON_RX_CPU_ATTN  0x02000000
-@@ -1366,6 +1367,8 @@
- #define  NVRAM_CMD_ERASE               0x00000040
- #define  NVRAM_CMD_FIRST               0x00000080
- #define  NVRAM_CMD_LAST                        0x00000100
-+#define  NVRAM_CMD_WREN                        0x00010000
-+#define  NVRAM_CMD_WRDI                        0x00020000
- #define NVRAM_STAT                    0x00007004
- #define NVRAM_WRDATA                  0x00007008
- #define NVRAM_ADDR                    0x0000700c
-@@ -1375,8 +1378,18 @@
- #define  NVRAM_CFG1_FLASHIF_ENAB       0x00000001
- #define  NVRAM_CFG1_BUFFERED_MODE      0x00000002
- #define  NVRAM_CFG1_PASS_THRU          0x00000004
-+#define  NVRAM_CFG1_STATUS_BITS                0x00000070
- #define  NVRAM_CFG1_BIT_BANG           0x00000008
-+#define  NVRAM_CFG1_FLASH_SIZE                 0x02000000
- #define  NVRAM_CFG1_COMPAT_BYPASS      0x80000000
-+#define  NVRAM_CFG1_VENDOR_MASK                0x03000003
-+#define  FLASH_VENDOR_ATMEL_EEPROM     0x02000000
-+#define  FLASH_VENDOR_ATMEL_FLASH_BUFFERED     0x02000003
-+#define  FLASH_VENDOR_ATMEL_FLASH_UNBUFFERED   0x00000003
-+#define  FLASH_VENDOR_ST                       0x03000001
-+#define  FLASH_VENDOR_SAIFUN           0x01000003
-+#define  FLASH_VENDOR_SST_SMALL                0x00000001
-+#define  FLASH_VENDOR_SST_LARGE                0x02000001
- #define NVRAM_CFG2                    0x00007018
- #define NVRAM_CFG3                    0x0000701c
- #define NVRAM_SWARB                   0x00007020
-@@ -1396,15 +1409,16 @@
- #define  SWARB_REQ1                    0x00002000
- #define  SWARB_REQ2                    0x00004000
- #define  SWARB_REQ3                    0x00008000
--#define    NVRAM_BUFFERED_PAGE_SIZE      264
--#define    NVRAM_BUFFERED_PAGE_POS       9
- #define NVRAM_ACCESS                  0x00007024
- #define  ACCESS_ENABLE                         0x00000001
- #define  ACCESS_WR_ENABLE              0x00000002
--/* 0x7024 --> 0x7400 unused */
-+#define NVRAM_WRITE1                  0x00007028
-+/* 0x702c --> 0x7400 unused */
- /* 0x7400 --> 0x8000 unused */
-+#define TG3_EEPROM_MAGIC              0x669955aa
-+
- /* 32K Window into NIC internal memory */
- #define NIC_SRAM_WIN_BASE             0x00008000
-@@ -1438,6 +1452,9 @@
- #define  NIC_SRAM_DATA_CFG_FIBER_WOL           0x00004000
- #define  NIC_SRAM_DATA_CFG_NO_GPIO2            0x00100000
-+#define NIC_SRAM_DATA_VER                     0x00000b5c
-+#define  NIC_SRAM_DATA_VER_SHIFT               16
-+
- #define NIC_SRAM_DATA_PHY_ID          0x00000b74
- #define  NIC_SRAM_DATA_PHY_ID1_MASK    0xffff0000
- #define  NIC_SRAM_DATA_PHY_ID2_MASK    0x0000ffff
-@@ -2090,6 +2107,9 @@
- #define TG3_FLG2_PHY_JUST_INITTED     0x00001000
- #define TG3_FLG2_PHY_SERDES           0x00002000
- #define TG3_FLG2_CAPACITIVE_COUPLING  0x00004000
-+#define TG3_FLG2_FLASH                        0x00008000
-+#define TG3_FLG2_HW_TSO                       0x00010000
-+#define TG3_FLG2_SERDES_PREEMPHASIS   0x00020000
-       u32                             split_mode_max_reqs;
- #define SPLIT_MODE_5704_MAX_REQ               3
-@@ -2164,6 +2184,34 @@
-       struct tg3_hw_stats             *hw_stats;
-       dma_addr_t                      stats_mapping;
-       struct tq_struct                reset_task;
-+
-+      u32                             nvram_size;
-+      u32                             nvram_pagesize;
-+      u32                             nvram_jedecnum;
-+
-+#define JEDEC_ATMEL                   0x1f
-+#define JEDEC_ST                      0x20
-+#define JEDEC_SAIFUN                  0x4f
-+#define JEDEC_SST                     0xbf
-+
-+#define ATMEL_AT24C64_CHIP_SIZE               (64 * 1024)
-+#define ATMEL_AT24C64_PAGE_SIZE               (32)
-+
-+#define ATMEL_AT24C512_CHIP_SIZE      (512 * 1024)
-+#define ATMEL_AT24C512_PAGE_SIZE      (128)
-+
-+#define ATMEL_AT45DB0X1B_PAGE_POS     9
-+#define ATMEL_AT45DB0X1B_PAGE_SIZE    264
-+
-+#define ATMEL_AT25F512_PAGE_SIZE      256
-+
-+#define ST_M45PEX0_PAGE_SIZE          256
-+
-+#define SAIFUN_SA25F0XX_PAGE_SIZE     256
-+
-+#define SST_25VF0X0_PAGE_SIZE         4098
++      return 0;
++}
 +
++static int pccard_get_mem_map(unsigned int slot, struct pccard_mem_map *mem)
++{
++      vrc4171_socket_t *socket;
++      uint8_t addrwin;
++      u_long start, stop;
++      u_int offset;
++      u_char map;
 +
- };
- #endif /* !(_T3_H) */
-diff -Nur linux-2.4.29/drivers/net/tulip/21142.c linux-mips/drivers/net/tulip/21142.c
---- linux-2.4.29/drivers/net/tulip/21142.c     2003-06-13 16:51:35.000000000 +0200
-+++ linux-mips/drivers/net/tulip/21142.c       2005-03-26 11:47:31.371502956 +0100
-@@ -14,8 +14,8 @@
- */
--#include "tulip.h"
- #include <linux/pci.h>
-+#include "tulip.h"
- #include <linux/delay.h>
-diff -Nur linux-2.4.29/drivers/net/tulip/eeprom.c linux-mips/drivers/net/tulip/eeprom.c
---- linux-2.4.29/drivers/net/tulip/eeprom.c    2003-06-13 16:51:35.000000000 +0200
-+++ linux-mips/drivers/net/tulip/eeprom.c      2005-03-26 11:47:31.372502792 +0100
-@@ -14,6 +14,7 @@
- */
-+#include <linux/pci.h>
- #include "tulip.h"
- #include <linux/init.h>
- #include <asm/unaligned.h>
-diff -Nur linux-2.4.29/drivers/net/tulip/interrupt.c linux-mips/drivers/net/tulip/interrupt.c
---- linux-2.4.29/drivers/net/tulip/interrupt.c 2003-06-13 16:51:35.000000000 +0200
-+++ linux-mips/drivers/net/tulip/interrupt.c   2005-03-26 11:47:31.372502792 +0100
-@@ -14,10 +14,10 @@
- */
-+#include <linux/pci.h>
- #include "tulip.h"
- #include <linux/config.h>
- #include <linux/etherdevice.h>
--#include <linux/pci.h>
- int tulip_rx_copybreak;
-diff -Nur linux-2.4.29/drivers/net/tulip/media.c linux-mips/drivers/net/tulip/media.c
---- linux-2.4.29/drivers/net/tulip/media.c     2003-06-13 16:51:35.000000000 +0200
-+++ linux-mips/drivers/net/tulip/media.c       2005-03-26 11:47:31.373502628 +0100
-@@ -18,6 +18,7 @@
- #include <linux/mii.h>
- #include <linux/init.h>
- #include <linux/delay.h>
-+#include <linux/pci.h>
- #include "tulip.h"
-diff -Nur linux-2.4.29/drivers/net/tulip/pnic2.c linux-mips/drivers/net/tulip/pnic2.c
---- linux-2.4.29/drivers/net/tulip/pnic2.c     2003-06-13 16:51:35.000000000 +0200
-+++ linux-mips/drivers/net/tulip/pnic2.c       2005-03-26 11:47:31.374502464 +0100
-@@ -76,8 +76,8 @@
--#include "tulip.h"
- #include <linux/pci.h>
-+#include "tulip.h"
- #include <linux/delay.h>
-diff -Nur linux-2.4.29/drivers/net/tulip/pnic.c linux-mips/drivers/net/tulip/pnic.c
---- linux-2.4.29/drivers/net/tulip/pnic.c      2003-06-13 16:51:35.000000000 +0200
-+++ linux-mips/drivers/net/tulip/pnic.c        2005-03-26 11:47:31.374502464 +0100
-@@ -15,6 +15,7 @@
- */
- #include <linux/kernel.h>
-+#include <linux/pci.h>
- #include "tulip.h"
-diff -Nur linux-2.4.29/drivers/net/tulip/timer.c linux-mips/drivers/net/tulip/timer.c
---- linux-2.4.29/drivers/net/tulip/timer.c     2004-08-08 01:26:05.000000000 +0200
-+++ linux-mips/drivers/net/tulip/timer.c       2005-03-26 11:47:31.375502300 +0100
-@@ -14,6 +14,7 @@
- */
-+#include <linux/pci.h>
- #include "tulip.h"
-diff -Nur linux-2.4.29/drivers/net/tulip/tulip_core.c linux-mips/drivers/net/tulip/tulip_core.c
---- linux-2.4.29/drivers/net/tulip/tulip_core.c        2004-08-08 01:26:05.000000000 +0200
-+++ linux-mips/drivers/net/tulip/tulip_core.c  2005-03-26 11:47:31.377501972 +0100
-@@ -20,8 +20,8 @@
- #include <linux/config.h>
- #include <linux/module.h>
--#include "tulip.h"
- #include <linux/pci.h>
-+#include "tulip.h"
- #include <linux/init.h>
- #include <linux/etherdevice.h>
- #include <linux/delay.h>
-diff -Nur linux-2.4.29/drivers/net/tulip/tulip.h linux-mips/drivers/net/tulip/tulip.h
---- linux-2.4.29/drivers/net/tulip/tulip.h     2002-11-29 00:53:14.000000000 +0100
-+++ linux-mips/drivers/net/tulip/tulip.h       2005-03-26 11:47:31.375502300 +0100
-@@ -146,6 +146,9 @@
-       TxIntr = 0x01,
- };
-+/* bit mask for CSR5 TX/RX process state */
-+#define CSR5_TS       0x00700000
-+#define CSR5_RS       0x000e0000
- enum tulip_mode_bits {
-       TxThreshold             = (1 << 22),
-@@ -484,9 +487,19 @@
-       u32 csr6 = inl(ioaddr + CSR6);
-       if (csr6 & RxTx) {
-+              unsigned i=1300/10;
-               outl(csr6 & ~RxTx, ioaddr + CSR6);
-               barrier();
--              (void) inl(ioaddr + CSR6); /* mmio sync */
-+              /* wait until in-flight frame completes.
-+               * Max time @ 10BT: 1500*8b/10Mbps == 1200us (+ 100us margin)
-+               * Typically expect this loop to end in < 50us on 100BT.
-+               */
-+              while (--i && (inl(ioaddr + CSR5) & (CSR5_TS|CSR5_RS))) 
-+                      udelay(10);
++      if (slot >= CARD_MAX_SLOTS || mem == NULL || mem->map >= MEM_MAX_MAPS)
++              return -EINVAL;
 +
-+              if (!i)
-+                      printk (KERN_DEBUG "%s: tulip_stop_rxtx() failed\n",
-+                                      tp->pdev->slot_name);
-       }
- }
-diff -Nur linux-2.4.29/drivers/pci/pci.c linux-mips/drivers/pci/pci.c
---- linux-2.4.29/drivers/pci/pci.c     2004-11-17 12:54:21.000000000 +0100
-+++ linux-mips/drivers/pci/pci.c       2004-11-19 01:28:41.000000000 +0100
-@@ -1281,11 +1281,17 @@
- {
-       unsigned int buses;
-       unsigned short cr;
-+      unsigned short bctl;
-       struct pci_bus *child;
-       int is_cardbus = (dev->hdr_type == PCI_HEADER_TYPE_CARDBUS);
-       pci_read_config_dword(dev, PCI_PRIMARY_BUS, &buses);
-       DBG("Scanning behind PCI bridge %s, config %06x, pass %d\n", dev->slot_name, buses & 0xffffff, pass);
-+      /* Disable MasterAbortMode during probing to avoid reporting
-+           of bus errors (in some architectures) */
-+      pci_read_config_word(dev, PCI_BRIDGE_CONTROL, &bctl);
-+      pci_write_config_word(dev, PCI_BRIDGE_CONTROL, 
-+                            bctl & ~PCI_BRIDGE_CTL_MASTER_ABORT);
-       if ((buses & 0xffff00) && !pcibios_assign_all_busses()) {
-               /*
-                * Bus already configured by firmware, process it in the first
-@@ -1351,6 +1357,7 @@
-               pci_write_config_byte(dev, PCI_SUBORDINATE_BUS, max);
-               pci_write_config_word(dev, PCI_COMMAND, cr);
-       }
-+      pci_write_config_word(dev, PCI_BRIDGE_CONTROL, bctl);
-       sprintf(child->name, (is_cardbus ? "PCI CardBus #%02x" : "PCI Bus #%02x"), child->number);
-       return max;
- }
-diff -Nur linux-2.4.29/drivers/pci/quirks.c linux-mips/drivers/pci/quirks.c
---- linux-2.4.29/drivers/pci/quirks.c  2004-11-17 12:54:21.000000000 +0100
-+++ linux-mips/drivers/pci/quirks.c    2005-03-26 11:47:31.393499346 +0100
-@@ -368,9 +368,6 @@
-  * non-x86 architectures (yes Via exists on PPC among other places),
-  * we must mask the PCI_INTERRUPT_LINE value versus 0xf to get
-  * interrupts delivered properly.
-- *
-- * TODO: When we have device-specific interrupt routers,
-- * quirk_via_irqpic will go away from quirks.
-  */
- /*
-@@ -393,22 +390,6 @@
-               d->irq = irq;
- }
--static void __init quirk_via_irqpic(struct pci_dev *dev)
--{
--      u8 irq, new_irq = dev->irq & 0xf;
--
--      pci_read_config_byte(dev, PCI_INTERRUPT_LINE, &irq);
--
--      if (new_irq != irq) {
--              printk(KERN_INFO "PCI: Via IRQ fixup for %s, from %d to %d\n",
--                     dev->slot_name, irq, new_irq);
--
--              udelay(15);
--              pci_write_config_byte(dev, PCI_INTERRUPT_LINE, new_irq);
--      }
--}
--
--
- /*
-  * PIIX3 USB: We have to disable USB interrupts that are
-  * hardwired to PIRQD# and may be shared with an
-@@ -639,12 +620,14 @@
-  *    VIA northbridges care about PCI_INTERRUPT_LINE
-  */
-  
--int interrupt_line_quirk;
-+int via_interrupt_line_quirk;
- static void __init quirk_via_bridge(struct pci_dev *pdev)
- {
--      if(pdev->devfn == 0)
--              interrupt_line_quirk = 1;
-+      if(pdev->devfn == 0) {
-+              printk(KERN_INFO "PCI: Via IRQ fixup\n");
-+              via_interrupt_line_quirk = 1;
-+      }
- }
-       
- /* 
-@@ -773,9 +756,6 @@
- #endif
-       { PCI_FIXUP_HEADER,     PCI_VENDOR_ID_VIA,      PCI_DEVICE_ID_VIA_82C586_3,     quirk_via_acpi },
-       { PCI_FIXUP_HEADER,     PCI_VENDOR_ID_VIA,      PCI_DEVICE_ID_VIA_82C686_4,     quirk_via_acpi },
--      { PCI_FIXUP_FINAL,      PCI_VENDOR_ID_VIA,      PCI_DEVICE_ID_VIA_82C586_2,     quirk_via_irqpic },
--      { PCI_FIXUP_FINAL,      PCI_VENDOR_ID_VIA,      PCI_DEVICE_ID_VIA_82C686_5,     quirk_via_irqpic },
--      { PCI_FIXUP_FINAL,      PCI_VENDOR_ID_VIA,      PCI_DEVICE_ID_VIA_82C686_6,     quirk_via_irqpic },
-       { PCI_FIXUP_FINAL,      PCI_VENDOR_ID_AMD,      PCI_DEVICE_ID_AMD_VIPER_7410,   quirk_amd_ioapic },
-       { PCI_FIXUP_FINAL,      PCI_VENDOR_ID_AMD,      PCI_DEVICE_ID_AMD_FE_GATE_700C, quirk_amd_ordering },
-diff -Nur linux-2.4.29/drivers/pcmcia/au1000_db1x00.c linux-mips/drivers/pcmcia/au1000_db1x00.c
---- linux-2.4.29/drivers/pcmcia/au1000_db1x00.c        2005-01-19 15:09:57.000000000 +0100
-+++ linux-mips/drivers/pcmcia/au1000_db1x00.c  2005-03-26 11:47:31.434492618 +0100
-@@ -1,6 +1,6 @@
- /*
-  *
-- * Alchemy Semi Db1x00 boards specific pcmcia routines.
-+ * AMD Alchemy DUAL-SLOT Db1x00 boards' specific pcmcia routines.
-  *
-  * Copyright 2002 MontaVista Software Inc.
-  * Author: MontaVista Software, Inc.
-@@ -54,9 +54,20 @@
- #include <asm/au1000.h>
- #include <asm/au1000_pcmcia.h>
-+#if defined(CONFIG_MIPS_PB1200)
-+#include <asm/pb1200.h>
-+#elif defined(CONFIG_MIPS_DB1200)
-+#include <asm/db1200.h>
-+#else
- #include <asm/db1x00.h>
-+#endif
--static BCSR * const bcsr = (BCSR *)BCSR_KSEG1_ADDR;
-+#define PCMCIA_MAX_SOCK 1
-+#define PCMCIA_NUM_SOCKS (PCMCIA_MAX_SOCK+1)
++      socket = &vrc4171_sockets[slot];
++      map = mem->map;
 +
-+/* VPP/VCC */
-+#define SET_VCC_VPP(VCC, VPP, SLOT)\
-+    ((((VCC)<<2) | ((VPP)<<0)) << ((SLOT)*8))
- static int db1x00_pcmcia_init(struct pcmcia_init *init)
- {
-@@ -76,7 +87,7 @@
- db1x00_pcmcia_socket_state(unsigned sock, struct pcmcia_state *state)
- {
-       u32 inserted;
--      unsigned char vs;
-+      u16 vs;
-       if(sock > PCMCIA_MAX_SOCK) return -1;
-@@ -87,11 +98,11 @@
-       if (sock == 0) {
-               vs = bcsr->status & 0x3;
--              inserted = !(bcsr->status & (1<<4));
-+              inserted = BOARD_CARD_INSERTED(0);
-       }
-       else {
-               vs = (bcsr->status & 0xC)>>2;
--              inserted = !(bcsr->status & (1<<5));
-+              inserted = BOARD_CARD_INSERTED(1);
-       }
-       DEBUG(KERN_DEBUG "db1x00 socket %d: inserted %d, vs %d\n", 
-@@ -144,16 +155,9 @@
-       if(info->sock > PCMCIA_MAX_SOCK) return -1;
-       if(info->sock == 0)
--#ifdef CONFIG_MIPS_DB1550
--              info->irq = AU1000_GPIO_3;
-+              info->irq = BOARD_PC0_INT;
-       else 
--              info->irq = AU1000_GPIO_5;
--#else
--              info->irq = AU1000_GPIO_2;
--      else 
--              info->irq = AU1000_GPIO_5;
--#endif
--
-+              info->irq = BOARD_PC1_INT;
-       return 0;
- }
-diff -Nur linux-2.4.29/drivers/pcmcia/cistpl.c linux-mips/drivers/pcmcia/cistpl.c
---- linux-2.4.29/drivers/pcmcia/cistpl.c       2004-02-18 14:36:31.000000000 +0100
-+++ linux-mips/drivers/pcmcia/cistpl.c 2005-03-26 11:47:31.435492454 +0100
-@@ -140,7 +140,6 @@
-     } else {
-       u_int inc = 1;
-       if (attr) { mem->flags |= MAP_ATTRIB; inc++; addr *= 2; }
--      sys += (addr & (s->cap.map_size-1));
-       mem->card_start = addr & ~(s->cap.map_size-1);
-       while (len) {
-           set_cis_map(s, mem);
-diff -Nur linux-2.4.29/drivers/pcmcia/Config.in linux-mips/drivers/pcmcia/Config.in
---- linux-2.4.29/drivers/pcmcia/Config.in      2004-02-18 14:36:31.000000000 +0100
-+++ linux-mips/drivers/pcmcia/Config.in        2004-02-22 06:21:34.000000000 +0100
-@@ -30,16 +30,14 @@
-       dep_tristate '  M8xx support' CONFIG_PCMCIA_M8XX $CONFIG_PCMCIA
-    fi
-    if [ "$CONFIG_SOC_AU1X00" = "y" ]; then
--      dep_tristate '  Au1x00 PCMCIA support' CONFIG_PCMCIA_AU1X00 $CONFIG_PCMCIA 
--      if [ "$CONFIG_PCMCIA_AU1X00" != "n" ]; then
--        bool '  Pb1x00 board support' CONFIG_PCMCIA_PB1X00
--        bool '  Db1x00 board support' CONFIG_PCMCIA_DB1X00
--        bool '  XXS1500 board support' CONFIG_PCMCIA_XXS1500
--      fi
-+      dep_tristate '  Au1x00 PCMCIA support' CONFIG_PCMCIA_AU1X00 $CONFIG_PCMCIA
-    fi
-    if [ "$CONFIG_SIBYTE_SB1xxx_SOC" = "y" ]; then
-       dep_bool '  SiByte PCMCIA support' CONFIG_PCMCIA_SIBYTE $CONFIG_PCMCIA $CONFIG_BLK_DEV_IDE_SIBYTE
-    fi
-+   if [ "$CONFIG_VRC4171" = "y" -o "$CONFIG_VRC4171" = "m" ]; then
-+      dep_tristate '  NEC VRC4171 Card Controllers support' CONFIG_PCMCIA_VRC4171 $CONFIG_PCMCIA
-+   fi
-    if [ "$CONFIG_VRC4173" = "y" -o "$CONFIG_VRC4173" = "m" ]; then
-       dep_tristate '  NEC VRC4173 CARDU support' CONFIG_PCMCIA_VRC4173 $CONFIG_PCMCIA
-    fi
-diff -Nur linux-2.4.29/drivers/pcmcia/Makefile linux-mips/drivers/pcmcia/Makefile
---- linux-2.4.29/drivers/pcmcia/Makefile       2004-02-18 14:36:31.000000000 +0100
-+++ linux-mips/drivers/pcmcia/Makefile 2005-03-26 11:47:31.433492782 +0100
-@@ -61,9 +61,18 @@
- obj-$(CONFIG_PCMCIA_AU1X00)                   += au1x00_ss.o
- au1000_ss-objs-y                              := au1000_generic.o
--au1000_ss-objs-$(CONFIG_PCMCIA_PB1X00)                += au1000_pb1x00.o
--au1000_ss-objs-$(CONFIG_PCMCIA_DB1X00)                += au1000_db1x00.o
--au1000_ss-objs-$(CONFIG_PCMCIA_XXS1500)       += au1000_xxs1500.o
-+au1000_ss-objs-$(CONFIG_MIPS_PB1000)          += au1000_pb1x00.o
-+au1000_ss-objs-$(CONFIG_MIPS_PB1100)          += au1000_pb1x00.o
-+au1000_ss-objs-$(CONFIG_MIPS_PB1500)          += au1000_pb1x00.o
-+au1000_ss-objs-$(CONFIG_MIPS_PB1550)          += au1000_pb1550.o
-+au1000_ss-objs-$(CONFIG_MIPS_PB1200)          += au1000_db1x00.o
-+au1000_ss-objs-$(CONFIG_MIPS_DB1000)          += au1000_db1x00.o
-+au1000_ss-objs-$(CONFIG_MIPS_DB1100)          += au1000_db1x00.o
-+au1000_ss-objs-$(CONFIG_MIPS_DB1500)          += au1000_db1x00.o
-+au1000_ss-objs-$(CONFIG_MIPS_DB1550)          += au1000_db1x00.o
-+au1000_ss-objs-$(CONFIG_MIPS_DB1200)          += au1000_db1x00.o
-+au1000_ss-objs-$(CONFIG_MIPS_HYDROGEN3)               += au1000_hydrogen3.o
-+au1000_ss-objs-$(CONFIG_MIPS_XXS1500)                 += au1000_xxs1500.o
- obj-$(CONFIG_PCMCIA_SA1100)   += sa1100_cs.o
- obj-$(CONFIG_PCMCIA_M8XX)     += m8xx_pcmcia.o
-@@ -89,6 +98,7 @@
- sa1100_cs-objs-$(CONFIG_SA1100_XP860)         += sa1100_xp860.o sa1111_generic.o
- sa1100_cs-objs-$(CONFIG_SA1100_YOPY)          += sa1100_yopy.o
-+obj-$(CONFIG_PCMCIA_VRC4171)  += vrc4171_card.o
- obj-$(CONFIG_PCMCIA_VRC4173)  += vrc4173_cardu.o
- include $(TOPDIR)/Rules.make
-diff -Nur linux-2.4.29/drivers/pcmcia/vrc4171_card.c linux-mips/drivers/pcmcia/vrc4171_card.c
---- linux-2.4.29/drivers/pcmcia/vrc4171_card.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-mips/drivers/pcmcia/vrc4171_card.c   2004-01-19 16:54:58.000000000 +0100
-@@ -0,0 +1,886 @@
-+/*
-+ * vrc4171_card.c, NEC VRC4171 Card Controller driver for Socket Services.
-+ *
-+ * Copyright (C) 2003  Yoichi Yuasa <yuasa@hh.iij4u.or.jp>
-+ *
-+ *  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.
-+ *
-+ *  This program is distributed in the hope that it will be useful,
-+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ *  GNU General Public License for more details.
-+ *
-+ *  You should have received a copy of the GNU General Public License
-+ *  along with this program; if not, write to the Free Software
-+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-+ */
-+#include <linux/init.h>
-+#include <linux/ioport.h>
-+#include <linux/irq.h>
-+#include <linux/module.h>
-+#include <linux/spinlock.h>
-+#include <linux/sched.h>
-+#include <linux/types.h>
++      mem->flags = 0;
++      mem->speed = 0;
 +
-+#include <asm/io.h>
-+#include <asm/vr41xx/vrc4171.h>
++      addrwin = exca_read_byte(slot, I365_ADDRWIN);
++      if (addrwin & I365_ENA_MEM(map))
++              mem->flags |= MAP_ACTIVE;
 +
-+#include <pcmcia/ss.h>
++      start = exca_read_word(slot, I365_MEM(map)+I365_W_START);
++      if (start & I365_MEM_16BIT)
++              mem->flags |= MAP_16BIT;
++      mem->sys_start = (start & 0x3fffUL) << 12;
 +
-+#include "i82365.h"
++      stop = exca_read_word(slot, I365_MEM(map)+I365_W_STOP);
++      if (start & I365_MEM_WS0)
++              mem->speed += 1;
++      if (start & I365_MEM_WS1)
++              mem->speed += 2;
++      mem->sys_stop = ((stop & 0x3fffUL) << 12) + 0xfffUL;
 +
-+MODULE_DESCRIPTION("NEC VRC4171 Card Controllers driver for Socket Services");
-+MODULE_AUTHOR("Yoichi Yuasa <yuasa@hh.iij4u.or.jp>");
-+MODULE_LICENSE("GPL");
++      offset = exca_read_word(slot, I365_MEM(map)+I365_W_OFF);
++      if (offset & I365_MEM_REG)
++              mem->flags |= MAP_ATTRIB;
++      if (offset & I365_MEM_WRPROT)
++              mem->flags |= MAP_WRPROT;
++      mem->card_start = (offset & 0x3fffUL) << 12;
 +
-+#define CARD_MAX_SLOTS                2
-+#define CARD_SLOTA            0
-+#define CARD_SLOTB            1
-+#define CARD_SLOTB_OFFSET     0x40
++      mem->sys_start += CARD_MEM_START;
++      mem->sys_stop += CARD_MEM_START;
 +
-+#define CARD_MEM_START                0x10000000
-+#define CARD_MEM_END          0x13ffffff
-+#define CARD_MAX_MEM_OFFSET   0x3ffffff
-+#define CARD_MAX_MEM_SPEED    1000
++      return 0;
++}
 +
-+#define CARD_CONTROLLER_INDEX 0x03e0
-+#define CARD_CONTROLLER_DATA  0x03e1
-+#define CARD_CONTROLLER_SIZE  2
-+ /* Power register */
-+  #define VPP_GET_VCC         0x01
-+  #define POWER_ENABLE                0x10
-+ #define CARD_VOLTAGE_SENSE   0x1f
-+  #define VCC_3VORXV_CAPABLE  0x00
-+  #define VCC_XV_ONLY         0x01
-+  #define VCC_3V_CAPABLE      0x02
-+  #define VCC_5V_ONLY         0x03
-+ #define CARD_VOLTAGE_SELECT  0x2f
-+  #define VCC_3V              0x01
-+  #define VCC_5V              0x00
-+  #define VCC_XV              0x02
-+  #define VCC_STATUS_3V               0x02
-+  #define VCC_STATUS_5V               0x01
-+  #define VCC_STATUS_XV               0x03
-+ #define GLOBAL_CONTROL               0x1e
-+  #define EXWRBK              0x04
-+  #define IRQPM_EN            0x08
-+  #define CLRPMIRQ            0x10
++static int pccard_set_mem_map(unsigned int slot, struct pccard_mem_map *mem)
++{
++      vrc4171_socket_t *socket;
++      uint16_t start, stop, offset;
++      uint8_t addrwin;
++      u_char map;
 +
-+#define IO_MAX_MAPS   2
-+#define MEM_MAX_MAPS  5
++      if (slot >= CARD_MAX_SLOTS ||
++          mem == NULL || mem->map >= MEM_MAX_MAPS ||
++          mem->sys_start < CARD_MEM_START || mem->sys_start > CARD_MEM_END ||
++          mem->sys_stop < CARD_MEM_START || mem->sys_stop > CARD_MEM_END ||
++          mem->sys_start > mem->sys_stop ||
++          mem->card_start > CARD_MAX_MEM_OFFSET ||
++          mem->speed > CARD_MAX_MEM_SPEED)
++              return -EINVAL;
 +
-+enum {
-+      SLOTB_PROBE = 0,
-+      SLOTB_NOPROBE_IO,
-+      SLOTB_NOPROBE_MEM,
-+      SLOTB_NOPROBE_ALL
-+};
++      socket = &vrc4171_sockets[slot];
++      map = mem->map;
 +
-+typedef struct vrc4171_socket {
-+      int noprobe;
-+      void (*handler)(void *, unsigned int);
-+      void *info;
-+      socket_cap_t cap;
-+      spinlock_t event_lock;
-+      uint16_t events;
-+      struct socket_info_t *pcmcia_socket;
-+      struct tq_struct tq_task;
-+      char name[24];
-+      int csc_irq;
-+      int io_irq;
-+} vrc4171_socket_t;
++      addrwin = exca_read_byte(slot, I365_ADDRWIN);
++      if (addrwin & I365_ENA_MEM(map)) {
++              addrwin &= ~I365_ENA_MEM(map);
++              exca_write_byte(slot, I365_ADDRWIN, addrwin);
++      }
 +
-+static vrc4171_socket_t vrc4171_sockets[CARD_MAX_SLOTS];
-+static int vrc4171_slotb = SLOTB_IS_NONE;
-+static unsigned int vrc4171_irq;
-+static uint16_t vrc4171_irq_mask = 0xdeb8;
++      start = (mem->sys_start >> 12) & 0x3fff;
++      if (mem->flags & MAP_16BIT)
++              start |= I365_MEM_16BIT;
++      exca_write_word(slot, I365_MEM(map)+I365_W_START, start);
 +
-+extern struct socket_info_t *pcmcia_register_socket(int slot,
-+                                                    struct pccard_operations *vtable,
-+                                                    int use_bus_pm);
-+extern void pcmcia_unregister_socket(struct socket_info_t *s);
++      stop = (mem->sys_stop >> 12) & 0x3fff;
++      switch (mem->speed) {
++      case 0:
++              break;
++      case 1:
++              stop |= I365_MEM_WS0;
++              break;
++      case 2:
++              stop |= I365_MEM_WS1;
++              break;
++      default:
++              stop |= I365_MEM_WS0 | I365_MEM_WS1;
++              break;
++      }
++      exca_write_word(slot, I365_MEM(map)+I365_W_STOP, stop);
 +
-+static inline uint8_t exca_read_byte(int slot, uint8_t index)
-+{
-+      if (slot == CARD_SLOTB)
-+              index += CARD_SLOTB_OFFSET;
++      offset = (mem->card_start >> 12) & 0x3fff;
++      if (mem->flags & MAP_ATTRIB)
++              offset |= I365_MEM_REG;
++      if (mem->flags & MAP_WRPROT)
++              offset |= I365_MEM_WRPROT;
++      exca_write_word(slot, I365_MEM(map)+I365_W_OFF, offset);
 +
-+      outb(index, CARD_CONTROLLER_INDEX);
-+      return inb(CARD_CONTROLLER_DATA);
-+}
++      if (mem->flags & MAP_ACTIVE) {
++              addrwin |= I365_ENA_MEM(map);
++              exca_write_byte(slot, I365_ADDRWIN, addrwin);
++      }
 +
-+static inline uint16_t exca_read_word(int slot, uint8_t index)
-+{
-+      uint16_t data;
++      return 0;
++}
 +
-+      if (slot == CARD_SLOTB)
-+              index += CARD_SLOTB_OFFSET;
++static void pccard_proc_setup(unsigned int slot, struct proc_dir_entry *base)
++{          
++}
 +
-+      outb(index++, CARD_CONTROLLER_INDEX);
-+      data = inb(CARD_CONTROLLER_DATA);
++static struct pccard_operations vrc4171_pccard_operations = {
++      .init                   = pccard_init,
++      .suspend                = pccard_suspend,
++      .register_callback      = pccard_register_callback,
++      .inquire_socket         = pccard_inquire_socket,
++      .get_status             = pccard_get_status,
++      .get_socket             = pccard_get_socket,
++      .set_socket             = pccard_set_socket,
++      .get_io_map             = pccard_get_io_map,
++      .set_io_map             = pccard_set_io_map,
++      .get_mem_map            = pccard_get_mem_map,
++      .set_mem_map            = pccard_set_mem_map,
++      .proc_setup             = pccard_proc_setup,
++};
 +
-+      outb(index, CARD_CONTROLLER_INDEX);
-+      data |= ((uint16_t)inb(CARD_CONTROLLER_DATA)) << 8;
++static void pccard_bh(void *data)
++{
++      vrc4171_socket_t *socket = (vrc4171_socket_t *)data;
++      uint16_t events;
 +
-+      return data;
++      spin_lock_irq(&socket->event_lock);
++      events = socket->events;
++      socket->events = 0;
++      spin_unlock_irq(&socket->event_lock);
++ 
++      if (socket->handler)
++              socket->handler(socket->info, events);
 +}
 +
-+static inline uint8_t exca_write_byte(int slot, uint8_t index, uint8_t data)
++static inline uint16_t get_events(int slot)
 +{
-+      if (slot == CARD_SLOTB)
-+              index += CARD_SLOTB_OFFSET;
++      uint16_t events = 0;
++      uint8_t status, csc;
 +
-+      outb(index, CARD_CONTROLLER_INDEX);
-+      outb(data, CARD_CONTROLLER_DATA);
++      status = exca_read_byte(slot, I365_STATUS);
++      csc = exca_read_byte(slot, I365_CSC);
 +
-+      return data;
++      if (exca_read_byte(slot, I365_INTCTL) & I365_PC_IOCARD) {
++              if ((csc & I365_CSC_STSCHG) && (status & I365_CS_STSCHG))
++                      events |= SS_STSCHG;
++      } else {
++              if (csc & (I365_CSC_BVD1 | I365_CSC_BVD2)) {
++                      if (!(status & I365_CS_BVD1))
++                              events |= SS_BATDEAD;
++                      else if ((status & (I365_CS_BVD1 | I365_CS_BVD2)) == I365_CS_BVD1)
++                              events |= SS_BATWARN;
++              }
++      }
++      if ((csc & I365_CSC_READY) && (status & I365_CS_READY))
++              events |= SS_READY;
++      if ((csc & I365_CSC_DETECT) && ((status & I365_CS_DETECT) == I365_CS_DETECT))
++              events |= SS_DETECT;
++
++      return events;
 +}
 +
-+static inline uint16_t exca_write_word(int slot, uint8_t index, uint16_t data)
++static void pccard_status_change(int slot, vrc4171_socket_t *socket)
 +{
-+      if (slot == CARD_SLOTB)
-+              index += CARD_SLOTB_OFFSET;
-+
-+      outb(index++, CARD_CONTROLLER_INDEX);
-+      outb(data, CARD_CONTROLLER_DATA);
++      uint16_t events;
 +
-+      outb(index, CARD_CONTROLLER_INDEX);
-+      outb((uint8_t)(data >> 8), CARD_CONTROLLER_DATA);
++      socket->tq_task.routine = pccard_bh;
++      socket->tq_task.data = socket;
 +
-+      return data;
++      events = get_events(slot);
++      if (events) {
++              spin_lock(&socket->event_lock);
++              socket->events |= events;
++              spin_unlock(&socket->event_lock);
++              schedule_task(&socket->tq_task);
++      }
 +}
 +
-+static inline int search_nonuse_irq(void)
++static void pccard_interrupt(int irq, void *dev_id, struct pt_regs *regs)
 +{
-+      int i;
++      vrc4171_socket_t *socket;
++      uint16_t status;
 +
-+      for (i = 0; i < 16; i++) {
-+              if (vrc4171_irq_mask & (1 << i)) {
-+                      vrc4171_irq_mask &= ~(1 << i);
-+                      return i;
++      status = vrc4171_get_irq_status();
++      if (status & IRQ_A) {
++              socket = &vrc4171_sockets[CARD_SLOTA];
++              if (socket->noprobe == SLOTB_PROBE) {
++                      if (status & (1 << socket->csc_irq))
++                              pccard_status_change(CARD_SLOTA, socket);
 +              }
 +      }
 +
-+      return -1;
++      if (status & IRQ_B) {
++              socket = &vrc4171_sockets[CARD_SLOTB];
++              if (socket->noprobe == SLOTB_PROBE) {
++                      if (status & (1 << socket->csc_irq))
++                              pccard_status_change(CARD_SLOTB, socket);
++              }
++      }
 +}
 +
-+static int pccard_init(unsigned int slot)
++static inline void reserve_using_irq(int slot)
 +{
-+      vrc4171_socket_t *socket = &vrc4171_sockets[slot];
-+
-+      socket->cap.features |= SS_CAP_PCCARD | SS_CAP_PAGE_REGS;
-+      socket->cap.irq_mask = 0;
-+      socket->cap.pci_irq = vrc4171_irq;
-+      socket->cap.map_size = 0x1000;
-+      socket->events = 0;
-+      spin_lock_init(socket->event_lock);
-+      socket->csc_irq = search_nonuse_irq();
-+      socket->io_irq = search_nonuse_irq();
++      unsigned int irq;
 +
-+      return 0;
-+}
++      irq = exca_read_byte(slot, I365_INTCTL);
++      irq &= 0x0f;
++      vrc4171_irq_mask &= ~(1 << irq);
 +
-+static int pccard_suspend(unsigned int slot)
-+{
-+      return -EINVAL;
++      irq = exca_read_byte(slot, I365_CSCINT);
++      irq = (irq & 0xf0) >> 4;
++      vrc4171_irq_mask &= ~(1 << irq);
 +}
 +
-+static int pccard_register_callback(unsigned int slot,
-+                                    void (*handler)(void *, unsigned int),
-+                                    void *info)
++static int __devinit vrc4171_add_socket(int slot)
 +{
 +      vrc4171_socket_t *socket;
 +
@@ -22628,7710 +17253,2004 @@ diff -Nur linux-2.4.29/drivers/pcmcia/vrc4171_card.c linux-mips/drivers/pcmcia/v
 +              return -EINVAL;
 +
 +      socket = &vrc4171_sockets[slot];
++      if (socket->noprobe != SLOTB_PROBE) {
++              uint8_t addrwin;
 +
-+      socket->handler = handler;
-+      socket->info = info;
++              switch (socket->noprobe) {
++              case SLOTB_NOPROBE_MEM:
++                      addrwin = exca_read_byte(slot, I365_ADDRWIN);
++                      addrwin &= 0x1f;
++                      exca_write_byte(slot, I365_ADDRWIN, addrwin);
++                      break;
++              case SLOTB_NOPROBE_IO:
++                      addrwin = exca_read_byte(slot, I365_ADDRWIN);
++                      addrwin &= 0xc0;
++                      exca_write_byte(slot, I365_ADDRWIN, addrwin);
++                      break;
++              default:
++                      break;
++              }
 +
-+      if (handler)
-+              MOD_INC_USE_COUNT;
-+      else
-+              MOD_DEC_USE_COUNT;
++              reserve_using_irq(slot);
++
++              return 0;
++      }
++
++      sprintf(socket->name, "NEC VRC4171 Card Slot %1c", 'A' + slot);
++
++      socket->pcmcia_socket = pcmcia_register_socket(slot, &vrc4171_pccard_operations, 1);
++      if (socket->pcmcia_socket == NULL)
++              return -ENOMEM;
++
++      exca_write_byte(slot, I365_ADDRWIN, 0);
++
++      exca_write_byte(slot, GLOBAL_CONTROL, 0);
 +
 +      return 0;
 +}
 +
-+static int pccard_inquire_socket(unsigned int slot, socket_cap_t *cap)
++static void vrc4171_remove_socket(int slot)
 +{
 +      vrc4171_socket_t *socket;
 +
-+      if (slot >= CARD_MAX_SLOTS || cap == NULL)
-+              return -EINVAL;
++      if (slot >= CARD_MAX_SLOTS)
++              return;
 +
 +      socket = &vrc4171_sockets[slot];
 +
-+      *cap = socket->cap;
-+
-+      return 0;
++      if (socket->pcmcia_socket != NULL) {
++              pcmcia_unregister_socket(socket->pcmcia_socket);
++              socket->pcmcia_socket = NULL;
++      }
 +}
 +
-+static int pccard_get_status(unsigned int slot, u_int *value)
++static int __devinit vrc4171_card_setup(char *options)
 +{
-+      uint8_t status, sense;
-+      u_int val = 0;
++      if (options == NULL || *options == '\0')
++              return 0;
 +
-+      if (slot >= CARD_MAX_SLOTS || value == NULL)
-+              return -EINVAL;
++      if (strncmp(options, "irq:", 4) == 0) {
++              int irq;
++              options += 4;
++              irq = simple_strtoul(options, &options, 0);
++              if (irq >= 0 && irq < NR_IRQS)
++                      vrc4171_irq = irq;
 +
-+      status = exca_read_byte(slot, I365_STATUS);
-+      if (exca_read_byte(slot, I365_INTCTL) & I365_PC_IOCARD) {
-+              if (status & I365_CS_STSCHG)
-+                      val |= SS_STSCHG;
-+      } else {
-+              if (!(status & I365_CS_BVD1))
-+                      val |= SS_BATDEAD;
-+              else if ((status & (I365_CS_BVD1 | I365_CS_BVD2)) == I365_CS_BVD1)
-+                      val |= SS_BATWARN;
++              if (*options != ',')
++                      return 0;
++              options++;
 +      }
-+      if ((status & I365_CS_DETECT) == I365_CS_DETECT)
-+              val |= SS_DETECT;
-+      if (status & I365_CS_WRPROT)
-+              val |= SS_WRPROT;
-+      if (status & I365_CS_READY)
-+              val |= SS_READY;
-+      if (status & I365_CS_POWERON)
-+              val |= SS_POWERON;
 +
-+      sense = exca_read_byte(slot, CARD_VOLTAGE_SENSE);
-+      switch (sense) {
-+      case VCC_3VORXV_CAPABLE:
-+              val |= SS_3VCARD | SS_XVCARD;
-+              break;
-+      case VCC_XV_ONLY:
-+              val |= SS_XVCARD;
-+              break;
-+      case VCC_3V_CAPABLE:
-+              val |= SS_3VCARD;
-+              break;
-+      default:
-+              /* 5V only */
-+              break;
++      if (strncmp(options, "slota:", 6) == 0) {
++              options += 6;
++              if (*options != '\0') {
++                      if (strncmp(options, "noprobe", 7) == 0) {
++                              vrc4171_sockets[CARD_SLOTA].noprobe = 1;
++                              options += 7;
++                      }
++
++                      if (*options != ',')
++                              return 0;
++                      options++;
++              } else
++                      return 0;
++
 +      }
 +
-+      *value = val;
++      if (strncmp(options, "slotb:", 6) == 0) {
++              options += 6;
++              if (*options != '\0') {
++                      if (strncmp(options, "pccard", 6) == 0) {
++                              vrc4171_slotb = SLOTB_IS_PCCARD;
++                              options += 6;
++                      } else if (strncmp(options, "cf", 2) == 0) {
++                              vrc4171_slotb = SLOTB_IS_CF;
++                              options += 2;
++                      } else if (strncmp(options, "flashrom", 8) == 0) {
++                              vrc4171_slotb = SLOTB_IS_FLASHROM;
++                              options += 8;
++                      } else if (strncmp(options, "none", 4) == 0) {
++                              vrc4171_slotb = SLOTB_IS_NONE;
++                              options += 4;
++                      }
 +
-+      return 0;
-+}
++                      if (*options != ',')
++                              return 0;
++                      options++;
 +
-+static inline u_char get_Vcc_value(uint8_t voltage)
-+{
-+      switch (voltage) {
-+      case VCC_STATUS_3V:
-+              return 33;
-+      case VCC_STATUS_5V:
-+              return 50;
-+      default:
-+              break;
++                      if ( strncmp(options, "memnoprobe", 10) == 0)
++                              vrc4171_sockets[CARD_SLOTB].noprobe = SLOTB_NOPROBE_MEM;
++                      if ( strncmp(options, "ionoprobe", 9) == 0)
++                              vrc4171_sockets[CARD_SLOTB].noprobe = SLOTB_NOPROBE_IO;
++                      if ( strncmp(options, "noprobe", 7) == 0)
++                              vrc4171_sockets[CARD_SLOTB].noprobe = SLOTB_NOPROBE_ALL;
++              }
 +      }
 +
 +      return 0;
 +}
 +
-+static inline u_char get_Vpp_value(uint8_t power, u_char Vcc)
-+{
-+      if ((power & 0x03) == 0x01 || (power & 0x03) == 0x02)
-+              return Vcc;
-+
-+      return 0;
-+}
++__setup("vrc4171_card=", vrc4171_card_setup);
 +
-+static int pccard_get_socket(unsigned int slot, socket_state_t *state)
++static int __devinit vrc4171_card_init(void)
 +{
-+      vrc4171_socket_t *socket;
-+      uint8_t power, voltage, control, cscint;
-+
-+      if (slot >= CARD_MAX_SLOTS || state == NULL)
-+              return -EINVAL;
++      int retval, slot;
 +
-+      socket = &vrc4171_sockets[slot];
++      vrc4171_set_multifunction_pin(vrc4171_slotb);
 +
-+      power = exca_read_byte(slot, I365_POWER);
-+      voltage = exca_read_byte(slot, CARD_VOLTAGE_SELECT);
++      if (request_region(CARD_CONTROLLER_INDEX, CARD_CONTROLLER_SIZE,
++                             "NEC VRC4171 Card Controller") == NULL)
++              return -EBUSY;
 +
-+      state->Vcc = get_Vcc_value(voltage);
-+      state->Vpp = get_Vpp_value(power, state->Vcc);
++      for (slot = 0; slot < CARD_MAX_SLOTS; slot++) {
++              if (slot == CARD_SLOTB && vrc4171_slotb == SLOTB_IS_NONE)
++                      break;
 +
-+      state->flags = 0;
-+      if (power & POWER_ENABLE)
-+              state->flags |= SS_PWR_AUTO;
-+      if (power & I365_PWR_OUT)
-+              state->flags |= SS_OUTPUT_ENA;
++              retval = vrc4171_add_socket(slot);
++              if (retval != 0)
++                      return retval;
++      }
 +
-+      control = exca_read_byte(slot, I365_INTCTL);
-+      if (control & I365_PC_IOCARD)
-+              state->flags |= SS_IOCARD;
-+      if (!(control & I365_PC_RESET))
-+              state->flags |= SS_RESET;
++      retval = request_irq(vrc4171_irq, pccard_interrupt, SA_SHIRQ,
++                           "NEC VRC4171 Card Controller", vrc4171_sockets);
++      if (retval < 0) {
++              for (slot = 0; slot < CARD_MAX_SLOTS; slot++)
++                      vrc4171_remove_socket(slot);
 +
-+        cscint = exca_read_byte(slot, I365_CSCINT);
-+      state->csc_mask = 0;
-+      if (state->flags & SS_IOCARD) {
-+              if (cscint & I365_CSC_STSCHG)
-+                      state->flags |= SS_STSCHG;
-+      } else {
-+              if (cscint & I365_CSC_BVD1)  
-+                      state->csc_mask |= SS_BATDEAD;
-+              if (cscint & I365_CSC_BVD2)  
-+                      state->csc_mask |= SS_BATWARN;
++              return retval;
 +      }
-+      if (cscint & I365_CSC_READY)
-+              state->csc_mask |= SS_READY;
-+      if (cscint & I365_CSC_DETECT)
-+              state->csc_mask |= SS_DETECT;
++
++      printk(KERN_INFO "NEC VRC4171 Card Controller, connected to IRQ %d\n", vrc4171_irq);
 +
 +      return 0;
 +}
 +
-+static inline uint8_t set_Vcc_value(u_char Vcc)
++static void __devexit vrc4171_card_exit(void)
 +{
-+      switch (Vcc) {
-+      case 33:
-+              return VCC_3V;
-+      case 50:
-+              return VCC_5V;
-+      }
-+
-+      /* Small voltage is chosen for safety. */
-+      return VCC_3V;
-+}
++      int slot;
 +
-+static int pccard_set_socket(unsigned int slot, socket_state_t *state)
-+{
-+      vrc4171_socket_t *socket;
-+      uint8_t voltage, power, control, cscint;
++      for (slot = 0; slot < CARD_MAX_SLOTS; slot++)
++              vrc4171_remove_socket(slot);
 +
-+      if (slot >= CARD_MAX_SLOTS ||
-+          (state->Vpp != state->Vcc && state->Vpp != 0) ||
-+          (state->Vcc != 50 && state->Vcc != 33 && state->Vcc != 0))
-+              return -EINVAL;
++      release_region(CARD_CONTROLLER_INDEX, CARD_CONTROLLER_SIZE);
++}
 +
-+      socket = &vrc4171_sockets[slot];
++module_init(vrc4171_card_init);
++module_exit(vrc4171_card_exit);
+diff -Nur linux-2.4.29/drivers/scsi/NCR53C9x.h linux-mips/drivers/scsi/NCR53C9x.h
+--- linux-2.4.29/drivers/scsi/NCR53C9x.h       2004-02-18 14:36:31.000000000 +0100
++++ linux-mips/drivers/scsi/NCR53C9x.h 2003-12-15 19:19:51.000000000 +0100
+@@ -144,12 +144,7 @@
+ #ifndef MULTIPLE_PAD_SIZES
+-#ifdef CONFIG_CPU_HAS_WB
+-#include <asm/wbflush.h>
+-#define esp_write(__reg, __val) do{(__reg) = (__val); wbflush();} while(0)
+-#else
+-#define esp_write(__reg, __val) ((__reg) = (__val))
+-#endif
++#define esp_write(__reg, __val) do{(__reg) = (__val); iob();} while(0)
+ #define esp_read(__reg) (__reg)
+ struct ESP_regs {
+diff -Nur linux-2.4.29/drivers/sound/au1550_i2s.c linux-mips/drivers/sound/au1550_i2s.c
+--- linux-2.4.29/drivers/sound/au1550_i2s.c    2005-01-19 15:10:04.000000000 +0100
++++ linux-mips/drivers/sound/au1550_i2s.c      2005-02-08 08:07:50.000000000 +0100
+@@ -41,6 +41,7 @@
+  *  675 Mass Ave, Cambridge, MA 02139, USA.
+  *
+  */
 +
-+      spin_lock_irq(&socket->event_lock);
+ #include <linux/version.h>
+ #include <linux/module.h>
+ #include <linux/string.h>
+@@ -62,7 +63,45 @@
+ #include <asm/uaccess.h>
+ #include <asm/hardirq.h>
+ #include <asm/au1000.h>
 +
-+      voltage = set_Vcc_value(state->Vcc);
-+      exca_write_byte(slot, CARD_VOLTAGE_SELECT, voltage);
++#if defined(CONFIG_SOC_AU1550)
+ #include <asm/pb1550.h>
++#endif
 +
-+      power = POWER_ENABLE;
-+      if (state->Vpp == state->Vcc)
-+              power |= VPP_GET_VCC;
-+      if (state->flags & SS_OUTPUT_ENA)
-+              power |= I365_PWR_OUT;
-+      exca_write_byte(slot, I365_POWER, power);
++#if defined(CONFIG_MIPS_PB1200)
++#define WM8731
++#define WM_MODE_USB
++#include <asm/pb1200.h>
++#endif
 +
-+      control = 0;
-+      if (state->io_irq != 0)
-+              control |= socket->io_irq;
-+      if (state->flags & SS_IOCARD)
-+              control |= I365_PC_IOCARD;
-+      if (state->flags & SS_RESET)
-+              control &= ~I365_PC_RESET;
-+      else
-+              control |= I365_PC_RESET;
-+      exca_write_byte(slot, I365_INTCTL, control);
++#if defined(CONFIG_MIPS_FICMMP)
++#define WM8721
++#define WM_MODE_NORMAL
++#include <asm/ficmmp.h>
++#endif
 +
-+        cscint = 0;
-+        exca_write_byte(slot, I365_CSCINT, cscint);
-+      exca_read_byte(slot, I365_CSC); /* clear CardStatus change */
-+      if (state->csc_mask != 0)
-+              cscint |= socket->csc_irq << 8;
-+      if (state->flags & SS_IOCARD) {
-+              if (state->csc_mask & SS_STSCHG)
-+                      cscint |= I365_CSC_STSCHG;
-+      } else {
-+              if (state->csc_mask & SS_BATDEAD)
-+                      cscint |= I365_CSC_BVD1;
-+              if (state->csc_mask & SS_BATWARN)
-+                      cscint |= I365_CSC_BVD2;
-+      }
-+      if (state->csc_mask & SS_READY)
-+              cscint |= I365_CSC_READY;
-+      if (state->csc_mask & SS_DETECT)
-+              cscint |= I365_CSC_DETECT;
-+        exca_write_byte(slot, I365_CSCINT, cscint);
 +
-+      spin_unlock_irq(&socket->event_lock);
++#define WM_VOLUME_MIN 47
++#define WM_VOLUME_SCALE       80
 +
-+      return 0;
-+}
++#if defined(WM8731)
++      /* OSS interface to the wm i2s.. */
++      #define CODEC_NAME "Wolfson WM8731 I2S"
++      #define WM_I2S_STEREO_MASK (SOUND_MASK_PCM | SOUND_MASK_LINE)
++      #define WM_I2S_SUPPORTED_MASK (WM_I2S_STEREO_MASK | SOUND_MASK_MIC)
++      #define WM_I2S_RECORD_MASK (SOUND_MASK_MIC | SOUND_MASK_LINE1 | SOUND_MASK_LINE)
++#elif defined(WM8721)
++      #define CODEC_NAME "Wolfson WM8721 I2S"
++      #define WM_I2S_STEREO_MASK (SOUND_MASK_PCM)
++      #define WM_I2S_SUPPORTED_MASK (WM_I2S_STEREO_MASK)
++      #define WM_I2S_RECORD_MASK (0)
++#endif
 +
-+static int pccard_get_io_map(unsigned int slot, struct pccard_io_map *io)
-+{
-+      vrc4171_socket_t *socket;
-+      uint8_t ioctl, addrwin;
-+      u_char map;
 +
-+      if (slot >= CARD_MAX_SLOTS || io == NULL ||
-+          io->map >= IO_MAX_MAPS)
-+              return -EINVAL;
++#define supported_mixer(FOO) ((FOO >= 0) && \
++                                    (FOO < SOUND_MIXER_NRDEVICES) && \
++                                    WM_I2S_SUPPORTED_MASK & (1<<FOO) )
 +
-+      socket = &vrc4171_sockets[slot];
-+      map = io->map;
+ #include <asm/au1xxx_psc.h>
+ #include <asm/au1xxx_dbdma.h>
+@@ -98,13 +137,51 @@
+  * 0 = no VRA, 1 = use VRA if codec supports it
+  * The framework is here, but we currently force no VRA.
+  */
++#if defined(CONFIG_MIPS_PB1200) | defined(CONFIG_MIPS_PB1550)
+ static int      vra = 0;
++#elif defined(CONFIG_MIPS_FICMMP)
++static int vra = 1;
++#endif
 +
-+      io->start = exca_read_word(slot, I365_IO(map)+I365_W_START);
-+      io->stop = exca_read_word(slot, I365_IO(map)+I365_W_STOP);
++#define WM_REG_L_HEADPHONE_OUT                        0x02
++#define WM_REG_R_HEADPHONE_OUT                        0x03
++#define WM_REG_ANALOGUE_AUDIO_PATH_CTRL               0x04
++#define WM_REG_DIGITAL_AUDIO_PATH_CTRL                0x05
++#define WM_REG_POWER_DOWN_CTRL                        0x06
++#define WM_REG_DIGITAL_AUDIO_IF                       0x07
++#define WM_REG_SAMPLING_CONTROL               0x08
++#define WM_REG_ACTIVE_CTRL                    0x09
++#define WM_REG_RESET                          0x0F
++#define WM_SC_SR_96000                (0x7<<2)
++#define WM_SC_SR_88200                (0xF<<2)
++#define WM_SC_SR_48000                (0x0<<2)
++#define WM_SC_SR_44100                (0x8<<2)
++#define WM_SC_SR_32000                (0x6<<2)
++#define WM_SC_SR_8018         (0x9<<2)
++#define WM_SC_SR_8000         (0x1<<2)
++#define WM_SC_MODE_USB                1
++#define WM_SC_MODE_NORMAL     0
++#define WM_SC_BOSR_250FS      (0<<1)
++#define WM_SC_BOSR_272FS      (1<<1)
++#define WM_SC_BOSR_256FS      (0<<1)
++#define WM_SC_BOSR_128FS      (0<<1)
++#define WM_SC_BOSR_384FS      (1<<1)
++#define WM_SC_BOSR_192FS      (1<<1)
 +
-+      ioctl = exca_read_byte(slot, I365_IOCTL);
-+      if (io->flags & I365_IOCTL_WAIT(map))
-+              io->speed = 1;
-+      else
-+              io->speed = 0;
++#define WS_64FS                       31
++#define WS_96FS                       47
++#define WS_128FS              63
++#define WS_192FS              95
 +
-+      io->flags = 0;
-+      if (ioctl & I365_IOCTL_16BIT(map))
-+              io->flags |= MAP_16BIT;
-+      if (ioctl & I365_IOCTL_IOCS16(map))
-+              io->flags |= MAP_AUTOSZ;
-+      if (ioctl & I365_IOCTL_0WS(map))
-+              io->flags |= MAP_0WS;
++#define MIN_Q_COUNT           2
 +
-+      addrwin = exca_read_byte(slot, I365_ADDRWIN);
-+      if (addrwin & I365_ENA_IO(map))
-+              io->flags |= MAP_ACTIVE;
+ MODULE_PARM(vra, "i");
+ MODULE_PARM_DESC(vra, "if 1 use VRA if codec supports it");
+ static struct au1550_state {
+       /* soundcore stuff */
+       int             dev_audio;
++      int                             dev_mixer;
+       spinlock_t              lock;
+       struct semaphore        open_sem;
+@@ -114,6 +191,11 @@
+       int                     no_vra;
+       volatile psc_i2s_t      *psc_addr;
++      int level_line;
++      int level_mic;
++      int level_left;
++      int level_right;
++
+       struct dmabuf {
+               u32             dmanr;
+               unsigned        sample_rate;
+@@ -195,60 +277,224 @@
+       }
+ }
+-/* Just a place holder.  The Wolfson codec is a write only device,
+- * so we would have to keep a local copy of the data.
+- */
+-#if 0
+-static u8
+-rdcodec(u8 addr)
+-{
+-      return 0  /* data */;
+-}
+-#endif
+-
+-
+ static void
+-wrcodec(u8 ctlreg, u8 val)
++wrcodec(u8 ctlreg, u16 val)
+ {
+       int     rcnt;
+       extern int pb1550_wm_codec_write(u8 addr, u8 reg, u8 val);
+-
+       /* The codec is a write only device, with a 16-bit control/data
+        * word.  Although it is written as two bytes on the I2C, the
+        * format is actually 7 bits of register and 9 bits of data.
+        * The ls bit of the first byte is the ms bit of the data.
+        */
+       rcnt = 0;
+-      while ((pb1550_wm_codec_write((0x36 >> 1), ctlreg, val) != 1) 
+-                                                      && (rcnt < 50)) {
++      while ((pb1550_wm_codec_write((0x36 >> 1), 
++                                      (ctlreg << 1) | ((val >> 8) & 0x01), 
++                                      (u8) (val & 0x00FF)) != 1) && 
++                      (rcnt < 50)) {
+               rcnt++;
+-#if 0
+-              printk("Codec write retry %02x %02x\n", ctlreg, val);
+-#endif
+       }
++
++      au1550_delay(10);
++}
 +
++static int
++au1550_open_mixdev(struct inode *inode, struct file *file)
++{
++      file->private_data = &au1550_state;
 +      return 0;
 +}
 +
-+static int pccard_set_io_map(unsigned int slot, struct pccard_io_map *io)
++static int
++au1550_release_mixdev(struct inode *inode, struct file *file)
 +{
-+      vrc4171_socket_t *socket;
-+      uint8_t ioctl, addrwin;
-+      u_char map;
++      return 0;
++}
 +
-+      if (slot >= CARD_MAX_SLOTS ||
-+          io == NULL || io->map >= IO_MAX_MAPS ||
-+          io->start > 0xffff || io->stop > 0xffff || io->start > io->stop)
-+              return -EINVAL;
++static int wm_i2s_read_mixer(struct au1550_state *s, int oss_channel)
++{
++      int ret = 0;
 +
-+      socket = &vrc4171_sockets[slot];
-+      map = io->map;
++      if (WM_I2S_STEREO_MASK & (1 << oss_channel)) {
++              /* nice stereo mixers .. */
 +
-+      addrwin = exca_read_byte(slot, I365_ADDRWIN);
-+      if (addrwin & I365_ENA_IO(map)) {
-+              addrwin &= ~I365_ENA_IO(map);
-+              exca_write_byte(slot, I365_ADDRWIN, addrwin);
++              ret = s->level_left | (s->level_right << 8);
++      } else if (oss_channel == SOUND_MIXER_MIC) {
++              ret = 0;
++              /* TODO: Implement read mixer for input/output codecs */
 +      }
 +
-+      exca_write_word(slot, I365_IO(map)+I365_W_START, io->start);
-+      exca_write_word(slot, I365_IO(map)+I365_W_STOP, io->stop);
++      return ret;
+ }
++static void wm_i2s_write_mixer(struct au1550_state *s, int oss_channel, unsigned int left, unsigned int right)
++{
++      if (WM_I2S_STEREO_MASK & (1 << oss_channel)) {
++              /* stereo mixers */
++              s->level_left = left;
++              s->level_right = right;
 +
-+      ioctl = 0;
-+      if (io->speed > 0)
-+              ioctl |= I365_IOCTL_WAIT(map);
-+      if (io->flags & MAP_16BIT)
-+              ioctl |= I365_IOCTL_16BIT(map);
-+      if (io->flags & MAP_AUTOSZ)
-+              ioctl |= I365_IOCTL_IOCS16(map);
-+      if (io->flags & MAP_0WS)
-+              ioctl |= I365_IOCTL_0WS(map);
-+      exca_write_byte(slot, I365_IOCTL, ioctl);
++              right = (right * WM_VOLUME_SCALE) / 100;
++              left  = (left  * WM_VOLUME_SCALE) / 100;
++              if (right > WM_VOLUME_SCALE)
++                      right = WM_VOLUME_SCALE;
++              if (left > WM_VOLUME_SCALE)
++                      left = WM_VOLUME_SCALE;
 +
-+      if (io->flags & MAP_ACTIVE) {
-+              addrwin |= I365_ENA_IO(map);
-+              exca_write_byte(slot, I365_ADDRWIN, addrwin);
-+      }
++              right += WM_VOLUME_MIN;
++              left  += WM_VOLUME_MIN;
 +
-+      return 0;
++              wrcodec(WM_REG_L_HEADPHONE_OUT, left);
++              wrcodec(WM_REG_R_HEADPHONE_OUT, right);
++
++      }else if (oss_channel == SOUND_MIXER_MIC) {
++              /* TODO: implement write mixer for input/output codecs */
++      }
 +}
 +
-+static int pccard_get_mem_map(unsigned int slot, struct pccard_mem_map *mem)
++/* a thin wrapper for write_mixer */
++static void wm_i2s_set_mixer(struct au1550_state *s, unsigned int oss_mixer, unsigned int val )
 +{
-+      vrc4171_socket_t *socket;
-+      uint8_t addrwin;
-+      u_long start, stop;
-+      u_int offset;
-+      u_char map;
-+
-+      if (slot >= CARD_MAX_SLOTS || mem == NULL || mem->map >= MEM_MAX_MAPS)
-+              return -EINVAL;
-+
-+      socket = &vrc4171_sockets[slot];
-+      map = mem->map;
-+
-+      mem->flags = 0;
-+      mem->speed = 0;
-+
-+      addrwin = exca_read_byte(slot, I365_ADDRWIN);
-+      if (addrwin & I365_ENA_MEM(map))
-+              mem->flags |= MAP_ACTIVE;
-+
-+      start = exca_read_word(slot, I365_MEM(map)+I365_W_START);
-+      if (start & I365_MEM_16BIT)
-+              mem->flags |= MAP_16BIT;
-+      mem->sys_start = (start & 0x3fffUL) << 12;
-+
-+      stop = exca_read_word(slot, I365_MEM(map)+I365_W_STOP);
-+      if (start & I365_MEM_WS0)
-+              mem->speed += 1;
-+      if (start & I365_MEM_WS1)
-+              mem->speed += 2;
-+      mem->sys_stop = ((stop & 0x3fffUL) << 12) + 0xfffUL;
++      unsigned int left,right;
 +
-+      offset = exca_read_word(slot, I365_MEM(map)+I365_W_OFF);
-+      if (offset & I365_MEM_REG)
-+              mem->flags |= MAP_ATTRIB;
-+      if (offset & I365_MEM_WRPROT)
-+              mem->flags |= MAP_WRPROT;
-+      mem->card_start = (offset & 0x3fffUL) << 12;
++      /* cleanse input a little */
++      right = ((val >> 8)  & 0xff) ;
++      left = (val  & 0xff) ;
 +
-+      mem->sys_start += CARD_MEM_START;
-+      mem->sys_stop += CARD_MEM_START;
++      if (right > 100) right = 100;
++      if (left > 100) left = 100;
 +
-+      return 0;
++      wm_i2s_write_mixer(s, oss_mixer, left, right);
 +}
 +
-+static int pccard_set_mem_map(unsigned int slot, struct pccard_mem_map *mem)
++static int
++au1550_ioctl_mixdev(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
 +{
-+      vrc4171_socket_t *socket;
-+      uint16_t start, stop, offset;
-+      uint8_t addrwin;
-+      u_char map;
-+
-+      if (slot >= CARD_MAX_SLOTS ||
-+          mem == NULL || mem->map >= MEM_MAX_MAPS ||
-+          mem->sys_start < CARD_MEM_START || mem->sys_start > CARD_MEM_END ||
-+          mem->sys_stop < CARD_MEM_START || mem->sys_stop > CARD_MEM_END ||
-+          mem->sys_start > mem->sys_stop ||
-+          mem->card_start > CARD_MAX_MEM_OFFSET ||
-+          mem->speed > CARD_MAX_MEM_SPEED)
-+              return -EINVAL;
++      struct au1550_state *s = (struct au1550_state *)file->private_data;
 +
-+      socket = &vrc4171_sockets[slot];
-+      map = mem->map;
++      int i, val = 0;
 +
-+      addrwin = exca_read_byte(slot, I365_ADDRWIN);
-+      if (addrwin & I365_ENA_MEM(map)) {
-+              addrwin &= ~I365_ENA_MEM(map);
-+              exca_write_byte(slot, I365_ADDRWIN, addrwin);
++      if (cmd == SOUND_MIXER_INFO) {
++              mixer_info info;
++              strncpy(info.id, CODEC_NAME, sizeof(info.id));
++              strncpy(info.name, CODEC_NAME, sizeof(info.name));
++              info.modify_counter = 0;
++              if (copy_to_user((void *)arg, &info, sizeof(info)))
++                      return -EFAULT;
++              return 0;
 +      }
-+
-+      start = (mem->sys_start >> 12) & 0x3fff;
-+      if (mem->flags & MAP_16BIT)
-+              start |= I365_MEM_16BIT;
-+      exca_write_word(slot, I365_MEM(map)+I365_W_START, start);
-+
-+      stop = (mem->sys_stop >> 12) & 0x3fff;
-+      switch (mem->speed) {
-+      case 0:
-+              break;
-+      case 1:
-+              stop |= I365_MEM_WS0;
-+              break;
-+      case 2:
-+              stop |= I365_MEM_WS1;
-+              break;
-+      default:
-+              stop |= I365_MEM_WS0 | I365_MEM_WS1;
-+              break;
++      if (cmd == SOUND_OLD_MIXER_INFO) {
++              _old_mixer_info info;
++              strncpy(info.id, CODEC_NAME, sizeof(info.id));
++              strncpy(info.name, CODEC_NAME, sizeof(info.name));
++              if (copy_to_user((void *)arg, &info, sizeof(info)))
++                      return -EFAULT;
++              return 0;
 +      }
-+      exca_write_word(slot, I365_MEM(map)+I365_W_STOP, stop);
 +
-+      offset = (mem->card_start >> 12) & 0x3fff;
-+      if (mem->flags & MAP_ATTRIB)
-+              offset |= I365_MEM_REG;
-+      if (mem->flags & MAP_WRPROT)
-+              offset |= I365_MEM_WRPROT;
-+      exca_write_word(slot, I365_MEM(map)+I365_W_OFF, offset);
++      if (_IOC_TYPE(cmd) != 'M' || _SIOC_SIZE(cmd) != sizeof(int))
++              return -EINVAL;
 +
-+      if (mem->flags & MAP_ACTIVE) {
-+              addrwin |= I365_ENA_MEM(map);
-+              exca_write_byte(slot, I365_ADDRWIN, addrwin);
-+      }
++      if (cmd == OSS_GETVERSION)
++              return put_user(SOUND_VERSION, (int *)arg);
 +
-+      return 0;
-+}
++      if (_SIOC_DIR(cmd) == _SIOC_READ) {
++              switch (_IOC_NR(cmd)) {
++              case SOUND_MIXER_RECSRC: /* give them the current record src */
++                      val = 0;
++                      /*
++                      if (!codec->recmask_io) {
++                              val = 0;
++                      } else {
++                              val = codec->recmask_io(codec, 1, 0);
++                      }*/
++                      break;
 +
-+static void pccard_proc_setup(unsigned int slot, struct proc_dir_entry *base)
-+{          
-+}
++              case SOUND_MIXER_DEVMASK: /* give them the supported mixers */
++                      val = WM_I2S_SUPPORTED_MASK;
++                      break;
 +
-+static struct pccard_operations vrc4171_pccard_operations = {
-+      .init                   = pccard_init,
-+      .suspend                = pccard_suspend,
-+      .register_callback      = pccard_register_callback,
-+      .inquire_socket         = pccard_inquire_socket,
-+      .get_status             = pccard_get_status,
-+      .get_socket             = pccard_get_socket,
-+      .set_socket             = pccard_set_socket,
-+      .get_io_map             = pccard_get_io_map,
-+      .set_io_map             = pccard_set_io_map,
-+      .get_mem_map            = pccard_get_mem_map,
-+      .set_mem_map            = pccard_set_mem_map,
-+      .proc_setup             = pccard_proc_setup,
-+};
++              case SOUND_MIXER_RECMASK: 
++                      /* Arg contains a bit for each supported recording 
++                       * source */
++                      val = WM_I2S_RECORD_MASK;
++                      break;
 +
-+static void pccard_bh(void *data)
-+{
-+      vrc4171_socket_t *socket = (vrc4171_socket_t *)data;
-+      uint16_t events;
++              case SOUND_MIXER_STEREODEVS: 
++                      /* Mixer channels supporting stereo */
++                      val = WM_I2S_STEREO_MASK;
++                      break;
 +
-+      spin_lock_irq(&socket->event_lock);
-+      events = socket->events;
-+      socket->events = 0;
-+      spin_unlock_irq(&socket->event_lock);
-+ 
-+      if (socket->handler)
-+              socket->handler(socket->info, events);
-+}
++              case SOUND_MIXER_CAPS:
++                      val = SOUND_CAP_EXCL_INPUT;
++                      break;
 +
-+static inline uint16_t get_events(int slot)
-+{
-+      uint16_t events = 0;
-+      uint8_t status, csc;
++              default: /* read a specific mixer */
++                      i = _IOC_NR(cmd);
 +
-+      status = exca_read_byte(slot, I365_STATUS);
-+      csc = exca_read_byte(slot, I365_CSC);
++                      if (!supported_mixer(i))
++                              return -EINVAL;
 +
-+      if (exca_read_byte(slot, I365_INTCTL) & I365_PC_IOCARD) {
-+              if ((csc & I365_CSC_STSCHG) && (status & I365_CS_STSCHG))
-+                      events |= SS_STSCHG;
-+      } else {
-+              if (csc & (I365_CSC_BVD1 | I365_CSC_BVD2)) {
-+                      if (!(status & I365_CS_BVD1))
-+                              events |= SS_BATDEAD;
-+                      else if ((status & (I365_CS_BVD1 | I365_CS_BVD2)) == I365_CS_BVD1)
-+                              events |= SS_BATWARN;
++                      val = wm_i2s_read_mixer(s, i);
++                      break;
 +              }
++              return put_user(val, (int *)arg);
 +      }
-+      if ((csc & I365_CSC_READY) && (status & I365_CS_READY))
-+              events |= SS_READY;
-+      if ((csc & I365_CSC_DETECT) && ((status & I365_CS_DETECT) == I365_CS_DETECT))
-+              events |= SS_DETECT;
 +
-+      return events;
-+}
++      if (_SIOC_DIR(cmd) == (_SIOC_WRITE|_SIOC_READ)) {
++              if (get_user(val, (int *)arg))
++                      return -EFAULT;
 +
-+static void pccard_status_change(int slot, vrc4171_socket_t *socket)
-+{
-+      uint16_t events;
++              switch (_IOC_NR(cmd)) {
++              case SOUND_MIXER_RECSRC: 
++                      /* Arg contains a bit for each recording source */
++                      if (!WM_I2S_RECORD_MASK)
++                              return -EINVAL;
++                      if (!val)
++                              return 0;
++                      if (!(val &= WM_I2S_RECORD_MASK))
++                              return -EINVAL;
 +
-+      socket->tq_task.routine = pccard_bh;
-+      socket->tq_task.data = socket;
++                      return 0;
++              default: /* write a specific mixer */
++                      i = _IOC_NR(cmd);
 +
-+      events = get_events(slot);
-+      if (events) {
-+              spin_lock(&socket->event_lock);
-+              socket->events |= events;
-+              spin_unlock(&socket->event_lock);
-+              schedule_task(&socket->tq_task);
++                      if (!supported_mixer(i))
++                              return -EINVAL;
++
++                      wm_i2s_set_mixer(s, i, val);
++
++                      return 0;
 +      }
 +}
++      return -EINVAL;
++}
 +
-+static void pccard_interrupt(int irq, void *dev_id, struct pt_regs *regs)
-+{
-+      vrc4171_socket_t *socket;
-+      uint16_t status;
-+
-+      status = vrc4171_get_irq_status();
-+      if (status & IRQ_A) {
-+              socket = &vrc4171_sockets[CARD_SLOTA];
-+              if (socket->noprobe == SLOTB_PROBE) {
-+                      if (status & (1 << socket->csc_irq))
-+                              pccard_status_change(CARD_SLOTA, socket);
-+              }
-+      }
-+
-+      if (status & IRQ_B) {
-+              socket = &vrc4171_sockets[CARD_SLOTB];
-+              if (socket->noprobe == SLOTB_PROBE) {
-+                      if (status & (1 << socket->csc_irq))
-+                              pccard_status_change(CARD_SLOTB, socket);
-+              }
-+      }
-+}
-+
-+static inline void reserve_using_irq(int slot)
-+{
-+      unsigned int irq;
-+
-+      irq = exca_read_byte(slot, I365_INTCTL);
-+      irq &= 0x0f;
-+      vrc4171_irq_mask &= ~(1 << irq);
-+
-+      irq = exca_read_byte(slot, I365_CSCINT);
-+      irq = (irq & 0xf0) >> 4;
-+      vrc4171_irq_mask &= ~(1 << irq);
-+}
-+
-+static int __devinit vrc4171_add_socket(int slot)
-+{
-+      vrc4171_socket_t *socket;
-+
-+      if (slot >= CARD_MAX_SLOTS)
-+              return -EINVAL;
-+
-+      socket = &vrc4171_sockets[slot];
-+      if (socket->noprobe != SLOTB_PROBE) {
-+              uint8_t addrwin;
-+
-+              switch (socket->noprobe) {
-+              case SLOTB_NOPROBE_MEM:
-+                      addrwin = exca_read_byte(slot, I365_ADDRWIN);
-+                      addrwin &= 0x1f;
-+                      exca_write_byte(slot, I365_ADDRWIN, addrwin);
-+                      break;
-+              case SLOTB_NOPROBE_IO:
-+                      addrwin = exca_read_byte(slot, I365_ADDRWIN);
-+                      addrwin &= 0xc0;
-+                      exca_write_byte(slot, I365_ADDRWIN, addrwin);
-+                      break;
-+              default:
-+                      break;
-+              }
-+
-+              reserve_using_irq(slot);
-+
-+              return 0;
-+      }
-+
-+      sprintf(socket->name, "NEC VRC4171 Card Slot %1c", 'A' + slot);
-+
-+      socket->pcmcia_socket = pcmcia_register_socket(slot, &vrc4171_pccard_operations, 1);
-+      if (socket->pcmcia_socket == NULL)
-+              return -ENOMEM;
-+
-+      exca_write_byte(slot, I365_ADDRWIN, 0);
-+
-+      exca_write_byte(slot, GLOBAL_CONTROL, 0);
-+
-+      return 0;
-+}
-+
-+static void vrc4171_remove_socket(int slot)
-+{
-+      vrc4171_socket_t *socket;
-+
-+      if (slot >= CARD_MAX_SLOTS)
-+              return;
-+
-+      socket = &vrc4171_sockets[slot];
-+
-+      if (socket->pcmcia_socket != NULL) {
-+              pcmcia_unregister_socket(socket->pcmcia_socket);
-+              socket->pcmcia_socket = NULL;
-+      }
-+}
-+
-+static int __devinit vrc4171_card_setup(char *options)
-+{
-+      if (options == NULL || *options == '\0')
-+              return 0;
-+
-+      if (strncmp(options, "irq:", 4) == 0) {
-+              int irq;
-+              options += 4;
-+              irq = simple_strtoul(options, &options, 0);
-+              if (irq >= 0 && irq < NR_IRQS)
-+                      vrc4171_irq = irq;
-+
-+              if (*options != ',')
-+                      return 0;
-+              options++;
-+      }
-+
-+      if (strncmp(options, "slota:", 6) == 0) {
-+              options += 6;
-+              if (*options != '\0') {
-+                      if (strncmp(options, "noprobe", 7) == 0) {
-+                              vrc4171_sockets[CARD_SLOTA].noprobe = 1;
-+                              options += 7;
-+                      }
-+
-+                      if (*options != ',')
-+                              return 0;
-+                      options++;
-+              } else
-+                      return 0;
-+
-+      }
-+
-+      if (strncmp(options, "slotb:", 6) == 0) {
-+              options += 6;
-+              if (*options != '\0') {
-+                      if (strncmp(options, "pccard", 6) == 0) {
-+                              vrc4171_slotb = SLOTB_IS_PCCARD;
-+                              options += 6;
-+                      } else if (strncmp(options, "cf", 2) == 0) {
-+                              vrc4171_slotb = SLOTB_IS_CF;
-+                              options += 2;
-+                      } else if (strncmp(options, "flashrom", 8) == 0) {
-+                              vrc4171_slotb = SLOTB_IS_FLASHROM;
-+                              options += 8;
-+                      } else if (strncmp(options, "none", 4) == 0) {
-+                              vrc4171_slotb = SLOTB_IS_NONE;
-+                              options += 4;
-+                      }
-+
-+                      if (*options != ',')
-+                              return 0;
-+                      options++;
-+
-+                      if ( strncmp(options, "memnoprobe", 10) == 0)
-+                              vrc4171_sockets[CARD_SLOTB].noprobe = SLOTB_NOPROBE_MEM;
-+                      if ( strncmp(options, "ionoprobe", 9) == 0)
-+                              vrc4171_sockets[CARD_SLOTB].noprobe = SLOTB_NOPROBE_IO;
-+                      if ( strncmp(options, "noprobe", 7) == 0)
-+                              vrc4171_sockets[CARD_SLOTB].noprobe = SLOTB_NOPROBE_ALL;
-+              }
-+      }
-+
-+      return 0;
-+}
-+
-+__setup("vrc4171_card=", vrc4171_card_setup);
-+
-+static int __devinit vrc4171_card_init(void)
++static loff_t
++au1550_llseek(struct file *file, loff_t offset, int origin)
 +{
-+      int retval, slot;
-+
-+      vrc4171_set_multifunction_pin(vrc4171_slotb);
-+
-+      if (request_region(CARD_CONTROLLER_INDEX, CARD_CONTROLLER_SIZE,
-+                             "NEC VRC4171 Card Controller") == NULL)
-+              return -EBUSY;
-+
-+      for (slot = 0; slot < CARD_MAX_SLOTS; slot++) {
-+              if (slot == CARD_SLOTB && vrc4171_slotb == SLOTB_IS_NONE)
-+                      break;
-+
-+              retval = vrc4171_add_socket(slot);
-+              if (retval != 0)
-+                      return retval;
-+      }
-+
-+      retval = request_irq(vrc4171_irq, pccard_interrupt, SA_SHIRQ,
-+                           "NEC VRC4171 Card Controller", vrc4171_sockets);
-+      if (retval < 0) {
-+              for (slot = 0; slot < CARD_MAX_SLOTS; slot++)
-+                      vrc4171_remove_socket(slot);
-+
-+              return retval;
-+      }
-+
-+      printk(KERN_INFO "NEC VRC4171 Card Controller, connected to IRQ %d\n", vrc4171_irq);
-+
-+      return 0;
++      return -ESPIPE;
 +}
 +
-+static void __devexit vrc4171_card_exit(void)
-+{
-+      int slot;
-+
-+      for (slot = 0; slot < CARD_MAX_SLOTS; slot++)
-+              vrc4171_remove_socket(slot);
-+
-+      release_region(CARD_CONTROLLER_INDEX, CARD_CONTROLLER_SIZE);
-+}
++static /*const */ struct file_operations au1550_mixer_fops = {
++      owner:THIS_MODULE,
++      llseek:au1550_llseek,
++      ioctl:au1550_ioctl_mixdev,
++      open:au1550_open_mixdev,
++      release:au1550_release_mixdev,
++};
 +
-+module_init(vrc4171_card_init);
-+module_exit(vrc4171_card_exit);
-diff -Nur linux-2.4.29/drivers/sbus/audio/audio.c linux-mips/drivers/sbus/audio/audio.c
---- linux-2.4.29/drivers/sbus/audio/audio.c    2001-10-11 08:42:46.000000000 +0200
-+++ linux-mips/drivers/sbus/audio/audio.c      2005-03-26 11:47:32.089385135 +0100
-@@ -65,6 +65,14 @@
- #define tprintk(x)
- #endif
-+static int  audio_input_buffers = 8;
-+MODULE_PARM(audio_input_buffers, "i");
-+MODULE_PARM_DESC(audio_input_buffers,"Number of input 8KB buffers.");
-+
-+static int  audio_output_buffers = 8;
-+MODULE_PARM(audio_output_buffers, "i");
-+MODULE_PARM_DESC(audio_output_buffers,"Number of output 8KB buffer.");
-+
- static short lis_get_elist_ent( strevent_t *list, pid_t pid );
- static int lis_add_to_elist( strevent_t **list, pid_t pid, short events );
- static int lis_del_from_elist( strevent_t **list, pid_t pid, short events );
-@@ -438,7 +446,7 @@
-                         m = drv->ops->get_input_balance(drv);
-                 i = OSS_TO_GAIN(k);
-                 j = OSS_TO_BAL(k);
--                oprintk((" for stereo to do %d (bal %d):", i, j));
-+                oprintk((" for stereo to do %ld (bal %ld):", i, j));
-                 if (drv->ops->set_input_volume)
-                         drv->ops->set_input_volume(drv, i);
-                 if (drv->ops->set_input_balance)
-@@ -488,7 +496,7 @@
-                 oprintk((" started as (0x%x)\n", BAL_TO_OSS(l,m)));
-                 i = OSS_TO_GAIN(k);
-                 j = OSS_TO_BAL(k);
--                oprintk((" for stereo to %d (bal %d)\n", i, j));
-+                oprintk((" for stereo to %ld (bal %ld)\n", i, j));
-                 if (drv->ops->set_output_volume)
-                         drv->ops->set_output_volume(drv, i);
-                 if (drv->ops->set_output_balance)
-@@ -565,7 +573,7 @@
-           if (k & SOUND_MASK_CD) j = AUDIO_CD;
-           if (k & SOUND_MASK_LINE) j = AUDIO_LINE_IN;
-           if (k & SOUND_MASK_MIC) j = AUDIO_MICROPHONE;
--          oprintk(("setting inport to %d\n", j));
-+          oprintk(("setting inport to %ld\n", j));
-           i = drv->ops->set_input_port(drv, j);
-     
-           return put_user(i, (int *)arg);
-@@ -798,7 +806,7 @@
-                                 retval = -EINVAL;
-                                 break;
-                         }
--                        get_user(i, (int *)arg)
-+                        get_user(i, (int *)arg);
-                         tprintk(("setting speed to %d\n", i));
-                         drv->ops->set_input_rate(drv, i);
-                         drv->ops->set_output_rate(drv, i);
-@@ -1955,8 +1963,6 @@
-          * Input buffers, on the other hand, always fill completely,
-          * so we don't need input counts - each contains input_buffer_size
-          * bytes of audio data.
--         *
--         * TODO: Make number of input/output buffers tunable parameters
-          */
-         init_waitqueue_head(&drv->open_wait);
-@@ -1964,7 +1970,7 @@
-         init_waitqueue_head(&drv->output_drain_wait);
-         init_waitqueue_head(&drv->input_read_wait);
--        drv->num_output_buffers = 8;
-+        drv->num_output_buffers = audio_output_buffers;
-       drv->output_buffer_size = (4096 * 2);
-       drv->playing_count = 0;
-       drv->output_offset = 0;
-@@ -1997,7 +2003,7 @@
-         }
-         /* Setup the circular queue of input buffers. */
--        drv->num_input_buffers = 8;
-+        drv->num_input_buffers = audio_input_buffers;
-       drv->input_buffer_size = (4096 * 2);
-       drv->recording_count = 0;
-         drv->input_front = 0;
-diff -Nur linux-2.4.29/drivers/sbus/audio/dbri.c linux-mips/drivers/sbus/audio/dbri.c
---- linux-2.4.29/drivers/sbus/audio/dbri.c     2002-11-29 00:53:14.000000000 +0100
-+++ linux-mips/drivers/sbus/audio/dbri.c       2005-03-26 11:47:32.378337711 +0100
-@@ -51,6 +51,7 @@
- #include <linux/slab.h>
- #include <linux/version.h>
- #include <linux/delay.h>
-+#include <linux/soundcard.h>
- #include <asm/openprom.h>
- #include <asm/oplib.h>
- #include <asm/system.h>
-@@ -161,7 +162,7 @@
- static void dbri_process_interrupt_buffer(struct dbri *);
--static void dbri_cmdsend(struct dbri *dbri, volatile s32 *cmd)
-+static void dbri_cmdsend(struct dbri *dbri, volatile s32 *cmd, int pause)
+ void
+-codec_init(void)
++codec_init(struct au1550_state *s)
  {
-       int MAXLOOPS = 1000000;
-       int maxloops = MAXLOOPS;
-@@ -181,25 +182,30 @@
-         } else if ((cmd - &dbri->dma->cmd[0]) >= DBRI_NO_CMDS-1) {
-                 printk("DBRI: Command buffer overflow! (bug in driver)\n");
-         } else {
--                *(cmd++) = DBRI_CMD(D_PAUSE, 0, 0);
-+                if (pause) 
-+                      *(cmd++) = DBRI_CMD(D_PAUSE, 0, 0);
-               *(cmd++) = DBRI_CMD(D_WAIT, 1, 0);
-               dbri->wait_seen = 0;
-                 sbus_writel(dbri->dma_dvma, dbri->regs + REG8);
--              while ((--maxloops) > 0 &&
--                       (sbus_readl(dbri->regs + REG0) & D_P))
--                        barrier();
--              if (maxloops == 0) {
--                      printk("DBRI: Chip never completed command buffer\n");
--              } else {
--                      while ((--maxloops) > 0 && (! dbri->wait_seen))
--                              dbri_process_interrupt_buffer(dbri);
-+              if (pause) {
-+                      while ((--maxloops) > 0 &&
-+                             (sbus_readl(dbri->regs + REG0) & D_P))
-+                              barrier();
-                       if (maxloops == 0) {
--                              printk("DBRI: Chip never acked WAIT\n");
-+                              printk("DBRI: Chip never completed command buffer\n");
-                       } else {
--                              dprintk(D_INT, ("DBRI: Chip completed command "
--                                                "buffer (%d)\n",
--                                              MAXLOOPS - maxloops));
-+                              while ((--maxloops) > 0 && (! dbri->wait_seen))
-+                                      dbri_process_interrupt_buffer(dbri);
-+                              if (maxloops == 0) {
-+                                      printk("DBRI: Chip never acked WAIT\n");
-+                              } else {
-+                                      dprintk(D_INT, ("DBRI: Chip completed command "
-+                                                      "buffer (%d)\n",
-+                                                      MAXLOOPS - maxloops));
-+                              }
-                       }
-+              } else {
-+                      dprintk(D_INT, ("DBRI: NO PAUSE\n"));
-               }
-         }
-@@ -257,7 +263,10 @@
-         /* We should query the openprom to see what burst sizes this
-          * SBus supports.  For now, just disable all SBus bursts */
-         tmp = sbus_readl(dbri->regs + REG0);
--        tmp &= ~(D_G | D_S | D_E);
-+      /* A brute approach - DBRI falls back to working burst size by itself
-+       * On SS20 D_S does not work, so do not try so high. */
-+        tmp |= D_G | D_E;
-+        tmp &= ~D_S;
-         sbus_writel(tmp, dbri->regs + REG0);
-       /*
-@@ -268,7 +277,7 @@
-       *(cmd++) = DBRI_CMD(D_IIQ, 0, 0);
-       *(cmd++) = dma_addr;
--        dbri_cmdsend(dbri, cmd);
-+        dbri_cmdsend(dbri, cmd, 1);
- }
-@@ -455,7 +464,7 @@
-                                   dbri->pipes[pipe].sdp
-                                   | D_SDP_P | D_SDP_C | D_SDP_2SAME);
-                 *(cmd++) = dbri->dma_dvma + dbri_dma_off(desc, td);
--              dbri_cmdsend(dbri, cmd);
-+              dbri_cmdsend(dbri, cmd, 1);
-       }
-       if (code == D_INTR_FXDT) {
-@@ -579,7 +588,7 @@
-         cmd = dbri_cmdlock(dbri);
-         *(cmd++) = DBRI_CMD(D_SDP, 0, sdp | D_SDP_C | D_SDP_P);
-         *(cmd++) = 0;
--        dbri_cmdsend(dbri, cmd);
-+        dbri_cmdsend(dbri, cmd, 1);
-       desc = dbri->pipes[pipe].desc;
-       while (desc != -1) {
-@@ -722,7 +731,7 @@
-               *(cmd++) = D_TS_LEN(length) | D_TS_CYCLE(cycle) | D_TS_NEXT(nextpipe);
-       }
--        dbri_cmdsend(dbri, cmd);
-+        dbri_cmdsend(dbri, cmd, 1);
- }
- /* I don't use this function, so it's basically untested. */
-@@ -752,7 +761,7 @@
-               *(cmd++) = D_TS_NEXT(nextpipe);
-         }
--        dbri_cmdsend(dbri, cmd);
-+        dbri_cmdsend(dbri, cmd, 1);
- }
- /* xmit_fixed() / recv_fixed()
-@@ -803,7 +812,7 @@
-         *(cmd++) = DBRI_CMD(D_SSP, 0, pipe);
-         *(cmd++) = data;
--        dbri_cmdsend(dbri, cmd);
-+        dbri_cmdsend(dbri, cmd, 1);
- }
- static void recv_fixed(struct dbri *dbri, int pipe, volatile __u32 *ptr)
-@@ -884,7 +893,9 @@
-                 }
-                 if (len > ((1 << 13) - 1)) {
--                        mylen = (1 << 13) - 1;
-+              /* One should not leave a buffer shorter than    */
-+              /* a single sample. Otherwise bad things happens.*/
-+                        mylen = (1 << 13) - 4;
-                 } else {
-                         mylen = len;
-                 }
-@@ -954,7 +965,7 @@
-               cmd = dbri_cmdlock(dbri);
-               *(cmd++) = DBRI_CMD(D_CDP, 0, pipe);
--              dbri_cmdsend(dbri,cmd);
-+              dbri_cmdsend(dbri,cmd, 0);
-       } else {
-               /* Pipe isn't active - issue an SDP command to start
-                * our chain of TDs running.
-@@ -965,7 +976,7 @@
-                                   dbri->pipes[pipe].sdp
-                                   | D_SDP_P | D_SDP_EVERY | D_SDP_C);
-                 *(cmd++) = dbri->dma_dvma + dbri_dma_off(desc, first_td);
--              dbri_cmdsend(dbri, cmd);
-+              dbri_cmdsend(dbri, cmd, 0);
-       }
-       restore_flags(flags);
-@@ -1083,7 +1094,7 @@
-       *(cmd++) = DBRI_CMD(D_SDP, 0, dbri->pipes[pipe].sdp | D_SDP_P | D_SDP_C);
-         *(cmd++) = dbri->dma_dvma + dbri_dma_off(desc, first_rd);
--        dbri_cmdsend(dbri, cmd);
-+        dbri_cmdsend(dbri, cmd, 1);
- }
-@@ -1191,7 +1202,7 @@
-       *(cmd++) = DBRI_CMD(D_PAUSE, 0, 0);
-       *(cmd++) = DBRI_CMD(D_CDM, 0, D_CDM_XCE|D_CDM_XEN|D_CDM_REN);
--      dbri_cmdsend(dbri, cmd);
-+      dbri_cmdsend(dbri, cmd, 1);
- }
- /*
-@@ -1538,7 +1549,6 @@
-       xmit_on_pipe(dbri, 4, buffer, count,
-                    &dbri_audio_output_callback, drv);
--#if 0
-       /* Notify midlevel that we're a DMA-capable driver that
-        * can accept another buffer immediately.  We should probably
-        * check that we've got enough resources (i.e, descriptors)
-@@ -1551,9 +1561,14 @@
-        * DBRI with a chain of buffers, but the midlevel code is
-        * so tricky that I really don't want to deal with it.
-        */
-+      /*
-+       * This must be enabled otherwise the output is noisy
-+       * as return to user space is done when all buffers
-+       * are already played, so user space player has no time
-+       * to prepare next ones without a period of silence. - Krzysztof Helt
-+       */
-       sparcaudio_output_done(drv, 2);
--#endif
- }
- static void dbri_stop_output(struct sparcaudio_driver *drv)
-@@ -1842,6 +1857,12 @@
-       return dbri_get_output_rate(drv);
- }
-+static int dbri_get_formats(struct sparcaudio_driver *drv)
-+{
-+/* 8-bit format is not working */
-+        return (AFMT_MU_LAW | AFMT_A_LAW | AFMT_S16_BE);
-+}
-+
- /******************* sparcaudio midlevel - ports ***********************/
- static int dbri_set_output_port(struct sparcaudio_driver *drv, int port)
-@@ -1983,6 +2004,19 @@
-       dbri_get_input_ports,
-       dbri_set_output_muted,
-       dbri_get_output_muted,
-+      NULL, /* dbri_set_output_pause, */
-+      NULL, /* dbri_get_output_pause, */
-+      NULL, /* dbri_set_input_pause, */
-+      NULL, /* dbri_get_input_pause, */
-+      NULL, /* dbri_set_output_samples, */
-+      NULL, /* dbri_get_output_samples, */
-+      NULL, /* dbri_set_input_samples, */
-+      NULL, /* dbri_get_input_samples, */
-+      NULL, /* dbri_set_output_error, */
-+      NULL, /* dbri_get_output_error, */
-+      NULL, /* dbri_set_input_error, */
-+      NULL, /* dbri_get_input_error, */
-+        dbri_get_formats
- };
-@@ -2093,7 +2127,7 @@
- #endif
-              *(cmd++) = DBRI_CMD(D_TE, 0, val);
--             dbri_cmdsend(dbri, cmd);
-+             dbri_cmdsend(dbri, cmd, 1);
-              /* Activate the interface */
-                tmp = sbus_readl(dbri->regs + REG0);
-diff -Nur linux-2.4.29/drivers/scsi/ahci.c linux-mips/drivers/scsi/ahci.c
---- linux-2.4.29/drivers/scsi/ahci.c   2005-01-19 15:10:01.000000000 +0100
-+++ linux-mips/drivers/scsi/ahci.c     2005-03-26 11:47:32.448326225 +0100
-@@ -40,8 +40,6 @@
- #define DRV_NAME      "ahci"
- #define DRV_VERSION   "1.00"
--#define msleep libata_msleep   /* 2.4-specific */
--
- enum {
-       AHCI_PCI_BAR            = 5,
-       AHCI_MAX_SG             = 168, /* hardware max is 64K */
-@@ -180,6 +178,7 @@
- static void ahci_host_stop(struct ata_host_set *host_set);
- static void ahci_qc_prep(struct ata_queued_cmd *qc);
- static u8 ahci_check_status(struct ata_port *ap);
-+static u8 ahci_check_err(struct ata_port *ap);
- static inline int ahci_host_intr(struct ata_port *ap, struct ata_queued_cmd *qc);
- static Scsi_Host_Template ahci_sht = {
-@@ -206,6 +205,8 @@
-       .port_disable           = ata_port_disable,
-       .check_status           = ahci_check_status,
-+      .check_altstatus        = ahci_check_status,
-+      .check_err              = ahci_check_err,
-       .dev_select             = ata_noop_dev_select,
-       .phy_reset              = ahci_phy_reset,
-@@ -248,6 +249,12 @@
-         board_ahci }, /* ICH7 */
-       { PCI_VENDOR_ID_INTEL, 0x27c5, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
-         board_ahci }, /* ICH7M */
-+      { PCI_VENDOR_ID_INTEL, 0x27c2, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
-+        board_ahci }, /* ICH7R */
-+      { PCI_VENDOR_ID_INTEL, 0x27c3, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
-+        board_ahci }, /* ICH7R */
-+      { PCI_VENDOR_ID_AL, 0x5288, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
-+        board_ahci }, /* ULi M5288 */
-       { }     /* terminate list */
- };
-@@ -448,6 +455,13 @@
-       return readl(mmio + PORT_TFDATA) & 0xFF;
- }
-+static u8 ahci_check_err(struct ata_port *ap)
-+{
-+      void *mmio = (void *) ap->ioaddr.cmd_addr;
-+
-+      return (readl(mmio + PORT_TFDATA) >> 8) & 0xFF;
-+}
-+
- static void ahci_fill_sg(struct ata_queued_cmd *qc)
- {
-       struct ahci_port_priv *pp = qc->ap->private_data;
-@@ -515,15 +529,6 @@
-       ahci_fill_sg(qc);
- }
--static inline void ahci_dma_complete (struct ata_port *ap,
--                                     struct ata_queued_cmd *qc,
--                                   int have_err)
--{
--      /* get drive status; clear intr; complete txn */
--      ata_qc_complete(ata_qc_from_tag(ap, ap->active_tag),
--                      have_err ? ATA_ERR : 0);
--}
--
- static void ahci_intr_error(struct ata_port *ap, u32 irq_stat)
- {
-       void *mmio = ap->host_set->mmio_base;
-@@ -569,7 +574,7 @@
-       writel(tmp, port_mmio + PORT_CMD);
-       readl(port_mmio + PORT_CMD); /* flush */
--      printk(KERN_WARNING "ata%u: error occurred, port reset\n", ap->port_no);
-+      printk(KERN_WARNING "ata%u: error occurred, port reset\n", ap->id);
- }
- static void ahci_eng_timeout(struct ata_port *ap)
-@@ -761,10 +766,10 @@
-       using_dac = hpriv->cap & HOST_CAP_64;
-       if (using_dac &&
--          !pci_set_dma_mask(pdev, 0xffffffffffffffffULL)) {
-+          !pci_set_dma_mask(pdev, DMA_64BIT_MASK)) {
-               hpriv->flags |= HOST_CAP_64;
-       } else {
--              rc = pci_set_dma_mask(pdev, 0xffffffffULL);
-+              rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
-               if (rc) {
-                       printk(KERN_ERR DRV_NAME "(%s): 32-bit DMA enable failed\n",
-                               pci_name(pdev));
-@@ -929,6 +934,7 @@
-       unsigned long base;
-       void *mmio_base;
-       unsigned int board_idx = (unsigned int) ent->driver_data;
-+      int pci_dev_busy = 0;
-       int rc;
-       VPRINTK("ENTER\n");
-@@ -941,8 +947,10 @@
-               return rc;
-       rc = pci_request_regions(pdev, DRV_NAME);
--      if (rc)
-+      if (rc) {
-+              pci_dev_busy = 1;
-               goto err_out;
-+      }
-       pci_enable_intx(pdev);
-@@ -1002,7 +1010,8 @@
- err_out_regions:
-       pci_release_regions(pdev);
- err_out:
--      pci_disable_device(pdev);
-+      if (!pci_dev_busy)
-+              pci_disable_device(pdev);
-       return rc;
- }
-diff -Nur linux-2.4.29/drivers/scsi/aic7xxx/aic79xx_pci.c linux-mips/drivers/scsi/aic7xxx/aic79xx_pci.c
---- linux-2.4.29/drivers/scsi/aic7xxx/aic79xx_pci.c    2003-08-25 13:44:42.000000000 +0200
-+++ linux-mips/drivers/scsi/aic7xxx/aic79xx_pci.c      2005-03-26 11:47:34.828935512 +0100
-@@ -451,8 +451,10 @@
-        * or read prefetching could be initiated by the
-        * CPU or host bridge.  Our device does not support
-        * either, so look for data corruption and/or flaged
--       * PCI errors.
-+       * PCI errors.  First pause without causing another
-+       * chip reset.
-        */
-+      hcntrl &= ~CHIPRST;
-       ahd_outb(ahd, HCNTRL, hcntrl|PAUSE);
-       while (ahd_is_paused(ahd) == 0)
-               ;
-diff -Nur linux-2.4.29/drivers/scsi/aic7xxx/aic7xxx_pci.c linux-mips/drivers/scsi/aic7xxx/aic7xxx_pci.c
---- linux-2.4.29/drivers/scsi/aic7xxx/aic7xxx_pci.c    2003-08-25 13:44:42.000000000 +0200
-+++ linux-mips/drivers/scsi/aic7xxx/aic7xxx_pci.c      2005-03-26 11:47:34.831935020 +0100
-@@ -1284,8 +1284,10 @@
-        * or read prefetching could be initiated by the
-        * CPU or host bridge.  Our device does not support
-        * either, so look for data corruption and/or flagged
--       * PCI errors.
-+       * PCI errors.  First pause without causing another
-+       * chip reset.
-        */
-+      hcntrl &= ~CHIPRST;
-       ahc_outb(ahc, HCNTRL, hcntrl|PAUSE);
-       while (ahc_is_paused(ahc) == 0)
-               ;
-diff -Nur linux-2.4.29/drivers/scsi/ata_piix.c linux-mips/drivers/scsi/ata_piix.c
---- linux-2.4.29/drivers/scsi/ata_piix.c       2005-01-19 15:10:01.000000000 +0100
-+++ linux-mips/drivers/scsi/ata_piix.c 2005-03-26 11:47:32.450325897 +0100
-@@ -139,6 +139,8 @@
-       .bmdma_setup            = ata_bmdma_setup,
-       .bmdma_start            = ata_bmdma_start,
-+      .bmdma_stop             = ata_bmdma_stop,
-+      .bmdma_status           = ata_bmdma_status,
-       .qc_prep                = ata_qc_prep,
-       .qc_issue               = ata_qc_issue_prot,
-@@ -164,6 +166,8 @@
-       .bmdma_setup            = ata_bmdma_setup,
-       .bmdma_start            = ata_bmdma_start,
-+      .bmdma_stop             = ata_bmdma_stop,
-+      .bmdma_status           = ata_bmdma_status,
-       .qc_prep                = ata_qc_prep,
-       .qc_issue               = ata_qc_issue_prot,
-diff -Nur linux-2.4.29/drivers/scsi/Config.in linux-mips/drivers/scsi/Config.in
---- linux-2.4.29/drivers/scsi/Config.in        2005-01-19 15:09:59.000000000 +0100
-+++ linux-mips/drivers/scsi/Config.in  2005-03-26 11:47:32.437328030 +0100
-@@ -73,6 +73,7 @@
- dep_tristate '  ServerWorks Frodo / Apple K2 SATA support (EXPERIMENTAL)' CONFIG_SCSI_SATA_SVW $CONFIG_SCSI_SATA $CONFIG_PCI $CONFIG_EXPERIMENTAL
- dep_tristate '  Intel PIIX/ICH SATA support' CONFIG_SCSI_ATA_PIIX $CONFIG_SCSI_SATA $CONFIG_PCI
- dep_tristate '  NVIDIA SATA support (EXPERIMENTAL)' CONFIG_SCSI_SATA_NV $CONFIG_SCSI_SATA $CONFIG_PCI $CONFIG_EXPERIMENTAL
-+dep_tristate '  Pacific Digital SATA QStor support' CONFIG_SCSI_SATA_QSTOR $CONFIG_SCSI_SATA $CONFIG_PCI
- dep_tristate '  Promise SATA TX2/TX4 support (EXPERIMENTAL)' CONFIG_SCSI_SATA_PROMISE $CONFIG_SCSI_SATA $CONFIG_PCI $CONFIG_EXPERIMENTAL
- dep_tristate '  Promise SATA SX4 support (EXPERIMENTAL)' CONFIG_SCSI_SATA_SX4 $CONFIG_SCSI_SATA $CONFIG_PCI $CONFIG_EXPERIMENTAL
- dep_tristate '  Silicon Image SATA support (EXPERIMENTAL)' CONFIG_SCSI_SATA_SIL $CONFIG_SCSI_SATA $CONFIG_PCI $CONFIG_EXPERIMENTAL
-diff -Nur linux-2.4.29/drivers/scsi/libata-core.c linux-mips/drivers/scsi/libata-core.c
---- linux-2.4.29/drivers/scsi/libata-core.c    2005-01-19 15:10:03.000000000 +0100
-+++ linux-mips/drivers/scsi/libata-core.c      2005-03-26 11:47:32.481320810 +0100
-@@ -376,7 +376,7 @@
- }
- /**
-- *    ata_check_status - Read device status reg & clear interrupt
-+ *    ata_check_status_pio - Read device status reg & clear interrupt
-  *    @ap: port where the device is
-  *
-  *    Reads ATA taskfile status register for currently-selected device
-@@ -414,6 +414,27 @@
-       return ata_check_status_pio(ap);
- }
-+u8 ata_altstatus(struct ata_port *ap)
-+{
-+      if (ap->ops->check_altstatus)
-+              return ap->ops->check_altstatus(ap);
-+
-+      if (ap->flags & ATA_FLAG_MMIO)
-+              return readb((void __iomem *)ap->ioaddr.altstatus_addr);
-+      return inb(ap->ioaddr.altstatus_addr);
-+}
-+
-+u8 ata_chk_err(struct ata_port *ap)
-+{
-+      if (ap->ops->check_err)
-+              return ap->ops->check_err(ap);
-+
-+      if (ap->flags & ATA_FLAG_MMIO) {
-+              return readb((void __iomem *) ap->ioaddr.error_addr);
-+      }
-+      return inb(ap->ioaddr.error_addr);
-+}
-+
- /**
-  *    ata_tf_to_fis - Convert ATA taskfile to SATA FIS structure
-  *    @tf: Taskfile to convert
-@@ -1160,7 +1181,6 @@
-       printk(KERN_WARNING "ata%u: dev %u not supported, ignoring\n",
-              ap->id, device);
- err_out:
--      ata_irq_on(ap); /* re-enable interrupts */
-       dev->class++;   /* converts ATA_DEV_xxx into ATA_DEV_xxx_UNSUP */
-       DPRINTK("EXIT, err\n");
- }
-@@ -1668,7 +1688,8 @@
-               ata_dev_try_classify(ap, 1);
-       /* re-enable interrupts */
--      ata_irq_on(ap);
-+      if (ap->ioaddr.ctl_addr)        /* FIXME: hack. create a hook instead */
-+              ata_irq_on(ap);
-       /* is double-select really necessary? */
-       if (ap->device[1].class != ATA_DEV_NONE)
-@@ -1699,6 +1720,69 @@
-       DPRINTK("EXIT\n");
- }
-+static void ata_pr_blacklisted(struct ata_port *ap, struct ata_device *dev)
-+{
-+      printk(KERN_WARNING "ata%u: dev %u is on DMA blacklist, disabling DMA\n",
-+              ap->id, dev->devno);
-+}
-+
-+static const char * ata_dma_blacklist [] = {
-+      "WDC AC11000H",
-+      "WDC AC22100H",
-+      "WDC AC32500H",
-+      "WDC AC33100H",
-+      "WDC AC31600H",
-+      "WDC AC32100H",
-+      "WDC AC23200L",
-+      "Compaq CRD-8241B",
-+      "CRD-8400B",
-+      "CRD-8480B",
-+      "CRD-8482B",
-+      "CRD-84",
-+      "SanDisk SDP3B",
-+      "SanDisk SDP3B-64",
-+      "SANYO CD-ROM CRD",
-+      "HITACHI CDR-8",
-+      "HITACHI CDR-8335",
-+      "HITACHI CDR-8435",
-+      "Toshiba CD-ROM XM-6202B",
-+      "CD-532E-A",
-+      "E-IDE CD-ROM CR-840",
-+      "CD-ROM Drive/F5A",
-+      "WPI CDD-820",
-+      "SAMSUNG CD-ROM SC-148C",
-+      "SAMSUNG CD-ROM SC",
-+      "SanDisk SDP3B-64",
-+      "SAMSUNG CD-ROM SN-124",
-+      "ATAPI CD-ROM DRIVE 40X MAXIMUM",
-+      "_NEC DV5800A",
-+};
-+
-+static int ata_dma_blacklisted(struct ata_port *ap, struct ata_device *dev)
-+{
-+      unsigned char model_num[40];
-+      char *s;
-+      unsigned int len;
-+      int i;
-+
-+      ata_dev_id_string(dev->id, model_num, ATA_ID_PROD_OFS,
-+                        sizeof(model_num));
-+      s = &model_num[0];
-+      len = strnlen(s, sizeof(model_num));
-+
-+      /* ATAPI specifies that empty space is blank-filled; remove blanks */
-+      while ((len > 0) && (s[len - 1] == ' ')) {
-+              len--;
-+              s[len] = 0;
-+      }
-+
-+      for (i = 0; i < ARRAY_SIZE(ata_dma_blacklist); i++)
-+              if (!strncmp(ata_dma_blacklist[i], s, len))
-+                      return 1;
-+
-+      return 0;
-+}
-+
- static unsigned int ata_get_mode_mask(struct ata_port *ap, int shift)
- {
-       struct ata_device *master, *slave;
-@@ -1711,17 +1795,37 @@
-       if (shift == ATA_SHIFT_UDMA) {
-               mask = ap->udma_mask;
--              if (ata_dev_present(master))
-+              if (ata_dev_present(master)) {
-                       mask &= (master->id[ATA_ID_UDMA_MODES] & 0xff);
--              if (ata_dev_present(slave))
-+                      if (ata_dma_blacklisted(ap, master)) {
-+                              mask = 0;
-+                              ata_pr_blacklisted(ap, master);
-+                      }
-+              }
-+              if (ata_dev_present(slave)) {
-                       mask &= (slave->id[ATA_ID_UDMA_MODES] & 0xff);
-+                      if (ata_dma_blacklisted(ap, slave)) {
-+                              mask = 0;
-+                              ata_pr_blacklisted(ap, slave);
-+                      }
-+              }
-       }
-       else if (shift == ATA_SHIFT_MWDMA) {
-               mask = ap->mwdma_mask;
--              if (ata_dev_present(master))
-+              if (ata_dev_present(master)) {
-                       mask &= (master->id[ATA_ID_MWDMA_MODES] & 0x07);
--              if (ata_dev_present(slave))
-+                      if (ata_dma_blacklisted(ap, master)) {
-+                              mask = 0;
-+                              ata_pr_blacklisted(ap, master);
-+                      }
-+              }
-+              if (ata_dev_present(slave)) {
-                       mask &= (slave->id[ATA_ID_MWDMA_MODES] & 0x07);
-+                      if (ata_dma_blacklisted(ap, slave)) {
-+                              mask = 0;
-+                              ata_pr_blacklisted(ap, slave);
-+                      }
-+              }
-       }
-       else if (shift == ATA_SHIFT_PIO) {
-               mask = ap->pio_mask;
-@@ -2518,10 +2622,10 @@
-       case ATA_PROT_DMA:
-       case ATA_PROT_ATAPI_DMA:
--              host_stat = ata_bmdma_status(ap);
-+              host_stat = ap->ops->bmdma_status(ap);
-               /* before we do anything else, clear DMA-Start bit */
--              ata_bmdma_stop(ap);
-+              ap->ops->bmdma_stop(ap);
-               /* fall through */
-@@ -2530,7 +2634,7 @@
-               drv_stat = ata_chk_status(ap);
-               /* ack bmdma irq events */
--              ata_bmdma_ack_irq(ap);
-+              ap->ops->irq_clear(ap);
-               printk(KERN_ERR "ata%u: command 0x%x timeout, stat 0x%x host_stat 0x%x\n",
-                      ap->id, qc->tf.command, drv_stat, host_stat);
-@@ -2669,6 +2773,24 @@
- }
- /**
-+ *    ata_qc_free - free unused ata_queued_cmd
-+ *    @qc: Command to complete
-+ *
-+ *    Designed to free unused ata_queued_cmd object
-+ *    in case something prevents using it.
-+ *
-+ *    LOCKING:
-+ *
-+ */
-+void ata_qc_free(struct ata_queued_cmd *qc)
-+{
-+      assert(qc != NULL);     /* ata_qc_from_tag _might_ return NULL */
-+      assert(qc->waiting == NULL);    /* nothing should be waiting */
-+
-+      __ata_qc_complete(qc);
-+}
-+
-+/**
-  *    ata_qc_complete - Complete an active ATA command
-  *    @qc: Command to complete
-  *    @drv_stat: ATA status register contents
-@@ -2717,7 +2839,7 @@
-                       return 1;
-               /* fall through */
--
-+      
-       default:
-               return 0;
-       }
-@@ -2959,7 +3081,43 @@
- void ata_bmdma_irq_clear(struct ata_port *ap)
- {
--      ata_bmdma_ack_irq(ap);
-+    if (ap->flags & ATA_FLAG_MMIO) {
-+        void __iomem *mmio = ((void __iomem *) ap->ioaddr.bmdma_addr) + ATA_DMA_STATUS;
-+        writeb(readb(mmio), mmio);
-+    } else {
-+        unsigned long addr = ap->ioaddr.bmdma_addr + ATA_DMA_STATUS;
-+        outb(inb(addr), addr);
-+    }
-+
-+}
-+
-+u8 ata_bmdma_status(struct ata_port *ap)
-+{
-+      u8 host_stat;
-+      if (ap->flags & ATA_FLAG_MMIO) {
-+              void __iomem *mmio = (void __iomem *) ap->ioaddr.bmdma_addr;
-+              host_stat = readb(mmio + ATA_DMA_STATUS);
-+      } else
-+      host_stat = inb(ap->ioaddr.bmdma_addr + ATA_DMA_STATUS);
-+      return host_stat;
-+}
-+
-+void ata_bmdma_stop(struct ata_port *ap)
-+{
-+      if (ap->flags & ATA_FLAG_MMIO) {
-+              void __iomem *mmio = (void __iomem *) ap->ioaddr.bmdma_addr;
-+
-+              /* clear start/stop bit */
-+              writeb(readb(mmio + ATA_DMA_CMD) & ~ATA_DMA_START,
-+                      mmio + ATA_DMA_CMD);
-+      } else {
-+              /* clear start/stop bit */
-+              outb(inb(ap->ioaddr.bmdma_addr + ATA_DMA_CMD) & ~ATA_DMA_START,
-+                      ap->ioaddr.bmdma_addr + ATA_DMA_CMD);
-+      }
-+
-+      /* one-PIO-cycle guaranteed wait, per spec, for HDMA1:0 transition */
-+      ata_altstatus(ap);        /* dummy read */
- }
- /**
-@@ -2989,7 +3147,7 @@
-       case ATA_PROT_ATAPI_DMA:
-       case ATA_PROT_ATAPI:
-               /* check status of DMA engine */
--              host_stat = ata_bmdma_status(ap);
-+              host_stat = ap->ops->bmdma_status(ap);
-               VPRINTK("ata%u: host_stat 0x%X\n", ap->id, host_stat);
-               /* if it's not our irq... */
-@@ -2997,7 +3155,7 @@
-                       goto idle_irq;
-               /* before we do anything else, clear DMA-Start bit */
--              ata_bmdma_stop(ap);
-+              ap->ops->bmdma_stop(ap);
-               /* fall through */
-@@ -3016,7 +3174,7 @@
-                       ap->id, qc->tf.protocol, status);
-               /* ack bmdma irq events */
--              ata_bmdma_ack_irq(ap);
-+              ap->ops->irq_clear(ap);
-               /* complete taskfile transaction */
-               ata_qc_complete(qc, status);
-@@ -3470,32 +3628,28 @@
- }
- static struct ata_probe_ent *
--ata_probe_ent_alloc(int n, struct device *dev, struct ata_port_info **port)
-+ata_probe_ent_alloc(struct device *dev, struct ata_port_info *port)
- {
-       struct ata_probe_ent *probe_ent;
--      int i;
--      probe_ent = kmalloc(sizeof(*probe_ent) * n, GFP_KERNEL);
-+      probe_ent = kmalloc(sizeof(*probe_ent), GFP_KERNEL);
-       if (!probe_ent) {
-               printk(KERN_ERR DRV_NAME "(%s): out of memory\n",
-                      pci_name(to_pci_dev(dev)));
-               return NULL;
-       }
--      memset(probe_ent, 0, sizeof(*probe_ent) * n);
-+      memset(probe_ent, 0, sizeof(*probe_ent));
--      for (i = 0; i < n; i++) {
--              INIT_LIST_HEAD(&probe_ent[i].node);
--              probe_ent[i].dev = dev;
--
--              probe_ent[i].sht = port[i]->sht;
--              probe_ent[i].host_flags = port[i]->host_flags;
--              probe_ent[i].pio_mask = port[i]->pio_mask;
--              probe_ent[i].mwdma_mask = port[i]->mwdma_mask;
--              probe_ent[i].udma_mask = port[i]->udma_mask;
--              probe_ent[i].port_ops = port[i]->port_ops;
-+      INIT_LIST_HEAD(&probe_ent->node);
-+      probe_ent->dev = dev;
--      }
-+      probe_ent->sht = port->sht;
-+      probe_ent->host_flags = port->host_flags;
-+      probe_ent->pio_mask = port->pio_mask;
-+      probe_ent->mwdma_mask = port->mwdma_mask;
-+      probe_ent->udma_mask = port->udma_mask;
-+      probe_ent->port_ops = port->port_ops;
-       return probe_ent;
- }
-@@ -3505,7 +3659,7 @@
- ata_pci_init_native_mode(struct pci_dev *pdev, struct ata_port_info **port)
- {
-       struct ata_probe_ent *probe_ent =
--              ata_probe_ent_alloc(1, pci_dev_to_dev(pdev), port);
-+              ata_probe_ent_alloc(pci_dev_to_dev(pdev), port[0]);
-       if (!probe_ent)
-               return NULL;
-@@ -3531,39 +3685,47 @@
-       return probe_ent;
- }
--struct ata_probe_ent *
--ata_pci_init_legacy_mode(struct pci_dev *pdev, struct ata_port_info **port)
-+static struct ata_probe_ent *
-+ata_pci_init_legacy_mode(struct pci_dev *pdev, struct ata_port_info **port,
-+    struct ata_probe_ent **ppe2)
- {
--      struct ata_probe_ent *probe_ent =
--              ata_probe_ent_alloc(2, pci_dev_to_dev(pdev), port);
-+      struct ata_probe_ent *probe_ent, *probe_ent2;
-+
-+      probe_ent = ata_probe_ent_alloc(pci_dev_to_dev(pdev), port[0]);
-       if (!probe_ent)
-               return NULL;
-+      probe_ent2 = ata_probe_ent_alloc(pci_dev_to_dev(pdev), port[1]);
-+      if (!probe_ent2) {
-+              kfree(probe_ent);
-+              return NULL;
-+      }
-+
-+      probe_ent->n_ports = 1;
-+      probe_ent->irq = 14;
--      probe_ent[0].n_ports = 1;
--      probe_ent[0].irq = 14;
-+      probe_ent->hard_port_no = 0;
-+      probe_ent->legacy_mode = 1;
--      probe_ent[0].hard_port_no = 0;
--      probe_ent[0].legacy_mode = 1;
-+      probe_ent2->n_ports = 1;
-+      probe_ent2->irq = 15;
--      probe_ent[1].n_ports = 1;
--      probe_ent[1].irq = 15;
-+      probe_ent2->hard_port_no = 1;
-+      probe_ent2->legacy_mode = 1;
--      probe_ent[1].hard_port_no = 1;
--      probe_ent[1].legacy_mode = 1;
--
--      probe_ent[0].port[0].cmd_addr = 0x1f0;
--      probe_ent[0].port[0].altstatus_addr =
--      probe_ent[0].port[0].ctl_addr = 0x3f6;
--      probe_ent[0].port[0].bmdma_addr = pci_resource_start(pdev, 4);
--
--      probe_ent[1].port[0].cmd_addr = 0x170;
--      probe_ent[1].port[0].altstatus_addr =
--      probe_ent[1].port[0].ctl_addr = 0x376;
--      probe_ent[1].port[0].bmdma_addr = pci_resource_start(pdev, 4)+8;
-+      probe_ent->port[0].cmd_addr = 0x1f0;
-+      probe_ent->port[0].altstatus_addr =
-+      probe_ent->port[0].ctl_addr = 0x3f6;
-+      probe_ent->port[0].bmdma_addr = pci_resource_start(pdev, 4);
-+
-+      probe_ent2->port[0].cmd_addr = 0x170;
-+      probe_ent2->port[0].altstatus_addr =
-+      probe_ent2->port[0].ctl_addr = 0x376;
-+      probe_ent2->port[0].bmdma_addr = pci_resource_start(pdev, 4)+8;
--      ata_std_ports(&probe_ent[0].port[0]);
--      ata_std_ports(&probe_ent[1].port[0]);
-+      ata_std_ports(&probe_ent->port[0]);
-+      ata_std_ports(&probe_ent2->port[0]);
-+      *ppe2 = probe_ent2;
-       return probe_ent;
- }
-@@ -3587,6 +3749,7 @@
-       struct ata_port_info *port[2];
-       u8 tmp8, mask;
-       unsigned int legacy_mode = 0;
-+      int disable_dev_on_err = 1;
-       int rc;
-       DPRINTK("ENTER\n");
-@@ -3597,7 +3760,8 @@
-       else
-               port[1] = port[0];
--      if ((port[0]->host_flags & ATA_FLAG_NO_LEGACY) == 0) {
-+      if ((port[0]->host_flags & ATA_FLAG_NO_LEGACY) == 0
-+          && (pdev->class >> 8) == PCI_CLASS_STORAGE_IDE) {
-               /* TODO: support transitioning to native mode? */
-               pci_read_config_byte(pdev, PCI_CLASS_PROG, &tmp8);
-               mask = (1 << 2) | (1 << 0);
-@@ -3616,18 +3780,22 @@
-               return rc;
-       rc = pci_request_regions(pdev, DRV_NAME);
--      if (rc)
-+      if (rc) {
-+              disable_dev_on_err = 0;
-               goto err_out;
-+      }
-       if (legacy_mode) {
--              if (!request_region(0x1f0, 8, "libata"))
-+              if (!request_region(0x1f0, 8, "libata")) {
-+                      disable_dev_on_err = 0;
-                       printk(KERN_WARNING "ata: 0x1f0 IDE port busy\n");
--              else
-+              } else
-                       legacy_mode |= (1 << 0);
--              if (!request_region(0x170, 8, "libata"))
-+              if (!request_region(0x170, 8, "libata")) {
-+                      disable_dev_on_err = 0;
-                       printk(KERN_WARNING "ata: 0x170 IDE port busy\n");
--              else
-+              } else
-                       legacy_mode |= (1 << 1);
-       }
-@@ -3642,9 +3810,7 @@
-               goto err_out_regions;
-       if (legacy_mode) {
--              probe_ent = ata_pci_init_legacy_mode(pdev, port);
--              if (probe_ent)
--                      probe_ent2 = &probe_ent[1];
-+              probe_ent = ata_pci_init_legacy_mode(pdev, port, &probe_ent2);
-       } else
-               probe_ent = ata_pci_init_native_mode(pdev, port);
-       if (!probe_ent) {
-@@ -3656,17 +3822,14 @@
-       spin_lock(&ata_module_lock);
-       if (legacy_mode) {
--              int free = 0;
-               if (legacy_mode & (1 << 0))
-                       list_add_tail(&probe_ent->node, &ata_probe_list);
-               else
--                      free++;
-+                      kfree(probe_ent);
-               if (legacy_mode & (1 << 1))
-                       list_add_tail(&probe_ent2->node, &ata_probe_list);
-               else
--                      free++;
--              if (free > 1)
--                      kfree(probe_ent);
-+                      kfree(probe_ent2);
-       } else {
-               list_add_tail(&probe_ent->node, &ata_probe_list);
-       }
-@@ -3681,7 +3844,8 @@
-               release_region(0x170, 8);
-       pci_release_regions(pdev);
- err_out:
--      pci_disable_device(pdev);
-+      if (disable_dev_on_err)
-+              pci_disable_device(pdev);
-       return rc;
- }
-@@ -3723,15 +3887,12 @@
-       if (host_set->mmio_base)
-               iounmap(host_set->mmio_base);
--      pci_release_regions(pdev);
--
-       for (i = 0; i < host_set->n_ports; i++) {
--              struct ata_ioports *ioaddr;
--
-               ap = host_set->ports[i];
--              ioaddr = &ap->ioaddr;
-               if ((ap->flags & ATA_FLAG_NO_LEGACY) == 0) {
-+                      struct ata_ioports *ioaddr = &ap->ioaddr;
-+
-                       if (ioaddr->cmd_addr == 0x1f0)
-                               release_region(0x1f0, 8);
-                       else if (ioaddr->cmd_addr == 0x170)
-@@ -3740,6 +3901,8 @@
-       }
-       kfree(host_set);
-+
-+      pci_release_regions(pdev);
-       pci_disable_device(pdev);
-       dev_set_drvdata(dev, NULL);
- }
-@@ -3839,6 +4002,8 @@
- EXPORT_SYMBOL_GPL(ata_tf_to_fis);
- EXPORT_SYMBOL_GPL(ata_tf_from_fis);
- EXPORT_SYMBOL_GPL(ata_check_status);
-+EXPORT_SYMBOL_GPL(ata_altstatus);
-+EXPORT_SYMBOL_GPL(ata_chk_err);
- EXPORT_SYMBOL_GPL(ata_exec_command);
- EXPORT_SYMBOL_GPL(ata_port_start);
- EXPORT_SYMBOL_GPL(ata_port_stop);
-@@ -3847,6 +4012,8 @@
- EXPORT_SYMBOL_GPL(ata_bmdma_setup);
- EXPORT_SYMBOL_GPL(ata_bmdma_start);
- EXPORT_SYMBOL_GPL(ata_bmdma_irq_clear);
-+EXPORT_SYMBOL_GPL(ata_bmdma_status);
-+EXPORT_SYMBOL_GPL(ata_bmdma_stop);
- EXPORT_SYMBOL_GPL(ata_port_probe);
- EXPORT_SYMBOL_GPL(sata_phy_reset);
- EXPORT_SYMBOL_GPL(__sata_phy_reset);
-@@ -3857,7 +4024,6 @@
- EXPORT_SYMBOL_GPL(ata_scsi_error);
- EXPORT_SYMBOL_GPL(ata_scsi_detect);
- EXPORT_SYMBOL_GPL(ata_add_to_probe_list);
--EXPORT_SYMBOL_GPL(libata_msleep);
- EXPORT_SYMBOL_GPL(ssleep);
- EXPORT_SYMBOL_GPL(ata_scsi_release);
- EXPORT_SYMBOL_GPL(ata_host_intr);
-@@ -3867,7 +4033,6 @@
- #ifdef CONFIG_PCI
- EXPORT_SYMBOL_GPL(pci_test_config_bits);
--EXPORT_SYMBOL_GPL(ata_pci_init_legacy_mode);
- EXPORT_SYMBOL_GPL(ata_pci_init_native_mode);
- EXPORT_SYMBOL_GPL(ata_pci_init_one);
- EXPORT_SYMBOL_GPL(ata_pci_remove_one);
-diff -Nur linux-2.4.29/drivers/scsi/libata.h linux-mips/drivers/scsi/libata.h
---- linux-2.4.29/drivers/scsi/libata.h 2005-01-19 15:10:03.000000000 +0100
-+++ linux-mips/drivers/scsi/libata.h   2005-03-26 11:47:32.487319825 +0100
-@@ -37,6 +37,7 @@
- /* libata-core.c */
- extern struct ata_queued_cmd *ata_qc_new_init(struct ata_port *ap,
-                                     struct ata_device *dev);
-+extern void ata_qc_free(struct ata_queued_cmd *qc);
- extern int ata_qc_issue(struct ata_queued_cmd *qc);
- extern int ata_check_atapi_dma(struct ata_queued_cmd *qc);
- extern void ata_dev_select(struct ata_port *ap, unsigned int device,
-diff -Nur linux-2.4.29/drivers/scsi/libata-scsi.c linux-mips/drivers/scsi/libata-scsi.c
---- linux-2.4.29/drivers/scsi/libata-scsi.c    2005-01-19 15:10:03.000000000 +0100
-+++ linux-mips/drivers/scsi/libata-scsi.c      2005-03-26 11:47:32.485320153 +0100
-@@ -203,7 +203,7 @@
-               {0x40,          MEDIUM_ERROR, 0x11, 0x04},      // Uncorrectable ECC error      Unrecovered read error
-               /* BBD - block marked bad */
-               {0x80,          MEDIUM_ERROR, 0x11, 0x04},      // Block marked bad               Medium error, unrecovered read error
--              {0xFF, 0xFF, 0xFF, 0xFF}, // END mark 
-+              {0xFF, 0xFF, 0xFF, 0xFF}, // END mark
-       };
-       static unsigned char stat_table[][4] = {
-               /* Must be first because BUSY means no other bits valid */
-@@ -211,22 +211,22 @@
-               {0x20,          HARDWARE_ERROR,  0x00, 0x00},   // Device fault
-               {0x08,          ABORTED_COMMAND, 0x47, 0x00},   // Timed out in xfer, fake parity for now
-               {0x04,          RECOVERED_ERROR, 0x11, 0x00},   // Recovered ECC error    Medium error, recovered
--              {0xFF, 0xFF, 0xFF, 0xFF}, // END mark 
-+              {0xFF, 0xFF, 0xFF, 0xFF}, // END mark
-       };
-       int i = 0;
-       cmd->result = SAM_STAT_CHECK_CONDITION;
--      
-+
-       /*
-        *      Is this an error we can process/parse
-        */
--       
-+
-       if(drv_stat & ATA_ERR)
-               /* Read the err bits */
-               err = ata_chk_err(qc->ap);
-       /* Display the ATA level error info */
--      
-+
-       printk(KERN_WARNING "ata%u: status=0x%02x { ", qc->ap->id, drv_stat);
-       if(drv_stat & 0x80)
-       {
-@@ -243,7 +243,7 @@
-               if(drv_stat & 0x01)     printk("Error ");
-       }
-       printk("}\n");
--      
-+
-       if(err)
-       {
-               printk(KERN_WARNING "ata%u: error=0x%02x { ", qc->ap->id, err);
-@@ -260,11 +260,11 @@
-               if(err & 0x02)          printk("TrackZeroNotFound ");
-               if(err & 0x01)          printk("AddrMarkNotFound ");
-               printk("}\n");
--              
-+
-               /* Should we dump sector info here too ?? */
-       }
--              
--      
-+
-+
-       /* Look for err */
-       while(sense_table[i][0] != 0xFF)
-       {
-@@ -283,7 +283,8 @@
-       /* No immediate match */
-       if(err)
-               printk(KERN_DEBUG "ata%u: no sense translation for 0x%02x\n", qc->ap->id, err);
--      
-+
-+      i = 0;
-       /* Fall back to interpreting status bits */
-       while(stat_table[i][0] != 0xFF)
-       {
-@@ -301,7 +302,7 @@
-       /* No error ?? */
-       printk(KERN_ERR "ata%u: called with no error (%02X)!\n", qc->ap->id, drv_stat);
-       /* additional-sense-code[-qualifier] */
--      
-+
-       sb[0] = 0x70;
-       sb[2] = MEDIUM_ERROR;
-       sb[7] = 0x0A;
-@@ -449,19 +450,24 @@
-       }
-       if (lba48) {
-+              tf->command = ATA_CMD_VERIFY_EXT;
-+
-               tf->hob_nsect = (n_sect >> 8) & 0xff;
-               tf->hob_lbah = (sect >> 40) & 0xff;
-               tf->hob_lbam = (sect >> 32) & 0xff;
-               tf->hob_lbal = (sect >> 24) & 0xff;
--      } else
-+      } else {
-+              tf->command = ATA_CMD_VERIFY;
-+
-               tf->device |= (sect >> 24) & 0xf;
-+      }
-       tf->nsect = n_sect & 0xff;
--      tf->hob_lbah = (sect >> 16) & 0xff;
--      tf->hob_lbam = (sect >> 8) & 0xff;
--      tf->hob_lbal = sect & 0xff;
-+      tf->lbah = (sect >> 16) & 0xff;
-+      tf->lbam = (sect >> 8) & 0xff;
-+      tf->lbal = sect & 0xff;
-       return 0;
- }
-@@ -561,7 +567,7 @@
-                               return 1;
-                       /* stores LBA27:24 in lower 4 bits of device reg */
--                      tf->device |= scsicmd[2];
-+                      tf->device |= scsicmd[6];
-                       qc->nsect = scsicmd[13];
-               }
-@@ -657,6 +663,7 @@
-       return;
- err_out:
-+      ata_qc_free(qc);
-       ata_bad_cdb(cmd, done);
-       DPRINTK("EXIT - badcmd\n");
- }
-diff -Nur linux-2.4.29/drivers/scsi/Makefile linux-mips/drivers/scsi/Makefile
---- linux-2.4.29/drivers/scsi/Makefile 2005-01-19 15:09:59.000000000 +0100
-+++ linux-mips/drivers/scsi/Makefile   2005-03-26 11:47:32.445326717 +0100
-@@ -134,6 +134,7 @@
- obj-$(CONFIG_SCSI_SATA_SVW)   += libata.o sata_svw.o
- obj-$(CONFIG_SCSI_ATA_PIIX)   += libata.o ata_piix.o
- obj-$(CONFIG_SCSI_SATA_PROMISE)       += libata.o sata_promise.o
-+obj-$(CONFIG_SCSI_SATA_QSTOR) += libata.o sata_qstor.o
- obj-$(CONFIG_SCSI_SATA_SIL)   += libata.o sata_sil.o
- obj-$(CONFIG_SCSI_SATA_VIA)   += libata.o sata_via.o
- obj-$(CONFIG_SCSI_SATA_VITESSE)       += libata.o sata_vsc.o
-diff -Nur linux-2.4.29/drivers/scsi/megaraid2.c linux-mips/drivers/scsi/megaraid2.c
---- linux-2.4.29/drivers/scsi/megaraid2.c      2004-11-17 12:54:21.000000000 +0100
-+++ linux-mips/drivers/scsi/megaraid2.c        2005-03-26 11:47:33.007234495 +0100
-@@ -14,7 +14,7 @@
-  *      - speed-ups (list handling fixes, issued_list, optimizations.)
-  *      - lots of cleanups.
-  *
-- * Version : v2.10.3 (Apr 08, 2004)
-+ * Version : v2.10.8.2 (July 26, 2004)
-  *
-  * Authors:   Atul Mukker <Atul.Mukker@lsil.com>
-  *            Sreenivas Bagalkote <Sreenivas.Bagalkote@lsil.com>
-@@ -46,7 +46,7 @@
- #include "megaraid2.h"
--#ifdef LSI_CONFIG_COMPAT
-+#if defined(__x86_64__)
- #include <asm/ioctl32.h>
- #endif
-@@ -90,10 +90,15 @@
- static struct mega_hbas mega_hbas[MAX_CONTROLLERS];
- /*
-+ * Lock to protect access to IOCTL
-+ */
-+static struct semaphore megaraid_ioc_mtx;
-+
-+/*
-  * The File Operations structure for the serial/ioctl interface of the driver
-  */
- static struct file_operations megadev_fops = {
--      .ioctl          = megadev_ioctl,
-+      .ioctl          = megadev_ioctl_entry,
-       .open           = megadev_open,
-       .release        = megadev_close,
-       .owner          = THIS_MODULE,
-@@ -107,7 +112,7 @@
- static struct mcontroller mcontroller[MAX_CONTROLLERS];
- /* The current driver version */
--static u32 driver_ver = 0x02100000;
-+static u32 driver_ver = 0x02104000;
- /* major number used by the device for character interface */
- static int major;
-@@ -189,6 +194,11 @@
-                */
-               mega_reorder_hosts();
-+              /*
-+               * Initialize the IOCTL lock
-+               */
-+              init_MUTEX( &megaraid_ioc_mtx );
-+
- #ifdef CONFIG_PROC_FS
-               mega_proc_dir_entry = proc_mkdir("megaraid", &proc_root);
-@@ -223,7 +233,7 @@
-                               "MegaRAID Shutdown routine not registered!!\n");
-               }
--#ifdef LSI_CONFIG_COMPAT
-+#if defined(__x86_64__)
-               /*
-                * Register the 32-bit ioctl conversion
-                */
-@@ -273,6 +283,8 @@
-       unsigned long   tbase;
-       unsigned long   flag = 0;
-       int     i, j;
-+      u8      did_int_pthru_f = 0;
-+      u8      did_int_data_f  = 0;
-       while((pdev = pci_find_device(pci_vendor, pci_device, pdev))) {
-@@ -328,6 +340,7 @@
-                               (subsysvid != HP_SUBSYS_VID) &&
-                               (subsysvid != INTEL_SUBSYS_VID) &&
-                               (subsysvid != FSC_SUBSYS_VID) &&
-+                              (subsysvid != ACER_SUBSYS_VID) &&
-                               (subsysvid != LSI_SUBSYS_VID) ) continue;
-@@ -465,6 +478,33 @@
-               alloc_scb_f = 1;
-+              /*
-+               * Allocate memory for ioctls
-+               */
-+              adapter->int_pthru = pci_alloc_consistent ( 
-+                                      adapter->dev,
-+                                      sizeof(mega_passthru),
-+                                      &adapter->int_pthru_dma_hndl );
-+
-+              if( adapter->int_pthru == NULL ) {
-+                      printk(KERN_WARNING "megaraid: out of RAM.\n");
-+                      goto fail_attach;
-+              }
-+              else
-+                      did_int_pthru_f = 1;
-+
-+              adapter->int_data = pci_alloc_consistent (
-+                                      adapter->dev,
-+                                      INT_MEMBLK_SZ,
-+                                      &adapter->int_data_dma_hndl );
-+
-+              if( adapter->int_data == NULL ) {
-+                      printk(KERN_WARNING "megaraid: out of RAM.\n");
-+                      goto fail_attach;
-+              }
-+              else
-+                      did_int_data_f = 1;
-+
-               /* Request our IRQ */
-               if( adapter->flag & BOARD_MEMMAP ) {
-                       if(request_irq(irq, megaraid_isr_memmapped, SA_SHIRQ,
-@@ -676,6 +716,19 @@
-               continue;
- fail_attach:
-+              if( did_int_data_f ) {
-+                      pci_free_consistent(
-+                              adapter->dev, INT_MEMBLK_SZ, adapter->int_data, 
-+                              adapter->int_data_dma_hndl );
-+              }
-+
-+              if( did_int_pthru_f ) {
-+                      pci_free_consistent(
-+                              adapter->dev, sizeof(mega_passthru),
-+                              (void*) adapter->int_pthru,
-+                              adapter->int_pthru_dma_hndl );
-+              }
-+
-               if( did_setup_mbox_f ) {
-                       pci_free_consistent(adapter->dev, sizeof(mbox64_t),
-                                       (void *)adapter->una_mbox64,
-@@ -937,6 +990,78 @@
- /**
-+ * issue_scb()
-+ * @adapter - pointer to our soft state
-+ * @scb - scsi control block
-+ *
-+ * Post a command to the card if the mailbox is available, otherwise return
-+ * busy. We also take the scb from the pending list if the mailbox is
-+ * available.
-+ */
-+static inline int
-+issue_scb(adapter_t *adapter, scb_t *scb)
-+{
-+      volatile mbox64_t       *mbox64 = adapter->mbox64;
-+      volatile mbox_t         *mbox = adapter->mbox;
-+      unsigned int    i = 0;
-+
-+      if(unlikely(mbox->busy)) {
-+              do {
-+                      udelay(1);
-+                      i++;
-+              } while( mbox->busy && (i < max_mbox_busy_wait) );
-+
-+              if(mbox->busy) return -1;
-+      }
-+
-+      /* Copy mailbox data into host structure */
-+      memcpy((char *)mbox, (char *)scb->raw_mbox, 16);
-+
-+      mbox->cmdid = scb->idx; /* Set cmdid */
-+      mbox->busy = 1;         /* Set busy */
-+
-+
-+      /*
-+       * Increment the pending queue counter
-+       */
-+      atomic_inc(&adapter->pend_cmds);
-+
-+      switch (mbox->cmd) {
-+      case MEGA_MBOXCMD_EXTPTHRU:
-+              if( !adapter->has_64bit_addr ) break;
-+              // else fall through
-+      case MEGA_MBOXCMD_LREAD64:
-+      case MEGA_MBOXCMD_LWRITE64:
-+      case MEGA_MBOXCMD_PASSTHRU64:
-+              mbox64->xfer_segment_lo = mbox->xferaddr;
-+              mbox64->xfer_segment_hi = 0;
-+              mbox->xferaddr = 0xFFFFFFFF;
-+              break;
-+      default:
-+              mbox64->xfer_segment_lo = 0;
-+              mbox64->xfer_segment_hi = 0;
-+      }
-+
-+      /*
-+       * post the command
-+       */
-+      scb->state |= SCB_ISSUED;
-+
-+      if( likely(adapter->flag & BOARD_MEMMAP) ) {
-+              mbox->poll = 0;
-+              mbox->ack = 0;
-+              WRINDOOR(adapter, adapter->mbox_dma | 0x1);
-+      }
-+      else {
-+              irq_enable(adapter);
-+              issue_command(adapter);
-+      }
-+
-+      return 0;
-+}
-+
-+
-+/**
-  * mega_runpendq()
-  * @adapter - pointer to our soft state
-  *
-@@ -949,52 +1074,26 @@
-               __mega_runpendq(adapter);
- }
--/*
-- * megaraid_queue()
-- * @scmd - Issue this scsi command
-- * @done - the callback hook into the scsi mid-layer
-- *
-- * The command queuing entry point for the mid-layer.
-- */
--static int
--megaraid_queue(Scsi_Cmnd *scmd, void (*done)(Scsi_Cmnd *))
--{
--      adapter_t       *adapter;
--      scb_t   *scb;
--      int     busy=0;
--
--      adapter = (adapter_t *)scmd->host->hostdata;
--
--      scmd->scsi_done = done;
-+static void
-+__mega_runpendq(adapter_t *adapter)
-+{
-+      scb_t *scb;
-+      struct list_head *pos, *next;
--      /*
--       * Allocate and build a SCB request
--       * busy flag will be set if mega_build_cmd() command could not
--       * allocate scb. We will return non-zero status in that case.
--       * NOTE: scb can be null even though certain commands completed
--       * successfully, e.g., MODE_SENSE and TEST_UNIT_READY, we would
--       * return 0 in that case.
--       */
-+      /* Issue any pending commands to the card */
-+      list_for_each_safe(pos, next, &adapter->pending_list) {
--      scb = mega_build_cmd(adapter, scmd, &busy);
-+              scb = list_entry(pos, scb_t, list);
--      if(scb) {
--              scb->state |= SCB_PENDQ;
--              list_add_tail(&scb->list, &adapter->pending_list);
-+              if( !(scb->state & SCB_ISSUED) ) {
--              /*
--               * Check if the HBA is in quiescent state, e.g., during a
--               * delete logical drive opertion. If it is, don't run
--               * the pending_list.
--               */
--              if(atomic_read(&adapter->quiescent) == 0) {
--                      mega_runpendq(adapter);
-+                      if( issue_scb(adapter, scb) != 0 )
-+                              return;
-               }
--              return 0;
-       }
--      return busy;
-+      return;
- }
-@@ -1068,25 +1167,136 @@
-       }
-       /*
--       * If "delete logical drive" feature is enabled on this controller.
--       * Do only if at least one delete logical drive operation was done.
--       *
--       * Also, after logical drive deletion, instead of logical drive number,
-+       * If "delete logical drive" feature is enabled on this controller,
-        * the value returned should be 0x80+logical drive id.
--       *
--       * These is valid only for IO commands.
-        */
-+      if (adapter->support_random_del)
-+              ldrv_num += 0x80;
--      if (adapter->support_random_del && adapter->read_ldidmap )
--              switch (cmd->cmnd[0]) {
--              case READ_6:    /* fall through */
--              case WRITE_6:   /* fall through */
--              case READ_10:   /* fall through */
--              case WRITE_10:
--                      ldrv_num += 0x80;
-+      return ldrv_num;
-+}
-+
-+/*
-+ * Wait until the controller's mailbox is available
-+ */
-+static inline int
-+mega_busywait_mbox (adapter_t *adapter)
-+{
-+      if (adapter->mbox->busy)
-+              return __mega_busywait_mbox(adapter);
-+      return 0;
-+}
-+
-+
-+/**
-+ * megaraid_iombox_ack_sequence - interrupt ack sequence for IO mapped HBAs
-+ * @adapter   - controller's soft state
-+ *
-+ * Interrupt ackrowledgement sequence for IO mapped HBAs
-+ */
-+static inline void
-+megaraid_iombox_ack_sequence(adapter_t *adapter)
-+{
-+      u8      status;
-+      u8      nstatus;
-+      u8      completed[MAX_FIRMWARE_STATUS];
-+      u8      byte;
-+      int     i;
-+
-+
-+      /*
-+       * loop till F/W has more commands for us to complete.
-+       */
-+      do {
-+              /* Check if a valid interrupt is pending */
-+              byte = irq_state(adapter);
-+              if( (byte & VALID_INTR_BYTE) == 0 ) {
-+                      return;
-               }
-+              set_irq_state(adapter, byte);
--      return ldrv_num;
-+              while ((nstatus = adapter->mbox->numstatus) == 0xFF) {
-+                      cpu_relax();
-+              }
-+              adapter->mbox->numstatus = 0xFF;
-+
-+              for (i = 0; i < nstatus; i++) {
-+                      while ((completed[i] = adapter->mbox->completed[i])
-+                                      == 0xFF) {
-+                              cpu_relax();
-+                      }
-+
-+                      adapter->mbox->completed[i] = 0xFF;
-+              }
-+
-+              // we must read the valid status now
-+              if ((status = adapter->mbox->status) == 0xFF) {
-+                      printk(KERN_WARNING
-+                      "megaraid critical: status 0xFF from firmware.\n");
-+              }
-+              adapter->mbox->status = 0xFF;
-+
-+              /*
-+               * decrement the pending queue counter
-+               */
-+              atomic_sub(nstatus, &adapter->pend_cmds);
-+
-+              /* Acknowledge interrupt */
-+              irq_ack(adapter);
-+
-+              mega_cmd_done(adapter, completed, nstatus, status);
-+
-+      } while(1);
-+}
-+
-+
-+
-+/*
-+ * megaraid_queue()
-+ * @scmd - Issue this scsi command
-+ * @done - the callback hook into the scsi mid-layer
-+ *
-+ * The command queuing entry point for the mid-layer.
-+ */
-+static int
-+megaraid_queue(Scsi_Cmnd *scmd, void (*done)(Scsi_Cmnd *))
-+{
-+      adapter_t       *adapter;
-+      scb_t   *scb;
-+      int     busy=0;
-+
-+      adapter = (adapter_t *)scmd->host->hostdata;
-+
-+      scmd->scsi_done = done;
-+
-+
-+      /*
-+       * Allocate and build a SCB request
-+       * busy flag will be set if mega_build_cmd() command could not
-+       * allocate scb. We will return non-zero status in that case.
-+       * NOTE: scb can be null even though certain commands completed
-+       * successfully, e.g., MODE_SENSE and TEST_UNIT_READY, we would
-+       * return 0 in that case.
-+       */
-+
-+      scb = mega_build_cmd(adapter, scmd, &busy);
-+
-+      if(scb) {
-+              scb->state |= SCB_PENDQ;
-+              list_add_tail(&scb->list, &adapter->pending_list);
-+
-+              /*
-+               * Check if the HBA is in quiescent state, e.g., during a
-+               * delete logical drive opertion. If it is, don't run
-+               * the pending_list.
-+               */
-+              if(atomic_read(&adapter->quiescent) == 0) {
-+                      mega_runpendq(adapter);
-+              }
-+              return 0;
-+      }
-+
-+      return busy;
- }
-@@ -1112,7 +1322,6 @@
-       mbox_t  *mbox;
-       long    seg;
-       char    islogical;
--      int     max_ldrv_num;
-       int     channel = 0;
-       int     target = 0;
-       int     ldrv_num = 0;   /* logical drive number */
-@@ -1184,24 +1393,6 @@
-               }
-               ldrv_num = mega_get_ldrv_num(adapter, cmd, channel);
--
--
--              max_ldrv_num = (adapter->flag & BOARD_40LD) ?
--                      MAX_LOGICAL_DRIVES_40LD : MAX_LOGICAL_DRIVES_8LD;
--
--              /*
--               * max_ldrv_num increases by 0x80 if some logical drive was
--               * deleted.
--               */
--              if(adapter->read_ldidmap)
--                      max_ldrv_num += 0x80;
--
--              if(ldrv_num > max_ldrv_num ) {
--                      cmd->result = (DID_BAD_TARGET << 16);
--                      cmd->scsi_done(cmd);
--                      return NULL;
--              }
--
-       }
-       else {
-               if( cmd->lun > 7) {
-@@ -1671,111 +1862,6 @@
- }
--static void
--__mega_runpendq(adapter_t *adapter)
--{
--      scb_t *scb;
--      struct list_head *pos, *next;
--
--      /* Issue any pending commands to the card */
--      list_for_each_safe(pos, next, &adapter->pending_list) {
--
--              scb = list_entry(pos, scb_t, list);
--
--              if( !(scb->state & SCB_ISSUED) ) {
--
--                      if( issue_scb(adapter, scb) != 0 )
--                              return;
--              }
--      }
--
--      return;
--}
--
--
--/**
-- * issue_scb()
-- * @adapter - pointer to our soft state
-- * @scb - scsi control block
-- *
-- * Post a command to the card if the mailbox is available, otherwise return
-- * busy. We also take the scb from the pending list if the mailbox is
-- * available.
-- */
--static int
--issue_scb(adapter_t *adapter, scb_t *scb)
--{
--      volatile mbox64_t       *mbox64 = adapter->mbox64;
--      volatile mbox_t         *mbox = adapter->mbox;
--      unsigned int    i = 0;
--
--      if(unlikely(mbox->busy)) {
--              do {
--                      udelay(1);
--                      i++;
--              } while( mbox->busy && (i < max_mbox_busy_wait) );
--
--              if(mbox->busy) return -1;
--      }
--
--      /* Copy mailbox data into host structure */
--      memcpy((char *)mbox, (char *)scb->raw_mbox, 16);
--
--      mbox->cmdid = scb->idx; /* Set cmdid */
--      mbox->busy = 1;         /* Set busy */
--
--
--      /*
--       * Increment the pending queue counter
--       */
--      atomic_inc(&adapter->pend_cmds);
--
--      switch (mbox->cmd) {
--      case MEGA_MBOXCMD_EXTPTHRU:
--              if( !adapter->has_64bit_addr ) break;
--              // else fall through
--      case MEGA_MBOXCMD_LREAD64:
--      case MEGA_MBOXCMD_LWRITE64:
--      case MEGA_MBOXCMD_PASSTHRU64:
--              mbox64->xfer_segment_lo = mbox->xferaddr;
--              mbox64->xfer_segment_hi = 0;
--              mbox->xferaddr = 0xFFFFFFFF;
--              break;
--      default:
--              mbox64->xfer_segment_lo = 0;
--              mbox64->xfer_segment_hi = 0;
--      }
--
--      /*
--       * post the command
--       */
--      scb->state |= SCB_ISSUED;
--
--      if( likely(adapter->flag & BOARD_MEMMAP) ) {
--              mbox->poll = 0;
--              mbox->ack = 0;
--              WRINDOOR(adapter, adapter->mbox_dma | 0x1);
--      }
--      else {
--              irq_enable(adapter);
--              issue_command(adapter);
--      }
--
--      return 0;
--}
--
--
--/*
-- * Wait until the controller's mailbox is available
-- */
--static inline int
--mega_busywait_mbox (adapter_t *adapter)
--{
--      if (adapter->mbox->busy)
--              return __mega_busywait_mbox(adapter);
--      return 0;
--}
--
- /**
-  * issue_scb_block()
-  * @adapter - pointer to our soft state
-@@ -1865,77 +1951,47 @@
-       // invalidate the completed command id array. After command
-       // completion, firmware would write the valid id.
-       for (i = 0; i < MAX_FIRMWARE_STATUS; i++) {
--              mbox->completed[i] = 0xFF;
--      }
--
--      return status;
--
--bug_blocked_mailbox:
--      printk(KERN_WARNING "megaraid: Blocked mailbox......!!\n");
--      udelay (1000);
--      return -1;
--}
--
--
--/**
-- * megaraid_iombox_ack_sequence - interrupt ack sequence for IO mapped HBAs
-- * @adapter   - controller's soft state
-- *
-- * Interrupt ackrowledgement sequence for IO mapped HBAs
-- */
--static inline void
--megaraid_iombox_ack_sequence(adapter_t *adapter)
--{
--      u8      status;
--      u8      nstatus;
--      u8      completed[MAX_FIRMWARE_STATUS];
--      u8      byte;
--      int     i;
--
--
--      /*
--       * loop till F/W has more commands for us to complete.
--       */
--      do {
--              /* Check if a valid interrupt is pending */
--              byte = irq_state(adapter);
--              if( (byte & VALID_INTR_BYTE) == 0 ) {
--                      return;
--              }
--              set_irq_state(adapter, byte);
-+              mbox->completed[i] = 0xFF;
-+      }
--              while ((nstatus = adapter->mbox->numstatus) == 0xFF) {
--                      cpu_relax();
--              }
--              adapter->mbox->numstatus = 0xFF;
-+      return status;
--              for (i = 0; i < nstatus; i++) {
--                      while ((completed[i] = adapter->mbox->completed[i])
--                                      == 0xFF) {
--                              cpu_relax();
--                      }
-+bug_blocked_mailbox:
-+      printk(KERN_WARNING "megaraid: Blocked mailbox......!!\n");
-+      udelay (1000);
-+      return -1;
-+}
--                      adapter->mbox->completed[i] = 0xFF;
--              }
--              // we must read the valid status now
--              if ((status = adapter->mbox->status) == 0xFF) {
--                      printk(KERN_WARNING
--                      "megaraid critical: status 0xFF from firmware.\n");
--              }
--              adapter->mbox->status = 0xFF;
-+/**
-+ * megaraid_isr_iomapped()
-+ * @irq - irq
-+ * @devp - pointer to our soft state
-+ * @regs - unused
-+ *
-+ * Interrupt service routine for io-mapped controllers.
-+ * Find out if our device is interrupting. If yes, acknowledge the interrupt
-+ * and service the completed commands.
-+ */
-+static void
-+megaraid_isr_iomapped(int irq, void *devp, struct pt_regs *regs)
-+{
-+      adapter_t       *adapter = devp;
-+      unsigned long   flags;
--              /*
--               * decrement the pending queue counter
--               */
--              atomic_sub(nstatus, &adapter->pend_cmds);
--              /* Acknowledge interrupt */
--              irq_ack(adapter);
-+      spin_lock_irqsave(adapter->host_lock, flags);
--              mega_cmd_done(adapter, completed, nstatus, status);
-+      megaraid_iombox_ack_sequence(adapter);
--      } while(1);
-+      /* Loop through any pending requests */
-+      if( atomic_read(&adapter->quiescent ) == 0) {
-+              mega_runpendq(adapter);
-+      }
-+
-+      spin_unlock_irqrestore(adapter->host_lock, flags);
-+
-+      return;
- }
-@@ -2007,38 +2063,6 @@
- /**
-- * megaraid_isr_iomapped()
-- * @irq - irq
-- * @devp - pointer to our soft state
-- * @regs - unused
-- *
-- * Interrupt service routine for io-mapped controllers.
-- * Find out if our device is interrupting. If yes, acknowledge the interrupt
-- * and service the completed commands.
-- */
--static void
--megaraid_isr_iomapped(int irq, void *devp, struct pt_regs *regs)
--{
--      adapter_t       *adapter = devp;
--      unsigned long   flags;
--
--
--      spin_lock_irqsave(adapter->host_lock, flags);
--
--      megaraid_iombox_ack_sequence(adapter);
--
--      /* Loop through any pending requests */
--      if( atomic_read(&adapter->quiescent ) == 0) {
--              mega_runpendq(adapter);
--      }
--
--      spin_unlock_irqrestore(adapter->host_lock, flags);
--
--      return;
--}
--
--
--/**
-  * megaraid_isr_memmapped()
-  * @irq - irq
-  * @devp - pointer to our soft state
-@@ -2069,7 +2093,6 @@
-       return;
- }
--
- /**
-  * mega_cmd_done()
-  * @adapter - pointer to our soft state
-@@ -2381,7 +2404,6 @@
-       list_add(&scb->list, &adapter->free_list);
- }
--
- static int
- __mega_busywait_mbox (adapter_t *adapter)
- {
-@@ -2412,6 +2434,10 @@
-       cmd = scb->cmd;
-+      /* return 0 elements if no data transfer */
-+      if (!cmd->request_buffer || !cmd->request_bufflen)
-+              return 0;
-+
-       /* Scatter-gather not used */
-       if( !cmd->use_sg ) {
-@@ -2535,7 +2561,6 @@
-               enquiry3->pdrv_state[i] = inquiry->pdrv_info.pdrv_state[i];
- }
--
- static inline void
- mega_free_sgl(adapter_t *adapter)
- {
-@@ -2666,6 +2691,13 @@
-       pci_free_consistent(adapter->dev, sizeof(mbox64_t),
-                       (void *)adapter->una_mbox64, adapter->una_mbox64_dma);
-+      pci_free_consistent( adapter->dev, sizeof(mega_passthru),
-+                              (void*) adapter->int_pthru, 
-+                              adapter->int_pthru_dma_hndl );
-+
-+      pci_free_consistent( adapter->dev, INT_MEMBLK_SZ, adapter->int_data,
-+                              adapter->int_data_dma_hndl );
-+
-       hba_count--;
-       if( hba_count == 0 ) {
-@@ -2694,7 +2726,7 @@
-        */
-       scsi_unregister(host);
--#ifdef LSI_CONFIG_COMPAT
-+#if defined(__x86_64__)
-       unregister_ioctl32_conversion(MEGAIOCCMD);
- #endif
-@@ -2736,30 +2768,36 @@
- }
--/**
-- * megaraid_abort - abort the scsi command
-- * @scp       - command to be aborted
-- *
-- * Abort a previous SCSI request. Only commands on the pending list can be
-- * aborted. All the commands issued to the F/W must complete.
-- */
- static int
- megaraid_abort(Scsi_Cmnd *scp)
- {
-       adapter_t               *adapter;
-       struct list_head        *pos, *next;
-       scb_t                   *scb;
--      long                    iter;
--      int                     rval = SUCCESS;
-+
-+      printk("megaraid: aborting-%ld cmd=%x <c=%d t=%d l=%d>\n",
-+              scp->serial_number, scp->cmnd[0], scp->channel,
-+              scp->target, scp->lun);
-       adapter = (adapter_t *)scp->host->hostdata;
--      ASSERT( spin_is_locked(adapter->host_lock) );
-+      /*
-+       * Check if hw_error flag was set in previous RESET call. If it was,
-+       * then FW is hanging and unlikely to function. We can return FAILURE
-+       * from here and expect the RESET handler to be called.
-+       */
--      printk("megaraid: aborting-%ld cmd=%x <c=%d t=%d l=%d>\n",
--              scp->serial_number, scp->cmnd[0], scp->channel, scp->target,
--              scp->lun);
-+      if (adapter->hw_error) {
-+              printk("megaraid: hw error, cannot abort\n");
-+              return FAILED;
-+      }
-+
-+      ASSERT( spin_is_locked(adapter->host_lock) );
-+      /*
-+       * If cmd is waiting to be issued to FW, ABORT it with SUCEESS. If it
-+       * has already been issued, return FAILURE and expect RESET later.
-+       */
-       list_for_each_safe( pos, next, &adapter->pending_list ) {
-@@ -2769,15 +2807,11 @@
-                       scb->state |= SCB_ABORT;
--                      /*
--                       * Check if this command was never issued. If this is
--                       * the case, take it off from the pending list and
--                       * complete.
--                       */
-                       if( !(scb->state & SCB_ISSUED) ) {
--                              printk(KERN_WARNING
--                              "megaraid: %ld:%d, driver owner.\n",
-+                              /* Not issued to the FW yet; ABORT it */
-+
-+                              printk( "megaraid: %ld:%d, driver owner.\n",
-                                       scp->serial_number, scb->idx);
-                               scp->result = (DID_ABORT << 16);
-@@ -2786,67 +2820,31 @@
-                               scp->scsi_done(scp);
--                              break;
-+                              return SUCCESS;
-+                      }
-+                      else {
-+                              /* Issued to the FW; can do nothing */
-+                              return FAILED;
-                       }
-               }
-       }
-       /*
--       * By this time, either all commands are completed or aborted by
--       * mid-layer. Do not return until all the commands are actually
--       * completed by the firmware
-+       * cmd is _not_ in our pending_list. Most likely we completed the cmd
-        */
--      iter = 0;
--      while( atomic_read(&adapter->pend_cmds) > 0 ) {
--              /*
--               * Perform the ack sequence, since interrupts are not
--               * available right now!
--               */
--              if( adapter->flag & BOARD_MEMMAP ) {
--                      megaraid_memmbox_ack_sequence(adapter);
--              }
--              else {
--                      megaraid_iombox_ack_sequence(adapter);
--              }
--
--              /*
--               * print a message once every second only
--               */
--              if( !(iter % 1000) ) {
--                      printk(
--                      "megaraid: Waiting for %d commands to flush: iter:%ld\n",
--                              atomic_read(&adapter->pend_cmds), iter);
--              }
--
--              if( iter++ < MBOX_ABORT_SLEEP*1000 ) {
--                      mdelay(1);
--              }
--              else {
--                      printk(KERN_WARNING
--                              "megaraid: critical hardware error!\n");
--
--                      rval = FAILED;
--
--                      break;
--              }
--      }
--
--      if( rval == SUCCESS ) {
--              printk(KERN_INFO
--                      "megaraid: abort sequence successfully completed.\n");
--      }
--
--      return rval;
-+      return SUCCESS;
- }
- static int
- megaraid_reset(Scsi_Cmnd *cmd)
- {
--      adapter_t       *adapter;
--      megacmd_t       mc;
--      long            iter;
--      int             rval = SUCCESS;
-+      DECLARE_WAIT_QUEUE_HEAD(wq);
-+      int                     i;
-+      scb_t                   *scb;
-+      adapter_t               *adapter;
-+      struct list_head        *pos, *next;
-+      int                     rval;
-       adapter = (adapter_t *)cmd->host->hostdata;
-@@ -2856,31 +2854,54 @@
-               cmd->serial_number, cmd->cmnd[0], cmd->channel, cmd->target,
-               cmd->lun);
-+      /*
-+       * Check if hw_error flag was set in previous RESET call. If it was,
-+       * then we needn't do any handling here. The controller will be marked
-+       * offline soon
-+       */
--#if MEGA_HAVE_CLUSTERING
--      mc.cmd = MEGA_CLUSTER_CMD;
--      mc.opcode = MEGA_RESET_RESERVATIONS;
--
--      spin_unlock_irq(adapter->host_lock);
--      if( mega_internal_command(adapter, LOCK_INT, &mc, NULL) != 0 ) {
--              printk(KERN_WARNING
--                              "megaraid: reservation reset failed.\n");
-+      if (adapter->hw_error) {
-+              printk("megaraid: hw error, cannot reset\n");
-+              return FAILED;
-       }
--      else {
--              printk(KERN_INFO "megaraid: reservation reset.\n");
-+
-+      /*
-+       * Return all the pending cmds to the mid-layer with the cmd result
-+       * DID_RESET. Make sure you don't return the cmds ISSUED to FW.
-+       */
-+      list_for_each_safe( pos, next, &adapter->pending_list ) {
-+
-+              scb             = list_entry(pos, scb_t, list);
-+              scb->state      |= SCB_RESET;
-+
-+              if( !(scb->state & SCB_ISSUED) ) {
-+
-+                      /* Not issued to the FW; return with RESET */
-+                      cmd->result = (DID_RESET << 16);
-+
-+                      mega_free_scb(adapter, scb);
-+                      cmd->scsi_done(cmd);
-+              }
-       }
--      spin_lock_irq(adapter->host_lock);
--#endif
-       /*
--       * Do not return until all the commands are actually completed by the
--       * firmware
-+       * Under exceptional conditions, FW may take up to 3 mins to complete
-+       * processing all pending commands. We'll wait for maximum 3 mins to
-+       * see if all outstanding commands are completed.
-        */
--      iter = 0;
--      while( atomic_read(&adapter->pend_cmds) > 0 ) {
-+
-+      if (atomic_read(&adapter->pend_cmds) == 0)
-+              return SUCCESS;
-+
-+      printk("megaraid: %d pending cmds; max wait %d seconds\n",
-+              atomic_read(&adapter->pend_cmds), MBOX_RESET_WAIT );
-+
-+      for(i=0; (i<MBOX_RESET_WAIT)&&(atomic_read(&adapter->pend_cmds)); i++){
-+
-+              ASSERT( spin_is_locked(adapter->host_lock) );
-+
-               /*
--               * Perform the ack sequence, since interrupts are not
--               * available right now!
-+               * Perform the ack sequence, since interrupts are unavailable
-                */
-               if( adapter->flag & BOARD_MEMMAP ) {
-                       megaraid_memmbox_ack_sequence(adapter);
-@@ -2889,55 +2910,35 @@
-                       megaraid_iombox_ack_sequence(adapter);
-               }
--              /*
--               * print a message once every second only
--               */
--              if( !(iter % 1000) ) {
--                      printk(
--                      "megaraid: Waiting for %d commands to flush: iter:%ld\n",
--                              atomic_read(&adapter->pend_cmds), iter);
--              }
-+              spin_unlock(adapter->host_lock);
--              if( iter++ < MBOX_RESET_SLEEP*1000 ) {
--                      mdelay(1);
-+              /* Print a message once every 5 seconds */
-+              if (!(i % 5)) {
-+                      printk("megaraid: pending %d; remaining %d seconds\n",
-+                              atomic_read(&adapter->pend_cmds),
-+                              MBOX_RESET_WAIT - i);
-               }
--              else {
--                      printk(KERN_WARNING
--                              "megaraid: critical hardware error!\n");
--                      rval = FAILED;
--
--                      break;
--              }
--      }
-+              sleep_on_timeout(&wq, HZ);
--      if( rval == SUCCESS ) {
--              printk(KERN_INFO
--                      "megaraid: reset sequence successfully completed.\n");
-+              spin_lock(adapter->host_lock);
-       }
--      return rval;
--}
--
-+      /*
-+       * If after 3 mins there are still outstanding cmds, set the hw_error
-+       * flag so that we can return from subsequent ABORT/RESET handlers
-+       * without any processing
-+       */
--/**
-- * mega_allocate_inquiry()
-- * @dma_handle - handle returned for dma address
-- * @pdev - handle to pci device
-- *
-- * allocates memory for inquiry structure
-- */
--static inline caddr_t
--mega_allocate_inquiry(dma_addr_t *dma_handle, struct pci_dev *pdev)
--{
--      return pci_alloc_consistent(pdev, sizeof(mega_inquiry3), dma_handle);
--}
-+      rval = SUCCESS;
-+      if (atomic_read(&adapter->pend_cmds)) {
-+              adapter->hw_error = 1;
-+              printk("megaraid: critical hardware error!\n" );
-+              rval = FAILED;
-+      }
--static inline void
--mega_free_inquiry(caddr_t inquiry, dma_addr_t dma_handle, struct pci_dev *pdev)
--{
--      pci_free_consistent(pdev, sizeof(mega_inquiry3), inquiry, dma_handle);
-+      return rval;
- }
-@@ -3199,6 +3200,26 @@
-       return len;
- }
-+/**
-+ * mega_allocate_inquiry()
-+ * @dma_handle - handle returned for dma address
-+ * @pdev - handle to pci device
-+ *
-+ * allocates memory for inquiry structure
-+ */
-+static inline caddr_t
-+mega_allocate_inquiry(dma_addr_t *dma_handle, struct pci_dev *pdev)
-+{
-+      return pci_alloc_consistent(pdev, sizeof(mega_inquiry3), dma_handle);
-+}
-+
-+
-+static inline void
-+mega_free_inquiry(caddr_t inquiry, dma_addr_t dma_handle, struct pci_dev *pdev)
-+{
-+      pci_free_consistent(pdev, sizeof(mega_inquiry3), inquiry, dma_handle);
-+}
-+
- /**
-  * proc_rebuild_rate()
-@@ -3988,6 +4009,7 @@
- megaraid_reboot_notify (struct notifier_block *this, unsigned long code,
-               void *unused)
- {
-+      DECLARE_WAIT_QUEUE_HEAD(wq);
-       adapter_t *adapter;
-       struct Scsi_Host *host;
-       u8 raw_mbox[sizeof(mbox_t)];
-@@ -4040,10 +4062,10 @@
-       printk(KERN_INFO "megaraid: cache flush delay:   ");
-       for( i = 9; i >= 0; i-- ) {
-               printk("\b\b\b[%d]", i);
--              mdelay(1000);
-+              sleep_on_timeout(&wq, HZ);
-       }
-       printk("\b\b\b[done]\n");
--      mdelay(1000);
-+      sleep_on_timeout(&wq, HZ);
-       return NOTIFY_DONE;
- }
-@@ -4150,17 +4172,27 @@
- }
--#ifdef LSI_CONFIG_COMPAT
-+#if defined(__x86_64__)
- static int
- megadev_compat_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg,
-               struct file *filep)
- {
-       struct inode *inode = filep->f_dentry->d_inode;
--      return megadev_ioctl(inode, filep, cmd, arg);
-+      return megadev_ioctl_entry(inode, filep, cmd, arg);
- }
- #endif
-+static int
-+megadev_ioctl_entry(struct inode *inode, struct file *filep, unsigned int cmd,
-+              unsigned long arg)
-+{
-+      int rval;
-+      down( &megaraid_ioc_mtx );
-+      rval = megadev_ioctl( inode, filep, cmd, arg );
-+      up( &megaraid_ioc_mtx );
-+      return rval;
-+}
- /**
-  * megadev_ioctl()
-@@ -4184,9 +4216,8 @@
-       int             rval;
-       mega_passthru   *upthru;        /* user address for passthru */
-       mega_passthru   *pthru;         /* copy user passthru here */
--      dma_addr_t      pthru_dma_hndl;
-       void            *data = NULL;   /* data to be transferred */
--      dma_addr_t      data_dma_hndl;  /* dma handle for data xfer area */
-+      dma_addr_t      data_dma_hndl = 0;
-       megacmd_t       mc;
-       megastat_t      *ustats;
-       int             num_ldrv;
-@@ -4302,7 +4333,7 @@
-               /*
-                * Which adapter
-                */
--              if( (adapno = GETADAP(uioc.adapno)) >= hba_count )
-+              if( (adapno = GETADAP(uioc.adapno)) >= hba_count ) 
-                       return (-ENODEV);
-               adapter = hba_soft_state[adapno];
-@@ -4358,13 +4389,7 @@
-               if( uioc.uioc_rmbox[0] == MEGA_MBOXCMD_PASSTHRU ) {
-                       /* Passthru commands */
--                      pthru = pci_alloc_consistent(pdev,
--                                      sizeof(mega_passthru),
--                                      &pthru_dma_hndl);
--
--                      if( pthru == NULL ) {
--                              return (-ENOMEM);
--                      }
-+                      pthru = adapter->int_pthru;
-                       /*
-                        * The user passthru structure
-@@ -4376,29 +4401,27 @@
-                        */
-                       if( copy_from_user(pthru, (char *)upthru,
-                                               sizeof(mega_passthru)) ) {
--
--                              pci_free_consistent(pdev,
--                                              sizeof(mega_passthru), pthru,
--                                              pthru_dma_hndl);
--
-                               return (-EFAULT);
-                       }
-                       /*
--                       * Is there a data transfer
-+                       * Is there a data transfer; If the data transfer
-+                       * length is <= INT_MEMBLK_SZ, usr the buffer 
-+                       * allocated at the load time. Otherwise, allocate it 
-+                       * here.
-                        */
--                      if( pthru->dataxferlen ) {
--                              data = pci_alloc_consistent(pdev,
--                                              pthru->dataxferlen,
--                                              &data_dma_hndl);
--
--                              if( data == NULL ) {
--                                      pci_free_consistent(pdev,
--                                                      sizeof(mega_passthru),
--                                                      pthru,
--                                                      pthru_dma_hndl);
-+                      if (pthru->dataxferlen) {
-+                              if (pthru->dataxferlen > INT_MEMBLK_SZ) {
-+                                      data = pci_alloc_consistent (
-+                                                      pdev,
-+                                                      pthru->dataxferlen,
-+                                                      &data_dma_hndl );
--                                      return (-ENOMEM);
-+                                      if (data == NULL)
-+                                              return (-ENOMEM);
-+                              }
-+                              else {
-+                                      data = adapter->int_data;
-                               }
-                               /*
-@@ -4406,7 +4429,11 @@
-                                * address at just allocated memory
-                                */
-                               uxferaddr = pthru->dataxferaddr;
--                              pthru->dataxferaddr = data_dma_hndl;
-+                              if (data_dma_hndl)
-+                                      pthru->dataxferaddr = data_dma_hndl;
-+                              else
-+                                      pthru->dataxferaddr = 
-+                                              adapter->int_data_dma_hndl;
-                       }
-@@ -4421,14 +4448,14 @@
-                                               (char *)((ulong)uxferaddr),
-                                               pthru->dataxferlen) ) {
-                                       rval = (-EFAULT);
--                                      goto freemem_and_return;
-+                                      goto freedata_and_return;
-                               }
-                       }
-                       memset(&mc, 0, sizeof(megacmd_t));
-                       mc.cmd = MEGA_MBOXCMD_PASSTHRU;
--                      mc.xferaddr = (u32)pthru_dma_hndl;
-+                      mc.xferaddr = (u32)adapter->int_pthru_dma_hndl;
-                       /*
-                        * Issue the command
-@@ -4437,7 +4464,7 @@
-                       rval = mega_n_to_m((void *)arg, &mc);
--                      if( rval ) goto freemem_and_return;
-+                      if( rval ) goto freedata_and_return;
-                       /*
-@@ -4456,18 +4483,14 @@
-                        */
-                       copy_to_user(upthru->reqsensearea,
-                                       pthru->reqsensearea, 14);
--
--freemem_and_return:
--                      if( pthru->dataxferlen ) {
--                              pci_free_consistent(pdev,
--                                              pthru->dataxferlen, data,
--                                              data_dma_hndl);
-+freedata_and_return:
-+                      if (data_dma_hndl) {
-+                              pci_free_consistent( pdev, pthru->dataxferlen,
-+                                                      data, data_dma_hndl );
-                       }
--                      pci_free_consistent(pdev, sizeof(mega_passthru),
--                                      pthru, pthru_dma_hndl);
--
-                       return rval;
-+
-               }
-               else {
-                       /* DCMD commands */
-@@ -4476,13 +4499,18 @@
-                        * Is there a data transfer
-                        */
-                       if( uioc.xferlen ) {
--                              data = pci_alloc_consistent(pdev,
--                                              uioc.xferlen, &data_dma_hndl);
-+                              if (uioc.xferlen > INT_MEMBLK_SZ) {
-+                                      data = pci_alloc_consistent(
-+                                                      pdev,
-+                                                      uioc.xferlen,
-+                                                      &data_dma_hndl );
--                              if( data == NULL ) {
--                                      return (-ENOMEM);
-+                                      if (data == NULL)
-+                                              return (-ENOMEM);
-+                              }
-+                              else {
-+                                      data = adapter->int_data;
-                               }
--
-                               uxferaddr = MBOX(uioc)->xferaddr;
-                       }
-@@ -4497,9 +4525,9 @@
-                                               (char *)((ulong)uxferaddr),
-                                               uioc.xferlen) ) {
--                                      pci_free_consistent(pdev,
--                                              uioc.xferlen, data,
--                                              data_dma_hndl);
-+                                      pci_free_consistent(
-+                                              pdev, uioc.xferlen,
-+                                              data, data_dma_hndl );
-                                       return (-EFAULT);
-                               }
-@@ -4507,7 +4535,10 @@
-                       memcpy(&mc, MBOX(uioc), sizeof(megacmd_t));
--                      mc.xferaddr = (u32)data_dma_hndl;
-+                      if (data_dma_hndl )
-+                              mc.xferaddr = (u32)data_dma_hndl;
-+                      else
-+                              mc.xferaddr = (u32)(adapter->int_data_dma_hndl);
-                       /*
-                        * Issue the command
-@@ -4517,12 +4548,10 @@
-                       rval = mega_n_to_m((void *)arg, &mc);
-                       if( rval ) {
--                              if( uioc.xferlen ) {
--                                      pci_free_consistent(pdev,
--                                                      uioc.xferlen, data,
--                                                      data_dma_hndl);
-+                              if (data_dma_hndl) {
-+                                      pci_free_consistent( pdev, uioc.xferlen,
-+                                                      data, data_dma_hndl );
-                               }
--
-                               return rval;
-                       }
-@@ -4537,10 +4566,9 @@
-                               }
-                       }
--                      if( uioc.xferlen ) {
--                              pci_free_consistent(pdev,
--                                              uioc.xferlen, data,
--                                              data_dma_hndl);
-+                      if (data_dma_hndl) {
-+                              pci_free_consistent( pdev, uioc.xferlen,
-+                                                      data, data_dma_hndl );
-                       }
-                       return rval;
-@@ -4725,19 +4753,22 @@
-       else {
-               uioc_mimd = (struct uioctl_t *)arg;
--              if( put_user(mc->status, (u8 *)&uioc_mimd->mbox[17]) )
-+              if( put_user(mc->status, (u8 *)&uioc_mimd->mbox[17]) ) {
-                       return (-EFAULT);
-+              }
-               if( mc->cmd == MEGA_MBOXCMD_PASSTHRU ) {
-                       umc = (megacmd_t *)uioc_mimd->mbox;
--                      if (copy_from_user(&kmc, umc, sizeof(megacmd_t)))
-+                      if (copy_from_user(&kmc, umc, sizeof(megacmd_t))) {
-                               return -EFAULT;
-+                      }
-                       upthru = (mega_passthru *)((ulong)kmc.xferaddr);
--                      if( put_user(mc->status, (u8 *)&upthru->scsistatus) )
-+                      if( put_user(mc->status, (u8 *)&upthru->scsistatus) ){
-                               return (-EFAULT);
-+                      }
-               }
-       }
-@@ -5148,7 +5179,6 @@
- }
--
- /**
-  * mega_reorder_hosts()
-  *
-@@ -5363,6 +5393,7 @@
- }
-+
- /** mega_internal_dev_inquiry()
-  * @adapter - pointer to our soft state
-  * @ch - channel for this device
-diff -Nur linux-2.4.29/drivers/scsi/megaraid2.h linux-mips/drivers/scsi/megaraid2.h
---- linux-2.4.29/drivers/scsi/megaraid2.h      2004-11-17 12:54:21.000000000 +0100
-+++ linux-mips/drivers/scsi/megaraid2.h        2005-03-26 11:47:33.143212178 +0100
-@@ -6,7 +6,7 @@
- #define MEGARAID_VERSION      \
--      "v2.10.3 (Release Date: Thu Apr  8 16:16:05 EDT 2004)\n"
-+      "v2.10.8.2 (Release Date: Mon Jul 26 12:15:51 EDT 2004)\n"
- /*
-  * Driver features - change the values to enable or disable features in the
-@@ -82,6 +82,7 @@
- #define LSI_SUBSYS_VID                        0x1000
- #define INTEL_SUBSYS_VID              0x8086
- #define FSC_SUBSYS_VID                        0x1734
-+#define ACER_SUBSYS_VID                       0x1025
- #define HBA_SIGNATURE                 0x3344
- #define HBA_SIGNATURE_471             0xCCCC
-@@ -978,6 +979,15 @@
-                                                cmds */
-       int     has_cluster;    /* cluster support on this HBA */
-+
-+#define INT_MEMBLK_SZ         (28*1024)
-+      mega_passthru           *int_pthru;             /*internal pthru*/
-+      dma_addr_t              int_pthru_dma_hndl;
-+      caddr_t                 int_data;               /*internal data*/
-+      dma_addr_t              int_data_dma_hndl;
-+
-+      int                     hw_error;
-+
- }adapter_t;
-@@ -1085,18 +1095,21 @@
- #define MBOX_ABORT_SLEEP      60
- #define MBOX_RESET_SLEEP      30
-+#define MBOX_RESET_WAIT               180
- const char *megaraid_info (struct Scsi_Host *);
- static int megaraid_detect(Scsi_Host_Template *);
- static void mega_find_card(Scsi_Host_Template *, u16, u16);
- static int mega_query_adapter(adapter_t *);
--static int issue_scb(adapter_t *, scb_t *);
-+static inline int issue_scb(adapter_t *, scb_t *);
- static int mega_setup_mailbox(adapter_t *);
- static int megaraid_queue (Scsi_Cmnd *, void (*)(Scsi_Cmnd *));
- static scb_t * mega_build_cmd(adapter_t *, Scsi_Cmnd *, int *);
-+static inline scb_t *mega_allocate_scb(adapter_t *, Scsi_Cmnd *);
- static void __mega_runpendq(adapter_t *);
-+static inline void mega_runpendq(adapter_t *);
- static int issue_scb_block(adapter_t *, u_char *);
- static void megaraid_isr_memmapped(int, void *, struct pt_regs *);
-@@ -1113,6 +1126,7 @@
- static int mega_build_sglist (adapter_t *adapter, scb_t *scb,
-                             u32 *buffer, u32 *length);
-+static inline int mega_busywait_mbox (adapter_t *);
- static int __mega_busywait_mbox (adapter_t *);
- static void mega_cmd_done(adapter_t *, u8 [], int, int);
- static inline void mega_free_sgl (adapter_t *adapter);
-@@ -1123,15 +1137,13 @@
-                                  unsigned long, void *);
- static int megadev_open (struct inode *, struct file *);
--#if defined(CONFIG_COMPAT) || defined( __x86_64__) || defined(IA32_EMULATION)
--#define LSI_CONFIG_COMPAT
--#endif
--
--#ifdef LSI_CONFIG_COMPAT
-+#if defined(__x86_64__)
- static int megadev_compat_ioctl(unsigned int, unsigned int, unsigned long,
-       struct file *);
- #endif
-+static int megadev_ioctl_entry (struct inode *, struct file *, unsigned int,
-+              unsigned long);
- static int megadev_ioctl (struct inode *, struct file *, unsigned int,
-               unsigned long);
- static int mega_m_to_n(void *, nitioctl_t *);
-@@ -1164,6 +1176,8 @@
- static int mega_adapinq(adapter_t *, dma_addr_t);
- static int mega_internal_dev_inquiry(adapter_t *, u8, u8, dma_addr_t);
-+static inline caddr_t mega_allocate_inquiry(dma_addr_t *, struct pci_dev *);
-+static inline void mega_free_inquiry(caddr_t, dma_addr_t, struct pci_dev *);
- static int mega_print_inquiry(char *, char *);
- #endif
-@@ -1174,6 +1188,7 @@
-               scb_t *, Scsi_Cmnd *, int, int);
- static void mega_enum_raid_scsi(adapter_t *);
- static void mega_get_boot_drv(adapter_t *);
-+static inline int mega_get_ldrv_num(adapter_t *, Scsi_Cmnd *, int);
- static int mega_support_random_del(adapter_t *);
- static int mega_del_logdrv(adapter_t *, int);
- static int mega_do_del_logdrv(adapter_t *, int);
-diff -Nur linux-2.4.29/drivers/scsi/NCR53C9x.h linux-mips/drivers/scsi/NCR53C9x.h
---- linux-2.4.29/drivers/scsi/NCR53C9x.h       2004-02-18 14:36:31.000000000 +0100
-+++ linux-mips/drivers/scsi/NCR53C9x.h 2003-12-15 19:19:51.000000000 +0100
-@@ -144,12 +144,7 @@
- #ifndef MULTIPLE_PAD_SIZES
--#ifdef CONFIG_CPU_HAS_WB
--#include <asm/wbflush.h>
--#define esp_write(__reg, __val) do{(__reg) = (__val); wbflush();} while(0)
--#else
--#define esp_write(__reg, __val) ((__reg) = (__val))
--#endif
-+#define esp_write(__reg, __val) do{(__reg) = (__val); iob();} while(0)
- #define esp_read(__reg) (__reg)
- struct ESP_regs {
-diff -Nur linux-2.4.29/drivers/scsi/osst.c linux-mips/drivers/scsi/osst.c
---- linux-2.4.29/drivers/scsi/osst.c   2004-08-08 01:26:05.000000000 +0200
-+++ linux-mips/drivers/scsi/osst.c     2005-03-26 11:47:33.149211193 +0100
-@@ -5505,7 +5505,6 @@
-       read:           osst_read,
-       write:          osst_write,
-       ioctl:          osst_ioctl,
--      llseek:         no_llseek,
-       open:           os_scsi_tape_open,
-       flush:          os_scsi_tape_flush,
-       release:        os_scsi_tape_close,
-diff -Nur linux-2.4.29/drivers/scsi/sata_nv.c linux-mips/drivers/scsi/sata_nv.c
---- linux-2.4.29/drivers/scsi/sata_nv.c        2005-01-19 15:10:03.000000000 +0100
-+++ linux-mips/drivers/scsi/sata_nv.c  2005-03-26 11:47:33.156210045 +0100
-@@ -20,6 +20,10 @@
-  *  If you do not delete the provisions above, a recipient may use your
-  *  version of this file under either the OSL or the GPL.
-  *
-+ *  0.06
-+ *     - Added generic SATA support by using a pci_device_id that filters on
-+ *       the IDE storage class code.
-+ *
-  *  0.03
-  *     - Fixed a bug where the hotplug handlers for non-CK804/MCP04 were using
-  *       mmio_base, which is only set for the CK804/MCP04 case.
-@@ -44,7 +48,7 @@
- #include <linux/libata.h>
- #define DRV_NAME                      "sata_nv"
--#define DRV_VERSION                   "0.5"
-+#define DRV_VERSION                   "0.6"
- #define NV_PORTS                      2
- #define NV_PIO_MASK                   0x1f
-@@ -95,7 +99,8 @@
- #define NV_MCP_SATA_CFG_20_SATA_SPACE_EN      0x04
- static int nv_init_one (struct pci_dev *pdev, const struct pci_device_id *ent);
--irqreturn_t nv_interrupt (int irq, void *dev_instance, struct pt_regs *regs);
-+static irqreturn_t nv_interrupt (int irq, void *dev_instance,
-+                               struct pt_regs *regs);
- static u32 nv_scr_read (struct ata_port *ap, unsigned int sc_reg);
- static void nv_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val);
- static void nv_host_stop (struct ata_host_set *host_set);
-@@ -108,6 +113,7 @@
- enum nv_host_type
- {
-+      GENERIC,
-       NFORCE2,
-       NFORCE3,
-       CK804
-@@ -128,6 +134,9 @@
-               PCI_ANY_ID, PCI_ANY_ID, 0, 0, CK804 },
-       { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP04_SATA2,
-               PCI_ANY_ID, PCI_ANY_ID, 0, 0, CK804 },
-+      { PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID,
-+              PCI_ANY_ID, PCI_ANY_ID,
-+              PCI_CLASS_STORAGE_IDE<<8, 0xffff00, GENERIC },
-       { 0, } /* terminate list */
- };
-@@ -136,7 +145,6 @@
- struct nv_host_desc
- {
-       enum nv_host_type       host_type;
--      unsigned long           host_flags;
-       void                    (*enable_hotplug)(struct ata_probe_ent *probe_ent);
-       void                    (*disable_hotplug)(struct ata_host_set *host_set);
-       void                    (*check_hotplug)(struct ata_host_set *host_set);
-@@ -144,21 +152,24 @@
- };
- static struct nv_host_desc nv_device_tbl[] = {
-       {
-+              .host_type      = GENERIC,
-+              .enable_hotplug = NULL,
-+              .disable_hotplug= NULL,
-+              .check_hotplug  = NULL,
-+      },
-+      {
-               .host_type      = NFORCE2,
--              .host_flags     = 0x00000000,
-               .enable_hotplug = nv_enable_hotplug,
-               .disable_hotplug= nv_disable_hotplug,
-               .check_hotplug  = nv_check_hotplug,
-       },
-       {
-               .host_type      = NFORCE3,
--              .host_flags     = 0x00000000,
-               .enable_hotplug = nv_enable_hotplug,
-               .disable_hotplug= nv_disable_hotplug,
-               .check_hotplug  = nv_check_hotplug,
-       },
-       {       .host_type      = CK804,
--              .host_flags     = NV_HOST_FLAGS_SCR_MMIO,
-               .enable_hotplug = nv_enable_hotplug_ck804,
-               .disable_hotplug= nv_disable_hotplug_ck804,
-               .check_hotplug  = nv_check_hotplug_ck804,
-@@ -168,6 +179,7 @@
- struct nv_host
- {
-       struct nv_host_desc     *host_desc;
-+      unsigned long           host_flags;
- };
- static struct pci_driver nv_pci_driver = {
-@@ -207,6 +219,8 @@
-       .phy_reset              = sata_phy_reset,
-       .bmdma_setup            = ata_bmdma_setup,
-       .bmdma_start            = ata_bmdma_start,
-+      .bmdma_stop             = ata_bmdma_stop,
-+      .bmdma_status           = ata_bmdma_status,
-       .qc_prep                = ata_qc_prep,
-       .qc_issue               = ata_qc_issue_prot,
-       .eng_timeout            = ata_eng_timeout,
-@@ -245,7 +259,8 @@
- MODULE_DEVICE_TABLE(pci, nv_pci_tbl);
- MODULE_VERSION(DRV_VERSION);
--irqreturn_t nv_interrupt (int irq, void *dev_instance, struct pt_regs *regs)
-+static irqreturn_t nv_interrupt (int irq, void *dev_instance,
-+                               struct pt_regs *regs)
- {
-       struct ata_host_set *host_set = dev_instance;
-       struct nv_host *host = host_set->private_data;
-@@ -285,8 +300,8 @@
-       if (sc_reg > SCR_CONTROL)
-               return 0xffffffffU;
--      if (host->host_desc->host_flags & NV_HOST_FLAGS_SCR_MMIO)
--              return readl(ap->ioaddr.scr_addr + (sc_reg * 4));
-+      if (host->host_flags & NV_HOST_FLAGS_SCR_MMIO)
-+              return readl((void*)ap->ioaddr.scr_addr + (sc_reg * 4));
-       else
-               return inl(ap->ioaddr.scr_addr + (sc_reg * 4));
- }
-@@ -299,8 +314,8 @@
-       if (sc_reg > SCR_CONTROL)
-               return;
--      if (host->host_desc->host_flags & NV_HOST_FLAGS_SCR_MMIO)
--              writel(val, ap->ioaddr.scr_addr + (sc_reg * 4));
-+      if (host->host_flags & NV_HOST_FLAGS_SCR_MMIO)
-+              writel(val, (void*)ap->ioaddr.scr_addr + (sc_reg * 4));
-       else
-               outl(val, ap->ioaddr.scr_addr + (sc_reg * 4));
- }
-@@ -322,7 +337,16 @@
-       struct nv_host *host;
-       struct ata_port_info *ppi;
-       struct ata_probe_ent *probe_ent;
-+      int pci_dev_busy = 0;
-       int rc;
-+      u32 bar;
-+
-+        // Make sure this is a SATA controller by counting the number of bars
-+        // (NVIDIA SATA controllers will always have six bars).  Otherwise,
-+        // it's an IDE controller and we ignore it.
-+      for (bar=0; bar<6; bar++)
-+              if (pci_resource_start(pdev, bar) == 0)
-+                      return -ENODEV;
-       if (!printed_version++)
-               printk(KERN_DEBUG DRV_NAME " version " DRV_VERSION "\n");
-@@ -332,8 +356,10 @@
-               goto err_out;
-       rc = pci_request_regions(pdev, DRV_NAME);
--      if (rc)
-+      if (rc) {
-+              pci_dev_busy = 1;
-               goto err_out_disable;
-+      }
-       rc = pci_set_dma_mask(pdev, ATA_DMA_MASK);
-       if (rc)
-@@ -350,11 +376,15 @@
-       if (!host)
-               goto err_out_free_ent;
-+      memset(host, 0, sizeof(struct nv_host));
-       host->host_desc = &nv_device_tbl[ent->driver_data];
-       probe_ent->private_data = host;
--      if (host->host_desc->host_flags & NV_HOST_FLAGS_SCR_MMIO) {
-+      if (pci_resource_flags(pdev, 5) & IORESOURCE_MEM)
-+              host->host_flags |= NV_HOST_FLAGS_SCR_MMIO;
-+
-+      if (host->host_flags & NV_HOST_FLAGS_SCR_MMIO) {
-               unsigned long base;
-               probe_ent->mmio_base = ioremap(pci_resource_start(pdev, 5),
-@@ -395,7 +425,8 @@
- err_out_regions:
-       pci_release_regions(pdev);
- err_out_disable:
--      pci_disable_device(pdev);
-+      if (!pci_dev_busy)
-+              pci_disable_device(pdev);
- err_out:
-       return rc;
- }
-diff -Nur linux-2.4.29/drivers/scsi/sata_promise.c linux-mips/drivers/scsi/sata_promise.c
---- linux-2.4.29/drivers/scsi/sata_promise.c   2005-01-19 15:10:03.000000000 +0100
-+++ linux-mips/drivers/scsi/sata_promise.c     2005-03-26 11:47:33.159209552 +0100
-@@ -42,8 +42,6 @@
- #define DRV_NAME      "sata_promise"
- #define DRV_VERSION   "1.01"
--#define msleep libata_msleep  /* 2.4-specific */
--
- enum {
-       PDC_PKT_SUBMIT          = 0x40, /* Command packet pointer addr */
-       PDC_INT_SEQMASK         = 0x40, /* Mask of asserted SEQ INTs */
-@@ -158,10 +156,18 @@
-         board_2037x },
-       { PCI_VENDOR_ID_PROMISE, 0x3376, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
-         board_2037x },
-+      { PCI_VENDOR_ID_PROMISE, 0x3574, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
-+        board_2037x },
-+      { PCI_VENDOR_ID_PROMISE, 0x3d75, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
-+        board_2037x },
-+
-       { PCI_VENDOR_ID_PROMISE, 0x3318, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
-         board_20319 },
-       { PCI_VENDOR_ID_PROMISE, 0x3319, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
-         board_20319 },
-+      { PCI_VENDOR_ID_PROMISE, 0x3d18, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
-+        board_20319 },
-+
-       { }     /* terminate list */
- };
-@@ -408,9 +414,11 @@
-               return IRQ_NONE;
-       }
--        spin_lock(&host_set->lock);
-+      spin_lock(&host_set->lock);
-+
-+      writel(mask, mmio_base + PDC_INT_SEQMASK);
--        for (i = 0; i < host_set->n_ports; i++) {
-+      for (i = 0; i < host_set->n_ports; i++) {
-               VPRINTK("port %u\n", i);
-               ap = host_set->ports[i];
-               tmp = mask & (1 << (i + 1));
-@@ -548,6 +556,7 @@
-       unsigned long base;
-       void *mmio_base;
-       unsigned int board_idx = (unsigned int) ent->driver_data;
-+      int pci_dev_busy = 0;
-       int rc;
-       if (!printed_version++)
-@@ -562,8 +571,10 @@
-               return rc;
-       rc = pci_request_regions(pdev, DRV_NAME);
--      if (rc)
-+      if (rc) {
-+              pci_dev_busy = 1;
-               goto err_out;
-+      }
-       rc = pci_set_dma_mask(pdev, ATA_DMA_MASK);
-       if (rc)
-@@ -637,7 +648,8 @@
- err_out_regions:
-       pci_release_regions(pdev);
- err_out:
--      pci_disable_device(pdev);
-+      if (!pci_dev_busy)
-+              pci_disable_device(pdev);
-       return rc;
- }
-diff -Nur linux-2.4.29/drivers/scsi/sata_qstor.c linux-mips/drivers/scsi/sata_qstor.c
---- linux-2.4.29/drivers/scsi/sata_qstor.c     1970-01-01 01:00:00.000000000 +0100
-+++ linux-mips/drivers/scsi/sata_qstor.c       2005-03-18 13:13:28.000000000 +0100
-@@ -0,0 +1,717 @@
-+/*
-+ *  sata_qstor.c - Pacific Digital Corporation QStor SATA
-+ *
-+ *  Maintained by:  Mark Lord <mlord@pobox.com>
-+ *
-+ *  Copyright 2005 Pacific Digital Corporation.
-+ *  (OSL/GPL code release authorized by Jalil Fadavi).
-+ *
-+ *  The contents of this file are subject to the Open
-+ *  Software License version 1.1 that can be found at
-+ *  http://www.opensource.org/licenses/osl-1.1.txt and is included herein
-+ *  by reference.
-+ *
-+ *  Alternatively, the contents of this file may be used under the terms
-+ *  of the GNU General Public License version 2 (the "GPL") as distributed
-+ *  in the kernel source COPYING file, in which case the provisions of
-+ *  the GPL are applicable instead of the above.  If you wish to allow
-+ *  the use of your version of this file only under the terms of the
-+ *  GPL and not to allow others to use your version of this file under
-+ *  the OSL, indicate your decision by deleting the provisions above and
-+ *  replace them with the notice and other provisions required by the GPL.
-+ *  If you do not delete the provisions above, a recipient may use your
-+ *  version of this file under either the OSL or the GPL.
-+ *
-+ */
-+
-+#include <linux/kernel.h>
-+#include <linux/module.h>
-+#include <linux/pci.h>
-+#include <linux/init.h>
-+#include <linux/blkdev.h>
-+#include <linux/delay.h>
-+#include <linux/interrupt.h>
-+#include <linux/sched.h>
-+#include "scsi.h"
-+#include <scsi/scsi_host.h>
-+#include <asm/io.h>
-+#include <linux/libata.h>
-+
-+#define DRV_NAME      "sata_qstor"
-+#define DRV_VERSION   "0.04"
-+
-+enum {
-+      QS_PORTS                = 4,
-+      QS_MAX_PRD              = LIBATA_MAX_PRD,
-+      QS_CPB_ORDER            = 6,
-+      QS_CPB_BYTES            = (1 << QS_CPB_ORDER),
-+      QS_PRD_BYTES            = QS_MAX_PRD * 16,
-+      QS_PKT_BYTES            = QS_CPB_BYTES + QS_PRD_BYTES,
-+
-+      QS_DMA_BOUNDARY         = ~0UL,
-+
-+      /* global register offsets */
-+      QS_HCF_CNFG3            = 0x0003, /* host configuration offset */
-+      QS_HID_HPHY             = 0x0004, /* host physical interface info */
-+      QS_HCT_CTRL             = 0x00e4, /* global interrupt mask offset */
-+      QS_HST_SFF              = 0x0100, /* host status fifo offset */
-+      QS_HVS_SERD3            = 0x0393, /* PHY enable offset */
-+
-+      /* global control bits */
-+      QS_HPHY_64BIT           = (1 << 1), /* 64-bit bus detected */
-+      QS_CNFG3_GSRST          = 0x01,     /* global chip reset */
-+      QS_SERD3_PHY_ENA        = 0xf0,     /* PHY detection ENAble*/
-+
-+      /* per-channel register offsets */
-+      QS_CCF_CPBA             = 0x0710, /* chan CPB base address */
-+      QS_CCF_CSEP             = 0x0718, /* chan CPB separation factor */
-+      QS_CFC_HUFT             = 0x0800, /* host upstream fifo threshold */
-+      QS_CFC_HDFT             = 0x0804, /* host downstream fifo threshold */
-+      QS_CFC_DUFT             = 0x0808, /* dev upstream fifo threshold */
-+      QS_CFC_DDFT             = 0x080c, /* dev downstream fifo threshold */
-+      QS_CCT_CTR0             = 0x0900, /* chan control-0 offset */
-+      QS_CCT_CTR1             = 0x0901, /* chan control-1 offset */
-+      QS_CCT_CFF              = 0x0a00, /* chan command fifo offset */
-+
-+      /* channel control bits */
-+      QS_CTR0_REG             = (1 << 1),   /* register mode (vs. pkt mode) */
-+      QS_CTR0_CLER            = (1 << 2),   /* clear channel errors */
-+      QS_CTR1_RDEV            = (1 << 1),   /* sata phy/comms reset */
-+      QS_CTR1_RCHN            = (1 << 4),   /* reset channel logic */
-+      QS_CCF_RUN_PKT          = 0x107,      /* RUN a new dma PKT */
-+
-+      /* pkt sub-field headers */
-+      QS_HCB_HDR              = 0x01,   /* Host Control Block header */
-+      QS_DCB_HDR              = 0x02,   /* Device Control Block header */
-+
-+      /* pkt HCB flag bits */
-+      QS_HF_DIRO              = (1 << 0),   /* data DIRection Out */
-+      QS_HF_DAT               = (1 << 3),   /* DATa pkt */
-+      QS_HF_IEN               = (1 << 4),   /* Interrupt ENable */
-+      QS_HF_VLD               = (1 << 5),   /* VaLiD pkt */
-+
-+      /* pkt DCB flag bits */
-+      QS_DF_PORD              = (1 << 2),   /* Pio OR Dma */
-+      QS_DF_ELBA              = (1 << 3),   /* Extended LBA (lba48) */
-+
-+      /* PCI device IDs */
-+      board_2068_idx          = 0,    /* QStor 4-port SATA/RAID */
-+};
-+
-+typedef enum { qs_state_idle, qs_state_pkt, qs_state_mmio } qs_state_t;
-+
-+struct qs_port_priv {
-+      u8                      *pkt;
-+      dma_addr_t              pkt_dma;
-+      qs_state_t              state;
-+};
-+
-+static u32 qs_scr_read (struct ata_port *ap, unsigned int sc_reg);
-+static void qs_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val);
-+static int qs_ata_init_one (struct pci_dev *pdev, const struct pci_device_id *ent);
-+static irqreturn_t qs_intr (int irq, void *dev_instance, struct pt_regs *regs);
-+static int qs_port_start(struct ata_port *ap);
-+static void qs_host_stop(struct ata_host_set *host_set);
-+static void qs_port_stop(struct ata_port *ap);
-+static void qs_phy_reset(struct ata_port *ap);
-+static void qs_qc_prep(struct ata_queued_cmd *qc);
-+static int qs_qc_issue(struct ata_queued_cmd *qc);
-+static int qs_check_atapi_dma(struct ata_queued_cmd *qc);
-+static void qs_bmdma_stop(struct ata_port *ap);
-+static u8 qs_bmdma_status(struct ata_port *ap);
-+static void qs_irq_clear(struct ata_port *ap);
-+static void qs_eng_timeout(struct ata_port *ap);
-+
-+static Scsi_Host_Template qs_ata_sht = {
-+      .module                 = THIS_MODULE,
-+      .name                   = DRV_NAME,
-+      .detect                 = ata_scsi_detect,
-+      .release                = ata_scsi_release,
-+      .ioctl                  = ata_scsi_ioctl,
-+      .queuecommand           = ata_scsi_queuecmd,
-+      .eh_strategy_handler    = ata_scsi_error,
-+      .can_queue              = ATA_DEF_QUEUE,
-+      .this_id                = ATA_SHT_THIS_ID,
-+      .sg_tablesize           = QS_MAX_PRD,
-+      .max_sectors            = ATA_MAX_SECTORS,
-+      .cmd_per_lun            = ATA_SHT_CMD_PER_LUN,
-+      .use_new_eh_code        = ATA_SHT_NEW_EH_CODE,
-+      .emulated               = ATA_SHT_EMULATED,
-+      //FIXME .use_clustering         = ATA_SHT_USE_CLUSTERING,
-+      .use_clustering         = ENABLE_CLUSTERING,
-+      .proc_name              = DRV_NAME,
-+      .bios_param             = ata_std_bios_param,
-+};
-+
-+static struct ata_port_operations qs_ata_ops = {
-+      .port_disable           = ata_port_disable,
-+      .tf_load                = ata_tf_load,
-+      .tf_read                = ata_tf_read,
-+      .check_status           = ata_check_status,
-+      .check_atapi_dma        = qs_check_atapi_dma,
-+      .exec_command           = ata_exec_command,
-+      .dev_select             = ata_std_dev_select,
-+      .phy_reset              = qs_phy_reset,
-+      .qc_prep                = qs_qc_prep,
-+      .qc_issue               = qs_qc_issue,
-+      .eng_timeout            = qs_eng_timeout,
-+      .irq_handler            = qs_intr,
-+      .irq_clear              = qs_irq_clear,
-+      .scr_read               = qs_scr_read,
-+      .scr_write              = qs_scr_write,
-+      .port_start             = qs_port_start,
-+      .port_stop              = qs_port_stop,
-+      .host_stop              = qs_host_stop,
-+      .bmdma_stop             = qs_bmdma_stop,
-+      .bmdma_status           = qs_bmdma_status,
-+};
-+
-+static struct ata_port_info qs_port_info[] = {
-+      /* board_2068_idx */
-+      {
-+              .sht            = &qs_ata_sht,
-+              .host_flags     = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
-+                                ATA_FLAG_SATA_RESET |
-+                                //FIXME ATA_FLAG_SRST |
-+                                ATA_FLAG_MMIO,
-+              .pio_mask       = 0x10, /* pio4 */
-+              .udma_mask      = 0x7f, /* udma0-6 */
-+              .port_ops       = &qs_ata_ops,
-+      },
-+};
-+
-+static struct pci_device_id qs_ata_pci_tbl[] = {
-+      { PCI_VENDOR_ID_PDC, 0x2068, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
-+        board_2068_idx },
-+
-+      { }     /* terminate list */
-+};
-+
-+static struct pci_driver qs_ata_pci_driver = {
-+      .name                   = DRV_NAME,
-+      .id_table               = qs_ata_pci_tbl,
-+      .probe                  = qs_ata_init_one,
-+      .remove                 = ata_pci_remove_one,
-+};
-+
-+static int qs_check_atapi_dma(struct ata_queued_cmd *qc)
-+{
-+      return 1;       /* ATAPI DMA not supported */
-+}
-+
-+static void qs_bmdma_stop(struct ata_port *ap)
-+{
-+      /* nothing */
-+}
-+
-+static u8 qs_bmdma_status(struct ata_port *ap)
-+{
-+      return 0;
-+}
-+
-+static void qs_irq_clear(struct ata_port *ap)
-+{
-+      /* nothing */
-+}
-+
-+static inline void qs_enter_reg_mode(struct ata_port *ap)
-+{
-+      u8 __iomem *chan = ap->host_set->mmio_base + (ap->port_no * 0x4000);
-+
-+      writeb(QS_CTR0_REG, chan + QS_CCT_CTR0);
-+      readb(chan + QS_CCT_CTR0);        /* flush */
-+}
-+
-+static inline void qs_reset_channel_logic(struct ata_port *ap)
-+{
-+      u8 __iomem *chan = ap->host_set->mmio_base + (ap->port_no * 0x4000);
-+
-+      writeb(QS_CTR1_RCHN, chan + QS_CCT_CTR1);
-+      readb(chan + QS_CCT_CTR0);        /* flush */
-+      qs_enter_reg_mode(ap);
-+}
-+
-+static void qs_phy_reset(struct ata_port *ap)
-+{
-+      struct qs_port_priv *pp = ap->private_data;
-+
-+      pp->state = qs_state_idle;
-+      qs_reset_channel_logic(ap);
-+      sata_phy_reset(ap);
-+}
-+
-+static void qs_eng_timeout(struct ata_port *ap)
-+{
-+      struct qs_port_priv *pp = ap->private_data;
-+
-+      if (pp->state != qs_state_idle) /* healthy paranoia */
-+              pp->state = qs_state_mmio;
-+      qs_reset_channel_logic(ap);
-+      ata_eng_timeout(ap);
-+}
-+
-+static u32 qs_scr_read (struct ata_port *ap, unsigned int sc_reg)
-+{
-+      if (sc_reg > SCR_CONTROL)
-+              return ~0U;
-+      return readl((void __iomem *)(ap->ioaddr.scr_addr + (sc_reg * 8)));
-+}
-+
-+static void qs_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val)
-+{
-+      if (sc_reg > SCR_CONTROL)
-+              return;
-+      writel(val, (void __iomem *)(ap->ioaddr.scr_addr + (sc_reg * 8)));
-+}
-+
-+static void qs_fill_sg(struct ata_queued_cmd *qc)
-+{
-+      struct scatterlist *sg = qc->sg;
-+      struct ata_port *ap = qc->ap;
-+      struct qs_port_priv *pp = ap->private_data;
-+      unsigned int nelem;
-+      u8 *prd = pp->pkt + QS_CPB_BYTES;
-+
-+      assert(sg != NULL);
-+      assert(qc->n_elem > 0);
-+
-+      for (nelem = 0; nelem < qc->n_elem; nelem++,sg++) {
-+              u64 addr;
-+              u32 len;
-+
-+              addr = sg_dma_address(sg);
-+              *(__le64 *)prd = cpu_to_le64(addr);
-+              prd += sizeof(u64);
-+
-+              len = sg_dma_len(sg);
-+              *(__le32 *)prd = cpu_to_le32(len);
-+              prd += sizeof(u64);
-+
-+              VPRINTK("PRD[%u] = (0x%llX, 0x%X)\n", nelem,
-+                                      (unsigned long long)addr, len);
-+      }
-+}
-+
-+static void qs_qc_prep(struct ata_queued_cmd *qc)
-+{
-+      struct qs_port_priv *pp = qc->ap->private_data;
-+      u8 dflags = QS_DF_PORD, *buf = pp->pkt;
-+      u8 hflags = QS_HF_DAT | QS_HF_IEN | QS_HF_VLD;
-+      u64 addr;
-+
-+      VPRINTK("ENTER\n");
-+
-+      qs_enter_reg_mode(qc->ap);
-+      if (qc->tf.protocol != ATA_PROT_DMA) {
-+              ata_qc_prep(qc);
-+              return;
-+      }
-+
-+      qs_fill_sg(qc);
-+
-+      if ((qc->tf.flags & ATA_TFLAG_WRITE))
-+              hflags |= QS_HF_DIRO;
-+      if ((qc->tf.flags & ATA_TFLAG_LBA48))
-+              dflags |= QS_DF_ELBA;
-+
-+      /* host control block (HCB) */
-+      buf[ 0] = QS_HCB_HDR;
-+      buf[ 1] = hflags;
-+      *(__le32 *)(&buf[ 4]) = cpu_to_le32(qc->nsect * ATA_SECT_SIZE);
-+      *(__le32 *)(&buf[ 8]) = cpu_to_le32(qc->n_elem);
-+      addr = ((u64)pp->pkt_dma) + QS_CPB_BYTES;
-+      *(__le64 *)(&buf[16]) = cpu_to_le64(addr);
-+
-+      /* device control block (DCB) */
-+      buf[24] = QS_DCB_HDR;
-+      buf[28] = dflags;
-+
-+      /* frame information structure (FIS) */
-+      ata_tf_to_fis(&qc->tf, &buf[32], 0);
-+}
-+
-+static inline void qs_packet_start(struct ata_queued_cmd *qc)
-+{
-+      struct ata_port *ap = qc->ap;
-+      u8 __iomem *chan = ap->host_set->mmio_base + (ap->port_no * 0x4000);
-+
-+      VPRINTK("ENTER, ap %p\n", ap);
-+
-+      writeb(QS_CTR0_CLER, chan + QS_CCT_CTR0);
-+      wmb();                             /* flush PRDs and pkt to memory */
-+      writel(QS_CCF_RUN_PKT, chan + QS_CCT_CFF);
-+      readl(chan + QS_CCT_CFF);          /* flush */
-+}
-+
-+static int qs_qc_issue(struct ata_queued_cmd *qc)
-+{
-+      struct qs_port_priv *pp = qc->ap->private_data;
-+
-+      switch (qc->tf.protocol) {
-+      case ATA_PROT_DMA:
-+
-+              pp->state = qs_state_pkt;
-+              qs_packet_start(qc);
-+              return 0;
-+
-+      case ATA_PROT_ATAPI_DMA:
-+              BUG();
-+              break;
-+
-+      default:
-+              break;
-+      }
-+
-+      pp->state = qs_state_mmio;
-+      return ata_qc_issue_prot(qc);
-+}
-+
-+static inline unsigned int qs_intr_pkt(struct ata_host_set *host_set)
-+{
-+      unsigned int handled = 0;
-+      u8 sFFE;
-+      u8 __iomem *mmio_base = host_set->mmio_base;
-+
-+      do {
-+              u32 sff0 = readl(mmio_base + QS_HST_SFF);
-+              u32 sff1 = readl(mmio_base + QS_HST_SFF + 4);
-+              u8 sEVLD = (sff1 >> 30) & 0x01; /* valid flag */
-+              sFFE  = sff1 >> 31;             /* empty flag */
-+
-+              if (sEVLD) {
-+                      u8 sDST = sff0 >> 16;   /* dev status */
-+                      u8 sHST = sff1 & 0x3f;  /* host status */
-+                      unsigned int port_no = (sff1 >> 8) & 0x03;
-+                      struct ata_port *ap = host_set->ports[port_no];
-+
-+                      DPRINTK("SFF=%08x%08x: sCHAN=%u sHST=%d sDST=%02x\n",
-+                                      sff1, sff0, port_no, sHST, sDST);
-+                      handled = 1;
-+                      if (ap && (!(ap->flags & ATA_FLAG_PORT_DISABLED))) {
-+                              struct ata_queued_cmd *qc;
-+                              struct qs_port_priv *pp = ap->private_data;
-+                              if (!pp || pp->state != qs_state_pkt)
-+                                      continue;
-+                              qc = ata_qc_from_tag(ap, ap->active_tag);
-+                              if (qc && (!(qc->tf.ctl & ATA_NIEN))) {
-+                                      switch (sHST) {
-+                                      case 0: /* sucessful CPB */
-+                                      case 3: /* device error */
-+                                              pp->state = qs_state_idle;
-+                                              qs_enter_reg_mode(qc->ap);
-+                                              ata_qc_complete(qc, sDST);
-+                                              break;
-+                                      default:
-+                                              break;
-+                                      }
-+                              }
-+                      }
-+              }
-+      } while (!sFFE);
-+      return handled;
-+}
-+
-+static inline unsigned int qs_intr_mmio(struct ata_host_set *host_set)
-+{
-+      unsigned int handled = 0, port_no;
-+
-+      for (port_no = 0; port_no < host_set->n_ports; ++port_no) {
-+              struct ata_port *ap;
-+              ap = host_set->ports[port_no];
-+              if (ap && (!(ap->flags & ATA_FLAG_PORT_DISABLED))) {
-+                      struct ata_queued_cmd *qc;
-+                      struct qs_port_priv *pp = ap->private_data;
-+                      if (!pp || pp->state != qs_state_mmio)
-+                              continue;
-+                      qc = ata_qc_from_tag(ap, ap->active_tag);
-+                      if (qc && (!(qc->tf.ctl & ATA_NIEN))) {
-+
-+                              /* check main status, clearing INTRQ */
-+                              u8 status = ata_chk_status(ap);
-+                              if ((status & ATA_BUSY))
-+                                      continue;
-+                              DPRINTK("ata%u: protocol %d (dev_stat 0x%X)\n",
-+                                      ap->id, qc->tf.protocol, status);
-+              
-+                              /* complete taskfile transaction */
-+                              pp->state = qs_state_idle;
-+                              ata_qc_complete(qc, status);
-+                              handled = 1;
-+                      }
-+              }
-+      }
-+      return handled;
-+}
-+
-+static irqreturn_t qs_intr(int irq, void *dev_instance, struct pt_regs *regs)
-+{
-+      struct ata_host_set *host_set = dev_instance;
-+      unsigned int handled = 0;
-+
-+      VPRINTK("ENTER\n");
-+
-+      spin_lock(&host_set->lock);
-+      handled  = qs_intr_pkt(host_set) | qs_intr_mmio(host_set);
-+      spin_unlock(&host_set->lock);
-+
-+      VPRINTK("EXIT\n");
-+
-+      return IRQ_RETVAL(handled);
-+}
-+
-+static void qs_ata_setup_port(struct ata_ioports *port, unsigned long base)
-+{
-+      port->cmd_addr          =
-+      port->data_addr         = base + 0x400;
-+      port->error_addr        =
-+      port->feature_addr      = base + 0x408; /* hob_feature = 0x409 */
-+      port->nsect_addr        = base + 0x410; /* hob_nsect   = 0x411 */
-+      port->lbal_addr         = base + 0x418; /* hob_lbal    = 0x419 */
-+      port->lbam_addr         = base + 0x420; /* hob_lbam    = 0x421 */
-+      port->lbah_addr         = base + 0x428; /* hob_lbah    = 0x429 */
-+      port->device_addr       = base + 0x430;
-+      port->status_addr       =
-+      port->command_addr      = base + 0x438;
-+      port->altstatus_addr    =
-+      port->ctl_addr          = base + 0x440;
-+      port->scr_addr          = base + 0xc00;
-+}
-+
-+static int qs_port_start(struct ata_port *ap)
-+{
-+      struct device *dev = ap->host_set->dev;
-+      struct qs_port_priv *pp;
-+      void __iomem *mmio_base = ap->host_set->mmio_base;
-+      void __iomem *chan = mmio_base + (ap->port_no * 0x4000);
-+      u64 addr;
-+      int rc;
-+
-+      rc = ata_port_start(ap);
-+      if (rc)
-+              return rc;
-+      qs_enter_reg_mode(ap);
-+      pp = kcalloc(1, sizeof(*pp), GFP_KERNEL);
-+      if (!pp) {
-+              rc = -ENOMEM;
-+              goto err_out;
-+      }
-+      pp->pkt = dma_alloc_coherent(dev, QS_PKT_BYTES, &pp->pkt_dma,
-+                                                              GFP_KERNEL);
-+      if (!pp->pkt) {
-+              rc = -ENOMEM;
-+              goto err_out_kfree;
-+      }
-+      memset(pp->pkt, 0, QS_PKT_BYTES);
-+      ap->private_data = pp;
-+
-+      addr = (u64)pp->pkt_dma;
-+      writel((u32) addr,        chan + QS_CCF_CPBA);
-+      writel((u32)(addr >> 32), chan + QS_CCF_CPBA + 4);
-+      return 0;
-+
-+err_out_kfree:
-+      kfree(pp);
-+err_out:
-+      ata_port_stop(ap);
-+      return rc;
-+}
-+
-+static void qs_port_stop(struct ata_port *ap)
-+{
-+      struct device *dev = ap->host_set->dev;
-+      struct qs_port_priv *pp = ap->private_data;
-+
-+      if (pp != NULL) {
-+              ap->private_data = NULL;
-+              if (pp->pkt != NULL)
-+                      dma_free_coherent(dev, QS_PKT_BYTES, pp->pkt,
-+                                                              pp->pkt_dma);
-+              kfree(pp);
-+      }
-+      ata_port_stop(ap);
-+}
-+
-+static void qs_host_stop(struct ata_host_set *host_set)
-+{
-+      void __iomem *mmio_base = host_set->mmio_base;
-+
-+      writeb(0, mmio_base + QS_HCT_CTRL); /* disable host interrupts */
-+      writeb(QS_CNFG3_GSRST, mmio_base + QS_HCF_CNFG3); /* global reset */
-+}
-+
-+static void qs_host_init(unsigned int chip_id, struct ata_probe_ent *pe)
-+{
-+      void __iomem *mmio_base = pe->mmio_base;
-+      unsigned int port_no;
-+
-+      writeb(0, mmio_base + QS_HCT_CTRL); /* disable host interrupts */
-+      writeb(QS_CNFG3_GSRST, mmio_base + QS_HCF_CNFG3); /* global reset */
-+
-+      /* reset each channel in turn */
-+      for (port_no = 0; port_no < pe->n_ports; ++port_no) {
-+              u8 __iomem *chan = mmio_base + (port_no * 0x4000);
-+              writeb(QS_CTR1_RDEV|QS_CTR1_RCHN, chan + QS_CCT_CTR1);
-+              writeb(QS_CTR0_REG, chan + QS_CCT_CTR0);
-+              readb(chan + QS_CCT_CTR0);        /* flush */
-+      }
-+      writeb(QS_SERD3_PHY_ENA, mmio_base + QS_HVS_SERD3); /* enable phy */
-+
-+      for (port_no = 0; port_no < pe->n_ports; ++port_no) {
-+              u8 __iomem *chan = mmio_base + (port_no * 0x4000);
-+              /* set FIFO depths to same settings as Windows driver */
-+              writew(32, chan + QS_CFC_HUFT);
-+              writew(32, chan + QS_CFC_HDFT);
-+              writew(10, chan + QS_CFC_DUFT);
-+              writew( 8, chan + QS_CFC_DDFT);
-+              /* set CPB size in bytes, as a power of two */
-+              writeb(QS_CPB_ORDER,    chan + QS_CCF_CSEP);
-+      }
-+      writeb(1, mmio_base + QS_HCT_CTRL); /* enable host interrupts */
-+}
-+
-+/*
-+ * The QStor understands 64-bit buses, and uses 64-bit fields
-+ * for DMA pointers regardless of bus width.  We just have to
-+ * make sure our DMA masks are set appropriately for whatever
-+ * bridge lies between us and the QStor, and then the DMA mapping
-+ * code will ensure we only ever "see" appropriate buffer addresses.
-+ * If we're 32-bit limited somewhere, then our 64-bit fields will
-+ * just end up with zeros in the upper 32-bits, without any special
-+ * logic required outside of this routine (below).
-+ */
-+static int qs_set_dma_masks(struct pci_dev *pdev, void __iomem *mmio_base)
-+{
-+      u32 bus_info = readl(mmio_base + QS_HID_HPHY);
-+      int rc, have_64bit_bus = (bus_info & QS_HPHY_64BIT);
-+
-+      if (have_64bit_bus &&
-+          !pci_set_dma_mask(pdev, DMA_64BIT_MASK)) {
-+              /* do nothing */
-+      } else {
-+              rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
-+              if (rc) {
-+                      printk(KERN_ERR DRV_NAME
-+                              "(%s): 32-bit DMA enable failed\n",
-+                              pci_name(pdev));
-+                      return rc;
-+              }
-+      }
-+      return 0;
-+}
-+
-+static int qs_ata_init_one(struct pci_dev *pdev,
-+                              const struct pci_device_id *ent)
-+{
-+      static int printed_version;
-+      struct ata_probe_ent *probe_ent = NULL;
-+      void __iomem *mmio_base;
-+      unsigned int board_idx = (unsigned int) ent->driver_data;
-+      int rc, port_no;
-+
-+      if (!printed_version++)
-+              printk(KERN_DEBUG DRV_NAME " version " DRV_VERSION "\n");
-+
-+      rc = pci_enable_device(pdev);
-+      if (rc)
-+              return rc;
-+
-+      rc = pci_request_regions(pdev, DRV_NAME);
-+      if (rc)
-+              goto err_out;
-+
-+      if ((pci_resource_flags(pdev, 4) & IORESOURCE_MEM) == 0) {
-+              rc = -ENODEV;
-+              goto err_out_regions;
-+      }
-+
-+      mmio_base = ioremap(pci_resource_start(pdev, 4),
-+                          pci_resource_len(pdev, 4));
-+      if (mmio_base == NULL) {
-+              rc = -ENOMEM;
-+              goto err_out_regions;
-+      }
-+
-+      rc = qs_set_dma_masks(pdev, mmio_base);
-+      if (rc)
-+              goto err_out_iounmap;
-+
-+      probe_ent = kmalloc(sizeof(*probe_ent), GFP_KERNEL);
-+      if (probe_ent == NULL) {
-+              rc = -ENOMEM;
-+              goto err_out_iounmap;
-+      }
-+
-+      memset(probe_ent, 0, sizeof(*probe_ent));
-+      probe_ent->dev = pci_dev_to_dev(pdev);
-+      INIT_LIST_HEAD(&probe_ent->node);
-+
-+      probe_ent->sht          = qs_port_info[board_idx].sht;
-+      probe_ent->host_flags   = qs_port_info[board_idx].host_flags;
-+      probe_ent->pio_mask     = qs_port_info[board_idx].pio_mask;
-+      probe_ent->mwdma_mask   = qs_port_info[board_idx].mwdma_mask;
-+      probe_ent->udma_mask    = qs_port_info[board_idx].udma_mask;
-+      probe_ent->port_ops     = qs_port_info[board_idx].port_ops;
-+
-+      probe_ent->irq          = pdev->irq;
-+      probe_ent->irq_flags    = SA_SHIRQ;
-+      probe_ent->mmio_base    = mmio_base;
-+      probe_ent->n_ports      = QS_PORTS;
-+
-+      for (port_no = 0; port_no < probe_ent->n_ports; ++port_no) {
-+              unsigned long chan = (unsigned long)mmio_base +
-+                                                      (port_no * 0x4000);
-+              qs_ata_setup_port(&probe_ent->port[port_no], chan);
-+      }
-+
-+      pci_set_master(pdev);
-+
-+      /* initialize adapter */
-+      qs_host_init(board_idx, probe_ent);
-+
-+      ata_add_to_probe_list(probe_ent);
-+      return 0;
-+
-+err_out_iounmap:
-+      iounmap(mmio_base);
-+err_out_regions:
-+      pci_release_regions(pdev);
-+err_out:
-+      pci_disable_device(pdev);
-+      return rc;
-+}
-+
-+static int __init qs_ata_init(void)
-+{
-+      int rc;
-+
-+      rc = pci_module_init(&qs_ata_pci_driver);
-+      if (rc)
-+              return rc;
-+
-+      rc = scsi_register_module(MODULE_SCSI_HA, &qs_ata_sht);
-+      if (rc) {
-+              rc = -ENODEV;
-+              goto err_out;
-+      }
-+
-+      return 0;
-+
-+err_out:
-+      pci_unregister_driver(&qs_ata_pci_driver);
-+      return rc;
-+}
-+
-+static void __exit qs_ata_exit(void)
-+{
-+      scsi_unregister_module(MODULE_SCSI_HA, &qs_ata_sht);
-+      pci_unregister_driver(&qs_ata_pci_driver);
-+}
-+
-+MODULE_AUTHOR("Mark Lord");
-+MODULE_DESCRIPTION("Pacific Digital Corporation QStor SATA low-level driver");
-+MODULE_LICENSE("GPL");
-+MODULE_DEVICE_TABLE(pci, qs_ata_pci_tbl);
-+MODULE_VERSION(DRV_VERSION);
-+
-+module_init(qs_ata_init);
-+module_exit(qs_ata_exit);
-diff -Nur linux-2.4.29/drivers/scsi/sata_sil.c linux-mips/drivers/scsi/sata_sil.c
---- linux-2.4.29/drivers/scsi/sata_sil.c       2005-01-19 15:10:03.000000000 +0100
-+++ linux-mips/drivers/scsi/sata_sil.c 2005-03-26 11:47:33.241196096 +0100
-@@ -71,12 +71,14 @@
-       { 0x1095, 0x0240, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3112 },
-       { 0x1095, 0x3512, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3112 },
-       { 0x1095, 0x3114, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3114 },
-+      { 0x1002, 0x436e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3112 },
-+      { 0x1002, 0x4379, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3112 },
-       { }     /* terminate list */
- };
- /* TODO firmware versions should be added - eric */
--struct sil_drivelist {
-+static const struct sil_drivelist {
-       const char * product;
-       unsigned int quirk;
- } sil_blacklist [] = {
-@@ -84,10 +86,12 @@
-       { "ST330013AS",         SIL_QUIRK_MOD15WRITE },
-       { "ST340017AS",         SIL_QUIRK_MOD15WRITE },
-       { "ST360015AS",         SIL_QUIRK_MOD15WRITE },
-+      { "ST380013AS",         SIL_QUIRK_MOD15WRITE },
-       { "ST380023AS",         SIL_QUIRK_MOD15WRITE },
-       { "ST3120023AS",        SIL_QUIRK_MOD15WRITE },
-       { "ST3160023AS",        SIL_QUIRK_MOD15WRITE },
-       { "ST3120026AS",        SIL_QUIRK_MOD15WRITE },
-+      { "ST3200822AS",        SIL_QUIRK_MOD15WRITE },
-       { "ST340014ASL",        SIL_QUIRK_MOD15WRITE },
-       { "ST360014ASL",        SIL_QUIRK_MOD15WRITE },
-       { "ST380011ASL",        SIL_QUIRK_MOD15WRITE },
-@@ -136,6 +140,8 @@
-       .post_set_mode          = sil_post_set_mode,
-       .bmdma_setup            = ata_bmdma_setup,
-       .bmdma_start            = ata_bmdma_start,
-+      .bmdma_stop             = ata_bmdma_stop,
-+      .bmdma_status           = ata_bmdma_status,
-       .qc_prep                = ata_qc_prep,
-       .qc_issue               = ata_qc_issue_prot,
-       .eng_timeout            = ata_eng_timeout,
-@@ -333,6 +339,7 @@
-       void *mmio_base;
-       int rc;
-       unsigned int i;
-+      int pci_dev_busy = 0;
-       u32 tmp, irq_mask;
-       if (!printed_version++)
-@@ -347,8 +354,10 @@
-               return rc;
-       rc = pci_request_regions(pdev, DRV_NAME);
--      if (rc)
-+      if (rc) {
-+              pci_dev_busy = 1;
-               goto err_out;
-+      }
-       rc = pci_set_dma_mask(pdev, ATA_DMA_MASK);
-       if (rc)
-@@ -430,7 +439,8 @@
- err_out_regions:
-       pci_release_regions(pdev);
- err_out:
--      pci_disable_device(pdev);
-+      if (!pci_dev_busy)
-+              pci_disable_device(pdev);
-       return rc;
- }
-diff -Nur linux-2.4.29/drivers/scsi/sata_sis.c linux-mips/drivers/scsi/sata_sis.c
---- linux-2.4.29/drivers/scsi/sata_sis.c       2005-01-19 15:10:03.000000000 +0100
-+++ linux-mips/drivers/scsi/sata_sis.c 2005-03-26 11:47:33.244195604 +0100
-@@ -103,6 +103,8 @@
-       .phy_reset              = sata_phy_reset,
-       .bmdma_setup            = ata_bmdma_setup,
-       .bmdma_start            = ata_bmdma_start,
-+      .bmdma_stop             = ata_bmdma_stop,
-+      .bmdma_status           = ata_bmdma_status,
-       .qc_prep                = ata_qc_prep,
-       .qc_issue               = ata_qc_issue_prot,
-       .eng_timeout            = ata_eng_timeout,
-@@ -201,14 +203,17 @@
-       int rc;
-       u32 genctl;
-       struct ata_port_info *ppi;
-+      int pci_dev_busy = 0;
-       rc = pci_enable_device(pdev);
-       if (rc)
-               return rc;
-       rc = pci_request_regions(pdev, DRV_NAME);
--      if (rc)
-+      if (rc) {
-+              pci_dev_busy = 1;
-               goto err_out;
-+      }
-       rc = pci_set_dma_mask(pdev, ATA_DMA_MASK);
-       if (rc)
-@@ -255,7 +260,8 @@
-       pci_release_regions(pdev);
- err_out:
--      pci_disable_device(pdev);
-+      if (!pci_dev_busy)
-+              pci_disable_device(pdev);
-       return rc;
- }
-diff -Nur linux-2.4.29/drivers/scsi/sata_svw.c linux-mips/drivers/scsi/sata_svw.c
---- linux-2.4.29/drivers/scsi/sata_svw.c       2005-01-19 15:10:03.000000000 +0100
-+++ linux-mips/drivers/scsi/sata_svw.c 2005-03-26 11:47:33.246195276 +0100
-@@ -156,7 +156,7 @@
-  *    spin_lock_irqsave(host_set lock)
-  */
--void k2_bmdma_setup_mmio (struct ata_queued_cmd *qc)
-+static void k2_bmdma_setup_mmio (struct ata_queued_cmd *qc)
- {
-       struct ata_port *ap = qc->ap;
-       unsigned int rw = (qc->tf.flags & ATA_TFLAG_WRITE);
-@@ -186,7 +186,7 @@
-  *    spin_lock_irqsave(host_set lock)
-  */
--void k2_bmdma_start_mmio (struct ata_queued_cmd *qc)
-+static void k2_bmdma_start_mmio (struct ata_queued_cmd *qc)
- {
-       struct ata_port *ap = qc->ap;
-       void *mmio = (void *) ap->ioaddr.bmdma_addr;
-@@ -302,6 +302,8 @@
-       .phy_reset              = sata_phy_reset,
-       .bmdma_setup            = k2_bmdma_setup_mmio,
-       .bmdma_start            = k2_bmdma_start_mmio,
-+      .bmdma_stop             = ata_bmdma_stop,
-+      .bmdma_status           = ata_bmdma_status,
-       .qc_prep                = ata_qc_prep,
-       .qc_issue               = ata_qc_issue_prot,
-       .eng_timeout            = ata_eng_timeout,
-@@ -339,6 +341,7 @@
-       struct ata_probe_ent *probe_ent = NULL;
-       unsigned long base;
-       void *mmio_base;
-+      int pci_dev_busy = 0;
-       int rc;
-       if (!printed_version++)
-@@ -360,8 +363,10 @@
-       /* Request PCI regions */
-       rc = pci_request_regions(pdev, DRV_NAME);
--      if (rc)
-+      if (rc) {
-+              pci_dev_busy = 1;
-               goto err_out;
-+      }
-       rc = pci_set_dma_mask(pdev, ATA_DMA_MASK);
-       if (rc)
-@@ -429,7 +434,8 @@
- err_out_regions:
-       pci_release_regions(pdev);
- err_out:
--      pci_disable_device(pdev);
-+      if (!pci_dev_busy)
-+              pci_disable_device(pdev);
-       return rc;
- }
-diff -Nur linux-2.4.29/drivers/scsi/sata_sx4.c linux-mips/drivers/scsi/sata_sx4.c
---- linux-2.4.29/drivers/scsi/sata_sx4.c       2005-01-19 15:10:03.000000000 +0100
-+++ linux-mips/drivers/scsi/sata_sx4.c 2005-03-26 11:47:33.249194784 +0100
-@@ -1191,8 +1191,7 @@
-                       error = 0;
-                       break;     
-               }
--              set_current_state(TASK_UNINTERRUPTIBLE);
--              schedule_timeout((i * 100) * HZ / 1000 + 1);
-+              msleep(i*100);
-       }
-       return error;
- }
-@@ -1225,8 +1224,7 @@
-       readl(mmio + PDC_TIME_CONTROL);
-       /* Wait 3 seconds */
--      set_current_state(TASK_UNINTERRUPTIBLE);
--      schedule_timeout(3 * HZ);
-+      msleep(3000);
-       /* 
-          When timer is enabled, counter is decreased every internal
-@@ -1369,6 +1367,7 @@
-       void *mmio_base, *dimm_mmio = NULL;
-       struct pdc_host_priv *hpriv = NULL;
-       unsigned int board_idx = (unsigned int) ent->driver_data;
-+      int pci_dev_busy = 0;
-       int rc;
-       if (!printed_version++)
-@@ -1383,8 +1382,10 @@
-               return rc;
-       rc = pci_request_regions(pdev, DRV_NAME);
--      if (rc)
-+      if (rc) {
-+              pci_dev_busy = 1;
-               goto err_out;
-+      }
-       rc = pci_set_dma_mask(pdev, ATA_DMA_MASK);
-       if (rc)
-@@ -1469,7 +1470,8 @@
- err_out_regions:
-       pci_release_regions(pdev);
- err_out:
--      pci_disable_device(pdev);
-+      if (!pci_dev_busy)
-+              pci_disable_device(pdev);
-       return rc;
- }
-diff -Nur linux-2.4.29/drivers/scsi/sata_uli.c linux-mips/drivers/scsi/sata_uli.c
---- linux-2.4.29/drivers/scsi/sata_uli.c       2005-01-19 15:10:03.000000000 +0100
-+++ linux-mips/drivers/scsi/sata_uli.c 2005-03-26 11:47:33.252194291 +0100
-@@ -98,6 +98,8 @@
-       .bmdma_setup            = ata_bmdma_setup,
-       .bmdma_start            = ata_bmdma_start,
-+      .bmdma_stop             = ata_bmdma_stop,
-+      .bmdma_status           = ata_bmdma_status,
-       .qc_prep                = ata_qc_prep,
-       .qc_issue               = ata_qc_issue_prot,
-@@ -186,14 +188,17 @@
-       struct ata_port_info *ppi;
-       int rc;
-       unsigned int board_idx = (unsigned int) ent->driver_data;
-+      int pci_dev_busy = 0;
-       rc = pci_enable_device(pdev);
-       if (rc)
-               return rc;
-       rc = pci_request_regions(pdev, DRV_NAME);
--      if (rc)
-+      if (rc) {
-+              pci_dev_busy = 1;
-               goto err_out;
-+      }
-       rc = pci_set_dma_mask(pdev, ATA_DMA_MASK);
-       if (rc)
-@@ -256,7 +261,8 @@
-       pci_release_regions(pdev);
- err_out:
--      pci_disable_device(pdev);
-+      if (!pci_dev_busy)
-+              pci_disable_device(pdev);
-       return rc;
- }
-diff -Nur linux-2.4.29/drivers/scsi/sata_via.c linux-mips/drivers/scsi/sata_via.c
---- linux-2.4.29/drivers/scsi/sata_via.c       2005-01-19 15:10:03.000000000 +0100
-+++ linux-mips/drivers/scsi/sata_via.c 2005-03-26 11:47:33.268191666 +0100
-@@ -24,6 +24,11 @@
-    If you do not delete the provisions above, a recipient may use your
-    version of this file under either the OSL or the GPL.
-+   ----------------------------------------------------------------------
-+
-+   To-do list:
-+   * VT6421 PATA support
-+
-  */
- #include <linux/kernel.h>
-@@ -38,11 +43,14 @@
- #include <asm/io.h>
- #define DRV_NAME      "sata_via"
--#define DRV_VERSION   "1.0"
-+#define DRV_VERSION   "1.1"
--enum {
--      via_sata                = 0,
-+enum board_ids_enum {
-+      vt6420,
-+      vt6421,
-+};
-+enum {
-       SATA_CHAN_ENAB          = 0x40, /* SATA channel enable */
-       SATA_INT_GATE           = 0x41, /* SATA interrupt gating */
-       SATA_NATIVE_MODE        = 0x42, /* Native mode enable */
-@@ -50,10 +58,8 @@
-       PORT0                   = (1 << 1),
-       PORT1                   = (1 << 0),
--
--      ENAB_ALL                = PORT0 | PORT1,
--
--      INT_GATE_ALL            = PORT0 | PORT1,
-+      ALL_PORTS               = PORT0 | PORT1,
-+      N_PORTS                 = 2,
-       NATIVE_MODE_ALL         = (1 << 7) | (1 << 6) | (1 << 5) | (1 << 4),
-@@ -66,7 +72,8 @@
- static void svia_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val);
- static struct pci_device_id svia_pci_tbl[] = {
--      { 0x1106, 0x3149, PCI_ANY_ID, PCI_ANY_ID, 0, 0, via_sata },
-+      { 0x1106, 0x3149, PCI_ANY_ID, PCI_ANY_ID, 0, 0, vt6420 },
-+      { 0x1106, 0x3249, PCI_ANY_ID, PCI_ANY_ID, 0, 0, vt6421 },
-       { }     /* terminate list */
- };
-@@ -111,6 +118,9 @@
-       .bmdma_setup            = ata_bmdma_setup,
-       .bmdma_start            = ata_bmdma_start,
-+      .bmdma_stop             = ata_bmdma_stop,
-+      .bmdma_status           = ata_bmdma_status,
-+
-       .qc_prep                = ata_qc_prep,
-       .qc_issue               = ata_qc_issue_prot,
-@@ -159,18 +169,132 @@
-       8, 4, 8, 4, 16, 256
- };
-+static const unsigned int vt6421_bar_sizes[] = {
-+      16, 16, 16, 16, 32, 128
-+};
-+
- static unsigned long svia_scr_addr(unsigned long addr, unsigned int port)
- {
-       return addr + (port * 128);
- }
-+static unsigned long vt6421_scr_addr(unsigned long addr, unsigned int port)
-+{
-+      return addr + (port * 64);
-+}
-+
-+static void vt6421_init_addrs(struct ata_probe_ent *probe_ent,
-+                            struct pci_dev *pdev,
-+                            unsigned int port)
-+{
-+      unsigned long reg_addr = pci_resource_start(pdev, port);
-+      unsigned long bmdma_addr = pci_resource_start(pdev, 4) + (port * 8);
-+      unsigned long scr_addr;
-+
-+      probe_ent->port[port].cmd_addr = reg_addr;
-+      probe_ent->port[port].altstatus_addr =
-+      probe_ent->port[port].ctl_addr = (reg_addr + 8) | ATA_PCI_CTL_OFS;
-+      probe_ent->port[port].bmdma_addr = bmdma_addr;
-+
-+      scr_addr = vt6421_scr_addr(pci_resource_start(pdev, 5), port);
-+      probe_ent->port[port].scr_addr = scr_addr;
-+
-+      ata_std_ports(&probe_ent->port[port]);
-+}
-+
-+static struct ata_probe_ent *vt6420_init_probe_ent(struct pci_dev *pdev)
-+{
-+      struct ata_probe_ent *probe_ent;
-+      struct ata_port_info *ppi = &svia_port_info;
-+
-+      probe_ent = ata_pci_init_native_mode(pdev, &ppi);
-+      if (!probe_ent)
-+              return NULL;
-+
-+      probe_ent->port[0].scr_addr =
-+              svia_scr_addr(pci_resource_start(pdev, 5), 0);
-+      probe_ent->port[1].scr_addr =
-+              svia_scr_addr(pci_resource_start(pdev, 5), 1);
-+
-+      return probe_ent;
-+}
-+
-+static struct ata_probe_ent *vt6421_init_probe_ent(struct pci_dev *pdev)
-+{
-+      struct ata_probe_ent *probe_ent;
-+      unsigned int i;
-+
-+      probe_ent = kmalloc(sizeof(*probe_ent), GFP_KERNEL);
-+      if (!probe_ent)
-+              return NULL;
-+
-+      memset(probe_ent, 0, sizeof(*probe_ent));
-+      probe_ent->dev = pci_dev_to_dev(pdev);
-+      INIT_LIST_HEAD(&probe_ent->node);
-+
-+      probe_ent->sht          = &svia_sht;
-+      probe_ent->host_flags   = ATA_FLAG_SATA | ATA_FLAG_SATA_RESET |
-+                                ATA_FLAG_NO_LEGACY;
-+      probe_ent->port_ops     = &svia_sata_ops;
-+      probe_ent->n_ports      = N_PORTS;
-+      probe_ent->irq          = pdev->irq;
-+      probe_ent->irq_flags    = SA_SHIRQ;
-+      probe_ent->pio_mask     = 0x1f;
-+      probe_ent->mwdma_mask   = 0x07;
-+      probe_ent->udma_mask    = 0x7f;
-+
-+      for (i = 0; i < N_PORTS; i++)
-+              vt6421_init_addrs(probe_ent, pdev, i);
-+
-+      return probe_ent;
-+}
-+
-+static void svia_configure(struct pci_dev *pdev)
-+{
-+      u8 tmp8;
-+
-+      pci_read_config_byte(pdev, PCI_INTERRUPT_LINE, &tmp8);
-+      printk(KERN_INFO DRV_NAME "(%s): routed to hard irq line %d\n",
-+             pci_name(pdev),
-+             (int) (tmp8 & 0xf0) == 0xf0 ? 0 : tmp8 & 0x0f);
-+
-+      /* make sure SATA channels are enabled */
-+      pci_read_config_byte(pdev, SATA_CHAN_ENAB, &tmp8);
-+      if ((tmp8 & ALL_PORTS) != ALL_PORTS) {
-+              printk(KERN_DEBUG DRV_NAME "(%s): enabling SATA channels (0x%x)\n",
-+                     pci_name(pdev), (int) tmp8);
-+              tmp8 |= ALL_PORTS;
-+              pci_write_config_byte(pdev, SATA_CHAN_ENAB, tmp8);
-+      }
-+
-+      /* make sure interrupts for each channel sent to us */
-+      pci_read_config_byte(pdev, SATA_INT_GATE, &tmp8);
-+      if ((tmp8 & ALL_PORTS) != ALL_PORTS) {
-+              printk(KERN_DEBUG DRV_NAME "(%s): enabling SATA channel interrupts (0x%x)\n",
-+                     pci_name(pdev), (int) tmp8);
-+              tmp8 |= ALL_PORTS;
-+              pci_write_config_byte(pdev, SATA_INT_GATE, tmp8);
-+      }
-+
-+      /* make sure native mode is enabled */
-+      pci_read_config_byte(pdev, SATA_NATIVE_MODE, &tmp8);
-+      if ((tmp8 & NATIVE_MODE_ALL) != NATIVE_MODE_ALL) {
-+              printk(KERN_DEBUG DRV_NAME "(%s): enabling SATA channel native mode (0x%x)\n",
-+                     pci_name(pdev), (int) tmp8);
-+              tmp8 |= NATIVE_MODE_ALL;
-+              pci_write_config_byte(pdev, SATA_NATIVE_MODE, tmp8);
-+      }
-+}
-+
- static int svia_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
- {
-       static int printed_version;
-       unsigned int i;
-       int rc;
--      struct ata_port_info *ppi;
-       struct ata_probe_ent *probe_ent;
-+      int board_id = (int) ent->driver_data;
-+      const int *bar_sizes;
-+      int pci_dev_busy = 0;
-       u8 tmp8;
-       if (!printed_version++)
-@@ -181,20 +305,28 @@
-               return rc;
-       rc = pci_request_regions(pdev, DRV_NAME);
--      if (rc)
-+      if (rc) {
-+              pci_dev_busy = 1;
-               goto err_out;
-+      }
--      pci_read_config_byte(pdev, SATA_PATA_SHARING, &tmp8);
--      if (tmp8 & SATA_2DEV) {
--              printk(KERN_ERR DRV_NAME "(%s): SATA master/slave not supported (0x%x)\n",
--                     pci_name(pdev), (int) tmp8);
--              rc = -EIO;
--              goto err_out_regions;
-+      if (board_id == vt6420) {
-+              pci_read_config_byte(pdev, SATA_PATA_SHARING, &tmp8);
-+              if (tmp8 & SATA_2DEV) {
-+                      printk(KERN_ERR DRV_NAME "(%s): SATA master/slave not supported (0x%x)\n",
-+                      pci_name(pdev), (int) tmp8);
-+                      rc = -EIO;
-+                      goto err_out_regions;
-+              }
-+
-+              bar_sizes = &svia_bar_sizes[0];
-+      } else {
-+              bar_sizes = &vt6421_bar_sizes[0];
-       }
-       for (i = 0; i < ARRAY_SIZE(svia_bar_sizes); i++)
-               if ((pci_resource_start(pdev, i) == 0) ||
--                  (pci_resource_len(pdev, i) < svia_bar_sizes[i])) {
-+                  (pci_resource_len(pdev, i) < bar_sizes[i])) {
-                       printk(KERN_ERR DRV_NAME "(%s): invalid PCI BAR %u (sz 0x%lx, val 0x%lx)\n",
-                              pci_name(pdev), i,
-                              pci_resource_start(pdev, i),
-@@ -207,8 +339,11 @@
-       if (rc)
-               goto err_out_regions;
--      ppi = &svia_port_info;
--      probe_ent = ata_pci_init_native_mode(pdev, &ppi);
-+      if (board_id == vt6420)
-+              probe_ent = vt6420_init_probe_ent(pdev);
-+      else
-+              probe_ent = vt6421_init_probe_ent(pdev);
-+      
-       if (!probe_ent) {
-               printk(KERN_ERR DRV_NAME "(%s): out of memory\n",
-                      pci_name(pdev));
-@@ -216,42 +351,7 @@
-               goto err_out_regions;
-       }
--      probe_ent->port[0].scr_addr =
--              svia_scr_addr(pci_resource_start(pdev, 5), 0);
--      probe_ent->port[1].scr_addr =
--              svia_scr_addr(pci_resource_start(pdev, 5), 1);
--
--      pci_read_config_byte(pdev, PCI_INTERRUPT_LINE, &tmp8);
--      printk(KERN_INFO DRV_NAME "(%s): routed to hard irq line %d\n",
--             pci_name(pdev),
--             (int) (tmp8 & 0xf0) == 0xf0 ? 0 : tmp8 & 0x0f);
--
--      /* make sure SATA channels are enabled */
--      pci_read_config_byte(pdev, SATA_CHAN_ENAB, &tmp8);
--      if ((tmp8 & ENAB_ALL) != ENAB_ALL) {
--              printk(KERN_DEBUG DRV_NAME "(%s): enabling SATA channels (0x%x)\n",
--                     pci_name(pdev), (int) tmp8);
--              tmp8 |= ENAB_ALL;
--              pci_write_config_byte(pdev, SATA_CHAN_ENAB, tmp8);
--      }
--
--      /* make sure interrupts for each channel sent to us */
--      pci_read_config_byte(pdev, SATA_INT_GATE, &tmp8);
--      if ((tmp8 & INT_GATE_ALL) != INT_GATE_ALL) {
--              printk(KERN_DEBUG DRV_NAME "(%s): enabling SATA channel interrupts (0x%x)\n",
--                     pci_name(pdev), (int) tmp8);
--              tmp8 |= INT_GATE_ALL;
--              pci_write_config_byte(pdev, SATA_INT_GATE, tmp8);
--      }
--
--      /* make sure native mode is enabled */
--      pci_read_config_byte(pdev, SATA_NATIVE_MODE, &tmp8);
--      if ((tmp8 & NATIVE_MODE_ALL) != NATIVE_MODE_ALL) {
--              printk(KERN_DEBUG DRV_NAME "(%s): enabling SATA channel native mode (0x%x)\n",
--                     pci_name(pdev), (int) tmp8);
--              tmp8 |= NATIVE_MODE_ALL;
--              pci_write_config_byte(pdev, SATA_NATIVE_MODE, tmp8);
--      }
-+      svia_configure(pdev);
-       pci_set_master(pdev);
-@@ -262,7 +362,8 @@
- err_out_regions:
-       pci_release_regions(pdev);
- err_out:
--      pci_disable_device(pdev);
-+      if (!pci_dev_busy)
-+              pci_disable_device(pdev);
-       return rc;
- }
-diff -Nur linux-2.4.29/drivers/scsi/sata_vsc.c linux-mips/drivers/scsi/sata_vsc.c
---- linux-2.4.29/drivers/scsi/sata_vsc.c       2005-01-19 15:10:03.000000000 +0100
-+++ linux-mips/drivers/scsi/sata_vsc.c 2005-03-26 11:47:33.270191338 +0100
-@@ -155,7 +155,8 @@
-  *
-  * Read the interrupt register and process for the devices that have them pending.
-  */
--irqreturn_t vsc_sata_interrupt (int irq, void *dev_instance, struct pt_regs *regs)
-+static irqreturn_t vsc_sata_interrupt (int irq, void *dev_instance,
-+                                     struct pt_regs *regs)
- {
-       struct ata_host_set *host_set = dev_instance;
-       unsigned int i;
-@@ -218,6 +219,8 @@
-       .phy_reset              = sata_phy_reset,
-       .bmdma_setup            = ata_bmdma_setup,
-       .bmdma_start            = ata_bmdma_start,
-+      .bmdma_stop             = ata_bmdma_stop,
-+      .bmdma_status           = ata_bmdma_status,
-       .qc_prep                = ata_qc_prep,
-       .qc_issue               = ata_qc_issue_prot,
-       .eng_timeout            = ata_eng_timeout,
-@@ -256,6 +259,7 @@
-       static int printed_version;
-       struct ata_probe_ent *probe_ent = NULL;
-       unsigned long base;
-+      int pci_dev_busy = 0;
-       void *mmio_base;
-       int rc;
-@@ -275,13 +279,15 @@
-       }
-       rc = pci_request_regions(pdev, DRV_NAME);
--      if (rc)
-+      if (rc) {
-+              pci_dev_busy = 1;
-               goto err_out;
-+      }
-       /*
-        * Use 32 bit DMA mask, because 64 bit address support is poor.
-        */
--      rc = pci_set_dma_mask(pdev, 0xFFFFFFFFULL);
-+      rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
-       if (rc)
-               goto err_out_regions;
-@@ -348,7 +354,8 @@
- err_out_regions:
-       pci_release_regions(pdev);
- err_out:
--      pci_disable_device(pdev);
-+      if (!pci_dev_busy)
-+              pci_disable_device(pdev);
-       return rc;
- }
-diff -Nur linux-2.4.29/drivers/scsi/sd.c linux-mips/drivers/scsi/sd.c
---- linux-2.4.29/drivers/scsi/sd.c     2003-08-25 13:44:42.000000000 +0200
-+++ linux-mips/drivers/scsi/sd.c       2005-03-26 11:47:33.274190681 +0100
-@@ -1220,7 +1220,7 @@
-                       goto cleanup_gendisks_part;
-               memset(sd_gendisks[i].part, 0, (SCSI_DISKS_PER_MAJOR << 4) * sizeof(struct hd_struct));
-               sd_gendisks[i].sizes = sd_sizes + (i * SCSI_DISKS_PER_MAJOR << 4);
--              sd_gendisks[i].nr_real = 0;
-+              sd_gendisks[i].nr_real = SCSI_DISKS_PER_MAJOR;
-               sd_gendisks[i].real_devices =
-                   (void *) (rscsi_disks + i * SCSI_DISKS_PER_MAJOR);
-       }
-@@ -1333,7 +1333,6 @@
-       rscsi_disks[i].device = SDp;
-       rscsi_disks[i].has_part_table = 0;
-       sd_template.nr_dev++;
--      SD_GENDISK(i).nr_real++;
-         devnum = i % SCSI_DISKS_PER_MAJOR;
-         SD_GENDISK(i).de_arr[devnum] = SDp->de;
-         if (SDp->removable)
-@@ -1447,7 +1446,6 @@
-                       SDp->attached--;
-                       sd_template.dev_noticed--;
-                       sd_template.nr_dev--;
--                      SD_GENDISK(i).nr_real--;
-                       return;
-               }
-       return;
-diff -Nur linux-2.4.29/drivers/scsi/st.c linux-mips/drivers/scsi/st.c
---- linux-2.4.29/drivers/scsi/st.c     2005-01-19 15:10:04.000000000 +0100
-+++ linux-mips/drivers/scsi/st.c       2005-03-26 11:47:33.279189861 +0100
-@@ -1641,7 +1641,7 @@
-                                                       if (STps->drv_block >= 0)
-                                                               STps->drv_block += 1;
-                                                       (STp->buffer)->buffer_bytes = 0;
--                                                      return (-EIO);
-+                                                      return (-ENOMEM);
-                                               }
-                                               (STp->buffer)->buffer_bytes = bytes - transfer;
-                                       } else {
-@@ -3778,7 +3778,6 @@
-       read:           st_read,
-       write:          st_write,
-       ioctl:          st_ioctl,
--      llseek:         no_llseek,
-       open:           st_open,
-       flush:          st_flush,
-       release:        st_release,
-diff -Nur linux-2.4.29/drivers/scsi/sym53c8xx.c linux-mips/drivers/scsi/sym53c8xx.c
---- linux-2.4.29/drivers/scsi/sym53c8xx.c      2004-04-14 15:05:32.000000000 +0200
-+++ linux-mips/drivers/scsi/sym53c8xx.c        2005-03-26 11:47:34.823936333 +0100
-@@ -13182,7 +13182,7 @@
-       ** descriptors.
-       */
-       if (chip && (chip->features & FE_DAC)) {
--              if (pci_set_dma_mask(pdev, (u64) 0xffffffffff))
-+              if (pci_set_dma_mask(pdev, (u64) 0xffffffffffULL))
-                       chip->features &= ~FE_DAC_IN_USE;
-               else
-                       chip->features |= FE_DAC_IN_USE;
-diff -Nur linux-2.4.29/drivers/sound/au1550_i2s.c linux-mips/drivers/sound/au1550_i2s.c
---- linux-2.4.29/drivers/sound/au1550_i2s.c    2005-01-19 15:10:04.000000000 +0100
-+++ linux-mips/drivers/sound/au1550_i2s.c      2005-03-26 11:47:35.065896621 +0100
-@@ -41,6 +41,7 @@
-  *  675 Mass Ave, Cambridge, MA 02139, USA.
-  *
-  */
-+
- #include <linux/version.h>
- #include <linux/module.h>
- #include <linux/string.h>
-@@ -62,7 +63,45 @@
- #include <asm/uaccess.h>
- #include <asm/hardirq.h>
- #include <asm/au1000.h>
-+
-+#if defined(CONFIG_SOC_AU1550)
- #include <asm/pb1550.h>
-+#endif
-+
-+#if defined(CONFIG_MIPS_PB1200)
-+#define WM8731
-+#define WM_MODE_USB
-+#include <asm/pb1200.h>
-+#endif
-+
-+#if defined(CONFIG_MIPS_FICMMP)
-+#define WM8721
-+#define WM_MODE_NORMAL
-+#include <asm/ficmmp.h>
-+#endif
-+
-+
-+#define WM_VOLUME_MIN 47
-+#define WM_VOLUME_SCALE       80
-+
-+#if defined(WM8731)
-+      /* OSS interface to the wm i2s.. */
-+      #define CODEC_NAME "Wolfson WM8731 I2S"
-+      #define WM_I2S_STEREO_MASK (SOUND_MASK_PCM | SOUND_MASK_LINE)
-+      #define WM_I2S_SUPPORTED_MASK (WM_I2S_STEREO_MASK | SOUND_MASK_MIC)
-+      #define WM_I2S_RECORD_MASK (SOUND_MASK_MIC | SOUND_MASK_LINE1 | SOUND_MASK_LINE)
-+#elif defined(WM8721)
-+      #define CODEC_NAME "Wolfson WM8721 I2S"
-+      #define WM_I2S_STEREO_MASK (SOUND_MASK_PCM)
-+      #define WM_I2S_SUPPORTED_MASK (WM_I2S_STEREO_MASK)
-+      #define WM_I2S_RECORD_MASK (0)
-+#endif
-+
-+
-+#define supported_mixer(FOO) ((FOO >= 0) && \
-+                                    (FOO < SOUND_MIXER_NRDEVICES) && \
-+                                    WM_I2S_SUPPORTED_MASK & (1<<FOO) )
-+
- #include <asm/au1xxx_psc.h>
- #include <asm/au1xxx_dbdma.h>
-@@ -98,13 +137,51 @@
-  * 0 = no VRA, 1 = use VRA if codec supports it
-  * The framework is here, but we currently force no VRA.
-  */
-+#if defined(CONFIG_MIPS_PB1200) | defined(CONFIG_MIPS_PB1550)
- static int      vra = 0;
-+#elif defined(CONFIG_MIPS_FICMMP)
-+static int vra = 1;
-+#endif
-+
-+#define WM_REG_L_HEADPHONE_OUT                        0x02
-+#define WM_REG_R_HEADPHONE_OUT                        0x03
-+#define WM_REG_ANALOGUE_AUDIO_PATH_CTRL               0x04
-+#define WM_REG_DIGITAL_AUDIO_PATH_CTRL                0x05
-+#define WM_REG_POWER_DOWN_CTRL                        0x06
-+#define WM_REG_DIGITAL_AUDIO_IF                       0x07
-+#define WM_REG_SAMPLING_CONTROL               0x08
-+#define WM_REG_ACTIVE_CTRL                    0x09
-+#define WM_REG_RESET                          0x0F
-+#define WM_SC_SR_96000                (0x7<<2)
-+#define WM_SC_SR_88200                (0xF<<2)
-+#define WM_SC_SR_48000                (0x0<<2)
-+#define WM_SC_SR_44100                (0x8<<2)
-+#define WM_SC_SR_32000                (0x6<<2)
-+#define WM_SC_SR_8018         (0x9<<2)
-+#define WM_SC_SR_8000         (0x1<<2)
-+#define WM_SC_MODE_USB                1
-+#define WM_SC_MODE_NORMAL     0
-+#define WM_SC_BOSR_250FS      (0<<1)
-+#define WM_SC_BOSR_272FS      (1<<1)
-+#define WM_SC_BOSR_256FS      (0<<1)
-+#define WM_SC_BOSR_128FS      (0<<1)
-+#define WM_SC_BOSR_384FS      (1<<1)
-+#define WM_SC_BOSR_192FS      (1<<1)
-+
-+#define WS_64FS                       31
-+#define WS_96FS                       47
-+#define WS_128FS              63
-+#define WS_192FS              95
-+
-+#define MIN_Q_COUNT           2
-+
- MODULE_PARM(vra, "i");
- MODULE_PARM_DESC(vra, "if 1 use VRA if codec supports it");
- static struct au1550_state {
-       /* soundcore stuff */
-       int             dev_audio;
-+      int                             dev_mixer;
-       spinlock_t              lock;
-       struct semaphore        open_sem;
-@@ -114,6 +191,11 @@
-       int                     no_vra;
-       volatile psc_i2s_t      *psc_addr;
-+      int level_line;
-+      int level_mic;
-+      int level_left;
-+      int level_right;
-+
-       struct dmabuf {
-               u32             dmanr;
-               unsigned        sample_rate;
-@@ -195,60 +277,224 @@
-       }
- }
--/* Just a place holder.  The Wolfson codec is a write only device,
-- * so we would have to keep a local copy of the data.
-- */
--#if 0
--static u8
--rdcodec(u8 addr)
--{
--      return 0  /* data */;
--}
--#endif
--
--
- static void
--wrcodec(u8 ctlreg, u8 val)
-+wrcodec(u8 ctlreg, u16 val)
- {
-       int     rcnt;
-       extern int pb1550_wm_codec_write(u8 addr, u8 reg, u8 val);
--
-       /* The codec is a write only device, with a 16-bit control/data
-        * word.  Although it is written as two bytes on the I2C, the
-        * format is actually 7 bits of register and 9 bits of data.
-        * The ls bit of the first byte is the ms bit of the data.
-        */
-       rcnt = 0;
--      while ((pb1550_wm_codec_write((0x36 >> 1), ctlreg, val) != 1) 
--                                                      && (rcnt < 50)) {
-+      while ((pb1550_wm_codec_write((0x36 >> 1), 
-+                                      (ctlreg << 1) | ((val >> 8) & 0x01), 
-+                                      (u8) (val & 0x00FF)) != 1) && 
-+                      (rcnt < 50)) {
-               rcnt++;
--#if 0
--              printk("Codec write retry %02x %02x\n", ctlreg, val);
--#endif
-       }
-+
-+      au1550_delay(10);
-+}
-+
-+static int
-+au1550_open_mixdev(struct inode *inode, struct file *file)
-+{
-+      file->private_data = &au1550_state;
-+      return 0;
-+}
-+
-+static int
-+au1550_release_mixdev(struct inode *inode, struct file *file)
-+{
-+      return 0;
-+}
-+
-+static int wm_i2s_read_mixer(struct au1550_state *s, int oss_channel)
-+{
-+      int ret = 0;
-+
-+      if (WM_I2S_STEREO_MASK & (1 << oss_channel)) {
-+              /* nice stereo mixers .. */
-+
-+              ret = s->level_left | (s->level_right << 8);
-+      } else if (oss_channel == SOUND_MIXER_MIC) {
-+              ret = 0;
-+              /* TODO: Implement read mixer for input/output codecs */
-+      }
-+
-+      return ret;
- }
-+static void wm_i2s_write_mixer(struct au1550_state *s, int oss_channel, unsigned int left, unsigned int right)
-+{
-+      if (WM_I2S_STEREO_MASK & (1 << oss_channel)) {
-+              /* stereo mixers */
-+              s->level_left = left;
-+              s->level_right = right;
-+
-+              right = (right * WM_VOLUME_SCALE) / 100;
-+              left  = (left  * WM_VOLUME_SCALE) / 100;
-+              if (right > WM_VOLUME_SCALE)
-+                      right = WM_VOLUME_SCALE;
-+              if (left > WM_VOLUME_SCALE)
-+                      left = WM_VOLUME_SCALE;
-+
-+              right += WM_VOLUME_MIN;
-+              left  += WM_VOLUME_MIN;
-+
-+              wrcodec(WM_REG_L_HEADPHONE_OUT, left);
-+              wrcodec(WM_REG_R_HEADPHONE_OUT, right);
-+
-+      }else if (oss_channel == SOUND_MIXER_MIC) {
-+              /* TODO: implement write mixer for input/output codecs */
-+      }
-+}
-+
-+/* a thin wrapper for write_mixer */
-+static void wm_i2s_set_mixer(struct au1550_state *s, unsigned int oss_mixer, unsigned int val )
-+{
-+      unsigned int left,right;
-+
-+      /* cleanse input a little */
-+      right = ((val >> 8)  & 0xff) ;
-+      left = (val  & 0xff) ;
-+
-+      if (right > 100) right = 100;
-+      if (left > 100) left = 100;
-+
-+      wm_i2s_write_mixer(s, oss_mixer, left, right);
-+}
-+
-+static int
-+au1550_ioctl_mixdev(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
-+{
-+      struct au1550_state *s = (struct au1550_state *)file->private_data;
-+
-+      int i, val = 0;
-+
-+      if (cmd == SOUND_MIXER_INFO) {
-+              mixer_info info;
-+              strncpy(info.id, CODEC_NAME, sizeof(info.id));
-+              strncpy(info.name, CODEC_NAME, sizeof(info.name));
-+              info.modify_counter = 0;
-+              if (copy_to_user((void *)arg, &info, sizeof(info)))
-+                      return -EFAULT;
-+              return 0;
-+      }
-+      if (cmd == SOUND_OLD_MIXER_INFO) {
-+              _old_mixer_info info;
-+              strncpy(info.id, CODEC_NAME, sizeof(info.id));
-+              strncpy(info.name, CODEC_NAME, sizeof(info.name));
-+              if (copy_to_user((void *)arg, &info, sizeof(info)))
-+                      return -EFAULT;
-+              return 0;
-+      }
-+
-+      if (_IOC_TYPE(cmd) != 'M' || _SIOC_SIZE(cmd) != sizeof(int))
-+              return -EINVAL;
-+
-+      if (cmd == OSS_GETVERSION)
-+              return put_user(SOUND_VERSION, (int *)arg);
-+
-+      if (_SIOC_DIR(cmd) == _SIOC_READ) {
-+              switch (_IOC_NR(cmd)) {
-+              case SOUND_MIXER_RECSRC: /* give them the current record src */
-+                      val = 0;
-+                      /*
-+                      if (!codec->recmask_io) {
-+                              val = 0;
-+                      } else {
-+                              val = codec->recmask_io(codec, 1, 0);
-+                      }*/
-+                      break;
-+
-+              case SOUND_MIXER_DEVMASK: /* give them the supported mixers */
-+                      val = WM_I2S_SUPPORTED_MASK;
-+                      break;
-+
-+              case SOUND_MIXER_RECMASK: 
-+                      /* Arg contains a bit for each supported recording 
-+                       * source */
-+                      val = WM_I2S_RECORD_MASK;
-+                      break;
-+
-+              case SOUND_MIXER_STEREODEVS: 
-+                      /* Mixer channels supporting stereo */
-+                      val = WM_I2S_STEREO_MASK;
-+                      break;
-+
-+              case SOUND_MIXER_CAPS:
-+                      val = SOUND_CAP_EXCL_INPUT;
-+                      break;
-+
-+              default: /* read a specific mixer */
-+                      i = _IOC_NR(cmd);
-+
-+                      if (!supported_mixer(i))
-+                              return -EINVAL;
-+
-+                      val = wm_i2s_read_mixer(s, i);
-+                      break;
-+              }
-+              return put_user(val, (int *)arg);
-+      }
-+
-+      if (_SIOC_DIR(cmd) == (_SIOC_WRITE|_SIOC_READ)) {
-+              if (get_user(val, (int *)arg))
-+                      return -EFAULT;
-+
-+              switch (_IOC_NR(cmd)) {
-+              case SOUND_MIXER_RECSRC: 
-+                      /* Arg contains a bit for each recording source */
-+                      if (!WM_I2S_RECORD_MASK)
-+                              return -EINVAL;
-+                      if (!val)
-+                              return 0;
-+                      if (!(val &= WM_I2S_RECORD_MASK))
-+                              return -EINVAL;
-+
-+                      return 0;
-+              default: /* write a specific mixer */
-+                      i = _IOC_NR(cmd);
-+
-+                      if (!supported_mixer(i))
-+                              return -EINVAL;
-+
-+                      wm_i2s_set_mixer(s, i, val);
-+
-+                      return 0;
-+      }
-+}
-+      return -EINVAL;
-+}
-+
-+static loff_t
-+au1550_llseek(struct file *file, loff_t offset, int origin)
-+{
-+      return -ESPIPE;
-+}
-+
-+static /*const */ struct file_operations au1550_mixer_fops = {
-+      owner:THIS_MODULE,
-+      llseek:au1550_llseek,
-+      ioctl:au1550_ioctl_mixdev,
-+      open:au1550_open_mixdev,
-+      release:au1550_release_mixdev,
-+};
-+
- void
--codec_init(void)
-+codec_init(struct au1550_state *s)
- {
--      wrcodec(0x1e, 0x00);    /* Reset */
--      au1550_delay(200);
--      wrcodec(0x0c, 0x00);    /* Power up everything */
--      au1550_delay(10);
--      wrcodec(0x12, 0x00);    /* Deactivate codec */
--      au1550_delay(10);
--      wrcodec(0x08, 0x10);    /* Select DAC outputs to line out */
--      au1550_delay(10);
--      wrcodec(0x0a, 0x00);    /* Disable output mute */
--      au1550_delay(10);
--      wrcodec(0x05, 0x70);    /* lower output volume on headphone */
--      au1550_delay(10);
--      wrcodec(0x0e, 0x02);    /* Set slave, 16-bit, I2S modes */
--      au1550_delay(10);
--      wrcodec(0x10, 0x01);    /* 12MHz (USB), 250fs */
--      au1550_delay(10);
--      wrcodec(0x12, 0x01);    /* Activate codec */
--      au1550_delay(10);
-+      wrcodec(WM_REG_RESET, 0x00);    /* Reset */
-+      wrcodec(WM_REG_POWER_DOWN_CTRL, 0x00);  /* Power up everything */
-+      wrcodec(WM_REG_ACTIVE_CTRL, 0x00);      /* Deactivate codec */
-+      wrcodec(WM_REG_ANALOGUE_AUDIO_PATH_CTRL, 0x10); /* Select DAC outputs to line out */
-+      wrcodec(WM_REG_DIGITAL_AUDIO_PATH_CTRL, 0x00);  /* Disable output mute */
-+      wm_i2s_write_mixer(s, SOUND_MIXER_PCM, 74, 74);
-+      wrcodec(WM_REG_DIGITAL_AUDIO_IF, 0x02); /* Set slave, 16-bit, I2S modes */
-+      wrcodec(WM_REG_ACTIVE_CTRL, 0x01);      /* Activate codec */
- }
- /* stop the ADC before calling */
-@@ -256,27 +502,16 @@
- set_adc_rate(struct au1550_state *s, unsigned rate)
- {
-       struct dmabuf  *adc = &s->dma_adc;
--      struct dmabuf  *dac = &s->dma_dac;
--      if (s->no_vra) {
--              /* calc SRC factor
--              */
-+      #if defined(WM_MODE_USB)
-               adc->src_factor = (((SAMP_RATE*2) / rate) + 1) >> 1;
-               adc->sample_rate = SAMP_RATE / adc->src_factor;
-               return;
--      }
-+      #else
-+      //TODO: Need code for normal mode
-+      #endif
-       adc->src_factor = 1;
--
--
--#if 0
--      rate = rate > SAMP_RATE ? SAMP_RATE : rate;
--
--      wrcodec(0, 0);  /* I don't yet know what to write here if we vra */
--
--      adc->sample_rate = rate;
--      dac->sample_rate = rate;
--#endif
- }
- /* stop the DAC before calling */
-@@ -284,26 +519,89 @@
- set_dac_rate(struct au1550_state *s, unsigned rate)
- {
-       struct dmabuf  *dac = &s->dma_dac;
--      struct dmabuf  *adc = &s->dma_adc;
--      if (s->no_vra) {
--              /* calc SRC factor
--              */
--              dac->src_factor = (((SAMP_RATE*2) / rate) + 1) >> 1;
--              dac->sample_rate = SAMP_RATE / dac->src_factor;
--              return;
-+      u16 sr, ws, div, bosr, mode;
-+      volatile psc_i2s_t* ip = (volatile psc_i2s_t *)I2S_PSC_BASE;
-+      u32 cfg;
-+
-+      #if defined(CONFIG_MIPS_FICMMP)
-+              rate = ficmmp_set_i2s_sample_rate(rate);
-+      #endif
-+
-+      switch(rate)
-+      {
-+              case 96000: 
-+                      sr = WM_SC_SR_96000; 
-+                      ws = WS_64FS;  
-+                      div = PSC_I2SCFG_DIV2;  
-+                      break;
-+              case 88200: 
-+                      sr = WM_SC_SR_88200; 
-+                      ws = WS_64FS;  
-+                      div = PSC_I2SCFG_DIV2;  
-+                      break;
-+              case 44100: 
-+                      sr = WM_SC_SR_44100; 
-+                      ws = WS_128FS; 
-+                      div = PSC_I2SCFG_DIV2;  
-+                      break;
-+              case 48000: 
-+                      sr = WM_SC_SR_48000; 
-+                      ws = WS_128FS; 
-+                      div = PSC_I2SCFG_DIV2;  
-+                      break;
-+              case 32000: 
-+                      sr = WM_SC_SR_32000; 
-+                      ws = WS_96FS;  
-+                      div = PSC_I2SCFG_DIV4;  
-+                      break;
-+              case  8018: 
-+                      sr = WM_SC_SR_8018;  
-+                      ws = WS_128FS; 
-+                      div = PSC_I2SCFG_DIV2;  
-+                      break;
-+              case  8000:
-+              default:    
-+                      sr = WM_SC_SR_8000;  
-+                      ws = WS_96FS;  
-+                      div = PSC_I2SCFG_DIV16; 
-+                      break;
-       }
-+      #if defined(WM_MODE_USB)
-+              mode = WM_SC_MODE_USB;
-+      #else
-+              mode = WM_SC_MODE_NORMAL;
-+      #endif
-+
-+      bosr = 0;
-+
-       dac->src_factor = 1;
-+      dac->sample_rate = rate;
--#if 0
--      rate = rate > SAMP_RATE ? SAMP_RATE : rate;
-+      /* Deactivate codec */
-+      wrcodec(WM_REG_ACTIVE_CTRL, 0x00);
--      wrcodec(0, 0);  /* I don't yet know what to write here if we vra */
-+      /* Disable I2S controller */
-+      ip->psc_i2scfg &= ~PSC_I2SCFG_DE_ENABLE;
-+      /* Wait for device disabled */
-+      while ((ip->psc_i2sstat & PSC_I2SSTAT_DR) == 1);
-+
-+      cfg = ip->psc_i2scfg;
-+      /* Clear WS and DIVIDER values */
-+      cfg &= ~(PSC_I2SCFG_WS_MASK | PSC_I2SCFG_DIV_MASK);     
-+      cfg |= PSC_I2SCFG_WS(ws) | div;
-+      /* Reconfigure and enable */
-+      ip->psc_i2scfg = cfg | PSC_I2SCFG_DE_ENABLE;    
--      adc->sample_rate = rate;
--      dac->sample_rate = rate;
--#endif
-+      /* Wait for device enabled */
-+      while ((ip->psc_i2sstat & PSC_I2SSTAT_DR) == 0);
-+
-+      /* Set appropriate sampling rate */
-+      wrcodec(WM_REG_SAMPLING_CONTROL, bosr | mode | sr);
-+
-+      /* Activate codec */
-+      wrcodec(WM_REG_ACTIVE_CTRL, 0x01);
- }
- static void
-@@ -354,8 +652,7 @@
-       ip->psc_i2spcr = PSC_I2SPCR_RP;
-       au_sync();
--      /* Wait for Receive Busy to show disabled.
--      */
-+      /* Wait for Receive Busy to show disabled.  */
-       do {
-               stat = ip->psc_i2sstat;
-               au_sync();
-@@ -463,7 +760,6 @@
-       if (db->num_channels == 1)
-               db->cnt_factor *= 2;
-       db->cnt_factor *= db->src_factor;
--
-       db->count = 0;
-       db->dma_qcount = 0;
-       db->nextIn = db->nextOut = db->rawbuf;
-@@ -546,12 +842,13 @@
-       if (i2s_stat & (PSC_I2SSTAT_TF | PSC_I2SSTAT_TR | PSC_I2SSTAT_TF))
-               dbg("I2S status = 0x%08x", i2s_stat);
- #endif
-+
-       db->dma_qcount--;
-       if (db->count >= db->fragsize) {
--              if (au1xxx_dbdma_put_source(db->dmanr, db->nextOut,
--                                                      db->fragsize) == 0) {
--                      err("qcount < 2 and no ring room!");
-+              if (au1xxx_dbdma_put_source(db->dmanr, db->nextOut, db->fragsize) == 0)
-+              {
-+                      err("qcount < MIN_Q_COUNT and no ring room!");
-               }
-               db->nextOut += db->fragsize;
-               if (db->nextOut >= db->rawbuf + db->dmasize)
-@@ -606,65 +903,43 @@
- }
--static loff_t
--au1550_llseek(struct file *file, loff_t offset, int origin)
--{
--      return -ESPIPE;
--}
--
--
--#if 0
--static int
--au1550_open_mixdev(struct inode *inode, struct file *file)
--{
--      file->private_data = &au1550_state;
--      return 0;
--}
--
--static int
--au1550_release_mixdev(struct inode *inode, struct file *file)
--{
--      return 0;
--}
--
--static int
--mixdev_ioctl(struct ac97_codec *codec, unsigned int cmd,
--                        unsigned long arg)
--{
--      return codec->mixer_ioctl(codec, cmd, arg);
--}
--
--static int
--au1550_ioctl_mixdev(struct inode *inode, struct file *file,
--                             unsigned int cmd, unsigned long arg)
--{
--      struct au1550_state *s = (struct au1550_state *)file->private_data;
--      struct ac97_codec *codec = s->codec;
--
--      return mixdev_ioctl(codec, cmd, arg);
--}
--
--static /*const */ struct file_operations au1550_mixer_fops = {
--      owner:THIS_MODULE,
--      llseek:au1550_llseek,
--      ioctl:au1550_ioctl_mixdev,
--      open:au1550_open_mixdev,
--      release:au1550_release_mixdev,
--};
--#endif
--
- static int
- drain_dac(struct au1550_state *s, int nonblock)
- {
-       unsigned long   flags;
-       int             count, tmo;
-+      struct dmabuf  *db = &s->dma_dac;
-+
-+      //DPRINTF();
-       if (s->dma_dac.mapped || !s->dma_dac.ready || s->dma_dac.stopped)
-               return 0;
-       for (;;) {
-               spin_lock_irqsave(&s->lock, flags);
--              count = s->dma_dac.count;
-+              count = db->count;
-+
-+              /* Pad the ddma buffer with zeros if the amount remaining 
-+               * is not a multiple of fragsize */
-+              if(count % db->fragsize != 0)
-+              {
-+                      int pad = db->fragsize - (count % db->fragsize);
-+                      char* bufptr = db->nextIn;
-+                      char* bufend = db->rawbuf + db->dmasize;
-+
-+                      if((bufend - bufptr) < pad)
-+                              printk("Error!  ddma padding is bigger than available ring space!\n");
-+                      else
-+                      {
-+                              memset((void*)bufptr, 0, pad);
-+                              count += pad;
-+                              db->nextIn += pad;
-+                              db->count += pad;
-+                              if (db->dma_qcount == 0)
-+                                              start_dac(s);
-+                              db->dma_qcount++;
-+                      }
-+              }
-               spin_unlock_irqrestore(&s->lock, flags);
-               if (count <= 0)
-                       break;
-@@ -672,9 +947,9 @@
-                       break;
-               if (nonblock)
-                       return -EBUSY;
--              tmo = 1000 * count / (s->no_vra ?
--                                    SAMP_RATE : s->dma_dac.sample_rate);
-+              tmo = 1000 * count / s->dma_dac.sample_rate;
-               tmo /= s->dma_dac.dma_bytes_per_sample;
-+
-               au1550_delay(tmo);
-       }
-       if (signal_pending(current))
-@@ -698,8 +973,7 @@
-  *     If interpolating (no VRA), duplicate every audio frame src_factor times.
-  */
- static int
--translate_from_user(struct dmabuf *db, char* dmabuf, char* userbuf,
--                                                             int dmacount)
-+translate_from_user(struct dmabuf *db, char* dmabuf, char* userbuf, int dmacount)
- {
-       int             sample, i;
-       int             interp_bytes_per_sample;
-@@ -737,11 +1011,12 @@
-               /* duplicate every audio frame src_factor times
-               */
--              for (i = 0; i < db->src_factor; i++)
-+              for (i = 0; i < db->src_factor; i++) {
-                       memcpy(dmabuf, dmasample, db->dma_bytes_per_sample);
-+                      dmabuf += interp_bytes_per_sample;
-+              }
-               userbuf += db->user_bytes_per_sample;
--              dmabuf += interp_bytes_per_sample;
-       }
-       return num_samples * interp_bytes_per_sample;
-@@ -996,15 +1271,14 @@
-                * on the dma queue.  If the queue count reaches zero,
-                * we know the dma has stopped.
-                */
--              while ((db->dma_qcount < 2) && (db->count >= db->fragsize)) {
-+              while ((db->dma_qcount < MIN_Q_COUNT) && (db->count >= db->fragsize)) {
-                       if (au1xxx_dbdma_put_source(db->dmanr, db->nextOut,
-                                                       db->fragsize) == 0) {
--                              err("qcount < 2 and no ring room!");
-+                              err("qcount < MIN_Q_COUNT and no ring room!");
-                       }
-                       db->nextOut += db->fragsize;
-                       if (db->nextOut >= db->rawbuf + db->dmasize)
-                               db->nextOut -= db->dmasize;
--                      db->count -= db->fragsize;
-                       db->total_bytes += db->dma_fragsize;
-                       if (db->dma_qcount == 0)
-                               start_dac(s);
-@@ -1017,7 +1291,6 @@
-               buffer += usercnt;
-               ret += usercnt;
-       }                       /* while (count > 0) */
--
- out:
-       up(&s->sem);
- out2:
-@@ -1371,9 +1644,6 @@
-                       s->dma_dac.cnt_factor;
-               abinfo.fragstotal = s->dma_dac.numfrag;
-               abinfo.fragments = abinfo.bytes >> s->dma_dac.fragshift;
--#ifdef AU1000_VERBOSE_DEBUG
--              dbg("bytes=%d, fragments=%d", abinfo.bytes, abinfo.fragments);
--#endif
-               return copy_to_user((void *) arg, &abinfo,
-                                   sizeof(abinfo)) ? -EFAULT : 0;
-@@ -1536,13 +1806,9 @@
-       case SNDCTL_DSP_SETSYNCRO:
-       case SOUND_PCM_READ_FILTER:
-               return -EINVAL;
-+      default: break;
-       }
--
--#if 0
--      return mixdev_ioctl(s->codec, cmd, arg);
--#else
-       return 0;
--#endif
+-      wrcodec(0x1e, 0x00);    /* Reset */
+-      au1550_delay(200);
+-      wrcodec(0x0c, 0x00);    /* Power up everything */
+-      au1550_delay(10);
+-      wrcodec(0x12, 0x00);    /* Deactivate codec */
+-      au1550_delay(10);
+-      wrcodec(0x08, 0x10);    /* Select DAC outputs to line out */
+-      au1550_delay(10);
+-      wrcodec(0x0a, 0x00);    /* Disable output mute */
+-      au1550_delay(10);
+-      wrcodec(0x05, 0x70);    /* lower output volume on headphone */
+-      au1550_delay(10);
+-      wrcodec(0x0e, 0x02);    /* Set slave, 16-bit, I2S modes */
+-      au1550_delay(10);
+-      wrcodec(0x10, 0x01);    /* 12MHz (USB), 250fs */
+-      au1550_delay(10);
+-      wrcodec(0x12, 0x01);    /* Activate codec */
+-      au1550_delay(10);
++      wrcodec(WM_REG_RESET, 0x00);    /* Reset */
++      wrcodec(WM_REG_POWER_DOWN_CTRL, 0x00);  /* Power up everything */
++      wrcodec(WM_REG_ACTIVE_CTRL, 0x00);      /* Deactivate codec */
++      wrcodec(WM_REG_ANALOGUE_AUDIO_PATH_CTRL, 0x10); /* Select DAC outputs to line out */
++      wrcodec(WM_REG_DIGITAL_AUDIO_PATH_CTRL, 0x00);  /* Disable output mute */
++      wm_i2s_write_mixer(s, SOUND_MIXER_PCM, 74, 74);
++      wrcodec(WM_REG_DIGITAL_AUDIO_IF, 0x02); /* Set slave, 16-bit, I2S modes */
++      wrcodec(WM_REG_ACTIVE_CTRL, 0x01);      /* Activate codec */
  }
  
+ /* stop the ADC before calling */
+@@ -256,27 +502,16 @@
+ set_adc_rate(struct au1550_state *s, unsigned rate)
+ {
+       struct dmabuf  *adc = &s->dma_adc;
+-      struct dmabuf  *dac = &s->dma_dac;
  
-@@ -1664,15 +1930,15 @@
- MODULE_AUTHOR("Advanced Micro Devices (AMD), dan@embeddededge.com");
- MODULE_DESCRIPTION("Au1550 Audio Driver");
+-      if (s->no_vra) {
+-              /* calc SRC factor
+-              */
++      #if defined(WM_MODE_USB)
+               adc->src_factor = (((SAMP_RATE*2) / rate) + 1) >> 1;
+               adc->sample_rate = SAMP_RATE / adc->src_factor;
+               return;
+-      }
++      #else
++      //TODO: Need code for normal mode
++      #endif
  
-+#if defined(WM_MODE_USB)
- /* Set up an internal clock for the PSC3.  This will then get
-  * driven out of the Au1550 as the master.
-  */
- static void
- intclk_setup(void)
- {
--      uint    clk, rate, stat;
+       adc->src_factor = 1;
 -
--      /* Wire up Freq4 as a clock for the PSC3.
-+      uint    clk, rate;
-+      /* Wire up Freq4 as a clock for the PSC.
-        * We know SMBus uses Freq3.
-        * By making changes to this rate, plus the word strobe
-        * size, we can make fine adjustments to the actual data rate.
-@@ -1700,11 +1966,17 @@
-       */
-       clk = au_readl(SYS_CLKSRC);
-       au_sync();
-+#if defined(CONFIG_SOC_AU1550)
-       clk &= ~0x01f00000;
-       clk |= (6 << 22);
-+#elif defined(CONFIG_SOC_AU1200)
-+      clk &= ~0x3e000000;
-+      clk |= (6 << 27);
-+#endif
-       au_writel(clk, SYS_CLKSRC);
-       au_sync();
+-
+-#if 0
+-      rate = rate > SAMP_RATE ? SAMP_RATE : rate;
+-
+-      wrcodec(0, 0);  /* I don't yet know what to write here if we vra */
+-
+-      adc->sample_rate = rate;
+-      dac->sample_rate = rate;
+-#endif
  }
-+#endif
  
- static int __devinit
- au1550_probe(void)
-@@ -1724,6 +1996,11 @@
-       init_MUTEX(&s->open_sem);
-       spin_lock_init(&s->lock);
+ /* stop the DAC before calling */
+@@ -284,26 +519,89 @@
+ set_dac_rate(struct au1550_state *s, unsigned rate)
+ {
+       struct dmabuf  *dac = &s->dma_dac;
+-      struct dmabuf  *adc = &s->dma_adc;
  
-+      /* CPLD Mux for I2s */
+-      if (s->no_vra) {
+-              /* calc SRC factor
+-              */
+-              dac->src_factor = (((SAMP_RATE*2) / rate) + 1) >> 1;
+-              dac->sample_rate = SAMP_RATE / dac->src_factor;
+-              return;
++      u16 sr, ws, div, bosr, mode;
++      volatile psc_i2s_t* ip = (volatile psc_i2s_t *)I2S_PSC_BASE;
++      u32 cfg;
 +
-+#if defined(CONFIG_MIPS_PB1200)
-+      bcsr->resets |= BCSR_RESETS_PCS1MUX;
-+#endif
-       s->psc_addr = (volatile psc_i2s_t *)I2S_PSC_BASE;
-       ip = s->psc_addr;
-@@ -1765,9 +2042,8 @@
-       if ((s->dev_audio = register_sound_dsp(&au1550_audio_fops, -1)) < 0)
-               goto err_dev1;
--#if 0
--      if ((s->codec->dev_mixer =
--           register_sound_mixer(&au1550_mixer_fops, -1)) < 0)
-+#if 1
-+      if ((s->dev_mixer = register_sound_mixer(&au1550_mixer_fops, -1)) < 0)
-               goto err_dev2;
- #endif
-@@ -1777,7 +2053,6 @@
-                                      proc_au1550_dump, NULL);
- #endif /* AU1550_DEBUG */
--      intclk_setup();
-       /* The GPIO for the appropriate PSC was configured by the
-        * board specific start up.
-@@ -1786,7 +2061,12 @@
-        */
-       ip->psc_ctrl = PSC_CTRL_DISABLE;        /* Disable PSC */
-       au_sync();
-+#if defined(WM_MODE_USB)
-+      intclk_setup();
-       ip->psc_sel = (PSC_SEL_CLK_INTCLK | PSC_SEL_PS_I2SMODE);
-+#else
-+      ip->psc_sel = (PSC_SEL_CLK_EXTCLK | PSC_SEL_PS_I2SMODE);
-+#endif
-       au_sync();
-       /* Enable PSC
-@@ -1806,42 +2086,18 @@
-        * Actual I2S mode (first bit delayed by one clock).
-        * Master mode (We provide the clock from the PSC).
-        */
--      val = PSC_I2SCFG_SET_LEN(16);
--#ifdef TRY_441KHz
--      /* This really should be 250, but it appears that all of the
--       * PLLs, dividers and so on in the chain shift it.  That's the
--       * problem with sourceing the clock instead of letting the very
--       * stable codec provide it.  But, the PSC doesn't appear to want
--       * to work in slave mode, so this is what we get.  It's  not
--       * studio quality timing, but it's good enough for listening
--       * to mp3s.
--       */
--      val |= PSC_I2SCFG_SET_WS(252);
--#else
--      val |= PSC_I2SCFG_SET_WS(250);
--#endif
--      val |= PSC_I2SCFG_RT_FIFO8 | PSC_I2SCFG_TT_FIFO8 | \
++      #if defined(CONFIG_MIPS_FICMMP)
++              rate = ficmmp_set_i2s_sample_rate(rate);
++      #endif
 +
-+      val = PSC_I2SCFG_SET_LEN(16) | PSC_I2SCFG_WS(WS_128FS) | PSC_I2SCFG_RT_FIFO8 | PSC_I2SCFG_TT_FIFO8 | \
-                                       PSC_I2SCFG_BI | PSC_I2SCFG_XM;
--      ip->psc_i2scfg = val;
--      au_sync();
--      val |= PSC_I2SCFG_DE_ENABLE;
--      ip->psc_i2scfg = val;
--      au_sync();
-+      ip->psc_i2scfg = val | PSC_I2SCFG_DE_ENABLE;
--      /* Wait for Device ready.
--      */
--      do {
--              val = ip->psc_i2sstat;
--              au_sync();
--      } while ((val & PSC_I2SSTAT_DR) == 0);
-+      set_dac_rate(s, 8000);  //Set default rate
--      val = ip->psc_i2scfg;
--      au_sync();
-+      codec_init(s);
++      switch(rate)
++      {
++              case 96000: 
++                      sr = WM_SC_SR_96000; 
++                      ws = WS_64FS;  
++                      div = PSC_I2SCFG_DIV2;  
++                      break;
++              case 88200: 
++                      sr = WM_SC_SR_88200; 
++                      ws = WS_64FS;  
++                      div = PSC_I2SCFG_DIV2;  
++                      break;
++              case 44100: 
++                      sr = WM_SC_SR_44100; 
++                      ws = WS_128FS; 
++                      div = PSC_I2SCFG_DIV2;  
++                      break;
++              case 48000: 
++                      sr = WM_SC_SR_48000; 
++                      ws = WS_128FS; 
++                      div = PSC_I2SCFG_DIV2;  
++                      break;
++              case 32000: 
++                      sr = WM_SC_SR_32000; 
++                      ws = WS_96FS;  
++                      div = PSC_I2SCFG_DIV4;  
++                      break;
++              case  8018: 
++                      sr = WM_SC_SR_8018;  
++                      ws = WS_128FS; 
++                      div = PSC_I2SCFG_DIV2;  
++                      break;
++              case  8000:
++              default:    
++                      sr = WM_SC_SR_8000;  
++                      ws = WS_96FS;  
++                      div = PSC_I2SCFG_DIV16; 
++                      break;
+       }
  
--      codec_init();
-+      s->no_vra = vra ? 0 : 1;
++      #if defined(WM_MODE_USB)
++              mode = WM_SC_MODE_USB;
++      #else
++              mode = WM_SC_MODE_NORMAL;
++      #endif
++
++      bosr = 0;
++
+       dac->src_factor = 1;
++      dac->sample_rate = rate;
  
--      s->no_vra = 1;
-       if (s->no_vra)
-               info("no VRA, interpolating and decimating");
+-#if 0
+-      rate = rate > SAMP_RATE ? SAMP_RATE : rate;
++      /* Deactivate codec */
++      wrcodec(WM_REG_ACTIVE_CTRL, 0x00);
  
-@@ -1866,6 +2122,8 @@
-  err_dev2:
-       unregister_sound_dsp(s->dev_audio);
- #endif
-+ err_dev2:
-+      unregister_sound_dsp(s->dev_audio);
-  err_dev1:
-       au1xxx_dbdma_chan_free(s->dma_adc.dmanr);
-  err_dma2:
-diff -Nur linux-2.4.29/drivers/sound/au1550_psc.c linux-mips/drivers/sound/au1550_psc.c
---- linux-2.4.29/drivers/sound/au1550_psc.c    2005-01-19 15:10:04.000000000 +0100
-+++ linux-mips/drivers/sound/au1550_psc.c      2005-01-31 12:59:41.000000000 +0100
-@@ -30,6 +30,7 @@
-  *  675 Mass Ave, Cambridge, MA 02139, USA.
-  *
-  */
+-      wrcodec(0, 0);  /* I don't yet know what to write here if we vra */
++      /* Disable I2S controller */
++      ip->psc_i2scfg &= ~PSC_I2SCFG_DE_ENABLE;
++      /* Wait for device disabled */
++      while ((ip->psc_i2sstat & PSC_I2SSTAT_DR) == 1);
 +
- #include <linux/version.h>
- #include <linux/module.h>
- #include <linux/string.h>
-@@ -63,6 +64,14 @@
- #include <asm/db1x00.h>
- #endif
++      cfg = ip->psc_i2scfg;
++      /* Clear WS and DIVIDER values */
++      cfg &= ~(PSC_I2SCFG_WS_MASK | PSC_I2SCFG_DIV_MASK);     
++      cfg |= PSC_I2SCFG_WS(ws) | div;
++      /* Reconfigure and enable */
++      ip->psc_i2scfg = cfg | PSC_I2SCFG_DE_ENABLE;    
  
-+#ifdef CONFIG_MIPS_PB1200
-+#include <asm/pb1200.h>
-+#endif
+-      adc->sample_rate = rate;
+-      dac->sample_rate = rate;
+-#endif
++      /* Wait for device enabled */
++      while ((ip->psc_i2sstat & PSC_I2SSTAT_DR) == 0);
 +
-+#ifdef CONFIG_MIPS_DB1200
-+#include <asm/db1200.h>
-+#endif
++      /* Set appropriate sampling rate */
++      wrcodec(WM_REG_SAMPLING_CONTROL, bosr | mode | sr);
 +
- #undef OSS_DOCUMENTED_MIXER_SEMANTICS
- #define AU1550_MODULE_NAME "Au1550 psc audio"
-@@ -521,7 +530,14 @@
-       spin_unlock_irqrestore(&s->lock, flags);
- }
--
-+/* 
-+   NOTE: The xmit slots cannot be changed on the fly when in full-duplex 
-+   because the AC'97 block must be stopped/started.  When using this driver 
-+   in full-duplex (in & out at the same time), the DMA engine will stop if 
-+   you disable the block.
-+   TODO: change implementation to properly restart adc/dac after setting 
-+   xmit slots.
-+*/
- static void
- set_xmit_slots(int num_channels)
- {
-@@ -565,6 +581,14 @@
-       } while ((stat & PSC_AC97STAT_DR) == 0);
++      /* Activate codec */
++      wrcodec(WM_REG_ACTIVE_CTRL, 0x01);
  }
  
-+/* 
-+   NOTE: The recv slots cannot be changed on the fly when in full-duplex 
-+   because the AC'97 block must be stopped/started.  When using this driver 
-+   in full-duplex (in & out at the same time), the DMA engine will stop if 
-+   you disable the block.
-+   TODO: change implementation to properly restart adc/dac after setting 
-+   recv slots.
-+*/
  static void
- set_recv_slots(int num_channels)
- {
-@@ -608,7 +632,6 @@
-       spin_lock_irqsave(&s->lock, flags);
--      set_xmit_slots(db->num_channels);
-       au_writel(PSC_AC97PCR_TC, PSC_AC97PCR);
+@@ -354,8 +652,7 @@
+       ip->psc_i2spcr = PSC_I2SPCR_RP;
        au_sync();
-       au_writel(PSC_AC97PCR_TS, PSC_AC97PCR);
-@@ -640,7 +663,6 @@
-                       db->nextIn -= db->dmasize;
-       }
  
--      set_recv_slots(db->num_channels);
-       au1xxx_dbdma_start(db->dmanr);
-       au_writel(PSC_AC97PCR_RC, PSC_AC97PCR);
-       au_sync();
-@@ -752,12 +774,16 @@
-       if (ac97c_stat & (AC97C_XU | AC97C_XO | AC97C_TE))
-               dbg("AC97C status = 0x%08x", ac97c_stat);
+-      /* Wait for Receive Busy to show disabled.
+-      */
++      /* Wait for Receive Busy to show disabled.  */
+       do {
+               stat = ip->psc_i2sstat;
+               au_sync();
+@@ -463,7 +760,6 @@
+       if (db->num_channels == 1)
+               db->cnt_factor *= 2;
+       db->cnt_factor *= db->src_factor;
+-
+       db->count = 0;
+       db->dma_qcount = 0;
+       db->nextIn = db->nextOut = db->rawbuf;
+@@ -546,12 +842,13 @@
+       if (i2s_stat & (PSC_I2SSTAT_TF | PSC_I2SSTAT_TR | PSC_I2SSTAT_TF))
+               dbg("I2S status = 0x%08x", i2s_stat);
  #endif
-+      /* There is a possiblity that we are getting 1 interrupt for
-+         multiple descriptors. Use ddma api to find out how many
-+         completed.
-+      */
++
        db->dma_qcount--;
  
        if (db->count >= db->fragsize) {
-               if (au1xxx_dbdma_put_source(db->dmanr, db->nextOut,
-                                                       db->fragsize) == 0) {
+-              if (au1xxx_dbdma_put_source(db->dmanr, db->nextOut,
+-                                                      db->fragsize) == 0) {
 -                      err("qcount < 2 and no ring room!");
-+                      err("qcount < 2 and no ring room1!");
++              if (au1xxx_dbdma_put_source(db->dmanr, db->nextOut, db->fragsize) == 0)
++              {
++                      err("qcount < MIN_Q_COUNT and no ring room!");
                }
                db->nextOut += db->fragsize;
                if (db->nextOut >= db->rawbuf + db->dmasize)
-@@ -941,11 +967,12 @@
-               /* duplicate every audio frame src_factor times
-               */
--              for (i = 0; i < db->src_factor; i++)
-+              for (i = 0; i < db->src_factor; i++) {
-                       memcpy(dmabuf, dmasample, db->dma_bytes_per_sample);
-+                      dmabuf += interp_bytes_per_sample;
-+              }
-               userbuf += db->user_bytes_per_sample;
--              dmabuf += interp_bytes_per_sample;
-       }
-       return num_samples * interp_bytes_per_sample;
-@@ -1203,7 +1230,7 @@
-               while ((db->dma_qcount < 2) && (db->count >= db->fragsize)) {
-                       if (au1xxx_dbdma_put_source(db->dmanr, db->nextOut,
-                                                       db->fragsize) == 0) {
--                              err("qcount < 2 and no ring room!");
-+                              err("qcount < 2 and no ring room!0");
-                       }
-                       db->nextOut += db->fragsize;
-                       if (db->nextOut >= db->rawbuf + db->dmasize)
-@@ -1481,6 +1508,7 @@
-                                       return -EINVAL;
-                               stop_adc(s);
-                               s->dma_adc.num_channels = val;
-+                              set_recv_slots(val);
-                               if ((ret = prog_dmabuf_adc(s)))
-                                       return ret;
-                       }
-@@ -1538,6 +1566,7 @@
-                               }
+@@ -606,65 +903,43 @@
  
-                               s->dma_dac.num_channels = val;
-+                              set_xmit_slots(val);
-                               if ((ret = prog_dmabuf_dac(s)))
-                                       return ret;
-                       }
-@@ -1832,10 +1861,8 @@
-               down(&s->open_sem);
-       }
+ }
  
--      stop_dac(s);
--      stop_adc(s);
+-static loff_t
+-au1550_llseek(struct file *file, loff_t offset, int origin)
+-{
+-      return -ESPIPE;
+-}
 -
-       if (file->f_mode & FMODE_READ) {
-+              stop_adc(s);
-               s->dma_adc.ossfragshift = s->dma_adc.ossmaxfrags =
-                       s->dma_adc.subdivision = s->dma_adc.total_bytes = 0;
-               s->dma_adc.num_channels = 1;
-@@ -1846,6 +1873,7 @@
-       }
-       if (file->f_mode & FMODE_WRITE) {
-+              stop_dac(s);
-               s->dma_dac.ossfragshift = s->dma_dac.ossmaxfrags =
-                       s->dma_dac.subdivision = s->dma_dac.total_bytes = 0;
-               s->dma_dac.num_channels = 1;
-@@ -2091,6 +2119,9 @@
-                                            ac97_read_proc, &s->codec);
- #endif
-+      set_xmit_slots(1);
-+      set_recv_slots(1);
-+
-       return 0;
-  err_dev3:
-diff -Nur linux-2.4.29/drivers/tc/lk201.c linux-mips/drivers/tc/lk201.c
---- linux-2.4.29/drivers/tc/lk201.c    2004-02-18 14:36:31.000000000 +0100
-+++ linux-mips/drivers/tc/lk201.c      2004-09-28 02:53:04.000000000 +0200
-@@ -5,7 +5,7 @@
-  * for more details.
-  *
-  * Copyright (C) 1999-2002 Harald Koerfgen <hkoerfg@web.de>
-- * Copyright (C) 2001, 2002, 2003  Maciej W. Rozycki <macro@ds2.pg.gda.pl>
-+ * Copyright (C) 2001, 2002, 2003, 2004  Maciej W. Rozycki
-  */
- #include <linux/config.h>
-@@ -23,8 +23,8 @@
- #include <asm/keyboard.h>
- #include <asm/dec/tc.h>
- #include <asm/dec/machtype.h>
-+#include <asm/dec/serial.h>
--#include "zs.h"
- #include "lk201.h"
- /*
-@@ -55,19 +55,20 @@
- unsigned char kbd_sysrq_key = -1;
- #endif
--#define KEYB_LINE     3
-+#define KEYB_LINE_ZS  3
-+#define KEYB_LINE_DZ  0
--static int __init lk201_init(struct dec_serial *);
--static void __init lk201_info(struct dec_serial *);
--static void lk201_kbd_rx_char(unsigned char, unsigned char);
-+static int __init lk201_init(void *);
-+static void __init lk201_info(void *);
-+static void lk201_rx_char(unsigned char, unsigned char);
--struct zs_hook lk201_kbdhook = {
-+static struct dec_serial_hook lk201_hook = {
-       .init_channel   = lk201_init,
-       .init_info      = lk201_info,
-       .rx_char        = NULL,
-       .poll_rx_char   = NULL,
-       .poll_tx_char   = NULL,
--      .cflags         = B4800 | CS8 | CSTOPB | CLOCAL
-+      .cflags         = B4800 | CS8 | CSTOPB | CLOCAL,
- };
- /*
-@@ -93,28 +94,28 @@
-       LK_CMD_ENB_BELL, LK_PARAM_VOLUME(4),
- };
+-
+-#if 0
+-static int
+-au1550_open_mixdev(struct inode *inode, struct file *file)
+-{
+-      file->private_data = &au1550_state;
+-      return 0;
+-}
+-
+-static int
+-au1550_release_mixdev(struct inode *inode, struct file *file)
+-{
+-      return 0;
+-}
+-
+-static int
+-mixdev_ioctl(struct ac97_codec *codec, unsigned int cmd,
+-                        unsigned long arg)
+-{
+-      return codec->mixer_ioctl(codec, cmd, arg);
+-}
+-
+-static int
+-au1550_ioctl_mixdev(struct inode *inode, struct file *file,
+-                             unsigned int cmd, unsigned long arg)
+-{
+-      struct au1550_state *s = (struct au1550_state *)file->private_data;
+-      struct ac97_codec *codec = s->codec;
+-
+-      return mixdev_ioctl(codec, cmd, arg);
+-}
+-
+-static /*const */ struct file_operations au1550_mixer_fops = {
+-      owner:THIS_MODULE,
+-      llseek:au1550_llseek,
+-      ioctl:au1550_ioctl_mixdev,
+-      open:au1550_open_mixdev,
+-      release:au1550_release_mixdev,
+-};
+-#endif
+-
+ static int
+ drain_dac(struct au1550_state *s, int nonblock)
+ {
+       unsigned long   flags;
+       int             count, tmo;
  
--static struct dec_serial* lk201kbd_info;
-+static void *lk201_handle;
++      struct dmabuf  *db = &s->dma_dac;
++
++      //DPRINTF();
+       if (s->dma_dac.mapped || !s->dma_dac.ready || s->dma_dac.stopped)
+               return 0;
  
--static int lk201_send(struct dec_serial *info, unsigned char ch)
-+static int lk201_send(unsigned char ch)
- {
--      if (info->hook->poll_tx_char(info, ch)) {
-+      if (lk201_hook.poll_tx_char(lk201_handle, ch)) {
-               printk(KERN_ERR "lk201: transmit timeout\n");
-               return -EIO;
+       for (;;) {
+               spin_lock_irqsave(&s->lock, flags);
+-              count = s->dma_dac.count;
++              count = db->count;
++
++              /* Pad the ddma buffer with zeros if the amount remaining 
++               * is not a multiple of fragsize */
++              if(count % db->fragsize != 0)
++              {
++                      int pad = db->fragsize - (count % db->fragsize);
++                      char* bufptr = db->nextIn;
++                      char* bufend = db->rawbuf + db->dmasize;
++
++                      if((bufend - bufptr) < pad)
++                              printk("Error!  ddma padding is bigger than available ring space!\n");
++                      else
++                      {
++                              memset((void*)bufptr, 0, pad);
++                              count += pad;
++                              db->nextIn += pad;
++                              db->count += pad;
++                              if (db->dma_qcount == 0)
++                                              start_dac(s);
++                              db->dma_qcount++;
++                      }
++              }
+               spin_unlock_irqrestore(&s->lock, flags);
+               if (count <= 0)
+                       break;
+@@ -672,9 +947,9 @@
+                       break;
+               if (nonblock)
+                       return -EBUSY;
+-              tmo = 1000 * count / (s->no_vra ?
+-                                    SAMP_RATE : s->dma_dac.sample_rate);
++              tmo = 1000 * count / s->dma_dac.sample_rate;
+               tmo /= s->dma_dac.dma_bytes_per_sample;
++
+               au1550_delay(tmo);
        }
-       return 0;
- }
--static inline int lk201_get_id(struct dec_serial *info)
-+static inline int lk201_get_id(void)
+       if (signal_pending(current))
+@@ -698,8 +973,7 @@
+  *     If interpolating (no VRA), duplicate every audio frame src_factor times.
+  */
+ static int
+-translate_from_user(struct dmabuf *db, char* dmabuf, char* userbuf,
+-                                                             int dmacount)
++translate_from_user(struct dmabuf *db, char* dmabuf, char* userbuf, int dmacount)
  {
--      return lk201_send(info, LK_CMD_REQ_ID);
-+      return lk201_send(LK_CMD_REQ_ID);
- }
+       int             sample, i;
+       int             interp_bytes_per_sample;
+@@ -737,11 +1011,12 @@
  
--static int lk201_reset(struct dec_serial *info)
-+static int lk201_reset(void)
- {
-       int i, r;
+               /* duplicate every audio frame src_factor times
+               */
+-              for (i = 0; i < db->src_factor; i++)
++              for (i = 0; i < db->src_factor; i++) {
+                       memcpy(dmabuf, dmasample, db->dma_bytes_per_sample);
++                      dmabuf += interp_bytes_per_sample;
++              }
  
-       for (i = 0; i < sizeof(lk201_reset_string); i++) {
--              r = lk201_send(info, lk201_reset_string[i]);
-+              r = lk201_send(lk201_reset_string[i]);
-               if (r < 0)
-                       return r;
+               userbuf += db->user_bytes_per_sample;
+-              dmabuf += interp_bytes_per_sample;
        }
-@@ -203,24 +204,26 @@
  
- static int write_kbd_rate(struct kbd_repeat *rep)
- {
--      struct dec_serial* info = lk201kbd_info;
-       int delay, rate;
-       int i;
+       return num_samples * interp_bytes_per_sample;
+@@ -996,15 +1271,14 @@
+                * on the dma queue.  If the queue count reaches zero,
+                * we know the dma has stopped.
+                */
+-              while ((db->dma_qcount < 2) && (db->count >= db->fragsize)) {
++              while ((db->dma_qcount < MIN_Q_COUNT) && (db->count >= db->fragsize)) {
+                       if (au1xxx_dbdma_put_source(db->dmanr, db->nextOut,
+                                                       db->fragsize) == 0) {
+-                              err("qcount < 2 and no ring room!");
++                              err("qcount < MIN_Q_COUNT and no ring room!");
+                       }
+                       db->nextOut += db->fragsize;
+                       if (db->nextOut >= db->rawbuf + db->dmasize)
+                               db->nextOut -= db->dmasize;
+-                      db->count -= db->fragsize;
+                       db->total_bytes += db->dma_fragsize;
+                       if (db->dma_qcount == 0)
+                               start_dac(s);
+@@ -1017,7 +1291,6 @@
+               buffer += usercnt;
+               ret += usercnt;
+       }                       /* while (count > 0) */
+-
+ out:
+       up(&s->sem);
+ out2:
+@@ -1371,9 +1644,6 @@
+                       s->dma_dac.cnt_factor;
+               abinfo.fragstotal = s->dma_dac.numfrag;
+               abinfo.fragments = abinfo.bytes >> s->dma_dac.fragshift;
+-#ifdef AU1000_VERBOSE_DEBUG
+-              dbg("bytes=%d, fragments=%d", abinfo.bytes, abinfo.fragments);
+-#endif
+               return copy_to_user((void *) arg, &abinfo,
+                                   sizeof(abinfo)) ? -EFAULT : 0;
  
-       delay = rep->delay / 5;
-       rate = rep->rate;
-       for (i = 0; i < 4; i++) {
--              if (info->hook->poll_tx_char(info, LK_CMD_RPT_RATE(i)))
-+              if (lk201_hook.poll_tx_char(lk201_handle,
-+                                          LK_CMD_RPT_RATE(i)))
-                       return 1;
--              if (info->hook->poll_tx_char(info, LK_PARAM_DELAY(delay)))
-+              if (lk201_hook.poll_tx_char(lk201_handle,
-+                                          LK_PARAM_DELAY(delay)))
-                       return 1;
--              if (info->hook->poll_tx_char(info, LK_PARAM_RATE(rate)))
-+              if (lk201_hook.poll_tx_char(lk201_handle,
-+                                          LK_PARAM_RATE(rate)))
-                       return 1;
+@@ -1536,13 +1806,9 @@
+       case SNDCTL_DSP_SETSYNCRO:
+       case SOUND_PCM_READ_FILTER:
+               return -EINVAL;
++      default: break;
        }
+-
+-#if 0
+-      return mixdev_ioctl(s->codec, cmd, arg);
+-#else
        return 0;
+-#endif
  }
  
--static int lk201kbd_rate(struct kbd_repeat *rep)
-+static int lk201_kbd_rate(struct kbd_repeat *rep)
- {
-       if (rep == NULL)
-               return -EINVAL;
-@@ -237,10 +240,8 @@
-       return 0;
- }
  
--static void lk201kd_mksound(unsigned int hz, unsigned int ticks)
-+static void lk201_kd_mksound(unsigned int hz, unsigned int ticks)
+@@ -1664,15 +1930,15 @@
+ MODULE_AUTHOR("Advanced Micro Devices (AMD), dan@embeddededge.com");
+ MODULE_DESCRIPTION("Au1550 Audio Driver");
++#if defined(WM_MODE_USB)
+ /* Set up an internal clock for the PSC3.  This will then get
+  * driven out of the Au1550 as the master.
+  */
+ static void
+ intclk_setup(void)
  {
--      struct dec_serial* info = lk201kbd_info;
+-      uint    clk, rate, stat;
 -
-       if (!ticks)
-               return;
+-      /* Wire up Freq4 as a clock for the PSC3.
++      uint    clk, rate;
++      /* Wire up Freq4 as a clock for the PSC.
+        * We know SMBus uses Freq3.
+        * By making changes to this rate, plus the word strobe
+        * size, we can make fine adjustments to the actual data rate.
+@@ -1700,11 +1966,17 @@
+       */
+       clk = au_readl(SYS_CLKSRC);
+       au_sync();
++#if defined(CONFIG_SOC_AU1550)
+       clk &= ~0x01f00000;
+       clk |= (6 << 22);
++#elif defined(CONFIG_SOC_AU1200)
++      clk &= ~0x3e000000;
++      clk |= (6 << 27);
++#endif
+       au_writel(clk, SYS_CLKSRC);
+       au_sync();
+ }
++#endif
  
-@@ -253,20 +254,19 @@
-               ticks = 7;
-       ticks = 7 - ticks;
+ static int __devinit
+ au1550_probe(void)
+@@ -1724,6 +1996,11 @@
+       init_MUTEX(&s->open_sem);
+       spin_lock_init(&s->lock);
  
--      if (info->hook->poll_tx_char(info, LK_CMD_ENB_BELL))
-+      if (lk201_hook.poll_tx_char(lk201_handle, LK_CMD_ENB_BELL))
-               return;
--      if (info->hook->poll_tx_char(info, LK_PARAM_VOLUME(ticks)))
-+      if (lk201_hook.poll_tx_char(lk201_handle, LK_PARAM_VOLUME(ticks)))
-               return;
--      if (info->hook->poll_tx_char(info, LK_CMD_BELL))
-+      if (lk201_hook.poll_tx_char(lk201_handle, LK_CMD_BELL))
-               return;
- }
++      /* CPLD Mux for I2s */
++
++#if defined(CONFIG_MIPS_PB1200)
++      bcsr->resets |= BCSR_RESETS_PCS1MUX;
++#endif
  
- void kbd_leds(unsigned char leds)
- {
--      struct dec_serial* info = lk201kbd_info;
-       unsigned char l = 0;
+       s->psc_addr = (volatile psc_i2s_t *)I2S_PSC_BASE;
+       ip = s->psc_addr;
+@@ -1765,9 +2042,8 @@
+       if ((s->dev_audio = register_sound_dsp(&au1550_audio_fops, -1)) < 0)
+               goto err_dev1;
+-#if 0
+-      if ((s->codec->dev_mixer =
+-           register_sound_mixer(&au1550_mixer_fops, -1)) < 0)
++#if 1
++      if ((s->dev_mixer = register_sound_mixer(&au1550_mixer_fops, -1)) < 0)
+               goto err_dev2;
+ #endif
  
--      if (!info)              /* FIXME */
-+      if (!lk201_handle)              /* FIXME */
-               return;
+@@ -1777,7 +2053,6 @@
+                                      proc_au1550_dump, NULL);
+ #endif /* AU1550_DEBUG */
  
-       /* FIXME -- Only Hold and Lock LEDs for now. --macro */
-@@ -275,13 +275,13 @@
-       if (leds & LED_CAP)
-               l |= LK_LED_LOCK;
+-      intclk_setup();
  
--      if (info->hook->poll_tx_char(info, LK_CMD_LEDS_ON))
-+      if (lk201_hook.poll_tx_char(lk201_handle, LK_CMD_LEDS_ON))
-               return;
--      if (info->hook->poll_tx_char(info, LK_PARAM_LED_MASK(l)))
-+      if (lk201_hook.poll_tx_char(lk201_handle, LK_PARAM_LED_MASK(l)))
-               return;
--      if (info->hook->poll_tx_char(info, LK_CMD_LEDS_OFF))
-+      if (lk201_hook.poll_tx_char(lk201_handle, LK_CMD_LEDS_OFF))
-               return;
--      if (info->hook->poll_tx_char(info, LK_PARAM_LED_MASK(~l)))
-+      if (lk201_hook.poll_tx_char(lk201_handle, LK_PARAM_LED_MASK(~l)))
-               return;
- }
+       /* The GPIO for the appropriate PSC was configured by the
+        * board specific start up.
+@@ -1786,7 +2061,12 @@
+        */
+       ip->psc_ctrl = PSC_CTRL_DISABLE;        /* Disable PSC */
+       au_sync();
++#if defined(WM_MODE_USB)
++      intclk_setup();
+       ip->psc_sel = (PSC_SEL_CLK_INTCLK | PSC_SEL_PS_I2SMODE);
++#else
++      ip->psc_sel = (PSC_SEL_CLK_EXTCLK | PSC_SEL_PS_I2SMODE);
++#endif
+       au_sync();
  
-@@ -307,7 +307,7 @@
-       return 0x80;
- }
+       /* Enable PSC
+@@ -1806,42 +2086,18 @@
+        * Actual I2S mode (first bit delayed by one clock).
+        * Master mode (We provide the clock from the PSC).
+        */
+-      val = PSC_I2SCFG_SET_LEN(16);
+-#ifdef TRY_441KHz
+-      /* This really should be 250, but it appears that all of the
+-       * PLLs, dividers and so on in the chain shift it.  That's the
+-       * problem with sourceing the clock instead of letting the very
+-       * stable codec provide it.  But, the PSC doesn't appear to want
+-       * to work in slave mode, so this is what we get.  It's  not
+-       * studio quality timing, but it's good enough for listening
+-       * to mp3s.
+-       */
+-      val |= PSC_I2SCFG_SET_WS(252);
+-#else
+-      val |= PSC_I2SCFG_SET_WS(250);
+-#endif
+-      val |= PSC_I2SCFG_RT_FIFO8 | PSC_I2SCFG_TT_FIFO8 | \
++
++      val = PSC_I2SCFG_SET_LEN(16) | PSC_I2SCFG_WS(WS_128FS) | PSC_I2SCFG_RT_FIFO8 | PSC_I2SCFG_TT_FIFO8 | \
+                                       PSC_I2SCFG_BI | PSC_I2SCFG_XM;
  
--static void lk201_kbd_rx_char(unsigned char ch, unsigned char stat)
-+static void lk201_rx_char(unsigned char ch, unsigned char fl)
- {
-       static unsigned char id[6];
-       static int id_i;
-@@ -316,9 +316,8 @@
-       static int prev_scancode;
-       unsigned char c = scancodeRemap[ch];
+-      ip->psc_i2scfg = val;
+-      au_sync();
+-      val |= PSC_I2SCFG_DE_ENABLE;
+-      ip->psc_i2scfg = val;
+-      au_sync();
++      ip->psc_i2scfg = val | PSC_I2SCFG_DE_ENABLE;
  
--      if (stat && stat != TTY_OVERRUN) {
--              printk(KERN_ERR "lk201: keyboard receive error: 0x%02x\n",
--                     stat);
-+      if (fl != TTY_NORMAL && fl != TTY_OVERRUN) {
-+              printk(KERN_ERR "lk201: keyboard receive error: 0x%02x\n", fl);
-               return;
-       }
+-      /* Wait for Device ready.
+-      */
+-      do {
+-              val = ip->psc_i2sstat;
+-              au_sync();
+-      } while ((val & PSC_I2SSTAT_DR) == 0);
++      set_dac_rate(s, 8000);  //Set default rate
  
-@@ -335,7 +334,7 @@
-                       /* OK, the power-up concluded. */
-                       lk201_report(id);
-                       if (id[2] == LK_STAT_PWRUP_OK)
--                              lk201_get_id(lk201kbd_info);
-+                              lk201_get_id();
-                       else {
-                               id_i = 0;
-                               printk(KERN_ERR "lk201: keyboard power-up "
-@@ -345,7 +344,7 @@
-                       /* We got the ID; report it and start operation. */
-                       id_i = 0;
-                       lk201_id(id);
--                      lk201_reset(lk201kbd_info);
-+                      lk201_reset();
-               }
-               return;
-       }
-@@ -398,29 +397,28 @@
-       tasklet_schedule(&keyboard_tasklet);
- }
+-      val = ip->psc_i2scfg;
+-      au_sync();
++      codec_init(s);
  
--static void __init lk201_info(struct dec_serial *info)
-+static void __init lk201_info(void *handle)
- {
- }
+-      codec_init();
++      s->no_vra = vra ? 0 : 1;
  
--static int __init lk201_init(struct dec_serial *info)
-+static int __init lk201_init(void *handle)
- {
-       /* First install handlers. */
--      lk201kbd_info = info;
--      kbd_rate = lk201kbd_rate;
--      kd_mksound = lk201kd_mksound;
-+      lk201_handle = handle;
-+      kbd_rate = lk201_kbd_rate;
-+      kd_mksound = lk201_kd_mksound;
+-      s->no_vra = 1;
+       if (s->no_vra)
+               info("no VRA, interpolating and decimating");
  
--      info->hook->rx_char = lk201_kbd_rx_char;
-+      lk201_hook.rx_char = lk201_rx_char;
+@@ -1866,6 +2122,8 @@
+  err_dev2:
+       unregister_sound_dsp(s->dev_audio);
+ #endif
++ err_dev2:
++      unregister_sound_dsp(s->dev_audio);
+  err_dev1:
+       au1xxx_dbdma_chan_free(s->dma_adc.dmanr);
+  err_dma2:
+diff -Nur linux-2.4.29/drivers/sound/au1550_psc.c linux-mips/drivers/sound/au1550_psc.c
+--- linux-2.4.29/drivers/sound/au1550_psc.c    2005-01-19 15:10:04.000000000 +0100
++++ linux-mips/drivers/sound/au1550_psc.c      2005-01-30 09:01:28.000000000 +0100
+@@ -30,6 +30,7 @@
+  *  675 Mass Ave, Cambridge, MA 02139, USA.
+  *
+  */
++
+ #include <linux/version.h>
+ #include <linux/module.h>
+ #include <linux/string.h>
+@@ -63,6 +64,14 @@
+ #include <asm/db1x00.h>
+ #endif
  
-       /* Then just issue a reset -- the handlers will do the rest. */
--      lk201_send(info, LK_CMD_POWER_UP);
-+      lk201_send(LK_CMD_POWER_UP);
++#ifdef CONFIG_MIPS_PB1200
++#include <asm/pb1200.h>
++#endif
++
++#ifdef CONFIG_MIPS_DB1200
++#include <asm/db1200.h>
++#endif
++
+ #undef OSS_DOCUMENTED_MIXER_SEMANTICS
  
-       return 0;
+ #define AU1550_MODULE_NAME "Au1550 psc audio"
+@@ -521,7 +530,14 @@
+       spin_unlock_irqrestore(&s->lock, flags);
  }
  
- void __init kbd_init_hw(void)
+-
++/* 
++   NOTE: The xmit slots cannot be changed on the fly when in full-duplex 
++   because the AC'97 block must be stopped/started.  When using this driver 
++   in full-duplex (in & out at the same time), the DMA engine will stop if 
++   you disable the block.
++   TODO: change implementation to properly restart adc/dac after setting 
++   xmit slots.
++*/
+ static void
+ set_xmit_slots(int num_channels)
  {
--      extern int register_zs_hook(unsigned int, struct zs_hook *);
--      extern int unregister_zs_hook(unsigned int);
-+      int keyb_line;
-       /* Maxine uses LK501 at the Access.Bus. */
-       if (!LK_IFACE)
-@@ -428,19 +426,15 @@
-       printk(KERN_INFO "lk201: DECstation LK keyboard driver v0.05.\n");
--      if (LK_IFACE_ZS) {
--              /*
--               * kbd_init_hw() is being called before
--               * rs_init() so just register the kbd hook
--               * and let zs_init do the rest :-)
--               */
--              if(!register_zs_hook(KEYB_LINE, &lk201_kbdhook))
--                      unregister_zs_hook(KEYB_LINE);
--      } else {
--              /*
--               * TODO: modify dz.c to allow similar hooks
--               * for LK201 handling on DS2100, DS3100, and DS5000/200
--               */
--              printk(KERN_ERR "lk201: support for DZ11 not yet ready.\n");
--      }
-+      /*
-+       * kbd_init_hw() is being called before
-+       * rs_init() so just register the kbd hook
-+       * and let zs_init do the rest :-)
-+       */
-+      if (LK_IFACE_ZS)
-+              keyb_line = KEYB_LINE_ZS;
-+      else
-+              keyb_line = KEYB_LINE_DZ;
-+      if (!register_dec_serial_hook(keyb_line, &lk201_hook))
-+              unregister_dec_serial_hook(keyb_line);
+@@ -565,6 +581,14 @@
+       } while ((stat & PSC_AC97STAT_DR) == 0);
  }
-diff -Nur linux-2.4.29/drivers/tc/zs.c linux-mips/drivers/tc/zs.c
---- linux-2.4.29/drivers/tc/zs.c       2005-01-19 15:10:05.000000000 +0100
-+++ linux-mips/drivers/tc/zs.c 2004-12-27 05:13:50.000000000 +0100
-@@ -68,6 +68,8 @@
- #include <asm/bitops.h>
- #include <asm/uaccess.h>
- #include <asm/bootinfo.h>
-+#include <asm/dec/serial.h>
-+
- #ifdef CONFIG_DECSTATION
- #include <asm/dec/interrupts.h>
- #include <asm/dec/machtype.h>
-@@ -160,8 +162,8 @@
- #ifdef CONFIG_SERIAL_DEC_CONSOLE
- static struct console sercons;
- #endif
--#if defined(CONFIG_SERIAL_DEC_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) \
--    && !defined(MODULE)
-+#if defined(CONFIG_SERIAL_DEC_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) && \
-+   !defined(MODULE)
- static unsigned long break_pressed; /* break, really ... */
- #endif
  
-@@ -196,7 +198,6 @@
- /*
-  * Debugging.
-  */
--#undef SERIAL_DEBUG_INTR
- #undef SERIAL_DEBUG_OPEN
- #undef SERIAL_DEBUG_FLOW
- #undef SERIAL_DEBUG_THROTTLE
-@@ -221,10 +222,6 @@
- static struct termios *serial_termios[NUM_CHANNELS];
- static struct termios *serial_termios_locked[NUM_CHANNELS];
++/* 
++   NOTE: The recv slots cannot be changed on the fly when in full-duplex 
++   because the AC'97 block must be stopped/started.  When using this driver 
++   in full-duplex (in & out at the same time), the DMA engine will stop if 
++   you disable the block.
++   TODO: change implementation to properly restart adc/dac after setting 
++   recv slots.
++*/
+ static void
+ set_recv_slots(int num_channels)
+ {
+@@ -608,7 +632,6 @@
+       spin_lock_irqsave(&s->lock, flags);
  
--#ifndef MIN
--#define MIN(a,b)      ((a) < (b) ? (a) : (b))
--#endif
--
- /*
-  * tmp_buf is used as a temporary buffer by serial_write.  We need to
-  * lock it in case the copy_from_user blocks while swapping in a page,
-@@ -386,8 +383,6 @@
-  * -----------------------------------------------------------------------
-  */
+-      set_xmit_slots(db->num_channels);
+       au_writel(PSC_AC97PCR_TC, PSC_AC97PCR);
+       au_sync();
+       au_writel(PSC_AC97PCR_TS, PSC_AC97PCR);
+@@ -640,7 +663,6 @@
+                       db->nextIn -= db->dmasize;
+       }
  
--static int tty_break; /* Set whenever BREAK condition is detected.  */
--
- /*
-  * This routine is used by the interrupt handler to schedule
-  * processing in the software interrupt portion of the driver.
-@@ -414,20 +409,15 @@
-               if (!tty && (!info->hook || !info->hook->rx_char))
-                       continue;
+-      set_recv_slots(db->num_channels);
+       au1xxx_dbdma_start(db->dmanr);
+       au_writel(PSC_AC97PCR_RC, PSC_AC97PCR);
+       au_sync();
+@@ -752,12 +774,16 @@
+       if (ac97c_stat & (AC97C_XU | AC97C_XO | AC97C_TE))
+               dbg("AC97C status = 0x%08x", ac97c_stat);
+ #endif
++      /* There is a possiblity that we are getting 1 interrupt for
++         multiple descriptors. Use ddma api to find out how many
++         completed.
++      */
+       db->dma_qcount--;
  
--              if (tty_break) {
--                      tty_break = 0;
--#if defined(CONFIG_SERIAL_DEC_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) && !defined(MODULE)
--                      if (info->line == sercons.index) {
--                              if (!break_pressed) {
--                                      break_pressed = jiffies;
--                                      goto ignore_char;
--                              }
--                              break_pressed = 0;
--                      }
--#endif
-+              flag = TTY_NORMAL;
-+              if (info->tty_break) {
-+                      info->tty_break = 0;
-                       flag = TTY_BREAK;
-                       if (info->flags & ZILOG_SAK)
-                               do_SAK(tty);
-+                      /* Ignore the null char got when BREAK is removed.  */
-+                      if (ch == 0)
-+                              continue;
-               } else {
-                       if (stat & Rx_OVR) {
-                               flag = TTY_OVERRUN;
-@@ -435,20 +425,22 @@
-                               flag = TTY_FRAME;
-                       } else if (stat & PAR_ERR) {
-                               flag = TTY_PARITY;
--                      } else
--                              flag = 0;
--                      if (flag)
-+                      }
-+                      if (flag != TTY_NORMAL)
-                               /* reset the error indication */
-                               write_zsreg(info->zs_channel, R0, ERR_RES);
+       if (db->count >= db->fragsize) {
+               if (au1xxx_dbdma_put_source(db->dmanr, db->nextOut,
+                                                       db->fragsize) == 0) {
+-                      err("qcount < 2 and no ring room!");
++                      err("qcount < 2 and no ring room1!");
                }
+               db->nextOut += db->fragsize;
+               if (db->nextOut >= db->rawbuf + db->dmasize)
+@@ -941,11 +967,12 @@
  
--#if defined(CONFIG_SERIAL_DEC_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) && !defined(MODULE)
-+#if defined(CONFIG_SERIAL_DEC_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) && \
-+   !defined(MODULE)
-               if (break_pressed && info->line == sercons.index) {
--                      if (ch != 0 &&
--                          time_before(jiffies, break_pressed + HZ*5)) {
-+                      /* Ignore the null char got when BREAK is removed.  */
-+                      if (ch == 0)
-+                              continue;
-+                      if (time_before(jiffies, break_pressed + HZ * 5)) {
-                               handle_sysrq(ch, regs, NULL, NULL);
-                               break_pressed = 0;
--                              goto ignore_char;
-+                              continue;
+               /* duplicate every audio frame src_factor times
+               */
+-              for (i = 0; i < db->src_factor; i++)
++              for (i = 0; i < db->src_factor; i++) {
+                       memcpy(dmabuf, dmasample, db->dma_bytes_per_sample);
++                      dmabuf += interp_bytes_per_sample;
++              }
+               userbuf += db->user_bytes_per_sample;
+-              dmabuf += interp_bytes_per_sample;
+       }
+       return num_samples * interp_bytes_per_sample;
+@@ -1203,7 +1230,7 @@
+               while ((db->dma_qcount < 2) && (db->count >= db->fragsize)) {
+                       if (au1xxx_dbdma_put_source(db->dmanr, db->nextOut,
+                                                       db->fragsize) == 0) {
+-                              err("qcount < 2 and no ring room!");
++                              err("qcount < 2 and no ring room!0");
                        }
-                       break_pressed = 0;
-               }
-@@ -459,23 +451,7 @@
-                       return;
-               }
+                       db->nextOut += db->fragsize;
+                       if (db->nextOut >= db->rawbuf + db->dmasize)
+@@ -1481,6 +1508,7 @@
+                                       return -EINVAL;
+                               stop_adc(s);
+                               s->dma_adc.num_channels = val;
++                              set_recv_slots(val);
+                               if ((ret = prog_dmabuf_adc(s)))
+                                       return ret;
+                       }
+@@ -1538,6 +1566,7 @@
+                               }
  
--              if (tty->flip.count >= TTY_FLIPBUF_SIZE) {
--                      static int flip_buf_ovf;
--                      ++flip_buf_ovf;
--                      continue;
--              }
--              tty->flip.count++;
--              {
--                      static int flip_max_cnt;
--                      if (flip_max_cnt < tty->flip.count)
--                              flip_max_cnt = tty->flip.count;
--              }
+                               s->dma_dac.num_channels = val;
++                              set_xmit_slots(val);
+                               if ((ret = prog_dmabuf_dac(s)))
+                                       return ret;
+                       }
+@@ -1832,10 +1861,8 @@
+               down(&s->open_sem);
+       }
+-      stop_dac(s);
+-      stop_adc(s);
 -
--              *tty->flip.flag_buf_ptr++ = flag;
--              *tty->flip.char_buf_ptr++ = ch;
--#if defined(CONFIG_SERIAL_DEC_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) && !defined(MODULE)
--      ignore_char:
--#endif
-+              tty_insert_flip_char(tty, ch, flag);
+       if (file->f_mode & FMODE_READ) {
++              stop_adc(s);
+               s->dma_adc.ossfragshift = s->dma_adc.ossmaxfrags =
+                       s->dma_adc.subdivision = s->dma_adc.total_bytes = 0;
+               s->dma_adc.num_channels = 1;
+@@ -1846,6 +1873,7 @@
        }
-       if (tty)
-               tty_flip_buffer_push(tty);
-@@ -517,11 +493,15 @@
-       /* Get status from Read Register 0 */
-       stat = read_zsreg(info->zs_channel, R0);
  
--      if (stat & BRK_ABRT) {
--#ifdef SERIAL_DEBUG_INTR
--              printk("handling break....");
-+      if ((stat & BRK_ABRT) && !(info->read_reg_zero & BRK_ABRT)) {
-+#if defined(CONFIG_SERIAL_DEC_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) && \
-+   !defined(MODULE)
-+              if (info->line == sercons.index) {
-+                      if (!break_pressed)
-+                              break_pressed = jiffies;
-+              } else
+       if (file->f_mode & FMODE_WRITE) {
++              stop_dac(s);
+               s->dma_dac.ossfragshift = s->dma_dac.ossmaxfrags =
+                       s->dma_dac.subdivision = s->dma_dac.total_bytes = 0;
+               s->dma_dac.num_channels = 1;
+@@ -2091,6 +2119,9 @@
+                                            ac97_read_proc, &s->codec);
  #endif
--              tty_break = 1;
-+                      info->tty_break = 1;
-       }
  
-       if (info->zs_channel != info->zs_chan_a) {
-@@ -957,7 +937,7 @@
-       save_flags(flags);
-       while (1) {
-               cli();
--              c = MIN(count, MIN(SERIAL_XMIT_SIZE - info->xmit_cnt - 1,
-+              c = min(count, min(SERIAL_XMIT_SIZE - info->xmit_cnt - 1,
-                                  SERIAL_XMIT_SIZE - info->xmit_head));
-               if (c <= 0)
-                       break;
-@@ -965,7 +945,7 @@
-               if (from_user) {
-                       down(&tmp_buf_sem);
-                       copy_from_user(tmp_buf, buf, c);
--                      c = MIN(c, MIN(SERIAL_XMIT_SIZE - info->xmit_cnt - 1,
-+                      c = min(c, min(SERIAL_XMIT_SIZE - info->xmit_cnt - 1,
-                                      SERIAL_XMIT_SIZE - info->xmit_head));
-                       memcpy(info->xmit_buf + info->xmit_head, tmp_buf, c);
-                       up(&tmp_buf_sem);
-@@ -1282,46 +1262,48 @@
-       }
++      set_xmit_slots(1);
++      set_recv_slots(1);
++
+       return 0;
+  err_dev3:
+diff -Nur linux-2.4.29/drivers/tc/lk201.c linux-mips/drivers/tc/lk201.c
+--- linux-2.4.29/drivers/tc/lk201.c    2004-02-18 14:36:31.000000000 +0100
++++ linux-mips/drivers/tc/lk201.c      2004-09-28 02:53:04.000000000 +0200
+@@ -5,7 +5,7 @@
+  * for more details.
+  *
+  * Copyright (C) 1999-2002 Harald Koerfgen <hkoerfg@web.de>
+- * Copyright (C) 2001, 2002, 2003  Maciej W. Rozycki <macro@ds2.pg.gda.pl>
++ * Copyright (C) 2001, 2002, 2003, 2004  Maciej W. Rozycki
+  */
+ #include <linux/config.h>
+@@ -23,8 +23,8 @@
+ #include <asm/keyboard.h>
+ #include <asm/dec/tc.h>
+ #include <asm/dec/machtype.h>
++#include <asm/dec/serial.h>
+-#include "zs.h"
+ #include "lk201.h"
+ /*
+@@ -55,19 +55,20 @@
+ unsigned char kbd_sysrq_key = -1;
+ #endif
  
-       switch (cmd) {
--              case TIOCMGET:
--                      error = verify_area(VERIFY_WRITE, (void *) arg,
--                              sizeof(unsigned int));
--                      if (error)
--                              return error;
--                      return get_modem_info(info, (unsigned int *) arg);
--              case TIOCMBIS:
--              case TIOCMBIC:
--              case TIOCMSET:
--                      return set_modem_info(info, cmd, (unsigned int *) arg);
--              case TIOCGSERIAL:
--                      error = verify_area(VERIFY_WRITE, (void *) arg,
--                                              sizeof(struct serial_struct));
--                      if (error)
--                              return error;
--                      return get_serial_info(info,
--                                             (struct serial_struct *) arg);
--              case TIOCSSERIAL:
--                      return set_serial_info(info,
--                                             (struct serial_struct *) arg);
--              case TIOCSERGETLSR: /* Get line status register */
--                      error = verify_area(VERIFY_WRITE, (void *) arg,
--                              sizeof(unsigned int));
--                      if (error)
--                              return error;
--                      else
--                          return get_lsr_info(info, (unsigned int *) arg);
-+      case TIOCMGET:
-+              error = verify_area(VERIFY_WRITE, (void *)arg,
-+                                  sizeof(unsigned int));
-+              if (error)
-+                      return error;
-+              return get_modem_info(info, (unsigned int *)arg);
+-#define KEYB_LINE     3
++#define KEYB_LINE_ZS  3
++#define KEYB_LINE_DZ  0
  
--              case TIOCSERGSTRUCT:
--                      error = verify_area(VERIFY_WRITE, (void *) arg,
--                                              sizeof(struct dec_serial));
--                      if (error)
--                              return error;
--                      copy_from_user((struct dec_serial *) arg,
--                                     info, sizeof(struct dec_serial));
--                      return 0;
-+      case TIOCMBIS:
-+      case TIOCMBIC:
-+      case TIOCMSET:
-+              return set_modem_info(info, cmd, (unsigned int *)arg);
+-static int __init lk201_init(struct dec_serial *);
+-static void __init lk201_info(struct dec_serial *);
+-static void lk201_kbd_rx_char(unsigned char, unsigned char);
++static int __init lk201_init(void *);
++static void __init lk201_info(void *);
++static void lk201_rx_char(unsigned char, unsigned char);
  
--              default:
--                      return -ENOIOCTLCMD;
--              }
-+      case TIOCGSERIAL:
-+              error = verify_area(VERIFY_WRITE, (void *)arg,
-+                                  sizeof(struct serial_struct));
-+              if (error)
-+                      return error;
-+              return get_serial_info(info, (struct serial_struct *)arg);
-+
-+      case TIOCSSERIAL:
-+              return set_serial_info(info, (struct serial_struct *)arg);
-+
-+      case TIOCSERGETLSR:                     /* Get line status register */
-+              error = verify_area(VERIFY_WRITE, (void *)arg,
-+                                  sizeof(unsigned int));
-+              if (error)
-+                      return error;
-+              else
-+                      return get_lsr_info(info, (unsigned int *)arg);
-+
-+      case TIOCSERGSTRUCT:
-+              error = verify_area(VERIFY_WRITE, (void *)arg,
-+                                  sizeof(struct dec_serial));
-+              if (error)
-+                      return error;
-+              copy_from_user((struct dec_serial *)arg, info,
-+                             sizeof(struct dec_serial));
-+              return 0;
-+
-+      default:
-+              return -ENOIOCTLCMD;
-+      }
+-struct zs_hook lk201_kbdhook = {
++static struct dec_serial_hook lk201_hook = {
+       .init_channel   = lk201_init,
+       .init_info      = lk201_info,
+       .rx_char        = NULL,
+       .poll_rx_char   = NULL,
+       .poll_tx_char   = NULL,
+-      .cflags         = B4800 | CS8 | CSTOPB | CLOCAL
++      .cflags         = B4800 | CS8 | CSTOPB | CLOCAL,
+ };
+ /*
+@@ -93,28 +94,28 @@
+       LK_CMD_ENB_BELL, LK_PARAM_VOLUME(4),
+ };
+-static struct dec_serial* lk201kbd_info;
++static void *lk201_handle;
+-static int lk201_send(struct dec_serial *info, unsigned char ch)
++static int lk201_send(unsigned char ch)
+ {
+-      if (info->hook->poll_tx_char(info, ch)) {
++      if (lk201_hook.poll_tx_char(lk201_handle, ch)) {
+               printk(KERN_ERR "lk201: transmit timeout\n");
+               return -EIO;
+       }
        return 0;
  }
  
-@@ -1446,7 +1428,8 @@
- static void rs_wait_until_sent(struct tty_struct *tty, int timeout)
+-static inline int lk201_get_id(struct dec_serial *info)
++static inline int lk201_get_id(void)
  {
-       struct dec_serial *info = (struct dec_serial *) tty->driver_data;
--      unsigned long orig_jiffies, char_time;
-+      unsigned long orig_jiffies;
-+      int char_time;
+-      return lk201_send(info, LK_CMD_REQ_ID);
++      return lk201_send(LK_CMD_REQ_ID);
+ }
  
-       if (serial_paranoia_check(info, tty->device, "rs_wait_until_sent"))
-               return;
-@@ -1462,7 +1445,7 @@
-       if (char_time == 0)
-               char_time = 1;
-       if (timeout)
--              char_time = MIN(char_time, timeout);
-+              char_time = min(char_time, timeout);
-       while ((read_zsreg(info->zs_channel, 1) & Tx_BUF_EMP) == 0) {
-               current->state = TASK_INTERRUPTIBLE;
-               schedule_timeout(char_time);
-@@ -1714,7 +1697,7 @@
+-static int lk201_reset(struct dec_serial *info)
++static int lk201_reset(void)
+ {
+       int i, r;
  
- static void __init show_serial_version(void)
+       for (i = 0; i < sizeof(lk201_reset_string); i++) {
+-              r = lk201_send(info, lk201_reset_string[i]);
++              r = lk201_send(lk201_reset_string[i]);
+               if (r < 0)
+                       return r;
+       }
+@@ -203,24 +204,26 @@
+ static int write_kbd_rate(struct kbd_repeat *rep)
  {
--      printk("DECstation Z8530 serial driver version 0.08\n");
-+      printk("DECstation Z8530 serial driver version 0.09\n");
+-      struct dec_serial* info = lk201kbd_info;
+       int delay, rate;
+       int i;
+       delay = rep->delay / 5;
+       rate = rep->rate;
+       for (i = 0; i < 4; i++) {
+-              if (info->hook->poll_tx_char(info, LK_CMD_RPT_RATE(i)))
++              if (lk201_hook.poll_tx_char(lk201_handle,
++                                          LK_CMD_RPT_RATE(i)))
+                       return 1;
+-              if (info->hook->poll_tx_char(info, LK_PARAM_DELAY(delay)))
++              if (lk201_hook.poll_tx_char(lk201_handle,
++                                          LK_PARAM_DELAY(delay)))
+                       return 1;
+-              if (info->hook->poll_tx_char(info, LK_PARAM_RATE(rate)))
++              if (lk201_hook.poll_tx_char(lk201_handle,
++                                          LK_PARAM_RATE(rate)))
+                       return 1;
+       }
+       return 0;
  }
  
- /*  Initialize Z8530s zs_channels
-@@ -1994,8 +1977,9 @@
-  * polling I/O routines
-  */
- static int
--zs_poll_tx_char(struct dec_serial *info, unsigned char ch)
-+zs_poll_tx_char(void *handle, unsigned char ch)
+-static int lk201kbd_rate(struct kbd_repeat *rep)
++static int lk201_kbd_rate(struct kbd_repeat *rep)
  {
-+      struct dec_serial *info = handle;
-       struct dec_zschannel *chan = info->zs_channel;
-       int    ret;
-@@ -2017,8 +2001,9 @@
+       if (rep == NULL)
+               return -EINVAL;
+@@ -237,10 +240,8 @@
+       return 0;
  }
  
- static int
--zs_poll_rx_char(struct dec_serial *info)
-+zs_poll_rx_char(void *handle)
+-static void lk201kd_mksound(unsigned int hz, unsigned int ticks)
++static void lk201_kd_mksound(unsigned int hz, unsigned int ticks)
  {
-+      struct dec_serial *info = handle;
-         struct dec_zschannel *chan = info->zs_channel;
-         int    ret;
+-      struct dec_serial* info = lk201kbd_info;
+-
+       if (!ticks)
+               return;
  
-@@ -2038,12 +2023,13 @@
-               return -ENODEV;
+@@ -253,20 +254,19 @@
+               ticks = 7;
+       ticks = 7 - ticks;
+-      if (info->hook->poll_tx_char(info, LK_CMD_ENB_BELL))
++      if (lk201_hook.poll_tx_char(lk201_handle, LK_CMD_ENB_BELL))
+               return;
+-      if (info->hook->poll_tx_char(info, LK_PARAM_VOLUME(ticks)))
++      if (lk201_hook.poll_tx_char(lk201_handle, LK_PARAM_VOLUME(ticks)))
+               return;
+-      if (info->hook->poll_tx_char(info, LK_CMD_BELL))
++      if (lk201_hook.poll_tx_char(lk201_handle, LK_CMD_BELL))
+               return;
  }
  
--unsigned int register_zs_hook(unsigned int channel, struct zs_hook *hook)
-+int register_zs_hook(unsigned int channel, struct dec_serial_hook *hook)
+ void kbd_leds(unsigned char leds)
  {
-       struct dec_serial *info = &zs_soft[channel];
+-      struct dec_serial* info = lk201kbd_info;
+       unsigned char l = 0;
  
-       if (info->hook) {
--              printk(__FUNCTION__": line %d has already a hook registered\n", channel);
-+              printk("%s: line %d has already a hook registered\n",
-+                     __FUNCTION__, channel);
+-      if (!info)              /* FIXME */
++      if (!lk201_handle)              /* FIXME */
+               return;
  
-               return 0;
-       } else {
-@@ -2055,7 +2041,7 @@
-       }
+       /* FIXME -- Only Hold and Lock LEDs for now. --macro */
+@@ -275,13 +275,13 @@
+       if (leds & LED_CAP)
+               l |= LK_LED_LOCK;
+-      if (info->hook->poll_tx_char(info, LK_CMD_LEDS_ON))
++      if (lk201_hook.poll_tx_char(lk201_handle, LK_CMD_LEDS_ON))
+               return;
+-      if (info->hook->poll_tx_char(info, LK_PARAM_LED_MASK(l)))
++      if (lk201_hook.poll_tx_char(lk201_handle, LK_PARAM_LED_MASK(l)))
+               return;
+-      if (info->hook->poll_tx_char(info, LK_CMD_LEDS_OFF))
++      if (lk201_hook.poll_tx_char(lk201_handle, LK_CMD_LEDS_OFF))
+               return;
+-      if (info->hook->poll_tx_char(info, LK_PARAM_LED_MASK(~l)))
++      if (lk201_hook.poll_tx_char(lk201_handle, LK_PARAM_LED_MASK(~l)))
+               return;
+ }
+@@ -307,7 +307,7 @@
+       return 0x80;
  }
  
--unsigned int unregister_zs_hook(unsigned int channel)
-+int unregister_zs_hook(unsigned int channel)
+-static void lk201_kbd_rx_char(unsigned char ch, unsigned char stat)
++static void lk201_rx_char(unsigned char ch, unsigned char fl)
  {
-       struct dec_serial *info = &zs_soft[channel];
+       static unsigned char id[6];
+       static int id_i;
+@@ -316,9 +316,8 @@
+       static int prev_scancode;
+       unsigned char c = scancodeRemap[ch];
  
-@@ -2063,8 +2049,8 @@
-                 info->hook = NULL;
-                 return 1;
-         } else {
--                printk(__FUNCTION__": trying to unregister hook on line %d,"
--                       " but none is registered\n", channel);
-+                printk("%s: trying to unregister hook on line %d,"
-+                       " but none is registered\n", __FUNCTION__, channel);
-                 return 0;
-         }
- }
-@@ -2319,22 +2305,23 @@
-       write_zsreg(chan, 9, nine);
- }
+-      if (stat && stat != TTY_OVERRUN) {
+-              printk(KERN_ERR "lk201: keyboard receive error: 0x%02x\n",
+-                     stat);
++      if (fl != TTY_NORMAL && fl != TTY_OVERRUN) {
++              printk(KERN_ERR "lk201: keyboard receive error: 0x%02x\n", fl);
+               return;
+       }
  
--static int kgdbhook_init_channel(struct dec_serial* info)
-+static int kgdbhook_init_channel(void *handle)
- {
-       return 0;
+@@ -335,7 +334,7 @@
+                       /* OK, the power-up concluded. */
+                       lk201_report(id);
+                       if (id[2] == LK_STAT_PWRUP_OK)
+-                              lk201_get_id(lk201kbd_info);
++                              lk201_get_id();
+                       else {
+                               id_i = 0;
+                               printk(KERN_ERR "lk201: keyboard power-up "
+@@ -345,7 +344,7 @@
+                       /* We got the ID; report it and start operation. */
+                       id_i = 0;
+                       lk201_id(id);
+-                      lk201_reset(lk201kbd_info);
++                      lk201_reset();
+               }
+               return;
+       }
+@@ -398,29 +397,28 @@
+       tasklet_schedule(&keyboard_tasklet);
  }
  
--static void kgdbhook_init_info(struct dec_serial* info)
-+static void kgdbhook_init_info(void *handle)
+-static void __init lk201_info(struct dec_serial *info)
++static void __init lk201_info(void *handle)
  {
  }
  
--static void kgdbhook_rx_char(struct dec_serial* info,
--                           unsigned char ch, unsigned char stat)
-+static void kgdbhook_rx_char(void *handle, unsigned char ch, unsigned char fl)
+-static int __init lk201_init(struct dec_serial *info)
++static int __init lk201_init(void *handle)
  {
-+      struct dec_serial *info = handle;
-+
-+      if (fl != TTY_NORMAL)
-+              return;
-       if (ch == 0x03 || ch == '$')
-               breakpoint();
--      if (stat & (Rx_OVR|FRM_ERR|PAR_ERR))
--              write_zsreg(info->zs_channel, 0, ERR_RES);
- }
+       /* First install handlers. */
+-      lk201kbd_info = info;
+-      kbd_rate = lk201kbd_rate;
+-      kd_mksound = lk201kd_mksound;
++      lk201_handle = handle;
++      kbd_rate = lk201_kbd_rate;
++      kd_mksound = lk201_kd_mksound;
  
- /* This sets up the serial port we're using, and turns on
-@@ -2360,11 +2347,11 @@
-  * for /dev/ttyb which is determined in setup_arch() from the
-  * boot command line flags.
-  */
--struct zs_hook zs_kgdbhook = {
--      init_channel : kgdbhook_init_channel,
--      init_info    : kgdbhook_init_info,
--      cflags       : B38400|CS8|CLOCAL,
--      rx_char      : kgdbhook_rx_char,
-+struct dec_serial_hook zs_kgdbhook = {
-+      .init_channel   = kgdbhook_init_channel,
-+      .init_info      = kgdbhook_init_info,
-+      .rx_char        = kgdbhook_rx_char,
-+      .cflags         = B38400 | CS8 | CLOCAL,
- }
+-      info->hook->rx_char = lk201_kbd_rx_char;
++      lk201_hook.rx_char = lk201_rx_char;
  
- void __init zs_kgdb_hook(int tty_num)
-diff -Nur linux-2.4.29/drivers/tc/zs.h linux-mips/drivers/tc/zs.h
---- linux-2.4.29/drivers/tc/zs.h       2004-02-18 14:36:31.000000000 +0100
-+++ linux-mips/drivers/tc/zs.h 2004-07-01 15:28:54.000000000 +0200
-@@ -1,14 +1,18 @@
- /*
-- * macserial.h: Definitions for the Macintosh Z8530 serial driver.
-+ * drivers/tc/zs.h: Definitions for the DECstation Z85C30 serial driver.
-  *
-  * Adapted from drivers/sbus/char/sunserial.h by Paul Mackerras.
-+ * Adapted from drivers/macintosh/macserial.h by Harald Koerfgen.
-  *
-  * Copyright (C) 1996 Paul Mackerras (Paul.Mackerras@cs.anu.edu.au)
-  * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
-+ * Copyright (C) 2004  Maciej W. Rozycki
-  */
- #ifndef _DECSERIAL_H
- #define _DECSERIAL_H
+       /* Then just issue a reset -- the handlers will do the rest. */
+-      lk201_send(info, LK_CMD_POWER_UP);
++      lk201_send(LK_CMD_POWER_UP);
  
-+#include <asm/dec/serial.h>
-+
- #define NUM_ZSREGS    16
+       return 0;
+ }
  
- struct serial_struct {
-@@ -89,63 +93,50 @@
-       unsigned char curregs[NUM_ZSREGS];
- };
+ void __init kbd_init_hw(void)
+ {
+-      extern int register_zs_hook(unsigned int, struct zs_hook *);
+-      extern int unregister_zs_hook(unsigned int);
++      int keyb_line;
  
--struct dec_serial;
--
--struct zs_hook {
--      int (*init_channel)(struct dec_serial* info);
--      void (*init_info)(struct dec_serial* info);
--      void (*rx_char)(unsigned char ch, unsigned char stat);
--      int  (*poll_rx_char)(struct dec_serial* info);
--      int  (*poll_tx_char)(struct dec_serial* info,
--                           unsigned char ch);
--      unsigned cflags;
--};
--
- struct dec_serial {
--      struct dec_serial *zs_next;     /* For IRQ servicing chain */
--      struct dec_zschannel *zs_channel; /* Channel registers */
--      struct dec_zschannel *zs_chan_a;        /* A side registers */
--      unsigned char read_reg_zero;
--
--      char soft_carrier;  /* Use soft carrier on this channel */
--      char break_abort;   /* Is serial console in, so process brk/abrt */
--      struct zs_hook *hook;  /* Hook on this channel */
--      char is_cons;       /* Is this our console. */
--      unsigned char tx_active; /* character is being xmitted */
--      unsigned char tx_stopped; /* output is suspended */
--
--      /* We need to know the current clock divisor
--       * to read the bps rate the chip has currently
--       * loaded.
-+      struct dec_serial       *zs_next;       /* For IRQ servicing chain.  */
-+      struct dec_zschannel    *zs_channel;    /* Channel registers.  */
-+      struct dec_zschannel    *zs_chan_a;     /* A side registers.  */
-+      unsigned char           read_reg_zero;
-+
-+      struct dec_serial_hook  *hook;          /* Hook on this channel.  */
-+      int                     tty_break;      /* Set on BREAK condition.  */
-+      int                     is_cons;        /* Is this our console.  */
-+      int                     tx_active;      /* Char is being xmitted.  */
-+      int                     tx_stopped;     /* Output is suspended.  */
-+
-+      /*
-+       * We need to know the current clock divisor
-+       * to read the bps rate the chip has currently loaded.
-        */
--      unsigned char clk_divisor;  /* May be 1, 16, 32, or 64 */
--      int zs_baud;
-+      int                     clk_divisor;    /* May be 1, 16, 32, or 64.  */
-+      int                     zs_baud;
+       /* Maxine uses LK501 at the Access.Bus. */
+       if (!LK_IFACE)
+@@ -428,19 +426,15 @@
  
--      char change_needed;
-+      char                    change_needed;
+       printk(KERN_INFO "lk201: DECstation LK keyboard driver v0.05.\n");
  
-       int                     magic;
-       int                     baud_base;
-       int                     port;
-       int                     irq;
--      int                     flags;          /* defined in tty.h */
--      int                     type;           /* UART type */
-+      int                     flags;          /* Defined in tty.h.  */
-+      int                     type;           /* UART type.  */
-       struct tty_struct       *tty;
-       int                     read_status_mask;
-       int                     ignore_status_mask;
-       int                     timeout;
-       int                     xmit_fifo_size;
-       int                     custom_divisor;
--      int                     x_char; /* xon/xoff character */
-+      int                     x_char;         /* XON/XOFF character.  */
-       int                     close_delay;
-       unsigned short          closing_wait;
-       unsigned short          closing_wait2;
-       unsigned long           event;
-       unsigned long           last_active;
-       int                     line;
--      int                     count;      /* # of fd on device */
--      int                     blocked_open; /* # of blocked opens */
--      long                    session; /* Session of opening process */
--      long                    pgrp; /* pgrp of opening process */
-+      int                     count;          /* # of fds on device.  */
-+      int                     blocked_open;   /* # of blocked opens.  */
-+      long                    session;        /* Sess of opening process.  */
-+      long                    pgrp;           /* Pgrp of opening process.  */
-       unsigned char           *xmit_buf;
-       int                     xmit_head;
-       int                     xmit_tail;
-diff -Nur linux-2.4.29/drivers/usb/devio.c linux-mips/drivers/usb/devio.c
---- linux-2.4.29/drivers/usb/devio.c   2004-11-17 12:54:21.000000000 +0100
-+++ linux-mips/drivers/usb/devio.c     2005-03-26 11:47:35.208873156 +0100
-@@ -1132,6 +1132,8 @@
-                       /* ifno might usefully be passed ... */
-                        retval = driver->ioctl (ps->dev, ctrl.ioctl_code, buf);
-                       /* size = min_t(int, size, retval)? */
-+                      if (retval == -ENOIOCTLCMD)
-+                              retval = -ENOTTY;
-                }
-       }
+-      if (LK_IFACE_ZS) {
+-              /*
+-               * kbd_init_hw() is being called before
+-               * rs_init() so just register the kbd hook
+-               * and let zs_init do the rest :-)
+-               */
+-              if(!register_zs_hook(KEYB_LINE, &lk201_kbdhook))
+-                      unregister_zs_hook(KEYB_LINE);
+-      } else {
+-              /*
+-               * TODO: modify dz.c to allow similar hooks
+-               * for LK201 handling on DS2100, DS3100, and DS5000/200
+-               */
+-              printk(KERN_ERR "lk201: support for DZ11 not yet ready.\n");
+-      }
++      /*
++       * kbd_init_hw() is being called before
++       * rs_init() so just register the kbd hook
++       * and let zs_init do the rest :-)
++       */
++      if (LK_IFACE_ZS)
++              keyb_line = KEYB_LINE_ZS;
++      else
++              keyb_line = KEYB_LINE_DZ;
++      if (!register_dec_serial_hook(keyb_line, &lk201_hook))
++              unregister_dec_serial_hook(keyb_line);
+ }
+diff -Nur linux-2.4.29/drivers/tc/zs.c linux-mips/drivers/tc/zs.c
+--- linux-2.4.29/drivers/tc/zs.c       2005-01-19 15:10:05.000000000 +0100
++++ linux-mips/drivers/tc/zs.c 2004-12-27 05:13:50.000000000 +0100
+@@ -68,6 +68,8 @@
+ #include <asm/bitops.h>
+ #include <asm/uaccess.h>
+ #include <asm/bootinfo.h>
++#include <asm/dec/serial.h>
++
+ #ifdef CONFIG_DECSTATION
+ #include <asm/dec/interrupts.h>
+ #include <asm/dec/machtype.h>
+@@ -160,8 +162,8 @@
+ #ifdef CONFIG_SERIAL_DEC_CONSOLE
+ static struct console sercons;
+ #endif
+-#if defined(CONFIG_SERIAL_DEC_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) \
+-    && !defined(MODULE)
++#if defined(CONFIG_SERIAL_DEC_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) && \
++   !defined(MODULE)
+ static unsigned long break_pressed; /* break, really ... */
+ #endif
  
-@@ -1146,24 +1148,10 @@
-       return retval;
- }
+@@ -196,7 +198,6 @@
+ /*
+  * Debugging.
+  */
+-#undef SERIAL_DEBUG_INTR
+ #undef SERIAL_DEBUG_OPEN
+ #undef SERIAL_DEBUG_FLOW
+ #undef SERIAL_DEBUG_THROTTLE
+@@ -221,10 +222,6 @@
+ static struct termios *serial_termios[NUM_CHANNELS];
+ static struct termios *serial_termios_locked[NUM_CHANNELS];
  
--static int usbdev_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
-+static int usbdev_ioctl_exclusive(struct dev_state *ps, struct inode *inode,
-+                                unsigned int cmd, unsigned long arg)
- {
--      struct dev_state *ps = (struct dev_state *)file->private_data;
--      int ret = -ENOIOCTLCMD;
+-#ifndef MIN
+-#define MIN(a,b)      ((a) < (b) ? (a) : (b))
+-#endif
 -
--      if (!(file->f_mode & FMODE_WRITE))
--              return -EPERM;
--      down_read(&ps->devsem);
--      if (!ps->dev) {
--              up_read(&ps->devsem);
--              return -ENODEV;
--      }
+ /*
+  * tmp_buf is used as a temporary buffer by serial_write.  We need to
+  * lock it in case the copy_from_user blocks while swapping in a page,
+@@ -386,8 +383,6 @@
+  * -----------------------------------------------------------------------
+  */
+-static int tty_break; /* Set whenever BREAK condition is detected.  */
 -
--      /*
--       * grab device's exclusive_access mutex to prevent its driver from
--       * using this device while it is being accessed by us.
--       */
--      down(&ps->dev->exclusive_access);
-+      int ret;
+ /*
+  * This routine is used by the interrupt handler to schedule
+  * processing in the software interrupt portion of the driver.
+@@ -414,20 +409,15 @@
+               if (!tty && (!info->hook || !info->hook->rx_char))
+                       continue;
  
-       switch (cmd) {
-       case USBDEVFS_CONTROL:
-@@ -1194,14 +1182,6 @@
-                       inode->i_mtime = CURRENT_TIME;
-               break;
+-              if (tty_break) {
+-                      tty_break = 0;
+-#if defined(CONFIG_SERIAL_DEC_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) && !defined(MODULE)
+-                      if (info->line == sercons.index) {
+-                              if (!break_pressed) {
+-                                      break_pressed = jiffies;
+-                                      goto ignore_char;
+-                              }
+-                              break_pressed = 0;
+-                      }
+-#endif
++              flag = TTY_NORMAL;
++              if (info->tty_break) {
++                      info->tty_break = 0;
+                       flag = TTY_BREAK;
+                       if (info->flags & ZILOG_SAK)
+                               do_SAK(tty);
++                      /* Ignore the null char got when BREAK is removed.  */
++                      if (ch == 0)
++                              continue;
+               } else {
+                       if (stat & Rx_OVR) {
+                               flag = TTY_OVERRUN;
+@@ -435,20 +425,22 @@
+                               flag = TTY_FRAME;
+                       } else if (stat & PAR_ERR) {
+                               flag = TTY_PARITY;
+-                      } else
+-                              flag = 0;
+-                      if (flag)
++                      }
++                      if (flag != TTY_NORMAL)
+                               /* reset the error indication */
+                               write_zsreg(info->zs_channel, R0, ERR_RES);
+               }
  
--      case USBDEVFS_GETDRIVER:
--              ret = proc_getdriver(ps, (void *)arg);
--              break;
--
--      case USBDEVFS_CONNECTINFO:
--              ret = proc_connectinfo(ps, (void *)arg);
--              break;
+-#if defined(CONFIG_SERIAL_DEC_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) && !defined(MODULE)
++#if defined(CONFIG_SERIAL_DEC_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) && \
++   !defined(MODULE)
+               if (break_pressed && info->line == sercons.index) {
+-                      if (ch != 0 &&
+-                          time_before(jiffies, break_pressed + HZ*5)) {
++                      /* Ignore the null char got when BREAK is removed.  */
++                      if (ch == 0)
++                              continue;
++                      if (time_before(jiffies, break_pressed + HZ * 5)) {
+                               handle_sysrq(ch, regs, NULL, NULL);
+                               break_pressed = 0;
+-                              goto ignore_char;
++                              continue;
+                       }
+                       break_pressed = 0;
+               }
+@@ -459,23 +451,7 @@
+                       return;
+               }
+-              if (tty->flip.count >= TTY_FLIPBUF_SIZE) {
+-                      static int flip_buf_ovf;
+-                      ++flip_buf_ovf;
+-                      continue;
+-              }
+-              tty->flip.count++;
+-              {
+-                      static int flip_max_cnt;
+-                      if (flip_max_cnt < tty->flip.count)
+-                              flip_max_cnt = tty->flip.count;
+-              }
 -
-       case USBDEVFS_SETINTERFACE:
-               ret = proc_setintf(ps, (void *)arg);
-               break;
-@@ -1220,6 +1200,53 @@
-               ret = proc_unlinkurb(ps, (void *)arg);
-               break;
+-              *tty->flip.flag_buf_ptr++ = flag;
+-              *tty->flip.char_buf_ptr++ = ch;
+-#if defined(CONFIG_SERIAL_DEC_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) && !defined(MODULE)
+-      ignore_char:
+-#endif
++              tty_insert_flip_char(tty, ch, flag);
+       }
+       if (tty)
+               tty_flip_buffer_push(tty);
+@@ -517,11 +493,15 @@
+       /* Get status from Read Register 0 */
+       stat = read_zsreg(info->zs_channel, R0);
  
-+      case USBDEVFS_CLAIMINTERFACE:
-+              ret = proc_claiminterface(ps, (void *)arg);
-+              break;
-+
-+      case USBDEVFS_RELEASEINTERFACE:
-+              ret = proc_releaseinterface(ps, (void *)arg);
-+              break;
-+
-+      case USBDEVFS_IOCTL:
-+              ret = proc_ioctl(ps, (void *) arg);
-+              break;
-+
-+      default:
-+              ret = -ENOTTY;
-+      }
-+      return ret;
-+}
-+
-+static int usbdev_ioctl(struct inode *inode, struct file *file,
-+                      unsigned int cmd, unsigned long arg)
-+{
-+      struct dev_state *ps = file->private_data;
-+      int ret;
-+
-+      if (!(file->f_mode & FMODE_WRITE))
-+              return -EPERM;
-+      down_read(&ps->devsem);
-+      if (!ps->dev) {
-+              up_read(&ps->devsem);
-+              return -ENODEV;
-+      }
-+
-+      /*
-+       * Some ioctls don't touch the device and can be called without
-+       * grabbing its exclusive_access mutex; they are handled in this
-+       * switch.  Other ioctls which need exclusive_access are handled in
-+       * usbdev_ioctl_exclusive().
-+       */
-+      switch (cmd) {
-+      case USBDEVFS_GETDRIVER:
-+              ret = proc_getdriver(ps, (void *)arg);
-+              break;
-+
-+      case USBDEVFS_CONNECTINFO:
-+              ret = proc_connectinfo(ps, (void *)arg);
-+              break;
-+
-       case USBDEVFS_REAPURB:
-               ret = proc_reapurb(ps, (void *)arg);
-               break;
-@@ -1232,19 +1259,28 @@
-               ret = proc_disconnectsignal(ps, (void *)arg);
-               break;
+-      if (stat & BRK_ABRT) {
+-#ifdef SERIAL_DEBUG_INTR
+-              printk("handling break....");
++      if ((stat & BRK_ABRT) && !(info->read_reg_zero & BRK_ABRT)) {
++#if defined(CONFIG_SERIAL_DEC_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) && \
++   !defined(MODULE)
++              if (info->line == sercons.index) {
++                      if (!break_pressed)
++                              break_pressed = jiffies;
++              } else
+ #endif
+-              tty_break = 1;
++                      info->tty_break = 1;
+       }
  
-+      case USBDEVFS_CONTROL:
-+      case USBDEVFS_BULK:
-+      case USBDEVFS_RESETEP:
-+      case USBDEVFS_RESET:
-+      case USBDEVFS_CLEAR_HALT:
-+      case USBDEVFS_SETINTERFACE:
-+      case USBDEVFS_SETCONFIGURATION:
-+      case USBDEVFS_SUBMITURB:
-+      case USBDEVFS_DISCARDURB:
-       case USBDEVFS_CLAIMINTERFACE:
--              ret = proc_claiminterface(ps, (void *)arg);
--              break;
--
-       case USBDEVFS_RELEASEINTERFACE:
--              ret = proc_releaseinterface(ps, (void *)arg);
--              break;
--
-       case USBDEVFS_IOCTL:
--              ret = proc_ioctl(ps, (void *) arg);
-+              ret = -ERESTARTSYS;
-+              if (down_interruptible(&ps->dev->exclusive_access) == 0) {
-+                      ret = usbdev_ioctl_exclusive(ps, inode, cmd, arg);
-+                      up(&ps->dev->exclusive_access);
-+              }
-               break;
-+
-+      default:
-+              ret = -ENOTTY;
+       if (info->zs_channel != info->zs_chan_a) {
+@@ -957,7 +937,7 @@
+       save_flags(flags);
+       while (1) {
+               cli();
+-              c = MIN(count, MIN(SERIAL_XMIT_SIZE - info->xmit_cnt - 1,
++              c = min(count, min(SERIAL_XMIT_SIZE - info->xmit_cnt - 1,
+                                  SERIAL_XMIT_SIZE - info->xmit_head));
+               if (c <= 0)
+                       break;
+@@ -965,7 +945,7 @@
+               if (from_user) {
+                       down(&tmp_buf_sem);
+                       copy_from_user(tmp_buf, buf, c);
+-                      c = MIN(c, MIN(SERIAL_XMIT_SIZE - info->xmit_cnt - 1,
++                      c = min(c, min(SERIAL_XMIT_SIZE - info->xmit_cnt - 1,
+                                      SERIAL_XMIT_SIZE - info->xmit_head));
+                       memcpy(info->xmit_buf + info->xmit_head, tmp_buf, c);
+                       up(&tmp_buf_sem);
+@@ -1282,46 +1262,48 @@
        }
--      up(&ps->dev->exclusive_access);
-       up_read(&ps->devsem);
-       if (ret >= 0)
-               inode->i_atime = CURRENT_TIME;
-diff -Nur linux-2.4.29/drivers/usb/hid-core.c linux-mips/drivers/usb/hid-core.c
---- linux-2.4.29/drivers/usb/hid-core.c        2004-11-17 12:54:21.000000000 +0100
-+++ linux-mips/drivers/usb/hid-core.c  2005-03-26 11:47:35.374845916 +0100
-@@ -1064,18 +1064,31 @@
- static void hid_ctrl(struct urb *urb)
- {
-       struct hid_device *hid = urb->context;
-+      unsigned long flags;
  
-       if (urb->status)
-               warn("ctrl urb status %d received", urb->status);
+       switch (cmd) {
+-              case TIOCMGET:
+-                      error = verify_area(VERIFY_WRITE, (void *) arg,
+-                              sizeof(unsigned int));
+-                      if (error)
+-                              return error;
+-                      return get_modem_info(info, (unsigned int *) arg);
+-              case TIOCMBIS:
+-              case TIOCMBIC:
+-              case TIOCMSET:
+-                      return set_modem_info(info, cmd, (unsigned int *) arg);
+-              case TIOCGSERIAL:
+-                      error = verify_area(VERIFY_WRITE, (void *) arg,
+-                                              sizeof(struct serial_struct));
+-                      if (error)
+-                              return error;
+-                      return get_serial_info(info,
+-                                             (struct serial_struct *) arg);
+-              case TIOCSSERIAL:
+-                      return set_serial_info(info,
+-                                             (struct serial_struct *) arg);
+-              case TIOCSERGETLSR: /* Get line status register */
+-                      error = verify_area(VERIFY_WRITE, (void *) arg,
+-                              sizeof(unsigned int));
+-                      if (error)
+-                              return error;
+-                      else
+-                          return get_lsr_info(info, (unsigned int *) arg);
++      case TIOCMGET:
++              error = verify_area(VERIFY_WRITE, (void *)arg,
++                                  sizeof(unsigned int));
++              if (error)
++                      return error;
++              return get_modem_info(info, (unsigned int *)arg);
  
-+      spin_lock_irqsave(&hid->outlock, flags);
-+
-       hid->outtail = (hid->outtail + 1) & (HID_CONTROL_FIFO_SIZE - 1);
+-              case TIOCSERGSTRUCT:
+-                      error = verify_area(VERIFY_WRITE, (void *) arg,
+-                                              sizeof(struct dec_serial));
+-                      if (error)
+-                              return error;
+-                      copy_from_user((struct dec_serial *) arg,
+-                                     info, sizeof(struct dec_serial));
+-                      return 0;
++      case TIOCMBIS:
++      case TIOCMBIC:
++      case TIOCMSET:
++              return set_modem_info(info, cmd, (unsigned int *)arg);
  
--      if (hid->outhead != hid->outtail)
--              hid_submit_out(hid);
-+      if (hid->outhead != hid->outtail) {
-+              if (hid_submit_out(hid)) {
-+                      clear_bit(HID_OUT_RUNNING, &hid->iofl);
-+              }
-+              spin_unlock_irqrestore(&hid->outlock, flags);
-+              return;
-+      }
+-              default:
+-                      return -ENOIOCTLCMD;
+-              }
++      case TIOCGSERIAL:
++              error = verify_area(VERIFY_WRITE, (void *)arg,
++                                  sizeof(struct serial_struct));
++              if (error)
++                      return error;
++              return get_serial_info(info, (struct serial_struct *)arg);
 +
-+      clear_bit(HID_OUT_RUNNING, &hid->iofl);
-+      spin_unlock_irqrestore(&hid->outlock, flags);
- }
- void hid_write_report(struct hid_device *hid, struct hid_report *report)
- {
-+      unsigned long flags;
++      case TIOCSSERIAL:
++              return set_serial_info(info, (struct serial_struct *)arg);
 +
-       if (hid->report_enum[report->type].numbered) {
-               hid->out[hid->outhead].buffer[0] = report->id;
-               hid_output_report(report, hid->out[hid->outhead].buffer + 1);
-@@ -1087,13 +1100,18 @@
-       hid->out[hid->outhead].dr.wValue = cpu_to_le16(((report->type + 1) << 8) | report->id);
-+      spin_lock_irqsave(&hid->outlock, flags);
++      case TIOCSERGETLSR:                     /* Get line status register */
++              error = verify_area(VERIFY_WRITE, (void *)arg,
++                                  sizeof(unsigned int));
++              if (error)
++                      return error;
++              else
++                      return get_lsr_info(info, (unsigned int *)arg);
 +
-       hid->outhead = (hid->outhead + 1) & (HID_CONTROL_FIFO_SIZE - 1);
-       if (hid->outhead == hid->outtail)
-               hid->outtail = (hid->outtail + 1) & (HID_CONTROL_FIFO_SIZE - 1);
--      if (hid->urbout.status != -EINPROGRESS)
--              hid_submit_out(hid);
-+      if (!test_and_set_bit(HID_OUT_RUNNING, &hid->iofl))
-+              if (hid_submit_out(hid))
-+                      clear_bit(HID_OUT_RUNNING, &hid->iofl);
++      case TIOCSERGSTRUCT:
++              error = verify_area(VERIFY_WRITE, (void *)arg,
++                                  sizeof(struct dec_serial));
++              if (error)
++                      return error;
++              copy_from_user((struct dec_serial *)arg, info,
++                             sizeof(struct dec_serial));
++              return 0;
 +
-+      spin_unlock_irqrestore(&hid->outlock, flags);
++      default:
++              return -ENOIOCTLCMD;
++      }
+       return 0;
  }
  
- int hid_open(struct hid_device *hid)
-@@ -1333,6 +1351,8 @@
-               return NULL;
-       }
-+      spin_lock_init(&hid->outlock);
-+
-       hid->version = hdesc->bcdHID;
-       hid->country = hdesc->bCountryCode;
-       hid->dev = dev;
-diff -Nur linux-2.4.29/drivers/usb/hiddev.c linux-mips/drivers/usb/hiddev.c
---- linux-2.4.29/drivers/usb/hiddev.c  2004-08-08 01:26:05.000000000 +0200
-+++ linux-mips/drivers/usb/hiddev.c    2005-03-26 11:47:35.743785364 +0100
-@@ -328,6 +328,7 @@
-                               }
-                               
-                               schedule();
-+                              set_current_state(TASK_INTERRUPTIBLE);
-                       }
-                       set_current_state(TASK_RUNNING);
-diff -Nur linux-2.4.29/drivers/usb/hid.h linux-mips/drivers/usb/hid.h
---- linux-2.4.29/drivers/usb/hid.h     2003-08-25 13:44:42.000000000 +0200
-+++ linux-mips/drivers/usb/hid.h       2005-03-26 11:47:35.742785528 +0100
-@@ -302,6 +302,8 @@
- #define HID_CLAIMED_INPUT     1
- #define HID_CLAIMED_HIDDEV    2
-+#define HID_OUT_RUNNING               2
-+
- struct hid_input {
-       struct list_head list;
-       struct hid_report *report;
-@@ -322,12 +324,15 @@
-       struct usb_device *dev;                                         /* USB device */
-       int ifnum;                                                      /* USB interface number */
-+      unsigned long iofl;                                             /* I/O flags (CTRL_RUNNING, OUT_RUNNING) */
-+
-       struct urb urb;                                                 /* USB URB structure */
-       char buffer[HID_BUFFER_SIZE];                                   /* Rx buffer */
-       struct urb urbout;                                              /* Output URB */
-       struct hid_control_fifo out[HID_CONTROL_FIFO_SIZE];             /* Transmit buffer */
-       unsigned char outhead, outtail;                                 /* Tx buffer head & tail */
-+      spinlock_t outlock;                                             /* Output fifo spinlock */
-       unsigned claimed;                                               /* Claimed by hidinput, hiddev? */      
-       unsigned quirks;                                                /* Various quirks the device can pull on us */
-diff -Nur linux-2.4.29/drivers/usb/serial/ftdi_sio.c linux-mips/drivers/usb/serial/ftdi_sio.c
---- linux-2.4.29/drivers/usb/serial/ftdi_sio.c 2005-01-19 15:10:07.000000000 +0100
-+++ linux-mips/drivers/usb/serial/ftdi_sio.c   2005-03-26 11:47:35.754783559 +0100
-@@ -737,8 +737,6 @@
- };
--
--
- static struct usb_serial_device_type ftdi_userdev_device = {
-       .owner =                THIS_MODULE,
-       .name =                 "FTDI SIO compatible",
-@@ -1240,15 +1238,6 @@
- } /* ftdi_HE_TIRA1_startup */
+@@ -1446,7 +1428,8 @@
+ static void rs_wait_until_sent(struct tty_struct *tty, int timeout)
+ {
+       struct dec_serial *info = (struct dec_serial *) tty->driver_data;
+-      unsigned long orig_jiffies, char_time;
++      unsigned long orig_jiffies;
++      int char_time;
  
+       if (serial_paranoia_check(info, tty->device, "rs_wait_until_sent"))
+               return;
+@@ -1462,7 +1445,7 @@
+       if (char_time == 0)
+               char_time = 1;
+       if (timeout)
+-              char_time = MIN(char_time, timeout);
++              char_time = min(char_time, timeout);
+       while ((read_zsreg(info->zs_channel, 1) & Tx_BUF_EMP) == 0) {
+               current->state = TASK_INTERRUPTIBLE;
+               schedule_timeout(char_time);
+@@ -1714,7 +1697,7 @@
  
--/* ftdi_shutdown is called from usbserial:usb_serial_disconnect 
-- *   it is called when the usb device is disconnected
-- *
-- *   usbserial:usb_serial_disconnect
-- *      calls __serial_close for each open of the port
-- *      shutdown is called then (ie ftdi_shutdown)
-- */
--
--
- /* Startup for the 8U232AM chip */
- static int ftdi_userdev_startup (struct usb_serial *serial)
+ static void __init show_serial_version(void)
  {
-@@ -1273,6 +1262,14 @@
+-      printk("DECstation Z8530 serial driver version 0.08\n");
++      printk("DECstation Z8530 serial driver version 0.09\n");
  }
  
-+/* ftdi_shutdown is called from usbserial:usb_serial_disconnect 
-+ *   it is called when the usb device is disconnected
-+ *
-+ *   usbserial:usb_serial_disconnect
-+ *      calls __serial_close for each open of the port
-+ *      shutdown is called then (ie ftdi_shutdown)
-+ */
-+
- static void ftdi_shutdown (struct usb_serial *serial)
- { /* ftdi_shutdown */
-       
-@@ -1382,6 +1379,7 @@
-       struct usb_serial *serial;
-       unsigned int c_cflag = port->tty->termios->c_cflag;
-       char buf[1];
-+      int err;
-       dbg("%s", __FUNCTION__);
-@@ -1412,8 +1410,9 @@
-               /* shutdown our bulk read */
-               if (port->read_urb) {
--                      if(usb_unlink_urb (port->read_urb)<0)
--                              err("Error unlinking urb");
-+                      err = usb_unlink_urb (port->read_urb);
-+                      if (err < 0 && err != -ENODEV)
-+                              err("Error unlinking urb (%d)", err);
-               }
-               /* unlink the running write urbs */
-diff -Nur linux-2.4.29/drivers/usb/serial/mct_u232.c linux-mips/drivers/usb/serial/mct_u232.c
---- linux-2.4.29/drivers/usb/serial/mct_u232.c 2005-01-19 15:10:08.000000000 +0100
-+++ linux-mips/drivers/usb/serial/mct_u232.c   2005-03-26 11:47:35.755783395 +0100
-@@ -86,26 +86,14 @@
- #include "usb-serial.h"
- #include "mct_u232.h"
--
- /*
-  * Version Information
+ /*  Initialize Z8530s zs_channels
+@@ -1994,8 +1977,9 @@
+  * polling I/O routines
   */
--#define DRIVER_VERSION "v1.2"
-+#define DRIVER_VERSION "z2.0"         /* Linux in-kernel version */
- #define DRIVER_AUTHOR "Wolfgang Grandegger <wolfgang@ces.ch>"
- #define DRIVER_DESC "Magic Control Technology USB-RS232 converter driver"
+ static int
+-zs_poll_tx_char(struct dec_serial *info, unsigned char ch)
++zs_poll_tx_char(void *handle, unsigned char ch)
+ {
++      struct dec_serial *info = handle;
+       struct dec_zschannel *chan = info->zs_channel;
+       int    ret;
  
- /*
-- * Some not properly written applications do not handle the return code of
-- * write() correctly. This can result in character losses. A work-a-round
-- * can be compiled in with the following definition. This work-a-round
-- * should _NOT_ be part of an 'official' kernel release, of course!
-- */
--#undef FIX_WRITE_RETURN_CODE_PROBLEM
--#ifdef FIX_WRITE_RETURN_CODE_PROBLEM
--static int write_blocking; /* disabled by default */
--#endif
--
--/*
-  * Function prototypes
-  */
- static int  mct_u232_startup           (struct usb_serial *serial);
-@@ -114,13 +102,6 @@
-                                         struct file *filp);
- static void mct_u232_close             (struct usb_serial_port *port,
-                                         struct file *filp);
--#ifdef FIX_WRITE_RETURN_CODE_PROBLEM
--static int  mct_u232_write             (struct usb_serial_port *port,
--                                        int from_user,
--                                        const unsigned char *buf,
--                                        int count);
--static void mct_u232_write_bulk_callback (struct urb *urb);
--#endif
- static void mct_u232_read_int_callback   (struct urb *urb);
- static void mct_u232_set_termios         (struct usb_serial_port *port,
-                                         struct termios * old);
-@@ -147,7 +128,7 @@
- static struct usb_serial_device_type mct_u232_device = {
-       .owner =             THIS_MODULE,
--      .name =              "Magic Control Technology USB-RS232",
-+      .name =              "MCT U232",
-       .id_table =          id_table_combined,
-       .num_interrupt_in =  2,
-       .num_bulk_in =       0,
-@@ -155,10 +136,6 @@
-       .num_ports =         1,
-       .open =              mct_u232_open,
-       .close =             mct_u232_close,
--#ifdef FIX_WRITE_RETURN_CODE_PROBLEM
--      .write =             mct_u232_write,
--      .write_bulk_callback = mct_u232_write_bulk_callback,
--#endif
-       .read_int_callback = mct_u232_read_int_callback,
-       .ioctl =             mct_u232_ioctl,
-       .set_termios =       mct_u232_set_termios,
-@@ -167,9 +144,14 @@
-       .shutdown =          mct_u232_shutdown,
- };
+@@ -2017,8 +2001,9 @@
+ }
  
-+struct mct_u232_interval_kludge {
-+      int ecnt;                       /* Error counter */
-+      int ibase;                      /* Initial interval value */
-+};
+ static int
+-zs_poll_rx_char(struct dec_serial *info)
++zs_poll_rx_char(void *handle)
+ {
++      struct dec_serial *info = handle;
+         struct dec_zschannel *chan = info->zs_channel;
+         int    ret;
  
- struct mct_u232_private {
-       spinlock_t lock;
-+      struct mct_u232_interval_kludge ik[2];
-       unsigned int         control_state; /* Modem Line Setting (TIOCM) */
-       unsigned char        last_lcr;      /* Line Control Register */
-       unsigned char        last_lsr;      /* Line Status Register */
-@@ -359,17 +341,13 @@
-       struct mct_u232_private *priv;
-       struct usb_serial_port *port, *rport;
--      /* allocate the private data structure */
-       priv = kmalloc(sizeof(struct mct_u232_private), GFP_KERNEL);
-       if (!priv)
-               return -ENOMEM;
--      /* set initial values for control structures */
-+      memset(priv, 0, sizeof(struct mct_u232_private));
-       spin_lock_init(&priv->lock);
--      priv->control_state = 0;
--      priv->last_lsr = 0;
--      priv->last_msr = 0;
-       serial->port->private = priv;
-- 
-+
-       init_waitqueue_head(&serial->port->write_wait);
+@@ -2038,12 +2023,13 @@
+               return -ENODEV;
+ }
  
-       /* Puh, that's dirty */
-@@ -383,20 +361,27 @@
-       rport->interrupt_in_urb = NULL;
-       port->read_urb->context = port;
+-unsigned int register_zs_hook(unsigned int channel, struct zs_hook *hook)
++int register_zs_hook(unsigned int channel, struct dec_serial_hook *hook)
+ {
+       struct dec_serial *info = &zs_soft[channel];
  
-+      priv->ik[0].ibase = port->read_urb->interval;
-+      priv->ik[1].ibase = port->interrupt_in_urb->interval;
-+
-       return (0);
- } /* mct_u232_startup */
+       if (info->hook) {
+-              printk(__FUNCTION__": line %d has already a hook registered\n", channel);
++              printk("%s: line %d has already a hook registered\n",
++                     __FUNCTION__, channel);
  
+               return 0;
+       } else {
+@@ -2055,7 +2041,7 @@
+       }
+ }
  
- static void mct_u232_shutdown (struct usb_serial *serial)
+-unsigned int unregister_zs_hook(unsigned int channel)
++int unregister_zs_hook(unsigned int channel)
  {
-+      struct mct_u232_private *priv;
-       int i;
-       
-       dbg("%s", __FUNCTION__);
-       for (i=0; i < serial->num_ports; ++i) {
-               /* My special items, the standard routines free my urbs */
--              if (serial->port[i].private)
--                      kfree(serial->port[i].private);
-+              priv = serial->port[i].private;
-+              if (priv) {
-+                      serial->port[i].private = NULL;
-+                      kfree(priv);
-+              }
-       }
- } /* mct_u232_shutdown */
-@@ -448,16 +433,20 @@
-       spin_unlock_irqrestore(&priv->lock, flags);
-       port->read_urb->dev = port->serial->dev;
-+      port->read_urb->interval = priv->ik[0].ibase;
-       retval = usb_submit_urb(port->read_urb);
-       if (retval) {
--              err("usb_submit_urb(read bulk) failed");
-+              err("usb_submit_urb(read bulk) failed pipe 0x%x err %d",
-+                  port->read_urb->pipe, retval);
-               goto exit;
-       }
+       struct dec_serial *info = &zs_soft[channel];
  
-       port->interrupt_in_urb->dev = port->serial->dev;
-+      port->interrupt_in_urb->interval = priv->ik[1].ibase;
-       retval = usb_submit_urb(port->interrupt_in_urb);
-       if (retval)
--              err(" usb_submit_urb(read int) failed");
-+              err(" usb_submit_urb(read int) failed pipe 0x%x err %d",
-+                  port->interrupt_in_urb->pipe, retval);
+@@ -2063,8 +2049,8 @@
+                 info->hook = NULL;
+                 return 1;
+         } else {
+-                printk(__FUNCTION__": trying to unregister hook on line %d,"
+-                       " but none is registered\n", channel);
++                printk("%s: trying to unregister hook on line %d,"
++                       " but none is registered\n", __FUNCTION__, channel);
+                 return 0;
+         }
+ }
+@@ -2319,22 +2305,23 @@
+       write_zsreg(chan, 9, nine);
+ }
  
- exit:
+-static int kgdbhook_init_channel(struct dec_serial* info)
++static int kgdbhook_init_channel(void *handle)
+ {
        return 0;
-@@ -476,109 +465,22 @@
-       }
- } /* mct_u232_close */
+ }
  
--
--#ifdef FIX_WRITE_RETURN_CODE_PROBLEM
--/* The generic routines work fine otherwise */
--
--static int mct_u232_write (struct usb_serial_port *port, int from_user,
--                         const unsigned char *buf, int count)
-+static void mct_u232_error_step (struct urb *urb,
-+    struct mct_u232_private *priv, int n)
+-static void kgdbhook_init_info(struct dec_serial* info)
++static void kgdbhook_init_info(void *handle)
  {
--      struct usb_serial *serial = port->serial;
--      int result, bytes_sent, size;
--
--      dbg("%s - port %d", __FUNCTION__, port->number);
--
--      if (count == 0) {
--              dbg("%s - write request of 0 bytes", __FUNCTION__);
--              return (0);
--      }
--
--      /* only do something if we have a bulk out endpoint */
--      if (!serial->num_bulk_out)
--              return(0);;
--      
--      /* another write is still pending? */
--      if (port->write_urb->status == -EINPROGRESS) {
--              dbg("%s - already writing", __FUNCTION__);
--              return (0);
--      }
--              
--      bytes_sent = 0;
--      while (count > 0) {
--              size = (count > port->bulk_out_size) ? port->bulk_out_size : count;
--              
--              usb_serial_debug_data (__FILE__, __FUNCTION__, size, buf);
--              
--              if (from_user) {
--                      if (copy_from_user(port->write_urb->transfer_buffer, buf, size)) {
--                              return -EFAULT;
--                      }
--              }
--              else {
--                      memcpy (port->write_urb->transfer_buffer, buf, size);
--              }
--              
--              /* set up our urb */
--              FILL_BULK_URB(port->write_urb, serial->dev,
--                            usb_sndbulkpipe(serial->dev,
--                                            port->bulk_out_endpointAddress),
--                            port->write_urb->transfer_buffer, size,
--                            ((serial->type->write_bulk_callback) ?
--                             serial->type->write_bulk_callback :
--                             mct_u232_write_bulk_callback),
--                            port);
--              
--              /* send the data out the bulk port */
--              result = usb_submit_urb(port->write_urb);
--              if (result) {
--                      err("%s - failed submitting write urb, error %d", __FUNCTION__, result);
--                      return result;
--              }
--
--              bytes_sent += size;
--              if (write_blocking)
--                      interruptible_sleep_on(&port->write_wait);
--              else
--                      break;
--
--              buf += size;
--              count -= size;
--      }
--      
--      return bytes_sent;
--} /* mct_u232_write */
--
--static void mct_u232_write_bulk_callback (struct urb *urb)
--{
--      struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
--      struct usb_serial *serial = port->serial;
--              struct tty_struct *tty = port->tty;
--
--      dbg("%s - port %d", __FUNCTION__, port->number);
--      
--      if (!serial) {
--              dbg("%s - bad serial pointer, exiting", __FUNCTION__);
--              return;
--      }
-+      struct mct_u232_interval_kludge *ikp = &priv->ik[n];
--      if (urb->status) {
--              dbg("%s - nonzero write bulk status received: %d", __FUNCTION__,
--                  urb->status);
--              return;
--      }
--
--      if (write_blocking) {
--              wake_up_interruptible(&port->write_wait);
--              tty_wakeup(tty);
-+      if (ikp->ecnt >= 2) {
-+              if (urb->interval)
-+                      err("%s - too many errors: "
-+                          "status %d pipe 0x%x interval %d",
-+                          __FUNCTION__,
-+                          urb->status, urb->pipe, urb->interval);
-+              urb->interval = 0;
-       } else {
--              /* from generic_write_bulk_callback */
--              queue_task(&port->tqueue, &tq_immediate);
--              mark_bh(IMMEDIATE_BH);
-+              ++ikp->ecnt;
-       }
--
--      return;
--} /* mct_u232_write_bulk_callback */
--#endif
-+}
+ }
  
- static void mct_u232_read_int_callback (struct urb *urb)
+-static void kgdbhook_rx_char(struct dec_serial* info,
+-                           unsigned char ch, unsigned char stat)
++static void kgdbhook_rx_char(void *handle, unsigned char ch, unsigned char fl)
  {
-@@ -589,21 +491,37 @@
-       unsigned char *data = urb->transfer_buffer;
-       unsigned long flags;
--        dbg("%s - port %d", __FUNCTION__, port->number);
--
-       /* The urb might have been killed. */
-         if (urb->status) {
--                dbg("%s - nonzero read bulk status received: %d", __FUNCTION__,
--                  urb->status);
-+              dbg("%s - nonzero status %d, pipe 0x%x flags 0x%x interval %d",
-+                  __FUNCTION__,
-+                  urb->status, urb->pipe, urb->transfer_flags, urb->interval);
-+              /*
-+               * The bad stuff happens when a device is disconnected.
-+               * This can cause us to spin while trying to resubmit.
-+               * Unfortunately, in kernel 2.4 error codes are wildly
-+               * different between controllers, so the status is useless.
-+               * Instead we just refuse to spin too much.
-+               */
-+              if (urb == port->read_urb)
-+                      mct_u232_error_step(urb, priv, 0);
-+              if (urb == port->interrupt_in_urb)
-+                      mct_u232_error_step(urb, priv, 1);
-                 return;
-         }
-       if (!serial) {
-               dbg("%s - bad serial pointer, exiting", __FUNCTION__);
-               return;
-       }
--      
++      struct dec_serial *info = handle;
 +
-+        dbg("%s - port %d", __FUNCTION__, port->number);
-       usb_serial_debug_data (__FILE__, __FUNCTION__, urb->actual_length, data);
++      if (fl != TTY_NORMAL)
++              return;
+       if (ch == 0x03 || ch == '$')
+               breakpoint();
+-      if (stat & (Rx_OVR|FRM_ERR|PAR_ERR))
+-              write_zsreg(info->zs_channel, 0, ERR_RES);
+ }
+ /* This sets up the serial port we're using, and turns on
+@@ -2360,11 +2347,11 @@
+  * for /dev/ttyb which is determined in setup_arch() from the
+  * boot command line flags.
+  */
+-struct zs_hook zs_kgdbhook = {
+-      init_channel : kgdbhook_init_channel,
+-      init_info    : kgdbhook_init_info,
+-      cflags       : B38400|CS8|CLOCAL,
+-      rx_char      : kgdbhook_rx_char,
++struct dec_serial_hook zs_kgdbhook = {
++      .init_channel   = kgdbhook_init_channel,
++      .init_info      = kgdbhook_init_info,
++      .rx_char        = kgdbhook_rx_char,
++      .cflags         = B38400 | CS8 | CLOCAL,
+ }
+ void __init zs_kgdb_hook(int tty_num)
+diff -Nur linux-2.4.29/drivers/tc/zs.h linux-mips/drivers/tc/zs.h
+--- linux-2.4.29/drivers/tc/zs.h       2004-02-18 14:36:31.000000000 +0100
++++ linux-mips/drivers/tc/zs.h 2004-07-01 15:28:54.000000000 +0200
+@@ -1,14 +1,18 @@
+ /*
+- * macserial.h: Definitions for the Macintosh Z8530 serial driver.
++ * drivers/tc/zs.h: Definitions for the DECstation Z85C30 serial driver.
+  *
+  * Adapted from drivers/sbus/char/sunserial.h by Paul Mackerras.
++ * Adapted from drivers/macintosh/macserial.h by Harald Koerfgen.
+  *
+  * Copyright (C) 1996 Paul Mackerras (Paul.Mackerras@cs.anu.edu.au)
+  * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
++ * Copyright (C) 2004  Maciej W. Rozycki
+  */
+ #ifndef _DECSERIAL_H
+ #define _DECSERIAL_H
  
-+      if (urb == port->read_urb)
-+              priv->ik[0].ecnt = 0;
-+      if (urb == port->interrupt_in_urb)
-+              priv->ik[1].ecnt = 0;
++#include <asm/dec/serial.h>
 +
-       /*
-        * Work-a-round: handle the 'usual' bulk-in pipe here
-        */
-@@ -660,7 +578,6 @@
-       /* INT urbs are automatically re-submitted */
- } /* mct_u232_read_int_callback */
--
- static void mct_u232_set_termios (struct usb_serial_port *port,
-                                 struct termios *old_termios)
- {
-@@ -781,6 +698,21 @@
- } /* mct_u232_break_ctl */
+ #define NUM_ZSREGS    16
  
+ struct serial_struct {
+@@ -89,63 +93,50 @@
+       unsigned char curregs[NUM_ZSREGS];
+ };
  
-+static int mct_u232_tiocmget (struct usb_serial_port *port, struct file *file)
-+{
-+      struct mct_u232_private *priv = (struct mct_u232_private *)port->private;
-+      unsigned int control_state;
-+      unsigned long flags;
-+      
-+      dbg("%s", __FUNCTION__);
-+
-+      spin_lock_irqsave(&priv->lock, flags);
-+      control_state = priv->control_state;
-+      spin_unlock_irqrestore(&priv->lock, flags);
+-struct dec_serial;
+-
+-struct zs_hook {
+-      int (*init_channel)(struct dec_serial* info);
+-      void (*init_info)(struct dec_serial* info);
+-      void (*rx_char)(unsigned char ch, unsigned char stat);
+-      int  (*poll_rx_char)(struct dec_serial* info);
+-      int  (*poll_tx_char)(struct dec_serial* info,
+-                           unsigned char ch);
+-      unsigned cflags;
+-};
+-
+ struct dec_serial {
+-      struct dec_serial *zs_next;     /* For IRQ servicing chain */
+-      struct dec_zschannel *zs_channel; /* Channel registers */
+-      struct dec_zschannel *zs_chan_a;        /* A side registers */
+-      unsigned char read_reg_zero;
+-
+-      char soft_carrier;  /* Use soft carrier on this channel */
+-      char break_abort;   /* Is serial console in, so process brk/abrt */
+-      struct zs_hook *hook;  /* Hook on this channel */
+-      char is_cons;       /* Is this our console. */
+-      unsigned char tx_active; /* character is being xmitted */
+-      unsigned char tx_stopped; /* output is suspended */
+-
+-      /* We need to know the current clock divisor
+-       * to read the bps rate the chip has currently
+-       * loaded.
++      struct dec_serial       *zs_next;       /* For IRQ servicing chain.  */
++      struct dec_zschannel    *zs_channel;    /* Channel registers.  */
++      struct dec_zschannel    *zs_chan_a;     /* A side registers.  */
++      unsigned char           read_reg_zero;
 +
-+      return control_state;
-+}
++      struct dec_serial_hook  *hook;          /* Hook on this channel.  */
++      int                     tty_break;      /* Set on BREAK condition.  */
++      int                     is_cons;        /* Is this our console.  */
++      int                     tx_active;      /* Char is being xmitted.  */
++      int                     tx_stopped;     /* Output is suspended.  */
 +
- static int mct_u232_ioctl (struct usb_serial_port *port, struct file * file,
-                          unsigned int cmd, unsigned long arg)
- {
-@@ -794,8 +726,8 @@
-       /* Based on code from acm.c and others */
-       switch (cmd) {
-       case TIOCMGET:
--              return put_user(priv->control_state, (unsigned long *) arg);
--              break;
-+              mask = mct_u232_tiocmget(port, file);
-+              return put_user(mask, (unsigned long *) arg);
-       case TIOCMSET: /* Turns on and off the lines as specified by the mask */
-       case TIOCMBIS: /* turns on (Sets) the lines as specified by the mask */
-@@ -865,12 +797,5 @@
- MODULE_DESCRIPTION( DRIVER_DESC );
- MODULE_LICENSE("GPL");
++      /*
++       * We need to know the current clock divisor
++       * to read the bps rate the chip has currently loaded.
+        */
+-      unsigned char clk_divisor;  /* May be 1, 16, 32, or 64 */
+-      int zs_baud;
++      int                     clk_divisor;    /* May be 1, 16, 32, or 64.  */
++      int                     zs_baud;
  
--#ifdef FIX_WRITE_RETURN_CODE_PROBLEM
--MODULE_PARM(write_blocking, "i");
--MODULE_PARM_DESC(write_blocking, 
--               "The write function will block to write out all data");
--#endif
--
- MODULE_PARM(debug, "i");
- MODULE_PARM_DESC(debug, "Debug enabled or not");
--
-diff -Nur linux-2.4.29/drivers/usb/storage/transport.c linux-mips/drivers/usb/storage/transport.c
---- linux-2.4.29/drivers/usb/storage/transport.c       2004-11-17 12:54:21.000000000 +0100
-+++ linux-mips/drivers/usb/storage/transport.c 2005-03-26 11:47:35.757783067 +0100
-@@ -1181,6 +1181,13 @@
-       /* if the command transfered well, then we go to the data stage */
-       if (result == 0) {
-+
-+              /* Genesys Logic interface chips need a 100us delay between
-+               * the command phase and the data phase.  Some systems need
-+               * even more, probably because of clock rate inaccuracies. */
-+              if (us->pusb_dev->descriptor.idVendor == USB_VENDOR_ID_GENESYS)
-+                      udelay(110);
-+
-               /* send/receive data payload, if there is any */
-               if (bcb->DataTransferLength) {
-                       usb_stor_transfer(srb, us);
-diff -Nur linux-2.4.29/drivers/usb/storage/usb.c linux-mips/drivers/usb/storage/usb.c
---- linux-2.4.29/drivers/usb/storage/usb.c     2004-11-17 12:54:21.000000000 +0100
-+++ linux-mips/drivers/usb/storage/usb.c       2005-03-26 11:47:35.758782903 +0100
-@@ -996,6 +996,15 @@
-                */
-               ss->htmplt.proc_dir = (void *)ss; 
+-      char change_needed;
++      char                    change_needed;
  
-+              /* According to the technical support people at Genesys Logic,
-+               * devices using their chips have problems transferring more
-+               * than 32 KB at a time.  In practice people have found that
-+               * 64 KB works okay and that's what Windows does.  But we'll
-+               * be conservative.
-+               */
-+              if (ss->pusb_dev->descriptor.idVendor == USB_VENDOR_ID_GENESYS)
-+                      ss->htmplt.max_sectors = 64;
-+
-               /* Just before we start our control thread, initialize
-                * the device if it needs initialization */
-               if (unusual_dev && unusual_dev->initFunction)
-diff -Nur linux-2.4.29/drivers/usb/storage/usb.h linux-mips/drivers/usb/storage/usb.h
---- linux-2.4.29/drivers/usb/storage/usb.h     2004-08-08 01:26:05.000000000 +0200
-+++ linux-mips/drivers/usb/storage/usb.h       2005-03-26 11:47:35.759782739 +0100
-@@ -193,4 +193,7 @@
- /* Function to fill an inquiry response. See usb.c for details */
- extern void fill_inquiry_response(struct us_data *us,
-       unsigned char *data, unsigned int data_len);
-+
-+/* Vendor ID list for devices that require special handling */
-+#define USB_VENDOR_ID_GENESYS         0x05e3  /* Genesys Logic */
- #endif
+       int                     magic;
+       int                     baud_base;
+       int                     port;
+       int                     irq;
+-      int                     flags;          /* defined in tty.h */
+-      int                     type;           /* UART type */
++      int                     flags;          /* Defined in tty.h.  */
++      int                     type;           /* UART type.  */
+       struct tty_struct       *tty;
+       int                     read_status_mask;
+       int                     ignore_status_mask;
+       int                     timeout;
+       int                     xmit_fifo_size;
+       int                     custom_divisor;
+-      int                     x_char; /* xon/xoff character */
++      int                     x_char;         /* XON/XOFF character.  */
+       int                     close_delay;
+       unsigned short          closing_wait;
+       unsigned short          closing_wait2;
+       unsigned long           event;
+       unsigned long           last_active;
+       int                     line;
+-      int                     count;      /* # of fd on device */
+-      int                     blocked_open; /* # of blocked opens */
+-      long                    session; /* Session of opening process */
+-      long                    pgrp; /* pgrp of opening process */
++      int                     count;          /* # of fds on device.  */
++      int                     blocked_open;   /* # of blocked opens.  */
++      long                    session;        /* Sess of opening process.  */
++      long                    pgrp;           /* Pgrp of opening process.  */
+       unsigned char           *xmit_buf;
+       int                     xmit_head;
+       int                     xmit_tail;
 diff -Nur linux-2.4.29/drivers/video/au1200fb.c linux-mips/drivers/video/au1200fb.c
 --- linux-2.4.29/drivers/video/au1200fb.c      1970-01-01 01:00:00.000000000 +0100
 +++ linux-mips/drivers/video/au1200fb.c        2005-03-13 09:04:16.000000000 +0100
@@ -32194,7 +21113,7 @@ diff -Nur linux-2.4.29/drivers/video/au1200fb.h linux-mips/drivers/video/au1200f
 +#endif /* _AU1200LCD_H */
 diff -Nur linux-2.4.29/drivers/video/Config.in linux-mips/drivers/video/Config.in
 --- linux-2.4.29/drivers/video/Config.in       2004-02-18 14:36:31.000000000 +0100
-+++ linux-mips/drivers/video/Config.in 2005-03-26 11:47:35.761782411 +0100
++++ linux-mips/drivers/video/Config.in 2005-02-11 22:16:44.000000000 +0100
 @@ -87,8 +87,8 @@
     if [ "$CONFIG_HP300" = "y" ]; then
        define_bool CONFIG_FB_HP300 y
@@ -32236,7 +21155,7 @@ diff -Nur linux-2.4.29/drivers/video/Config.in linux-mips/drivers/video/Config.i
     fi
 diff -Nur linux-2.4.29/drivers/video/fbmem.c linux-mips/drivers/video/fbmem.c
 --- linux-2.4.29/drivers/video/fbmem.c 2005-01-19 15:10:09.000000000 +0100
-+++ linux-mips/drivers/video/fbmem.c   2005-03-26 11:47:36.031738105 +0100
++++ linux-mips/drivers/video/fbmem.c   2005-02-11 22:16:44.000000000 +0100
 @@ -139,6 +139,8 @@
  extern int e1356fb_setup(char*);
  extern int au1100fb_init(void);
@@ -32537,7 +21456,7 @@ diff -Nur linux-2.4.29/drivers/video/ims332.h linux-mips/drivers/video/ims332.h
 +}
 diff -Nur linux-2.4.29/drivers/video/Makefile linux-mips/drivers/video/Makefile
 --- linux-2.4.29/drivers/video/Makefile        2004-02-18 14:36:31.000000000 +0100
-+++ linux-mips/drivers/video/Makefile  2005-03-26 11:47:35.762782246 +0100
++++ linux-mips/drivers/video/Makefile  2005-02-11 22:16:44.000000000 +0100
 @@ -87,6 +87,7 @@
  obj-$(CONFIG_FB_MAXINE)           += maxinefb.o
  obj-$(CONFIG_FB_TX3912)           += tx3912fb.o
@@ -33025,672 +21944,20 @@ diff -Nur linux-2.4.29/fs/binfmt_elf.c linux-mips/fs/binfmt_elf.c
 +              /* Executables without an interpreter also need a personality  */
 +              SET_PERSONALITY(elf_ex, ibcs2_interpreter);
        }
-       /* Flush all traces of the currently running executable */
-@@ -1208,7 +1211,11 @@
-       elf.e_entry = 0;
-       elf.e_phoff = sizeof(elf);
-       elf.e_shoff = 0;
-+#ifdef ELF_CORE_EFLAGS
-+      elf.e_flags = ELF_CORE_EFLAGS;
-+#else
-       elf.e_flags = 0;
-+#endif
-       elf.e_ehsize = sizeof(elf);
-       elf.e_phentsize = sizeof(struct elf_phdr);
-       elf.e_phnum = segs+1;           /* Include notes */
-diff -Nur linux-2.4.29/fs/ext3/fsync.c linux-mips/fs/ext3/fsync.c
---- linux-2.4.29/fs/ext3/fsync.c       2002-11-29 00:53:15.000000000 +0100
-+++ linux-mips/fs/ext3/fsync.c 2005-03-26 11:47:36.070731705 +0100
-@@ -69,7 +69,7 @@
-       if (test_opt(inode->i_sb, DATA_FLAGS) == EXT3_MOUNT_WRITEBACK_DATA)
-               ret |= fsync_inode_data_buffers(inode);
--      ext3_force_commit(inode->i_sb);
-+      ret |= ext3_force_commit(inode->i_sb);
-       return ret;
- }
-diff -Nur linux-2.4.29/fs/ext3/super.c linux-mips/fs/ext3/super.c
---- linux-2.4.29/fs/ext3/super.c       2004-11-17 12:54:21.000000000 +0100
-+++ linux-mips/fs/ext3/super.c 2005-03-26 11:47:36.071731541 +0100
-@@ -1608,12 +1608,13 @@
- static int ext3_sync_fs(struct super_block *sb)
- {
-+      int err;
-       tid_t target;
-       
-       sb->s_dirt = 0;
-       target = log_start_commit(EXT3_SB(sb)->s_journal, NULL);
--      log_wait_commit(EXT3_SB(sb)->s_journal, target);
--      return 0;
-+      err = log_wait_commit(EXT3_SB(sb)->s_journal, target);
-+      return err;
- }
- /*
-diff -Nur linux-2.4.29/fs/file_table.c linux-mips/fs/file_table.c
---- linux-2.4.29/fs/file_table.c       2004-11-17 12:54:21.000000000 +0100
-+++ linux-mips/fs/file_table.c 2005-03-26 11:47:36.063732854 +0100
-@@ -46,6 +46,7 @@
-               f->f_version = ++event;
-               f->f_uid = current->fsuid;
-               f->f_gid = current->fsgid;
-+              f->f_maxcount = INT_MAX;
-               list_add(&f->f_list, &anon_list);
-               file_list_unlock();
-               return f;
-@@ -91,6 +92,8 @@
-       filp->f_uid    = current->fsuid;
-       filp->f_gid    = current->fsgid;
-       filp->f_op     = dentry->d_inode->i_fop;
-+      filp->f_maxcount = INT_MAX;
-+
-       if (filp->f_op->open)
-               return filp->f_op->open(dentry->d_inode, filp);
-       else
-diff -Nur linux-2.4.29/fs/jbd/commit.c linux-mips/fs/jbd/commit.c
---- linux-2.4.29/fs/jbd/commit.c       2004-02-18 14:36:31.000000000 +0100
-+++ linux-mips/fs/jbd/commit.c 2005-03-26 11:47:36.078730392 +0100
-@@ -92,7 +92,7 @@
-       struct buffer_head *wbuf[64];
-       int bufs;
-       int flags;
--      int err;
-+      int err = 0;
-       unsigned long blocknr;
-       char *tagp = NULL;
-       journal_header_t *header;
-@@ -299,6 +299,8 @@
-                       spin_unlock(&journal_datalist_lock);
-                       unlock_journal(journal);
-                       wait_on_buffer(bh);
-+                      if (unlikely(!buffer_uptodate(bh)))
-+                              err = -EIO;
-                       /* the journal_head may have been removed now */
-                       lock_journal(journal);
-                       goto write_out_data;
-@@ -326,6 +328,8 @@
-                       spin_unlock(&journal_datalist_lock);
-                       unlock_journal(journal);
-                       wait_on_buffer(bh);
-+                      if (unlikely(!buffer_uptodate(bh)))
-+                              err = -EIO;
-                       lock_journal(journal);
-                       spin_lock(&journal_datalist_lock);
-                       continue;       /* List may have changed */
-@@ -351,6 +355,9 @@
-       }
-       spin_unlock(&journal_datalist_lock);
-+      if (err)
-+              __journal_abort_hard(journal);
-+
-       /*
-        * If we found any dirty or locked buffers, then we should have
-        * looped back up to the write_out_data label.  If there weren't
-@@ -541,6 +548,8 @@
-               if (buffer_locked(bh)) {
-                       unlock_journal(journal);
-                       wait_on_buffer(bh);
-+                      if (unlikely(!buffer_uptodate(bh)))
-+                              err = -EIO;
-                       lock_journal(journal);
-                       goto wait_for_iobuf;
-               }
-@@ -602,6 +611,8 @@
-               if (buffer_locked(bh)) {
-                       unlock_journal(journal);
-                       wait_on_buffer(bh);
-+                      if (unlikely(!buffer_uptodate(bh)))
-+                              err = -EIO;
-                       lock_journal(journal);
-                       goto wait_for_ctlbuf;
-               }
-@@ -650,6 +661,8 @@
-               bh->b_end_io = journal_end_buffer_io_sync;
-               submit_bh(WRITE, bh);
-               wait_on_buffer(bh);
-+              if (unlikely(!buffer_uptodate(bh)))
-+                      err = -EIO;
-               put_bh(bh);             /* One for getblk() */
-               journal_unlock_journal_head(descriptor);
-       }
-@@ -661,6 +674,9 @@
- skip_commit: /* The journal should be unlocked by now. */
-+      if (err)
-+              __journal_abort_hard(journal);
-+      
-       /* Call any callbacks that had been registered for handles in this
-        * transaction.  It is up to the callback to free any allocated
-        * memory.
-diff -Nur linux-2.4.29/fs/jbd/journal.c linux-mips/fs/jbd/journal.c
---- linux-2.4.29/fs/jbd/journal.c      2004-11-17 12:54:21.000000000 +0100
-+++ linux-mips/fs/jbd/journal.c        2005-03-26 11:47:36.079730228 +0100
-@@ -582,8 +582,10 @@
-  * Wait for a specified commit to complete.
-  * The caller may not hold the journal lock.
-  */
--void log_wait_commit (journal_t *journal, tid_t tid)
-+int log_wait_commit (journal_t *journal, tid_t tid)
- {
-+      int err = 0;
-+
-       lock_kernel();
- #ifdef CONFIG_JBD_DEBUG
-       lock_journal(journal);
-@@ -600,6 +602,12 @@
-               sleep_on(&journal->j_wait_done_commit);
-       }
-       unlock_kernel();
-+
-+      if (unlikely(is_journal_aborted(journal))) {
-+              printk(KERN_EMERG "journal commit I/O error\n");
-+              err = -EIO;
-+      }
-+      return err;
- }
- /*
-@@ -1326,7 +1334,7 @@
-       /* Wait for the log commit to complete... */
-       if (transaction)
--              log_wait_commit(journal, transaction->t_tid);
-+              err = log_wait_commit(journal, transaction->t_tid);
-       /* ...and flush everything in the log out to disk. */
-       lock_journal(journal);
-diff -Nur linux-2.4.29/fs/jbd/transaction.c linux-mips/fs/jbd/transaction.c
---- linux-2.4.29/fs/jbd/transaction.c  2004-08-08 01:26:05.000000000 +0200
-+++ linux-mips/fs/jbd/transaction.c    2005-03-26 11:47:36.081729900 +0100
-@@ -1484,7 +1484,7 @@
-                * to wait for the commit to complete.  
-                */
-               if (handle->h_sync && !(current->flags & PF_MEMALLOC))
--                      log_wait_commit(journal, tid);
-+                      err = log_wait_commit(journal, tid);
-       }
-       kfree(handle);
-       return err;
-@@ -1509,7 +1509,7 @@
-               goto out;
-       }
-       handle->h_sync = 1;
--      journal_stop(handle);
-+      ret = journal_stop(handle);
- out:
-       unlock_kernel();
-       return ret;
-diff -Nur linux-2.4.29/fs/jfs/jfs_defragfs.h linux-mips/fs/jfs/jfs_defragfs.h
---- linux-2.4.29/fs/jfs/jfs_defragfs.h 2002-11-29 00:53:15.000000000 +0100
-+++ linux-mips/fs/jfs/jfs_defragfs.h   1970-01-01 01:00:00.000000000 +0100
-@@ -1,51 +0,0 @@
--/*
-- *   Copyright (c) International Business Machines Corp., 2000-2001
-- *
-- *   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.
-- * 
-- *   This program is distributed in the hope that it will be useful,
-- *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
-- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
-- *   the GNU General Public License for more details.
-- *
-- *   You should have received a copy of the GNU General Public License
-- *   along with this program;  if not, write to the Free Software 
-- *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-- */
--#ifndef       _H_JFS_DEFRAGFS
--#define _H_JFS_DEFRAGFS
--
--/*
-- *    defragfs parameter list
-- */
--struct defragfs {
--      uint flag;              /* 4: */
--      u8 dev;                 /* 1: */
--      u8 pad[3];              /* 3: */
--      s32 fileset;            /* 4: */
--      u32 inostamp;           /* 4: */
--      u32 ino;                /* 4: */
--      u32 gen;                /* 4: */
--      s64 xoff;               /* 8: */
--      s64 old_xaddr;          /* 8: */
--      s64 new_xaddr;          /* 8: */
--      s32 xlen;               /* 4: */
--};
--
--/* plist flag */
--#define DEFRAGFS_SYNC         0x80000000
--#define DEFRAGFS_COMMIT               0x40000000
--#define DEFRAGFS_RELOCATE     0x10000000
--
--#define       INODE_TYPE              0x0000F000      /* IFREG or IFDIR */
--
--#define EXTENT_TYPE           0x000000ff
--#define DTPAGE                        0x00000001
--#define XTPAGE                        0x00000002
--#define DATAEXT                       0x00000004
--#define EAEXT                 0x00000008
--
--#endif                                /* _H_JFS_DEFRAGFS */
-diff -Nur linux-2.4.29/fs/jfs/jfs_imap.c linux-mips/fs/jfs/jfs_imap.c
---- linux-2.4.29/fs/jfs/jfs_imap.c     2005-01-19 15:10:10.000000000 +0100
-+++ linux-mips/fs/jfs/jfs_imap.c       2005-03-26 11:47:36.085729244 +0100
-@@ -486,7 +486,6 @@
-       /* read the page of fixed disk inode (AIT) in raw mode */
-       mp = read_metapage(ip, address << sbi->l2nbperpage, PSIZE, 1);
-       if (mp == NULL) {
--              ip->i_sb = NULL;
-               ip->i_nlink = 1;        /* Don't want iput() deleting it */
-               iput(ip);
-               return (NULL);
-@@ -499,7 +498,6 @@
-       /* copy on-disk inode to in-memory inode */
-       if ((copy_from_dinode(dp, ip)) != 0) {
-               /* handle bad return by returning NULL for ip */
--              ip->i_sb = NULL;
-               ip->i_nlink = 1;        /* Don't want iput() deleting it */
-               iput(ip);
-               /* release the page */
-diff -Nur linux-2.4.29/fs/jfs/jfs_metapage.c linux-mips/fs/jfs/jfs_metapage.c
---- linux-2.4.29/fs/jfs/jfs_metapage.c 2004-11-17 12:54:21.000000000 +0100
-+++ linux-mips/fs/jfs/jfs_metapage.c   2005-03-26 11:47:36.086729079 +0100
-@@ -298,14 +298,14 @@
-       mp = search_hash(hash_ptr, mapping, lblock);
-       if (mp) {
-             page_found:
--              mp->count++;
--              lock_metapage(mp);
--              spin_unlock(&meta_lock);
-               if (test_bit(META_stale, &mp->flag)) {
--                      release_metapage(mp);
--                      yield();        /* Let other waiters release it, too */
-+                      spin_unlock(&meta_lock);
-+                      yield();
-                       goto again;
-               }
-+              mp->count++;
-+              lock_metapage(mp);
-+              spin_unlock(&meta_lock);
-               if (test_bit(META_discard, &mp->flag)) {
-                       if (!new) {
-                               jfs_error(inode->i_sb,
-@@ -518,7 +518,6 @@
-       }
-       if (mp->page) {
--              /* Releasing spinlock, we have to check mp->count later */
-               set_bit(META_stale, &mp->flag);
-               spin_unlock(&meta_lock);
-               kunmap(mp->page);
-@@ -555,12 +554,6 @@
-               list_del(&mp->synclist);
-               LOGSYNC_UNLOCK(log);
-       }
--      if (mp->count) {
--              /* Someone else is trying to get this metpage */
--              unlock_metapage(mp);
--              spin_unlock(&meta_lock);
--              return;
--      }
-       remove_from_hash(mp, meta_hash(mp->mapping, mp->index));
-       spin_unlock(&meta_lock);
-@@ -589,12 +582,8 @@
-               mp = search_hash(hash_ptr, mapping, lblock);
-               if (mp) {
-                       if (test_bit(META_stale, &mp->flag)) {
--                              /* Racing with release_metapage */
--                              mp->count++;
--                              lock_metapage(mp);
-                               spin_unlock(&meta_lock);
--                              /* racing release_metapage should be done now */
--                              release_metapage(mp);
-+                              yield();
-                               goto again;
-                       }
-diff -Nur linux-2.4.29/fs/jfs/jfs_unicode.c linux-mips/fs/jfs/jfs_unicode.c
---- linux-2.4.29/fs/jfs/jfs_unicode.c  2004-04-14 15:05:40.000000000 +0200
-+++ linux-mips/fs/jfs/jfs_unicode.c    2005-03-26 11:47:36.089728587 +0100
-@@ -1,5 +1,5 @@
- /*
-- *   Copyright (c) International Business Machines Corp., 2000-2002
-+ *   Copyright (C) International Business Machines Corp., 2000-2005
-  *
-  *   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
-@@ -18,7 +18,7 @@
- #include <linux/fs.h>
- #include <linux/slab.h>
--#include "jfs_types.h"
-+#include "jfs_incore.h"
- #include "jfs_filsys.h"
- #include "jfs_unicode.h"
- #include "jfs_debug.h"
-@@ -34,17 +34,40 @@
- {
-       int i;
-       int outlen = 0;
-+      static int warn_again = 5;      /* Only warn up to 5 times total */
-+      int warn = !!warn_again;        /* once per string */
--      for (i = 0; (i < len) && from[i]; i++) {
--              int charlen;
--              charlen =
--                  codepage->uni2char(le16_to_cpu(from[i]), &to[outlen],
--                                     NLS_MAX_CHARSET_SIZE);
--              if (charlen > 0) {
--                      outlen += charlen;
--              } else {
--                      to[outlen++] = '?';
-+      if (codepage) {
-+              for (i = 0; (i < len) && from[i]; i++) {
-+                      int charlen;
-+                      charlen =
-+                          codepage->uni2char(le16_to_cpu(from[i]),
-+                                             &to[outlen],
-+                                             NLS_MAX_CHARSET_SIZE);
-+                      if (charlen > 0)
-+                              outlen += charlen;
-+                      else
-+                              to[outlen++] = '?';
-               }
-+      } else {
-+              for (i = 0; (i < len) && from[i]; i++) {
-+                      if (le16_to_cpu(from[i]) & 0xff00) {
-+                              if (warn) {
-+                                      warn--;
-+                                      warn_again--;
-+                                      printk(KERN_ERR
-+                      "non-latin1 character 0x%x found in JFS file name\n", 
-+                                             le16_to_cpu(from[i]));
-+                                      printk(KERN_ERR
-+                              "mount with iocharset=utf8 to access\n");
-+                              }
-+                              to[i] = '?';
-+                      }
-+                      else
-+                              to[i] = (char) (le16_to_cpu(from[i]));
-+              }
-+              outlen = i;
-+
-       }
-       to[outlen] = 0;
-       return outlen;
-@@ -56,20 +79,27 @@
-  * FUNCTION:  Convert character string to unicode string
-  *
-  */
--static int jfs_strtoUCS(wchar_t * to, const char *from, int len,
-+static int jfs_strtoUCS(wchar_t * to, const unsigned char *from, int len,
-               struct nls_table *codepage)
- {
-       int charlen;
-       int i;
--      for (i = 0; len && *from; i++, from += charlen, len -= charlen) {
--              charlen = codepage->char2uni(from, len, &to[i]);
--              if (charlen < 1) {
--                      jfs_err("jfs_strtoUCS: char2uni returned %d.", charlen);
--                      jfs_err("charset = %s, char = 0x%x",
--                              codepage->charset, (unsigned char) *from);
--                      return charlen;
-+      if (codepage) {
-+              for (i = 0; len && *from; i++, from += charlen, len -= charlen)
-+              {
-+                      charlen = codepage->char2uni(from, len, &to[i]);
-+                      if (charlen < 1) {
-+                              jfs_err("jfs_strtoUCS: char2uni returned %d.",
-+                                      charlen);
-+                              jfs_err("charset = %s, char = 0x%x",
-+                                      codepage->charset, *from);
-+                              return charlen;
-+                      }
-               }
-+      } else {
-+              for (i = 0; (i < len) && from[i]; i++)
-+                      to[i] = (wchar_t) from[i];
-       }
-       to[i] = 0;
-@@ -82,9 +112,9 @@
-  * FUNCTION:  Allocate and translate to unicode string
-  *
-  */
--int get_UCSname(struct component_name * uniName, struct dentry *dentry,
--              struct nls_table *nls_tab)
-+int get_UCSname(struct component_name * uniName, struct dentry *dentry)
- {
-+      struct nls_table *nls_tab = JFS_SBI(dentry->d_sb)->nls_tab;
-       int length = dentry->d_name.len;
-       if (length > JFS_NAME_MAX)
-diff -Nur linux-2.4.29/fs/jfs/jfs_unicode.h linux-mips/fs/jfs/jfs_unicode.h
---- linux-2.4.29/fs/jfs/jfs_unicode.h  2002-11-29 00:53:15.000000000 +0100
-+++ linux-mips/fs/jfs/jfs_unicode.h    2005-03-26 11:47:36.095727603 +0100
-@@ -1,6 +1,6 @@
- /*
-- *   Copyright (c) International Business Machines Corp., 2000-2002
-- *   Portions Copyright (c) Christoph Hellwig, 2001-2002
-+ *   Copyright (C) International Business Machines Corp., 2000-2002
-+ *   Portions Copyright (C) Christoph Hellwig, 2001-2002
-  *
-  *   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
-@@ -30,8 +30,7 @@
- extern signed char UniUpperTable[512];
- extern UNICASERANGE UniUpperRange[];
--extern int get_UCSname(struct component_name *, struct dentry *,
--                     struct nls_table *);
-+extern int get_UCSname(struct component_name *, struct dentry *);
- extern int jfs_strfromUCS_le(char *, const wchar_t *, int, struct nls_table *);
- #define free_UCSname(COMP) kfree((COMP)->name)
-diff -Nur linux-2.4.29/fs/jfs/namei.c linux-mips/fs/jfs/namei.c
---- linux-2.4.29/fs/jfs/namei.c        2004-08-08 01:26:06.000000000 +0200
-+++ linux-mips/fs/jfs/namei.c  2005-03-26 11:47:36.096727438 +0100
-@@ -74,7 +74,7 @@
-        * search parent directory for entry/freespace
-        * (dtSearch() returns parent directory page pinned)
-        */
--      if ((rc = get_UCSname(&dname, dentry, JFS_SBI(dip->i_sb)->nls_tab)))
-+      if ((rc = get_UCSname(&dname, dentry)))
-               goto out1;
-       /*
-@@ -195,7 +195,7 @@
-        * search parent directory for entry/freespace
-        * (dtSearch() returns parent directory page pinned)
-        */
--      if ((rc = get_UCSname(&dname, dentry, JFS_SBI(dip->i_sb)->nls_tab)))
-+      if ((rc = get_UCSname(&dname, dentry)))
-               goto out1;
-       /*
-@@ -318,9 +318,8 @@
-               goto out;
-       }
--      if ((rc = get_UCSname(&dname, dentry, JFS_SBI(dip->i_sb)->nls_tab))) {
-+      if ((rc = get_UCSname(&dname, dentry)))
-               goto out;
--      }
-       tid = txBegin(dip->i_sb, 0);
-@@ -437,7 +436,7 @@
-       jfs_info("jfs_unlink: dip:0x%p name:%s", dip, dentry->d_name.name);
--      if ((rc = get_UCSname(&dname, dentry, JFS_SBI(dip->i_sb)->nls_tab)))
-+      if ((rc = get_UCSname(&dname, dentry)))
-               goto out;
-       IWRITE_LOCK(ip);
-@@ -780,7 +779,7 @@
-       /*
-        * scan parent directory for entry/freespace
-        */
--      if ((rc = get_UCSname(&dname, dentry, JFS_SBI(ip->i_sb)->nls_tab)))
-+      if ((rc = get_UCSname(&dname, dentry)))
-               goto out;
-       if ((rc = dtSearch(dir, &dname, &ino, &btstack, JFS_CREATE)))
-@@ -865,7 +864,7 @@
-        * (dtSearch() returns parent directory page pinned)
-        */
--      if ((rc = get_UCSname(&dname, dentry, JFS_SBI(dip->i_sb)->nls_tab)))
-+      if ((rc = get_UCSname(&dname, dentry)))
-               goto out1;
-       /*
-@@ -1044,12 +1043,10 @@
-       old_ip = old_dentry->d_inode;
-       new_ip = new_dentry->d_inode;
--      if ((rc = get_UCSname(&old_dname, old_dentry,
--                            JFS_SBI(old_dir->i_sb)->nls_tab)))
-+      if ((rc = get_UCSname(&old_dname, old_dentry)))
-               goto out1;
--      if ((rc = get_UCSname(&new_dname, new_dentry,
--                            JFS_SBI(old_dir->i_sb)->nls_tab)))
-+      if ((rc = get_UCSname(&new_dname, new_dentry)))
-               goto out2;
-       /*
-@@ -1301,7 +1298,7 @@
-       jfs_info("jfs_mknod: %s", dentry->d_name.name);
--      if ((rc = get_UCSname(&dname, dentry, JFS_SBI(dir->i_sb)->nls_tab)))
-+      if ((rc = get_UCSname(&dname, dentry)))
-               goto out;
-       ip = ialloc(dir, mode);
-@@ -1376,8 +1373,7 @@
-       else if (strcmp(name, "..") == 0)
-               inum = PARENT(dip);
-       else {
--              if ((rc =
--                   get_UCSname(&key, dentry, JFS_SBI(dip->i_sb)->nls_tab)))
-+              if ((rc = get_UCSname(&key, dentry)))
-                       return ERR_PTR(rc);
-               rc = dtSearch(dip, &key, &inum, &btstack, JFS_LOOKUP);
-               free_UCSname(&key);
-diff -Nur linux-2.4.29/fs/jfs/super.c linux-mips/fs/jfs/super.c
---- linux-2.4.29/fs/jfs/super.c        2004-08-08 01:26:06.000000000 +0200
-+++ linux-mips/fs/jfs/super.c  2005-03-26 11:47:36.101726618 +0100
-@@ -1,5 +1,5 @@
- /*
-- *   Copyright (C) International Business Machines Corp., 2000-2003
-+ *   Copyright (C) International Business Machines Corp., 2000-2005
-  *   Portions Copyright (C) Christoph Hellwig, 2001-2002
-  *
-  *   This program is free software;  you can redistribute it and/or modify
-@@ -155,8 +155,10 @@
-       rc = jfs_umount(sb);
-       if (rc)
-               jfs_err("jfs_umount failed with return code %d", rc);
--      unload_nls(sbi->nls_tab);
--      sbi->nls_tab = NULL;
-+      if (sbi->nls_tab) {
-+              unload_nls(sbi->nls_tab);
-+              sbi->nls_tab = NULL;
-+      }
-       kfree(sbi);
- }
-@@ -182,7 +184,7 @@
- static int parse_options(char *options, struct super_block *sb, s64 *newLVSize,
-                        int *flag)
- {
--      void *nls_map = NULL;
-+      void *nls_map = (void *)-1;     /* -1: no change;  NULL: none */
-       char *this_char;
-       char *value;
-       struct jfs_sb_info *sbi = JFS_SBI(sb);
-@@ -222,13 +224,12 @@
-               } else if (!strcmp(this_char, "iocharset")) {
-                       if (!value || !*value)
-                               goto needs_arg;
--                      if (nls_map)    /* specified iocharset twice! */
-+                      if (nls_map && nls_map != (void *) -1)
-                               unload_nls(nls_map);
--                      nls_map = load_nls(value);
--                      if (!nls_map) {
--                              printk(KERN_ERR "JFS: charset not found\n");
--                              goto cleanup;
--                      }
-+                      if (!strcmp(value, "none"))
-+                              nls_map = NULL;
-+                      else
-+                              nls_map = load_nls(value);
-               } else if (!strcmp(this_char, "resize")) {
-                       if (!value || !*value) {
-                               *newLVSize = jfs_get_volume_size(sb);
-@@ -250,9 +251,9 @@
-                       goto cleanup;
-               }
-       }
--      if (nls_map) {
-+      if (nls_map != (void *) -1) {
-               /* Discard old (if remount) */
--              if (sbi->nls_tab)
-+              if (sbi->nls_tab && sbi->nls_tab != (void *) -1)
-                       unload_nls(sbi->nls_tab);
-               sbi->nls_tab = nls_map;
-       }
-@@ -260,7 +261,7 @@
- needs_arg:
-       printk(KERN_ERR "JFS: %s needs an argument\n", this_char);
- cleanup:
--      if (nls_map)
-+      if (nls_map && nls_map != (void *) -1)
-               unload_nls(nls_map);
-       return 0;
- }
-@@ -328,6 +329,8 @@
-       /* initialize the mount flag and determine the default error handler */
-       flag = JFS_ERR_REMOUNT_RO;
-+      /* nls_tab will be set to NULL if no character mapping is requested */
-+      sbi->nls_tab = (void *) -1;
-       if (!parse_options((char *) data, sb, &newLVSize, &flag)) {
-               kfree(sbi);
-               return NULL;
-@@ -378,7 +381,7 @@
-       if (!sb->s_root)
-               goto out_no_root;
--      if (!sbi->nls_tab)
-+      if (sbi->nls_tab == (void *) -1)
-               sbi->nls_tab = load_nls_default();
-       /* logical blocks are represented by 40 bits in pxd_t, etc. */
-diff -Nur linux-2.4.29/fs/nfsd/vfs.c linux-mips/fs/nfsd/vfs.c
---- linux-2.4.29/fs/nfsd/vfs.c 2004-11-17 12:54:21.000000000 +0100
-+++ linux-mips/fs/nfsd/vfs.c   2005-03-26 11:47:36.103726290 +0100
-@@ -466,6 +466,8 @@
-       atomic_set(&filp->f_count, 1);
-       filp->f_dentry = dentry;
-       filp->f_vfsmnt = fhp->fh_export->ex_mnt;
-+      filp->f_maxcount = INT_MAX;
-+
-       if (access & MAY_WRITE) {
-               filp->f_flags = O_WRONLY|O_LARGEFILE;
-               filp->f_mode  = FMODE_WRITE;
+       /* Flush all traces of the currently running executable */
+@@ -1208,7 +1211,11 @@
+       elf.e_entry = 0;
+       elf.e_phoff = sizeof(elf);
+       elf.e_shoff = 0;
++#ifdef ELF_CORE_EFLAGS
++      elf.e_flags = ELF_CORE_EFLAGS;
++#else
+       elf.e_flags = 0;
++#endif
+       elf.e_ehsize = sizeof(elf);
+       elf.e_phentsize = sizeof(struct elf_phdr);
+       elf.e_phnum = segs+1;           /* Include notes */
 diff -Nur linux-2.4.29/fs/partitions/sgi.c linux-mips/fs/partitions/sgi.c
 --- linux-2.4.29/fs/partitions/sgi.c   2001-10-02 05:03:26.000000000 +0200
 +++ linux-mips/fs/partitions/sgi.c     2004-08-11 22:30:07.000000000 +0200
@@ -33760,48 +22027,6 @@ diff -Nur linux-2.4.29/fs/proc/array.c linux-mips/fs/proc/array.c
  
        return len;
  }
-diff -Nur linux-2.4.29/fs/proc/kcore.c linux-mips/fs/proc/kcore.c
---- linux-2.4.29/fs/proc/kcore.c       2004-08-08 01:26:06.000000000 +0200
-+++ linux-mips/fs/proc/kcore.c 2005-03-26 11:47:36.107725633 +0100
-@@ -136,7 +136,10 @@
-       }
-       *elf_buflen =   sizeof(struct elfhdr) + 
-                       (*num_vma + 2)*sizeof(struct elf_phdr) + 
--                      3 * sizeof(struct memelfnote);
-+                      3 * (sizeof(struct elf_note) + 4) +
-+                      sizeof(struct elf_prstatus) +
-+                      sizeof(struct elf_prpsinfo) +
-+                      sizeof(struct task_struct);
-       *elf_buflen = PAGE_ALIGN(*elf_buflen);
-       return (size - PAGE_OFFSET + *elf_buflen);
- }
-@@ -279,7 +282,7 @@
-       memset(&prstatus, 0, sizeof(struct elf_prstatus));
--      nhdr->p_filesz  = notesize(&notes[0]);
-+      nhdr->p_filesz += notesize(&notes[0]);
-       bufp = storenote(&notes[0], bufp);
-       /* set up the process info */
-@@ -296,7 +299,7 @@
-       strcpy(prpsinfo.pr_fname, "vmlinux");
-       strncpy(prpsinfo.pr_psargs, saved_command_line, ELF_PRARGSZ);
--      nhdr->p_filesz  = notesize(&notes[1]);
-+      nhdr->p_filesz += notesize(&notes[1]);
-       bufp = storenote(&notes[1], bufp);
-       /* set up the task structure */
-@@ -305,7 +308,7 @@
-       notes[2].datasz = sizeof(struct task_struct);
-       notes[2].data   = current;
--      nhdr->p_filesz  = notesize(&notes[2]);
-+      nhdr->p_filesz += notesize(&notes[2]);
-       bufp = storenote(&notes[2], bufp);
- } /* end elf_kcore_store_hdr() */
 diff -Nur linux-2.4.29/fs/proc/proc_misc.c linux-mips/fs/proc/proc_misc.c
 --- linux-2.4.29/fs/proc/proc_misc.c   2004-08-08 01:26:06.000000000 +0200
 +++ linux-mips/fs/proc/proc_misc.c     2004-08-14 20:39:01.000000000 +0200
@@ -33841,128 +22066,6 @@ diff -Nur linux-2.4.29/fs/proc/proc_misc.c linux-mips/fs/proc/proc_misc.c
                                   + kstat.per_cpu_nice[cpu_logical_map(i)] \
                                   + kstat.per_cpu_system[cpu_logical_map(i)]));
        proc_sprintf(page, &off, &len,
-diff -Nur linux-2.4.29/fs/proc/proc_tty.c linux-mips/fs/proc/proc_tty.c
---- linux-2.4.29/fs/proc/proc_tty.c    2005-01-19 15:10:11.000000000 +0100
-+++ linux-mips/fs/proc/proc_tty.c      2005-03-26 11:47:36.107725633 +0100
-@@ -129,7 +129,7 @@
- }
- /*
-- * Thsi function is called by register_tty_driver() to handle
-+ * This function is called by tty_register_driver() to handle
-  * registering the driver's /proc handler into /proc/tty/driver/<foo>
-  */
- void proc_tty_register_driver(struct tty_driver *driver)
-@@ -152,7 +152,7 @@
- }
- /*
-- * This function is called by unregister_tty_driver()
-+ * This function is called by tty_unregister_driver()
-  */
- void proc_tty_unregister_driver(struct tty_driver *driver)
- {
-diff -Nur linux-2.4.29/fs/read_write.c linux-mips/fs/read_write.c
---- linux-2.4.29/fs/read_write.c       2003-08-25 13:44:43.000000000 +0200
-+++ linux-mips/fs/read_write.c 2005-03-26 11:47:36.064732690 +0100
-@@ -40,6 +40,28 @@
-       return -EISDIR;
- }
-+int rw_verify_area(int read_write, struct file *file, loff_t *ppos, size_t count)
-+{
-+      struct inode *inode;
-+      loff_t pos;
-+
-+      if (unlikely(count > file->f_maxcount))
-+              goto Einval;
-+
-+      pos = *ppos;
-+
-+      if (unlikely((pos < 0) || (loff_t) (pos + count) < 0))
-+              goto Einval;
-+
-+      inode = file->f_dentry->d_inode;
-+      if (inode->i_flock && MANDATORY_LOCK(inode))
-+              return locks_mandatory_area(read_write == READ ? FLOCK_VERIFY_READ : FLOCK_VERIFY_WRITE, inode, file, *ppos, count);
-+      return 0;
-+
-+Einval:
-+      return -EINVAL;
-+}
-+
- loff_t generic_file_llseek(struct file *file, loff_t offset, int origin)
- {
-       long long retval;
-@@ -168,8 +190,8 @@
-       file = fget(fd);
-       if (file) {
-               if (file->f_mode & FMODE_READ) {
--                      ret = locks_verify_area(FLOCK_VERIFY_READ, file->f_dentry->d_inode,
--                                              file, file->f_pos, count);
-+                      ret = rw_verify_area(READ, file, &file->f_pos, count);
-+
-                       if (!ret) {
-                               ssize_t (*read)(struct file *, char *, size_t, loff_t *);
-                               ret = -EINVAL;
-@@ -193,9 +215,7 @@
-       file = fget(fd);
-       if (file) {
-               if (file->f_mode & FMODE_WRITE) {
--                      struct inode *inode = file->f_dentry->d_inode;
--                      ret = locks_verify_area(FLOCK_VERIFY_WRITE, inode, file,
--                              file->f_pos, count);
-+                      ret = rw_verify_area(WRITE, file, &file->f_pos, count);
-                       if (!ret) {
-                               ssize_t (*write)(struct file *, const char *, size_t, loff_t *);
-                               ret = -EINVAL;
-@@ -224,7 +244,6 @@
-       ssize_t ret, i;
-       io_fn_t fn;
-       iov_fn_t fnv;
--      struct inode *inode;
-       /*
-        * First get the "struct iovec" from user memory and
-@@ -275,12 +294,11 @@
-                       goto out;
-       }
--      inode = file->f_dentry->d_inode;
-       /* VERIFY_WRITE actually means a read, as we write to user space */
--      ret = locks_verify_area((type == VERIFY_WRITE
--                               ? FLOCK_VERIFY_READ : FLOCK_VERIFY_WRITE),
--                              inode, file, file->f_pos, tot_len);
--      if (ret) goto out;
-+      ret = rw_verify_area((type == VERIFY_WRITE ? READ : WRITE),
-+                              file, &file->f_pos, tot_len);
-+      if (ret) 
-+              goto out;
-       fnv = (type == VERIFY_WRITE ? file->f_op->readv : file->f_op->writev);
-       if (fnv) {
-@@ -383,8 +401,8 @@
-               goto bad_file;
-       if (!(file->f_mode & FMODE_READ))
-               goto out;
--      ret = locks_verify_area(FLOCK_VERIFY_READ, file->f_dentry->d_inode,
--                              file, pos, count);
-+      ret = rw_verify_area(READ, file, &pos, count);
-+
-       if (ret)
-               goto out;
-       ret = -EINVAL;
-@@ -414,8 +432,8 @@
-               goto bad_file;
-       if (!(file->f_mode & FMODE_WRITE))
-               goto out;
--      ret = locks_verify_area(FLOCK_VERIFY_WRITE, file->f_dentry->d_inode,
--                              file, pos, count);
-+      ret = rw_verify_area(WRITE, file, &pos, count);
-+
-       if (ret)
-               goto out;
-       ret = -EINVAL;
 diff -Nur linux-2.4.29/include/asm-alpha/param.h linux-mips/include/asm-alpha/param.h
 --- linux-2.4.29/include/asm-alpha/param.h     2000-11-08 08:37:31.000000000 +0100
 +++ linux-mips/include/asm-alpha/param.h       2000-11-28 04:59:03.000000000 +0100
@@ -33976,18 +22079,6 @@ diff -Nur linux-2.4.29/include/asm-alpha/param.h linux-mips/include/asm-alpha/pa
  #endif
  
  #define EXEC_PAGESIZE 8192
-diff -Nur linux-2.4.29/include/asm-i386/acpi.h linux-mips/include/asm-i386/acpi.h
---- linux-2.4.29/include/asm-i386/acpi.h       2004-08-08 01:26:06.000000000 +0200
-+++ linux-mips/include/asm-i386/acpi.h 2005-03-26 11:47:36.177714147 +0100
-@@ -121,6 +121,8 @@
- extern int acpi_strict;
- extern int acpi_disabled;
- extern int acpi_ht;
-+extern int acpi_skip_timer_override;
-+void __init check_acpi_pci(void);
- static inline void disable_acpi(void) 
- { 
-       acpi_disabled = 1;
 diff -Nur linux-2.4.29/include/asm-i386/param.h linux-mips/include/asm-i386/param.h
 --- linux-2.4.29/include/asm-i386/param.h      2000-10-27 20:04:43.000000000 +0200
 +++ linux-mips/include/asm-i386/param.h        2000-11-23 03:00:55.000000000 +0100
@@ -34001,11 +22092,6 @@ diff -Nur linux-2.4.29/include/asm-i386/param.h linux-mips/include/asm-i386/para
  #endif
  
  #define EXEC_PAGESIZE 4096
-diff -Nur linux-2.4.29/include/asm-i386/pci-direct.h linux-mips/include/asm-i386/pci-direct.h
---- linux-2.4.29/include/asm-i386/pci-direct.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-mips/include/asm-i386/pci-direct.h   2005-03-18 13:13:30.000000000 +0100
-@@ -0,0 +1 @@
-+#include "asm-x86_64/pci-direct.h"
 diff -Nur linux-2.4.29/include/asm-ia64/param.h linux-mips/include/asm-ia64/param.h
 --- linux-2.4.29/include/asm-ia64/param.h      2004-04-14 15:05:40.000000000 +0200
 +++ linux-mips/include/asm-ia64/param.h        2004-04-16 05:14:20.000000000 +0200
@@ -34041,7 +22127,7 @@ diff -Nur linux-2.4.29/include/asm-m68k/param.h linux-mips/include/asm-m68k/para
  #define EXEC_PAGESIZE 8192
 diff -Nur linux-2.4.29/include/asm-mips/au1000_gpio.h linux-mips/include/asm-mips/au1000_gpio.h
 --- linux-2.4.29/include/asm-mips/au1000_gpio.h        2002-11-29 00:53:15.000000000 +0100
-+++ linux-mips/include/asm-mips/au1000_gpio.h  2005-01-31 12:59:48.000000000 +0100
++++ linux-mips/include/asm-mips/au1000_gpio.h  2005-01-30 09:01:28.000000000 +0100
 @@ -30,6 +30,13 @@
   *  675 Mass Ave, Cambridge, MA 02139, USA.
   */
@@ -34159,7 +22245,7 @@ diff -Nur linux-2.4.29/include/asm-mips/au1000_gpio.h linux-mips/include/asm-mip
  #endif
 diff -Nur linux-2.4.29/include/asm-mips/au1000.h linux-mips/include/asm-mips/au1000.h
 --- linux-2.4.29/include/asm-mips/au1000.h     2005-01-19 15:10:11.000000000 +0100
-+++ linux-mips/include/asm-mips/au1000.h       2005-01-31 12:59:48.000000000 +0100
++++ linux-mips/include/asm-mips/au1000.h       2005-01-30 09:01:28.000000000 +0100
 @@ -160,28 +160,356 @@
  #define ALLINTS (IE_IRQ0 | IE_IRQ1 | IE_IRQ2 | IE_IRQ3 | IE_IRQ4 | IE_IRQ5)
  #endif
@@ -34829,7 +22915,7 @@ diff -Nur linux-2.4.29/include/asm-mips/au1000.h linux-mips/include/asm-mips/au1
 +
 diff -Nur linux-2.4.29/include/asm-mips/au1000_pcmcia.h linux-mips/include/asm-mips/au1000_pcmcia.h
 --- linux-2.4.29/include/asm-mips/au1000_pcmcia.h      2005-01-19 15:10:11.000000000 +0100
-+++ linux-mips/include/asm-mips/au1000_pcmcia.h        2005-01-31 12:59:48.000000000 +0100
++++ linux-mips/include/asm-mips/au1000_pcmcia.h        2005-01-30 09:01:28.000000000 +0100
 @@ -38,16 +38,41 @@
  #define AU1X_SOCK0_PHYS_MEM  0xF80000000
  
@@ -34883,7 +22969,7 @@ diff -Nur linux-2.4.29/include/asm-mips/au1000_pcmcia.h linux-mips/include/asm-m
  struct pcmcia_state {
 diff -Nur linux-2.4.29/include/asm-mips/au1100_mmc.h linux-mips/include/asm-mips/au1100_mmc.h
 --- linux-2.4.29/include/asm-mips/au1100_mmc.h 2005-01-19 15:10:11.000000000 +0100
-+++ linux-mips/include/asm-mips/au1100_mmc.h   2005-01-31 12:59:48.000000000 +0100
++++ linux-mips/include/asm-mips/au1100_mmc.h   2005-01-30 09:01:28.000000000 +0100
 @@ -39,16 +39,22 @@
  #define __ASM_AU1100_MMC_H
  
@@ -34927,7 +23013,7 @@ diff -Nur linux-2.4.29/include/asm-mips/au1100_mmc.h linux-mips/include/asm-mips
  
 diff -Nur linux-2.4.29/include/asm-mips/au1xxx_dbdma.h linux-mips/include/asm-mips/au1xxx_dbdma.h
 --- linux-2.4.29/include/asm-mips/au1xxx_dbdma.h       2005-01-19 15:10:11.000000000 +0100
-+++ linux-mips/include/asm-mips/au1xxx_dbdma.h 2005-01-31 12:59:48.000000000 +0100
++++ linux-mips/include/asm-mips/au1xxx_dbdma.h 2005-01-30 09:01:28.000000000 +0100
 @@ -43,7 +43,7 @@
  #define DDMA_GLOBAL_BASE      0xb4003000
  #define DDMA_CHANNEL_BASE     0xb4002000
@@ -35108,7 +23194,7 @@ diff -Nur linux-2.4.29/include/asm-mips/au1xxx_gpio.h linux-mips/include/asm-mip
 +#endif //__AU1XXX_GPIO_H
 diff -Nur linux-2.4.29/include/asm-mips/au1xxx_psc.h linux-mips/include/asm-mips/au1xxx_psc.h
 --- linux-2.4.29/include/asm-mips/au1xxx_psc.h 2005-01-19 15:10:11.000000000 +0100
-+++ linux-mips/include/asm-mips/au1xxx_psc.h   2005-01-31 12:59:49.000000000 +0100
++++ linux-mips/include/asm-mips/au1xxx_psc.h   2005-01-30 09:01:28.000000000 +0100
 @@ -41,6 +41,11 @@
  #define PSC3_BASE_ADDR                0xb0d00000
  #endif
@@ -35132,7 +23218,7 @@ diff -Nur linux-2.4.29/include/asm-mips/au1xxx_psc.h linux-mips/include/asm-mips
  #define PSC_I2SCFG_DIV_MASK   (3 << 13)
 diff -Nur linux-2.4.29/include/asm-mips/bootinfo.h linux-mips/include/asm-mips/bootinfo.h
 --- linux-2.4.29/include/asm-mips/bootinfo.h   2004-02-18 14:36:32.000000000 +0100
-+++ linux-mips/include/asm-mips/bootinfo.h     2005-01-31 12:59:49.000000000 +0100
++++ linux-mips/include/asm-mips/bootinfo.h     2005-01-30 09:01:28.000000000 +0100
 @@ -180,6 +180,9 @@
  #define MACH_MTX1             7       /* 4G MTX-1 Au1500-based board */
  #define MACH_CSB250           8       /* Cogent Au1500 */
@@ -35363,7 +23449,7 @@ diff -Nur linux-2.4.29/include/asm-mips/db1200.h linux-mips/include/asm-mips/db1
 +
 diff -Nur linux-2.4.29/include/asm-mips/db1x00.h linux-mips/include/asm-mips/db1x00.h
 --- linux-2.4.29/include/asm-mips/db1x00.h     2005-01-19 15:10:11.000000000 +0100
-+++ linux-mips/include/asm-mips/db1x00.h       2005-01-31 12:59:49.000000000 +0100
++++ linux-mips/include/asm-mips/db1x00.h       2005-01-30 09:06:19.000000000 +0100
 @@ -1,5 +1,5 @@
  /*
 - * AMD Alchemy DB1x00 Reference Boards
@@ -35835,7 +23921,7 @@ diff -Nur linux-2.4.29/include/asm-mips/hazards.h linux-mips/include/asm-mips/ha
  #endif /* _ASM_HAZARDS_H */
 diff -Nur linux-2.4.29/include/asm-mips/mipsregs.h linux-mips/include/asm-mips/mipsregs.h
 --- linux-2.4.29/include/asm-mips/mipsregs.h   2005-01-19 15:10:12.000000000 +0100
-+++ linux-mips/include/asm-mips/mipsregs.h     2005-03-26 11:47:36.210708732 +0100
++++ linux-mips/include/asm-mips/mipsregs.h     2005-02-06 22:24:22.000000000 +0100
 @@ -757,10 +757,18 @@
  #define read_c0_config1()     __read_32bit_c0_register($16, 1)
  #define read_c0_config2()     __read_32bit_c0_register($16, 2)
@@ -35912,7 +23998,7 @@ diff -Nur linux-2.4.29/include/asm-mips/mmu_context.h linux-mips/include/asm-mip
  
 diff -Nur linux-2.4.29/include/asm-mips/pb1100.h linux-mips/include/asm-mips/pb1100.h
 --- linux-2.4.29/include/asm-mips/pb1100.h     2003-08-25 13:44:44.000000000 +0200
-+++ linux-mips/include/asm-mips/pb1100.h       2005-01-31 12:59:49.000000000 +0100
++++ linux-mips/include/asm-mips/pb1100.h       2005-01-30 09:10:29.000000000 +0100
 @@ -1,5 +1,5 @@
  /*
 - * Alchemy Semi PB1100 Referrence Board
@@ -36329,7 +24415,7 @@ diff -Nur linux-2.4.29/include/asm-mips/pb1200.h linux-mips/include/asm-mips/pb1
 +
 diff -Nur linux-2.4.29/include/asm-mips/pb1550.h linux-mips/include/asm-mips/pb1550.h
 --- linux-2.4.29/include/asm-mips/pb1550.h     2005-01-19 15:10:12.000000000 +0100
-+++ linux-mips/include/asm-mips/pb1550.h       2005-01-31 12:59:49.000000000 +0100
++++ linux-mips/include/asm-mips/pb1550.h       2005-01-30 09:01:28.000000000 +0100
 @@ -30,13 +30,11 @@
  
  #define DBDMA_AC97_TX_CHAN DSCR_CMD0_PSC1_TX
@@ -36735,7 +24821,7 @@ diff -Nur linux-2.4.29/include/asm-mips64/hazards.h linux-mips/include/asm-mips6
  #endif /* _ASM_HAZARDS_H */
 diff -Nur linux-2.4.29/include/asm-mips64/mipsregs.h linux-mips/include/asm-mips64/mipsregs.h
 --- linux-2.4.29/include/asm-mips64/mipsregs.h 2005-01-19 15:10:12.000000000 +0100
-+++ linux-mips/include/asm-mips64/mipsregs.h   2005-03-26 11:47:36.406676569 +0100
++++ linux-mips/include/asm-mips64/mipsregs.h   2005-02-06 22:24:22.000000000 +0100
 @@ -757,10 +757,18 @@
  #define read_c0_config1()     __read_32bit_c0_register($16, 1)
  #define read_c0_config2()     __read_32bit_c0_register($16, 2)
@@ -36895,732 +24981,58 @@ diff -Nur linux-2.4.29/include/asm-ppc/param.h linux-mips/include/asm-ppc/param.
  #endif
  
  #define EXEC_PAGESIZE 4096
-diff -Nur linux-2.4.29/include/asm-ppc/processor.h linux-mips/include/asm-ppc/processor.h
---- linux-2.4.29/include/asm-ppc/processor.h   2004-04-14 15:05:40.000000000 +0200
-+++ linux-mips/include/asm-ppc/processor.h     2005-03-26 11:47:36.510659503 +0100
-@@ -678,7 +678,7 @@
- #define PVR_440GP_RC2 0x40200481
- #define PVR_440GX_RA  0x51b21850
- #define PVR_440GX_RB  0x51b21851
--#define PVR_440GX_RB1 0x51b21852
-+#define PVR_440GX_RC  0x51b21892
- #define       PVR_601         0x00010000
- #define       PVR_602         0x00050000
- #define       PVR_603         0x00030000
 diff -Nur linux-2.4.29/include/asm-s390/param.h linux-mips/include/asm-s390/param.h
 --- linux-2.4.29/include/asm-s390/param.h      2001-02-13 23:13:44.000000000 +0100
 +++ linux-mips/include/asm-s390/param.h        2001-03-09 21:34:48.000000000 +0100
 @@ -11,6 +11,9 @@
  
- #ifndef HZ
- #define HZ 100
-+#ifdef __KERNEL__
-+#define hz_to_std(a) (a)
-+#endif
- #endif
- #define EXEC_PAGESIZE 4096
-diff -Nur linux-2.4.29/include/asm-sh/param.h linux-mips/include/asm-sh/param.h
---- linux-2.4.29/include/asm-sh/param.h        2001-01-04 22:19:13.000000000 +0100
-+++ linux-mips/include/asm-sh/param.h  2001-01-11 05:02:45.000000000 +0100
-@@ -3,6 +3,9 @@
- #ifndef HZ
- #define HZ 100
-+#ifdef __KERNEL__
-+#define hz_to_std(a) (a)
-+#endif
- #endif
- #define EXEC_PAGESIZE 4096
-diff -Nur linux-2.4.29/include/asm-sparc/param.h linux-mips/include/asm-sparc/param.h
---- linux-2.4.29/include/asm-sparc/param.h     2000-10-30 23:34:12.000000000 +0100
-+++ linux-mips/include/asm-sparc/param.h       2000-11-23 03:00:56.000000000 +0100
-@@ -4,6 +4,9 @@
- #ifndef HZ
- #define HZ 100
-+#ifdef __KERNEL__
-+#define hz_to_std(a) (a)
-+#endif
- #endif
- #define EXEC_PAGESIZE 8192    /* Thanks for sun4's we carry baggage... */
-diff -Nur linux-2.4.29/include/asm-sparc/system.h linux-mips/include/asm-sparc/system.h
---- linux-2.4.29/include/asm-sparc/system.h    2004-02-18 14:36:32.000000000 +0100
-+++ linux-mips/include/asm-sparc/system.h      2005-03-26 11:47:36.945588121 +0100
-@@ -295,11 +295,11 @@
- #define wmb() mb()
- #define set_mb(__var, __value)  do { __var = __value; mb(); } while(0)
- #define set_wmb(__var, __value) set_mb(__var, __value)
--#define smp_mb()      __asm__ __volatile__("":::"memory");
--#define smp_rmb()     __asm__ __volatile__("":::"memory");
--#define smp_wmb()     __asm__ __volatile__("":::"memory");
-+#define smp_mb()      __asm__ __volatile__("":::"memory")
-+#define smp_rmb()     __asm__ __volatile__("":::"memory")
-+#define smp_wmb()     __asm__ __volatile__("":::"memory")
--#define nop() __asm__ __volatile__ ("nop");
-+#define nop() __asm__ __volatile__ ("nop")
- /* This has special calling conventions */
- #ifndef CONFIG_SMP
-diff -Nur linux-2.4.29/include/asm-sparc64/atomic.h linux-mips/include/asm-sparc64/atomic.h
---- linux-2.4.29/include/asm-sparc64/atomic.h  2001-07-20 03:11:13.000000000 +0200
-+++ linux-mips/include/asm-sparc64/atomic.h    2005-03-26 11:47:36.964585003 +0100
-@@ -8,31 +8,59 @@
- #ifndef __ARCH_SPARC64_ATOMIC__
- #define __ARCH_SPARC64_ATOMIC__
-+#include <linux/config.h>
-+
- typedef struct { volatile int counter; } atomic_t;
- #define ATOMIC_INIT(i)        { (i) }
- #define atomic_read(v)                ((v)->counter)
- #define atomic_set(v, i)      (((v)->counter) = i)
--extern int __atomic_add(int, atomic_t *);
--extern int __atomic_sub(int, atomic_t *);
-+extern void atomic_add(int, atomic_t *);
-+extern void atomic_sub(int, atomic_t *);
-+
-+extern int atomic_add_ret(int, atomic_t *);
-+extern int atomic_sub_ret(int, atomic_t *);
-+
-+#define atomic_dec_return(v) atomic_sub_ret(1, v)
-+
-+#define atomic_inc_return(v) atomic_add_ret(1, v)
-+
-+#define atomic_sub_return(i, v) atomic_sub_ret(i, v)
-+
-+#define atomic_add_return(i, v) atomic_add_ret(i, v)
-+
-+/*
-+ * atomic_inc_and_test - increment and test
-+ * @v: pointer of type atomic_t
-+ *
-+ * Atomically increments @v by 1
-+ * and returns true if the result is zero, or false for all
-+ * other cases.
-+ */
-+#define atomic_inc_and_test(v) (atomic_inc_return(v) == 0)
-+
-+#define atomic_sub_and_test(i, v) (atomic_sub_ret(i, v) == 0)
--#define atomic_add(i, v) ((void)__atomic_add(i, v))
--#define atomic_sub(i, v) ((void)__atomic_sub(i, v))
-+#define atomic_dec_and_test(v) (atomic_sub_ret(1, v) == 0)
--#define atomic_dec_return(v) __atomic_sub(1, v)
--#define atomic_inc_return(v) __atomic_add(1, v)
-+#define atomic_inc(v) atomic_add(1, v)
--#define atomic_sub_and_test(i, v) (__atomic_sub(i, v) == 0)
--#define atomic_dec_and_test(v) (__atomic_sub(1, v) == 0)
-+#define atomic_dec(v) atomic_sub(1, v)
--#define atomic_inc(v) ((void)__atomic_add(1, v))
--#define atomic_dec(v) ((void)__atomic_sub(1, v))
-+#define atomic_add_negative(i, v) (atomic_add_ret(i, v) < 0)
- /* Atomic operations are already serializing */
-+#ifdef CONFIG_SMP
-+#define smp_mb__before_atomic_dec()   membar("#StoreLoad | #LoadLoad")
-+#define smp_mb__after_atomic_dec()    membar("#StoreLoad | #StoreStore")
-+#define smp_mb__before_atomic_inc()   membar("#StoreLoad | #LoadLoad")
-+#define smp_mb__after_atomic_inc()    membar("#StoreLoad | #StoreStore")
-+#else
- #define smp_mb__before_atomic_dec()   barrier()
- #define smp_mb__after_atomic_dec()    barrier()
- #define smp_mb__before_atomic_inc()   barrier()
- #define smp_mb__after_atomic_inc()    barrier()
-+#endif
- #endif /* !(__ARCH_SPARC64_ATOMIC__) */
-diff -Nur linux-2.4.29/include/asm-sparc64/bitops.h linux-mips/include/asm-sparc64/bitops.h
---- linux-2.4.29/include/asm-sparc64/bitops.h  2001-12-21 18:42:03.000000000 +0100
-+++ linux-mips/include/asm-sparc64/bitops.h    2005-03-26 11:47:37.017576306 +0100
-@@ -1,4 +1,4 @@
--/* $Id$
-+/* $Id$
-  * bitops.h: Bit string operations on the V9.
-  *
-  * Copyright 1996, 1997 David S. Miller (davem@caip.rutgers.edu)
-@@ -7,114 +7,126 @@
- #ifndef _SPARC64_BITOPS_H
- #define _SPARC64_BITOPS_H
-+#include <linux/config.h>
-+#include <linux/compiler.h>
- #include <asm/byteorder.h>
--extern long ___test_and_set_bit(unsigned long nr, volatile void *addr);
--extern long ___test_and_clear_bit(unsigned long nr, volatile void *addr);
--extern long ___test_and_change_bit(unsigned long nr, volatile void *addr);
--
--#define test_and_set_bit(nr,addr)     ({___test_and_set_bit(nr,addr)!=0;})
--#define test_and_clear_bit(nr,addr)   ({___test_and_clear_bit(nr,addr)!=0;})
--#define test_and_change_bit(nr,addr)  ({___test_and_change_bit(nr,addr)!=0;})
--#define set_bit(nr,addr)              ((void)___test_and_set_bit(nr,addr))
--#define clear_bit(nr,addr)            ((void)___test_and_clear_bit(nr,addr))
--#define change_bit(nr,addr)           ((void)___test_and_change_bit(nr,addr))
-+extern int test_and_set_bit(unsigned long nr, volatile void *addr);
-+extern int test_and_clear_bit(unsigned long nr, volatile void *addr);
-+extern int test_and_change_bit(unsigned long nr, volatile void *addr);
-+extern void set_bit(unsigned long nr, volatile void *addr);
-+extern void clear_bit(unsigned long nr, volatile void *addr);
-+extern void change_bit(unsigned long nr, volatile void *addr);
- /* "non-atomic" versions... */
--#define __set_bit(X,Y)                                        \
--do {  unsigned long __nr = (X);                       \
--      long *__m = ((long *) (Y)) + (__nr >> 6);       \
--      *__m |= (1UL << (__nr & 63));                   \
--} while (0)
--#define __clear_bit(X,Y)                              \
--do {  unsigned long __nr = (X);                       \
--      long *__m = ((long *) (Y)) + (__nr >> 6);       \
--      *__m &= ~(1UL << (__nr & 63));                  \
--} while (0)
--#define __change_bit(X,Y)                             \
--do {  unsigned long __nr = (X);                       \
--      long *__m = ((long *) (Y)) + (__nr >> 6);       \
--      *__m ^= (1UL << (__nr & 63));                   \
--} while (0)
--#define __test_and_set_bit(X,Y)                               \
--({    unsigned long __nr = (X);                       \
--      long *__m = ((long *) (Y)) + (__nr >> 6);       \
--      long __old = *__m;                              \
--      long __mask = (1UL << (__nr & 63));             \
--      *__m = (__old | __mask);                        \
--      ((__old & __mask) != 0);                        \
--})
--#define __test_and_clear_bit(X,Y)                     \
--({    unsigned long __nr = (X);                       \
--      long *__m = ((long *) (Y)) + (__nr >> 6);       \
--      long __old = *__m;                              \
--      long __mask = (1UL << (__nr & 63));             \
--      *__m = (__old & ~__mask);                       \
--      ((__old & __mask) != 0);                        \
--})
--#define __test_and_change_bit(X,Y)                    \
--({    unsigned long __nr = (X);                       \
--      long *__m = ((long *) (Y)) + (__nr >> 6);       \
--      long __old = *__m;                              \
--      long __mask = (1UL << (__nr & 63));             \
--      *__m = (__old ^ __mask);                        \
--      ((__old & __mask) != 0);                        \
--})
--#define smp_mb__before_clear_bit()    do { } while(0)
--#define smp_mb__after_clear_bit()     do { } while(0)
-+static __inline__ void __set_bit(int nr, volatile void *addr)
-+{
-+      unsigned long *m;
-+
-+      m = ((unsigned long *)addr) + (nr >> 6);
-+      *m |= (1UL << (nr & 63));
-+}
-+
-+static __inline__ void __clear_bit(int nr, volatile void *addr)
-+{
-+      unsigned long *m;
-+
-+      m = ((unsigned long *)addr) + (nr >> 6);
-+      *m &= ~(1UL << (nr & 63));
-+}
--extern __inline__ int test_bit(int nr, __const__ void *addr)
-+static __inline__ void __change_bit(int nr, volatile void *addr)
- {
--      return (1UL & (((__const__ long *) addr)[nr >> 6] >> (nr & 63))) != 0UL;
-+      unsigned long *m;
-+
-+      m = ((unsigned long *)addr) + (nr >> 6);
-+      *m ^= (1UL << (nr & 63));
-+}
-+
-+static __inline__ int __test_and_set_bit(int nr, volatile void *addr)
-+{
-+      unsigned long *m = ((unsigned long *)addr) + (nr >> 6);
-+      unsigned long old = *m;
-+      unsigned long mask = (1UL << (nr & 63));
-+
-+      *m = (old | mask);
-+      return ((old & mask) != 0);
-+}
-+
-+static __inline__ int __test_and_clear_bit(int nr, volatile void *addr)
-+{
-+      unsigned long *m = ((unsigned long *)addr) + (nr >> 6);
-+      unsigned long old = *m;
-+      unsigned long mask = (1UL << (nr & 63));
-+
-+      *m = (old & ~mask);
-+      return ((old & mask) != 0);
-+}
-+
-+static __inline__ int __test_and_change_bit(int nr, volatile void *addr)
-+{
-+      unsigned long *m = ((unsigned long *)addr) + (nr >> 6);
-+      unsigned long old = *m;
-+      unsigned long mask = (1UL << (nr & 63));
-+
-+      *m = (old ^ mask);
-+      return ((old & mask) != 0);
-+}
-+
-+#ifdef CONFIG_SMP
-+#define smp_mb__before_clear_bit()    membar("#StoreLoad | #LoadLoad")
-+#define smp_mb__after_clear_bit()     membar("#StoreLoad | #StoreStore")
-+#else
-+#define smp_mb__before_clear_bit()    barrier()
-+#define smp_mb__after_clear_bit()     barrier()
-+#endif
-+
-+static __inline__ int test_bit(int nr, __const__ volatile void *_addr)
-+{
-+      __const__ unsigned long *addr;
-+
-+      addr = (__const__ unsigned long *) _addr;
-+
-+      return (1UL & ((addr)[nr >> 6] >> (nr & 63))) != 0UL;
- }
- /* The easy/cheese version for now. */
--extern __inline__ unsigned long ffz(unsigned long word)
-+static __inline__ unsigned long ffz(unsigned long word)
- {
-       unsigned long result;
--#ifdef ULTRA_HAS_POPULATION_COUNT     /* Thanks for nothing Sun... */
--      __asm__ __volatile__(
--"     brz,pn  %0, 1f\n"
--"      neg    %0, %%g1\n"
--"     xnor    %0, %%g1, %%g2\n"
--"     popc    %%g2, %0\n"
--"1:   " : "=&r" (result)
--        : "0" (word)
--        : "g1", "g2");
--#else
--#if 1 /* def EASY_CHEESE_VERSION */
-       result = 0;
-       while(word & 1) {
-               result++;
-               word >>= 1;
-       }
--#else
--      unsigned long tmp;
-+      return result;
-+}
--      result = 0;     
--      tmp = ~word & -~word;
--      if (!(unsigned)tmp) {
--              tmp >>= 32;
--              result = 32;
--      }
--      if (!(unsigned short)tmp) {
--              tmp >>= 16;
--              result += 16;
--      }
--      if (!(unsigned char)tmp) {
--              tmp >>= 8;
--              result += 8;
-+/**
-+ * __ffs - find first bit in word.
-+ * @word: The word to search
-+ *
-+ * Undefined if no bit exists, so code should check against 0 first.
-+ */
-+static __inline__ unsigned long __ffs(unsigned long word)
-+{
-+      unsigned long result = 0;
-+
-+      while (!(word & 1UL)) {
-+              result++;
-+              word >>= 1;
-       }
--      if (tmp & 0xf0) result += 4;
--      if (tmp & 0xcc) result += 2;
--      if (tmp & 0xaa) result ++;
--#endif
--#endif
-       return result;
- }
-+/*
-+ * fls: find last bit set.
-+ */
-+
-+#define fls(x) generic_fls(x)
-+
- #ifdef __KERNEL__
- /*
-@@ -122,8 +134,12 @@
-  * the libc and compiler builtin ffs routines, therefore
-  * differs in spirit from the above ffz (man ffs).
-  */
--
--#define ffs(x) generic_ffs(x)
-+static __inline__ int ffs(int x)
-+{
-+      if (!x)
-+              return 0;
-+      return __ffs((unsigned long)x) + 1;
-+}
- /*
-  * hweightN: returns the hamming weight (i.e. the number
-@@ -132,7 +148,15 @@
- #ifdef ULTRA_HAS_POPULATION_COUNT
--extern __inline__ unsigned int hweight32(unsigned int w)
-+static __inline__ unsigned int hweight64(unsigned long w)
-+{
-+      unsigned int res;
-+
-+      __asm__ ("popc %1,%0" : "=r" (res) : "r" (w));
-+      return res;
-+}
-+
-+static __inline__ unsigned int hweight32(unsigned int w)
- {
-       unsigned int res;
-@@ -140,7 +164,7 @@
-       return res;
- }
--extern __inline__ unsigned int hweight16(unsigned int w)
-+static __inline__ unsigned int hweight16(unsigned int w)
- {
-       unsigned int res;
-@@ -148,7 +172,7 @@
-       return res;
- }
--extern __inline__ unsigned int hweight8(unsigned int w)
-+static __inline__ unsigned int hweight8(unsigned int w)
- {
-       unsigned int res;
-@@ -158,6 +182,7 @@
- #else
-+#define hweight64(x) generic_hweight64(x)
- #define hweight32(x) generic_hweight32(x)
- #define hweight16(x) generic_hweight16(x)
- #define hweight8(x) generic_hweight8(x)
-@@ -170,7 +195,7 @@
-  * on Linus's ALPHA routines, which are pretty portable BTW.
-  */
--extern __inline__ unsigned long find_next_zero_bit(void *addr, unsigned long size, unsigned long offset)
-+static __inline__ unsigned long find_next_zero_bit(void *addr, unsigned long size, unsigned long offset)
- {
-       unsigned long *p = ((unsigned long *) addr) + (offset >> 6);
-       unsigned long result = offset & ~63UL;
-@@ -211,15 +236,12 @@
- #define find_first_zero_bit(addr, size) \
-         find_next_zero_bit((addr), (size), 0)
--extern long ___test_and_set_le_bit(int nr, volatile void *addr);
--extern long ___test_and_clear_le_bit(int nr, volatile void *addr);
--
--#define test_and_set_le_bit(nr,addr)  ({___test_and_set_le_bit(nr,addr)!=0;})
--#define test_and_clear_le_bit(nr,addr)        ({___test_and_clear_le_bit(nr,addr)!=0;})
--#define set_le_bit(nr,addr)           ((void)___test_and_set_le_bit(nr,addr))
--#define clear_le_bit(nr,addr)         ((void)___test_and_clear_le_bit(nr,addr))
-+#define test_and_set_le_bit(nr,addr)  \
-+      test_and_set_bit((nr) ^ 0x38, (addr))
-+#define test_and_clear_le_bit(nr,addr)        \
-+      test_and_clear_bit((nr) ^ 0x38, (addr))
--extern __inline__ int test_le_bit(int nr, __const__ void * addr)
-+static __inline__ int test_le_bit(int nr, __const__ void *addr)
- {
-       int                     mask;
-       __const__ unsigned char *ADDR = (__const__ unsigned char *) addr;
-@@ -232,7 +254,7 @@
- #define find_first_zero_le_bit(addr, size) \
-         find_next_zero_le_bit((addr), (size), 0)
--extern __inline__ unsigned long find_next_zero_le_bit(void *addr, unsigned long size, unsigned long offset)
-+static __inline__ unsigned long find_next_zero_le_bit(void *addr, unsigned long size, unsigned long offset)
- {
-       unsigned long *p = ((unsigned long *) addr) + (offset >> 6);
-       unsigned long result = offset & ~63UL;
-@@ -271,18 +293,41 @@
- #ifdef __KERNEL__
--#define ext2_set_bit                  test_and_set_le_bit
--#define ext2_clear_bit                        test_and_clear_le_bit
--#define ext2_test_bit                         test_le_bit
--#define ext2_find_first_zero_bit      find_first_zero_le_bit
--#define ext2_find_next_zero_bit               find_next_zero_le_bit
-+#define __set_le_bit(nr, addr) \
-+      __set_bit((nr) ^ 0x38, (addr))
-+#define __clear_le_bit(nr, addr) \
-+      __clear_bit((nr) ^ 0x38, (addr))
-+#define __test_and_clear_le_bit(nr, addr) \
-+      __test_and_clear_bit((nr) ^ 0x38, (addr))
-+#define __test_and_set_le_bit(nr, addr) \
-+      __test_and_set_bit((nr) ^ 0x38, (addr))
-+
-+#define ext2_set_bit(nr,addr) \
-+      __test_and_set_le_bit((nr),(unsigned long *)(addr))
-+#define ext2_set_bit_atomic(lock,nr,addr) \
-+      test_and_set_le_bit((nr),(unsigned long *)(addr))
-+#define ext2_clear_bit(nr,addr)       \
-+      __test_and_clear_le_bit((nr),(unsigned long *)(addr))
-+#define ext2_clear_bit_atomic(lock,nr,addr) \
-+      test_and_clear_le_bit((nr),(unsigned long *)(addr))
-+#define ext2_test_bit(nr,addr)        \
-+      test_le_bit((nr),(unsigned long *)(addr))
-+#define ext2_find_first_zero_bit(addr, size) \
-+      find_first_zero_le_bit((unsigned long *)(addr), (size))
-+#define ext2_find_next_zero_bit(addr, size, off) \
-+      find_next_zero_le_bit((unsigned long *)(addr), (size), (off))
- /* Bitmap functions for the minix filesystem.  */
--#define minix_test_and_set_bit(nr,addr) test_and_set_bit(nr,addr)
--#define minix_set_bit(nr,addr) set_bit(nr,addr)
--#define minix_test_and_clear_bit(nr,addr) test_and_clear_bit(nr,addr)
--#define minix_test_bit(nr,addr) test_bit(nr,addr)
--#define minix_find_first_zero_bit(addr,size) find_first_zero_bit(addr,size)
-+#define minix_test_and_set_bit(nr,addr)       \
-+      test_and_set_bit((nr),(unsigned long *)(addr))
-+#define minix_set_bit(nr,addr)        \
-+      set_bit((nr),(unsigned long *)(addr))
-+#define minix_test_and_clear_bit(nr,addr) \
-+      test_and_clear_bit((nr),(unsigned long *)(addr))
-+#define minix_test_bit(nr,addr)       \
-+      test_bit((nr),(unsigned long *)(addr))
-+#define minix_find_first_zero_bit(addr,size) \
-+      find_first_zero_bit((unsigned long *)(addr),(size))
- #endif /* __KERNEL__ */
-diff -Nur linux-2.4.29/include/asm-sparc64/param.h linux-mips/include/asm-sparc64/param.h
---- linux-2.4.29/include/asm-sparc64/param.h   2000-10-30 23:34:12.000000000 +0100
-+++ linux-mips/include/asm-sparc64/param.h     2000-11-23 03:00:56.000000000 +0100
-@@ -4,6 +4,9 @@
- #ifndef HZ
- #define HZ 100
-+#ifdef __KERNEL__
-+#define hz_to_std(a) (a)
-+#endif
- #endif
- #define EXEC_PAGESIZE 8192    /* Thanks for sun4's we carry baggage... */
-diff -Nur linux-2.4.29/include/asm-sparc64/system.h linux-mips/include/asm-sparc64/system.h
---- linux-2.4.29/include/asm-sparc64/system.h  2003-06-13 16:51:38.000000000 +0200
-+++ linux-mips/include/asm-sparc64/system.h    2005-03-26 11:47:37.092563999 +0100
-@@ -106,9 +106,9 @@
- #define nop()                 __asm__ __volatile__ ("nop")
--#define membar(type)  __asm__ __volatile__ ("membar " type : : : "memory");
-+#define membar(type)  __asm__ __volatile__ ("membar " type : : : "memory")
- #define mb()          \
--      membar("#LoadLoad | #LoadStore | #StoreStore | #StoreLoad");
-+      membar("#LoadLoad | #LoadStore | #StoreStore | #StoreLoad")
- #define rmb()         membar("#LoadLoad")
- #define wmb()         membar("#StoreStore")
- #define set_mb(__var, __value) \
-@@ -121,9 +121,9 @@
- #define smp_rmb()     rmb()
- #define smp_wmb()     wmb()
- #else
--#define smp_mb()      __asm__ __volatile__("":::"memory");
--#define smp_rmb()     __asm__ __volatile__("":::"memory");
--#define smp_wmb()     __asm__ __volatile__("":::"memory");
-+#define smp_mb()      __asm__ __volatile__("":::"memory")
-+#define smp_rmb()     __asm__ __volatile__("":::"memory")
-+#define smp_wmb()     __asm__ __volatile__("":::"memory")
- #endif
- #define flushi(addr)  __asm__ __volatile__ ("flush %0" : : "r" (addr) : "memory")
-@@ -246,6 +246,7 @@
- extern __inline__ unsigned long xchg32(__volatile__ unsigned int *m, unsigned int val)
- {
-       __asm__ __volatile__(
-+"     membar          #StoreLoad | #LoadLoad\n"
- "     mov             %0, %%g5\n"
- "1:   lduw            [%2], %%g7\n"
- "     cas             [%2], %%g7, %0\n"
-@@ -262,6 +263,7 @@
- extern __inline__ unsigned long xchg64(__volatile__ unsigned long *m, unsigned long val)
- {
-       __asm__ __volatile__(
-+"     membar          #StoreLoad | #LoadLoad\n"
- "     mov             %0, %%g5\n"
- "1:   ldx             [%2], %%g7\n"
- "     casx            [%2], %%g7, %0\n"
-@@ -306,7 +308,8 @@
- extern __inline__ unsigned long
- __cmpxchg_u32(volatile int *m, int old, int new)
- {
--      __asm__ __volatile__("cas [%2], %3, %0\n\t"
-+      __asm__ __volatile__("membar #StoreLoad | #LoadLoad\n"
-+                           "cas [%2], %3, %0\n\t"
-                            "membar #StoreLoad | #StoreStore"
-                            : "=&r" (new)
-                            : "0" (new), "r" (m), "r" (old)
-@@ -318,7 +321,8 @@
- extern __inline__ unsigned long
- __cmpxchg_u64(volatile long *m, unsigned long old, unsigned long new)
- {
--      __asm__ __volatile__("casx [%2], %3, %0\n\t"
-+      __asm__ __volatile__("membar #StoreLoad | #LoadLoad\n"
-+                           "casx [%2], %3, %0\n\t"
-                            "membar #StoreLoad | #StoreStore"
-                            : "=&r" (new)
-                            : "0" (new), "r" (m), "r" (old)
-diff -Nur linux-2.4.29/include/asm-x86_64/acpi.h linux-mips/include/asm-x86_64/acpi.h
---- linux-2.4.29/include/asm-x86_64/acpi.h     2004-08-08 01:26:06.000000000 +0200
-+++ linux-mips/include/asm-x86_64/acpi.h       2005-03-26 11:47:37.164552184 +0100
-@@ -118,6 +118,7 @@
- extern int acpi_strict;
- extern int acpi_disabled;
- extern int acpi_ht;
-+extern int acpi_skip_timer_override;
- static inline void disable_acpi(void) 
- { 
-       acpi_disabled = 1;
-diff -Nur linux-2.4.29/include/linux/ata.h linux-mips/include/linux/ata.h
---- linux-2.4.29/include/linux/ata.h   2005-01-19 15:10:12.000000000 +0100
-+++ linux-mips/include/linux/ata.h     2005-03-26 11:47:37.226542010 +0100
-@@ -123,6 +123,8 @@
-       ATA_CMD_PIO_WRITE_EXT   = 0x34,
-       ATA_CMD_SET_FEATURES    = 0xEF,
-       ATA_CMD_PACKET          = 0xA0,
-+      ATA_CMD_VERIFY          = 0x40,
-+      ATA_CMD_VERIFY_EXT      = 0x42,
-       /* SETFEATURES stuff */
-       SETFEATURES_XFER        = 0x03,
-diff -Nur linux-2.4.29/include/linux/brlock.h linux-mips/include/linux/brlock.h
---- linux-2.4.29/include/linux/brlock.h        2002-11-29 00:53:15.000000000 +0100
-+++ linux-mips/include/linux/brlock.h  2005-03-26 11:47:37.233540861 +0100
-@@ -18,16 +18,6 @@
-  * Registry idea and naming [ crutial! :-) ] by:
-  *
-  *                 David S. Miller <davem@redhat.com>
-- *
-- * David has an implementation that doesn't use atomic operations in
-- * the read branch via memory ordering tricks - i guess we need to
-- * split this up into a per-arch thing? The atomicity issue is a
-- * secondary item in profiles, at least on x86 platforms.
-- *
-- * The atomic op version overhead is indeed a big deal on
-- * load-locked/store-conditional cpus (ALPHA/MIPS/PPC) and
-- * compare-and-swap cpus (Sparc64).  So we control which
-- * implementation to use with a __BRLOCK_USE_ATOMICS define. -DaveM
-  */
- /* Register bigreader lock indices here. */
-@@ -45,17 +35,7 @@
- #include <linux/cache.h>
- #include <linux/spinlock.h>
--#if defined(__i386__) || defined(__ia64__) || defined(__x86_64__)
--#define __BRLOCK_USE_ATOMICS
--#else
--#undef __BRLOCK_USE_ATOMICS
--#endif
--
--#ifdef __BRLOCK_USE_ATOMICS
--typedef rwlock_t      brlock_read_lock_t;
--#else
- typedef unsigned int  brlock_read_lock_t;
--#endif
- /*
-  * align last allocated index to the next cacheline:
-@@ -65,39 +45,14 @@
- extern brlock_read_lock_t __brlock_array[NR_CPUS][__BR_IDX_MAX];
--#ifndef __BRLOCK_USE_ATOMICS
- struct br_wrlock {
-       spinlock_t lock;
- } __attribute__ ((__aligned__(SMP_CACHE_BYTES)));
- extern struct br_wrlock __br_write_locks[__BR_IDX_MAX];
--#endif
- extern void __br_lock_usage_bug (void);
--#ifdef __BRLOCK_USE_ATOMICS
--
--static inline void br_read_lock (enum brlock_indices idx)
--{
--      /*
--       * This causes a link-time bug message if an
--       * invalid index is used:
--       */
--      if (idx >= __BR_END)
--              __br_lock_usage_bug();
--
--      read_lock(&__brlock_array[smp_processor_id()][idx]);
--}
--
--static inline void br_read_unlock (enum brlock_indices idx)
--{
--      if (idx >= __BR_END)
--              __br_lock_usage_bug();
--
--      read_unlock(&__brlock_array[smp_processor_id()][idx]);
--}
--
--#else /* ! __BRLOCK_USE_ATOMICS */
- static inline void br_read_lock (enum brlock_indices idx)
- {
-       unsigned int *ctr;
-@@ -149,7 +104,6 @@
-       wmb();
-       (*ctr)--;
- }
--#endif /* __BRLOCK_USE_ATOMICS */
+ #ifndef HZ
+ #define HZ 100
++#ifdef __KERNEL__
++#define hz_to_std(a) (a)
++#endif
+ #endif
  
- /* write path not inlined - it's rare and larger */
+ #define EXEC_PAGESIZE 4096
+diff -Nur linux-2.4.29/include/asm-sh/param.h linux-mips/include/asm-sh/param.h
+--- linux-2.4.29/include/asm-sh/param.h        2001-01-04 22:19:13.000000000 +0100
++++ linux-mips/include/asm-sh/param.h  2001-01-11 05:02:45.000000000 +0100
+@@ -3,6 +3,9 @@
  
-diff -Nur linux-2.4.29/include/linux/fs.h linux-mips/include/linux/fs.h
---- linux-2.4.29/include/linux/fs.h    2004-11-17 12:54:22.000000000 +0100
-+++ linux-mips/include/linux/fs.h      2005-03-26 11:47:37.386515755 +0100
-@@ -576,6 +576,7 @@
-       unsigned int            f_uid, f_gid;
-       int                     f_error;
+ #ifndef HZ
+ #define HZ 100
++#ifdef __KERNEL__
++#define hz_to_std(a) (a)
++#endif
+ #endif
  
-+      size_t                  f_maxcount;
-       unsigned long           f_version;
+ #define EXEC_PAGESIZE 4096
+diff -Nur linux-2.4.29/include/asm-sparc/param.h linux-mips/include/asm-sparc/param.h
+--- linux-2.4.29/include/asm-sparc/param.h     2000-10-30 23:34:12.000000000 +0100
++++ linux-mips/include/asm-sparc/param.h       2000-11-23 03:00:56.000000000 +0100
+@@ -4,6 +4,9 @@
  
-       /* needed for tty driver, and maybe others */
-@@ -1056,14 +1057,7 @@
-       return 0;
- }
+ #ifndef HZ
+ #define HZ 100
++#ifdef __KERNEL__
++#define hz_to_std(a) (a)
++#endif
+ #endif
  
--static inline int locks_verify_area(int read_write, struct inode *inode,
--                                  struct file *filp, loff_t offset,
--                                  size_t count)
--{
--      if (inode->i_flock && MANDATORY_LOCK(inode))
--              return locks_mandatory_area(read_write, inode, filp, offset, count);
--      return 0;
--}
-+extern int rw_verify_area(int, struct file *, loff_t *, size_t);
+ #define EXEC_PAGESIZE 8192    /* Thanks for sun4's we carry baggage... */
+diff -Nur linux-2.4.29/include/asm-sparc64/param.h linux-mips/include/asm-sparc64/param.h
+--- linux-2.4.29/include/asm-sparc64/param.h   2000-10-30 23:34:12.000000000 +0100
++++ linux-mips/include/asm-sparc64/param.h     2000-11-23 03:00:56.000000000 +0100
+@@ -4,6 +4,9 @@
+ #ifndef HZ
+ #define HZ 100
++#ifdef __KERNEL__
++#define hz_to_std(a) (a)
++#endif
+ #endif
  
- static inline int locks_verify_truncate(struct inode *inode,
-                                   struct file *filp,
+ #define EXEC_PAGESIZE 8192    /* Thanks for sun4's we carry baggage... */
 diff -Nur linux-2.4.29/include/linux/i2c-algo-au1550.h linux-mips/include/linux/i2c-algo-au1550.h
 --- linux-2.4.29/include/linux/i2c-algo-au1550.h       1970-01-01 01:00:00.000000000 +0100
 +++ linux-mips/include/linux/i2c-algo-au1550.h 2004-07-07 02:38:02.000000000 +0200
@@ -37678,229 +25090,6 @@ diff -Nur linux-2.4.29/include/linux/i2c-id.h linux-mips/include/linux/i2c-id.h
  /* --- SMBus only adapters                                            */
  #define I2C_HW_SMBUS_PIIX4    0x00
  #define I2C_HW_SMBUS_ALI15X3  0x01
-diff -Nur linux-2.4.29/include/linux/jbd.h linux-mips/include/linux/jbd.h
---- linux-2.4.29/include/linux/jbd.h   2004-11-17 12:54:22.000000000 +0100
-+++ linux-mips/include/linux/jbd.h     2005-03-26 11:47:37.416510832 +0100
-@@ -848,7 +848,7 @@
- extern int    log_space_left (journal_t *); /* Called with journal locked */
- extern tid_t  log_start_commit (journal_t *, transaction_t *);
--extern void   log_wait_commit (journal_t *, tid_t);
-+extern int    log_wait_commit (journal_t *, tid_t);
- extern int    log_do_checkpoint (journal_t *, int);
- extern void   log_wait_for_space(journal_t *, int nblocks);
-diff -Nur linux-2.4.29/include/linux/libata-compat.h linux-mips/include/linux/libata-compat.h
---- linux-2.4.29/include/linux/libata-compat.h 2005-01-19 15:10:12.000000000 +0100
-+++ linux-mips/include/linux/libata-compat.h   2005-03-26 11:47:37.456504268 +0100
-@@ -1,8 +1,16 @@
- #ifndef __LIBATA_COMPAT_H__
- #define __LIBATA_COMPAT_H__
-+#include <linux/types.h>
- #include <linux/delay.h>
- #include <linux/pci.h>
-+#include <linux/slab.h>
-+
-+typedef u32 __le32;
-+typedef u64 __le64;
-+
-+#define DMA_64BIT_MASK 0xffffffffffffffffULL
-+#define DMA_32BIT_MASK 0x00000000ffffffffULL
- #define MODULE_VERSION(ver_str)
-@@ -10,11 +18,6 @@
-       struct pci_dev pdev;
- };
--static inline void libata_msleep(unsigned long msecs)
--{
--      msleep(msecs);
--}
--
- static inline struct pci_dev *to_pci_dev(struct device *dev)
- {
-       return (struct pci_dev *) dev;
-@@ -47,4 +50,13 @@
- #define dev_set_drvdata(dev,ptr) \
-       pci_set_drvdata(to_pci_dev(dev),(ptr))
-+static inline void *kcalloc(size_t nmemb, size_t size, int flags)
-+{
-+      size_t total = nmemb * size;
-+      void *mem = kmalloc(total, flags);
-+      if (mem)
-+              memset(mem, 0, total);
-+      return mem;
-+}
-+
- #endif /* __LIBATA_COMPAT_H__ */
-diff -Nur linux-2.4.29/include/linux/libata.h linux-mips/include/linux/libata.h
---- linux-2.4.29/include/linux/libata.h        2005-01-19 15:10:12.000000000 +0100
-+++ linux-mips/include/linux/libata.h  2005-03-26 11:47:37.460503612 +0100
-@@ -335,6 +335,8 @@
-       void (*exec_command)(struct ata_port *ap, struct ata_taskfile *tf);
-       u8   (*check_status)(struct ata_port *ap);
-+      u8   (*check_altstatus)(struct ata_port *ap);
-+      u8   (*check_err)(struct ata_port *ap);
-       void (*dev_select)(struct ata_port *ap, unsigned int device);
-       void (*phy_reset) (struct ata_port *ap);
-@@ -361,6 +363,9 @@
-       void (*port_stop) (struct ata_port *ap);
-       void (*host_stop) (struct ata_host_set *host_set);
-+
-+      void (*bmdma_stop) (struct ata_port *ap);
-+      u8   (*bmdma_status) (struct ata_port *ap);
- };
- struct ata_port_info {
-@@ -401,6 +406,8 @@
- extern void ata_noop_dev_select (struct ata_port *ap, unsigned int device);
- extern void ata_std_dev_select (struct ata_port *ap, unsigned int device);
- extern u8 ata_check_status(struct ata_port *ap);
-+extern u8 ata_altstatus(struct ata_port *ap);
-+extern u8 ata_chk_err(struct ata_port *ap);
- extern void ata_exec_command(struct ata_port *ap, struct ata_taskfile *tf);
- extern int ata_port_start (struct ata_port *ap);
- extern void ata_port_stop (struct ata_port *ap);
-@@ -416,6 +423,8 @@
-                             unsigned int ofs, unsigned int len);
- extern void ata_bmdma_setup (struct ata_queued_cmd *qc);
- extern void ata_bmdma_start (struct ata_queued_cmd *qc);
-+extern void ata_bmdma_stop(struct ata_port *ap);
-+extern u8   ata_bmdma_status(struct ata_port *ap);
- extern void ata_bmdma_irq_clear(struct ata_port *ap);
- extern void ata_qc_complete(struct ata_queued_cmd *qc, u8 drv_stat);
- extern void ata_eng_timeout(struct ata_port *ap);
-@@ -435,8 +444,6 @@
- extern struct ata_probe_ent *
- ata_pci_init_native_mode(struct pci_dev *pdev, struct ata_port_info **port);
--extern struct ata_probe_ent *
--ata_pci_init_legacy_mode(struct pci_dev *pdev, struct ata_port_info **port);
- extern int pci_test_config_bits(struct pci_dev *pdev, struct pci_bits *bits);
- #endif /* CONFIG_PCI */
-@@ -453,26 +460,11 @@
-               (dev->class == ATA_DEV_ATAPI));
- }
--static inline u8 ata_chk_err(struct ata_port *ap)
--{
--      if (ap->flags & ATA_FLAG_MMIO) {
--              return readb((void __iomem *) ap->ioaddr.error_addr);
--      }
--      return inb(ap->ioaddr.error_addr);
--}
--
- static inline u8 ata_chk_status(struct ata_port *ap)
- {
-       return ap->ops->check_status(ap);
- }
--static inline u8 ata_altstatus(struct ata_port *ap)
--{
--      if (ap->flags & ATA_FLAG_MMIO)
--              return readb((void __iomem *)ap->ioaddr.altstatus_addr);
--      return inb(ap->ioaddr.altstatus_addr);
--}
--
- static inline void ata_pause(struct ata_port *ap)
- {
-       ata_altstatus(ap);
-@@ -596,46 +588,6 @@
-       return ((scr_read(ap, SCR_STATUS) & 0xf) == 0x3) ? 1 : 0;
- }
--static inline void ata_bmdma_stop(struct ata_port *ap)
--{
--      if (ap->flags & ATA_FLAG_MMIO) {
--              void __iomem *mmio = (void __iomem *) ap->ioaddr.bmdma_addr;
--
--              /* clear start/stop bit */
--              writeb(readb(mmio + ATA_DMA_CMD) & ~ATA_DMA_START,
--                    mmio + ATA_DMA_CMD);
--      } else {
--              /* clear start/stop bit */
--              outb(inb(ap->ioaddr.bmdma_addr + ATA_DMA_CMD) & ~ATA_DMA_START,
--                  ap->ioaddr.bmdma_addr + ATA_DMA_CMD);
--      }
--
--      /* one-PIO-cycle guaranteed wait, per spec, for HDMA1:0 transition */
--      ata_altstatus(ap);            /* dummy read */
--}
--
--static inline void ata_bmdma_ack_irq(struct ata_port *ap)
--{
--      if (ap->flags & ATA_FLAG_MMIO) {
--              void __iomem *mmio = ((void __iomem *) ap->ioaddr.bmdma_addr) + ATA_DMA_STATUS;
--              writeb(readb(mmio), mmio);
--      } else {
--              unsigned long addr = ap->ioaddr.bmdma_addr + ATA_DMA_STATUS;
--              outb(inb(addr), addr);
--      }
--}
--
--static inline u8 ata_bmdma_status(struct ata_port *ap)
--{
--      u8 host_stat;
--      if (ap->flags & ATA_FLAG_MMIO) {
--              void __iomem *mmio = (void __iomem *) ap->ioaddr.bmdma_addr;
--              host_stat = readb(mmio + ATA_DMA_STATUS);
--      } else
--              host_stat = inb(ap->ioaddr.bmdma_addr + ATA_DMA_STATUS);
--      return host_stat;
--}
--
- static inline int ata_try_flush_cache(struct ata_device *dev)
- {
-       return ata_id_wcache_enabled(dev->id) ||
-diff -Nur linux-2.4.29/include/linux/netfilter_ipv4/ip_conntrack.h linux-mips/include/linux/netfilter_ipv4/ip_conntrack.h
---- linux-2.4.29/include/linux/netfilter_ipv4/ip_conntrack.h   2004-11-17 12:54:22.000000000 +0100
-+++ linux-mips/include/linux/netfilter_ipv4/ip_conntrack.h     2005-03-26 11:47:37.735458485 +0100
-@@ -249,10 +249,9 @@
- /* Call me when a conntrack is destroyed. */
- extern void (*ip_conntrack_destroyed)(struct ip_conntrack *conntrack);
--extern int ip_ct_no_defrag;
- /* Returns new sk_buff, or NULL */
- struct sk_buff *
--ip_ct_gather_frags(struct sk_buff *skb);
-+ip_ct_gather_frags(struct sk_buff *skb, u_int32_t user);
- /* Delete all conntracks which match. */
- extern void
-diff -Nur linux-2.4.29/include/linux/netlink.h linux-mips/include/linux/netlink.h
---- linux-2.4.29/include/linux/netlink.h       2005-01-19 15:10:12.000000000 +0100
-+++ linux-mips/include/linux/netlink.h 2005-03-26 11:47:37.463503119 +0100
-@@ -117,10 +117,9 @@
- /*
-  *    skb should fit one page. This choice is good for headerless malloc.
-- *
-- *      FIXME: What is the best size for SLAB???? --ANK
-  */
--#define NLMSG_GOODSIZE (PAGE_SIZE - ((sizeof(struct sk_buff)+0xF)&~0xF))
-+#define NLMSG_GOODORDER 0
-+#define NLMSG_GOODSIZE (SKB_MAX_ORDER(0, NLMSG_GOODORDER))
- struct netlink_callback
-diff -Nur linux-2.4.29/include/linux/pci_ids.h linux-mips/include/linux/pci_ids.h
---- linux-2.4.29/include/linux/pci_ids.h       2005-01-19 15:10:12.000000000 +0100
-+++ linux-mips/include/linux/pci_ids.h 2005-03-26 11:47:37.534491468 +0100
-@@ -1937,7 +1937,6 @@
- #define PCI_DEVICE_ID_INTEL_82801EB_5 0x24d5
- #define PCI_DEVICE_ID_INTEL_82801EB_6 0x24d6
- #define PCI_DEVICE_ID_INTEL_82801EB_7 0x24d7
--#define PCI_DEVICE_ID_INTEL_82801DB_10        0x24ca
- #define PCI_DEVICE_ID_INTEL_82801EB_11        0x24db
- #define PCI_DEVICE_ID_INTEL_82801EB_13        0x24dd
- #define PCI_DEVICE_ID_INTEL_ESB_0     0x25a0
 diff -Nur linux-2.4.29/include/linux/sched.h linux-mips/include/linux/sched.h
 --- linux-2.4.29/include/linux/sched.h 2005-01-19 15:10:12.000000000 +0100
 +++ linux-mips/include/linux/sched.h   2004-11-29 18:47:18.000000000 +0100
@@ -37928,30 +25117,6 @@ diff -Nur linux-2.4.29/include/linux/serial.h linux-mips/include/linux/serial.h
  
  #define SERIAL_IO_PORT        0
  #define SERIAL_IO_HUB6        1
-diff -Nur linux-2.4.29/include/linux/skbuff.h linux-mips/include/linux/skbuff.h
---- linux-2.4.29/include/linux/skbuff.h        2004-08-08 01:26:06.000000000 +0200
-+++ linux-mips/include/linux/skbuff.h  2005-03-26 11:47:37.600480638 +0100
-@@ -290,15 +290,11 @@
-  
- static inline void kfree_skb(struct sk_buff *skb)
- {
--      if (atomic_read(&skb->users) == 1 || atomic_dec_and_test(&skb->users))
--              __kfree_skb(skb);
--}
--
--/* Use this if you didn't touch the skb state [for fast switching] */
--static inline void kfree_skb_fast(struct sk_buff *skb)
--{
--      if (atomic_read(&skb->users) == 1 || atomic_dec_and_test(&skb->users))
--              kfree_skbmem(skb);      
-+      if (likely(atomic_read(&skb->users) == 1))
-+              smp_rmb();
-+      else if (likely(!atomic_dec_and_test(&skb->users)))
-+              return;
-+      __kfree_skb(skb);
- }
- /**
 diff -Nur linux-2.4.29/include/linux/swap.h linux-mips/include/linux/swap.h
 --- linux-2.4.29/include/linux/swap.h  2005-01-19 15:10:12.000000000 +0100
 +++ linux-mips/include/linux/swap.h    2004-11-29 18:47:18.000000000 +0100
@@ -37986,103 +25151,6 @@ diff -Nur linux-2.4.29/include/linux/swap.h linux-mips/include/linux/swap.h
  /*
   * Max bad pages in the new format..
   */
-diff -Nur linux-2.4.29/include/linux/sysctl.h linux-mips/include/linux/sysctl.h
---- linux-2.4.29/include/linux/sysctl.h        2005-01-19 15:10:13.000000000 +0100
-+++ linux-mips/include/linux/sysctl.h  2005-03-26 11:47:37.673468659 +0100
-@@ -326,6 +326,7 @@
-       NET_TCP_BIC_LOW_WINDOW=104,
-       NET_TCP_DEFAULT_WIN_SCALE=105,
-       NET_TCP_MODERATE_RCVBUF=106,
-+      NET_TCP_BIC_BETA=108,
- };
- enum {
-diff -Nur linux-2.4.29/include/net/dst.h linux-mips/include/net/dst.h
---- linux-2.4.29/include/net/dst.h     2003-08-25 13:44:44.000000000 +0200
-+++ linux-mips/include/net/dst.h       2005-03-26 11:47:37.821444373 +0100
-@@ -104,8 +104,10 @@
- static inline
- void dst_release(struct dst_entry * dst)
- {
--      if (dst)
-+      if (dst) {
-+              smp_mb__before_atomic_dec();
-               atomic_dec(&dst->__refcnt);
-+      }
- }
- extern void * dst_alloc(struct dst_ops * ops);
-diff -Nur linux-2.4.29/include/net/ip.h linux-mips/include/net/ip.h
---- linux-2.4.29/include/net/ip.h      2005-01-19 15:10:13.000000000 +0100
-+++ linux-mips/include/net/ip.h        2005-03-26 11:47:37.822444209 +0100
-@@ -227,9 +227,19 @@
- /*
-  *    Functions provided by ip_fragment.o
-  */
-- 
--struct sk_buff *ip_defrag(struct sk_buff *skb);
--extern void ipfrag_flush(void);
-+
-+enum ip_defrag_users
-+{
-+      IP_DEFRAG_LOCAL_DELIVER,
-+      IP_DEFRAG_CALL_RA_CHAIN,
-+      IP_DEFRAG_CONNTRACK_IN,
-+      IP_DEFRAG_CONNTRACK_OUT,
-+      IP_DEFRAG_NAT_OUT,
-+      IP_DEFRAG_VS_OUT,
-+      IP_DEFRAG_VS_FWD
-+};
-+
-+struct sk_buff *ip_defrag(struct sk_buff *skb, u32 user);
- extern int ip_frag_nqueues;
- extern atomic_t ip_frag_mem;
-diff -Nur linux-2.4.29/include/net/tcp.h linux-mips/include/net/tcp.h
---- linux-2.4.29/include/net/tcp.h     2004-11-17 12:54:22.000000000 +0100
-+++ linux-mips/include/net/tcp.h       2005-03-26 11:47:37.891432886 +0100
-@@ -395,9 +395,8 @@
- # define TCP_TW_RECYCLE_TICK (12+2-TCP_TW_RECYCLE_SLOTS_LOG)
- #endif
--#define BICTCP_1_OVER_BETA    8       /*
--                                       * Fast recovery
--                                       * multiplicative decrease factor
-+#define BICTCP_BETA_SCALE    1024     /* Scale factor beta calculation
-+                                       * max_cwnd = snd_cwnd * beta
-                                        */
- #define BICTCP_MAX_INCREMENT 32               /*
-                                        * Limit on the amount of
-@@ -491,6 +490,7 @@
- extern int sysctl_tcp_bic;
- extern int sysctl_tcp_bic_fast_convergence;
- extern int sysctl_tcp_bic_low_window;
-+extern int sysctl_tcp_bic_beta;
- extern int sysctl_tcp_default_win_scale;
- extern int sysctl_tcp_moderate_rcvbuf;
-@@ -1132,15 +1132,16 @@
-       if (tcp_is_bic(tp)) {
-               if (sysctl_tcp_bic_fast_convergence &&
-                   tp->snd_cwnd < tp->bictcp.last_max_cwnd)
--                      tp->bictcp.last_max_cwnd
--                              = (tp->snd_cwnd * (2*BICTCP_1_OVER_BETA-1))
--                              / (BICTCP_1_OVER_BETA/2);
-+                      tp->bictcp.last_max_cwnd = (tp->snd_cwnd * 
-+                                                  (BICTCP_BETA_SCALE
-+                                                   + sysctl_tcp_bic_beta))
-+                              / (2 * BICTCP_BETA_SCALE);
-               else
-                       tp->bictcp.last_max_cwnd = tp->snd_cwnd;
-               if (tp->snd_cwnd > sysctl_tcp_bic_low_window)
--                      return max(tp->snd_cwnd - (tp->snd_cwnd/BICTCP_1_OVER_BETA),
--                                 2U);
-+                      return max((tp->snd_cwnd * sysctl_tcp_bic_beta)
-+                                 / BICTCP_BETA_SCALE, 2U);
-       }
-       return max(tp->snd_cwnd >> 1U, 2U);
 diff -Nur linux-2.4.29/include/video/newport.h linux-mips/include/video/newport.h
 --- linux-2.4.29/include/video/newport.h       2001-04-12 21:20:31.000000000 +0200
 +++ linux-mips/include/video/newport.h 2004-09-23 15:32:29.000000000 +0200
@@ -38278,46 +25346,6 @@ diff -Nur linux-2.4.29/kernel/sys.c linux-mips/kernel/sys.c
  }
  
  /*
-diff -Nur linux-2.4.29/lib/brlock.c linux-mips/lib/brlock.c
---- linux-2.4.29/lib/brlock.c  2004-11-17 12:54:22.000000000 +0100
-+++ linux-mips/lib/brlock.c    2005-03-26 11:47:38.065404334 +0100
-@@ -15,29 +15,6 @@
- #include <linux/sched.h>
- #include <linux/brlock.h>
--#ifdef __BRLOCK_USE_ATOMICS
--
--brlock_read_lock_t __brlock_array[NR_CPUS][__BR_IDX_MAX] =
--   { [0 ... NR_CPUS-1] = { [0 ... __BR_IDX_MAX-1] = RW_LOCK_UNLOCKED } };
--
--void fastcall __br_write_lock (enum brlock_indices idx)
--{
--      int i;
--
--      for (i = 0; i < smp_num_cpus; i++)
--              write_lock(&__brlock_array[cpu_logical_map(i)][idx]);
--}
--
--void fastcall __br_write_unlock (enum brlock_indices idx)
--{
--      int i;
--
--      for (i = 0; i < smp_num_cpus; i++)
--              write_unlock(&__brlock_array[cpu_logical_map(i)][idx]);
--}
--
--#else /* ! __BRLOCK_USE_ATOMICS */
--
- brlock_read_lock_t __brlock_array[NR_CPUS][__BR_IDX_MAX] =
-    { [0 ... NR_CPUS-1] = { [0 ... __BR_IDX_MAX-1] = 0 } };
-@@ -64,6 +41,4 @@
-       spin_unlock(&__br_write_locks[idx].lock);
- }
--#endif /* __BRLOCK_USE_ATOMICS */
--
- #endif /* CONFIG_SMP */
 diff -Nur linux-2.4.29/lib/Makefile linux-mips/lib/Makefile
 --- linux-2.4.29/lib/Makefile  2004-04-14 15:05:40.000000000 +0200
 +++ linux-mips/lib/Makefile    2004-04-16 05:14:21.000000000 +0200
@@ -38329,39 +25357,10 @@ diff -Nur linux-2.4.29/lib/Makefile linux-mips/lib/Makefile
  include $(TOPDIR)/drivers/net/Makefile.lib
  include $(TOPDIR)/drivers/usb/Makefile.lib
  include $(TOPDIR)/drivers/bluetooth/Makefile.lib
-diff -Nur linux-2.4.29/MAINTAINERS linux-mips/MAINTAINERS
---- linux-2.4.29/MAINTAINERS   2005-01-19 15:09:24.000000000 +0100
-+++ linux-mips/MAINTAINERS     2005-03-26 11:47:05.618729582 +0100
-@@ -1058,8 +1058,8 @@
- JFS FILESYSTEM
- P:    Dave Kleikamp
- M:    shaggy@austin.ibm.com
--L:    jfs-discussion@oss.software.ibm.com
--W:    http://oss.software.ibm.com/developerworks/opensource/jfs/
-+L:    jfs-discussion@lists.sourceforge.net
-+W:    http://jfs.sourceforge.net/
- S:    Supported
- JOYSTICK DRIVER
-@@ -1532,7 +1532,7 @@
- PPP OVER ETHERNET
- P:    Michal Ostrowski
--M:    mostrows@styx.uwaterloo.ca
-+M:    mostrows@speakeasy.net
- S:    Maintained
- PRISM54 WIRELESS DRIVER
 diff -Nur linux-2.4.29/Makefile linux-mips/Makefile
 --- linux-2.4.29/Makefile      2005-01-19 15:10:14.000000000 +0100
-+++ linux-mips/Makefile        2005-03-26 11:47:05.686718424 +0100
-@@ -1,11 +1,11 @@
- VERSION = 2
- PATCHLEVEL = 4
--SUBLEVEL = 29
--EXTRAVERSION =
-+SUBLEVEL = 30
-+EXTRAVERSION = -pre3
++++ linux-mips/Makefile        2005-01-20 03:19:21.000000000 +0100
+@@ -5,7 +5,7 @@
  
  KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
  
@@ -38395,646 +25394,3 @@ diff -Nur linux-2.4.29/Makefile linux-mips/Makefile
  
  dep-files: scripts/mkdep archdep include/linux/version.h
        rm -f .depend .hdepend
-diff -Nur linux-2.4.29/mm/filemap.c linux-mips/mm/filemap.c
---- linux-2.4.29/mm/filemap.c  2004-11-17 12:54:22.000000000 +0100
-+++ linux-mips/mm/filemap.c    2005-03-26 11:47:38.292367084 +0100
-@@ -1870,7 +1870,7 @@
-               goto fput_in;
-       if (!in_inode->i_mapping->a_ops->readpage)
-               goto fput_in;
--      retval = locks_verify_area(FLOCK_VERIFY_READ, in_inode, in_file, in_file->f_pos, count);
-+      retval = rw_verify_area(READ, in_file, &in_file->f_pos, count);
-       if (retval)
-               goto fput_in;
-@@ -1887,7 +1887,7 @@
-       if (!out_file->f_op || !out_file->f_op->write)
-               goto fput_out;
-       out_inode = out_file->f_dentry->d_inode;
--      retval = locks_verify_area(FLOCK_VERIFY_WRITE, out_inode, out_file, out_file->f_pos, count);
-+      retval = rw_verify_area(WRITE, out_file, &out_file->f_pos, count);
-       if (retval)
-               goto fput_out;
-@@ -2589,7 +2589,7 @@
-       long error = -EBADF;
-       struct file * file;
-       struct inode * inode;
--      unsigned long size, rlim_rss;
-+      unsigned long size;
-       /* Doesn't work if there's no mapped file. */
-       if (!vma->vm_file)
-@@ -2605,13 +2605,6 @@
-               end = vma->vm_end;
-       end = ((end - vma->vm_start) >> PAGE_SHIFT) + vma->vm_pgoff;
--      /* Make sure this doesn't exceed the process's max rss. */
--      error = -EIO;
--      rlim_rss = current->rlim ?  current->rlim[RLIMIT_RSS].rlim_cur :
--                              LONG_MAX; /* default: see resource.h */
--      if ((vma->vm_mm->rss + (end - start)) > rlim_rss)
--              return error;
--
-       /* round to cluster boundaries if this isn't a "random" area. */
-       if (!VM_RandomReadHint(vma)) {
-               start = CLUSTER_OFFSET(start);
-@@ -3268,7 +3261,12 @@
-                       status = generic_osync_inode(inode, OSYNC_METADATA|OSYNC_DATA);
-       }
-       
--      err = written ? written : status;
-+      /*
-+       * generic_osync_inode always returns 0 or negative value.
-+       * So 'status < written' is always true, and written should
-+       * be returned if status >= 0.
-+       */
-+      err = (status < 0) ? status : written;
- out:
-       return err;
-diff -Nur linux-2.4.29/mm/swapfile.c linux-mips/mm/swapfile.c
---- linux-2.4.29/mm/swapfile.c 2004-11-17 12:54:22.000000000 +0100
-+++ linux-mips/mm/swapfile.c   2005-03-26 11:47:38.293366920 +0100
-@@ -738,8 +738,10 @@
-       for (type = swap_list.head; type >= 0; type = swap_info[type].next) {
-               p = swap_info + type;
-               if ((p->flags & SWP_WRITEOK) == SWP_WRITEOK) {
--                      if (p->swap_file == nd.dentry)
--                        break;
-+                      if (p->swap_file == nd.dentry ||
-+                          (S_ISBLK(nd.dentry->d_inode->i_mode) &&
-+                          p->swap_device == nd.dentry->d_inode->i_rdev))
-+                              break;
-               }
-               prev = type;
-       }
-diff -Nur linux-2.4.29/net/core/dev.c linux-mips/net/core/dev.c
---- linux-2.4.29/net/core/dev.c        2004-04-14 15:05:41.000000000 +0200
-+++ linux-mips/net/core/dev.c  2005-03-26 11:47:38.556323762 +0100
-@@ -2180,10 +2180,26 @@
-               case SIOCSIFNAME:
-                       if (dev->flags&IFF_UP)
-                               return -EBUSY;
--                      if (__dev_get_by_name(ifr->ifr_newname))
--                              return -EEXIST;
--                      memcpy(dev->name, ifr->ifr_newname, IFNAMSIZ);
--                      dev->name[IFNAMSIZ-1] = 0;
-+                      /* Check if name contains a wildcard */
-+                      if (strchr(ifr->ifr_newname, '%')) {
-+                              char format[IFNAMSIZ + 1];
-+                              int ret;
-+                              memcpy(format, ifr->ifr_newname, IFNAMSIZ);
-+                              format[IFNAMSIZ-1] = 0;
-+                              /* Find a free name based on format.
-+                               * dev_alloc_name() replaces "%d" with at max
-+                               * 2 digits, so no name overflow. - Jean II */
-+                              ret = dev_alloc_name(dev, format);
-+                              if (ret < 0)
-+                                      return ret;
-+                              /* Copy the new name back to caller. */
-+                              strncpy(ifr->ifr_newname, dev->name, IFNAMSIZ);
-+                      } else {
-+                              if (__dev_get_by_name(ifr->ifr_newname))
-+                                      return -EEXIST;
-+                              memcpy(dev->name, ifr->ifr_newname, IFNAMSIZ);
-+                              dev->name[IFNAMSIZ-1] = 0;
-+                      }
-                       notifier_call_chain(&netdev_chain, NETDEV_CHANGENAME, dev);
-                       return 0;
-@@ -2316,6 +2332,7 @@
-                *      - return a value
-                */
-                
-+              case SIOCSIFNAME:
-               case SIOCGMIIPHY:
-               case SIOCGMIIREG:
-                       if (!capable(CAP_NET_ADMIN))
-@@ -2351,7 +2368,6 @@
-               case SIOCDELMULTI:
-               case SIOCSIFHWBROADCAST:
-               case SIOCSIFTXQLEN:
--              case SIOCSIFNAME:
-               case SIOCSMIIREG:
-               case SIOCBONDENSLAVE:
-               case SIOCBONDRELEASE:
-diff -Nur linux-2.4.29/net/core/dst.c linux-mips/net/core/dst.c
---- linux-2.4.29/net/core/dst.c        2003-08-25 13:44:44.000000000 +0200
-+++ linux-mips/net/core/dst.c  2005-03-26 11:47:38.557323598 +0100
-@@ -142,8 +142,13 @@
- void dst_destroy(struct dst_entry * dst)
- {
--      struct neighbour *neigh = dst->neighbour;
--      struct hh_cache *hh = dst->hh;
-+      struct neighbour *neigh;
-+      struct hh_cache *hh;
-+
-+      smp_rmb();
-+
-+      neigh = dst->neighbour;
-+      hh = dst->hh;
-       dst->hh = NULL;
-       if (hh && atomic_dec_and_test(&hh->hh_refcnt))
-diff -Nur linux-2.4.29/net/core/neighbour.c linux-mips/net/core/neighbour.c
---- linux-2.4.29/net/core/neighbour.c  2005-01-19 15:10:13.000000000 +0100
-+++ linux-mips/net/core/neighbour.c    2005-03-26 11:47:38.629311783 +0100
-@@ -111,7 +111,7 @@
- unsigned long neigh_rand_reach_time(unsigned long base)
- {
--      return (net_random() % base) + (base>>1);
-+      return (base ? (net_random() % base) + (base >> 1) : 0);
- }
-@@ -1469,6 +1469,7 @@
-       nlh = NLMSG_PUT(skb, pid, seq, event, sizeof(*ndm));
-       ndm = NLMSG_DATA(nlh);
-+      nlh->nlmsg_flags = pid ? NLM_F_MULTI : 0;
-       ndm->ndm_family = n->ops->family;
-       ndm->ndm_flags = n->flags;
-       ndm->ndm_type = n->type;
-diff -Nur linux-2.4.29/net/ipv4/ipconfig.c linux-mips/net/ipv4/ipconfig.c
---- linux-2.4.29/net/ipv4/ipconfig.c   2004-11-17 12:54:22.000000000 +0100
-+++ linux-mips/net/ipv4/ipconfig.c     2005-03-26 11:47:38.712298163 +0100
-@@ -1162,7 +1162,7 @@
-               if (*cp == ':')
-                       *cp++ = '\0';
-               addr = in_aton(name);
--              strcpy(name, cp);
-+              memmove(name, cp, strlen(cp) + 1);
-       } else
-               addr = INADDR_NONE;
-diff -Nur linux-2.4.29/net/ipv4/ip_fragment.c linux-mips/net/ipv4/ip_fragment.c
---- linux-2.4.29/net/ipv4/ip_fragment.c        2004-11-17 12:54:22.000000000 +0100
-+++ linux-mips/net/ipv4/ip_fragment.c  2005-03-26 11:47:38.632311291 +0100
-@@ -72,6 +72,7 @@
- struct ipq {
-       struct ipq      *next;          /* linked list pointers                 */
-       struct list_head lru_list;      /* lru list member                      */
-+      u32             user;
-       u32             saddr;
-       u32             daddr;
-       u16             id;
-@@ -242,13 +243,13 @@
- /* Memory limiting on fragments.  Evictor trashes the oldest 
-  * fragment queue until we are back under the threshold.
-  */
--static void __ip_evictor(int threshold)
-+static void ip_evictor(void)
- {
-       struct ipq *qp;
-       struct list_head *tmp;
-       int work;
--      work = atomic_read(&ip_frag_mem) - threshold;
-+      work = atomic_read(&ip_frag_mem) - sysctl_ipfrag_low_thresh;
-       if (work <= 0)
-               return;
-@@ -273,11 +274,6 @@
-       }
- }
--static inline void ip_evictor(void)
--{
--      __ip_evictor(sysctl_ipfrag_low_thresh);
--}
--
- /*
-  * Oops, a fragment queue timed out.  Kill it and send an ICMP reply.
-  */
-@@ -324,7 +320,8 @@
-               if(qp->id == qp_in->id          &&
-                  qp->saddr == qp_in->saddr    &&
-                  qp->daddr == qp_in->daddr    &&
--                 qp->protocol == qp_in->protocol) {
-+                 qp->protocol == qp_in->protocol &&
-+                 qp->user == qp_in->user) {
-                       atomic_inc(&qp->refcnt);
-                       write_unlock(&ipfrag_lock);
-                       qp_in->last_in |= COMPLETE;
-@@ -351,7 +348,7 @@
- }
- /* Add an entry to the 'ipq' queue for a newly received IP datagram. */
--static struct ipq *ip_frag_create(unsigned hash, struct iphdr *iph)
-+static struct ipq *ip_frag_create(unsigned hash, struct iphdr *iph, u32 user)
- {
-       struct ipq *qp;
-@@ -363,6 +360,7 @@
-       qp->id = iph->id;
-       qp->saddr = iph->saddr;
-       qp->daddr = iph->daddr;
-+      qp->user = user;
-       qp->len = 0;
-       qp->meat = 0;
-       qp->fragments = NULL;
-@@ -385,7 +383,7 @@
- /* Find the correct entry in the "incomplete datagrams" queue for
-  * this IP datagram, and create new one, if nothing is found.
-  */
--static inline struct ipq *ip_find(struct iphdr *iph)
-+static inline struct ipq *ip_find(struct iphdr *iph, u32 user)
- {
-       __u16 id = iph->id;
-       __u32 saddr = iph->saddr;
-@@ -399,7 +397,8 @@
-               if(qp->id == id         &&
-                  qp->saddr == saddr   &&
-                  qp->daddr == daddr   &&
--                 qp->protocol == protocol) {
-+                 qp->protocol == protocol &&
-+                 qp->user == user) {
-                       atomic_inc(&qp->refcnt);
-                       read_unlock(&ipfrag_lock);
-                       return qp;
-@@ -407,7 +406,7 @@
-       }
-       read_unlock(&ipfrag_lock);
--      return ip_frag_create(hash, iph);
-+      return ip_frag_create(hash, iph, user);
- }
- /* Add new segment to existing queue. */
-@@ -641,7 +640,7 @@
- }
- /* Process an incoming IP datagram fragment. */
--struct sk_buff *ip_defrag(struct sk_buff *skb)
-+struct sk_buff *ip_defrag(struct sk_buff *skb, u32 user)
- {
-       struct iphdr *iph = skb->nh.iph;
-       struct ipq *qp;
-@@ -656,7 +655,7 @@
-       dev = skb->dev;
-       /* Lookup (or create) queue header */
--      if ((qp = ip_find(iph)) != NULL) {
-+      if ((qp = ip_find(iph, user)) != NULL) {
-               struct sk_buff *ret = NULL;
-               spin_lock(&qp->lock);
-@@ -687,8 +686,3 @@
-       ipfrag_secret_timer.expires = jiffies + sysctl_ipfrag_secret_interval;
-       add_timer(&ipfrag_secret_timer);
- }
--
--void ipfrag_flush(void)
--{
--      __ip_evictor(0);
--}
-diff -Nur linux-2.4.29/net/ipv4/ip_input.c linux-mips/net/ipv4/ip_input.c
---- linux-2.4.29/net/ipv4/ip_input.c   2004-08-08 01:26:06.000000000 +0200
-+++ linux-mips/net/ipv4/ip_input.c     2005-03-26 11:47:38.711298328 +0100
-@@ -170,7 +170,7 @@
-                   && ((sk->bound_dev_if == 0) 
-                       || (sk->bound_dev_if == skb->dev->ifindex))) {
-                       if (skb->nh.iph->frag_off & htons(IP_MF|IP_OFFSET)) {
--                              skb = ip_defrag(skb);
-+                              skb = ip_defrag(skb, IP_DEFRAG_CALL_RA_CHAIN);
-                               if (skb == NULL) {
-                                       read_unlock(&ip_ra_lock);
-                                       return 1;
-@@ -291,7 +291,7 @@
-        */
-       if (skb->nh.iph->frag_off & htons(IP_MF|IP_OFFSET)) {
--              skb = ip_defrag(skb);
-+              skb = ip_defrag(skb, IP_DEFRAG_LOCAL_DELIVER);
-               if (!skb)
-                       return 0;
-       }
-diff -Nur linux-2.4.29/net/ipv4/ipvs/ip_vs_core.c linux-mips/net/ipv4/ipvs/ip_vs_core.c
---- linux-2.4.29/net/ipv4/ipvs/ip_vs_core.c    2005-01-19 15:10:13.000000000 +0100
-+++ linux-mips/net/ipv4/ipvs/ip_vs_core.c      2005-03-26 11:47:38.913265180 +0100
-@@ -506,7 +506,7 @@
-       /* reassemble IP fragments, but will it happen in ICMP packets?? */
-       if (skb->nh.iph->frag_off & __constant_htons(IP_MF|IP_OFFSET)) {
--              skb = ip_defrag(skb);
-+              skb = ip_defrag(skb, IP_DEFRAG_VS_OUT);
-               if (!skb)
-                       return NF_STOLEN;
-               *skb_p = skb;
-@@ -658,7 +658,7 @@
-       /* reassemble IP fragments */
-       if (iph->frag_off & __constant_htons(IP_MF|IP_OFFSET)) {
--              skb = ip_defrag(skb);
-+              skb = ip_defrag(skb, IP_DEFRAG_VS_OUT);
-               if (!skb)
-                       return NF_STOLEN;
-               iph = skb->nh.iph;
-@@ -1164,7 +1164,7 @@
-               return NF_ACCEPT;
-       if (iph->frag_off & __constant_htons(IP_MF|IP_OFFSET)) {
--              skb = ip_defrag(skb);
-+              skb = ip_defrag(skb, IP_DEFRAG_VS_FWD);
-               if (!skb)
-                       return NF_STOLEN;
-               *skb_p = skb;
-diff -Nur linux-2.4.29/net/ipv4/netfilter/ip_conntrack_core.c linux-mips/net/ipv4/netfilter/ip_conntrack_core.c
---- linux-2.4.29/net/ipv4/netfilter/ip_conntrack_core.c        2005-01-19 15:10:13.000000000 +0100
-+++ linux-mips/net/ipv4/netfilter/ip_conntrack_core.c  2005-03-26 11:47:38.949259273 +0100
-@@ -834,7 +834,10 @@
-       /* Gather fragments. */
-       if ((*pskb)->nh.iph->frag_off & htons(IP_MF|IP_OFFSET)) {
--              *pskb = ip_ct_gather_frags(*pskb);
-+              *pskb = ip_ct_gather_frags(*pskb,
-+                                         hooknum == NF_IP_PRE_ROUTING ?
-+                                         IP_DEFRAG_CONNTRACK_IN :
-+                                         IP_DEFRAG_CONNTRACK_OUT);
-               if (!*pskb)
-                       return NF_STOLEN;
-       }
-@@ -1183,29 +1186,22 @@
-       WRITE_UNLOCK(&ip_conntrack_lock);
- }
--int ip_ct_no_defrag;
--
- /* Returns new sk_buff, or NULL */
- struct sk_buff *
--ip_ct_gather_frags(struct sk_buff *skb)
-+ip_ct_gather_frags(struct sk_buff *skb, u_int32_t user)
- {
-       struct sock *sk = skb->sk;
- #ifdef CONFIG_NETFILTER_DEBUG
-       unsigned int olddebug = skb->nf_debug;
- #endif
--      if (unlikely(ip_ct_no_defrag)) {
--              kfree_skb(skb);
--              return NULL;
--      }
--
-       if (sk) {
-               sock_hold(sk);
-               skb_orphan(skb);
-       }
-       local_bh_disable(); 
--      skb = ip_defrag(skb);
-+      skb = ip_defrag(skb, user);
-       local_bh_enable();
-       if (!skb) {
-diff -Nur linux-2.4.29/net/ipv4/netfilter/ip_conntrack_standalone.c linux-mips/net/ipv4/netfilter/ip_conntrack_standalone.c
---- linux-2.4.29/net/ipv4/netfilter/ip_conntrack_standalone.c  2005-01-19 15:10:13.000000000 +0100
-+++ linux-mips/net/ipv4/netfilter/ip_conntrack_standalone.c    2005-03-26 11:47:38.951258945 +0100
-@@ -393,13 +393,6 @@
-  cleanup_inandlocalops:
-       nf_unregister_hook(&ip_conntrack_local_out_ops);
-  cleanup_inops:
--      /* Frag queues may hold fragments with skb->dst == NULL */
--      ip_ct_no_defrag = 1;
--      local_bh_disable();
--      br_write_lock(BR_NETPROTO_LOCK);
--      br_write_unlock(BR_NETPROTO_LOCK);
--      ipfrag_flush();
--      local_bh_enable();
-       nf_unregister_hook(&ip_conntrack_in_ops);
-  cleanup_proc:
-       proc_net_remove("ip_conntrack");
-diff -Nur linux-2.4.29/net/ipv4/netfilter/ip_fw_compat.c linux-mips/net/ipv4/netfilter/ip_fw_compat.c
---- linux-2.4.29/net/ipv4/netfilter/ip_fw_compat.c     2003-11-28 19:26:21.000000000 +0100
-+++ linux-mips/net/ipv4/netfilter/ip_fw_compat.c       2005-03-26 11:47:38.979254350 +0100
-@@ -108,7 +108,7 @@
-                                         (*pskb)->nh.raw, &redirpt, pskb);
-               if ((*pskb)->nh.iph->frag_off & htons(IP_MF|IP_OFFSET)) {
--                      *pskb = ip_ct_gather_frags(*pskb);
-+                      *pskb = ip_ct_gather_frags(*pskb, IP_DEFRAG_CONNTRACK_IN);
-                       if (!*pskb)
-                               return NF_STOLEN;
-diff -Nur linux-2.4.29/net/ipv4/netfilter/ip_nat_standalone.c linux-mips/net/ipv4/netfilter/ip_nat_standalone.c
---- linux-2.4.29/net/ipv4/netfilter/ip_nat_standalone.c        2005-01-19 15:10:13.000000000 +0100
-+++ linux-mips/net/ipv4/netfilter/ip_nat_standalone.c  2005-03-26 11:47:38.980254186 +0100
-@@ -201,7 +201,7 @@
-          I'm starting to have nightmares about fragments.  */
-       if ((*pskb)->nh.iph->frag_off & htons(IP_MF|IP_OFFSET)) {
--              *pskb = ip_ct_gather_frags(*pskb);
-+              *pskb = ip_ct_gather_frags(*pskb, IP_DEFRAG_NAT_OUT);
-               if (!*pskb)
-                       return NF_STOLEN;
-diff -Nur linux-2.4.29/net/ipv4/sysctl_net_ipv4.c linux-mips/net/ipv4/sysctl_net_ipv4.c
---- linux-2.4.29/net/ipv4/sysctl_net_ipv4.c    2004-08-08 01:26:06.000000000 +0200
-+++ linux-mips/net/ipv4/sysctl_net_ipv4.c      2005-03-26 11:47:38.713297999 +0100
-@@ -268,6 +268,9 @@
-       {NET_TCP_MODERATE_RCVBUF, "tcp_moderate_rcvbuf",
-        &sysctl_tcp_moderate_rcvbuf, sizeof(int), 0644, NULL,
-        &proc_dointvec},
-+      {NET_TCP_BIC_BETA, "tcp_bic_beta",
-+       &sysctl_tcp_bic_beta, sizeof(int), 0644, NULL,
-+       &proc_dointvec},
-       {0}
- };
-diff -Nur linux-2.4.29/net/ipv4/tcp_input.c linux-mips/net/ipv4/tcp_input.c
---- linux-2.4.29/net/ipv4/tcp_input.c  2005-01-19 15:10:13.000000000 +0100
-+++ linux-mips/net/ipv4/tcp_input.c    2005-03-26 11:47:38.911265508 +0100
-@@ -107,6 +107,7 @@
- int sysctl_tcp_bic;
- int sysctl_tcp_bic_fast_convergence = 1;
- int sysctl_tcp_bic_low_window = 14;
-+int sysctl_tcp_bic_beta = 819;                /* = 819/1024 (BICTCP_BETA_SCALE) */
- #define FLAG_DATA             0x01 /* Incoming frame contained data.          */
- #define FLAG_WIN_UPDATE               0x02 /* Incoming ACK was a window update.       */
-@@ -3647,8 +3648,7 @@
-       while (before(start, end)) {
-               struct sk_buff *nskb;
-               int header = skb_headroom(skb);
--              int copy = (PAGE_SIZE - sizeof(struct sk_buff) -
--                          sizeof(struct skb_shared_info) - header - 31)&~15;
-+              int copy = SKB_MAX_ORDER(header, 0);
-               /* Too big header? This can happen with IPv6. */
-               if (copy < 0)
-diff -Nur linux-2.4.29/net/netlink/af_netlink.c linux-mips/net/netlink/af_netlink.c
---- linux-2.4.29/net/netlink/af_netlink.c      2005-01-19 15:10:14.000000000 +0100
-+++ linux-mips/net/netlink/af_netlink.c        2005-03-26 11:47:39.200218085 +0100
-@@ -327,10 +327,11 @@
-       struct sock **skp;
-       struct netlink_table *table = &nl_table[sk->protocol];
-       struct nl_pid_hash *hash = &table->hash;
-+      u32 pid = nlk_sk(sk)->pid;
-       netlink_table_grab();
-       hash->entries--;
--      for (skp = hash->table; *skp; skp = &((*skp)->next)) {
-+      for (skp = nl_pid_hashfn(hash, pid); *skp; skp = &((*skp)->next)) {
-               if (*skp == sk) {
-                       *skp = sk->next;
-                       __sock_put(sk);
-diff -Nur linux-2.4.29/net/netsyms.c linux-mips/net/netsyms.c
---- linux-2.4.29/net/netsyms.c 2005-01-19 15:10:14.000000000 +0100
-+++ linux-mips/net/netsyms.c   2005-03-26 11:47:38.458339844 +0100
-@@ -287,7 +287,6 @@
- EXPORT_SYMBOL(inetdev_by_index);
- EXPORT_SYMBOL(in_dev_finish_destroy);
- EXPORT_SYMBOL(ip_defrag);
--EXPORT_SYMBOL(ipfrag_flush);
- /* Route manipulation */
- EXPORT_SYMBOL(ip_rt_ioctl);
-diff -Nur linux-2.4.29/net/sched/cls_u32.c linux-mips/net/sched/cls_u32.c
---- linux-2.4.29/net/sched/cls_u32.c   2004-11-17 12:54:22.000000000 +0100
-+++ linux-mips/net/sched/cls_u32.c     2005-03-26 11:47:39.202217756 +0100
-@@ -70,6 +70,7 @@
- {
-       struct tc_u_hnode       *next;
-       u32                     handle;
-+      u32                     prio;
-       struct tc_u_common      *tp_c;
-       int                     refcnt;
-       unsigned                divisor;
-@@ -271,6 +272,7 @@
-       root_ht->divisor = 0;
-       root_ht->refcnt++;
-       root_ht->handle = tp_c ? gen_new_htid(tp_c) : 0x80000000;
-+      root_ht->prio = tp->prio;
-       if (tp_c == NULL) {
-               tp_c = kmalloc(sizeof(*tp_c), GFP_KERNEL);
-@@ -534,6 +536,7 @@
-               ht->refcnt = 0;
-               ht->divisor = divisor;
-               ht->handle = handle;
-+              ht->prio = tp->prio;
-               ht->next = tp_c->hlist;
-               tp_c->hlist = ht;
-               *arg = (unsigned long)ht;
-@@ -606,6 +609,8 @@
-               return;
-       for (ht = tp_c->hlist; ht; ht = ht->next) {
-+              if (ht->prio != tp->prio)
-+                      continue;
-               if (arg->count >= arg->skip) {
-                       if (arg->fn(tp, (unsigned long)ht, arg) < 0) {
-                               arg->stop = 1;
-diff -Nur linux-2.4.29/net/sched/sch_ingress.c linux-mips/net/sched/sch_ingress.c
---- linux-2.4.29/net/sched/sch_ingress.c       2004-11-17 12:54:22.000000000 +0100
-+++ linux-mips/net/sched/sch_ingress.c 2005-03-26 11:47:39.203217592 +0100
-@@ -14,6 +14,7 @@
- #include <linux/netdevice.h>
- #include <linux/rtnetlink.h>
- #include <linux/netfilter_ipv4.h>
-+#include <linux/netfilter_ipv6.h>
- #include <linux/netfilter.h>
- #include <linux/smp.h>
- #include <net/pkt_sched.h>
-@@ -241,6 +242,15 @@
-       NF_IP_PRI_FILTER + 1
- };
-+static struct nf_hook_ops ing6_ops =
-+{
-+      { NULL, NULL},
-+      ing_hook,
-+      PF_INET6,
-+      NF_IP6_PRE_ROUTING,
-+      NF_IP6_PRI_FILTER + 1
-+};
-+
- int ingress_init(struct Qdisc *sch,struct rtattr *opt)
- {
-       struct ingress_qdisc_data *p = PRIV(sch);
-@@ -249,8 +259,13 @@
-               if (nf_register_hook(&ing_ops) < 0) {
-                       printk("ingress qdisc registration error \n");
-                       goto error;
--                      }
-+              }
-               nf_registered++;
-+              if (nf_register_hook(&ing6_ops) < 0) {
-+                      printk("IPv6 ingress qdisc registration error, " \
-+                          "disabling IPv6 support.\n");
-+              } else
-+                      nf_registered++;
-       }
-       DPRINTK("ingress_init(sch %p,[qdisc %p],opt %p)\n",sch,p,opt);
-@@ -374,8 +389,11 @@
- void cleanup_module(void) 
- {
-       unregister_qdisc(&ingress_qdisc_ops);
--      if (nf_registered)
-+      if (nf_registered) {
-               nf_unregister_hook(&ing_ops);
-+              if (nf_registered > 1)
-+                      nf_unregister_hook(&ing6_ops);
-+      }
- }
- #endif
- MODULE_LICENSE("GPL");
-diff -Nur linux-2.4.29/net/sched/sch_netem.c linux-mips/net/sched/sch_netem.c
---- linux-2.4.29/net/sched/sch_netem.c 2005-01-19 15:10:14.000000000 +0100
-+++ linux-mips/net/sched/sch_netem.c   2005-03-26 11:47:39.283204465 +0100
-@@ -180,6 +180,7 @@
-       if (q->loss && q->loss >= get_crandom(&q->loss_cor)) {
-               pr_debug("netem_enqueue: random loss\n");
-               sch->stats.drops++;
-+              kfree_skb(skb);
-               return 0;       /* lie about loss so TCP doesn't know */
-       }
-diff -Nur linux-2.4.29/net/unix/af_unix.c linux-mips/net/unix/af_unix.c
---- linux-2.4.29/net/unix/af_unix.c    2004-11-17 12:54:22.000000000 +0100
-+++ linux-mips/net/unix/af_unix.c      2005-03-26 11:47:39.318198721 +0100
-@@ -1686,8 +1686,13 @@
-                       }
-                       spin_lock(&sk->receive_queue.lock);
--                      if((skb=skb_peek(&sk->receive_queue))!=NULL)
--                              amount=skb->len;
-+                      if (sk->type == SOCK_STREAM) {
-+                              skb_queue_walk(&sk->receive_queue, skb)
-+                                      amount += skb->len;
-+                      } else {
-+                              if((skb=skb_peek(&sk->receive_queue))!=NULL)
-+                                      amount=skb->len;
-+                      }
-                       spin_unlock(&sk->receive_queue.lock);
-                       err = put_user(amount, (int *)arg);
-                       break;
-diff -Nur linux-2.4.29/scripts/Configure linux-mips/scripts/Configure
---- linux-2.4.29/scripts/Configure     2003-06-13 16:51:39.000000000 +0200
-+++ linux-mips/scripts/Configure       2005-03-26 11:47:39.412183296 +0100
-@@ -378,15 +378,18 @@
- function hex () {
-       old=$(eval echo "\${$2}")
-       def=${old:-$3}
--      def=${def#*[x,X]}
-       while :; do
-         readln "$1 ($2) [$def] " "$def" "$old"
--        ans=${ans#*[x,X]}
--        if expr "$ans" : '[0-9a-fA-F][0-9a-fA-F]*$' > /dev/null; then
-+        if expr "$ans" : '0x[0-9a-fA-F][0-9a-fA-F]*$' > /dev/null; then
-           define_hex "$2" "$ans"
-           break
-         else
--          help "$2"
-+          if expr "$ans" : '[0-9a-fA-F][0-9a-fA-F]*$' > /dev/null; then
-+            define_hex "$2" "0x$ans"
-+            break
-+          else
-+            help "$2"
-+          fi
-         fi
-       done
- }