From 4ed98634ef4d6d70194820f34fd75174a8cb996e Mon Sep 17 00:00:00 2001 From: Arthur Othieno Date: Wed, 15 Feb 2006 09:52:46 +0000 Subject: [PATCH] --- yaml --- r: 20433 b: refs/heads/master c: a5f1e4edb3cdd90733893b8aec38fac5553db60a h: refs/heads/master i: 20431: a735a8047588df4984fde2a469877fb8a86542cf v: v3 --- [refs] | 2 +- trunk/Documentation/kernel-parameters.txt | 5 - .../Documentation/scsi/ChangeLog.megaraid_sas | 23 - trunk/Makefile | 7 +- trunk/arch/arm/kernel/calls.S | 2 +- trunk/arch/arm/kernel/setup.c | 5 - trunk/arch/arm/kernel/smp.c | 1 + trunk/arch/arm/kernel/sys_oabi-compat.c | 30 - trunk/arch/arm/mach-integrator/platsmp.c | 21 +- trunk/arch/arm/mach-iop3xx/iop321-setup.c | 1 + trunk/arch/arm/mach-iop3xx/iop331-setup.c | 1 + trunk/arch/arm/mach-ixp4xx/nslu2-setup.c | 6 +- trunk/arch/arm/mach-realview/platsmp.c | 21 +- trunk/arch/arm/plat-omap/pm.c | 1 + trunk/arch/i386/kernel/cpu/transmeta.c | 1 - trunk/arch/x86_64/defconfig | 42 +- trunk/arch/x86_64/kernel/apic.c | 1 - trunk/arch/x86_64/kernel/entry.S | 1 - trunk/arch/x86_64/kernel/head.S | 7 - trunk/arch/x86_64/kernel/io_apic.c | 16 - trunk/arch/x86_64/kernel/nmi.c | 19 +- trunk/arch/x86_64/kernel/time.c | 3 +- trunk/arch/x86_64/mm/k8topology.c | 2 +- trunk/arch/x86_64/mm/numa.c | 2 +- trunk/arch/x86_64/mm/srat.c | 5 +- trunk/drivers/ide/ide-taskfile.c | 3 - trunk/drivers/input/keyboard/Makefile | 1 + trunk/drivers/input/misc/Makefile | 1 + trunk/drivers/input/misc/ixp4xx-beeper.c | 1 - trunk/drivers/input/mouse/logips2pp.c | 1 - trunk/drivers/input/mouse/trackpoint.c | 20 +- trunk/drivers/input/mouse/trackpoint.h | 4 +- trunk/drivers/input/serio/Makefile | 1 + trunk/drivers/input/touchscreen/ads7846.c | 147 +-- trunk/drivers/message/fusion/mptbase.c | 115 ++- trunk/drivers/message/fusion/mptbase.h | 2 +- trunk/drivers/message/fusion/mptctl.c | 241 +---- trunk/drivers/message/fusion/mptctl.h | 4 +- trunk/drivers/message/fusion/mptscsih.c | 2 +- trunk/drivers/mmc/mmci.c | 7 - trunk/drivers/s390/scsi/zfcp_dbf.c | 76 +- trunk/drivers/s390/scsi/zfcp_def.h | 13 +- trunk/drivers/s390/scsi/zfcp_erp.c | 82 +- trunk/drivers/s390/scsi/zfcp_ext.h | 5 +- trunk/drivers/s390/scsi/zfcp_fsf.c | 80 +- trunk/drivers/s390/scsi/zfcp_scsi.c | 15 +- trunk/drivers/s390/scsi/zfcp_sysfs_adapter.c | 4 + trunk/drivers/scsi/3w-9xxx.c | 7 +- trunk/drivers/scsi/aacraid/aachba.c | 217 ++-- trunk/drivers/scsi/aacraid/aacraid.h | 18 +- trunk/drivers/scsi/aacraid/commctrl.c | 22 +- trunk/drivers/scsi/aacraid/comminit.c | 12 +- trunk/drivers/scsi/aacraid/commsup.c | 50 +- trunk/drivers/scsi/aacraid/dpcsup.c | 2 +- trunk/drivers/scsi/aacraid/linit.c | 50 +- trunk/drivers/scsi/gdth.c | 2 +- trunk/drivers/scsi/ipr.c | 49 +- trunk/drivers/scsi/ipr.h | 5 +- trunk/drivers/scsi/iscsi_tcp.c | 78 +- trunk/drivers/scsi/iscsi_tcp.h | 4 +- trunk/drivers/scsi/megaraid.c | 2 +- trunk/drivers/scsi/megaraid.h | 2 +- trunk/drivers/scsi/megaraid/megaraid_sas.c | 101 +- trunk/drivers/scsi/megaraid/megaraid_sas.h | 53 +- trunk/drivers/scsi/qla2xxx/qla_attr.c | 276 +---- trunk/drivers/scsi/qla2xxx/qla_def.h | 44 +- trunk/drivers/scsi/qla2xxx/qla_gbl.h | 27 +- trunk/drivers/scsi/qla2xxx/qla_init.c | 1 + trunk/drivers/scsi/qla2xxx/qla_iocb.c | 1 - trunk/drivers/scsi/qla2xxx/qla_isr.c | 4 +- trunk/drivers/scsi/qla2xxx/qla_mbx.c | 108 +- trunk/drivers/scsi/qla2xxx/qla_os.c | 43 +- trunk/drivers/scsi/qla2xxx/qla_rscn.c | 2 + trunk/drivers/scsi/qla2xxx/qla_sup.c | 963 ------------------ trunk/drivers/scsi/scsi_lib.c | 59 -- trunk/drivers/scsi/scsi_scan.c | 26 +- trunk/drivers/scsi/scsi_sysfs.c | 9 +- trunk/drivers/scsi/scsi_transport_iscsi.c | 260 ++--- trunk/drivers/scsi/sym53c8xx_2/sym_hipd.c | 2 +- trunk/drivers/serial/Kconfig | 4 +- trunk/drivers/video/neofb.c | 15 +- trunk/drivers/video/s3c2410fb.c | 1 + trunk/fs/cifs/file.c | 14 +- trunk/fs/exec.c | 2 +- trunk/fs/ocfs2/dlm/dlmcommon.h | 4 - trunk/fs/ocfs2/dlm/dlmconvert.c | 12 +- trunk/fs/ocfs2/dlm/dlmlock.c | 25 +- trunk/fs/ocfs2/dlm/dlmmaster.c | 7 +- trunk/fs/ocfs2/dlm/dlmrecovery.c | 42 - trunk/fs/ocfs2/journal.c | 7 +- trunk/fs/ocfs2/journal.h | 2 + trunk/include/asm-alpha/mman.h | 8 +- trunk/include/asm-arm/mman.h | 31 +- trunk/include/asm-arm/smp.h | 5 - trunk/include/asm-arm/unistd.h | 6 +- trunk/include/asm-arm26/mman.h | 31 +- trunk/include/asm-cris/mman.h | 31 +- trunk/include/asm-frv/mman.h | 31 +- trunk/include/asm-generic/mman.h | 42 - trunk/include/asm-h8300/mman.h | 31 +- trunk/include/asm-i386/mman.h | 31 +- trunk/include/asm-ia64/mman.h | 31 +- trunk/include/asm-m32r/mman.h | 33 +- trunk/include/asm-m68k/mman.h | 31 +- trunk/include/asm-mips/mman.h | 22 +- trunk/include/asm-parisc/mman.h | 8 +- trunk/include/asm-powerpc/mman.h | 32 +- trunk/include/asm-s390/mman.h | 31 +- trunk/include/asm-sh/mman.h | 31 +- trunk/include/asm-sparc/mman.h | 31 +- trunk/include/asm-sparc64/mman.h | 31 +- trunk/include/asm-v850/mman.h | 30 +- trunk/include/asm-x86_64/mman.h | 30 +- trunk/include/asm-x86_64/proto.h | 1 - trunk/include/asm-xtensa/mman.h | 22 +- trunk/include/linux/kernel.h | 6 + trunk/include/linux/ktime.h | 10 +- trunk/include/linux/mm.h | 2 - trunk/include/linux/netfilter.h | 21 +- trunk/include/linux/netfilter_ipv4.h | 2 +- trunk/include/linux/ptrace.h | 1 - trunk/include/net/ip.h | 1 - trunk/include/net/xfrm.h | 1 + trunk/include/scsi/iscsi_if.h | 3 + trunk/include/scsi/scsi.h | 2 - trunk/include/scsi/scsi_transport_iscsi.h | 34 +- trunk/include/video/neomagic.h | 1 - trunk/kernel/cpuset.c | 35 +- trunk/kernel/fork.c | 9 +- trunk/kernel/power/snapshot.c | 4 +- trunk/kernel/ptrace.c | 25 +- trunk/kernel/sysctl.c | 2 + trunk/lib/radix-tree.c | 10 +- trunk/mm/memory.c | 10 - trunk/net/bridge/br_stp_if.c | 4 +- trunk/net/ipv4/ip_gre.c | 3 +- trunk/net/ipv4/ip_output.c | 16 +- trunk/net/ipv4/ipip.c | 3 +- trunk/net/ipv4/netfilter.c | 41 - trunk/net/ipv4/netfilter/ip_nat_standalone.c | 6 +- .../netfilter/nf_conntrack_l3proto_ipv4.c | 5 + trunk/net/ipv4/xfrm4_output.c | 13 +- trunk/net/ipv6/icmp.c | 6 - trunk/net/ipv6/netfilter/ip6t_REJECT.c | 2 - trunk/net/netfilter/Kconfig | 6 +- trunk/net/netfilter/nf_conntrack_core.c | 5 - trunk/net/netfilter/nf_conntrack_proto_tcp.c | 4 +- trunk/net/netfilter/nf_conntrack_proto_udp.c | 4 +- 148 files changed, 1522 insertions(+), 3070 deletions(-) delete mode 100644 trunk/include/asm-generic/mman.h diff --git a/[refs] b/[refs] index 2a4ebba15a95..ed6463efc4f6 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: a5222049f3e26c21ecd65bfcc9b666d4c813933b +refs/heads/master: a5f1e4edb3cdd90733893b8aec38fac5553db60a diff --git a/trunk/Documentation/kernel-parameters.txt b/trunk/Documentation/kernel-parameters.txt index b874771385cd..84370363da80 100644 --- a/trunk/Documentation/kernel-parameters.txt +++ b/trunk/Documentation/kernel-parameters.txt @@ -1133,8 +1133,6 @@ running once the system is up. Mechanism 1. conf2 [IA-32] Force use of PCI Configuration Mechanism 2. - nommconf [IA-32,X86_64] Disable use of MMCONFIG for PCI - Configuration nosort [IA-32] Don't sort PCI devices according to order given by the PCI BIOS. This sorting is done to get a device order compatible with @@ -1638,9 +1636,6 @@ running once the system is up. Format: ,,,,,[,[,[,]]] - norandmaps Don't use address space randomization - Equivalent to echo 0 > /proc/sys/kernel/randomize_va_space - ______________________________________________________________________ Changelog: diff --git a/trunk/Documentation/scsi/ChangeLog.megaraid_sas b/trunk/Documentation/scsi/ChangeLog.megaraid_sas index 2dafa63bd370..f8c16cbf56ba 100644 --- a/trunk/Documentation/scsi/ChangeLog.megaraid_sas +++ b/trunk/Documentation/scsi/ChangeLog.megaraid_sas @@ -1,26 +1,3 @@ -1 Release Date : Wed Feb 03 14:31:44 PST 2006 - Sumant Patro -2 Current Version : 00.00.02.04 -3 Older Version : 00.00.02.04 - -i. Support for 1078 type (ppc IOP) controller, device id : 0x60 added. - During initialization, depending on the device id, the template members - are initialized with function pointers specific to the ppc or - xscale controllers. - - -Sumant Patro - -1 Release Date : Fri Feb 03 14:16:25 PST 2006 - Sumant Patro - -2 Current Version : 00.00.02.04 -3 Older Version : 00.00.02.02 -i. Register 16 byte CDB capability with scsi midlayer - - "Ths patch properly registers the 16 byte command length capability of the - megaraid_sas controlled hardware with the scsi midlayer. All megaraid_sas - hardware supports 16 byte CDB's." - - -Joshua Giles - 1 Release Date : Mon Jan 23 14:09:01 PST 2006 - Sumant Patro 2 Current Version : 00.00.02.02 3 Older Version : 00.00.02.01 diff --git a/trunk/Makefile b/trunk/Makefile index 48d569d46ae1..74d67b2c35d9 100644 --- a/trunk/Makefile +++ b/trunk/Makefile @@ -106,12 +106,13 @@ KBUILD_OUTPUT := $(shell cd $(KBUILD_OUTPUT) && /bin/pwd) $(if $(KBUILD_OUTPUT),, \ $(error output directory "$(saved-output)" does not exist)) -.PHONY: $(MAKECMDGOALS) +.PHONY: $(MAKECMDGOALS) cdbuilddir +$(MAKECMDGOALS) _all: cdbuilddir -$(filter-out _all,$(MAKECMDGOALS)) _all: +cdbuilddir: $(if $(KBUILD_VERBOSE:1=),@)$(MAKE) -C $(KBUILD_OUTPUT) \ KBUILD_SRC=$(CURDIR) \ - KBUILD_EXTMOD="$(KBUILD_EXTMOD)" -f $(CURDIR)/Makefile $@ + KBUILD_EXTMOD="$(KBUILD_EXTMOD)" -f $(CURDIR)/Makefile $(MAKECMDGOALS) # Leave processing to above invocation of make skip-makefile := 1 diff --git a/trunk/arch/arm/kernel/calls.S b/trunk/arch/arm/kernel/calls.S index 3173924a9b60..8c3035d5ffc9 100644 --- a/trunk/arch/arm/kernel/calls.S +++ b/trunk/arch/arm/kernel/calls.S @@ -111,7 +111,7 @@ CALL(sys_statfs) /* 100 */ CALL(sys_fstatfs) CALL(sys_ni_syscall) - CALL(OBSOLETE(ABI(sys_socketcall, sys_oabi_socketcall))) + CALL(OBSOLETE(sys_socketcall)) CALL(sys_syslog) CALL(sys_setitimer) /* 105 */ CALL(sys_getitimer) diff --git a/trunk/arch/arm/kernel/setup.c b/trunk/arch/arm/kernel/setup.c index 68273b4dc882..c45d10d07bde 100644 --- a/trunk/arch/arm/kernel/setup.c +++ b/trunk/arch/arm/kernel/setup.c @@ -23,7 +23,6 @@ #include #include #include -#include #include #include @@ -772,10 +771,6 @@ void __init setup_arch(char **cmdline_p) paging_init(&meminfo, mdesc); request_standard_resources(&meminfo, mdesc); -#ifdef CONFIG_SMP - smp_init_cpus(); -#endif - cpu_init(); /* diff --git a/trunk/arch/arm/kernel/smp.c b/trunk/arch/arm/kernel/smp.c index 02aa300c4633..7338948bd7d3 100644 --- a/trunk/arch/arm/kernel/smp.c +++ b/trunk/arch/arm/kernel/smp.c @@ -338,6 +338,7 @@ void __init smp_prepare_boot_cpu(void) per_cpu(cpu_data, cpu).idle = current; + cpu_set(cpu, cpu_possible_map); cpu_set(cpu, cpu_present_map); cpu_set(cpu, cpu_online_map); } diff --git a/trunk/arch/arm/kernel/sys_oabi-compat.c b/trunk/arch/arm/kernel/sys_oabi-compat.c index 8e2f9bc3368b..9d4b76409c64 100644 --- a/trunk/arch/arm/kernel/sys_oabi-compat.c +++ b/trunk/arch/arm/kernel/sys_oabi-compat.c @@ -64,7 +64,6 @@ * sys_connect: * sys_sendmsg: * sys_sendto: - * sys_socketcall: * * struct sockaddr_un loses its padding with EABI. Since the size of the * structure is used as a validation test in unix_mkname(), we need to @@ -79,7 +78,6 @@ #include #include #include -#include #include #include @@ -410,31 +408,3 @@ asmlinkage long sys_oabi_sendmsg(int fd, struct msghdr __user *msg, unsigned fla return sys_sendmsg(fd, msg, flags); } -asmlinkage long sys_oabi_socketcall(int call, unsigned long __user *args) -{ - unsigned long r = -EFAULT, a[6]; - - switch (call) { - case SYS_BIND: - if (copy_from_user(a, args, 3 * sizeof(long)) == 0) - r = sys_oabi_bind(a[0], (struct sockaddr __user *)a[1], a[2]); - break; - case SYS_CONNECT: - if (copy_from_user(a, args, 3 * sizeof(long)) == 0) - r = sys_oabi_connect(a[0], (struct sockaddr __user *)a[1], a[2]); - break; - case SYS_SENDTO: - if (copy_from_user(a, args, 6 * sizeof(long)) == 0) - r = sys_oabi_sendto(a[0], (void __user *)a[1], a[2], a[3], - (struct sockaddr __user *)a[4], a[5]); - break; - case SYS_SENDMSG: - if (copy_from_user(a, args, 3 * sizeof(long)) == 0) - r = sys_oabi_sendmsg(a[0], (struct msghdr __user *)a[1], a[2]); - break; - default: - r = sys_socketcall(call, args); - } - - return r; -} diff --git a/trunk/arch/arm/mach-integrator/platsmp.c b/trunk/arch/arm/mach-integrator/platsmp.c index 1bc8534ef0c6..ea10bd8c972c 100644 --- a/trunk/arch/arm/mach-integrator/platsmp.c +++ b/trunk/arch/arm/mach-integrator/platsmp.c @@ -140,18 +140,6 @@ static void __init poke_milo(void) mb(); } -/* - * Initialise the CPU possible map early - this describes the CPUs - * which may be present or become present in the system. - */ -void __init smp_init_cpus(void) -{ - unsigned int i, ncores = get_core_count(); - - for (i = 0; i < ncores; i++) - cpu_set(i, cpu_possible_map); -} - void __init smp_prepare_cpus(unsigned int max_cpus) { unsigned int ncores = get_core_count(); @@ -188,11 +176,14 @@ void __init smp_prepare_cpus(unsigned int max_cpus) max_cpus = ncores; /* - * Initialise the present map, which describes the set of CPUs - * actually populated at the present time. + * Initialise the possible/present maps. + * cpu_possible_map describes the set of CPUs which may be present + * cpu_present_map describes the set of CPUs populated */ - for (i = 0; i < max_cpus; i++) + for (i = 0; i < max_cpus; i++) { + cpu_set(i, cpu_possible_map); cpu_set(i, cpu_present_map); + } /* * Do we need any more CPUs? If so, then let them know where diff --git a/trunk/arch/arm/mach-iop3xx/iop321-setup.c b/trunk/arch/arm/mach-iop3xx/iop321-setup.c index 0ebbcb20c6ae..e4f4c52d93d4 100644 --- a/trunk/arch/arm/mach-iop3xx/iop321-setup.c +++ b/trunk/arch/arm/mach-iop3xx/iop321-setup.c @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include diff --git a/trunk/arch/arm/mach-iop3xx/iop331-setup.c b/trunk/arch/arm/mach-iop3xx/iop331-setup.c index 2d6abe5be14d..63585485123e 100644 --- a/trunk/arch/arm/mach-iop3xx/iop331-setup.c +++ b/trunk/arch/arm/mach-iop3xx/iop331-setup.c @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include diff --git a/trunk/arch/arm/mach-ixp4xx/nslu2-setup.c b/trunk/arch/arm/mach-ixp4xx/nslu2-setup.c index f260a9d34f70..da9340a53434 100644 --- a/trunk/arch/arm/mach-ixp4xx/nslu2-setup.c +++ b/trunk/arch/arm/mach-ixp4xx/nslu2-setup.c @@ -27,6 +27,8 @@ static struct flash_platform_data nslu2_flash_data = { }; static struct resource nslu2_flash_resource = { + .start = NSLU2_FLASH_BASE, + .end = NSLU2_FLASH_BASE + NSLU2_FLASH_SIZE, .flags = IORESOURCE_MEM, }; @@ -114,10 +116,6 @@ static void __init nslu2_init(void) { ixp4xx_sys_init(); - nslu2_flash_resource.start = IXP4XX_EXP_BUS_BASE(0); - nslu2_flash_resource.end = - IXP4XX_EXP_BUS_BASE(0) + ixp4xx_exp_bus_size - 1; - pm_power_off = nslu2_power_off; platform_add_devices(nslu2_devices, ARRAY_SIZE(nslu2_devices)); diff --git a/trunk/arch/arm/mach-realview/platsmp.c b/trunk/arch/arm/mach-realview/platsmp.c index b8484e15dacb..a8fbd76d8be5 100644 --- a/trunk/arch/arm/mach-realview/platsmp.c +++ b/trunk/arch/arm/mach-realview/platsmp.c @@ -143,18 +143,6 @@ static void __init poke_milo(void) mb(); } -/* - * Initialise the CPU possible map early - this describes the CPUs - * which may be present or become present in the system. - */ -void __init smp_init_cpus(void) -{ - unsigned int i, ncores = get_core_count(); - - for (i = 0; i < ncores; i++) - cpu_set(i, cpu_possible_map); -} - void __init smp_prepare_cpus(unsigned int max_cpus) { unsigned int ncores = get_core_count(); @@ -191,11 +179,14 @@ void __init smp_prepare_cpus(unsigned int max_cpus) local_timer_setup(cpu); /* - * Initialise the present map, which describes the set of CPUs - * actually populated at the present time. + * Initialise the possible/present maps. + * cpu_possible_map describes the set of CPUs which may be present + * cpu_present_map describes the set of CPUs populated */ - for (i = 0; i < max_cpus; i++) + for (i = 0; i < max_cpus; i++) { + cpu_set(i, cpu_possible_map); cpu_set(i, cpu_present_map); + } /* * Do we need any more CPUs? If so, then let them know where diff --git a/trunk/arch/arm/plat-omap/pm.c b/trunk/arch/arm/plat-omap/pm.c index 093efd786f21..1a24e2c10714 100644 --- a/trunk/arch/arm/plat-omap/pm.c +++ b/trunk/arch/arm/plat-omap/pm.c @@ -38,6 +38,7 @@ #include #include #include +#include #include #include diff --git a/trunk/arch/i386/kernel/cpu/transmeta.c b/trunk/arch/i386/kernel/cpu/transmeta.c index 7214c9b577ab..bdbeb77f4e22 100644 --- a/trunk/arch/i386/kernel/cpu/transmeta.c +++ b/trunk/arch/i386/kernel/cpu/transmeta.c @@ -1,5 +1,4 @@ #include -#include #include #include #include diff --git a/trunk/arch/x86_64/defconfig b/trunk/arch/x86_64/defconfig index b337136f28b6..56832929a543 100644 --- a/trunk/arch/x86_64/defconfig +++ b/trunk/arch/x86_64/defconfig @@ -1,7 +1,7 @@ # # Automatically generated make config: don't edit -# Linux kernel version: 2.6.16-rc3 -# Mon Feb 13 22:31:24 2006 +# Linux kernel version: 2.6.16-rc1-git2 +# Thu Jan 19 10:05:21 2006 # CONFIG_X86_64=y CONFIG_64BIT=y @@ -21,6 +21,7 @@ CONFIG_DMI=y # Code maturity level options # CONFIG_EXPERIMENTAL=y +CONFIG_CLEAN_COMPILE=y CONFIG_LOCK_KERNEL=y CONFIG_INIT_ENV_ARG_LIMIT=32 @@ -266,7 +267,6 @@ CONFIG_NET=y # # Networking options # -# CONFIG_NETDEBUG is not set CONFIG_PACKET=y # CONFIG_PACKET_MMAP is not set CONFIG_UNIX=y @@ -446,6 +446,7 @@ CONFIG_BLK_DEV_PIIX=y # CONFIG_BLK_DEV_NS87415 is not set # CONFIG_BLK_DEV_PDC202XX_OLD is not set CONFIG_BLK_DEV_PDC202XX_NEW=y +# CONFIG_PDC202XX_FORCE is not set # CONFIG_BLK_DEV_SVWKS is not set # CONFIG_BLK_DEV_SIIMAGE is not set # CONFIG_BLK_DEV_SIS5513 is not set @@ -572,33 +573,7 @@ CONFIG_FUSION_MAX_SGE=128 # # IEEE 1394 (FireWire) support # -CONFIG_IEEE1394=y - -# -# Subsystem Options -# -# CONFIG_IEEE1394_VERBOSEDEBUG is not set -# CONFIG_IEEE1394_OUI_DB is not set -# CONFIG_IEEE1394_EXTRA_CONFIG_ROMS is not set -# CONFIG_IEEE1394_EXPORT_FULL_API is not set - -# -# Device Drivers -# - -# -# Texas Instruments PCILynx requires I2C -# -CONFIG_IEEE1394_OHCI1394=y - -# -# Protocol Drivers -# -# CONFIG_IEEE1394_VIDEO1394 is not set -# CONFIG_IEEE1394_SBP2 is not set -# CONFIG_IEEE1394_ETH1394 is not set -# CONFIG_IEEE1394_DV1394 is not set -CONFIG_IEEE1394_RAWIO=y +# CONFIG_IEEE1394 is not set # # I2O device support @@ -797,7 +772,6 @@ CONFIG_SERIAL_8250_RUNTIME_UARTS=4 # CONFIG_SERIAL_CORE=y CONFIG_SERIAL_CORE_CONSOLE=y -# CONFIG_SERIAL_JSM is not set CONFIG_UNIX98_PTYS=y CONFIG_LEGACY_PTYS=y CONFIG_LEGACY_PTY_COUNT=256 @@ -897,7 +871,6 @@ CONFIG_HPET_MMAP=y # CONFIG_HWMON=y # CONFIG_HWMON_VID is not set -# CONFIG_SENSORS_F71805F is not set # CONFIG_SENSORS_HDAPS is not set # CONFIG_HWMON_DEBUG_CHIP is not set @@ -1128,6 +1101,7 @@ CONFIG_USB_MON=y # EDAC - error detection and reporting (RAS) # # CONFIG_EDAC is not set +# CONFIG_EDAC_POLL is not set # # Firmware Drivers @@ -1317,12 +1291,14 @@ CONFIG_DETECT_SOFTLOCKUP=y # CONFIG_DEBUG_SPINLOCK is not set # CONFIG_DEBUG_SPINLOCK_SLEEP is not set # CONFIG_DEBUG_KOBJECT is not set -CONFIG_DEBUG_INFO=y +# CONFIG_DEBUG_INFO is not set CONFIG_DEBUG_FS=y # CONFIG_DEBUG_VM is not set # CONFIG_FRAME_POINTER is not set # CONFIG_FORCED_INLINING is not set +# CONFIG_UNWIND_INFO is not set # CONFIG_RCU_TORTURE_TEST is not set +CONFIG_INIT_DEBUG=y # CONFIG_DEBUG_RODATA is not set # CONFIG_IOMMU_DEBUG is not set diff --git a/trunk/arch/x86_64/kernel/apic.c b/trunk/arch/x86_64/kernel/apic.c index e5b14c57eaa0..7a0a3e8d5d72 100644 --- a/trunk/arch/x86_64/kernel/apic.c +++ b/trunk/arch/x86_64/kernel/apic.c @@ -1152,7 +1152,6 @@ __setup("noapicmaintimer", setup_noapicmaintimer); static __init int setup_apicpmtimer(char *s) { apic_calibrate_pmtmr = 1; - notsc_setup(NULL); return setup_apicmaintimer(NULL); } __setup("apicpmtimer", setup_apicpmtimer); diff --git a/trunk/arch/x86_64/kernel/entry.S b/trunk/arch/x86_64/kernel/entry.S index 7c10e9009d61..b150c87a08c6 100644 --- a/trunk/arch/x86_64/kernel/entry.S +++ b/trunk/arch/x86_64/kernel/entry.S @@ -554,7 +554,6 @@ iret_label: /* running with kernel gs */ bad_iret: movq $-9999,%rdi /* better code? */ - sti jmp do_exit .previous diff --git a/trunk/arch/x86_64/kernel/head.S b/trunk/arch/x86_64/kernel/head.S index 02fc7fa0ea28..692c737feddb 100644 --- a/trunk/arch/x86_64/kernel/head.S +++ b/trunk/arch/x86_64/kernel/head.S @@ -213,11 +213,6 @@ ENTRY(early_idt_handler) cmpl $2,early_recursion_flag(%rip) jz 1f call dump_stack -#ifdef CONFIG_KALLSYMS - leaq early_idt_ripmsg(%rip),%rdi - movq 8(%rsp),%rsi # get rip again - call __print_symbol -#endif 1: hlt jmp 1b early_recursion_flag: @@ -225,8 +220,6 @@ early_recursion_flag: early_idt_msg: .asciz "PANIC: early exception rip %lx error %lx cr2 %lx\n" -early_idt_ripmsg: - .asciz "RIP %s\n" .code32 ENTRY(no_long_mode) diff --git a/trunk/arch/x86_64/kernel/io_apic.c b/trunk/arch/x86_64/kernel/io_apic.c index 2585c1d92b26..4282d72b2a26 100644 --- a/trunk/arch/x86_64/kernel/io_apic.c +++ b/trunk/arch/x86_64/kernel/io_apic.c @@ -30,9 +30,6 @@ #include #include #include -#ifdef CONFIG_ACPI -#include -#endif #include #include @@ -263,8 +260,6 @@ __setup("apic", enable_ioapic_setup); And another hack to disable the IOMMU on VIA chipsets. - ... and others. Really should move this somewhere else. - Kludge-O-Rama. */ void __init check_ioapic(void) { @@ -312,17 +307,6 @@ void __init check_ioapic(void) case PCI_VENDOR_ID_ATI: if (apic_runs_main_timer != 0) break; -#ifdef CONFIG_ACPI - /* Don't do this for laptops right - right now because their timer - doesn't necessarily tick in C2/3 */ - if (acpi_fadt.revision >= 3 && - (acpi_fadt.plvl2_lat + acpi_fadt.plvl3_lat) < 1100) { - printk(KERN_INFO -"ATI board detected, but seems to be a laptop. Timer might be shakey, sorry\n"); - break; - } -#endif printk(KERN_INFO "ATI board detected. Using APIC/PM timer.\n"); apic_runs_main_timer = 1; diff --git a/trunk/arch/x86_64/kernel/nmi.c b/trunk/arch/x86_64/kernel/nmi.c index 5bf17e41cd2d..8be407a1f62d 100644 --- a/trunk/arch/x86_64/kernel/nmi.c +++ b/trunk/arch/x86_64/kernel/nmi.c @@ -236,7 +236,6 @@ static void enable_lapic_nmi_watchdog(void) { if (nmi_active < 0) { nmi_watchdog = NMI_LOCAL_APIC; - touch_nmi_watchdog(); setup_apic_nmi_watchdog(); } } @@ -457,17 +456,15 @@ static DEFINE_PER_CPU(int, nmi_touch); void touch_nmi_watchdog (void) { - if (nmi_watchdog > 0) { - unsigned cpu; + int i; - /* - * Tell other CPUs to reset their alert counters. We cannot - * do it ourselves because the alert count increase is not - * atomic. - */ - for_each_present_cpu (cpu) - per_cpu(nmi_touch, cpu) = 1; - } + /* + * Tell other CPUs to reset their alert counters. We cannot + * do it ourselves because the alert count increase is not + * atomic. + */ + for (i = 0; i < NR_CPUS; i++) + per_cpu(nmi_touch, i) = 1; touch_softlockup_watchdog(); } diff --git a/trunk/arch/x86_64/kernel/time.c b/trunk/arch/x86_64/kernel/time.c index 67841d11ed1f..3c58c30506a1 100644 --- a/trunk/arch/x86_64/kernel/time.c +++ b/trunk/arch/x86_64/kernel/time.c @@ -1327,7 +1327,8 @@ static int __init nohpet_setup(char *s) __setup("nohpet", nohpet_setup); -int __init notsc_setup(char *s) + +static int __init notsc_setup(char *s) { notsc = 1; return 0; diff --git a/trunk/arch/x86_64/mm/k8topology.c b/trunk/arch/x86_64/mm/k8topology.c index dd60e71fdba6..a5663e0bb01c 100644 --- a/trunk/arch/x86_64/mm/k8topology.c +++ b/trunk/arch/x86_64/mm/k8topology.c @@ -155,7 +155,7 @@ int __init k8_scan_nodes(unsigned long start, unsigned long end) if (!found) return -1; - memnode_shift = compute_hash_shift(nodes, 8); + memnode_shift = compute_hash_shift(nodes, numnodes); if (memnode_shift < 0) { printk(KERN_ERR "No NUMA node hash function found. Contact maintainer\n"); return -1; diff --git a/trunk/arch/x86_64/mm/numa.c b/trunk/arch/x86_64/mm/numa.c index 22e51beee8d3..6ef9f9a76235 100644 --- a/trunk/arch/x86_64/mm/numa.c +++ b/trunk/arch/x86_64/mm/numa.c @@ -351,7 +351,7 @@ void __init init_cpu_to_node(void) continue; if (apicid_to_node[apicid] == NUMA_NO_NODE) continue; - numa_set_node(i,apicid_to_node[apicid]); + cpu_to_node[i] = apicid_to_node[apicid]; } } diff --git a/trunk/arch/x86_64/mm/srat.c b/trunk/arch/x86_64/mm/srat.c index 482c25767369..cd25300726fc 100644 --- a/trunk/arch/x86_64/mm/srat.c +++ b/trunk/arch/x86_64/mm/srat.c @@ -228,8 +228,7 @@ static int nodes_cover_memory(void) } e820ram = end_pfn - e820_hole_size(0, end_pfn); - /* We seem to lose 3 pages somewhere. Allow a bit of slack. */ - if ((long)(e820ram - pxmram) >= 1*1024*1024) { + if (pxmram < e820ram) { printk(KERN_ERR "SRAT: PXMs only cover %luMB of your %luMB e820 RAM. Not used.\n", (pxmram << PAGE_SHIFT) >> 20, @@ -271,7 +270,7 @@ int __init acpi_scan_nodes(unsigned long start, unsigned long end) return -1; } - memnode_shift = compute_hash_shift(nodes, MAX_NUMNODES); + memnode_shift = compute_hash_shift(nodes, nodes_weight(nodes_parsed)); if (memnode_shift < 0) { printk(KERN_ERR "SRAT: No NUMA node hash function found. Contact maintainer\n"); diff --git a/trunk/drivers/ide/ide-taskfile.c b/trunk/drivers/ide/ide-taskfile.c index 0606bd2f6020..9834dce4e20f 100644 --- a/trunk/drivers/ide/ide-taskfile.c +++ b/trunk/drivers/ide/ide-taskfile.c @@ -34,7 +34,6 @@ #include #include #include -#include #include #include #include @@ -315,8 +314,6 @@ static void ide_pio_datablock(ide_drive_t *drive, struct request *rq, if (rq->bio) /* fs request */ rq->errors = 0; - touch_softlockup_watchdog(); - switch (drive->hwif->data_phase) { case TASKFILE_MULTI_IN: case TASKFILE_MULTI_OUT: diff --git a/trunk/drivers/input/keyboard/Makefile b/trunk/drivers/input/keyboard/Makefile index 2708167ba175..6e0afbb22383 100644 --- a/trunk/drivers/input/keyboard/Makefile +++ b/trunk/drivers/input/keyboard/Makefile @@ -11,6 +11,7 @@ obj-$(CONFIG_KEYBOARD_XTKBD) += xtkbd.o obj-$(CONFIG_KEYBOARD_AMIGA) += amikbd.o obj-$(CONFIG_KEYBOARD_LOCOMO) += locomokbd.o obj-$(CONFIG_KEYBOARD_NEWTON) += newtonkbd.o +obj-$(CONFIG_KEYBOARD_98KBD) += 98kbd.o obj-$(CONFIG_KEYBOARD_CORGI) += corgikbd.o obj-$(CONFIG_KEYBOARD_SPITZ) += spitzkbd.o obj-$(CONFIG_KEYBOARD_HIL) += hil_kbd.o diff --git a/trunk/drivers/input/misc/Makefile b/trunk/drivers/input/misc/Makefile index 415c49178985..184c4129470d 100644 --- a/trunk/drivers/input/misc/Makefile +++ b/trunk/drivers/input/misc/Makefile @@ -7,6 +7,7 @@ obj-$(CONFIG_INPUT_SPARCSPKR) += sparcspkr.o obj-$(CONFIG_INPUT_PCSPKR) += pcspkr.o obj-$(CONFIG_INPUT_M68K_BEEP) += m68kspkr.o +obj-$(CONFIG_INPUT_98SPKR) += 98spkr.o obj-$(CONFIG_INPUT_UINPUT) += uinput.o obj-$(CONFIG_INPUT_WISTRON_BTNS) += wistron_btns.o obj-$(CONFIG_HP_SDC_RTC) += hp_sdc_rtc.o diff --git a/trunk/drivers/input/misc/ixp4xx-beeper.c b/trunk/drivers/input/misc/ixp4xx-beeper.c index 3a6ae85cd69c..d448bb5e4869 100644 --- a/trunk/drivers/input/misc/ixp4xx-beeper.c +++ b/trunk/drivers/input/misc/ixp4xx-beeper.c @@ -19,7 +19,6 @@ #include #include #include -#include #include MODULE_AUTHOR("Alessandro Zummo "); diff --git a/trunk/drivers/input/mouse/logips2pp.c b/trunk/drivers/input/mouse/logips2pp.c index 40333d61093c..c88520d3d13c 100644 --- a/trunk/drivers/input/mouse/logips2pp.c +++ b/trunk/drivers/input/mouse/logips2pp.c @@ -232,7 +232,6 @@ static struct ps2pp_info *get_model_info(unsigned char model) { 88, PS2PP_KIND_WHEEL, PS2PP_WHEEL }, { 96, 0, 0 }, { 97, PS2PP_KIND_TP3, PS2PP_WHEEL | PS2PP_HWHEEL }, - { 99, PS2PP_KIND_WHEEL, PS2PP_WHEEL }, { 100, PS2PP_KIND_MX, /* MX510 */ PS2PP_WHEEL | PS2PP_SIDE_BTN | PS2PP_TASK_BTN | PS2PP_EXTRA_BTN | PS2PP_NAV_BTN }, diff --git a/trunk/drivers/input/mouse/trackpoint.c b/trunk/drivers/input/mouse/trackpoint.c index 6d9ec9ab1b90..b4898d8a68e2 100644 --- a/trunk/drivers/input/mouse/trackpoint.c +++ b/trunk/drivers/input/mouse/trackpoint.c @@ -68,19 +68,15 @@ struct trackpoint_attr_data { size_t field_offset; unsigned char command; unsigned char mask; - unsigned char inverted; }; static ssize_t trackpoint_show_int_attr(struct psmouse *psmouse, void *data, char *buf) { struct trackpoint_data *tp = psmouse->private; struct trackpoint_attr_data *attr = data; - unsigned char value = *(unsigned char *)((char *)tp + attr->field_offset); - - if (attr->inverted) - value = !value; + unsigned char *field = (unsigned char *)((char *)tp + attr->field_offset); - return sprintf(buf, "%u\n", value); + return sprintf(buf, "%u\n", *field); } static ssize_t trackpoint_set_int_attr(struct psmouse *psmouse, void *data, @@ -124,9 +120,6 @@ static ssize_t trackpoint_set_bit_attr(struct psmouse *psmouse, void *data, if (*rest || value > 1) return -EINVAL; - if (attr->inverted) - value = !value; - if (*field != value) { *field = value; trackpoint_toggle_bit(&psmouse->ps2dev, attr->command, attr->mask); @@ -136,12 +129,11 @@ static ssize_t trackpoint_set_bit_attr(struct psmouse *psmouse, void *data, } -#define TRACKPOINT_BIT_ATTR(_name, _command, _mask, _inv) \ +#define TRACKPOINT_BIT_ATTR(_name, _command, _mask) \ static struct trackpoint_attr_data trackpoint_attr_##_name = { \ .field_offset = offsetof(struct trackpoint_data, _name), \ .command = _command, \ .mask = _mask, \ - .inverted = _inv, \ }; \ PSMOUSE_DEFINE_ATTR(_name, S_IWUSR | S_IRUGO, \ &trackpoint_attr_##_name, \ @@ -158,9 +150,9 @@ TRACKPOINT_INT_ATTR(upthresh, TP_UP_THRESH); TRACKPOINT_INT_ATTR(ztime, TP_Z_TIME); TRACKPOINT_INT_ATTR(jenks, TP_JENKS_CURV); -TRACKPOINT_BIT_ATTR(press_to_select, TP_TOGGLE_PTSON, TP_MASK_PTSON, 0); -TRACKPOINT_BIT_ATTR(skipback, TP_TOGGLE_SKIPBACK, TP_MASK_SKIPBACK, 0); -TRACKPOINT_BIT_ATTR(ext_dev, TP_TOGGLE_EXT_DEV, TP_MASK_EXT_DEV, 1); +TRACKPOINT_BIT_ATTR(press_to_select, TP_TOGGLE_PTSON, TP_MASK_PTSON); +TRACKPOINT_BIT_ATTR(skipback, TP_TOGGLE_SKIPBACK, TP_MASK_SKIPBACK); +TRACKPOINT_BIT_ATTR(ext_dev, TP_TOGGLE_EXT_DEV, TP_MASK_EXT_DEV); static struct attribute *trackpoint_attrs[] = { &psmouse_attr_sensitivity.dattr.attr, diff --git a/trunk/drivers/input/mouse/trackpoint.h b/trunk/drivers/input/mouse/trackpoint.h index 050298b1a09d..9857d8b6ad66 100644 --- a/trunk/drivers/input/mouse/trackpoint.h +++ b/trunk/drivers/input/mouse/trackpoint.h @@ -78,7 +78,7 @@ #define TP_TOGGLE_MB 0x23 /* Disable/Enable Middle Button */ #define TP_MASK_MB 0x01 -#define TP_TOGGLE_EXT_DEV 0x23 /* Disable external device */ +#define TP_TOGGLE_EXT_DEV 0x23 /* Toggle external device */ #define TP_MASK_EXT_DEV 0x02 #define TP_TOGGLE_DRIFT 0x23 /* Drift Correction */ #define TP_MASK_DRIFT 0x80 @@ -125,7 +125,7 @@ #define TP_DEF_MB 0x00 #define TP_DEF_PTSON 0x00 #define TP_DEF_SKIPBACK 0x00 -#define TP_DEF_EXT_DEV 0x00 /* 0 means enabled */ +#define TP_DEF_EXT_DEV 0x01 #define MAKE_PS2_CMD(params, results, cmd) ((params<<12) | (results<<8) | (cmd)) diff --git a/trunk/drivers/input/serio/Makefile b/trunk/drivers/input/serio/Makefile index 4155197867a3..678a8599f9ff 100644 --- a/trunk/drivers/input/serio/Makefile +++ b/trunk/drivers/input/serio/Makefile @@ -13,6 +13,7 @@ obj-$(CONFIG_SERIO_RPCKBD) += rpckbd.o obj-$(CONFIG_SERIO_SA1111) += sa1111ps2.o obj-$(CONFIG_SERIO_AMBAKMI) += ambakmi.o obj-$(CONFIG_SERIO_Q40KBD) += q40kbd.o +obj-$(CONFIG_SERIO_98KBD) += 98kbd-io.o obj-$(CONFIG_SERIO_GSCPS2) += gscps2.o obj-$(CONFIG_HP_SDC) += hp_sdc.o obj-$(CONFIG_HIL_MLC) += hp_sdc_mlc.o hil_mlc.o diff --git a/trunk/drivers/input/touchscreen/ads7846.c b/trunk/drivers/input/touchscreen/ads7846.c index 8c12a974b411..b45a45ca7cc9 100644 --- a/trunk/drivers/input/touchscreen/ads7846.c +++ b/trunk/drivers/input/touchscreen/ads7846.c @@ -48,13 +48,10 @@ #define TS_POLL_PERIOD msecs_to_jiffies(10) -/* this driver doesn't aim at the peak continuous sample rate */ -#define SAMPLE_BITS (8 /*cmd*/ + 16 /*sample*/ + 2 /* before, after */) - struct ts_event { /* For portability, we can't read 12 bit values using SPI (which * would make the controller deliver them as native byteorder u16 - * with msbs zeroed). Instead, we read them as two 8-bit values, + * with msbs zeroed). Instead, we read them as two 8-byte values, * which need byteswapping then range adjustment. */ __be16 x; @@ -63,7 +60,7 @@ struct ts_event { }; struct ads7846 { - struct input_dev *input; + struct input_dev input; char phys[32]; struct spi_device *spi; @@ -71,7 +68,6 @@ struct ads7846 { u16 vref_delay_usecs; u16 x_plate_ohms; - u8 read_x, read_y, read_z1, read_z2; struct ts_event tc; struct spi_transfer xfer[8]; @@ -121,10 +117,10 @@ struct ads7846 { #define READ_12BIT_DFR(x) (ADS_START | ADS_A2A1A0_d_ ## x \ | ADS_12_BIT | ADS_DFR) -#define READ_Y (READ_12BIT_DFR(y) | ADS_PD10_ADC_ON) -#define READ_Z1 (READ_12BIT_DFR(z1) | ADS_PD10_ADC_ON) -#define READ_Z2 (READ_12BIT_DFR(z2) | ADS_PD10_ADC_ON) -#define READ_X (READ_12BIT_DFR(x) | ADS_PD10_PDOWN) /* LAST */ +static const u8 read_y = READ_12BIT_DFR(y) | ADS_PD10_ADC_ON; +static const u8 read_z1 = READ_12BIT_DFR(z1) | ADS_PD10_ADC_ON; +static const u8 read_z2 = READ_12BIT_DFR(z2) | ADS_PD10_ADC_ON; +static const u8 read_x = READ_12BIT_DFR(x) | ADS_PD10_PDOWN; /* LAST */ /* single-ended samples need to first power up reference voltage; * we leave both ADC and VREF powered @@ -132,8 +128,8 @@ struct ads7846 { #define READ_12BIT_SER(x) (ADS_START | ADS_A2A1A0_ ## x \ | ADS_12_BIT | ADS_SER) -#define REF_ON (READ_12BIT_DFR(x) | ADS_PD10_ALL_ON) -#define REF_OFF (READ_12BIT_DFR(y) | ADS_PD10_PDOWN) +static const u8 ref_on = READ_12BIT_DFR(x) | ADS_PD10_ALL_ON; +static const u8 ref_off = READ_12BIT_DFR(y) | ADS_PD10_PDOWN; /*--------------------------------------------------------------------------*/ @@ -142,9 +138,7 @@ struct ads7846 { */ struct ser_req { - u8 ref_on; u8 command; - u8 ref_off; u16 scratch; __be16 sample; struct spi_message msg; @@ -158,7 +152,7 @@ static int ads7846_read12_ser(struct device *dev, unsigned command) struct ser_req *req = kzalloc(sizeof *req, SLAB_KERNEL); int status; int sample; - int i; + int i; if (!req) return -ENOMEM; @@ -166,8 +160,7 @@ static int ads7846_read12_ser(struct device *dev, unsigned command) INIT_LIST_HEAD(&req->msg.transfers); /* activate reference, so it has time to settle; */ - req->ref_on = REF_ON; - req->xfer[0].tx_buf = &req->ref_on; + req->xfer[0].tx_buf = &ref_on; req->xfer[0].len = 1; req->xfer[1].rx_buf = &req->scratch; req->xfer[1].len = 2; @@ -189,8 +182,7 @@ static int ads7846_read12_ser(struct device *dev, unsigned command) /* REVISIT: take a few more samples, and compare ... */ /* turn off reference */ - req->ref_off = REF_OFF; - req->xfer[4].tx_buf = &req->ref_off; + req->xfer[4].tx_buf = &ref_off; req->xfer[4].len = 1; req->xfer[5].rx_buf = &req->scratch; req->xfer[5].len = 2; @@ -244,12 +236,11 @@ SHOW(vbatt) static void ads7846_rx(void *ads) { - struct ads7846 *ts = ads; - struct input_dev *input_dev = ts->input; - unsigned Rt; - unsigned sync = 0; - u16 x, y, z1, z2; - unsigned long flags; + struct ads7846 *ts = ads; + unsigned Rt; + unsigned sync = 0; + u16 x, y, z1, z2; + unsigned long flags; /* adjust: 12 bit samples (left aligned), built from * two 8 bit values writen msb-first. @@ -285,21 +276,21 @@ static void ads7846_rx(void *ads) * won't notice that, even if nPENIRQ never fires ... */ if (!ts->pendown && Rt != 0) { - input_report_key(input_dev, BTN_TOUCH, 1); + input_report_key(&ts->input, BTN_TOUCH, 1); sync = 1; } else if (ts->pendown && Rt == 0) { - input_report_key(input_dev, BTN_TOUCH, 0); + input_report_key(&ts->input, BTN_TOUCH, 0); sync = 1; } if (Rt) { - input_report_abs(input_dev, ABS_X, x); - input_report_abs(input_dev, ABS_Y, y); - input_report_abs(input_dev, ABS_PRESSURE, Rt); + input_report_abs(&ts->input, ABS_X, x); + input_report_abs(&ts->input, ABS_Y, y); + input_report_abs(&ts->input, ABS_PRESSURE, Rt); sync = 1; } if (sync) - input_sync(input_dev); + input_sync(&ts->input); #ifdef VERBOSE if (Rt || ts->pendown) @@ -405,10 +396,9 @@ static int ads7846_resume(struct spi_device *spi) static int __devinit ads7846_probe(struct spi_device *spi) { struct ads7846 *ts; - struct input_dev *input_dev; struct ads7846_platform_data *pdata = spi->dev.platform_data; struct spi_transfer *x; - int err; + int i; if (!spi->irq) { dev_dbg(&spi->dev, "no IRQ?\n"); @@ -421,9 +411,9 @@ static int __devinit ads7846_probe(struct spi_device *spi) } /* don't exceed max specified sample rate */ - if (spi->max_speed_hz > (125000 * SAMPLE_BITS)) { + if (spi->max_speed_hz > (125000 * 16)) { dev_dbg(&spi->dev, "f(sample) %d KHz?\n", - (spi->max_speed_hz/SAMPLE_BITS)/1000); + (spi->max_speed_hz/16)/1000); return -EINVAL; } @@ -433,18 +423,13 @@ static int __devinit ads7846_probe(struct spi_device *spi) * to discard the four garbage LSBs. */ - ts = kzalloc(sizeof(struct ads7846), GFP_KERNEL); - input_dev = input_allocate_device(); - if (!ts || !input_dev) { - err = -ENOMEM; - goto err_free_mem; - } + if (!(ts = kzalloc(sizeof(struct ads7846), GFP_KERNEL))) + return -ENOMEM; dev_set_drvdata(&spi->dev, ts); - spi->dev.power.power_state = PMSG_ON; ts->spi = spi; - ts->input = input_dev; + spi->dev.power.power_state = PMSG_ON; init_timer(&ts->timer); ts->timer.data = (unsigned long) ts; @@ -454,80 +439,70 @@ static int __devinit ads7846_probe(struct spi_device *spi) ts->vref_delay_usecs = pdata->vref_delay_usecs ? : 100; ts->x_plate_ohms = pdata->x_plate_ohms ? : 400; - snprintf(ts->phys, sizeof(ts->phys), "%s/input0", spi->dev.bus_id); + init_input_dev(&ts->input); - input_dev->name = "ADS784x Touchscreen"; - input_dev->phys = ts->phys; - input_dev->cdev.dev = &spi->dev; + ts->input.dev = &spi->dev; + ts->input.name = "ADS784x Touchscreen"; + snprintf(ts->phys, sizeof ts->phys, "%s/input0", spi->dev.bus_id); + ts->input.phys = ts->phys; - input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_ABS); - input_dev->keybit[LONG(BTN_TOUCH)] = BIT(BTN_TOUCH); - input_set_abs_params(input_dev, ABS_X, + ts->input.evbit[0] = BIT(EV_KEY) | BIT(EV_ABS); + ts->input.keybit[LONG(BTN_TOUCH)] = BIT(BTN_TOUCH); + input_set_abs_params(&ts->input, ABS_X, pdata->x_min ? : 0, pdata->x_max ? : MAX_12BIT, 0, 0); - input_set_abs_params(input_dev, ABS_Y, + input_set_abs_params(&ts->input, ABS_Y, pdata->y_min ? : 0, pdata->y_max ? : MAX_12BIT, 0, 0); - input_set_abs_params(input_dev, ABS_PRESSURE, + input_set_abs_params(&ts->input, ABS_PRESSURE, pdata->pressure_min, pdata->pressure_max, 0, 0); + input_register_device(&ts->input); + /* set up the transfers to read touchscreen state; this assumes we * use formula #2 for pressure, not #3. */ - INIT_LIST_HEAD(&ts->msg.transfers); x = ts->xfer; /* y- still on; turn on only y+ (and ADC) */ - ts->read_y = READ_Y; - x->tx_buf = &ts->read_y; + x->tx_buf = &read_y; x->len = 1; - spi_message_add_tail(x, &ts->msg); - x++; x->rx_buf = &ts->tc.y; x->len = 2; - spi_message_add_tail(x, &ts->msg); + x++; /* turn y+ off, x- on; we'll use formula #2 */ if (ts->model == 7846) { - x++; - ts->read_z1 = READ_Z1; - x->tx_buf = &ts->read_z1; + x->tx_buf = &read_z1; x->len = 1; - spi_message_add_tail(x, &ts->msg); - x++; x->rx_buf = &ts->tc.z1; x->len = 2; - spi_message_add_tail(x, &ts->msg); - x++; - ts->read_z2 = READ_Z2; - x->tx_buf = &ts->read_z2; - x->len = 1; - spi_message_add_tail(x, &ts->msg); + x->tx_buf = &read_z2; + x->len = 1; x++; x->rx_buf = &ts->tc.z2; x->len = 2; - spi_message_add_tail(x, &ts->msg); + x++; } /* turn y- off, x+ on, then leave in lowpower */ - x++; - ts->read_x = READ_X; - x->tx_buf = &ts->read_x; + x->tx_buf = &read_x; x->len = 1; - spi_message_add_tail(x, &ts->msg); - x++; x->rx_buf = &ts->tc.x; x->len = 2; - CS_CHANGE(*x); - spi_message_add_tail(x, &ts->msg); + x++; + + CS_CHANGE(x[-1]); + for (i = 0; i < x - ts->xfer; i++) + spi_message_add_tail(&ts->xfer[i], &ts->msg); ts->msg.complete = ads7846_rx; ts->msg.context = ts; @@ -535,8 +510,9 @@ static int __devinit ads7846_probe(struct spi_device *spi) SA_SAMPLE_RANDOM | SA_TRIGGER_FALLING, spi->dev.bus_id, ts)) { dev_dbg(&spi->dev, "irq %d busy?\n", spi->irq); - err = -EBUSY; - goto err_free_mem; + input_unregister_device(&ts->input); + kfree(ts); + return -EBUSY; } dev_info(&spi->dev, "touchscreen, irq %d\n", spi->irq); @@ -558,18 +534,7 @@ static int __devinit ads7846_probe(struct spi_device *spi) device_create_file(&spi->dev, &dev_attr_vbatt); device_create_file(&spi->dev, &dev_attr_vaux); - err = input_register_device(input_dev); - if (err) - goto err_free_irq; - return 0; - - err_free_irq: - free_irq(spi->irq, ts); - err_free_mem: - input_free_device(input_dev); - kfree(ts); - return err; } static int __devexit ads7846_remove(struct spi_device *spi) @@ -589,7 +554,7 @@ static int __devexit ads7846_remove(struct spi_device *spi) device_remove_file(&spi->dev, &dev_attr_vbatt); device_remove_file(&spi->dev, &dev_attr_vaux); - input_unregister_device(ts->input); + input_unregister_device(&ts->input); kfree(ts); dev_dbg(&spi->dev, "unregistered touchscreen\n"); diff --git a/trunk/drivers/message/fusion/mptbase.c b/trunk/drivers/message/fusion/mptbase.c index 642a61b6d0a4..9a2c7605d49c 100644 --- a/trunk/drivers/message/fusion/mptbase.c +++ b/trunk/drivers/message/fusion/mptbase.c @@ -452,7 +452,8 @@ mpt_base_reply(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *reply) } else if (func == MPI_FUNCTION_EVENT_ACK) { dprintk((MYIOC_s_INFO_FMT "mpt_base_reply, EventAck reply received\n", ioc->name)); - } else if (func == MPI_FUNCTION_CONFIG) { + } else if (func == MPI_FUNCTION_CONFIG || + func == MPI_FUNCTION_TOOLBOX) { CONFIGPARMS *pCfg; unsigned long flags; @@ -5325,6 +5326,115 @@ mpt_config(MPT_ADAPTER *ioc, CONFIGPARMS *pCfg) return rc; } +/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ +/** + * mpt_toolbox - Generic function to issue toolbox message + * @ioc - Pointer to an adapter structure + * @cfg - Pointer to a toolbox structure. Struct contains + * action, page address, direction, physical address + * and pointer to a configuration page header + * Page header is updated. + * + * Returns 0 for success + * -EPERM if not allowed due to ISR context + * -EAGAIN if no msg frames currently available + * -EFAULT for non-successful reply or no reply (timeout) + */ +int +mpt_toolbox(MPT_ADAPTER *ioc, CONFIGPARMS *pCfg) +{ + ToolboxIstwiReadWriteRequest_t *pReq; + MPT_FRAME_HDR *mf; + struct pci_dev *pdev; + unsigned long flags; + int rc; + u32 flagsLength; + int in_isr; + + /* Prevent calling wait_event() (below), if caller happens + * to be in ISR context, because that is fatal! + */ + in_isr = in_interrupt(); + if (in_isr) { + dcprintk((MYIOC_s_WARN_FMT "toobox request not allowed in ISR context!\n", + ioc->name)); + return -EPERM; + } + + /* Get and Populate a free Frame + */ + if ((mf = mpt_get_msg_frame(mpt_base_index, ioc)) == NULL) { + dcprintk((MYIOC_s_WARN_FMT "mpt_toolbox: no msg frames!\n", + ioc->name)); + return -EAGAIN; + } + pReq = (ToolboxIstwiReadWriteRequest_t *)mf; + pReq->Tool = pCfg->action; + pReq->Reserved = 0; + pReq->ChainOffset = 0; + pReq->Function = MPI_FUNCTION_TOOLBOX; + pReq->Reserved1 = 0; + pReq->Reserved2 = 0; + pReq->MsgFlags = 0; + pReq->Flags = pCfg->dir; + pReq->BusNum = 0; + pReq->Reserved3 = 0; + pReq->NumAddressBytes = 0x01; + pReq->Reserved4 = 0; + pReq->DataLength = cpu_to_le16(0x04); + pdev = ioc->pcidev; + if (pdev->devfn & 1) + pReq->DeviceAddr = 0xB2; + else + pReq->DeviceAddr = 0xB0; + pReq->Addr1 = 0; + pReq->Addr2 = 0; + pReq->Addr3 = 0; + pReq->Reserved5 = 0; + + /* Add a SGE to the config request. + */ + + flagsLength = MPT_SGE_FLAGS_SSIMPLE_READ | 4; + + mpt_add_sge((char *)&pReq->SGL, flagsLength, pCfg->physAddr); + + dcprintk((MYIOC_s_INFO_FMT "Sending Toolbox request, Tool=%x\n", + ioc->name, pReq->Tool)); + + /* Append pCfg pointer to end of mf + */ + *((void **) (((u8 *) mf) + (ioc->req_sz - sizeof(void *)))) = (void *) pCfg; + + /* Initalize the timer + */ + init_timer(&pCfg->timer); + pCfg->timer.data = (unsigned long) ioc; + pCfg->timer.function = mpt_timer_expired; + pCfg->wait_done = 0; + + /* Set the timer; ensure 10 second minimum */ + if (pCfg->timeout < 10) + pCfg->timer.expires = jiffies + HZ*10; + else + pCfg->timer.expires = jiffies + HZ*pCfg->timeout; + + /* Add to end of Q, set timer and then issue this command */ + spin_lock_irqsave(&ioc->FreeQlock, flags); + list_add_tail(&pCfg->linkage, &ioc->configQ); + spin_unlock_irqrestore(&ioc->FreeQlock, flags); + + add_timer(&pCfg->timer); + mpt_put_msg_frame(mpt_base_index, ioc, mf); + wait_event(mpt_waitq, pCfg->wait_done); + + /* mf has been freed - do not access */ + + rc = pCfg->status; + + return rc; +} + /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ /* * mpt_timer_expired - Call back for timer process. @@ -6032,7 +6142,7 @@ ProcessEventNotification(MPT_ADAPTER *ioc, EventNotificationReply_t *pEventReply if (ioc->events && (ioc->eventTypes & ( 1 << event))) { int idx; - idx = ioc->eventContext % MPTCTL_EVENT_LOG_SIZE; + idx = ioc->eventContext % ioc->eventLogSize; ioc->events[idx].event = event; ioc->events[idx].eventContext = ioc->eventContext; @@ -6430,6 +6540,7 @@ EXPORT_SYMBOL(mpt_lan_index); EXPORT_SYMBOL(mpt_stm_index); EXPORT_SYMBOL(mpt_HardResetHandler); EXPORT_SYMBOL(mpt_config); +EXPORT_SYMBOL(mpt_toolbox); EXPORT_SYMBOL(mpt_findImVolumes); EXPORT_SYMBOL(mpt_read_ioc_pg_3); EXPORT_SYMBOL(mpt_alloc_fw_memory); diff --git a/trunk/drivers/message/fusion/mptbase.h b/trunk/drivers/message/fusion/mptbase.h index 723d54300953..ea2649ecad1f 100644 --- a/trunk/drivers/message/fusion/mptbase.h +++ b/trunk/drivers/message/fusion/mptbase.h @@ -616,7 +616,6 @@ typedef struct _MPT_ADAPTER * increments by 32 bytes */ int errata_flag_1064; - int aen_event_read_flag; /* flag to indicate event log was read*/ u8 FirstWhoInit; u8 upload_fw; /* If set, do a fw upload */ u8 reload_fw; /* Force a FW Reload on next reset */ @@ -1027,6 +1026,7 @@ extern u32 mpt_GetIocState(MPT_ADAPTER *ioc, int cooked); extern void mpt_print_ioc_summary(MPT_ADAPTER *ioc, char *buf, int *size, int len, int showlan); extern int mpt_HardResetHandler(MPT_ADAPTER *ioc, int sleepFlag); extern int mpt_config(MPT_ADAPTER *ioc, CONFIGPARMS *cfg); +extern int mpt_toolbox(MPT_ADAPTER *ioc, CONFIGPARMS *cfg); extern void mpt_alloc_fw_memory(MPT_ADAPTER *ioc, int size); extern void mpt_free_fw_memory(MPT_ADAPTER *ioc); extern int mpt_findImVolumes(MPT_ADAPTER *ioc); diff --git a/trunk/drivers/message/fusion/mptctl.c b/trunk/drivers/message/fusion/mptctl.c index 9b64e07400da..bdf709987982 100644 --- a/trunk/drivers/message/fusion/mptctl.c +++ b/trunk/drivers/message/fusion/mptctl.c @@ -136,12 +136,6 @@ static void mptctl_free_tm_flags(MPT_ADAPTER *ioc); */ static int mptctl_ioc_reset(MPT_ADAPTER *ioc, int reset_phase); -/* - * Event Handler function - */ -static int mptctl_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply); -struct fasync_struct *async_queue=NULL; - /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ /* * Scatter gather list (SGL) sizes and limits... @@ -391,18 +385,18 @@ static int mptctl_bus_reset(MPT_IOCTL *ioctl) } /* Now wait for the command to complete */ - ii = wait_event_timeout(mptctl_wait, + ii = wait_event_interruptible_timeout(mptctl_wait, ioctl->wait_done == 1, HZ*5 /* 5 second timeout */); if(ii <=0 && (ioctl->wait_done != 1 )) { - mpt_free_msg_frame(hd->ioc, mf); ioctl->wait_done = 0; retval = -1; /* return failure */ } mptctl_bus_reset_done: + mpt_free_msg_frame(hd->ioc, mf); mptctl_free_tm_flags(ioctl->ioc); return retval; } @@ -477,69 +471,6 @@ mptctl_ioc_reset(MPT_ADAPTER *ioc, int reset_phase) return 1; } -/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ -/* ASYNC Event Notification Support */ -static int -mptctl_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply) -{ - u8 event; - - event = le32_to_cpu(pEvReply->Event) & 0xFF; - - dctlprintk(("%s() called\n", __FUNCTION__)); - if(async_queue == NULL) - return 1; - - /* Raise SIGIO for persistent events. - * TODO - this define is not in MPI spec yet, - * but they plan to set it to 0x21 - */ - if (event == 0x21 ) { - ioc->aen_event_read_flag=1; - dctlprintk(("Raised SIGIO to application\n")); - devtprintk(("Raised SIGIO to application\n")); - kill_fasync(&async_queue, SIGIO, POLL_IN); - return 1; - } - - /* This flag is set after SIGIO was raised, and - * remains set until the application has read - * the event log via ioctl=MPTEVENTREPORT - */ - if(ioc->aen_event_read_flag) - return 1; - - /* Signal only for the events that are - * requested for by the application - */ - if (ioc->events && (ioc->eventTypes & ( 1 << event))) { - ioc->aen_event_read_flag=1; - dctlprintk(("Raised SIGIO to application\n")); - devtprintk(("Raised SIGIO to application\n")); - kill_fasync(&async_queue, SIGIO, POLL_IN); - } - return 1; -} - -static int -mptctl_fasync(int fd, struct file *filep, int mode) -{ - MPT_ADAPTER *ioc; - - list_for_each_entry(ioc, &ioc_list, list) - ioc->aen_event_read_flag=0; - - dctlprintk(("%s() called\n", __FUNCTION__)); - return fasync_helper(fd, filep, mode, &async_queue); -} - -static int -mptctl_release(struct inode *inode, struct file *filep) -{ - dctlprintk(("%s() called\n", __FUNCTION__)); - return fasync_helper(-1, filep, 0, &async_queue); -} - /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ /* * MPT ioctl handler @@ -743,23 +674,22 @@ mptctl_do_fw_download(int ioc, char __user *ufwbuf, size_t fwlen) u16 iocstat; pFWDownloadReply_t ReplyMsg = NULL; - dctlprintk(("mptctl_do_fwdl called. mptctl_id = %xh.\n", mptctl_id)); + dctlprintk((KERN_INFO "mptctl_do_fwdl called. mptctl_id = %xh.\n", mptctl_id)); - dctlprintk(("DbG: kfwdl.bufp = %p\n", ufwbuf)); - dctlprintk(("DbG: kfwdl.fwlen = %d\n", (int)fwlen)); - dctlprintk(("DbG: kfwdl.ioc = %04xh\n", ioc)); + dctlprintk((KERN_INFO "DbG: kfwdl.bufp = %p\n", ufwbuf)); + dctlprintk((KERN_INFO "DbG: kfwdl.fwlen = %d\n", (int)fwlen)); + dctlprintk((KERN_INFO "DbG: kfwdl.ioc = %04xh\n", ioc)); - if (mpt_verify_adapter(ioc, &iocp) < 0) { - dctlprintk(("ioctl_fwdl - ioc%d not found!\n", - ioc)); + if ((ioc = mpt_verify_adapter(ioc, &iocp)) < 0) { + dctlprintk(("%s@%d::_ioctl_fwdl - ioc%d not found!\n", + __FILE__, __LINE__, ioc)); return -ENODEV; /* (-6) No such device or address */ - } else { - - /* Valid device. Get a message frame and construct the FW download message. - */ - if ((mf = mpt_get_msg_frame(mptctl_id, iocp)) == NULL) - return -EAGAIN; } + + /* Valid device. Get a message frame and construct the FW download message. + */ + if ((mf = mpt_get_msg_frame(mptctl_id, iocp)) == NULL) + return -EAGAIN; dlmsg = (FWDownload_t*) mf; ptsge = (FWDownloadTCSGE_t *) &dlmsg->SGL; sgOut = (char *) (ptsge + 1); @@ -772,11 +702,7 @@ mptctl_do_fw_download(int ioc, char __user *ufwbuf, size_t fwlen) dlmsg->ChainOffset = 0; dlmsg->Function = MPI_FUNCTION_FW_DOWNLOAD; dlmsg->Reserved1[0] = dlmsg->Reserved1[1] = dlmsg->Reserved1[2] = 0; - if (iocp->facts.MsgVersion >= MPI_VERSION_01_05) - dlmsg->MsgFlags = MPI_FW_DOWNLOAD_MSGFLGS_LAST_SEGMENT; - else - dlmsg->MsgFlags = 0; - + dlmsg->MsgFlags = 0; /* Set up the Transaction SGE. */ @@ -828,7 +754,7 @@ mptctl_do_fw_download(int ioc, char __user *ufwbuf, size_t fwlen) goto fwdl_out; } - dctlprintk(("DbG: sgl buffer = %p, sgfrags = %d\n", sgl, numfrags)); + dctlprintk((KERN_INFO "DbG: sgl buffer = %p, sgfrags = %d\n", sgl, numfrags)); /* * Parse SG list, copying sgl itself, @@ -877,11 +803,11 @@ mptctl_do_fw_download(int ioc, char __user *ufwbuf, size_t fwlen) /* * Finally, perform firmware download. */ - ReplyMsg = NULL; + iocp->ioctl->wait_done = 0; mpt_put_msg_frame(mptctl_id, iocp, mf); /* Now wait for the command to complete */ - ret = wait_event_timeout(mptctl_wait, + ret = wait_event_interruptible_timeout(mptctl_wait, iocp->ioctl->wait_done == 1, HZ*60); @@ -1219,9 +1145,7 @@ mptctl_getiocinfo (unsigned long arg, unsigned int data_size) /* Fill in the data and return the structure to the calling * program */ - if (ioc->bus_type == SAS) - karg->adapterType = MPT_IOCTL_INTERFACE_SAS; - else if (ioc->bus_type == FC) + if (ioc->bus_type == FC) karg->adapterType = MPT_IOCTL_INTERFACE_FC; else karg->adapterType = MPT_IOCTL_INTERFACE_SCSI; @@ -1246,11 +1170,12 @@ mptctl_getiocinfo (unsigned long arg, unsigned int data_size) karg->pciInfo.u.bits.deviceNumber = PCI_SLOT( pdev->devfn ); karg->pciInfo.u.bits.functionNumber = PCI_FUNC( pdev->devfn ); } else if (cim_rev == 2) { - /* Get the PCI bus, device, function and segment ID numbers + /* Get the PCI bus, device, function and segment ID numbers for the IOC */ karg->pciInfo.u.bits.busNumber = pdev->bus->number; karg->pciInfo.u.bits.deviceNumber = PCI_SLOT( pdev->devfn ); karg->pciInfo.u.bits.functionNumber = PCI_FUNC( pdev->devfn ); + karg->pciInfo.u.bits.functionNumber = PCI_FUNC( pdev->devfn ); karg->pciInfo.segmentID = pci_domain_nr(pdev->bus); } @@ -1575,7 +1500,7 @@ mptctl_eventquery (unsigned long arg) return -ENODEV; } - karg.eventEntries = MPTCTL_EVENT_LOG_SIZE; + karg.eventEntries = ioc->eventLogSize; karg.eventTypes = ioc->eventTypes; /* Copy the data from kernel memory to user memory @@ -1625,6 +1550,7 @@ mptctl_eventenable (unsigned long arg) memset(ioc->events, 0, sz); ioc->alloc_total += sz; + ioc->eventLogSize = MPTCTL_EVENT_LOG_SIZE; ioc->eventContext = 0; } @@ -1664,7 +1590,7 @@ mptctl_eventreport (unsigned long arg) maxEvents = numBytes/sizeof(MPT_IOCTL_EVENTS); - max = MPTCTL_EVENT_LOG_SIZE < maxEvents ? MPTCTL_EVENT_LOG_SIZE : maxEvents; + max = ioc->eventLogSize < maxEvents ? ioc->eventLogSize : maxEvents; /* If fewer than 1 event is requested, there must have * been some type of error. @@ -1672,9 +1598,6 @@ mptctl_eventreport (unsigned long arg) if ((max < 1) || !ioc->events) return -ENODATA; - /* reset this flag so SIGIO can restart */ - ioc->aen_event_read_flag=0; - /* Copy the data from kernel memory to user memory */ numBytes = max * sizeof(MPT_IOCTL_EVENTS); @@ -1894,8 +1817,6 @@ mptctl_do_mpt_command (struct mpt_ioctl_command karg, void __user *mfPtr) case MPI_FUNCTION_SCSI_ENCLOSURE_PROCESSOR: case MPI_FUNCTION_FW_DOWNLOAD: case MPI_FUNCTION_FC_PRIMITIVE_SEND: - case MPI_FUNCTION_TOOLBOX: - case MPI_FUNCTION_SAS_IO_UNIT_CONTROL: break; case MPI_FUNCTION_SCSI_IO_REQUEST: @@ -1916,9 +1837,7 @@ mptctl_do_mpt_command (struct mpt_ioctl_command karg, void __user *mfPtr) goto done_free_mem; } - pScsiReq->MsgFlags &= ~MPI_SCSIIO_MSGFLGS_SENSE_WIDTH; - pScsiReq->MsgFlags |= mpt_msg_flags(); - + pScsiReq->MsgFlags = mpt_msg_flags(); /* verify that app has not requested * more sense data than driver @@ -1969,25 +1888,6 @@ mptctl_do_mpt_command (struct mpt_ioctl_command karg, void __user *mfPtr) } break; - case MPI_FUNCTION_SMP_PASSTHROUGH: - /* Check mf->PassthruFlags to determine if - * transfer is ImmediateMode or not. - * Immediate mode returns data in the ReplyFrame. - * Else, we are sending request and response data - * in two SGLs at the end of the mf. - */ - break; - - case MPI_FUNCTION_SATA_PASSTHROUGH: - if (!ioc->sh) { - printk(KERN_ERR "%s@%d::mptctl_do_mpt_command - " - "SCSI driver is not loaded. \n", - __FILE__, __LINE__); - rc = -EFAULT; - goto done_free_mem; - } - break; - case MPI_FUNCTION_RAID_ACTION: /* Just add a SGE */ @@ -2000,9 +1900,7 @@ mptctl_do_mpt_command (struct mpt_ioctl_command karg, void __user *mfPtr) int scsidir = MPI_SCSIIO_CONTROL_READ; int dataSize; - pScsiReq->MsgFlags &= ~MPI_SCSIIO_MSGFLGS_SENSE_WIDTH; - pScsiReq->MsgFlags |= mpt_msg_flags(); - + pScsiReq->MsgFlags = mpt_msg_flags(); /* verify that app has not requested * more sense data than driver @@ -2232,7 +2130,7 @@ mptctl_do_mpt_command (struct mpt_ioctl_command karg, void __user *mfPtr) /* Now wait for the command to complete */ timeout = (karg.timeout > 0) ? karg.timeout : MPT_IOCTL_DEFAULT_TIMEOUT; - timeout = wait_event_timeout(mptctl_wait, + timeout = wait_event_interruptible_timeout(mptctl_wait, ioc->ioctl->wait_done == 1, HZ*timeout); @@ -2348,16 +2246,13 @@ mptctl_hp_hostinfo(unsigned long arg, unsigned int data_size) hp_host_info_t __user *uarg = (void __user *) arg; MPT_ADAPTER *ioc; struct pci_dev *pdev; - char *pbuf=NULL; + char *pbuf; dma_addr_t buf_dma; hp_host_info_t karg; CONFIGPARMS cfg; ConfigPageHeader_t hdr; int iocnum; int rc, cim_rev; - ToolboxIstwiReadWriteRequest_t *IstwiRWRequest; - MPT_FRAME_HDR *mf = NULL; - MPIHeader_t *mpi_hdr; dctlprintk((": mptctl_hp_hostinfo called.\n")); /* Reset long to int. Should affect IA64 and SPARC only @@ -2475,7 +2370,7 @@ mptctl_hp_hostinfo(unsigned long arg, unsigned int data_size) karg.base_io_addr = pci_resource_start(pdev, 0); - if ((ioc->bus_type == SAS) || (ioc->bus_type == FC)) + if (ioc->bus_type == FC) karg.bus_phys_width = HP_BUS_WIDTH_UNK; else karg.bus_phys_width = HP_BUS_WIDTH_16; @@ -2493,66 +2388,19 @@ mptctl_hp_hostinfo(unsigned long arg, unsigned int data_size) } } - /* - * Gather ISTWI(Industry Standard Two Wire Interface) Data - */ - if ((mf = mpt_get_msg_frame(mptctl_id, ioc)) == NULL) { - dfailprintk((MYIOC_s_WARN_FMT "%s, no msg frames!!\n", - ioc->name,__FUNCTION__)); - goto out; - } - - IstwiRWRequest = (ToolboxIstwiReadWriteRequest_t *)mf; - mpi_hdr = (MPIHeader_t *) mf; - memset(IstwiRWRequest,0,sizeof(ToolboxIstwiReadWriteRequest_t)); - IstwiRWRequest->Function = MPI_FUNCTION_TOOLBOX; - IstwiRWRequest->Tool = MPI_TOOLBOX_ISTWI_READ_WRITE_TOOL; - IstwiRWRequest->MsgContext = mpi_hdr->MsgContext; - IstwiRWRequest->Flags = MPI_TB_ISTWI_FLAGS_READ; - IstwiRWRequest->NumAddressBytes = 0x01; - IstwiRWRequest->DataLength = cpu_to_le16(0x04); - if (pdev->devfn & 1) - IstwiRWRequest->DeviceAddr = 0xB2; - else - IstwiRWRequest->DeviceAddr = 0xB0; - + cfg.pageAddr = 0; + cfg.action = MPI_TOOLBOX_ISTWI_READ_WRITE_TOOL; + cfg.dir = MPI_TB_ISTWI_FLAGS_READ; + cfg.timeout = 10; pbuf = pci_alloc_consistent(ioc->pcidev, 4, &buf_dma); - if (!pbuf) - goto out; - mpt_add_sge((char *)&IstwiRWRequest->SGL, - (MPT_SGE_FLAGS_SSIMPLE_READ|4), buf_dma); - - ioc->ioctl->wait_done = 0; - mpt_put_msg_frame(mptctl_id, ioc, mf); - - rc = wait_event_timeout(mptctl_wait, - ioc->ioctl->wait_done == 1, - HZ*MPT_IOCTL_DEFAULT_TIMEOUT /* 10 sec */); - - if(rc <=0 && (ioc->ioctl->wait_done != 1 )) { - /* - * Now we need to reset the board - */ - mpt_free_msg_frame(ioc, mf); - mptctl_timeout_expired(ioc->ioctl); - goto out; - } - - /* - *ISTWI Data Definition - * pbuf[0] = FW_VERSION = 0x4 - * pbuf[1] = Bay Count = 6 or 4 or 2, depending on - * the config, you should be seeing one out of these three values - * pbuf[2] = Drive Installed Map = bit pattern depend on which - * bays have drives in them - * pbuf[3] = Checksum (0x100 = (byte0 + byte2 + byte3) - */ - if (ioc->ioctl->status & MPT_IOCTL_STATUS_RF_VALID) - karg.rsvd = *(u32 *)pbuf; - - out: - if (pbuf) + if (pbuf) { + cfg.physAddr = buf_dma; + if ((mpt_toolbox(ioc, &cfg)) == 0) { + karg.rsvd = *(u32 *)pbuf; + } pci_free_consistent(ioc->pcidev, 4, pbuf, buf_dma); + pbuf = NULL; + } /* Copy the data from kernel memory to user memory */ @@ -2611,7 +2459,7 @@ mptctl_hp_targetinfo(unsigned long arg) /* There is nothing to do for FCP parts. */ - if ((ioc->bus_type == SAS) || (ioc->bus_type == FC)) + if (ioc->bus_type == FC) return 0; if ((ioc->spi_data.sdp0length == 0) || (ioc->sh == NULL)) @@ -2721,8 +2569,6 @@ mptctl_hp_targetinfo(unsigned long arg) static struct file_operations mptctl_fops = { .owner = THIS_MODULE, .llseek = no_llseek, - .release = mptctl_release, - .fasync = mptctl_fasync, .unlocked_ioctl = mptctl_ioctl, #ifdef CONFIG_COMPAT .compat_ioctl = compat_mpctl_ioctl, @@ -2967,11 +2813,6 @@ static int __init mptctl_init(void) /* FIXME! */ } - if (mpt_event_register(mptctl_id, mptctl_event_process) == 0) { - devtprintk((KERN_INFO MYNAM - ": Registered for IOC event notifications\n")); - } - return 0; out_fail: diff --git a/trunk/drivers/message/fusion/mptctl.h b/trunk/drivers/message/fusion/mptctl.h index a2f8a97992e6..518996e03481 100644 --- a/trunk/drivers/message/fusion/mptctl.h +++ b/trunk/drivers/message/fusion/mptctl.h @@ -169,10 +169,8 @@ struct mpt_ioctl_pci_info2 { * Read only. * Data starts at offset 0xC */ -#define MPT_IOCTL_INTERFACE_SCSI (0x00) #define MPT_IOCTL_INTERFACE_FC (0x01) -#define MPT_IOCTL_INTERFACE_FC_IP (0x02) -#define MPT_IOCTL_INTERFACE_SAS (0x03) +#define MPT_IOCTL_INTERFACE_SCSI (0x00) #define MPT_IOCTL_VERSION_LENGTH (32) struct mpt_ioctl_iocinfo { diff --git a/trunk/drivers/message/fusion/mptscsih.c b/trunk/drivers/message/fusion/mptscsih.c index 4fee6befc93d..05789e505464 100644 --- a/trunk/drivers/message/fusion/mptscsih.c +++ b/trunk/drivers/message/fusion/mptscsih.c @@ -2489,7 +2489,7 @@ mptscsih_copy_sense_data(struct scsi_cmnd *sc, MPT_SCSI_HOST *hd, MPT_FRAME_HDR int idx; MPT_ADAPTER *ioc = hd->ioc; - idx = ioc->eventContext % MPTCTL_EVENT_LOG_SIZE; + idx = ioc->eventContext % ioc->eventLogSize; ioc->events[idx].event = MPI_EVENT_SCSI_DEVICE_STATUS_CHANGE; ioc->events[idx].eventContext = ioc->eventContext; diff --git a/trunk/drivers/mmc/mmci.c b/trunk/drivers/mmc/mmci.c index 9fef29d978b5..37ee7f8dc82f 100644 --- a/trunk/drivers/mmc/mmci.c +++ b/trunk/drivers/mmc/mmci.c @@ -97,13 +97,6 @@ static void mmci_start_data(struct mmci_host *host, struct mmc_data *data) if (data->flags & MMC_DATA_READ) { datactrl |= MCI_DPSM_DIRECTION; irqmask = MCI_RXFIFOHALFFULLMASK; - - /* - * If we have less than a FIFOSIZE of bytes to transfer, - * trigger a PIO interrupt as soon as any data is available. - */ - if (host->size < MCI_FIFOSIZE) - irqmask |= MCI_RXDATAAVLBLMASK; } else { /* * We don't actually need to include "FIFO empty" here diff --git a/trunk/drivers/s390/scsi/zfcp_dbf.c b/trunk/drivers/s390/scsi/zfcp_dbf.c index a5f2ba9a8fdb..4d7d47cf2394 100644 --- a/trunk/drivers/s390/scsi/zfcp_dbf.c +++ b/trunk/drivers/s390/scsi/zfcp_dbf.c @@ -710,9 +710,10 @@ static inline void _zfcp_scsi_dbf_event_common(const char *tag, const char *tag2, int level, struct zfcp_adapter *adapter, struct scsi_cmnd *scsi_cmnd, - struct zfcp_fsf_req *fsf_req, - struct zfcp_fsf_req *old_fsf_req) + struct zfcp_fsf_req *new_fsf_req) { + struct zfcp_fsf_req *fsf_req = + (struct zfcp_fsf_req *)scsi_cmnd->host_scribble; struct zfcp_scsi_dbf_record *rec = &adapter->scsi_dbf_buf; struct zfcp_dbf_dump *dump = (struct zfcp_dbf_dump *)rec; unsigned long flags; @@ -726,20 +727,19 @@ _zfcp_scsi_dbf_event_common(const char *tag, const char *tag2, int level, if (offset == 0) { strncpy(rec->tag, tag, ZFCP_DBF_TAG_SIZE); strncpy(rec->tag2, tag2, ZFCP_DBF_TAG_SIZE); - if (scsi_cmnd != NULL) { - if (scsi_cmnd->device) { - rec->scsi_id = scsi_cmnd->device->id; - rec->scsi_lun = scsi_cmnd->device->lun; - } - rec->scsi_result = scsi_cmnd->result; - rec->scsi_cmnd = (unsigned long)scsi_cmnd; - rec->scsi_serial = scsi_cmnd->serial_number; - memcpy(rec->scsi_opcode, &scsi_cmnd->cmnd, - min((int)scsi_cmnd->cmd_len, - ZFCP_DBF_SCSI_OPCODE)); - rec->scsi_retries = scsi_cmnd->retries; - rec->scsi_allowed = scsi_cmnd->allowed; + if (scsi_cmnd->device) { + rec->scsi_id = scsi_cmnd->device->id; + rec->scsi_lun = scsi_cmnd->device->lun; } + rec->scsi_result = scsi_cmnd->result; + rec->scsi_cmnd = (unsigned long)scsi_cmnd; + rec->scsi_serial = scsi_cmnd->serial_number; + memcpy(rec->scsi_opcode, + &scsi_cmnd->cmnd, + min((int)scsi_cmnd->cmd_len, + ZFCP_DBF_SCSI_OPCODE)); + rec->scsi_retries = scsi_cmnd->retries; + rec->scsi_allowed = scsi_cmnd->allowed; if (fsf_req != NULL) { fcp_rsp = (struct fcp_rsp_iu *) &(fsf_req->qtcb->bottom.io.fcp_rsp); @@ -772,8 +772,15 @@ _zfcp_scsi_dbf_event_common(const char *tag, const char *tag2, int level, rec->fsf_seqno = fsf_req->seq_no; rec->fsf_issued = fsf_req->issued; } - rec->type.old_fsf_reqid = - (unsigned long) old_fsf_req; + if (new_fsf_req != NULL) { + rec->type.new_fsf_req.fsf_reqid = + (unsigned long) + new_fsf_req; + rec->type.new_fsf_req.fsf_seqno = + new_fsf_req->seq_no; + rec->type.new_fsf_req.fsf_issued = + new_fsf_req->issued; + } } else { strncpy(dump->tag, "dump", ZFCP_DBF_TAG_SIZE); dump->total_size = buflen; @@ -794,21 +801,19 @@ _zfcp_scsi_dbf_event_common(const char *tag, const char *tag2, int level, inline void zfcp_scsi_dbf_event_result(const char *tag, int level, struct zfcp_adapter *adapter, - struct scsi_cmnd *scsi_cmnd, - struct zfcp_fsf_req *fsf_req) + struct scsi_cmnd *scsi_cmnd) { - _zfcp_scsi_dbf_event_common("rslt", tag, level, - adapter, scsi_cmnd, fsf_req, NULL); + _zfcp_scsi_dbf_event_common("rslt", + tag, level, adapter, scsi_cmnd, NULL); } inline void zfcp_scsi_dbf_event_abort(const char *tag, struct zfcp_adapter *adapter, struct scsi_cmnd *scsi_cmnd, - struct zfcp_fsf_req *new_fsf_req, - struct zfcp_fsf_req *old_fsf_req) + struct zfcp_fsf_req *new_fsf_req) { - _zfcp_scsi_dbf_event_common("abrt", tag, 1, - adapter, scsi_cmnd, new_fsf_req, old_fsf_req); + _zfcp_scsi_dbf_event_common("abrt", + tag, 1, adapter, scsi_cmnd, new_fsf_req); } inline void @@ -818,7 +823,7 @@ zfcp_scsi_dbf_event_devreset(const char *tag, u8 flag, struct zfcp_unit *unit, struct zfcp_adapter *adapter = unit->port->adapter; _zfcp_scsi_dbf_event_common(flag == FCP_TARGET_RESET ? "trst" : "lrst", - tag, 1, adapter, scsi_cmnd, NULL, NULL); + tag, 1, adapter, scsi_cmnd, NULL); } static int @@ -851,10 +856,6 @@ zfcp_scsi_dbf_view_format(debug_info_t * id, struct debug_view *view, rec->scsi_retries); len += zfcp_dbf_view(out_buf + len, "scsi_allowed", "0x%02x", rec->scsi_allowed); - if (strncmp(rec->tag, "abrt", ZFCP_DBF_TAG_SIZE) == 0) { - len += zfcp_dbf_view(out_buf + len, "old_fsf_reqid", "0x%0Lx", - rec->type.old_fsf_reqid); - } len += zfcp_dbf_view(out_buf + len, "fsf_reqid", "0x%0Lx", rec->fsf_reqid); len += zfcp_dbf_view(out_buf + len, "fsf_seqno", "0x%08x", @@ -882,6 +883,21 @@ zfcp_scsi_dbf_view_format(debug_info_t * id, struct debug_view *view, min((int)rec->type.fcp.sns_info_len, ZFCP_DBF_SCSI_FCP_SNS_INFO), 0, rec->type.fcp.sns_info_len); + } else if (strncmp(rec->tag, "abrt", ZFCP_DBF_TAG_SIZE) == 0) { + len += zfcp_dbf_view(out_buf + len, "fsf_reqid_abort", "0x%0Lx", + rec->type.new_fsf_req.fsf_reqid); + len += zfcp_dbf_view(out_buf + len, "fsf_seqno_abort", "0x%08x", + rec->type.new_fsf_req.fsf_seqno); + len += zfcp_dbf_stck(out_buf + len, "fsf_issued", + rec->type.new_fsf_req.fsf_issued); + } else if ((strncmp(rec->tag, "trst", ZFCP_DBF_TAG_SIZE) == 0) || + (strncmp(rec->tag, "lrst", ZFCP_DBF_TAG_SIZE) == 0)) { + len += zfcp_dbf_view(out_buf + len, "fsf_reqid_reset", "0x%0Lx", + rec->type.new_fsf_req.fsf_reqid); + len += zfcp_dbf_view(out_buf + len, "fsf_seqno_reset", "0x%08x", + rec->type.new_fsf_req.fsf_seqno); + len += zfcp_dbf_stck(out_buf + len, "fsf_issued", + rec->type.new_fsf_req.fsf_issued); } len += sprintf(out_buf + len, "\n"); diff --git a/trunk/drivers/s390/scsi/zfcp_def.h b/trunk/drivers/s390/scsi/zfcp_def.h index 7f551d66f47f..e260d19fa717 100644 --- a/trunk/drivers/s390/scsi/zfcp_def.h +++ b/trunk/drivers/s390/scsi/zfcp_def.h @@ -152,6 +152,11 @@ typedef u32 scsi_lun_t; #define ZFCP_EXCHANGE_CONFIG_DATA_FIRST_SLEEP 100 #define ZFCP_EXCHANGE_CONFIG_DATA_RETRIES 7 +/* Retry 5 times every 2 second, then every minute */ +#define ZFCP_EXCHANGE_PORT_DATA_SHORT_RETRIES 5 +#define ZFCP_EXCHANGE_PORT_DATA_SHORT_SLEEP 200 +#define ZFCP_EXCHANGE_PORT_DATA_LONG_SLEEP 6000 + /* timeout value for "default timer" for fsf requests */ #define ZFCP_FSF_REQUEST_TIMEOUT (60*HZ); @@ -424,7 +429,11 @@ struct zfcp_scsi_dbf_record { u32 fsf_seqno; u64 fsf_issued; union { - u64 old_fsf_reqid; + struct { + u64 fsf_reqid; + u32 fsf_seqno; + u64 fsf_issued; + } new_fsf_req; struct { u8 rsp_validity; u8 rsp_scsi_status; @@ -906,6 +915,8 @@ struct zfcp_adapter { wwn_t peer_wwnn; /* P2P peer WWNN */ wwn_t peer_wwpn; /* P2P peer WWPN */ u32 peer_d_id; /* P2P peer D_ID */ + wwn_t physical_wwpn; /* WWPN of physical port */ + u32 physical_s_id; /* local FC port ID */ struct ccw_device *ccw_device; /* S/390 ccw device */ u8 fc_service_class; u32 hydra_version; /* Hydra version */ diff --git a/trunk/drivers/s390/scsi/zfcp_erp.c b/trunk/drivers/s390/scsi/zfcp_erp.c index e3c4bdd29a60..da947e662031 100644 --- a/trunk/drivers/s390/scsi/zfcp_erp.c +++ b/trunk/drivers/s390/scsi/zfcp_erp.c @@ -2246,6 +2246,15 @@ zfcp_erp_adapter_strategy_open_fsf(struct zfcp_erp_action *erp_action) { int retval; + if ((atomic_test_mask(ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED, + &erp_action->adapter->status)) && + (erp_action->adapter->adapter_features & + FSF_FEATURE_HBAAPI_MANAGEMENT)) { + zfcp_erp_adapter_strategy_open_fsf_xport(erp_action); + atomic_set(&erp_action->adapter->erp_counter, 0); + return ZFCP_ERP_FAILED; + } + retval = zfcp_erp_adapter_strategy_open_fsf_xconfig(erp_action); if (retval == ZFCP_ERP_FAILED) return ZFCP_ERP_FAILED; @@ -2257,6 +2266,13 @@ zfcp_erp_adapter_strategy_open_fsf(struct zfcp_erp_action *erp_action) return zfcp_erp_adapter_strategy_open_fsf_statusread(erp_action); } +/* + * function: + * + * purpose: + * + * returns: + */ static int zfcp_erp_adapter_strategy_open_fsf_xconfig(struct zfcp_erp_action *erp_action) { @@ -2334,40 +2350,48 @@ static int zfcp_erp_adapter_strategy_open_fsf_xport(struct zfcp_erp_action *erp_action) { int ret; - struct zfcp_adapter *adapter; + int retries; + int sleep; + struct zfcp_adapter *adapter = erp_action->adapter; - adapter = erp_action->adapter; atomic_clear_mask(ZFCP_STATUS_ADAPTER_XPORT_OK, &adapter->status); - write_lock(&adapter->erp_lock); - zfcp_erp_action_to_running(erp_action); - write_unlock(&adapter->erp_lock); + retries = 0; + do { + write_lock(&adapter->erp_lock); + zfcp_erp_action_to_running(erp_action); + write_unlock(&adapter->erp_lock); + zfcp_erp_timeout_init(erp_action); + ret = zfcp_fsf_exchange_port_data(erp_action, adapter, NULL); + if (ret == -EOPNOTSUPP) { + debug_text_event(adapter->erp_dbf, 3, "a_xport_notsupp"); + return ZFCP_ERP_SUCCEEDED; + } else if (ret) { + debug_text_event(adapter->erp_dbf, 3, "a_xport_failed"); + return ZFCP_ERP_FAILED; + } + debug_text_event(adapter->erp_dbf, 6, "a_xport_ok"); - zfcp_erp_timeout_init(erp_action); - ret = zfcp_fsf_exchange_port_data(erp_action, adapter, NULL); - if (ret == -EOPNOTSUPP) { - debug_text_event(adapter->erp_dbf, 3, "a_xport_notsupp"); - return ZFCP_ERP_SUCCEEDED; - } else if (ret) { - debug_text_event(adapter->erp_dbf, 3, "a_xport_failed"); - return ZFCP_ERP_FAILED; - } - debug_text_event(adapter->erp_dbf, 6, "a_xport_ok"); + down(&adapter->erp_ready_sem); + if (erp_action->status & ZFCP_STATUS_ERP_TIMEDOUT) { + ZFCP_LOG_INFO("error: exchange of port data " + "for adapter %s timed out\n", + zfcp_get_busid_by_adapter(adapter)); + break; + } + if (!atomic_test_mask(ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED, + &adapter->status)) + break; - ret = ZFCP_ERP_SUCCEEDED; - down(&adapter->erp_ready_sem); - if (erp_action->status & ZFCP_STATUS_ERP_TIMEDOUT) { - ZFCP_LOG_INFO("error: exchange port data timed out (adapter " - "%s)\n", zfcp_get_busid_by_adapter(adapter)); - ret = ZFCP_ERP_FAILED; - } - if (!atomic_test_mask(ZFCP_STATUS_ADAPTER_XPORT_OK, &adapter->status)) { - ZFCP_LOG_INFO("error: exchange port data failed (adapter " - "%s\n", zfcp_get_busid_by_adapter(adapter)); - ret = ZFCP_ERP_FAILED; - } + if (retries < ZFCP_EXCHANGE_PORT_DATA_SHORT_RETRIES) { + sleep = ZFCP_EXCHANGE_PORT_DATA_SHORT_SLEEP; + retries++; + } else + sleep = ZFCP_EXCHANGE_PORT_DATA_LONG_SLEEP; + schedule_timeout(sleep); + } while (1); - return ret; + return ZFCP_ERP_SUCCEEDED; } /* @@ -3415,8 +3439,6 @@ zfcp_erp_action_cleanup(int action, struct zfcp_adapter *adapter, "(adapter %s, wwpn=0x%016Lx)\n", zfcp_get_busid_by_port(port), port->wwpn); - else - scsi_flush_work(adapter->scsi_host); } zfcp_port_put(port); break; diff --git a/trunk/drivers/s390/scsi/zfcp_ext.h b/trunk/drivers/s390/scsi/zfcp_ext.h index 700f5402a978..c1ba7cf1b496 100644 --- a/trunk/drivers/s390/scsi/zfcp_ext.h +++ b/trunk/drivers/s390/scsi/zfcp_ext.h @@ -194,10 +194,9 @@ extern void zfcp_san_dbf_event_els_response(struct zfcp_fsf_req *); extern void zfcp_san_dbf_event_incoming_els(struct zfcp_fsf_req *); extern void zfcp_scsi_dbf_event_result(const char *, int, struct zfcp_adapter *, - struct scsi_cmnd *, - struct zfcp_fsf_req *); + struct scsi_cmnd *); extern void zfcp_scsi_dbf_event_abort(const char *, struct zfcp_adapter *, - struct scsi_cmnd *, struct zfcp_fsf_req *, + struct scsi_cmnd *, struct zfcp_fsf_req *); extern void zfcp_scsi_dbf_event_devreset(const char *, u8, struct zfcp_unit *, struct scsi_cmnd *); diff --git a/trunk/drivers/s390/scsi/zfcp_fsf.c b/trunk/drivers/s390/scsi/zfcp_fsf.c index 662ec571d73b..9f0cb3d820c0 100644 --- a/trunk/drivers/s390/scsi/zfcp_fsf.c +++ b/trunk/drivers/s390/scsi/zfcp_fsf.c @@ -388,7 +388,6 @@ zfcp_fsf_protstatus_eval(struct zfcp_fsf_req *fsf_req) case FSF_PROT_LINK_DOWN: zfcp_fsf_link_down_info_eval(adapter, &prot_status_qual->link_down_info); - zfcp_erp_adapter_reopen(adapter, 0); fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; break; @@ -559,8 +558,10 @@ zfcp_fsf_link_down_info_eval(struct zfcp_adapter *adapter, atomic_set_mask(ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED, &adapter->status); - if (link_down == NULL) - goto out; + if (link_down == NULL) { + zfcp_erp_adapter_reopen(adapter, 0); + return; + } switch (link_down->error_code) { case FSF_PSQ_LINK_NO_LIGHT: @@ -642,8 +643,16 @@ zfcp_fsf_link_down_info_eval(struct zfcp_adapter *adapter, link_down->explanation_code, link_down->vendor_specific_code); - out: - zfcp_erp_adapter_failed(adapter); + switch (link_down->error_code) { + case FSF_PSQ_LINK_NO_LIGHT: + case FSF_PSQ_LINK_WRAP_PLUG: + case FSF_PSQ_LINK_NO_FCP: + case FSF_PSQ_LINK_FIRMWARE_UPDATE: + zfcp_erp_adapter_reopen(adapter, 0); + break; + default: + zfcp_erp_adapter_failed(adapter); + } } /* @@ -2295,35 +2304,6 @@ zfcp_fsf_exchange_port_data(struct zfcp_erp_action *erp_action, return retval; } -/** - * zfcp_fsf_exchange_port_evaluate - * @fsf_req: fsf_req which belongs to xchg port data request - * @xchg_ok: specifies if xchg port data was incomplete or complete (0/1) - */ -static void -zfcp_fsf_exchange_port_evaluate(struct zfcp_fsf_req *fsf_req, int xchg_ok) -{ - struct zfcp_adapter *adapter; - struct fsf_qtcb *qtcb; - struct fsf_qtcb_bottom_port *bottom, *data; - struct Scsi_Host *shost; - - adapter = fsf_req->adapter; - qtcb = fsf_req->qtcb; - bottom = &qtcb->bottom.port; - shost = adapter->scsi_host; - - data = (struct fsf_qtcb_bottom_port*) fsf_req->data; - if (data) - memcpy(data, bottom, sizeof(struct fsf_qtcb_bottom_port)); - - if (adapter->connection_features & FSF_FEATURE_NPIV_MODE) - fc_host_permanent_port_name(shost) = bottom->wwpn; - else - fc_host_permanent_port_name(shost) = fc_host_port_name(shost); - fc_host_maxframe_size(shost) = bottom->maximum_frame_size; - fc_host_supported_speeds(shost) = bottom->supported_speed; -} /** * zfcp_fsf_exchange_port_data_handler - handler for exchange_port_data request @@ -2332,26 +2312,38 @@ zfcp_fsf_exchange_port_evaluate(struct zfcp_fsf_req *fsf_req, int xchg_ok) static void zfcp_fsf_exchange_port_data_handler(struct zfcp_fsf_req *fsf_req) { - struct zfcp_adapter *adapter; - struct fsf_qtcb *qtcb; - - adapter = fsf_req->adapter; - qtcb = fsf_req->qtcb; + struct zfcp_adapter *adapter = fsf_req->adapter; + struct Scsi_Host *shost = adapter->scsi_host; + struct fsf_qtcb *qtcb = fsf_req->qtcb; + struct fsf_qtcb_bottom_port *bottom, *data; if (fsf_req->status & ZFCP_STATUS_FSFREQ_ERROR) return; switch (qtcb->header.fsf_status) { case FSF_GOOD: - zfcp_fsf_exchange_port_evaluate(fsf_req, 1); atomic_set_mask(ZFCP_STATUS_ADAPTER_XPORT_OK, &adapter->status); + + bottom = &qtcb->bottom.port; + data = (struct fsf_qtcb_bottom_port*) fsf_req->data; + if (data) + memcpy(data, bottom, sizeof(struct fsf_qtcb_bottom_port)); + if (adapter->connection_features & FSF_FEATURE_NPIV_MODE) + fc_host_permanent_port_name(shost) = bottom->wwpn; + else + fc_host_permanent_port_name(shost) = + fc_host_port_name(shost); + fc_host_maxframe_size(shost) = bottom->maximum_frame_size; + fc_host_supported_speeds(shost) = bottom->supported_speed; break; + case FSF_EXCHANGE_CONFIG_DATA_INCOMPLETE: - zfcp_fsf_exchange_port_evaluate(fsf_req, 0); atomic_set_mask(ZFCP_STATUS_ADAPTER_XPORT_OK, &adapter->status); + zfcp_fsf_link_down_info_eval(adapter, &qtcb->header.fsf_status_qual.link_down_info); break; + default: debug_text_event(adapter->erp_dbf, 0, "xchg-port-ng"); debug_event(adapter->erp_dbf, 0, @@ -4211,11 +4203,11 @@ zfcp_fsf_send_fcp_command_task_handler(struct zfcp_fsf_req *fsf_req) ZFCP_LOG_DEBUG("scpnt->result =0x%x\n", scpnt->result); if (scpnt->result != 0) - zfcp_scsi_dbf_event_result("erro", 3, fsf_req->adapter, scpnt, fsf_req); + zfcp_scsi_dbf_event_result("erro", 3, fsf_req->adapter, scpnt); else if (scpnt->retries > 0) - zfcp_scsi_dbf_event_result("retr", 4, fsf_req->adapter, scpnt, fsf_req); + zfcp_scsi_dbf_event_result("retr", 4, fsf_req->adapter, scpnt); else - zfcp_scsi_dbf_event_result("norm", 6, fsf_req->adapter, scpnt, fsf_req); + zfcp_scsi_dbf_event_result("norm", 6, fsf_req->adapter, scpnt); /* cleanup pointer (need this especially for abort) */ scpnt->host_scribble = NULL; diff --git a/trunk/drivers/s390/scsi/zfcp_scsi.c b/trunk/drivers/s390/scsi/zfcp_scsi.c index 9f6b4d7a46f3..e0803757c0fa 100644 --- a/trunk/drivers/s390/scsi/zfcp_scsi.c +++ b/trunk/drivers/s390/scsi/zfcp_scsi.c @@ -242,7 +242,7 @@ zfcp_scsi_command_fail(struct scsi_cmnd *scpnt, int result) if ((scpnt->device != NULL) && (scpnt->device->host != NULL)) zfcp_scsi_dbf_event_result("fail", 4, (struct zfcp_adapter*) scpnt->device->host->hostdata[0], - scpnt, NULL); + scpnt); /* return directly */ scpnt->scsi_done(scpnt); } @@ -446,7 +446,7 @@ zfcp_scsi_eh_abort_handler(struct scsi_cmnd *scpnt) old_fsf_req = (struct zfcp_fsf_req *) scpnt->host_scribble; if (!old_fsf_req) { write_unlock_irqrestore(&adapter->abort_lock, flags); - zfcp_scsi_dbf_event_abort("lte1", adapter, scpnt, NULL, NULL); + zfcp_scsi_dbf_event_abort("lte1", adapter, scpnt, new_fsf_req); retval = SUCCESS; goto out; } @@ -460,8 +460,6 @@ zfcp_scsi_eh_abort_handler(struct scsi_cmnd *scpnt) adapter, unit, 0); if (!new_fsf_req) { ZFCP_LOG_INFO("error: initiation of Abort FCP Cmnd failed\n"); - zfcp_scsi_dbf_event_abort("nres", adapter, scpnt, NULL, - old_fsf_req); retval = FAILED; goto out; } @@ -472,16 +470,13 @@ zfcp_scsi_eh_abort_handler(struct scsi_cmnd *scpnt) /* status should be valid since signals were not permitted */ if (new_fsf_req->status & ZFCP_STATUS_FSFREQ_ABORTSUCCEEDED) { - zfcp_scsi_dbf_event_abort("okay", adapter, scpnt, new_fsf_req, - NULL); + zfcp_scsi_dbf_event_abort("okay", adapter, scpnt, new_fsf_req); retval = SUCCESS; } else if (new_fsf_req->status & ZFCP_STATUS_FSFREQ_ABORTNOTNEEDED) { - zfcp_scsi_dbf_event_abort("lte2", adapter, scpnt, new_fsf_req, - NULL); + zfcp_scsi_dbf_event_abort("lte2", adapter, scpnt, new_fsf_req); retval = SUCCESS; } else { - zfcp_scsi_dbf_event_abort("fail", adapter, scpnt, new_fsf_req, - NULL); + zfcp_scsi_dbf_event_abort("fail", adapter, scpnt, new_fsf_req); retval = FAILED; } zfcp_fsf_req_free(new_fsf_req); diff --git a/trunk/drivers/s390/scsi/zfcp_sysfs_adapter.c b/trunk/drivers/s390/scsi/zfcp_sysfs_adapter.c index b29ac25e07f3..dfc07370f412 100644 --- a/trunk/drivers/s390/scsi/zfcp_sysfs_adapter.c +++ b/trunk/drivers/s390/scsi/zfcp_sysfs_adapter.c @@ -55,6 +55,8 @@ ZFCP_DEFINE_ADAPTER_ATTR(status, "0x%08x\n", atomic_read(&adapter->status)); ZFCP_DEFINE_ADAPTER_ATTR(peer_wwnn, "0x%016llx\n", adapter->peer_wwnn); ZFCP_DEFINE_ADAPTER_ATTR(peer_wwpn, "0x%016llx\n", adapter->peer_wwpn); ZFCP_DEFINE_ADAPTER_ATTR(peer_d_id, "0x%06x\n", adapter->peer_d_id); +ZFCP_DEFINE_ADAPTER_ATTR(physical_wwpn, "0x%016llx\n", adapter->physical_wwpn); +ZFCP_DEFINE_ADAPTER_ATTR(physical_s_id, "0x%06x\n", adapter->physical_s_id); ZFCP_DEFINE_ADAPTER_ATTR(card_version, "0x%04x\n", adapter->hydra_version); ZFCP_DEFINE_ADAPTER_ATTR(lic_version, "0x%08x\n", adapter->fsf_lic_version); ZFCP_DEFINE_ADAPTER_ATTR(hardware_version, "0x%08x\n", @@ -239,6 +241,8 @@ static struct attribute *zfcp_adapter_attrs[] = { &dev_attr_peer_wwnn.attr, &dev_attr_peer_wwpn.attr, &dev_attr_peer_d_id.attr, + &dev_attr_physical_wwpn.attr, + &dev_attr_physical_s_id.attr, &dev_attr_card_version.attr, &dev_attr_lic_version.attr, &dev_attr_status.attr, diff --git a/trunk/drivers/scsi/3w-9xxx.c b/trunk/drivers/scsi/3w-9xxx.c index d9152d02088c..31c497542272 100644 --- a/trunk/drivers/scsi/3w-9xxx.c +++ b/trunk/drivers/scsi/3w-9xxx.c @@ -61,7 +61,6 @@ Add support for embedded firmware error strings. 2.26.02.003 - Correctly handle single sgl's with use_sg=1. 2.26.02.004 - Add support for 9550SX controllers. - 2.26.02.005 - Fix use_sg == 0 mapping on systems with 4GB or higher. */ #include @@ -85,7 +84,7 @@ #include "3w-9xxx.h" /* Globals */ -#define TW_DRIVER_VERSION "2.26.02.005" +#define TW_DRIVER_VERSION "2.26.02.004" static TW_Device_Extension *twa_device_extension_list[TW_MAX_SLOT]; static unsigned int twa_device_extension_count; static int twa_major = -1; @@ -1409,7 +1408,7 @@ static dma_addr_t twa_map_scsi_single_data(TW_Device_Extension *tw_dev, int requ dma_addr_t mapping; struct scsi_cmnd *cmd = tw_dev->srb[request_id]; struct pci_dev *pdev = tw_dev->tw_pci_dev; - dma_addr_t retval = 0; + int retval = 0; if (cmd->request_bufflen == 0) { retval = 0; @@ -1799,7 +1798,7 @@ static int twa_scsiop_execute_scsi(TW_Device_Extension *tw_dev, int request_id, int i, sg_count; struct scsi_cmnd *srb = NULL; struct scatterlist *sglist = NULL; - dma_addr_t buffaddr = 0x0; + u32 buffaddr = 0x0; int retval = 1; if (tw_dev->srb[request_id]) { diff --git a/trunk/drivers/scsi/aacraid/aachba.c b/trunk/drivers/scsi/aacraid/aachba.c index a16f8ded8f1d..7139659dd952 100644 --- a/trunk/drivers/scsi/aacraid/aachba.c +++ b/trunk/drivers/scsi/aacraid/aachba.c @@ -173,10 +173,10 @@ int aac_get_config_status(struct aac_dev *dev) int status = 0; struct fib * fibptr; - if (!(fibptr = aac_fib_alloc(dev))) + if (!(fibptr = fib_alloc(dev))) return -ENOMEM; - aac_fib_init(fibptr); + fib_init(fibptr); { struct aac_get_config_status *dinfo; dinfo = (struct aac_get_config_status *) fib_data(fibptr); @@ -186,7 +186,7 @@ int aac_get_config_status(struct aac_dev *dev) dinfo->count = cpu_to_le32(sizeof(((struct aac_get_config_status_resp *)NULL)->data)); } - status = aac_fib_send(ContainerCommand, + status = fib_send(ContainerCommand, fibptr, sizeof (struct aac_get_config_status), FsaNormal, @@ -209,30 +209,30 @@ int aac_get_config_status(struct aac_dev *dev) status = -EINVAL; } } - aac_fib_complete(fibptr); + fib_complete(fibptr); /* Send a CT_COMMIT_CONFIG to enable discovery of devices */ if (status >= 0) { if (commit == 1) { struct aac_commit_config * dinfo; - aac_fib_init(fibptr); + fib_init(fibptr); dinfo = (struct aac_commit_config *) fib_data(fibptr); dinfo->command = cpu_to_le32(VM_ContainerConfig); dinfo->type = cpu_to_le32(CT_COMMIT_CONFIG); - status = aac_fib_send(ContainerCommand, + status = fib_send(ContainerCommand, fibptr, sizeof (struct aac_commit_config), FsaNormal, 1, 1, NULL, NULL); - aac_fib_complete(fibptr); + fib_complete(fibptr); } else if (commit == 0) { printk(KERN_WARNING "aac_get_config_status: Foreign device configurations are being ignored\n"); } } - aac_fib_free(fibptr); + fib_free(fibptr); return status; } @@ -255,15 +255,15 @@ int aac_get_containers(struct aac_dev *dev) instance = dev->scsi_host_ptr->unique_id; - if (!(fibptr = aac_fib_alloc(dev))) + if (!(fibptr = fib_alloc(dev))) return -ENOMEM; - aac_fib_init(fibptr); + fib_init(fibptr); dinfo = (struct aac_get_container_count *) fib_data(fibptr); dinfo->command = cpu_to_le32(VM_ContainerConfig); dinfo->type = cpu_to_le32(CT_GET_CONTAINER_COUNT); - status = aac_fib_send(ContainerCommand, + status = fib_send(ContainerCommand, fibptr, sizeof (struct aac_get_container_count), FsaNormal, @@ -272,7 +272,7 @@ int aac_get_containers(struct aac_dev *dev) if (status >= 0) { dresp = (struct aac_get_container_count_resp *)fib_data(fibptr); maximum_num_containers = le32_to_cpu(dresp->ContainerSwitchEntries); - aac_fib_complete(fibptr); + fib_complete(fibptr); } if (maximum_num_containers < MAXIMUM_NUM_CONTAINERS) @@ -280,7 +280,7 @@ int aac_get_containers(struct aac_dev *dev) fsa_dev_ptr = (struct fsa_dev_info *) kmalloc( sizeof(*fsa_dev_ptr) * maximum_num_containers, GFP_KERNEL); if (!fsa_dev_ptr) { - aac_fib_free(fibptr); + fib_free(fibptr); return -ENOMEM; } memset(fsa_dev_ptr, 0, sizeof(*fsa_dev_ptr) * maximum_num_containers); @@ -294,14 +294,14 @@ int aac_get_containers(struct aac_dev *dev) fsa_dev_ptr[index].devname[0] = '\0'; - aac_fib_init(fibptr); + fib_init(fibptr); dinfo = (struct aac_query_mount *) fib_data(fibptr); dinfo->command = cpu_to_le32(VM_NameServe); dinfo->count = cpu_to_le32(index); dinfo->type = cpu_to_le32(FT_FILESYS); - status = aac_fib_send(ContainerCommand, + status = fib_send(ContainerCommand, fibptr, sizeof (struct aac_query_mount), FsaNormal, @@ -319,7 +319,7 @@ int aac_get_containers(struct aac_dev *dev) dinfo->count = cpu_to_le32(index); dinfo->type = cpu_to_le32(FT_FILESYS); - if (aac_fib_send(ContainerCommand, + if (fib_send(ContainerCommand, fibptr, sizeof(struct aac_query_mount), FsaNormal, @@ -347,7 +347,7 @@ int aac_get_containers(struct aac_dev *dev) if (le32_to_cpu(dresp->mnt[0].state) & FSCS_READONLY) fsa_dev_ptr[index].ro = 1; } - aac_fib_complete(fibptr); + fib_complete(fibptr); /* * If there are no more containers, then stop asking. */ @@ -355,7 +355,7 @@ int aac_get_containers(struct aac_dev *dev) break; } } - aac_fib_free(fibptr); + fib_free(fibptr); return status; } @@ -413,8 +413,8 @@ static void get_container_name_callback(void *context, struct fib * fibptr) scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_GOOD; - aac_fib_complete(fibptr); - aac_fib_free(fibptr); + fib_complete(fibptr); + fib_free(fibptr); scsicmd->scsi_done(scsicmd); } @@ -430,10 +430,10 @@ static int aac_get_container_name(struct scsi_cmnd * scsicmd, int cid) dev = (struct aac_dev *)scsicmd->device->host->hostdata; - if (!(cmd_fibcontext = aac_fib_alloc(dev))) + if (!(cmd_fibcontext = fib_alloc(dev))) return -ENOMEM; - aac_fib_init(cmd_fibcontext); + fib_init(cmd_fibcontext); dinfo = (struct aac_get_name *) fib_data(cmd_fibcontext); dinfo->command = cpu_to_le32(VM_ContainerConfig); @@ -441,7 +441,7 @@ static int aac_get_container_name(struct scsi_cmnd * scsicmd, int cid) dinfo->cid = cpu_to_le32(cid); dinfo->count = cpu_to_le32(sizeof(((struct aac_get_name_resp *)NULL)->data)); - status = aac_fib_send(ContainerCommand, + status = fib_send(ContainerCommand, cmd_fibcontext, sizeof (struct aac_get_name), FsaNormal, @@ -455,14 +455,14 @@ static int aac_get_container_name(struct scsi_cmnd * scsicmd, int cid) if (status == -EINPROGRESS) return 0; - printk(KERN_WARNING "aac_get_container_name: aac_fib_send failed with status: %d.\n", status); - aac_fib_complete(cmd_fibcontext); - aac_fib_free(cmd_fibcontext); + printk(KERN_WARNING "aac_get_container_name: fib_send failed with status: %d.\n", status); + fib_complete(cmd_fibcontext); + fib_free(cmd_fibcontext); return -1; } /** - * aac_probe_container - query a logical volume + * probe_container - query a logical volume * @dev: device to query * @cid: container identifier * @@ -470,7 +470,7 @@ static int aac_get_container_name(struct scsi_cmnd * scsicmd, int cid) * is updated in the struct fsa_dev_info structure rather than returned. */ -int aac_probe_container(struct aac_dev *dev, int cid) +int probe_container(struct aac_dev *dev, int cid) { struct fsa_dev_info *fsa_dev_ptr; int status; @@ -482,10 +482,10 @@ int aac_probe_container(struct aac_dev *dev, int cid) fsa_dev_ptr = dev->fsa_dev; instance = dev->scsi_host_ptr->unique_id; - if (!(fibptr = aac_fib_alloc(dev))) + if (!(fibptr = fib_alloc(dev))) return -ENOMEM; - aac_fib_init(fibptr); + fib_init(fibptr); dinfo = (struct aac_query_mount *)fib_data(fibptr); @@ -493,14 +493,14 @@ int aac_probe_container(struct aac_dev *dev, int cid) dinfo->count = cpu_to_le32(cid); dinfo->type = cpu_to_le32(FT_FILESYS); - status = aac_fib_send(ContainerCommand, + status = fib_send(ContainerCommand, fibptr, sizeof(struct aac_query_mount), FsaNormal, 1, 1, NULL, NULL); if (status < 0) { - printk(KERN_WARNING "aacraid: aac_probe_container query failed.\n"); + printk(KERN_WARNING "aacraid: probe_container query failed.\n"); goto error; } @@ -512,7 +512,7 @@ int aac_probe_container(struct aac_dev *dev, int cid) dinfo->count = cpu_to_le32(cid); dinfo->type = cpu_to_le32(FT_FILESYS); - if (aac_fib_send(ContainerCommand, + if (fib_send(ContainerCommand, fibptr, sizeof(struct aac_query_mount), FsaNormal, @@ -535,8 +535,8 @@ int aac_probe_container(struct aac_dev *dev, int cid) } error: - aac_fib_complete(fibptr); - aac_fib_free(fibptr); + fib_complete(fibptr); + fib_free(fibptr); return status; } @@ -700,14 +700,14 @@ int aac_get_adapter_info(struct aac_dev* dev) struct aac_bus_info *command; struct aac_bus_info_response *bus_info; - if (!(fibptr = aac_fib_alloc(dev))) + if (!(fibptr = fib_alloc(dev))) return -ENOMEM; - aac_fib_init(fibptr); + fib_init(fibptr); info = (struct aac_adapter_info *) fib_data(fibptr); memset(info,0,sizeof(*info)); - rcode = aac_fib_send(RequestAdapterInfo, + rcode = fib_send(RequestAdapterInfo, fibptr, sizeof(*info), FsaNormal, @@ -716,8 +716,8 @@ int aac_get_adapter_info(struct aac_dev* dev) NULL); if (rcode < 0) { - aac_fib_complete(fibptr); - aac_fib_free(fibptr); + fib_complete(fibptr); + fib_free(fibptr); return rcode; } memcpy(&dev->adapter_info, info, sizeof(*info)); @@ -725,13 +725,13 @@ int aac_get_adapter_info(struct aac_dev* dev) if (dev->adapter_info.options & AAC_OPT_SUPPLEMENT_ADAPTER_INFO) { struct aac_supplement_adapter_info * info; - aac_fib_init(fibptr); + fib_init(fibptr); info = (struct aac_supplement_adapter_info *) fib_data(fibptr); memset(info,0,sizeof(*info)); - rcode = aac_fib_send(RequestSupplementAdapterInfo, + rcode = fib_send(RequestSupplementAdapterInfo, fibptr, sizeof(*info), FsaNormal, @@ -748,7 +748,7 @@ int aac_get_adapter_info(struct aac_dev* dev) * GetBusInfo */ - aac_fib_init(fibptr); + fib_init(fibptr); bus_info = (struct aac_bus_info_response *) fib_data(fibptr); @@ -761,7 +761,7 @@ int aac_get_adapter_info(struct aac_dev* dev) command->MethodId = cpu_to_le32(1); command->CtlCmd = cpu_to_le32(GetBusInfo); - rcode = aac_fib_send(ContainerCommand, + rcode = fib_send(ContainerCommand, fibptr, sizeof (*bus_info), FsaNormal, @@ -891,8 +891,8 @@ int aac_get_adapter_info(struct aac_dev* dev) } } - aac_fib_complete(fibptr); - aac_fib_free(fibptr); + fib_complete(fibptr); + fib_free(fibptr); return rcode; } @@ -976,8 +976,8 @@ static void io_callback(void *context, struct fib * fibptr) ? sizeof(scsicmd->sense_buffer) : sizeof(dev->fsa_dev[cid].sense_data)); } - aac_fib_complete(fibptr); - aac_fib_free(fibptr); + fib_complete(fibptr); + fib_free(fibptr); scsicmd->scsi_done(scsicmd); } @@ -1062,11 +1062,11 @@ static int aac_read(struct scsi_cmnd * scsicmd, int cid) /* * Alocate and initialize a Fib */ - if (!(cmd_fibcontext = aac_fib_alloc(dev))) { + if (!(cmd_fibcontext = fib_alloc(dev))) { return -1; } - aac_fib_init(cmd_fibcontext); + fib_init(cmd_fibcontext); if (dev->raw_io_interface) { struct aac_raw_io *readcmd; @@ -1086,7 +1086,7 @@ static int aac_read(struct scsi_cmnd * scsicmd, int cid) /* * Now send the Fib to the adapter */ - status = aac_fib_send(ContainerRawIo, + status = fib_send(ContainerRawIo, cmd_fibcontext, fibsize, FsaNormal, @@ -1112,7 +1112,7 @@ static int aac_read(struct scsi_cmnd * scsicmd, int cid) /* * Now send the Fib to the adapter */ - status = aac_fib_send(ContainerCommand64, + status = fib_send(ContainerCommand64, cmd_fibcontext, fibsize, FsaNormal, @@ -1136,7 +1136,7 @@ static int aac_read(struct scsi_cmnd * scsicmd, int cid) /* * Now send the Fib to the adapter */ - status = aac_fib_send(ContainerCommand, + status = fib_send(ContainerCommand, cmd_fibcontext, fibsize, FsaNormal, @@ -1153,14 +1153,14 @@ static int aac_read(struct scsi_cmnd * scsicmd, int cid) if (status == -EINPROGRESS) return 0; - printk(KERN_WARNING "aac_read: aac_fib_send failed with status: %d.\n", status); + printk(KERN_WARNING "aac_read: fib_send failed with status: %d.\n", status); /* * For some reason, the Fib didn't queue, return QUEUE_FULL */ scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_TASK_SET_FULL; scsicmd->scsi_done(scsicmd); - aac_fib_complete(cmd_fibcontext); - aac_fib_free(cmd_fibcontext); + fib_complete(cmd_fibcontext); + fib_free(cmd_fibcontext); return 0; } @@ -1228,12 +1228,12 @@ static int aac_write(struct scsi_cmnd * scsicmd, int cid) /* * Allocate and initialize a Fib then setup a BlockWrite command */ - if (!(cmd_fibcontext = aac_fib_alloc(dev))) { + if (!(cmd_fibcontext = fib_alloc(dev))) { scsicmd->result = DID_ERROR << 16; scsicmd->scsi_done(scsicmd); return 0; } - aac_fib_init(cmd_fibcontext); + fib_init(cmd_fibcontext); if (dev->raw_io_interface) { struct aac_raw_io *writecmd; @@ -1253,7 +1253,7 @@ static int aac_write(struct scsi_cmnd * scsicmd, int cid) /* * Now send the Fib to the adapter */ - status = aac_fib_send(ContainerRawIo, + status = fib_send(ContainerRawIo, cmd_fibcontext, fibsize, FsaNormal, @@ -1279,7 +1279,7 @@ static int aac_write(struct scsi_cmnd * scsicmd, int cid) /* * Now send the Fib to the adapter */ - status = aac_fib_send(ContainerCommand64, + status = fib_send(ContainerCommand64, cmd_fibcontext, fibsize, FsaNormal, @@ -1305,7 +1305,7 @@ static int aac_write(struct scsi_cmnd * scsicmd, int cid) /* * Now send the Fib to the adapter */ - status = aac_fib_send(ContainerCommand, + status = fib_send(ContainerCommand, cmd_fibcontext, fibsize, FsaNormal, @@ -1322,15 +1322,15 @@ static int aac_write(struct scsi_cmnd * scsicmd, int cid) return 0; } - printk(KERN_WARNING "aac_write: aac_fib_send failed with status: %d\n", status); + printk(KERN_WARNING "aac_write: fib_send failed with status: %d\n", status); /* * For some reason, the Fib didn't queue, return QUEUE_FULL */ scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_TASK_SET_FULL; scsicmd->scsi_done(scsicmd); - aac_fib_complete(cmd_fibcontext); - aac_fib_free(cmd_fibcontext); + fib_complete(cmd_fibcontext); + fib_free(cmd_fibcontext); return 0; } @@ -1369,8 +1369,8 @@ static void synchronize_callback(void *context, struct fib *fibptr) sizeof(cmd->sense_buffer))); } - aac_fib_complete(fibptr); - aac_fib_free(fibptr); + fib_complete(fibptr); + fib_free(fibptr); cmd->scsi_done(cmd); } @@ -1407,10 +1407,10 @@ static int aac_synchronize(struct scsi_cmnd *scsicmd, int cid) * Allocate and initialize a Fib */ if (!(cmd_fibcontext = - aac_fib_alloc((struct aac_dev *)scsicmd->device->host->hostdata))) + fib_alloc((struct aac_dev *)scsicmd->device->host->hostdata))) return SCSI_MLQUEUE_HOST_BUSY; - aac_fib_init(cmd_fibcontext); + fib_init(cmd_fibcontext); synchronizecmd = fib_data(cmd_fibcontext); synchronizecmd->command = cpu_to_le32(VM_ContainerConfig); @@ -1422,7 +1422,7 @@ static int aac_synchronize(struct scsi_cmnd *scsicmd, int cid) /* * Now send the Fib to the adapter */ - status = aac_fib_send(ContainerCommand, + status = fib_send(ContainerCommand, cmd_fibcontext, sizeof(struct aac_synchronize), FsaNormal, @@ -1437,9 +1437,9 @@ static int aac_synchronize(struct scsi_cmnd *scsicmd, int cid) return 0; printk(KERN_WARNING - "aac_synchronize: aac_fib_send failed with status: %d.\n", status); - aac_fib_complete(cmd_fibcontext); - aac_fib_free(cmd_fibcontext); + "aac_synchronize: fib_send failed with status: %d.\n", status); + fib_complete(cmd_fibcontext); + fib_free(cmd_fibcontext); return SCSI_MLQUEUE_HOST_BUSY; } @@ -1465,7 +1465,7 @@ int aac_scsi_cmd(struct scsi_cmnd * scsicmd) * itself. */ if (scmd_id(scsicmd) != host->this_id) { - if ((scsicmd->device->channel == CONTAINER_CHANNEL)) { + if ((scsicmd->device->channel == 0) ){ if( (scsicmd->device->id >= dev->maximum_num_containers) || (scsicmd->device->lun != 0)){ scsicmd->result = DID_NO_CONNECT << 16; scsicmd->scsi_done(scsicmd); @@ -1488,7 +1488,7 @@ int aac_scsi_cmd(struct scsi_cmnd * scsicmd) case READ_CAPACITY: case TEST_UNIT_READY: spin_unlock_irq(host->host_lock); - aac_probe_container(dev, cid); + probe_container(dev, cid); if ((fsa_dev_ptr[cid].valid & 1) == 0) fsa_dev_ptr[cid].valid = 0; spin_lock_irq(host->host_lock); @@ -1935,7 +1935,33 @@ static void aac_srb_callback(void *context, struct fib * fibptr) case SRB_STATUS_ERROR_RECOVERY: case SRB_STATUS_PENDING: case SRB_STATUS_SUCCESS: - scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8; + if(scsicmd->cmnd[0] == INQUIRY ){ + u8 b; + u8 b1; + /* We can't expose disk devices because we can't tell whether they + * are the raw container drives or stand alone drives. If they have + * the removable bit set then we should expose them though. + */ + b = (*(u8*)scsicmd->buffer)&0x1f; + b1 = ((u8*)scsicmd->buffer)[1]; + if( b==TYPE_TAPE || b==TYPE_WORM || b==TYPE_ROM || b==TYPE_MOD|| b==TYPE_MEDIUM_CHANGER + || (b==TYPE_DISK && (b1&0x80)) ){ + scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8; + /* + * We will allow disk devices if in RAID/SCSI mode and + * the channel is 2 + */ + } else if ((dev->raid_scsi_mode) && + (scmd_channel(scsicmd) == 2)) { + scsicmd->result = DID_OK << 16 | + COMMAND_COMPLETE << 8; + } else { + scsicmd->result = DID_NO_CONNECT << 16 | + COMMAND_COMPLETE << 8; + } + } else { + scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8; + } break; case SRB_STATUS_DATA_OVERRUN: switch(scsicmd->cmnd[0]){ @@ -1955,7 +1981,28 @@ static void aac_srb_callback(void *context, struct fib * fibptr) scsicmd->result = DID_ERROR << 16 | COMMAND_COMPLETE << 8; break; case INQUIRY: { - scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8; + u8 b; + u8 b1; + /* We can't expose disk devices because we can't tell whether they + * are the raw container drives or stand alone drives + */ + b = (*(u8*)scsicmd->buffer)&0x0f; + b1 = ((u8*)scsicmd->buffer)[1]; + if( b==TYPE_TAPE || b==TYPE_WORM || b==TYPE_ROM || b==TYPE_MOD|| b==TYPE_MEDIUM_CHANGER + || (b==TYPE_DISK && (b1&0x80)) ){ + scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8; + /* + * We will allow disk devices if in RAID/SCSI mode and + * the channel is 2 + */ + } else if ((dev->raid_scsi_mode) && + (scmd_channel(scsicmd) == 2)) { + scsicmd->result = DID_OK << 16 | + COMMAND_COMPLETE << 8; + } else { + scsicmd->result = DID_NO_CONNECT << 16 | + COMMAND_COMPLETE << 8; + } break; } default: @@ -2042,8 +2089,8 @@ static void aac_srb_callback(void *context, struct fib * fibptr) */ scsicmd->result |= le32_to_cpu(srbreply->scsi_status); - aac_fib_complete(fibptr); - aac_fib_free(fibptr); + fib_complete(fibptr); + fib_free(fibptr); scsicmd->scsi_done(scsicmd); } @@ -2095,10 +2142,10 @@ static int aac_send_srb_fib(struct scsi_cmnd* scsicmd) /* * Allocate and initialize a Fib then setup a BlockWrite command */ - if (!(cmd_fibcontext = aac_fib_alloc(dev))) { + if (!(cmd_fibcontext = fib_alloc(dev))) { return -1; } - aac_fib_init(cmd_fibcontext); + fib_init(cmd_fibcontext); srbcmd = (struct aac_srb*) fib_data(cmd_fibcontext); srbcmd->function = cpu_to_le32(SRBF_ExecuteScsi); @@ -2132,7 +2179,7 @@ static int aac_send_srb_fib(struct scsi_cmnd* scsicmd) /* * Now send the Fib to the adapter */ - status = aac_fib_send(ScsiPortCommand64, cmd_fibcontext, + status = fib_send(ScsiPortCommand64, cmd_fibcontext, fibsize, FsaNormal, 0, 1, (fib_callback) aac_srb_callback, (void *) scsicmd); @@ -2154,7 +2201,7 @@ static int aac_send_srb_fib(struct scsi_cmnd* scsicmd) /* * Now send the Fib to the adapter */ - status = aac_fib_send(ScsiPortCommand, cmd_fibcontext, fibsize, FsaNormal, 0, 1, + status = fib_send(ScsiPortCommand, cmd_fibcontext, fibsize, FsaNormal, 0, 1, (fib_callback) aac_srb_callback, (void *) scsicmd); } /* @@ -2164,9 +2211,9 @@ static int aac_send_srb_fib(struct scsi_cmnd* scsicmd) return 0; } - printk(KERN_WARNING "aac_srb: aac_fib_send failed with status: %d\n", status); - aac_fib_complete(cmd_fibcontext); - aac_fib_free(cmd_fibcontext); + printk(KERN_WARNING "aac_srb: fib_send failed with status: %d\n", status); + fib_complete(cmd_fibcontext); + fib_free(cmd_fibcontext); return -1; } diff --git a/trunk/drivers/scsi/aacraid/aacraid.h b/trunk/drivers/scsi/aacraid/aacraid.h index 2d430b7e8cf4..66dbb6d2c506 100644 --- a/trunk/drivers/scsi/aacraid/aacraid.h +++ b/trunk/drivers/scsi/aacraid/aacraid.h @@ -1774,16 +1774,16 @@ static inline u32 cap_to_cyls(sector_t capacity, u32 divisor) struct scsi_cmnd; const char *aac_driverinfo(struct Scsi_Host *); -struct fib *aac_fib_alloc(struct aac_dev *dev); -int aac_fib_setup(struct aac_dev *dev); -void aac_fib_map_free(struct aac_dev *dev); -void aac_fib_free(struct fib * context); -void aac_fib_init(struct fib * context); +struct fib *fib_alloc(struct aac_dev *dev); +int fib_setup(struct aac_dev *dev); +void fib_map_free(struct aac_dev *dev); +void fib_free(struct fib * context); +void fib_init(struct fib * context); void aac_printf(struct aac_dev *dev, u32 val); -int aac_fib_send(u16 command, struct fib * context, unsigned long size, int priority, int wait, int reply, fib_callback callback, void *ctxt); +int fib_send(u16 command, struct fib * context, unsigned long size, int priority, int wait, int reply, fib_callback callback, void *ctxt); int aac_consumer_get(struct aac_dev * dev, struct aac_queue * q, struct aac_entry **entry); void aac_consumer_free(struct aac_dev * dev, struct aac_queue * q, u32 qnum); -int aac_fib_complete(struct fib * context); +int fib_complete(struct fib * context); #define fib_data(fibctx) ((void *)(fibctx)->hw_fib->data) struct aac_dev *aac_init_adapter(struct aac_dev *dev); int aac_get_config_status(struct aac_dev *dev); @@ -1799,11 +1799,11 @@ unsigned int aac_command_normal(struct aac_queue * q); unsigned int aac_intr_normal(struct aac_dev * dev, u32 Index); int aac_command_thread(struct aac_dev * dev); int aac_close_fib_context(struct aac_dev * dev, struct aac_fib_context *fibctx); -int aac_fib_adapter_complete(struct fib * fibptr, unsigned short size); +int fib_adapter_complete(struct fib * fibptr, unsigned short size); struct aac_driver_ident* aac_get_driver_ident(int devtype); int aac_get_adapter_info(struct aac_dev* dev); int aac_send_shutdown(struct aac_dev *dev); -int aac_probe_container(struct aac_dev *dev, int cid); +int probe_container(struct aac_dev *dev, int cid); extern int numacb; extern int acbsize; extern char aac_driver_version[]; diff --git a/trunk/drivers/scsi/aacraid/commctrl.c b/trunk/drivers/scsi/aacraid/commctrl.c index 47fefca72695..4fe79cd7c957 100644 --- a/trunk/drivers/scsi/aacraid/commctrl.c +++ b/trunk/drivers/scsi/aacraid/commctrl.c @@ -63,7 +63,7 @@ static int ioctl_send_fib(struct aac_dev * dev, void __user *arg) unsigned size; int retval; - fibptr = aac_fib_alloc(dev); + fibptr = fib_alloc(dev); if(fibptr == NULL) { return -ENOMEM; } @@ -73,7 +73,7 @@ static int ioctl_send_fib(struct aac_dev * dev, void __user *arg) * First copy in the header so that we can check the size field. */ if (copy_from_user((void *)kfib, arg, sizeof(struct aac_fibhdr))) { - aac_fib_free(fibptr); + fib_free(fibptr); return -EFAULT; } /* @@ -110,13 +110,13 @@ static int ioctl_send_fib(struct aac_dev * dev, void __user *arg) */ kfib->header.XferState = 0; } else { - retval = aac_fib_send(le16_to_cpu(kfib->header.Command), fibptr, + retval = fib_send(le16_to_cpu(kfib->header.Command), fibptr, le16_to_cpu(kfib->header.Size) , FsaNormal, 1, 1, NULL, NULL); if (retval) { goto cleanup; } - if (aac_fib_complete(fibptr) != 0) { + if (fib_complete(fibptr) != 0) { retval = -EINVAL; goto cleanup; } @@ -138,7 +138,7 @@ static int ioctl_send_fib(struct aac_dev * dev, void __user *arg) fibptr->hw_fib_pa = hw_fib_pa; fibptr->hw_fib = hw_fib; } - aac_fib_free(fibptr); + fib_free(fibptr); return retval; } @@ -464,10 +464,10 @@ static int aac_send_raw_srb(struct aac_dev* dev, void __user * arg) /* * Allocate and initialize a Fib then setup a BlockWrite command */ - if (!(srbfib = aac_fib_alloc(dev))) { + if (!(srbfib = fib_alloc(dev))) { return -ENOMEM; } - aac_fib_init(srbfib); + fib_init(srbfib); srbcmd = (struct aac_srb*) fib_data(srbfib); @@ -601,7 +601,7 @@ static int aac_send_raw_srb(struct aac_dev* dev, void __user * arg) srbcmd->count = cpu_to_le32(byte_count); psg->count = cpu_to_le32(sg_indx+1); - status = aac_fib_send(ScsiPortCommand64, srbfib, actual_fibsize, FsaNormal, 1, 1,NULL,NULL); + status = fib_send(ScsiPortCommand64, srbfib, actual_fibsize, FsaNormal, 1, 1,NULL,NULL); } else { struct user_sgmap* upsg = &user_srbcmd->sg; struct sgmap* psg = &srbcmd->sg; @@ -649,7 +649,7 @@ static int aac_send_raw_srb(struct aac_dev* dev, void __user * arg) } srbcmd->count = cpu_to_le32(byte_count); psg->count = cpu_to_le32(sg_indx+1); - status = aac_fib_send(ScsiPortCommand, srbfib, actual_fibsize, FsaNormal, 1, 1, NULL, NULL); + status = fib_send(ScsiPortCommand, srbfib, actual_fibsize, FsaNormal, 1, 1, NULL, NULL); } if (status != 0){ @@ -684,8 +684,8 @@ static int aac_send_raw_srb(struct aac_dev* dev, void __user * arg) for(i=0; i <= sg_indx; i++){ kfree(sg_list[i]); } - aac_fib_complete(srbfib); - aac_fib_free(srbfib); + fib_complete(srbfib); + fib_free(srbfib); return rcode; } diff --git a/trunk/drivers/scsi/aacraid/comminit.c b/trunk/drivers/scsi/aacraid/comminit.c index 1628d094943d..82821d331c07 100644 --- a/trunk/drivers/scsi/aacraid/comminit.c +++ b/trunk/drivers/scsi/aacraid/comminit.c @@ -185,17 +185,17 @@ int aac_send_shutdown(struct aac_dev * dev) struct aac_close *cmd; int status; - fibctx = aac_fib_alloc(dev); + fibctx = fib_alloc(dev); if (!fibctx) return -ENOMEM; - aac_fib_init(fibctx); + fib_init(fibctx); cmd = (struct aac_close *) fib_data(fibctx); cmd->command = cpu_to_le32(VM_CloseAll); cmd->cid = cpu_to_le32(0xffffffff); - status = aac_fib_send(ContainerCommand, + status = fib_send(ContainerCommand, fibctx, sizeof(struct aac_close), FsaNormal, @@ -203,8 +203,8 @@ int aac_send_shutdown(struct aac_dev * dev) NULL, NULL); if (status == 0) - aac_fib_complete(fibctx); - aac_fib_free(fibctx); + fib_complete(fibctx); + fib_free(fibctx); return status; } @@ -427,7 +427,7 @@ struct aac_dev *aac_init_adapter(struct aac_dev *dev) /* * Initialize the list of fibs */ - if (aac_fib_setup(dev) < 0) { + if(fib_setup(dev)<0){ kfree(dev->queues); return NULL; } diff --git a/trunk/drivers/scsi/aacraid/commsup.c b/trunk/drivers/scsi/aacraid/commsup.c index 609fd19b1844..014cc8d54a9f 100644 --- a/trunk/drivers/scsi/aacraid/commsup.c +++ b/trunk/drivers/scsi/aacraid/commsup.c @@ -67,27 +67,27 @@ static int fib_map_alloc(struct aac_dev *dev) } /** - * aac_fib_map_free - free the fib objects + * fib_map_free - free the fib objects * @dev: Adapter to free * * Free the PCI mappings and the memory allocated for FIB blocks * on this adapter. */ -void aac_fib_map_free(struct aac_dev *dev) +void fib_map_free(struct aac_dev *dev) { pci_free_consistent(dev->pdev, dev->max_fib_size * (dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB), dev->hw_fib_va, dev->hw_fib_pa); } /** - * aac_fib_setup - setup the fibs + * fib_setup - setup the fibs * @dev: Adapter to set up * * Allocate the PCI space for the fibs, map it and then intialise the * fib area, the unmapped fib data and also the free list */ -int aac_fib_setup(struct aac_dev * dev) +int fib_setup(struct aac_dev * dev) { struct fib *fibptr; struct hw_fib *hw_fib_va; @@ -134,14 +134,14 @@ int aac_fib_setup(struct aac_dev * dev) } /** - * aac_fib_alloc - allocate a fib + * fib_alloc - allocate a fib * @dev: Adapter to allocate the fib for * * Allocate a fib from the adapter fib pool. If the pool is empty we * return NULL. */ -struct fib *aac_fib_alloc(struct aac_dev *dev) +struct fib * fib_alloc(struct aac_dev *dev) { struct fib * fibptr; unsigned long flags; @@ -170,14 +170,14 @@ struct fib *aac_fib_alloc(struct aac_dev *dev) } /** - * aac_fib_free - free a fib + * fib_free - free a fib * @fibptr: fib to free up * * Frees up a fib and places it on the appropriate queue * (either free or timed out) */ -void aac_fib_free(struct fib *fibptr) +void fib_free(struct fib * fibptr) { unsigned long flags; @@ -188,7 +188,7 @@ void aac_fib_free(struct fib *fibptr) fibptr->dev->timeout_fib = fibptr; } else { if (fibptr->hw_fib->header.XferState != 0) { - printk(KERN_WARNING "aac_fib_free, XferState != 0, fibptr = 0x%p, XferState = 0x%x\n", + printk(KERN_WARNING "fib_free, XferState != 0, fibptr = 0x%p, XferState = 0x%x\n", (void*)fibptr, le32_to_cpu(fibptr->hw_fib->header.XferState)); } @@ -199,13 +199,13 @@ void aac_fib_free(struct fib *fibptr) } /** - * aac_fib_init - initialise a fib + * fib_init - initialise a fib * @fibptr: The fib to initialize * * Set up the generic fib fields ready for use */ -void aac_fib_init(struct fib *fibptr) +void fib_init(struct fib *fibptr) { struct hw_fib *hw_fib = fibptr->hw_fib; @@ -362,7 +362,7 @@ static int aac_queue_get(struct aac_dev * dev, u32 * index, u32 qid, struct hw_f */ /** - * aac_fib_send - send a fib to the adapter + * fib_send - send a fib to the adapter * @command: Command to send * @fibptr: The fib * @size: Size of fib data area @@ -378,9 +378,7 @@ static int aac_queue_get(struct aac_dev * dev, u32 * index, u32 qid, struct hw_f * response FIB is received from the adapter. */ -int aac_fib_send(u16 command, struct fib *fibptr, unsigned long size, - int priority, int wait, int reply, fib_callback callback, - void *callback_data) +int fib_send(u16 command, struct fib * fibptr, unsigned long size, int priority, int wait, int reply, fib_callback callback, void * callback_data) { struct aac_dev * dev = fibptr->dev; struct hw_fib * hw_fib = fibptr->hw_fib; @@ -495,7 +493,7 @@ int aac_fib_send(u16 command, struct fib *fibptr, unsigned long size, q->numpending++; *(q->headers.producer) = cpu_to_le32(index + 1); spin_unlock_irqrestore(q->lock, qflags); - dprintk((KERN_DEBUG "aac_fib_send: inserting a queue entry at index %d.\n",index)); + dprintk((KERN_DEBUG "fib_send: inserting a queue entry at index %d.\n",index)); if (!(nointr & aac_config.irq_mod)) aac_adapter_notify(dev, AdapNormCmdQueue); } @@ -522,7 +520,7 @@ int aac_fib_send(u16 command, struct fib *fibptr, unsigned long size, list_del(&fibptr->queue); spin_unlock_irqrestore(q->lock, qflags); if (wait == -1) { - printk(KERN_ERR "aacraid: aac_fib_send: first asynchronous command timed out.\n" + printk(KERN_ERR "aacraid: fib_send: first asynchronous command timed out.\n" "Usually a result of a PCI interrupt routing problem;\n" "update mother board BIOS or consider utilizing one of\n" "the SAFE mode kernel options (acpi, apic etc)\n"); @@ -626,7 +624,7 @@ void aac_consumer_free(struct aac_dev * dev, struct aac_queue *q, u32 qid) } /** - * aac_fib_adapter_complete - complete adapter issued fib + * fib_adapter_complete - complete adapter issued fib * @fibptr: fib to complete * @size: size of fib * @@ -634,7 +632,7 @@ void aac_consumer_free(struct aac_dev * dev, struct aac_queue *q, u32 qid) * the adapter. */ -int aac_fib_adapter_complete(struct fib *fibptr, unsigned short size) +int fib_adapter_complete(struct fib * fibptr, unsigned short size) { struct hw_fib * hw_fib = fibptr->hw_fib; struct aac_dev * dev = fibptr->dev; @@ -685,20 +683,20 @@ int aac_fib_adapter_complete(struct fib *fibptr, unsigned short size) } else { - printk(KERN_WARNING "aac_fib_adapter_complete: Unknown xferstate detected.\n"); + printk(KERN_WARNING "fib_adapter_complete: Unknown xferstate detected.\n"); BUG(); } return 0; } /** - * aac_fib_complete - fib completion handler + * fib_complete - fib completion handler * @fib: FIB to complete * * Will do all necessary work to complete a FIB. */ -int aac_fib_complete(struct fib *fibptr) +int fib_complete(struct fib * fibptr) { struct hw_fib * hw_fib = fibptr->hw_fib; @@ -997,14 +995,14 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr) if (!dev || !dev->scsi_host_ptr) return; /* - * force reload of disk info via aac_probe_container + * force reload of disk info via probe_container */ if ((device_config_needed == CHANGE) && (dev->fsa_dev[container].valid == 1)) dev->fsa_dev[container].valid = 2; if ((device_config_needed == CHANGE) || (device_config_needed == ADD)) - aac_probe_container(dev, container); + probe_container(dev, container); device = scsi_device_lookup(dev->scsi_host_ptr, CONTAINER_TO_CHANNEL(container), CONTAINER_TO_ID(container), @@ -1106,7 +1104,7 @@ int aac_command_thread(struct aac_dev * dev) /* Handle Driver Notify Events */ aac_handle_aif(dev, fib); *(__le32 *)hw_fib->data = cpu_to_le32(ST_OK); - aac_fib_adapter_complete(fib, (u16)sizeof(u32)); + fib_adapter_complete(fib, (u16)sizeof(u32)); } else { struct list_head *entry; /* The u32 here is important and intended. We are using @@ -1243,7 +1241,7 @@ int aac_command_thread(struct aac_dev * dev) * Set the status of this FIB */ *(__le32 *)hw_fib->data = cpu_to_le32(ST_OK); - aac_fib_adapter_complete(fib, sizeof(u32)); + fib_adapter_complete(fib, sizeof(u32)); spin_unlock_irqrestore(&dev->fib_lock, flagv); /* Free up the remaining resources */ hw_fib_p = hw_fib_pool; diff --git a/trunk/drivers/scsi/aacraid/dpcsup.c b/trunk/drivers/scsi/aacraid/dpcsup.c index f6bcb9486f85..439948ef8251 100644 --- a/trunk/drivers/scsi/aacraid/dpcsup.c +++ b/trunk/drivers/scsi/aacraid/dpcsup.c @@ -206,7 +206,7 @@ unsigned int aac_command_normal(struct aac_queue *q) * Set the status of this FIB */ *(__le32 *)hw_fib->data = cpu_to_le32(ST_OK); - aac_fib_adapter_complete(fib, sizeof(u32)); + fib_adapter_complete(fib, sizeof(u32)); spin_lock_irqsave(q->lock, flags); } } diff --git a/trunk/drivers/scsi/aacraid/linit.c b/trunk/drivers/scsi/aacraid/linit.c index 271617890562..0bf5f9a943e8 100644 --- a/trunk/drivers/scsi/aacraid/linit.c +++ b/trunk/drivers/scsi/aacraid/linit.c @@ -385,45 +385,17 @@ static int aac_biosparm(struct scsi_device *sdev, struct block_device *bdev, static int aac_slave_configure(struct scsi_device *sdev) { - if (sdev_channel(sdev) == CONTAINER_CHANNEL) { - sdev->skip_ms_page_8 = 1; - sdev->skip_ms_page_3f = 1; - } - if ((sdev->type == TYPE_DISK) && - (sdev_channel(sdev) != CONTAINER_CHANNEL)) { - struct aac_dev *aac = (struct aac_dev *)sdev->host->hostdata; - if (!aac->raid_scsi_mode || (sdev_channel(sdev) != 2)) - sdev->no_uld_attach = 1; - } - if (sdev->tagged_supported && (sdev->type == TYPE_DISK) && - (sdev_channel(sdev) == CONTAINER_CHANNEL)) { - struct scsi_device * dev; - struct Scsi_Host *host = sdev->host; - unsigned num_lsu = 0; - unsigned num_one = 0; - unsigned depth; + struct Scsi_Host *host = sdev->host; - __shost_for_each_device(dev, host) { - if (dev->tagged_supported && (dev->type == TYPE_DISK) && - (sdev_channel(dev) == CONTAINER_CHANNEL)) - ++num_lsu; - else - ++num_one; - } - if (num_lsu == 0) - ++num_lsu; - depth = (host->can_queue - num_one) / num_lsu; - if (depth > 256) - depth = 256; - else if (depth < 2) - depth = 2; - scsi_adjust_queue_depth(sdev, MSG_ORDERED_TAG, depth); - if (!(((struct aac_dev *)host->hostdata)->adapter_info.options & - AAC_OPT_NEW_COMM)) - blk_queue_max_segment_size(sdev->request_queue, 65536); - } else + if (sdev->tagged_supported) + scsi_adjust_queue_depth(sdev, MSG_ORDERED_TAG, 128); + else scsi_adjust_queue_depth(sdev, 0, 1); + if (!(((struct aac_dev *)host->hostdata)->adapter_info.options + & AAC_OPT_NEW_COMM)) + blk_queue_max_segment_size(sdev->request_queue, 65536); + return 0; } @@ -898,7 +870,7 @@ static int __devinit aac_probe_one(struct pci_dev *pdev, /* * max channel will be the physical channels plus 1 virtual channel - * all containers are on the virtual channel 0 (CONTAINER_CHANNEL) + * all containers are on the virtual channel 0 * physical channels are address by their actual physical number+1 */ if (aac->nondasd_support == 1) @@ -941,7 +913,7 @@ static int __devinit aac_probe_one(struct pci_dev *pdev, aac_adapter_disable_int(aac); free_irq(pdev->irq, aac); out_unmap: - aac_fib_map_free(aac); + fib_map_free(aac); pci_free_consistent(aac->pdev, aac->comm_size, aac->comm_addr, aac->comm_phys); kfree(aac->queues); iounmap(aac->regs.sa); @@ -975,7 +947,7 @@ static void __devexit aac_remove_one(struct pci_dev *pdev) aac_send_shutdown(aac); aac_adapter_disable_int(aac); - aac_fib_map_free(aac); + fib_map_free(aac); pci_free_consistent(aac->pdev, aac->comm_size, aac->comm_addr, aac->comm_phys); kfree(aac->queues); diff --git a/trunk/drivers/scsi/gdth.c b/trunk/drivers/scsi/gdth.c index 62e3cda859af..bd3ffdf6c800 100644 --- a/trunk/drivers/scsi/gdth.c +++ b/trunk/drivers/scsi/gdth.c @@ -2816,7 +2816,7 @@ static int gdth_fill_cache_cmd(int hanum,Scsi_Cmnd *scp,ushort hdrive) } #endif - } else if (scp->request_bufflen) { + } else { scp->SCp.Status = GDTH_MAP_SINGLE; scp->SCp.Message = (read_write == 1 ? PCI_DMA_TODEVICE : PCI_DMA_FROMDEVICE); diff --git a/trunk/drivers/scsi/ipr.c b/trunk/drivers/scsi/ipr.c index 2bba5e55d7bc..27acf78cf8d8 100644 --- a/trunk/drivers/scsi/ipr.c +++ b/trunk/drivers/scsi/ipr.c @@ -4235,6 +4235,35 @@ static void ipr_scsi_done(struct ipr_cmnd *ipr_cmd) ipr_erp_start(ioa_cfg, ipr_cmd); } +/** + * ipr_save_ioafp_mode_select - Save adapters mode select data + * @ioa_cfg: ioa config struct + * @scsi_cmd: scsi command struct + * + * This function saves mode select data for the adapter to + * use following an adapter reset. + * + * Return value: + * 0 on success / SCSI_MLQUEUE_HOST_BUSY on failure + **/ +static int ipr_save_ioafp_mode_select(struct ipr_ioa_cfg *ioa_cfg, + struct scsi_cmnd *scsi_cmd) +{ + if (!ioa_cfg->saved_mode_pages) { + ioa_cfg->saved_mode_pages = kmalloc(sizeof(struct ipr_mode_pages), + GFP_ATOMIC); + if (!ioa_cfg->saved_mode_pages) { + dev_err(&ioa_cfg->pdev->dev, + "IOA mode select buffer allocation failed\n"); + return SCSI_MLQUEUE_HOST_BUSY; + } + } + + memcpy(ioa_cfg->saved_mode_pages, scsi_cmd->buffer, scsi_cmd->cmnd[4]); + ioa_cfg->saved_mode_page_len = scsi_cmd->cmnd[4]; + return 0; +} + /** * ipr_queuecommand - Queue a mid-layer request * @scsi_cmd: scsi command struct @@ -4309,6 +4338,9 @@ static int ipr_queuecommand(struct scsi_cmnd *scsi_cmd, (!ipr_is_gscsi(res) || scsi_cmd->cmnd[0] == IPR_QUERY_RSRC_STATE)) ioarcb->cmd_pkt.request_type = IPR_RQTYPE_IOACMD; + if (ipr_is_ioa_resource(res) && scsi_cmd->cmnd[0] == MODE_SELECT) + rc = ipr_save_ioafp_mode_select(ioa_cfg, scsi_cmd); + if (likely(rc == 0)) rc = ipr_build_ioadl(ioa_cfg, ipr_cmd); @@ -4797,11 +4829,17 @@ static int ipr_ioafp_mode_select_page28(struct ipr_cmnd *ipr_cmd) int length; ENTER; - ipr_scsi_bus_speed_limit(ioa_cfg); - ipr_check_term_power(ioa_cfg, mode_pages); - ipr_modify_ioafp_mode_page_28(ioa_cfg, mode_pages); - length = mode_pages->hdr.length + 1; - mode_pages->hdr.length = 0; + if (ioa_cfg->saved_mode_pages) { + memcpy(mode_pages, ioa_cfg->saved_mode_pages, + ioa_cfg->saved_mode_page_len); + length = ioa_cfg->saved_mode_page_len; + } else { + ipr_scsi_bus_speed_limit(ioa_cfg); + ipr_check_term_power(ioa_cfg, mode_pages); + ipr_modify_ioafp_mode_page_28(ioa_cfg, mode_pages); + length = mode_pages->hdr.length + 1; + mode_pages->hdr.length = 0; + } ipr_build_mode_select(ipr_cmd, cpu_to_be32(IPR_IOA_RES_HANDLE), 0x11, ioa_cfg->vpd_cbs_dma + offsetof(struct ipr_misc_cbs, mode_pages), @@ -5931,6 +5969,7 @@ static void ipr_free_mem(struct ipr_ioa_cfg *ioa_cfg) } ipr_free_dump(ioa_cfg); + kfree(ioa_cfg->saved_mode_pages); kfree(ioa_cfg->trace); } diff --git a/trunk/drivers/scsi/ipr.h b/trunk/drivers/scsi/ipr.h index fd360bfe56dd..b639332131f1 100644 --- a/trunk/drivers/scsi/ipr.h +++ b/trunk/drivers/scsi/ipr.h @@ -36,8 +36,8 @@ /* * Literals */ -#define IPR_DRIVER_VERSION "2.1.2" -#define IPR_DRIVER_DATE "(February 8, 2006)" +#define IPR_DRIVER_VERSION "2.1.1" +#define IPR_DRIVER_DATE "(November 15, 2005)" /* * IPR_MAX_CMD_PER_LUN: This defines the maximum number of outstanding @@ -1000,6 +1000,7 @@ struct ipr_ioa_cfg { struct Scsi_Host *host; struct pci_dev *pdev; struct ipr_sglist *ucode_sglist; + struct ipr_mode_pages *saved_mode_pages; u8 saved_mode_page_len; struct work_struct work_q; diff --git a/trunk/drivers/scsi/iscsi_tcp.c b/trunk/drivers/scsi/iscsi_tcp.c index ff79e68b347c..780bfcc67096 100644 --- a/trunk/drivers/scsi/iscsi_tcp.c +++ b/trunk/drivers/scsi/iscsi_tcp.c @@ -146,7 +146,7 @@ iscsi_conn_failure(struct iscsi_conn *conn, enum iscsi_err err) spin_unlock_irqrestore(&session->lock, flags); set_bit(SUSPEND_BIT, &conn->suspend_tx); set_bit(SUSPEND_BIT, &conn->suspend_rx); - iscsi_conn_error(conn->cls_conn, err); + iscsi_conn_error(iscsi_handle(conn), err); } static inline int @@ -244,10 +244,12 @@ iscsi_ctask_cleanup(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask) if (sc->sc_data_direction == DMA_TO_DEVICE) { struct iscsi_data_task *dtask, *n; /* WRITE: cleanup Data-Out's if any */ + spin_lock(&conn->lock); list_for_each_entry_safe(dtask, n, &ctask->dataqueue, item) { list_del(&dtask->item); mempool_free(dtask, ctask->datapool); } + spin_unlock(&conn->lock); } ctask->xmstate = XMSTATE_IDLE; ctask->r2t = NULL; @@ -687,7 +689,7 @@ iscsi_hdr_recv(struct iscsi_conn *conn) break; if (!conn->in.datalen) { - rc = iscsi_recv_pdu(conn->cls_conn, hdr, + rc = iscsi_recv_pdu(iscsi_handle(conn), hdr, NULL, 0); if (conn->login_mtask != mtask) { spin_lock(&session->lock); @@ -735,7 +737,7 @@ iscsi_hdr_recv(struct iscsi_conn *conn) if (!conn->in.datalen) { struct iscsi_mgmt_task *mtask; - rc = iscsi_recv_pdu(conn->cls_conn, hdr, + rc = iscsi_recv_pdu(iscsi_handle(conn), hdr, NULL, 0); mtask = (struct iscsi_mgmt_task *) session->mgmt_cmds[conn->in.itt - @@ -759,7 +761,7 @@ iscsi_hdr_recv(struct iscsi_conn *conn) rc = iscsi_check_assign_cmdsn(session, (struct iscsi_nopin*)hdr); if (!rc && hdr->ttt != ISCSI_RESERVED_TAG) - rc = iscsi_recv_pdu(conn->cls_conn, + rc = iscsi_recv_pdu(iscsi_handle(conn), hdr, NULL, 0); } else rc = ISCSI_ERR_PROTO; @@ -1042,7 +1044,7 @@ iscsi_data_recv(struct iscsi_conn *conn) goto exit; } - rc = iscsi_recv_pdu(conn->cls_conn, conn->in.hdr, + rc = iscsi_recv_pdu(iscsi_handle(conn), conn->in.hdr, conn->data, conn->in.datalen); if (!rc && conn->datadgst_en && @@ -2426,20 +2428,19 @@ iscsi_pool_free(struct iscsi_queue *q, void **items) } static struct iscsi_cls_conn * -iscsi_conn_create(struct iscsi_cls_session *cls_session, uint32_t conn_idx) +iscsi_conn_create(struct Scsi_Host *shost, uint32_t conn_idx) { - struct Scsi_Host *shost = iscsi_session_to_shost(cls_session); struct iscsi_session *session = iscsi_hostdata(shost->hostdata); struct iscsi_conn *conn; struct iscsi_cls_conn *cls_conn; - cls_conn = iscsi_create_conn(cls_session, conn_idx); + cls_conn = iscsi_create_conn(hostdata_session(shost->hostdata), + conn_idx); if (!cls_conn) return NULL; conn = cls_conn->dd_data; - memset(conn, 0, sizeof(*conn)); - conn->cls_conn = cls_conn; + memset(conn, 0, sizeof(struct iscsi_conn)); conn->c_stage = ISCSI_CONN_INITIAL_STAGE; conn->in_progress = IN_PROGRESS_WAIT_HEADER; conn->id = conn_idx; @@ -2451,6 +2452,8 @@ iscsi_conn_create(struct iscsi_cls_session *cls_session, uint32_t conn_idx) conn->data_size = DEFAULT_MAX_RECV_DATA_SEGMENT_LENGTH; conn->max_recv_dlength = DEFAULT_MAX_RECV_DATA_SEGMENT_LENGTH; + spin_lock_init(&conn->lock); + /* initialize general xmit PDU commands queue */ conn->xmitqueue = kfifo_alloc(session->cmds_max * sizeof(void*), GFP_KERNEL, NULL); @@ -2622,13 +2625,11 @@ iscsi_conn_destroy(struct iscsi_cls_conn *cls_conn) } static int -iscsi_conn_bind(struct iscsi_cls_session *cls_session, - struct iscsi_cls_conn *cls_conn, uint32_t transport_fd, - int is_leading) +iscsi_conn_bind(iscsi_sessionh_t sessionh, iscsi_connh_t connh, + uint32_t transport_fd, int is_leading) { - struct Scsi_Host *shost = iscsi_session_to_shost(cls_session); - struct iscsi_session *session = iscsi_hostdata(shost->hostdata); - struct iscsi_conn *tmp = ERR_PTR(-EEXIST), *conn = cls_conn->dd_data; + struct iscsi_session *session = iscsi_ptr(sessionh); + struct iscsi_conn *tmp = ERR_PTR(-EEXIST), *conn = iscsi_ptr(connh); struct sock *sk; struct socket *sock; int err; @@ -2702,9 +2703,9 @@ iscsi_conn_bind(struct iscsi_cls_session *cls_session, } static int -iscsi_conn_start(struct iscsi_cls_conn *cls_conn) +iscsi_conn_start(iscsi_connh_t connh) { - struct iscsi_conn *conn = cls_conn->dd_data; + struct iscsi_conn *conn = iscsi_ptr(connh); struct iscsi_session *session = conn->session; struct sock *sk; @@ -2753,9 +2754,9 @@ iscsi_conn_start(struct iscsi_cls_conn *cls_conn) } static void -iscsi_conn_stop(struct iscsi_cls_conn *cls_conn, int flag) +iscsi_conn_stop(iscsi_connh_t connh, int flag) { - struct iscsi_conn *conn = cls_conn->dd_data; + struct iscsi_conn *conn = iscsi_ptr(connh); struct iscsi_session *session = conn->session; struct sock *sk; unsigned long flags; @@ -3252,9 +3253,9 @@ static struct scsi_host_template iscsi_sht = { static struct iscsi_transport iscsi_tcp_transport; -static struct iscsi_cls_session * +static struct Scsi_Host * iscsi_session_create(struct scsi_transport_template *scsit, - uint32_t initial_cmdsn, uint32_t *sid) + uint32_t initial_cmdsn) { struct Scsi_Host *shost; struct iscsi_session *session; @@ -3267,14 +3268,13 @@ iscsi_session_create(struct scsi_transport_template *scsit, session = iscsi_hostdata(shost->hostdata); memset(session, 0, sizeof(struct iscsi_session)); session->host = shost; - session->state = ISCSI_STATE_FREE; + session->state = ISCSI_STATE_LOGGED_IN; session->mgmtpool_max = ISCSI_MGMT_CMDS_MAX; session->cmds_max = ISCSI_XMIT_CMDS_MAX; session->cmdsn = initial_cmdsn; session->exp_cmdsn = initial_cmdsn + 1; session->max_cmdsn = initial_cmdsn + 1; session->max_r2t = 1; - *sid = shost->host_no; /* initialize SCSI PDU commands pool */ if (iscsi_pool_init(&session->cmdpool, session->cmds_max, @@ -3311,24 +3311,22 @@ iscsi_session_create(struct scsi_transport_template *scsit, if (iscsi_r2tpool_alloc(session)) goto r2tpool_alloc_fail; - return hostdata_session(shost->hostdata); + return shost; r2tpool_alloc_fail: for (cmd_i = 0; cmd_i < session->mgmtpool_max; cmd_i++) kfree(session->mgmt_cmds[cmd_i]->data); -immdata_alloc_fail: iscsi_pool_free(&session->mgmtpool, (void**)session->mgmt_cmds); +immdata_alloc_fail: mgmtpool_alloc_fail: iscsi_pool_free(&session->cmdpool, (void**)session->cmds); cmdpool_alloc_fail: - iscsi_transport_destroy_session(shost); return NULL; } static void -iscsi_session_destroy(struct iscsi_cls_session *cls_session) +iscsi_session_destroy(struct Scsi_Host *shost) { - struct Scsi_Host *shost = iscsi_session_to_shost(cls_session); struct iscsi_session *session = iscsi_hostdata(shost->hostdata); int cmd_i; struct iscsi_data_task *dtask, *n; @@ -3352,10 +3350,10 @@ iscsi_session_destroy(struct iscsi_cls_session *cls_session) } static int -iscsi_conn_set_param(struct iscsi_cls_conn *cls_conn, enum iscsi_param param, +iscsi_conn_set_param(iscsi_connh_t connh, enum iscsi_param param, uint32_t value) { - struct iscsi_conn *conn = cls_conn->dd_data; + struct iscsi_conn *conn = iscsi_ptr(connh); struct iscsi_session *session = conn->session; spin_lock_bh(&session->lock); @@ -3497,10 +3495,9 @@ iscsi_conn_set_param(struct iscsi_cls_conn *cls_conn, enum iscsi_param param, } static int -iscsi_session_get_param(struct iscsi_cls_session *cls_session, +iscsi_session_get_param(struct Scsi_Host *shost, enum iscsi_param param, uint32_t *value) { - struct Scsi_Host *shost = iscsi_session_to_shost(cls_session); struct iscsi_session *session = iscsi_hostdata(shost->hostdata); switch(param) { @@ -3542,10 +3539,9 @@ iscsi_session_get_param(struct iscsi_cls_session *cls_session, } static int -iscsi_conn_get_param(struct iscsi_cls_conn *cls_conn, - enum iscsi_param param, uint32_t *value) +iscsi_conn_get_param(void *data, enum iscsi_param param, uint32_t *value) { - struct iscsi_conn *conn = cls_conn->dd_data; + struct iscsi_conn *conn = data; switch(param) { case ISCSI_PARAM_MAX_RECV_DLENGTH: @@ -3568,9 +3564,9 @@ iscsi_conn_get_param(struct iscsi_cls_conn *cls_conn, } static void -iscsi_conn_get_stats(struct iscsi_cls_conn *cls_conn, struct iscsi_stats *stats) +iscsi_conn_get_stats(iscsi_connh_t connh, struct iscsi_stats *stats) { - struct iscsi_conn *conn = cls_conn->dd_data; + struct iscsi_conn *conn = iscsi_ptr(connh); stats->txdata_octets = conn->txdata_octets; stats->rxdata_octets = conn->rxdata_octets; @@ -3591,10 +3587,10 @@ iscsi_conn_get_stats(struct iscsi_cls_conn *cls_conn, struct iscsi_stats *stats) } static int -iscsi_conn_send_pdu(struct iscsi_cls_conn *cls_conn, struct iscsi_hdr *hdr, - char *data, uint32_t data_size) +iscsi_conn_send_pdu(iscsi_connh_t connh, struct iscsi_hdr *hdr, char *data, + uint32_t data_size) { - struct iscsi_conn *conn = cls_conn->dd_data; + struct iscsi_conn *conn = iscsi_ptr(connh); int rc; mutex_lock(&conn->xmitmutex); diff --git a/trunk/drivers/scsi/iscsi_tcp.h b/trunk/drivers/scsi/iscsi_tcp.h index ba26741ac154..f95e61b76f70 100644 --- a/trunk/drivers/scsi/iscsi_tcp.h +++ b/trunk/drivers/scsi/iscsi_tcp.h @@ -113,10 +113,7 @@ struct iscsi_tcp_recv { int datadgst; }; -struct iscsi_cls_conn; - struct iscsi_conn { - struct iscsi_cls_conn *cls_conn; /* ptr to class connection */ struct iscsi_hdr hdr; /* header placeholder */ char hdrext[4*sizeof(__u16) + sizeof(__u32)]; @@ -146,6 +143,7 @@ struct iscsi_conn { struct iscsi_mgmt_task *login_mtask; /* mtask used for login/text */ struct iscsi_mgmt_task *mtask; /* xmit mtask in progress */ struct iscsi_cmd_task *ctask; /* xmit ctask in progress */ + spinlock_t lock; /* FIXME: to be removed */ /* old values for socket callbacks */ void (*old_data_ready)(struct sock *, int); diff --git a/trunk/drivers/scsi/megaraid.c b/trunk/drivers/scsi/megaraid.c index 7144674bc8e6..d101a8a6f4e8 100644 --- a/trunk/drivers/scsi/megaraid.c +++ b/trunk/drivers/scsi/megaraid.c @@ -5049,7 +5049,7 @@ static struct pci_device_id megaraid_pci_tbl[] = { MODULE_DEVICE_TABLE(pci, megaraid_pci_tbl); static struct pci_driver megaraid_pci_driver = { - .name = "megaraid_legacy", + .name = "megaraid", .id_table = megaraid_pci_tbl, .probe = megaraid_probe_one, .remove = __devexit_p(megaraid_remove_one), diff --git a/trunk/drivers/scsi/megaraid.h b/trunk/drivers/scsi/megaraid.h index 4b75fe619d9c..4b3e0d6e5afa 100644 --- a/trunk/drivers/scsi/megaraid.h +++ b/trunk/drivers/scsi/megaraid.h @@ -5,7 +5,7 @@ #include #define MEGARAID_VERSION \ - "v2.00.4 (Release Date: Thu Feb 9 08:51:30 EST 2006)\n" + "v2.00.3 (Release Date: Wed Feb 19 08:51:30 EST 2003)\n" /* * Driver features - change the values to enable or disable features in the diff --git a/trunk/drivers/scsi/megaraid/megaraid_sas.c b/trunk/drivers/scsi/megaraid/megaraid_sas.c index 7de267e14458..a487f414960e 100644 --- a/trunk/drivers/scsi/megaraid/megaraid_sas.c +++ b/trunk/drivers/scsi/megaraid/megaraid_sas.c @@ -10,7 +10,7 @@ * 2 of the License, or (at your option) any later version. * * FILE : megaraid_sas.c - * Version : v00.00.02.04 + * Version : v00.00.02.02 * * Authors: * Sreenivas Bagalkote @@ -59,12 +59,6 @@ static struct pci_device_id megasas_pci_table[] = { PCI_ANY_ID, PCI_ANY_ID, }, - { - PCI_VENDOR_ID_LSI_LOGIC, - PCI_DEVICE_ID_LSI_SAS1078R, // ppc IOP - PCI_ANY_ID, - PCI_ANY_ID, - }, { PCI_VENDOR_ID_DELL, PCI_DEVICE_ID_DELL_PERC5, // xscale IOP @@ -204,86 +198,6 @@ static struct megasas_instance_template megasas_instance_template_xscale = { * to xscale (deviceid : 1064R, PERC5) controllers */ -/** -* The following functions are defined for ppc (deviceid : 0x60) -* controllers -*/ - -/** - * megasas_enable_intr_ppc - Enables interrupts - * @regs: MFI register set - */ -static inline void -megasas_enable_intr_ppc(struct megasas_register_set __iomem * regs) -{ - writel(0xFFFFFFFF, &(regs)->outbound_doorbell_clear); - - writel(~0x80000004, &(regs)->outbound_intr_mask); - - /* Dummy readl to force pci flush */ - readl(®s->outbound_intr_mask); -} - -/** - * megasas_read_fw_status_reg_ppc - returns the current FW status value - * @regs: MFI register set - */ -static u32 -megasas_read_fw_status_reg_ppc(struct megasas_register_set __iomem * regs) -{ - return readl(&(regs)->outbound_scratch_pad); -} - -/** - * megasas_clear_interrupt_ppc - Check & clear interrupt - * @regs: MFI register set - */ -static int -megasas_clear_intr_ppc(struct megasas_register_set __iomem * regs) -{ - u32 status; - /* - * Check if it is our interrupt - */ - status = readl(®s->outbound_intr_status); - - if (!(status & MFI_REPLY_1078_MESSAGE_INTERRUPT)) { - return 1; - } - - /* - * Clear the interrupt by writing back the same value - */ - writel(status, ®s->outbound_doorbell_clear); - - return 0; -} -/** - * megasas_fire_cmd_ppc - Sends command to the FW - * @frame_phys_addr : Physical address of cmd - * @frame_count : Number of frames for the command - * @regs : MFI register set - */ -static inline void -megasas_fire_cmd_ppc(dma_addr_t frame_phys_addr, u32 frame_count, struct megasas_register_set __iomem *regs) -{ - writel((frame_phys_addr | (frame_count<<1))|1, - &(regs)->inbound_queue_port); -} - -static struct megasas_instance_template megasas_instance_template_ppc = { - - .fire_cmd = megasas_fire_cmd_ppc, - .enable_intr = megasas_enable_intr_ppc, - .clear_intr = megasas_clear_intr_ppc, - .read_fw_status_reg = megasas_read_fw_status_reg_ppc, -}; - -/** -* This is the end of set of functions & definitions -* specific to ppc (deviceid : 0x60) controllers -*/ - /** * megasas_disable_intr - Disables interrupts * @regs: MFI register set @@ -1693,17 +1607,7 @@ static int megasas_init_mfi(struct megasas_instance *instance) reg_set = instance->reg_set; - switch(instance->pdev->device) - { - case PCI_DEVICE_ID_LSI_SAS1078R: - instance->instancet = &megasas_instance_template_ppc; - break; - case PCI_DEVICE_ID_LSI_SAS1064R: - case PCI_DEVICE_ID_DELL_PERC5: - default: - instance->instancet = &megasas_instance_template_xscale; - break; - } + instance->instancet = &megasas_instance_template_xscale; /* * We expect the FW state to be READY @@ -2079,7 +1983,6 @@ static int megasas_io_attach(struct megasas_instance *instance) host->max_channel = MEGASAS_MAX_CHANNELS - 1; host->max_id = MEGASAS_MAX_DEV_PER_CHANNEL; host->max_lun = MEGASAS_MAX_LUN; - host->max_cmd_len = 16; /* * Notify the mid-layer about the new controller diff --git a/trunk/drivers/scsi/megaraid/megaraid_sas.h b/trunk/drivers/scsi/megaraid/megaraid_sas.h index 89639f0c38ef..d6d166c0663f 100644 --- a/trunk/drivers/scsi/megaraid/megaraid_sas.h +++ b/trunk/drivers/scsi/megaraid/megaraid_sas.h @@ -18,9 +18,9 @@ /** * MegaRAID SAS Driver meta data */ -#define MEGASAS_VERSION "00.00.02.04" -#define MEGASAS_RELDATE "Feb 03, 2006" -#define MEGASAS_EXT_VERSION "Fri Feb 03 14:31:44 PST 2006" +#define MEGASAS_VERSION "00.00.02.02" +#define MEGASAS_RELDATE "Jan 23, 2006" +#define MEGASAS_EXT_VERSION "Mon Jan 23 14:09:01 PST 2006" /* * ===================================== * MegaRAID SAS MFI firmware definitions @@ -553,46 +553,31 @@ struct megasas_ctrl_info { #define MFI_OB_INTR_STATUS_MASK 0x00000002 #define MFI_POLL_TIMEOUT_SECS 10 -#define MFI_REPLY_1078_MESSAGE_INTERRUPT 0x80000000 -#define PCI_DEVICE_ID_LSI_SAS1078R 0x00000060 - struct megasas_register_set { - u32 reserved_0[4]; /*0000h*/ - u32 inbound_msg_0; /*0010h*/ - u32 inbound_msg_1; /*0014h*/ - u32 outbound_msg_0; /*0018h*/ - u32 outbound_msg_1; /*001Ch*/ + u32 reserved_0[4]; /*0000h */ - u32 inbound_doorbell; /*0020h*/ - u32 inbound_intr_status; /*0024h*/ - u32 inbound_intr_mask; /*0028h*/ + u32 inbound_msg_0; /*0010h */ + u32 inbound_msg_1; /*0014h */ + u32 outbound_msg_0; /*0018h */ + u32 outbound_msg_1; /*001Ch */ - u32 outbound_doorbell; /*002Ch*/ - u32 outbound_intr_status; /*0030h*/ - u32 outbound_intr_mask; /*0034h*/ + u32 inbound_doorbell; /*0020h */ + u32 inbound_intr_status; /*0024h */ + u32 inbound_intr_mask; /*0028h */ - u32 reserved_1[2]; /*0038h*/ + u32 outbound_doorbell; /*002Ch */ + u32 outbound_intr_status; /*0030h */ + u32 outbound_intr_mask; /*0034h */ - u32 inbound_queue_port; /*0040h*/ - u32 outbound_queue_port; /*0044h*/ + u32 reserved_1[2]; /*0038h */ - u32 reserved_2[22]; /*0048h*/ + u32 inbound_queue_port; /*0040h */ + u32 outbound_queue_port; /*0044h */ - u32 outbound_doorbell_clear; /*00A0h*/ + u32 reserved_2; /*004Ch */ - u32 reserved_3[3]; /*00A4h*/ - - u32 outbound_scratch_pad ; /*00B0h*/ - - u32 reserved_4[3]; /*00B4h*/ - - u32 inbound_low_queue_port ; /*00C0h*/ - - u32 inbound_high_queue_port ; /*00C4h*/ - - u32 reserved_5; /*00C8h*/ - u32 index_registers[820]; /*00CCh*/ + u32 index_registers[1004]; /*0050h */ } __attribute__ ((packed)); diff --git a/trunk/drivers/scsi/qla2xxx/qla_attr.c b/trunk/drivers/scsi/qla2xxx/qla_attr.c index 92b3e13e9061..b17ee62dd1a9 100644 --- a/trunk/drivers/scsi/qla2xxx/qla_attr.c +++ b/trunk/drivers/scsi/qla2xxx/qla_attr.c @@ -7,6 +7,7 @@ #include "qla_def.h" #include +#include /* SYSFS attributes --------------------------------------------------------- */ @@ -113,7 +114,7 @@ qla2x00_sysfs_read_nvram(struct kobject *kobj, char *buf, loff_t off, struct device, kobj))); unsigned long flags; - if (!capable(CAP_SYS_ADMIN) || off != 0) + if (!capable(CAP_SYS_ADMIN) || off != 0 || count != ha->nvram_size) return 0; /* Read NVRAM. */ @@ -122,7 +123,7 @@ qla2x00_sysfs_read_nvram(struct kobject *kobj, char *buf, loff_t off, ha->nvram_size); spin_unlock_irqrestore(&ha->hardware_lock, flags); - return ha->nvram_size; + return (count); } static ssize_t @@ -174,150 +175,19 @@ static struct bin_attribute sysfs_nvram_attr = { .mode = S_IRUSR | S_IWUSR, .owner = THIS_MODULE, }, - .size = 512, + .size = 0, .read = qla2x00_sysfs_read_nvram, .write = qla2x00_sysfs_write_nvram, }; -static ssize_t -qla2x00_sysfs_read_optrom(struct kobject *kobj, char *buf, loff_t off, - size_t count) -{ - struct scsi_qla_host *ha = to_qla_host(dev_to_shost(container_of(kobj, - struct device, kobj))); - - if (ha->optrom_state != QLA_SREADING) - return 0; - if (off > ha->optrom_size) - return 0; - if (off + count > ha->optrom_size) - count = ha->optrom_size - off; - - memcpy(buf, &ha->optrom_buffer[off], count); - - return count; -} - -static ssize_t -qla2x00_sysfs_write_optrom(struct kobject *kobj, char *buf, loff_t off, - size_t count) -{ - struct scsi_qla_host *ha = to_qla_host(dev_to_shost(container_of(kobj, - struct device, kobj))); - - if (ha->optrom_state != QLA_SWRITING) - return -EINVAL; - if (off > ha->optrom_size) - return -ERANGE; - if (off + count > ha->optrom_size) - count = ha->optrom_size - off; - - memcpy(&ha->optrom_buffer[off], buf, count); - - return count; -} - -static struct bin_attribute sysfs_optrom_attr = { - .attr = { - .name = "optrom", - .mode = S_IRUSR | S_IWUSR, - .owner = THIS_MODULE, - }, - .size = OPTROM_SIZE_24XX, - .read = qla2x00_sysfs_read_optrom, - .write = qla2x00_sysfs_write_optrom, -}; - -static ssize_t -qla2x00_sysfs_write_optrom_ctl(struct kobject *kobj, char *buf, loff_t off, - size_t count) -{ - struct scsi_qla_host *ha = to_qla_host(dev_to_shost(container_of(kobj, - struct device, kobj))); - int val; - - if (off) - return 0; - - if (sscanf(buf, "%d", &val) != 1) - return -EINVAL; - - switch (val) { - case 0: - if (ha->optrom_state != QLA_SREADING && - ha->optrom_state != QLA_SWRITING) - break; - - ha->optrom_state = QLA_SWAITING; - vfree(ha->optrom_buffer); - ha->optrom_buffer = NULL; - break; - case 1: - if (ha->optrom_state != QLA_SWAITING) - break; - - ha->optrom_state = QLA_SREADING; - ha->optrom_buffer = (uint8_t *)vmalloc(ha->optrom_size); - if (ha->optrom_buffer == NULL) { - qla_printk(KERN_WARNING, ha, - "Unable to allocate memory for optrom retrieval " - "(%x).\n", ha->optrom_size); - - ha->optrom_state = QLA_SWAITING; - return count; - } - - memset(ha->optrom_buffer, 0, ha->optrom_size); - ha->isp_ops.read_optrom(ha, ha->optrom_buffer, 0, - ha->optrom_size); - break; - case 2: - if (ha->optrom_state != QLA_SWAITING) - break; - - ha->optrom_state = QLA_SWRITING; - ha->optrom_buffer = (uint8_t *)vmalloc(ha->optrom_size); - if (ha->optrom_buffer == NULL) { - qla_printk(KERN_WARNING, ha, - "Unable to allocate memory for optrom update " - "(%x).\n", ha->optrom_size); - - ha->optrom_state = QLA_SWAITING; - return count; - } - memset(ha->optrom_buffer, 0, ha->optrom_size); - break; - case 3: - if (ha->optrom_state != QLA_SWRITING) - break; - - ha->isp_ops.write_optrom(ha, ha->optrom_buffer, 0, - ha->optrom_size); - break; - } - return count; -} - -static struct bin_attribute sysfs_optrom_ctl_attr = { - .attr = { - .name = "optrom_ctl", - .mode = S_IWUSR, - .owner = THIS_MODULE, - }, - .size = 0, - .write = qla2x00_sysfs_write_optrom_ctl, -}; - void qla2x00_alloc_sysfs_attr(scsi_qla_host_t *ha) { struct Scsi_Host *host = ha->host; sysfs_create_bin_file(&host->shost_gendev.kobj, &sysfs_fw_dump_attr); + sysfs_nvram_attr.size = ha->nvram_size; sysfs_create_bin_file(&host->shost_gendev.kobj, &sysfs_nvram_attr); - sysfs_create_bin_file(&host->shost_gendev.kobj, &sysfs_optrom_attr); - sysfs_create_bin_file(&host->shost_gendev.kobj, - &sysfs_optrom_ctl_attr); } void @@ -327,12 +197,6 @@ qla2x00_free_sysfs_attr(scsi_qla_host_t *ha) sysfs_remove_bin_file(&host->shost_gendev.kobj, &sysfs_fw_dump_attr); sysfs_remove_bin_file(&host->shost_gendev.kobj, &sysfs_nvram_attr); - sysfs_remove_bin_file(&host->shost_gendev.kobj, &sysfs_optrom_attr); - sysfs_remove_bin_file(&host->shost_gendev.kobj, - &sysfs_optrom_ctl_attr); - - if (ha->beacon_blink_led == 1) - ha->isp_ops.beacon_off(ha); } /* Scsi_Host attributes. */ @@ -520,50 +384,6 @@ qla2x00_zio_timer_store(struct class_device *cdev, const char *buf, return strlen(buf); } -static ssize_t -qla2x00_beacon_show(struct class_device *cdev, char *buf) -{ - scsi_qla_host_t *ha = to_qla_host(class_to_shost(cdev)); - int len = 0; - - if (ha->beacon_blink_led) - len += snprintf(buf + len, PAGE_SIZE-len, "Enabled\n"); - else - len += snprintf(buf + len, PAGE_SIZE-len, "Disabled\n"); - return len; -} - -static ssize_t -qla2x00_beacon_store(struct class_device *cdev, const char *buf, - size_t count) -{ - scsi_qla_host_t *ha = to_qla_host(class_to_shost(cdev)); - int val = 0; - int rval; - - if (IS_QLA2100(ha) || IS_QLA2200(ha)) - return -EPERM; - - if (test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags)) { - qla_printk(KERN_WARNING, ha, - "Abort ISP active -- ignoring beacon request.\n"); - return -EBUSY; - } - - if (sscanf(buf, "%d", &val) != 1) - return -EINVAL; - - if (val) - rval = ha->isp_ops.beacon_on(ha); - else - rval = ha->isp_ops.beacon_off(ha); - - if (rval != QLA_SUCCESS) - count = 0; - - return count; -} - static CLASS_DEVICE_ATTR(driver_version, S_IRUGO, qla2x00_drvr_version_show, NULL); static CLASS_DEVICE_ATTR(fw_version, S_IRUGO, qla2x00_fw_version_show, NULL); @@ -578,8 +398,6 @@ static CLASS_DEVICE_ATTR(zio, S_IRUGO | S_IWUSR, qla2x00_zio_show, qla2x00_zio_store); static CLASS_DEVICE_ATTR(zio_timer, S_IRUGO | S_IWUSR, qla2x00_zio_timer_show, qla2x00_zio_timer_store); -static CLASS_DEVICE_ATTR(beacon, S_IRUGO | S_IWUSR, qla2x00_beacon_show, - qla2x00_beacon_store); struct class_device_attribute *qla2x00_host_attrs[] = { &class_device_attr_driver_version, @@ -593,7 +411,6 @@ struct class_device_attribute *qla2x00_host_attrs[] = { &class_device_attr_state, &class_device_attr_zio, &class_device_attr_zio_timer, - &class_device_attr_beacon, NULL, }; @@ -608,49 +425,6 @@ qla2x00_get_host_port_id(struct Scsi_Host *shost) ha->d_id.b.area << 8 | ha->d_id.b.al_pa; } -static void -qla2x00_get_host_speed(struct Scsi_Host *shost) -{ - scsi_qla_host_t *ha = to_qla_host(shost); - uint32_t speed = 0; - - switch (ha->link_data_rate) { - case LDR_1GB: - speed = 1; - break; - case LDR_2GB: - speed = 2; - break; - case LDR_4GB: - speed = 4; - break; - } - fc_host_speed(shost) = speed; -} - -static void -qla2x00_get_host_port_type(struct Scsi_Host *shost) -{ - scsi_qla_host_t *ha = to_qla_host(shost); - uint32_t port_type = FC_PORTTYPE_UNKNOWN; - - switch (ha->current_topology) { - case ISP_CFG_NL: - port_type = FC_PORTTYPE_LPORT; - break; - case ISP_CFG_FL: - port_type = FC_PORTTYPE_NLPORT; - break; - case ISP_CFG_N: - port_type = FC_PORTTYPE_PTP; - break; - case ISP_CFG_F: - port_type = FC_PORTTYPE_NPORT; - break; - } - fc_host_port_type(shost) = port_type; -} - static void qla2x00_get_starget_node_name(struct scsi_target *starget) { @@ -738,41 +512,6 @@ qla2x00_issue_lip(struct Scsi_Host *shost) return 0; } -static struct fc_host_statistics * -qla2x00_get_fc_host_stats(struct Scsi_Host *shost) -{ - scsi_qla_host_t *ha = to_qla_host(shost); - int rval; - uint16_t mb_stat[1]; - link_stat_t stat_buf; - struct fc_host_statistics *pfc_host_stat; - - pfc_host_stat = &ha->fc_host_stat; - memset(pfc_host_stat, -1, sizeof(struct fc_host_statistics)); - - if (IS_QLA24XX(ha) || IS_QLA25XX(ha)) { - rval = qla24xx_get_isp_stats(ha, (uint32_t *)&stat_buf, - sizeof(stat_buf) / 4, mb_stat); - } else { - rval = qla2x00_get_link_status(ha, ha->loop_id, &stat_buf, - mb_stat); - } - if (rval != 0) { - qla_printk(KERN_WARNING, ha, - "Unable to retrieve host statistics (%d).\n", mb_stat[0]); - return pfc_host_stat; - } - - pfc_host_stat->link_failure_count = stat_buf.link_fail_cnt; - pfc_host_stat->loss_of_sync_count = stat_buf.loss_sync_cnt; - pfc_host_stat->loss_of_signal_count = stat_buf.loss_sig_cnt; - pfc_host_stat->prim_seq_protocol_err_count = stat_buf.prim_seq_err_cnt; - pfc_host_stat->invalid_tx_word_count = stat_buf.inval_xmit_word_cnt; - pfc_host_stat->invalid_crc_count = stat_buf.inval_crc_cnt; - - return pfc_host_stat; -} - struct fc_function_template qla2xxx_transport_functions = { .show_host_node_name = 1, @@ -781,10 +520,6 @@ struct fc_function_template qla2xxx_transport_functions = { .get_host_port_id = qla2x00_get_host_port_id, .show_host_port_id = 1, - .get_host_speed = qla2x00_get_host_speed, - .show_host_speed = 1, - .get_host_port_type = qla2x00_get_host_port_type, - .show_host_port_type = 1, .dd_fcrport_size = sizeof(struct fc_port *), .show_rport_supported_classes = 1, @@ -801,7 +536,6 @@ struct fc_function_template qla2xxx_transport_functions = { .show_rport_dev_loss_tmo = 1, .issue_fc_host_lip = qla2x00_issue_lip, - .get_fc_host_stats = qla2x00_get_fc_host_stats, }; void diff --git a/trunk/drivers/scsi/qla2xxx/qla_def.h b/trunk/drivers/scsi/qla2xxx/qla_def.h index b31a03bbd14f..bad066e5772a 100644 --- a/trunk/drivers/scsi/qla2xxx/qla_def.h +++ b/trunk/drivers/scsi/qla2xxx/qla_def.h @@ -29,7 +29,6 @@ #include #include #include -#include #if defined(CONFIG_SCSI_QLA2XXX_EMBEDDED_FIRMWARE) #if defined(CONFIG_SCSI_QLA21XX) || defined(CONFIG_SCSI_QLA21XX_MODULE) @@ -181,13 +180,6 @@ #define WRT_REG_WORD(addr, data) writew(data,addr) #define WRT_REG_DWORD(addr, data) writel(data,addr) -/* - * The ISP2312 v2 chip cannot access the FLASH/GPIO registers via MMIO in an - * 133Mhz slot. - */ -#define RD_REG_WORD_PIO(addr) (inw((unsigned long)addr)) -#define WRT_REG_WORD_PIO(addr, data) (outw(data,(unsigned long)addr)) - /* * Fibre Channel device definitions. */ @@ -440,9 +432,6 @@ struct device_reg_2xxx { #define GPIO_LED_GREEN_ON_AMBER_OFF 0x0040 #define GPIO_LED_GREEN_OFF_AMBER_ON 0x0080 #define GPIO_LED_GREEN_ON_AMBER_ON 0x00C0 -#define GPIO_LED_ALL_OFF 0x0000 -#define GPIO_LED_RED_ON_OTHER_OFF 0x0001 /* isp2322 */ -#define GPIO_LED_RGA_ON 0x00C1 /* isp2322: red green amber */ union { struct { @@ -2210,15 +2199,6 @@ struct isp_operations { void (*fw_dump) (struct scsi_qla_host *, int); void (*ascii_fw_dump) (struct scsi_qla_host *); - - int (*beacon_on) (struct scsi_qla_host *); - int (*beacon_off) (struct scsi_qla_host *); - void (*beacon_blink) (struct scsi_qla_host *); - - uint8_t * (*read_optrom) (struct scsi_qla_host *, uint8_t *, - uint32_t, uint32_t); - int (*write_optrom) (struct scsi_qla_host *, uint8_t *, uint32_t, - uint32_t); }; /* @@ -2351,10 +2331,6 @@ typedef struct scsi_qla_host { uint16_t min_external_loopid; /* First external loop Id */ uint16_t link_data_rate; /* F/W operating speed */ -#define LDR_1GB 0 -#define LDR_2GB 1 -#define LDR_4GB 3 -#define LDR_UNKNOWN 0xFFFF uint8_t current_topology; uint8_t prev_topology; @@ -2510,26 +2486,12 @@ typedef struct scsi_qla_host { uint8_t *port_name; uint32_t isp_abort_cnt; - /* Option ROM information. */ - char *optrom_buffer; - uint32_t optrom_size; - int optrom_state; -#define QLA_SWAITING 0 -#define QLA_SREADING 1 -#define QLA_SWRITING 2 - /* Needed for BEACON */ uint16_t beacon_blink_led; - uint8_t beacon_color_state; -#define QLA_LED_GRN_ON 0x01 -#define QLA_LED_YLW_ON 0x02 -#define QLA_LED_ABR_ON 0x04 -#define QLA_LED_ALL_ON 0x07 /* yellow, green, amber. */ - /* ISP2322: red, green, amber. */ + uint16_t beacon_green_on; uint16_t zio_mode; uint16_t zio_timer; - struct fc_host_statistics fc_host_stat; } scsi_qla_host_t; @@ -2595,9 +2557,7 @@ struct _qla2x00stats { /* * Flash support definitions */ -#define OPTROM_SIZE_2300 0x20000 -#define OPTROM_SIZE_2322 0x100000 -#define OPTROM_SIZE_24XX 0x100000 +#define FLASH_IMAGE_SIZE 131072 #include "qla_gbl.h" #include "qla_dbg.h" diff --git a/trunk/drivers/scsi/qla2xxx/qla_gbl.h b/trunk/drivers/scsi/qla2xxx/qla_gbl.h index ffdc2680f049..35266bd5d538 100644 --- a/trunk/drivers/scsi/qla2xxx/qla_gbl.h +++ b/trunk/drivers/scsi/qla2xxx/qla_gbl.h @@ -75,12 +75,12 @@ extern void qla2x00_cmd_timeout(srb_t *); extern void qla2x00_mark_device_lost(scsi_qla_host_t *, fc_port_t *, int, int); extern void qla2x00_mark_all_devices_lost(scsi_qla_host_t *, int); +extern void qla2x00_blink_led(scsi_qla_host_t *); + extern int qla2x00_down_timeout(struct semaphore *, unsigned long); extern struct fw_blob *qla2x00_request_firmware(scsi_qla_host_t *); -extern int qla2x00_wait_for_hba_online(scsi_qla_host_t *); - /* * Global Function Prototypes in qla_iocb.c source file. */ @@ -185,13 +185,6 @@ qla2x00_get_resource_cnts(scsi_qla_host_t *, uint16_t *, uint16_t *, uint16_t *, extern int qla2x00_get_fcal_position_map(scsi_qla_host_t *ha, char *pos_map); -extern int -qla2x00_get_link_status(scsi_qla_host_t *, uint16_t, link_stat_t *, - uint16_t *); - -extern int -qla24xx_get_isp_stats(scsi_qla_host_t *, uint32_t *, uint32_t, uint16_t *); - extern int qla24xx_abort_command(scsi_qla_host_t *, srb_t *); extern int qla24xx_abort_target(fc_port_t *); @@ -235,22 +228,6 @@ extern int qla2x00_write_nvram_data(scsi_qla_host_t *, uint8_t *, uint32_t, extern int qla24xx_write_nvram_data(scsi_qla_host_t *, uint8_t *, uint32_t, uint32_t); -extern int qla2x00_beacon_on(struct scsi_qla_host *); -extern int qla2x00_beacon_off(struct scsi_qla_host *); -extern void qla2x00_beacon_blink(struct scsi_qla_host *); -extern int qla24xx_beacon_on(struct scsi_qla_host *); -extern int qla24xx_beacon_off(struct scsi_qla_host *); -extern void qla24xx_beacon_blink(struct scsi_qla_host *); - -extern uint8_t *qla2x00_read_optrom_data(struct scsi_qla_host *, uint8_t *, - uint32_t, uint32_t); -extern int qla2x00_write_optrom_data(struct scsi_qla_host *, uint8_t *, - uint32_t, uint32_t); -extern uint8_t *qla24xx_read_optrom_data(struct scsi_qla_host *, uint8_t *, - uint32_t, uint32_t); -extern int qla24xx_write_optrom_data(struct scsi_qla_host *, uint8_t *, - uint32_t, uint32_t); - /* * Global Function Prototypes in qla_dbg.c source file. */ diff --git a/trunk/drivers/scsi/qla2xxx/qla_init.c b/trunk/drivers/scsi/qla2xxx/qla_init.c index 634ee174bff2..e67bb0997818 100644 --- a/trunk/drivers/scsi/qla2xxx/qla_init.c +++ b/trunk/drivers/scsi/qla2xxx/qla_init.c @@ -8,6 +8,7 @@ #include #include +#include #include "qla_devtbl.h" diff --git a/trunk/drivers/scsi/qla2xxx/qla_iocb.c b/trunk/drivers/scsi/qla2xxx/qla_iocb.c index 6544b6d0891d..7ec0b8d6f07b 100644 --- a/trunk/drivers/scsi/qla2xxx/qla_iocb.c +++ b/trunk/drivers/scsi/qla2xxx/qla_iocb.c @@ -814,7 +814,6 @@ qla24xx_start_scsi(srb_t *sp) cmd_pkt->port_id[2] = sp->fcport->d_id.b.domain; int_to_scsilun(sp->cmd->device->lun, &cmd_pkt->lun); - host_to_fcp_swap((uint8_t *)&cmd_pkt->lun, sizeof(cmd_pkt->lun)); /* Load SCSI command packet. */ memcpy(cmd_pkt->fcp_cdb, cmd->cmnd, cmd->cmd_len); diff --git a/trunk/drivers/scsi/qla2xxx/qla_isr.c b/trunk/drivers/scsi/qla2xxx/qla_isr.c index 42aa7a7c1a73..71a46fcee8cc 100644 --- a/trunk/drivers/scsi/qla2xxx/qla_isr.c +++ b/trunk/drivers/scsi/qla2xxx/qla_isr.c @@ -402,9 +402,9 @@ qla2x00_async_event(scsi_qla_host_t *ha, uint16_t *mb) break; case MBA_LOOP_UP: /* Loop Up Event */ + ha->link_data_rate = 0; if (IS_QLA2100(ha) || IS_QLA2200(ha)) { link_speed = link_speeds[0]; - ha->link_data_rate = LDR_1GB; } else { link_speed = link_speeds[LS_UNKNOWN]; if (mb[1] < 5) @@ -436,7 +436,7 @@ qla2x00_async_event(scsi_qla_host_t *ha, uint16_t *mb) } ha->flags.management_server_logged_in = 0; - ha->link_data_rate = LDR_UNKNOWN; + ha->link_data_rate = 0; if (ql2xfdmienable) set_bit(REGISTER_FDMI_NEEDED, &ha->dpc_flags); diff --git a/trunk/drivers/scsi/qla2xxx/qla_mbx.c b/trunk/drivers/scsi/qla2xxx/qla_mbx.c index 363dfdd042b0..3099b379de9d 100644 --- a/trunk/drivers/scsi/qla2xxx/qla_mbx.c +++ b/trunk/drivers/scsi/qla2xxx/qla_mbx.c @@ -7,6 +7,7 @@ #include "qla_def.h" #include +#include static void qla2x00_mbx_sem_timeout(unsigned long data) @@ -1873,8 +1874,7 @@ qla2x00_get_id_list(scsi_qla_host_t *ha, void *id_list, dma_addr_t id_list_dma, mcp->mb[3] = LSW(id_list_dma); mcp->mb[6] = MSW(MSD(id_list_dma)); mcp->mb[7] = LSW(MSD(id_list_dma)); - mcp->mb[8] = 0; - mcp->out_mb |= MBX_8|MBX_7|MBX_6|MBX_3|MBX_2; + mcp->out_mb |= MBX_7|MBX_6|MBX_3|MBX_2; } else { mcp->mb[1] = MSW(id_list_dma); mcp->mb[2] = LSW(id_list_dma); @@ -2017,109 +2017,8 @@ qla2x00_get_fcal_position_map(scsi_qla_host_t *ha, char *pos_map) return rval; } -#endif - -/* - * qla2x00_get_link_status - * - * Input: - * ha = adapter block pointer. - * loop_id = device loop ID. - * ret_buf = pointer to link status return buffer. - * - * Returns: - * 0 = success. - * BIT_0 = mem alloc error. - * BIT_1 = mailbox error. - */ -int -qla2x00_get_link_status(scsi_qla_host_t *ha, uint16_t loop_id, - link_stat_t *ret_buf, uint16_t *status) -{ - int rval; - mbx_cmd_t mc; - mbx_cmd_t *mcp = &mc; - link_stat_t *stat_buf; - dma_addr_t stat_buf_dma; - - DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no);) - - stat_buf = dma_pool_alloc(ha->s_dma_pool, GFP_ATOMIC, &stat_buf_dma); - if (stat_buf == NULL) { - DEBUG2_3_11(printk("%s(%ld): Failed to allocate memory.\n", - __func__, ha->host_no)); - return BIT_0; - } - memset(stat_buf, 0, sizeof(link_stat_t)); - - mcp->mb[0] = MBC_GET_LINK_STATUS; - mcp->mb[2] = MSW(stat_buf_dma); - mcp->mb[3] = LSW(stat_buf_dma); - mcp->mb[6] = MSW(MSD(stat_buf_dma)); - mcp->mb[7] = LSW(MSD(stat_buf_dma)); - mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_0; - mcp->in_mb = MBX_0; - if (IS_QLA24XX(ha) || IS_QLA25XX(ha)) { - mcp->mb[1] = loop_id; - mcp->mb[4] = 0; - mcp->mb[10] = 0; - mcp->out_mb |= MBX_10|MBX_4|MBX_1; - mcp->in_mb |= MBX_1; - } else if (HAS_EXTENDED_IDS(ha)) { - mcp->mb[1] = loop_id; - mcp->mb[10] = 0; - mcp->out_mb |= MBX_10|MBX_1; - } else { - mcp->mb[1] = loop_id << 8; - mcp->out_mb |= MBX_1; - } - mcp->tov = 30; - mcp->flags = IOCTL_CMD; - rval = qla2x00_mailbox_command(ha, mcp); - - if (rval == QLA_SUCCESS) { - if (mcp->mb[0] != MBS_COMMAND_COMPLETE) { - DEBUG2_3_11(printk("%s(%ld): cmd failed. mbx0=%x.\n", - __func__, ha->host_no, mcp->mb[0]);) - status[0] = mcp->mb[0]; - rval = BIT_1; - } else { - /* copy over data -- firmware data is LE. */ - ret_buf->link_fail_cnt = - le32_to_cpu(stat_buf->link_fail_cnt); - ret_buf->loss_sync_cnt = - le32_to_cpu(stat_buf->loss_sync_cnt); - ret_buf->loss_sig_cnt = - le32_to_cpu(stat_buf->loss_sig_cnt); - ret_buf->prim_seq_err_cnt = - le32_to_cpu(stat_buf->prim_seq_err_cnt); - ret_buf->inval_xmit_word_cnt = - le32_to_cpu(stat_buf->inval_xmit_word_cnt); - ret_buf->inval_crc_cnt = - le32_to_cpu(stat_buf->inval_crc_cnt); - - DEBUG11(printk("%s(%ld): stat dump: fail_cnt=%d " - "loss_sync=%d loss_sig=%d seq_err=%d " - "inval_xmt_word=%d inval_crc=%d.\n", __func__, - ha->host_no, stat_buf->link_fail_cnt, - stat_buf->loss_sync_cnt, stat_buf->loss_sig_cnt, - stat_buf->prim_seq_err_cnt, - stat_buf->inval_xmit_word_cnt, - stat_buf->inval_crc_cnt);) - } - } else { - /* Failed. */ - DEBUG2_3_11(printk("%s(%ld): failed=%x.\n", __func__, - ha->host_no, rval);) - rval = BIT_1; - } - - dma_pool_free(ha->s_dma_pool, stat_buf, stat_buf_dma); - return rval; -} - -int +uint8_t qla24xx_get_isp_stats(scsi_qla_host_t *ha, uint32_t *dwbuf, uint32_t dwords, uint16_t *status) { @@ -2181,6 +2080,7 @@ qla24xx_get_isp_stats(scsi_qla_host_t *ha, uint32_t *dwbuf, uint32_t dwords, return rval; } +#endif int qla24xx_abort_command(scsi_qla_host_t *ha, srb_t *sp) diff --git a/trunk/drivers/scsi/qla2xxx/qla_os.c b/trunk/drivers/scsi/qla2xxx/qla_os.c index 9f91f1a20542..5866a7c706a8 100644 --- a/trunk/drivers/scsi/qla2xxx/qla_os.c +++ b/trunk/drivers/scsi/qla2xxx/qla_os.c @@ -366,12 +366,6 @@ qla2x00_queuecommand(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *)) goto qc_fail_command; } - /* Close window on fcport/rport state-transitioning. */ - if (!*(fc_port_t **)rport->dd_data) { - cmd->result = DID_IMM_RETRY << 16; - goto qc_fail_command; - } - if (atomic_read(&fcport->state) != FCS_ONLINE) { if (atomic_read(&fcport->state) == FCS_DEVICE_DEAD || atomic_read(&ha->loop_state) == LOOP_DEAD) { @@ -427,12 +421,6 @@ qla24xx_queuecommand(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *)) goto qc24_fail_command; } - /* Close window on fcport/rport state-transitioning. */ - if (!*(fc_port_t **)rport->dd_data) { - cmd->result = DID_IMM_RETRY << 16; - goto qc24_fail_command; - } - if (atomic_read(&fcport->state) != FCS_ONLINE) { if (atomic_read(&fcport->state) == FCS_DEVICE_DEAD || atomic_read(&ha->loop_state) == LOOP_DEAD) { @@ -525,7 +513,7 @@ qla2x00_eh_wait_on_command(scsi_qla_host_t *ha, struct scsi_cmnd *cmd) * Success (Adapter is online) : 0 * Failed (Adapter is offline/disabled) : 1 */ -int +static int qla2x00_wait_for_hba_online(scsi_qla_host_t *ha) { int return_status; @@ -1324,8 +1312,6 @@ int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info) ha->ports = MAX_BUSES; ha->init_cb_size = sizeof(init_cb_t); ha->mgmt_svr_loop_id = MANAGEMENT_SERVER; - ha->link_data_rate = LDR_UNKNOWN; - ha->optrom_size = OPTROM_SIZE_2300; /* Assign ISP specific operations. */ ha->isp_ops.pci_config = qla2100_pci_config; @@ -1353,8 +1339,6 @@ int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info) ha->isp_ops.write_nvram = qla2x00_write_nvram_data; ha->isp_ops.fw_dump = qla2100_fw_dump; ha->isp_ops.ascii_fw_dump = qla2100_ascii_fw_dump; - ha->isp_ops.read_optrom = qla2x00_read_optrom_data; - ha->isp_ops.write_optrom = qla2x00_write_optrom_data; if (IS_QLA2100(ha)) { host->max_id = MAX_TARGETS_2100; ha->mbx_count = MAILBOX_REGISTER_COUNT_2100; @@ -1380,12 +1364,7 @@ int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info) ha->isp_ops.intr_handler = qla2300_intr_handler; ha->isp_ops.fw_dump = qla2300_fw_dump; ha->isp_ops.ascii_fw_dump = qla2300_ascii_fw_dump; - ha->isp_ops.beacon_on = qla2x00_beacon_on; - ha->isp_ops.beacon_off = qla2x00_beacon_off; - ha->isp_ops.beacon_blink = qla2x00_beacon_blink; ha->gid_list_info_size = 6; - if (IS_QLA2322(ha) || IS_QLA6322(ha)) - ha->optrom_size = OPTROM_SIZE_2322; } else if (IS_QLA24XX(ha) || IS_QLA25XX(ha)) { host->max_id = MAX_TARGETS_2200; ha->mbx_count = MAILBOX_REGISTER_COUNT; @@ -1421,13 +1400,7 @@ int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info) ha->isp_ops.write_nvram = qla24xx_write_nvram_data; ha->isp_ops.fw_dump = qla24xx_fw_dump; ha->isp_ops.ascii_fw_dump = qla24xx_ascii_fw_dump; - ha->isp_ops.read_optrom = qla24xx_read_optrom_data; - ha->isp_ops.write_optrom = qla24xx_write_optrom_data; - ha->isp_ops.beacon_on = qla24xx_beacon_on; - ha->isp_ops.beacon_off = qla24xx_beacon_off; - ha->isp_ops.beacon_blink = qla24xx_beacon_blink; ha->gid_list_info_size = 8; - ha->optrom_size = OPTROM_SIZE_24XX; } host->can_queue = ha->request_q_length + 128; @@ -1684,13 +1657,11 @@ qla2x00_schedule_rport_del(struct scsi_qla_host *ha, fc_port_t *fcport, spin_lock_irqsave(&fcport->rport_lock, flags); fcport->drport = rport; fcport->rport = NULL; - *(fc_port_t **)rport->dd_data = NULL; spin_unlock_irqrestore(&fcport->rport_lock, flags); set_bit(FCPORT_UPDATE_NEEDED, &ha->dpc_flags); } else { spin_lock_irqsave(&fcport->rport_lock, flags); fcport->rport = NULL; - *(fc_port_t **)rport->dd_data = NULL; spin_unlock_irqrestore(&fcport->rport_lock, flags); fc_remote_port_delete(rport); } @@ -2095,8 +2066,6 @@ qla2x00_mem_free(scsi_qla_host_t *ha) ha->fw_dumped = 0; ha->fw_dump_reading = 0; ha->fw_dump_buffer = NULL; - - vfree(ha->optrom_buffer); } /* @@ -2345,9 +2314,6 @@ qla2x00_do_dpc(void *data) if (!ha->interrupts_on) ha->isp_ops.enable_intrs(ha); - if (test_and_clear_bit(BEACON_BLINK_NEEDED, &ha->dpc_flags)) - ha->isp_ops.beacon_blink(ha); - ha->dpc_active = 0; } /* End of while(1) */ @@ -2525,12 +2491,6 @@ qla2x00_timer(scsi_qla_host_t *ha) atomic_read(&ha->loop_down_timer))); } - /* Check if beacon LED needs to be blinked */ - if (ha->beacon_blink_led == 1) { - set_bit(BEACON_BLINK_NEEDED, &ha->dpc_flags); - start_dpc++; - } - /* Schedule the DPC routine if needed */ if ((test_bit(ISP_ABORT_NEEDED, &ha->dpc_flags) || test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags) || @@ -2539,7 +2499,6 @@ qla2x00_timer(scsi_qla_host_t *ha) start_dpc || test_bit(LOGIN_RETRY_NEEDED, &ha->dpc_flags) || test_bit(RESET_MARKER_NEEDED, &ha->dpc_flags) || - test_bit(BEACON_BLINK_NEEDED, &ha->dpc_flags) || test_bit(RELOGIN_NEEDED, &ha->dpc_flags)) && ha->dpc_wait && !ha->dpc_active) { diff --git a/trunk/drivers/scsi/qla2xxx/qla_rscn.c b/trunk/drivers/scsi/qla2xxx/qla_rscn.c index b70bebe18c01..2c3342108dd8 100644 --- a/trunk/drivers/scsi/qla2xxx/qla_rscn.c +++ b/trunk/drivers/scsi/qla2xxx/qla_rscn.c @@ -6,6 +6,8 @@ */ #include "qla_def.h" +#include + /** * IO descriptor handle definitions. * diff --git a/trunk/drivers/scsi/qla2xxx/qla_sup.c b/trunk/drivers/scsi/qla2xxx/qla_sup.c index 3866a5760f15..f4d755a643e4 100644 --- a/trunk/drivers/scsi/qla2xxx/qla_sup.c +++ b/trunk/drivers/scsi/qla2xxx/qla_sup.c @@ -695,966 +695,3 @@ qla24xx_write_nvram_data(scsi_qla_host_t *ha, uint8_t *buf, uint32_t naddr, return ret; } - - -static inline void -qla2x00_flip_colors(scsi_qla_host_t *ha, uint16_t *pflags) -{ - if (IS_QLA2322(ha)) { - /* Flip all colors. */ - if (ha->beacon_color_state == QLA_LED_ALL_ON) { - /* Turn off. */ - ha->beacon_color_state = 0; - *pflags = GPIO_LED_ALL_OFF; - } else { - /* Turn on. */ - ha->beacon_color_state = QLA_LED_ALL_ON; - *pflags = GPIO_LED_RGA_ON; - } - } else { - /* Flip green led only. */ - if (ha->beacon_color_state == QLA_LED_GRN_ON) { - /* Turn off. */ - ha->beacon_color_state = 0; - *pflags = GPIO_LED_GREEN_OFF_AMBER_OFF; - } else { - /* Turn on. */ - ha->beacon_color_state = QLA_LED_GRN_ON; - *pflags = GPIO_LED_GREEN_ON_AMBER_OFF; - } - } -} - -void -qla2x00_beacon_blink(struct scsi_qla_host *ha) -{ - uint16_t gpio_enable; - uint16_t gpio_data; - uint16_t led_color = 0; - unsigned long flags; - struct device_reg_2xxx __iomem *reg = &ha->iobase->isp; - - if (ha->pio_address) - reg = (struct device_reg_2xxx __iomem *)ha->pio_address; - - spin_lock_irqsave(&ha->hardware_lock, flags); - - /* Save the Original GPIOE. */ - if (ha->pio_address) { - gpio_enable = RD_REG_WORD_PIO(®->gpioe); - gpio_data = RD_REG_WORD_PIO(®->gpiod); - } else { - gpio_enable = RD_REG_WORD(®->gpioe); - gpio_data = RD_REG_WORD(®->gpiod); - } - - /* Set the modified gpio_enable values */ - gpio_enable |= GPIO_LED_MASK; - - if (ha->pio_address) { - WRT_REG_WORD_PIO(®->gpioe, gpio_enable); - } else { - WRT_REG_WORD(®->gpioe, gpio_enable); - RD_REG_WORD(®->gpioe); - } - - qla2x00_flip_colors(ha, &led_color); - - /* Clear out any previously set LED color. */ - gpio_data &= ~GPIO_LED_MASK; - - /* Set the new input LED color to GPIOD. */ - gpio_data |= led_color; - - /* Set the modified gpio_data values */ - if (ha->pio_address) { - WRT_REG_WORD_PIO(®->gpiod, gpio_data); - } else { - WRT_REG_WORD(®->gpiod, gpio_data); - RD_REG_WORD(®->gpiod); - } - - spin_unlock_irqrestore(&ha->hardware_lock, flags); -} - -int -qla2x00_beacon_on(struct scsi_qla_host *ha) -{ - uint16_t gpio_enable; - uint16_t gpio_data; - unsigned long flags; - struct device_reg_2xxx __iomem *reg = &ha->iobase->isp; - - ha->fw_options[1] &= ~FO1_SET_EMPHASIS_SWING; - ha->fw_options[1] |= FO1_DISABLE_GPIO6_7; - - if (qla2x00_set_fw_options(ha, ha->fw_options) != QLA_SUCCESS) { - qla_printk(KERN_WARNING, ha, - "Unable to update fw options (beacon on).\n"); - return QLA_FUNCTION_FAILED; - } - - if (ha->pio_address) - reg = (struct device_reg_2xxx __iomem *)ha->pio_address; - - /* Turn off LEDs. */ - spin_lock_irqsave(&ha->hardware_lock, flags); - if (ha->pio_address) { - gpio_enable = RD_REG_WORD_PIO(®->gpioe); - gpio_data = RD_REG_WORD_PIO(®->gpiod); - } else { - gpio_enable = RD_REG_WORD(®->gpioe); - gpio_data = RD_REG_WORD(®->gpiod); - } - gpio_enable |= GPIO_LED_MASK; - - /* Set the modified gpio_enable values. */ - if (ha->pio_address) { - WRT_REG_WORD_PIO(®->gpioe, gpio_enable); - } else { - WRT_REG_WORD(®->gpioe, gpio_enable); - RD_REG_WORD(®->gpioe); - } - - /* Clear out previously set LED colour. */ - gpio_data &= ~GPIO_LED_MASK; - if (ha->pio_address) { - WRT_REG_WORD_PIO(®->gpiod, gpio_data); - } else { - WRT_REG_WORD(®->gpiod, gpio_data); - RD_REG_WORD(®->gpiod); - } - spin_unlock_irqrestore(&ha->hardware_lock, flags); - - /* - * Let the per HBA timer kick off the blinking process based on - * the following flags. No need to do anything else now. - */ - ha->beacon_blink_led = 1; - ha->beacon_color_state = 0; - - return QLA_SUCCESS; -} - -int -qla2x00_beacon_off(struct scsi_qla_host *ha) -{ - int rval = QLA_SUCCESS; - - ha->beacon_blink_led = 0; - - /* Set the on flag so when it gets flipped it will be off. */ - if (IS_QLA2322(ha)) - ha->beacon_color_state = QLA_LED_ALL_ON; - else - ha->beacon_color_state = QLA_LED_GRN_ON; - - ha->isp_ops.beacon_blink(ha); /* This turns green LED off */ - - ha->fw_options[1] &= ~FO1_SET_EMPHASIS_SWING; - ha->fw_options[1] &= ~FO1_DISABLE_GPIO6_7; - - rval = qla2x00_set_fw_options(ha, ha->fw_options); - if (rval != QLA_SUCCESS) - qla_printk(KERN_WARNING, ha, - "Unable to update fw options (beacon off).\n"); - return rval; -} - - -static inline void -qla24xx_flip_colors(scsi_qla_host_t *ha, uint16_t *pflags) -{ - /* Flip all colors. */ - if (ha->beacon_color_state == QLA_LED_ALL_ON) { - /* Turn off. */ - ha->beacon_color_state = 0; - *pflags = 0; - } else { - /* Turn on. */ - ha->beacon_color_state = QLA_LED_ALL_ON; - *pflags = GPDX_LED_YELLOW_ON | GPDX_LED_AMBER_ON; - } -} - -void -qla24xx_beacon_blink(struct scsi_qla_host *ha) -{ - uint16_t led_color = 0; - uint32_t gpio_data; - unsigned long flags; - struct device_reg_24xx __iomem *reg = &ha->iobase->isp24; - - /* Save the Original GPIOD. */ - spin_lock_irqsave(&ha->hardware_lock, flags); - gpio_data = RD_REG_DWORD(®->gpiod); - - /* Enable the gpio_data reg for update. */ - gpio_data |= GPDX_LED_UPDATE_MASK; - - WRT_REG_DWORD(®->gpiod, gpio_data); - gpio_data = RD_REG_DWORD(®->gpiod); - - /* Set the color bits. */ - qla24xx_flip_colors(ha, &led_color); - - /* Clear out any previously set LED color. */ - gpio_data &= ~GPDX_LED_COLOR_MASK; - - /* Set the new input LED color to GPIOD. */ - gpio_data |= led_color; - - /* Set the modified gpio_data values. */ - WRT_REG_DWORD(®->gpiod, gpio_data); - gpio_data = RD_REG_DWORD(®->gpiod); - spin_unlock_irqrestore(&ha->hardware_lock, flags); -} - -int -qla24xx_beacon_on(struct scsi_qla_host *ha) -{ - uint32_t gpio_data; - unsigned long flags; - struct device_reg_24xx __iomem *reg = &ha->iobase->isp24; - - if (ha->beacon_blink_led == 0) { - /* Enable firmware for update */ - ha->fw_options[1] |= ADD_FO1_DISABLE_GPIO_LED_CTRL; - - if (qla2x00_set_fw_options(ha, ha->fw_options) != QLA_SUCCESS) - return QLA_FUNCTION_FAILED; - - if (qla2x00_get_fw_options(ha, ha->fw_options) != - QLA_SUCCESS) { - qla_printk(KERN_WARNING, ha, - "Unable to update fw options (beacon on).\n"); - return QLA_FUNCTION_FAILED; - } - - spin_lock_irqsave(&ha->hardware_lock, flags); - gpio_data = RD_REG_DWORD(®->gpiod); - - /* Enable the gpio_data reg for update. */ - gpio_data |= GPDX_LED_UPDATE_MASK; - WRT_REG_DWORD(®->gpiod, gpio_data); - RD_REG_DWORD(®->gpiod); - - spin_unlock_irqrestore(&ha->hardware_lock, flags); - } - - /* So all colors blink together. */ - ha->beacon_color_state = 0; - - /* Let the per HBA timer kick off the blinking process. */ - ha->beacon_blink_led = 1; - - return QLA_SUCCESS; -} - -int -qla24xx_beacon_off(struct scsi_qla_host *ha) -{ - uint32_t gpio_data; - unsigned long flags; - struct device_reg_24xx __iomem *reg = &ha->iobase->isp24; - - ha->beacon_blink_led = 0; - ha->beacon_color_state = QLA_LED_ALL_ON; - - ha->isp_ops.beacon_blink(ha); /* Will flip to all off. */ - - /* Give control back to firmware. */ - spin_lock_irqsave(&ha->hardware_lock, flags); - gpio_data = RD_REG_DWORD(®->gpiod); - - /* Disable the gpio_data reg for update. */ - gpio_data &= ~GPDX_LED_UPDATE_MASK; - WRT_REG_DWORD(®->gpiod, gpio_data); - RD_REG_DWORD(®->gpiod); - spin_unlock_irqrestore(&ha->hardware_lock, flags); - - ha->fw_options[1] &= ~ADD_FO1_DISABLE_GPIO_LED_CTRL; - - if (qla2x00_set_fw_options(ha, ha->fw_options) != QLA_SUCCESS) { - qla_printk(KERN_WARNING, ha, - "Unable to update fw options (beacon off).\n"); - return QLA_FUNCTION_FAILED; - } - - if (qla2x00_get_fw_options(ha, ha->fw_options) != QLA_SUCCESS) { - qla_printk(KERN_WARNING, ha, - "Unable to get fw options (beacon off).\n"); - return QLA_FUNCTION_FAILED; - } - - return QLA_SUCCESS; -} - - -/* - * Flash support routines - */ - -/** - * qla2x00_flash_enable() - Setup flash for reading and writing. - * @ha: HA context - */ -static void -qla2x00_flash_enable(scsi_qla_host_t *ha) -{ - uint16_t data; - struct device_reg_2xxx __iomem *reg = &ha->iobase->isp; - - data = RD_REG_WORD(®->ctrl_status); - data |= CSR_FLASH_ENABLE; - WRT_REG_WORD(®->ctrl_status, data); - RD_REG_WORD(®->ctrl_status); /* PCI Posting. */ -} - -/** - * qla2x00_flash_disable() - Disable flash and allow RISC to run. - * @ha: HA context - */ -static void -qla2x00_flash_disable(scsi_qla_host_t *ha) -{ - uint16_t data; - struct device_reg_2xxx __iomem *reg = &ha->iobase->isp; - - data = RD_REG_WORD(®->ctrl_status); - data &= ~(CSR_FLASH_ENABLE); - WRT_REG_WORD(®->ctrl_status, data); - RD_REG_WORD(®->ctrl_status); /* PCI Posting. */ -} - -/** - * qla2x00_read_flash_byte() - Reads a byte from flash - * @ha: HA context - * @addr: Address in flash to read - * - * A word is read from the chip, but, only the lower byte is valid. - * - * Returns the byte read from flash @addr. - */ -static uint8_t -qla2x00_read_flash_byte(scsi_qla_host_t *ha, uint32_t addr) -{ - uint16_t data; - uint16_t bank_select; - struct device_reg_2xxx __iomem *reg = &ha->iobase->isp; - - bank_select = RD_REG_WORD(®->ctrl_status); - - if (IS_QLA2322(ha) || IS_QLA6322(ha)) { - /* Specify 64K address range: */ - /* clear out Module Select and Flash Address bits [19:16]. */ - bank_select &= ~0xf8; - bank_select |= addr >> 12 & 0xf0; - bank_select |= CSR_FLASH_64K_BANK; - WRT_REG_WORD(®->ctrl_status, bank_select); - RD_REG_WORD(®->ctrl_status); /* PCI Posting. */ - - WRT_REG_WORD(®->flash_address, (uint16_t)addr); - data = RD_REG_WORD(®->flash_data); - - return (uint8_t)data; - } - - /* Setup bit 16 of flash address. */ - if ((addr & BIT_16) && ((bank_select & CSR_FLASH_64K_BANK) == 0)) { - bank_select |= CSR_FLASH_64K_BANK; - WRT_REG_WORD(®->ctrl_status, bank_select); - RD_REG_WORD(®->ctrl_status); /* PCI Posting. */ - } else if (((addr & BIT_16) == 0) && - (bank_select & CSR_FLASH_64K_BANK)) { - bank_select &= ~(CSR_FLASH_64K_BANK); - WRT_REG_WORD(®->ctrl_status, bank_select); - RD_REG_WORD(®->ctrl_status); /* PCI Posting. */ - } - - /* Always perform IO mapped accesses to the FLASH registers. */ - if (ha->pio_address) { - uint16_t data2; - - reg = (struct device_reg_2xxx __iomem *)ha->pio_address; - WRT_REG_WORD_PIO(®->flash_address, (uint16_t)addr); - do { - data = RD_REG_WORD_PIO(®->flash_data); - barrier(); - cpu_relax(); - data2 = RD_REG_WORD_PIO(®->flash_data); - } while (data != data2); - } else { - WRT_REG_WORD(®->flash_address, (uint16_t)addr); - data = qla2x00_debounce_register(®->flash_data); - } - - return (uint8_t)data; -} - -/** - * qla2x00_write_flash_byte() - Write a byte to flash - * @ha: HA context - * @addr: Address in flash to write - * @data: Data to write - */ -static void -qla2x00_write_flash_byte(scsi_qla_host_t *ha, uint32_t addr, uint8_t data) -{ - uint16_t bank_select; - struct device_reg_2xxx __iomem *reg = &ha->iobase->isp; - - bank_select = RD_REG_WORD(®->ctrl_status); - if (IS_QLA2322(ha) || IS_QLA6322(ha)) { - /* Specify 64K address range: */ - /* clear out Module Select and Flash Address bits [19:16]. */ - bank_select &= ~0xf8; - bank_select |= addr >> 12 & 0xf0; - bank_select |= CSR_FLASH_64K_BANK; - WRT_REG_WORD(®->ctrl_status, bank_select); - RD_REG_WORD(®->ctrl_status); /* PCI Posting. */ - - WRT_REG_WORD(®->flash_address, (uint16_t)addr); - RD_REG_WORD(®->ctrl_status); /* PCI Posting. */ - WRT_REG_WORD(®->flash_data, (uint16_t)data); - RD_REG_WORD(®->ctrl_status); /* PCI Posting. */ - - return; - } - - /* Setup bit 16 of flash address. */ - if ((addr & BIT_16) && ((bank_select & CSR_FLASH_64K_BANK) == 0)) { - bank_select |= CSR_FLASH_64K_BANK; - WRT_REG_WORD(®->ctrl_status, bank_select); - RD_REG_WORD(®->ctrl_status); /* PCI Posting. */ - } else if (((addr & BIT_16) == 0) && - (bank_select & CSR_FLASH_64K_BANK)) { - bank_select &= ~(CSR_FLASH_64K_BANK); - WRT_REG_WORD(®->ctrl_status, bank_select); - RD_REG_WORD(®->ctrl_status); /* PCI Posting. */ - } - - /* Always perform IO mapped accesses to the FLASH registers. */ - if (ha->pio_address) { - reg = (struct device_reg_2xxx __iomem *)ha->pio_address; - WRT_REG_WORD_PIO(®->flash_address, (uint16_t)addr); - WRT_REG_WORD_PIO(®->flash_data, (uint16_t)data); - } else { - WRT_REG_WORD(®->flash_address, (uint16_t)addr); - RD_REG_WORD(®->ctrl_status); /* PCI Posting. */ - WRT_REG_WORD(®->flash_data, (uint16_t)data); - RD_REG_WORD(®->ctrl_status); /* PCI Posting. */ - } -} - -/** - * qla2x00_poll_flash() - Polls flash for completion. - * @ha: HA context - * @addr: Address in flash to poll - * @poll_data: Data to be polled - * @man_id: Flash manufacturer ID - * @flash_id: Flash ID - * - * This function polls the device until bit 7 of what is read matches data - * bit 7 or until data bit 5 becomes a 1. If that hapens, the flash ROM timed - * out (a fatal error). The flash book recommeds reading bit 7 again after - * reading bit 5 as a 1. - * - * Returns 0 on success, else non-zero. - */ -static int -qla2x00_poll_flash(scsi_qla_host_t *ha, uint32_t addr, uint8_t poll_data, - uint8_t man_id, uint8_t flash_id) -{ - int status; - uint8_t flash_data; - uint32_t cnt; - - status = 1; - - /* Wait for 30 seconds for command to finish. */ - poll_data &= BIT_7; - for (cnt = 3000000; cnt; cnt--) { - flash_data = qla2x00_read_flash_byte(ha, addr); - if ((flash_data & BIT_7) == poll_data) { - status = 0; - break; - } - - if (man_id != 0x40 && man_id != 0xda) { - if ((flash_data & BIT_5) && cnt > 2) - cnt = 2; - } - udelay(10); - barrier(); - } - return status; -} - -#define IS_OEM_001(ha) \ - ((ha)->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2322 && \ - (ha)->pdev->subsystem_vendor == 0x1028 && \ - (ha)->pdev->subsystem_device == 0x0170) - -/** - * qla2x00_program_flash_address() - Programs a flash address - * @ha: HA context - * @addr: Address in flash to program - * @data: Data to be written in flash - * @man_id: Flash manufacturer ID - * @flash_id: Flash ID - * - * Returns 0 on success, else non-zero. - */ -static int -qla2x00_program_flash_address(scsi_qla_host_t *ha, uint32_t addr, uint8_t data, - uint8_t man_id, uint8_t flash_id) -{ - /* Write Program Command Sequence. */ - if (IS_OEM_001(ha)) { - qla2x00_write_flash_byte(ha, 0xaaa, 0xaa); - qla2x00_write_flash_byte(ha, 0x555, 0x55); - qla2x00_write_flash_byte(ha, 0xaaa, 0xa0); - qla2x00_write_flash_byte(ha, addr, data); - } else { - if (man_id == 0xda && flash_id == 0xc1) { - qla2x00_write_flash_byte(ha, addr, data); - if (addr & 0x7e) - return 0; - } else { - qla2x00_write_flash_byte(ha, 0x5555, 0xaa); - qla2x00_write_flash_byte(ha, 0x2aaa, 0x55); - qla2x00_write_flash_byte(ha, 0x5555, 0xa0); - qla2x00_write_flash_byte(ha, addr, data); - } - } - - udelay(150); - - /* Wait for write to complete. */ - return qla2x00_poll_flash(ha, addr, data, man_id, flash_id); -} - -/** - * qla2x00_erase_flash() - Erase the flash. - * @ha: HA context - * @man_id: Flash manufacturer ID - * @flash_id: Flash ID - * - * Returns 0 on success, else non-zero. - */ -static int -qla2x00_erase_flash(scsi_qla_host_t *ha, uint8_t man_id, uint8_t flash_id) -{ - /* Individual Sector Erase Command Sequence */ - if (IS_OEM_001(ha)) { - qla2x00_write_flash_byte(ha, 0xaaa, 0xaa); - qla2x00_write_flash_byte(ha, 0x555, 0x55); - qla2x00_write_flash_byte(ha, 0xaaa, 0x80); - qla2x00_write_flash_byte(ha, 0xaaa, 0xaa); - qla2x00_write_flash_byte(ha, 0x555, 0x55); - qla2x00_write_flash_byte(ha, 0xaaa, 0x10); - } else { - qla2x00_write_flash_byte(ha, 0x5555, 0xaa); - qla2x00_write_flash_byte(ha, 0x2aaa, 0x55); - qla2x00_write_flash_byte(ha, 0x5555, 0x80); - qla2x00_write_flash_byte(ha, 0x5555, 0xaa); - qla2x00_write_flash_byte(ha, 0x2aaa, 0x55); - qla2x00_write_flash_byte(ha, 0x5555, 0x10); - } - - udelay(150); - - /* Wait for erase to complete. */ - return qla2x00_poll_flash(ha, 0x00, 0x80, man_id, flash_id); -} - -/** - * qla2x00_erase_flash_sector() - Erase a flash sector. - * @ha: HA context - * @addr: Flash sector to erase - * @sec_mask: Sector address mask - * @man_id: Flash manufacturer ID - * @flash_id: Flash ID - * - * Returns 0 on success, else non-zero. - */ -static int -qla2x00_erase_flash_sector(scsi_qla_host_t *ha, uint32_t addr, - uint32_t sec_mask, uint8_t man_id, uint8_t flash_id) -{ - /* Individual Sector Erase Command Sequence */ - qla2x00_write_flash_byte(ha, 0x5555, 0xaa); - qla2x00_write_flash_byte(ha, 0x2aaa, 0x55); - qla2x00_write_flash_byte(ha, 0x5555, 0x80); - qla2x00_write_flash_byte(ha, 0x5555, 0xaa); - qla2x00_write_flash_byte(ha, 0x2aaa, 0x55); - if (man_id == 0x1f && flash_id == 0x13) - qla2x00_write_flash_byte(ha, addr & sec_mask, 0x10); - else - qla2x00_write_flash_byte(ha, addr & sec_mask, 0x30); - - udelay(150); - - /* Wait for erase to complete. */ - return qla2x00_poll_flash(ha, addr, 0x80, man_id, flash_id); -} - -/** - * qla2x00_get_flash_manufacturer() - Read manufacturer ID from flash chip. - * @man_id: Flash manufacturer ID - * @flash_id: Flash ID - */ -static void -qla2x00_get_flash_manufacturer(scsi_qla_host_t *ha, uint8_t *man_id, - uint8_t *flash_id) -{ - qla2x00_write_flash_byte(ha, 0x5555, 0xaa); - qla2x00_write_flash_byte(ha, 0x2aaa, 0x55); - qla2x00_write_flash_byte(ha, 0x5555, 0x90); - *man_id = qla2x00_read_flash_byte(ha, 0x0000); - *flash_id = qla2x00_read_flash_byte(ha, 0x0001); - qla2x00_write_flash_byte(ha, 0x5555, 0xaa); - qla2x00_write_flash_byte(ha, 0x2aaa, 0x55); - qla2x00_write_flash_byte(ha, 0x5555, 0xf0); -} - - -static inline void -qla2x00_suspend_hba(struct scsi_qla_host *ha) -{ - int cnt; - unsigned long flags; - struct device_reg_2xxx __iomem *reg = &ha->iobase->isp; - - /* Suspend HBA. */ - scsi_block_requests(ha->host); - ha->isp_ops.disable_intrs(ha); - set_bit(MBX_UPDATE_FLASH_ACTIVE, &ha->mbx_cmd_flags); - - /* Pause RISC. */ - spin_lock_irqsave(&ha->hardware_lock, flags); - WRT_REG_WORD(®->hccr, HCCR_PAUSE_RISC); - RD_REG_WORD(®->hccr); - if (IS_QLA2100(ha) || IS_QLA2200(ha) || IS_QLA2300(ha)) { - for (cnt = 0; cnt < 30000; cnt++) { - if ((RD_REG_WORD(®->hccr) & HCCR_RISC_PAUSE) != 0) - break; - udelay(100); - } - } else { - udelay(10); - } - spin_unlock_irqrestore(&ha->hardware_lock, flags); -} - -static inline void -qla2x00_resume_hba(struct scsi_qla_host *ha) -{ - /* Resume HBA. */ - clear_bit(MBX_UPDATE_FLASH_ACTIVE, &ha->mbx_cmd_flags); - set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); - up(ha->dpc_wait); - qla2x00_wait_for_hba_online(ha); - scsi_unblock_requests(ha->host); -} - -uint8_t * -qla2x00_read_optrom_data(struct scsi_qla_host *ha, uint8_t *buf, - uint32_t offset, uint32_t length) -{ - unsigned long flags; - uint32_t addr, midpoint; - uint8_t *data; - struct device_reg_2xxx __iomem *reg = &ha->iobase->isp; - - /* Suspend HBA. */ - qla2x00_suspend_hba(ha); - - /* Go with read. */ - spin_lock_irqsave(&ha->hardware_lock, flags); - midpoint = ha->optrom_size / 2; - - qla2x00_flash_enable(ha); - WRT_REG_WORD(®->nvram, 0); - RD_REG_WORD(®->nvram); /* PCI Posting. */ - for (addr = offset, data = buf; addr < length; addr++, data++) { - if (addr == midpoint) { - WRT_REG_WORD(®->nvram, NVR_SELECT); - RD_REG_WORD(®->nvram); /* PCI Posting. */ - } - - *data = qla2x00_read_flash_byte(ha, addr); - } - qla2x00_flash_disable(ha); - spin_unlock_irqrestore(&ha->hardware_lock, flags); - - /* Resume HBA. */ - qla2x00_resume_hba(ha); - - return buf; -} - -int -qla2x00_write_optrom_data(struct scsi_qla_host *ha, uint8_t *buf, - uint32_t offset, uint32_t length) -{ - - int rval; - unsigned long flags; - uint8_t man_id, flash_id, sec_number, data; - uint16_t wd; - uint32_t addr, liter, sec_mask, rest_addr; - struct device_reg_2xxx __iomem *reg = &ha->iobase->isp; - - /* Suspend HBA. */ - qla2x00_suspend_hba(ha); - - rval = QLA_SUCCESS; - sec_number = 0; - - /* Reset ISP chip. */ - spin_lock_irqsave(&ha->hardware_lock, flags); - WRT_REG_WORD(®->ctrl_status, CSR_ISP_SOFT_RESET); - pci_read_config_word(ha->pdev, PCI_COMMAND, &wd); - - /* Go with write. */ - qla2x00_flash_enable(ha); - do { /* Loop once to provide quick error exit */ - /* Structure of flash memory based on manufacturer */ - if (IS_OEM_001(ha)) { - /* OEM variant with special flash part. */ - man_id = flash_id = 0; - rest_addr = 0xffff; - sec_mask = 0x10000; - goto update_flash; - } - qla2x00_get_flash_manufacturer(ha, &man_id, &flash_id); - switch (man_id) { - case 0x20: /* ST flash. */ - if (flash_id == 0xd2 || flash_id == 0xe3) { - /* - * ST m29w008at part - 64kb sector size with - * 32kb,8kb,8kb,16kb sectors at memory address - * 0xf0000. - */ - rest_addr = 0xffff; - sec_mask = 0x10000; - break; - } - /* - * ST m29w010b part - 16kb sector size - * Default to 16kb sectors - */ - rest_addr = 0x3fff; - sec_mask = 0x1c000; - break; - case 0x40: /* Mostel flash. */ - /* Mostel v29c51001 part - 512 byte sector size. */ - rest_addr = 0x1ff; - sec_mask = 0x1fe00; - break; - case 0xbf: /* SST flash. */ - /* SST39sf10 part - 4kb sector size. */ - rest_addr = 0xfff; - sec_mask = 0x1f000; - break; - case 0xda: /* Winbond flash. */ - /* Winbond W29EE011 part - 256 byte sector size. */ - rest_addr = 0x7f; - sec_mask = 0x1ff80; - break; - case 0xc2: /* Macronix flash. */ - /* 64k sector size. */ - if (flash_id == 0x38 || flash_id == 0x4f) { - rest_addr = 0xffff; - sec_mask = 0x10000; - break; - } - /* Fall through... */ - - case 0x1f: /* Atmel flash. */ - /* 512k sector size. */ - if (flash_id == 0x13) { - rest_addr = 0x7fffffff; - sec_mask = 0x80000000; - break; - } - /* Fall through... */ - - case 0x01: /* AMD flash. */ - if (flash_id == 0x38 || flash_id == 0x40 || - flash_id == 0x4f) { - /* Am29LV081 part - 64kb sector size. */ - /* Am29LV002BT part - 64kb sector size. */ - rest_addr = 0xffff; - sec_mask = 0x10000; - break; - } else if (flash_id == 0x3e) { - /* - * Am29LV008b part - 64kb sector size with - * 32kb,8kb,8kb,16kb sector at memory address - * h0xf0000. - */ - rest_addr = 0xffff; - sec_mask = 0x10000; - break; - } else if (flash_id == 0x20 || flash_id == 0x6e) { - /* - * Am29LV010 part or AM29f010 - 16kb sector - * size. - */ - rest_addr = 0x3fff; - sec_mask = 0x1c000; - break; - } else if (flash_id == 0x6d) { - /* Am29LV001 part - 8kb sector size. */ - rest_addr = 0x1fff; - sec_mask = 0x1e000; - break; - } - default: - /* Default to 16 kb sector size. */ - rest_addr = 0x3fff; - sec_mask = 0x1c000; - break; - } - -update_flash: - if (IS_QLA2322(ha) || IS_QLA6322(ha)) { - if (qla2x00_erase_flash(ha, man_id, flash_id)) { - rval = QLA_FUNCTION_FAILED; - break; - } - } - - for (addr = offset, liter = 0; liter < length; liter++, - addr++) { - data = buf[liter]; - /* Are we at the beginning of a sector? */ - if ((addr & rest_addr) == 0) { - if (IS_QLA2322(ha) || IS_QLA6322(ha)) { - if (addr >= 0x10000UL) { - if (((addr >> 12) & 0xf0) && - ((man_id == 0x01 && - flash_id == 0x3e) || - (man_id == 0x20 && - flash_id == 0xd2))) { - sec_number++; - if (sec_number == 1) { - rest_addr = - 0x7fff; - sec_mask = - 0x18000; - } else if ( - sec_number == 2 || - sec_number == 3) { - rest_addr = - 0x1fff; - sec_mask = - 0x1e000; - } else if ( - sec_number == 4) { - rest_addr = - 0x3fff; - sec_mask = - 0x1c000; - } - } - } - } else if (addr == ha->optrom_size / 2) { - WRT_REG_WORD(®->nvram, NVR_SELECT); - RD_REG_WORD(®->nvram); - } - - if (flash_id == 0xda && man_id == 0xc1) { - qla2x00_write_flash_byte(ha, 0x5555, - 0xaa); - qla2x00_write_flash_byte(ha, 0x2aaa, - 0x55); - qla2x00_write_flash_byte(ha, 0x5555, - 0xa0); - } else if (!IS_QLA2322(ha) && !IS_QLA6322(ha)) { - /* Then erase it */ - if (qla2x00_erase_flash_sector(ha, - addr, sec_mask, man_id, - flash_id)) { - rval = QLA_FUNCTION_FAILED; - break; - } - if (man_id == 0x01 && flash_id == 0x6d) - sec_number++; - } - } - - if (man_id == 0x01 && flash_id == 0x6d) { - if (sec_number == 1 && - addr == (rest_addr - 1)) { - rest_addr = 0x0fff; - sec_mask = 0x1f000; - } else if (sec_number == 3 && (addr & 0x7ffe)) { - rest_addr = 0x3fff; - sec_mask = 0x1c000; - } - } - - if (qla2x00_program_flash_address(ha, addr, data, - man_id, flash_id)) { - rval = QLA_FUNCTION_FAILED; - break; - } - } - } while (0); - qla2x00_flash_disable(ha); - spin_unlock_irqrestore(&ha->hardware_lock, flags); - - /* Resume HBA. */ - qla2x00_resume_hba(ha); - - return rval; -} - -uint8_t * -qla24xx_read_optrom_data(struct scsi_qla_host *ha, uint8_t *buf, - uint32_t offset, uint32_t length) -{ - /* Suspend HBA. */ - scsi_block_requests(ha->host); - ha->isp_ops.disable_intrs(ha); - set_bit(MBX_UPDATE_FLASH_ACTIVE, &ha->mbx_cmd_flags); - - /* Go with read. */ - qla24xx_read_flash_data(ha, (uint32_t *)buf, offset >> 2, length >> 2); - - /* Resume HBA. */ - clear_bit(MBX_UPDATE_FLASH_ACTIVE, &ha->mbx_cmd_flags); - ha->isp_ops.enable_intrs(ha); - scsi_unblock_requests(ha->host); - - return buf; -} - -int -qla24xx_write_optrom_data(struct scsi_qla_host *ha, uint8_t *buf, - uint32_t offset, uint32_t length) -{ - int rval; - - /* Suspend HBA. */ - scsi_block_requests(ha->host); - ha->isp_ops.disable_intrs(ha); - set_bit(MBX_UPDATE_FLASH_ACTIVE, &ha->mbx_cmd_flags); - - /* Go with write. */ - rval = qla24xx_write_flash_data(ha, (uint32_t *)buf, offset >> 2, - length >> 2); - - /* Resume HBA -- RISC reset needed. */ - clear_bit(MBX_UPDATE_FLASH_ACTIVE, &ha->mbx_cmd_flags); - set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); - up(ha->dpc_wait); - qla2x00_wait_for_hba_online(ha); - scsi_unblock_requests(ha->host); - - return rval; -} diff --git a/trunk/drivers/scsi/scsi_lib.c b/trunk/drivers/scsi/scsi_lib.c index 4362dcde74af..4a602853a98e 100644 --- a/trunk/drivers/scsi/scsi_lib.c +++ b/trunk/drivers/scsi/scsi_lib.c @@ -16,7 +16,6 @@ #include #include #include -#include #include #include @@ -2249,61 +2248,3 @@ scsi_target_unblock(struct device *dev) device_for_each_child(dev, NULL, target_unblock); } EXPORT_SYMBOL_GPL(scsi_target_unblock); - - -struct work_queue_work { - struct work_struct work; - void (*fn)(void *); - void *data; -}; - -static void execute_in_process_context_work(void *data) -{ - void (*fn)(void *data); - struct work_queue_work *wqw = data; - - fn = wqw->fn; - data = wqw->data; - - kfree(wqw); - - fn(data); -} - -/** - * scsi_execute_in_process_context - reliably execute the routine with user context - * @fn: the function to execute - * @data: data to pass to the function - * - * Executes the function immediately if process context is available, - * otherwise schedules the function for delayed execution. - * - * Returns: 0 - function was executed - * 1 - function was scheduled for execution - * <0 - error - */ -int scsi_execute_in_process_context(void (*fn)(void *data), void *data) -{ - struct work_queue_work *wqw; - - if (!in_interrupt()) { - fn(data); - return 0; - } - - wqw = kmalloc(sizeof(struct work_queue_work), GFP_ATOMIC); - - if (unlikely(!wqw)) { - printk(KERN_ERR "Failed to allocate memory\n"); - WARN_ON(1); - return -ENOMEM; - } - - INIT_WORK(&wqw->work, execute_in_process_context_work, wqw); - wqw->fn = fn; - wqw->data = data; - schedule_work(&wqw->work); - - return 1; -} -EXPORT_SYMBOL_GPL(scsi_execute_in_process_context); diff --git a/trunk/drivers/scsi/scsi_scan.c b/trunk/drivers/scsi/scsi_scan.c index 5acb83ca5ae5..752fb5da3de4 100644 --- a/trunk/drivers/scsi/scsi_scan.c +++ b/trunk/drivers/scsi/scsi_scan.c @@ -387,12 +387,19 @@ static struct scsi_target *scsi_alloc_target(struct device *parent, return found_target; } -static void scsi_target_reap_usercontext(void *data) -{ - struct scsi_target *starget = data; +struct work_queue_wrapper { + struct work_struct work; + struct scsi_target *starget; +}; + +static void scsi_target_reap_work(void *data) { + struct work_queue_wrapper *wqw = (struct work_queue_wrapper *)data; + struct scsi_target *starget = wqw->starget; struct Scsi_Host *shost = dev_to_shost(starget->dev.parent); unsigned long flags; + kfree(wqw); + spin_lock_irqsave(shost->host_lock, flags); if (--starget->reap_ref == 0 && list_empty(&starget->devices)) { @@ -421,7 +428,18 @@ static void scsi_target_reap_usercontext(void *data) */ void scsi_target_reap(struct scsi_target *starget) { - scsi_execute_in_process_context(scsi_target_reap_usercontext, starget); + struct work_queue_wrapper *wqw = + kzalloc(sizeof(struct work_queue_wrapper), GFP_ATOMIC); + + if (!wqw) { + starget_printk(KERN_ERR, starget, + "Failed to allocate memory in scsi_reap_target()\n"); + return; + } + + INIT_WORK(&wqw->work, scsi_target_reap_work, wqw); + wqw->starget = starget; + schedule_work(&wqw->work); } /** diff --git a/trunk/drivers/scsi/scsi_sysfs.c b/trunk/drivers/scsi/scsi_sysfs.c index 902a5def8e62..a77b32deaf8f 100644 --- a/trunk/drivers/scsi/scsi_sysfs.c +++ b/trunk/drivers/scsi/scsi_sysfs.c @@ -217,9 +217,8 @@ static void scsi_device_cls_release(struct class_device *class_dev) put_device(&sdev->sdev_gendev); } -static void scsi_device_dev_release_usercontext(void *data) +static void scsi_device_dev_release(struct device *dev) { - struct device *dev = data; struct scsi_device *sdev; struct device *parent; struct scsi_target *starget; @@ -238,7 +237,6 @@ static void scsi_device_dev_release_usercontext(void *data) if (sdev->request_queue) { sdev->request_queue->queuedata = NULL; - /* user context needed to free queue */ scsi_free_queue(sdev->request_queue); /* temporary expedient, try to catch use of queue lock * after free of sdev */ @@ -254,11 +252,6 @@ static void scsi_device_dev_release_usercontext(void *data) put_device(parent); } -static void scsi_device_dev_release(struct device *dev) -{ - scsi_execute_in_process_context(scsi_device_dev_release_usercontext, dev); -} - static struct class sdev_class = { .name = "scsi_device", .release = scsi_device_cls_release, diff --git a/trunk/drivers/scsi/scsi_transport_iscsi.c b/trunk/drivers/scsi/scsi_transport_iscsi.c index 71e54a64adca..723f7acbeb12 100644 --- a/trunk/drivers/scsi/scsi_transport_iscsi.c +++ b/trunk/drivers/scsi/scsi_transport_iscsi.c @@ -38,6 +38,10 @@ struct iscsi_internal { struct scsi_transport_template t; struct iscsi_transport *iscsi_transport; struct list_head list; + /* + * List of sessions for this transport + */ + struct list_head sessions; /* * based on transport capabilities, at register time we set these * bits to tell the transport class it wants attributes displayed @@ -160,43 +164,9 @@ static struct mempool_zone *z_reply; #define Z_MAX_ERROR 16 #define Z_HIWAT_ERROR 12 -static LIST_HEAD(sesslist); -static DEFINE_SPINLOCK(sesslock); static LIST_HEAD(connlist); static DEFINE_SPINLOCK(connlock); -static struct iscsi_cls_session *iscsi_session_lookup(uint64_t handle) -{ - unsigned long flags; - struct iscsi_cls_session *sess; - - spin_lock_irqsave(&sesslock, flags); - list_for_each_entry(sess, &sesslist, sess_list) { - if (sess == iscsi_ptr(handle)) { - spin_unlock_irqrestore(&sesslock, flags); - return sess; - } - } - spin_unlock_irqrestore(&sesslock, flags); - return NULL; -} - -static struct iscsi_cls_conn *iscsi_conn_lookup(uint64_t handle) -{ - unsigned long flags; - struct iscsi_cls_conn *conn; - - spin_lock_irqsave(&connlock, flags); - list_for_each_entry(conn, &connlist, conn_list) { - if (conn == iscsi_ptr(handle)) { - spin_unlock_irqrestore(&connlock, flags); - return conn; - } - } - spin_unlock_irqrestore(&connlock, flags); - return NULL; -} - /* * The following functions can be used by LLDs that allocate * their own scsi_hosts or by software iscsi LLDs @@ -395,7 +365,6 @@ iscsi_transport_create_session(struct scsi_transport_template *scsit, { struct iscsi_cls_session *session; struct Scsi_Host *shost; - unsigned long flags; shost = scsi_host_alloc(transport->host_template, hostdata_privsize(transport)); @@ -420,9 +389,6 @@ iscsi_transport_create_session(struct scsi_transport_template *scsit, goto remove_host; *(unsigned long*)shost->hostdata = (unsigned long)session; - spin_lock_irqsave(&sesslock, flags); - list_add(&session->sess_list, &sesslist); - spin_unlock_irqrestore(&sesslock, flags); return shost; remove_host: @@ -444,13 +410,9 @@ EXPORT_SYMBOL_GPL(iscsi_transport_create_session); int iscsi_transport_destroy_session(struct Scsi_Host *shost) { struct iscsi_cls_session *session; - unsigned long flags; scsi_remove_host(shost); session = hostdata_session(shost->hostdata); - spin_lock_irqsave(&sesslock, flags); - list_del(&session->sess_list); - spin_unlock_irqrestore(&sesslock, flags); iscsi_destroy_session(session); /* ref from host alloc */ scsi_host_put(shost); @@ -462,6 +424,22 @@ EXPORT_SYMBOL_GPL(iscsi_transport_destroy_session); /* * iscsi interface functions */ +static struct iscsi_cls_conn* +iscsi_if_find_conn(uint64_t key) +{ + unsigned long flags; + struct iscsi_cls_conn *conn; + + spin_lock_irqsave(&connlock, flags); + list_for_each_entry(conn, &connlist, conn_list) + if (conn->connh == key) { + spin_unlock_irqrestore(&connlock, flags); + return conn; + } + spin_unlock_irqrestore(&connlock, flags); + return NULL; +} + static struct iscsi_internal * iscsi_if_transport_lookup(struct iscsi_transport *tt) { @@ -526,12 +504,6 @@ mempool_zone_init(unsigned max, unsigned size, unsigned hiwat) if (!zp) return NULL; - zp->size = size; - zp->hiwat = hiwat; - INIT_LIST_HEAD(&zp->freequeue); - spin_lock_init(&zp->freelock); - atomic_set(&zp->allocated, 0); - zp->pool = mempool_create(max, mempool_zone_alloc_skb, mempool_zone_free_skb, zp); if (!zp->pool) { @@ -539,6 +511,13 @@ mempool_zone_init(unsigned max, unsigned size, unsigned hiwat) return NULL; } + zp->size = size; + zp->hiwat = hiwat; + + INIT_LIST_HEAD(&zp->freequeue); + spin_lock_init(&zp->freelock); + atomic_set(&zp->allocated, 0); + return zp; } @@ -580,21 +559,25 @@ iscsi_unicast_skb(struct mempool_zone *zone, struct sk_buff *skb) return 0; } -int iscsi_recv_pdu(struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr, +int iscsi_recv_pdu(iscsi_connh_t connh, struct iscsi_hdr *hdr, char *data, uint32_t data_size) { struct nlmsghdr *nlh; struct sk_buff *skb; struct iscsi_uevent *ev; + struct iscsi_cls_conn *conn; char *pdu; int len = NLMSG_SPACE(sizeof(*ev) + sizeof(struct iscsi_hdr) + data_size); + conn = iscsi_if_find_conn(connh); + BUG_ON(!conn); + mempool_zone_complete(conn->z_pdu); skb = mempool_zone_get_skb(conn->z_pdu); if (!skb) { - iscsi_conn_error(conn, ISCSI_ERR_CONN_FAILED); + iscsi_conn_error(connh, ISCSI_ERR_CONN_FAILED); dev_printk(KERN_ERR, &conn->dev, "iscsi: can not deliver " "control PDU: OOM\n"); return -ENOMEM; @@ -607,7 +590,7 @@ int iscsi_recv_pdu(struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr, ev->type = ISCSI_KEVENT_RECV_PDU; if (atomic_read(&conn->z_pdu->allocated) >= conn->z_pdu->hiwat) ev->iferror = -ENOMEM; - ev->r.recv_req.conn_handle = iscsi_handle(conn); + ev->r.recv_req.conn_handle = connh; pdu = (char*)ev + sizeof(*ev); memcpy(pdu, hdr, sizeof(struct iscsi_hdr)); memcpy(pdu + sizeof(struct iscsi_hdr), data, data_size); @@ -616,13 +599,17 @@ int iscsi_recv_pdu(struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr, } EXPORT_SYMBOL_GPL(iscsi_recv_pdu); -void iscsi_conn_error(struct iscsi_cls_conn *conn, enum iscsi_err error) +void iscsi_conn_error(iscsi_connh_t connh, enum iscsi_err error) { struct nlmsghdr *nlh; struct sk_buff *skb; struct iscsi_uevent *ev; + struct iscsi_cls_conn *conn; int len = NLMSG_SPACE(sizeof(*ev)); + conn = iscsi_if_find_conn(connh); + BUG_ON(!conn); + mempool_zone_complete(conn->z_error); skb = mempool_zone_get_skb(conn->z_error); @@ -639,7 +626,7 @@ void iscsi_conn_error(struct iscsi_cls_conn *conn, enum iscsi_err error) if (atomic_read(&conn->z_error->allocated) >= conn->z_error->hiwat) ev->iferror = -ENOMEM; ev->r.connerror.error = error; - ev->r.connerror.conn_handle = iscsi_handle(conn); + ev->r.connerror.conn_handle = connh; iscsi_unicast_skb(conn->z_error, skb); @@ -675,7 +662,8 @@ iscsi_if_send_reply(int pid, int seq, int type, int done, int multi, } static int -iscsi_if_get_stats(struct iscsi_transport *transport, struct nlmsghdr *nlh) +iscsi_if_get_stats(struct iscsi_transport *transport, struct sk_buff *skb, + struct nlmsghdr *nlh) { struct iscsi_uevent *ev = NLMSG_DATA(nlh); struct iscsi_stats *stats; @@ -689,7 +677,7 @@ iscsi_if_get_stats(struct iscsi_transport *transport, struct nlmsghdr *nlh) ISCSI_STATS_CUSTOM_MAX); int err = 0; - conn = iscsi_conn_lookup(ev->u.get_stats.conn_handle); + conn = iscsi_if_find_conn(ev->u.get_stats.conn_handle); if (!conn) return -EEXIST; @@ -719,14 +707,14 @@ iscsi_if_get_stats(struct iscsi_transport *transport, struct nlmsghdr *nlh) ((char*)evstat + sizeof(*evstat)); memset(stats, 0, sizeof(*stats)); - transport->get_stats(conn, stats); + transport->get_stats(ev->u.get_stats.conn_handle, stats); actual_size = NLMSG_SPACE(sizeof(struct iscsi_uevent) + sizeof(struct iscsi_stats) + sizeof(struct iscsi_stats_custom) * stats->custom_length); actual_size -= sizeof(*nlhstat); actual_size = NLMSG_LENGTH(actual_size); - skb_trim(skbstat, NLMSG_ALIGN(actual_size)); + skb_trim(skb, NLMSG_ALIGN(actual_size)); nlhstat->nlmsg_len = actual_size; err = iscsi_unicast_skb(conn->z_pdu, skbstat); @@ -739,34 +727,58 @@ static int iscsi_if_create_session(struct iscsi_internal *priv, struct iscsi_uevent *ev) { struct iscsi_transport *transport = priv->iscsi_transport; - struct iscsi_cls_session *session; - uint32_t sid; + struct Scsi_Host *shost; - session = transport->create_session(&priv->t, - ev->u.c_session.initial_cmdsn, - &sid); - if (!session) + if (!transport->create_session) + return -EINVAL; + + shost = transport->create_session(&priv->t, + ev->u.c_session.initial_cmdsn); + if (!shost) return -ENOMEM; - ev->r.c_session_ret.session_handle = iscsi_handle(session); - ev->r.c_session_ret.sid = sid; + ev->r.c_session_ret.session_handle = iscsi_handle(iscsi_hostdata(shost->hostdata)); + ev->r.c_session_ret.sid = shost->host_no; return 0; } static int -iscsi_if_create_conn(struct iscsi_transport *transport, struct iscsi_uevent *ev) +iscsi_if_destroy_session(struct iscsi_internal *priv, struct iscsi_uevent *ev) { + struct iscsi_transport *transport = priv->iscsi_transport; + + struct Scsi_Host *shost; + + if (!transport->destroy_session) + return -EINVAL; + + shost = scsi_host_lookup(ev->u.d_session.sid); + if (shost == ERR_PTR(-ENXIO)) + return -EEXIST; + + if (transport->destroy_session) + transport->destroy_session(shost); + /* ref from host lookup */ + scsi_host_put(shost); + return 0; +} + +static int +iscsi_if_create_conn(struct iscsi_transport *transport, struct iscsi_uevent *ev){ + struct Scsi_Host *shost; struct iscsi_cls_conn *conn; - struct iscsi_cls_session *session; unsigned long flags; - session = iscsi_session_lookup(ev->u.c_conn.session_handle); - if (!session) + if (!transport->create_conn) return -EINVAL; - conn = transport->create_conn(session, ev->u.c_conn.cid); + shost = scsi_host_lookup(ev->u.c_conn.sid); + if (shost == ERR_PTR(-ENXIO)) + return -EEXIST; + + conn = transport->create_conn(shost, ev->u.c_conn.cid); if (!conn) - return -ENOMEM; + goto release_ref; conn->z_pdu = mempool_zone_init(Z_MAX_PDU, NLMSG_SPACE(sizeof(struct iscsi_uevent) + @@ -788,13 +800,14 @@ iscsi_if_create_conn(struct iscsi_transport *transport, struct iscsi_uevent *ev) goto free_pdu_pool; } - ev->r.handle = iscsi_handle(conn); + ev->r.handle = conn->connh = iscsi_handle(conn->dd_data); spin_lock_irqsave(&connlock, flags); list_add(&conn->conn_list, &connlist); conn->active = 1; spin_unlock_irqrestore(&connlock, flags); + scsi_host_put(shost); return 0; free_pdu_pool: @@ -802,6 +815,8 @@ iscsi_if_create_conn(struct iscsi_transport *transport, struct iscsi_uevent *ev) destroy_conn: if (transport->destroy_conn) transport->destroy_conn(conn->dd_data); +release_ref: + scsi_host_put(shost); return -ENOMEM; } @@ -812,9 +827,13 @@ iscsi_if_destroy_conn(struct iscsi_transport *transport, struct iscsi_uevent *ev struct iscsi_cls_conn *conn; struct mempool_zone *z_error, *z_pdu; - conn = iscsi_conn_lookup(ev->u.d_conn.conn_handle); + conn = iscsi_if_find_conn(ev->u.d_conn.conn_handle); if (!conn) + return -EEXIST; + + if (!transport->destroy_conn) return -EINVAL; + spin_lock_irqsave(&connlock, flags); conn->active = 0; list_del(&conn->conn_list); @@ -839,27 +858,23 @@ iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh) struct iscsi_uevent *ev = NLMSG_DATA(nlh); struct iscsi_transport *transport = NULL; struct iscsi_internal *priv; - struct iscsi_cls_session *session; - struct iscsi_cls_conn *conn; + + if (NETLINK_CREDS(skb)->uid) + return -EPERM; priv = iscsi_if_transport_lookup(iscsi_ptr(ev->transport_handle)); if (!priv) return -EINVAL; transport = priv->iscsi_transport; - if (!try_module_get(transport->owner)) - return -EINVAL; + daemon_pid = NETLINK_CREDS(skb)->pid; switch (nlh->nlmsg_type) { case ISCSI_UEVENT_CREATE_SESSION: err = iscsi_if_create_session(priv, ev); break; case ISCSI_UEVENT_DESTROY_SESSION: - session = iscsi_session_lookup(ev->u.d_session.session_handle); - if (session) - transport->destroy_session(session); - else - err = -EINVAL; + err = iscsi_if_destroy_session(priv, ev); break; case ISCSI_UEVENT_CREATE_CONN: err = iscsi_if_create_conn(transport, ev); @@ -868,64 +883,56 @@ iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh) err = iscsi_if_destroy_conn(transport, ev); break; case ISCSI_UEVENT_BIND_CONN: - session = iscsi_session_lookup(ev->u.b_conn.session_handle); - conn = iscsi_conn_lookup(ev->u.b_conn.conn_handle); - - if (session && conn) - ev->r.retcode = transport->bind_conn(session, conn, - ev->u.b_conn.transport_fd, - ev->u.b_conn.is_leading); - else - err = -EINVAL; + if (!iscsi_if_find_conn(ev->u.b_conn.conn_handle)) + return -EEXIST; + ev->r.retcode = transport->bind_conn( + ev->u.b_conn.session_handle, + ev->u.b_conn.conn_handle, + ev->u.b_conn.transport_fd, + ev->u.b_conn.is_leading); break; case ISCSI_UEVENT_SET_PARAM: - conn = iscsi_conn_lookup(ev->u.set_param.conn_handle); - if (conn) - ev->r.retcode = transport->set_param(conn, - ev->u.set_param.param, ev->u.set_param.value); - else - err = -EINVAL; + if (!iscsi_if_find_conn(ev->u.set_param.conn_handle)) + return -EEXIST; + ev->r.retcode = transport->set_param( + ev->u.set_param.conn_handle, + ev->u.set_param.param, ev->u.set_param.value); break; case ISCSI_UEVENT_START_CONN: - conn = iscsi_conn_lookup(ev->u.start_conn.conn_handle); - if (conn) - ev->r.retcode = transport->start_conn(conn); - else - err = -EINVAL; - + if (!iscsi_if_find_conn(ev->u.start_conn.conn_handle)) + return -EEXIST; + ev->r.retcode = transport->start_conn( + ev->u.start_conn.conn_handle); break; case ISCSI_UEVENT_STOP_CONN: - conn = iscsi_conn_lookup(ev->u.stop_conn.conn_handle); - if (conn) - transport->stop_conn(conn, ev->u.stop_conn.flag); - else - err = -EINVAL; + if (!iscsi_if_find_conn(ev->u.stop_conn.conn_handle)) + return -EEXIST; + transport->stop_conn(ev->u.stop_conn.conn_handle, + ev->u.stop_conn.flag); break; case ISCSI_UEVENT_SEND_PDU: - conn = iscsi_conn_lookup(ev->u.send_pdu.conn_handle); - if (conn) - ev->r.retcode = transport->send_pdu(conn, - (struct iscsi_hdr*)((char*)ev + sizeof(*ev)), - (char*)ev + sizeof(*ev) + ev->u.send_pdu.hdr_size, - ev->u.send_pdu.data_size); - else - err = -EINVAL; + if (!iscsi_if_find_conn(ev->u.send_pdu.conn_handle)) + return -EEXIST; + ev->r.retcode = transport->send_pdu( + ev->u.send_pdu.conn_handle, + (struct iscsi_hdr*)((char*)ev + sizeof(*ev)), + (char*)ev + sizeof(*ev) + ev->u.send_pdu.hdr_size, + ev->u.send_pdu.data_size); break; case ISCSI_UEVENT_GET_STATS: - err = iscsi_if_get_stats(transport, nlh); + err = iscsi_if_get_stats(transport, skb, nlh); break; default: err = -EINVAL; break; } - module_put(transport->owner); return err; } /* Get message from skb (based on rtnetlink_rcv_skb). Each message is * processed by iscsi_if_recv_msg. Malformed skbs with wrong length are - * or invalid creds discarded silently. */ + * discarded silently. */ static void iscsi_if_rx(struct sock *sk, int len) { @@ -933,12 +940,6 @@ iscsi_if_rx(struct sock *sk, int len) mutex_lock(&rx_queue_mutex); while ((skb = skb_dequeue(&sk->sk_receive_queue)) != NULL) { - if (NETLINK_CREDS(skb)->uid) { - skb_pull(skb, skb->len); - goto free_skb; - } - daemon_pid = NETLINK_CREDS(skb)->pid; - while (skb->len >= NLMSG_SPACE(0)) { int err; uint32_t rlen; @@ -950,12 +951,10 @@ iscsi_if_rx(struct sock *sk, int len) skb->len < nlh->nlmsg_len) { break; } - ev = NLMSG_DATA(nlh); rlen = NLMSG_ALIGN(nlh->nlmsg_len); if (rlen > skb->len) rlen = skb->len; - err = iscsi_if_recv_msg(skb, nlh); if (err) { ev->type = ISCSI_KEVENT_IF_ERROR; @@ -979,7 +978,6 @@ iscsi_if_rx(struct sock *sk, int len) } while (err < 0 && err != -ECONNREFUSED); skb_pull(skb, rlen); } -free_skb: kfree_skb(skb); } mutex_unlock(&rx_queue_mutex); @@ -999,7 +997,7 @@ show_conn_int_param_##param(struct class_device *cdev, char *buf) \ struct iscsi_cls_conn *conn = iscsi_cdev_to_conn(cdev); \ struct iscsi_transport *t = conn->transport; \ \ - t->get_conn_param(conn, param, &value); \ + t->get_conn_param(conn->dd_data, param, &value); \ return snprintf(buf, 20, format"\n", value); \ } @@ -1026,9 +1024,10 @@ show_session_int_param_##param(struct class_device *cdev, char *buf) \ { \ uint32_t value = 0; \ struct iscsi_cls_session *session = iscsi_cdev_to_session(cdev); \ + struct Scsi_Host *shost = iscsi_session_to_shost(session); \ struct iscsi_transport *t = session->transport; \ \ - t->get_session_param(session, param, &value); \ + t->get_session_param(shost, param, &value); \ return snprintf(buf, 20, format"\n", value); \ } @@ -1122,6 +1121,7 @@ iscsi_register_transport(struct iscsi_transport *tt) return NULL; memset(priv, 0, sizeof(*priv)); INIT_LIST_HEAD(&priv->list); + INIT_LIST_HEAD(&priv->sessions); priv->iscsi_transport = tt; priv->cdev.class = &iscsi_transport_class; diff --git a/trunk/drivers/scsi/sym53c8xx_2/sym_hipd.c b/trunk/drivers/scsi/sym53c8xx_2/sym_hipd.c index f4854c33f48d..8260f040d39c 100644 --- a/trunk/drivers/scsi/sym53c8xx_2/sym_hipd.c +++ b/trunk/drivers/scsi/sym53c8xx_2/sym_hipd.c @@ -3588,7 +3588,7 @@ static int sym_evaluate_dp(struct sym_hcb *np, struct sym_ccb *cp, u32 scr, int if (pm) { dp_scr = scr_to_cpu(pm->ret); - dp_ofs -= scr_to_cpu(pm->sg.size) & 0x00ffffff; + dp_ofs -= scr_to_cpu(pm->sg.size); } /* diff --git a/trunk/drivers/serial/Kconfig b/trunk/drivers/serial/Kconfig index 0f4361c8466b..b3c561abe3f6 100644 --- a/trunk/drivers/serial/Kconfig +++ b/trunk/drivers/serial/Kconfig @@ -902,8 +902,8 @@ config SERIAL_JSM something like this to connect more than two modems to your Linux box, for instance in order to become a dial-in server. This driver supports PCI boards only. - If you have a card like this, say Y here and read the file - . + + If you have a card like this, say Y here, otherwise say N. To compile this driver as a module, choose M here: the module will be called jsm. diff --git a/trunk/drivers/video/neofb.c b/trunk/drivers/video/neofb.c index a2e201dc40f7..b85e2b180a44 100644 --- a/trunk/drivers/video/neofb.c +++ b/trunk/drivers/video/neofb.c @@ -843,9 +843,6 @@ static int neofb_set_par(struct fb_info *info) par->SysIfaceCntl2 = 0xc0; /* VESA Bios sets this to 0x80! */ - /* Initialize: by default, we want display config register to be read */ - par->PanelDispCntlRegRead = 1; - /* Enable any user specified display devices. */ par->PanelDispCntlReg1 = 0x00; if (par->internal_display) @@ -1337,17 +1334,11 @@ static int neofb_blank(int blank_mode, struct fb_info *info) struct neofb_par *par = info->par; int seqflags, lcdflags, dpmsflags, reg; - /* - * Reload the value stored in the register, if sensible. It might have - * been changed via FN keystroke. + * Reload the value stored in the register, might have been changed via + * FN keystroke */ - if (par->PanelDispCntlRegRead) { - neoUnlock(); - par->PanelDispCntlReg1 = vga_rgfx(NULL, 0x20) & 0x03; - neoLock(&par->state); - } - par->PanelDispCntlRegRead = !blank_mode; + par->PanelDispCntlReg1 = vga_rgfx(NULL, 0x20) & 0x03; switch (blank_mode) { case FB_BLANK_POWERDOWN: /* powerdown - both sync lines down */ diff --git a/trunk/drivers/video/s3c2410fb.c b/trunk/drivers/video/s3c2410fb.c index 9451932fbaf2..d574dd3c9c8a 100644 --- a/trunk/drivers/video/s3c2410fb.c +++ b/trunk/drivers/video/s3c2410fb.c @@ -82,6 +82,7 @@ #include #include #include +#include #include #include #include diff --git a/trunk/fs/cifs/file.c b/trunk/fs/cifs/file.c index 675bd2568297..d17c97d07c80 100644 --- a/trunk/fs/cifs/file.c +++ b/trunk/fs/cifs/file.c @@ -1442,15 +1442,13 @@ ssize_t cifs_user_read(struct file *file, char __user *read_data, &bytes_read, &smb_read_data, &buf_type); pSMBr = (struct smb_com_read_rsp *)smb_read_data; + if (copy_to_user(current_offset, + smb_read_data + 4 /* RFC1001 hdr */ + + le16_to_cpu(pSMBr->DataOffset), + bytes_read)) { + rc = -EFAULT; + } if (smb_read_data) { - if (copy_to_user(current_offset, - smb_read_data + - 4 /* RFC1001 length field */ + - le16_to_cpu(pSMBr->DataOffset), - bytes_read)) { - rc = -EFAULT; - } - if(buf_type == CIFS_SMALL_BUFFER) cifs_small_buf_release(smb_read_data); else if(buf_type == CIFS_LARGE_BUFFER) diff --git a/trunk/fs/exec.c b/trunk/fs/exec.c index 0e1c95074d42..055378d2513e 100644 --- a/trunk/fs/exec.c +++ b/trunk/fs/exec.c @@ -1403,7 +1403,7 @@ static void zap_threads (struct mm_struct *mm) do_each_thread(g,p) { if (mm == p->mm && p != tsk && p->ptrace && p->parent->mm == mm) { - __ptrace_detach(p, 0); + __ptrace_unlink(p); } } while_each_thread(g,p); write_unlock_irq(&tasklist_lock); diff --git a/trunk/fs/ocfs2/dlm/dlmcommon.h b/trunk/fs/ocfs2/dlm/dlmcommon.h index 23ceaa7127b4..42eb53b5293b 100644 --- a/trunk/fs/ocfs2/dlm/dlmcommon.h +++ b/trunk/fs/ocfs2/dlm/dlmcommon.h @@ -208,9 +208,6 @@ static inline void __dlm_set_joining_node(struct dlm_ctxt *dlm, #define DLM_LOCK_RES_IN_PROGRESS 0x00000010 #define DLM_LOCK_RES_MIGRATING 0x00000020 -/* max milliseconds to wait to sync up a network failure with a node death */ -#define DLM_NODE_DEATH_WAIT_MAX (5 * 1000) - #define DLM_PURGE_INTERVAL_MS (8 * 1000) struct dlm_lock_resource @@ -661,7 +658,6 @@ int dlm_launch_recovery_thread(struct dlm_ctxt *dlm); void dlm_complete_recovery_thread(struct dlm_ctxt *dlm); void dlm_wait_for_recovery(struct dlm_ctxt *dlm); int dlm_is_node_dead(struct dlm_ctxt *dlm, u8 node); -int dlm_wait_for_node_death(struct dlm_ctxt *dlm, u8 node, int timeout); void dlm_put(struct dlm_ctxt *dlm); struct dlm_ctxt *dlm_grab(struct dlm_ctxt *dlm); diff --git a/trunk/fs/ocfs2/dlm/dlmconvert.c b/trunk/fs/ocfs2/dlm/dlmconvert.c index f66e2d818ccd..6001b22a997d 100644 --- a/trunk/fs/ocfs2/dlm/dlmconvert.c +++ b/trunk/fs/ocfs2/dlm/dlmconvert.c @@ -392,11 +392,6 @@ static enum dlm_status dlm_send_remote_convert_request(struct dlm_ctxt *dlm, } else { mlog_errno(tmpret); if (dlm_is_host_down(tmpret)) { - /* instead of logging the same network error over - * and over, sleep here and wait for the heartbeat - * to notice the node is dead. times out after 5s. */ - dlm_wait_for_node_death(dlm, res->owner, - DLM_NODE_DEATH_WAIT_MAX); ret = DLM_RECOVERING; mlog(0, "node %u died so returning DLM_RECOVERING " "from convert message!\n", res->owner); @@ -426,7 +421,7 @@ int dlm_convert_lock_handler(struct o2net_msg *msg, u32 len, void *data) struct dlm_lockstatus *lksb; enum dlm_status status = DLM_NORMAL; u32 flags; - int call_ast = 0, kick_thread = 0, ast_reserved = 0; + int call_ast = 0, kick_thread = 0; if (!dlm_grab(dlm)) { dlm_error(DLM_REJECTED); @@ -495,7 +490,6 @@ int dlm_convert_lock_handler(struct o2net_msg *msg, u32 len, void *data) status = __dlm_lockres_state_to_status(res); if (status == DLM_NORMAL) { __dlm_lockres_reserve_ast(res); - ast_reserved = 1; res->state |= DLM_LOCK_RES_IN_PROGRESS; status = __dlmconvert_master(dlm, res, lock, flags, cnv->requested_type, @@ -518,10 +512,10 @@ int dlm_convert_lock_handler(struct o2net_msg *msg, u32 len, void *data) else dlm_lock_put(lock); - /* either queue the ast or release it, if reserved */ + /* either queue the ast or release it */ if (call_ast) dlm_queue_ast(dlm, lock); - else if (ast_reserved) + else dlm_lockres_release_ast(dlm, res); if (kick_thread) diff --git a/trunk/fs/ocfs2/dlm/dlmlock.c b/trunk/fs/ocfs2/dlm/dlmlock.c index 671d4ff222cc..d1a0038557a3 100644 --- a/trunk/fs/ocfs2/dlm/dlmlock.c +++ b/trunk/fs/ocfs2/dlm/dlmlock.c @@ -220,17 +220,6 @@ static enum dlm_status dlmlock_remote(struct dlm_ctxt *dlm, dlm_error(status); dlm_revert_pending_lock(res, lock); dlm_lock_put(lock); - } else if (dlm_is_recovery_lock(res->lockname.name, - res->lockname.len)) { - /* special case for the $RECOVERY lock. - * there will never be an AST delivered to put - * this lock on the proper secondary queue - * (granted), so do it manually. */ - mlog(0, "%s: $RECOVERY lock for this node (%u) is " - "mastered by %u; got lock, manually granting (no ast)\n", - dlm->name, dlm->node_num, res->owner); - list_del_init(&lock->list); - list_add_tail(&lock->list, &res->granted); } spin_unlock(&res->spinlock); @@ -657,19 +646,7 @@ enum dlm_status dlmlock(struct dlm_ctxt *dlm, int mode, mlog(0, "retrying lock with migration/" "recovery/in progress\n"); msleep(100); - /* no waiting for dlm_reco_thread */ - if (recovery) { - if (status == DLM_RECOVERING) { - mlog(0, "%s: got RECOVERING " - "for $REOCVERY lock, master " - "was %u\n", dlm->name, - res->owner); - dlm_wait_for_node_death(dlm, res->owner, - DLM_NODE_DEATH_WAIT_MAX); - } - } else { - dlm_wait_for_recovery(dlm); - } + dlm_wait_for_recovery(dlm); goto retry_lock; } diff --git a/trunk/fs/ocfs2/dlm/dlmmaster.c b/trunk/fs/ocfs2/dlm/dlmmaster.c index 2e2e95e69499..a3194fe173d9 100644 --- a/trunk/fs/ocfs2/dlm/dlmmaster.c +++ b/trunk/fs/ocfs2/dlm/dlmmaster.c @@ -2482,9 +2482,7 @@ void dlm_clean_master_list(struct dlm_ctxt *dlm, u8 dead_node) atomic_set(&mle->woken, 1); spin_unlock(&mle->spinlock); wake_up(&mle->wq); - /* do not need events any longer, so detach - * from heartbeat */ - __dlm_mle_detach_hb_events(dlm, mle); + /* final put will take care of list removal */ __dlm_put_mle(mle); } continue; @@ -2539,9 +2537,6 @@ void dlm_clean_master_list(struct dlm_ctxt *dlm, u8 dead_node) spin_unlock(&res->spinlock); dlm_lockres_put(res); - /* about to get rid of mle, detach from heartbeat */ - __dlm_mle_detach_hb_events(dlm, mle); - /* dump the mle */ spin_lock(&dlm->master_lock); __dlm_put_mle(mle); diff --git a/trunk/fs/ocfs2/dlm/dlmrecovery.c b/trunk/fs/ocfs2/dlm/dlmrecovery.c index ed76bda1a534..186e9a76aa58 100644 --- a/trunk/fs/ocfs2/dlm/dlmrecovery.c +++ b/trunk/fs/ocfs2/dlm/dlmrecovery.c @@ -278,24 +278,6 @@ int dlm_is_node_dead(struct dlm_ctxt *dlm, u8 node) return dead; } -int dlm_wait_for_node_death(struct dlm_ctxt *dlm, u8 node, int timeout) -{ - if (timeout) { - mlog(ML_NOTICE, "%s: waiting %dms for notification of " - "death of node %u\n", dlm->name, timeout, node); - wait_event_timeout(dlm->dlm_reco_thread_wq, - dlm_is_node_dead(dlm, node), - msecs_to_jiffies(timeout)); - } else { - mlog(ML_NOTICE, "%s: waiting indefinitely for notification " - "of death of node %u\n", dlm->name, node); - wait_event(dlm->dlm_reco_thread_wq, - dlm_is_node_dead(dlm, node)); - } - /* for now, return 0 */ - return 0; -} - /* callers of the top-level api calls (dlmlock/dlmunlock) should * block on the dlm->reco.event when recovery is in progress. * the dlm recovery thread will set this state when it begins @@ -2050,30 +2032,6 @@ static int dlm_pick_recovery_master(struct dlm_ctxt *dlm) dlm->reco.new_master); status = -EEXIST; } else { - status = 0; - - /* see if recovery was already finished elsewhere */ - spin_lock(&dlm->spinlock); - if (dlm->reco.dead_node == O2NM_INVALID_NODE_NUM) { - status = -EINVAL; - mlog(0, "%s: got reco EX lock, but " - "node got recovered already\n", dlm->name); - if (dlm->reco.new_master != O2NM_INVALID_NODE_NUM) { - mlog(ML_ERROR, "%s: new master is %u " - "but no dead node!\n", - dlm->name, dlm->reco.new_master); - BUG(); - } - } - spin_unlock(&dlm->spinlock); - } - - /* if this node has actually become the recovery master, - * set the master and send the messages to begin recovery */ - if (!status) { - mlog(0, "%s: dead=%u, this=%u, sending " - "begin_reco now\n", dlm->name, - dlm->reco.dead_node, dlm->node_num); status = dlm_send_begin_reco_message(dlm, dlm->reco.dead_node); /* this always succeeds */ diff --git a/trunk/fs/ocfs2/journal.c b/trunk/fs/ocfs2/journal.c index d329c9df90ae..fa0bcac5ceae 100644 --- a/trunk/fs/ocfs2/journal.c +++ b/trunk/fs/ocfs2/journal.c @@ -1584,9 +1584,10 @@ static int ocfs2_commit_thread(void *arg) while (!(kthread_should_stop() && atomic_read(&journal->j_num_trans) == 0)) { - wait_event_interruptible(osb->checkpoint_event, - atomic_read(&journal->j_num_trans) - || kthread_should_stop()); + wait_event_interruptible_timeout(osb->checkpoint_event, + atomic_read(&journal->j_num_trans) + || kthread_should_stop(), + OCFS2_CHECKPOINT_INTERVAL); status = ocfs2_commit_cache(osb); if (status < 0) diff --git a/trunk/fs/ocfs2/journal.h b/trunk/fs/ocfs2/journal.h index 2f3a6acdac45..7d0a816184fa 100644 --- a/trunk/fs/ocfs2/journal.h +++ b/trunk/fs/ocfs2/journal.h @@ -29,6 +29,8 @@ #include #include +#define OCFS2_CHECKPOINT_INTERVAL (8 * HZ) + enum ocfs2_journal_state { OCFS2_JOURNAL_FREE = 0, OCFS2_JOURNAL_LOADED, diff --git a/trunk/include/asm-alpha/mman.h b/trunk/include/asm-alpha/mman.h index 5f24c755f577..a21515c16a43 100644 --- a/trunk/include/asm-alpha/mman.h +++ b/trunk/include/asm-alpha/mman.h @@ -42,11 +42,9 @@ #define MADV_WILLNEED 3 /* will need these pages */ #define MADV_SPACEAVAIL 5 /* ensure resources are available */ #define MADV_DONTNEED 6 /* don't need these pages */ - -/* common/generic parameters */ -#define MADV_REMOVE 9 /* remove these pages & resources */ -#define MADV_DONTFORK 10 /* don't inherit across fork */ -#define MADV_DOFORK 11 /* do inherit across fork */ +#define MADV_REMOVE 7 /* remove these pages & resources */ +#define MADV_DONTFORK 0x30 /* dont inherit across fork */ +#define MADV_DOFORK 0x31 /* do inherit across fork */ /* compatibility flags */ #define MAP_ANON MAP_ANONYMOUS diff --git a/trunk/include/asm-arm/mman.h b/trunk/include/asm-arm/mman.h index 54570d2e95b7..693ed859e632 100644 --- a/trunk/include/asm-arm/mman.h +++ b/trunk/include/asm-arm/mman.h @@ -1,7 +1,19 @@ #ifndef __ARM_MMAN_H__ #define __ARM_MMAN_H__ -#include +#define PROT_READ 0x1 /* page can be read */ +#define PROT_WRITE 0x2 /* page can be written */ +#define PROT_EXEC 0x4 /* page can be executed */ +#define PROT_SEM 0x8 /* page may be used for atomic ops */ +#define PROT_NONE 0x0 /* page can not be accessed */ +#define PROT_GROWSDOWN 0x01000000 /* mprotect flag: extend change to start of growsdown vma */ +#define PROT_GROWSUP 0x02000000 /* mprotect flag: extend change to end of growsup vma */ + +#define MAP_SHARED 0x01 /* Share changes */ +#define MAP_PRIVATE 0x02 /* Changes are private */ +#define MAP_TYPE 0x0f /* Mask for type of mapping */ +#define MAP_FIXED 0x10 /* Interpret addr exactly */ +#define MAP_ANONYMOUS 0x20 /* don't use a file */ #define MAP_GROWSDOWN 0x0100 /* stack-like segment */ #define MAP_DENYWRITE 0x0800 /* ETXTBSY */ @@ -11,7 +23,24 @@ #define MAP_POPULATE 0x8000 /* populate (prefault) page tables */ #define MAP_NONBLOCK 0x10000 /* do not block on IO */ +#define MS_ASYNC 1 /* sync memory asynchronously */ +#define MS_INVALIDATE 2 /* invalidate the caches */ +#define MS_SYNC 4 /* synchronous memory sync */ + #define MCL_CURRENT 1 /* lock all current mappings */ #define MCL_FUTURE 2 /* lock all future mappings */ +#define MADV_NORMAL 0x0 /* default page-in behavior */ +#define MADV_RANDOM 0x1 /* page-in minimum required */ +#define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ +#define MADV_WILLNEED 0x3 /* pre-fault pages */ +#define MADV_DONTNEED 0x4 /* discard these pages */ +#define MADV_REMOVE 0x5 /* remove these pages & resources */ +#define MADV_DONTFORK 0x30 /* dont inherit across fork */ +#define MADV_DOFORK 0x31 /* do inherit across fork */ + +/* compatibility flags */ +#define MAP_ANON MAP_ANONYMOUS +#define MAP_FILE 0 + #endif /* __ARM_MMAN_H__ */ diff --git a/trunk/include/asm-arm/smp.h b/trunk/include/asm-arm/smp.h index fe45f7f61223..5a72e50ca9fc 100644 --- a/trunk/include/asm-arm/smp.h +++ b/trunk/include/asm-arm/smp.h @@ -41,11 +41,6 @@ extern void show_ipi_list(struct seq_file *p); */ asmlinkage void do_IPI(struct pt_regs *regs); -/* - * Setup the SMP cpu_possible_map - */ -extern void smp_init_cpus(void); - /* * Move global data into per-processor storage. */ diff --git a/trunk/include/asm-arm/unistd.h b/trunk/include/asm-arm/unistd.h index 8f331bbd39a8..77430d6178ae 100644 --- a/trunk/include/asm-arm/unistd.h +++ b/trunk/include/asm-arm/unistd.h @@ -309,7 +309,7 @@ #define __NR_mq_getsetattr (__NR_SYSCALL_BASE+279) #define __NR_waitid (__NR_SYSCALL_BASE+280) -#if defined(__ARM_EABI__) /* reserve these for un-muxing socketcall */ +#if 0 /* reserve these for un-muxing socketcall */ #define __NR_socket (__NR_SYSCALL_BASE+281) #define __NR_bind (__NR_SYSCALL_BASE+282) #define __NR_connect (__NR_SYSCALL_BASE+283) @@ -329,7 +329,7 @@ #define __NR_recvmsg (__NR_SYSCALL_BASE+297) #endif -#if defined(__ARM_EABI__) /* reserve these for un-muxing ipc */ +#if 0 /* reserve these for un-muxing ipc */ #define __NR_semop (__NR_SYSCALL_BASE+298) #define __NR_semget (__NR_SYSCALL_BASE+299) #define __NR_semctl (__NR_SYSCALL_BASE+300) @@ -347,7 +347,7 @@ #define __NR_request_key (__NR_SYSCALL_BASE+310) #define __NR_keyctl (__NR_SYSCALL_BASE+311) -#if defined(__ARM_EABI__) /* reserved for un-muxing ipc */ +#if 0 /* reserved for un-muxing ipc */ #define __NR_semtimedop (__NR_SYSCALL_BASE+312) #endif diff --git a/trunk/include/asm-arm26/mman.h b/trunk/include/asm-arm26/mman.h index 4000a6c1b76b..2096c50df888 100644 --- a/trunk/include/asm-arm26/mman.h +++ b/trunk/include/asm-arm26/mman.h @@ -1,7 +1,19 @@ #ifndef __ARM_MMAN_H__ #define __ARM_MMAN_H__ -#include +#define PROT_READ 0x1 /* page can be read */ +#define PROT_WRITE 0x2 /* page can be written */ +#define PROT_EXEC 0x4 /* page can be executed */ +#define PROT_SEM 0x8 /* page may be used for atomic ops */ +#define PROT_NONE 0x0 /* page can not be accessed */ +#define PROT_GROWSDOWN 0x01000000 /* mprotect flag: extend change to start of growsdown vma */ +#define PROT_GROWSUP 0x02000000 /* mprotect flag: extend change to end of growsup vma */ + +#define MAP_SHARED 0x01 /* Share changes */ +#define MAP_PRIVATE 0x02 /* Changes are private */ +#define MAP_TYPE 0x0f /* Mask for type of mapping */ +#define MAP_FIXED 0x10 /* Interpret addr exactly */ +#define MAP_ANONYMOUS 0x20 /* don't use a file */ #define MAP_GROWSDOWN 0x0100 /* stack-like segment */ #define MAP_DENYWRITE 0x0800 /* ETXTBSY */ @@ -11,7 +23,24 @@ #define MAP_POPULATE 0x8000 /* populate (prefault) page tables */ #define MAP_NONBLOCK 0x10000 /* do not block on IO */ +#define MS_ASYNC 1 /* sync memory asynchronously */ +#define MS_INVALIDATE 2 /* invalidate the caches */ +#define MS_SYNC 4 /* synchronous memory sync */ + #define MCL_CURRENT 1 /* lock all current mappings */ #define MCL_FUTURE 2 /* lock all future mappings */ +#define MADV_NORMAL 0x0 /* default page-in behavior */ +#define MADV_RANDOM 0x1 /* page-in minimum required */ +#define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ +#define MADV_WILLNEED 0x3 /* pre-fault pages */ +#define MADV_DONTNEED 0x4 /* discard these pages */ +#define MADV_REMOVE 0x5 /* remove these pages & resources */ +#define MADV_DONTFORK 0x30 /* dont inherit across fork */ +#define MADV_DOFORK 0x31 /* do inherit across fork */ + +/* compatibility flags */ +#define MAP_ANON MAP_ANONYMOUS +#define MAP_FILE 0 + #endif /* __ARM_MMAN_H__ */ diff --git a/trunk/include/asm-cris/mman.h b/trunk/include/asm-cris/mman.h index 1c35e1b66b46..deddfb239ff5 100644 --- a/trunk/include/asm-cris/mman.h +++ b/trunk/include/asm-cris/mman.h @@ -3,7 +3,19 @@ /* verbatim copy of asm-i386/ version */ -#include +#define PROT_READ 0x1 /* page can be read */ +#define PROT_WRITE 0x2 /* page can be written */ +#define PROT_EXEC 0x4 /* page can be executed */ +#define PROT_SEM 0x8 /* page may be used for atomic ops */ +#define PROT_NONE 0x0 /* page can not be accessed */ +#define PROT_GROWSDOWN 0x01000000 /* mprotect flag: extend change to start of growsdown vma */ +#define PROT_GROWSUP 0x02000000 /* mprotect flag: extend change to end of growsup vma */ + +#define MAP_SHARED 0x01 /* Share changes */ +#define MAP_PRIVATE 0x02 /* Changes are private */ +#define MAP_TYPE 0x0f /* Mask for type of mapping */ +#define MAP_FIXED 0x10 /* Interpret addr exactly */ +#define MAP_ANONYMOUS 0x20 /* don't use a file */ #define MAP_GROWSDOWN 0x0100 /* stack-like segment */ #define MAP_DENYWRITE 0x0800 /* ETXTBSY */ @@ -13,7 +25,24 @@ #define MAP_POPULATE 0x8000 /* populate (prefault) pagetables */ #define MAP_NONBLOCK 0x10000 /* do not block on IO */ +#define MS_ASYNC 1 /* sync memory asynchronously */ +#define MS_INVALIDATE 2 /* invalidate the caches */ +#define MS_SYNC 4 /* synchronous memory sync */ + #define MCL_CURRENT 1 /* lock all current mappings */ #define MCL_FUTURE 2 /* lock all future mappings */ +#define MADV_NORMAL 0x0 /* default page-in behavior */ +#define MADV_RANDOM 0x1 /* page-in minimum required */ +#define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ +#define MADV_WILLNEED 0x3 /* pre-fault pages */ +#define MADV_DONTNEED 0x4 /* discard these pages */ +#define MADV_REMOVE 0x5 /* remove these pages & resources */ +#define MADV_DONTFORK 0x30 /* dont inherit across fork */ +#define MADV_DOFORK 0x31 /* do inherit across fork */ + +/* compatibility flags */ +#define MAP_ANON MAP_ANONYMOUS +#define MAP_FILE 0 + #endif /* __CRIS_MMAN_H__ */ diff --git a/trunk/include/asm-frv/mman.h b/trunk/include/asm-frv/mman.h index b4371e928683..d3bca306da82 100644 --- a/trunk/include/asm-frv/mman.h +++ b/trunk/include/asm-frv/mman.h @@ -1,7 +1,19 @@ #ifndef __ASM_MMAN_H__ #define __ASM_MMAN_H__ -#include +#define PROT_READ 0x1 /* page can be read */ +#define PROT_WRITE 0x2 /* page can be written */ +#define PROT_EXEC 0x4 /* page can be executed */ +#define PROT_SEM 0x8 /* page may be used for atomic ops */ +#define PROT_NONE 0x0 /* page can not be accessed */ +#define PROT_GROWSDOWN 0x01000000 /* mprotect flag: extend change to start of growsdown vma */ +#define PROT_GROWSUP 0x02000000 /* mprotect flag: extend change to end of growsup vma */ + +#define MAP_SHARED 0x01 /* Share changes */ +#define MAP_PRIVATE 0x02 /* Changes are private */ +#define MAP_TYPE 0x0f /* Mask for type of mapping */ +#define MAP_FIXED 0x10 /* Interpret addr exactly */ +#define MAP_ANONYMOUS 0x20 /* don't use a file */ #define MAP_GROWSDOWN 0x0100 /* stack-like segment */ #define MAP_DENYWRITE 0x0800 /* ETXTBSY */ @@ -11,8 +23,25 @@ #define MAP_POPULATE 0x8000 /* populate (prefault) pagetables */ #define MAP_NONBLOCK 0x10000 /* do not block on IO */ +#define MS_ASYNC 1 /* sync memory asynchronously */ +#define MS_INVALIDATE 2 /* invalidate the caches */ +#define MS_SYNC 4 /* synchronous memory sync */ + #define MCL_CURRENT 1 /* lock all current mappings */ #define MCL_FUTURE 2 /* lock all future mappings */ +#define MADV_NORMAL 0x0 /* default page-in behavior */ +#define MADV_RANDOM 0x1 /* page-in minimum required */ +#define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ +#define MADV_WILLNEED 0x3 /* pre-fault pages */ +#define MADV_DONTNEED 0x4 /* discard these pages */ +#define MADV_REMOVE 0x5 /* remove these pages & resources */ +#define MADV_DONTFORK 0x30 /* dont inherit across fork */ +#define MADV_DOFORK 0x31 /* do inherit across fork */ + +/* compatibility flags */ +#define MAP_ANON MAP_ANONYMOUS +#define MAP_FILE 0 + #endif /* __ASM_MMAN_H__ */ diff --git a/trunk/include/asm-generic/mman.h b/trunk/include/asm-generic/mman.h deleted file mode 100644 index 3b41d2bb70da..000000000000 --- a/trunk/include/asm-generic/mman.h +++ /dev/null @@ -1,42 +0,0 @@ -#ifndef _ASM_GENERIC_MMAN_H -#define _ASM_GENERIC_MMAN_H - -/* - Author: Michael S. Tsirkin , Mellanox Technologies Ltd. - Based on: asm-xxx/mman.h -*/ - -#define PROT_READ 0x1 /* page can be read */ -#define PROT_WRITE 0x2 /* page can be written */ -#define PROT_EXEC 0x4 /* page can be executed */ -#define PROT_SEM 0x8 /* page may be used for atomic ops */ -#define PROT_NONE 0x0 /* page can not be accessed */ -#define PROT_GROWSDOWN 0x01000000 /* mprotect flag: extend change to start of growsdown vma */ -#define PROT_GROWSUP 0x02000000 /* mprotect flag: extend change to end of growsup vma */ - -#define MAP_SHARED 0x01 /* Share changes */ -#define MAP_PRIVATE 0x02 /* Changes are private */ -#define MAP_TYPE 0x0f /* Mask for type of mapping */ -#define MAP_FIXED 0x10 /* Interpret addr exactly */ -#define MAP_ANONYMOUS 0x20 /* don't use a file */ - -#define MS_ASYNC 1 /* sync memory asynchronously */ -#define MS_INVALIDATE 2 /* invalidate the caches */ -#define MS_SYNC 4 /* synchronous memory sync */ - -#define MADV_NORMAL 0 /* no further special treatment */ -#define MADV_RANDOM 1 /* expect random page references */ -#define MADV_SEQUENTIAL 2 /* expect sequential page references */ -#define MADV_WILLNEED 3 /* will need these pages */ -#define MADV_DONTNEED 4 /* don't need these pages */ - -/* common parameters: try to keep these consistent across architectures */ -#define MADV_REMOVE 9 /* remove these pages & resources */ -#define MADV_DONTFORK 10 /* don't inherit across fork */ -#define MADV_DOFORK 11 /* do inherit across fork */ - -/* compatibility flags */ -#define MAP_ANON MAP_ANONYMOUS -#define MAP_FILE 0 - -#endif diff --git a/trunk/include/asm-h8300/mman.h b/trunk/include/asm-h8300/mman.h index b9f104f22a36..ac0346f7d11d 100644 --- a/trunk/include/asm-h8300/mman.h +++ b/trunk/include/asm-h8300/mman.h @@ -1,7 +1,19 @@ #ifndef __H8300_MMAN_H__ #define __H8300_MMAN_H__ -#include +#define PROT_READ 0x1 /* page can be read */ +#define PROT_WRITE 0x2 /* page can be written */ +#define PROT_EXEC 0x4 /* page can be executed */ +#define PROT_SEM 0x8 /* page may be used for atomic ops */ +#define PROT_NONE 0x0 /* page can not be accessed */ +#define PROT_GROWSDOWN 0x01000000 /* mprotect flag: extend change to start of growsdown vma */ +#define PROT_GROWSUP 0x02000000 /* mprotect flag: extend change to end of growsup vma */ + +#define MAP_SHARED 0x01 /* Share changes */ +#define MAP_PRIVATE 0x02 /* Changes are private */ +#define MAP_TYPE 0x0f /* Mask for type of mapping */ +#define MAP_FIXED 0x10 /* Interpret addr exactly */ +#define MAP_ANONYMOUS 0x20 /* don't use a file */ #define MAP_GROWSDOWN 0x0100 /* stack-like segment */ #define MAP_DENYWRITE 0x0800 /* ETXTBSY */ @@ -11,7 +23,24 @@ #define MAP_POPULATE 0x8000 /* populate (prefault) pagetables */ #define MAP_NONBLOCK 0x10000 /* do not block on IO */ +#define MS_ASYNC 1 /* sync memory asynchronously */ +#define MS_INVALIDATE 2 /* invalidate the caches */ +#define MS_SYNC 4 /* synchronous memory sync */ + #define MCL_CURRENT 1 /* lock all current mappings */ #define MCL_FUTURE 2 /* lock all future mappings */ +#define MADV_NORMAL 0x0 /* default page-in behavior */ +#define MADV_RANDOM 0x1 /* page-in minimum required */ +#define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ +#define MADV_WILLNEED 0x3 /* pre-fault pages */ +#define MADV_DONTNEED 0x4 /* discard these pages */ +#define MADV_REMOVE 0x5 /* remove these pages & resources */ +#define MADV_DONTFORK 0x30 /* dont inherit across fork */ +#define MADV_DOFORK 0x31 /* do inherit across fork */ + +/* compatibility flags */ +#define MAP_ANON MAP_ANONYMOUS +#define MAP_FILE 0 + #endif /* __H8300_MMAN_H__ */ diff --git a/trunk/include/asm-i386/mman.h b/trunk/include/asm-i386/mman.h index 8fd9d7ab7faf..ab2339a1d807 100644 --- a/trunk/include/asm-i386/mman.h +++ b/trunk/include/asm-i386/mman.h @@ -1,7 +1,19 @@ #ifndef __I386_MMAN_H__ #define __I386_MMAN_H__ -#include +#define PROT_READ 0x1 /* page can be read */ +#define PROT_WRITE 0x2 /* page can be written */ +#define PROT_EXEC 0x4 /* page can be executed */ +#define PROT_SEM 0x8 /* page may be used for atomic ops */ +#define PROT_NONE 0x0 /* page can not be accessed */ +#define PROT_GROWSDOWN 0x01000000 /* mprotect flag: extend change to start of growsdown vma */ +#define PROT_GROWSUP 0x02000000 /* mprotect flag: extend change to end of growsup vma */ + +#define MAP_SHARED 0x01 /* Share changes */ +#define MAP_PRIVATE 0x02 /* Changes are private */ +#define MAP_TYPE 0x0f /* Mask for type of mapping */ +#define MAP_FIXED 0x10 /* Interpret addr exactly */ +#define MAP_ANONYMOUS 0x20 /* don't use a file */ #define MAP_GROWSDOWN 0x0100 /* stack-like segment */ #define MAP_DENYWRITE 0x0800 /* ETXTBSY */ @@ -11,7 +23,24 @@ #define MAP_POPULATE 0x8000 /* populate (prefault) pagetables */ #define MAP_NONBLOCK 0x10000 /* do not block on IO */ +#define MS_ASYNC 1 /* sync memory asynchronously */ +#define MS_INVALIDATE 2 /* invalidate the caches */ +#define MS_SYNC 4 /* synchronous memory sync */ + #define MCL_CURRENT 1 /* lock all current mappings */ #define MCL_FUTURE 2 /* lock all future mappings */ +#define MADV_NORMAL 0x0 /* default page-in behavior */ +#define MADV_RANDOM 0x1 /* page-in minimum required */ +#define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ +#define MADV_WILLNEED 0x3 /* pre-fault pages */ +#define MADV_DONTNEED 0x4 /* discard these pages */ +#define MADV_REMOVE 0x5 /* remove these pages & resources */ +#define MADV_DONTFORK 0x30 /* dont inherit across fork */ +#define MADV_DOFORK 0x31 /* do inherit across fork */ + +/* compatibility flags */ +#define MAP_ANON MAP_ANONYMOUS +#define MAP_FILE 0 + #endif /* __I386_MMAN_H__ */ diff --git a/trunk/include/asm-ia64/mman.h b/trunk/include/asm-ia64/mman.h index 6ba179f12718..357ebb780cc0 100644 --- a/trunk/include/asm-ia64/mman.h +++ b/trunk/include/asm-ia64/mman.h @@ -8,7 +8,19 @@ * David Mosberger-Tang , Hewlett-Packard Co */ -#include +#define PROT_READ 0x1 /* page can be read */ +#define PROT_WRITE 0x2 /* page can be written */ +#define PROT_EXEC 0x4 /* page can be executed */ +#define PROT_SEM 0x8 /* page may be used for atomic ops */ +#define PROT_NONE 0x0 /* page can not be accessed */ +#define PROT_GROWSDOWN 0x01000000 /* mprotect flag: extend change to start of growsdown vma */ +#define PROT_GROWSUP 0x02000000 /* mprotect flag: extend change to end of growsup vma */ + +#define MAP_SHARED 0x01 /* Share changes */ +#define MAP_PRIVATE 0x02 /* Changes are private */ +#define MAP_TYPE 0x0f /* Mask for type of mapping */ +#define MAP_FIXED 0x10 /* Interpret addr exactly */ +#define MAP_ANONYMOUS 0x20 /* don't use a file */ #define MAP_GROWSDOWN 0x00100 /* stack-like segment */ #define MAP_GROWSUP 0x00200 /* register stack-like segment */ @@ -19,7 +31,24 @@ #define MAP_POPULATE 0x08000 /* populate (prefault) pagetables */ #define MAP_NONBLOCK 0x10000 /* do not block on IO */ +#define MS_ASYNC 1 /* sync memory asynchronously */ +#define MS_INVALIDATE 2 /* invalidate the caches */ +#define MS_SYNC 4 /* synchronous memory sync */ + #define MCL_CURRENT 1 /* lock all current mappings */ #define MCL_FUTURE 2 /* lock all future mappings */ +#define MADV_NORMAL 0x0 /* default page-in behavior */ +#define MADV_RANDOM 0x1 /* page-in minimum required */ +#define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ +#define MADV_WILLNEED 0x3 /* pre-fault pages */ +#define MADV_DONTNEED 0x4 /* discard these pages */ +#define MADV_REMOVE 0x5 /* remove these pages & resources */ +#define MADV_DONTFORK 0x30 /* dont inherit across fork */ +#define MADV_DOFORK 0x31 /* do inherit across fork */ + +/* compatibility flags */ +#define MAP_ANON MAP_ANONYMOUS +#define MAP_FILE 0 + #endif /* _ASM_IA64_MMAN_H */ diff --git a/trunk/include/asm-m32r/mman.h b/trunk/include/asm-m32r/mman.h index 695a860c024f..6b02fe3fcff2 100644 --- a/trunk/include/asm-m32r/mman.h +++ b/trunk/include/asm-m32r/mman.h @@ -1,10 +1,22 @@ #ifndef __M32R_MMAN_H__ #define __M32R_MMAN_H__ -#include - /* orig : i386 2.6.0-test6 */ +#define PROT_READ 0x1 /* page can be read */ +#define PROT_WRITE 0x2 /* page can be written */ +#define PROT_EXEC 0x4 /* page can be executed */ +#define PROT_SEM 0x8 /* page may be used for atomic ops */ +#define PROT_NONE 0x0 /* page can not be accessed */ +#define PROT_GROWSDOWN 0x01000000 /* mprotect flag: extend change to start of growsdown vma */ +#define PROT_GROWSUP 0x02000000 /* mprotect flag: extend change to end of growsup vma */ + +#define MAP_SHARED 0x01 /* Share changes */ +#define MAP_PRIVATE 0x02 /* Changes are private */ +#define MAP_TYPE 0x0f /* Mask for type of mapping */ +#define MAP_FIXED 0x10 /* Interpret addr exactly */ +#define MAP_ANONYMOUS 0x20 /* don't use a file */ + #define MAP_GROWSDOWN 0x0100 /* stack-like segment */ #define MAP_DENYWRITE 0x0800 /* ETXTBSY */ #define MAP_EXECUTABLE 0x1000 /* mark it as an executable */ @@ -13,7 +25,24 @@ #define MAP_POPULATE 0x8000 /* populate (prefault) pagetables */ #define MAP_NONBLOCK 0x10000 /* do not block on IO */ +#define MS_ASYNC 1 /* sync memory asynchronously */ +#define MS_INVALIDATE 2 /* invalidate the caches */ +#define MS_SYNC 4 /* synchronous memory sync */ + #define MCL_CURRENT 1 /* lock all current mappings */ #define MCL_FUTURE 2 /* lock all future mappings */ +#define MADV_NORMAL 0x0 /* default page-in behavior */ +#define MADV_RANDOM 0x1 /* page-in minimum required */ +#define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ +#define MADV_WILLNEED 0x3 /* pre-fault pages */ +#define MADV_DONTNEED 0x4 /* discard these pages */ +#define MADV_REMOVE 0x5 /* remove these pages & resources */ +#define MADV_DONTFORK 0x30 /* dont inherit across fork */ +#define MADV_DOFORK 0x31 /* do inherit across fork */ + +/* compatibility flags */ +#define MAP_ANON MAP_ANONYMOUS +#define MAP_FILE 0 + #endif /* __M32R_MMAN_H__ */ diff --git a/trunk/include/asm-m68k/mman.h b/trunk/include/asm-m68k/mman.h index 1626d37f4898..efd12bc4ccb7 100644 --- a/trunk/include/asm-m68k/mman.h +++ b/trunk/include/asm-m68k/mman.h @@ -1,7 +1,19 @@ #ifndef __M68K_MMAN_H__ #define __M68K_MMAN_H__ -#include +#define PROT_READ 0x1 /* page can be read */ +#define PROT_WRITE 0x2 /* page can be written */ +#define PROT_EXEC 0x4 /* page can be executed */ +#define PROT_SEM 0x8 /* page may be used for atomic ops */ +#define PROT_NONE 0x0 /* page can not be accessed */ +#define PROT_GROWSDOWN 0x01000000 /* mprotect flag: extend change to start of growsdown vma */ +#define PROT_GROWSUP 0x02000000 /* mprotect flag: extend change to end of growsup vma */ + +#define MAP_SHARED 0x01 /* Share changes */ +#define MAP_PRIVATE 0x02 /* Changes are private */ +#define MAP_TYPE 0x0f /* Mask for type of mapping */ +#define MAP_FIXED 0x10 /* Interpret addr exactly */ +#define MAP_ANONYMOUS 0x20 /* don't use a file */ #define MAP_GROWSDOWN 0x0100 /* stack-like segment */ #define MAP_DENYWRITE 0x0800 /* ETXTBSY */ @@ -11,7 +23,24 @@ #define MAP_POPULATE 0x8000 /* populate (prefault) pagetables */ #define MAP_NONBLOCK 0x10000 /* do not block on IO */ +#define MS_ASYNC 1 /* sync memory asynchronously */ +#define MS_INVALIDATE 2 /* invalidate the caches */ +#define MS_SYNC 4 /* synchronous memory sync */ + #define MCL_CURRENT 1 /* lock all current mappings */ #define MCL_FUTURE 2 /* lock all future mappings */ +#define MADV_NORMAL 0x0 /* default page-in behavior */ +#define MADV_RANDOM 0x1 /* page-in minimum required */ +#define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ +#define MADV_WILLNEED 0x3 /* pre-fault pages */ +#define MADV_DONTNEED 0x4 /* discard these pages */ +#define MADV_REMOVE 0x5 /* remove these pages & resources */ +#define MADV_DONTFORK 0x30 /* dont inherit across fork */ +#define MADV_DOFORK 0x31 /* do inherit across fork */ + +/* compatibility flags */ +#define MAP_ANON MAP_ANONYMOUS +#define MAP_FILE 0 + #endif /* __M68K_MMAN_H__ */ diff --git a/trunk/include/asm-mips/mman.h b/trunk/include/asm-mips/mman.h index 046cf686bee7..6d01e26830fa 100644 --- a/trunk/include/asm-mips/mman.h +++ b/trunk/include/asm-mips/mman.h @@ -60,19 +60,17 @@ #define MCL_CURRENT 1 /* lock all current mappings */ #define MCL_FUTURE 2 /* lock all future mappings */ -#define MADV_NORMAL 0 /* no further special treatment */ -#define MADV_RANDOM 1 /* expect random page references */ -#define MADV_SEQUENTIAL 2 /* expect sequential page references */ -#define MADV_WILLNEED 3 /* will need these pages */ -#define MADV_DONTNEED 4 /* don't need these pages */ - -/* common parameters: try to keep these consistent across architectures */ -#define MADV_REMOVE 9 /* remove these pages & resources */ -#define MADV_DONTFORK 10 /* don't inherit across fork */ -#define MADV_DOFORK 11 /* do inherit across fork */ +#define MADV_NORMAL 0x0 /* default page-in behavior */ +#define MADV_RANDOM 0x1 /* page-in minimum required */ +#define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ +#define MADV_WILLNEED 0x3 /* pre-fault pages */ +#define MADV_DONTNEED 0x4 /* discard these pages */ +#define MADV_REMOVE 0x5 /* remove these pages & resources */ +#define MADV_DONTFORK 0x30 /* dont inherit across fork */ +#define MADV_DOFORK 0x31 /* do inherit across fork */ /* compatibility flags */ -#define MAP_ANON MAP_ANONYMOUS -#define MAP_FILE 0 +#define MAP_ANON MAP_ANONYMOUS +#define MAP_FILE 0 #endif /* _ASM_MMAN_H */ diff --git a/trunk/include/asm-parisc/mman.h b/trunk/include/asm-parisc/mman.h index 0ef15ee0f17e..a381cf5c8f55 100644 --- a/trunk/include/asm-parisc/mman.h +++ b/trunk/include/asm-parisc/mman.h @@ -38,11 +38,7 @@ #define MADV_SPACEAVAIL 5 /* insure that resources are reserved */ #define MADV_VPS_PURGE 6 /* Purge pages from VM page cache */ #define MADV_VPS_INHERIT 7 /* Inherit parents page size */ - -/* common/generic parameters */ -#define MADV_REMOVE 9 /* remove these pages & resources */ -#define MADV_DONTFORK 10 /* don't inherit across fork */ -#define MADV_DOFORK 11 /* do inherit across fork */ +#define MADV_REMOVE 8 /* remove these pages & resources */ /* The range 12-64 is reserved for page size specification. */ #define MADV_4K_PAGES 12 /* Use 4K pages */ @@ -53,6 +49,8 @@ #define MADV_4M_PAGES 22 /* Use 4 Megabyte pages */ #define MADV_16M_PAGES 24 /* Use 16 Megabyte pages */ #define MADV_64M_PAGES 26 /* Use 64 Megabyte pages */ +#define MADV_DONTFORK 0x30 /* dont inherit across fork */ +#define MADV_DOFORK 0x31 /* do inherit across fork */ /* compatibility flags */ #define MAP_ANON MAP_ANONYMOUS diff --git a/trunk/include/asm-powerpc/mman.h b/trunk/include/asm-powerpc/mman.h index 24cf664a8295..fcff25d13f13 100644 --- a/trunk/include/asm-powerpc/mman.h +++ b/trunk/include/asm-powerpc/mman.h @@ -1,8 +1,6 @@ #ifndef _ASM_POWERPC_MMAN_H #define _ASM_POWERPC_MMAN_H -#include - /* * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -10,6 +8,19 @@ * 2 of the License, or (at your option) any later version. */ +#define PROT_READ 0x1 /* page can be read */ +#define PROT_WRITE 0x2 /* page can be written */ +#define PROT_EXEC 0x4 /* page can be executed */ +#define PROT_SEM 0x8 /* page may be used for atomic ops */ +#define PROT_NONE 0x0 /* page can not be accessed */ +#define PROT_GROWSDOWN 0x01000000 /* mprotect flag: extend change to start of growsdown vma */ +#define PROT_GROWSUP 0x02000000 /* mprotect flag: extend change to end of growsup vma */ + +#define MAP_SHARED 0x01 /* Share changes */ +#define MAP_PRIVATE 0x02 /* Changes are private */ +#define MAP_TYPE 0x0f /* Mask for type of mapping */ +#define MAP_FIXED 0x10 /* Interpret addr exactly */ +#define MAP_ANONYMOUS 0x20 /* don't use a file */ #define MAP_RENAME MAP_ANONYMOUS /* In SunOS terminology */ #define MAP_NORESERVE 0x40 /* don't reserve swap pages */ #define MAP_LOCKED 0x80 @@ -18,10 +29,27 @@ #define MAP_DENYWRITE 0x0800 /* ETXTBSY */ #define MAP_EXECUTABLE 0x1000 /* mark it as an executable */ +#define MS_ASYNC 1 /* sync memory asynchronously */ +#define MS_INVALIDATE 2 /* invalidate the caches */ +#define MS_SYNC 4 /* synchronous memory sync */ + #define MCL_CURRENT 0x2000 /* lock all currently mapped pages */ #define MCL_FUTURE 0x4000 /* lock all additions to address space */ #define MAP_POPULATE 0x8000 /* populate (prefault) pagetables */ #define MAP_NONBLOCK 0x10000 /* do not block on IO */ +#define MADV_NORMAL 0x0 /* default page-in behavior */ +#define MADV_RANDOM 0x1 /* page-in minimum required */ +#define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ +#define MADV_WILLNEED 0x3 /* pre-fault pages */ +#define MADV_DONTNEED 0x4 /* discard these pages */ +#define MADV_REMOVE 0x5 /* remove these pages & resources */ +#define MADV_DONTFORK 0x30 /* dont inherit across fork */ +#define MADV_DOFORK 0x31 /* do inherit across fork */ + +/* compatibility flags */ +#define MAP_ANON MAP_ANONYMOUS +#define MAP_FILE 0 + #endif /* _ASM_POWERPC_MMAN_H */ diff --git a/trunk/include/asm-s390/mman.h b/trunk/include/asm-s390/mman.h index 7839767d837e..d41ca1477010 100644 --- a/trunk/include/asm-s390/mman.h +++ b/trunk/include/asm-s390/mman.h @@ -9,7 +9,19 @@ #ifndef __S390_MMAN_H__ #define __S390_MMAN_H__ -#include +#define PROT_READ 0x1 /* page can be read */ +#define PROT_WRITE 0x2 /* page can be written */ +#define PROT_EXEC 0x4 /* page can be executed */ +#define PROT_SEM 0x8 /* page may be used for atomic ops */ +#define PROT_NONE 0x0 /* page can not be accessed */ +#define PROT_GROWSDOWN 0x01000000 /* mprotect flag: extend change to start of growsdown vma */ +#define PROT_GROWSUP 0x02000000 /* mprotect flag: extend change to end of growsup vma */ + +#define MAP_SHARED 0x01 /* Share changes */ +#define MAP_PRIVATE 0x02 /* Changes are private */ +#define MAP_TYPE 0x0f /* Mask for type of mapping */ +#define MAP_FIXED 0x10 /* Interpret addr exactly */ +#define MAP_ANONYMOUS 0x20 /* don't use a file */ #define MAP_GROWSDOWN 0x0100 /* stack-like segment */ #define MAP_DENYWRITE 0x0800 /* ETXTBSY */ @@ -19,7 +31,24 @@ #define MAP_POPULATE 0x8000 /* populate (prefault) pagetables */ #define MAP_NONBLOCK 0x10000 /* do not block on IO */ +#define MS_ASYNC 1 /* sync memory asynchronously */ +#define MS_INVALIDATE 2 /* invalidate the caches */ +#define MS_SYNC 4 /* synchronous memory sync */ + #define MCL_CURRENT 1 /* lock all current mappings */ #define MCL_FUTURE 2 /* lock all future mappings */ +#define MADV_NORMAL 0x0 /* default page-in behavior */ +#define MADV_RANDOM 0x1 /* page-in minimum required */ +#define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ +#define MADV_WILLNEED 0x3 /* pre-fault pages */ +#define MADV_DONTNEED 0x4 /* discard these pages */ +#define MADV_REMOVE 0x5 /* remove these pages & resources */ +#define MADV_DONTFORK 0x30 /* dont inherit across fork */ +#define MADV_DOFORK 0x31 /* do inherit across fork */ + +/* compatibility flags */ +#define MAP_ANON MAP_ANONYMOUS +#define MAP_FILE 0 + #endif /* __S390_MMAN_H__ */ diff --git a/trunk/include/asm-sh/mman.h b/trunk/include/asm-sh/mman.h index 156eb0225cf6..0e08d0573abc 100644 --- a/trunk/include/asm-sh/mman.h +++ b/trunk/include/asm-sh/mman.h @@ -1,7 +1,19 @@ #ifndef __ASM_SH_MMAN_H #define __ASM_SH_MMAN_H -#include +#define PROT_READ 0x1 /* page can be read */ +#define PROT_WRITE 0x2 /* page can be written */ +#define PROT_EXEC 0x4 /* page can be executed */ +#define PROT_SEM 0x8 /* page may be used for atomic ops */ +#define PROT_NONE 0x0 /* page can not be accessed */ +#define PROT_GROWSDOWN 0x01000000 /* mprotect flag: extend change to start of growsdown vma */ +#define PROT_GROWSUP 0x02000000 /* mprotect flag: extend change to end of growsup vma */ + +#define MAP_SHARED 0x01 /* Share changes */ +#define MAP_PRIVATE 0x02 /* Changes are private */ +#define MAP_TYPE 0x0f /* Mask for type of mapping */ +#define MAP_FIXED 0x10 /* Interpret addr exactly */ +#define MAP_ANONYMOUS 0x20 /* don't use a file */ #define MAP_GROWSDOWN 0x0100 /* stack-like segment */ #define MAP_DENYWRITE 0x0800 /* ETXTBSY */ @@ -11,7 +23,24 @@ #define MAP_POPULATE 0x8000 /* populate (prefault) page tables */ #define MAP_NONBLOCK 0x10000 /* do not block on IO */ +#define MS_ASYNC 1 /* sync memory asynchronously */ +#define MS_INVALIDATE 2 /* invalidate the caches */ +#define MS_SYNC 4 /* synchronous memory sync */ + #define MCL_CURRENT 1 /* lock all current mappings */ #define MCL_FUTURE 2 /* lock all future mappings */ +#define MADV_NORMAL 0x0 /* default page-in behavior */ +#define MADV_RANDOM 0x1 /* page-in minimum required */ +#define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ +#define MADV_WILLNEED 0x3 /* pre-fault pages */ +#define MADV_DONTNEED 0x4 /* discard these pages */ +#define MADV_REMOVE 0x5 /* remove these pages & resources */ +#define MADV_DONTFORK 0x30 /* dont inherit across fork */ +#define MADV_DOFORK 0x31 /* do inherit across fork */ + +/* compatibility flags */ +#define MAP_ANON MAP_ANONYMOUS +#define MAP_FILE 0 + #endif /* __ASM_SH_MMAN_H */ diff --git a/trunk/include/asm-sparc/mman.h b/trunk/include/asm-sparc/mman.h index 88d1886abf3b..4a298b2be859 100644 --- a/trunk/include/asm-sparc/mman.h +++ b/trunk/include/asm-sparc/mman.h @@ -2,10 +2,21 @@ #ifndef __SPARC_MMAN_H__ #define __SPARC_MMAN_H__ -#include - /* SunOS'ified... */ +#define PROT_READ 0x1 /* page can be read */ +#define PROT_WRITE 0x2 /* page can be written */ +#define PROT_EXEC 0x4 /* page can be executed */ +#define PROT_SEM 0x8 /* page may be used for atomic ops */ +#define PROT_NONE 0x0 /* page can not be accessed */ +#define PROT_GROWSDOWN 0x01000000 /* mprotect flag: extend change to start of growsdown vma */ +#define PROT_GROWSUP 0x02000000 /* mprotect flag: extend change to end of growsup vma */ + +#define MAP_SHARED 0x01 /* Share changes */ +#define MAP_PRIVATE 0x02 /* Changes are private */ +#define MAP_TYPE 0x0f /* Mask for type of mapping */ +#define MAP_FIXED 0x10 /* Interpret addr exactly */ +#define MAP_ANONYMOUS 0x20 /* don't use a file */ #define MAP_RENAME MAP_ANONYMOUS /* In SunOS terminology */ #define MAP_NORESERVE 0x40 /* don't reserve swap pages */ #define MAP_INHERIT 0x80 /* SunOS doesn't do this, but... */ @@ -16,6 +27,10 @@ #define MAP_DENYWRITE 0x0800 /* ETXTBSY */ #define MAP_EXECUTABLE 0x1000 /* mark it as an executable */ +#define MS_ASYNC 1 /* sync memory asynchronously */ +#define MS_INVALIDATE 2 /* invalidate the caches */ +#define MS_SYNC 4 /* synchronous memory sync */ + #define MCL_CURRENT 0x2000 /* lock all currently mapped pages */ #define MCL_FUTURE 0x4000 /* lock all additions to address space */ @@ -33,6 +48,18 @@ #define MC_LOCKAS 5 /* Lock an entire address space of the calling process */ #define MC_UNLOCKAS 6 /* Unlock entire address space of calling process */ +#define MADV_NORMAL 0x0 /* default page-in behavior */ +#define MADV_RANDOM 0x1 /* page-in minimum required */ +#define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ +#define MADV_WILLNEED 0x3 /* pre-fault pages */ +#define MADV_DONTNEED 0x4 /* discard these pages */ #define MADV_FREE 0x5 /* (Solaris) contents can be freed */ +#define MADV_REMOVE 0x6 /* remove these pages & resources */ +#define MADV_DONTFORK 0x30 /* dont inherit across fork */ +#define MADV_DOFORK 0x31 /* do inherit across fork */ + +/* compatibility flags */ +#define MAP_ANON MAP_ANONYMOUS +#define MAP_FILE 0 #endif /* __SPARC_MMAN_H__ */ diff --git a/trunk/include/asm-sparc64/mman.h b/trunk/include/asm-sparc64/mman.h index 6fd878e61435..d705ec92da8b 100644 --- a/trunk/include/asm-sparc64/mman.h +++ b/trunk/include/asm-sparc64/mman.h @@ -2,10 +2,21 @@ #ifndef __SPARC64_MMAN_H__ #define __SPARC64_MMAN_H__ -#include - /* SunOS'ified... */ +#define PROT_READ 0x1 /* page can be read */ +#define PROT_WRITE 0x2 /* page can be written */ +#define PROT_EXEC 0x4 /* page can be executed */ +#define PROT_SEM 0x8 /* page may be used for atomic ops */ +#define PROT_NONE 0x0 /* page can not be accessed */ +#define PROT_GROWSDOWN 0x01000000 /* mprotect flag: extend change to start of growsdown vma */ +#define PROT_GROWSUP 0x02000000 /* mprotect flag: extend change to end of growsup vma */ + +#define MAP_SHARED 0x01 /* Share changes */ +#define MAP_PRIVATE 0x02 /* Changes are private */ +#define MAP_TYPE 0x0f /* Mask for type of mapping */ +#define MAP_FIXED 0x10 /* Interpret addr exactly */ +#define MAP_ANONYMOUS 0x20 /* don't use a file */ #define MAP_RENAME MAP_ANONYMOUS /* In SunOS terminology */ #define MAP_NORESERVE 0x40 /* don't reserve swap pages */ #define MAP_INHERIT 0x80 /* SunOS doesn't do this, but... */ @@ -16,6 +27,10 @@ #define MAP_DENYWRITE 0x0800 /* ETXTBSY */ #define MAP_EXECUTABLE 0x1000 /* mark it as an executable */ +#define MS_ASYNC 1 /* sync memory asynchronously */ +#define MS_INVALIDATE 2 /* invalidate the caches */ +#define MS_SYNC 4 /* synchronous memory sync */ + #define MCL_CURRENT 0x2000 /* lock all currently mapped pages */ #define MCL_FUTURE 0x4000 /* lock all additions to address space */ @@ -33,6 +48,18 @@ #define MC_LOCKAS 5 /* Lock an entire address space of the calling process */ #define MC_UNLOCKAS 6 /* Unlock entire address space of calling process */ +#define MADV_NORMAL 0x0 /* default page-in behavior */ +#define MADV_RANDOM 0x1 /* page-in minimum required */ +#define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ +#define MADV_WILLNEED 0x3 /* pre-fault pages */ +#define MADV_DONTNEED 0x4 /* discard these pages */ #define MADV_FREE 0x5 /* (Solaris) contents can be freed */ +#define MADV_REMOVE 0x6 /* remove these pages & resources */ +#define MADV_DONTFORK 0x30 /* dont inherit across fork */ +#define MADV_DOFORK 0x31 /* do inherit across fork */ + +/* compatibility flags */ +#define MAP_ANON MAP_ANONYMOUS +#define MAP_FILE 0 #endif /* __SPARC64_MMAN_H__ */ diff --git a/trunk/include/asm-v850/mman.h b/trunk/include/asm-v850/mman.h index edbf6edbfb37..7b851c310e41 100644 --- a/trunk/include/asm-v850/mman.h +++ b/trunk/include/asm-v850/mman.h @@ -1,7 +1,18 @@ #ifndef __V850_MMAN_H__ #define __V850_MMAN_H__ -#include +#define PROT_READ 0x1 /* page can be read */ +#define PROT_WRITE 0x2 /* page can be written */ +#define PROT_EXEC 0x4 /* page can be executed */ +#define PROT_NONE 0x0 /* page can not be accessed */ +#define PROT_GROWSDOWN 0x01000000 /* mprotect flag: extend change to start of growsdown vma */ +#define PROT_GROWSUP 0x02000000 /* mprotect flag: extend change to end of growsup vma */ + +#define MAP_SHARED 0x01 /* Share changes */ +#define MAP_PRIVATE 0x02 /* Changes are private */ +#define MAP_TYPE 0x0f /* Mask for type of mapping */ +#define MAP_FIXED 0x10 /* Interpret addr exactly */ +#define MAP_ANONYMOUS 0x20 /* don't use a file */ #define MAP_GROWSDOWN 0x0100 /* stack-like segment */ #define MAP_DENYWRITE 0x0800 /* ETXTBSY */ @@ -9,7 +20,24 @@ #define MAP_LOCKED 0x2000 /* pages are locked */ #define MAP_NORESERVE 0x4000 /* don't check for reservations */ +#define MS_ASYNC 1 /* sync memory asynchronously */ +#define MS_INVALIDATE 2 /* invalidate the caches */ +#define MS_SYNC 4 /* synchronous memory sync */ + #define MCL_CURRENT 1 /* lock all current mappings */ #define MCL_FUTURE 2 /* lock all future mappings */ +#define MADV_NORMAL 0x0 /* default page-in behavior */ +#define MADV_RANDOM 0x1 /* page-in minimum required */ +#define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ +#define MADV_WILLNEED 0x3 /* pre-fault pages */ +#define MADV_DONTNEED 0x4 /* discard these pages */ +#define MADV_REMOVE 0x5 /* remove these pages & resources */ +#define MADV_DONTFORK 0x30 /* dont inherit across fork */ +#define MADV_DOFORK 0x31 /* do inherit across fork */ + +/* compatibility flags */ +#define MAP_ANON MAP_ANONYMOUS +#define MAP_FILE 0 + #endif /* __V850_MMAN_H__ */ diff --git a/trunk/include/asm-x86_64/mman.h b/trunk/include/asm-x86_64/mman.h index dd5cb0534d37..b699a38c1c3c 100644 --- a/trunk/include/asm-x86_64/mman.h +++ b/trunk/include/asm-x86_64/mman.h @@ -1,8 +1,19 @@ #ifndef __X8664_MMAN_H__ #define __X8664_MMAN_H__ -#include +#define PROT_READ 0x1 /* page can be read */ +#define PROT_WRITE 0x2 /* page can be written */ +#define PROT_EXEC 0x4 /* page can be executed */ +#define PROT_NONE 0x0 /* page can not be accessed */ +#define PROT_SEM 0x8 +#define PROT_GROWSDOWN 0x01000000 /* mprotect flag: extend change to start of growsdown vma */ +#define PROT_GROWSUP 0x02000000 /* mprotect flag: extend change to end of growsup vma */ +#define MAP_SHARED 0x01 /* Share changes */ +#define MAP_PRIVATE 0x02 /* Changes are private */ +#define MAP_TYPE 0x0f /* Mask for type of mapping */ +#define MAP_FIXED 0x10 /* Interpret addr exactly */ +#define MAP_ANONYMOUS 0x20 /* don't use a file */ #define MAP_32BIT 0x40 /* only give out 32bit addresses */ #define MAP_GROWSDOWN 0x0100 /* stack-like segment */ @@ -13,7 +24,24 @@ #define MAP_POPULATE 0x8000 /* populate (prefault) pagetables */ #define MAP_NONBLOCK 0x10000 /* do not block on IO */ +#define MS_ASYNC 1 /* sync memory asynchronously */ +#define MS_INVALIDATE 2 /* invalidate the caches */ +#define MS_SYNC 4 /* synchronous memory sync */ + #define MCL_CURRENT 1 /* lock all current mappings */ #define MCL_FUTURE 2 /* lock all future mappings */ +#define MADV_NORMAL 0x0 /* default page-in behavior */ +#define MADV_RANDOM 0x1 /* page-in minimum required */ +#define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ +#define MADV_WILLNEED 0x3 /* pre-fault pages */ +#define MADV_DONTNEED 0x4 /* discard these pages */ +#define MADV_REMOVE 0x5 /* remove these pages & resources */ +#define MADV_DONTFORK 0x30 /* dont inherit across fork */ +#define MADV_DOFORK 0x31 /* do inherit across fork */ + +/* compatibility flags */ +#define MAP_ANON MAP_ANONYMOUS +#define MAP_FILE 0 + #endif diff --git a/trunk/include/asm-x86_64/proto.h b/trunk/include/asm-x86_64/proto.h index eca3f2d633db..c99832e7bf3f 100644 --- a/trunk/include/asm-x86_64/proto.h +++ b/trunk/include/asm-x86_64/proto.h @@ -133,7 +133,6 @@ extern int fix_aperture; extern int force_iommu; extern int reboot_force; -extern int notsc_setup(char *); extern void smp_local_timer_interrupt(struct pt_regs * regs); diff --git a/trunk/include/asm-xtensa/mman.h b/trunk/include/asm-xtensa/mman.h index ba394cbb4807..e2d7afb679c8 100644 --- a/trunk/include/asm-xtensa/mman.h +++ b/trunk/include/asm-xtensa/mman.h @@ -67,19 +67,17 @@ #define MCL_CURRENT 1 /* lock all current mappings */ #define MCL_FUTURE 2 /* lock all future mappings */ -#define MADV_NORMAL 0 /* no further special treatment */ -#define MADV_RANDOM 1 /* expect random page references */ -#define MADV_SEQUENTIAL 2 /* expect sequential page references */ -#define MADV_WILLNEED 3 /* will need these pages */ -#define MADV_DONTNEED 4 /* don't need these pages */ - -/* common parameters: try to keep these consistent across architectures */ -#define MADV_REMOVE 9 /* remove these pages & resources */ -#define MADV_DONTFORK 10 /* don't inherit across fork */ -#define MADV_DOFORK 11 /* do inherit across fork */ +#define MADV_NORMAL 0x0 /* default page-in behavior */ +#define MADV_RANDOM 0x1 /* page-in minimum required */ +#define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ +#define MADV_WILLNEED 0x3 /* pre-fault pages */ +#define MADV_DONTNEED 0x4 /* discard these pages */ +#define MADV_REMOVE 0x5 /* remove these pages & resources */ +#define MADV_DONTFORK 0x30 /* dont inherit across fork */ +#define MADV_DOFORK 0x31 /* do inherit across fork */ /* compatibility flags */ -#define MAP_ANON MAP_ANONYMOUS -#define MAP_FILE 0 +#define MAP_ANON MAP_ANONYMOUS +#define MAP_FILE 0 #endif /* _XTENSA_MMAN_H */ diff --git a/trunk/include/linux/kernel.h b/trunk/include/linux/kernel.h index 3b507bf05d09..b49affa0ac5a 100644 --- a/trunk/include/linux/kernel.h +++ b/trunk/include/linux/kernel.h @@ -326,6 +326,12 @@ struct sysinfo { /* Force a compilation error if condition is true */ #define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)])) +#ifdef CONFIG_SYSCTL +extern int randomize_va_space; +#else +#define randomize_va_space 1 +#endif + /* Trap pasters of __FUNCTION__ at compile-time */ #define __FUNCTION__ (__func__) diff --git a/trunk/include/linux/ktime.h b/trunk/include/linux/ktime.h index f3dec45ef874..6aca67a569a2 100644 --- a/trunk/include/linux/ktime.h +++ b/trunk/include/linux/ktime.h @@ -96,16 +96,10 @@ static inline ktime_t ktime_set(const long secs, const unsigned long nsecs) ({ (ktime_t){ .tv64 = (kt).tv64 + (nsval) }; }) /* convert a timespec to ktime_t format: */ -static inline ktime_t timespec_to_ktime(struct timespec ts) -{ - return ktime_set(ts.tv_sec, ts.tv_nsec); -} +#define timespec_to_ktime(ts) ktime_set((ts).tv_sec, (ts).tv_nsec) /* convert a timeval to ktime_t format: */ -static inline ktime_t timeval_to_ktime(struct timeval tv) -{ - return ktime_set(tv.tv_sec, tv.tv_usec * NSEC_PER_USEC); -} +#define timeval_to_ktime(tv) ktime_set((tv).tv_sec, (tv).tv_usec * 1000) /* Map the ktime_t to timespec conversion to ns_to_timespec function */ #define ktime_to_timespec(kt) ns_to_timespec((kt).tv64) diff --git a/trunk/include/linux/mm.h b/trunk/include/linux/mm.h index 26e1663a5cbe..75e9f0724997 100644 --- a/trunk/include/linux/mm.h +++ b/trunk/include/linux/mm.h @@ -1051,7 +1051,5 @@ int shrink_slab(unsigned long scanned, gfp_t gfp_mask, void drop_pagecache(void); void drop_slab(void); -extern int randomize_va_space; - #endif /* __KERNEL__ */ #endif /* _LINUX_MM_H */ diff --git a/trunk/include/linux/netfilter.h b/trunk/include/linux/netfilter.h index 468896939843..4cf6088625c1 100644 --- a/trunk/include/linux/netfilter.h +++ b/trunk/include/linux/netfilter.h @@ -184,11 +184,8 @@ static inline int nf_hook_thresh(int pf, unsigned int hook, struct sk_buff **pskb, struct net_device *indev, struct net_device *outdev, - int (*okfn)(struct sk_buff *), int thresh, - int cond) + int (*okfn)(struct sk_buff *), int thresh) { - if (!cond) - return 1; #ifndef CONFIG_NETFILTER_DEBUG if (list_empty(&nf_hooks[pf][hook])) return 1; @@ -200,7 +197,7 @@ static inline int nf_hook(int pf, unsigned int hook, struct sk_buff **pskb, struct net_device *indev, struct net_device *outdev, int (*okfn)(struct sk_buff *)) { - return nf_hook_thresh(pf, hook, pskb, indev, outdev, okfn, INT_MIN, 1); + return nf_hook_thresh(pf, hook, pskb, indev, outdev, okfn, INT_MIN); } /* Activate hook; either okfn or kfree_skb called, unless a hook @@ -227,13 +224,7 @@ static inline int nf_hook(int pf, unsigned int hook, struct sk_buff **pskb, #define NF_HOOK_THRESH(pf, hook, skb, indev, outdev, okfn, thresh) \ ({int __ret; \ -if ((__ret=nf_hook_thresh(pf, hook, &(skb), indev, outdev, okfn, thresh, 1)) == 1)\ - __ret = (okfn)(skb); \ -__ret;}) - -#define NF_HOOK_COND(pf, hook, skb, indev, outdev, okfn, cond) \ -({int __ret; \ -if ((__ret=nf_hook_thresh(pf, hook, &(skb), indev, outdev, okfn, INT_MIN, cond)) == 1)\ +if ((__ret=nf_hook_thresh(pf, hook, &(skb), indev, outdev, okfn, thresh)) == 1)\ __ret = (okfn)(skb); \ __ret;}) @@ -304,13 +295,11 @@ extern struct proc_dir_entry *proc_net_netfilter; #else /* !CONFIG_NETFILTER */ #define NF_HOOK(pf, hook, skb, indev, outdev, okfn) (okfn)(skb) -#define NF_HOOK_COND(pf, hook, skb, indev, outdev, okfn, cond) (okfn)(skb) static inline int nf_hook_thresh(int pf, unsigned int hook, struct sk_buff **pskb, struct net_device *indev, struct net_device *outdev, - int (*okfn)(struct sk_buff *), int thresh, - int cond) + int (*okfn)(struct sk_buff *), int thresh) { return okfn(*pskb); } @@ -318,7 +307,7 @@ static inline int nf_hook(int pf, unsigned int hook, struct sk_buff **pskb, struct net_device *indev, struct net_device *outdev, int (*okfn)(struct sk_buff *)) { - return 1; + return okfn(*pskb); } static inline void nf_ct_attach(struct sk_buff *new, struct sk_buff *skb) {} struct flowi; diff --git a/trunk/include/linux/netfilter_ipv4.h b/trunk/include/linux/netfilter_ipv4.h index 43c09d790b83..fdc4a9527343 100644 --- a/trunk/include/linux/netfilter_ipv4.h +++ b/trunk/include/linux/netfilter_ipv4.h @@ -79,7 +79,7 @@ enum nf_ip_hook_priorities { #ifdef __KERNEL__ extern int ip_route_me_harder(struct sk_buff **pskb); -extern int ip_xfrm_me_harder(struct sk_buff **pskb); + #endif /*__KERNEL__*/ #endif /*__LINUX_IP_NETFILTER_H*/ diff --git a/trunk/include/linux/ptrace.h b/trunk/include/linux/ptrace.h index 0d36750fc0f1..9d5cd106b344 100644 --- a/trunk/include/linux/ptrace.h +++ b/trunk/include/linux/ptrace.h @@ -84,7 +84,6 @@ extern int ptrace_readdata(struct task_struct *tsk, unsigned long src, char __us extern int ptrace_writedata(struct task_struct *tsk, char __user *src, unsigned long dst, int len); extern int ptrace_attach(struct task_struct *tsk); extern int ptrace_detach(struct task_struct *, unsigned int); -extern void __ptrace_detach(struct task_struct *, unsigned int); extern void ptrace_disable(struct task_struct *); extern int ptrace_check_attach(struct task_struct *task, int kill); extern int ptrace_request(struct task_struct *child, long request, long addr, long data); diff --git a/trunk/include/net/ip.h b/trunk/include/net/ip.h index fab3d5b3ab1c..8de0697b364c 100644 --- a/trunk/include/net/ip.h +++ b/trunk/include/net/ip.h @@ -41,7 +41,6 @@ struct inet_skb_parm #define IPSKB_XFRM_TUNNEL_SIZE 2 #define IPSKB_XFRM_TRANSFORMED 4 #define IPSKB_FRAG_COMPLETE 8 -#define IPSKB_REROUTED 16 }; struct ipcm_cookie diff --git a/trunk/include/net/xfrm.h b/trunk/include/net/xfrm.h index d6111a2f0a23..d09ca0e7d139 100644 --- a/trunk/include/net/xfrm.h +++ b/trunk/include/net/xfrm.h @@ -866,6 +866,7 @@ extern int xfrm_state_mtu(struct xfrm_state *x, int mtu); extern int xfrm_init_state(struct xfrm_state *x); extern int xfrm4_rcv(struct sk_buff *skb); extern int xfrm4_output(struct sk_buff *skb); +extern int xfrm4_output_finish(struct sk_buff *skb); extern int xfrm4_tunnel_register(struct xfrm_tunnel *handler); extern int xfrm4_tunnel_deregister(struct xfrm_tunnel *handler); extern int xfrm6_rcv_spi(struct sk_buff **pskb, u32 spi); diff --git a/trunk/include/scsi/iscsi_if.h b/trunk/include/scsi/iscsi_if.h index e5618b90996e..3e5cb5ab2d34 100644 --- a/trunk/include/scsi/iscsi_if.h +++ b/trunk/include/scsi/iscsi_if.h @@ -163,6 +163,9 @@ enum iscsi_param { }; #define ISCSI_PARAM_MAX 14 +typedef uint64_t iscsi_sessionh_t; /* iSCSI Data-Path session handle */ +typedef uint64_t iscsi_connh_t; /* iSCSI Data-Path connection handle */ + #define iscsi_ptr(_handle) ((void*)(unsigned long)_handle) #define iscsi_handle(_ptr) ((uint64_t)(unsigned long)_ptr) #define hostdata_session(_hostdata) (iscsi_ptr(*(unsigned long *)_hostdata)) diff --git a/trunk/include/scsi/scsi.h b/trunk/include/scsi/scsi.h index 9c331258bc27..c60b8ff2f5e4 100644 --- a/trunk/include/scsi/scsi.h +++ b/trunk/include/scsi/scsi.h @@ -433,6 +433,4 @@ struct scsi_lun { /* Used to obtain the PCI location of a device */ #define SCSI_IOCTL_GET_PCI 0x5387 -int scsi_execute_in_process_context(void (*fn)(void *data), void *data); - #endif /* _SCSI_SCSI_H */ diff --git a/trunk/include/scsi/scsi_transport_iscsi.h b/trunk/include/scsi/scsi_transport_iscsi.h index b41cf077e54b..16602a547a63 100644 --- a/trunk/include/scsi/scsi_transport_iscsi.h +++ b/trunk/include/scsi/scsi_transport_iscsi.h @@ -63,28 +63,25 @@ struct iscsi_transport { int max_lun; unsigned int max_conn; unsigned int max_cmd_len; - struct iscsi_cls_session *(*create_session) - (struct scsi_transport_template *t, uint32_t sn, uint32_t *sid); - void (*destroy_session) (struct iscsi_cls_session *session); - struct iscsi_cls_conn *(*create_conn) (struct iscsi_cls_session *sess, + struct Scsi_Host *(*create_session) (struct scsi_transport_template *t, + uint32_t initial_cmdsn); + void (*destroy_session) (struct Scsi_Host *shost); + struct iscsi_cls_conn *(*create_conn) (struct Scsi_Host *shost, uint32_t cid); - int (*bind_conn) (struct iscsi_cls_session *session, - struct iscsi_cls_conn *cls_conn, + int (*bind_conn) (iscsi_sessionh_t session, iscsi_connh_t conn, uint32_t transport_fd, int is_leading); - int (*start_conn) (struct iscsi_cls_conn *conn); - void (*stop_conn) (struct iscsi_cls_conn *conn, int flag); + int (*start_conn) (iscsi_connh_t conn); + void (*stop_conn) (iscsi_connh_t conn, int flag); void (*destroy_conn) (struct iscsi_cls_conn *conn); - int (*set_param) (struct iscsi_cls_conn *conn, enum iscsi_param param, + int (*set_param) (iscsi_connh_t conn, enum iscsi_param param, uint32_t value); - int (*get_conn_param) (struct iscsi_cls_conn *conn, - enum iscsi_param param, + int (*get_conn_param) (void *conndata, enum iscsi_param param, uint32_t *value); - int (*get_session_param) (struct iscsi_cls_session *session, + int (*get_session_param) (struct Scsi_Host *shost, enum iscsi_param param, uint32_t *value); - int (*send_pdu) (struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr, + int (*send_pdu) (iscsi_connh_t conn, struct iscsi_hdr *hdr, char *data, uint32_t data_size); - void (*get_stats) (struct iscsi_cls_conn *conn, - struct iscsi_stats *stats); + void (*get_stats) (iscsi_connh_t conn, struct iscsi_stats *stats); }; /* @@ -96,14 +93,15 @@ extern int iscsi_unregister_transport(struct iscsi_transport *tt); /* * control plane upcalls */ -extern void iscsi_conn_error(struct iscsi_cls_conn *conn, enum iscsi_err error); -extern int iscsi_recv_pdu(struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr, +extern void iscsi_conn_error(iscsi_connh_t conn, enum iscsi_err error); +extern int iscsi_recv_pdu(iscsi_connh_t conn, struct iscsi_hdr *hdr, char *data, uint32_t data_size); struct iscsi_cls_conn { struct list_head conn_list; /* item in connlist */ void *dd_data; /* LLD private data */ struct iscsi_transport *transport; + iscsi_connh_t connh; int active; /* must be accessed with the connlock */ struct device dev; /* sysfs transport/container device */ struct mempool_zone *z_error; @@ -115,7 +113,7 @@ struct iscsi_cls_conn { container_of(_dev, struct iscsi_cls_conn, dev) struct iscsi_cls_session { - struct list_head sess_list; /* item in session_list */ + struct list_head list; /* item in session_list */ struct iscsi_transport *transport; struct device dev; /* sysfs transport/container device */ }; diff --git a/trunk/include/video/neomagic.h b/trunk/include/video/neomagic.h index 78b1f15a538f..1d69049bd4c1 100644 --- a/trunk/include/video/neomagic.h +++ b/trunk/include/video/neomagic.h @@ -159,7 +159,6 @@ struct neofb_par { unsigned char PanelDispCntlReg1; unsigned char PanelDispCntlReg2; unsigned char PanelDispCntlReg3; - unsigned char PanelDispCntlRegRead; unsigned char PanelVertCenterReg1; unsigned char PanelVertCenterReg2; unsigned char PanelVertCenterReg3; diff --git a/trunk/kernel/cpuset.c b/trunk/kernel/cpuset.c index 12815d3f1a05..ba42b0a76961 100644 --- a/trunk/kernel/cpuset.c +++ b/trunk/kernel/cpuset.c @@ -1977,39 +1977,6 @@ void cpuset_fork(struct task_struct *child) * We don't need to task_lock() this reference to tsk->cpuset, * because tsk is already marked PF_EXITING, so attach_task() won't * mess with it, or task is a failed fork, never visible to attach_task. - * - * Hack: - * - * Set the exiting tasks cpuset to the root cpuset (top_cpuset). - * - * Don't leave a task unable to allocate memory, as that is an - * accident waiting to happen should someone add a callout in - * do_exit() after the cpuset_exit() call that might allocate. - * If a task tries to allocate memory with an invalid cpuset, - * it will oops in cpuset_update_task_memory_state(). - * - * We call cpuset_exit() while the task is still competent to - * handle notify_on_release(), then leave the task attached to - * the root cpuset (top_cpuset) for the remainder of its exit. - * - * To do this properly, we would increment the reference count on - * top_cpuset, and near the very end of the kernel/exit.c do_exit() - * code we would add a second cpuset function call, to drop that - * reference. This would just create an unnecessary hot spot on - * the top_cpuset reference count, to no avail. - * - * Normally, holding a reference to a cpuset without bumping its - * count is unsafe. The cpuset could go away, or someone could - * attach us to a different cpuset, decrementing the count on - * the first cpuset that we never incremented. But in this case, - * top_cpuset isn't going away, and either task has PF_EXITING set, - * which wards off any attach_task() attempts, or task is a failed - * fork, never visible to attach_task. - * - * Another way to do this would be to set the cpuset pointer - * to NULL here, and check in cpuset_update_task_memory_state() - * for a NULL pointer. This hack avoids that NULL check, for no - * cost (other than this way too long comment ;). **/ void cpuset_exit(struct task_struct *tsk) @@ -2017,7 +1984,7 @@ void cpuset_exit(struct task_struct *tsk) struct cpuset *cs; cs = tsk->cpuset; - tsk->cpuset = &top_cpuset; /* Hack - see comment above */ + tsk->cpuset = NULL; if (notify_on_release(cs)) { char *pathbuf = NULL; diff --git a/trunk/kernel/fork.c b/trunk/kernel/fork.c index fbea12d7a943..8e88b374cee9 100644 --- a/trunk/kernel/fork.c +++ b/trunk/kernel/fork.c @@ -1123,8 +1123,8 @@ static task_t *copy_process(unsigned long clone_flags, p->real_parent = current; p->parent = p->real_parent; - spin_lock(¤t->sighand->siglock); if (clone_flags & CLONE_THREAD) { + spin_lock(¤t->sighand->siglock); /* * Important: if an exit-all has been started then * do not create this new thread - the whole thread @@ -1162,6 +1162,8 @@ static task_t *copy_process(unsigned long clone_flags, */ p->it_prof_expires = jiffies_to_cputime(1); } + + spin_unlock(¤t->sighand->siglock); } /* @@ -1173,6 +1175,8 @@ static task_t *copy_process(unsigned long clone_flags, if (unlikely(p->ptrace & PT_PTRACED)) __ptrace_link(p, current->parent); + attach_pid(p, PIDTYPE_PID, p->pid); + attach_pid(p, PIDTYPE_TGID, p->tgid); if (thread_group_leader(p)) { p->signal->tty = current->signal->tty; p->signal->pgrp = process_group(current); @@ -1182,12 +1186,9 @@ static task_t *copy_process(unsigned long clone_flags, if (p->pid) __get_cpu_var(process_counts)++; } - attach_pid(p, PIDTYPE_TGID, p->tgid); - attach_pid(p, PIDTYPE_PID, p->pid); nr_threads++; total_forks++; - spin_unlock(¤t->sighand->siglock); write_unlock_irq(&tasklist_lock); proc_fork_connector(p); return p; diff --git a/trunk/kernel/power/snapshot.c b/trunk/kernel/power/snapshot.c index 8d5a5986d621..41f66365f0d8 100644 --- a/trunk/kernel/power/snapshot.c +++ b/trunk/kernel/power/snapshot.c @@ -91,8 +91,10 @@ static int save_highmem_zone(struct zone *zone) * corrected eventually when the cases giving rise to this * are better understood. */ - if (PageReserved(page)) + if (PageReserved(page)) { + printk("highmem reserved page?!\n"); continue; + } BUG_ON(PageNosave(page)); if (PageNosaveFree(page)) continue; diff --git a/trunk/kernel/ptrace.c b/trunk/kernel/ptrace.c index d95a72c9279d..d2cf144d0af5 100644 --- a/trunk/kernel/ptrace.c +++ b/trunk/kernel/ptrace.c @@ -72,8 +72,8 @@ void ptrace_untrace(task_t *child) */ void __ptrace_unlink(task_t *child) { - BUG_ON(!child->ptrace); - + if (!child->ptrace) + BUG(); child->ptrace = 0; if (!list_empty(&child->ptrace_list)) { list_del_init(&child->ptrace_list); @@ -184,27 +184,22 @@ int ptrace_attach(struct task_struct *task) return retval; } -void __ptrace_detach(struct task_struct *child, unsigned int data) -{ - child->exit_code = data; - /* .. re-parent .. */ - __ptrace_unlink(child); - /* .. and wake it up. */ - if (child->exit_state != EXIT_ZOMBIE) - wake_up_process(child); -} - int ptrace_detach(struct task_struct *child, unsigned int data) { if (!valid_signal(data)) - return -EIO; + return -EIO; /* Architecture-specific hardware disable .. */ ptrace_disable(child); + /* .. re-parent .. */ + child->exit_code = data; + write_lock_irq(&tasklist_lock); - if (child->ptrace) - __ptrace_detach(child, data); + __ptrace_unlink(child); + /* .. and wake it up. */ + if (child->exit_state != EXIT_ZOMBIE) + wake_up_process(child); write_unlock_irq(&tasklist_lock); return 0; diff --git a/trunk/kernel/sysctl.c b/trunk/kernel/sysctl.c index 7654d55c47f5..71dd6f62efec 100644 --- a/trunk/kernel/sysctl.c +++ b/trunk/kernel/sysctl.c @@ -126,6 +126,8 @@ extern int sysctl_hz_timer; extern int acct_parm[]; #endif +int randomize_va_space = 1; + static int parse_table(int __user *, int, void __user *, size_t __user *, void __user *, size_t, ctl_table *, void **); static int proc_doutsstring(ctl_table *table, int write, struct file *filp, diff --git a/trunk/lib/radix-tree.c b/trunk/lib/radix-tree.c index 1e5b17dc7e3d..c0bd4a914803 100644 --- a/trunk/lib/radix-tree.c +++ b/trunk/lib/radix-tree.c @@ -752,14 +752,12 @@ void *radix_tree_delete(struct radix_tree_root *root, unsigned long index) */ nr_cleared_tags = 0; for (tag = 0; tag < RADIX_TREE_TAGS; tag++) { - tags[tag] = 1; if (tag_get(pathp->node, tag, pathp->offset)) { tag_clear(pathp->node, tag, pathp->offset); - if (!any_tag_set(pathp->node, tag)) { - tags[tag] = 0; - nr_cleared_tags++; - } - } + tags[tag] = 0; + nr_cleared_tags++; + } else + tags[tag] = 1; } for (pathp--; nr_cleared_tags && pathp->node; pathp--) { diff --git a/trunk/mm/memory.c b/trunk/mm/memory.c index 9abc6008544b..2bee1f21aa8a 100644 --- a/trunk/mm/memory.c +++ b/trunk/mm/memory.c @@ -82,16 +82,6 @@ EXPORT_SYMBOL(num_physpages); EXPORT_SYMBOL(high_memory); EXPORT_SYMBOL(vmalloc_earlyreserve); -int randomize_va_space __read_mostly = 1; - -static int __init disable_randmaps(char *s) -{ - randomize_va_space = 0; - return 0; -} -__setup("norandmaps", disable_randmaps); - - /* * If a p?d_bad entry is found while walking page tables, report * the error, before resetting entry to p?d_none. Usually (but diff --git a/trunk/net/bridge/br_stp_if.c b/trunk/net/bridge/br_stp_if.c index 35cf3a074087..cc047f7fb6ef 100644 --- a/trunk/net/bridge/br_stp_if.c +++ b/trunk/net/bridge/br_stp_if.c @@ -67,7 +67,7 @@ void br_stp_disable_bridge(struct net_bridge *br) { struct net_bridge_port *p; - spin_lock_bh(&br->lock); + spin_lock(&br->lock); list_for_each_entry(p, &br->port_list, list) { if (p->state != BR_STATE_DISABLED) br_stp_disable_port(p); @@ -76,7 +76,7 @@ void br_stp_disable_bridge(struct net_bridge *br) br->topology_change = 0; br->topology_change_detected = 0; - spin_unlock_bh(&br->lock); + spin_unlock(&br->lock); del_timer_sync(&br->hello_timer); del_timer_sync(&br->topology_change_timer); diff --git a/trunk/net/ipv4/ip_gre.c b/trunk/net/ipv4/ip_gre.c index 9981dcd68f11..abe23923e4e7 100644 --- a/trunk/net/ipv4/ip_gre.c +++ b/trunk/net/ipv4/ip_gre.c @@ -830,8 +830,7 @@ static int ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev) skb->h.raw = skb->nh.raw; skb->nh.raw = skb_push(skb, gre_hlen); memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt)); - IPCB(skb)->flags &= ~(IPSKB_XFRM_TUNNEL_SIZE | IPSKB_XFRM_TRANSFORMED | - IPSKB_REROUTED); + IPCB(skb)->flags &= ~(IPSKB_XFRM_TUNNEL_SIZE|IPSKB_XFRM_TRANSFORMED); dst_release(skb->dst); skb->dst = &rt->u.dst; diff --git a/trunk/net/ipv4/ip_output.c b/trunk/net/ipv4/ip_output.c index 57d290d89ec2..3324fbfe528a 100644 --- a/trunk/net/ipv4/ip_output.c +++ b/trunk/net/ipv4/ip_output.c @@ -207,10 +207,8 @@ static inline int ip_finish_output(struct sk_buff *skb) { #if defined(CONFIG_NETFILTER) && defined(CONFIG_XFRM) /* Policy lookup after SNAT yielded a new policy */ - if (skb->dst->xfrm != NULL) { - IPCB(skb)->flags |= IPSKB_REROUTED; - return dst_output(skb); - } + if (skb->dst->xfrm != NULL) + return xfrm4_output_finish(skb); #endif if (skb->len > dst_mtu(skb->dst) && !(skb_shinfo(skb)->ufo_size || skb_shinfo(skb)->tso_size)) @@ -273,9 +271,8 @@ int ip_mc_output(struct sk_buff *skb) newskb->dev, ip_dev_loopback_xmit); } - return NF_HOOK_COND(PF_INET, NF_IP_POST_ROUTING, skb, NULL, skb->dev, - ip_finish_output, - !(IPCB(skb)->flags & IPSKB_REROUTED)); + return NF_HOOK(PF_INET, NF_IP_POST_ROUTING, skb, NULL, skb->dev, + ip_finish_output); } int ip_output(struct sk_buff *skb) @@ -287,9 +284,8 @@ int ip_output(struct sk_buff *skb) skb->dev = dev; skb->protocol = htons(ETH_P_IP); - return NF_HOOK_COND(PF_INET, NF_IP_POST_ROUTING, skb, NULL, dev, - ip_finish_output, - !(IPCB(skb)->flags & IPSKB_REROUTED)); + return NF_HOOK(PF_INET, NF_IP_POST_ROUTING, skb, NULL, dev, + ip_finish_output); } int ip_queue_xmit(struct sk_buff *skb, int ipfragok) diff --git a/trunk/net/ipv4/ipip.c b/trunk/net/ipv4/ipip.c index 03d13742a4b8..e5cbe72c6b80 100644 --- a/trunk/net/ipv4/ipip.c +++ b/trunk/net/ipv4/ipip.c @@ -622,8 +622,7 @@ static int ipip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev) skb->h.raw = skb->nh.raw; skb->nh.raw = skb_push(skb, sizeof(struct iphdr)); memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt)); - IPCB(skb)->flags &= ~(IPSKB_XFRM_TUNNEL_SIZE | IPSKB_XFRM_TRANSFORMED | - IPSKB_REROUTED); + IPCB(skb)->flags &= ~(IPSKB_XFRM_TUNNEL_SIZE|IPSKB_XFRM_TRANSFORMED); dst_release(skb->dst); skb->dst = &rt->u.dst; diff --git a/trunk/net/ipv4/netfilter.c b/trunk/net/ipv4/netfilter.c index ed42cdc57cd9..52a3d7c57907 100644 --- a/trunk/net/ipv4/netfilter.c +++ b/trunk/net/ipv4/netfilter.c @@ -78,47 +78,6 @@ int ip_route_me_harder(struct sk_buff **pskb) } EXPORT_SYMBOL(ip_route_me_harder); -#ifdef CONFIG_XFRM -int ip_xfrm_me_harder(struct sk_buff **pskb) -{ - struct flowi fl; - unsigned int hh_len; - struct dst_entry *dst; - - if (IPCB(*pskb)->flags & IPSKB_XFRM_TRANSFORMED) - return 0; - if (xfrm_decode_session(*pskb, &fl, AF_INET) < 0) - return -1; - - dst = (*pskb)->dst; - if (dst->xfrm) - dst = ((struct xfrm_dst *)dst)->route; - dst_hold(dst); - - if (xfrm_lookup(&dst, &fl, (*pskb)->sk, 0) < 0) - return -1; - - dst_release((*pskb)->dst); - (*pskb)->dst = dst; - - /* Change in oif may mean change in hh_len. */ - hh_len = (*pskb)->dst->dev->hard_header_len; - if (skb_headroom(*pskb) < hh_len) { - struct sk_buff *nskb; - - nskb = skb_realloc_headroom(*pskb, hh_len); - if (!nskb) - return -1; - if ((*pskb)->sk) - skb_set_owner_w(nskb, (*pskb)->sk); - kfree_skb(*pskb); - *pskb = nskb; - } - return 0; -} -EXPORT_SYMBOL(ip_xfrm_me_harder); -#endif - void (*ip_nat_decode_session)(struct sk_buff *, struct flowi *); EXPORT_SYMBOL(ip_nat_decode_session); diff --git a/trunk/net/ipv4/netfilter/ip_nat_standalone.c b/trunk/net/ipv4/netfilter/ip_nat_standalone.c index 7c3f7d380240..92c54999a19d 100644 --- a/trunk/net/ipv4/netfilter/ip_nat_standalone.c +++ b/trunk/net/ipv4/netfilter/ip_nat_standalone.c @@ -235,19 +235,19 @@ ip_nat_out(unsigned int hooknum, return NF_ACCEPT; ret = ip_nat_fn(hooknum, pskb, in, out, okfn); -#ifdef CONFIG_XFRM if (ret != NF_DROP && ret != NF_STOLEN && (ct = ip_conntrack_get(*pskb, &ctinfo)) != NULL) { enum ip_conntrack_dir dir = CTINFO2DIR(ctinfo); if (ct->tuplehash[dir].tuple.src.ip != ct->tuplehash[!dir].tuple.dst.ip +#ifdef CONFIG_XFRM || ct->tuplehash[dir].tuple.src.u.all != ct->tuplehash[!dir].tuple.dst.u.all +#endif ) - return ip_xfrm_me_harder(pskb) == 0 ? ret : NF_DROP; + return ip_route_me_harder(pskb) == 0 ? ret : NF_DROP; } -#endif return ret; } diff --git a/trunk/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c b/trunk/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c index 6c8624a54933..167619f638c6 100644 --- a/trunk/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c +++ b/trunk/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c @@ -529,10 +529,15 @@ static int init_or_cleanup(int init) goto cleanup_localinops; } #endif + + /* For use by REJECT target */ + ip_ct_attach = __nf_conntrack_attach; + return ret; cleanup: synchronize_net(); + ip_ct_attach = NULL; #ifdef CONFIG_SYSCTL unregister_sysctl_table(nf_ct_ipv4_sysctl_header); cleanup_localinops: diff --git a/trunk/net/ipv4/xfrm4_output.c b/trunk/net/ipv4/xfrm4_output.c index 32ad229b4fed..d4df0ddd424b 100644 --- a/trunk/net/ipv4/xfrm4_output.c +++ b/trunk/net/ipv4/xfrm4_output.c @@ -152,16 +152,10 @@ static int xfrm4_output_one(struct sk_buff *skb) goto out_exit; } -static int xfrm4_output_finish(struct sk_buff *skb) +int xfrm4_output_finish(struct sk_buff *skb) { int err; -#ifdef CONFIG_NETFILTER - if (!skb->dst->xfrm) { - IPCB(skb)->flags |= IPSKB_REROUTED; - return dst_output(skb); - } -#endif while (likely((err = xfrm4_output_one(skb)) == 0)) { nf_reset(skb); @@ -184,7 +178,6 @@ static int xfrm4_output_finish(struct sk_buff *skb) int xfrm4_output(struct sk_buff *skb) { - return NF_HOOK_COND(PF_INET, NF_IP_POST_ROUTING, skb, NULL, skb->dst->dev, - xfrm4_output_finish, - !(IPCB(skb)->flags & IPSKB_REROUTED)); + return NF_HOOK(PF_INET, NF_IP_POST_ROUTING, skb, NULL, skb->dst->dev, + xfrm4_output_finish); } diff --git a/trunk/net/ipv6/icmp.c b/trunk/net/ipv6/icmp.c index 21eb725e885f..fcf883183cef 100644 --- a/trunk/net/ipv6/icmp.c +++ b/trunk/net/ipv6/icmp.c @@ -42,7 +42,6 @@ #include #include #include -#include #ifdef CONFIG_SYSCTL #include @@ -256,7 +255,6 @@ static int icmpv6_push_pending_frames(struct sock *sk, struct flowi *fl, struct struct icmpv6_msg { struct sk_buff *skb; int offset; - uint8_t type; }; static int icmpv6_getfrag(void *from, char *to, int offset, int len, int odd, struct sk_buff *skb) @@ -268,8 +266,6 @@ static int icmpv6_getfrag(void *from, char *to, int offset, int len, int odd, st csum = skb_copy_and_csum_bits(org_skb, msg->offset + offset, to, len, csum); skb->csum = csum_block_add(skb->csum, csum, odd); - if (!(msg->type & ICMPV6_INFOMSG_MASK)) - nf_ct_attach(skb, org_skb); return 0; } @@ -407,7 +403,6 @@ void icmpv6_send(struct sk_buff *skb, int type, int code, __u32 info, msg.skb = skb; msg.offset = skb->nh.raw - skb->data; - msg.type = type; len = skb->len - msg.offset; len = min_t(unsigned int, len, IPV6_MIN_MTU - sizeof(struct ipv6hdr) -sizeof(struct icmp6hdr)); @@ -505,7 +500,6 @@ static void icmpv6_echo_reply(struct sk_buff *skb) msg.skb = skb; msg.offset = 0; - msg.type = ICMPV6_ECHO_REPLY; err = ip6_append_data(sk, icmpv6_getfrag, &msg, skb->len + sizeof(struct icmp6hdr), sizeof(struct icmp6hdr), hlimit, tclass, NULL, &fl, diff --git a/trunk/net/ipv6/netfilter/ip6t_REJECT.c b/trunk/net/ipv6/netfilter/ip6t_REJECT.c index 0e6d1d4bbd5c..c745717b4ce2 100644 --- a/trunk/net/ipv6/netfilter/ip6t_REJECT.c +++ b/trunk/net/ipv6/netfilter/ip6t_REJECT.c @@ -160,8 +160,6 @@ static void send_reset(struct sk_buff *oldskb) csum_partial((char *)tcph, sizeof(struct tcphdr), 0)); - nf_ct_attach(nskb, oldskb); - NF_HOOK(PF_INET6, NF_IP6_LOCAL_OUT, nskb, NULL, nskb->dst->dev, dst_output); } diff --git a/trunk/net/netfilter/Kconfig b/trunk/net/netfilter/Kconfig index a8e5544da93e..0e550127fa7e 100644 --- a/trunk/net/netfilter/Kconfig +++ b/trunk/net/netfilter/Kconfig @@ -126,7 +126,7 @@ config NETFILTER_XT_TARGET_CONNMARK tristate '"CONNMARK" target support' depends on NETFILTER_XTABLES depends on IP_NF_MANGLE || IP6_NF_MANGLE - depends on (IP_NF_CONNTRACK && IP_NF_CONNTRACK_MARK) || (NF_CONNTRACK_MARK && NF_CONNTRACK) + depends on (IP_NF_CONNTRACK && IP_NF_CONNTRACK_MARK) || (NF_CONNTRACK_MARK && NF_CONNTRACK_IPV4) help This option adds a `CONNMARK' target, which allows one to manipulate the connection mark value. Similar to the MARK target, but @@ -187,7 +187,7 @@ config NETFILTER_XT_MATCH_COMMENT config NETFILTER_XT_MATCH_CONNBYTES tristate '"connbytes" per-connection counter match support' depends on NETFILTER_XTABLES - depends on (IP_NF_CONNTRACK && IP_NF_CT_ACCT) || (NF_CT_ACCT && NF_CONNTRACK) + depends on (IP_NF_CONNTRACK && IP_NF_CT_ACCT) || NF_CT_ACCT help This option adds a `connbytes' match, which allows you to match the number of bytes and/or packets for each direction within a connection. @@ -198,7 +198,7 @@ config NETFILTER_XT_MATCH_CONNBYTES config NETFILTER_XT_MATCH_CONNMARK tristate '"connmark" connection mark match support' depends on NETFILTER_XTABLES - depends on (IP_NF_CONNTRACK && IP_NF_CONNTRACK_MARK) || (NF_CONNTRACK_MARK && NF_CONNTRACK) + depends on (IP_NF_CONNTRACK && IP_NF_CONNTRACK_MARK) || NF_CONNTRACK_MARK help This option adds a `connmark' match, which allows you to match the connection mark value previously set for the session by `CONNMARK'. diff --git a/trunk/net/netfilter/nf_conntrack_core.c b/trunk/net/netfilter/nf_conntrack_core.c index d622ddf08bb0..0ce337a1d974 100644 --- a/trunk/net/netfilter/nf_conntrack_core.c +++ b/trunk/net/netfilter/nf_conntrack_core.c @@ -1556,8 +1556,6 @@ void nf_conntrack_cleanup(void) { int i; - ip_ct_attach = NULL; - /* This makes sure all current packets have passed through netfilter framework. Roll on, two-stage module delete... */ @@ -1717,9 +1715,6 @@ int __init nf_conntrack_init(void) nf_ct_l3protos[i] = &nf_conntrack_generic_l3proto; write_unlock_bh(&nf_conntrack_lock); - /* For use by REJECT target */ - ip_ct_attach = __nf_conntrack_attach; - /* Set up fake conntrack: - to never be deleted, not in any hashes */ atomic_set(&nf_conntrack_untracked.ct_general.use, 1); diff --git a/trunk/net/netfilter/nf_conntrack_proto_tcp.c b/trunk/net/netfilter/nf_conntrack_proto_tcp.c index 6492ed66fb3c..df99138c3b3b 100644 --- a/trunk/net/netfilter/nf_conntrack_proto_tcp.c +++ b/trunk/net/netfilter/nf_conntrack_proto_tcp.c @@ -864,9 +864,7 @@ static int csum6(const struct sk_buff *skb, unsigned int dataoff) { return csum_ipv6_magic(&skb->nh.ipv6h->saddr, &skb->nh.ipv6h->daddr, skb->len - dataoff, IPPROTO_TCP, - skb->ip_summed == CHECKSUM_HW - ? csum_sub(skb->csum, - skb_checksum(skb, 0, dataoff, 0)) + skb->ip_summed == CHECKSUM_HW ? skb->csum : skb_checksum(skb, dataoff, skb->len - dataoff, 0)); } diff --git a/trunk/net/netfilter/nf_conntrack_proto_udp.c b/trunk/net/netfilter/nf_conntrack_proto_udp.c index 831d206344e0..4264dd079a16 100644 --- a/trunk/net/netfilter/nf_conntrack_proto_udp.c +++ b/trunk/net/netfilter/nf_conntrack_proto_udp.c @@ -161,9 +161,7 @@ static int csum6(const struct sk_buff *skb, unsigned int dataoff) { return csum_ipv6_magic(&skb->nh.ipv6h->saddr, &skb->nh.ipv6h->daddr, skb->len - dataoff, IPPROTO_UDP, - skb->ip_summed == CHECKSUM_HW - ? csum_sub(skb->csum, - skb_checksum(skb, 0, dataoff, 0)) + skb->ip_summed == CHECKSUM_HW ? skb->csum : skb_checksum(skb, dataoff, skb->len - dataoff, 0)); }