From: Waldemar Brodkorb Date: Sat, 26 Mar 2005 20:56:20 +0000 (+0000) Subject: diff between linux-mips, tagged linux_2_4_29 X-Git-Url: http://git.cdn.openwrt.org/?a=commitdiff_plain;h=0dcda0fdb0d2f86f960c931ef1c4890c10253936;p=openwrt%2Fsvn-archive%2Farchive.git diff between linux-mips, tagged linux_2_4_29 SVN-Revision: 465 --- diff --git a/openwrt/package/linux/kernel-patches/000-linux-mips-cvs b/openwrt/package/linux/kernel-patches/000-linux-mips-cvs index 8a4a7d6ae4..83bb0e258b 100644 --- a/openwrt/package/linux/kernel-patches/000-linux-mips-cvs +++ b/openwrt/package/linux/kernel-patches/000-linux-mips-cvs @@ -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 -+#include -+#include -+#include -+#include -+ -+#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 #include @@ -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 - #include - --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 #include @@ -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 #include @@ -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 #include @@ -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 -@@ -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 - #include - -+ /* 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 - #include - -+ /* 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 -+o - - 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 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 "); +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 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 "); +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 - #include - #include --#include --#include - #include - #include -- - #include - #include - -+ - /* ----- 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 - #include - #include --#include --#include - #include - #include -- - #include - #include - #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 - * - Fix TSO issues on PPC64 machines -- Jon Mason -+ * 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 -@@ -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 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 + #include - 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 ++#elif defined(CONFIG_MIPS_DB1200) ++#include ++#else + #include ++#endif - /* Disable transmitter and interrupt. */ -- tg3_readphy(tp, MII_TG3_EXT_CTRL, ®32); -+ if (tg3_readphy(tp, MII_TG3_EXT_CTRL, ®32)) -+ 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, ®32); -- reg32 &= ~0x3000; -- tg3_writephy(tp, MII_TG3_EXT_CTRL, reg32); -+ if (!tg3_readphy(tp, MII_TG3_EXT_CTRL, ®32)) { -+ 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 ++ * ++ * 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 ++#include ++#include ++#include ++#include ++#include ++#include + -+ 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 ++#include + - 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 + -+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 "); ++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 -+#include "tulip.h" - #include - - -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 - #include "tulip.h" - #include - #include -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 - #include "tulip.h" - #include - #include --#include - - - 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 - #include - #include -+#include - #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 -+#include "tulip.h" - #include - - -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 -+#include - #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 - #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 - #include --#include "tulip.h" - #include -+#include "tulip.h" - #include - #include - #include -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 - #include - -+#if defined(CONFIG_MIPS_PB1200) -+#include -+#elif defined(CONFIG_MIPS_DB1200) -+#include -+#else - #include -+#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 -+ * -+ * 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 -+#include -+#include -+#include -+#include -+#include -+#include ++ mem->flags = 0; ++ mem->speed = 0; + -+#include -+#include ++ addrwin = exca_read_byte(slot, I365_ADDRWIN); ++ if (addrwin & I365_ENA_MEM(map)) ++ mem->flags |= MAP_ACTIVE; + -+#include ++ 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 "); -+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 +-#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 + #include + #include +@@ -62,7 +63,45 @@ + #include + #include + #include + -+ voltage = set_Vcc_value(state->Vcc); -+ exca_write_byte(slot, CARD_VOLTAGE_SELECT, voltage); ++#if defined(CONFIG_SOC_AU1550) + #include ++#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 ++#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 ++#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<map; + #include + #include + +@@ -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 - #include - #include -+#include - #include - #include - #include -@@ -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 - * Sreenivas Bagalkote -@@ -46,7 +46,7 @@ - - #include "megaraid2.h" - --#ifdef LSI_CONFIG_COMPAT -+#if defined(__x86_64__) - #include - #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 \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 \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; (ipend_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 --#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 - - #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 -+ * -+ * 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 -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include "scsi.h" -+#include -+#include -+#include -+ -+#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 -@@ -38,11 +43,14 @@ - #include - - #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 - #include - #include -@@ -62,7 +63,45 @@ - #include - #include - #include -+ -+#if defined(CONFIG_SOC_AU1550) - #include -+#endif -+ -+#if defined(CONFIG_MIPS_PB1200) -+#define WM8731 -+#define WM_MODE_USB -+#include -+#endif -+ -+#if defined(CONFIG_MIPS_FICMMP) -+#define WM8721 -+#define WM_MODE_NORMAL -+#include -+#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< - #include - -@@ -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 - #include - #include -@@ -63,6 +64,14 @@ - #include - #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 -+#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 -+#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 -- * Copyright (C) 2001, 2002, 2003 Maciej W. Rozycki -+ * Copyright (C) 2001, 2002, 2003, 2004 Maciej W. Rozycki - */ - - #include -@@ -23,8 +23,8 @@ - #include - #include - #include -+#include - --#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 + #include + #include +@@ -63,6 +64,14 @@ + #include + #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 ++#endif ++ ++#ifdef CONFIG_MIPS_DB1200 ++#include ++#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 - #include - #include -+#include -+ - #ifdef CONFIG_DECSTATION - #include - #include -@@ -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 +- * Copyright (C) 2001, 2002, 2003 Maciej W. Rozycki ++ * Copyright (C) 2001, 2002, 2003, 2004 Maciej W. Rozycki + */ + + #include +@@ -23,8 +23,8 @@ + #include + #include + #include ++#include + +-#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 -+ - #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 + #include + #include ++#include ++ + #ifdef CONFIG_DECSTATION + #include + #include +@@ -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 " - #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 + - /* - * 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 - #include --#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(¬es[0]); -+ nhdr->p_filesz += notesize(¬es[0]); - bufp = storenote(¬es[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(¬es[1]); -+ nhdr->p_filesz += notesize(¬es[1]); - bufp = storenote(¬es[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(¬es[2]); -+ nhdr->p_filesz += notesize(¬es[2]); - bufp = storenote(¬es[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/ - */ - 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 -+ - 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 -+#include - #include - --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 -- * -- * 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 - #include - --#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 - #include - #include -+#include -+ -+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 - #include - --#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 - #include - #include -+#include - #include - #include - #include -@@ -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 - }