Automatic merge of rsync://rsync.kernel.org/pub/scm/linux/kernel/git/aegl/linux-2...
authorLinus Torvalds <torvalds@ppc970.osdl.org>
Wed, 27 Apr 2005 17:05:42 +0000 (10:05 -0700)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Wed, 27 Apr 2005 17:05:42 +0000 (10:05 -0700)
93 files changed:
arch/arm/kernel/Makefile
arch/arm/kernel/asm-offsets.c
arch/arm/kernel/entry-armv.S
arch/arm/kernel/entry-common.S
arch/arm/kernel/entry-header.S
arch/arm/kernel/traps.c
arch/arm/mach-pxa/sleep.S
arch/ppc64/kernel/rtas_flash.c
arch/ppc64/kernel/scanlog.c
arch/ppc64/xmon/ppc-opc.c
arch/x86_64/kernel/signal.c
drivers/char/tpm/tpm.c
drivers/i2c/busses/i2c-mpc.c
drivers/net/tg3.c
drivers/net/wan/pc300_drv.c
drivers/oprofile/oprofile_files.c
drivers/scsi/esp.c
drivers/scsi/pluto.c
drivers/scsi/qla2xxx/qla_sup.c
drivers/serial/21285.c
drivers/serial/8250_hp300.c
drivers/serial/amba-pl010.c
drivers/serial/amba-pl011.c
drivers/serial/clps711x.c
drivers/serial/mpsc.c
drivers/serial/mpsc.h
drivers/serial/s3c2410.c
drivers/serial/sa1100.c
drivers/serial/serial_lh7a40x.c
drivers/usb/core/usb.c
drivers/usb/image/microtek.c
drivers/usb/input/ati_remote.c
drivers/usb/input/usbkbd.c
drivers/usb/media/pwc/pwc-ctrl.c
drivers/usb/media/pwc/pwc-if.c
drivers/usb/media/pwc/pwc.h
drivers/usb/media/sn9c102_core.c
drivers/usb/media/sn9c102_sensor.h
drivers/usb/misc/sisusbvga/sisusb.c
drivers/usb/net/pegasus.c
drivers/usb/net/usbnet.c
drivers/usb/net/zd1201.c
drivers/usb/serial/Kconfig
drivers/usb/serial/Makefile
drivers/usb/serial/hp4x.c [new file with mode: 0644]
drivers/usb/storage/unusual_devs.h
drivers/video/imsttfb.c
drivers/video/savage/savagefb_driver.c
fs/isofs/compress.c
fs/isofs/dir.c
fs/isofs/export.c
fs/isofs/inode.c
fs/isofs/isofs.h [new file with mode: 0644]
fs/isofs/joliet.c
fs/isofs/namei.c
fs/isofs/rock.c
fs/isofs/util.c
include/asm-arm/arch-s3c2410/regs-iis.h
include/asm-arm/arch-s3c2410/regs-mem.h
include/asm-arm/arch-s3c2410/regs-spi.h
include/asm-arm/arch-s3c2410/uncompress.h
include/asm-arm/string.h
include/linux/iso_fs.h
include/linux/iso_fs_i.h [deleted file]
include/linux/iso_fs_sb.h [deleted file]
net/bluetooth/af_bluetooth.c
net/bluetooth/bnep/sock.c
net/bluetooth/cmtp/capi.c
net/bluetooth/cmtp/core.c
net/bluetooth/cmtp/sock.c
net/bluetooth/hci_conn.c
net/bluetooth/hci_core.c
net/bluetooth/hci_event.c
net/bluetooth/hci_sock.c
net/bluetooth/hidp/core.c
net/bluetooth/hidp/sock.c
net/bluetooth/l2cap.c
net/bluetooth/rfcomm/sock.c
net/bluetooth/sco.c
net/core/rtnetlink.c
net/core/scm.c
net/core/sock.c
net/ipv4/af_inet.c
net/ipv4/ip_output.c
net/ipv4/netfilter/ip_conntrack_ftp.c
net/ipv4/netfilter/ip_conntrack_standalone.c
net/ipv4/tcp_input.c
net/ipv6/af_inet6.c
net/netlink/af_netlink.c
net/sched/simple.c
net/unix/af_unix.c
scripts/mod/file2alias.c
sound/ppc/Kconfig

index 07a56ff614940d2c4a38002a28b76c69570bb0ef..4a2af55e134bcdc2cb07f01fc45d85458c673d94 100644 (file)
@@ -31,8 +31,3 @@ head-y                        := head.o
 obj-$(CONFIG_DEBUG_LL) += debug.o
 
 extra-y := $(head-y) init_task.o vmlinux.lds
-
-# Spell out some dependencies that aren't automatically figured out
-$(obj)/entry-armv.o:   $(obj)/entry-header.S include/asm-arm/constants.h
-$(obj)/entry-common.o:         $(obj)/entry-header.S include/asm-arm/constants.h \
-                       $(obj)/calls.S
index 99d43259ff8917a4e6cd8c6f7b1a7e7761c5e0e3..c1ff4d1f1bfde619616141830a46d3a3cfe4bdc0 100644 (file)
@@ -64,6 +64,26 @@ int main(void)
   DEFINE(TI_VFPSTATE,          offsetof(struct thread_info, vfpstate));
   DEFINE(TI_IWMMXT_STATE,      (offsetof(struct thread_info, fpstate)+4)&~7);
   BLANK();
+  DEFINE(S_R0,                 offsetof(struct pt_regs, ARM_r0));
+  DEFINE(S_R1,                 offsetof(struct pt_regs, ARM_r1));
+  DEFINE(S_R2,                 offsetof(struct pt_regs, ARM_r2));
+  DEFINE(S_R3,                 offsetof(struct pt_regs, ARM_r3));
+  DEFINE(S_R4,                 offsetof(struct pt_regs, ARM_r4));
+  DEFINE(S_R5,                 offsetof(struct pt_regs, ARM_r5));
+  DEFINE(S_R6,                 offsetof(struct pt_regs, ARM_r6));
+  DEFINE(S_R7,                 offsetof(struct pt_regs, ARM_r7));
+  DEFINE(S_R8,                 offsetof(struct pt_regs, ARM_r8));
+  DEFINE(S_R9,                 offsetof(struct pt_regs, ARM_r9));
+  DEFINE(S_R10,                        offsetof(struct pt_regs, ARM_r10));
+  DEFINE(S_FP,                 offsetof(struct pt_regs, ARM_fp));
+  DEFINE(S_IP,                 offsetof(struct pt_regs, ARM_ip));
+  DEFINE(S_SP,                 offsetof(struct pt_regs, ARM_sp));
+  DEFINE(S_LR,                 offsetof(struct pt_regs, ARM_lr));
+  DEFINE(S_PC,                 offsetof(struct pt_regs, ARM_pc));
+  DEFINE(S_PSR,                        offsetof(struct pt_regs, ARM_cpsr));
+  DEFINE(S_OLD_R0,             offsetof(struct pt_regs, ARM_ORIG_r0));
+  DEFINE(S_FRAME_SIZE,         sizeof(struct pt_regs));
+  BLANK();
 #if __LINUX_ARM_ARCH__ >= 6
   DEFINE(MM_CONTEXT_ID,                offsetof(struct mm_struct, context.id));
   BLANK();
index bb27c317d94bab88f4578a0c6be7981d15abae65..2a5c3fe09a95484a0d0844454e5f332686d96750 100644 (file)
  *  it to save wrong values...  Be aware!
  */
 #include <linux/config.h>
-#include <linux/init.h>
 
-#include <asm/thread_info.h>
 #include <asm/glue.h>
-#include <asm/ptrace.h>
 #include <asm/vfpmacros.h>
+#include <asm/hardware.h>              @ should be moved into entry-macro.S
+#include <asm/arch/irqs.h>             @ should be moved into entry-macro.S
+#include <asm/arch/entry-macro.S>
 
 #include "entry-header.S"
 
@@ -118,7 +118,7 @@ __dabt_svc:
        @
        @ IRQs off again before pulling preserved data off the stack
        @
-       disable_irq r0
+       disable_irq
 
        @
        @ restore SPSR and restart the instruction
@@ -198,7 +198,7 @@ __und_svc:
        @
        @ IRQs off again before pulling preserved data off the stack
        @
-1:     disable_irq r0
+1:     disable_irq
 
        @
        @ restore SPSR and restart the instruction
@@ -232,7 +232,7 @@ __pabt_svc:
        @
        @ IRQs off again before pulling preserved data off the stack
        @
-       disable_irq r0
+       disable_irq
 
        @
        @ restore SPSR and restart the instruction
@@ -316,7 +316,7 @@ __dabt_usr:
        @
        @ IRQs on, then call the main handler
        @
-       enable_irq r2
+       enable_irq
        mov     r2, sp
        adr     lr, ret_from_exception
        b       do_DataAbort
@@ -418,7 +418,7 @@ call_fpe:
        movcss  r7, r5, lsr #(TIF_USING_IWMMXT + 1)
        bcs     iwmmxt_task_enable
 #endif
-       enable_irq r7
+       enable_irq
        add     pc, pc, r8, lsr #6
        mov     r0, r0
 
@@ -472,7 +472,7 @@ fpundefinstr:
 __pabt_usr:
        usr_entry abt
 
-       enable_irq r0                           @ Enable interrupts
+       enable_irq                              @ Enable interrupts
        mov     r0, r2                          @ address (pc)
        mov     r1, sp                          @ regs
        bl      do_PrefetchAbort                @ call abort handler
@@ -522,8 +522,9 @@ ENTRY(__switch_to)
 /*
  * Vector stubs.
  *
- * This code is copied to 0x200 or 0xffff0200 so we can use branches in the
- * vectors, rather than ldr's.
+ * This code is copied to 0xffff0200 so we can use branches in the
+ * vectors, rather than ldr's.  Note that this code must not
+ * exceed 0x300 bytes.
  *
  * Common stub entry macro:
  *   Enter in IRQ mode, spsr = SVC/USR CPSR, lr = SVC/USR PC
@@ -544,7 +545,7 @@ vector_\name:
        @
        mrs     r13, cpsr
        bic     r13, r13, #MODE_MASK
-       orr     r13, r13, #MODE_SVC
+       orr     r13, r13, #SVC_MODE
        msr     spsr_cxsf, r13                  @ switch to SVC_32 mode
 
        and     lr, lr, #15
@@ -552,6 +553,7 @@ vector_\name:
        movs    pc, lr                          @ Changes mode and branches
        .endm
 
+       .globl  __stubs_start
 __stubs_start:
 /*
  * Interrupt dispatcher
@@ -686,37 +688,24 @@ vector_addrexcptn:
 .LCsabt:
        .word   __temp_abt
 
+       .globl  __stubs_end
 __stubs_end:
 
-       .equ    __real_stubs_start, .LCvectors + 0x200
+       .equ    stubs_offset, __vectors_start + 0x200 - __stubs_start
 
-.LCvectors:
+       .globl  __vectors_start
+__vectors_start:
        swi     SYS_ERROR0
-       b       __real_stubs_start + (vector_und - __stubs_start)
-       ldr     pc, __real_stubs_start + (.LCvswi - __stubs_start)
-       b       __real_stubs_start + (vector_pabt - __stubs_start)
-       b       __real_stubs_start + (vector_dabt - __stubs_start)
-       b       __real_stubs_start + (vector_addrexcptn - __stubs_start)
-       b       __real_stubs_start + (vector_irq - __stubs_start)
-       b       __real_stubs_start + (vector_fiq - __stubs_start)
-
-ENTRY(__trap_init)
-       stmfd   sp!, {r4 - r6, lr}
-
-       mov     r0, #0xff000000
-       orr     r0, r0, #0x00ff0000             @ high vectors position
-       adr     r1, .LCvectors                  @ set up the vectors
-       ldmia   r1, {r1, r2, r3, r4, r5, r6, ip, lr}
-       stmia   r0, {r1, r2, r3, r4, r5, r6, ip, lr}
-
-       add     r2, r0, #0x200
-       adr     r0, __stubs_start               @ copy stubs to 0x200
-       adr     r1, __stubs_end
-1:     ldr     r3, [r0], #4
-       str     r3, [r2], #4
-       cmp     r0, r1
-       blt     1b
-       LOADREGS(fd, sp!, {r4 - r6, pc})
+       b       vector_und + stubs_offset
+       ldr     pc, .LCvswi + stubs_offset
+       b       vector_pabt + stubs_offset
+       b       vector_dabt + stubs_offset
+       b       vector_addrexcptn + stubs_offset
+       b       vector_irq + stubs_offset
+       b       vector_fiq + stubs_offset
+
+       .globl  __vectors_end
+__vectors_end:
 
        .data
 
index 53a7e0dea44d30281c716f2a6a0cafbe85ac79cb..3f8d0e3aefabf71c6bf82783024a72c39988974f 100644 (file)
@@ -9,19 +9,10 @@
  */
 #include <linux/config.h>
 
-#include <asm/thread_info.h>
-#include <asm/ptrace.h>
 #include <asm/unistd.h>
 
 #include "entry-header.S"
 
-/* 
- * We rely on the fact that R0 is at the bottom of the stack (due to
- * slow/fast restore user regs).
- */
-#if S_R0 != 0
-#error "Please fix"
-#endif
 
        .align  5
 /*
  * stack.
  */
 ret_fast_syscall:
