diff --git a/debian/changelog b/debian/changelog index c28a274bc..64696c212 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +linux-2.6 (2.6.12+2.6.13-rc6-1) UNRELEASED; urgency=low + + * + + -- Bastian Blank Fri, 19 Aug 2005 16:20:36 +0200 + linux-2.6 (2.6.12-6) UNRELEASED; urgency=low * [powerpc] diff --git a/debian/patches-debian/amd64-outs.patch b/debian/patches-debian/amd64-outs.patch deleted file mode 100644 index 3380ffab3..000000000 --- a/debian/patches-debian/amd64-outs.patch +++ /dev/null @@ -1,24 +0,0 @@ -#! /bin/sh -e -## .dpatch by -## -## All lines beginning with `## DP:' are a description of the patch. -## DP: Description: [CAN-2005-0204]: AMD64, allows local users to write to privileged IO ports via OUTS instruction -## DP: Patch author: Suresh Siddha (suresh.b.siddha@intel.com) -## DP: Upstream status: unknown -## DP: URL: https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=146244 -## DP: Patch source: Micah Anderson (debian-kernel) - -. $(dirname $0)/DPATCH - -@DPATCH@ ---- linux-2.6.9/include/asm-x86_64/desc.h 2005-01-30 20:08:12.799247944 -0800 -+++ linux-2.6.9/include/asm-x86_64/desc.h 2005-01-30 20:08:12.799247944 -0800 -@@ -128,7 +128,7 @@ - { - set_tssldt_descriptor(&cpu_gdt_table[cpu][GDT_ENTRY_TSS], (unsigned long)addr, - DESC_TSS, -- sizeof(struct tss_struct) - 1); -+ IO_BITMAP_OFFSET + IO_BITMAP_BYTES + 7); - } - - static inline void set_ldt_desc(unsigned cpu, void *addr, int size) diff --git a/debian/patches-debian/drivers-ide-__devinit.patch b/debian/patches-debian/drivers-ide-__devinit.patch deleted file mode 100644 index 664c43f7b..000000000 --- a/debian/patches-debian/drivers-ide-__devinit.patch +++ /dev/null @@ -1,340 +0,0 @@ -## DP: Upstream status: submitted -diff -aurN a/drivers/ide/pci/alim15x3.c b/drivers/ide/pci/alim15x3.c ---- a/drivers/ide/pci/alim15x3.c 2005-06-06 11:22:29.000000000 -0400 -+++ b/drivers/ide/pci/alim15x3.c 2005-06-15 22:01:23.000000000 -0400 -@@ -583,7 +583,7 @@ - * appropriate also sets up the 1533 southbridge. - */ - --static unsigned int __init init_chipset_ali15x3 (struct pci_dev *dev, const char *name) -+static unsigned int __devinit init_chipset_ali15x3 (struct pci_dev *dev, const char *name) - { - unsigned long flags; - u8 tmpbyte; -@@ -677,7 +677,7 @@ - * FIXME: frobs bits that are not defined on newer ALi devicea - */ - --static unsigned int __init ata66_ali15x3 (ide_hwif_t *hwif) -+static unsigned int __devinit ata66_ali15x3 (ide_hwif_t *hwif) - { - struct pci_dev *dev = hwif->pci_dev; - unsigned int ata66 = 0; -@@ -748,7 +748,7 @@ - * Initialize the IDE structure side of the ALi 15x3 driver. - */ - --static void __init init_hwif_common_ali15x3 (ide_hwif_t *hwif) -+static void __devinit init_hwif_common_ali15x3 (ide_hwif_t *hwif) - { - hwif->autodma = 0; - hwif->tuneproc = &ali15x3_tune_drive; -@@ -794,7 +794,7 @@ - * Sparc systems - */ - --static void __init init_hwif_ali15x3 (ide_hwif_t *hwif) -+static void __devinit init_hwif_ali15x3 (ide_hwif_t *hwif) - { - u8 ideic, inmir; - s8 irq_routing_table[] = { -1, 9, 3, 10, 4, 5, 7, 6, -@@ -847,7 +847,7 @@ - * the actual work. - */ - --static void __init init_dma_ali15x3 (ide_hwif_t *hwif, unsigned long dmabase) -+static void __devinit init_dma_ali15x3 (ide_hwif_t *hwif, unsigned long dmabase) - { - if (m5229_revision < 0x20) - return; -diff -aurN a/drivers/ide/pci/amd74xx.c b/drivers/ide/pci/amd74xx.c ---- a/drivers/ide/pci/amd74xx.c 2005-06-06 11:22:29.000000000 -0400 -+++ b/drivers/ide/pci/amd74xx.c 2005-06-15 22:01:23.000000000 -0400 -@@ -309,7 +309,7 @@ - * and initialize its drive independent registers. - */ - --static unsigned int __init init_chipset_amd74xx(struct pci_dev *dev, const char *name) -+static unsigned int __devinit init_chipset_amd74xx(struct pci_dev *dev, const char *name) - { - unsigned char t; - unsigned int u; -@@ -413,7 +413,7 @@ - return dev->irq; - } - --static void __init init_hwif_amd74xx(ide_hwif_t *hwif) -+static void __devinit init_hwif_amd74xx(ide_hwif_t *hwif) - { - int i; - -diff -aurN a/drivers/ide/pci/cmd640.c b/drivers/ide/pci/cmd640.c ---- a/drivers/ide/pci/cmd640.c 2005-06-06 11:22:29.000000000 -0400 -+++ b/drivers/ide/pci/cmd640.c 2005-06-15 22:01:23.000000000 -0400 -@@ -278,7 +278,7 @@ - spin_unlock_irqrestore(&ide_lock, flags); - } - --static int __init match_pci_cmd640_device (void) -+static int __devinit match_pci_cmd640_device (void) - { - const u8 ven_dev[4] = {0x95, 0x10, 0x40, 0x06}; - unsigned int i; -@@ -298,7 +298,7 @@ - /* - * Probe for CMD640x -- pci method 1 - */ --static int __init probe_for_cmd640_pci1 (void) -+static int __devinit probe_for_cmd640_pci1 (void) - { - __get_cmd640_reg = get_cmd640_reg_pci1; - __put_cmd640_reg = put_cmd640_reg_pci1; -@@ -314,7 +314,7 @@ - /* - * Probe for CMD640x -- pci method 2 - */ --static int __init probe_for_cmd640_pci2 (void) -+static int __devinit probe_for_cmd640_pci2 (void) - { - __get_cmd640_reg = get_cmd640_reg_pci2; - __put_cmd640_reg = put_cmd640_reg_pci2; -@@ -328,7 +328,7 @@ - /* - * Probe for CMD640x -- vlb - */ --static int __init probe_for_cmd640_vlb (void) -+static int __devinit probe_for_cmd640_vlb (void) - { - u8 b; - -@@ -349,7 +349,7 @@ - * Returns 1 if an IDE interface/drive exists at 0x170, - * Returns 0 otherwise. - */ --static int __init secondary_port_responding (void) -+static int __devinit secondary_port_responding (void) - { - unsigned long flags; - -@@ -392,7 +392,7 @@ - * Check whether prefetch is on for a drive, - * and initialize the unmask flags for safe operation. - */ --static void __init check_prefetch (unsigned int index) -+static void __devinit check_prefetch (unsigned int index) - { - ide_drive_t *drive = cmd_drives[index]; - u8 b = get_cmd640_reg(prefetch_regs[index]); -@@ -413,7 +413,7 @@ - /* - * Figure out which devices we control - */ --static void __init setup_device_ptrs (void) -+static void __devinit setup_device_ptrs (void) - { - unsigned int i; - -@@ -495,7 +495,7 @@ - /* - * This routine retrieves the initial drive timings from the chipset. - */ --static void __init retrieve_drive_counts (unsigned int index) -+static void __devinit retrieve_drive_counts (unsigned int index) - { - u8 b; - -@@ -716,7 +716,7 @@ - /* - * Probe for a cmd640 chipset, and initialize it if found. Called from ide.c - */ --int __init ide_probe_for_cmd640x (void) -+int __devinit ide_probe_for_cmd640x (void) - { - #ifdef CONFIG_BLK_DEV_CMD640_ENHANCED - int second_port_toggled = 0; -diff -aurN a/drivers/ide/pci/cs5530.c b/drivers/ide/pci/cs5530.c ---- a/drivers/ide/pci/cs5530.c 2005-06-06 11:22:29.000000000 -0400 -+++ b/drivers/ide/pci/cs5530.c 2005-06-15 22:01:23.000000000 -0400 -@@ -217,7 +217,7 @@ - * Initialize the cs5530 bridge for reliable IDE DMA operation. - */ - --static unsigned int __init init_chipset_cs5530 (struct pci_dev *dev, const char *name) -+static unsigned int __devinit init_chipset_cs5530 (struct pci_dev *dev, const char *name) - { - struct pci_dev *master_0 = NULL, *cs5530_0 = NULL; - unsigned long flags; -@@ -308,7 +308,7 @@ - * performs channel-specific pre-initialization before drive probing. - */ - --static void __init init_hwif_cs5530 (ide_hwif_t *hwif) -+static void __devinit init_hwif_cs5530 (ide_hwif_t *hwif) - { - unsigned long basereg; - u32 d0_timings; -diff -aurN a/drivers/ide/pci/cy82c693.c b/drivers/ide/pci/cy82c693.c ---- a/drivers/ide/pci/cy82c693.c 2005-06-06 11:22:29.000000000 -0400 -+++ b/drivers/ide/pci/cy82c693.c 2005-06-15 22:01:23.000000000 -0400 -@@ -391,7 +391,7 @@ - /* - * this function is called during init and is used to setup the cy82c693 chip - */ --static unsigned int __init init_chipset_cy82c693(struct pci_dev *dev, const char *name) -+static unsigned int __devinit init_chipset_cy82c693(struct pci_dev *dev, const char *name) - { - if (PCI_FUNC(dev->devfn) != 1) - return 0; -@@ -443,7 +443,7 @@ - /* - * the init function - called for each ide channel once - */ --static void __init init_hwif_cy82c693(ide_hwif_t *hwif) -+static void __devinit init_hwif_cy82c693(ide_hwif_t *hwif) - { - hwif->autodma = 0; - -@@ -467,9 +467,9 @@ - hwif->drives[1].autodma = hwif->autodma; - } - --static __initdata ide_hwif_t *primary; -+static __devinitdata ide_hwif_t *primary; - --void __init init_iops_cy82c693(ide_hwif_t *hwif) -+void __devinit init_iops_cy82c693(ide_hwif_t *hwif) - { - if (PCI_FUNC(hwif->pci_dev->devfn) == 1) - primary = hwif; -diff -aurN a/drivers/ide/pci/it8172.c b/drivers/ide/pci/it8172.c ---- a/drivers/ide/pci/it8172.c 2005-06-06 11:22:29.000000000 -0400 -+++ b/drivers/ide/pci/it8172.c 2005-06-15 22:01:23.000000000 -0400 -@@ -216,7 +216,7 @@ - return 0; - } - --static unsigned int __init init_chipset_it8172 (struct pci_dev *dev, const char *name) -+static unsigned int __devinit init_chipset_it8172 (struct pci_dev *dev, const char *name) - { - unsigned char progif; - -@@ -230,7 +230,7 @@ - } - - --static void __init init_hwif_it8172 (ide_hwif_t *hwif) -+static void __devinit init_hwif_it8172 (ide_hwif_t *hwif) - { - struct pci_dev* dev = hwif->pci_dev; - unsigned long cmdBase, ctrlBase; -diff -aurN a/drivers/ide/pci/ns87415.c b/drivers/ide/pci/ns87415.c ---- a/drivers/ide/pci/ns87415.c 2005-06-06 11:22:29.000000000 -0400 -+++ b/drivers/ide/pci/ns87415.c 2005-06-15 22:01:23.000000000 -0400 -@@ -195,7 +195,7 @@ - return __ide_dma_check(drive); - } - --static void __init init_hwif_ns87415 (ide_hwif_t *hwif) -+static void __devinit init_hwif_ns87415 (ide_hwif_t *hwif) - { - struct pci_dev *dev = hwif->pci_dev; - unsigned int ctrl, using_inta; -diff -aurN a/drivers/ide/pci/opti621.c b/drivers/ide/pci/opti621.c ---- a/drivers/ide/pci/opti621.c 2005-06-06 11:22:29.000000000 -0400 -+++ b/drivers/ide/pci/opti621.c 2005-06-15 22:01:23.000000000 -0400 -@@ -326,7 +326,7 @@ - /* - * init_hwif_opti621() is called once for each hwif found at boot. - */ --static void __init init_hwif_opti621 (ide_hwif_t *hwif) -+static void __devinit init_hwif_opti621 (ide_hwif_t *hwif) - { - hwif->autodma = 0; - hwif->drives[0].drive_data = PIO_DONT_KNOW; -diff -aurN a/drivers/ide/pci/sc1200.c b/drivers/ide/pci/sc1200.c ---- a/drivers/ide/pci/sc1200.c 2005-06-06 11:22:29.000000000 -0400 -+++ b/drivers/ide/pci/sc1200.c 2005-06-15 22:01:23.000000000 -0400 -@@ -459,7 +459,7 @@ - * This gets invoked by the IDE driver once for each channel, - * and performs channel-specific pre-initialization before drive probing. - */ --static void __init init_hwif_sc1200 (ide_hwif_t *hwif) -+static void __devinit init_hwif_sc1200 (ide_hwif_t *hwif) - { - if (hwif->mate) - hwif->serialized = hwif->mate->serialized = 1; -diff -aurN a/drivers/ide/pci/sl82c105.c b/drivers/ide/pci/sl82c105.c ---- a/drivers/ide/pci/sl82c105.c 2005-06-06 11:22:29.000000000 -0400 -+++ b/drivers/ide/pci/sl82c105.c 2005-06-15 22:01:23.000000000 -0400 -@@ -386,7 +386,7 @@ - * channel 0 here at least, but channel 1 has to be enabled by - * firmware or arch code. We still set both to 16 bits mode. - */ --static unsigned int __init init_chipset_sl82c105(struct pci_dev *dev, const char *msg) -+static unsigned int __devinit init_chipset_sl82c105(struct pci_dev *dev, const char *msg) - { - u32 val; - -@@ -399,7 +399,7 @@ - return dev->irq; - } - --static void __init init_dma_sl82c105(ide_hwif_t *hwif, unsigned long dma_base) -+static void __devinit init_dma_sl82c105(ide_hwif_t *hwif, unsigned long dma_base) - { - unsigned int rev; - u8 dma_state; -@@ -431,7 +431,7 @@ - * Initialise the chip - */ - --static void __init init_hwif_sl82c105(ide_hwif_t *hwif) -+static void __devinit init_hwif_sl82c105(ide_hwif_t *hwif) - { - struct pci_dev *dev = hwif->pci_dev; - u32 val; -diff -aurN a/drivers/ide/pci/slc90e66.c b/drivers/ide/pci/slc90e66.c ---- a/drivers/ide/pci/slc90e66.c 2005-06-06 11:22:29.000000000 -0400 -+++ b/drivers/ide/pci/slc90e66.c 2005-06-15 22:01:23.000000000 -0400 -@@ -196,7 +196,7 @@ - } - #endif /* CONFIG_BLK_DEV_IDEDMA */ - --static void __init init_hwif_slc90e66 (ide_hwif_t *hwif) -+static void __devinit init_hwif_slc90e66 (ide_hwif_t *hwif) - { - u8 reg47 = 0; - u8 mask = hwif->channel ? 0x01 : 0x02; /* bit0:Primary */ -diff -aurN a/drivers/ide/pci/triflex.c b/drivers/ide/pci/triflex.c ---- a/drivers/ide/pci/triflex.c 2005-06-06 11:22:29.000000000 -0400 -+++ b/drivers/ide/pci/triflex.c 2005-06-15 22:01:23.000000000 -0400 -@@ -130,7 +130,7 @@ - return hwif->ide_dma_off_quietly(drive); - } - --static void __init init_hwif_triflex(ide_hwif_t *hwif) -+static void __devinit init_hwif_triflex(ide_hwif_t *hwif) - { - hwif->tuneproc = &triflex_tune_drive; - hwif->speedproc = &triflex_tune_chipset; -diff -aurN a/drivers/ide/pci/via82cxxx.c b/drivers/ide/pci/via82cxxx.c ---- a/drivers/ide/pci/via82cxxx.c 2005-06-06 11:22:29.000000000 -0400 -+++ b/drivers/ide/pci/via82cxxx.c 2005-06-15 22:01:23.000000000 -0400 -@@ -415,7 +415,7 @@ - * and initialize its drive independent registers. - */ - --static unsigned int __init init_chipset_via82cxxx(struct pci_dev *dev, const char *name) -+static unsigned int __devinit init_chipset_via82cxxx(struct pci_dev *dev, const char *name) - { - struct pci_dev *isa = NULL; - u8 t, v; -@@ -576,7 +576,7 @@ - return 0; - } - --static void __init init_hwif_via82cxxx(ide_hwif_t *hwif) -+static void __devinit init_hwif_via82cxxx(ide_hwif_t *hwif) - { - int i; - diff --git a/debian/patches-debian/drivers-scsi-megaraid_splitup.patch b/debian/patches-debian/drivers-scsi-megaraid_splitup.patch index 60af03e21..db39b5c37 100644 --- a/debian/patches-debian/drivers-scsi-megaraid_splitup.patch +++ b/debian/patches-debian/drivers-scsi-megaraid_splitup.patch @@ -48,7 +48,7 @@ diff -urNad linux-source-2.6.12-2.6.11.90/drivers/scsi/megaraid.c /usr/src/dpatc { struct Scsi_Host *host; adapter_t *adapter; -@@ -5033,37 +5033,25 @@ +@@ -5033,35 +5033,23 @@ } static struct pci_device_id megaraid_pci_tbl[] = { @@ -79,9 +79,7 @@ diff -urNad linux-source-2.6.12-2.6.11.90/drivers/scsi/megaraid.c /usr/src/dpatc - .probe = megaraid_probe_one, + .probe = megaraid_legacy_probe_one, .remove = __devexit_p(megaraid_remove_one), - .driver = { - .shutdown = megaraid_shutdown, - }, + .shutdown = megaraid_shutdown, }; -static int __init megaraid_init(void) diff --git a/debian/patches-debian/ia64-generic-nosmp.patch b/debian/patches-debian/ia64-generic-nosmp.patch deleted file mode 100644 index f208b3a18..000000000 --- a/debian/patches-debian/ia64-generic-nosmp.patch +++ /dev/null @@ -1,306 +0,0 @@ -#! /bin/sh -e -## DP: Description: Fix ia64 generic UP builds -## DP: Patch author: Jesse Barnes , dann frazier -## DP: Upstream status: Submitted - -. $(dirname $0)/DPATCH - -@DPATCH@ - -diff -urN linux-2.6.12.orig/arch/ia64/kernel/Makefile linux-2.6.12/arch/ia64/kernel/Makefile ---- linux-2.6.12.orig/arch/ia64/kernel/Makefile 2005-06-17 13:48:29.000000000 -0600 -+++ linux-2.6.12/arch/ia64/kernel/Makefile 2005-06-18 22:14:35.000000000 -0600 -@@ -17,6 +17,7 @@ - obj-$(CONFIG_IOSAPIC) += iosapic.o - obj-$(CONFIG_MODULES) += module.o - obj-$(CONFIG_SMP) += smp.o smpboot.o domain.o -+obj-$(CONFIG_NUMA) += numa.o - obj-$(CONFIG_PERFMON) += perfmon_default_smpl.o - obj-$(CONFIG_IA64_CYCLONE) += cyclone.o - obj-$(CONFIG_IA64_MCA_RECOVERY) += mca_recovery.o -diff -urN linux-2.6.12.orig/arch/ia64/kernel/acpi.c linux-2.6.12/arch/ia64/kernel/acpi.c ---- linux-2.6.12.orig/arch/ia64/kernel/acpi.c 2005-06-17 13:48:29.000000000 -0600 -+++ linux-2.6.12/arch/ia64/kernel/acpi.c 2005-06-18 22:14:35.000000000 -0600 -@@ -642,9 +642,11 @@ - if (smp_boot_data.cpu_phys_id[cpu] != hard_smp_processor_id()) - node_cpuid[i++].phys_id = smp_boot_data.cpu_phys_id[cpu]; - } -- build_cpu_to_node_map(); - # endif - #endif -+#ifdef CONFIG_ACPI_NUMA -+ build_cpu_to_node_map(); -+#endif - /* Make boot-up look pretty */ - printk(KERN_INFO "%d CPUs available, %d CPUs total\n", available_cpus, total_cpus); - return 0; -diff -urN linux-2.6.12.orig/arch/ia64/kernel/numa.c linux-2.6.12/arch/ia64/kernel/numa.c ---- linux-2.6.12.orig/arch/ia64/kernel/numa.c 1969-12-31 17:00:00.000000000 -0700 -+++ linux-2.6.12/arch/ia64/kernel/numa.c 2005-06-18 22:14:35.000000000 -0600 -@@ -0,0 +1,57 @@ -+/* -+ * 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 -+ * -+ * ia64 kernel NUMA specific stuff -+ * -+ * Copyright (C) 2002 Erich Focht -+ * Copyright (C) 2004 Silicon Graphics, Inc. -+ * Jesse Barnes -+ */ -+#include -+#include -+#include -+#include -+#include -+ -+u8 cpu_to_node_map[NR_CPUS] __cacheline_aligned; -+EXPORT_SYMBOL(cpu_to_node_map); -+ -+cpumask_t node_to_cpu_mask[MAX_NUMNODES] __cacheline_aligned; -+ -+/** -+ * build_cpu_to_node_map - setup cpu to node and node to cpumask arrays -+ * -+ * Build cpu to node mapping and initialize the per node cpu masks using -+ * info from the node_cpuid array handed to us by ACPI. -+ */ -+void __init build_cpu_to_node_map(void) -+{ -+ int cpu, i, node; -+ -+ for(node=0; node < MAX_NUMNODES; node++) -+ cpus_clear(node_to_cpu_mask[node]); -+ -+ for(cpu = 0; cpu < NR_CPUS; ++cpu) { -+ node = -1; -+ for (i = 0; i < NR_CPUS; ++i) -+ if (cpu_physical_id(cpu) == node_cpuid[i].phys_id) { -+ node = node_cpuid[i].nid; -+ break; -+ } -+ cpu_to_node_map[cpu] = (node >= 0) ? node : 0; -+ if (node >= 0) -+ cpu_set(cpu, node_to_cpu_mask[node]); -+ } -+} -diff -urN linux-2.6.12.orig/arch/ia64/kernel/smpboot.c linux-2.6.12/arch/ia64/kernel/smpboot.c ---- linux-2.6.12.orig/arch/ia64/kernel/smpboot.c 2005-06-17 13:48:29.000000000 -0600 -+++ linux-2.6.12/arch/ia64/kernel/smpboot.c 2005-06-18 22:14:35.000000000 -0600 -@@ -524,47 +524,6 @@ - } - } - --#ifdef CONFIG_NUMA -- --/* on which node is each logical CPU (one cacheline even for 64 CPUs) */ --u8 cpu_to_node_map[NR_CPUS] __cacheline_aligned; --EXPORT_SYMBOL(cpu_to_node_map); --/* which logical CPUs are on which nodes */ --cpumask_t node_to_cpu_mask[MAX_NUMNODES] __cacheline_aligned; -- --/* -- * Build cpu to node mapping and initialize the per node cpu masks. -- */ --void __init --build_cpu_to_node_map (void) --{ -- int cpu, i, node; -- -- for(node=0; node= 0) ? node : 0; -- if (node >= 0) -- cpu_set(cpu, node_to_cpu_mask[node]); -- } --} -- --#endif /* CONFIG_NUMA */ -- - /* - * Cycle through the APs sending Wakeup IPIs to boot each. - */ -diff -urN linux-2.6.12.orig/arch/ia64/mm/discontig.c linux-2.6.12/arch/ia64/mm/discontig.c ---- linux-2.6.12.orig/arch/ia64/mm/discontig.c 2005-06-17 13:48:29.000000000 -0600 -+++ linux-2.6.12/arch/ia64/mm/discontig.c 2005-06-18 22:14:35.000000000 -0600 -@@ -274,6 +274,33 @@ - } - - /** -+ * per_cpu_node_setup - setup per-cpu areas on each node -+ * @cpu_data: per-cpu area on this node -+ * @node: node to setup -+ * -+ * Copy the static per-cpu data into the region we just set aside and then -+ * setup __per_cpu_offset for each CPU on this node. Return a pointer to -+ * the end of the area. -+ */ -+static void *per_cpu_node_setup(void *cpu_data, int node) -+{ -+#ifdef CONFIG_SMP -+ int cpu; -+ -+ for (cpu = 0; cpu < NR_CPUS; cpu++) { -+ if (node == node_cpuid[cpu].nid) { -+ memcpy(__va(cpu_data), __phys_per_cpu_start, -+ __per_cpu_end - __per_cpu_start); -+ __per_cpu_offset[cpu] = (char*)__va(cpu_data) - -+ __per_cpu_start; -+ cpu_data += PERCPU_PAGE_SIZE; -+ } -+ } -+#endif -+ return cpu_data; -+} -+ -+/** - * find_pernode_space - allocate memory for memory map and per-node structures - * @start: physical start of range - * @len: length of range -@@ -304,7 +331,7 @@ - static int __init find_pernode_space(unsigned long start, unsigned long len, - int node) - { -- unsigned long epfn, cpu, cpus, phys_cpus; -+ unsigned long epfn, cpus, phys_cpus; - unsigned long pernodesize = 0, pernode, pages, mapsize; - void *cpu_data; - struct bootmem_data *bdp = &mem_data[node].bootmem_data; -@@ -357,20 +384,7 @@ - mem_data[node].pgdat->bdata = bdp; - pernode += L1_CACHE_ALIGN(sizeof(pg_data_t)); - -- /* -- * Copy the static per-cpu data into the region we -- * just set aside and then setup __per_cpu_offset -- * for each CPU on this node. -- */ -- for (cpu = 0; cpu < NR_CPUS; cpu++) { -- if (node == node_cpuid[cpu].nid) { -- memcpy(__va(cpu_data), __phys_per_cpu_start, -- __per_cpu_end - __per_cpu_start); -- __per_cpu_offset[cpu] = (char*)__va(cpu_data) - -- __per_cpu_start; -- cpu_data += PERCPU_PAGE_SIZE; -- } -- } -+ cpu_data = per_cpu_node_setup(cpu_data, node); - } - - return 0; -@@ -436,8 +450,8 @@ - */ - static void __init initialize_pernode_data(void) - { -- int cpu, node; - pg_data_t *pgdat_list[MAX_NUMNODES]; -+ int cpu, node; - - for_each_online_node(node) - pgdat_list[node] = mem_data[node].pgdat; -@@ -447,12 +461,22 @@ - memcpy(mem_data[node].node_data->pg_data_ptrs, pgdat_list, - sizeof(pgdat_list)); - } -- -+#ifdef CONFIG_SMP - /* Set the node_data pointer for each per-cpu struct */ - for (cpu = 0; cpu < NR_CPUS; cpu++) { - node = node_cpuid[cpu].nid; - per_cpu(cpu_info, cpu).node_data = mem_data[node].node_data; - } -+#else -+ { -+ struct cpuinfo_ia64 *cpu0_cpu_info; -+ cpu = 0; -+ node = node_cpuid[cpu].nid; -+ cpu0_cpu_info = (struct cpuinfo_ia64 *)(__phys_per_cpu_start + -+ ((char *)&per_cpu__cpu_info - __per_cpu_start)); -+ cpu0_cpu_info->node_data = mem_data[node].node_data; -+ } -+#endif /* CONFIG_SMP */ - } - - /** -@@ -519,6 +543,7 @@ - find_initrd(); - } - -+#ifdef CONFIG_SMP - /** - * per_cpu_init - setup per-cpu variables - * -@@ -529,15 +554,15 @@ - { - int cpu; - -- if (smp_processor_id() == 0) { -- for (cpu = 0; cpu < NR_CPUS; cpu++) { -- per_cpu(local_per_cpu_offset, cpu) = -- __per_cpu_offset[cpu]; -- } -- } -+ if (smp_processor_id() != 0) -+ return __per_cpu_start + __per_cpu_offset[smp_processor_id()]; -+ -+ for (cpu = 0; cpu < NR_CPUS; cpu++) -+ per_cpu(local_per_cpu_offset, cpu) = __per_cpu_offset[cpu]; - - return __per_cpu_start + __per_cpu_offset[smp_processor_id()]; - } -+#endif /* CONFIG_SMP */ - - /** - * show_mem - give short summary of memory stats -diff -urN linux-2.6.12.orig/include/asm-ia64/sn/arch.h linux-2.6.12/include/asm-ia64/sn/arch.h ---- linux-2.6.12.orig/include/asm-ia64/sn/arch.h 2005-06-17 13:48:29.000000000 -0600 -+++ linux-2.6.12/include/asm-ia64/sn/arch.h 2005-06-18 22:15:39.000000000 -0600 -@@ -11,6 +11,7 @@ - #ifndef _ASM_IA64_SN_ARCH_H - #define _ASM_IA64_SN_ARCH_H - -+#include - #include - #include - #include -diff -urN linux-2.6.12.orig/include/asm-ia64/sn/sn_cpuid.h linux-2.6.12/include/asm-ia64/sn/sn_cpuid.h ---- linux-2.6.12.orig/include/asm-ia64/sn/sn_cpuid.h 2005-06-17 13:48:29.000000000 -0600 -+++ linux-2.6.12/include/asm-ia64/sn/sn_cpuid.h 2005-06-18 22:14:35.000000000 -0600 -@@ -81,11 +81,6 @@ - * - */ - --#ifndef CONFIG_SMP --#define cpu_physical_id(cpuid) ((ia64_getreg(_IA64_REG_CR_LID) >> 16) & 0xffff) --#endif -- -- - #define get_node_number(addr) NASID_GET(addr) - - /* diff --git a/debian/patches-debian/modular-ide-pnp.patch b/debian/patches-debian/modular-ide-pnp.patch index b31a9a05d..ee344a3b7 100644 --- a/debian/patches-debian/modular-ide-pnp.patch +++ b/debian/patches-debian/modular-ide-pnp.patch @@ -18,9 +18,8 @@ diff -aurN a/drivers/ide/Kconfig b/drivers/ide/Kconfig diff -aurN a/drivers/ide/Makefile b/drivers/ide/Makefile --- a/drivers/ide/Makefile 2005-06-06 11:22:29.000000000 -0400 +++ b/drivers/ide/Makefile 2005-06-15 22:15:06.000000000 -0400 -@@ -22,7 +22,6 @@ +@@ -23,6 +23,5 @@ ide-core-$(CONFIG_BLK_DEV_IDEDMA) += ide-dma.o - ide-core-$(CONFIG_BLK_DEV_IDE_TCQ) += ide-tcq.o ide-core-$(CONFIG_PROC_FS) += ide-proc.o -ide-core-$(CONFIG_BLK_DEV_IDEPNP) += ide-pnp.o diff --git a/debian/patches-debian/patch-2.6.12.1 b/debian/patches-debian/patch-2.6.12.1 deleted file mode 100644 index a4860aa86..000000000 --- a/debian/patches-debian/patch-2.6.12.1 +++ /dev/null @@ -1,93 +0,0 @@ -diff --git a/arch/ia64/kernel/ptrace.c b/arch/ia64/kernel/ptrace.c ---- a/arch/ia64/kernel/ptrace.c -+++ b/arch/ia64/kernel/ptrace.c -@@ -945,6 +945,13 @@ access_uarea (struct task_struct *child, - *data = (pt->cr_ipsr & IPSR_MASK); - return 0; - -+ case PT_AR_RSC: -+ if (write_access) -+ pt->ar_rsc = *data | (3 << 2); /* force PL3 */ -+ else -+ *data = pt->ar_rsc; -+ return 0; -+ - case PT_AR_RNAT: - urbs_end = ia64_get_user_rbs_end(child, pt, NULL); - rnat_addr = (long) ia64_rse_rnat_addr((long *) -@@ -996,9 +1003,6 @@ access_uarea (struct task_struct *child, - case PT_AR_BSPSTORE: - ptr = pt_reg_addr(pt, ar_bspstore); - break; -- case PT_AR_RSC: -- ptr = pt_reg_addr(pt, ar_rsc); -- break; - case PT_AR_UNAT: - ptr = pt_reg_addr(pt, ar_unat); - break; -@@ -1234,7 +1238,7 @@ ptrace_getregs (struct task_struct *chil - static long - ptrace_setregs (struct task_struct *child, struct pt_all_user_regs __user *ppr) - { -- unsigned long psr, ec, lc, rnat, bsp, cfm, nat_bits, val = 0; -+ unsigned long psr, rsc, ec, lc, rnat, bsp, cfm, nat_bits, val = 0; - struct unw_frame_info info; - struct switch_stack *sw; - struct ia64_fpreg fpval; -@@ -1267,7 +1271,7 @@ ptrace_setregs (struct task_struct *chil - /* app regs */ - - retval |= __get_user(pt->ar_pfs, &ppr->ar[PT_AUR_PFS]); -- retval |= __get_user(pt->ar_rsc, &ppr->ar[PT_AUR_RSC]); -+ retval |= __get_user(rsc, &ppr->ar[PT_AUR_RSC]); - retval |= __get_user(pt->ar_bspstore, &ppr->ar[PT_AUR_BSPSTORE]); - retval |= __get_user(pt->ar_unat, &ppr->ar[PT_AUR_UNAT]); - retval |= __get_user(pt->ar_ccv, &ppr->ar[PT_AUR_CCV]); -@@ -1365,6 +1369,7 @@ ptrace_setregs (struct task_struct *chil - retval |= __get_user(nat_bits, &ppr->nat); - - retval |= access_uarea(child, PT_CR_IPSR, &psr, 1); -+ retval |= access_uarea(child, PT_AR_RSC, &rsc, 1); - retval |= access_uarea(child, PT_AR_EC, &ec, 1); - retval |= access_uarea(child, PT_AR_LC, &lc, 1); - retval |= access_uarea(child, PT_AR_RNAT, &rnat, 1); -diff --git a/arch/ia64/kernel/signal.c b/arch/ia64/kernel/signal.c ---- a/arch/ia64/kernel/signal.c -+++ b/arch/ia64/kernel/signal.c -@@ -94,7 +94,7 @@ sys_sigaltstack (const stack_t __user *u - static long - restore_sigcontext (struct sigcontext __user *sc, struct sigscratch *scr) - { -- unsigned long ip, flags, nat, um, cfm; -+ unsigned long ip, flags, nat, um, cfm, rsc; - long err; - - /* Always make any pending restarted system calls return -EINTR */ -@@ -106,7 +106,7 @@ restore_sigcontext (struct sigcontext __ - err |= __get_user(ip, &sc->sc_ip); /* instruction pointer */ - err |= __get_user(cfm, &sc->sc_cfm); - err |= __get_user(um, &sc->sc_um); /* user mask */ -- err |= __get_user(scr->pt.ar_rsc, &sc->sc_ar_rsc); -+ err |= __get_user(rsc, &sc->sc_ar_rsc); - err |= __get_user(scr->pt.ar_unat, &sc->sc_ar_unat); - err |= __get_user(scr->pt.ar_fpsr, &sc->sc_ar_fpsr); - err |= __get_user(scr->pt.ar_pfs, &sc->sc_ar_pfs); -@@ -119,6 +119,7 @@ restore_sigcontext (struct sigcontext __ - err |= __copy_from_user(&scr->pt.r15, &sc->sc_gr[15], 8); /* r15 */ - - scr->pt.cr_ifs = cfm | (1UL << 63); -+ scr->pt.ar_rsc = rsc | (3 << 2); /* force PL3 */ - - /* establish new instruction pointer: */ - scr->pt.cr_iip = ip & ~0x3UL; -diff --git a/fs/exec.c b/fs/exec.c ---- a/fs/exec.c -+++ b/fs/exec.c -@@ -649,6 +649,7 @@ static inline int de_thread(struct task_ - } - sig->group_exit_task = NULL; - sig->notify_count = 0; -+ sig->real_timer.data = (unsigned long)current; - spin_unlock_irq(lock); - - /* diff --git a/debian/patches-debian/patch-2.6.12.2 b/debian/patches-debian/patch-2.6.12.2 deleted file mode 100644 index a06993b09..000000000 --- a/debian/patches-debian/patch-2.6.12.2 +++ /dev/null @@ -1,172 +0,0 @@ -diff --git a/drivers/acpi/pci_irq.c b/drivers/acpi/pci_irq.c ---- a/drivers/acpi/pci_irq.c -+++ b/drivers/acpi/pci_irq.c -@@ -435,6 +435,7 @@ acpi_pci_irq_enable ( - /* Interrupt Line values above 0xF are forbidden */ - if (dev->irq >= 0 && (dev->irq <= 0xF)) { - printk(" - using IRQ %d\n", dev->irq); -+ acpi_register_gsi(dev->irq, ACPI_LEVEL_SENSITIVE, ACPI_ACTIVE_LOW); - return_VALUE(0); - } - else { -diff --git a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c ---- a/drivers/net/e1000/e1000_main.c -+++ b/drivers/net/e1000/e1000_main.c -@@ -2307,6 +2307,7 @@ e1000_xmit_frame(struct sk_buff *skb, st - tso = e1000_tso(adapter, skb); - if (tso < 0) { - dev_kfree_skb_any(skb); -+ spin_unlock_irqrestore(&adapter->tx_lock, flags); - return NETDEV_TX_OK; - } - -diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c ---- a/drivers/pci/pci-driver.c -+++ b/drivers/pci/pci-driver.c -@@ -396,7 +396,7 @@ int pci_register_driver(struct pci_drive - /* FIXME, once all of the existing PCI drivers have been fixed to set - * the pci shutdown function, this test can go away. */ - if (!drv->driver.shutdown) -- drv->driver.shutdown = pci_device_shutdown, -+ drv->driver.shutdown = pci_device_shutdown; - drv->driver.owner = drv->owner; - drv->driver.kobj.ktype = &pci_driver_kobj_type; - pci_init_dynids(&drv->dynids); -diff --git a/include/asm-i386/string.h b/include/asm-i386/string.h ---- a/include/asm-i386/string.h -+++ b/include/asm-i386/string.h -@@ -116,7 +116,8 @@ __asm__ __volatile__( - "orb $1,%%al\n" - "3:" - :"=a" (__res), "=&S" (d0), "=&D" (d1) -- :"1" (cs),"2" (ct)); -+ :"1" (cs),"2" (ct) -+ :"memory"); - return __res; - } - -@@ -138,8 +139,9 @@ __asm__ __volatile__( - "3:\tsbbl %%eax,%%eax\n\t" - "orb $1,%%al\n" - "4:" -- :"=a" (__res), "=&S" (d0), "=&D" (d1), "=&c" (d2) -- :"1" (cs),"2" (ct),"3" (count)); -+ :"=a" (__res), "=&S" (d0), "=&D" (d1), "=&c" (d2) -+ :"1" (cs),"2" (ct),"3" (count) -+ :"memory"); - return __res; - } - -@@ -158,7 +160,9 @@ __asm__ __volatile__( - "movl $1,%1\n" - "2:\tmovl %1,%0\n\t" - "decl %0" -- :"=a" (__res), "=&S" (d0) : "1" (s),"0" (c)); -+ :"=a" (__res), "=&S" (d0) -+ :"1" (s),"0" (c) -+ :"memory"); - return __res; - } - -@@ -175,7 +179,9 @@ __asm__ __volatile__( - "leal -1(%%esi),%0\n" - "2:\ttestb %%al,%%al\n\t" - "jne 1b" -- :"=g" (__res), "=&S" (d0), "=&a" (d1) :"0" (0),"1" (s),"2" (c)); -+ :"=g" (__res), "=&S" (d0), "=&a" (d1) -+ :"0" (0),"1" (s),"2" (c) -+ :"memory"); - return __res; - } - -@@ -189,7 +195,9 @@ __asm__ __volatile__( - "scasb\n\t" - "notl %0\n\t" - "decl %0" -- :"=c" (__res), "=&D" (d0) :"1" (s),"a" (0), "0" (0xffffffffu)); -+ :"=c" (__res), "=&D" (d0) -+ :"1" (s),"a" (0), "0" (0xffffffffu) -+ :"memory"); - return __res; - } - -@@ -333,7 +341,9 @@ __asm__ __volatile__( - "je 1f\n\t" - "movl $1,%0\n" - "1:\tdecl %0" -- :"=D" (__res), "=&c" (d0) : "a" (c),"0" (cs),"1" (count)); -+ :"=D" (__res), "=&c" (d0) -+ :"a" (c),"0" (cs),"1" (count) -+ :"memory"); - return __res; - } - -@@ -369,7 +379,7 @@ __asm__ __volatile__( - "je 2f\n\t" - "stosb\n" - "2:" -- : "=&c" (d0), "=&D" (d1) -+ :"=&c" (d0), "=&D" (d1) - :"a" (c), "q" (count), "0" (count/4), "1" ((long) s) - :"memory"); - return (s); -@@ -392,7 +402,8 @@ __asm__ __volatile__( - "jne 1b\n" - "3:\tsubl %2,%0" - :"=a" (__res), "=&d" (d0) -- :"c" (s),"1" (count)); -+ :"c" (s),"1" (count) -+ :"memory"); - return __res; - } - /* end of additional stuff */ -@@ -473,7 +484,8 @@ static inline void * memscan(void * addr - "dec %%edi\n" - "1:" - : "=D" (addr), "=c" (size) -- : "0" (addr), "1" (size), "a" (c)); -+ : "0" (addr), "1" (size), "a" (c) -+ : "memory"); - return addr; - } - -diff --git a/mm/memory.c b/mm/memory.c ---- a/mm/memory.c -+++ b/mm/memory.c -@@ -1164,7 +1164,7 @@ int remap_pfn_range(struct vm_area_struc - { - pgd_t *pgd; - unsigned long next; -- unsigned long end = addr + size; -+ unsigned long end = addr + PAGE_ALIGN(size); - struct mm_struct *mm = vma->vm_mm; - int err; - -diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c ---- a/net/netlink/af_netlink.c -+++ b/net/netlink/af_netlink.c -@@ -315,8 +315,8 @@ err: - static void netlink_remove(struct sock *sk) - { - netlink_table_grab(); -- nl_table[sk->sk_protocol].hash.entries--; -- sk_del_node_init(sk); -+ if (sk_del_node_init(sk)) -+ nl_table[sk->sk_protocol].hash.entries--; - if (nlk_sk(sk)->groups) - __sk_del_bind_node(sk); - netlink_table_ungrab(); -@@ -429,7 +429,12 @@ retry: - err = netlink_insert(sk, pid); - if (err == -EADDRINUSE) - goto retry; -- return 0; -+ -+ /* If 2 threads race to autobind, that is fine. */ -+ if (err == -EBUSY) -+ err = 0; -+ -+ return err; - } - - static inline int netlink_capable(struct socket *sock, unsigned int flag) diff --git a/debian/patches-debian/patch-2.6.12.3 b/debian/patches-debian/patch-2.6.12.3 deleted file mode 100644 index 99676949d..000000000 --- a/debian/patches-debian/patch-2.6.12.3 +++ /dev/null @@ -1,640 +0,0 @@ -diff --git a/arch/ppc/kernel/time.c b/arch/ppc/kernel/time.c ---- a/arch/ppc/kernel/time.c -+++ b/arch/ppc/kernel/time.c -@@ -89,6 +89,9 @@ unsigned long tb_to_ns_scale; - - extern unsigned long wall_jiffies; - -+/* used for timezone offset */ -+static long timezone_offset; -+ - DEFINE_SPINLOCK(rtc_lock); - - EXPORT_SYMBOL(rtc_lock); -@@ -170,7 +173,7 @@ void timer_interrupt(struct pt_regs * re - xtime.tv_sec - last_rtc_update >= 659 && - abs((xtime.tv_nsec / 1000) - (1000000-1000000/HZ)) < 500000/HZ && - jiffies - wall_jiffies == 1) { -- if (ppc_md.set_rtc_time(xtime.tv_sec+1 + time_offset) == 0) -+ if (ppc_md.set_rtc_time(xtime.tv_sec+1 + timezone_offset) == 0) - last_rtc_update = xtime.tv_sec+1; - else - /* Try again one minute later */ -@@ -286,7 +289,7 @@ void __init time_init(void) - unsigned old_stamp, stamp, elapsed; - - if (ppc_md.time_init != NULL) -- time_offset = ppc_md.time_init(); -+ timezone_offset = ppc_md.time_init(); - - if (__USE_RTC()) { - /* 601 processor: dec counts down by 128 every 128ns */ -@@ -331,10 +334,10 @@ void __init time_init(void) - set_dec(tb_ticks_per_jiffy); - - /* If platform provided a timezone (pmac), we correct the time */ -- if (time_offset) { -- sys_tz.tz_minuteswest = -time_offset / 60; -+ if (timezone_offset) { -+ sys_tz.tz_minuteswest = -timezone_offset / 60; - sys_tz.tz_dsttime = 0; -- xtime.tv_sec -= time_offset; -+ xtime.tv_sec -= timezone_offset; - } - set_normalized_timespec(&wall_to_monotonic, - -xtime.tv_sec, -xtime.tv_nsec); -diff --git a/arch/um/kernel/process.c b/arch/um/kernel/process.c ---- a/arch/um/kernel/process.c -+++ b/arch/um/kernel/process.c -@@ -130,7 +130,7 @@ int start_fork_tramp(void *thread_arg, u - return(arg.pid); - } - --static int ptrace_child(void) -+static int ptrace_child(void *arg) - { - int ret; - int pid = os_getpid(), ppid = getppid(); -@@ -159,16 +159,20 @@ static int ptrace_child(void) - _exit(ret); - } - --static int start_ptraced_child(void) -+static int start_ptraced_child(void **stack_out) - { -+ void *stack; -+ unsigned long sp; - int pid, n, status; - -- pid = fork(); -- if(pid == 0) -- ptrace_child(); -- -+ stack = mmap(NULL, PAGE_SIZE, PROT_READ | PROT_WRITE | PROT_EXEC, -+ MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); -+ if(stack == MAP_FAILED) -+ panic("check_ptrace : mmap failed, errno = %d", errno); -+ sp = (unsigned long) stack + PAGE_SIZE - sizeof(void *); -+ pid = clone(ptrace_child, (void *) sp, SIGCHLD, NULL); - if(pid < 0) -- panic("check_ptrace : fork failed, errno = %d", errno); -+ panic("check_ptrace : clone failed, errno = %d", errno); - CATCH_EINTR(n = waitpid(pid, &status, WUNTRACED)); - if(n < 0) - panic("check_ptrace : wait failed, errno = %d", errno); -@@ -176,6 +180,7 @@ static int start_ptraced_child(void) - panic("check_ptrace : expected SIGSTOP, got status = %d", - status); - -+ *stack_out = stack; - return(pid); - } - -@@ -183,12 +188,12 @@ static int start_ptraced_child(void) - * just avoid using sysemu, not panic, but only if SYSEMU features are broken. - * So only for SYSEMU features we test mustpanic, while normal host features - * must work anyway!*/ --static int stop_ptraced_child(int pid, int exitcode, int mustexit) -+static int stop_ptraced_child(int pid, void *stack, int exitcode, int mustpanic) - { - int status, n, ret = 0; - - if(ptrace(PTRACE_CONT, pid, 0, 0) < 0) -- panic("stop_ptraced_child : ptrace failed, errno = %d", errno); -+ panic("check_ptrace : ptrace failed, errno = %d", errno); - CATCH_EINTR(n = waitpid(pid, &status, 0)); - if(!WIFEXITED(status) || (WEXITSTATUS(status) != exitcode)) { - int exit_with = WEXITSTATUS(status); -@@ -199,13 +204,15 @@ static int stop_ptraced_child(int pid, i - printk("check_ptrace : child exited with exitcode %d, while " - "expecting %d; status 0x%x", exit_with, - exitcode, status); -- if (mustexit) -+ if (mustpanic) - panic("\n"); - else - printk("\n"); - ret = -1; - } - -+ if(munmap(stack, PAGE_SIZE) < 0) -+ panic("check_ptrace : munmap failed, errno = %d", errno); - return ret; - } - -@@ -227,11 +234,12 @@ __uml_setup("nosysemu", nosysemu_cmd_par - - static void __init check_sysemu(void) - { -+ void *stack; - int pid, syscall, n, status, count=0; - - printk("Checking syscall emulation patch for ptrace..."); - sysemu_supported = 0; -- pid = start_ptraced_child(); -+ pid = start_ptraced_child(&stack); - - if(ptrace(PTRACE_SYSEMU, pid, 0, 0) < 0) - goto fail; -@@ -249,7 +257,7 @@ static void __init check_sysemu(void) - panic("check_sysemu : failed to modify system " - "call return, errno = %d", errno); - -- if (stop_ptraced_child(pid, 0, 0) < 0) -+ if (stop_ptraced_child(pid, stack, 0, 0) < 0) - goto fail_stopped; - - sysemu_supported = 1; -@@ -257,7 +265,7 @@ static void __init check_sysemu(void) - set_using_sysemu(!force_sysemu_disabled); - - printk("Checking advanced syscall emulation patch for ptrace..."); -- pid = start_ptraced_child(); -+ pid = start_ptraced_child(&stack); - while(1){ - count++; - if(ptrace(PTRACE_SYSEMU_SINGLESTEP, pid, 0, 0) < 0) -@@ -282,7 +290,7 @@ static void __init check_sysemu(void) - break; - } - } -- if (stop_ptraced_child(pid, 0, 0) < 0) -+ if (stop_ptraced_child(pid, stack, 0, 0) < 0) - goto fail_stopped; - - sysemu_supported = 2; -@@ -293,17 +301,18 @@ static void __init check_sysemu(void) - return; - - fail: -- stop_ptraced_child(pid, 1, 0); -+ stop_ptraced_child(pid, stack, 1, 0); - fail_stopped: - printk("missing\n"); - } - - void __init check_ptrace(void) - { -+ void *stack; - int pid, syscall, n, status; - - printk("Checking that ptrace can change system call numbers..."); -- pid = start_ptraced_child(); -+ pid = start_ptraced_child(&stack); - - if (ptrace(PTRACE_OLDSETOPTIONS, pid, 0, (void *)PTRACE_O_TRACESYSGOOD) < 0) - panic("check_ptrace: PTRACE_SETOPTIONS failed, errno = %d", errno); -@@ -330,7 +339,7 @@ void __init check_ptrace(void) - break; - } - } -- stop_ptraced_child(pid, 0, 1); -+ stop_ptraced_child(pid, stack, 0, 1); - printk("OK\n"); - check_sysemu(); - } -@@ -362,10 +371,11 @@ void forward_pending_sigio(int target) - static inline int check_skas3_ptrace_support(void) - { - struct ptrace_faultinfo fi; -+ void *stack; - int pid, n, ret = 1; - - printf("Checking for the skas3 patch in the host..."); -- pid = start_ptraced_child(); -+ pid = start_ptraced_child(&stack); - - n = ptrace(PTRACE_FAULTINFO, pid, 0, &fi); - if (n < 0) { -@@ -380,7 +390,7 @@ static inline int check_skas3_ptrace_sup - } - - init_registers(pid); -- stop_ptraced_child(pid, 1, 1); -+ stop_ptraced_child(pid, stack, 1, 1); - - return(ret); - } -diff --git a/drivers/acpi/pci_irq.c b/drivers/acpi/pci_irq.c ---- a/drivers/acpi/pci_irq.c -+++ b/drivers/acpi/pci_irq.c -@@ -433,7 +433,7 @@ acpi_pci_irq_enable ( - printk(KERN_WARNING PREFIX "PCI Interrupt %s[%c]: no GSI", - pci_name(dev), ('A' + pin)); - /* Interrupt Line values above 0xF are forbidden */ -- if (dev->irq >= 0 && (dev->irq <= 0xF)) { -+ if (dev->irq > 0 && (dev->irq <= 0xF)) { - printk(" - using IRQ %d\n", dev->irq); - acpi_register_gsi(dev->irq, ACPI_LEVEL_SENSITIVE, ACPI_ACTIVE_LOW); - return_VALUE(0); -diff --git a/drivers/char/tpm/tpm.c b/drivers/char/tpm/tpm.c ---- a/drivers/char/tpm/tpm.c -+++ b/drivers/char/tpm/tpm.c -@@ -32,12 +32,6 @@ - - #define TPM_BUFSIZE 2048 - --/* PCI configuration addresses */ --#define PCI_GEN_PMCON_1 0xA0 --#define PCI_GEN1_DEC 0xE4 --#define PCI_LPC_EN 0xE6 --#define PCI_GEN2_DEC 0xEC -- - static LIST_HEAD(tpm_chip_list); - static DEFINE_SPINLOCK(driver_lock); - static int dev_mask[32]; -@@ -61,72 +55,6 @@ void tpm_time_expired(unsigned long ptr) - EXPORT_SYMBOL_GPL(tpm_time_expired); - - /* -- * Initialize the LPC bus and enable the TPM ports -- */ --int tpm_lpc_bus_init(struct pci_dev *pci_dev, u16 base) --{ -- u32 lpcenable, tmp; -- int is_lpcm = 0; -- -- switch (pci_dev->vendor) { -- case PCI_VENDOR_ID_INTEL: -- switch (pci_dev->device) { -- case PCI_DEVICE_ID_INTEL_82801CA_12: -- case PCI_DEVICE_ID_INTEL_82801DB_12: -- is_lpcm = 1; -- break; -- } -- /* init ICH (enable LPC) */ -- pci_read_config_dword(pci_dev, PCI_GEN1_DEC, &lpcenable); -- lpcenable |= 0x20000000; -- pci_write_config_dword(pci_dev, PCI_GEN1_DEC, lpcenable); -- -- if (is_lpcm) { -- pci_read_config_dword(pci_dev, PCI_GEN1_DEC, -- &lpcenable); -- if ((lpcenable & 0x20000000) == 0) { -- dev_err(&pci_dev->dev, -- "cannot enable LPC\n"); -- return -ENODEV; -- } -- } -- -- /* initialize TPM registers */ -- pci_read_config_dword(pci_dev, PCI_GEN2_DEC, &tmp); -- -- if (!is_lpcm) -- tmp = (tmp & 0xFFFF0000) | (base & 0xFFF0); -- else -- tmp = -- (tmp & 0xFFFF0000) | (base & 0xFFF0) | -- 0x00000001; -- -- pci_write_config_dword(pci_dev, PCI_GEN2_DEC, tmp); -- -- if (is_lpcm) { -- pci_read_config_dword(pci_dev, PCI_GEN_PMCON_1, -- &tmp); -- tmp |= 0x00000004; /* enable CLKRUN */ -- pci_write_config_dword(pci_dev, PCI_GEN_PMCON_1, -- tmp); -- } -- tpm_write_index(0x0D, 0x55); /* unlock 4F */ -- tpm_write_index(0x0A, 0x00); /* int disable */ -- tpm_write_index(0x08, base); /* base addr lo */ -- tpm_write_index(0x09, (base & 0xFF00) >> 8); /* base addr hi */ -- tpm_write_index(0x0D, 0xAA); /* lock 4F */ -- break; -- case PCI_VENDOR_ID_AMD: -- /* nothing yet */ -- break; -- } -- -- return 0; --} -- --EXPORT_SYMBOL_GPL(tpm_lpc_bus_init); -- --/* - * Internal kernel interface to transmit TPM commands - */ - static ssize_t tpm_transmit(struct tpm_chip *chip, const char *buf, -@@ -590,10 +518,6 @@ int tpm_pm_resume(struct pci_dev *pci_de - if (chip == NULL) - return -ENODEV; - -- spin_lock(&driver_lock); -- tpm_lpc_bus_init(pci_dev, chip->vendor->base); -- spin_unlock(&driver_lock); -- - return 0; - } - -diff --git a/drivers/char/tpm/tpm.h b/drivers/char/tpm/tpm.h ---- a/drivers/char/tpm/tpm.h -+++ b/drivers/char/tpm/tpm.h -@@ -79,8 +79,6 @@ static inline void tpm_write_index(int i - } - - extern void tpm_time_expired(unsigned long); --extern int tpm_lpc_bus_init(struct pci_dev *, u16); -- - extern int tpm_register_hardware(struct pci_dev *, - struct tpm_vendor_specific *); - extern int tpm_open(struct inode *, struct file *); -diff --git a/drivers/char/tpm/tpm_atmel.c b/drivers/char/tpm/tpm_atmel.c ---- a/drivers/char/tpm/tpm_atmel.c -+++ b/drivers/char/tpm/tpm_atmel.c -@@ -22,7 +22,10 @@ - #include "tpm.h" - - /* Atmel definitions */ --#define TPM_ATML_BASE 0x400 -+enum tpm_atmel_addr { -+ TPM_ATMEL_BASE_ADDR_LO = 0x08, -+ TPM_ATMEL_BASE_ADDR_HI = 0x09 -+}; - - /* write status bits */ - #define ATML_STATUS_ABORT 0x01 -@@ -127,7 +130,6 @@ static struct tpm_vendor_specific tpm_at - .cancel = tpm_atml_cancel, - .req_complete_mask = ATML_STATUS_BUSY | ATML_STATUS_DATA_AVAIL, - .req_complete_val = ATML_STATUS_DATA_AVAIL, -- .base = TPM_ATML_BASE, - .miscdev = { .fops = &atmel_ops, }, - }; - -@@ -136,14 +138,16 @@ static int __devinit tpm_atml_init(struc - { - u8 version[4]; - int rc = 0; -+ int lo, hi; - - if (pci_enable_device(pci_dev)) - return -EIO; - -- if (tpm_lpc_bus_init(pci_dev, TPM_ATML_BASE)) { -- rc = -ENODEV; -- goto out_err; -- } -+ lo = tpm_read_index( TPM_ATMEL_BASE_ADDR_LO ); -+ hi = tpm_read_index( TPM_ATMEL_BASE_ADDR_HI ); -+ -+ tpm_atmel.base = (hi<<8)|lo; -+ dev_dbg( &pci_dev->dev, "Operating with base: 0x%x\n", tpm_atmel.base); - - /* verify that it is an Atmel part */ - if (tpm_read_index(4) != 'A' || tpm_read_index(5) != 'T' -diff --git a/drivers/char/tpm/tpm_nsc.c b/drivers/char/tpm/tpm_nsc.c ---- a/drivers/char/tpm/tpm_nsc.c -+++ b/drivers/char/tpm/tpm_nsc.c -@@ -24,6 +24,10 @@ - /* National definitions */ - #define TPM_NSC_BASE 0x360 - #define TPM_NSC_IRQ 0x07 -+#define TPM_NSC_BASE0_HI 0x60 -+#define TPM_NSC_BASE0_LO 0x61 -+#define TPM_NSC_BASE1_HI 0x62 -+#define TPM_NSC_BASE1_LO 0x63 - - #define NSC_LDN_INDEX 0x07 - #define NSC_SID_INDEX 0x20 -@@ -234,7 +238,6 @@ static struct tpm_vendor_specific tpm_ns - .cancel = tpm_nsc_cancel, - .req_complete_mask = NSC_STATUS_OBF, - .req_complete_val = NSC_STATUS_OBF, -- .base = TPM_NSC_BASE, - .miscdev = { .fops = &nsc_ops, }, - - }; -@@ -243,15 +246,16 @@ static int __devinit tpm_nsc_init(struct - const struct pci_device_id *pci_id) - { - int rc = 0; -+ int lo, hi; -+ -+ hi = tpm_read_index(TPM_NSC_BASE0_HI); -+ lo = tpm_read_index(TPM_NSC_BASE0_LO); -+ -+ tpm_nsc.base = (hi<<8) | lo; - - if (pci_enable_device(pci_dev)) - return -EIO; - -- if (tpm_lpc_bus_init(pci_dev, TPM_NSC_BASE)) { -- rc = -ENODEV; -- goto out_err; -- } -- - /* verify that it is a National part (SID) */ - if (tpm_read_index(NSC_SID_INDEX) != 0xEF) { - rc = -ENODEV; -diff --git a/drivers/char/tty_ioctl.c b/drivers/char/tty_ioctl.c ---- a/drivers/char/tty_ioctl.c -+++ b/drivers/char/tty_ioctl.c -@@ -476,11 +476,11 @@ int n_tty_ioctl(struct tty_struct * tty, - ld = tty_ldisc_ref(tty); - switch (arg) { - case TCIFLUSH: -- if (ld->flush_buffer) -+ if (ld && ld->flush_buffer) - ld->flush_buffer(tty); - break; - case TCIOFLUSH: -- if (ld->flush_buffer) -+ if (ld && ld->flush_buffer) - ld->flush_buffer(tty); - /* fall through */ - case TCOFLUSH: -diff --git a/drivers/media/video/cx88/cx88-video.c b/drivers/media/video/cx88/cx88-video.c ---- a/drivers/media/video/cx88/cx88-video.c -+++ b/drivers/media/video/cx88/cx88-video.c -@@ -261,7 +261,7 @@ static struct cx88_ctrl cx8800_ctls[] = - .default_value = 0, - .type = V4L2_CTRL_TYPE_INTEGER, - }, -- .off = 0, -+ .off = 128, - .reg = MO_HUE, - .mask = 0x00ff, - .shift = 0, -diff --git a/drivers/net/hamradio/Kconfig b/drivers/net/hamradio/Kconfig ---- a/drivers/net/hamradio/Kconfig -+++ b/drivers/net/hamradio/Kconfig -@@ -17,7 +17,7 @@ config MKISS - - config 6PACK - tristate "Serial port 6PACK driver" -- depends on AX25 && BROKEN_ON_SMP -+ depends on AX25 - ---help--- - 6pack is a transmission protocol for the data exchange between your - PC and your TNC (the Terminal Node Controller acts as a kind of -diff --git a/drivers/net/shaper.c b/drivers/net/shaper.c ---- a/drivers/net/shaper.c -+++ b/drivers/net/shaper.c -@@ -135,10 +135,8 @@ static int shaper_start_xmit(struct sk_b - { - struct shaper *shaper = dev->priv; - struct sk_buff *ptr; -- -- if (down_trylock(&shaper->sem)) -- return -1; - -+ spin_lock(&shaper->lock); - ptr=shaper->sendq.prev; - - /* -@@ -232,7 +230,7 @@ static int shaper_start_xmit(struct sk_b - shaper->stats.collisions++; - } - shaper_kick(shaper); -- up(&shaper->sem); -+ spin_unlock(&shaper->lock); - return 0; - } - -@@ -271,11 +269,9 @@ static void shaper_timer(unsigned long d - { - struct shaper *shaper = (struct shaper *)data; - -- if (!down_trylock(&shaper->sem)) { -- shaper_kick(shaper); -- up(&shaper->sem); -- } else -- mod_timer(&shaper->timer, jiffies); -+ spin_lock(&shaper->lock); -+ shaper_kick(shaper); -+ spin_unlock(&shaper->lock); - } - - /* -@@ -332,21 +328,6 @@ static void shaper_kick(struct shaper *s - - - /* -- * Flush the shaper queues on a closedown -- */ -- --static void shaper_flush(struct shaper *shaper) --{ -- struct sk_buff *skb; -- -- down(&shaper->sem); -- while((skb=skb_dequeue(&shaper->sendq))!=NULL) -- dev_kfree_skb(skb); -- shaper_kick(shaper); -- up(&shaper->sem); --} -- --/* - * Bring the interface up. We just disallow this until a - * bind. - */ -@@ -375,7 +356,15 @@ static int shaper_open(struct net_device - static int shaper_close(struct net_device *dev) - { - struct shaper *shaper=dev->priv; -- shaper_flush(shaper); -+ struct sk_buff *skb; -+ -+ while ((skb = skb_dequeue(&shaper->sendq)) != NULL) -+ dev_kfree_skb(skb); -+ -+ spin_lock_bh(&shaper->lock); -+ shaper_kick(shaper); -+ spin_unlock_bh(&shaper->lock); -+ - del_timer_sync(&shaper->timer); - return 0; - } -@@ -576,6 +565,7 @@ static void shaper_init_priv(struct net_ - init_timer(&sh->timer); - sh->timer.function=shaper_timer; - sh->timer.data=(unsigned long)sh; -+ spin_lock_init(&sh->lock); - } - - /* -diff --git a/fs/char_dev.c b/fs/char_dev.c ---- a/fs/char_dev.c -+++ b/fs/char_dev.c -@@ -139,7 +139,7 @@ __unregister_chrdev_region(unsigned majo - struct char_device_struct *cd = NULL, **cp; - int i = major_to_index(major); - -- up(&chrdevs_lock); -+ down(&chrdevs_lock); - for (cp = &chrdevs[i]; *cp; cp = &(*cp)->next) - if ((*cp)->major == major && - (*cp)->baseminor == baseminor && -diff --git a/include/linux/if_shaper.h b/include/linux/if_shaper.h ---- a/include/linux/if_shaper.h -+++ b/include/linux/if_shaper.h -@@ -23,7 +23,7 @@ struct shaper - __u32 shapeclock; - unsigned long recovery; /* Time we can next clock a packet out on - an empty queue */ -- struct semaphore sem; -+ spinlock_t lock; - struct net_device_stats stats; - struct net_device *dev; - int (*hard_start_xmit) (struct sk_buff *skb, -diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c ---- a/net/ipv4/ip_output.c -+++ b/net/ipv4/ip_output.c -@@ -111,7 +111,6 @@ static int ip_dev_loopback_xmit(struct s - #ifdef CONFIG_NETFILTER_DEBUG - nf_debug_ip_loopback_xmit(newskb); - #endif -- nf_reset(newskb); - netif_rx(newskb); - return 0; - } -@@ -196,8 +195,6 @@ static inline int ip_finish_output2(stru - nf_debug_ip_finish_output2(skb); - #endif /*CONFIG_NETFILTER_DEBUG*/ - -- nf_reset(skb); -- - if (hh) { - int hh_alen; - -diff --git a/net/ipv4/netfilter/ip_conntrack_standalone.c b/net/ipv4/netfilter/ip_conntrack_standalone.c ---- a/net/ipv4/netfilter/ip_conntrack_standalone.c -+++ b/net/ipv4/netfilter/ip_conntrack_standalone.c -@@ -432,6 +432,13 @@ static unsigned int ip_conntrack_defrag( - const struct net_device *out, - int (*okfn)(struct sk_buff *)) - { -+#if !defined(CONFIG_IP_NF_NAT) && !defined(CONFIG_IP_NF_NAT_MODULE) -+ /* Previously seen (loopback)? Ignore. Do this before -+ fragment check. */ -+ if ((*pskb)->nfct) -+ return NF_ACCEPT; -+#endif -+ - /* Gather fragments. */ - if ((*pskb)->nh.iph->frag_off & htons(IP_MF|IP_OFFSET)) { - *pskb = ip_ct_gather_frags(*pskb, -diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c ---- a/net/packet/af_packet.c -+++ b/net/packet/af_packet.c -@@ -274,6 +274,9 @@ static int packet_rcv_spkt(struct sk_buf - dst_release(skb->dst); - skb->dst = NULL; - -+ /* drop conntrack reference */ -+ nf_reset(skb); -+ - spkt = (struct sockaddr_pkt*)skb->cb; - - skb_push(skb, skb->data-skb->mac.raw); -@@ -517,6 +520,9 @@ static int packet_rcv(struct sk_buff *sk - dst_release(skb->dst); - skb->dst = NULL; - -+ /* drop conntrack reference */ -+ nf_reset(skb); -+ - spin_lock(&sk->sk_receive_queue.lock); - po->stats.tp_packets++; - __skb_queue_tail(&sk->sk_receive_queue, skb); diff --git a/debian/patches-debian/patch-2.6.12.4 b/debian/patches-debian/patch-2.6.12.4 deleted file mode 100644 index 25f6ef369..000000000 --- a/debian/patches-debian/patch-2.6.12.4 +++ /dev/null @@ -1,194 +0,0 @@ -diff --git a/arch/i386/kernel/cpu/cpufreq/powernow-k8.c b/arch/i386/kernel/cpu/cpufreq/powernow-k8.c ---- a/arch/i386/kernel/cpu/cpufreq/powernow-k8.c -+++ b/arch/i386/kernel/cpu/cpufreq/powernow-k8.c -@@ -44,7 +44,7 @@ - - #define PFX "powernow-k8: " - #define BFX PFX "BIOS error: " --#define VERSION "version 1.40.2" -+#define VERSION "version 1.40.4" - #include "powernow-k8.h" - - /* serialize freq changes */ -@@ -978,7 +978,7 @@ static int __init powernowk8_cpu_init(st - { - struct powernow_k8_data *data; - cpumask_t oldmask = CPU_MASK_ALL; -- int rc; -+ int rc, i; - - if (!check_supported_cpu(pol->cpu)) - return -ENODEV; -@@ -1064,7 +1064,9 @@ static int __init powernowk8_cpu_init(st - printk("cpu_init done, current fid 0x%x, vid 0x%x\n", - data->currfid, data->currvid); - -- powernow_data[pol->cpu] = data; -+ for_each_cpu_mask(i, cpu_core_map[pol->cpu]) { -+ powernow_data[i] = data; -+ } - - return 0; - -diff --git a/arch/i386/kernel/process.c b/arch/i386/kernel/process.c ---- a/arch/i386/kernel/process.c -+++ b/arch/i386/kernel/process.c -@@ -827,6 +827,8 @@ asmlinkage int sys_get_thread_area(struc - if (idx < GDT_ENTRY_TLS_MIN || idx > GDT_ENTRY_TLS_MAX) - return -EINVAL; - -+ memset(&info, 0, sizeof(info)); -+ - desc = current->thread.tls_array + idx - GDT_ENTRY_TLS_MIN; - - info.entry_number = idx; -diff --git a/arch/x86_64/ia32/syscall32.c b/arch/x86_64/ia32/syscall32.c ---- a/arch/x86_64/ia32/syscall32.c -+++ b/arch/x86_64/ia32/syscall32.c -@@ -57,6 +57,7 @@ int syscall32_setup_pages(struct linux_b - int npages = (VSYSCALL32_END - VSYSCALL32_BASE) >> PAGE_SHIFT; - struct vm_area_struct *vma; - struct mm_struct *mm = current->mm; -+ int ret; - - vma = kmem_cache_alloc(vm_area_cachep, SLAB_KERNEL); - if (!vma) -@@ -78,7 +79,11 @@ int syscall32_setup_pages(struct linux_b - vma->vm_mm = mm; - - down_write(&mm->mmap_sem); -- insert_vm_struct(mm, vma); -+ if ((ret = insert_vm_struct(mm, vma))) { -+ up_write(&mm->mmap_sem); -+ kmem_cache_free(vm_area_cachep, vma); -+ return ret; -+ } - mm->total_vm += npages; - up_write(&mm->mmap_sem); - return 0; -diff --git a/drivers/char/rocket.c b/drivers/char/rocket.c ---- a/drivers/char/rocket.c -+++ b/drivers/char/rocket.c -@@ -277,7 +277,7 @@ static void rp_do_receive(struct r_port - ToRecv = space; - - if (ToRecv <= 0) -- return; -+ goto done; - - /* - * if status indicates there are errored characters in the -@@ -359,6 +359,7 @@ static void rp_do_receive(struct r_port - } - /* Push the data up to the tty layer */ - ld->receive_buf(tty, tty->flip.char_buf, tty->flip.flag_buf, count); -+done: - tty_ldisc_deref(ld); - } - -diff --git a/fs/bio.c b/fs/bio.c ---- a/fs/bio.c -+++ b/fs/bio.c -@@ -261,6 +261,7 @@ inline void __bio_clone(struct bio *bio, - */ - bio->bi_vcnt = bio_src->bi_vcnt; - bio->bi_size = bio_src->bi_size; -+ bio->bi_idx = bio_src->bi_idx; - bio_phys_segments(q, bio); - bio_hw_segments(q, bio); - } -diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h ---- a/include/linux/skbuff.h -+++ b/include/linux/skbuff.h -@@ -1192,7 +1192,7 @@ static inline void *skb_header_pointer(c - { - int hlen = skb_headlen(skb); - -- if (offset + len <= hlen) -+ if (hlen - offset >= len) - return skb->data + offset; - - if (skb_copy_bits(skb, offset, buffer, len) < 0) -diff --git a/net/8021q/vlan.c b/net/8021q/vlan.c ---- a/net/8021q/vlan.c -+++ b/net/8021q/vlan.c -@@ -578,6 +578,14 @@ static int vlan_device_event(struct noti - if (!vlandev) - continue; - -+ if (netif_carrier_ok(dev)) { -+ if (!netif_carrier_ok(vlandev)) -+ netif_carrier_on(vlandev); -+ } else { -+ if (netif_carrier_ok(vlandev)) -+ netif_carrier_off(vlandev); -+ } -+ - if ((vlandev->state & VLAN_LINK_STATE_MASK) != flgs) { - vlandev->state = (vlandev->state &~ VLAN_LINK_STATE_MASK) - | flgs; -diff --git a/net/ipv4/netfilter/ip_conntrack_core.c b/net/ipv4/netfilter/ip_conntrack_core.c ---- a/net/ipv4/netfilter/ip_conntrack_core.c -+++ b/net/ipv4/netfilter/ip_conntrack_core.c -@@ -1124,6 +1124,9 @@ void ip_conntrack_cleanup(void) - schedule(); - goto i_see_dead_people; - } -+ /* wait until all references to ip_conntrack_untracked are dropped */ -+ while (atomic_read(&ip_conntrack_untracked.ct_general.use) > 1) -+ schedule(); - - kmem_cache_destroy(ip_conntrack_cachep); - kmem_cache_destroy(ip_conntrack_expect_cachep); -diff --git a/net/ipv4/netfilter/ip_nat_proto_tcp.c b/net/ipv4/netfilter/ip_nat_proto_tcp.c ---- a/net/ipv4/netfilter/ip_nat_proto_tcp.c -+++ b/net/ipv4/netfilter/ip_nat_proto_tcp.c -@@ -40,7 +40,8 @@ tcp_unique_tuple(struct ip_conntrack_tup - enum ip_nat_manip_type maniptype, - const struct ip_conntrack *conntrack) - { -- static u_int16_t port, *portptr; -+ static u_int16_t port; -+ u_int16_t *portptr; - unsigned int range_size, min, i; - - if (maniptype == IP_NAT_MANIP_SRC) -diff --git a/net/ipv4/netfilter/ip_nat_proto_udp.c b/net/ipv4/netfilter/ip_nat_proto_udp.c ---- a/net/ipv4/netfilter/ip_nat_proto_udp.c -+++ b/net/ipv4/netfilter/ip_nat_proto_udp.c -@@ -41,7 +41,8 @@ udp_unique_tuple(struct ip_conntrack_tup - enum ip_nat_manip_type maniptype, - const struct ip_conntrack *conntrack) - { -- static u_int16_t port, *portptr; -+ static u_int16_t port; -+ u_int16_t *portptr; - unsigned int range_size, min, i; - - if (maniptype == IP_NAT_MANIP_SRC) -diff --git a/net/ipv6/netfilter/ip6_queue.c b/net/ipv6/netfilter/ip6_queue.c ---- a/net/ipv6/netfilter/ip6_queue.c -+++ b/net/ipv6/netfilter/ip6_queue.c -@@ -76,7 +76,9 @@ static DECLARE_MUTEX(ipqnl_sem); - static void - ipq_issue_verdict(struct ipq_queue_entry *entry, int verdict) - { -+ local_bh_disable(); - nf_reinject(entry->skb, entry->info, verdict); -+ local_bh_enable(); - kfree(entry); - } - -diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c ---- a/net/xfrm/xfrm_user.c -+++ b/net/xfrm/xfrm_user.c -@@ -1180,6 +1180,9 @@ static struct xfrm_policy *xfrm_compile_ - if (nr > XFRM_MAX_DEPTH) - return NULL; - -+ if (p->dir > XFRM_POLICY_OUT) -+ return NULL; -+ - xp = xfrm_policy_alloc(GFP_KERNEL); - if (xp == NULL) { - *dir = -ENOBUFS; diff --git a/debian/patches-debian/patch-2.6.12.5 b/debian/patches-debian/patch-2.6.12.5 deleted file mode 100644 index 200e78b55..000000000 --- a/debian/patches-debian/patch-2.6.12.5 +++ /dev/null @@ -1,352 +0,0 @@ -diff --git a/arch/ppc64/boot/zlib.c b/arch/ppc64/boot/zlib.c ---- a/arch/ppc64/boot/zlib.c -+++ b/arch/ppc64/boot/zlib.c -@@ -1307,7 +1307,7 @@ local int huft_build( - { - *t = (inflate_huft *)Z_NULL; - *m = 0; -- return Z_OK; -+ return Z_DATA_ERROR; - } - - -@@ -1351,6 +1351,7 @@ local int huft_build( - if ((j = *p++) != 0) - v[x[j]++] = i; - } while (++i < n); -+ n = x[g]; /* set n to length of v */ - - - /* Generate the Huffman codes and for each, make the table entries */ -diff --git a/arch/x86_64/kernel/setup.c b/arch/x86_64/kernel/setup.c ---- a/arch/x86_64/kernel/setup.c -+++ b/arch/x86_64/kernel/setup.c -@@ -729,8 +729,6 @@ static void __init amd_detect_cmp(struct - int cpu = smp_processor_id(); - int node = 0; - unsigned bits; -- if (c->x86_num_cores == 1) -- return; - - bits = 0; - while ((1 << bits) < c->x86_num_cores) -diff --git a/arch/x86_64/kernel/smp.c b/arch/x86_64/kernel/smp.c ---- a/arch/x86_64/kernel/smp.c -+++ b/arch/x86_64/kernel/smp.c -@@ -284,6 +284,71 @@ struct call_data_struct { - static struct call_data_struct * call_data; - - /* -+ * this function sends a 'generic call function' IPI to one other CPU -+ * in the system. -+ */ -+static void __smp_call_function_single (int cpu, void (*func) (void *info), void *info, -+ int nonatomic, int wait) -+{ -+ struct call_data_struct data; -+ int cpus = 1; -+ -+ data.func = func; -+ data.info = info; -+ atomic_set(&data.started, 0); -+ data.wait = wait; -+ if (wait) -+ atomic_set(&data.finished, 0); -+ -+ call_data = &data; -+ wmb(); -+ /* Send a message to all other CPUs and wait for them to respond */ -+ send_IPI_mask(cpumask_of_cpu(cpu), CALL_FUNCTION_VECTOR); -+ -+ /* Wait for response */ -+ while (atomic_read(&data.started) != cpus) -+ cpu_relax(); -+ -+ if (!wait) -+ return; -+ -+ while (atomic_read(&data.finished) != cpus) -+ cpu_relax(); -+} -+ -+/* -+ * Run a function on another CPU -+ * The function to run. This must be fast and non-blocking. -+ * An arbitrary pointer to pass to the function. -+ * Currently unused. -+ * If true, wait until function has completed on other CPUs. -+ * [RETURNS] 0 on success, else a negative status code. -+ * -+ * Does not return until the remote CPU is nearly ready to execute -+ * or is or has executed. -+ */ -+ -+int smp_call_function_single (int cpu, void (*func) (void *info), void *info, -+ int nonatomic, int wait) -+{ -+ -+ int me = get_cpu(); /* prevent preemption and reschedule on another processor */ -+ -+ if (cpu == me) { -+ printk("%s: trying to call self\n", __func__); -+ put_cpu(); -+ return -EBUSY; -+ } -+ spin_lock_bh(&call_lock); -+ -+ __smp_call_function_single(cpu, func,info,nonatomic,wait); -+ -+ spin_unlock_bh(&call_lock); -+ put_cpu(); -+ return 0; -+} -+ -+/* - * this function sends a 'generic call function' IPI to all other CPUs - * in the system. - */ -diff --git a/arch/x86_64/kernel/smpboot.c b/arch/x86_64/kernel/smpboot.c ---- a/arch/x86_64/kernel/smpboot.c -+++ b/arch/x86_64/kernel/smpboot.c -@@ -202,9 +202,6 @@ static __cpuinit void sync_master(void * - { - unsigned long flags, i; - -- if (smp_processor_id() != boot_cpu_id) -- return; -- - go[MASTER] = 0; - - local_irq_save(flags); -@@ -253,7 +250,7 @@ get_delta(long *rt, long *master) - return tcenter - best_tm; - } - --static __cpuinit void sync_tsc(void) -+static __cpuinit void sync_tsc(unsigned int master) - { - int i, done = 0; - long delta, adj, adjust_latency = 0; -@@ -267,9 +264,17 @@ static __cpuinit void sync_tsc(void) - } t[NUM_ROUNDS] __cpuinitdata; - #endif - -+ printk(KERN_INFO "CPU %d: Syncing TSC to CPU %u.\n", -+ smp_processor_id(), master); -+ - go[MASTER] = 1; - -- smp_call_function(sync_master, NULL, 1, 0); -+ /* It is dangerous to broadcast IPI as cpus are coming up, -+ * as they may not be ready to accept them. So since -+ * we only need to send the ipi to the boot cpu direct -+ * the message, and avoid the race. -+ */ -+ smp_call_function_single(master, sync_master, NULL, 1, 0); - - while (go[MASTER]) /* wait for master to be ready */ - no_cpu_relax(); -@@ -313,16 +318,14 @@ static __cpuinit void sync_tsc(void) - printk(KERN_INFO - "CPU %d: synchronized TSC with CPU %u (last diff %ld cycles, " - "maxerr %lu cycles)\n", -- smp_processor_id(), boot_cpu_id, delta, rt); -+ smp_processor_id(), master, delta, rt); - } - - static void __cpuinit tsc_sync_wait(void) - { - if (notscsync || !cpu_has_tsc) - return; -- printk(KERN_INFO "CPU %d: Syncing TSC to CPU %u.\n", smp_processor_id(), -- boot_cpu_id); -- sync_tsc(); -+ sync_tsc(0); - } - - static __init int notscsync_setup(char *s) -diff --git a/fs/isofs/compress.c b/fs/isofs/compress.c ---- a/fs/isofs/compress.c -+++ b/fs/isofs/compress.c -@@ -129,8 +129,14 @@ static int zisofs_readpage(struct file * - cend = le32_to_cpu(*(__le32 *)(bh->b_data + (blockendptr & bufmask))); - brelse(bh); - -+ if (cstart > cend) -+ goto eio; -+ - csize = cend-cstart; - -+ if (csize > deflateBound(1UL << zisofs_block_shift)) -+ goto eio; -+ - /* Now page[] contains an array of pages, any of which can be NULL, - and the locks on which we hold. We should now read the data and - release the pages. If the pages are NULL the decompressed data -diff --git a/include/asm-x86_64/smp.h b/include/asm-x86_64/smp.h ---- a/include/asm-x86_64/smp.h -+++ b/include/asm-x86_64/smp.h -@@ -46,6 +46,8 @@ extern int pic_mode; - extern int smp_num_siblings; - extern void smp_flush_tlb(void); - extern void smp_message_irq(int cpl, void *dev_id, struct pt_regs *regs); -+extern int smp_call_function_single (int cpuid, void (*func) (void *info), void *info, -+ int retry, int wait); - extern void smp_send_reschedule(int cpu); - extern void smp_invalidate_rcv(void); /* Process an NMI */ - extern void zap_low_mappings(void); -diff --git a/include/linux/zlib.h b/include/linux/zlib.h ---- a/include/linux/zlib.h -+++ b/include/linux/zlib.h -@@ -506,6 +506,11 @@ extern int zlib_deflateReset (z_streamp - stream state was inconsistent (such as zalloc or state being NULL). - */ - -+static inline unsigned long deflateBound(unsigned long s) -+{ -+ return s + ((s + 7) >> 3) + ((s + 63) >> 6) + 11; -+} -+ - extern int zlib_deflateParams (z_streamp strm, int level, int strategy); - /* - Dynamically update the compression level and compression strategy. The -diff --git a/kernel/module.c b/kernel/module.c ---- a/kernel/module.c -+++ b/kernel/module.c -@@ -249,13 +249,18 @@ static inline unsigned int block_size(in - /* Created by linker magic */ - extern char __per_cpu_start[], __per_cpu_end[]; - --static void *percpu_modalloc(unsigned long size, unsigned long align) -+static void *percpu_modalloc(unsigned long size, unsigned long align, -+ const char *name) - { - unsigned long extra; - unsigned int i; - void *ptr; - -- BUG_ON(align > SMP_CACHE_BYTES); -+ if (align > SMP_CACHE_BYTES) { -+ printk(KERN_WARNING "%s: per-cpu alignment %li > %i\n", -+ name, align, SMP_CACHE_BYTES); -+ align = SMP_CACHE_BYTES; -+ } - - ptr = __per_cpu_start; - for (i = 0; i < pcpu_num_used; ptr += block_size(pcpu_size[i]), i++) { -@@ -347,7 +352,8 @@ static int percpu_modinit(void) - } - __initcall(percpu_modinit); - #else /* ... !CONFIG_SMP */ --static inline void *percpu_modalloc(unsigned long size, unsigned long align) -+static inline void *percpu_modalloc(unsigned long size, unsigned long align, -+ const char *name) - { - return NULL; - } -@@ -1554,7 +1560,8 @@ static struct module *load_module(void _ - if (pcpuindex) { - /* We have a special allocation for this section. */ - percpu = percpu_modalloc(sechdrs[pcpuindex].sh_size, -- sechdrs[pcpuindex].sh_addralign); -+ sechdrs[pcpuindex].sh_addralign, -+ mod->name); - if (!percpu) { - err = -ENOMEM; - goto free_mod; -diff --git a/lib/inflate.c b/lib/inflate.c ---- a/lib/inflate.c -+++ b/lib/inflate.c -@@ -326,7 +326,7 @@ DEBG("huft1 "); - { - *t = (struct huft *)NULL; - *m = 0; -- return 0; -+ return 2; - } - - DEBG("huft2 "); -@@ -374,6 +374,7 @@ DEBG("huft5 "); - if ((j = *p++) != 0) - v[x[j]++] = i; - } while (++i < n); -+ n = x[g]; /* set n to length of v */ - - DEBG("h6 "); - -@@ -410,12 +411,13 @@ DEBG1("1 "); - DEBG1("2 "); - f -= a + 1; /* deduct codes from patterns left */ - xp = c + k; -- while (++j < z) /* try smaller tables up to z bits */ -- { -- if ((f <<= 1) <= *++xp) -- break; /* enough codes to use up j bits */ -- f -= *xp; /* else deduct codes from patterns */ -- } -+ if (j < z) -+ while (++j < z) /* try smaller tables up to z bits */ -+ { -+ if ((f <<= 1) <= *++xp) -+ break; /* enough codes to use up j bits */ -+ f -= *xp; /* else deduct codes from patterns */ -+ } - } - DEBG1("3 "); - z = 1 << j; /* table entries for j-bit table */ -diff --git a/lib/zlib_inflate/inftrees.c b/lib/zlib_inflate/inftrees.c ---- a/lib/zlib_inflate/inftrees.c -+++ b/lib/zlib_inflate/inftrees.c -@@ -141,7 +141,7 @@ static int huft_build( - { - *t = NULL; - *m = 0; -- return Z_OK; -+ return Z_DATA_ERROR; - } - - -diff --git a/mm/mempolicy.c b/mm/mempolicy.c ---- a/mm/mempolicy.c -+++ b/mm/mempolicy.c -@@ -409,7 +409,7 @@ asmlinkage long sys_set_mempolicy(int mo - struct mempolicy *new; - DECLARE_BITMAP(nodes, MAX_NUMNODES); - -- if (mode > MPOL_MAX) -+ if (mode < 0 || mode > MPOL_MAX) - return -EINVAL; - err = get_nodes(nodes, nmask, maxnode, mode); - if (err) -diff --git a/security/keys/keyring.c b/security/keys/keyring.c ---- a/security/keys/keyring.c -+++ b/security/keys/keyring.c -@@ -188,7 +188,11 @@ static void keyring_destroy(struct key * - - if (keyring->description) { - write_lock(&keyring_name_lock); -- list_del(&keyring->type_data.link); -+ -+ if (keyring->type_data.link.next != NULL && -+ !list_empty(&keyring->type_data.link)) -+ list_del(&keyring->type_data.link); -+ - write_unlock(&keyring_name_lock); - } - -diff --git a/security/keys/process_keys.c b/security/keys/process_keys.c ---- a/security/keys/process_keys.c -+++ b/security/keys/process_keys.c -@@ -641,7 +641,7 @@ long join_session_keyring(const char *na - keyring = keyring_alloc(name, tsk->uid, tsk->gid, 0, NULL); - if (IS_ERR(keyring)) { - ret = PTR_ERR(keyring); -- goto error; -+ goto error2; - } - } - else if (IS_ERR(keyring)) { -- -To unsubscribe from this list: send the line "unsubscribe linux-kernel-announce" in -the body of a message to majordomo@vger.kernel.org -More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/debian/patches-debian/powerpc-ppc64-ibmvscsi.patch b/debian/patches-debian/powerpc-ppc64-ibmvscsi.patch deleted file mode 100644 index 98834468a..000000000 --- a/debian/patches-debian/powerpc-ppc64-ibmvscsi.patch +++ /dev/null @@ -1,2868 +0,0 @@ -#! /bin/sh -e -## -## All lines beginning with `## DP:' are a description of the patch. -## DP: Description: Enables IBM eServer i/pSeries Virtual SCSI Target Driver -## DP: Description: Needed for i/pSeries with logical partitions (LPAR). -## DP: Patch author: Dave Boutcher (boutcher@us.ibm.com) -## DP: Upstream status: unknown, sent to me by Cajus Pollmeier. - -diff -aurN a/drivers/scsi/Kconfig b/drivers/scsi/Kconfig ---- a/drivers/scsi/Kconfig 2005-06-17 15:48:29.000000000 -0400 -+++ b/drivers/scsi/Kconfig 2005-06-18 12:02:58.000000000 -0400 -@@ -813,6 +813,14 @@ - To compile this driver as a module, choose M here: the - module will be called ibmvscsic. - -+config SCSI_IBMVSCSIS -+ tristate "IBM Virtual SCSI Server support" -+ depends on PPC_PSERIES -+ help -+ This is the IBM Virtual SCSI Server -+ To compile this driver as a module, choose M here: the -+ module will be called ibmvscsis. -+ - config SCSI_INITIO - tristate "Initio 9100U(W) support" - depends on PCI && SCSI -diff -aurN a/drivers/scsi/ibmvscsi/Makefile b/drivers/scsi/ibmvscsi/Makefile ---- a/drivers/scsi/ibmvscsi/Makefile 2005-06-17 15:48:29.000000000 -0400 -+++ b/drivers/scsi/ibmvscsi/Makefile 2005-06-18 12:02:58.000000000 -0400 -@@ -3,3 +3,5 @@ - ibmvscsic-y += ibmvscsi.o - ibmvscsic-$(CONFIG_PPC_ISERIES) += iseries_vscsi.o - ibmvscsic-$(CONFIG_PPC_PSERIES) += rpa_vscsi.o -+ -+obj-$(CONFIG_SCSI_IBMVSCSIS) += ibmvscsis.o -diff -aurN a/drivers/scsi/ibmvscsi/ibmvscsis.c b/drivers/scsi/ibmvscsi/ibmvscsis.c ---- a/drivers/scsi/ibmvscsi/ibmvscsis.c 1969-12-31 19:00:00.000000000 -0500 -+++ b/drivers/scsi/ibmvscsi/ibmvscsis.c 2005-06-18 12:02:58.000000000 -0400 -@@ -0,0 +1,2818 @@ -+/**************************************************************************/ -+/* -*- -linux- -*- */ -+/* IBM eServer i/pSeries Virtual SCSI Target Driver */ -+/* Copyright (C) 2003 Dave Boutcher (boutcher@us.ibm.com) IBM Corp. */ -+/* */ -+/* 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 */ -+/* */ -+/* This module contains the eServer virtual SCSI target code. The driver */ -+/* takes SRP requests from the virtual SCSI client (the linux version is */ -+/* int ibmvscsi.c, but there can be other clients, like AIX or OF) and */ -+/* passes them on to real devices in this system. */ -+/* */ -+/* The basic hierarchy (and somewhat the organization of this file) is */ -+/* that SCSI CDBs are in SRPs are in CRQs. */ -+/* */ -+/**************************************************************************/ -+/* -+ TODO: -+ - Support redirecting SRP SCSI requests to a real SCSI driver -+*/ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include -+#include -+#include -+ -+#include "../scsi.h" -+#include "viosrp.h" -+ -+#define IBMVSCSIS_VERSION "1.2" -+ -+MODULE_DESCRIPTION("IBM Virtual SCSI Target"); -+MODULE_AUTHOR("Dave Boutcher"); -+MODULE_LICENSE("GPL"); -+MODULE_VERSION(IBMVSCSIS_VERSION); -+ -+static int ibmvscsis_debug = 0; -+ -+/* These are fixed and come from the device tree...we -+ * just store them here to save getting them every time. -+ */ -+static char system_id[64] = ""; -+static char partition_name[97] = "UNKNOWN"; -+static unsigned int partition_number = -1; -+ -+/* -+ * Quick macro to enable/disable interrupts -+ * TODO: move to vio.h to be common with ibmvscsi.c -+ */ -+#define h_vio_signal(ua, mode) \ -+ plpar_hcall_norets(H_VIO_SIGNAL, ua, mode) -+ -+/* -+ * These are indexes into the following table, and have to match!!! -+ */ -+#define SENSE_SUCCESS 0 -+#define SENSE_ABORT 1 -+#define SENSE_INVALID_ID 2 -+#define SENSE_DEVICE_FAULT 3 -+#define SENSE_DEVICE_BUSY 4 -+#define SENSE_UNIT_OFFLINE 5 -+#define SENSE_INVALID_CMD 6 -+#define SENSE_INTERMEDIATE 7 -+#define SENSE_WRITE_PROT 8 -+#define SENSE_INVALID_FIELD 9 -+ -+#define TARGET_MAX_NAME_LEN 128 -+ -+static unsigned char ibmvscsis_sense_data[][3] = { -+/* -+ * Sense key lookup table -+ * Format: SenseKey,AdditionalSenseCode,AdditionalSenseCodeQualifier -+ * Adapted from 3w-xxxx.h -+ */ -+ {0x00, 0x00, 0x00}, /* Success */ -+ {0x0b, 0x00, 0x00}, /* Aborted command */ -+ {0x0b, 0x14, 0x00}, /* ID not found */ -+ {0x04, 0x00, 0x00}, /* Device fault */ -+ {0x0b, 0x00, 0x00}, /* Device busy */ -+ {0x02, 0x04, 0x00}, /* Unit offline */ -+ {0x05, 0x20, 0x00}, /* Invalid Command */ -+ {0x10, 0x00, 0x00}, /* Intermediate */ -+ {0x07, 0x27, 0x00}, /* Write Protected */ -+ {0x05, 0x24, 0x00}, /* Invalid field */ -+}; -+ -+/* -+ * SCSI defined structure for inquiry data -+ * TODO: Seral number is currently messed up if you do -+ * scsiinfo. I'm not sure why and I think it comes out of -+ * here -+ */ -+struct inquiry_data { -+ u8 qual_type; -+ u8 rmb_reserve; -+ u8 version; -+ u8 aerc_naca_hisup_format; -+ u8 addl_len; -+ u8 sccs_reserved; -+ u8 bque_encserv_vs_multip_mchngr_reserved; -+ u8 reladr_reserved_linked_cmdqueue_vs; -+ char vendor[8]; -+ char product[16]; -+ char revision[4]; -+ char vendor_specific[20]; -+ char reserved1[2]; -+ char version_descriptor[16]; -+ char reserved2[22]; -+ char unique[158]; -+}; -+ -+extern int vio_num_address_cells; -+ -+/* -+ * an RPA command/response transport queue. This is our structure -+ * that points to the actual queue. feel free to modify this structure -+ * as needed -+ */ -+struct crq_queue { -+ struct viosrp_crq *msgs; -+ int size, cur; -+ dma_addr_t msg_token; -+ spinlock_t lock; -+}; -+ -+/* -+ * This structure tracks our fundamental unit of work. Whenever -+ * an SRP Information Unit (IU) arrives, we track all the good stuff -+ * here -+ */ -+struct iu_entry { -+ union viosrp_iu *iu; -+ struct server_adapter *adapter; -+ struct list_head next; -+ dma_addr_t iu_token; -+ int aborted; -+ struct { -+ dma_addr_t remote_token; -+ char *data_buffer; -+ dma_addr_t data_token; -+ long data_len; -+ struct vdev *vd; -+ char in_use:1; -+ char diunder:1; -+ char diover:1; -+ char dounder:1; -+ char doover:1; -+ char write:1; -+ char linked:1; -+ int data_out_residual_count; -+ int data_in_residual_count; -+ int ioerr; -+ } req; -+}; -+ -+/* -+ * a pool of ius for use -+ */ -+struct iu_pool { -+ spinlock_t lock; -+ struct list_head iu_entries; -+ struct iu_entry *list; -+ union viosrp_iu *iu_storage; -+ dma_addr_t iu_token; -+ u32 size; -+}; -+ -+/* -+ * Represents a single device that someone told us about -+ * that we treat as a LUN -+ */ -+struct vdev { -+ struct list_head list; -+ char type; /* 'B' for block, 'S' for SCSI */ -+ atomic_t refcount; -+ int disabled; -+ u64 lun; -+ struct kobject kobj; -+ struct { -+ char device_name[TARGET_MAX_NAME_LEN]; -+ struct block_device *bdev; -+ long blksize; -+ long lastlba; -+ int ro; -+ } b; -+}; -+ -+/* -+ * Represents a bus. target #'s in SCSI are 6 bits long, -+ * so you can have 64 targets per bus -+ */ -+#define TARGETS_PER_BUS (64) -+#define BUS_PER_ADAPTER (8) -+struct vbus { -+ struct vdev *vdev[TARGETS_PER_BUS]; -+ atomic_t num_targets; -+ struct kobject kobj; -+ int bus_num; -+}; -+ -+/* -+ * Buffer cache -+ */ -+struct dma_buffer { -+ dma_addr_t token; -+ char *addr; -+ size_t len; -+}; -+#define DMA_BUFFER_CACHE_SIZE (16) -+#define DMA_BUFFER_INIT_COUNT (4) -+#define DMA_BUFFER_INIT_LEN (PAGE_SIZE*16) -+ -+/* all driver data associated with a host adapter */ -+struct server_adapter { -+ struct device *dev; -+ struct vio_dev *dma_dev; -+ struct crq_queue queue; -+ struct work_struct crq_task; -+ struct tasklet_struct endio_tasklet; -+ struct iu_pool pool; -+ spinlock_t lock; -+ struct bio *bio_done; -+ struct bio *bio_donetail; -+ struct list_head inflight; -+ struct vbus *vbus[8]; -+ int nvdevs; -+ char name[32]; -+ unsigned long liobn; -+ unsigned long riobn; -+ -+ atomic_t num_buses; -+ struct kobject stats_kobj; -+ -+ /* This ugly expression allocates a bit array of -+ * in-use flags large enough for the number of buffers -+ */ -+ unsigned long dma_buffer_use[(DMA_BUFFER_CACHE_SIZE + -+ sizeof(unsigned long) - 1) -+ / sizeof(unsigned long)]; -+ struct dma_buffer dma_buffer[DMA_BUFFER_CACHE_SIZE]; -+ -+ /* Statistics only */ -+ atomic_t iu_count; /* number allocated */ -+ atomic_t bio_count; /* number allocated */ -+ atomic_t crq_processed; -+ atomic_t interrupts; -+ atomic_t read_processed; -+ atomic_t write_processed; -+ atomic_t buffers_allocated; -+ atomic_t errors; -+}; -+ -+/* -+ * Forward declarations -+ */ -+static long send_rsp(struct iu_entry *iue, int status); -+ -+/* -+ * The following are lifted from usb.h -+ */ -+#define DEBUG 1 -+#ifdef DEBUG -+#define dbg(format, arg...) if (ibmvscsis_debug) printk(KERN_WARNING __FILE__ ": " format , ## arg) -+#else -+#define dbg(format, arg...) do {} while (0) -+#endif -+#define err(format, arg...) printk(KERN_ERR "ibmvscsis: " format , ## arg) -+#define info(format, arg...) printk(KERN_INFO "ibmvscsis: " format , ## arg) -+#define warn(format, arg...) printk(KERN_WARNING "ibmvscsis: " format , ## arg) -+ -+/* ============================================================== -+ * Utility Routines -+ * ============================================================== -+ */ -+/* -+ * return an 8 byte lun given a bus, target, lun. -+ * Today this only supports single level luns. Should we add a level or a -+ * 64 bit LUN as input to support multi-level luns? -+ */ -+u64 make_lun(unsigned int bus, unsigned int target, unsigned int lun) -+{ -+ u16 result = (0x8000 | -+ ((target & 0x003f) << 8) | -+ ((bus & 0x0007) << 5) | (lun & 0x001f)); -+ return ((u64) result) << 48; -+} -+ -+/* -+ * Given an 8 byte LUN, return the first level bus/target/lun. -+ * Today this doesn't support multi-level LUNs -+ */ -+#define GETBUS(x) ((int)((((u64)(x)) >> 53) & 0x0007)) -+#define GETTARGET(x) ((int)((((u64)(x)) >> 56) & 0x003f)) -+#define GETLUN(x) ((int)((((u64)(x)) >> 48) & 0x001f)) -+ -+static u8 getcontrolbyte(u8 * cdb) -+{ -+ return cdb[COMMAND_SIZE(cdb[0]) - 1]; -+} -+ -+static u8 getlink(struct iu_entry *iue) -+{ -+ return (getcontrolbyte(iue->iu->srp.cmd.cdb) & 0x01); -+} -+ -+/* -+ * Given an SRP, figure out the data in length -+ */ -+static int did_len(struct srp_cmd *cmd) -+{ -+ struct memory_descriptor *md; -+ struct indirect_descriptor *id; -+ int offset = cmd->additional_cdb_len * 4; -+ -+ switch (cmd->data_out_format) { -+ case SRP_NO_BUFFER: -+ offset += 0; -+ break; -+ case SRP_DIRECT_BUFFER: -+ offset += sizeof(struct memory_descriptor); -+ break; -+ case SRP_INDIRECT_BUFFER: -+ offset += sizeof(struct indirect_descriptor) -+ + -+ ((cmd->data_out_count - -+ 1) * sizeof(struct memory_descriptor)); -+ break; -+ default: -+ err("client error. Invalid data_out_format %d\n", -+ cmd->data_out_format); -+ return 0; -+ } -+ -+ switch (cmd->data_in_format) { -+ case SRP_NO_BUFFER: -+ return 0; -+ case SRP_DIRECT_BUFFER: -+ md = (struct memory_descriptor *)(cmd->additional_data + -+ offset); -+ return md->length; -+ case SRP_INDIRECT_BUFFER: -+ id = (struct indirect_descriptor *)(cmd->additional_data + -+ offset); -+ return id->total_length; -+ default: -+ err("client error. Invalid data_in_format %d\n", -+ cmd->data_in_format); -+ return 0; -+ } -+} -+ -+/* -+ * We keep a pool of IUs, this routine builds the pool. The pool is -+ * per-adapter. The size of the pool is negotiated as part of the SRP -+ * login, where we negotiate the number of requests (IUs) the client -+ * can send us. This routine is not synchronized. -+ */ -+static int initialize_iu_pool(struct server_adapter *adapter, int size) -+{ -+ struct iu_pool *pool = &adapter->pool; -+ int i; -+ -+ pool->size = size; -+ pool->lock = SPIN_LOCK_UNLOCKED; -+ INIT_LIST_HEAD(&pool->iu_entries); -+ -+ pool->list = kmalloc(pool->size * sizeof(*pool->list), GFP_KERNEL); -+ if (!pool->list) { -+ err("Error: Cannot allocate memory for IU list\n"); -+ return -ENOMEM; -+ } -+ memset(pool->list, 0x00, pool->size * sizeof(*pool->list)); -+ -+ pool->iu_storage = -+ dma_alloc_coherent(adapter->dev, -+ pool->size * sizeof(*pool->iu_storage), -+ &pool->iu_token, 0); -+ if (!pool->iu_storage) { -+ err("Error: Cannot allocate memory for IU pool\n"); -+ kfree(pool->list); -+ return -ENOMEM; -+ } -+ -+ for (i = 0; i < pool->size; ++i) { -+ pool->list[i].iu = pool->iu_storage + i; -+ pool->list[i].iu_token = -+ pool->iu_token + sizeof(*pool->iu_storage) * i; -+ pool->list[i].adapter = adapter; -+ list_add_tail(&pool->list[i].next, &pool->iu_entries); -+ } -+ -+ return 0; -+} -+ -+/* -+ * Free the pool we allocated in initialize_iu_pool -+ */ -+static void release_iu_pool(struct server_adapter *adapter) -+{ -+ struct iu_pool *pool = &adapter->pool; -+ int i, in_use = 0; -+ for (i = 0; i < pool->size; ++i) -+ if (pool->list[i].req.in_use) -+ ++in_use; -+ if (in_use) -+ err("Releasing event pool with %d events still in use?\n", -+ in_use); -+ kfree(pool->list); -+ dma_free_coherent(adapter->dev, pool->size * sizeof(*pool->iu_storage), -+ pool->iu_storage, pool->iu_token); -+} -+ -+/* -+ * Get an IU from the pool. Return NULL of the pool is empty. This -+ * routine is syncronized by a lock. The routine sets all the important -+ * fields to 0 -+ */ -+static struct iu_entry *get_iu(struct server_adapter *adapter) -+{ -+ struct iu_entry *e; -+ unsigned long flags; -+ -+ spin_lock_irqsave(&adapter->pool.lock, flags); -+ if (!list_empty(&adapter->pool.iu_entries)) { -+ e = list_entry(adapter->pool.iu_entries.next, struct iu_entry, -+ next); -+ list_del(adapter->pool.iu_entries.next); -+ -+ if (e->req.in_use) { -+ err("Found in-use iue in free pool!"); -+ } -+ -+ memset(&e->req, 0x00, sizeof(e->req)); -+ -+ e->req.in_use = 1; -+ } else { -+ e = NULL; -+ } -+ -+ spin_unlock_irqrestore(&adapter->pool.lock, flags); -+ atomic_inc(&adapter->iu_count); -+ return e; -+} -+ -+/* -+ * Return an IU to the pool. This routine is synchronized -+ */ -+static void free_iu(struct iu_entry *iue) -+{ -+ unsigned long flags; -+ if (iue->req.vd) { -+ atomic_dec(&iue->req.vd->refcount); -+ } -+ -+ spin_lock_irqsave(&iue->adapter->pool.lock, flags); -+ if (iue->req.in_use == 0) { -+ warn("Internal error, freeing iue twice!\n"); -+ } else { -+ iue->req.in_use = 0; -+ list_add_tail(&iue->next, &iue->adapter->pool.iu_entries); -+ } -+ spin_unlock_irqrestore(&iue->adapter->pool.lock, flags); -+ atomic_dec(&iue->adapter->iu_count); -+} -+ -+/* -+ * Get a CRQ from the inter-partition queue. -+ */ -+static struct viosrp_crq *crq_queue_next_crq(struct crq_queue *queue) -+{ -+ struct viosrp_crq *crq; -+ unsigned long flags; -+ -+ spin_lock_irqsave(&queue->lock, flags); -+ crq = &queue->msgs[queue->cur]; -+ if (crq->valid & 0x80) { -+ if (++queue->cur == queue->size) -+ queue->cur = 0; -+ } else -+ crq = NULL; -+ spin_unlock_irqrestore(&queue->lock, flags); -+ -+ return crq; -+} -+ -+/* -+ * Make the RDMA hypervisor call. There should be a better way to do this -+ * than inline assembler. -+ * TODO: Fix the inline assembler -+ */ -+static long h_copy_rdma(long length, -+ unsigned long sliobn, unsigned long slioba, -+ unsigned long dliobn, unsigned long dlioba) -+{ -+ long lpar_rc = 0; -+ __asm__ __volatile__(" li 3,0x110 \n\t" -+ " mr 4, %1 \n\t" -+ " mr 5, %2 \n\t" -+ " mr 6, %3 \n\t" -+ " mr 7, %4 \n\t" -+ " mr 8, %5 \n\t" -+ " .long 0x44000022 \n\t" -+ " mr %0, 3 \n\t":"=&r"(lpar_rc) -+ :"r"(length), "r"(sliobn), "r"(slioba), -+ "r"(dliobn), "r"(dlioba) -+ :"r0", "r3", "r4", "r5", "r6", "r7", "r8", "cr0", -+ "cr1", "ctr", "xer", "memory"); -+ return lpar_rc; -+} -+ -+/* -+ * Send an SRP to another partition using the CRQ. -+ */ -+static int send_srp(struct iu_entry *iue, u64 length) -+{ -+ long rc, rc1; -+ union { -+ struct viosrp_crq cooked; -+ u64 raw[2]; -+ } crq; -+ -+ /* First copy the SRP */ -+ rc = h_copy_rdma(length, -+ iue->adapter->liobn, -+ iue->iu_token, -+ iue->adapter->riobn, iue->req.remote_token); -+ -+ if (rc) { -+ err("Error %ld transferring data to client\n", rc); -+ } -+ -+ crq.cooked.valid = 0x80; -+ crq.cooked.format = VIOSRP_SRP_FORMAT; -+ crq.cooked.reserved = 0x00; -+ crq.cooked.timeout = 0x00; -+ crq.cooked.IU_length = length; -+ crq.cooked.IU_data_ptr = iue->iu->srp.generic.tag; -+ -+ if (rc == 0) { -+ crq.cooked.status = 0x99; /* TODO: is this right? */ -+ } else { -+ crq.cooked.status = 0x00; -+ } -+ -+ rc1 = -+ plpar_hcall_norets(H_SEND_CRQ, iue->adapter->dma_dev->unit_address, -+ crq.raw[0], crq.raw[1]); -+ -+ if (rc1) { -+ err("Error %ld sending response to client\n", rc1); -+ return rc1; -+ } -+ -+ return rc; -+} -+ -+/* -+ * Send data to a single SRP memory descriptor -+ * Returns amount of data sent, or negative value on error -+ */ -+static long send_md_data(dma_addr_t stoken, int len, -+ struct memory_descriptor *md, -+ struct server_adapter *adapter) -+{ -+ int tosend; -+ long rc; -+ -+ if (len < md->length) -+ tosend = len; -+ else -+ tosend = md->length; -+ -+ rc = h_copy_rdma(tosend, -+ adapter->liobn, -+ stoken, adapter->riobn, md->virtual_address); -+ -+ if (rc != H_Success) { -+ err(" Error %ld transferring data to client\n", rc); -+ return -1; -+ } -+ -+ return tosend; -+} -+ -+/* -+ * Send data to the SRP data_in buffers -+ * Returns amount of data sent, or negative value on error -+ */ -+static long send_cmd_data(dma_addr_t stoken, int len, struct iu_entry *iue) -+{ -+ struct srp_cmd *cmd = &iue->iu->srp.cmd; -+ struct memory_descriptor *md; -+ struct indirect_descriptor *id; -+ int offset = 0; -+ int total_length = 0; -+ int i; -+ int thislen; -+ int bytes; -+ int sentlen = 0; -+ -+ offset = cmd->additional_cdb_len * 4; -+ -+ switch (cmd->data_out_format) { -+ case SRP_NO_BUFFER: -+ offset += 0; -+ break; -+ case SRP_DIRECT_BUFFER: -+ offset += sizeof(struct memory_descriptor); -+ break; -+ case SRP_INDIRECT_BUFFER: -+ offset += sizeof(struct indirect_descriptor) -+ + -+ ((cmd->data_out_count - -+ 1) * sizeof(struct memory_descriptor)); -+ break; -+ default: -+ err("client error: Invalid data_out_format %d\n", -+ cmd->data_out_format); -+ return 0; -+ } -+ -+ switch (cmd->data_in_format) { -+ case SRP_NO_BUFFER: -+ return 0; -+ case SRP_DIRECT_BUFFER: -+ md = (struct memory_descriptor *)(cmd->additional_data + -+ offset); -+ sentlen = send_md_data(stoken, len, md, iue->adapter); -+ len -= sentlen; -+ if (len) { -+ iue->req.diover = 1; -+ iue->req.data_in_residual_count = len; -+ } -+ return sentlen; -+ } -+ -+ if (cmd->data_in_format != SRP_INDIRECT_BUFFER) { -+ err("client error Invalid data_in_format %d\n", -+ cmd->data_in_format); -+ return 0; -+ } -+ -+ id = (struct indirect_descriptor *)(cmd->additional_data + offset); -+ -+ total_length = id->total_length; -+ -+ /* Work through the partial memory descriptor list */ -+ for (i = 0; ((i < cmd->data_in_count) && (len)); i++) { -+ if (len > id->list[i].length) { -+ thislen = id->list[i].length; -+ } else { -+ thislen = len; -+ } -+ -+ bytes = -+ send_md_data(stoken + sentlen, thislen, id->list + i, -+ iue->adapter); -+ if (bytes < 0) -+ return bytes; -+ -+ if (bytes != thislen) { -+ warn("Error: Tried to send %d, sent %d\n", thislen, -+ bytes); -+ } -+ -+ sentlen += bytes; -+ total_length -= bytes; -+ len -= bytes; -+ } -+ -+ if (len) { -+ iue->req.diover = 1; -+ iue->req.data_in_residual_count = len; -+ } -+ -+ return sentlen; -+} -+ -+/* -+ * Get data from the other partition from a single SRP memory descriptor -+ * Returns amount of data sent, or negative value on error -+ */ -+static long get_md_data(dma_addr_t ttoken, int len, -+ struct memory_descriptor *md, -+ struct server_adapter *adapter) -+{ -+ int toget; -+ long rc; -+ -+ if (len < md->length) -+ toget = len; -+ else -+ toget = md->length; -+ -+ rc = h_copy_rdma(toget, -+ adapter->riobn, -+ md->virtual_address, adapter->liobn, ttoken); -+ -+ if (rc != H_Success) { -+ err("Error %ld transferring data to client\n", rc); -+ return -1; -+ } -+ -+ return toget; -+} -+ -+/* -+ * Get data from an SRP data in area. -+ * Returns amount of data sent, or negative value on error -+ */ -+static long get_cmd_data(dma_addr_t stoken, int len, struct iu_entry *iue) -+{ -+ struct srp_cmd *cmd = &iue->iu->srp.cmd; -+ struct memory_descriptor *md; -+ struct indirect_descriptor *id; -+ int offset = 0; -+ int total_length = 0; -+ int i; -+ int thislen; -+ int bytes; -+ int sentlen = 0; -+ -+ offset = cmd->additional_cdb_len * 4; -+ -+ switch (cmd->data_out_format) { -+ case SRP_NO_BUFFER: -+ return 0; -+ break; -+ case SRP_DIRECT_BUFFER: -+ md = (struct memory_descriptor *)(cmd->additional_data + -+ offset); -+ return get_md_data(stoken, len, md, iue->adapter); -+ break; -+ } -+ -+ if (cmd->data_out_format != SRP_INDIRECT_BUFFER) { -+ err("client error: Invalid data_out_format %d\n", -+ cmd->data_out_format); -+ return 0; -+ } -+ -+ id = (struct indirect_descriptor *)(cmd->additional_data + offset); -+ -+ total_length = id->total_length; -+ -+ /* Work through the partial memory descriptor list */ -+ for (i = 0; ((i < cmd->data_out_count) && (len)); i++) { -+ if (len > id->list[i].length) { -+ thislen = id->list[i].length; -+ } else { -+ thislen = len; -+ } -+ -+ bytes = -+ get_md_data(stoken + sentlen, thislen, id->list + i, -+ iue->adapter); -+ if (bytes < 0) -+ return bytes; -+ -+ if (bytes != thislen) { -+ err("Partial data sent to client (%d/%d)\n", bytes, thislen); -+ } -+ -+ sentlen += bytes; -+ total_length -= bytes; -+ len -= bytes; -+ } -+ -+ return sentlen; -+} -+ -+/* -+ * Get some data buffers to start. This doesn't lock the adapter structure! -+ */ -+static void init_data_buffer(struct server_adapter *adapter) -+{ -+ int i; -+ -+ for (i = 0; i < DMA_BUFFER_INIT_COUNT; i++) { -+ if (adapter->dma_buffer[i].addr == NULL) { -+ adapter->dma_buffer[i].addr = (char *) -+ dma_alloc_coherent(adapter->dev, -+ DMA_BUFFER_INIT_LEN, -+ &adapter->dma_buffer[i].token, -+ 0); -+ adapter->dma_buffer[i].len = DMA_BUFFER_INIT_LEN; -+ dbg("data buf %p token %8.8x, len %ld\n", -+ adapter->dma_buffer[i].addr, -+ adapter->dma_buffer[i].token, -+ adapter->dma_buffer[i].len); -+ atomic_inc(&adapter->buffers_allocated); -+ } -+ } -+ -+ return; -+} -+ -+/* -+ * Get a memory buffer that includes a mapped TCE. -+ */ -+static void get_data_buffer(char **buffer, dma_addr_t * data_token, size_t len, -+ struct server_adapter *adapter) -+{ -+ int i; -+ -+ for (i = 0; i < DMA_BUFFER_CACHE_SIZE; i++) { -+ if ((adapter->dma_buffer[i].addr) && -+ (adapter->dma_buffer[i].len >= len) && -+ (!test_and_set_bit(i, adapter->dma_buffer_use))) { -+ *buffer = adapter->dma_buffer[i].addr; -+ *data_token = adapter->dma_buffer[i].token; -+ return; -+ } -+ } -+ -+ /* Couldn't get a buffer! Try and get a new one */ -+ *buffer = (char *)dma_alloc_coherent(adapter->dev, len, data_token, 0); -+ atomic_inc(&adapter->buffers_allocated); -+ dbg("get: %p, %8.8x, %ld\n", *buffer, *data_token, len); -+ return; -+} -+ -+/* -+ * Free a memory buffer that includes a mapped TCE. -+ */ -+static void free_data_buffer(char *buffer, dma_addr_t data_token, size_t len, -+ struct server_adapter *adapter) -+{ -+ int i; -+ -+ /* First see if this buffer is already in the cache */ -+ for (i = 0; i < DMA_BUFFER_CACHE_SIZE; i++) { -+ if (adapter->dma_buffer[i].addr == buffer) { -+ if (adapter->dma_buffer[i].token != data_token) { -+ err("Inconsistent data buffer pool info!\n"); -+ } -+ if (!test_and_clear_bit(i, adapter->dma_buffer_use)) { -+ err("Freeing data buffer twice!\n"); -+ } -+ return; -+ } -+ } -+ -+ /* See if there is an empty slot in our list */ -+ for (i = 0; i < DMA_BUFFER_CACHE_SIZE; i++) { -+ if (!test_and_set_bit(i, adapter->dma_buffer_use)) { -+ if (adapter->dma_buffer[i].addr == NULL) { -+ adapter->dma_buffer[i].addr = buffer; -+ adapter->dma_buffer[i].token = data_token; -+ adapter->dma_buffer[i].len = len; -+ clear_bit(i, adapter->dma_buffer_use); -+ return; -+ } else { -+ clear_bit(i, adapter->dma_buffer_use); -+ } -+ } -+ } -+ -+ /* Now see if there is a smaller buffer we should throw out */ -+ for (i = 0; i < DMA_BUFFER_CACHE_SIZE; i++) { -+ if (!test_and_set_bit(i, adapter->dma_buffer_use)) { -+ if (adapter->dma_buffer[i].len < len) { -+ dbg("fre1: %p, %8.8x, %ld\n", -+ adapter->dma_buffer[i].addr, -+ adapter->dma_buffer[i].token, -+ adapter->dma_buffer[i].len); -+ -+ dma_free_coherent(adapter->dev, -+ adapter->dma_buffer[i].len, -+ adapter->dma_buffer[i].addr, -+ adapter->dma_buffer[i].token); -+ -+ atomic_dec(&adapter->buffers_allocated); -+ -+ adapter->dma_buffer[i].addr = buffer; -+ adapter->dma_buffer[i].token = data_token; -+ adapter->dma_buffer[i].len = len; -+ clear_bit(i, adapter->dma_buffer_use); -+ return; -+ } else { -+ clear_bit(i, adapter->dma_buffer_use); -+ } -+ } -+ } -+ -+ /* No space to cache this. Give it back to the kernel */ -+ dbg("fre2: %p, %8.8x, %ld\n", buffer, data_token, len); -+ dma_free_coherent(adapter->dev, len, buffer, data_token); -+ atomic_dec(&adapter->buffers_allocated); -+} -+ -+/* -+ * Release all the data buffers -+ */ -+static void release_data_buffer(struct server_adapter *adapter) -+{ -+ int i; -+ int free_in_use = 0; -+ -+ for (i = 0; i < DMA_BUFFER_INIT_COUNT; i++) { -+ if (adapter->dma_buffer[i].addr != NULL) { -+ if (test_bit(i, adapter->dma_buffer_use)) { -+ free_in_use++; -+ } -+ dma_free_coherent(adapter->dev, -+ adapter->dma_buffer[i].len, -+ adapter->dma_buffer[i].addr, -+ adapter->dma_buffer[i].token); -+ -+ atomic_dec(&adapter->buffers_allocated); -+ } -+ } -+ -+ if (free_in_use) { -+ err("Freeing %d in-use data buffers\n", free_in_use); -+ } -+ return; -+} -+ -+/* -+ * the routine that gets called on end_io of our bios. We basically -+ * schedule the processing to be done in our task, since we don't want -+ * do things like RDMA in someone else's interrupt handler -+ * -+ * Each iu request may result in multiple bio requests. only proceed -+ * when all the bio requests have done. -+ */ -+static int ibmvscsis_end_io(struct bio *bio, unsigned int nbytes, int error) -+{ -+ struct iu_entry *iue = (struct iu_entry *)bio->bi_private; -+ struct server_adapter *adapter = iue->adapter; -+ unsigned long flags; -+ -+ if (bio->bi_size) -+ return 1; -+ -+ if (!test_bit(BIO_UPTODATE, &bio->bi_flags)) { -+ iue->req.ioerr = 1; -+ }; -+ -+ /* Add the bio to the done queue */ -+ spin_lock_irqsave(&adapter->lock, flags); -+ if (adapter->bio_donetail) { -+ adapter->bio_donetail->bi_next = bio; -+ adapter->bio_donetail = bio; -+ } else -+ adapter->bio_done = adapter->bio_donetail = bio; -+ bio->bi_next = NULL; -+ spin_unlock_irqrestore(&adapter->lock, flags); -+ -+ /* Schedule the task */ -+ tasklet_schedule(&adapter->endio_tasklet); -+ -+ return 0; -+} -+ -+/* -+ * Find the vdev structure from the LUN field in an SRP IUE -+ * Note that this routine bumps a refcount field in the vdev. -+ * Normally this is done when free_iu is called. -+ */ -+static struct vdev *find_device(struct iu_entry *iue) -+{ -+ u16 *lun = (u16 *) & iue->iu->srp.cmd.lun; -+ u32 bus = (lun[0] & 0x00E0) >> 5; -+ u32 target = (lun[0] & 0x3F00) >> 8; -+ u32 slun = (lun[0] & 0x001F); -+ struct vdev *vd; -+ unsigned long flags; -+ -+ /* If asking for a lun other than 0, return nope */ -+ if (slun) { -+ return NULL; -+ } -+ -+ /* Only from SRP CMD */ -+ if (iue->iu->srp.generic.type != SRP_CMD_TYPE) -+ return NULL; -+ -+ /* if not a recognized LUN format, return NULL */ -+ if ((lun[0] & 0xC000) != 0x8000) -+ return NULL; -+ -+ spin_lock_irqsave(&iue->adapter->lock, flags); -+ if (iue->adapter->vbus[bus] == NULL) { -+ spin_unlock_irqrestore(&iue->adapter->lock, flags); -+ return NULL; -+ } -+ -+ vd = iue->adapter->vbus[bus]->vdev[target]; -+ -+ if ((vd == NULL) || (vd->disabled)) { -+ spin_unlock_irqrestore(&iue->adapter->lock, flags); -+ return NULL; -+ } -+ -+ if (vd) { -+ atomic_inc(&vd->refcount); -+ } -+ spin_unlock_irqrestore(&iue->adapter->lock, flags); -+ -+ return vd; -+} -+ -+/* -+ * Process BH buffer completions. When the end_io routine gets called -+ * we queue the bio on an internal queue and start a task to process them -+ */ -+static void endio_task(unsigned long data) -+{ -+ struct server_adapter *adapter = (struct server_adapter *)data; -+ struct iu_entry *iue= NULL; -+ struct bio *bio; -+ int bytes; -+ unsigned long flags; -+ -+ do { -+ spin_lock_irqsave(&adapter->lock, flags); -+ if ((bio = adapter->bio_done)) { -+ if (bio == adapter->bio_donetail) -+ adapter->bio_donetail = NULL; -+ adapter->bio_done = bio->bi_next; -+ bio->bi_next = NULL; -+ } -+ if (bio) { -+ /* Remove this iue from the in-flight list */ -+ iue = (struct iu_entry *)bio->bi_private; -+ if (!iue->req.in_use) { -+ err("Internal error! freed iue in bio!!!\n"); -+ spin_unlock_irqrestore(&adapter->lock, flags); -+ return; -+ } -+ -+ list_del(&iue->next); -+ } -+ -+ spin_unlock_irqrestore(&adapter->lock, flags); -+ -+ if (bio) { -+ /* Send back the SRP and data if this request was NOT -+ * aborted -+ */ -+ if (!iue->aborted) { -+ -+ if (!iue->req.ioerr) { -+ /* return data if this was a read */ -+ if (!iue->req.write) { -+ bytes = -+ send_cmd_data(iue->req. -+ data_token, -+ iue->req. -+ data_len, -+ iue); -+ if (bytes != iue->req.data_len) { -+ err("Error sending data " -+ "on response " -+ "(tried %d, sent %d\n", -+ bio->bi_size, bytes); -+ send_rsp(iue, -+ SENSE_ABORT); -+ } else { -+ send_rsp(iue, -+ SENSE_SUCCESS); -+ } -+ } else { -+ send_rsp(iue, SENSE_SUCCESS); -+ } -+ } else { -+ err("Block operation failed\n"); -+ /*print_command(iue->iu->srp.cmd.cdb);*/ -+ send_rsp(iue, SENSE_DEVICE_FAULT); -+ } -+ } -+ -+ spin_lock_irqsave(&adapter->lock, flags); -+ free_data_buffer(iue->req.data_buffer, -+ iue->req.data_token, iue->req.data_len, -+ adapter); -+ spin_unlock_irqrestore(&adapter->lock, flags); -+ -+ free_iu(iue); -+ -+ bio_put(bio); -+ atomic_dec(&adapter->bio_count); -+ } -+ } while (bio); -+} -+ -+/* ============================================================== -+ * SCSI Command Emulation Routines -+ * ============================================================== -+ */ -+ -+/* -+ * Process an inquiry SCSI Command -+ */ -+static void process_inquiry(struct iu_entry *iue) -+{ -+ struct inquiry_data *id; -+ dma_addr_t data_token; -+ u8 *raw_id; -+ int bytes; -+ -+ id = (struct inquiry_data *)dma_alloc_coherent(iue->adapter->dev, -+ sizeof(*id), -+ &data_token, 0); -+ raw_id = (u8 *)id; -+ memset(id, 0x00, sizeof(*id)); -+ -+ /* If we have a valid device */ -+ if (iue->req.vd) { -+ /* Standard inquiry page */ -+ if ((iue->iu->srp.cmd.cdb[1] == 0x00) && -+ (iue->iu->srp.cmd.cdb[2] == 0x00)) { -+ dbg(" inquiry returning device\n"); -+ id->qual_type = 0x00; /* Direct Access */ -+ id->rmb_reserve = 0x00; /* TODO: CD is removable */ -+ id->version = 0x84; /* ISO/IE */ -+ id->aerc_naca_hisup_format = 0x22;/* naca & fmt 0x02 */ -+ id->addl_len = sizeof(*id) - 4; -+ id->bque_encserv_vs_multip_mchngr_reserved = 0x00; -+ id->reladr_reserved_linked_cmdqueue_vs = 0x02;/*CMDQ*/ -+ memcpy(id->vendor, "IBM ", 8); -+ memcpy(id->product, "VSCSI blkdev ", 16); -+ memcpy(id->revision, "0001", 4); -+ snprintf(id->unique,sizeof(id->unique), -+ "IBM-VSCSI-%s-P%d-%x-%d-%d-%d\n", -+ system_id, -+ partition_number, -+ iue->adapter->dma_dev->unit_address, -+ GETBUS(iue->req.vd->lun), -+ GETTARGET(iue->req.vd->lun), -+ GETLUN(iue->req.vd->lun)); -+ } else if ((iue->iu->srp.cmd.cdb[1] == 0x01) && -+ (iue->iu->srp.cmd.cdb[2] == 0x00)) { -+ /* Supported VPD pages */ -+ raw_id[0] = 0x00; /* qualifier & type */ -+ raw_id[1] = 0x80; /* page */ -+ raw_id[2] = 0x00; /* reserved */ -+ raw_id[3] = 0x03; /* length */ -+ raw_id[4] = 0x00; /* page 0 */ -+ raw_id[5] = 0x80; /* serial number page */ -+ } else if ((iue->iu->srp.cmd.cdb[1] == 0x01) && -+ (iue->iu->srp.cmd.cdb[2] == 0x80)) { -+ /* serial number page */ -+ raw_id[0] = 0x00; /* qualifier & type */ -+ raw_id[1] = 0x80; /* page */ -+ raw_id[2] = 0x00; /* reserved */ -+ snprintf((char *)(raw_id+4), -+ sizeof(*id)-4, -+ "IBM-VSCSI-%s-P%d-%x-%d-%d-%d\n", -+ system_id, -+ partition_number, -+ iue->adapter->dma_dev->unit_address, -+ GETBUS(iue->req.vd->lun), -+ GETTARGET(iue->req.vd->lun), -+ GETLUN(iue->req.vd->lun)); -+ raw_id[3] = strlen((char *)raw_id+4); -+ } else { -+ /* Some unsupported data */ -+ send_rsp(iue, SENSE_INVALID_FIELD); -+ free_iu(iue); -+ return; -+ } -+ } else { -+ dbg(" inquiry returning no device\n"); -+ id->qual_type = 0x7F; /* Not supported, no device */ -+ } -+ -+ bytes = send_cmd_data(data_token, sizeof(*id), iue); -+ -+ dma_free_coherent(iue->adapter->dev, sizeof(*id), id, data_token); -+ -+ if (bytes < 0) { -+ send_rsp(iue, SENSE_DEVICE_FAULT); -+ } else { -+ send_rsp(iue, SENSE_SUCCESS); -+ } -+ -+ free_iu(iue); -+} -+ -+/* -+ * Handle an I/O. Called by WRITE6, WRITE10, etc -+ */ -+static void process_rw(char *cmd, int rw, struct iu_entry *iue, long lba, -+ long len) -+{ -+ char *buffer; -+ struct bio *bio; -+ int bytes; -+ int num_biovec; -+ int cur_biovec; -+ long flags; -+ -+ dbg("%s %16.16lx[%d:%d:%d][%s] lba %ld len %ld reladr %d link %d\n", -+ cmd, -+ iue->iu->srp.cmd.lun, -+ GETBUS(iue->iu->srp.cmd.lun), -+ GETTARGET(iue->iu->srp.cmd.lun), -+ GETLUN(iue->iu->srp.cmd.lun), -+ iue->req.vd->b.device_name, -+ lba, -+ len / iue->req.vd->b.blksize, -+ iue->iu->srp.cmd.cdb[1] & 0x01, iue->req.linked); -+ -+ if (rw == WRITE) { -+ atomic_inc(&iue->adapter->write_processed); -+ } else if (rw == READ) { -+ atomic_inc(&iue->adapter->read_processed); -+ } else { -+ err("Major internal error...rw not read or write\n"); -+ send_rsp(iue, SENSE_DEVICE_FAULT); -+ -+ free_iu(iue); -+ return; -+ } -+ -+ if (len == 0) { -+ warn("Zero length I/O\n"); -+ send_rsp(iue, SENSE_INVALID_CMD); -+ -+ free_iu(iue); -+ return; -+ } -+ -+ /* Writing to a read-only device */ -+ if ((rw == WRITE) && (iue->req.vd->b.ro)) { -+ warn("WRITE to read-only device\n"); -+ send_rsp(iue, SENSE_WRITE_PROT); -+ -+ free_iu(iue); -+ return; -+ } -+ -+ get_data_buffer(&buffer, &iue->req.data_token, len, iue->adapter); -+ iue->req.data_buffer = buffer; -+ iue->req.data_len = len; -+ if (buffer == NULL) { -+ err("Not able to get a data buffer (%lu pages)\n", -+ len / PAGE_SIZE); -+ send_rsp(iue, SENSE_DEVICE_FAULT); -+ -+ free_iu(iue); -+ return; -+ } -+ -+ /* if reladr */ -+ if (iue->iu->srp.cmd.cdb[1] & 0x01) { -+ lba = lba + iue->req.vd->b.lastlba; -+ } -+ -+ /* If this command is linked, Keep this lba */ -+ if (iue->req.linked) { -+ iue->req.vd->b.lastlba = lba; -+ } else { -+ iue->req.vd->b.lastlba = 0; -+ } -+ -+ if (rw == WRITE) { -+ iue->req.write = 1; -+ /* Get the data */ -+ bytes = get_cmd_data(iue->req.data_token, len, iue); -+ if (bytes != len) { -+ err("Error transferring data\n"); -+ send_rsp(iue, SENSE_DEVICE_FAULT); -+ -+ free_iu(iue); -+ return; -+ } -+ } -+ -+ num_biovec = (len - 1) / PAGE_CACHE_SIZE + 1; -+ -+ bio = bio_alloc(GFP_ATOMIC, num_biovec); -+ if (!bio) { -+ /* Ouch. couldn't get a bio. Mark this I/O as -+ * in error, then decrement the outstanding bio. -+ * If there are still outstanding bio, they will send -+ * the error and free the IU. If there are none, we -+ * should do it here -+ */ -+ iue->req.ioerr = 1; -+ err("Not able to allocate a bio\n"); -+ send_rsp(iue, SENSE_DEVICE_FAULT); -+ free_iu(iue); -+ return; -+ } -+ -+ iue->aborted = 0; -+ spin_lock_irqsave(&iue->adapter->lock, flags); -+ list_add_tail(&iue->next, &iue->adapter->inflight); -+ spin_unlock_irqrestore(&iue->adapter->lock, flags); -+ -+ atomic_inc(&iue->adapter->bio_count); -+ bio->bi_size = len; -+ bio->bi_bdev = iue->req.vd->b.bdev; -+ bio->bi_sector = lba; -+ bio->bi_end_io = &ibmvscsis_end_io; -+ bio->bi_private = iue; -+ bio->bi_rw = (rw == WRITE) ? 1 : 0; -+ bio->bi_phys_segments = 1; -+ bio->bi_hw_segments = 1; -+ -+ /* This all assumes that the buffers we get are page-aligned */ -+ for (cur_biovec = 0; cur_biovec < num_biovec; cur_biovec++) { -+ long thislen; -+ -+ if (len > PAGE_CACHE_SIZE) { -+ thislen = PAGE_CACHE_SIZE; -+ } else { -+ thislen = len; -+ } -+ -+ bio->bi_io_vec[cur_biovec].bv_page = virt_to_page(buffer); -+ bio->bi_io_vec[cur_biovec].bv_len = thislen; -+ bio->bi_io_vec[cur_biovec].bv_offset = -+ (unsigned long)buffer & (PAGE_SIZE - 1); -+ bio->bi_vcnt++; -+ -+ len -= thislen; -+ buffer += thislen; -+ } -+ generic_make_request(bio); -+} -+ -+/* -+ * Process a READ6 -+ */ -+static void processRead6(struct iu_entry *iue) -+{ -+ long lba = (*((u32 *) (iue->iu->srp.cmd.cdb))) & 0x001FFFFF; -+ long len = iue->iu->srp.cmd.cdb[4]; -+ -+ /* Length of 0 indicates 256 */ -+ if (len == 0) { -+ len = 256; -+ } -+ -+ len = len * iue->req.vd->b.blksize; -+ -+ process_rw("Read6", READ, iue, lba, len); -+} -+ -+/* -+ * Process a READ10 -+ */ -+static void processRead10(struct iu_entry *iue) -+{ -+ long lba = *((u32 *) (iue->iu->srp.cmd.cdb + 2)); -+ long len = -+ *((u16 *) (iue->iu->srp.cmd.cdb + 7)) * iue->req.vd->b.blksize; -+ -+ process_rw("Read10", READ, iue, lba, len); -+} -+ -+/* -+ * Process a READ10 -+ */ -+static void processRead12(struct iu_entry *iue) -+{ -+ long lba = *((u32 *) (iue->iu->srp.cmd.cdb + 2)); -+ long len = -+ *((u32 *) (iue->iu->srp.cmd.cdb + 6)) * iue->req.vd->b.blksize; -+ -+ process_rw("Read12", READ, iue, lba, len); -+} -+ -+static void processWrite6(struct iu_entry *iue) -+{ -+ long lba = (*((u32 *) (iue->iu->srp.cmd.cdb))) & 0x001FFFFF; -+ long len = iue->iu->srp.cmd.cdb[4]; -+ -+ /* Length of 0 indicates 256 */ -+ if (len == 0) { -+ len = 256; -+ } -+ -+ len = len * iue->req.vd->b.blksize; -+ -+ process_rw("Write6", WRITE, iue, lba, len); -+} -+ -+static void processWrite10(struct iu_entry *iue) -+{ -+ long lba = *((u32 *) (iue->iu->srp.cmd.cdb + 2)); -+ long len = -+ *((u16 *) (iue->iu->srp.cmd.cdb + 7)) * iue->req.vd->b.blksize; -+ -+ process_rw("Write10", WRITE, iue, lba, len); -+} -+ -+static void processWrite12(struct iu_entry *iue) -+{ -+ long lba = *((u32 *) (iue->iu->srp.cmd.cdb + 2)); -+ long len = -+ *((u32 *) (iue->iu->srp.cmd.cdb + 6)) * iue->req.vd->b.blksize; -+ -+ process_rw("Write12", WRITE, iue, lba, len); -+} -+ -+/* -+ * Handle Read Capacity -+ */ -+static void processReadCapacity(struct iu_entry *iue) -+{ -+ struct ReadCapacityData { -+ u32 blocks; -+ u32 blocksize; -+ } *cap; -+ dma_addr_t data_token; -+ int bytes; -+ -+ cap = (struct ReadCapacityData *)dma_alloc_coherent(iue->adapter->dev, -+ sizeof(*cap), -+ &data_token, 0); -+ -+ /* return block size and last valid block */ -+ cap->blocksize = iue->req.vd->b.blksize; -+ cap->blocks = iue->req.vd->b.bdev->bd_inode->i_size -+ / iue->req.vd->b.blksize -+ - 1; -+ -+ info("Reporting capacity as %u block of size %u\n", cap->blocks, -+ cap->blocksize); -+ -+ bytes = send_cmd_data(data_token, sizeof(*cap), iue); -+ -+ dma_free_coherent(iue->adapter->dev, sizeof(*cap), cap, data_token); -+ -+ if (bytes != sizeof(*cap)) { -+ err("Error sending read capacity data. bytes %d, wanted %ld\n", -+ bytes, sizeof(*cap)); -+ } -+ -+ send_rsp(iue, SENSE_SUCCESS); -+ -+ free_iu(iue); -+} -+ -+/* -+ * Process Mode Sense -+ * TODO: I know scsiinfo asks for a bunch of mode pages not implemented here. -+ * Also, we need to act differently for virtual disk and virtual CD -+ */ -+#define MODE_SENSE_BUFFER_SIZE (512) -+static void processModeSense(struct iu_entry *iue) -+{ -+ dma_addr_t data_token; -+ int bytes; -+ -+ u8 *mode = (u8 *) dma_alloc_coherent(iue->adapter->dev, -+ MODE_SENSE_BUFFER_SIZE, -+ &data_token, 0); -+ /* which page */ -+ switch (iue->iu->srp.cmd.cdb[2]) { -+ case 0: -+ case 0x3f: -+ mode[1] = 0x00; /* Default medium */ -+ if (iue->req.vd->b.ro) { -+ mode[2] = 0x80; /* device specific */ -+ } else { -+ mode[2] = 0x00; /* device specific */ -+ } -+ /* note the DPOFUA bit is set to zero! */ -+ mode[3] = 0x08; /* block descriptor length */ -+ *((u32 *) & mode[4]) = iue->req.vd->b.bdev->bd_inode->i_size / -+ iue->req.vd->b.blksize; -+ *((u32 *) & mode[8]) = iue->req.vd->b.blksize; -+ bytes = mode[0] = 12; /* length */ -+ break; -+ -+ case 0x08: /* Cache page */ -+ /* length should be 4 */ -+ if (iue->iu->srp.cmd.cdb[4] != 4 -+ && iue->iu->srp.cmd.cdb[4] != 0x20) { -+ send_rsp(iue, SENSE_INVALID_CMD); -+ dma_free_coherent(iue->adapter->dev, -+ MODE_SENSE_BUFFER_SIZE, -+ mode, data_token); -+ free_iu(iue); -+ return; -+ } -+ -+ mode[1] = 0x00; /* Default medium */ -+ if (iue->req.vd->b.ro) { -+ mode[2] = 0x80; /* device specific */ -+ } else { -+ mode[2] = 0x00; /* device specific */ -+ } -+ /* note the DPOFUA bit is set to zero! */ -+ mode[3] = 0x08; /* block descriptor length */ -+ *((u32 *) & mode[4]) = iue->req.vd->b.bdev->bd_inode->i_size / -+ iue->req.vd->b.blksize; -+ *((u32 *) & mode[8]) = iue->req.vd->b.blksize; -+ -+ /* Cache page */ -+ mode[12] = 0x08; /* page */ -+ mode[13] = 0x12; /* page length */ -+ mode[14] = 0x01; /* no cache (0x04 for read/write cache) */ -+ -+ bytes = mode[0] = 12 + mode[13]; /* length */ -+ break; -+ default: -+ warn("Request for unknown mode page %d\n", -+ iue->iu->srp.cmd.cdb[2]); -+ send_rsp(iue, SENSE_INVALID_CMD); -+ dma_free_coherent(iue->adapter->dev, -+ MODE_SENSE_BUFFER_SIZE, mode, data_token); -+ free_iu(iue); -+ return; -+ } -+ -+ bytes = send_cmd_data(data_token, bytes, iue); -+ -+ dma_free_coherent(iue->adapter->dev, -+ MODE_SENSE_BUFFER_SIZE, mode, data_token); -+ -+ send_rsp(iue, SENSE_SUCCESS); -+ -+ free_iu(iue); -+ return; -+} -+ -+/* -+ * Report LUNS command. -+ */ -+static void processReportLUNs(struct iu_entry *iue) -+{ -+ int listsize = did_len(&iue->iu->srp.cmd); -+ dma_addr_t data_token; -+ int index = 2; /* Start after the two entries (length and LUN0) */ -+ int bus; -+ int target; -+ int bytes; -+ unsigned long flags; -+ -+ u64 *lunlist = (u64 *) dma_alloc_coherent(iue->adapter->dev, -+ listsize, -+ &data_token, 0); -+ -+ memset(lunlist, 0x00, listsize); -+ -+ /* work out list size in units of u64 */ -+ listsize = listsize / 8; -+ -+ if (listsize < 1) { -+ send_rsp(iue, SENSE_INVALID_CMD); -+ free_iu(iue); -+ } -+ -+ spin_lock_irqsave(&iue->adapter->lock, flags); -+ -+ /* send lunlist of size 1 when requesting lun is not all zeros */ -+ if (iue->iu->srp.cmd.lun != 0x0LL) { -+ *lunlist = ((u64) 1 * 8) << 32; -+ goto send_lunlist; -+ } -+ -+ /* return the total number of luns plus LUN0 in bytes */ -+ *lunlist = (((u64) ((iue->adapter->nvdevs + 1) * 8)) << 32); -+ -+ dbg("reporting %d luns\n", iue->adapter->nvdevs + 1); -+ /* loop through the bus */ -+ for (bus = 0; bus < BUS_PER_ADAPTER; bus++) { -+ /* If this bus exists */ -+ if (iue->adapter->vbus[bus]) { -+ /* loop through the targets */ -+ for (target = 0; target < TARGETS_PER_BUS; target++) { -+ /* If the target exists */ -+ if (iue->adapter->vbus[bus]->vdev[target]) { -+ if ((index < listsize) && -+ (!iue->adapter->vbus[bus]-> -+ vdev[target]->disabled)) { -+ lunlist[index++] = -+ iue->adapter->vbus[bus]-> -+ vdev[target]->lun; -+ dbg(" lun %16.16lx\n", -+ iue->adapter->vbus[bus]-> -+ vdev[target]->lun); -+ } -+ } -+ } -+ } -+ } -+ -+ send_lunlist: -+ spin_unlock_irqrestore(&iue->adapter->lock, flags); -+ -+ bytes = send_cmd_data(data_token, (index * 8), iue); -+ -+ dma_free_coherent(iue->adapter->dev, listsize * 8, lunlist, data_token); -+ -+ if (bytes != (index * 8)) { -+ err("Error sending report luns data. bytes %d, wanted %d\n", -+ bytes, index * 4); -+ send_rsp(iue, SENSE_ABORT); -+ } else { -+ send_rsp(iue, SENSE_SUCCESS); -+ } -+ -+ free_iu(iue); -+ return; -+} -+ -+/* -+ * Process an IU. -+ * -+ * Note that THIS routine is responsible for returning the IU from the pool -+ * The current assumption is that all the process routines called from here -+ * are, in turn, responsible for freeing the IU -+ */ -+static void process_cmd(struct iu_entry *iue) -+{ -+ union viosrp_iu *iu = iue->iu; -+ -+ iue->req.vd = find_device(iue); -+ -+ if ((iue->req.vd == NULL) && -+ (iu->srp.cmd.cdb[0] != REPORT_LUNS) && -+ (iu->srp.cmd.cdb[0] != INQUIRY)) { -+ dbg("Cmd %2.2x for unknown LUN %16.16lx\n", -+ iu->srp.cmd.cdb[0], iue->iu->srp.cmd.lun); -+ send_rsp(iue, SENSE_INVALID_ID); -+ free_iu(iue); -+ return; -+ } -+ -+ iue->req.linked = getlink(iue); -+ -+ switch (iu->srp.cmd.cdb[0]) { -+ case READ_6: -+ processRead6(iue); -+ break; -+ case READ_10: -+ processRead10(iue); -+ break; -+ case READ_12: -+ processRead12(iue); -+ break; -+ case WRITE_6: -+ processWrite6(iue); -+ break; -+ case WRITE_10: -+ processWrite10(iue); -+ break; -+ case WRITE_12: -+ processWrite12(iue); -+ break; -+ case REPORT_LUNS: -+ dbg("REPORT LUNS lun %16.16lx\n", iue->iu->srp.cmd.lun); -+ processReportLUNs(iue); -+ break; -+ case INQUIRY: -+ dbg("INQUIRY lun %16.16lx\n", iue->iu->srp.cmd.lun); -+ process_inquiry(iue); -+ break; -+ case READ_CAPACITY: -+ dbg("READ CAPACITY lun %16.16lx\n", iue->iu->srp.cmd.lun); -+ processReadCapacity(iue); -+ break; -+ case MODE_SENSE: -+ dbg("MODE SENSE lun %16.16lx\n", iue->iu->srp.cmd.lun); -+ processModeSense(iue); -+ break; -+ case TEST_UNIT_READY: -+ /* we already know the device exists */ -+ dbg("TEST UNIT READY lun %16.16lx\n", iue->iu->srp.cmd.lun); -+ send_rsp(iue, SENSE_SUCCESS); -+ free_iu(iue); -+ break; -+ case START_STOP: -+ /* just respond OK */ -+ dbg("START_STOP lun %16.16lx\n", iue->iu->srp.cmd.lun); -+ send_rsp(iue, SENSE_SUCCESS); -+ free_iu(iue); -+ break; -+ default: -+ warn("Unsupported SCSI Command 0x%2.2x\n", iu->srp.cmd.cdb[0]); -+ send_rsp(iue, SENSE_INVALID_CMD); -+ free_iu(iue); -+ } -+} -+ -+u16 send_adapter_info(struct iu_entry *iue, -+ dma_addr_t remote_buffer, u16 length) -+{ -+ dma_addr_t data_token; -+ struct mad_adapter_info_data *info = -+ (struct mad_adapter_info_data *)dma_alloc_coherent(iue->adapter-> -+ dev, -+ sizeof(*info), -+ &data_token, 0); -+ -+ dbg("in send_adapter_info\n "); -+ if ((info) && (!dma_mapping_error(data_token))) { -+ int rc; -+ memset(info, 0x00, sizeof(*info)); -+ -+ dbg("building adapter_info\n "); -+ strcpy(info->srp_version, "1.6a"); -+ strncpy(info->partition_name, partition_name, -+ sizeof(info->partition_name)); -+ info->partition_number = partition_number; -+ info->mad_version = 1; -+ info->os_type = 3; -+ -+ rc = h_copy_rdma(sizeof(*info), -+ iue->adapter->liobn, -+ data_token, -+ iue->adapter->riobn, -+ remote_buffer); -+ -+ dma_free_coherent(iue->adapter->dev, -+ sizeof(*info), info, data_token); -+ -+ if (rc != H_Success) { -+ err("Error sending adapter info rc %d\n",rc); -+ return 1; -+ } -+ } else { -+ dbg("bad dma_alloc_cohereint in adapter_info\n "); -+ return 1; -+ } -+ return 0; -+ -+} -+ -+/* ============================================================== -+ * SRP Processing Routines -+ * ============================================================== -+ */ -+/* -+ * Process an incoming SRP Login request -+ */ -+static void process_login(struct iu_entry *iue) -+{ -+ union viosrp_iu *iu = iue->iu; -+ u64 tag = iu->srp.generic.tag; -+ -+ /* TODO handle case that requested size is wrong and buffer format is wrong */ -+ memset(iu, 0x00, sizeof(struct srp_login_rsp)); -+ iu->srp.login_rsp.type = SRP_LOGIN_RSP_TYPE; -+ iu->srp.login_rsp.request_limit_delta = iue->adapter->pool.size; -+ iu->srp.login_rsp.tag = tag; -+ iu->srp.login_rsp.max_initiator_to_target_iulen = sizeof(union srp_iu); -+ iu->srp.login_rsp.max_target_to_initiator_iulen = sizeof(union srp_iu); -+ iu->srp.login_rsp.supported_buffer_formats = 0x0006; /* direct and indirect */ -+ iu->srp.login_rsp.multi_channel_result = 0x00; /* TODO fix if we were already logged in */ -+ -+ send_srp(iue, sizeof(iu->srp.login_rsp)); -+} -+ -+/* -+ * Send an SRP response that includes sense data -+ */ -+static long send_rsp(struct iu_entry *iue, int status) -+{ -+ u8 *sense = iue->iu->srp.rsp.sense_and_response_data; -+ u64 tag = iue->iu->srp.generic.tag; -+ union viosrp_iu *iu = iue->iu; -+ -+ if (status != SENSE_SUCCESS) { -+ atomic_inc(&iue->adapter->errors); -+ } -+ -+ /* If the linked bit is on and status is good */ -+ if ((iue->req.linked) && (status == SENSE_SUCCESS)) { -+ status = SENSE_INTERMEDIATE; -+ } -+ -+ memset(iu, 0x00, sizeof(struct srp_rsp)); -+ iu->srp.rsp.type = SRP_RSP_TYPE; -+ iu->srp.rsp.request_limit_delta = 1; -+ iu->srp.rsp.tag = tag; -+ -+ iu->srp.rsp.diunder = iue->req.diunder; -+ iu->srp.rsp.diover = iue->req.diover; -+ iu->srp.rsp.dounder = iue->req.dounder; -+ iu->srp.rsp.doover = iue->req.doover; -+ -+ iu->srp.rsp.data_in_residual_count = iue->req.data_in_residual_count; -+ iu->srp.rsp.data_out_residual_count = iue->req.data_out_residual_count; -+ -+ iu->srp.rsp.rspvalid = 0; -+ -+ iu->srp.rsp.response_data_list_length = 0; -+ -+ if (status) { -+ iu->srp.rsp.status = SAM_STAT_CHECK_CONDITION; -+ iu->srp.rsp.snsvalid = 1; -+ iu->srp.rsp.sense_data_list_length = 18; /* TODO be smarter about this */ -+ -+ /* Valid bit and 'current errors' */ -+ sense[0] = (0x1 << 7 | 0x70); -+ -+ /* Sense key */ -+ sense[2] = ibmvscsis_sense_data[status][0]; -+ -+ /* Additional sense length */ -+ sense[7] = 0xa; /* 10 bytes */ -+ -+ /* Additional sense code */ -+ sense[12] = ibmvscsis_sense_data[status][1]; -+ -+ /* Additional sense code qualifier */ -+ sense[13] = ibmvscsis_sense_data[status][2]; -+ } else { -+ iu->srp.rsp.status = 0; -+ } -+ -+ send_srp(iue, sizeof(iu->srp.rsp)); -+ -+ return 0; -+} -+ -+static void process_device_reset(struct iu_entry *iue) -+{ -+ struct iu_entry *tmp_iue; -+ unsigned long flags; -+ union viosrp_iu *iu = iue->iu; -+ -+ info("device reset for lun %16.16lx\n", iu->srp.tsk_mgmt.lun); -+ -+ spin_lock_irqsave(&iue->adapter->lock, flags); -+ -+ list_for_each_entry(tmp_iue, &iue->adapter->inflight, next) { -+ if (iu->srp.tsk_mgmt.lun == tmp_iue->iu->srp.cmd.lun) { -+ { -+ tmp_iue->aborted = 1; -+ } -+ } -+ -+ } -+ -+ spin_unlock_irqrestore(&iue->adapter->lock, flags); -+ send_rsp(iue, SENSE_SUCCESS); -+} -+ -+static void process_abort(struct iu_entry *iue) -+{ -+ struct iu_entry *tmp_iue; -+ unsigned long flags; -+ union viosrp_iu *iu = iue->iu; -+ -+ info("aborting task with tag %16.16lx, lun %16.16lx\n", -+ iu->srp.tsk_mgmt.managed_task_tag, iu->srp.tsk_mgmt.lun); -+ -+ spin_lock_irqsave(&iue->adapter->lock, flags); -+ -+ list_for_each_entry(tmp_iue, &iue->adapter->inflight, next) { -+ if (tmp_iue->iu->srp.cmd.tag == -+ iu->srp.tsk_mgmt.managed_task_tag) { -+ { -+ tmp_iue->aborted = 1; -+ info("abort successful\n"); -+ spin_unlock_irqrestore(&iue->adapter->lock, -+ flags); -+ send_rsp(iue, SENSE_SUCCESS); -+ return; -+ } -+ } -+ } -+ info("unable to abort cmd\n"); -+ -+ spin_unlock_irqrestore(&iue->adapter->lock, flags); -+ send_rsp(iue, SENSE_INVALID_ID); -+} -+ -+static void process_tsk_mgmt(struct iu_entry *iue) -+{ -+ union viosrp_iu *iu = iue->iu; -+ -+ if (iu->srp.tsk_mgmt.task_mgmt_flags == 0x01) { -+ process_abort(iue); -+ } else if (iu->srp.tsk_mgmt.task_mgmt_flags == 0x08) { -+ process_device_reset(iue); -+ } else { -+ send_rsp(iue, SENSE_INVALID_CMD); -+ } -+} -+ -+static void process_iu(struct viosrp_crq *crq, struct server_adapter *adapter) -+{ -+ struct iu_entry *iue = get_iu(adapter); -+ union viosrp_iu *iu; -+ int queued = 0; -+ long rc; -+ -+ if (iue == NULL) { -+ /* TODO Yikes! */ -+ warn("Error getting IU from pool, other side exceeded limit\n"); -+ return; -+ } -+ -+ iue->req.remote_token = crq->IU_data_ptr; -+ -+ rc = h_copy_rdma(crq->IU_length, -+ iue->adapter->riobn, -+ iue->req.remote_token, adapter->liobn, iue->iu_token); -+ -+ iu = iue->iu; -+ -+ if (rc) { -+ err("Error %ld transferring data to client\n", rc); -+ } -+ -+ if (crq->format == VIOSRP_MAD_FORMAT) { -+ switch (iu->mad.empty_iu.common.type) { -+ case VIOSRP_EMPTY_IU_TYPE: -+ warn("Unsupported EMPTY MAD IU\n"); -+ break; -+ case VIOSRP_ERROR_LOG_TYPE: -+ warn("Unsupported ERROR LOG MAD IU\n"); -+ iu->mad.error_log.common.status = 1; -+ send_srp(iue, sizeof(iu->mad.error_log)); -+ break; -+ case VIOSRP_ADAPTER_INFO_TYPE: -+ iu->mad.adapter_info.common.status = -+ send_adapter_info(iue, -+ iu->mad.adapter_info.buffer, -+ iu->mad.adapter_info.common. -+ length); -+ -+ send_srp(iue, sizeof(iu->mad.adapter_info)); -+ break; -+ case VIOSRP_HOST_CONFIG_TYPE: -+ iu->mad.host_config.common.status = 1; -+ send_srp(iue, sizeof(iu->mad.host_config)); -+ break; -+ default: -+ warn("Unsupported MAD type %d\n", iu->srp.generic.type); -+ } -+ } else { -+ switch (iu->srp.generic.type) { -+ case SRP_LOGIN_REQ_TYPE: -+ dbg("SRP LOGIN\n"); -+ process_login(iue); -+ break; -+ case SRP_LOGIN_RSP_TYPE: -+ warn("Unsupported LOGIN_RSP SRP IU\n"); -+ break; -+ case SRP_I_LOGOUT_TYPE: -+ warn("Unsupported I_LOGOUT SRP IU\n"); -+ break; -+ case SRP_T_LOGOUT_TYPE: -+ warn("Unsupported T_LOGOUT SRP IU\n"); -+ break; -+ case SRP_TSK_MGMT_TYPE: -+ process_tsk_mgmt(iue); -+ break; -+ case SRP_CMD_TYPE: -+ process_cmd(iue); -+ queued = 1; -+ break; -+ case SRP_RSP_TYPE: -+ warn("Unsupported RSP SRP IU\n"); -+ break; -+ case SRP_CRED_REQ_TYPE: -+ warn("Unsupported CRED_REQ SRP IU\n"); -+ break; -+ case SRP_CRED_RSP_TYPE: -+ warn("Unsupported CRED_RSP SRP IU\n"); -+ break; -+ case SRP_AER_REQ_TYPE: -+ warn("Unsupported AER_REQ SRP IU\n"); -+ break; -+ case SRP_AER_RSP_TYPE: -+ warn("Unsupported AER_RSP SRP IU\n"); -+ break; -+ default: -+ warn("Unsupported SRP type %d\n", iu->srp.generic.type); -+ } -+ } -+ -+ /* -+ * If no one has queued the IU for further work, free it -+ * Note that this is kind of an ugly design based on setting -+ * this variable up above in cases where the routine we call -+ * is responsible for freeing the IU -+ */ -+ if (!queued) -+ free_iu(iue); -+} -+ -+/* ============================================================== -+ * CRQ Processing Routines -+ * ============================================================== -+ */ -+ -+/* -+ * Handle a CRQ event -+ */ -+static void handle_crq(struct viosrp_crq *crq, struct server_adapter *adapter) -+{ -+ switch (crq->valid) { -+ case 0xC0: /* initialization */ -+ switch (crq->format) { -+ case 0x01: -+ info("Client just initialized\n"); -+ plpar_hcall_norets(H_SEND_CRQ, -+ adapter->dma_dev->unit_address, -+ 0xC002000000000000, 0); -+ break; -+ case 0x02: -+ info("Client initialization complete\n"); -+ break; -+ default: -+ err("Client error: Unknwn msg format %d\n", -+ crq->format); -+ } -+ return; -+ case 0xFF: /* transport event */ -+ info("Client closed\n"); -+ return; -+ case 0x80: /* real payload */ -+ { -+ switch (crq->format) { -+ case VIOSRP_SRP_FORMAT: -+ case VIOSRP_MAD_FORMAT: -+ process_iu(crq, adapter); -+ break; -+ case VIOSRP_OS400_FORMAT: -+ warn("Unsupported OS400 format CRQ\n"); -+ break; -+ -+ case VIOSRP_AIX_FORMAT: -+ warn("Unsupported AIX format CRQ\n"); -+ break; -+ -+ case VIOSRP_LINUX_FORMAT: -+ warn("Unsupported LINUX format CRQ\n"); -+ break; -+ -+ case VIOSRP_INLINE_FORMAT: -+ warn("Unsupported _INLINE_ format CRQ\n"); -+ break; -+ -+ default: -+ err("Client error: Unsupported msg format %d\n", -+ crq->format); -+ } -+ } -+ break; -+ default: -+ err("Client error: unknown message type 0x%02x!?\n", -+ crq->valid); -+ return; -+ } -+ -+} -+ -+/* -+ * Task to handle CRQs and completions -+ */ -+static void crq_task(void *data) -+{ -+ struct server_adapter *adapter = (struct server_adapter *)data; -+ struct viosrp_crq *crq; -+ long rc; -+ int done = 0; -+ -+ while (!done) { -+ -+ /* Loop through and process CRQs */ -+ while ((crq = crq_queue_next_crq(&adapter->queue)) != NULL) { -+ atomic_inc(&adapter->crq_processed); -+ handle_crq(crq, adapter); -+ crq->valid = 0x00; -+ } -+ -+ rc = h_vio_signal(adapter->dma_dev->unit_address, 1); -+ if (rc != 0) { -+ err("Error %ld enabling interrupts!!!\n", rc); -+ } -+ if ((crq = crq_queue_next_crq(&adapter->queue)) != NULL) { -+ rc = h_vio_signal(adapter->dma_dev->unit_address, 0); -+ if (rc != 0) { -+ err("Error %ld enabling interrupts!!!\n", rc); -+ } -+ handle_crq(crq, adapter); -+ crq->valid = 0x00; -+ } else { -+ done = 1; -+ } -+ } -+} -+ -+/* -+ * Handle the interrupt that occurs when something is placed on our CRQ -+ */ -+static irqreturn_t handle_interrupt(int irq, void *dev_instance, -+ struct pt_regs *regs) -+{ -+ struct server_adapter *adapter = (struct server_adapter *)dev_instance; -+ long rc; -+ -+ rc = h_vio_signal(adapter->dma_dev->unit_address, 0); -+ if (rc != 0) { -+ err(" Error %ld disabling interrupts!!!\n", rc); -+ } -+ -+ atomic_inc(&adapter->interrupts); -+ -+ kblockd_schedule_work(&adapter->crq_task); -+ -+ return IRQ_HANDLED; -+} -+ -+/* -+ * Initialize our CRQ -+ * return zero on success, non-zero on failure -+ */ -+static int initialize_crq_queue(struct crq_queue *queue, -+ struct server_adapter *adapter) -+{ -+ int rc; -+ -+ queue->msgs = (struct viosrp_crq *)get_zeroed_page(GFP_KERNEL); -+ if (!queue->msgs) -+ goto malloc_failed; -+ queue->size = PAGE_SIZE / sizeof(*queue->msgs); -+ -+ queue->msg_token = dma_map_single(adapter->dev, queue->msgs, -+ queue->size * sizeof(*queue->msgs), -+ DMA_BIDIRECTIONAL); -+ -+ if (dma_mapping_error(queue->msg_token)) -+ goto map_failed; -+ -+ rc = plpar_hcall_norets(H_REG_CRQ, adapter->dma_dev->unit_address, -+ queue->msg_token, PAGE_SIZE); -+ -+ if ((rc != 0) && (rc != 2)) { -+ err("Error 0x%x opening virtual adapter\n", rc); -+ goto reg_crq_failed; -+ } -+ -+ if (request_irq -+ (adapter->dma_dev->irq, &handle_interrupt, SA_INTERRUPT, -+ "ibmvscsis", adapter) != 0) -+ goto req_irq_failed; -+ -+ rc = h_vio_signal(adapter->dma_dev->unit_address, 1); -+ if (rc != 0) { -+ err("Error %d enabling interrupts!!!\n", rc); -+ goto req_irq_failed; -+ } -+ -+ plpar_hcall_norets(H_SEND_CRQ, adapter->dma_dev->unit_address, -+ 0xC001000000000000, 0); -+ -+ queue->cur = 0; -+ queue->lock = SPIN_LOCK_UNLOCKED; -+ -+ return 0; -+ -+ req_irq_failed: -+ do { -+ rc = plpar_hcall_norets(H_FREE_CRQ, adapter->dma_dev->unit_address); -+ } while ((rc == H_Busy) || (H_isLongBusy(rc))); -+ -+ reg_crq_failed: -+ dma_unmap_single(adapter->dev, queue->msg_token, -+ queue->size * sizeof(*queue->msgs), DMA_BIDIRECTIONAL); -+ map_failed: -+ free_page((unsigned long)queue->msgs); -+ malloc_failed: -+ return -1; -+} -+ -+/* -+ * Release the CRQ -+ */ -+static void release_crq_queue(struct crq_queue *queue, -+ struct server_adapter *adapter) -+{ -+ int rc; -+ -+ info("releasing adapter\n"); -+ free_irq(adapter->dma_dev->irq, adapter); -+ do { -+ rc = plpar_hcall_norets(H_FREE_CRQ, adapter->dma_dev->unit_address); -+ } while ((rc == H_Busy) || (H_isLongBusy(rc))); -+ dma_unmap_single(adapter->dev, queue->msg_token, -+ queue->size * sizeof(*queue->msgs), DMA_BIDIRECTIONAL); -+ free_page((unsigned long)queue->msgs); -+} -+ -+/* ============================================================== -+ * Module Management -+ * ============================================================== -+ */ -+/* -+ * Add a block device as a SCSI LUN -+ */ -+static int activate_block_device(struct vdev *vdev) -+{ -+ struct block_device *bdev; -+ char *name = vdev->b.device_name; -+ int ro = vdev->b.ro; -+ -+ bdev = open_bdev_excl(name, ro, activate_block_device); -+ if (IS_ERR(bdev)) -+ return PTR_ERR(bdev);; -+ -+ vdev->b.bdev = bdev; -+ vdev->disabled = 0; -+ -+ info("Activating block device %s as %sLUN 0x%lx\n", -+ name, ro ? "read only " : "", vdev->lun); -+ -+ return 0; -+} -+ -+static void deactivate_block_device(struct vdev *vdev) -+{ -+ info("Deactivating block device, LUN 0x%lx\n", vdev->lun); -+ -+ /* Wait while any users of this device finish. Note there should -+ * be no new users, since we have marked this disabled -+ * -+ * We just poll here, since we are blocking write -+ */ -+ while (atomic_read(&vdev->refcount)) { -+ schedule_timeout(HZ / 4); /* 1/4 second */ -+ } -+ -+ vdev->disabled = 1; -+ close_bdev_excl(vdev->b.bdev); -+} -+ -+ -+#define ATTR(_type, _name, _mode) \ -+struct attribute vscsi_##_type##_##_name##_attr = { \ -+.name = __stringify(_name), .mode = _mode, .owner = THIS_MODULE \ -+}; -+ -+static struct kobj_type ktype_vscsi_target; -+static struct kobj_type ktype_vscsi_bus; -+static struct kobj_type ktype_vscsi_stats; -+ -+static void set_num_targets(struct vbus* vbus, long value) -+{ -+ struct device *dev = -+ container_of(vbus->kobj.parent, struct device , kobj); -+ struct server_adapter *adapter = (struct server_adapter *)to_vio_dev(dev)->driver_data; -+ int cur_num_targets = atomic_read(&vbus->num_targets); -+ unsigned long flags; -+ -+ spin_lock_irqsave(&adapter->lock, flags); -+ -+ if (cur_num_targets < value) { //growing -+ int i; -+ for (i = cur_num_targets; i < value; i++) { -+ vbus->vdev[i] = (struct vdev *) -+ kmalloc(sizeof(struct vdev), GFP_KERNEL); -+ if (!vbus->vdev[i]) { -+ spin_unlock_irqrestore(&adapter->lock, flags); -+ err("Couldn't allocate target memory %d\n", i); -+ return; -+ } -+ memset(vbus->vdev[i], 0x00, sizeof(struct vdev)); -+ -+ vbus->vdev[i]->lun = make_lun(vbus->bus_num, i, 0); -+ vbus->vdev[i]->b.blksize = 512; -+ vbus->vdev[i]->disabled = 1; -+ -+ vbus->vdev[i]->kobj.parent = &vbus->kobj; -+ sprintf(vbus->vdev[i]->kobj.name, "target%d", i); -+ vbus->vdev[i]->kobj.ktype = &ktype_vscsi_target; -+ kobject_register(&vbus->vdev[i]->kobj); -+ adapter->nvdevs++; -+ atomic_inc(&vbus->num_targets); -+ } -+ } else { //shrinking -+ int i; -+ for (i = cur_num_targets - 1; i >= value; i--) -+ { -+ if (!vbus->vdev[i]->disabled) { -+ spin_unlock_irqrestore(&adapter->lock, flags); -+ err("Can't remove active target %d\n", i); -+ return; -+ } -+ -+ kobject_unregister(&vbus->vdev[i]->kobj); -+ -+ kfree(vbus->vdev[i]); -+ -+ adapter->nvdevs--; -+ atomic_dec(&vbus->num_targets); -+ } -+ } -+ spin_unlock_irqrestore(&adapter->lock, flags); -+} -+ -+static void set_num_buses(struct device *dev, long value) -+{ -+ struct server_adapter *adapter = (struct server_adapter *)to_vio_dev(dev)->driver_data; -+ int cur_num_buses = atomic_read(&adapter->num_buses); -+ unsigned long flags= 0L; -+ -+ -+ if (cur_num_buses < value) { // growing -+ int i; -+ for (i = cur_num_buses; i < value; i++) { -+ adapter->vbus[i] = (struct vbus *) -+ kmalloc(sizeof(struct vbus), GFP_KERNEL); -+ if (!adapter->vbus[i]) { -+ spin_unlock_irqrestore(&adapter->lock, flags); -+ err("Couldn't allocate bus %d memory\n", i); -+ return; -+ } -+ memset(adapter->vbus[i], 0x00, sizeof(struct vbus)); -+ -+ spin_lock_irqsave(&adapter->lock, flags); -+ -+ adapter->vbus[i]->bus_num = i; -+ -+ adapter->vbus[i]->kobj.parent = &dev->kobj; -+ sprintf(adapter->vbus[i]->kobj.name, "bus%d", i); -+ adapter->vbus[i]->kobj.ktype = &ktype_vscsi_bus; -+ kobject_register(&adapter->vbus[i]->kobj); -+ -+ atomic_inc(&adapter->num_buses); -+ spin_unlock_irqrestore(&adapter->lock, flags); -+ -+ set_num_targets(adapter->vbus[i], 1); -+ } -+ -+ } else if (cur_num_buses > value) { //shrinking -+ int i, j, active_target; -+ for (i = cur_num_buses - 1; i >= value; i--) { -+ active_target = -1; -+ for (j = 0; j < TARGETS_PER_BUS; j++) { -+ if (adapter->vbus[i]->vdev[j] && -+ !adapter->vbus[i]->vdev[j]->disabled) { -+ active_target = j; -+ break; -+ } -+ } -+ if (active_target != -1) { -+ err("Can't remove bus%d, target%d active\n", -+ i, active_target); -+ return ; -+ } -+ -+ set_num_targets(adapter->vbus[i], 0); -+ -+ spin_lock_irqsave(&adapter->lock, flags); -+ atomic_dec(&adapter->num_buses); -+ kobject_unregister(&adapter->vbus[i]->kobj); -+ kfree(adapter->vbus[i]); -+ adapter->vbus[i] = NULL; -+ spin_unlock_irqrestore(&adapter->lock, flags); -+ } -+ } -+} -+ -+ -+/* Target sysfs stuff */ -+static ATTR(target, type, 0644); -+static ATTR(target, device, 0644); -+static ATTR(target, active, 0644); -+static ATTR(target, ro, 0644); -+ -+static ssize_t vscsi_target_show(struct kobject * kobj, struct attribute * attr, char * buf) -+{ -+ struct vdev *vdev = container_of(kobj, struct vdev, kobj); -+ struct device *dev = container_of(kobj->parent->parent, struct device, kobj); -+ struct server_adapter *adapter = (struct server_adapter *)to_vio_dev(dev)->driver_data; -+ unsigned long flags; -+ ssize_t returned= (ssize_t)0; -+ -+ spin_lock_irqsave(&adapter->lock, flags); -+ -+ if (attr == &vscsi_target_type_attr) -+ returned = sprintf(buf, "%c\n", vdev->type); -+ else if (attr == &vscsi_target_device_attr) -+ returned = sprintf(buf, "%s\n", vdev->b.device_name); -+ else if (attr == &vscsi_target_active_attr) -+ returned = sprintf(buf, "%d\n", !vdev->disabled); -+ else if (attr == &vscsi_target_ro_attr) -+ returned = sprintf(buf, "%d\n", vdev->b.ro); -+ else { -+ spin_unlock_irqrestore(&adapter->lock, flags); -+ BUG(); -+ } -+ -+ spin_unlock_irqrestore(&adapter->lock, flags); -+ -+ return returned; -+} -+ -+static ssize_t vscsi_target_store(struct kobject * kobj, struct attribute * attr, const char * buf, size_t count) -+{ -+ struct vdev *vdev = container_of(kobj, struct vdev, kobj); -+ struct device *dev = container_of(kobj->parent->parent, struct device, kobj); -+ struct server_adapter *adapter = (struct server_adapter *)to_vio_dev(dev)->driver_data; -+ long flags; -+ long value = simple_strtol(buf, NULL, 10); -+ -+ if (attr != &vscsi_target_active_attr && !vdev->disabled) { -+ err("Error: Can't modify properties while target is active.\n"); -+ return -EPERM; -+ } -+ -+ if (attr == &vscsi_target_type_attr) { -+ if (buf[0] == 'B' || buf[0] == 'b') -+ vdev->type = 'B'; -+ else if (buf[0] == 'S' || buf[0] == 's') { -+ // TODO -+ err ("SCSI mode not supported yet\n"); -+ return -EINVAL; -+ } else -+ return -EINVAL; -+ } else if (attr == &vscsi_target_device_attr) { -+ int i; -+ spin_lock_irqsave(&adapter->lock, flags); -+ i = strlcpy(vdev->b.device_name, buf, TARGET_MAX_NAME_LEN); -+ for (; i >= 0; i--) -+ if (vdev->b.device_name[i] == '\n') -+ vdev->b.device_name[i] = '\0'; -+ spin_unlock_irqrestore(&adapter->lock, flags); -+ } else if (attr == &vscsi_target_active_attr) { -+ if (value) { -+ int rc; -+ if (!vdev->disabled) { -+ warn("Warning: Target was already active\n"); -+ return -EINVAL; -+ } -+ if (vdev->type == '\0') { -+ err("Error: Type not specified\n"); -+ return -EPERM; -+ } -+ rc = activate_block_device(vdev); -+ if (rc) { -+ err("Error opening block device=%d\n", rc); -+ return rc; -+ } -+ } else { -+ if (!vdev->disabled) -+ deactivate_block_device(vdev); -+ } -+ } else if (attr == &vscsi_target_ro_attr) -+ vdev->b.ro = value > 0 ? 1 : 0; -+ else -+ BUG(); -+ -+ return count; -+} -+ -+static struct attribute * vscsi_target_attrs[] = { -+ &vscsi_target_type_attr, -+ &vscsi_target_device_attr, -+ &vscsi_target_active_attr, -+ &vscsi_target_ro_attr, -+ NULL, -+}; -+ -+static struct sysfs_ops vscsi_target_ops = { -+ .show = vscsi_target_show, -+ .store = vscsi_target_store, -+}; -+ -+static struct kobj_type ktype_vscsi_target = { -+ .release = NULL, -+ .sysfs_ops = &vscsi_target_ops, -+ .default_attrs = vscsi_target_attrs, -+}; -+ -+ -+ -+/* Bus sysfs stuff */ -+static ssize_t vscsi_bus_show(struct kobject * kobj, struct attribute * attr, char * buf) -+{ -+ struct vbus *vbus = container_of(kobj, struct vbus, kobj); -+ return sprintf(buf, "%d\n", atomic_read(&vbus->num_targets)); -+} -+ -+static ssize_t vscsi_bus_store(struct kobject * kobj, struct attribute * attr, -+const char * buf, size_t count) -+{ -+ struct vbus *vbus = container_of(kobj, struct vbus, kobj); -+ long value = simple_strtol(buf, NULL, 10); -+ -+ if (value < 0 || value > TARGETS_PER_BUS) -+ return -EINVAL; -+ -+ set_num_targets(vbus, value); -+ -+ return count; -+} -+ -+ -+static ATTR(bus, num_targets, 0644); -+ -+static struct attribute * vscsi_bus_attrs[] = { -+ &vscsi_bus_num_targets_attr, -+ NULL, -+}; -+ -+static struct sysfs_ops vscsi_bus_ops = { -+ .show = vscsi_bus_show, -+ .store = vscsi_bus_store, -+}; -+ -+static struct kobj_type ktype_vscsi_bus = { -+ .release = NULL, -+ .sysfs_ops = &vscsi_bus_ops, -+ .default_attrs = vscsi_bus_attrs, -+}; -+ -+ -+/* Device attributes */ -+static ssize_t vscsi_dev_bus_show(struct device * dev, char * buf) -+{ -+ struct server_adapter *adapter = (struct server_adapter *)to_vio_dev(dev)->driver_data; -+ -+ return sprintf(buf, "%d\n", atomic_read(&adapter->num_buses)); -+} -+ -+static ssize_t vscsi_dev_bus_store(struct device * dev, const char * buf, size_t count) -+{ -+ long value = simple_strtol(buf, NULL, 10); -+ -+ if (value < 0 || value > BUS_PER_ADAPTER) -+ return -EINVAL; -+ -+ set_num_buses(dev, value); -+ return count; -+} -+ -+static DEVICE_ATTR(num_buses, 0644, vscsi_dev_bus_show, vscsi_dev_bus_store); -+ -+ -+/* Stats kobj stuff */ -+ -+static ATTR(stats, interrupts, 0444); -+static ATTR(stats, read_ops, 0444); -+static ATTR(stats, write_ops, 0444); -+static ATTR(stats, crq_msgs, 0444); -+static ATTR(stats, iu_allocs, 0444); -+static ATTR(stats, bio_allocs, 0444); -+static ATTR(stats, buf_allocs, 0444); -+static ATTR(stats, errors, 0444); -+ -+static struct attribute * vscsi_stats_attrs[] = { -+ &vscsi_stats_interrupts_attr, -+ &vscsi_stats_read_ops_attr, -+ &vscsi_stats_write_ops_attr, -+ &vscsi_stats_crq_msgs_attr, -+ &vscsi_stats_iu_allocs_attr, -+ &vscsi_stats_bio_allocs_attr, -+ &vscsi_stats_buf_allocs_attr, -+ &vscsi_stats_errors_attr, -+ NULL, -+}; -+ -+ -+static ssize_t vscsi_stats_show(struct kobject * kobj, struct attribute * attr, char * buf) -+{ -+ struct server_adapter *adapter= container_of(kobj, struct server_adapter, stats_kobj); -+ if (attr == &vscsi_stats_interrupts_attr) -+ return sprintf(buf, "%d\n", -+ atomic_read(&adapter->interrupts)); -+ if (attr == &vscsi_stats_read_ops_attr) -+ return sprintf(buf, "%d\n", -+ atomic_read(&adapter->read_processed)); -+ if (attr == &vscsi_stats_write_ops_attr) -+ return sprintf(buf, "%d\n", -+ atomic_read(&adapter->write_processed)); -+ if (attr == &vscsi_stats_crq_msgs_attr) -+ return sprintf(buf, "%d\n", -+ atomic_read(&adapter->crq_processed)); -+ if (attr == &vscsi_stats_iu_allocs_attr) -+ return sprintf(buf, "%d\n", -+ atomic_read(&adapter->iu_count)); -+ if (attr == &vscsi_stats_bio_allocs_attr) -+ return sprintf(buf, "%d\n", -+ atomic_read(&adapter->bio_count)); -+ if (attr == &vscsi_stats_buf_allocs_attr) -+ return sprintf(buf, "%d\n", -+ atomic_read(&adapter->buffers_allocated)); -+ if (attr == &vscsi_stats_errors_attr) -+ return sprintf(buf, "%d\n", -+ atomic_read(&adapter->errors)); -+ -+ BUG(); -+ return 0; -+} -+ -+static struct sysfs_ops vscsi_stats_ops = { -+ .show = vscsi_stats_show, -+ .store = NULL, -+}; -+ -+static struct kobj_type ktype_vscsi_stats = { -+ .release = NULL, -+ .sysfs_ops = &vscsi_stats_ops, -+ .default_attrs = vscsi_stats_attrs, -+}; -+ -+ -+static int ibmvscsis_probe(struct vio_dev *dev, const struct vio_device_id *id) -+{ -+ struct server_adapter *adapter; -+ int rc; -+ unsigned int *dma_window; -+ unsigned int dma_window_property_size; -+ -+ adapter = kmalloc(sizeof(*adapter), GFP_KERNEL); -+ if (!adapter) { -+ err("couldn't allocate adapter memory\n"); -+ return -1; -+ } -+ memset(adapter, 0x00, sizeof(*adapter)); -+ adapter->dma_dev = dev; -+ adapter->dev = &dev->dev; -+ dev->driver_data = adapter; -+ sprintf(adapter->name, "%x", dev->unit_address); -+ adapter->lock = SPIN_LOCK_UNLOCKED; -+ -+ dma_window = -+ (unsigned int *)vio_get_attribute(dev, "ibm,my-dma-window", -+ &dma_window_property_size); -+ if (!dma_window) { -+ warn("Couldn't find ibm,my-dma-window property\n"); -+ } -+ -+ adapter->liobn = dma_window[0]; -+ /* RPA docs say that #address-cells is always 1 for virtual -+ devices, but some older boxes' OF returns 2. This should -+ be removed by GA, unless there is legacy OFs that still -+ have 2 or 3 for #address-cells */ -+ /*adapter->riobn = dma_window[2+vio_num_address_cells]; */ -+ -+ /* This is just an ugly kludge. Remove as soon as the OF for all -+ machines actually follow the spec and encodes the offset field -+ as phys-encode (that is, #address-cells wide) */ -+ if (dma_window_property_size == 24) { -+ adapter->riobn = dma_window[3]; -+ } else if (dma_window_property_size == 40) { -+ adapter->riobn = dma_window[5]; -+ } else { -+ warn("Invalid size of ibm,my-dma-window=%i\n", -+ dma_window_property_size); -+ } -+ -+ INIT_WORK(&adapter->crq_task, crq_task, adapter); -+ -+ tasklet_init(&adapter->endio_tasklet, -+ endio_task, (unsigned long)adapter); -+ -+ INIT_LIST_HEAD(&adapter->inflight); -+ -+ /* Initialize the buffer cache */ -+ init_data_buffer(adapter); -+ -+ /* Arbitrarily support 16 IUs right now */ -+ rc = initialize_iu_pool(adapter, 16); -+ if (rc) { -+ kfree(adapter); -+ return rc; -+ } -+ -+ rc = initialize_crq_queue(&adapter->queue, adapter); -+ if (rc != 0) { -+ kfree(adapter); -+ return rc; -+ } -+ -+ set_num_buses(&dev->dev, 1); -+ device_create_file(&dev->dev, &dev_attr_num_buses); -+ -+ adapter->stats_kobj.parent = &dev->dev.kobj; -+ strcpy(adapter->stats_kobj.name, "stats"); -+ adapter->stats_kobj.ktype = & ktype_vscsi_stats; -+ kobject_register(&adapter->stats_kobj); -+ -+ return 0; -+} -+ -+static int ibmvscsis_remove(struct vio_dev *dev) -+{ -+ int bus; -+ int target; -+ unsigned long flags; -+ struct server_adapter *adapter = -+ (struct server_adapter *)dev->driver_data; -+ -+ spin_lock_irqsave(&adapter->lock, flags); -+ -+ /* -+ * Loop through the bus -+ */ -+ for (bus = 0; bus < BUS_PER_ADAPTER; bus++) { -+ /* If this bus exists */ -+ if (adapter->vbus[bus]) { -+ /* loop through the targets */ -+ for (target = 0; target < TARGETS_PER_BUS; target++) { -+ /* If the target exists */ -+ if (adapter->vbus[bus]->vdev[target] && -+ !adapter->vbus[bus]->vdev[target] -+ ->disabled) { -+ deactivate_block_device(adapter-> -+ vbus[bus]->vdev[target]); -+ } -+ } -+ spin_unlock_irqrestore(&adapter->lock, flags); -+ set_num_targets(adapter->vbus[bus], 0); -+ spin_lock_irqsave(&adapter->lock, flags); -+ } -+ } -+ -+ spin_unlock_irqrestore(&adapter->lock, flags); -+ set_num_buses(adapter->dev, 0); -+ release_crq_queue(&adapter->queue, adapter); -+ -+ release_iu_pool(adapter); -+ -+ release_data_buffer(adapter); -+ -+ kobject_unregister(&adapter->stats_kobj); -+ device_remove_file(&dev->dev, &dev_attr_num_buses); -+ -+ kfree(adapter); -+ -+ return 0; -+} -+ -+static struct vio_device_id ibmvscsis_device_table[] __devinitdata = { -+ {"v-scsi-host", "IBM,v-scsi-host"}, -+ {0,} -+}; -+ -+MODULE_DEVICE_TABLE(vio, ibmvscsis_device_table); -+ -+static struct vio_driver ibmvscsis_driver = { -+ .name = "ibmvscsis", -+ .id_table = ibmvscsis_device_table, -+ .probe = ibmvscsis_probe, -+ .remove = ibmvscsis_remove, -+}; -+ -+static int mod_init(void) -+{ -+ struct device_node *rootdn; -+ char *ppartition_name; -+ char *psystem_id; -+ char *pmodel; -+ unsigned int *p_number_ptr; -+ int rc; -+ -+ /* Retrieve information about this partition */ -+ rootdn = find_path_device("/"); -+ if (rootdn) { -+ pmodel = get_property(rootdn, "model", NULL); -+ psystem_id = get_property(rootdn, "system-id", NULL); -+ if (pmodel && psystem_id) -+ snprintf(system_id,sizeof(system_id), -+ "%s-%s", -+ pmodel, psystem_id); -+ ppartition_name = -+ get_property(rootdn, "ibm,partition-name", NULL); -+ if (ppartition_name) -+ strncpy(partition_name, ppartition_name, -+ sizeof(partition_name)); -+ p_number_ptr = -+ (unsigned int *)get_property(rootdn, "ibm,partition-no", -+ NULL); -+ if (p_number_ptr) -+ partition_number = *p_number_ptr; -+ } -+ -+ info("initialized version "IBMVSCSIS_VERSION"\n"); -+ -+ rc = vio_register_driver(&ibmvscsis_driver); -+ -+ if (rc) { -+ warn("rc %d from vio_register_driver\n", rc); -+ } -+ -+ return rc; -+} -+ -+static void mod_exit(void) -+{ -+ info("terminated\n"); -+ -+ vio_unregister_driver(&ibmvscsis_driver); -+} -+ -+module_init(mod_init); -+module_exit(mod_exit); -diff -aurN a/include/asm-ppc64/vio.h b/include/asm-ppc64/vio.h ---- a/include/asm-ppc64/vio.h 2005-06-17 15:48:29.000000000 -0400 -+++ b/include/asm-ppc64/vio.h 2005-06-18 12:02:58.000000000 -0400 -@@ -91,6 +91,7 @@ - char *type; - uint32_t unit_address; - unsigned int irq; -+ void *driver_data; - - struct device dev; - }; diff --git a/debian/patches-debian/powerpc-ppc64-vio-data.patch b/debian/patches-debian/powerpc-ppc64-vio-data.patch new file mode 100644 index 000000000..9801c00c4 --- /dev/null +++ b/debian/patches-debian/powerpc-ppc64-vio-data.patch @@ -0,0 +1,18 @@ +#! /bin/sh -e +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: Add driver_data member to vio_dev. +## DP: Patch author: Bastian Blank +## DP: Upstream status: unknown + +diff -aurN a/include/asm-ppc64/vio.h b/include/asm-ppc64/vio.h +--- a/include/asm-ppc64/vio.h 2005-06-17 15:48:29.000000000 -0400 ++++ b/include/asm-ppc64/vio.h 2005-06-18 12:02:58.000000000 -0400 +@@ -91,6 +91,7 @@ + char *type; + uint32_t unit_address; + unsigned int irq; ++ void *driver_data; + + struct device dev; + }; diff --git a/debian/patches-debian/remove-references-to-removed-drivers.patch b/debian/patches-debian/remove-references-to-removed-drivers.patch index 31e714cfe..d15da60aa 100644 --- a/debian/patches-debian/remove-references-to-removed-drivers.patch +++ b/debian/patches-debian/remove-references-to-removed-drivers.patch @@ -74,9 +74,9 @@ diff -aurN a/arch/ia64/configs/zx1_defconfig b/arch/ia64/configs/zx1_defconfig # -# CONFIG_USB_EMI62 is not set -# CONFIG_USB_EMI26 is not set - # CONFIG_USB_TIGL is not set # CONFIG_USB_AUERSWALD is not set # CONFIG_USB_RIO500 is not set + # CONFIG_USB_LEGOTOWER is not set diff -aurN a/arch/ia64/defconfig b/arch/ia64/defconfig --- a/arch/ia64/defconfig 2005-06-17 15:48:29.000000000 -0400 +++ b/arch/ia64/defconfig 2005-06-18 16:28:03.000000000 -0400 @@ -86,8 +86,8 @@ diff -aurN a/arch/ia64/defconfig b/arch/ia64/defconfig # CONFIG_FORCEDETH is not set -# CONFIG_DGRS is not set CONFIG_EEPRO100=m - # CONFIG_EEPRO100_PIO is not set CONFIG_E100=m + # CONFIG_FEALNX is not set @@ -500,7 +499,6 @@ # # Ethernet (1000 Mbit) @@ -110,9 +110,9 @@ diff -aurN a/arch/ia64/defconfig b/arch/ia64/defconfig # -# CONFIG_USB_EMI62 is not set -# CONFIG_USB_EMI26 is not set - # CONFIG_USB_TIGL is not set # CONFIG_USB_AUERSWALD is not set # CONFIG_USB_RIO500 is not set + # CONFIG_USB_LEGOTOWER is not set diff -aurN a/arch/mips/configs/rm200_defconfig b/arch/mips/configs/rm200_defconfig --- a/arch/mips/configs/rm200_defconfig 2005-06-17 15:48:29.000000000 -0400 +++ b/arch/mips/configs/rm200_defconfig 2005-06-18 16:27:28.000000000 -0400 @@ -134,9 +134,9 @@ diff -aurN a/arch/ppc/configs/common_defconfig b/arch/ppc/configs/common_defconf # -# CONFIG_USB_EMI62 is not set -# CONFIG_USB_EMI26 is not set - # CONFIG_USB_TIGL is not set # CONFIG_USB_AUERSWALD is not set # CONFIG_USB_RIO500 is not set + # CONFIG_USB_LEGOTOWER is not set diff -aurN a/arch/ppc/configs/lopec_defconfig b/arch/ppc/configs/lopec_defconfig --- a/arch/ppc/configs/lopec_defconfig 2005-06-17 15:48:29.000000000 -0400 +++ b/arch/ppc/configs/lopec_defconfig 2005-06-18 16:25:01.000000000 -0400 @@ -280,7 +280,7 @@ diff -aurN a/arch/x86_64/defconfig b/arch/x86_64/defconfig CONFIG_FORCEDETH=y -# CONFIG_DGRS is not set # CONFIG_EEPRO100 is not set - # CONFIG_E100 is not set + CONFIG_E100=y # CONFIG_FEALNX is not set @@ -550,7 +549,6 @@ # @@ -307,18 +307,6 @@ diff -aurN a/arch/x86_64/defconfig b/arch/x86_64/defconfig # CONFIG_USB_AUERSWALD is not set # CONFIG_USB_RIO500 is not set # CONFIG_USB_LEGOTOWER is not set -diff -aurN a/drivers/usb/Makefile b/drivers/usb/Makefile ---- a/drivers/usb/Makefile 2005-06-17 15:48:29.000000000 -0400 -+++ b/drivers/usb/Makefile 2005-06-18 16:32:12.000000000 -0400 -@@ -59,8 +59,6 @@ - - obj-$(CONFIG_USB_AUERSWALD) += misc/ - obj-$(CONFIG_USB_CYTHERM) += misc/ --obj-$(CONFIG_USB_EMI26) += misc/ --obj-$(CONFIG_USB_EMI62) += misc/ - obj-$(CONFIG_USB_IDMOUSE) += misc/ - obj-$(CONFIG_USB_LCD) += misc/ - obj-$(CONFIG_USB_LED) += misc/ diff -aurN a/drivers/usb/misc/Kconfig b/drivers/usb/misc/Kconfig --- a/drivers/usb/misc/Kconfig 2005-06-18 11:23:01.000000000 -0400 +++ b/drivers/usb/misc/Kconfig 2005-06-18 16:31:32.000000000 -0400 @@ -342,9 +330,8 @@ diff -aurN a/drivers/usb/misc/Kconfig b/drivers/usb/misc/Kconfig config USB_AUERSWALD tristate "USB Auerswald ISDN support (EXPERIMENTAL)" depends on USB && EXPERIMENTAL -diff -aurN a/drivers/usb/misc/Makefile b/drivers/usb/misc/Makefile ---- a/drivers/usb/misc/Makefile 2005-06-18 11:23:01.000000000 -0400 -+++ b/drivers/usb/misc/Makefile 2005-06-18 16:31:47.000000000 -0400 +--- linux-2.6.13/drivers/usb/misc/Makefile.orig 2005-08-06 11:56:51.000000000 +0200 ++++ linux-2.6.13/drivers/usb/misc/Makefile 2005-08-06 11:58:37.000000000 +0200 @@ -5,7 +5,6 @@ obj-$(CONFIG_USB_AUERSWALD) += auerswald.o @@ -352,11 +339,4 @@ diff -aurN a/drivers/usb/misc/Makefile b/drivers/usb/misc/Makefile -obj-$(CONFIG_USB_EMI26) += emi26.o obj-$(CONFIG_USB_IDMOUSE) += idmouse.o obj-$(CONFIG_USB_LCD) += usblcd.o - obj-$(CONFIG_USB_LED) += usbled.o -@@ -16,4 +15,4 @@ - obj-$(CONFIG_USB_TEST) += usbtest.o - obj-$(CONFIG_USB_USS720) += uss720.o - --obj-$(CONFIG_USB_SISUSBVGA) += sisusbvga/ -\ No newline at end of file -+obj-$(CONFIG_USB_SISUSBVGA) += sisusbvga/ + obj-$(CONFIG_USB_LD) += ldusb.o diff --git a/debian/patches-debian/series/2.6.12-1 b/debian/patches-debian/series/2.6.12+2.6.13-rc6-1 similarity index 73% rename from debian/patches-debian/series/2.6.12-1 rename to debian/patches-debian/series/2.6.12+2.6.13-rc6-1 index e400c8c19..a7ac1110b 100644 --- a/debian/patches-debian/series/2.6.12-1 +++ b/debian/patches-debian/series/2.6.12+2.6.13-rc6-1 @@ -1,27 +1,20 @@ + amd64-int3-fix.patch -+ drivers-add-scsi_changer.patch -+ drivers-ide-__devinit.patch + drivers-ide-dma-blacklist-toshiba.patch + drivers-scsi-megaraid_splitup.patch + fbdev-radeon-noaccel.patch + fs-asfs-2.patch + ia64-irq-affinity-upfix.patch -+ modular-ide-pnp.patch + modular-ide.patch -+ modular-vesafb.patch ++ modular-ide-pnp.patch + powerpc-calibrate-tau.patch + powerpc-fix-power3-ftbfs.patch + powerpc-g3-750cxe.patch ++ powerpc-g4-l2-flush-errata.patch ++ powerpc-mkvmlinuz-support.patch + powerpc-pmac-cache-power34-fix.patch ++ powerpc-ppc64-vio-data.patch + powerpc-serial.patch + qla2xxx-removed.patch + remove-references-to-removed-drivers.patch -+ tty-locking-fixes9.patch -+ ia64-generic-nosmp.patch -+ patch-2.6.12.1 -+ powerpc-ppc64-biarch-override.patch -+ patch-2.6.12.2 -+ powerpc-mkvmlinuz-support.patch -+ patch-2.6.12.3 + sparc64-hme-lockup.patch -+ powerpc-g4-l2-flush-errata.patch ++ tty-locking-fixes9.patch diff --git a/debian/patches-debian/series/2.6.12-2 b/debian/patches-debian/series/2.6.12-2 deleted file mode 100644 index ddf0312d7..000000000 --- a/debian/patches-debian/series/2.6.12-2 +++ /dev/null @@ -1 +0,0 @@ -+ patch-2.6.12.4 diff --git a/debian/patches-debian/series/2.6.12-3 b/debian/patches-debian/series/2.6.12-3 deleted file mode 100644 index cbbfd4a33..000000000 --- a/debian/patches-debian/series/2.6.12-3 +++ /dev/null @@ -1 +0,0 @@ -+ patch-2.6.12.5 diff --git a/debian/rules b/debian/rules index 0b01d8c8a..85fca6fcf 100755 --- a/debian/rules +++ b/debian/rules @@ -6,7 +6,7 @@ SHELL := sh -e DEB_HOST_ARCH := $(shell dpkg-architecture -qDEB_HOST_ARCH) DEB_BUILD_ARCH := $(shell dpkg-architecture -qDEB_BUILD_ARCH) srcver := $(shell dpkg-parsechangelog | awk '/^Version:/ {print $$2}') -VERSION := $(word 1,$(subst -, ,$(srcver))) +VERSION := $(shell echo $(srcver) | sed -e 's,-[^-]*$$,,') MAJOR := $(word 1,$(subst ., ,$(VERSION))).$(word 2,$(subst ., ,$(VERSION))) include debian/rules.defs @@ -38,6 +38,9 @@ orig: ../orig/linux-$(MAJOR)-$(VERSION) exit 1; \ fi +maintainerclean: + rm -rf $(filter-out debian, $(wildcard *)) + clean: unpatch dh_testdir rm -f version.Debian