-       disable_irq r1                          @ disable interrupts
+       disable_irq                             @ disable interrupts
        ldr     r1, [tsk, #TI_FLAGS]
        tst     r1, #_TIF_WORK_MASK
        bne     fast_work_pending
-       fast_restore_user_regs
+
+       @ fast_restore_user_regs
+       ldr     r1, [sp, #S_OFF + S_PSR]        @ get calling cpsr
+       ldr     lr, [sp, #S_OFF + S_PC]!        @ get pc
+       msr     spsr_cxsf, r1                   @ save in spsr_svc
+       ldmdb   sp, {r1 - lr}^                  @ get calling r1 - lr
+       mov     r0, r0
+       add     sp, sp, #S_FRAME_SIZE - S_PC
+       movs    pc, lr                          @ return & move spsr_svc into cpsr
 
 /*
  * Ok, we need to do extra processing, enter the slow path.
@@ -49,7 +48,7 @@ work_pending:
        mov     r0, sp                          @ 'regs'
        mov     r2, why                         @ 'syscall'
        bl      do_notify_resume
-       disable_irq r1                          @ disable interrupts
+       disable_irq                             @ disable interrupts
        b       no_work_pending
 
 work_resched:
@@ -59,12 +58,19 @@ work_resched:
  */
 ENTRY(ret_to_user)
 ret_slow_syscall:
-       disable_irq r1                          @ disable interrupts
+       disable_irq                             @ disable interrupts
        ldr     r1, [tsk, #TI_FLAGS]
        tst     r1, #_TIF_WORK_MASK
        bne     work_pending
 no_work_pending:
-       slow_restore_user_regs
+       @ slow_restore_user_regs
+       ldr     r1, [sp, #S_PSR]                @ get calling cpsr
+       ldr     lr, [sp, #S_PC]!                @ get pc
+       msr     spsr_cxsf, r1                   @ save in spsr_svc
+       ldmdb   sp, {r0 - lr}^                  @ get calling r1 - lr
+       mov     r0, r0
+       add     sp, sp, #S_FRAME_SIZE - S_PC
+       movs    pc, lr                          @ return & move spsr_svc into cpsr
 
 /*
  * This is how we return from a fork.
@@ -116,9 +122,26 @@ ENTRY(ret_from_fork)
 
        .align  5
 ENTRY(vector_swi)
-       save_user_regs
+       sub     sp, sp, #S_FRAME_SIZE
+       stmia   sp, {r0 - r12}                  @ Calling r0 - r12
+       add     r8, sp, #S_PC
+       stmdb   r8, {sp, lr}^                   @ Calling sp, lr
+       mrs     r8, spsr                        @ called from non-FIQ mode, so ok.
+       str     lr, [sp, #S_PC]                 @ Save calling PC
+       str     r8, [sp, #S_PSR]                @ Save CPSR
+       str     r0, [sp, #S_OLD_R0]             @ Save OLD_R0
        zero_fp
-       get_scno
+
+       /*
+        * Get the system call number.
+        */
+#ifdef CONFIG_ARM_THUMB
+       tst     r8, #PSR_T_BIT                  @ this is SPSR from save_user_regs
+       addne   scno, r7, #__NR_SYSCALL_BASE    @ put OS number in
+       ldreq   scno, [lr, #-4]
+#else
+       ldr     scno, [lr, #-4]                 @ get SWI instruction
+#endif
        arm710_bug_check scno, ip
 
 #ifdef CONFIG_ALIGNMENT_TRAP
@@ -126,14 +149,14 @@ ENTRY(vector_swi)
        ldr     ip, [ip]
        mcr     p15, 0, ip, c1, c0              @ update control register
 #endif
-       enable_irq ip
+       enable_irq
 
        str     r4, [sp, #-S_OFF]!              @ push fifth arg
 
        get_thread_info tsk
        ldr     ip, [tsk, #TI_FLAGS]            @ check for syscall tracing
        bic     scno, scno, #0xff000000         @ mask off SWI op-code
-       eor     scno, scno, #OS_NUMBER << 20    @ check OS number
+       eor     scno, scno, #__NR_SYSCALL_BASE  @ check OS number
        adr     tbl, sys_call_table             @ load syscall table pointer
        tst     ip, #_TIF_SYSCALL_TRACE         @ are we tracing syscalls?
        bne     __sys_trace
@@ -144,8 +167,8 @@ ENTRY(vector_swi)
 
        add     r1, sp, #S_OFF
 2:     mov     why, #0                         @ no longer a real syscall
-       cmp     scno, #ARMSWI_OFFSET
-       eor     r0, scno, #OS_NUMBER << 20      @ put OS number back
+       cmp     scno, #(__ARM_NR_BASE - __NR_SYSCALL_BASE)
+       eor     r0, scno, #__NR_SYSCALL_BASE    @ put OS number back
        bcs     arm_syscall     
        b       sys_ni_syscall                  @ not private func
 
@@ -190,7 +213,7 @@ ENTRY(sys_call_table)
 @ r5 = syscall table
                .type   sys_syscall, #function
 sys_syscall:
-               eor     scno, r0, #OS_NUMBER << 20
+               eor     scno, r0, #__NR_SYSCALL_BASE
                cmp     scno, #__NR_syscall - __NR_SYSCALL_BASE
                cmpne   scno, #NR_syscalls      @ check range
                stmloia sp, {r5, r6}            @ shuffle args
index 4039d8c120b57446a02687993f8aed6721a5bb81..a3d40a0e2b0479032a6d2f7126d64fb2ea626215 100644 (file)
@@ -1,24 +1,11 @@
-#include <linux/config.h> /* for CONFIG_ARCH_xxxx */
+#include <linux/config.h>
+#include <linux/init.h>
 #include <linux/linkage.h>
 
 #include <asm/assembler.h>
 #include <asm/constants.h>
 #include <asm/errno.h>
-#include <asm/hardware.h>
-#include <asm/arch/irqs.h>
-#include <asm/arch/entry-macro.S>
-
-#ifndef MODE_SVC
-#define MODE_SVC 0x13
-#endif
-
-       .macro  zero_fp
-#ifdef CONFIG_FRAME_POINTER
-       mov     fp, #0
-#endif
-       .endm
-
-       .text
+#include <asm/thread_info.h>
 
 @ Bad Abort numbers
 @ -----------------
 #define BAD_IRQ                3
 #define BAD_UNDEFINSTR 4
 
-#define PT_TRACESYS    0x00000002
-
-@ OS version number used in SWIs
-@  RISC OS is 0
-@  RISC iX is 8
 @
-#define OS_NUMBER      9
-#define ARMSWI_OFFSET  0x000f0000
-
+@ Most of the stack format comes from struct pt_regs, but with
+@ the addition of 8 bytes for storing syscall args 5 and 6.
 @
-@ Stack format (ensured by USER_* and SVC_*)
-@
-#define S_FRAME_SIZE   72
-#define S_OLD_R0       68
-#define S_PSR          64
-
-#define S_PC           60
-#define S_LR           56
-#define S_SP           52
-#define S_IP           48
-#define S_FP           44
-#define S_R10          40
-#define S_R9           36
-#define S_R8           32
-#define S_R7           28
-#define S_R6           24
-#define S_R5           20
-#define S_R4           16
-#define S_R3           12
-#define S_R2           8
-#define S_R1           4
-#define S_R0           0
 #define S_OFF          8
 
-       .macro  set_cpsr_c, reg, mode
-       msr     cpsr_c, \mode
+/* 
+ * The SWI code relies on the fact that R0 is at the bottom of the stack
+ * (due to slow/fast restore user regs).
+ */
+#if S_R0 != 0
+#error "Please fix"
+#endif
+
+       .macro  zero_fp
+#ifdef CONFIG_FRAME_POINTER
+       mov     fp, #0
+#endif
        .endm
 
 #if __LINUX_ARM_ARCH__ >= 6
-       .macro  disable_irq, temp
+       .macro  disable_irq
        cpsid   i
        .endm
 
-       .macro  enable_irq, temp
+       .macro  enable_irq
        cpsie   i
        .endm
 #else
-       .macro  disable_irq, temp
-       set_cpsr_c \temp, #PSR_I_BIT | MODE_SVC
+       .macro  disable_irq
+       msr     cpsr_c, #PSR_I_BIT | SVC_MODE
        .endm
 
-       .macro  enable_irq, temp
-       set_cpsr_c \temp, #MODE_SVC
+       .macro  enable_irq
+       msr     cpsr_c, #SVC_MODE
        .endm
 #endif
 
-       .macro  save_user_regs
-       sub     sp, sp, #S_FRAME_SIZE
-       stmia   sp, {r0 - r12}                  @ Calling r0 - r12
-       add     r8, sp, #S_PC
-       stmdb   r8, {sp, lr}^                   @ Calling sp, lr
-       mrs     r8, spsr                        @ called from non-FIQ mode, so ok.
-       str     lr, [sp, #S_PC]                 @ Save calling PC
-       str     r8, [sp, #S_PSR]                @ Save CPSR
-       str     r0, [sp, #S_OLD_R0]             @ Save OLD_R0
-       .endm
-
-       .macro  restore_user_regs
-       ldr     r1, [sp, #S_PSR]                @ Get calling cpsr
-       disable_irq ip                          @ disable IRQs
-       ldr     lr, [sp, #S_PC]!                @ Get PC
-       msr     spsr_cxsf, r1                   @ save in spsr_svc
-       ldmdb   sp, {r0 - lr}^                  @ Get calling r0 - lr
-       mov     r0, r0
-       add     sp, sp, #S_FRAME_SIZE - S_PC
-       movs    pc, lr                          @ return & move spsr_svc into cpsr
-       .endm
-
-/*
- * Must be called with IRQs already disabled.
- */
-       .macro  fast_restore_user_regs
-       ldr     r1, [sp, #S_OFF + S_PSR]        @ get calling cpsr
-       ldr     lr, [sp, #S_OFF + S_PC]!        @ get pc
-       msr     spsr_cxsf, r1                   @ save in spsr_svc
-       ldmdb   sp, {r1 - lr}^                  @ get calling r1 - lr
-       mov     r0, r0
-       add     sp, sp, #S_FRAME_SIZE - S_PC
-       movs    pc, lr                          @ return & move spsr_svc into cpsr
-       .endm
-
-/*
- * Must be called with IRQs already disabled.
- */
-       .macro  slow_restore_user_regs
-       ldr     r1, [sp, #S_PSR]                @ get calling cpsr
-       ldr     lr, [sp, #S_PC]!                @ get pc
-       msr     spsr_cxsf, r1                   @ save in spsr_svc
-       ldmdb   sp, {r0 - lr}^                  @ get calling r1 - lr
-       mov     r0, r0
-       add     sp, sp, #S_FRAME_SIZE - S_PC
-       movs    pc, lr                          @ return & move spsr_svc into cpsr
-       .endm
-
-       .macro  mask_pc, rd, rm
-       .endm
-
        .macro  get_thread_info, rd
        mov     \rd, sp, lsr #13
        mov     \rd, \rd, lsl #13
@@ -165,18 +83,3 @@ scno        .req    r7              @ syscall number
 tbl    .req    r8              @ syscall table pointer
 why    .req    r8              @ Linux syscall (!= 0)
 tsk    .req    r9              @ current thread_info
-
-/*
- * Get the system call number.
- */
-       .macro  get_scno
-#ifdef CONFIG_ARM_THUMB
-       tst     r8, #PSR_T_BIT          @ this is SPSR from save_user_regs
-       addne   scno, r7, #OS_NUMBER << 20 @ put OS number in
-       ldreq   scno, [lr, #-4]
-
-#else
-       mask_pc lr, lr
-       ldr     scno, [lr, #-4]         @ get SWI instruction
-#endif
-       .endm
index 6e31718f60085f097bbcd14759b9bf9d1ef5df11..0078aeb85737197a84af1eeb0353dbef74427901 100644 (file)
@@ -578,9 +578,16 @@ EXPORT_SYMBOL(abort);
 
 void __init trap_init(void)
 {
-       extern void __trap_init(void);
+       extern char __stubs_start[], __stubs_end[];
+       extern char __vectors_start[], __vectors_end[];
 
-       __trap_init();
+       /*
+        * Copy the vectors and stubs (in entry-armv.S) into the
+        * vector page, mapped at 0xffff0000, and ensure these are
+        * visible to the instruction stream.
+        */
+       memcpy((void *)0xffff0000, __vectors_start, __vectors_end - __vectors_start);
+       memcpy((void *)0xffff0200, __stubs_start, __stubs_end - __stubs_start);
        flush_icache_range(0xffff0000, 0xffff0000 + PAGE_SIZE);
        modify_domain(DOMAIN_USER, DOMAIN_CLIENT);
 }
index 16cad2c2497cfc6ca033a36f2867e09e809ee5d4..5786ccad938cef12878a7c5a19db33617e16c50d 100644 (file)
 
 #include <asm/arch/pxa-regs.h>
 
+#ifdef CONFIG_PXA27x                   // workaround for Errata 50
+#define MDREFR_KDIV    0x200a4000      // all banks
+#define CCCR_SLEEP     0x00000107      // L=7 2N=2 A=0 PPDIS=0 CPDIS=0
+#endif
+
                .text
 
 /*
@@ -28,7 +33,9 @@
 
 ENTRY(pxa_cpu_suspend)
 
+#ifndef CONFIG_IWMMXT
        mra     r2, r3, acc0
+#endif
        stmfd   sp!, {r2 - r12, lr}             @ save registers on stack
 
        @ get coprocessor registers
@@ -61,14 +68,23 @@ ENTRY(pxa_cpu_suspend)
        @ prepare value for sleep mode
        mov     r1, #3                          @ sleep mode
 
-       @ prepare to put SDRAM into self-refresh manually
+       @ prepare pointer to physical address 0 (virtual mapping in generic.c)
+       mov     r2, #UNCACHED_PHYS_0
+
+       @ prepare SDRAM refresh settings
        ldr     r4, =MDREFR
        ldr     r5, [r4]
+
+       @ enable SDRAM self-refresh mode
        orr     r5, r5, #MDREFR_SLFRSH
 
-       @ prepare pointer to physical address 0 (virtual mapping in generic.c)
-       mov     r2, #UNCACHED_PHYS_0
+#ifdef CONFIG_PXA27x
+       @ set SDCLKx divide-by-2 bits (this is part of a workaround for Errata 50)
+       ldr     r6, =MDREFR_KDIV
+       orr     r5, r5, r6
+#endif
 
+#ifdef CONFIG_PXA25x
        @ Intel PXA255 Specification Update notes problems
        @ about suspending with PXBus operating above 133MHz
        @ (see Errata 31, GPIO output signals, ... unpredictable in sleep
@@ -100,6 +116,18 @@ ENTRY(pxa_cpu_suspend)
        mov     r0, #0
        mcr     p14, 0, r0, c6, c0, 0
        orr     r0, r0, #2                      @ initiate change bit
+#endif
+#ifdef CONFIG_PXA27x
+       @ Intel PXA270 Specification Update notes problems sleeping
+       @ with core operating above 91 MHz
+       @ (see Errata 50, ...processor does not exit from sleep...)
+
+       ldr     r6, =CCCR
+       ldr     r8, [r6]                @ keep original value for resume
+
+       ldr     r7, =CCCR_SLEEP         @ prepare CCCR sleep value
+       mov     r0, #0x2                @ prepare value for CLKCFG
+#endif
 
        @ align execution to a cache line
        b       1f
@@ -111,6 +139,7 @@ ENTRY(pxa_cpu_suspend)
        @ All needed values are now in registers.
        @ These last instructions should be in cache
 
+#if defined(CONFIG_PXA25x) || defined(CONFIG_PXA27x)
        @ initiate the frequency change...
        str     r7, [r6]
        mcr     p14, 0, r0, c6, c0, 0
@@ -118,14 +147,27 @@ ENTRY(pxa_cpu_suspend)
        @ restore the original cpu speed value for resume
        str     r8, [r6]
 
-       @ put SDRAM into self-refresh
-       str     r5, [r4]
+       @ need 6 13-MHz cycles before changing PWRMODE
+       @ just set frequency to 91-MHz... 6*91/13 = 42
+
+       mov     r0, #42
+10:    subs    r0, r0, #1
+       bne     10b
+#endif
+
+       @ Do not reorder...
+       @ Intel PXA270 Specification Update notes problems performing
+       @ external accesses after SDRAM is put in self-refresh mode
+       @ (see Errata 39 ...hangs when entering self-refresh mode)
 
        @ force address lines low by reading at physical address 0
        ldr     r3, [r2]
 
+       @ put SDRAM into self-refresh
+       str     r5, [r4]
+
        @ enter sleep mode
-       mcr     p14, 0, r1, c7, c0, 0
+       mcr     p14, 0, r1, c7, c0, 0           @ PWRMODE
 
 20:    b       20b                             @ loop waiting for sleep
 
@@ -188,7 +230,9 @@ resume_after_mmu:
        bl      cpu_xscale_proc_init
 #endif
        ldmfd   sp!, {r2, r3}
+#ifndef CONFIG_IWMMXT
        mar     acc0, r2, r3
+#endif
        ldmfd   sp!, {r4 - r12, pc}             @ return to caller
 
 
index 3213837282ca4c91f24e9d57bf83fdf4febf4f57..923e2e201a70669620f1834adf3b9aec321380b0 100644 (file)
@@ -218,7 +218,7 @@ static void get_flash_status_msg(int status, char *buf)
 }
 
 /* Reading the proc file will show status (not the firmware contents) */
-static ssize_t rtas_flash_read(struct file *file, char *buf,
+static ssize_t rtas_flash_read(struct file *file, char __user *buf,
                               size_t count, loff_t *ppos)
 {
        struct proc_dir_entry *dp = PDE(file->f_dentry->d_inode);
@@ -256,7 +256,7 @@ static ssize_t rtas_flash_read(struct file *file, char *buf,
  * count is.  If the system is low on memory it will be just as well
  * that we fail....
  */
-static ssize_t rtas_flash_write(struct file *file, const char *buffer,
+static ssize_t rtas_flash_write(struct file *file, const char __user *buffer,
                                size_t count, loff_t *off)
 {
        struct proc_dir_entry *dp = PDE(file->f_dentry->d_inode);
@@ -356,7 +356,7 @@ static void manage_flash(struct rtas_manage_flash_t *args_buf)
        args_buf->status = rc;
 }
 
-static ssize_t manage_flash_read(struct file *file, char *buf,
+static ssize_t manage_flash_read(struct file *file, char __user *buf,
                               size_t count, loff_t *ppos)
 {
        struct proc_dir_entry *dp = PDE(file->f_dentry->d_inode);
@@ -386,7 +386,7 @@ static ssize_t manage_flash_read(struct file *file, char *buf,
        return msglen;
 }
 
-static ssize_t manage_flash_write(struct file *file, const char *buf,
+static ssize_t manage_flash_write(struct file *file, const char __user *buf,
                                size_t count, loff_t *off)
 {
        struct proc_dir_entry *dp = PDE(file->f_dentry->d_inode);
@@ -466,7 +466,7 @@ static int get_validate_flash_msg(struct rtas_validate_flash_t *args_buf,
        return n;
 }
 
-static ssize_t validate_flash_read(struct file *file, char *buf,
+static ssize_t validate_flash_read(struct file *file, char __user *buf,
                               size_t count, loff_t *ppos)
 {
        struct proc_dir_entry *dp = PDE(file->f_dentry->d_inode);
@@ -494,7 +494,7 @@ static ssize_t validate_flash_read(struct file *file, char *buf,
        return msglen;
 }
 
-static ssize_t validate_flash_write(struct file *file, const char *buf,
+static ssize_t validate_flash_write(struct file *file, const char __user *buf,
                                    size_t count, loff_t *off)
 {
        struct proc_dir_entry *dp = PDE(file->f_dentry->d_inode);
index 189b81a419871ac9653ed42201788b30d865d278..4d70736619c7d5153c8d54bc10e12eb078cb686a 100644 (file)
@@ -43,7 +43,7 @@ static int scanlog_debug;
 static unsigned int ibm_scan_log_dump;                 /* RTAS token */
 static struct proc_dir_entry *proc_ppc64_scan_log_dump;        /* The proc file */
 
-static ssize_t scanlog_read(struct file *file, char *buf,
+static ssize_t scanlog_read(struct file *file, char __user *buf,
                            size_t count, loff_t *ppos)
 {
         struct inode * inode = file->f_dentry->d_inode;
@@ -129,7 +129,7 @@ static ssize_t scanlog_read(struct file *file, char *buf,
        /*NOTREACHED*/
 }
 
-static ssize_t scanlog_write(struct file * file, const char * buf,
+static ssize_t scanlog_write(struct file * file, const char __user * buf,
                             size_t count, loff_t *ppos)
 {
        char stkbuf[20];
index 1e4e7e319970abd206aa098971ef42a1b8c30acb..5ee8fc32f824143550cf9556bfebf42daea16a1c 100644 (file)
@@ -20,6 +20,7 @@
    Software Foundation, 59 Temple Place - Suite 330, Boston, MA
    02111-1307, USA.  */
 
+#include <linux/stddef.h>
 #include "nonstdio.h"
 #include "ppc.h"
 
@@ -110,12 +111,12 @@ const struct powerpc_operand powerpc_operands[] =
   /* The zero index is used to indicate the end of the list of
      operands.  */
 #define UNUSED 0
-  { 0, 0, 0, 0, 0 },
+  { 0, 0, NULL, NULL, 0 },
 
   /* The BA field in an XL form instruction.  */
 #define BA UNUSED + 1
 #define BA_MASK (0x1f << 16)
-  { 5, 16, 0, 0, PPC_OPERAND_CR },
+  { 5, 16, NULL, NULL, PPC_OPERAND_CR },
 
   /* The BA field in an XL form instruction when it must be the same
      as the BT field in the same instruction.  */
@@ -125,7 +126,7 @@ const struct powerpc_operand powerpc_operands[] =
   /* The BB field in an XL form instruction.  */
 #define BB BAT + 1
 #define BB_MASK (0x1f << 11)
-  { 5, 11, 0, 0, PPC_OPERAND_CR },
+  { 5, 11, NULL, NULL, PPC_OPERAND_CR },
 
   /* The BB field in an XL form instruction when it must be the same
      as the BA field in the same instruction.  */
@@ -168,21 +169,21 @@ const struct powerpc_operand powerpc_operands[] =
 
   /* The BF field in an X or XL form instruction.  */
 #define BF BDPA + 1
-  { 3, 23, 0, 0, PPC_OPERAND_CR },
+  { 3, 23, NULL, NULL, PPC_OPERAND_CR },
 
   /* An optional BF field.  This is used for comparison instructions,
      in which an omitted BF field is taken as zero.  */
 #define OBF BF + 1
-  { 3, 23, 0, 0, PPC_OPERAND_CR | PPC_OPERAND_OPTIONAL },
+  { 3, 23, NULL, NULL, PPC_OPERAND_CR | PPC_OPERAND_OPTIONAL },
 
   /* The BFA field in an X or XL form instruction.  */
 #define BFA OBF + 1
-  { 3, 18, 0, 0, PPC_OPERAND_CR },
+  { 3, 18, NULL, NULL, PPC_OPERAND_CR },
 
   /* The BI field in a B form or XL form instruction.  */
 #define BI BFA + 1
 #define BI_MASK (0x1f << 16)
-  { 5, 16, 0, 0, PPC_OPERAND_CR },
+  { 5, 16, NULL, NULL, PPC_OPERAND_CR },
 
   /* The BO field in a B form instruction.  Certain values are
      illegal.  */
@@ -197,36 +198,36 @@ const struct powerpc_operand powerpc_operands[] =
 
   /* The BT field in an X or XL form instruction.  */
 #define BT BOE + 1
-  { 5, 21, 0, 0, PPC_OPERAND_CR },
+  { 5, 21, NULL, NULL, PPC_OPERAND_CR },
 
   /* The condition register number portion of the BI field in a B form
      or XL form instruction.  This is used for the extended
      conditional branch mnemonics, which set the lower two bits of the
      BI field.  This field is optional.  */
 #define CR BT + 1
-  { 3, 18, 0, 0, PPC_OPERAND_CR | PPC_OPERAND_OPTIONAL },
+  { 3, 18, NULL, NULL, PPC_OPERAND_CR | PPC_OPERAND_OPTIONAL },
 
   /* The CRB field in an X form instruction.  */
 #define CRB CR + 1
-  { 5, 6, 0, 0, 0 },
+  { 5, 6, NULL, NULL, 0 },
 
   /* The CRFD field in an X form instruction.  */
 #define CRFD CRB + 1
-  { 3, 23, 0, 0, PPC_OPERAND_CR },
+  { 3, 23, NULL, NULL, PPC_OPERAND_CR },
 
   /* The CRFS field in an X form instruction.  */
 #define CRFS CRFD + 1
-  { 3, 0, 0, 0, PPC_OPERAND_CR },
+  { 3, 0, NULL, NULL, PPC_OPERAND_CR },
 
   /* The CT field in an X form instruction.  */
 #define CT CRFS + 1
-  { 5, 21, 0, 0, PPC_OPERAND_OPTIONAL },
+  { 5, 21, NULL, NULL, PPC_OPERAND_OPTIONAL },
 
   /* The D field in a D form instruction.  This is a displacement off
      a register, and implies that the next operand is a register in
      parentheses.  */
 #define D CT + 1
-  { 16, 0, 0, 0, PPC_OPERAND_PARENS | PPC_OPERAND_SIGNED },
+  { 16, 0, NULL, NULL, PPC_OPERAND_PARENS | PPC_OPERAND_SIGNED },
 
   /* The DE field in a DE form instruction.  This is like D, but is 12
      bits only.  */
@@ -252,40 +253,40 @@ const struct powerpc_operand powerpc_operands[] =
 
   /* The E field in a wrteei instruction.  */
 #define E DS + 1
-  { 1, 15, 0, 0, 0 },
+  { 1, 15, NULL, NULL, 0 },
 
   /* The FL1 field in a POWER SC form instruction.  */
 #define FL1 E + 1
-  { 4, 12, 0, 0, 0 },
+  { 4, 12, NULL, NULL, 0 },
 
   /* The FL2 field in a POWER SC form instruction.  */
 #define FL2 FL1 + 1
-  { 3, 2, 0, 0, 0 },
+  { 3, 2, NULL, NULL, 0 },
 
   /* The FLM field in an XFL form instruction.  */
 #define FLM FL2 + 1
-  { 8, 17, 0, 0, 0 },
+  { 8, 17, NULL, NULL, 0 },
 
   /* The FRA field in an X or A form instruction.  */
 #define FRA FLM + 1
 #define FRA_MASK (0x1f << 16)
-  { 5, 16, 0, 0, PPC_OPERAND_FPR },
+  { 5, 16, NULL, NULL, PPC_OPERAND_FPR },
 
   /* The FRB field in an X or A form instruction.  */
 #define FRB FRA + 1
 #define FRB_MASK (0x1f << 11)
-  { 5, 11, 0, 0, PPC_OPERAND_FPR },
+  { 5, 11, NULL, NULL, PPC_OPERAND_FPR },
 
   /* The FRC field in an A form instruction.  */
 #define FRC FRB + 1
 #define FRC_MASK (0x1f << 6)
-  { 5, 6, 0, 0, PPC_OPERAND_FPR },
+  { 5, 6, NULL, NULL, PPC_OPERAND_FPR },
 
   /* The FRS field in an X form instruction or the FRT field in a D, X
      or A form instruction.  */
 #define FRS FRC + 1
 #define FRT FRS
-  { 5, 21, 0, 0, PPC_OPERAND_FPR },
+  { 5, 21, NULL, NULL, PPC_OPERAND_FPR },
 
   /* The FXM field in an XFX instruction.  */
 #define FXM FRS + 1
@@ -298,11 +299,11 @@ const struct powerpc_operand powerpc_operands[] =
 
   /* The L field in a D or X form instruction.  */
 #define L FXM4 + 1
-  { 1, 21, 0, 0, PPC_OPERAND_OPTIONAL },
+  { 1, 21, NULL, NULL, PPC_OPERAND_OPTIONAL },
 
   /* The LEV field in a POWER SC form instruction.  */
 #define LEV L + 1
-  { 7, 5, 0, 0, 0 },
+  { 7, 5, NULL, NULL, 0 },
 
   /* The LI field in an I form instruction.  The lower two bits are
      forced to zero.  */
@@ -316,24 +317,24 @@ const struct powerpc_operand powerpc_operands[] =
 
   /* The LS field in an X (sync) form instruction.  */
 #define LS LIA + 1
-  { 2, 21, 0, 0, PPC_OPERAND_OPTIONAL },
+  { 2, 21, NULL, NULL, PPC_OPERAND_OPTIONAL },
 
   /* The MB field in an M form instruction.  */
 #define MB LS + 1
 #define MB_MASK (0x1f << 6)
-  { 5, 6, 0, 0, 0 },
+  { 5, 6, NULL, NULL, 0 },
 
   /* The ME field in an M form instruction.  */
 #define ME MB + 1
 #define ME_MASK (0x1f << 1)
-  { 5, 1, 0, 0, 0 },
+  { 5, 1, NULL, NULL, 0 },
 
   /* The MB and ME fields in an M form instruction expressed a single
      operand which is a bitmask indicating which bits to select.  This
      is a two operand form using PPC_OPERAND_NEXT.  See the
      description in opcode/ppc.h for what this means.  */
 #define MBE ME + 1
-  { 5, 6, 0, 0, PPC_OPERAND_OPTIONAL | PPC_OPERAND_NEXT },
+  { 5, 6, NULL, NULL, PPC_OPERAND_OPTIONAL | PPC_OPERAND_NEXT },
   { 32, 0, insert_mbe, extract_mbe, 0 },
 
   /* The MB or ME field in an MD or MDS form instruction.  The high
@@ -345,7 +346,7 @@ const struct powerpc_operand powerpc_operands[] =
 
   /* The MO field in an mbar instruction.  */
 #define MO MB6 + 1
-  { 5, 21, 0, 0, 0 },
+  { 5, 21, NULL, NULL, 0 },
 
   /* The NB field in an X form instruction.  The value 32 is stored as
      0.  */
@@ -361,34 +362,34 @@ const struct powerpc_operand powerpc_operands[] =
   /* The RA field in an D, DS, DQ, X, XO, M, or MDS form instruction.  */
 #define RA NSI + 1
 #define RA_MASK (0x1f << 16)
-  { 5, 16, 0, 0, PPC_OPERAND_GPR },
+  { 5, 16, NULL, NULL, PPC_OPERAND_GPR },
 
   /* The RA field in the DQ form lq instruction, which has special
      value restrictions.  */
 #define RAQ RA + 1
-  { 5, 16, insert_raq, 0, PPC_OPERAND_GPR },
+  { 5, 16, insert_raq, NULL, PPC_OPERAND_GPR },
 
   /* The RA field in a D or X form instruction which is an updating
      load, which means that the RA field may not be zero and may not
      equal the RT field.  */
 #define RAL RAQ + 1
-  { 5, 16, insert_ral, 0, PPC_OPERAND_GPR },
+  { 5, 16, insert_ral, NULL, PPC_OPERAND_GPR },
 
   /* The RA field in an lmw instruction, which has special value
      restrictions.  */
 #define RAM RAL + 1
-  { 5, 16, insert_ram, 0, PPC_OPERAND_GPR },
+  { 5, 16, insert_ram, NULL, PPC_OPERAND_GPR },
 
   /* The RA field in a D or X form instruction which is an updating
      store or an updating floating point load, which means that the RA
      field may not be zero.  */
 #define RAS RAM + 1
-  { 5, 16, insert_ras, 0, PPC_OPERAND_GPR },
+  { 5, 16, insert_ras, NULL, PPC_OPERAND_GPR },
 
   /* The RB field in an X, XO, M, or MDS form instruction.  */
 #define RB RAS + 1
 #define RB_MASK (0x1f << 11)
-  { 5, 11, 0, 0, PPC_OPERAND_GPR },
+  { 5, 11, NULL, NULL, PPC_OPERAND_GPR },
 
   /* The RB field in an X form instruction when it must be the same as
      the RS field in the instruction.  This is used for extended
@@ -402,22 +403,22 @@ const struct powerpc_operand powerpc_operands[] =
 #define RS RBS + 1
 #define RT RS
 #define RT_MASK (0x1f << 21)
-  { 5, 21, 0, 0, PPC_OPERAND_GPR },
+  { 5, 21, NULL, NULL, PPC_OPERAND_GPR },
 
   /* The RS field of the DS form stq instruction, which has special
      value restrictions.  */
 #define RSQ RS + 1
-  { 5, 21, insert_rsq, 0, PPC_OPERAND_GPR },
+  { 5, 21, insert_rsq, NULL, PPC_OPERAND_GPR },
 
   /* The RT field of the DQ form lq instruction, which has special
      value restrictions.  */
 #define RTQ RSQ + 1
-  { 5, 21, insert_rtq, 0, PPC_OPERAND_GPR },
+  { 5, 21, insert_rtq, NULL, PPC_OPERAND_GPR },
 
   /* The SH field in an X or M form instruction.  */
 #define SH RTQ + 1
 #define SH_MASK (0x1f << 11)
-  { 5, 11, 0, 0, 0 },
+  { 5, 11, NULL, NULL, 0 },
 
   /* The SH field in an MD form instruction.  This is split.  */
 #define SH6 SH + 1
@@ -426,12 +427,12 @@ const struct powerpc_operand powerpc_operands[] =
 
   /* The SI field in a D form instruction.  */
 #define SI SH6 + 1
-  { 16, 0, 0, 0, PPC_OPERAND_SIGNED },
+  { 16, 0, NULL, NULL, PPC_OPERAND_SIGNED },
 
   /* The SI field in a D form instruction when we accept a wide range
      of positive values.  */
 #define SISIGNOPT SI + 1
-  { 16, 0, 0, 0, PPC_OPERAND_SIGNED | PPC_OPERAND_SIGNOPT },
+  { 16, 0, NULL, NULL, PPC_OPERAND_SIGNED | PPC_OPERAND_SIGNOPT },
 
   /* The SPR field in an XFX form instruction.  This is flipped--the
      lower 5 bits are stored in the upper 5 and vice- versa.  */
@@ -443,25 +444,25 @@ const struct powerpc_operand powerpc_operands[] =
   /* The BAT index number in an XFX form m[ft]ibat[lu] instruction.  */
 #define SPRBAT SPR + 1
 #define SPRBAT_MASK (0x3 << 17)
-  { 2, 17, 0, 0, 0 },
+  { 2, 17, NULL, NULL, 0 },
 
   /* The SPRG register number in an XFX form m[ft]sprg instruction.  */
 #define SPRG SPRBAT + 1
 #define SPRG_MASK (0x3 << 16)
-  { 2, 16, 0, 0, 0 },
+  { 2, 16, NULL, NULL, 0 },
 
   /* The SR field in an X form instruction.  */
 #define SR SPRG + 1
-  { 4, 16, 0, 0, 0 },
+  { 4, 16, NULL, NULL, 0 },
 
   /* The STRM field in an X AltiVec form instruction.  */
 #define STRM SR + 1
 #define STRM_MASK (0x3 << 21)
-  { 2, 21, 0, 0, 0 },
+  { 2, 21, NULL, NULL, 0 },
 
   /* The SV field in a POWER SC form instruction.  */
 #define SV STRM + 1
-  { 14, 2, 0, 0, 0 },
+  { 14, 2, NULL, NULL, 0 },
 
   /* The TBR field in an XFX form instruction.  This is like the SPR
      field, but it is optional.  */
@@ -471,52 +472,52 @@ const struct powerpc_operand powerpc_operands[] =
   /* The TO field in a D or X form instruction.  */
 #define TO TBR + 1
 #define TO_MASK (0x1f << 21)
-  { 5, 21, 0, 0, 0 },
+  { 5, 21, NULL, NULL, 0 },
 
   /* The U field in an X form instruction.  */
 #define U TO + 1
-  { 4, 12, 0, 0, 0 },
+  { 4, 12, NULL, NULL, 0 },
 
   /* The UI field in a D form instruction.  */
 #define UI U + 1
-  { 16, 0, 0, 0, 0 },
+  { 16, 0, NULL, NULL, 0 },
 
   /* The VA field in a VA, VX or VXR form instruction.  */
 #define VA UI + 1
 #define VA_MASK        (0x1f << 16)
-  { 5, 16, 0, 0, PPC_OPERAND_VR },
+  { 5, 16, NULL, NULL, PPC_OPERAND_VR },
 
   /* The VB field in a VA, VX or VXR form instruction.  */
 #define VB VA + 1
 #define VB_MASK (0x1f << 11)
-  { 5, 11, 0, 0, PPC_OPERAND_VR },
+  { 5, 11, NULL, NULL, PPC_OPERAND_VR },
 
   /* The VC field in a VA form instruction.  */
 #define VC VB + 1
 #define VC_MASK (0x1f << 6)
-  { 5, 6, 0, 0, PPC_OPERAND_VR },
+  { 5, 6, NULL, NULL, PPC_OPERAND_VR },
 
   /* The VD or VS field in a VA, VX, VXR or X form instruction.  */
 #define VD VC + 1
 #define VS VD
 #define VD_MASK (0x1f << 21)
-  { 5, 21, 0, 0, PPC_OPERAND_VR },
+  { 5, 21, NULL, NULL, PPC_OPERAND_VR },
 
   /* The SIMM field in a VX form instruction.  */
 #define SIMM VD + 1
-  { 5, 16, 0, 0, PPC_OPERAND_SIGNED},
+  { 5, 16, NULL, NULL, PPC_OPERAND_SIGNED},
 
   /* The UIMM field in a VX form instruction.  */
 #define UIMM SIMM + 1
-  { 5, 16, 0, 0, 0 },
+  { 5, 16, NULL, NULL, 0 },
 
   /* The SHB field in a VA form instruction.  */
 #define SHB UIMM + 1
-  { 4, 6, 0, 0, 0 },
+  { 4, 6, NULL, NULL, 0 },
 
   /* The other UIMM field in a EVX form instruction.  */
 #define EVUIMM SHB + 1
-  { 5, 11, 0, 0, 0 },
+  { 5, 11, NULL, NULL, 0 },
 
   /* The other UIMM field in a half word EVX form instruction.  */
 #define EVUIMM_2 EVUIMM + 1
@@ -533,11 +534,11 @@ const struct powerpc_operand powerpc_operands[] =
   /* The WS field.  */
 #define WS EVUIMM_8 + 1
 #define WS_MASK (0x7 << 11)
-  { 3, 11, 0, 0, 0 },
+  { 3, 11, NULL, NULL, 0 },
 
   /* The L field in an mtmsrd instruction */
 #define MTMSRD_L WS + 1
-  { 1, 16, 0, 0, PPC_OPERAND_OPTIONAL },
+  { 1, 16, NULL, NULL, PPC_OPERAND_OPTIONAL },
 
 };
 
index 7760224cdfe39af70467cb2f8e28153389f979aa..d439ced150c603c33cbc2220bec5532654822b86 100644 (file)
@@ -83,7 +83,7 @@ sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss,
 
 struct rt_sigframe
 {
-       char *pretcode;
+       char __user *pretcode;
        struct ucontext uc;
        struct siginfo info;
 };
index ca36087d4f8a739774c51a39d7485cb4046c4082..87235330fdbe9ced1e186e8e670f919709fd2c9c 100644 (file)
@@ -143,7 +143,7 @@ static ssize_t tpm_transmit(struct tpm_chip *chip, const char *buf,
                return -ENODATA;
        if (count > bufsiz) {
                dev_err(&chip->pci_dev->dev,
-                       "invalid count value %x %x \n", count, bufsiz);
+                       "invalid count value %x %zx \n", count, bufsiz);
                return -E2BIG;
        }
 
@@ -151,7 +151,7 @@ static ssize_t tpm_transmit(struct tpm_chip *chip, const char *buf,
 
        if ((len = chip->vendor->send(chip, (u8 *) buf, count)) < 0) {
                dev_err(&chip->pci_dev->dev,
-                       "tpm_transmit: tpm_send: error %d\n", len);
+                       "tpm_transmit: tpm_send: error %zd\n", len);
                return len;
        }
 
@@ -188,7 +188,7 @@ out_recv:
        len = chip->vendor->recv(chip, (u8 *) buf, bufsiz);
        if (len < 0)
                dev_err(&chip->pci_dev->dev,
-                       "tpm_transmit: tpm_recv: error %d\n", len);
+                       "tpm_transmit: tpm_recv: error %zd\n", len);
        up(&chip->tpm_mutex);
        return len;
 }
index 75b8d867dae11a5ab0dfb2710479cc1c8928961d..6f33496d31c31e6c57d3d2479db4afb4dad23617 100644 (file)
@@ -55,7 +55,7 @@
 #define CSR_RXAK 0x01
 
 struct mpc_i2c {
-       char *base;
+       void __iomem *base;
        u32 interrupt;
        wait_queue_head_t queue;
        struct i2c_adapter adap;
@@ -444,7 +444,7 @@ static int fsl_i2c_probe(struct device *device)
 
       fail_add:
        if (i2c->irq != 0)
-               free_irq(i2c->irq, 0);
+               free_irq(i2c->irq, NULL);
       fail_irq:
        iounmap(i2c->base);
       fail_map:
index 10d476153ee097ccc244d9d333aed860ad037933..903d0ced7ddb95eb4168775ff5a28ed14f210b98 100644 (file)
@@ -426,9 +426,30 @@ static void tg3_enable_ints(struct tg3 *tp)
        tg3_cond_int(tp);
 }
 
+static inline unsigned int tg3_has_work(struct tg3 *tp)
+{
+       struct tg3_hw_status *sblk = tp->hw_status;
+       unsigned int work_exists = 0;
+
+       /* check for phy events */
+       if (!(tp->tg3_flags &
+             (TG3_FLAG_USE_LINKCHG_REG |
+              TG3_FLAG_POLL_SERDES))) {
+               if (sblk->status & SD_STATUS_LINK_CHG)
+                       work_exists = 1;
+       }
+       /* check for RX/TX work to do */
+       if (sblk->idx[0].tx_consumer != tp->tx_cons ||
+           sblk->idx[0].rx_producer != tp->rx_rcb_ptr)
+               work_exists = 1;
+
+       return work_exists;
+}
+
 /* tg3_restart_ints
- *  similar to tg3_enable_ints, but it can return without flushing the
- *  PIO write which reenables interrupts
+ *  similar to tg3_enable_ints, but it accurately determines whether there
+ *  is new work pending and can return without flushing the PIO write
+ *  which reenables interrupts 
  */
 static void tg3_restart_ints(struct tg3 *tp)
 {
@@ -437,7 +458,9 @@ static void tg3_restart_ints(struct tg3 *tp)
        tw32_mailbox(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW, 0x00000000);
        mmiowb();
 
-       tg3_cond_int(tp);
+       if (tg3_has_work(tp))
+               tw32(HOSTCC_MODE, tp->coalesce_mode |
+                    (HOSTCC_MODE_ENABLE | HOSTCC_MODE_NOW));
 }
 
 static inline void tg3_netif_stop(struct tg3 *tp)
@@ -2686,8 +2709,8 @@ static int tg3_vlan_rx(struct tg3 *tp, struct sk_buff *skb, u16 vlan_tag)
 static int tg3_rx(struct tg3 *tp, int budget)
 {
        u32 work_mask;
-       u32 rx_rcb_ptr = tp->rx_rcb_ptr;
-       u16 hw_idx, sw_idx;
+       u32 sw_idx = tp->rx_rcb_ptr;
+       u16 hw_idx;
        int received;
 
        hw_idx = tp->hw_status->idx[0].rx_producer;
@@ -2696,7 +2719,6 @@ static int tg3_rx(struct tg3 *tp, int budget)
         * the opaque cookie.
         */
        rmb();
-       sw_idx = rx_rcb_ptr % TG3_RX_RCB_RING_SIZE(tp);
        work_mask = 0;
        received = 0;
        while (sw_idx != hw_idx && budget > 0) {
@@ -2801,14 +2823,19 @@ static int tg3_rx(struct tg3 *tp, int budget)
 next_pkt:
                (*post_ptr)++;
 next_pkt_nopost:
-               rx_rcb_ptr++;
-               sw_idx = rx_rcb_ptr % TG3_RX_RCB_RING_SIZE(tp);
+               sw_idx++;
+               sw_idx %= TG3_RX_RCB_RING_SIZE(tp);
+
+               /* Refresh hw_idx to see if there is new work */
+               if (sw_idx == hw_idx) {
+                       hw_idx = tp->hw_status->idx[0].rx_producer;
+                       rmb();
+               }
        }
 
        /* ACK the status ring. */
-       tp->rx_rcb_ptr = rx_rcb_ptr;
-       tw32_rx_mbox(MAILBOX_RCVRET_CON_IDX_0 + TG3_64BIT_REG_LOW,
-                    (rx_rcb_ptr % TG3_RX_RCB_RING_SIZE(tp)));
+       tp->rx_rcb_ptr = sw_idx;
+       tw32_rx_mbox(MAILBOX_RCVRET_CON_IDX_0 + TG3_64BIT_REG_LOW, sw_idx);
 
        /* Refill RX ring(s). */
        if (work_mask & RXD_OPAQUE_RING_STD) {
@@ -2887,26 +2914,6 @@ static int tg3_poll(struct net_device *netdev, int *budget)
        return (done ? 0 : 1);
 }
 
-static inline unsigned int tg3_has_work(struct net_device *dev, struct tg3 *tp)
-{
-       struct tg3_hw_status *sblk = tp->hw_status;
-       unsigned int work_exists = 0;
-
-       /* check for phy events */
-       if (!(tp->tg3_flags &
-             (TG3_FLAG_USE_LINKCHG_REG |
-              TG3_FLAG_POLL_SERDES))) {
-               if (sblk->status & SD_STATUS_LINK_CHG)
-                       work_exists = 1;
-       }
-       /* check for RX/TX work to do */
-       if (sblk->idx[0].tx_consumer != tp->tx_cons ||
-           sblk->idx[0].rx_producer != tp->rx_rcb_ptr)
-               work_exists = 1;
-
-       return work_exists;
-}
-
 /* MSI ISR - No need to check for interrupt sharing and no need to
  * flush status block and interrupt mailbox. PCI ordering rules
  * guarantee that MSI will arrive after the status block.
@@ -2930,7 +2937,7 @@ static irqreturn_t tg3_msi(int irq, void *dev_id, struct pt_regs *regs)
        tw32_mailbox(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW, 0x00000001);
        sblk->status &= ~SD_STATUS_UPDATED;
 
-       if (likely(tg3_has_work(dev, tp)))
+       if (likely(tg3_has_work(tp)))
                netif_rx_schedule(dev);         /* schedule NAPI poll */
        else {
                /* no work, re-enable interrupts
@@ -2977,7 +2984,7 @@ static irqreturn_t tg3_interrupt(int irq, void *dev_id, struct pt_regs *regs)
                tr32(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW);
                sblk->status &= ~SD_STATUS_UPDATED;
 
-               if (likely(tg3_has_work(dev, tp)))
+               if (likely(tg3_has_work(tp)))
                        netif_rx_schedule(dev);         /* schedule NAPI poll */
                else {
                        /* no work, shared interrupt perhaps?  re-enable
index d67be2587d4d33879d479f331ad4cb9d3ac33f75..3e7753b1071759f147851c69ed38e0317d13f994 100644 (file)
@@ -3427,7 +3427,7 @@ cpc_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        static int first_time = 1;
        ucchar cpc_rev_id;
-       int err = 0, eeprom_outdated = 0;
+       int err, eeprom_outdated = 0;
        ucshort device_id;
        pc300_t *card;
 
@@ -3439,15 +3439,21 @@ cpc_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 #endif
        }
 
+       if ((err = pci_enable_device(pdev)) < 0)
+               return err;
+
        card = (pc300_t *) kmalloc(sizeof(pc300_t), GFP_KERNEL);
        if (card == NULL) {
                printk("PC300 found at RAM 0x%08lx, "
                       "but could not allocate card structure.\n",
                       pci_resource_start(pdev, 3));
-               return -ENOMEM;
+               err = -ENOMEM;
+               goto err_disable_dev;
        }
        memset(card, 0, sizeof(pc300_t));
 
+       err = -ENODEV;
+
        /* read PCI configuration area */
        device_id = ent->device;
        card->hw.irq = pdev->irq;
@@ -3507,7 +3513,6 @@ cpc_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
                printk("PC300 found at RAM 0x%08x, "
                       "but could not allocate PLX mem region.\n",
                       card->hw.ramphys);
-               err = -ENODEV;
                goto err_release_io;
        }
        if (!request_mem_region(card->hw.ramphys, card->hw.alloc_ramsize,
@@ -3515,7 +3520,6 @@ cpc_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
                printk("PC300 found at RAM 0x%08x, "
                       "but could not allocate RAM mem region.\n",
                       card->hw.ramphys);
-               err = -ENODEV;
                goto err_release_plx;
        }
        if (!request_mem_region(card->hw.scaphys, card->hw.scasize,
@@ -3523,13 +3527,9 @@ cpc_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
                printk("PC300 found at RAM 0x%08x, "
                       "but could not allocate SCA mem region.\n",
                       card->hw.ramphys);
-               err = -ENODEV;
                goto err_release_ram;
        }
 
-       if ((err = pci_enable_device(pdev)) != 0)
-               goto err_release_sca;
-
        card->hw.plxbase = ioremap(card->hw.plxphys, card->hw.plxsize);
        card->hw.rambase = ioremap(card->hw.ramphys, card->hw.alloc_ramsize);
        card->hw.scabase = ioremap(card->hw.scaphys, card->hw.scasize);
@@ -3619,7 +3619,6 @@ err_io_unmap:
                iounmap(card->hw.falcbase);
                release_mem_region(card->hw.falcphys, card->hw.falcsize);
        }
-err_release_sca:
        release_mem_region(card->hw.scaphys, card->hw.scasize);
 err_release_ram:
        release_mem_region(card->hw.ramphys, card->hw.alloc_ramsize);
@@ -3628,7 +3627,9 @@ err_release_plx:
 err_release_io:
        release_region(card->hw.iophys, card->hw.iosize);
        kfree(card);
-       return -ENODEV;
+err_disable_dev:
+       pci_disable_device(pdev);
+       return err;
 }
 
 static void __devexit cpc_remove_one(struct pci_dev *pdev)
@@ -3662,6 +3663,7 @@ static void __devexit cpc_remove_one(struct pci_dev *pdev)
                if (card->hw.irq)
                        free_irq(card->hw.irq, card);
                kfree(card);
+               pci_disable_device(pdev);
        }
 }
 
index 9abedeaa567c09d178c07c3ec59efb4a77285572..a72006c08f2befc1496eec4b9c72cb850ff4f040 100644 (file)
@@ -18,13 +18,13 @@ unsigned long fs_buffer_size = 131072;
 unsigned long fs_cpu_buffer_size = 8192;
 unsigned long fs_buffer_watershed = 32768; /* FIXME: tune */
 
-static ssize_t depth_read(struct file * file, char * buf, size_t count, loff_t * offset)
+static ssize_t depth_read(struct file * file, char __user * buf, size_t count, loff_t * offset)
 {
        return oprofilefs_ulong_to_user(backtrace_depth, buf, count, offset);
 }
 
 
-static ssize_t depth_write(struct file * file, char const * buf, size_t count, loff_t * offset)
+static ssize_t depth_write(struct file * file, char const __user * buf, size_t count, loff_t * offset)
 {
        unsigned long val;
        int retval;
index 891f97f7881e233ca9e58e68ecf19c763b1b9875..f6900538be9084b2c368391172d337ba4e75d6f6 100644 (file)
@@ -1147,7 +1147,7 @@ static int __init esp_detect(struct scsi_host_template *tpnt)
        static struct sbus_dev esp_dev;
        int esps_in_use = 0;
 
-       espchain = 0;
+       espchain = NULL;
 
        if (sun4_esp_physaddr) {
                memset (&esp_dev, 0, sizeof(esp_dev));
@@ -2513,7 +2513,7 @@ static inline void esp_reconnect(struct esp *esp, struct scsi_cmnd *sp)
                ESPLOG(("esp%d: Weird, being reselected but disconnected "
                        "command queue is empty.\n", esp->esp_id));
        esp->snip = 0;
-       esp->current_SC = 0;
+       esp->current_SC = NULL;
        sp->SCp.phase = not_issued;
        append_SC(&esp->issue_SC, sp);
 }
@@ -4148,7 +4148,7 @@ static int esp_work_bus(struct esp *esp)
 }
 
 static espfunc_t isvc_vector[] = {
-       0,
+       NULL,
        esp_do_phase_determine,
        esp_do_resetbus,
        esp_finish_reset,
index 7bb0a2e56743c320fa49ac0567c64ebebe717118..c01b7191fcf59cabfbd6f0b56238ef81665d8f25 100644 (file)
@@ -45,7 +45,7 @@ static struct ctrl_inquiry {
        Scsi_Cmnd cmd;
        char inquiry[256];
        fc_channel *fc;
-} *fcs __initdata = { 0 };
+} *fcs __initdata;
 static int fcscount __initdata = 0;
 static atomic_t fcss __initdata = ATOMIC_INIT(0);
 DECLARE_MUTEX_LOCKED(fc_sem);
index 0e75fbb77b6b62aded55bc6188861a81c82bb69c..32583bbb487f876dfe100944935caada140011f7 100644 (file)
@@ -85,7 +85,7 @@ qla2x00_unlock_nvram_access(scsi_qla_host_t *ha)
 void
 qla2x00_release_nvram_protection(scsi_qla_host_t *ha)
 {
-       device_reg_t *reg;
+       device_reg_t __iomem *reg;
        uint32_t word;
 
        reg = ha->iobase;
index f8504b0adebcd5e10fca98274c0eb459ef357481..33fbda79f3507f83f00ca3b9c8f9167f6500c136 100644 (file)
@@ -110,7 +110,7 @@ static irqreturn_t serial21285_rx_chars(int irq, void *dev_id, struct pt_regs *r
                port->icount.rx++;
 
                rxs = *CSR_RXSTAT | RXSTAT_DUMMY_READ;
-               if (rxs & RXSTAT_ANYERR) {
+               if (unlikely(rxs & RXSTAT_ANYERR)) {
                        if (rxs & RXSTAT_PARITY)
                                port->icount.parity++;
                        else if (rxs & RXSTAT_FRAME)
index b8d51eb56bffdf01cc6b96c85fb043e9eb79b47a..4315afe9c080a6beb1103643e6f3509a28f31cd2 100644 (file)
@@ -9,15 +9,15 @@
 #include <linux/init.h>
 #include <linux/string.h>
 #include <linux/kernel.h>
-#include <linux/tty.h>
 #include <linux/serial.h>
-#include <linux/serialP.h>
 #include <linux/serial_core.h>
 #include <linux/delay.h>
 #include <linux/dio.h>
 #include <linux/console.h>
 #include <asm/io.h>
 
+#include "8250.h"
+
 #if !defined(CONFIG_HPDCA) && !defined(CONFIG_HPAPCI)
 #warning CONFIG_8250 defined but neither CONFIG_HPDCA nor CONFIG_HPAPCI defined, are you sure?
 #endif
@@ -163,7 +163,7 @@ int __init hp300_setup_serial_console(void)
 static int __devinit hpdca_init_one(struct dio_dev *d,
                                 const struct dio_device_id *ent)
 {
-       struct serial_struct serial_req;
+       struct uart_port port;
        int line;
 
 #ifdef CONFIG_SERIAL_8250_CONSOLE
@@ -172,21 +172,22 @@ static int __devinit hpdca_init_one(struct dio_dev *d,
                return 0;
        }
 #endif
-       memset(&serial_req, 0, sizeof(struct serial_struct));
+       memset(&port, 0, sizeof(struct uart_port));
 
        /* Memory mapped I/O */
-       serial_req.io_type = SERIAL_IO_MEM;
-       serial_req.flags = UPF_SKIP_TEST | UPF_SHARE_IRQ | UPF_BOOT_AUTOCONF;
-       serial_req.irq = d->ipl;
-       serial_req.baud_base = HPDCA_BAUD_BASE;
-       serial_req.iomap_base = (d->resource.start + UART_OFFSET);
-       serial_req.iomem_base = (char *)(serial_req.iomap_base + DIO_VIRADDRBASE);
-       serial_req.iomem_reg_shift = 1;
-       line = register_serial(&serial_req);
+       port.iotype = UPIO_MEM;
+       port.flags = UPF_SKIP_TEST | UPF_SHARE_IRQ | UPF_BOOT_AUTOCONF;
+       port.irq = d->ipl;
+       port.uartclk = HPDCA_BAUD_BASE * 16;
+       port.mapbase = (d->resource.start + UART_OFFSET);
+       port.membase = (char *)(port.mapbase + DIO_VIRADDRBASE);
+       port.regshift = 1;
+       port.dev = &d->dev;
+       line = serial8250_register_port(&port);
 
        if (line < 0) {
                printk(KERN_NOTICE "8250_hp300: register_serial() DCA scode %d"
-                      " irq %d failed\n", d->scode, serial_req.irq);
+                      " irq %d failed\n", d->scode, port.irq);
                return -ENOMEM;
        }
 
@@ -209,7 +210,7 @@ static int __init hp300_8250_init(void)
 #ifdef CONFIG_HPAPCI
        int line;
        unsigned long base;
-       struct serial_struct serial_req;
+       struct uart_port uport;
        struct hp300_port *port;
        int i;
 #endif
@@ -251,25 +252,25 @@ static int __init hp300_8250_init(void)
                if (!port)
                        return -ENOMEM;
 
-               memset(&serial_req, 0, sizeof(struct serial_struct));
+               memset(&uport, 0, sizeof(struct uart_port));
 
                base = (FRODO_BASE + FRODO_APCI_OFFSET(i));
 
                /* Memory mapped I/O */
-               serial_req.io_type = SERIAL_IO_MEM;
-               serial_req.flags = UPF_SKIP_TEST | UPF_SHARE_IRQ | UPF_BOOT_AUTOCONF;
+               uport.iotype = UPIO_MEM;
+               uport.flags = UPF_SKIP_TEST | UPF_SHARE_IRQ | UPF_BOOT_AUTOCONF;
                /* XXX - no interrupt support yet */
-               serial_req.irq = 0;
-               serial_req.baud_base = HPAPCI_BAUD_BASE;
-               serial_req.iomap_base = base;
-               serial_req.iomem_base = (char *)(serial_req.iomap_base + DIO_VIRADDRBASE);
-               serial_req.iomem_reg_shift = 2;
+               uport.irq = 0;
+               uport.uartclk = HPAPCI_BAUD_BASE * 16;
+               uport.mapbase = base;
+               uport.membase = (char *)(base + DIO_VIRADDRBASE);
+               uport.regshift = 2;
 
-               line = register_serial(&serial_req);
+               line = serial8250_register_port(&uport);
 
                if (line < 0) {
                        printk(KERN_NOTICE "8250_hp300: register_serial() APCI %d"
-                              " irq %d failed\n", i, serial_req.irq);
+                              " irq %d failed\n", i, uport.irq);
                        kfree(port);
                        continue;
                }
@@ -299,7 +300,7 @@ static void __devexit hpdca_remove_one(struct dio_dev *d)
                /* Disable board-interrupts */
                out_8(d->resource.start + DIO_VIRADDRBASE + DCA_IC, 0);
        }
-       unregister_serial(line);
+       serial8250_unregister_port(line);
 }
 #endif
 
@@ -309,7 +310,7 @@ static void __exit hp300_8250_exit(void)
        struct hp300_port *port, *to_free;
 
        for (port = hp300_ports; port; ) {
-               unregister_serial(port->line);
+               serial8250_unregister_port(port->line);
                to_free = port;
                port = port->next;
                kfree(to_free);
index 484f6fb900b51feb5a90cb765aa1cd99da951f54..f2a5e2933c4709b2b56fc4167e041b0e366e5782 100644 (file)
@@ -172,7 +172,7 @@ pl010_rx_chars(struct uart_port *port)
                 * out of the main execution path
                 */
                rsr = UART_GET_RSR(port) | UART_DUMMY_RSR_RX;
-               if (rsr & UART01x_RSR_ANY) {
+               if (unlikely(rsr & UART01x_RSR_ANY)) {
                        if (rsr & UART01x_RSR_BE) {
                                rsr &= ~(UART01x_RSR_FE | UART01x_RSR_PE);
                                port->icount.brk++;
index ff658a830f3401ea9c0f3932abc2ed12599acb5e..d5cbef3fe8b6adb42cf900aaffbec87494c8fdf8 100644 (file)
@@ -137,7 +137,7 @@ pl011_rx_chars(struct uart_amba_port *uap)
                 * out of the main execution path
                 */
                rsr = readw(uap->port.membase + UART01x_RSR) | UART_DUMMY_RSR_RX;
-               if (rsr & UART01x_RSR_ANY) {
+               if (unlikely(rsr & UART01x_RSR_ANY)) {
                        if (rsr & UART01x_RSR_BE) {
                                rsr &= ~(UART01x_RSR_FE | UART01x_RSR_PE);
                                uap->port.icount.brk++;
index 16592fae47f3c5e9a06d00b038f074c7f328ca5c..6242f3090a96f76372ad8e35367bbbc790e68cf0 100644 (file)
@@ -116,54 +116,43 @@ static irqreturn_t clps711xuart_int_rx(int irq, void *dev_id, struct pt_regs *re
                 * Note that the error handling code is
                 * out of the main execution path
                 */
-               if (ch & UART_ANY_ERR)
-                       goto handle_error;
+               if (unlikely(ch & UART_ANY_ERR)) {
+                       if (ch & UARTDR_PARERR)
+                               port->icount.parity++;
+                       else if (ch & UARTDR_FRMERR)
+                               port->icount.frame++;
+                       if (ch & UARTDR_OVERR)
+                               port->icount.overrun++;
 
-               if (uart_handle_sysrq_char(port, ch, regs))
-                       goto ignore_char;
+                       ch &= port->read_status_mask;
 
-       error_return:
-               tty_insert_flip_char(tty, ch, flg);
-       ignore_char:
-               status = clps_readl(SYSFLG(port));
-       }
- out:
-       tty_flip_buffer_push(tty);
-       return IRQ_HANDLED;
+                       if (ch & UARTDR_PARERR)
+                               flg = TTY_PARITY;
+                       else if (ch & UARTDR_FRMERR)
+                               flg = TTY_FRAME;
 
- handle_error:
-       if (ch & UARTDR_PARERR)
-               port->icount.parity++;
-       else if (ch & UARTDR_FRMERR)
-               port->icount.frame++;
-       if (ch & UARTDR_OVERR)
-               port->icount.overrun++;
-
-       if (ch & port->ignore_status_mask) {
-               if (++ignored > 100)
-                       goto out;
-               goto ignore_char;
-       }
-       ch &= port->read_status_mask;
+#ifdef SUPPORT_SYSRQ
+                       port->sysrq = 0;
+#endif
+               }
 
-       if (ch & UARTDR_PARERR)
-               flg = TTY_PARITY;
-       else if (ch & UARTDR_FRMERR)
-               flg = TTY_FRAME;
+               if (uart_handle_sysrq_char(port, ch, regs))
+                       goto ignore_char;
 
-       if (ch & UARTDR_OVERR) {
                /*
                 * CHECK: does overrun affect the current character?
                 * ASSUMPTION: it does not.
                 */
-               tty_insert_flip_char(tty, ch, flg);
-               ch = 0;
-               flg = TTY_OVERRUN;
+               if ((ch & port->ignore_status_mask & ~RXSTAT_OVERRUN) == 0)
+                       tty_insert_flip_char(tty, ch, flg);
+               if ((ch & ~port->ignore_status_mask & RXSTAT_OVERRUN) == 0)
+                       tty_insert_flip_char(tty, 0, TTY_OVERRUN);
+
+       ignore_char:
+               status = clps_readl(SYSFLG(port));
        }
-#ifdef SUPPORT_SYSRQ
-       port->sysrq = 0;
-#endif
-       goto error_return;
+       tty_flip_buffer_push(tty);
+       return IRQ_HANDLED;
 }
 
 static irqreturn_t clps711xuart_int_tx(int irq, void *dev_id, struct pt_regs *regs)
index d0dfc3cf9245ab0f29d355b2ec8943e99733f6d4..a8314aee2ab8b7a32e8e67f2f6e0c2e82c8f39b4 100644 (file)
@@ -329,8 +329,8 @@ mpsc_sdma_stop(struct mpsc_port_info *pi)
        mpsc_sdma_cmd(pi, SDMA_SDCM_AR | SDMA_SDCM_AT);
 
        /* Clear the SDMA current and first TX and RX pointers */
-       mpsc_sdma_set_tx_ring(pi, 0);
-       mpsc_sdma_set_rx_ring(pi, 0);
+       mpsc_sdma_set_tx_ring(pi, NULL);
+       mpsc_sdma_set_rx_ring(pi, NULL);
 
        /* Disable interrupts */
        mpsc_sdma_intr_mask(pi, 0xf);
@@ -1540,8 +1540,8 @@ mpsc_shared_unmap_regs(void)
                        MPSC_SDMA_INTR_REG_BLOCK_SIZE);
        }
 
-       mpsc_shared_regs.mpsc_routing_base = 0;
-       mpsc_shared_regs.sdma_intr_base = 0;
+       mpsc_shared_regs.mpsc_routing_base = NULL;
+       mpsc_shared_regs.sdma_intr_base = NULL;
 
        mpsc_shared_regs.mpsc_routing_base_p = 0;
        mpsc_shared_regs.sdma_intr_base_p = 0;
@@ -1678,9 +1678,9 @@ mpsc_drv_unmap_regs(struct mpsc_port_info *pi)
                release_mem_region(pi->brg_base_p, MPSC_BRG_REG_BLOCK_SIZE);
        }
 
-       pi->mpsc_base = 0;
-       pi->sdma_base = 0;
-       pi->brg_base = 0;
+       pi->mpsc_base = NULL;
+       pi->sdma_base = NULL;
+       pi->brg_base = NULL;
 
        pi->mpsc_base_p = 0;
        pi->sdma_base_p = 0;
index 1f7294b7095f613e82764664bc9f9964b3b402be..678dbcf06c8faaf5fe0452042375d31d37aff857 100644 (file)
@@ -83,8 +83,8 @@ struct mpsc_shared_regs {
        phys_addr_t mpsc_routing_base_p;
        phys_addr_t sdma_intr_base_p;
 
-       void *mpsc_routing_base;
-       void *sdma_intr_base;
+       void __iomem *mpsc_routing_base;
+       void __iomem *sdma_intr_base;
 
        u32 MPSC_MRR_m;
        u32 MPSC_RCRR_m;
@@ -120,9 +120,9 @@ struct mpsc_port_info {
        phys_addr_t brg_base_p;
 
        /* Virtual addresses of various blocks of registers (from platform) */
-       void *mpsc_base;
-       void *sdma_base;
-       void *brg_base;
+       void __iomem *mpsc_base;
+       void __iomem *sdma_base;
+       void __iomem *brg_base;
 
        /* Descriptor ring and buffer allocations */
        void *dma_region;
index bd6782aeb8318367d7fb06f42593f5b5a6b5187e..435750d40a471001c860ba0b21b0443901534eab 100644 (file)
@@ -364,7 +364,7 @@ s3c24xx_serial_rx_chars(int irq, void *dev_id, struct pt_regs *regs)
                flag = TTY_NORMAL;
                port->icount.rx++;
 
-               if (uerstat & S3C2410_UERSTAT_ANY) {
+               if (unlikely(uerstat & S3C2410_UERSTAT_ANY)) {
                        dbg("rxerr: port ch=0x%02x, rxs=0x%08x\n",
                            ch, uerstat);
 
index 086065210d1e07b3cb24a1f41596e282d920ed50..157218bc6c6fba4ddbce2e2294d381903a620eb5 100644 (file)
@@ -214,56 +214,39 @@ sa1100_rx_chars(struct sa1100_port *sport, struct pt_regs *regs)
                 * note that the error handling code is
                 * out of the main execution path
                 */
-               if (status & UTSR1_TO_SM(UTSR1_PRE | UTSR1_FRE | UTSR1_ROR))
-                       goto handle_error;
+               if (status & UTSR1_TO_SM(UTSR1_PRE | UTSR1_FRE | UTSR1_ROR)) {
+                       if (status & UTSR1_TO_SM(UTSR1_PRE))
+                               sport->port.icount.parity++;
+                       else if (status & UTSR1_TO_SM(UTSR1_FRE))
+                               sport->port.icount.frame++;
+                       if (status & UTSR1_TO_SM(UTSR1_ROR))
+                               sport->port.icount.overrun++;
+
+                       status &= sport->port.read_status_mask;
+
+                       if (status & UTSR1_TO_SM(UTSR1_PRE))
+                               flg = TTY_PARITY;
+                       else if (status & UTSR1_TO_SM(UTSR1_FRE))
+                               flg = TTY_FRAME;
+
+#ifdef SUPPORT_SYSRQ
+                       sport->port.sysrq = 0;
+#endif
+               }
 
                if (uart_handle_sysrq_char(&sport->port, ch, regs))
                        goto ignore_char;
 
-       error_return:
-               tty_insert_flip_char(tty, ch, flg);
+               if ((status & port->ignore_status_mask & ~UTSR1_TO_SM(UTSR1_ROR)) == 0)
+                       tty_insert_flip_char(tty, ch, flg);
+               if (status & ~port->ignore_status_mask & UTSR1_TO_SM(UTSR1_ROR))
+                       tty_insert_flip_char(tty, 0, TTY_OVERRUN);
+
        ignore_char:
                status = UTSR1_TO_SM(UART_GET_UTSR1(sport)) |
                         UTSR0_TO_SM(UART_GET_UTSR0(sport));
        }
- out:
        tty_flip_buffer_push(tty);
-       return;
-
- handle_error:
-       if (status & UTSR1_TO_SM(UTSR1_PRE))
-               sport->port.icount.parity++;
-       else if (status & UTSR1_TO_SM(UTSR1_FRE))
-               sport->port.icount.frame++;
-       if (status & UTSR1_TO_SM(UTSR1_ROR))
-               sport->port.icount.overrun++;
-
-       if (status & sport->port.ignore_status_mask) {
-               if (++ignored > 100)
-                       goto out;
-               goto ignore_char;
-       }
-
-       status &= sport->port.read_status_mask;
-
-       if (status & UTSR1_TO_SM(UTSR1_PRE))
-               flg = TTY_PARITY;
-       else if (status & UTSR1_TO_SM(UTSR1_FRE))
-               flg = TTY_FRAME;
-
-       if (status & UTSR1_TO_SM(UTSR1_ROR)) {
-               /*
-                * overrun does *not* affect the character
-                * we read from the FIFO
-                */
-               tty_insert_flip_char(tty, ch, flg);
-               ch = 0;
-               flg = TTY_OVERRUN;
-       }
-#ifdef SUPPORT_SYSRQ
-       sport->port.sysrq = 0;
-#endif
-       goto error_return;
 }
 
 static void sa1100_tx_chars(struct sa1100_port *sport)
index 4ce3a41f16116478d5b8664274ebbff00e763bda..85cfa08d3bad7955bb79279f73be920e332fb03f 100644 (file)
@@ -162,7 +162,7 @@ lh7a40xuart_rx_chars (struct uart_port* port)
                flag = TTY_NORMAL;
                ++port->icount.rx;
 
-               if (data & RxError) {   /* Quick check, short-circuit */
+               if (unlikely(data & RxError)) { /* Quick check, short-circuit */
                        if (data & RxBreak) {
                                data &= ~(RxFramingError | RxParityError);
                                ++port->icount.brk;
index c231b4bef314284a168fedb6c5f6c47aec5084fc..25cf7e9eccfaadab58c4eb596494cec910cfbdbb 100644 (file)
@@ -611,11 +611,10 @@ static int usb_hotplug (struct device *dev, char **envp, int num_envp,
 
                if (add_hotplug_env_var(envp, num_envp, &i,
                                        buffer, buffer_size, &length,
-                                       "MODALIAS=usb:v%04Xp%04Xdl%04Xdh%04Xdc%02Xdsc%02Xdp%02Xic%02Xisc%02Xip%02X",
+                                       "MODALIAS=usb:v%04Xp%04Xd%04Xdc%02Xdsc%02Xdp%02Xic%02Xisc%02Xip%02X",
                                        le16_to_cpu(usb_dev->descriptor.idVendor),
                                        le16_to_cpu(usb_dev->descriptor.idProduct),
                                        le16_to_cpu(usb_dev->descriptor.bcdDevice),
-                                       le16_to_cpu(usb_dev->descriptor.bcdDevice),
                                        usb_dev->descriptor.bDeviceClass,
                                        usb_dev->descriptor.bDeviceSubClass,
                                        usb_dev->descriptor.bDeviceProtocol,
@@ -626,11 +625,10 @@ static int usb_hotplug (struct device *dev, char **envp, int num_envp,
        } else {
                if (add_hotplug_env_var(envp, num_envp, &i,
                                        buffer, buffer_size, &length,
-                                       "MODALIAS=usb:v%04Xp%04Xdl%04Xdh%04Xdc%02Xdsc%02Xdp%02Xic*isc*ip*",
+                                       "MODALIAS=usb:v%04Xp%04Xd%04Xdc%02Xdsc%02Xdp%02Xic*isc*ip*",
                                        le16_to_cpu(usb_dev->descriptor.idVendor),
                                        le16_to_cpu(usb_dev->descriptor.idProduct),
                                        le16_to_cpu(usb_dev->descriptor.bcdDevice),
-                                       le16_to_cpu(usb_dev->descriptor.bcdDevice),
                                        usb_dev->descriptor.bDeviceClass,
                                        usb_dev->descriptor.bDeviceSubClass,
                                        usb_dev->descriptor.bDeviceProtocol))
index cab89a970c7ff76b5d608bab1ad1d92cc94799be..7d21a4f5c4254a1cc4a0085888720cb87efbb576 100644 (file)
@@ -335,7 +335,7 @@ static int mts_scsi_abort (Scsi_Cmnd *srb)
 
        mts_urb_abort(desc);
 
-       return FAILURE;
+       return FAILED;
 }
 
 static int mts_scsi_host_reset (Scsi_Cmnd *srb)
index 355add5c29f57edb4caf030bd390e2b07f9790ec..860df26323b163ede689f4b259ff9dcef19e405c 100644 (file)
@@ -619,7 +619,7 @@ static void ati_remote_delete(struct ati_remote *ati_remote)
                
        if (ati_remote->outbuf)
                usb_buffer_free(ati_remote->udev, DATA_BUFSIZE, 
-                               ati_remote->inbuf, ati_remote->outbuf_dma);
+                               ati_remote->outbuf, ati_remote->outbuf_dma);
        
        if (ati_remote->irq_urb)
                usb_free_urb(ati_remote->irq_urb);
index 01514b0551b862d315a0d1723027ef6cb98edd8c..7038fb9d1ced4290f870cbd682ee5089a494fb3a 100644 (file)
@@ -133,7 +133,8 @@ resubmit:
                                kbd->usbdev->devpath, i);
 }
 
-int usb_kbd_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
+static int usb_kbd_event(struct input_dev *dev, unsigned int type,
+                        unsigned int code, int value)
 {
        struct usb_kbd *kbd = dev->private;
 
index 26aa914bc541a1d5761d08a22cc666cc0393258b..42352f531bc0a8debe64ac3de12b632bcd70d06b 100644 (file)
@@ -418,6 +418,44 @@ static inline int set_video_mode_Kiara(struct pwc_device *pdev, int size, int fr
 
 
 
+static void pwc_set_image_buffer_size(struct pwc_device *pdev)
+{
+       int i, factor = 0, filler = 0;
+
+       /* for PALETTE_YUV420P */
+       switch(pdev->vpalette)
+       {
+       case VIDEO_PALETTE_YUV420P:
+               factor = 6;
+               filler = 128;
+               break;
+       case VIDEO_PALETTE_RAW:
+               factor = 6; /* can be uncompressed YUV420P */
+               filler = 0;
+               break;
+       }
+
+       /* Set sizes in bytes */
+       pdev->image.size = pdev->image.x * pdev->image.y * factor / 4;
+       pdev->view.size  = pdev->view.x  * pdev->view.y  * factor / 4;
+
+       /* Align offset, or you'll get some very weird results in
+          YUV420 mode... x must be multiple of 4 (to get the Y's in
+          place), and y even (or you'll mixup U & V). This is less of a
+          problem for YUV420P.
+        */
+       pdev->offset.x = ((pdev->view.x - pdev->image.x) / 2) & 0xFFFC;
+       pdev->offset.y = ((pdev->view.y - pdev->image.y) / 2) & 0xFFFE;
+
+       /* Fill buffers with gray or black */
+       for (i = 0; i < MAX_IMAGES; i++) {
+               if (pdev->image_ptr[i] != NULL)
+                       memset(pdev->image_ptr[i], filler, pdev->view.size);
+       }
+}
+
+
+
 /**
    @pdev: device structure
    @width: viewport width
@@ -475,44 +513,6 @@ int pwc_set_video_mode(struct pwc_device *pdev, int width, int height, int frame
 }
 
 
-void pwc_set_image_buffer_size(struct pwc_device *pdev)
-{
-       int i, factor = 0, filler = 0;
-
-       /* for PALETTE_YUV420P */
-       switch(pdev->vpalette)
-       {
-       case VIDEO_PALETTE_YUV420P:
-               factor = 6;
-               filler = 128;
-               break;
-       case VIDEO_PALETTE_RAW:
-               factor = 6; /* can be uncompressed YUV420P */
-               filler = 0;
-               break;
-       }
-
-       /* Set sizes in bytes */
-       pdev->image.size = pdev->image.x * pdev->image.y * factor / 4;
-       pdev->view.size  = pdev->view.x  * pdev->view.y  * factor / 4;
-
-       /* Align offset, or you'll get some very weird results in
-          YUV420 mode... x must be multiple of 4 (to get the Y's in
-          place), and y even (or you'll mixup U & V). This is less of a
-          problem for YUV420P.
-        */
-       pdev->offset.x = ((pdev->view.x - pdev->image.x) / 2) & 0xFFFC;
-       pdev->offset.y = ((pdev->view.y - pdev->image.y) / 2) & 0xFFFE;
-
-       /* Fill buffers with gray or black */
-       for (i = 0; i < MAX_IMAGES; i++) {
-               if (pdev->image_ptr[i] != NULL)
-                       memset(pdev->image_ptr[i], filler, pdev->view.size);
-       }
-}
-
-
-
 /* BRIGHTNESS */
 
 int pwc_get_brightness(struct pwc_device *pdev)
@@ -949,7 +949,7 @@ int pwc_set_leds(struct pwc_device *pdev, int on_value, int off_value)
        return SendControlMsg(SET_STATUS_CTL, LED_FORMATTER, 2);
 }
 
-int pwc_get_leds(struct pwc_device *pdev, int *on_value, int *off_value)
+static int pwc_get_leds(struct pwc_device *pdev, int *on_value, int *off_value)
 {
        unsigned char buf[2];
        int ret;
index 100a5a4f03a325198b14e687efafd4b8203ef250..c53e2263b7fbe09c3f70adeee1631b7adcf30dd9 100644 (file)
@@ -129,7 +129,7 @@ static int default_mbufs = 2;       /* Default number of mmap() buffers */
        int pwc_trace = TRACE_MODULE | TRACE_FLOW | TRACE_PWCX;
 static int power_save = 0;
 static int led_on = 100, led_off = 0; /* defaults to LED that is on while in use */
-       int pwc_preferred_compression = 2; /* 0..3 = uncompressed..high */
+static int pwc_preferred_compression = 2; /* 0..3 = uncompressed..high */
 static struct {
        int type;
        char serial_number[30];
@@ -322,7 +322,7 @@ static int pwc_allocate_buffers(struct pwc_device *pdev)
          case 730:
          case 740:
          case 750:
-           Trace(TRACE_MEMORY,"private_data(%Zd)\n",sizeof(struct pwc_dec23_private));
+           Trace(TRACE_MEMORY,"private_data(%zu)\n",sizeof(struct pwc_dec23_private));
            kbuf = kmalloc(sizeof(struct pwc_dec23_private), GFP_KERNEL);       /* Timon & Kiara */
            break;
          case 645:
@@ -1179,7 +1179,7 @@ static ssize_t pwc_video_read(struct file *file, char __user * buf,
        DECLARE_WAITQUEUE(wait, current);
         int bytes_to_read;
 
-       Trace(TRACE_READ, "video_read(0x%p, %p, %Zd) called.\n", vdev, buf, count);
+       Trace(TRACE_READ, "video_read(0x%p, %p, %zu) called.\n", vdev, buf, count);
        if (vdev == NULL)
                return -EFAULT;
        pdev = vdev->priv;
index 53b516d29cf56980e56ee1c2180607b10b72a9af..267869dab185ad5146e8cab0473a0960528acc41 100644 (file)
@@ -226,9 +226,8 @@ struct pwc_device
 extern "C" {
 #endif
 
-/* Global variables */
+/* Global variable */
 extern int pwc_trace;
-extern int pwc_preferred_compression;
 
 /** functions in pwc-if.c */
 int pwc_try_video_mode(struct pwc_device *pdev, int width, int height, int new_fps, int new_compression, int new_snapshot);
@@ -243,8 +242,6 @@ void pwc_construct(struct pwc_device *pdev);
 /** Functions in pwc-ctrl.c */
 /* Request a certain video mode. Returns < 0 if not possible */
 extern int pwc_set_video_mode(struct pwc_device *pdev, int width, int height, int frames, int compression, int snapshot);
-/* Calculate the number of bytes per image (not frame) */
-extern void pwc_set_image_buffer_size(struct pwc_device *pdev);
 
 /* Various controls; should be obvious. Value 0..65535, or < 0 on error */
 extern int pwc_get_brightness(struct pwc_device *pdev);
@@ -256,7 +253,6 @@ extern int pwc_set_gamma(struct pwc_device *pdev, int value);
 extern int pwc_get_saturation(struct pwc_device *pdev);
 extern int pwc_set_saturation(struct pwc_device *pdev, int value);
 extern int pwc_set_leds(struct pwc_device *pdev, int on_value, int off_value);
-extern int pwc_get_leds(struct pwc_device *pdev, int *on_value, int *off_value);
 extern int pwc_get_cmos_sensor(struct pwc_device *pdev, int *sensor);
 
 /* Power down or up the camera; not supported by all models */
index 898401cf7dcc51e8c246f25d24152e23e98fc984..31d57400d5bef72d6bf176a84477fd4a2903f40d 100644 (file)
@@ -429,7 +429,7 @@ sn9c102_i2c_try_read(struct sn9c102_device* cam,
 }
 
 
-int 
+static int 
 sn9c102_i2c_try_write(struct sn9c102_device* cam,
                       struct sn9c102_sensor* sensor, u8 address, u8 value)
 {
@@ -785,7 +785,7 @@ static int sn9c102_stop_transfer(struct sn9c102_device* cam)
 }
 
 
-int sn9c102_stream_interrupt(struct sn9c102_device* cam)
+static int sn9c102_stream_interrupt(struct sn9c102_device* cam)
 {
        int err = 0;
 
index 16f7483559f00fd0d47c6b4e6db058320e397bec..6a7adebcb4bfabc4d26d7b5805f46decc9a4f4cb 100644 (file)
@@ -145,8 +145,6 @@ static const struct usb_device_id sn9c102_id_table[] = {                      \
 */
 
 /* The "try" I2C I/O versions are used when probing the sensor */
-extern int sn9c102_i2c_try_write(struct sn9c102_device*,struct sn9c102_sensor*,
-                                 u8 address, u8 value);
 extern int sn9c102_i2c_try_read(struct sn9c102_device*,struct sn9c102_sensor*,
                                 u8 address);
 
index 57b82d53a9401ec1a990997e9f28ec349699b765..2fd12264fd53f24e0ec6912c02ce1c9a895fd964 100644 (file)
@@ -983,7 +983,7 @@ static int sisusb_write_mem_bulk(struct sisusb_usb_data *sisusb, u32 addr,
                                msgcount++;
                                if (msgcount < 500)
                                        printk(KERN_ERR
-                                               "sisusbvga[%d]: Wrote %Zd of "
+                                               "sisusbvga[%d]: Wrote %zd of "
                                                "%d bytes, error %d\n",
                                                sisusb->minor, *bytes_written,
                                                length, ret);
@@ -3105,6 +3105,7 @@ static void sisusb_disconnect(struct usb_interface *intf)
 static struct usb_device_id sisusb_table [] = {
        { USB_DEVICE(0x0711, 0x0900) },
        { USB_DEVICE(0x182d, 0x021c) },
+       { USB_DEVICE(0x182d, 0x0269) },
        { }
 };
 
index a02be795d63e7ab898aab82fe985c3969b86aaf4..d976790312aaeb1f6f2a319aa211cc23d3ab6469 100644 (file)
@@ -1388,11 +1388,11 @@ static int pegasus_resume (struct usb_interface *intf)
        if (netif_running(pegasus->net)) {
                pegasus->rx_urb->status = 0;
                pegasus->rx_urb->actual_length = 0;
-               read_bulk_callback(pegasus->rx_urb, 0);
+               read_bulk_callback(pegasus->rx_urb, NULL);
 
                pegasus->intr_urb->status = 0;
                pegasus->intr_urb->actual_length = 0;
-               intr_callback(pegasus->intr_urb, 0);
+               intr_callback(pegasus->intr_urb, NULL);
 
                queue_delayed_work(pegasus_workqueue, &pegasus->carrier_check,
                                        CARRIER_CHECK_DELAY);
index bbaef047d53255e9fdeba80a9136e5057e39b50d..a45ea7c97356eed90b8d6595f639ae7c3c809811 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * USB Networking Links
- * Copyright (C) 2000-2003 by David Brownell <dbrownell@users.sourceforge.net>
+ * Copyright (C) 2000-2005 by David Brownell <dbrownell@users.sourceforge.net>
  * Copyright (C) 2002 Pavel Machek <pavel@ucw.cz>
  * Copyright (C) 2003-2005 David Hollis <dhollis@davehollis.com>
  * Copyright (C) 2005 Phil Chang <pchang23@sbcglobal.net>
@@ -210,6 +210,7 @@ struct usbnet {
 #              define EVENT_RX_HALT    1
 #              define EVENT_RX_MEMORY  2
 #              define EVENT_STS_SPLIT  3
+#              define EVENT_LINK_RESET 4
 };
 
 // device-specific info used by the driver
@@ -243,6 +244,9 @@ struct driver_info {
        /* for status polling */
        void    (*status)(struct usbnet *, struct urb *);
 
+       /* link reset handling, called from defer_kevent */
+       int     (*link_reset)(struct usbnet *);
+
        /* fixup rx packet (strip framing) */
        int     (*rx_fixup)(struct usbnet *dev, struct sk_buff *skb);
 
@@ -304,6 +308,7 @@ static void usbnet_get_drvinfo (struct net_device *, struct ethtool_drvinfo *);
 static u32 usbnet_get_link (struct net_device *);
 static u32 usbnet_get_msglevel (struct net_device *);
 static void usbnet_set_msglevel (struct net_device *, u32);
+static void defer_kevent (struct usbnet *, int);
 
 /* mostly for PDA style devices, which are always connected if present */
 static int always_connected (struct usbnet *dev)
@@ -426,7 +431,7 @@ static void skb_return (struct usbnet *dev, struct sk_buff *skb)
        dev->stats.rx_bytes += skb->len;
 
        if (netif_msg_rx_status (dev))
-               devdbg (dev, "< rx, len %zd, type 0x%x",
+               devdbg (dev, "< rx, len %zu, type 0x%x",
                        skb->len + sizeof (struct ethhdr), skb->protocol);
        memset (skb->cb, 0, sizeof (struct skb_data));
        status = netif_rx (skb);
@@ -501,6 +506,7 @@ static const struct driver_info     an2720_info = {
 #define AX_CMD_WRITE_MULTI_FILTER      0x16
 #define AX_CMD_READ_NODE_ID            0x17
 #define AX_CMD_READ_PHY_ID             0x19
+#define AX_CMD_READ_MEDIUM_STATUS      0x1a
 #define AX_CMD_WRITE_MEDIUM_MODE       0x1b
 #define AX_CMD_READ_MONITOR_MODE       0x1c
 #define AX_CMD_WRITE_MONITOR_MODE      0x1d
@@ -515,11 +521,14 @@ static const struct driver_info   an2720_info = {
 #define AX_MONITOR_MAGIC               0x04
 #define AX_MONITOR_HSFS                        0x10
 
+/* AX88172 Medium Status Register values */
+#define AX_MEDIUM_FULL_DUPLEX          0x02
+#define AX_MEDIUM_TX_ABORT_ALLOW       0x04
+#define AX_MEDIUM_FLOW_CONTROL_EN      0x10
+
 #define AX_MCAST_FILTER_SIZE           8
 #define AX_MAX_MCAST                   64
 
-#define AX_INTERRUPT_BUFSIZE           8
-
 #define AX_EEPROM_LEN                  0x40
 
 #define AX_SWRESET_CLEAR               0x00
@@ -535,15 +544,33 @@ static const struct driver_info   an2720_info = {
 #define AX88772_IPG1_DEFAULT           0x0c
 #define AX88772_IPG2_DEFAULT           0x12
 
+#define AX88772_MEDIUM_FULL_DUPLEX     0x0002
+#define AX88772_MEDIUM_RESERVED                0x0004
+#define AX88772_MEDIUM_RX_FC_ENABLE    0x0010
+#define AX88772_MEDIUM_TX_FC_ENABLE    0x0020
+#define AX88772_MEDIUM_PAUSE_FORMAT    0x0080
+#define AX88772_MEDIUM_RX_ENABLE       0x0100
+#define AX88772_MEDIUM_100MB           0x0200
+#define AX88772_MEDIUM_DEFAULT \
+       (AX88772_MEDIUM_FULL_DUPLEX | AX88772_MEDIUM_RX_FC_ENABLE | \
+        AX88772_MEDIUM_TX_FC_ENABLE | AX88772_MEDIUM_100MB | \
+        AX88772_MEDIUM_RESERVED | AX88772_MEDIUM_RX_ENABLE )
+
 #define AX_EEPROM_MAGIC                        0xdeadbeef
 
 /* This structure cannot exceed sizeof(unsigned long [5]) AKA 20 bytes */
 struct ax8817x_data {
        u8 multi_filter[AX_MCAST_FILTER_SIZE];
-       struct urb *int_urb;
-       u8 *int_buf;
 };
 
+struct ax88172_int_data {
+       u16 res1;
+       u8 link;
+       u16 res2;
+       u8 status;
+       u16 res3;
+} __attribute__ ((packed));
+
 static int ax8817x_read_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index,
                            u16 size, void *data)
 {
@@ -586,25 +613,23 @@ static void ax8817x_async_cmd_callback(struct urb *urb, struct pt_regs *regs)
        usb_free_urb(urb);
 }
 
-static void ax8817x_interrupt_complete(struct urb *urb, struct pt_regs *regs)
+static void ax8817x_status(struct usbnet *dev, struct urb *urb)
 {
-       struct usbnet *dev = (struct usbnet *)urb->context;
-       struct ax8817x_data *data = (struct ax8817x_data *)&dev->data;
+       struct ax88172_int_data *event;
        int link;
 
-       if (urb->status < 0) {
-               devdbg(dev,"ax8817x_interrupt_complete() failed with %d",
-                       urb->status);
-       } else {
-               link = data->int_buf[2] & 0x01;
-               if (netif_carrier_ok(dev->net) != link) {
-                       if (link)
-                               netif_carrier_on(dev->net);
-                       else
-                               netif_carrier_off(dev->net);
-                       devdbg(dev, "ax8817x - Link Status is: %d", link);
-               }
-               usb_submit_urb(data->int_urb, GFP_ATOMIC);
+       if (urb->actual_length < 8)
+               return;
+
+       event = urb->transfer_buffer;
+       link = event->link & 0x01;
+       if (netif_carrier_ok(dev->net) != link) {
+               if (link) {
+                       netif_carrier_on(dev->net);
+                       defer_kevent (dev, EVENT_LINK_RESET );
+               } else
+                       netif_carrier_off(dev->net);
+               devdbg(dev, "ax8817x - Link Status is: %d", link);
        }
 }
 
@@ -711,6 +736,20 @@ static void ax8817x_mdio_write(struct net_device *netdev, int phy_id, int loc, i
        ax8817x_write_cmd(dev, AX_CMD_SET_HW_MII, 0, 0, 0, &buf);
 }
 
+static int ax88172_link_reset(struct usbnet *dev)
+{
+       u16 lpa;
+       u8 mode;
+
+       mode = AX_MEDIUM_TX_ABORT_ALLOW | AX_MEDIUM_FLOW_CONTROL_EN;
+       lpa = ax8817x_mdio_read(dev->net, dev->mii.phy_id, MII_LPA);
+       if (lpa & LPA_DUPLEX)
+               mode |= AX_MEDIUM_FULL_DUPLEX;
+       ax8817x_write_cmd(dev, AX_CMD_WRITE_MEDIUM_MODE, mode, 0, 0, NULL);
+
+       return 0;
+}
+
 static void ax8817x_get_wol(struct net_device *net, struct ethtool_wolinfo *wolinfo)
 {
        struct usbnet *dev = netdev_priv(net);
@@ -824,35 +863,13 @@ static int ax8817x_bind(struct usbnet *dev, struct usb_interface *intf)
        void *buf;
        int i;
        unsigned long gpio_bits = dev->driver_info->data;
-       struct ax8817x_data *data = (struct ax8817x_data *)dev->data;
 
        get_endpoints(dev,intf);
 
-       if ((data->int_urb = usb_alloc_urb (0, GFP_KERNEL)) == NULL) {
-               dbg ("%s: cannot allocate interrupt URB",
-                       dev->net->name);
-               ret = -ENOMEM;
-               goto out1;
-       }
-       
-       if ((data->int_buf = kmalloc(AX_INTERRUPT_BUFSIZE, GFP_KERNEL)) == NULL) {
-               dbg ("%s: cannot allocate memory for interrupt buffer",
-                       dev->net->name);
-               ret = -ENOMEM;
-               goto out1;
-       }
-       memset(data->int_buf, 0, AX_INTERRUPT_BUFSIZE);
-
-       usb_fill_int_urb (data->int_urb, dev->udev,
-               usb_rcvintpipe (dev->udev, 1),
-               data->int_buf, AX_INTERRUPT_BUFSIZE,
-               ax8817x_interrupt_complete, dev,
-               dev->udev->speed == USB_SPEED_HIGH ? 8 : 100);
-
        buf = kmalloc(ETH_ALEN, GFP_KERNEL);
        if(!buf) {
                ret = -ENOMEM;
-               goto out2;
+               goto out1;
        }
 
        /* Toggle the GPIOs in a manufacturer/model specific way */
@@ -860,32 +877,32 @@ static int ax8817x_bind(struct usbnet *dev, struct usb_interface *intf)
                if ((ret = ax8817x_write_cmd(dev, AX_CMD_WRITE_GPIOS,
                                        (gpio_bits >> (i * 8)) & 0xff, 0, 0,
                                        buf)) < 0)
-                       goto out3;
+                       goto out2;
                msleep(5);
        }
 
        if ((ret = ax8817x_write_cmd(dev, AX_CMD_WRITE_RX_CTL, 0x80, 0, 0, buf)) < 0) {
                dbg("send AX_CMD_WRITE_RX_CTL failed: %d", ret);
-               goto out3;
+               goto out2;
        }
 
        /* Get the MAC address */
        memset(buf, 0, ETH_ALEN);
        if ((ret = ax8817x_read_cmd(dev, AX_CMD_READ_NODE_ID, 0, 0, 6, buf)) < 0) {
                dbg("read AX_CMD_READ_NODE_ID failed: %d", ret);
-               goto out3;
+               goto out2;
        }
        memcpy(dev->net->dev_addr, buf, ETH_ALEN);
 
        /* Get the PHY id */
        if ((ret = ax8817x_read_cmd(dev, AX_CMD_READ_PHY_ID, 0, 0, 2, buf)) < 0) {
                dbg("error on read AX_CMD_READ_PHY_ID: %02x", ret);
-               goto out3;
+               goto out2;
        } else if (ret < 2) {
                /* this should always return 2 bytes */
                dbg("AX_CMD_READ_PHY_ID returned less than 2 bytes: ret=%02x", ret);
                ret = -EIO;
-               goto out3;
+               goto out2;
        }
 
        /* Initialize MII structure */
@@ -899,36 +916,18 @@ static int ax8817x_bind(struct usbnet *dev, struct usb_interface *intf)
        dev->net->set_multicast_list = ax8817x_set_multicast;
        dev->net->ethtool_ops = &ax8817x_ethtool_ops;
 
-       ax8817x_mdio_write(dev->net, dev->mii.phy_id, MII_BMCR,
-                       cpu_to_le16(BMCR_RESET));
+       ax8817x_mdio_write(dev->net, dev->mii.phy_id, MII_BMCR, BMCR_RESET);
        ax8817x_mdio_write(dev->net, dev->mii.phy_id, MII_ADVERTISE,
-                       cpu_to_le16(ADVERTISE_ALL | ADVERTISE_CSMA | 0x0400));
+               ADVERTISE_ALL | ADVERTISE_CSMA | ADVERTISE_PAUSE_CAP);
        mii_nway_restart(&dev->mii);
 
-       if((ret = usb_submit_urb(data->int_urb, GFP_KERNEL)) < 0) {
-               dbg("Failed to submit interrupt URB: %02x", ret);
-               goto out2;
-       }
-
        return 0;
-out3:
-       kfree(buf);
 out2:
-       kfree(data->int_buf);
+       kfree(buf);
 out1:
-       usb_free_urb(data->int_urb);
        return ret;
 }
 
-static void ax8817x_unbind(struct usbnet *dev, struct usb_interface *intf)
-{
-       struct ax8817x_data *data = (struct ax8817x_data *)dev->data;
-
-       usb_kill_urb(data->int_urb);
-       usb_free_urb(data->int_urb);
-       kfree(data->int_buf);
-}
-
 static struct ethtool_ops ax88772_ethtool_ops = {
        .get_drvinfo            = ax8817x_get_drvinfo,
        .get_link               = ethtool_op_get_link,
@@ -946,64 +945,44 @@ static int ax88772_bind(struct usbnet *dev, struct usb_interface *intf)
 {
        int ret;
        void *buf;
-       struct ax8817x_data *data = (struct ax8817x_data *)dev->data;
 
        get_endpoints(dev,intf);
 
-       if ((data->int_urb = usb_alloc_urb (0, GFP_KERNEL)) == 0) {
-               dbg ("Cannot allocate interrupt URB");
-               ret = -ENOMEM;
-               goto out1;
-       }
-       
-       if ((data->int_buf = kmalloc(AX_INTERRUPT_BUFSIZE, GFP_KERNEL)) == NULL) {
-               dbg ("Cannot allocate memory for interrupt buffer");
-               ret = -ENOMEM;
-               goto out1;
-       }
-       memset(data->int_buf, 0, AX_INTERRUPT_BUFSIZE);
-
-       usb_fill_int_urb (data->int_urb, dev->udev,
-               usb_rcvintpipe (dev->udev, 1),
-               data->int_buf, AX_INTERRUPT_BUFSIZE,
-               ax8817x_interrupt_complete, dev,
-               dev->udev->speed == USB_SPEED_HIGH ? 8 : 100);
-
        buf = kmalloc(6, GFP_KERNEL);
        if(!buf) {
                dbg ("Cannot allocate memory for buffer");
                ret = -ENOMEM;
-               goto out2;
+               goto out1;
        }
 
        if ((ret = ax8817x_write_cmd(dev, AX_CMD_WRITE_GPIOS,
                                     0x00B0, 0, 0, buf)) < 0)
-               goto out3;
+               goto out2;
 
        msleep(5);
        if ((ret = ax8817x_write_cmd(dev, AX_CMD_SW_PHY_SELECT, 0x0001, 0, 0, buf)) < 0) {
                dbg("Select PHY #1 failed: %d", ret);
-               goto out3;
+               goto out2;
        }
 
        if ((ret =
             ax8817x_write_cmd(dev, AX_CMD_SW_RESET, AX_SWRESET_IPPD, 0, 0, buf)) < 0) {
                dbg("Failed to power down internal PHY: %d", ret);
-               goto out3;
+               goto out2;
        }
 
        msleep(150);
        if ((ret =
             ax8817x_write_cmd(dev, AX_CMD_SW_RESET, AX_SWRESET_CLEAR, 0, 0, buf)) < 0) {
                dbg("Failed to perform software reset: %d", ret);
-               goto out3;
+               goto out2;
        }
 
        msleep(150);
        if ((ret =
             ax8817x_write_cmd(dev, AX_CMD_SW_RESET, AX_SWRESET_IPRL | AX_SWRESET_PRL, 0, 0, buf)) < 0) {
                dbg("Failed to set Internal/External PHY reset control: %d", ret);
-               goto out3;
+               goto out2;
        }
 
        msleep(150);
@@ -1011,27 +990,27 @@ static int ax88772_bind(struct usbnet *dev, struct usb_interface *intf)
             ax8817x_write_cmd(dev, AX_CMD_WRITE_RX_CTL, 0x0000, 0, 0,
                               buf)) < 0) {
                dbg("Failed to reset RX_CTL: %d", ret);
-               goto out3;
+               goto out2;
        }
 
        /* Get the MAC address */
        memset(buf, 0, ETH_ALEN);
        if ((ret = ax8817x_read_cmd(dev, AX88772_CMD_READ_NODE_ID, 0, 0, ETH_ALEN, buf)) < 0) {
                dbg("Failed to read MAC address: %d", ret);
-               goto out3;
+               goto out2;
        }
        memcpy(dev->net->dev_addr, buf, ETH_ALEN);
 
        if ((ret = ax8817x_write_cmd(dev, AX_CMD_SET_SW_MII, 0, 0, 0, buf)) < 0) {
                dbg("Enabling software MII failed: %d", ret);
-               goto out3;
+               goto out2;
        }
 
        if (((ret =
              ax8817x_read_cmd(dev, AX_CMD_READ_MII_REG, 0x0010, 2, 2, buf)) < 0)
            || (*((u16 *)buf) != 0x003b)) {
                dbg("Read PHY register 2 must be 0x3b00: %d", ret);
-               goto out3;
+               goto out2;
        }
 
        /* Initialize MII structure */
@@ -1044,26 +1023,26 @@ static int ax88772_bind(struct usbnet *dev, struct usb_interface *intf)
        /* Get the PHY id */
        if ((ret = ax8817x_read_cmd(dev, AX_CMD_READ_PHY_ID, 0, 0, 2, buf)) < 0) {
                dbg("Error reading PHY ID: %02x", ret);
-               goto out3;
+               goto out2;
        } else if (ret < 2) {
                /* this should always return 2 bytes */
                dbg("AX_CMD_READ_PHY_ID returned less than 2 bytes: ret=%02x",
                    ret);
                ret = -EIO;
-               goto out3;
+               goto out2;
        }
        dev->mii.phy_id = *((u8 *)buf + 1);
 
        if ((ret =
             ax8817x_write_cmd(dev, AX_CMD_SW_RESET, AX_SWRESET_PRL, 0, 0, buf)) < 0) {
                dbg("Set external PHY reset pin level: %d", ret);
-               goto out3;
+               goto out2;
        }
        msleep(150);
        if ((ret =
             ax8817x_write_cmd(dev, AX_CMD_SW_RESET, AX_SWRESET_IPRL | AX_SWRESET_PRL, 0, 0, buf)) < 0) {
                dbg("Set Internal/External PHY reset control: %d", ret);
-               goto out3;
+               goto out2;
        }
        msleep(150);
 
@@ -1071,25 +1050,24 @@ static int ax88772_bind(struct usbnet *dev, struct usb_interface *intf)
        dev->net->set_multicast_list = ax8817x_set_multicast;
        dev->net->ethtool_ops = &ax88772_ethtool_ops;
 
-       ax8817x_mdio_write(dev->net, dev->mii.phy_id, MII_BMCR,
-                       cpu_to_le16(BMCR_RESET));
+       ax8817x_mdio_write(dev->net, dev->mii.phy_id, MII_BMCR, BMCR_RESET);
        ax8817x_mdio_write(dev->net, dev->mii.phy_id, MII_ADVERTISE,
-                       cpu_to_le16(ADVERTISE_ALL | ADVERTISE_CSMA));
+                       ADVERTISE_ALL | ADVERTISE_CSMA);
        mii_nway_restart(&dev->mii);
 
-       if ((ret = ax8817x_write_cmd(dev, AX_CMD_WRITE_MEDIUM_MODE, 0x0336, 0, 0, buf)) < 0) {
+       if ((ret = ax8817x_write_cmd(dev, AX_CMD_WRITE_MEDIUM_MODE, AX88772_MEDIUM_DEFAULT, 0, 0, buf)) < 0) {
                dbg("Write medium mode register: %d", ret);
-               goto out3;
+               goto out2;
        }
 
        if ((ret = ax8817x_write_cmd(dev, AX_CMD_WRITE_IPG0, AX88772_IPG0_DEFAULT | AX88772_IPG1_DEFAULT,AX88772_IPG2_DEFAULT, 0, buf)) < 0) {
                dbg("Write IPG,IPG1,IPG2 failed: %d", ret);
-               goto out3;
+               goto out2;
        }
        if ((ret =
             ax8817x_write_cmd(dev, AX_CMD_SET_HW_MII, 0, 0, 0, &buf)) < 0) {
                dbg("Failed to set hardware MII: %02x", ret);
-               goto out3;
+               goto out2;
        }
 
        /* Set RX_CTL to default values with 2k buffer, and enable cactus */
@@ -1097,25 +1075,16 @@ static int ax88772_bind(struct usbnet *dev, struct usb_interface *intf)
             ax8817x_write_cmd(dev, AX_CMD_WRITE_RX_CTL, 0x0088, 0, 0,
                               buf)) < 0) {
                dbg("Reset RX_CTL failed: %d", ret);
-               goto out3;
-       }
-
-       if((ret = usb_submit_urb(data->int_urb, GFP_KERNEL)) < 0) {
-               dbg("Failed to submit interrupt URB: %02x", ret);
-               goto out3;
+               goto out2;
        }
 
        kfree(buf);
 
        return 0;
 
-out3:
-       kfree(buf);
 out2:
-       kfree(data->int_buf);
+       kfree(buf);
 out1:
-       usb_free_urb(data->int_urb);
-
        return ret;
 }
 
@@ -1213,10 +1182,29 @@ static struct sk_buff *ax88772_tx_fixup(struct usbnet *dev, struct sk_buff *skb,
        return skb;
 }
 
+static int ax88772_link_reset(struct usbnet *dev)
+{
+       u16 lpa;
+       u16 mode;
+
+       mode = AX88772_MEDIUM_DEFAULT;
+       lpa = ax8817x_mdio_read(dev->net, dev->mii.phy_id, MII_LPA);
+
+       if ((lpa & LPA_DUPLEX) == 0)
+               mode &= ~AX88772_MEDIUM_FULL_DUPLEX;
+       if ((lpa & LPA_100) == 0)
+               mode &= ~AX88772_MEDIUM_100MB;
+       ax8817x_write_cmd(dev, AX_CMD_WRITE_MEDIUM_MODE, mode, 0, 0, NULL);
+
+       return 0;
+}
+
 static const struct driver_info ax8817x_info = {
        .description = "ASIX AX8817x USB 2.0 Ethernet",
        .bind = ax8817x_bind,
-       .unbind = ax8817x_unbind,
+       .status = ax8817x_status,
+       .link_reset = ax88172_link_reset,
+       .reset = ax88172_link_reset,
        .flags =  FLAG_ETHER,
        .data = 0x00130103,
 };
@@ -1224,7 +1212,9 @@ static const struct driver_info ax8817x_info = {
 static const struct driver_info dlink_dub_e100_info = {
        .description = "DLink DUB-E100 USB Ethernet",
        .bind = ax8817x_bind,
-       .unbind = ax8817x_unbind,
+       .status = ax8817x_status,
+       .link_reset = ax88172_link_reset,
+       .reset = ax88172_link_reset,
        .flags =  FLAG_ETHER,
        .data = 0x009f9d9f,
 };
@@ -1232,7 +1222,9 @@ static const struct driver_info dlink_dub_e100_info = {
 static const struct driver_info netgear_fa120_info = {
        .description = "Netgear FA-120 USB Ethernet",
        .bind = ax8817x_bind,
-       .unbind = ax8817x_unbind,
+       .status = ax8817x_status,
+       .link_reset = ax88172_link_reset,
+       .reset = ax88172_link_reset,
        .flags =  FLAG_ETHER,
        .data = 0x00130103,
 };
@@ -1240,7 +1232,9 @@ static const struct driver_info netgear_fa120_info = {
 static const struct driver_info hawking_uf200_info = {
        .description = "Hawking UF200 USB Ethernet",
        .bind = ax8817x_bind,
-       .unbind = ax8817x_unbind,
+       .status = ax8817x_status,
+       .link_reset = ax88172_link_reset,
+       .reset = ax88172_link_reset,
        .flags =  FLAG_ETHER,
        .data = 0x001f1d1f,
 };
@@ -1248,7 +1242,9 @@ static const struct driver_info hawking_uf200_info = {
 static const struct driver_info ax88772_info = {
        .description = "ASIX AX88772 USB 2.0 Ethernet",
        .bind = ax88772_bind,
-       .unbind = ax8817x_unbind,
+       .status = ax8817x_status,
+       .link_reset = ax88772_link_reset,
+       .reset = ax88772_link_reset,
        .flags = FLAG_ETHER | FLAG_FRAMING_AX,
        .rx_fixup = ax88772_rx_fixup,
        .tx_fixup = ax88772_tx_fixup,
@@ -2661,7 +2657,7 @@ static const struct driver_info   blob_info = {
  * All known Zaurii lie about their standards conformance.  Most lie by
  * saying they support CDC Ethernet.  Some lie and say they support CDC
  * MDLM (as if for access to cell phone modems).  Someone, please beat 
- * on Sharp for a while with a cluestick.
+ * on Sharp (and other such vendors) for a while with a cluestick.
  *
  *-------------------------------------------------------------------------*/
 
@@ -2714,13 +2710,6 @@ static const struct driver_info  zaurus_pxa_info = {
 };
 #define        ZAURUS_PXA_INFO         ((unsigned long)&zaurus_pxa_info)
 
-static const struct driver_info        zaurus_pxa_mdlm_info = {
-       .description =  "Sharp Zaurus, PXA-255 based",
-       .flags =        FLAG_FRAMING_Z,
-       .check_connect = always_connected,
-       .tx_fixup =     zaurus_tx_fixup,
-};
-
 static const struct driver_info        olympus_mxl_info = {
        .description =  "Olympus R1000",
        .flags =        FLAG_FRAMING_Z,
@@ -2731,6 +2720,133 @@ static const struct driver_info olympus_mxl_info = {
 };
 #define        OLYMPUS_MXL_INFO        ((unsigned long)&olympus_mxl_info)
 
+
+/* Some more recent products using Lineo/Belcarra code will wrongly claim
+ * CDC MDLM conformance.  They aren't conformant:  data endpoints live
+ * in the control interface, there's no data interface, and it's not used
+ * to talk to a cell phone radio.  But at least we can detect these two
+ * pseudo-classes, rather than growing this product list with entries for
+ * each new nonconformant product (sigh).
+ */
+static const u8 safe_guid[16] = {
+       0x5d, 0x34, 0xcf, 0x66, 0x11, 0x18, 0x11, 0xd6,
+       0xa2, 0x1a, 0x00, 0x01, 0x02, 0xca, 0x9a, 0x7f,
+};
+static const u8 blan_guid[16] = {
+       0x74, 0xf0, 0x3d, 0xbd, 0x1e, 0xc1, 0x44, 0x70,
+       0xa3, 0x67, 0x71, 0x34, 0xc9, 0xf5, 0x54, 0x37,
+};
+
+static int blan_mdlm_bind (struct usbnet *dev, struct usb_interface *intf)
+{
+       u8                              *buf = intf->cur_altsetting->extra;
+       int                             len = intf->cur_altsetting->extralen;
+       struct usb_cdc_mdlm_desc        *desc = NULL;
+       struct usb_cdc_mdlm_detail_desc *detail = NULL;
+
+       while (len > 3) {
+               if (buf [1] != USB_DT_CS_INTERFACE)
+                       goto next_desc;
+
+               /* use bDescriptorSubType, and just verify that we get a
+                * "BLAN" (or "SAFE") descriptor.
+                */
+               switch (buf [2]) {
+               case USB_CDC_MDLM_TYPE:
+                       if (desc) {
+                               dev_dbg (&intf->dev, "extra MDLM\n");
+                               goto bad_desc;
+                       }
+                       desc = (void *) buf;
+                       if (desc->bLength != sizeof *desc) {
+                               dev_dbg (&intf->dev, "MDLM len %u\n",
+                                       desc->bLength);
+                               goto bad_desc;
+                       }
+                       /* expect bcdVersion 1.0, ignore */
+                       if (memcmp(&desc->bGUID, blan_guid, 16)
+                                   || memcmp(&desc->bGUID, blan_guid, 16) ) {
+                               /* hey, this one might _really_ be MDLM! */
+                               dev_dbg (&intf->dev, "MDLM guid\n");
+                               goto bad_desc;
+                       }
+                       break;
+               case USB_CDC_MDLM_DETAIL_TYPE:
+                       if (detail) {
+                               dev_dbg (&intf->dev, "extra MDLM detail\n");
+                               goto bad_desc;
+                       }
+                       detail = (void *) buf;
+                       switch (detail->bGuidDescriptorType) {
+                       case 0:                 /* "SAFE" */
+                               if (detail->bLength != (sizeof *detail + 2))
+                                       goto bad_detail;
+                               break;
+                       case 1:                 /* "BLAN" */
+                               if (detail->bLength != (sizeof *detail + 3))
+                                       goto bad_detail;
+                               break;
+                       default:
+                               goto bad_detail;
+                       }
+
+                       /* assuming we either noticed BLAN already, or will
+                        * find it soon, there are some data bytes here:
+                        *  - bmNetworkCapabilities (unused)
+                        *  - bmDataCapabilities (bits, see below)
+                        *  - bPad (ignored, for PADAFTER -- BLAN-only)
+                        * bits are:
+                        *  - 0x01 -- Zaurus framing (add CRC)
+                        *  - 0x02 -- PADBEFORE
+                        *  - 0x04 -- PADAFTER
+                        *  - 0x08 -- "fermat" packet mangling (for hw bugs)
+                        */
+                       if (detail->bDetailData[1] != 0x01) {
+                               /* bmDataCapabilites == 0 would be fine too,
+                                * but framing is minidriver-coupled for now.
+                                */
+bad_detail:
+                               dev_dbg (&intf->dev,
+                                               "bad MDLM detail, %d %d %d\n",
+                                               detail->bLength,
+                                               detail->bDetailData[0],
+                                               detail->bDetailData[2]);
+                               goto bad_desc;
+                       }
+                       break;
+               }
+next_desc:
+               len -= buf [0]; /* bLength */
+               buf += buf [0];
+       }
+
+       if (!desc || !detail) {
+               dev_dbg (&intf->dev, "missing cdc mdlm %s%sdescriptor\n",
+                       desc ? "" : "func ",
+                       detail ? "" : "detail ");
+               goto bad_desc;
+       }
+
+       /* There's probably a CDC Ethernet descriptor there, but we can't
+        * rely on the Ethernet address it provides since not all vendors
+        * bother to make it unique.  Likewise there's no point in tracking
+        * of the CDC event notifications.
+        */
+       return get_endpoints (dev, intf);
+
+bad_desc:
+       dev_info (&dev->udev->dev, "unsupported MDLM descriptors\n");
+       return -ENODEV;
+}
+
+static const struct driver_info        bogus_mdlm_info = {
+       .description =  "pseudo-MDLM (BLAN) device",
+       .flags =        FLAG_FRAMING_Z,
+       .check_connect = always_connected,
+       .tx_fixup =     zaurus_tx_fixup,
+       .bind =         blan_mdlm_bind,
+};
+
 #else
 
 /* blacklist all those devices */
@@ -3307,6 +3423,19 @@ kevent (void *data)
                }
        }
 
+       if (test_bit (EVENT_LINK_RESET, &dev->flags)) {
+               struct driver_info      *info = dev->driver_info;
+               int                     retval = 0;
+
+               clear_bit (EVENT_LINK_RESET, &dev->flags);
+               if(info->link_reset && (retval = info->link_reset(dev)) < 0) {
+                       devinfo(dev, "link reset failed (%d) usbnet usb-%s-%s, %s",
+                               retval,
+                               dev->udev->bus->bus_name, dev->udev->devpath,
+                               info->description);
+               }
+       }
+
        if (dev->flags)
                devdbg (dev, "kevent done, flags = 0x%lx",
                        dev->flags);
@@ -4020,30 +4149,14 @@ static const struct usb_device_id       products [] = {
 },
 
 #ifdef CONFIG_USB_ZAURUS
-       /* at least some (reports vary) PXA units have very different
-        * lies about their standards support:  they claim to be cell
-        * phones giving direct radio access (which they aren't).
+       /* At least some (reports vary) PXA units have very different lies
+        * about their standards support:  they claim to be cell phones with
+        * direct access to their radios.  (They don't conform to CDC MDLM.)
         */
 {
-       .match_flags    =   USB_DEVICE_ID_MATCH_INT_INFO
-                | USB_DEVICE_ID_MATCH_DEVICE,
-       .idVendor               = 0x04DD,
-       /* Sharp ROM v1.32 */
-       .idProduct              = 0x8006,       /* SL-5600 */
-       .bInterfaceClass        = USB_CLASS_COMM,
-       .bInterfaceSubClass     = USB_CDC_SUBCLASS_MDLM,
-       .bInterfaceProtocol     = USB_CDC_PROTO_NONE,
-       .driver_info            = (unsigned long) &zaurus_pxa_mdlm_info,
-}, {
-       .match_flags    =   USB_DEVICE_ID_MATCH_INT_INFO
-                | USB_DEVICE_ID_MATCH_DEVICE,
-       .idVendor               = 0x04DD,
-       /* reported with some C860 units */
-       .idProduct              = 0x9031,       /* C-860 */
-       .bInterfaceClass        = USB_CLASS_COMM,
-       .bInterfaceSubClass     = USB_CDC_SUBCLASS_MDLM,
-       .bInterfaceProtocol     = USB_CDC_PROTO_NONE,
-       .driver_info            = (unsigned long) &zaurus_pxa_mdlm_info,
+       USB_INTERFACE_INFO (USB_CLASS_COMM, USB_CDC_SUBCLASS_MDLM,
+                       USB_CDC_PROTO_NONE),
+       .driver_info = (unsigned long) &bogus_mdlm_info,
 },
 #endif
 
index c81cd0a619bfcf1841b611f79b946956fbc82591..f98cb2af024e1ac4bbbbc36a589752d261de3499 100644 (file)
@@ -45,7 +45,7 @@ MODULE_PARM_DESC(ap, "If non-zero Access Point firmware will be loaded");
 MODULE_DEVICE_TABLE(usb, zd1201_table);
 
 
-int zd1201_fw_upload(struct usb_device *dev, int apfw)
+static int zd1201_fw_upload(struct usb_device *dev, int apfw)
 {
        const struct firmware *fw_entry;
        char* data;
@@ -111,7 +111,7 @@ exit:
        return err;
 }
 
-void zd1201_usbfree(struct urb *urb, struct pt_regs *regs)
+static void zd1201_usbfree(struct urb *urb, struct pt_regs *regs)
 {
        struct zd1201 *zd = urb->context;
 
@@ -142,7 +142,8 @@ void zd1201_usbfree(struct urb *urb, struct pt_regs *regs)
 
        total: 4 + 2 + 2 + 2 + 2 + 4 = 16
 */
-int zd1201_docmd(struct zd1201 *zd, int cmd, int parm0, int parm1, int parm2)
+static int zd1201_docmd(struct zd1201 *zd, int cmd, int parm0,
+                       int parm1, int parm2)
 {
        unsigned char *command;
        int ret;
@@ -175,7 +176,7 @@ int zd1201_docmd(struct zd1201 *zd, int cmd, int parm0, int parm1, int parm2)
 }
 
 /* Callback after sending out a packet */
-void zd1201_usbtx(struct urb *urb, struct pt_regs *regs)
+static void zd1201_usbtx(struct urb *urb, struct pt_regs *regs)
 {
        struct zd1201 *zd = urb->context;
        netif_wake_queue(zd->dev);
@@ -183,7 +184,7 @@ void zd1201_usbtx(struct urb *urb, struct pt_regs *regs)
 }
 
 /* Incomming data */
-void zd1201_usbrx(struct urb *urb, struct pt_regs *regs)
+static void zd1201_usbrx(struct urb *urb, struct pt_regs *regs)
 {
        struct zd1201 *zd = urb->context;
        int free = 0;
@@ -613,7 +614,7 @@ static inline int zd1201_setconfig16(struct zd1201 *zd, int rid, short val)
        return (zd1201_setconfig(zd, rid, &zdval, sizeof(__le16), 1));
 }
 
-int zd1201_drvr_start(struct zd1201 *zd)
+static int zd1201_drvr_start(struct zd1201 *zd)
 {
        int err, i;
        short max;
@@ -1739,7 +1740,8 @@ static const struct iw_handler_def zd1201_iw_handlers = {
        .private_args           = (struct iw_priv_args *) zd1201_private_args,
 };
 
-int zd1201_probe(struct usb_interface *interface, const struct usb_device_id *id)
+static int zd1201_probe(struct usb_interface *interface,
+                       const struct usb_device_id *id)
 {
        struct zd1201 *zd;
        struct usb_device *usb;
@@ -1851,7 +1853,7 @@ err_zd:
        return err;
 }
 
-void zd1201_disconnect(struct usb_interface *interface)
+static void zd1201_disconnect(struct usb_interface *interface)
 {
        struct zd1201 *zd=(struct zd1201 *)usb_get_intfdata(interface);
        struct hlist_node *node, *node2;
@@ -1882,7 +1884,7 @@ void zd1201_disconnect(struct usb_interface *interface)
        kfree(zd);
 }
 
-struct usb_driver zd1201_usb = {
+static struct usb_driver zd1201_usb = {
        .owner = THIS_MODULE,
        .name = "zd1201",
        .probe = zd1201_probe,
index b869076d9c7c850b9ce861329aaa329d77f6b1c0..0c4aa00bb39d3dea51a7b9f393ddc9b9bb147780 100644 (file)
@@ -395,6 +395,15 @@ config USB_SERIAL_PL2303
          To compile this driver as a module, choose M here: the
          module will be called pl2303.
 
+config USB_SERIAL_HP4X
+        tristate "USB HP4x Calculators support"
+        depends on USB_SERIAL
+        help
+          Say Y here if you want to use an Hewlett-Packard 4x Calculator.
+
+          To compile this driver as a module, choose M here: the
+          module will be called hp4x.
+
 config USB_SERIAL_SAFE
        tristate "USB Safe Serial (Encapsulated) Driver (EXPERIMENTAL)"
        depends on USB_SERIAL && EXPERIMENTAL
index 351b81855b185f333e96e48421ca4f1d278296a8..b0aac47d1959a1cead78236b611e0ee7c43f342f 100644 (file)
@@ -21,6 +21,7 @@ obj-$(CONFIG_USB_SERIAL_EDGEPORT_TI)          += io_ti.o
 obj-$(CONFIG_USB_SERIAL_EMPEG)                 += empeg.o
 obj-$(CONFIG_USB_SERIAL_FTDI_SIO)              += ftdi_sio.o
 obj-$(CONFIG_USB_SERIAL_GARMIN)                        += garmin_gps.o
+obj-$(CONFIG_USB_SERIAL_HP4X)                  += hp4x.o
 obj-$(CONFIG_USB_SERIAL_IPAQ)                  += ipaq.o
 obj-$(CONFIG_USB_SERIAL_IPW)                   += ipw.o
 obj-$(CONFIG_USB_SERIAL_IR)                    += ir-usb.o
diff --git a/drivers/usb/serial/hp4x.c b/drivers/usb/serial/hp4x.c
new file mode 100644 (file)
index 0000000..64d55fb
--- /dev/null
@@ -0,0 +1,85 @@
+/*
+ * HP4x Calculators Serial USB driver
+ *
+ * Copyright (C) 2005 Arthur Huillet (ahuillet@users.sf.net)
+ * Copyright (C) 2001-2005 Greg Kroah-Hartman (greg@kroah.com)
+ *
+ *     This program is free software; you can redistribute it and/or modify
+ *     it under the terms of the GNU General Public License as published by
+ *     the Free Software Foundation; either version 2 of the License, or
+ *     (at your option) any later version.
+ *
+ * See Documentation/usb/usb-serial.txt for more information on using this driver
+ */
+
+#include <linux/config.h>
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/tty.h>
+#include <linux/module.h>
+#include <linux/usb.h>
+#include "usb-serial.h"
+
+/*
+ * Version Information
+ */
+#define DRIVER_VERSION "v1.00"
+#define DRIVER_DESC "HP4x (48/49) Generic Serial driver"
+
+#define HP_VENDOR_ID 0x03f0
+#define HP49GP_PRODUCT_ID 0x0121
+
+static struct usb_device_id id_table [] = {
+       { USB_DEVICE(HP_VENDOR_ID, HP49GP_PRODUCT_ID) },
+       { }                                     /* Terminating entry */
+};
+
+MODULE_DEVICE_TABLE(usb, id_table);
+
+static struct usb_driver hp49gp_driver = {
+       .owner =        THIS_MODULE,
+       .name =         "HP4X",
+       .probe =        usb_serial_probe,
+       .disconnect =   usb_serial_disconnect,
+       .id_table =     id_table,
+};
+
+static struct usb_serial_device_type hp49gp_device = {
+       .owner =                THIS_MODULE,
+       .name =                 "HP4X",
+       .id_table =             id_table,
+       .num_interrupt_in =     NUM_DONT_CARE,
+       .num_bulk_in =          NUM_DONT_CARE,
+       .num_bulk_out =         NUM_DONT_CARE,
+       .num_ports =            1,
+};
+
+static int __init hp49gp_init(void)
+{
+       int retval;
+       retval = usb_serial_register(&hp49gp_device);
+       if (retval)
+               goto failed_usb_serial_register;
+       retval = usb_register(&hp49gp_driver);
+       if (retval)
+               goto failed_usb_register;
+       info(DRIVER_DESC " " DRIVER_VERSION);
+       return 0;
+failed_usb_register:
+       usb_serial_deregister(&hp49gp_device);
+failed_usb_serial_register:
+       return retval;
+}
+
+static void __exit hp49gp_exit(void)
+{
+       usb_deregister(&hp49gp_driver);
+       usb_serial_deregister(&hp49gp_device);
+}
+
+module_init(hp49gp_init);
+module_exit(hp49gp_exit);
+
+MODULE_DESCRIPTION(DRIVER_DESC);
+MODULE_VERSION(DRIVER_VERSION);
+MODULE_LICENSE("GPL");
index fa68dea6bc6fe72f84d96f1153c75aa9acb34735..bbda63c24c4d686d27723db866f0c439a5542246 100644 (file)
@@ -517,14 +517,32 @@ UNUSUAL_DEV(  0x05ab, 0x5701, 0x0100, 0x0110,
                0 ),
 #endif
 
+/* Submitted by Sven Anderson <sven-linux@anderson.de>
+ * There are at least four ProductIDs used for iPods, so I added 0x1202 and
+ * 0x1204. They just need the US_FL_FIX_CAPACITY. As the bcdDevice appears
+ * to change with firmware updates, I changed the range to maximum for all
+ * iPod entries.
+ */
+UNUSUAL_DEV( 0x05ac, 0x1202, 0x0000, 0x9999,
+               "Apple",
+               "iPod",
+               US_SC_DEVICE, US_PR_DEVICE, NULL,
+               US_FL_FIX_CAPACITY ),
+
 /* Reported by Avi Kivity <avi@argo.co.il> */
-UNUSUAL_DEV( 0x05ac, 0x1203, 0x0001, 0x0001,
+UNUSUAL_DEV( 0x05ac, 0x1203, 0x0000, 0x9999,
+               "Apple",
+               "iPod",
+               US_SC_DEVICE, US_PR_DEVICE, NULL,
+               US_FL_FIX_CAPACITY ),
+
+UNUSUAL_DEV( 0x05ac, 0x1204, 0x0000, 0x9999,
                "Apple",
                "iPod",
                US_SC_DEVICE, US_PR_DEVICE, NULL,
                US_FL_FIX_CAPACITY ),
 
-UNUSUAL_DEV( 0x05ac, 0x1205, 0x0001, 0x0001,
+UNUSUAL_DEV( 0x05ac, 0x1205, 0x0000, 0x9999,
                "Apple",
                "iPod",
                US_SC_DEVICE, US_PR_DEVICE, NULL,
index 5a72ca3c01385badcae45db92d14f4d173c0b583..7b9bf45ab6fe89251e59c19deeb890c9583401f5 100644 (file)
@@ -1287,12 +1287,12 @@ imsttfb_ioctl(struct inode *inode, struct file *file, u_int cmd,
                case FBIMSTT_SETCMAPREG:
                        if (copy_from_user(reg, argp, 8) || reg[0] > (0x1000 - sizeof(reg[0])) / sizeof(reg[0]))
                                return -EFAULT;
-                       write_reg_le32(((u_int *)par->cmap_regs), reg[0], reg[1]);
+                       write_reg_le32(((u_int __iomem *)par->cmap_regs), reg[0], reg[1]);
                        return 0;
                case FBIMSTT_GETCMAPREG:
                        if (copy_from_user(reg, argp, 4) || reg[0] > (0x1000 - sizeof(reg[0])) / sizeof(reg[0]))
                                return -EFAULT;
-                       reg[1] = read_reg_le32(((u_int *)par->cmap_regs), reg[0]);
+                       reg[1] = read_reg_le32(((u_int __iomem *)par->cmap_regs), reg[0]);
                        if (copy_to_user((void __user *)(arg + 4), &reg[1], 4))
                                return -EFAULT;
                        return 0;
index 5bb8d60f35c40f7e94233c747ac9f411e12a65a7..03d74e8ee06777f8991591a61bc2812c2843c775 100644 (file)
@@ -1498,7 +1498,7 @@ static int __devinit savage_map_mmio (struct fb_info *info)
        info->fix.mmio_start = par->mmio.pbase;
        info->fix.mmio_len   = par->mmio.len;
 
-       par->bci_base = (u32*)(par->mmio.vbase + BCI_BUFFER_OFFSET);
+       par->bci_base = (u32 __iomem *)(par->mmio.vbase + BCI_BUFFER_OFFSET);
        par->bci_ptr  = 0;
 
        savage_enable_mmio (par);
@@ -1514,7 +1514,7 @@ static void __devinit savage_unmap_mmio (struct fb_info *info)
        savage_disable_mmio(par);
 
        if (par->mmio.vbase) {
-               iounmap ((void *)par->mmio.vbase);
+               iounmap(par->mmio.vbase);
                par->mmio.vbase = NULL;
        }
 }
@@ -1553,7 +1553,7 @@ static int __devinit savage_map_video (struct fb_info *info,
 #endif
 
        /* Clear framebuffer, it's all white in memory after boot */
-       memset (par->video.vbase, 0, par->video.len);
+       memset_io (par->video.vbase, 0, par->video.len);
 
        return 0;
 }
index fb42c3f3bf0db39f314fcc89e9f060d6d8022f92..34a44e451689afd59aa30449b56f938bd0109f60 100644 (file)
 
 #include <linux/config.h>
 #include <linux/module.h>
-
-#include <linux/stat.h>
-#include <linux/time.h>
-#include <linux/iso_fs.h>
-#include <linux/kernel.h>
-#include <linux/major.h>
-#include <linux/mm.h>
-#include <linux/string.h>
-#include <linux/slab.h>
-#include <linux/errno.h>
 #include <linux/init.h>
-#include <linux/nls.h>
-#include <linux/ctype.h>
-#include <linux/smp_lock.h>
-#include <linux/blkdev.h>
+
 #include <linux/vmalloc.h>
 #include <linux/zlib.h>
-#include <linux/buffer_head.h>
-
-#include <asm/system.h>
-#include <asm/uaccess.h>
-#include <asm/semaphore.h>
 
+#include "isofs.h"
 #include "zisofs.h"
 
 /* This should probably be global. */
index 14d86de6637d25cb1404a8d83774e4a1bd420ef9..6030956b894b907a91b95d9af667b728a414a4f7 100644 (file)
  * 
  *  isofs directory handling functions
  */
-#include <linux/errno.h>
-#include <linux/fs.h>
-#include <linux/iso_fs.h>
-#include <linux/kernel.h>
-#include <linux/stat.h>
-#include <linux/string.h>
-#include <linux/mm.h>
-#include <linux/slab.h>
-#include <linux/time.h>
 #include <linux/config.h>
 #include <linux/smp_lock.h>
-#include <linux/buffer_head.h>
-
-#include <asm/uaccess.h>
+#include "isofs.h"
 
 static int isofs_readdir(struct file *, void *, filldir_t);
 
index e4252c960871a0f93c6538cc7929a4981326c0c1..4af856a7fda7fd3f0fc97b86cccefa595c3d58db 100644 (file)
  *     fs/exportfs/expfs.c.
  */
 
-#include <linux/buffer_head.h>
-#include <linux/errno.h>
-#include <linux/fs.h>
-#include <linux/iso_fs.h>
-#include <linux/kernel.h>
+#include "isofs.h"
 
 static struct dentry *
 isofs_export_iget(struct super_block *sb,
index b9256e65e144c3be72faa612fc4ebf10c6edf6e2..abd7b12eeca74e074373598707ad7b2704146a87 100644 (file)
  */
 
 #include <linux/config.h>
+#include <linux/init.h>
 #include <linux/module.h>
 
-#include <linux/stat.h>
-#include <linux/time.h>
-#include <linux/iso_fs.h>
-#include <linux/kernel.h>
-#include <linux/major.h>
-#include <linux/mm.h>
-#include <linux/string.h>
 #include <linux/slab.h>
-#include <linux/errno.h>
-#include <linux/cdrom.h>
-#include <linux/init.h>
 #include <linux/nls.h>
 #include <linux/ctype.h>
 #include <linux/smp_lock.h>
-#include <linux/blkdev.h>
-#include <linux/buffer_head.h>
-#include <linux/vfs.h>
+#include <linux/statfs.h>
+#include <linux/cdrom.h>
 #include <linux/parser.h>
-#include <asm/system.h>
-#include <asm/uaccess.h>
 
+#include "isofs.h"
 #include "zisofs.h"
 
 #define BEQUIET
diff --git a/fs/isofs/isofs.h b/fs/isofs/isofs.h
new file mode 100644 (file)
index 0000000..9ce7b51
--- /dev/null
@@ -0,0 +1,190 @@
+#include <linux/fs.h>
+#include <linux/buffer_head.h>
+#include <linux/iso_fs.h>
+#include <asm/unaligned.h>
+
+enum isofs_file_format {
+       isofs_file_normal = 0,
+       isofs_file_sparse = 1,
+       isofs_file_compressed = 2,
+};
+       
+/*
+ * iso fs inode data in memory
+ */
+struct iso_inode_info {
+       unsigned long i_iget5_block;
+       unsigned long i_iget5_offset;
+       unsigned int i_first_extent;
+       unsigned char i_file_format;
+       unsigned char i_format_parm[3];
+       unsigned long i_next_section_block;
+       unsigned long i_next_section_offset;
+       off_t i_section_size;
+       struct inode vfs_inode;
+};
+
+/*
+ * iso9660 super-block data in memory
+ */
+struct isofs_sb_info {
+       unsigned long s_ninodes;
+       unsigned long s_nzones;
+       unsigned long s_firstdatazone;
+       unsigned long s_log_zone_size;
+       unsigned long s_max_size;
+       
+       unsigned char s_high_sierra; /* A simple flag */
+       unsigned char s_mapping;
+       int           s_rock_offset; /* offset of SUSP fields within SU area */
+       unsigned char s_rock;
+       unsigned char s_joliet_level;
+       unsigned char s_utf8;
+       unsigned char s_cruft; /* Broken disks with high
+                                 byte of length containing
+                                 junk */
+       unsigned char s_unhide;
+       unsigned char s_nosuid;
+       unsigned char s_nodev;
+       unsigned char s_nocompress;
+
+       mode_t s_mode;
+       gid_t s_gid;
+       uid_t s_uid;
+       struct nls_table *s_nls_iocharset; /* Native language support table */
+};
+
+static inline struct isofs_sb_info *ISOFS_SB(struct super_block *sb)
+{
+       return sb->s_fs_info;
+}
+
+static inline struct iso_inode_info *ISOFS_I(struct inode *inode)
+{
+       return container_of(inode, struct iso_inode_info, vfs_inode);
+}
+
+static inline int isonum_711(char *p)
+{
+       return *(u8 *)p;
+}
+static inline int isonum_712(char *p)
+{
+       return *(s8 *)p;
+}
+static inline unsigned int isonum_721(char *p)
+{
+       return le16_to_cpu(get_unaligned((__le16 *)p));
+}
+static inline unsigned int isonum_722(char *p)
+{
+       return be16_to_cpu(get_unaligned((__le16 *)p));
+}
+static inline unsigned int isonum_723(char *p)
+{
+       /* Ignore bigendian datum due to broken mastering programs */
+       return le16_to_cpu(get_unaligned((__le16 *)p));
+}
+static inline unsigned int isonum_731(char *p)
+{
+       return le32_to_cpu(get_unaligned((__le32 *)p));
+}
+static inline unsigned int isonum_732(char *p)
+{
+       return be32_to_cpu(get_unaligned((__le32 *)p));
+}
+static inline unsigned int isonum_733(char *p)
+{
+       /* Ignore bigendian datum due to broken mastering programs */
+       return le32_to_cpu(get_unaligned((__le32 *)p));
+}
+extern int iso_date(char *, int);
+
+struct inode;          /* To make gcc happy */
+
+extern int parse_rock_ridge_inode(struct iso_directory_record *, struct inode *);
+extern int get_rock_ridge_filename(struct iso_directory_record *, char *, struct inode *);
+extern int isofs_name_translate(struct iso_directory_record *, char *, struct inode *);
+
+int get_joliet_filename(struct iso_directory_record *, unsigned char *, struct inode *);
+int get_acorn_filename(struct iso_directory_record *, char *, struct inode *);
+
+extern struct dentry *isofs_lookup(struct inode *, struct dentry *, struct nameidata *);
+extern struct buffer_head *isofs_bread(struct inode *, sector_t);
+extern int isofs_get_blocks(struct inode *, sector_t, struct buffer_head **, unsigned long);
+
+extern struct inode *isofs_iget(struct super_block *sb,
+                                unsigned long block,
+                                unsigned long offset);
+
+/* Because the inode number is no longer relevant to finding the
+ * underlying meta-data for an inode, we are free to choose a more
+ * convenient 32-bit number as the inode number.  The inode numbering
+ * scheme was recommended by Sergey Vlasov and Eric Lammerts. */
+static inline unsigned long isofs_get_ino(unsigned long block,
+                                         unsigned long offset,
+                                         unsigned long bufbits)
+{
+       return (block << (bufbits - 5)) | (offset >> 5);
+}
+
+/* Every directory can have many redundant directory entries scattered
+ * throughout the directory tree.  First there is the directory entry
+ * with the name of the directory stored in the parent directory.
+ * Then, there is the "." directory entry stored in the directory
+ * itself.  Finally, there are possibly many ".." directory entries
+ * stored in all the subdirectories.
+ *
+ * In order for the NFS get_parent() method to work and for the
+ * general consistency of the dcache, we need to make sure the
+ * "i_iget5_block" and "i_iget5_offset" all point to exactly one of
+ * the many redundant entries for each directory.  We normalize the
+ * block and offset by always making them point to the "."  directory.
+ *
+ * Notice that we do not use the entry for the directory with the name
+ * that is located in the parent directory.  Even though choosing this
+ * first directory is more natural, it is much easier to find the "."
+ * entry in the NFS get_parent() method because it is implicitly
+ * encoded in the "extent + ext_attr_length" fields of _all_ the
+ * redundant entries for the directory.  Thus, it can always be
+ * reached regardless of which directory entry you have in hand.
+ *
+ * This works because the "." entry is simply the first directory
+ * record when you start reading the file that holds all the directory
+ * records, and this file starts at "extent + ext_attr_length" blocks.
+ * Because the "." entry is always the first entry listed in the
+ * directories file, the normalized "offset" value is always 0.
+ *
+ * You should pass the directory entry in "de".  On return, "block"
+ * and "offset" will hold normalized values.  Only directories are
+ * affected making it safe to call even for non-directory file
+ * types. */
+static inline void
+isofs_normalize_block_and_offset(struct iso_directory_record* de,
+                                unsigned long *block,
+                                unsigned long *offset)
+{
+       /* Only directories are normalized. */
+       if (de->flags[0] & 2) {
+               *offset = 0;
+               *block = (unsigned long)isonum_733(de->extent)
+                       + (unsigned long)isonum_711(de->ext_attr_length);
+       }
+}
+
+extern struct inode_operations isofs_dir_inode_operations;
+extern struct file_operations isofs_dir_operations;
+extern struct address_space_operations isofs_symlink_aops;
+extern struct export_operations isofs_export_ops;
+
+/* The following macros are used to check for memory leaks. */
+#ifdef LEAK_CHECK
+#define free_s leak_check_free_s
+#define malloc leak_check_malloc
+#define sb_bread leak_check_bread
+#define brelse leak_check_brelse
+extern void * leak_check_malloc(unsigned int size);
+extern void leak_check_free_s(void * obj, int size);
+extern struct buffer_head * leak_check_bread(struct super_block *sb, int block);
+extern void leak_check_brelse(struct buffer_head * bh);
+#endif /* LEAK_CHECK */
index 86c50e22fc87ec7ce934f701047709d086e5bae8..2931de7f1a6ac987a9a7b5c086a10f9fea951ebb 100644 (file)
@@ -6,11 +6,9 @@
  *  Joliet: Microsoft's Unicode extensions to iso9660
  */
 
-#include <linux/string.h>
+#include <linux/types.h>
 #include <linux/nls.h>
-#include <linux/mm.h>
-#include <linux/iso_fs.h>
-#include <asm/unaligned.h>
+#include "isofs.h"
 
 /*
  * Convert Unicode 16 to UTF8 or ASCII.
index 9569fc44102d212c5f4585037e4733daa3ffc078..690edf37173c8c5d864a64a73de1e4a87796e6d6 100644 (file)
@@ -6,20 +6,9 @@
  *  (C) 1991  Linus Torvalds - minix filesystem
  */
 
-#include <linux/time.h>
-#include <linux/iso_fs.h>
-#include <linux/kernel.h>
-#include <linux/string.h>
-#include <linux/stat.h>
-#include <linux/fcntl.h>
-#include <linux/mm.h>
-#include <linux/errno.h>
 #include <linux/config.h>      /* Joliet? */
 #include <linux/smp_lock.h>
-#include <linux/buffer_head.h>
-#include <linux/dcache.h>
-
-#include <asm/uaccess.h>
+#include "isofs.h"
 
 /*
  * ok, we cannot use strncmp, as the name is not in our data space.
index 8bdd3e409543bf0febb4fd837d323562c412eccb..089e79c65585ae5fadb58ce1db43d5ee2bad7126 100644 (file)
@@ -6,17 +6,11 @@
  *  Rock Ridge Extensions to iso9660
  */
 
-#include <linux/stat.h>
-#include <linux/time.h>
-#include <linux/iso_fs.h>
-#include <linux/string.h>
-#include <linux/mm.h>
 #include <linux/slab.h>
 #include <linux/pagemap.h>
 #include <linux/smp_lock.h>
-#include <linux/buffer_head.h>
-#include <asm/page.h>
 
+#include "isofs.h"
 #include "rock.h"
 
 /* These functions are designed to read the system areas of a directory record
index 3f6d9c1ac95addc17e5a4546679f44619f9be5d0..01e1ee7a998b8a17b409b2118b28274c027bd1c1 100644 (file)
@@ -2,9 +2,7 @@
  *  linux/fs/isofs/util.c
  */
 
-#include <linux/time.h>
-#include <linux/fs.h>
-#include <linux/iso_fs.h>
+#include "isofs.h"
 
 /* 
  * We have to convert from a MM/DD/YY format to the Unix ctime format.
@@ -80,4 +78,3 @@ int iso_date(char * p, int flag)
        }
        return crtime;
 }              
-       
index 7ae8e1f45bc1753d02292e10170cf930113d68a3..385b07d510daed2630bdd2748924a428d73619cd 100644 (file)
@@ -14,6 +14,7 @@
  *    26-06-2003     BJD     Finished off definitions for register addresses
  *    12-03-2004     BJD     Updated include protection
  *    07-03-2005     BJD     Added FIFO size flags and S3C2440 MPLL
+ *    05-04-2005     LCVR    Added IISFCON definitions for the S3C2400
  */
 
 #ifndef __ASM_ARCH_REGS_IIS_H
 #define S3C2410_IISFCON_RXMASK   (0x3f)
 #define S3C2410_IISFCON_RXSHIFT          (0)
 
+#define S3C2400_IISFCON_TXDMA     (1<<11)
+#define S3C2400_IISFCON_RXDMA     (1<<10)
+#define S3C2400_IISFCON_TXENABLE  (1<<9)
+#define S3C2400_IISFCON_RXENABLE  (1<<8)
+#define S3C2400_IISFCON_TXMASK   (0x07 << 4)
+#define S3C2400_IISFCON_TXSHIFT          (4)
+#define S3C2400_IISFCON_RXMASK   (0x07)
+#define S3C2400_IISFCON_RXSHIFT          (0)
+
 #define S3C2410_IISFIFO  (0x10)
 #endif /* __ASM_ARCH_REGS_IIS_H */
index 1a1328ac0d79bdc9c0fea701657d78d70f163394..a2d7d0cec04234b08b9fa5187dd0c70f5b9e33f1 100644 (file)
@@ -12,6 +12,7 @@
  *  Changelog:
  *     29-Sep-2004  BJD  Initial include for Linux
  *      10-Mar-2005  LCVR Changed S3C2410_VA to S3C24XX_VA
+ *      04-Apr-2005  LCVR Added S3C2400 DRAM/BANKSIZE_MASK definitions
  *
 */
 
 #define S3C2410_REFRESH_TRP_3clk       (1<<20)
 #define S3C2410_REFRESH_TRP_4clk       (2<<20)
 
+#define S3C2400_REFRESH_DRAM_TRP_MASK   (3<<20)
+#define S3C2400_REFRESH_DRAM_TRP_1_5clk (0<<20)
+#define S3C2400_REFRESH_DRAM_TRP_2_5clk (1<<20)
+#define S3C2400_REFRESH_DRAM_TRP_3_5clk (2<<20)
+#define S3C2400_REFRESH_DRAM_TRP_4_5clk (3<<20)
+
 #define S3C2410_REFRESH_TSRC_MASK      (3<<18)
 #define S3C2410_REFRESH_TSRC_4clk      (0<<18)
 #define S3C2410_REFRESH_TSRC_5clk      (1<<18)
 #define S3C2410_BANKSIZE_4M            (0x5 << 0)
 #define S3C2410_BANKSIZE_2M            (0x4 << 0)
 #define S3C2410_BANKSIZE_MASK          (0x7 << 0)
+#define S3C2400_BANKSIZE_MASK           (0x4 << 0)
 #define S3C2410_BANKSIZE_SCLK_EN       (1<<4)
 #define S3C2410_BANKSIZE_SCKE_EN       (1<<5)
 #define S3C2410_BANKSIZE_BURST         (1<<7)
index cb502a88158b2ad4a892c641aac5657ee25cc309..338217858c730a55b4f5edf4f8214ede33a25639 100644 (file)
@@ -12,6 +12,7 @@
  *    20-04-2004     KF      Created file
  *    04-10-2004     BJD     Removed VA address (no longer mapped)
  *                          tidied file for submission
+ *    03-04-2005     LCVR    Added S3C2400_SPPIN_nCS definition
  */
 
 #ifndef __ASM_ARCH_REGS_SPI_H
@@ -46,6 +47,7 @@
 
 #define S3C2410_SPPIN_ENMUL      (1<<2)        /* Multi Master Error detect */
 #define S3C2410_SPPIN_RESERVED   (1<<1)
+#define S3C2400_SPPIN_nCS        (1<<1)        /* SPI Card Select */
 #define S3C2410_SPPIN_KEEP       (1<<0)        /* Master Out keep */
 
 
index ad4252e27799b02a8d9175c86b568d9da70e1ddf..d7a4a8354fa9854be8a2bc23203a0336b57b93fa 100644 (file)
@@ -16,6 +16,7 @@
  *  12-Oct-2004 BJD  Take account of debug uart configuration
  *  15-Nov-2004 BJD  Fixed uart configuration
  *  22-Feb-2005 BJD  Added watchdog to uncompress
+ *  04-Apr-2005 LCVR Added support to S3C2400 (no cpuid at GSTATUS1)
 */
 
 #ifndef __ASM_ARCH_UNCOMPRESS_H
@@ -69,9 +70,12 @@ uart_rd(unsigned int reg)
 static void
 putc(char ch)
 {
-       int cpuid = *((volatile unsigned int *)S3C2410_GSTATUS1);
+       int cpuid = S3C2410_GSTATUS1_2410;
 
+#ifndef CONFIG_CPU_S3C2400
+       cpuid = *((volatile unsigned int *)S3C2410_GSTATUS1);
        cpuid &= S3C2410_GSTATUS1_IDMASK;
+#endif
 
        if (ch == '\n')
                putc('\r');    /* expand newline to \r\n */
index 2a8ab162412fe70a9b78ab65cee951edd918e3fe..e50c4a39b699779f9af151397eeeb022ff2da0f5 100644 (file)
@@ -29,15 +29,22 @@ extern void __memzero(void *ptr, __kernel_size_t n);
 
 #define memset(p,v,n)                                                  \
        ({                                                              \
-               if ((n) != 0) {                                         \
+               void *__p = (p); size_t __n = n;                        \
+               if ((__n) != 0) {                                       \
                        if (__builtin_constant_p((v)) && (v) == 0)      \
-                               __memzero((p),(n));                     \
+                               __memzero((__p),(__n));                 \
                        else                                            \
-                               memset((p),(v),(n));                    \
+                               memset((__p),(v),(__n));                \
                }                                                       \
-               (p);                                                    \
+               (__p);                                                  \
        })
 
-#define memzero(p,n) ({ if ((n) != 0) __memzero((p),(n)); (p); })
+#define memzero(p,n)                                                   \
+       ({                                                              \
+               void *__p = (p); size_t __n = n;                        \
+               if ((__n) != 0)                                         \
+                       __memzero((__p),(__n));                         \
+               (__p);                                                  \
+        })
 
 #endif
index 099039d4b10da9ec8dab7fad3a82ae1881ed9713..47967878bfef869ef2059c9e2ebda37dbecfbcd4 100644 (file)
@@ -1,4 +1,3 @@
-
 #ifndef _ISOFS_FS_H
 #define _ISOFS_FS_H
 
@@ -163,150 +162,4 @@ struct iso_directory_record {
 
 #define ISOFS_SUPER_MAGIC 0x9660
 
-#ifdef __KERNEL__
-/* Number conversion inlines, named after the section in ISO 9660
-   they correspond to. */
-
-#include <asm/byteorder.h>
-#include <asm/unaligned.h>
-#include <linux/iso_fs_i.h>
-#include <linux/iso_fs_sb.h>
-
-static inline struct isofs_sb_info *ISOFS_SB(struct super_block *sb)
-{
-       return sb->s_fs_info;
-}
-
-static inline struct iso_inode_info *ISOFS_I(struct inode *inode)
-{
-       return container_of(inode, struct iso_inode_info, vfs_inode);
-}
-
-static inline int isonum_711(char *p)
-{
-       return *(u8 *)p;
-}
-static inline int isonum_712(char *p)
-{
-       return *(s8 *)p;
-}
-static inline unsigned int isonum_721(char *p)
-{
-       return le16_to_cpu(get_unaligned((__le16 *)p));
-}
-static inline unsigned int isonum_722(char *p)
-{
-       return be16_to_cpu(get_unaligned((__le16 *)p));
-}
-static inline unsigned int isonum_723(char *p)
-{
-       /* Ignore bigendian datum due to broken mastering programs */
-       return le16_to_cpu(get_unaligned((__le16 *)p));
-}
-static inline unsigned int isonum_731(char *p)
-{
-       return le32_to_cpu(get_unaligned((__le32 *)p));
-}
-static inline unsigned int isonum_732(char *p)
-{
-       return be32_to_cpu(get_unaligned((__le32 *)p));
-}
-static inline unsigned int isonum_733(char *p)
-{
-       /* Ignore bigendian datum due to broken mastering programs */
-       return le32_to_cpu(get_unaligned((__le32 *)p));
-}
-extern int iso_date(char *, int);
-
-struct inode;          /* To make gcc happy */
-
-extern int parse_rock_ridge_inode(struct iso_directory_record *, struct inode *);
-extern int get_rock_ridge_filename(struct iso_directory_record *, char *, struct inode *);
-extern int isofs_name_translate(struct iso_directory_record *, char *, struct inode *);
-
-int get_joliet_filename(struct iso_directory_record *, unsigned char *, struct inode *);
-int get_acorn_filename(struct iso_directory_record *, char *, struct inode *);
-
-extern struct dentry *isofs_lookup(struct inode *, struct dentry *, struct nameidata *);
-extern struct buffer_head *isofs_bread(struct inode *, sector_t);
-extern int isofs_get_blocks(struct inode *, sector_t, struct buffer_head **, unsigned long);
-
-extern struct inode *isofs_iget(struct super_block *sb,
-                                unsigned long block,
-                                unsigned long offset);
-
-/* Because the inode number is no longer relevant to finding the
- * underlying meta-data for an inode, we are free to choose a more
- * convenient 32-bit number as the inode number.  The inode numbering
- * scheme was recommended by Sergey Vlasov and Eric Lammerts. */
-static inline unsigned long isofs_get_ino(unsigned long block,
-                                         unsigned long offset,
-                                         unsigned long bufbits)
-{
-       return (block << (bufbits - 5)) | (offset >> 5);
-}
-
-/* Every directory can have many redundant directory entries scattered
- * throughout the directory tree.  First there is the directory entry
- * with the name of the directory stored in the parent directory.
- * Then, there is the "." directory entry stored in the directory
- * itself.  Finally, there are possibly many ".." directory entries
- * stored in all the subdirectories.
- *
- * In order for the NFS get_parent() method to work and for the
- * general consistency of the dcache, we need to make sure the
- * "i_iget5_block" and "i_iget5_offset" all point to exactly one of
- * the many redundant entries for each directory.  We normalize the
- * block and offset by always making them point to the "."  directory.
- *
- * Notice that we do not use the entry for the directory with the name
- * that is located in the parent directory.  Even though choosing this
- * first directory is more natural, it is much easier to find the "."
- * entry in the NFS get_parent() method because it is implicitly
- * encoded in the "extent + ext_attr_length" fields of _all_ the
- * redundant entries for the directory.  Thus, it can always be
- * reached regardless of which directory entry you have in hand.
- *
- * This works because the "." entry is simply the first directory
- * record when you start reading the file that holds all the directory
- * records, and this file starts at "extent + ext_attr_length" blocks.
- * Because the "." entry is always the first entry listed in the
- * directories file, the normalized "offset" value is always 0.
- *
- * You should pass the directory entry in "de".  On return, "block"
- * and "offset" will hold normalized values.  Only directories are
- * affected making it safe to call even for non-directory file
- * types. */
-static inline void
-isofs_normalize_block_and_offset(struct iso_directory_record* de,
-                                unsigned long *block,
-                                unsigned long *offset)
-{
-       /* Only directories are normalized. */
-       if (de->flags[0] & 2) {
-               *offset = 0;
-               *block = (unsigned long)isonum_733(de->extent)
-                       + (unsigned long)isonum_711(de->ext_attr_length);
-       }
-}
-
-extern struct inode_operations isofs_dir_inode_operations;
-extern struct file_operations isofs_dir_operations;
-extern struct address_space_operations isofs_symlink_aops;
-extern struct export_operations isofs_export_ops;
-
-/* The following macros are used to check for memory leaks. */
-#ifdef LEAK_CHECK
-#define free_s leak_check_free_s
-#define malloc leak_check_malloc
-#define sb_bread leak_check_bread
-#define brelse leak_check_brelse
-extern void * leak_check_malloc(unsigned int size);
-extern void leak_check_free_s(void * obj, int size);
-extern struct buffer_head * leak_check_bread(struct super_block *sb, int block);
-extern void leak_check_brelse(struct buffer_head * bh);
-#endif /* LEAK_CHECK */
-
-#endif /* __KERNEL__ */
-
 #endif
diff --git a/include/linux/iso_fs_i.h b/include/linux/iso_fs_i.h
deleted file mode 100644 (file)
index 59065e9..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-#ifndef _ISO_FS_I
-#define _ISO_FS_I
-
-#include <linux/fs.h>
-
-enum isofs_file_format {
-       isofs_file_normal = 0,
-       isofs_file_sparse = 1,
-       isofs_file_compressed = 2,
-};
-       
-/*
- * iso fs inode data in memory
- */
-struct iso_inode_info {
-       unsigned long i_iget5_block;
-       unsigned long i_iget5_offset;
-       unsigned int i_first_extent;
-       unsigned char i_file_format;
-       unsigned char i_format_parm[3];
-       unsigned long i_next_section_block;
-       unsigned long i_next_section_offset;
-       off_t i_section_size;
-       struct inode vfs_inode;
-};
-
-#endif
diff --git a/include/linux/iso_fs_sb.h b/include/linux/iso_fs_sb.h
deleted file mode 100644 (file)
index 043b97b..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-#ifndef _ISOFS_FS_SB
-#define _ISOFS_FS_SB
-
-/*
- * iso9660 super-block data in memory
- */
-struct isofs_sb_info {
-       unsigned long s_ninodes;
-       unsigned long s_nzones;
-       unsigned long s_firstdatazone;
-       unsigned long s_log_zone_size;
-       unsigned long s_max_size;
-       
-       unsigned char s_high_sierra; /* A simple flag */
-       unsigned char s_mapping;
-       int           s_rock_offset; /* offset of SUSP fields within SU area */
-       unsigned char s_rock;
-       unsigned char s_joliet_level;
-       unsigned char s_utf8;
-       unsigned char s_cruft; /* Broken disks with high
-                                 byte of length containing
-                                 junk */
-       unsigned char s_unhide;
-       unsigned char s_nosuid;
-       unsigned char s_nodev;
-       unsigned char s_nocompress;
-
-       mode_t s_mode;
-       gid_t s_gid;
-       uid_t s_uid;
-       struct nls_table *s_nls_iocharset; /* Native language support table */
-};
-
-#endif
index 1650c6bf6997e8b91fece86e5d0c077c2cc8d6cf..12b43345b54ff3fa21d3a76433e96433086997e9 100644 (file)
@@ -31,7 +31,6 @@
 #include <linux/list.h>
 #include <linux/errno.h>
 #include <linux/kernel.h>
-#include <linux/major.h>
 #include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/skbuff.h>
index 9a8d99a39b6dbc33a288b38207892aa75b310fc0..9778c6acd53bb5785482794f33fb903be719c215 100644 (file)
@@ -34,7 +34,6 @@
 #include <linux/types.h>
 #include <linux/errno.h>
 #include <linux/kernel.h>
-#include <linux/major.h>
 #include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/poll.h>
index 1e5c030b72ad3086b7e9e6416359293000656bee..b2e7e38531c602c72580570c331f1b3e6328536f 100644 (file)
@@ -26,7 +26,6 @@
 #include <linux/types.h>
 #include <linux/errno.h>
 #include <linux/kernel.h>
-#include <linux/major.h>
 #include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/poll.h>
index 20ce04f2be8baf9ae855113a3d68b9e8a371c0e7..2e341de3e7634fda2ff7ee7bf912cc56f8003643 100644 (file)
@@ -26,7 +26,6 @@
 #include <linux/types.h>
 #include <linux/errno.h>
 #include <linux/kernel.h>
-#include <linux/major.h>
 #include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/poll.h>
index 4c7f9e20dade01b89638bed6bb787edfed52d7d6..beb045bf5714bd54e4b9d60fef75498959a31b2c 100644 (file)
@@ -26,7 +26,6 @@
 #include <linux/types.h>
 #include <linux/errno.h>
 #include <linux/kernel.h>
-#include <linux/major.h>
 #include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/poll.h>
index 71762d7e99701463cbf144599a7a7f5f8b51c5bb..a31244e58888c39d4cab34eb082c36b53fe40ec9 100644 (file)
@@ -30,7 +30,6 @@
 #include <linux/types.h>
 #include <linux/errno.h>
 #include <linux/kernel.h>
-#include <linux/major.h>
 #include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/poll.h>
index 860dba7bdd89dedfba9aea538f0e956d5cbfe955..fb5524365bc2970c1430a39a7017bbf6d0223c91 100644 (file)
@@ -31,7 +31,6 @@
 #include <linux/types.h>
 #include <linux/errno.h>
 #include <linux/kernel.h>
-#include <linux/major.h>
 #include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/poll.h>
index 8ccba8ee997959885dce476400dcbdd854079850..c4b592b4ef10083fc5a270fb75ca419faf939e70 100644 (file)
@@ -30,7 +30,6 @@
 #include <linux/types.h>
 #include <linux/errno.h>
 #include <linux/kernel.h>
-#include <linux/major.h>
 #include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/poll.h>
index c9792ba751221eb643125dcecddbeba1959ce45d..ebdcce5e7ca0b6d67e8974a52ede4f934e2c1936 100644 (file)
@@ -30,7 +30,6 @@
 #include <linux/types.h>
 #include <linux/errno.h>
 #include <linux/kernel.h>
-#include <linux/major.h>
 #include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/poll.h>
index 2cf98ceabcc75a2e3e1932a93f50d55970994a66..affbc55462e860f8a525ac9cecac09ca2cdf9ef9 100644 (file)
@@ -26,7 +26,6 @@
 #include <linux/types.h>
 #include <linux/errno.h>
 #include <linux/kernel.h>
-#include <linux/major.h>
 #include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/poll.h>
index fabb36d4666b4bad674f555ad149d121a278939b..f8986f8814319a242beb06788af564e7f70f3b34 100644 (file)
@@ -26,7 +26,6 @@
 #include <linux/types.h>
 #include <linux/errno.h>
 #include <linux/kernel.h>
-#include <linux/major.h>
 #include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/poll.h>
index c12babcf0b3ccb05b473e95bf6af77be19dd218e..32fccfb5bfa5de1b8c701fe0bb107792e2653534 100644 (file)
@@ -30,7 +30,6 @@
 #include <linux/types.h>
 #include <linux/errno.h>
 #include <linux/kernel.h>
-#include <linux/major.h>
 #include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/poll.h>
index 640028a2183cd9c136b8243cee0b0675f3e9b5fc..f3f6355a2786c78eefe8213fe95dd67cfb93b31f 100644 (file)
@@ -33,7 +33,6 @@
 #include <linux/types.h>
 #include <linux/errno.h>
 #include <linux/kernel.h>
-#include <linux/major.h>
 #include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/poll.h>
index 3e750ef09e60115932fb9f03a0118d5c7bb11590..746c11fc017e9b8e73320ac126e68a607d02e76a 100644 (file)
@@ -30,7 +30,6 @@
 #include <linux/types.h>
 #include <linux/errno.h>
 #include <linux/kernel.h>
-#include <linux/major.h>
 #include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/poll.h>
index 44dfaf8f04afd7cbde0487a5a35ccef5eb4f48ce..d8c198e42f905bac3e8128012ed478c141630a5d 100644 (file)
@@ -22,7 +22,6 @@
 #include <linux/types.h>
 #include <linux/socket.h>
 #include <linux/kernel.h>
-#include <linux/major.h>
 #include <linux/sched.h>
 #include <linux/timer.h>
 #include <linux/string.h>
index a2ebf30f6aa8c358c9759809ae0f5fe7ceea8275..e887d19be506f51e8625d4dbc8b63c1c3e367030 100644 (file)
@@ -15,7 +15,6 @@
 #include <linux/sched.h>
 #include <linux/mm.h>
 #include <linux/kernel.h>
-#include <linux/major.h>
 #include <linux/stat.h>
 #include <linux/socket.h>
 #include <linux/file.h>
index 4df4fa3c5de047e3ee099b64b38c4948b2dd406a..5c2f72fa101323f69b027220bcbf76f2dc2cf0ab 100644 (file)
@@ -97,7 +97,6 @@
 #include <linux/socket.h>
 #include <linux/in.h>
 #include <linux/kernel.h>
-#include <linux/major.h>
 #include <linux/module.h>
 #include <linux/proc_fs.h>
 #include <linux/seq_file.h>
index c34dab67e4612ac1935cdfa63a749bc474b08554..cdad47642ae74d80ef783670cefedfc898fff809 100644 (file)
@@ -73,7 +73,6 @@
 #include <linux/socket.h>
 #include <linux/in.h>
 #include <linux/kernel.h>
-#include <linux/major.h>
 #include <linux/module.h>
 #include <linux/sched.h>
 #include <linux/timer.h>
index 30ab7b6ab7618709b2f9cb39dd8a9180b29f3820..38f69532a029e5ff1ddbdbd665afcff46e94abb5 100644 (file)
@@ -195,6 +195,8 @@ static inline int ip_finish_output2(struct sk_buff *skb)
        nf_debug_ip_finish_output2(skb);
 #endif /*CONFIG_NETFILTER_DEBUG*/
 
+       nf_reset(skb);
+
        if (hh) {
                int hh_alen;
 
index 12b88cbb11db60caf47bb7cff173f406ee646d7d..dd86503aa7881917715839aa81c62fcdeb3f6391 100644 (file)
@@ -252,7 +252,7 @@ static int find_pattern(const char *data, size_t dlen,
 }
 
 /* Look up to see if we're just after a \n. */
-static int find_nl_seq(u16 seq, const struct ip_ct_ftp_master *info, int dir)
+static int find_nl_seq(u32 seq, const struct ip_ct_ftp_master *info, int dir)
 {
        unsigned int i;
 
@@ -263,7 +263,7 @@ static int find_nl_seq(u16 seq, const struct ip_ct_ftp_master *info, int dir)
 }
 
 /* We don't update if it's older than what we have. */
-static void update_nl_seq(u16 nl_seq, struct ip_ct_ftp_master *info, int dir)
+static void update_nl_seq(u32 nl_seq, struct ip_ct_ftp_master *info, int dir)
 {
        unsigned int i, oldest = NUM_SEQ_TO_REMEMBER;
 
index 0c29ccf62a897862a70ae135506e11378b2da3e2..46ca45f74d85b6e543304df6eb6f89b9db2098d4 100644 (file)
@@ -431,13 +431,6 @@ static unsigned int ip_conntrack_defrag(unsigned int hooknum,
                                        const struct net_device *out,
                                        int (*okfn)(struct sk_buff *))
 {
-#if !defined(CONFIG_IP_NF_NAT) && !defined(CONFIG_IP_NF_NAT_MODULE)
-       /* Previously seen (loopback)?  Ignore.  Do this before
-           fragment check. */
-       if ((*pskb)->nfct)
-               return NF_ACCEPT;
-#endif
-
        /* Gather fragments. */
        if ((*pskb)->nh.iph->frag_off & htons(IP_MF|IP_OFFSET)) {
                *pskb = ip_ct_gather_frags(*pskb,
index 250492735902408bd8fa183a366cb436a84408e4..6984042c09272dcf57ed8ee2ca469f623335d729 100644 (file)
@@ -3517,7 +3517,6 @@ static void tcp_data_queue(struct sock *sk, struct sk_buff *skb)
        if (TCP_SKB_CB(skb)->seq == TCP_SKB_CB(skb)->end_seq)
                goto drop;
 
-       th = skb->h.th;
        __skb_pull(skb, th->doff*4);
 
        TCP_ECN_accept_cwr(tp, skb);
index 53a6680d540f342d112cba2f671535e05eb2af29..2b193e3df49a28f749c256141f499ef39c29b9e9 100644 (file)
@@ -28,7 +28,6 @@
 #include <linux/socket.h>
 #include <linux/in.h>
 #include <linux/kernel.h>
-#include <linux/major.h>
 #include <linux/sched.h>
 #include <linux/timer.h>
 #include <linux/string.h>
index 1d5905c90cd4bd515a1d6f5962809523cd25f7bc..29a5fd231eac9a97bb247162e8a8fc20a8163cea 100644 (file)
@@ -21,7 +21,6 @@
 
 #include <linux/kernel.h>
 #include <linux/init.h>
-#include <linux/major.h>
 #include <linux/signal.h>
 #include <linux/sched.h>
 #include <linux/errno.h>
index b0d3d15848ad1f4a293750b10e9ef95bbde412a4..3ab4c675ab5dad934834cd50ffbabc5192d0ec0b 100644 (file)
  *
  */
 
-#include <asm/uaccess.h>
-#include <asm/system.h>
-#include <asm/bitops.h>
 #include <linux/config.h>
-#include <linux/types.h>
+#include <linux/module.h>
+#include <linux/init.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
-#include <linux/string.h>
-#include <linux/mm.h>
-#include <linux/socket.h>
-#include <linux/sockios.h>
-#include <linux/in.h>
-#include <linux/errno.h>
-#include <linux/interrupt.h>
 #include <linux/netdevice.h>
 #include <linux/skbuff.h>
 #include <linux/rtnetlink.h>
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/proc_fs.h>
-#include <net/sock.h>
 #include <net/pkt_sched.h>
 
 #define TCA_ACT_SIMP 22
index acc73fe686983d4f71333a636cadd1d3f17e743e..c478fc8db7768428580d23381856fa53fa31add2 100644 (file)
@@ -85,7 +85,6 @@
 #include <linux/module.h>
 #include <linux/config.h>
 #include <linux/kernel.h>
-#include <linux/major.h>
 #include <linux/signal.h>
 #include <linux/sched.h>
 #include <linux/errno.h>
index d54b52d3bb6feca9d9af25bb9bbfcef183c71c1c..32197efe67edbbd2e9619aca101c60370d4e14fd 100644 (file)
@@ -47,32 +47,31 @@ do {                                                            \
                 sprintf(str + strlen(str), "*");                \
 } while(0)
 
-/* Looks like "usb:vNpNdlNdhNdcNdscNdpNicNiscNipN" */
-static int do_usb_entry(const char *filename,
-                       struct usb_device_id *id, char *alias)
+/* USB is special because the bcdDevice can be matched against a numeric range */
+/* Looks like "usb:vNpNdNdcNdscNdpNicNiscNipN" */
+static void do_usb_entry(struct usb_device_id *id,
+                        unsigned int bcdDevice_initial, int bcdDevice_initial_digits,
+                        unsigned char range_lo, unsigned char range_hi,
+                        struct module *mod)
 {
-       id->match_flags = TO_NATIVE(id->match_flags);
-       id->idVendor = TO_NATIVE(id->idVendor);
-       id->idProduct = TO_NATIVE(id->idProduct);
-       id->bcdDevice_lo = TO_NATIVE(id->bcdDevice_lo);
-       id->bcdDevice_hi = TO_NATIVE(id->bcdDevice_hi);
-
-       /*
-        * Some modules (visor) have empty slots as placeholder for
-        * run-time specification that results in catch-all alias
-        */
-       if (!(id->idVendor | id->bDeviceClass | id->bInterfaceClass))
-               return 1;
-
+       char alias[500];
        strcpy(alias, "usb:");
        ADD(alias, "v", id->match_flags&USB_DEVICE_ID_MATCH_VENDOR,
            id->idVendor);
        ADD(alias, "p", id->match_flags&USB_DEVICE_ID_MATCH_PRODUCT,
            id->idProduct);
-       ADD(alias, "dl", id->match_flags&USB_DEVICE_ID_MATCH_DEV_LO,
-           id->bcdDevice_lo);
-       ADD(alias, "dh", id->match_flags&USB_DEVICE_ID_MATCH_DEV_HI,
-           id->bcdDevice_hi);
+
+       strcat(alias, "d");
+       if (bcdDevice_initial_digits)
+               sprintf(alias + strlen(alias), "%0*X",
+                       bcdDevice_initial_digits, bcdDevice_initial);
+       if (range_lo == range_hi)
+               sprintf(alias + strlen(alias), "%u", range_lo);
+       else if (range_lo > 0 || range_hi < 9)
+               sprintf(alias + strlen(alias), "[%u-%u]", range_lo, range_hi);
+       if (bcdDevice_initial_digits < (sizeof(id->bcdDevice_lo) * 2 - 1))
+               strcat(alias, "*");
+
        ADD(alias, "dc", id->match_flags&USB_DEVICE_ID_MATCH_DEV_CLASS,
            id->bDeviceClass);
        ADD(alias, "dsc",
@@ -90,7 +89,73 @@ static int do_usb_entry(const char *filename,
        ADD(alias, "ip",
            id->match_flags&USB_DEVICE_ID_MATCH_INT_PROTOCOL,
            id->bInterfaceProtocol);
-       return 1;
+
+       /* Always end in a wildcard, for future extension */
+       if (alias[strlen(alias)-1] != '*')
+               strcat(alias, "*");
+       buf_printf(&mod->dev_table_buf,
+                  "MODULE_ALIAS(\"%s\");\n", alias);
+}
+
+static void do_usb_entry_multi(struct usb_device_id *id, struct module *mod)
+{
+       unsigned int devlo, devhi;
+       unsigned char chi, clo;
+       int ndigits;
+
+       id->match_flags = TO_NATIVE(id->match_flags);
+       id->idVendor = TO_NATIVE(id->idVendor);
+       id->idProduct = TO_NATIVE(id->idProduct);
+
+       devlo = id->match_flags & USB_DEVICE_ID_MATCH_DEV_LO ?
+               TO_NATIVE(id->bcdDevice_lo) : 0x0U;
+       devhi = id->match_flags & USB_DEVICE_ID_MATCH_DEV_HI ?
+               TO_NATIVE(id->bcdDevice_hi) : ~0x0U;
+
+       /*
+        * Some modules (visor) have empty slots as placeholder for
+        * run-time specification that results in catch-all alias
+        */
+       if (!(id->idVendor | id->bDeviceClass | id->bInterfaceClass))
+               return;
+
+       /* Convert numeric bcdDevice range into fnmatch-able pattern(s) */
+       for (ndigits = sizeof(id->bcdDevice_lo) * 2 - 1; devlo <= devhi; ndigits--) {
+               clo = devlo & 0xf;
+               chi = devhi & 0xf;
+               if (chi > 9)    /* it's bcd not hex */
+                       chi = 9;
+               devlo >>= 4;
+               devhi >>= 4;
+
+               if (devlo == devhi || !ndigits) {
+                       do_usb_entry(id, devlo, ndigits, clo, chi, mod);
+                       break;
+               }
+
+               if (clo > 0)
+                       do_usb_entry(id, devlo++, ndigits, clo, 9, mod);
+
+               if (chi < 9)
+                       do_usb_entry(id, devhi--, ndigits, 0, chi, mod);
+       }
+}
+
+static void do_usb_table(void *symval, unsigned long size,
+                        struct module *mod)
+{
+       unsigned int i;
+       const unsigned long id_size = sizeof(struct usb_device_id);
+
+       if (size % id_size || size < id_size) {
+               fprintf(stderr, "*** Warning: %s ids %lu bad size "
+                       "(each on %lu)\n", mod->name, size, id_size);
+       }
+       /* Leave last one: it's the terminator. */
+       size -= id_size;
+
+       for (i = 0; i < size; i += id_size)
+               do_usb_entry_multi(symval + i, mod);
 }
 
 /* Looks like: ieee1394:venNmoNspNverN */
@@ -280,8 +345,8 @@ void handle_moddevtable(struct module *mod, struct elf_info *info,
                do_table(symval, sym->st_size, sizeof(struct pci_device_id),
                         do_pci_entry, mod);
        else if (sym_is(symname, "__mod_usb_device_table"))
-               do_table(symval, sym->st_size, sizeof(struct usb_device_id),
-                        do_usb_entry, mod);
+               /* special case to handle bcdDevice ranges */
+               do_usb_table(symval, sym->st_size, mod);
        else if (sym_is(symname, "__mod_ieee1394_device_table"))
                do_table(symval, sym->st_size, sizeof(struct ieee1394_device_id),
                         do_ieee1394_entry, mod);
index b0a9ebf8bf3bba75dc88f56fc1d56c2f37698761..75213bf4d56728d55617987a735f8bda9bd4656a 100644 (file)
@@ -11,7 +11,7 @@ comment "ALSA PowerMac requires INPUT"
 
 config SND_POWERMAC
        tristate "PowerMac (AWACS, DACA, Burgundy, Tumbler, Keywest)"
-       depends on SND && I2C && INPUT
+       depends on SND && I2C && INPUT && PPC_PMAC
        select SND_PCM
        help
          Say Y here to include support for the integrated sound device.